@retray-dev/ui-kit 2.5.1 → 2.6.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 (38) hide show
  1. package/COMPONENTS.md +153 -6
  2. package/dist/index.d.mts +98 -8
  3. package/dist/index.d.ts +98 -8
  4. package/dist/index.js +591 -505
  5. package/dist/index.mjs +533 -436
  6. package/package.json +23 -21
  7. package/src/components/Accordion/Accordion.tsx +61 -57
  8. package/src/components/Alert/Alert.tsx +11 -10
  9. package/src/components/AlertBanner/AlertBanner.tsx +23 -10
  10. package/src/components/Avatar/Avatar.tsx +9 -8
  11. package/src/components/Badge/Badge.tsx +27 -12
  12. package/src/components/Button/Button.tsx +30 -12
  13. package/src/components/Card/Card.tsx +12 -11
  14. package/src/components/Checkbox/Checkbox.tsx +16 -13
  15. package/src/components/Chip/Chip.tsx +8 -7
  16. package/src/components/ConfirmDialog/ConfirmDialog.tsx +12 -11
  17. package/src/components/CurrencyDisplay/CurrencyDisplay.tsx +2 -1
  18. package/src/components/CurrencyInput/CurrencyInput.tsx +2 -1
  19. package/src/components/EmptyState/EmptyState.tsx +34 -21
  20. package/src/components/Input/Input.tsx +44 -22
  21. package/src/components/LabelValue/LabelValue.tsx +6 -5
  22. package/src/components/ListItem/ListItem.tsx +46 -22
  23. package/src/components/MonthPicker/MonthPicker.tsx +9 -8
  24. package/src/components/Progress/Progress.tsx +2 -1
  25. package/src/components/RadioGroup/RadioGroup.tsx +18 -15
  26. package/src/components/Select/Select.tsx +25 -24
  27. package/src/components/Sheet/Sheet.tsx +15 -14
  28. package/src/components/Slider/Slider.tsx +7 -6
  29. package/src/components/Switch/Switch.tsx +7 -6
  30. package/src/components/Tabs/Tabs.tsx +17 -14
  31. package/src/components/Text/Text.tsx +7 -6
  32. package/src/components/Textarea/Textarea.tsx +9 -8
  33. package/src/components/Toast/Toast.tsx +30 -19
  34. package/src/components/Toggle/Toggle.tsx +36 -10
  35. package/src/index.ts +4 -0
  36. package/src/utils/haptics.ts +32 -0
  37. package/src/utils/icons.ts +73 -0
  38. package/src/utils/scaling.ts +26 -0
package/dist/index.js CHANGED
@@ -1,11 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var React23 = require('react');
3
+ var React24 = require('react');
4
4
  var reactNative = require('react-native');
5
- var Haptics12 = require('expo-haptics');
5
+ var reactNativeSizeMatters = require('react-native-size-matters');
6
+ var AntDesign = require('@expo/vector-icons/AntDesign');
7
+ var Entypo = require('@expo/vector-icons/Entypo');
8
+ var Feather = require('@expo/vector-icons/Feather');
9
+ var FontAwesome5 = require('@expo/vector-icons/FontAwesome5');
10
+ var MaterialIcons = require('@expo/vector-icons/MaterialIcons');
11
+ var Ionicons = require('@expo/vector-icons/Ionicons');
6
12
  var vectorIcons = require('@expo/vector-icons');
7
13
  var expoLinearGradient = require('expo-linear-gradient');
8
- var ReanimatedAnimated = require('react-native-reanimated');
14
+ var Animated10 = require('react-native-reanimated');
9
15
  var RNSlider = require('@react-native-community/slider');
10
16
  var bottomSheet = require('@gorhom/bottom-sheet');
11
17
  var picker = require('@react-native-picker/picker');
@@ -15,30 +21,22 @@ var reactNativeSafeAreaContext = require('react-native-safe-area-context');
15
21
 
16
22
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
17
23
 
18
- function _interopNamespace(e) {
19
- if (e && e.__esModule) return e;
20
- var n = Object.create(null);
21
- if (e) {
22
- Object.keys(e).forEach(function (k) {
23
- if (k !== 'default') {
24
- var d = Object.getOwnPropertyDescriptor(e, k);
25
- Object.defineProperty(n, k, d.get ? d : {
26
- enumerable: true,
27
- get: function () { return e[k]; }
28
- });
29
- }
30
- });
31
- }
32
- n.default = e;
33
- return Object.freeze(n);
34
- }
35
-
36
- var React23__default = /*#__PURE__*/_interopDefault(React23);
37
- var Haptics12__namespace = /*#__PURE__*/_interopNamespace(Haptics12);
38
- var ReanimatedAnimated__default = /*#__PURE__*/_interopDefault(ReanimatedAnimated);
24
+ var React24__default = /*#__PURE__*/_interopDefault(React24);
25
+ var AntDesign__default = /*#__PURE__*/_interopDefault(AntDesign);
26
+ var Entypo__default = /*#__PURE__*/_interopDefault(Entypo);
27
+ var Feather__default = /*#__PURE__*/_interopDefault(Feather);
28
+ var FontAwesome5__default = /*#__PURE__*/_interopDefault(FontAwesome5);
29
+ var MaterialIcons__default = /*#__PURE__*/_interopDefault(MaterialIcons);
30
+ var Ionicons__default = /*#__PURE__*/_interopDefault(Ionicons);
31
+ var Animated10__default = /*#__PURE__*/_interopDefault(Animated10);
39
32
  var RNSlider__default = /*#__PURE__*/_interopDefault(RNSlider);
40
33
 
41
- // src/theme/ThemeProvider.tsx
34
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
35
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
36
+ }) : x)(function(x) {
37
+ if (typeof require !== "undefined") return require.apply(this, arguments);
38
+ throw Error('Dynamic require of "' + x + '" is not supported');
39
+ });
42
40
 
43
41
  // src/theme/colors.ts
44
42
  var defaultLight = {
@@ -85,38 +83,101 @@ var defaultDark = {
85
83
  };
86
84
 
87
85
  // src/theme/ThemeProvider.tsx
88
- var ThemeContext = React23.createContext({
86
+ var ThemeContext = React24.createContext({
89
87
  colors: defaultLight,
90
88
  colorScheme: "light"
91
89
  });
92
90
  function ThemeProvider({ children, theme, colorScheme = "system" }) {
93
91
  const systemScheme = reactNative.useColorScheme() ?? "light";
94
92
  const resolvedScheme = colorScheme === "system" ? systemScheme : colorScheme;
95
- const colors = React23.useMemo(() => {
93
+ const colors = React24.useMemo(() => {
96
94
  const base = resolvedScheme === "dark" ? defaultDark : defaultLight;
97
95
  const override = resolvedScheme === "dark" ? theme?.dark : theme?.light;
98
96
  return override ? { ...base, ...override } : base;
99
97
  }, [resolvedScheme, theme]);
100
- return /* @__PURE__ */ React23__default.default.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
98
+ return /* @__PURE__ */ React24__default.default.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
101
99
  }
102
100
  function useTheme() {
103
- const context = React23.useContext(ThemeContext);
101
+ const context = React24.useContext(ThemeContext);
104
102
  if (!context) {
105
103
  throw new Error("useTheme must be used within a ThemeProvider");
106
104
  }
107
105
  return context;
108
106
  }
107
+ var Haptics = null;
108
+ if (reactNative.Platform.OS !== "web") {
109
+ Haptics = __require("expo-haptics");
110
+ }
111
+ function selectionAsync() {
112
+ Haptics?.selectionAsync();
113
+ }
114
+ function impactLight() {
115
+ Haptics?.impactAsync(Haptics.ImpactFeedbackStyle.Light);
116
+ }
117
+ function notificationSuccess() {
118
+ Haptics?.notificationAsync(Haptics.NotificationFeedbackType.Success);
119
+ }
120
+ function notificationError() {
121
+ Haptics?.notificationAsync(Haptics.NotificationFeedbackType.Error);
122
+ }
123
+ var isWeb = reactNative.Platform.OS === "web";
124
+ var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
125
+ var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
126
+ var ms = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateScale;
127
+ var mvs = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateVerticalScale;
128
+ var ICON_FAMILIES = [
129
+ { name: "Ionicons", component: Ionicons__default.default, glyphMap: Ionicons__default.default.glyphMap },
130
+ { name: "MaterialIcons", component: MaterialIcons__default.default, glyphMap: MaterialIcons__default.default.glyphMap },
131
+ { name: "FontAwesome5", component: FontAwesome5__default.default, glyphMap: FontAwesome5__default.default.glyphMap },
132
+ { name: "Entypo", component: Entypo__default.default, glyphMap: Entypo__default.default.glyphMap },
133
+ { name: "AntDesign", component: AntDesign__default.default, glyphMap: AntDesign__default.default.glyphMap },
134
+ { name: "Feather", component: Feather__default.default, glyphMap: Feather__default.default.glyphMap }
135
+ ];
136
+ var resolvedCache = null;
137
+ function buildCache() {
138
+ const cache = /* @__PURE__ */ new Map();
139
+ for (const family of ICON_FAMILIES) {
140
+ if (!family.glyphMap) continue;
141
+ for (const iconName of Object.keys(family.glyphMap)) {
142
+ cache.set(iconName, family);
143
+ }
144
+ }
145
+ return cache;
146
+ }
147
+ function resolveFamily(name) {
148
+ if (!resolvedCache) {
149
+ resolvedCache = buildCache();
150
+ }
151
+ return resolvedCache.get(name) ?? null;
152
+ }
153
+ function Icon({ name, size, color, family }) {
154
+ let resolved = null;
155
+ if (family) {
156
+ resolved = ICON_FAMILIES.find((f) => f.name === family) ?? null;
157
+ } else {
158
+ resolved = resolveFamily(name);
159
+ }
160
+ if (!resolved) return null;
161
+ const Component = resolved.component;
162
+ return React24__default.default.createElement(Component, { name, size, color });
163
+ }
164
+ function renderIcon(name, size, color) {
165
+ return React24__default.default.createElement(Icon, { name, size, color });
166
+ }
167
+
168
+ // src/components/Button/Button.tsx
109
169
  var nativeDriver = reactNative.Platform.OS !== "web";
110
170
  var containerSizeStyles = {
111
- sm: { paddingHorizontal: 20, paddingVertical: 10 },
112
- md: { paddingHorizontal: 24, paddingVertical: 14 },
113
- lg: { paddingHorizontal: 32, paddingVertical: 18 }
171
+ sm: { paddingHorizontal: s(20), paddingVertical: vs(10) },
172
+ md: { paddingHorizontal: s(24), paddingVertical: vs(14) },
173
+ lg: { paddingHorizontal: s(32), paddingVertical: vs(18) }
114
174
  };
115
175
  var labelSizeStyles = {
116
- sm: { fontSize: 15 },
117
- md: { fontSize: 17 },
118
- lg: { fontSize: 18 }
176
+ sm: { fontSize: ms(15) },
177
+ md: { fontSize: ms(17) },
178
+ lg: { fontSize: ms(18) }
119
179
  };
180
+ var iconSizeMap = { sm: 16, md: 18, lg: 20 };
120
181
  function Button({
121
182
  label,
122
183
  variant = "primary",
@@ -124,6 +185,8 @@ function Button({
124
185
  loading = false,
125
186
  fullWidth = false,
126
187
  icon,
188
+ iconName,
189
+ iconColor,
127
190
  iconPosition = "left",
128
191
  disabled,
129
192
  style,
@@ -132,10 +195,10 @@ function Button({
132
195
  }) {
133
196
  const { colors } = useTheme();
134
197
  const isDisabled = disabled || loading;
135
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
198
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
136
199
  const handlePressIn = () => {
137
200
  if (isDisabled) return;
138
- reactNative.Animated.spring(scale, {
201
+ reactNative.Animated.spring(scale2, {
139
202
  toValue: 0.95,
140
203
  useNativeDriver: nativeDriver,
141
204
  speed: 40,
@@ -143,10 +206,10 @@ function Button({
143
206
  }).start();
144
207
  };
145
208
  const handlePressOut = () => {
146
- reactNative.Animated.spring(scale, { toValue: 1, useNativeDriver: nativeDriver, speed: 40, bounciness: 4 }).start();
209
+ reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver, speed: 40, bounciness: 4 }).start();
147
210
  };
148
211
  const handlePress = (e) => {
149
- Haptics12__namespace.impactAsync(Haptics12__namespace.ImpactFeedbackStyle.Light);
212
+ impactLight();
150
213
  onPress?.(e);
151
214
  };
152
215
  const containerVariantStyle = {
@@ -163,8 +226,9 @@ function Button({
163
226
  ghost: { color: colors.foreground },
164
227
  destructive: { color: colors.destructiveForeground }
165
228
  }[variant];
229
+ const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], iconColor ?? labelVariantStyle.color) : typeof icon === "function" ? icon({ label, size, variant }) : icon;
166
230
  const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" || variant === "secondary" ? colors.primaryForeground : colors.foreground;
167
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: [fullWidth && styles.fullWidth, { transform: [{ scale }] }] }, /* @__PURE__ */ React23__default.default.createElement(
231
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: [fullWidth && styles.fullWidth, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React24__default.default.createElement(
168
232
  reactNative.TouchableOpacity,
169
233
  {
170
234
  style: [
@@ -183,7 +247,7 @@ function Button({
183
247
  onPressOut: handlePressOut,
184
248
  ...props
185
249
  },
186
- loading ? /* @__PURE__ */ React23__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : /* @__PURE__ */ React23__default.default.createElement(React23__default.default.Fragment, null, icon && iconPosition === "left" && /* @__PURE__ */ React23__default.default.createElement(React23__default.default.Fragment, null, typeof icon === "function" ? icon({ label, size, variant }) : icon), /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles.label, labelVariantStyle, labelSizeStyles[size], icon ? styles.labelWithIcon : void 0] }, label), icon && iconPosition === "right" && /* @__PURE__ */ React23__default.default.createElement(React23__default.default.Fragment, null, typeof icon === "function" ? icon({ label, size, variant }) : icon))
250
+ loading ? /* @__PURE__ */ React24__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : /* @__PURE__ */ React24__default.default.createElement(React24__default.default.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React24__default.default.createElement(React24__default.default.Fragment, null, effectiveIcon), /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles.label, labelVariantStyle, labelSizeStyles[size], effectiveIcon ? styles.labelWithIcon : void 0] }, label), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React24__default.default.createElement(React24__default.default.Fragment, null, effectiveIcon))
187
251
  ));
188
252
  }
189
253
  var styles = reactNative.StyleSheet.create({
@@ -203,21 +267,21 @@ var styles = reactNative.StyleSheet.create({
203
267
  fontWeight: "600"
204
268
  },
205
269
  labelWithIcon: {
206
- marginHorizontal: 8
270
+ marginHorizontal: s(8)
207
271
  }
208
272
  });
209
273
  var variantStyles = {
210
- h1: { fontSize: 40, fontWeight: "700", lineHeight: 52 },
211
- h2: { fontSize: 28, fontWeight: "700", lineHeight: 36 },
212
- h3: { fontSize: 22, fontWeight: "600", lineHeight: 30 },
213
- body: { fontSize: 17, fontWeight: "400", lineHeight: 26 },
214
- caption: { fontSize: 13, fontWeight: "400", lineHeight: 20 },
215
- label: { fontSize: 15, fontWeight: "500", lineHeight: 22 }
274
+ h1: { fontSize: ms(40), fontWeight: "700", lineHeight: mvs(52) },
275
+ h2: { fontSize: ms(28), fontWeight: "700", lineHeight: mvs(36) },
276
+ h3: { fontSize: ms(22), fontWeight: "600", lineHeight: mvs(30) },
277
+ body: { fontSize: ms(17), fontWeight: "400", lineHeight: mvs(26) },
278
+ caption: { fontSize: ms(13), fontWeight: "400", lineHeight: mvs(20) },
279
+ label: { fontSize: ms(15), fontWeight: "500", lineHeight: mvs(22) }
216
280
  };
217
281
  function Text2({ variant = "body", color, style, children, ...props }) {
218
282
  const { colors } = useTheme();
219
283
  const defaultColor = variant === "caption" ? colors.mutedForeground : colors.foreground;
220
- return /* @__PURE__ */ React23__default.default.createElement(
284
+ return /* @__PURE__ */ React24__default.default.createElement(
221
285
  reactNative.Text,
222
286
  {
223
287
  style: [variantStyles[variant], { color: color ?? defaultColor }, style],
@@ -228,14 +292,15 @@ function Text2({ variant = "body", color, style, children, ...props }) {
228
292
  );
229
293
  }
230
294
  var webInputResetStyle = reactNative.Platform.OS === "web" ? { outlineStyle: "none", outlineWidth: 0, outlineColor: "transparent", boxShadow: "none" } : {};
231
- function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, type = "text", containerStyle, style, onFocus, onBlur, secureTextEntry, ...props }) {
295
+ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type = "text", containerStyle, style, onFocus, onBlur, secureTextEntry, ...props }) {
232
296
  const { colors } = useTheme();
233
- const [focused, setFocused] = React23.useState(false);
234
- const [showPassword, setShowPassword] = React23.useState(false);
297
+ const [focused, setFocused] = React24.useState(false);
298
+ const [showPassword, setShowPassword] = React24.useState(false);
235
299
  const isPassword = type === "password";
236
300
  const effectiveSecure = isPassword ? !showPassword : secureTextEntry;
237
- const effectiveSuffix = isPassword && !suffix ? /* @__PURE__ */ React23__default.default.createElement(reactNative.TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles2.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React23__default.default.createElement(vectorIcons.AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.mutedForeground })) : suffix;
238
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles2.container, containerStyle] }, label ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles2.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React23__default.default.createElement(
301
+ const effectivePrefix = prefixIcon ? renderIcon(prefixIcon, 20, prefixIconColor ?? colors.mutedForeground) : prefix;
302
+ const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */ React24__default.default.createElement(reactNative.TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles2.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React24__default.default.createElement(vectorIcons.AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.mutedForeground })) : suffixIcon ? renderIcon(suffixIcon, 20, suffixIconColor ?? colors.mutedForeground) : suffix;
303
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles2.container, containerStyle] }, label ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles2.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React24__default.default.createElement(
239
304
  reactNative.View,
240
305
  {
241
306
  style: [
@@ -246,8 +311,8 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, t
246
311
  }
247
312
  ]
248
313
  },
249
- prefix ? typeof prefix === "string" ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles2.prefixText, { color: colors.mutedForeground }, prefixStyle], allowFontScaling: true }, prefix) : /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles2.prefixContainer }, prefix) : null,
250
- /* @__PURE__ */ React23__default.default.createElement(
314
+ effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles2.prefixText, { color: colors.mutedForeground }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles2.prefixContainer }, effectivePrefix) : null,
315
+ /* @__PURE__ */ React24__default.default.createElement(
251
316
  reactNative.TextInput,
252
317
  {
253
318
  style: [
@@ -272,67 +337,68 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, t
272
337
  ...props
273
338
  }
274
339
  ),
275
- effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles2.suffixText, { color: colors.mutedForeground }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles2.suffixContainer }, effectiveSuffix) : null
276
- ), error ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles2.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles2.helperText, { color: colors.mutedForeground }], allowFontScaling: true }, hint) : null);
340
+ effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles2.suffixText, { color: colors.mutedForeground }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles2.suffixContainer }, effectiveSuffix) : null
341
+ ), error ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles2.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles2.helperText, { color: colors.mutedForeground }], allowFontScaling: true }, hint) : null);
277
342
  }
278
343
  var styles2 = reactNative.StyleSheet.create({
279
344
  container: {
280
- gap: 8
345
+ gap: vs(8)
281
346
  },
282
347
  label: {
283
- fontSize: 15,
348
+ fontSize: ms(15),
284
349
  fontWeight: "500"
285
350
  },
286
351
  inputWrapper: {
287
352
  flexDirection: "row",
288
353
  alignItems: "center",
289
354
  borderWidth: 1.5,
290
- borderRadius: 8,
291
- paddingHorizontal: 16,
292
- paddingVertical: 14
355
+ borderRadius: ms(8),
356
+ paddingHorizontal: s(16),
357
+ paddingVertical: vs(14)
293
358
  },
294
359
  input: {
295
360
  flex: 1,
296
- fontSize: 17,
361
+ fontSize: ms(17),
297
362
  paddingVertical: 0
298
363
  },
299
364
  prefixContainer: {
300
- marginRight: 8
365
+ marginRight: s(8)
301
366
  },
302
367
  prefixText: {
303
- fontSize: 17,
304
- marginRight: 8
368
+ fontSize: ms(17),
369
+ marginRight: s(8)
305
370
  },
306
371
  suffixContainer: {
307
- marginLeft: 8
372
+ marginLeft: s(8)
308
373
  },
309
374
  suffixText: {
310
- fontSize: 17,
311
- marginLeft: 8
375
+ fontSize: ms(17),
376
+ marginLeft: s(8)
312
377
  },
313
378
  passwordToggle: {
314
- padding: 4
379
+ padding: s(4)
315
380
  },
316
381
  helperText: {
317
- fontSize: 13
382
+ fontSize: ms(13)
318
383
  }
319
384
  });
320
385
  var sizePadding = {
321
- sm: { paddingHorizontal: 8, paddingVertical: 2 },
322
- md: { paddingHorizontal: 10, paddingVertical: 4 },
323
- lg: { paddingHorizontal: 12, paddingVertical: 6 }
386
+ sm: { paddingHorizontal: s(8), paddingVertical: vs(2) },
387
+ md: { paddingHorizontal: s(10), paddingVertical: vs(4) },
388
+ lg: { paddingHorizontal: s(12), paddingVertical: vs(6) }
324
389
  };
325
390
  var sizeFontSize = {
326
- sm: { fontSize: 11 },
327
- md: { fontSize: 13 },
328
- lg: { fontSize: 15 }
391
+ sm: { fontSize: ms(11) },
392
+ md: { fontSize: ms(13) },
393
+ lg: { fontSize: ms(15) }
329
394
  };
330
395
  var sizeIconGap = {
331
- sm: 4,
332
- md: 6,
333
- lg: 6
396
+ sm: s(4),
397
+ md: s(6),
398
+ lg: s(6)
334
399
  };
335
- function Badge({ label, children, variant = "default", size = "md", icon, style }) {
400
+ var sizeIconSize = { sm: 10, md: 12, lg: 14 };
401
+ function Badge({ label, children, variant = "default", size = "md", icon, iconName, iconColor, style }) {
336
402
  const { colors } = useTheme();
337
403
  const containerStyle = {
338
404
  default: { backgroundColor: colors.primary },
@@ -346,12 +412,13 @@ function Badge({ label, children, variant = "default", size = "md", icon, style
346
412
  destructive: colors.destructiveForeground,
347
413
  outline: colors.foreground
348
414
  }[variant];
415
+ const effectiveIcon = iconName ? renderIcon(iconName, sizeIconSize[size], iconColor ?? textColor) : icon;
349
416
  const content = children ?? label;
350
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles3.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, icon ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles3.iconContainer }, icon) : null, typeof content === "string" ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles3.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
417
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles3.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, effectiveIcon ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles3.iconContainer }, effectiveIcon) : null, typeof content === "string" ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles3.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
351
418
  }
352
419
  var styles3 = reactNative.StyleSheet.create({
353
420
  container: {
354
- borderRadius: 6,
421
+ borderRadius: ms(6),
355
422
  alignSelf: "flex-start",
356
423
  flexDirection: "row",
357
424
  alignItems: "center"
@@ -367,10 +434,10 @@ var styles3 = reactNative.StyleSheet.create({
367
434
  var nativeDriver2 = reactNative.Platform.OS !== "web";
368
435
  function Card({ children, variant = "elevated", onPress, style }) {
369
436
  const { colors } = useTheme();
370
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
437
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
371
438
  const handlePressIn = () => {
372
439
  if (!onPress) return;
373
- reactNative.Animated.spring(scale, {
440
+ reactNative.Animated.spring(scale2, {
374
441
  toValue: 0.98,
375
442
  useNativeDriver: nativeDriver2,
376
443
  speed: 40,
@@ -379,7 +446,7 @@ function Card({ children, variant = "elevated", onPress, style }) {
379
446
  };
380
447
  const handlePressOut = () => {
381
448
  if (!onPress) return;
382
- reactNative.Animated.spring(scale, {
449
+ reactNative.Animated.spring(scale2, {
383
450
  toValue: 1,
384
451
  useNativeDriver: nativeDriver2,
385
452
  speed: 40,
@@ -388,7 +455,7 @@ function Card({ children, variant = "elevated", onPress, style }) {
388
455
  };
389
456
  const handlePress = () => {
390
457
  if (!onPress) return;
391
- Haptics12__namespace.impactAsync(Haptics12__namespace.ImpactFeedbackStyle.Light);
458
+ impactLight();
392
459
  onPress();
393
460
  };
394
461
  const variantStyle = {
@@ -414,9 +481,9 @@ function Card({ children, variant = "elevated", onPress, style }) {
414
481
  elevation: 0
415
482
  }
416
483
  }[variant];
417
- const cardContent = /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles4.card, variantStyle, style] }, children);
484
+ const cardContent = /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles4.card, variantStyle, style] }, children);
418
485
  if (onPress) {
419
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23__default.default.createElement(
486
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React24__default.default.createElement(
420
487
  reactNative.TouchableOpacity,
421
488
  {
422
489
  onPress: handlePress,
@@ -431,46 +498,46 @@ function Card({ children, variant = "elevated", onPress, style }) {
431
498
  return cardContent;
432
499
  }
433
500
  function CardHeader({ children, style }) {
434
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles4.header, style] }, children);
501
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles4.header, style] }, children);
435
502
  }
436
503
  function CardTitle({ children, style }) {
437
504
  const { colors } = useTheme();
438
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles4.title, { color: colors.cardForeground }, style], allowFontScaling: true }, children);
505
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles4.title, { color: colors.cardForeground }, style], allowFontScaling: true }, children);
439
506
  }
440
507
  function CardDescription({ children, style }) {
441
508
  const { colors } = useTheme();
442
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles4.description, { color: colors.mutedForeground }, style], allowFontScaling: true }, children);
509
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles4.description, { color: colors.mutedForeground }, style], allowFontScaling: true }, children);
443
510
  }
444
511
  function CardContent({ children, style }) {
445
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles4.content, style] }, children);
512
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles4.content, style] }, children);
446
513
  }
447
514
  function CardFooter({ children, style }) {
448
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles4.footer, style] }, children);
515
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles4.footer, style] }, children);
449
516
  }
450
517
  var styles4 = reactNative.StyleSheet.create({
451
518
  card: {
452
- borderRadius: 12,
519
+ borderRadius: ms(12),
453
520
  borderWidth: 1
454
521
  },
455
522
  header: {
456
- padding: 24,
523
+ padding: s(24),
457
524
  paddingBottom: 0,
458
- gap: 8
525
+ gap: vs(8)
459
526
  },
460
527
  title: {
461
- fontSize: 20,
528
+ fontSize: ms(20),
462
529
  fontWeight: "600",
463
- lineHeight: 28
530
+ lineHeight: mvs(28)
464
531
  },
465
532
  description: {
466
- fontSize: 15,
467
- lineHeight: 22
533
+ fontSize: ms(15),
534
+ lineHeight: mvs(22)
468
535
  },
469
536
  content: {
470
- padding: 24
537
+ padding: s(24)
471
538
  },
472
539
  footer: {
473
- padding: 24,
540
+ padding: s(24),
474
541
  paddingTop: 0,
475
542
  flexDirection: "row",
476
543
  alignItems: "center"
@@ -478,7 +545,7 @@ var styles4 = reactNative.StyleSheet.create({
478
545
  });
479
546
  function Separator({ orientation = "horizontal", style }) {
480
547
  const { colors } = useTheme();
481
- return /* @__PURE__ */ React23__default.default.createElement(
548
+ return /* @__PURE__ */ React24__default.default.createElement(
482
549
  reactNative.View,
483
550
  {
484
551
  style: [
@@ -506,14 +573,14 @@ var sizeMap = {
506
573
  };
507
574
  function Spinner({ size = "md", color, ...props }) {
508
575
  const { colors } = useTheme();
509
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap[size], color: color ?? colors.primary, ...props });
576
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap[size], color: color ?? colors.primary, ...props });
510
577
  }
511
578
  function Skeleton({ width = "100%", height = 16, borderRadius = 6, style }) {
512
579
  const { colors, colorScheme } = useTheme();
513
- const shimmerAnim = React23.useRef(new reactNative.Animated.Value(0)).current;
514
- const [containerWidth, setContainerWidth] = React23.useState(300);
580
+ const shimmerAnim = React24.useRef(new reactNative.Animated.Value(0)).current;
581
+ const [containerWidth, setContainerWidth] = React24.useState(300);
515
582
  const shimmerHighlight = colorScheme === "dark" ? "rgba(255,255,255,0.08)" : "rgba(255,255,255,0.7)";
516
- React23.useEffect(() => {
583
+ React24.useEffect(() => {
517
584
  const animation = reactNative.Animated.loop(
518
585
  reactNative.Animated.timing(shimmerAnim, {
519
586
  toValue: 1,
@@ -528,7 +595,7 @@ function Skeleton({ width = "100%", height = 16, borderRadius = 6, style }) {
528
595
  inputRange: [0, 1],
529
596
  outputRange: [-containerWidth, containerWidth]
530
597
  });
531
- return /* @__PURE__ */ React23__default.default.createElement(
598
+ return /* @__PURE__ */ React24__default.default.createElement(
532
599
  reactNative.View,
533
600
  {
534
601
  style: [
@@ -538,7 +605,7 @@ function Skeleton({ width = "100%", height = 16, borderRadius = 6, style }) {
538
605
  ],
539
606
  onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width)
540
607
  },
541
- /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: [reactNative.StyleSheet.absoluteFill, { transform: [{ translateX }] }] }, /* @__PURE__ */ React23__default.default.createElement(
608
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: [reactNative.StyleSheet.absoluteFill, { transform: [{ translateX }] }] }, /* @__PURE__ */ React24__default.default.createElement(
542
609
  expoLinearGradient.LinearGradient,
543
610
  {
544
611
  colors: ["transparent", shimmerHighlight, "transparent"],
@@ -555,20 +622,20 @@ var styles6 = reactNative.StyleSheet.create({
555
622
  }
556
623
  });
557
624
  var sizeMap2 = {
558
- sm: 28,
559
- md: 40,
560
- lg: 56,
561
- xl: 72
625
+ sm: s(28),
626
+ md: s(40),
627
+ lg: s(56),
628
+ xl: s(72)
562
629
  };
563
630
  var fontSizeMap = {
564
- sm: 12,
565
- md: 16,
566
- lg: 22,
567
- xl: 28
631
+ sm: ms(12),
632
+ md: ms(16),
633
+ lg: ms(22),
634
+ xl: ms(28)
568
635
  };
569
636
  function Avatar({ src, fallback, size = "md", style }) {
570
637
  const { colors } = useTheme();
571
- const [imageError, setImageError] = React23.useState(false);
638
+ const [imageError, setImageError] = React24.useState(false);
572
639
  const dimension = sizeMap2[size];
573
640
  const showFallback = !src || imageError;
574
641
  const containerStyle = {
@@ -578,14 +645,14 @@ function Avatar({ src, fallback, size = "md", style }) {
578
645
  backgroundColor: colors.muted,
579
646
  overflow: "hidden"
580
647
  };
581
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles7.base, containerStyle, style] }, !showFallback ? /* @__PURE__ */ React23__default.default.createElement(
648
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles7.base, containerStyle, style] }, !showFallback ? /* @__PURE__ */ React24__default.default.createElement(
582
649
  reactNative.Image,
583
650
  {
584
651
  source: { uri: src },
585
652
  style: { width: dimension, height: dimension },
586
653
  onError: () => setImageError(true)
587
654
  }
588
- ) : /* @__PURE__ */ React23__default.default.createElement(
655
+ ) : /* @__PURE__ */ React24__default.default.createElement(
589
656
  reactNative.Text,
590
657
  {
591
658
  style: [styles7.fallback, { color: colors.mutedForeground, fontSize: fontSizeMap[size] }],
@@ -603,21 +670,22 @@ var styles7 = reactNative.StyleSheet.create({
603
670
  fontWeight: "500"
604
671
  }
605
672
  });
606
- function AlertBanner({ title, description, variant = "default", icon, style }) {
673
+ function AlertBanner({ title, description, variant = "default", icon, iconName, iconColor, style }) {
607
674
  const { colors } = useTheme();
608
675
  const borderColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.border;
609
676
  const titleColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.foreground;
610
677
  const descColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.mutedForeground;
611
- const defaultIcon = variant === "success" ? /* @__PURE__ */ React23__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 18, color: titleColor }) : variant === "destructive" ? /* @__PURE__ */ React23__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: 20, color: titleColor }) : /* @__PURE__ */ React23__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 18, color: titleColor });
612
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles8.container, { backgroundColor: colors.card, borderColor }, style] }, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles8.icon }, icon ?? defaultIcon), /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles8.content }, title ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles8.title, { color: titleColor }], allowFontScaling: true }, title) : null, description ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles8.description, { color: descColor }], allowFontScaling: true }, description) : null));
678
+ const defaultIcon = variant === "success" ? /* @__PURE__ */ React24__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 18, color: titleColor }) : variant === "destructive" ? /* @__PURE__ */ React24__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: 20, color: titleColor }) : /* @__PURE__ */ React24__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 18, color: titleColor });
679
+ const effectiveIcon = iconName ? renderIcon(iconName, 18, iconColor ?? titleColor) : icon ?? defaultIcon;
680
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles8.container, { backgroundColor: colors.card, borderColor }, style] }, /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles8.icon }, effectiveIcon), /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles8.content }, title ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles8.title, { color: titleColor }], allowFontScaling: true }, title) : null, description ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles8.description, { color: descColor }], allowFontScaling: true }, description) : null));
613
681
  }
614
682
  var styles8 = reactNative.StyleSheet.create({
615
683
  container: {
616
684
  flexDirection: "row",
617
685
  borderWidth: 1,
618
- borderRadius: 12,
619
- padding: 16,
620
- gap: 12,
686
+ borderRadius: ms(12),
687
+ padding: s(16),
688
+ gap: s(12),
621
689
  shadowColor: "#000",
622
690
  shadowOffset: { width: 0, height: 4 },
623
691
  shadowOpacity: 0.06,
@@ -629,24 +697,24 @@ var styles8 = reactNative.StyleSheet.create({
629
697
  },
630
698
  content: {
631
699
  flex: 1,
632
- gap: 4
700
+ gap: vs(4)
633
701
  },
634
702
  title: {
635
- fontSize: 14,
703
+ fontSize: ms(14),
636
704
  fontWeight: "500",
637
- lineHeight: 20
705
+ lineHeight: mvs(20)
638
706
  },
639
707
  description: {
640
- fontSize: 14,
641
- lineHeight: 20
708
+ fontSize: ms(14),
709
+ lineHeight: mvs(20)
642
710
  }
643
711
  });
644
712
  function Progress({ value = 0, max = 100, style }) {
645
713
  const { colors } = useTheme();
646
714
  const percent = Math.min(Math.max(value / max * 100, 0), 100);
647
- const [trackWidth, setTrackWidth] = React23.useState(0);
648
- const animatedWidth = React23.useRef(new reactNative.Animated.Value(0)).current;
649
- React23.useEffect(() => {
715
+ const [trackWidth, setTrackWidth] = React24.useState(0);
716
+ const animatedWidth = React24.useRef(new reactNative.Animated.Value(0)).current;
717
+ React24.useEffect(() => {
650
718
  if (trackWidth === 0) return;
651
719
  reactNative.Animated.spring(animatedWidth, {
652
720
  toValue: percent / 100 * trackWidth,
@@ -655,13 +723,13 @@ function Progress({ value = 0, max = 100, style }) {
655
723
  bounciness: 0
656
724
  }).start();
657
725
  }, [percent, trackWidth]);
658
- return /* @__PURE__ */ React23__default.default.createElement(
726
+ return /* @__PURE__ */ React24__default.default.createElement(
659
727
  reactNative.View,
660
728
  {
661
729
  style: [styles9.track, { backgroundColor: colors.muted }, style],
662
730
  onLayout: (e) => setTrackWidth(e.nativeEvent.layout.width)
663
731
  },
664
- /* @__PURE__ */ React23__default.default.createElement(
732
+ /* @__PURE__ */ React24__default.default.createElement(
665
733
  reactNative.Animated.View,
666
734
  {
667
735
  style: [styles9.indicator, { width: animatedWidth, backgroundColor: colors.primary }]
@@ -671,7 +739,7 @@ function Progress({ value = 0, max = 100, style }) {
671
739
  }
672
740
  var styles9 = reactNative.StyleSheet.create({
673
741
  track: {
674
- height: 8,
742
+ height: vs(8),
675
743
  borderRadius: 999,
676
744
  overflow: "hidden",
677
745
  width: "100%"
@@ -681,10 +749,11 @@ var styles9 = reactNative.StyleSheet.create({
681
749
  borderRadius: 999
682
750
  }
683
751
  });
684
- function EmptyState({ icon, title, description, action, size = "default", style }) {
752
+ function EmptyState({ icon, iconName, iconColor, title, description, action, size = "default", style }) {
685
753
  const { colors } = useTheme();
686
754
  const isCompact = size === "compact";
687
- return /* @__PURE__ */ React23__default.default.createElement(
755
+ const effectiveIcon = iconName ? renderIcon(iconName, isCompact ? 32 : 48, iconColor ?? colors.mutedForeground) : icon;
756
+ return /* @__PURE__ */ React24__default.default.createElement(
688
757
  reactNative.View,
689
758
  {
690
759
  style: [
@@ -694,7 +763,7 @@ function EmptyState({ icon, title, description, action, size = "default", style
694
763
  style
695
764
  ]
696
765
  },
697
- icon ? /* @__PURE__ */ React23__default.default.createElement(
766
+ effectiveIcon ? /* @__PURE__ */ React24__default.default.createElement(
698
767
  reactNative.View,
699
768
  {
700
769
  style: [
@@ -703,17 +772,17 @@ function EmptyState({ icon, title, description, action, size = "default", style
703
772
  { backgroundColor: colors.muted }
704
773
  ]
705
774
  },
706
- icon
775
+ effectiveIcon
707
776
  ) : null,
708
- /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles10.textWrapper }, /* @__PURE__ */ React23__default.default.createElement(
777
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles10.textWrapper }, /* @__PURE__ */ React24__default.default.createElement(
709
778
  reactNative.Text,
710
779
  {
711
780
  style: [styles10.title, isCompact && styles10.titleCompact, { color: colors.foreground }],
712
781
  allowFontScaling: true
713
782
  },
714
783
  title
715
- ), description && !isCompact ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles10.description, { color: colors.mutedForeground }], allowFontScaling: true }, description) : null),
716
- action && !isCompact ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles10.action }, action) : null
784
+ ), description && !isCompact ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles10.description, { color: colors.mutedForeground }], allowFontScaling: true }, description) : null),
785
+ action && !isCompact ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles10.action }, action) : null
717
786
  );
718
787
  }
719
788
  var styles10 = reactNative.StyleSheet.create({
@@ -722,46 +791,46 @@ var styles10 = reactNative.StyleSheet.create({
722
791
  justifyContent: "center",
723
792
  borderWidth: 1,
724
793
  borderStyle: "dashed",
725
- borderRadius: 12,
726
- padding: 32,
727
- gap: 16
794
+ borderRadius: ms(12),
795
+ padding: s(32),
796
+ gap: vs(16)
728
797
  },
729
798
  containerCompact: {
730
- padding: 20,
731
- gap: 10
799
+ padding: s(20),
800
+ gap: vs(10)
732
801
  },
733
802
  iconWrapper: {
734
- width: 48,
735
- height: 48,
736
- borderRadius: 12,
803
+ width: s(48),
804
+ height: s(48),
805
+ borderRadius: ms(12),
737
806
  alignItems: "center",
738
807
  justifyContent: "center"
739
808
  },
740
809
  iconWrapperCompact: {
741
- width: 36,
742
- height: 36,
743
- borderRadius: 8
810
+ width: s(36),
811
+ height: s(36),
812
+ borderRadius: ms(8)
744
813
  },
745
814
  textWrapper: {
746
815
  alignItems: "center",
747
- gap: 8,
748
- maxWidth: 320
816
+ gap: vs(8),
817
+ maxWidth: s(320)
749
818
  },
750
819
  title: {
751
- fontSize: 18,
820
+ fontSize: ms(18),
752
821
  fontWeight: "500",
753
822
  textAlign: "center"
754
823
  },
755
824
  titleCompact: {
756
- fontSize: 15
825
+ fontSize: ms(15)
757
826
  },
758
827
  description: {
759
- fontSize: 14,
760
- lineHeight: 20,
828
+ fontSize: ms(14),
829
+ lineHeight: mvs(20),
761
830
  textAlign: "center"
762
831
  },
763
832
  action: {
764
- marginTop: 8
833
+ marginTop: vs(8)
765
834
  }
766
835
  });
767
836
  var webInputResetStyle2 = reactNative.Platform.OS === "web" ? { outlineStyle: "none", outlineWidth: 0, outlineColor: "transparent", boxShadow: "none" } : {};
@@ -777,8 +846,8 @@ function Textarea({
777
846
  ...props
778
847
  }) {
779
848
  const { colors } = useTheme();
780
- const [focused, setFocused] = React23.useState(false);
781
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles11.container, containerStyle] }, label ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles11.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React23__default.default.createElement(
849
+ const [focused, setFocused] = React24.useState(false);
850
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles11.container, containerStyle] }, label ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles11.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React24__default.default.createElement(
782
851
  reactNative.TextInput,
783
852
  {
784
853
  multiline: true,
@@ -790,7 +859,7 @@ function Textarea({
790
859
  borderColor: error ? colors.destructive : focused ? colors.ring ?? colors.primary : colors.border,
791
860
  color: colors.foreground,
792
861
  backgroundColor: colors.background,
793
- minHeight: rows * 30
862
+ minHeight: rows * vs(30)
794
863
  },
795
864
  webInputResetStyle2,
796
865
  style
@@ -807,27 +876,28 @@ function Textarea({
807
876
  allowFontScaling: true,
808
877
  ...props
809
878
  }
810
- ), error ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles11.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles11.helperText, { color: colors.mutedForeground }], allowFontScaling: true }, hint) : null);
879
+ ), error ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles11.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles11.helperText, { color: colors.mutedForeground }], allowFontScaling: true }, hint) : null);
811
880
  }
812
881
  var styles11 = reactNative.StyleSheet.create({
813
882
  container: {
814
- gap: 8
883
+ gap: vs(8)
815
884
  },
816
885
  label: {
817
- fontSize: 15,
886
+ fontSize: ms(15),
818
887
  fontWeight: "500"
819
888
  },
820
889
  input: {
821
890
  borderWidth: 1.5,
822
- borderRadius: 8,
823
- paddingHorizontal: 16,
824
- paddingVertical: 14,
825
- fontSize: 17
891
+ borderRadius: ms(8),
892
+ paddingHorizontal: s(16),
893
+ paddingVertical: vs(14),
894
+ fontSize: ms(17)
826
895
  },
827
896
  helperText: {
828
- fontSize: 13
897
+ fontSize: ms(13)
829
898
  }
830
899
  });
900
+ var nativeDriver3 = reactNative.Platform.OS !== "web";
831
901
  function Checkbox({
832
902
  checked = false,
833
903
  onCheckedChange,
@@ -836,20 +906,20 @@ function Checkbox({
836
906
  style
837
907
  }) {
838
908
  const { colors } = useTheme();
839
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
909
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
840
910
  const handlePressIn = () => {
841
911
  if (disabled) return;
842
- reactNative.Animated.spring(scale, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
912
+ reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver3, speed: 40, bounciness: 0 }).start();
843
913
  };
844
914
  const handlePressOut = () => {
845
- reactNative.Animated.spring(scale, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
915
+ reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver3, speed: 40, bounciness: 4 }).start();
846
916
  };
847
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23__default.default.createElement(
917
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React24__default.default.createElement(
848
918
  reactNative.TouchableOpacity,
849
919
  {
850
920
  style: [styles12.row, style],
851
921
  onPress: () => {
852
- Haptics12__namespace.selectionAsync();
922
+ selectionAsync();
853
923
  onCheckedChange?.(!checked);
854
924
  },
855
925
  onPressIn: handlePressIn,
@@ -858,7 +928,7 @@ function Checkbox({
858
928
  activeOpacity: 1,
859
929
  touchSoundDisabled: true
860
930
  },
861
- /* @__PURE__ */ React23__default.default.createElement(
931
+ /* @__PURE__ */ React24__default.default.createElement(
862
932
  reactNative.View,
863
933
  {
864
934
  style: [
@@ -870,9 +940,9 @@ function Checkbox({
870
940
  }
871
941
  ]
872
942
  },
873
- checked ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles12.checkmark, { borderColor: colors.primaryForeground }] }) : null
943
+ checked ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles12.checkmark, { borderColor: colors.primaryForeground }] }) : null
874
944
  ),
875
- label ? /* @__PURE__ */ React23__default.default.createElement(
945
+ label ? /* @__PURE__ */ React24__default.default.createElement(
876
946
  reactNative.Text,
877
947
  {
878
948
  style: [styles12.label, { color: disabled ? colors.mutedForeground : colors.foreground }]
@@ -885,43 +955,43 @@ var styles12 = reactNative.StyleSheet.create({
885
955
  row: {
886
956
  flexDirection: "row",
887
957
  alignItems: "center",
888
- gap: 12
958
+ gap: s(12)
889
959
  },
890
960
  box: {
891
- width: 24,
892
- height: 24,
893
- borderRadius: 8,
961
+ width: s(24),
962
+ height: s(24),
963
+ borderRadius: ms(8),
894
964
  borderWidth: 1.5,
895
965
  alignItems: "center",
896
966
  justifyContent: "center"
897
967
  },
898
968
  checkmark: {
899
- width: 12,
900
- height: 7,
969
+ width: s(12),
970
+ height: vs(7),
901
971
  borderLeftWidth: 2,
902
972
  borderBottomWidth: 2,
903
973
  transform: [{ rotate: "-45deg" }, { translateY: -1 }]
904
974
  },
905
975
  label: {
906
- fontSize: 15,
907
- lineHeight: 22
976
+ fontSize: ms(15),
977
+ lineHeight: mvs(22)
908
978
  }
909
979
  });
910
- var nativeDriver3 = reactNative.Platform.OS !== "web";
911
- var TRACK_WIDTH = 60;
912
- var TRACK_HEIGHT = 36;
913
- var THUMB_SIZE = 28;
914
- var THUMB_OFFSET = 4;
980
+ var nativeDriver4 = reactNative.Platform.OS !== "web";
981
+ var TRACK_WIDTH = s(60);
982
+ var TRACK_HEIGHT = vs(36);
983
+ var THUMB_SIZE = s(28);
984
+ var THUMB_OFFSET = s(4);
915
985
  var THUMB_TRAVEL = TRACK_WIDTH - THUMB_SIZE - THUMB_OFFSET * 2;
916
986
  function Switch({ checked = false, onCheckedChange, disabled, style }) {
917
987
  const { colors } = useTheme();
918
- const translateX = React23.useRef(new reactNative.Animated.Value(checked ? THUMB_TRAVEL : 0)).current;
919
- const trackOpacity = React23.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
920
- React23.useEffect(() => {
988
+ const translateX = React24.useRef(new reactNative.Animated.Value(checked ? THUMB_TRAVEL : 0)).current;
989
+ const trackOpacity = React24.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
990
+ React24.useEffect(() => {
921
991
  reactNative.Animated.parallel([
922
992
  reactNative.Animated.spring(translateX, {
923
993
  toValue: checked ? THUMB_TRAVEL : 0,
924
- useNativeDriver: nativeDriver3,
994
+ useNativeDriver: nativeDriver4,
925
995
  bounciness: 4
926
996
  }),
927
997
  reactNative.Animated.timing(trackOpacity, {
@@ -935,11 +1005,11 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
935
1005
  inputRange: [0, 1],
936
1006
  outputRange: [colors.muted, colors.primary]
937
1007
  });
938
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React23__default.default.createElement(
1008
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React24__default.default.createElement(
939
1009
  reactNative.TouchableOpacity,
940
1010
  {
941
1011
  onPress: () => {
942
- Haptics12__namespace.selectionAsync();
1012
+ selectionAsync();
943
1013
  onCheckedChange?.(!checked);
944
1014
  },
945
1015
  disabled,
@@ -947,7 +1017,7 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
947
1017
  touchSoundDisabled: true,
948
1018
  style: styles13.wrapper
949
1019
  },
950
- /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: [styles13.track, { backgroundColor: trackColor }] }, /* @__PURE__ */ React23__default.default.createElement(
1020
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: [styles13.track, { backgroundColor: trackColor }] }, /* @__PURE__ */ React24__default.default.createElement(
951
1021
  reactNative.Animated.View,
952
1022
  {
953
1023
  style: [
@@ -982,10 +1052,11 @@ var styles13 = reactNative.StyleSheet.create({
982
1052
  }
983
1053
  });
984
1054
  var sizeStyles = {
985
- sm: { paddingHorizontal: 12, paddingVertical: 8, minWidth: 40, minHeight: 40 },
986
- md: { paddingHorizontal: 16, paddingVertical: 12, minWidth: 44, minHeight: 44 },
987
- lg: { paddingHorizontal: 20, paddingVertical: 14, minWidth: 48, minHeight: 48 }
1055
+ sm: { paddingHorizontal: s(12), paddingVertical: vs(8), minWidth: s(40), minHeight: vs(40) },
1056
+ md: { paddingHorizontal: s(16), paddingVertical: vs(12), minWidth: s(44), minHeight: vs(44) },
1057
+ lg: { paddingHorizontal: s(20), paddingVertical: vs(14), minWidth: s(48), minHeight: vs(48) }
988
1058
  };
1059
+ var iconSizeMap2 = { sm: 16, md: 18, lg: 20 };
989
1060
  function Toggle({
990
1061
  pressed = false,
991
1062
  onPressedChange,
@@ -994,14 +1065,18 @@ function Toggle({
994
1065
  label,
995
1066
  icon,
996
1067
  activeIcon,
1068
+ iconName,
1069
+ activeIconName,
1070
+ iconColor,
1071
+ activeIconColor,
997
1072
  disabled,
998
1073
  style,
999
1074
  ...props
1000
1075
  }) {
1001
1076
  const { colors } = useTheme();
1002
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
1003
- const pressAnim = React23.useRef(new reactNative.Animated.Value(pressed ? 1 : 0)).current;
1004
- React23.useEffect(() => {
1077
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
1078
+ const pressAnim = React24.useRef(new reactNative.Animated.Value(pressed ? 1 : 0)).current;
1079
+ React24.useEffect(() => {
1005
1080
  reactNative.Animated.timing(pressAnim, {
1006
1081
  toValue: pressed ? 1 : 0,
1007
1082
  duration: 150,
@@ -1011,10 +1086,10 @@ function Toggle({
1011
1086
  }, [pressed, pressAnim]);
1012
1087
  const handlePressIn = () => {
1013
1088
  if (disabled) return;
1014
- reactNative.Animated.spring(scale, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
1089
+ reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
1015
1090
  };
1016
1091
  const handlePressOut = () => {
1017
- reactNative.Animated.spring(scale, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1092
+ reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1018
1093
  };
1019
1094
  const borderColor = pressAnim.interpolate({
1020
1095
  inputRange: [0, 1],
@@ -1028,6 +1103,7 @@ function Toggle({
1028
1103
  inputRange: [0, 1],
1029
1104
  outputRange: [colors.foreground, colors.primary]
1030
1105
  });
1106
+ const iconSize = iconSizeMap2[size];
1031
1107
  const LeftIcon = () => {
1032
1108
  const renderProp = (prop) => {
1033
1109
  if (!prop) return null;
@@ -1035,19 +1111,21 @@ function Toggle({
1035
1111
  return prop;
1036
1112
  };
1037
1113
  if (pressed) {
1114
+ if (activeIconName) return /* @__PURE__ */ React24__default.default.createElement(React24__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? colors.primary));
1038
1115
  const active = renderProp(activeIcon);
1039
- if (active) return /* @__PURE__ */ React23__default.default.createElement(React23__default.default.Fragment, null, active);
1040
- return /* @__PURE__ */ React23__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 20, color: colors.primary });
1116
+ if (active) return /* @__PURE__ */ React24__default.default.createElement(React24__default.default.Fragment, null, active);
1117
+ return /* @__PURE__ */ React24__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: colors.primary });
1041
1118
  }
1119
+ if (iconName) return /* @__PURE__ */ React24__default.default.createElement(React24__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? colors.mutedForeground));
1042
1120
  const custom = renderProp(icon);
1043
- if (custom) return /* @__PURE__ */ React23__default.default.createElement(React23__default.default.Fragment, null, custom);
1044
- return /* @__PURE__ */ React23__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: 20, color: colors.mutedForeground });
1121
+ if (custom) return /* @__PURE__ */ React24__default.default.createElement(React24__default.default.Fragment, null, custom);
1122
+ return /* @__PURE__ */ React24__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: colors.mutedForeground });
1045
1123
  };
1046
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale }] }, disabled && styles14.disabled, style] }, /* @__PURE__ */ React23__default.default.createElement(
1124
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles14.disabled, style] }, /* @__PURE__ */ React24__default.default.createElement(
1047
1125
  reactNative.TouchableOpacity,
1048
1126
  {
1049
1127
  onPress: () => {
1050
- Haptics12__namespace.selectionAsync();
1128
+ selectionAsync();
1051
1129
  onPressedChange?.(!pressed);
1052
1130
  },
1053
1131
  onPressIn: handlePressIn,
@@ -1057,7 +1135,7 @@ function Toggle({
1057
1135
  touchSoundDisabled: true,
1058
1136
  ...props
1059
1137
  },
1060
- /* @__PURE__ */ React23__default.default.createElement(
1138
+ /* @__PURE__ */ React24__default.default.createElement(
1061
1139
  reactNative.Animated.View,
1062
1140
  {
1063
1141
  style: [
@@ -1066,49 +1144,50 @@ function Toggle({
1066
1144
  { borderColor, backgroundColor, borderWidth: 2 }
1067
1145
  ]
1068
1146
  },
1069
- /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles14.inner }, /* @__PURE__ */ React23__default.default.createElement(LeftIcon, null), label ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.Text, { style: [styles14.label, { color: textColor }] }, label) : null)
1147
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles14.inner }, /* @__PURE__ */ React24__default.default.createElement(LeftIcon, null), label ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.Text, { style: [styles14.label, { color: textColor }] }, label) : null)
1070
1148
  )
1071
1149
  ));
1072
1150
  }
1073
1151
  var styles14 = reactNative.StyleSheet.create({
1074
1152
  base: {
1075
- borderRadius: 8
1153
+ borderRadius: ms(8)
1076
1154
  },
1077
1155
  inner: {
1078
1156
  flexDirection: "row",
1079
1157
  alignItems: "center",
1080
1158
  justifyContent: "center",
1081
- gap: 8
1159
+ gap: s(8)
1082
1160
  },
1083
1161
  disabled: {
1084
1162
  opacity: 0.45
1085
1163
  },
1086
1164
  label: {
1087
- fontSize: 14,
1165
+ fontSize: ms(14),
1088
1166
  fontWeight: "500"
1089
1167
  }
1090
1168
  });
1169
+ var nativeDriver5 = reactNative.Platform.OS !== "web";
1091
1170
  function RadioItem({
1092
1171
  option,
1093
1172
  selected,
1094
1173
  onSelect
1095
1174
  }) {
1096
1175
  const { colors } = useTheme();
1097
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
1176
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
1098
1177
  const handlePressIn = () => {
1099
1178
  if (option.disabled) return;
1100
- reactNative.Animated.spring(scale, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
1179
+ reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver5, speed: 40, bounciness: 0 }).start();
1101
1180
  };
1102
1181
  const handlePressOut = () => {
1103
- reactNative.Animated.spring(scale, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1182
+ reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver5, speed: 40, bounciness: 4 }).start();
1104
1183
  };
1105
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23__default.default.createElement(
1184
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React24__default.default.createElement(
1106
1185
  reactNative.TouchableOpacity,
1107
1186
  {
1108
1187
  style: styles15.row,
1109
1188
  onPress: () => {
1110
1189
  if (!option.disabled) {
1111
- Haptics12__namespace.selectionAsync();
1190
+ selectionAsync();
1112
1191
  onSelect();
1113
1192
  }
1114
1193
  },
@@ -1118,7 +1197,7 @@ function RadioItem({
1118
1197
  touchSoundDisabled: true,
1119
1198
  disabled: option.disabled
1120
1199
  },
1121
- /* @__PURE__ */ React23__default.default.createElement(
1200
+ /* @__PURE__ */ React24__default.default.createElement(
1122
1201
  reactNative.View,
1123
1202
  {
1124
1203
  style: [
@@ -1129,9 +1208,9 @@ function RadioItem({
1129
1208
  }
1130
1209
  ]
1131
1210
  },
1132
- selected ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles15.dot, { backgroundColor: colors.primary }] }) : null
1211
+ selected ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles15.dot, { backgroundColor: colors.primary }] }) : null
1133
1212
  ),
1134
- /* @__PURE__ */ React23__default.default.createElement(
1213
+ /* @__PURE__ */ React24__default.default.createElement(
1135
1214
  reactNative.Text,
1136
1215
  {
1137
1216
  style: [
@@ -1150,7 +1229,7 @@ function RadioGroup({
1150
1229
  orientation = "vertical",
1151
1230
  style
1152
1231
  }) {
1153
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles15.container, orientation === "horizontal" && styles15.horizontal, style] }, options.map((option) => /* @__PURE__ */ React23__default.default.createElement(
1232
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles15.container, orientation === "horizontal" && styles15.horizontal, style] }, options.map((option) => /* @__PURE__ */ React24__default.default.createElement(
1154
1233
  RadioItem,
1155
1234
  {
1156
1235
  key: option.value,
@@ -1162,7 +1241,7 @@ function RadioGroup({
1162
1241
  }
1163
1242
  var styles15 = reactNative.StyleSheet.create({
1164
1243
  container: {
1165
- gap: 12
1244
+ gap: vs(12)
1166
1245
  },
1167
1246
  horizontal: {
1168
1247
  flexDirection: "row",
@@ -1171,26 +1250,27 @@ var styles15 = reactNative.StyleSheet.create({
1171
1250
  row: {
1172
1251
  flexDirection: "row",
1173
1252
  alignItems: "center",
1174
- gap: 12
1253
+ gap: s(12)
1175
1254
  },
1176
1255
  radio: {
1177
- width: 24,
1178
- height: 24,
1179
- borderRadius: 12,
1256
+ width: s(24),
1257
+ height: s(24),
1258
+ borderRadius: s(12),
1180
1259
  borderWidth: 1.5,
1181
1260
  alignItems: "center",
1182
1261
  justifyContent: "center"
1183
1262
  },
1184
1263
  dot: {
1185
- width: 10,
1186
- height: 10,
1187
- borderRadius: 5
1264
+ width: s(10),
1265
+ height: s(10),
1266
+ borderRadius: s(5)
1188
1267
  },
1189
1268
  label: {
1190
- fontSize: 14,
1191
- lineHeight: 20
1269
+ fontSize: ms(14),
1270
+ lineHeight: mvs(20)
1192
1271
  }
1193
1272
  });
1273
+ var nativeDriver6 = reactNative.Platform.OS !== "web";
1194
1274
  function TabTrigger({
1195
1275
  tab,
1196
1276
  isActive,
@@ -1198,14 +1278,14 @@ function TabTrigger({
1198
1278
  onLayout
1199
1279
  }) {
1200
1280
  const { colors } = useTheme();
1201
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
1281
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
1202
1282
  const handlePressIn = () => {
1203
- reactNative.Animated.spring(scale, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
1283
+ reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver6, speed: 40, bounciness: 0 }).start();
1204
1284
  };
1205
1285
  const handlePressOut = () => {
1206
- reactNative.Animated.spring(scale, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1286
+ reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver6, speed: 40, bounciness: 4 }).start();
1207
1287
  };
1208
- return /* @__PURE__ */ React23__default.default.createElement(
1288
+ return /* @__PURE__ */ React24__default.default.createElement(
1209
1289
  reactNative.TouchableOpacity,
1210
1290
  {
1211
1291
  style: styles16.trigger,
@@ -1216,7 +1296,7 @@ function TabTrigger({
1216
1296
  activeOpacity: 1,
1217
1297
  touchSoundDisabled: true
1218
1298
  },
1219
- /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles16.triggerInner }, tab.icon ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles16.triggerIcon }, typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon) : null, /* @__PURE__ */ React23__default.default.createElement(
1299
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles16.triggerInner }, tab.icon ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles16.triggerIcon }, typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon) : null, /* @__PURE__ */ React24__default.default.createElement(
1220
1300
  reactNative.Text,
1221
1301
  {
1222
1302
  style: [
@@ -1230,13 +1310,13 @@ function TabTrigger({
1230
1310
  );
1231
1311
  }
1232
1312
  function Tabs({ tabs, value, onValueChange, children, style }) {
1233
- const [internal, setInternal] = React23.useState(tabs[0]?.value ?? "");
1313
+ const [internal, setInternal] = React24.useState(tabs[0]?.value ?? "");
1234
1314
  const { colors } = useTheme();
1235
1315
  const active = value ?? internal;
1236
- const tabLayouts = React23.useRef({});
1237
- const pillX = React23.useRef(new reactNative.Animated.Value(0)).current;
1238
- const pillWidth = React23.useRef(new reactNative.Animated.Value(0)).current;
1239
- const initialised = React23.useRef(false);
1316
+ const tabLayouts = React24.useRef({});
1317
+ const pillX = React24.useRef(new reactNative.Animated.Value(0)).current;
1318
+ const pillWidth = React24.useRef(new reactNative.Animated.Value(0)).current;
1319
+ const initialised = React24.useRef(false);
1240
1320
  const animatePill = (tabValue, animate) => {
1241
1321
  const layout = tabLayouts.current[tabValue];
1242
1322
  if (!layout) return;
@@ -1260,17 +1340,17 @@ function Tabs({ tabs, value, onValueChange, children, style }) {
1260
1340
  pillWidth.setValue(layout.width);
1261
1341
  }
1262
1342
  };
1263
- React23.useEffect(() => {
1343
+ React24.useEffect(() => {
1264
1344
  if (initialised.current) {
1265
1345
  animatePill(active, true);
1266
1346
  }
1267
1347
  }, [active]);
1268
1348
  const handlePress = (v) => {
1269
- Haptics12__namespace.selectionAsync();
1349
+ selectionAsync();
1270
1350
  if (!value) setInternal(v);
1271
1351
  onValueChange?.(v);
1272
1352
  };
1273
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles16.list, { backgroundColor: colors.muted }] }, /* @__PURE__ */ React23__default.default.createElement(
1353
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles16.list, { backgroundColor: colors.muted }] }, /* @__PURE__ */ React24__default.default.createElement(
1274
1354
  reactNative.Animated.View,
1275
1355
  {
1276
1356
  style: [
@@ -1291,7 +1371,7 @@ function Tabs({ tabs, value, onValueChange, children, style }) {
1291
1371
  }
1292
1372
  ]
1293
1373
  }
1294
- ), tabs.map((tab) => /* @__PURE__ */ React23__default.default.createElement(
1374
+ ), tabs.map((tab) => /* @__PURE__ */ React24__default.default.createElement(
1295
1375
  TabTrigger,
1296
1376
  {
1297
1377
  key: tab.value,
@@ -1311,21 +1391,21 @@ function Tabs({ tabs, value, onValueChange, children, style }) {
1311
1391
  }
1312
1392
  function TabsContent({ value, activeValue, children, style }) {
1313
1393
  if (value !== activeValue) return null;
1314
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style }, children);
1394
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style }, children);
1315
1395
  }
1316
1396
  var styles16 = reactNative.StyleSheet.create({
1317
1397
  list: {
1318
1398
  flexDirection: "row",
1319
- borderRadius: 12,
1320
- padding: 4,
1321
- gap: 4
1399
+ borderRadius: ms(12),
1400
+ padding: s(4),
1401
+ gap: s(4)
1322
1402
  },
1323
1403
  pill: {},
1324
1404
  trigger: {
1325
1405
  flex: 1,
1326
- paddingVertical: 12,
1327
- paddingHorizontal: 16,
1328
- borderRadius: 8,
1406
+ paddingVertical: vs(12),
1407
+ paddingHorizontal: s(16),
1408
+ borderRadius: ms(8),
1329
1409
  alignItems: "center",
1330
1410
  justifyContent: "center",
1331
1411
  zIndex: 1
@@ -1334,15 +1414,15 @@ var styles16 = reactNative.StyleSheet.create({
1334
1414
  flexDirection: "row",
1335
1415
  alignItems: "center",
1336
1416
  justifyContent: "center",
1337
- gap: 8
1417
+ gap: s(8)
1338
1418
  },
1339
1419
  triggerIcon: {
1340
- marginRight: 6,
1420
+ marginRight: s(6),
1341
1421
  alignItems: "center",
1342
1422
  justifyContent: "center"
1343
1423
  },
1344
1424
  triggerLabel: {
1345
- fontSize: 15,
1425
+ fontSize: ms(15),
1346
1426
  fontWeight: "400"
1347
1427
  },
1348
1428
  activeTriggerLabel: {
@@ -1355,56 +1435,54 @@ function AccordionItemComponent({
1355
1435
  onToggle
1356
1436
  }) {
1357
1437
  const { colors } = useTheme();
1358
- const animatedHeight = ReanimatedAnimated.useSharedValue(0);
1359
- const animatedRotation = ReanimatedAnimated.useSharedValue(0);
1360
- const contentHeight = React23.useRef(0);
1361
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
1362
- const toggle = (open) => {
1363
- const easing = open ? ReanimatedAnimated.Easing.out(ReanimatedAnimated.Easing.ease) : ReanimatedAnimated.Easing.in(ReanimatedAnimated.Easing.ease);
1364
- animatedHeight.value = ReanimatedAnimated.withTiming(open ? contentHeight.current : 0, { duration: 220, easing });
1365
- animatedRotation.value = ReanimatedAnimated.withTiming(open ? 1 : 0, { duration: 220, easing });
1366
- };
1367
- React23__default.default.useEffect(() => {
1368
- toggle(isOpen);
1438
+ const isExpanded = Animated10.useSharedValue(isOpen);
1439
+ const height = Animated10.useSharedValue(0);
1440
+ React24__default.default.useEffect(() => {
1441
+ isExpanded.value = isOpen;
1369
1442
  }, [isOpen]);
1370
- const onLayout = (e) => {
1371
- if (contentHeight.current === 0) {
1372
- contentHeight.current = e.nativeEvent.layout.height;
1373
- if (isOpen) animatedHeight.value = contentHeight.current;
1374
- }
1375
- };
1376
- const heightStyle = ReanimatedAnimated.useAnimatedStyle(() => ({
1377
- height: animatedHeight.value,
1443
+ const derivedHeight = Animated10.useDerivedValue(
1444
+ () => Animated10.withTiming(height.value * Number(isExpanded.value), {
1445
+ duration: 220,
1446
+ easing: isExpanded.value ? Animated10.Easing.out(Animated10.Easing.ease) : Animated10.Easing.in(Animated10.Easing.ease)
1447
+ })
1448
+ );
1449
+ const derivedRotation = Animated10.useDerivedValue(
1450
+ () => Animated10.withTiming(isExpanded.value ? 1 : 0, {
1451
+ duration: 220,
1452
+ easing: isExpanded.value ? Animated10.Easing.out(Animated10.Easing.ease) : Animated10.Easing.in(Animated10.Easing.ease)
1453
+ })
1454
+ );
1455
+ const bodyStyle = Animated10.useAnimatedStyle(() => ({
1456
+ height: derivedHeight.value,
1378
1457
  overflow: "hidden"
1379
1458
  }));
1380
- const rotationStyle = ReanimatedAnimated.useAnimatedStyle(() => ({
1381
- transform: [{ rotate: `${animatedRotation.value * 180}deg` }]
1459
+ const rotationStyle = Animated10.useAnimatedStyle(() => ({
1460
+ transform: [{ rotate: `${derivedRotation.value * 180}deg` }]
1382
1461
  }));
1383
- const handlePressIn = () => {
1384
- reactNative.Animated.spring(scale, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
1385
- };
1386
- const handlePressOut = () => {
1387
- reactNative.Animated.spring(scale, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1388
- };
1389
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles17.item, { borderBottomColor: colors.border }] }, /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23__default.default.createElement(
1390
- reactNative.TouchableOpacity,
1462
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles17.item, { borderBottomColor: colors.border }] }, /* @__PURE__ */ React24__default.default.createElement(
1463
+ reactNative.Pressable,
1391
1464
  {
1392
- style: styles17.trigger,
1465
+ style: ({ pressed }) => [styles17.trigger, { opacity: pressed ? 0.6 : 1 }],
1393
1466
  onPress: () => {
1394
- Haptics12__namespace.selectionAsync();
1467
+ selectionAsync();
1395
1468
  onToggle();
1396
- },
1397
- onPressIn: handlePressIn,
1398
- onPressOut: handlePressOut,
1399
- activeOpacity: 1,
1400
- touchSoundDisabled: true
1469
+ }
1470
+ },
1471
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles17.triggerText, { color: colors.foreground }] }, item.trigger),
1472
+ /* @__PURE__ */ React24__default.default.createElement(Animated10__default.default.View, { style: [styles17.chevron, rotationStyle] }, /* @__PURE__ */ React24__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 20, color: colors.foreground }))
1473
+ ), /* @__PURE__ */ React24__default.default.createElement(Animated10__default.default.View, { style: bodyStyle }, /* @__PURE__ */ React24__default.default.createElement(
1474
+ reactNative.View,
1475
+ {
1476
+ style: styles17.content,
1477
+ onLayout: (e) => {
1478
+ height.value = e.nativeEvent.layout.height;
1479
+ }
1401
1480
  },
1402
- /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles17.triggerText, { color: colors.foreground }] }, item.trigger),
1403
- /* @__PURE__ */ React23__default.default.createElement(ReanimatedAnimated__default.default.View, { style: [styles17.chevron, rotationStyle] }, /* @__PURE__ */ React23__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 20, color: colors.foreground }))
1404
- )), /* @__PURE__ */ React23__default.default.createElement(ReanimatedAnimated__default.default.View, { style: heightStyle }, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles17.content, onLayout }, item.content)));
1481
+ item.content
1482
+ )));
1405
1483
  }
1406
1484
  function Accordion({ items, type = "single", defaultValue, style }) {
1407
- const [openValues, setOpenValues] = React23.useState(() => {
1485
+ const [openValues, setOpenValues] = React24.useState(() => {
1408
1486
  if (!defaultValue) return [];
1409
1487
  return Array.isArray(defaultValue) ? defaultValue : [defaultValue];
1410
1488
  });
@@ -1417,7 +1495,7 @@ function Accordion({ items, type = "single", defaultValue, style }) {
1417
1495
  );
1418
1496
  }
1419
1497
  };
1420
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style }, items.map((item) => /* @__PURE__ */ React23__default.default.createElement(
1498
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style }, items.map((item) => /* @__PURE__ */ React24__default.default.createElement(
1421
1499
  AccordionItemComponent,
1422
1500
  {
1423
1501
  key: item.value,
@@ -1435,18 +1513,20 @@ var styles17 = reactNative.StyleSheet.create({
1435
1513
  flexDirection: "row",
1436
1514
  justifyContent: "space-between",
1437
1515
  alignItems: "center",
1438
- paddingVertical: 20
1516
+ paddingVertical: vs(20)
1439
1517
  },
1440
1518
  triggerText: {
1441
- fontSize: 17,
1519
+ fontSize: ms(17),
1442
1520
  fontWeight: "500",
1443
1521
  flex: 1
1444
1522
  },
1445
1523
  chevron: {
1446
- marginLeft: 8
1524
+ marginLeft: s(8)
1447
1525
  },
1526
+ // position:'absolute' is the key — the inner View escapes the animated wrapper's
1527
+ // clipped height so onLayout always reports the true content height.
1448
1528
  content: {
1449
- paddingBottom: 20,
1529
+ paddingBottom: vs(20),
1450
1530
  position: "absolute",
1451
1531
  width: "100%"
1452
1532
  }
@@ -1466,15 +1546,15 @@ function Slider({
1466
1546
  style
1467
1547
  }) {
1468
1548
  const { colors } = useTheme();
1469
- const lastSteppedValue = React23.useRef(value);
1549
+ const lastSteppedValue = React24.useRef(value);
1470
1550
  const handleValueChange = (v) => {
1471
1551
  if (step && v !== lastSteppedValue.current) {
1472
1552
  lastSteppedValue.current = v;
1473
- Haptics12__namespace.selectionAsync();
1553
+ selectionAsync();
1474
1554
  }
1475
1555
  onValueChange?.(v);
1476
1556
  };
1477
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles18.wrapper, style], accessibilityLabel }, label || showValue ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles18.header }, label ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles18.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles18.valueText, { color: colors.mutedForeground }], allowFontScaling: true }, formatValue2(value)) : null) : null, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: disabled ? styles18.disabled : void 0 }, /* @__PURE__ */ React23__default.default.createElement(
1557
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles18.wrapper, style], accessibilityLabel }, label || showValue ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles18.header }, label ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles18.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles18.valueText, { color: colors.mutedForeground }], allowFontScaling: true }, formatValue2(value)) : null) : null, /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: disabled ? styles18.disabled : void 0 }, /* @__PURE__ */ React24__default.default.createElement(
1478
1558
  RNSlider__default.default,
1479
1559
  {
1480
1560
  value,
@@ -1494,7 +1574,7 @@ function Slider({
1494
1574
  }
1495
1575
  var styles18 = reactNative.StyleSheet.create({
1496
1576
  wrapper: {
1497
- gap: 8
1577
+ gap: vs(8)
1498
1578
  },
1499
1579
  header: {
1500
1580
  flexDirection: "row",
@@ -1502,16 +1582,16 @@ var styles18 = reactNative.StyleSheet.create({
1502
1582
  alignItems: "center"
1503
1583
  },
1504
1584
  label: {
1505
- fontSize: 15,
1585
+ fontSize: ms(15),
1506
1586
  fontWeight: "500"
1507
1587
  },
1508
1588
  valueText: {
1509
- fontSize: 14,
1589
+ fontSize: ms(14),
1510
1590
  fontWeight: "500"
1511
1591
  },
1512
1592
  slider: {
1513
1593
  width: "100%",
1514
- height: 40
1594
+ height: vs(40)
1515
1595
  },
1516
1596
  disabled: {
1517
1597
  opacity: 0.45
@@ -1527,16 +1607,16 @@ function Sheet({
1527
1607
  style
1528
1608
  }) {
1529
1609
  const { colors } = useTheme();
1530
- const ref = React23.useRef(null);
1531
- React23.useEffect(() => {
1610
+ const ref = React24.useRef(null);
1611
+ React24.useEffect(() => {
1532
1612
  if (open) {
1533
- Haptics12__namespace.impactAsync(Haptics12__namespace.ImpactFeedbackStyle.Light);
1613
+ impactLight();
1534
1614
  ref.current?.present();
1535
1615
  } else {
1536
1616
  ref.current?.dismiss();
1537
1617
  }
1538
1618
  }, [open]);
1539
- const renderBackdrop = (props) => /* @__PURE__ */ React23__default.default.createElement(
1619
+ const renderBackdrop = (props) => /* @__PURE__ */ React24__default.default.createElement(
1540
1620
  bottomSheet.BottomSheetBackdrop,
1541
1621
  {
1542
1622
  ...props,
@@ -1545,7 +1625,7 @@ function Sheet({
1545
1625
  pressBehavior: "close"
1546
1626
  }
1547
1627
  );
1548
- return /* @__PURE__ */ React23__default.default.createElement(
1628
+ return /* @__PURE__ */ React24__default.default.createElement(
1549
1629
  bottomSheet.BottomSheetModal,
1550
1630
  {
1551
1631
  ref,
@@ -1556,39 +1636,39 @@ function Sheet({
1556
1636
  handleIndicatorStyle: [styles19.handle, { backgroundColor: colors.border }],
1557
1637
  enablePanDownToClose: true
1558
1638
  },
1559
- /* @__PURE__ */ React23__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles19.content, style] }, title || description ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles19.header }, title ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles19.title, { color: colors.cardForeground }] }, title) : null, description ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles19.description, { color: colors.mutedForeground }] }, description) : null) : null, children)
1639
+ /* @__PURE__ */ React24__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles19.content, style] }, title || description ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles19.header }, title ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles19.title, { color: colors.cardForeground }] }, title) : null, description ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles19.description, { color: colors.mutedForeground }] }, description) : null) : null, children)
1560
1640
  );
1561
1641
  }
1562
1642
  var styles19 = reactNative.StyleSheet.create({
1563
1643
  background: {
1564
- borderTopLeftRadius: 16,
1565
- borderTopRightRadius: 16
1644
+ borderTopLeftRadius: ms(16),
1645
+ borderTopRightRadius: ms(16)
1566
1646
  },
1567
1647
  handle: {
1568
- width: 36,
1569
- height: 4,
1570
- borderRadius: 2
1648
+ width: s(36),
1649
+ height: vs(4),
1650
+ borderRadius: ms(2)
1571
1651
  },
1572
1652
  content: {
1573
- paddingHorizontal: 24,
1574
- paddingBottom: 32
1653
+ paddingHorizontal: s(24),
1654
+ paddingBottom: vs(32)
1575
1655
  },
1576
1656
  header: {
1577
- gap: 8,
1578
- marginBottom: 16
1657
+ gap: vs(8),
1658
+ marginBottom: vs(16)
1579
1659
  },
1580
1660
  title: {
1581
- fontSize: 18,
1661
+ fontSize: ms(18),
1582
1662
  fontWeight: "600"
1583
1663
  },
1584
1664
  description: {
1585
- fontSize: 14,
1586
- lineHeight: 20
1665
+ fontSize: ms(14),
1666
+ lineHeight: mvs(20)
1587
1667
  }
1588
1668
  });
1589
1669
  var isIOS = reactNative.Platform.OS === "ios";
1590
1670
  var isAndroid = reactNative.Platform.OS === "android";
1591
- var isWeb = reactNative.Platform.OS === "web";
1671
+ var isWeb2 = reactNative.Platform.OS === "web";
1592
1672
  function Select({
1593
1673
  options,
1594
1674
  value,
@@ -1600,21 +1680,21 @@ function Select({
1600
1680
  style
1601
1681
  }) {
1602
1682
  const { colors } = useTheme();
1603
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
1604
- const [pickerVisible, setPickerVisible] = React23.useState(false);
1605
- const [pendingValue, setPendingValue] = React23.useState(value);
1606
- const pickerRef = React23.useRef(null);
1683
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
1684
+ const [pickerVisible, setPickerVisible] = React24.useState(false);
1685
+ const [pendingValue, setPendingValue] = React24.useState(value);
1686
+ const pickerRef = React24.useRef(null);
1607
1687
  const selected = options.find((o) => o.value === value);
1608
1688
  const handlePressIn = () => {
1609
1689
  if (disabled) return;
1610
- reactNative.Animated.spring(scale, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
1690
+ reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: true, speed: 40, bounciness: 0 }).start();
1611
1691
  };
1612
1692
  const handlePressOut = () => {
1613
- reactNative.Animated.spring(scale, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1693
+ reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1614
1694
  };
1615
1695
  const handleOpen = () => {
1616
1696
  if (disabled) return;
1617
- Haptics12__namespace.selectionAsync();
1697
+ selectionAsync();
1618
1698
  if (isIOS) {
1619
1699
  setPendingValue(value);
1620
1700
  setPickerVisible(true);
@@ -1627,12 +1707,12 @@ function Select({
1627
1707
  };
1628
1708
  const handleConfirm = () => {
1629
1709
  if (pendingValue !== void 0 && pendingValue !== "") {
1630
- Haptics12__namespace.selectionAsync();
1710
+ selectionAsync();
1631
1711
  onValueChange?.(pendingValue);
1632
1712
  }
1633
1713
  setPickerVisible(false);
1634
1714
  };
1635
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles20.container, style] }, label ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles20.label, { color: colors.foreground }] }, label) : null, !isWeb ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React23__default.default.createElement(
1715
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles20.container, style] }, label ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles20.label, { color: colors.foreground }] }, label) : null, !isWeb2 ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React24__default.default.createElement(
1636
1716
  reactNative.TouchableOpacity,
1637
1717
  {
1638
1718
  style: [
@@ -1648,7 +1728,7 @@ function Select({
1648
1728
  activeOpacity: 1,
1649
1729
  touchSoundDisabled: true
1650
1730
  },
1651
- /* @__PURE__ */ React23__default.default.createElement(
1731
+ /* @__PURE__ */ React24__default.default.createElement(
1652
1732
  reactNative.Text,
1653
1733
  {
1654
1734
  style: [
@@ -1660,8 +1740,8 @@ function Select({
1660
1740
  },
1661
1741
  selected?.label ?? placeholder
1662
1742
  ),
1663
- /* @__PURE__ */ React23__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-down", size: 20, color: colors.mutedForeground })
1664
- )) : null, isIOS ? /* @__PURE__ */ React23__default.default.createElement(
1743
+ /* @__PURE__ */ React24__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-down", size: 20, color: colors.mutedForeground })
1744
+ )) : null, isIOS ? /* @__PURE__ */ React24__default.default.createElement(
1665
1745
  reactNative.Modal,
1666
1746
  {
1667
1747
  visible: pickerVisible,
@@ -1669,16 +1749,16 @@ function Select({
1669
1749
  animationType: "slide",
1670
1750
  onRequestClose: handleDismiss
1671
1751
  },
1672
- /* @__PURE__ */ React23__default.default.createElement(reactNative.TouchableOpacity, { style: styles20.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
1673
- /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles20.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles20.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles20.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React23__default.default.createElement(reactNative.View, null), /* @__PURE__ */ React23__default.default.createElement(reactNative.TouchableOpacity, { onPress: handleConfirm, style: styles20.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles20.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React23__default.default.createElement(
1752
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.TouchableOpacity, { style: styles20.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
1753
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles20.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles20.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles20.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React24__default.default.createElement(reactNative.View, null), /* @__PURE__ */ React24__default.default.createElement(reactNative.TouchableOpacity, { onPress: handleConfirm, style: styles20.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles20.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React24__default.default.createElement(
1674
1754
  picker.Picker,
1675
1755
  {
1676
1756
  selectedValue: pendingValue ?? "",
1677
1757
  onValueChange: (val) => setPendingValue(val),
1678
1758
  itemStyle: { color: colors.foreground }
1679
1759
  },
1680
- !value ? /* @__PURE__ */ React23__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", color: colors.mutedForeground, enabled: false }) : null,
1681
- options.map((o) => /* @__PURE__ */ React23__default.default.createElement(
1760
+ !value ? /* @__PURE__ */ React24__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", color: colors.mutedForeground, enabled: false }) : null,
1761
+ options.map((o) => /* @__PURE__ */ React24__default.default.createElement(
1682
1762
  picker.Picker.Item,
1683
1763
  {
1684
1764
  key: o.value,
@@ -1689,14 +1769,14 @@ function Select({
1689
1769
  }
1690
1770
  ))
1691
1771
  ))
1692
- ) : null, isAndroid ? /* @__PURE__ */ React23__default.default.createElement(
1772
+ ) : null, isAndroid ? /* @__PURE__ */ React24__default.default.createElement(
1693
1773
  picker.Picker,
1694
1774
  {
1695
1775
  ref: pickerRef,
1696
1776
  selectedValue: value ?? "",
1697
1777
  onValueChange: (val) => {
1698
1778
  if (val !== "") {
1699
- Haptics12__namespace.selectionAsync();
1779
+ selectionAsync();
1700
1780
  onValueChange?.(val);
1701
1781
  }
1702
1782
  },
@@ -1705,8 +1785,8 @@ function Select({
1705
1785
  prompt: label,
1706
1786
  style: styles20.androidHiddenPicker
1707
1787
  },
1708
- !value ? /* @__PURE__ */ React23__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
1709
- options.map((o) => /* @__PURE__ */ React23__default.default.createElement(
1788
+ !value ? /* @__PURE__ */ React24__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
1789
+ options.map((o) => /* @__PURE__ */ React24__default.default.createElement(
1710
1790
  picker.Picker.Item,
1711
1791
  {
1712
1792
  key: o.value,
@@ -1715,7 +1795,7 @@ function Select({
1715
1795
  enabled: !o.disabled
1716
1796
  }
1717
1797
  ))
1718
- ) : null, isWeb ? /* @__PURE__ */ React23__default.default.createElement(
1798
+ ) : null, isWeb2 ? /* @__PURE__ */ React24__default.default.createElement(
1719
1799
  picker.Picker,
1720
1800
  {
1721
1801
  selectedValue: value ?? "",
@@ -1735,8 +1815,8 @@ function Select({
1735
1815
  }
1736
1816
  ]
1737
1817
  },
1738
- /* @__PURE__ */ React23__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }),
1739
- options.map((o) => /* @__PURE__ */ React23__default.default.createElement(
1818
+ /* @__PURE__ */ React24__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }),
1819
+ options.map((o) => /* @__PURE__ */ React24__default.default.createElement(
1740
1820
  picker.Picker.Item,
1741
1821
  {
1742
1822
  key: o.value,
@@ -1745,14 +1825,14 @@ function Select({
1745
1825
  enabled: !o.disabled
1746
1826
  }
1747
1827
  ))
1748
- ) : null, error ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles20.helperText, { color: colors.destructive }] }, error) : null);
1828
+ ) : null, error ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles20.helperText, { color: colors.destructive }] }, error) : null);
1749
1829
  }
1750
1830
  var styles20 = reactNative.StyleSheet.create({
1751
1831
  container: {
1752
- gap: 8
1832
+ gap: vs(8)
1753
1833
  },
1754
1834
  label: {
1755
- fontSize: 15,
1835
+ fontSize: ms(15),
1756
1836
  fontWeight: "500"
1757
1837
  },
1758
1838
  trigger: {
@@ -1760,9 +1840,9 @@ var styles20 = reactNative.StyleSheet.create({
1760
1840
  alignItems: "center",
1761
1841
  justifyContent: "space-between",
1762
1842
  borderWidth: 1.5,
1763
- borderRadius: 8,
1764
- paddingHorizontal: 16,
1765
- paddingVertical: 14,
1843
+ borderRadius: ms(8),
1844
+ paddingHorizontal: s(16),
1845
+ paddingVertical: vs(14),
1766
1846
  shadowColor: "#000",
1767
1847
  shadowOffset: { width: 0, height: 1 },
1768
1848
  shadowOpacity: 0.04,
@@ -1770,41 +1850,41 @@ var styles20 = reactNative.StyleSheet.create({
1770
1850
  elevation: 1
1771
1851
  },
1772
1852
  triggerText: {
1773
- fontSize: 17,
1853
+ fontSize: ms(17),
1774
1854
  flex: 1
1775
1855
  },
1776
1856
  chevron: {
1777
- marginLeft: 8
1857
+ marginLeft: s(8)
1778
1858
  },
1779
1859
  helperText: {
1780
- fontSize: 13
1860
+ fontSize: ms(13)
1781
1861
  },
1782
1862
  iosBackdrop: {
1783
1863
  flex: 1,
1784
1864
  backgroundColor: "rgba(0,0,0,0.4)"
1785
1865
  },
1786
1866
  iosSheet: {
1787
- borderTopLeftRadius: 16,
1788
- borderTopRightRadius: 16,
1789
- paddingBottom: 32
1867
+ borderTopLeftRadius: ms(16),
1868
+ borderTopRightRadius: ms(16),
1869
+ paddingBottom: vs(32)
1790
1870
  },
1791
1871
  iosToolbar: {
1792
1872
  flexDirection: "row",
1793
1873
  alignItems: "center",
1794
1874
  justifyContent: "space-between",
1795
- paddingHorizontal: 16,
1796
- paddingVertical: 12,
1875
+ paddingHorizontal: s(16),
1876
+ paddingVertical: vs(12),
1797
1877
  borderBottomWidth: 1
1798
1878
  },
1799
1879
  iosToolbarTitle: {
1800
- fontSize: 17,
1880
+ fontSize: ms(17),
1801
1881
  fontWeight: "600"
1802
1882
  },
1803
1883
  iosDoneBtn: {
1804
- padding: 4
1884
+ padding: s(4)
1805
1885
  },
1806
1886
  iosDoneBtnText: {
1807
- fontSize: 17,
1887
+ fontSize: ms(17),
1808
1888
  fontWeight: "600"
1809
1889
  },
1810
1890
  androidHiddenPicker: {
@@ -1814,34 +1894,34 @@ var styles20 = reactNative.StyleSheet.create({
1814
1894
  },
1815
1895
  webPicker: {
1816
1896
  borderWidth: 1.5,
1817
- borderRadius: 8,
1818
- paddingHorizontal: 16,
1819
- paddingVertical: 14,
1820
- fontSize: 17
1897
+ borderRadius: ms(8),
1898
+ paddingHorizontal: s(16),
1899
+ paddingVertical: vs(14),
1900
+ fontSize: ms(17)
1821
1901
  }
1822
1902
  });
1823
- var ToastContext = React23.createContext({
1903
+ var ToastContext = React24.createContext({
1824
1904
  toast: () => {
1825
1905
  },
1826
1906
  dismiss: () => {
1827
1907
  }
1828
1908
  });
1829
1909
  function useToast() {
1830
- return React23.useContext(ToastContext);
1910
+ return React24.useContext(ToastContext);
1831
1911
  }
1832
1912
  var SWIPE_THRESHOLD = 80;
1833
1913
  var VELOCITY_THRESHOLD = 800;
1834
1914
  function ToastNotification({ item, onDismiss }) {
1835
1915
  const { colors } = useTheme();
1836
- const translateY = ReanimatedAnimated.useSharedValue(-80);
1837
- const translateX = ReanimatedAnimated.useSharedValue(0);
1838
- const opacity = ReanimatedAnimated.useSharedValue(0);
1839
- React23.useEffect(() => {
1840
- translateY.value = ReanimatedAnimated.withTiming(0, { duration: 120, easing: ReanimatedAnimated.Easing.out(ReanimatedAnimated.Easing.exp) });
1841
- opacity.value = ReanimatedAnimated.withTiming(1, { duration: 100 });
1916
+ const translateY = Animated10.useSharedValue(-80);
1917
+ const translateX = Animated10.useSharedValue(0);
1918
+ const opacity = Animated10.useSharedValue(0);
1919
+ React24.useEffect(() => {
1920
+ translateY.value = Animated10.withTiming(0, { duration: 120, easing: Animated10.Easing.out(Animated10.Easing.exp) });
1921
+ opacity.value = Animated10.withTiming(1, { duration: 100 });
1842
1922
  const timer = setTimeout(() => {
1843
- translateY.value = ReanimatedAnimated.withTiming(-80, { duration: 200 });
1844
- opacity.value = ReanimatedAnimated.withTiming(0, { duration: 200 }, (done) => {
1923
+ translateY.value = Animated10.withTiming(-80, { duration: 200 });
1924
+ opacity.value = Animated10.withTiming(0, { duration: 200 }, (done) => {
1845
1925
  if (done) reactNativeWorklets.scheduleOnRN(onDismiss);
1846
1926
  });
1847
1927
  }, item.duration ?? 3e3);
@@ -1853,15 +1933,15 @@ function ToastNotification({ item, onDismiss }) {
1853
1933
  const shouldDismiss = Math.abs(translateX.value) > SWIPE_THRESHOLD || Math.abs(e.velocityX) > VELOCITY_THRESHOLD;
1854
1934
  if (shouldDismiss) {
1855
1935
  const direction = translateX.value > 0 ? 1 : -1;
1856
- translateX.value = ReanimatedAnimated.withTiming(direction * 500, { duration: 200 }, (done) => {
1936
+ translateX.value = Animated10.withTiming(direction * 500, { duration: 200 }, (done) => {
1857
1937
  if (done) reactNativeWorklets.scheduleOnRN(onDismiss);
1858
1938
  });
1859
- opacity.value = ReanimatedAnimated.withTiming(0, { duration: 150 });
1939
+ opacity.value = Animated10.withTiming(0, { duration: 150 });
1860
1940
  } else {
1861
- translateX.value = ReanimatedAnimated.withSpring(0, { damping: 20, stiffness: 300 });
1941
+ translateX.value = Animated10.withSpring(0, { damping: 20, stiffness: 300 });
1862
1942
  }
1863
1943
  });
1864
- const animatedStyle = ReanimatedAnimated.useAnimatedStyle(() => ({
1944
+ const animatedStyle = Animated10.useAnimatedStyle(() => ({
1865
1945
  opacity: opacity.value,
1866
1946
  transform: [{ translateY: translateY.value }, { translateX: translateX.value }]
1867
1947
  }));
@@ -1875,49 +1955,49 @@ function ToastNotification({ item, onDismiss }) {
1875
1955
  destructive: colors.destructiveForeground,
1876
1956
  success: colors.successForeground
1877
1957
  }[item.variant ?? "default"];
1878
- const defaultIcon = item.variant === "success" ? /* @__PURE__ */ React23__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 22, color: textColor }) : item.variant === "destructive" ? /* @__PURE__ */ React23__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: 24, color: textColor }) : /* @__PURE__ */ React23__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 22, color: textColor });
1879
- const leftIcon = item.icon ?? defaultIcon;
1880
- return /* @__PURE__ */ React23__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React23__default.default.createElement(ReanimatedAnimated__default.default.View, { style: [styles21.toast, { backgroundColor: bgColor }, animatedStyle] }, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles21.leftIconContainer }, leftIcon), /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles21.toastContent }, item.title ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles21.toastTitle, { color: textColor }] }, item.title) : null, item.description ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles21.toastDescription, { color: textColor, opacity: 0.85 }] }, item.description) : null), /* @__PURE__ */ React23__default.default.createElement(reactNative.TouchableOpacity, { onPress: onDismiss, style: styles21.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React23__default.default.createElement(vectorIcons.AntDesign, { name: "close-circle", size: 18, color: textColor }))));
1958
+ const defaultIcon = item.variant === "success" ? /* @__PURE__ */ React24__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 22, color: textColor }) : item.variant === "destructive" ? /* @__PURE__ */ React24__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: 24, color: textColor }) : /* @__PURE__ */ React24__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 22, color: textColor });
1959
+ const leftIcon = item.iconName ? renderIcon(item.iconName, 22, item.iconColor ?? textColor) : item.icon ?? defaultIcon;
1960
+ return /* @__PURE__ */ React24__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React24__default.default.createElement(Animated10__default.default.View, { style: [styles21.toast, { backgroundColor: bgColor }, animatedStyle] }, /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles21.leftIconContainer }, leftIcon), /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles21.toastContent }, item.title ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles21.toastTitle, { color: textColor }] }, item.title) : null, item.description ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles21.toastDescription, { color: textColor, opacity: 0.85 }] }, item.description) : null), /* @__PURE__ */ React24__default.default.createElement(reactNative.TouchableOpacity, { onPress: onDismiss, style: styles21.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React24__default.default.createElement(vectorIcons.AntDesign, { name: "close-circle", size: 18, color: textColor }))));
1881
1961
  }
1882
1962
  function ToastProvider({ children }) {
1883
- const [toasts, setToasts] = React23.useState([]);
1963
+ const [toasts, setToasts] = React24.useState([]);
1884
1964
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
1885
- const toast = React23.useCallback((item) => {
1965
+ const toast = React24.useCallback((item) => {
1886
1966
  const id = Math.random().toString(36).slice(2);
1887
1967
  if (item.variant === "success") {
1888
- Haptics12__namespace.notificationAsync(Haptics12__namespace.NotificationFeedbackType.Success);
1968
+ notificationSuccess();
1889
1969
  } else if (item.variant === "destructive") {
1890
- Haptics12__namespace.notificationAsync(Haptics12__namespace.NotificationFeedbackType.Error);
1970
+ notificationError();
1891
1971
  } else {
1892
- Haptics12__namespace.impactAsync(Haptics12__namespace.ImpactFeedbackStyle.Light);
1972
+ impactLight();
1893
1973
  }
1894
1974
  setToasts((prev) => [{ ...item, id }, ...prev].slice(0, 3));
1895
1975
  }, []);
1896
- const dismiss = React23.useCallback((id) => {
1976
+ const dismiss = React24.useCallback((id) => {
1897
1977
  setToasts((prev) => prev.filter((t) => t.id !== id));
1898
1978
  }, []);
1899
- return /* @__PURE__ */ React23__default.default.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles21.container, reactNative.Platform.OS === "web" && styles21.containerWeb, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React23__default.default.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
1979
+ return /* @__PURE__ */ React24__default.default.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles21.container, reactNative.Platform.OS === "web" && styles21.containerWeb, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React24__default.default.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
1900
1980
  }
1901
1981
  var styles21 = reactNative.StyleSheet.create({
1902
1982
  container: {
1903
1983
  position: "absolute",
1904
- left: 16,
1905
- right: 16,
1906
- gap: 8,
1984
+ left: s(16),
1985
+ right: s(16),
1986
+ gap: vs(8),
1907
1987
  zIndex: 9999
1908
1988
  },
1909
1989
  containerWeb: {
1910
1990
  left: void 0,
1911
1991
  right: void 0,
1912
1992
  alignSelf: "center",
1913
- width: 400
1993
+ width: s(400)
1914
1994
  },
1915
1995
  toast: {
1916
1996
  flexDirection: "row",
1917
1997
  alignItems: "center",
1918
- borderRadius: 16,
1919
- paddingHorizontal: 20,
1920
- paddingVertical: 14,
1998
+ borderRadius: ms(16),
1999
+ paddingHorizontal: s(20),
2000
+ paddingVertical: vs(14),
1921
2001
  shadowColor: "#000",
1922
2002
  shadowOffset: { width: 0, height: 4 },
1923
2003
  shadowOpacity: 0.15,
@@ -1926,24 +2006,24 @@ var styles21 = reactNative.StyleSheet.create({
1926
2006
  },
1927
2007
  toastContent: {
1928
2008
  flex: 1,
1929
- gap: 4
2009
+ gap: vs(4)
1930
2010
  },
1931
2011
  leftIconContainer: {
1932
- width: 40,
2012
+ width: s(40),
1933
2013
  alignItems: "center",
1934
2014
  justifyContent: "center",
1935
- marginRight: 8
2015
+ marginRight: s(8)
1936
2016
  },
1937
2017
  toastTitle: {
1938
- fontSize: 15,
2018
+ fontSize: ms(15),
1939
2019
  fontWeight: "600"
1940
2020
  },
1941
2021
  toastDescription: {
1942
- fontSize: 14
2022
+ fontSize: ms(14)
1943
2023
  },
1944
2024
  dismissButton: {
1945
- padding: 8,
1946
- marginLeft: 4
2025
+ padding: s(8),
2026
+ marginLeft: s(4)
1947
2027
  }
1948
2028
  });
1949
2029
  function formatCurrency(raw, separator) {
@@ -1975,8 +2055,8 @@ function CurrencyInput({
1975
2055
  const raw = parseFloat(formatted.replace(separatorRegex, "") || "0");
1976
2056
  onChangeValue?.(isNaN(raw) ? 0 : raw);
1977
2057
  };
1978
- const inputStyle = size === "large" ? { fontSize: 36 } : {};
1979
- return /* @__PURE__ */ React23__default.default.createElement(
2058
+ const inputStyle = size === "large" ? { fontSize: ms(36) } : {};
2059
+ return /* @__PURE__ */ React24__default.default.createElement(
1980
2060
  Input,
1981
2061
  {
1982
2062
  value,
@@ -2007,21 +2087,25 @@ function formatValue(value, prefix, showDecimals) {
2007
2087
  function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, style }) {
2008
2088
  const { colors } = useTheme();
2009
2089
  const formatted = formatValue(value, prefix, showDecimals);
2010
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles22.container, style] }, /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles22.amount, { color: textColor ?? colors.foreground }], allowFontScaling: true }, formatted));
2090
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles22.container, style] }, /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles22.amount, { color: textColor ?? colors.foreground }], allowFontScaling: true }, formatted));
2011
2091
  }
2012
2092
  var styles22 = reactNative.StyleSheet.create({
2013
2093
  container: {},
2014
2094
  amount: {
2015
- fontSize: 56,
2095
+ fontSize: ms(56),
2016
2096
  fontWeight: "700"
2017
2097
  }
2018
2098
  });
2019
- var nativeDriver4 = reactNative.Platform.OS !== "web";
2099
+ var nativeDriver7 = reactNative.Platform.OS !== "web";
2020
2100
  function ListItem({
2021
2101
  leftRender,
2022
2102
  rightRender,
2023
2103
  trailing,
2024
2104
  icon,
2105
+ leftIcon,
2106
+ rightIcon,
2107
+ leftIconColor,
2108
+ rightIconColor,
2025
2109
  title,
2026
2110
  subtitle,
2027
2111
  caption,
@@ -2036,30 +2120,30 @@ function ListItem({
2036
2120
  captionStyle
2037
2121
  }) {
2038
2122
  const { colors } = useTheme();
2039
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
2123
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
2040
2124
  const handlePressIn = () => {
2041
2125
  if (!onPress || disabled) return;
2042
- reactNative.Animated.spring(scale, {
2126
+ reactNative.Animated.spring(scale2, {
2043
2127
  toValue: 0.97,
2044
- useNativeDriver: nativeDriver4,
2128
+ useNativeDriver: nativeDriver7,
2045
2129
  speed: 40,
2046
2130
  bounciness: 0
2047
2131
  }).start();
2048
2132
  };
2049
2133
  const handlePressOut = () => {
2050
- reactNative.Animated.spring(scale, {
2134
+ reactNative.Animated.spring(scale2, {
2051
2135
  toValue: 1,
2052
- useNativeDriver: nativeDriver4,
2136
+ useNativeDriver: nativeDriver7,
2053
2137
  speed: 40,
2054
2138
  bounciness: 4
2055
2139
  }).start();
2056
2140
  };
2057
2141
  const handlePress = () => {
2058
- Haptics12__namespace.selectionAsync();
2142
+ selectionAsync();
2059
2143
  onPress?.();
2060
2144
  };
2061
- const effectiveLeft = leftRender ?? icon;
2062
- const effectiveRight = rightRender ?? trailing;
2145
+ const effectiveLeft = leftIcon ? renderIcon(leftIcon, 24, leftIconColor ?? colors.foreground) : leftRender ?? icon;
2146
+ const effectiveRight = rightIcon ? renderIcon(rightIcon, 24, rightIconColor ?? colors.mutedForeground) : rightRender ?? trailing;
2063
2147
  const cardStyle = variant === "card" ? {
2064
2148
  backgroundColor: colors.card,
2065
2149
  borderRadius: 12,
@@ -2071,7 +2155,7 @@ function ListItem({
2071
2155
  shadowRadius: 6,
2072
2156
  elevation: 2
2073
2157
  } : {};
2074
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale }] }, disabled && styles23.disabled] }, /* @__PURE__ */ React23__default.default.createElement(
2158
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles23.disabled] }, /* @__PURE__ */ React24__default.default.createElement(
2075
2159
  reactNative.TouchableOpacity,
2076
2160
  {
2077
2161
  style: [styles23.container, cardStyle, style],
@@ -2082,8 +2166,8 @@ function ListItem({
2082
2166
  activeOpacity: 1,
2083
2167
  touchSoundDisabled: true
2084
2168
  },
2085
- effectiveLeft ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles23.leftContainer }, effectiveLeft) : null,
2086
- /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles23.content }, /* @__PURE__ */ React23__default.default.createElement(
2169
+ effectiveLeft ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles23.leftContainer }, effectiveLeft) : null,
2170
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles23.content }, /* @__PURE__ */ React24__default.default.createElement(
2087
2171
  reactNative.Text,
2088
2172
  {
2089
2173
  style: [styles23.title, { color: colors.foreground }, titleStyle],
@@ -2091,7 +2175,7 @@ function ListItem({
2091
2175
  allowFontScaling: true
2092
2176
  },
2093
2177
  title
2094
- ), subtitle ? /* @__PURE__ */ React23__default.default.createElement(
2178
+ ), subtitle ? /* @__PURE__ */ React24__default.default.createElement(
2095
2179
  reactNative.Text,
2096
2180
  {
2097
2181
  style: [styles23.subtitle, { color: colors.mutedForeground }, subtitleStyle],
@@ -2099,7 +2183,7 @@ function ListItem({
2099
2183
  allowFontScaling: true
2100
2184
  },
2101
2185
  subtitle
2102
- ) : null, caption ? /* @__PURE__ */ React23__default.default.createElement(
2186
+ ) : null, caption ? /* @__PURE__ */ React24__default.default.createElement(
2103
2187
  reactNative.Text,
2104
2188
  {
2105
2189
  style: [styles23.caption, { color: colors.mutedForeground }, captionStyle],
@@ -2108,20 +2192,20 @@ function ListItem({
2108
2192
  },
2109
2193
  caption
2110
2194
  ) : null),
2111
- effectiveRight !== void 0 ? /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles23.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React23__default.default.createElement(
2195
+ effectiveRight !== void 0 ? /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles23.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React24__default.default.createElement(
2112
2196
  reactNative.Text,
2113
2197
  {
2114
2198
  style: [styles23.rightText, { color: colors.mutedForeground }],
2115
2199
  allowFontScaling: true
2116
2200
  },
2117
2201
  effectiveRight
2118
- ) : effectiveRight) : showChevron ? /* @__PURE__ */ React23__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.mutedForeground }) : null
2119
- ), showSeparator ? /* @__PURE__ */ React23__default.default.createElement(
2202
+ ) : effectiveRight) : showChevron ? /* @__PURE__ */ React24__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.mutedForeground }) : null
2203
+ ), showSeparator ? /* @__PURE__ */ React24__default.default.createElement(
2120
2204
  reactNative.View,
2121
2205
  {
2122
2206
  style: [
2123
2207
  styles23.separator,
2124
- { backgroundColor: colors.border, marginLeft: effectiveLeft ? 16 + 44 + 12 : 16 }
2208
+ { backgroundColor: colors.border, marginLeft: effectiveLeft ? s(16) + s(44) + s(12) : s(16) }
2125
2209
  ]
2126
2210
  }
2127
2211
  ) : null);
@@ -2130,63 +2214,63 @@ var styles23 = reactNative.StyleSheet.create({
2130
2214
  container: {
2131
2215
  flexDirection: "row",
2132
2216
  alignItems: "center",
2133
- paddingHorizontal: 16,
2134
- paddingVertical: 14,
2135
- gap: 12
2217
+ paddingHorizontal: s(16),
2218
+ paddingVertical: vs(14),
2219
+ gap: s(12)
2136
2220
  },
2137
2221
  leftContainer: {
2138
- width: 44,
2139
- height: 44,
2222
+ width: s(44),
2223
+ height: s(44),
2140
2224
  alignItems: "center",
2141
2225
  justifyContent: "center",
2142
2226
  flexShrink: 0
2143
2227
  },
2144
2228
  content: {
2145
2229
  flex: 1,
2146
- gap: 4
2230
+ gap: vs(4)
2147
2231
  },
2148
2232
  title: {
2149
- fontSize: 17,
2233
+ fontSize: ms(17),
2150
2234
  fontWeight: "500",
2151
- lineHeight: 24
2235
+ lineHeight: mvs(24)
2152
2236
  },
2153
2237
  subtitle: {
2154
- fontSize: 14,
2238
+ fontSize: ms(14),
2155
2239
  fontWeight: "400",
2156
- lineHeight: 20
2240
+ lineHeight: mvs(20)
2157
2241
  },
2158
2242
  caption: {
2159
- fontSize: 12,
2243
+ fontSize: ms(12),
2160
2244
  fontWeight: "400",
2161
- lineHeight: 16,
2245
+ lineHeight: mvs(16),
2162
2246
  opacity: 0.7
2163
2247
  },
2164
2248
  rightContainer: {
2165
2249
  alignItems: "flex-end",
2166
2250
  justifyContent: "center",
2167
2251
  flexShrink: 0,
2168
- maxWidth: 160
2252
+ maxWidth: s(160)
2169
2253
  },
2170
2254
  rightText: {
2171
- fontSize: 15
2255
+ fontSize: ms(15)
2172
2256
  },
2173
2257
  chevron: {
2174
- marginLeft: 4
2258
+ marginLeft: s(4)
2175
2259
  },
2176
2260
  separator: {
2177
2261
  height: reactNative.StyleSheet.hairlineWidth,
2178
- marginRight: 16
2262
+ marginRight: s(16)
2179
2263
  },
2180
2264
  disabled: {
2181
2265
  opacity: 0.45
2182
2266
  }
2183
2267
  });
2184
- var nativeDriver5 = reactNative.Platform.OS !== "web";
2268
+ var nativeDriver8 = reactNative.Platform.OS !== "web";
2185
2269
  function Chip({ label, selected = false, onPress, style }) {
2186
2270
  const { colors } = useTheme();
2187
- const scale = React23.useRef(new reactNative.Animated.Value(1)).current;
2188
- const pressAnim = React23.useRef(new reactNative.Animated.Value(selected ? 1 : 0)).current;
2189
- React23.useEffect(() => {
2271
+ const scale2 = React24.useRef(new reactNative.Animated.Value(1)).current;
2272
+ const pressAnim = React24.useRef(new reactNative.Animated.Value(selected ? 1 : 0)).current;
2273
+ React24.useEffect(() => {
2190
2274
  reactNative.Animated.timing(pressAnim, {
2191
2275
  toValue: selected ? 1 : 0,
2192
2276
  duration: 150,
@@ -2195,23 +2279,23 @@ function Chip({ label, selected = false, onPress, style }) {
2195
2279
  }).start();
2196
2280
  }, [selected, pressAnim]);
2197
2281
  const handlePressIn = () => {
2198
- reactNative.Animated.spring(scale, {
2282
+ reactNative.Animated.spring(scale2, {
2199
2283
  toValue: 0.95,
2200
- useNativeDriver: nativeDriver5,
2284
+ useNativeDriver: nativeDriver8,
2201
2285
  speed: 40,
2202
2286
  bounciness: 0
2203
2287
  }).start();
2204
2288
  };
2205
2289
  const handlePressOut = () => {
2206
- reactNative.Animated.spring(scale, {
2290
+ reactNative.Animated.spring(scale2, {
2207
2291
  toValue: 1,
2208
- useNativeDriver: nativeDriver5,
2292
+ useNativeDriver: nativeDriver8,
2209
2293
  speed: 40,
2210
2294
  bounciness: 4
2211
2295
  }).start();
2212
2296
  };
2213
2297
  const handlePress = () => {
2214
- Haptics12__namespace.selectionAsync();
2298
+ selectionAsync();
2215
2299
  onPress?.();
2216
2300
  };
2217
2301
  const backgroundColor = pressAnim.interpolate({
@@ -2226,7 +2310,7 @@ function Chip({ label, selected = false, onPress, style }) {
2226
2310
  inputRange: [0, 1],
2227
2311
  outputRange: [colors.border, colors.primary]
2228
2312
  });
2229
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: [styles24.wrapper, { transform: [{ scale }] }, style] }, /* @__PURE__ */ React23__default.default.createElement(
2313
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: [styles24.wrapper, { transform: [{ scale: scale2 }] }, style] }, /* @__PURE__ */ React24__default.default.createElement(
2230
2314
  reactNative.TouchableOpacity,
2231
2315
  {
2232
2316
  onPress: handlePress,
@@ -2235,7 +2319,7 @@ function Chip({ label, selected = false, onPress, style }) {
2235
2319
  activeOpacity: 1,
2236
2320
  touchSoundDisabled: true
2237
2321
  },
2238
- /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.View, { style: [styles24.chip, { backgroundColor, borderColor }] }, /* @__PURE__ */ React23__default.default.createElement(reactNative.Animated.Text, { style: [styles24.label, { color: textColor }], allowFontScaling: true }, label))
2322
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.View, { style: [styles24.chip, { backgroundColor, borderColor }] }, /* @__PURE__ */ React24__default.default.createElement(reactNative.Animated.Text, { style: [styles24.label, { color: textColor }], allowFontScaling: true }, label))
2239
2323
  ));
2240
2324
  }
2241
2325
  function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
@@ -2260,7 +2344,7 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
2260
2344
  }
2261
2345
  return optionValue === value;
2262
2346
  };
2263
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles24.group, style] }, options.map((opt) => /* @__PURE__ */ React23__default.default.createElement(
2347
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles24.group, style] }, options.map((opt) => /* @__PURE__ */ React24__default.default.createElement(
2264
2348
  Chip,
2265
2349
  {
2266
2350
  key: opt.value,
@@ -2274,21 +2358,21 @@ var styles24 = reactNative.StyleSheet.create({
2274
2358
  wrapper: {},
2275
2359
  chip: {
2276
2360
  borderRadius: 999,
2277
- paddingHorizontal: 14,
2278
- paddingVertical: 8,
2361
+ paddingHorizontal: s(14),
2362
+ paddingVertical: vs(8),
2279
2363
  borderWidth: 1.5,
2280
2364
  alignItems: "center",
2281
2365
  justifyContent: "center"
2282
2366
  },
2283
2367
  label: {
2284
- fontSize: 14,
2368
+ fontSize: ms(14),
2285
2369
  fontWeight: "500",
2286
- lineHeight: 20
2370
+ lineHeight: mvs(20)
2287
2371
  },
2288
2372
  group: {
2289
2373
  flexDirection: "row",
2290
2374
  flexWrap: "wrap",
2291
- gap: 8
2375
+ gap: s(8)
2292
2376
  }
2293
2377
  });
2294
2378
  function ConfirmDialog({
@@ -2302,15 +2386,15 @@ function ConfirmDialog({
2302
2386
  onCancel
2303
2387
  }) {
2304
2388
  const { colors } = useTheme();
2305
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.Modal, { visible, transparent: true, animationType: "fade", onRequestClose: onCancel }, /* @__PURE__ */ React23__default.default.createElement(reactNative.TouchableOpacity, { style: styles25.overlay, activeOpacity: 1, onPress: onCancel }, /* @__PURE__ */ React23__default.default.createElement(
2389
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.Modal, { visible, transparent: true, animationType: "fade", onRequestClose: onCancel }, /* @__PURE__ */ React24__default.default.createElement(reactNative.TouchableOpacity, { style: styles25.overlay, activeOpacity: 1, onPress: onCancel }, /* @__PURE__ */ React24__default.default.createElement(
2306
2390
  reactNative.View,
2307
2391
  {
2308
2392
  style: [styles25.dialog, { backgroundColor: colors.card }],
2309
2393
  onStartShouldSetResponder: () => true
2310
2394
  },
2311
- /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles25.title, { color: colors.cardForeground }], allowFontScaling: true }, title),
2312
- description ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles25.description, { color: colors.mutedForeground }], allowFontScaling: true }, description) : null,
2313
- /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: styles25.actions }, /* @__PURE__ */ React23__default.default.createElement(Button, { label: cancelLabel, variant: "outline", fullWidth: true, onPress: onCancel }), /* @__PURE__ */ React23__default.default.createElement(Button, { label: confirmLabel, variant: confirmVariant, fullWidth: true, onPress: onConfirm }))
2395
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles25.title, { color: colors.cardForeground }], allowFontScaling: true }, title),
2396
+ description ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles25.description, { color: colors.mutedForeground }], allowFontScaling: true }, description) : null,
2397
+ /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: styles25.actions }, /* @__PURE__ */ React24__default.default.createElement(Button, { label: cancelLabel, variant: "outline", fullWidth: true, onPress: onCancel }), /* @__PURE__ */ React24__default.default.createElement(Button, { label: confirmLabel, variant: confirmVariant, fullWidth: true, onPress: onConfirm }))
2314
2398
  )));
2315
2399
  }
2316
2400
  var styles25 = reactNative.StyleSheet.create({
@@ -2319,14 +2403,14 @@ var styles25 = reactNative.StyleSheet.create({
2319
2403
  backgroundColor: "rgba(0,0,0,0.5)",
2320
2404
  justifyContent: "center",
2321
2405
  alignItems: "center",
2322
- padding: 24
2406
+ padding: s(24)
2323
2407
  },
2324
2408
  dialog: {
2325
2409
  width: "100%",
2326
- maxWidth: 400,
2327
- borderRadius: 16,
2328
- padding: 24,
2329
- gap: 12,
2410
+ maxWidth: s(400),
2411
+ borderRadius: ms(16),
2412
+ padding: s(24),
2413
+ gap: vs(12),
2330
2414
  shadowColor: "#000",
2331
2415
  shadowOffset: { width: 0, height: 8 },
2332
2416
  shadowOpacity: 0.15,
@@ -2334,38 +2418,38 @@ var styles25 = reactNative.StyleSheet.create({
2334
2418
  elevation: 8
2335
2419
  },
2336
2420
  title: {
2337
- fontSize: 18,
2421
+ fontSize: ms(18),
2338
2422
  fontWeight: "600",
2339
- lineHeight: 26
2423
+ lineHeight: mvs(26)
2340
2424
  },
2341
2425
  description: {
2342
- fontSize: 15,
2343
- lineHeight: 22
2426
+ fontSize: ms(15),
2427
+ lineHeight: mvs(22)
2344
2428
  },
2345
2429
  actions: {
2346
- gap: 10,
2347
- marginTop: 8
2430
+ gap: vs(10),
2431
+ marginTop: vs(8)
2348
2432
  }
2349
2433
  });
2350
2434
  function LabelValue({ label, value, style }) {
2351
2435
  const { colors } = useTheme();
2352
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles26.container, style] }, /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles26.label, { color: colors.mutedForeground }], allowFontScaling: true }, label), typeof value === "string" ? /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles26.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
2436
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles26.container, style] }, /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles26.label, { color: colors.mutedForeground }], allowFontScaling: true }, label), typeof value === "string" ? /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles26.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
2353
2437
  }
2354
2438
  var styles26 = reactNative.StyleSheet.create({
2355
2439
  container: {
2356
2440
  flexDirection: "row",
2357
2441
  justifyContent: "space-between",
2358
2442
  alignItems: "center",
2359
- gap: 12
2443
+ gap: s(12)
2360
2444
  },
2361
2445
  label: {
2362
- fontSize: 13,
2363
- lineHeight: 18
2446
+ fontSize: ms(13),
2447
+ lineHeight: mvs(18)
2364
2448
  },
2365
2449
  value: {
2366
- fontSize: 15,
2450
+ fontSize: ms(15),
2367
2451
  fontWeight: "500",
2368
- lineHeight: 22,
2452
+ lineHeight: mvs(22),
2369
2453
  textAlign: "right"
2370
2454
  }
2371
2455
  });
@@ -2386,7 +2470,7 @@ var MONTH_NAMES = [
2386
2470
  function MonthPicker({ value, onChange, style }) {
2387
2471
  const { colors } = useTheme();
2388
2472
  const handlePrev = () => {
2389
- Haptics12__namespace.selectionAsync();
2473
+ selectionAsync();
2390
2474
  if (value.month === 1) {
2391
2475
  onChange({ month: 12, year: value.year - 1 });
2392
2476
  } else {
@@ -2394,14 +2478,14 @@ function MonthPicker({ value, onChange, style }) {
2394
2478
  }
2395
2479
  };
2396
2480
  const handleNext = () => {
2397
- Haptics12__namespace.selectionAsync();
2481
+ selectionAsync();
2398
2482
  if (value.month === 12) {
2399
2483
  onChange({ month: 1, year: value.year + 1 });
2400
2484
  } else {
2401
2485
  onChange({ month: value.month + 1, year: value.year });
2402
2486
  }
2403
2487
  };
2404
- return /* @__PURE__ */ React23__default.default.createElement(reactNative.View, { style: [styles27.container, style] }, /* @__PURE__ */ React23__default.default.createElement(
2488
+ return /* @__PURE__ */ React24__default.default.createElement(reactNative.View, { style: [styles27.container, style] }, /* @__PURE__ */ React24__default.default.createElement(
2405
2489
  reactNative.TouchableOpacity,
2406
2490
  {
2407
2491
  style: styles27.arrow,
@@ -2409,8 +2493,8 @@ function MonthPicker({ value, onChange, style }) {
2409
2493
  activeOpacity: 0.6,
2410
2494
  touchSoundDisabled: true
2411
2495
  },
2412
- /* @__PURE__ */ React23__default.default.createElement(vectorIcons.Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
2413
- ), /* @__PURE__ */ React23__default.default.createElement(reactNative.Text, { style: [styles27.label, { color: colors.foreground }], allowFontScaling: true }, MONTH_NAMES[value.month - 1], " ", value.year), /* @__PURE__ */ React23__default.default.createElement(
2496
+ /* @__PURE__ */ React24__default.default.createElement(vectorIcons.Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
2497
+ ), /* @__PURE__ */ React24__default.default.createElement(reactNative.Text, { style: [styles27.label, { color: colors.foreground }], allowFontScaling: true }, MONTH_NAMES[value.month - 1], " ", value.year), /* @__PURE__ */ React24__default.default.createElement(
2414
2498
  reactNative.TouchableOpacity,
2415
2499
  {
2416
2500
  style: styles27.arrow,
@@ -2418,7 +2502,7 @@ function MonthPicker({ value, onChange, style }) {
2418
2502
  activeOpacity: 0.6,
2419
2503
  touchSoundDisabled: true
2420
2504
  },
2421
- /* @__PURE__ */ React23__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
2505
+ /* @__PURE__ */ React24__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
2422
2506
  ));
2423
2507
  }
2424
2508
  var styles27 = reactNative.StyleSheet.create({
@@ -2428,17 +2512,17 @@ var styles27 = reactNative.StyleSheet.create({
2428
2512
  justifyContent: "space-between"
2429
2513
  },
2430
2514
  arrow: {
2431
- width: 44,
2432
- height: 44,
2515
+ width: s(44),
2516
+ height: s(44),
2433
2517
  alignItems: "center",
2434
2518
  justifyContent: "center"
2435
2519
  },
2436
2520
  label: {
2437
- fontSize: 17,
2521
+ fontSize: ms(17),
2438
2522
  fontWeight: "500",
2439
- lineHeight: 24,
2523
+ lineHeight: mvs(24),
2440
2524
  textAlign: "center",
2441
- minWidth: 160
2525
+ minWidth: s(160)
2442
2526
  }
2443
2527
  });
2444
2528
 
@@ -2465,6 +2549,7 @@ exports.CurrencyDisplay = CurrencyDisplay;
2465
2549
  exports.CurrencyInput = CurrencyInput;
2466
2550
  exports.CurrencyInputLarge = CurrencyInput;
2467
2551
  exports.EmptyState = EmptyState;
2552
+ exports.Icon = Icon;
2468
2553
  exports.Input = Input;
2469
2554
  exports.LabelValue = LabelValue;
2470
2555
  exports.ListItem = ListItem;
@@ -2487,5 +2572,6 @@ exports.ToastProvider = ToastProvider;
2487
2572
  exports.Toggle = Toggle;
2488
2573
  exports.defaultDark = defaultDark;
2489
2574
  exports.defaultLight = defaultLight;
2575
+ exports.renderIcon = renderIcon;
2490
2576
  exports.useTheme = useTheme;
2491
2577
  exports.useToast = useToast;