@retray-dev/ui-kit 1.8.0 → 2.5.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 (34) hide show
  1. package/COMPONENTS.md +150 -43
  2. package/dist/index.d.mts +80 -44
  3. package/dist/index.d.ts +80 -44
  4. package/dist/index.js +627 -457
  5. package/dist/index.mjs +626 -457
  6. package/package.json +8 -2
  7. package/src/components/Accordion/Accordion.tsx +4 -6
  8. package/src/components/Alert/Alert.tsx +3 -3
  9. package/src/components/AlertBanner/AlertBanner.tsx +85 -0
  10. package/src/components/{Alert → AlertBanner}/index.ts +2 -2
  11. package/src/components/Avatar/Avatar.tsx +1 -0
  12. package/src/components/Badge/Badge.tsx +45 -9
  13. package/src/components/Button/Button.tsx +5 -5
  14. package/src/components/Card/Card.tsx +90 -18
  15. package/src/components/Checkbox/Checkbox.tsx +4 -4
  16. package/src/components/Chip/Chip.tsx +36 -5
  17. package/src/components/CurrencyInput/CurrencyInput.tsx +9 -1
  18. package/src/components/EmptyState/EmptyState.tsx +2 -1
  19. package/src/components/Input/Input.tsx +107 -26
  20. package/src/components/ListItem/ListItem.tsx +157 -21
  21. package/src/components/MonthPicker/MonthPicker.tsx +3 -6
  22. package/src/components/RadioGroup/RadioGroup.tsx +2 -2
  23. package/src/components/Select/Select.tsx +200 -132
  24. package/src/components/Slider/Slider.tsx +64 -100
  25. package/src/components/Switch/Switch.tsx +22 -20
  26. package/src/components/Textarea/Textarea.tsx +16 -7
  27. package/src/components/Toast/Toast.tsx +23 -18
  28. package/src/components/Toggle/Toggle.tsx +36 -49
  29. package/src/index.ts +3 -2
  30. package/src/theme/ThemeProvider.tsx +11 -8
  31. package/src/theme/colors.ts +19 -18
  32. package/src/theme/types.ts +2 -0
  33. package/src/components/CurrencyInputLarge/CurrencyInputLarge.tsx +0 -66
  34. package/src/components/CurrencyInputLarge/index.ts +0 -1
package/dist/index.mjs CHANGED
@@ -1,10 +1,13 @@
1
1
  import React23, { createContext, useMemo, useContext, useRef, useState, useEffect, useCallback } from 'react';
2
- import { Platform, StyleSheet, useColorScheme, Animated, TouchableOpacity, ActivityIndicator, Text, View, TextInput, Image, Easing, PanResponder, Modal } from 'react-native';
3
- import * as Haptics11 from 'expo-haptics';
2
+ import { Platform, StyleSheet, useColorScheme, Animated, TouchableOpacity, ActivityIndicator, Text, View, TextInput, Image, Easing, Modal } from 'react-native';
3
+ import * as Haptics12 from 'expo-haptics';
4
+ import { AntDesign, Entypo, FontAwesome5, MaterialIcons } from '@expo/vector-icons';
4
5
  import { LinearGradient } from 'expo-linear-gradient';
5
6
  import ReanimatedAnimated, { useSharedValue, useAnimatedStyle, withTiming, Easing as Easing$1, withSpring } from 'react-native-reanimated';
7
+ import RNSlider from '@react-native-community/slider';
6
8
  import { BottomSheetModal, BottomSheetView, BottomSheetBackdrop } from '@gorhom/bottom-sheet';
7
9
  export { BottomSheetModalProvider } from '@gorhom/bottom-sheet';
10
+ import { Picker } from '@react-native-picker/picker';
8
11
  import { scheduleOnRN } from 'react-native-worklets';
9
12
  import { Gesture, GestureDetector } from 'react-native-gesture-handler';
10
13
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
@@ -18,41 +21,41 @@ var defaultLight = {
18
21
  card: "#ffffff",
19
22
  cardForeground: "#171717",
20
23
  primary: "#1a1a1a",
21
- primaryForeground: "#fafafa",
22
- secondary: "#f5f5f5",
23
- secondaryForeground: "#1a1a1a",
24
- muted: "#f5f5f5",
25
- mutedForeground: "#646464",
26
- accent: "#f5f5f5",
27
- accentForeground: "#1a1a1a",
24
+ primaryForeground: "#ffffff",
25
+ secondary: "#f1f1f1",
26
+ secondaryForeground: "#171717",
27
+ muted: "#f1f1f1",
28
+ mutedForeground: "#a2a2a2",
29
+ accent: "#e4e4e4",
30
+ accentForeground: "#171717",
28
31
  destructive: "#ef4444",
29
- destructiveForeground: "#fafafa",
32
+ destructiveForeground: "#1a1a1a",
30
33
  border: "#e5e5e5",
31
34
  input: "#e5e5e5",
32
- ring: "#a3a3a3",
35
+ ring: "#1a1a1a",
33
36
  success: "#16a34a",
34
- successForeground: "#ffffff"
37
+ successForeground: "#1a1a1a"
35
38
  };
36
39
  var defaultDark = {
37
40
  background: "#171717",
38
41
  foreground: "#fafafa",
39
- card: "#1f1f1f",
42
+ card: "#222222",
40
43
  cardForeground: "#fafafa",
41
44
  primary: "#fafafa",
42
45
  primaryForeground: "#1a1a1a",
43
- secondary: "#2a2a2a",
46
+ secondary: "#323232",
44
47
  secondaryForeground: "#fafafa",
45
- muted: "#2a2a2a",
46
- mutedForeground: "#a3a3a3",
47
- accent: "#2a2a2a",
48
+ muted: "#323232",
49
+ mutedForeground: "#888888",
50
+ accent: "#323232",
48
51
  accentForeground: "#fafafa",
49
52
  destructive: "#dc2626",
50
- destructiveForeground: "#fafafa",
53
+ destructiveForeground: "#1a1a1a",
51
54
  border: "#2a2a2a",
52
55
  input: "#2a2a2a",
53
- ring: "#d4d4d4",
56
+ ring: "#fafafa",
54
57
  success: "#22c55e",
55
- successForeground: "#ffffff"
58
+ successForeground: "#1a1a1a"
56
59
  };
57
60
 
58
61
  // src/theme/ThemeProvider.tsx
@@ -65,19 +68,23 @@ function ThemeProvider({ children, theme, colorScheme = "system" }) {
65
68
  const resolvedScheme = colorScheme === "system" ? systemScheme : colorScheme;
66
69
  const colors = useMemo(() => {
67
70
  const base = resolvedScheme === "dark" ? defaultDark : defaultLight;
68
- const overrides = resolvedScheme === "dark" ? theme?.dark : theme?.light;
69
- return { ...base, ...overrides };
71
+ const override = resolvedScheme === "dark" ? theme?.dark : theme?.light;
72
+ return override ? { ...base, ...override } : base;
70
73
  }, [resolvedScheme, theme]);
71
74
  return /* @__PURE__ */ React23.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
72
75
  }
73
76
  function useTheme() {
74
- return useContext(ThemeContext);
77
+ const context = useContext(ThemeContext);
78
+ if (!context) {
79
+ throw new Error("useTheme must be used within a ThemeProvider");
80
+ }
81
+ return context;
75
82
  }
76
83
  var nativeDriver = Platform.OS !== "web";
77
84
  var containerSizeStyles = {
78
- sm: { paddingHorizontal: 20, paddingVertical: 12 },
79
- md: { paddingHorizontal: 24, paddingVertical: 16 },
80
- lg: { paddingHorizontal: 32, paddingVertical: 20 }
85
+ sm: { paddingHorizontal: 20, paddingVertical: 10 },
86
+ md: { paddingHorizontal: 24, paddingVertical: 14 },
87
+ lg: { paddingHorizontal: 32, paddingVertical: 18 }
81
88
  };
82
89
  var labelSizeStyles = {
83
90
  sm: { fontSize: 15 },
@@ -113,7 +120,7 @@ function Button({
113
120
  Animated.spring(scale, { toValue: 1, useNativeDriver: nativeDriver, speed: 40, bounciness: 4 }).start();
114
121
  };
115
122
  const handlePress = (e) => {
116
- Haptics11.impactAsync(Haptics11.ImpactFeedbackStyle.Light);
123
+ Haptics12.impactAsync(Haptics12.ImpactFeedbackStyle.Light);
117
124
  onPress?.(e);
118
125
  };
119
126
  const containerVariantStyle = {
@@ -164,13 +171,13 @@ var styles = StyleSheet.create({
164
171
  width: "100%"
165
172
  },
166
173
  disabled: {
167
- opacity: 0.45
174
+ opacity: 0.5
168
175
  },
169
176
  label: {
170
177
  fontWeight: "600"
171
178
  },
172
179
  labelWithIcon: {
173
- marginHorizontal: 6
180
+ marginHorizontal: 8
174
181
  }
175
182
  });
176
183
  var variantStyles = {
@@ -194,56 +201,112 @@ function Text2({ variant = "body", color, style, children, ...props }) {
194
201
  children
195
202
  );
196
203
  }
197
- function Input({ label, error, hint, containerStyle, style, onFocus, onBlur, ...props }) {
204
+ var webInputResetStyle = Platform.OS === "web" ? { outlineStyle: "none", outlineWidth: 0, outlineColor: "transparent", boxShadow: "none" } : {};
205
+ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, type = "text", containerStyle, style, onFocus, onBlur, secureTextEntry, ...props }) {
198
206
  const { colors } = useTheme();
199
207
  const [focused, setFocused] = useState(false);
208
+ const [showPassword, setShowPassword] = useState(false);
209
+ const isPassword = type === "password";
210
+ const effectiveSecure = isPassword ? !showPassword : secureTextEntry;
211
+ const effectiveSuffix = isPassword && !suffix ? /* @__PURE__ */ React23.createElement(TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles2.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React23.createElement(AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.mutedForeground })) : suffix;
200
212
  return /* @__PURE__ */ React23.createElement(View, { style: [styles2.container, containerStyle] }, label ? /* @__PURE__ */ React23.createElement(Text, { style: [styles2.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React23.createElement(
201
- TextInput,
213
+ View,
202
214
  {
203
215
  style: [
204
- styles2.input,
216
+ styles2.inputWrapper,
205
217
  {
206
- borderColor: error ? colors.destructive : focused ? colors.ring : colors.border,
207
- color: colors.foreground,
218
+ borderColor: error ? colors.destructive : focused ? colors.ring ?? colors.primary : colors.border,
208
219
  backgroundColor: colors.background
220
+ }
221
+ ]
222
+ },
223
+ prefix ? typeof prefix === "string" ? /* @__PURE__ */ React23.createElement(Text, { style: [styles2.prefixText, { color: colors.mutedForeground }, prefixStyle], allowFontScaling: true }, prefix) : /* @__PURE__ */ React23.createElement(View, { style: styles2.prefixContainer }, prefix) : null,
224
+ /* @__PURE__ */ React23.createElement(
225
+ TextInput,
226
+ {
227
+ style: [
228
+ styles2.input,
229
+ {
230
+ color: colors.foreground
231
+ },
232
+ webInputResetStyle,
233
+ style
234
+ ],
235
+ onFocus: (e) => {
236
+ setFocused(true);
237
+ onFocus?.(e);
209
238
  },
210
- style
211
- ],
212
- onFocus: (e) => {
213
- setFocused(true);
214
- onFocus?.(e);
215
- },
216
- onBlur: (e) => {
217
- setFocused(false);
218
- onBlur?.(e);
219
- },
220
- placeholderTextColor: colors.mutedForeground,
221
- allowFontScaling: true,
222
- ...props
223
- }
239
+ onBlur: (e) => {
240
+ setFocused(false);
241
+ onBlur?.(e);
242
+ },
243
+ placeholderTextColor: colors.mutedForeground,
244
+ allowFontScaling: true,
245
+ secureTextEntry: effectiveSecure,
246
+ ...props
247
+ }
248
+ ),
249
+ effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React23.createElement(Text, { style: [styles2.suffixText, { color: colors.mutedForeground }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React23.createElement(View, { style: styles2.suffixContainer }, effectiveSuffix) : null
224
250
  ), error ? /* @__PURE__ */ React23.createElement(Text, { style: [styles2.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React23.createElement(Text, { style: [styles2.helperText, { color: colors.mutedForeground }], allowFontScaling: true }, hint) : null);
225
251
  }
226
252
  var styles2 = StyleSheet.create({
227
253
  container: {
228
- gap: 6
254
+ gap: 8
229
255
  },
230
256
  label: {
231
257
  fontSize: 15,
232
- fontWeight: "500",
233
- marginBottom: 6
258
+ fontWeight: "500"
234
259
  },
235
- input: {
260
+ inputWrapper: {
261
+ flexDirection: "row",
262
+ alignItems: "center",
236
263
  borderWidth: 1.5,
237
- borderRadius: 14,
238
- paddingHorizontal: 20,
239
- paddingVertical: 16,
240
- fontSize: 17
264
+ borderRadius: 8,
265
+ paddingHorizontal: 16,
266
+ paddingVertical: 14
267
+ },
268
+ input: {
269
+ flex: 1,
270
+ fontSize: 17,
271
+ paddingVertical: 0
272
+ },
273
+ prefixContainer: {
274
+ marginRight: 8
275
+ },
276
+ prefixText: {
277
+ fontSize: 17,
278
+ marginRight: 8
279
+ },
280
+ suffixContainer: {
281
+ marginLeft: 8
282
+ },
283
+ suffixText: {
284
+ fontSize: 17,
285
+ marginLeft: 8
286
+ },
287
+ passwordToggle: {
288
+ padding: 4
241
289
  },
242
290
  helperText: {
243
291
  fontSize: 13
244
292
  }
245
293
  });
246
- function Badge({ label, variant = "default", style }) {
294
+ var sizePadding = {
295
+ sm: { paddingHorizontal: 8, paddingVertical: 2 },
296
+ md: { paddingHorizontal: 10, paddingVertical: 4 },
297
+ lg: { paddingHorizontal: 12, paddingVertical: 6 }
298
+ };
299
+ var sizeFontSize = {
300
+ sm: { fontSize: 11 },
301
+ md: { fontSize: 13 },
302
+ lg: { fontSize: 15 }
303
+ };
304
+ var sizeIconGap = {
305
+ sm: 4,
306
+ md: 6,
307
+ lg: 6
308
+ };
309
+ function Badge({ label, children, variant = "default", size = "md", icon, style }) {
247
310
  const { colors } = useTheme();
248
311
  const containerStyle = {
249
312
  default: { backgroundColor: colors.primary },
@@ -257,40 +320,100 @@ function Badge({ label, variant = "default", style }) {
257
320
  destructive: colors.destructiveForeground,
258
321
  outline: colors.foreground
259
322
  }[variant];
260
- return /* @__PURE__ */ React23.createElement(View, { style: [styles3.container, containerStyle, style] }, /* @__PURE__ */ React23.createElement(Text, { style: [styles3.label, { color: textColor }], allowFontScaling: true }, label));
323
+ const content = children ?? label;
324
+ return /* @__PURE__ */ React23.createElement(View, { style: [styles3.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, icon ? /* @__PURE__ */ React23.createElement(View, { style: styles3.iconContainer }, icon) : null, typeof content === "string" ? /* @__PURE__ */ React23.createElement(Text, { style: [styles3.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
261
325
  }
262
326
  var styles3 = StyleSheet.create({
263
327
  container: {
264
- borderRadius: 8,
265
- paddingHorizontal: 10,
266
- paddingVertical: 4,
267
- alignSelf: "flex-start"
328
+ borderRadius: 6,
329
+ alignSelf: "flex-start",
330
+ flexDirection: "row",
331
+ alignItems: "center"
332
+ },
333
+ iconContainer: {
334
+ justifyContent: "center",
335
+ alignItems: "center"
268
336
  },
269
337
  label: {
270
- fontSize: 13,
271
338
  fontWeight: "500"
272
339
  }
273
340
  });
274
- function Card({ children, style }) {
341
+ var nativeDriver2 = Platform.OS !== "web";
342
+ function Card({ children, variant = "elevated", onPress, style }) {
275
343
  const { colors } = useTheme();
276
- return /* @__PURE__ */ React23.createElement(
277
- View,
278
- {
279
- style: [styles4.card, { backgroundColor: colors.card, borderColor: colors.border }, style]
344
+ const scale = useRef(new Animated.Value(1)).current;
345
+ const handlePressIn = () => {
346
+ if (!onPress) return;
347
+ Animated.spring(scale, {
348
+ toValue: 0.98,
349
+ useNativeDriver: nativeDriver2,
350
+ speed: 40,
351
+ bounciness: 0
352
+ }).start();
353
+ };
354
+ const handlePressOut = () => {
355
+ if (!onPress) return;
356
+ Animated.spring(scale, {
357
+ toValue: 1,
358
+ useNativeDriver: nativeDriver2,
359
+ speed: 40,
360
+ bounciness: 4
361
+ }).start();
362
+ };
363
+ const handlePress = () => {
364
+ if (!onPress) return;
365
+ Haptics12.impactAsync(Haptics12.ImpactFeedbackStyle.Light);
366
+ onPress();
367
+ };
368
+ const variantStyle = {
369
+ elevated: {
370
+ backgroundColor: colors.card,
371
+ borderColor: colors.border,
372
+ shadowColor: "#000",
373
+ shadowOffset: { width: 0, height: 4 },
374
+ shadowOpacity: 0.06,
375
+ shadowRadius: 12,
376
+ elevation: 3
280
377
  },
281
- children
282
- );
378
+ outlined: {
379
+ backgroundColor: colors.card,
380
+ borderColor: colors.border,
381
+ shadowOpacity: 0,
382
+ elevation: 0
383
+ },
384
+ filled: {
385
+ backgroundColor: colors.accent,
386
+ borderColor: colors.border,
387
+ shadowOpacity: 0,
388
+ elevation: 0
389
+ }
390
+ }[variant];
391
+ const cardContent = /* @__PURE__ */ React23.createElement(View, { style: [styles4.card, variantStyle, style] }, children);
392
+ if (onPress) {
393
+ return /* @__PURE__ */ React23.createElement(Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23.createElement(
394
+ TouchableOpacity,
395
+ {
396
+ onPress: handlePress,
397
+ onPressIn: handlePressIn,
398
+ onPressOut: handlePressOut,
399
+ activeOpacity: 1,
400
+ touchSoundDisabled: true
401
+ },
402
+ cardContent
403
+ ));
404
+ }
405
+ return cardContent;
283
406
  }
284
407
  function CardHeader({ children, style }) {
285
408
  return /* @__PURE__ */ React23.createElement(View, { style: [styles4.header, style] }, children);
286
409
  }
287
410
  function CardTitle({ children, style }) {
288
411
  const { colors } = useTheme();
289
- return /* @__PURE__ */ React23.createElement(Text, { style: [styles4.title, { color: colors.cardForeground }, style] }, children);
412
+ return /* @__PURE__ */ React23.createElement(Text, { style: [styles4.title, { color: colors.cardForeground }, style], allowFontScaling: true }, children);
290
413
  }
291
414
  function CardDescription({ children, style }) {
292
415
  const { colors } = useTheme();
293
- return /* @__PURE__ */ React23.createElement(Text, { style: [styles4.description, { color: colors.mutedForeground }, style] }, children);
416
+ return /* @__PURE__ */ React23.createElement(Text, { style: [styles4.description, { color: colors.mutedForeground }, style], allowFontScaling: true }, children);
294
417
  }
295
418
  function CardContent({ children, style }) {
296
419
  return /* @__PURE__ */ React23.createElement(View, { style: [styles4.content, style] }, children);
@@ -300,16 +423,11 @@ function CardFooter({ children, style }) {
300
423
  }
301
424
  var styles4 = StyleSheet.create({
302
425
  card: {
303
- borderRadius: 20,
304
- borderWidth: 1,
305
- shadowColor: "#000",
306
- shadowOffset: { width: 0, height: 1 },
307
- shadowOpacity: 0.05,
308
- shadowRadius: 2,
309
- elevation: 1
426
+ borderRadius: 12,
427
+ borderWidth: 1
310
428
  },
311
429
  header: {
312
- padding: 28,
430
+ padding: 24,
313
431
  paddingBottom: 0,
314
432
  gap: 8
315
433
  },
@@ -323,10 +441,10 @@ var styles4 = StyleSheet.create({
323
441
  lineHeight: 22
324
442
  },
325
443
  content: {
326
- padding: 28
444
+ padding: 24
327
445
  },
328
446
  footer: {
329
- padding: 28,
447
+ padding: 24,
330
448
  paddingTop: 0,
331
449
  flexDirection: "row",
332
450
  alignItems: "center"
@@ -444,7 +562,8 @@ function Avatar({ src, fallback, size = "md", style }) {
444
562
  ) : /* @__PURE__ */ React23.createElement(
445
563
  Text,
446
564
  {
447
- style: [styles7.fallback, { color: colors.mutedForeground, fontSize: fontSizeMap[size] }]
565
+ style: [styles7.fallback, { color: colors.mutedForeground, fontSize: fontSizeMap[size] }],
566
+ allowFontScaling: true
448
567
  },
449
568
  fallback?.slice(0, 2).toUpperCase() ?? "?"
450
569
  ));
@@ -463,19 +582,24 @@ function AlertBanner({ title, description, variant = "default", icon, style }) {
463
582
  const borderColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.border;
464
583
  const titleColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.foreground;
465
584
  const descColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.mutedForeground;
466
- const defaultIcon = variant === "destructive" ? "\u26A0" : variant === "success" ? "\u2713" : "\u2139";
467
- return /* @__PURE__ */ React23.createElement(View, { style: [styles8.container, { backgroundColor: colors.card, borderColor }, style] }, icon ? /* @__PURE__ */ React23.createElement(View, { style: styles8.icon }, icon) : /* @__PURE__ */ React23.createElement(View, { style: styles8.icon }, /* @__PURE__ */ React23.createElement(Text, { style: [styles8.defaultIcon, { color: titleColor }] }, defaultIcon)), /* @__PURE__ */ React23.createElement(View, { style: styles8.content }, title ? /* @__PURE__ */ React23.createElement(Text, { style: [styles8.title, { color: titleColor }] }, title) : null, description ? /* @__PURE__ */ React23.createElement(Text, { style: [styles8.description, { color: descColor }] }, description) : null));
585
+ const defaultIcon = variant === "success" ? /* @__PURE__ */ React23.createElement(FontAwesome5, { name: "check-circle", size: 18, color: titleColor }) : variant === "destructive" ? /* @__PURE__ */ React23.createElement(MaterialIcons, { name: "error-outline", size: 20, color: titleColor }) : /* @__PURE__ */ React23.createElement(Entypo, { name: "info-with-circle", size: 18, color: titleColor });
586
+ return /* @__PURE__ */ React23.createElement(View, { style: [styles8.container, { backgroundColor: colors.card, borderColor }, style] }, /* @__PURE__ */ React23.createElement(View, { style: styles8.icon }, icon ?? defaultIcon), /* @__PURE__ */ React23.createElement(View, { style: styles8.content }, title ? /* @__PURE__ */ React23.createElement(Text, { style: [styles8.title, { color: titleColor }], allowFontScaling: true }, title) : null, description ? /* @__PURE__ */ React23.createElement(Text, { style: [styles8.description, { color: descColor }], allowFontScaling: true }, description) : null));
468
587
  }
469
588
  var styles8 = StyleSheet.create({
470
589
  container: {
471
590
  flexDirection: "row",
472
591
  borderWidth: 1,
473
- borderRadius: 8,
592
+ borderRadius: 12,
474
593
  padding: 16,
475
- gap: 12
594
+ gap: 12,
595
+ shadowColor: "#000",
596
+ shadowOffset: { width: 0, height: 4 },
597
+ shadowOpacity: 0.06,
598
+ shadowRadius: 12,
599
+ elevation: 3
476
600
  },
477
601
  icon: {
478
- marginTop: 2
602
+ marginTop: 0
479
603
  },
480
604
  content: {
481
605
  flex: 1,
@@ -489,10 +613,6 @@ var styles8 = StyleSheet.create({
489
613
  description: {
490
614
  fontSize: 14,
491
615
  lineHeight: 20
492
- },
493
- defaultIcon: {
494
- fontSize: 18,
495
- fontWeight: "700"
496
616
  }
497
617
  });
498
618
  function Progress({ value = 0, max = 100, style }) {
@@ -562,10 +682,11 @@ function EmptyState({ icon, title, description, action, size = "default", style
562
682
  /* @__PURE__ */ React23.createElement(View, { style: styles10.textWrapper }, /* @__PURE__ */ React23.createElement(
563
683
  Text,
564
684
  {
565
- style: [styles10.title, isCompact && styles10.titleCompact, { color: colors.foreground }]
685
+ style: [styles10.title, isCompact && styles10.titleCompact, { color: colors.foreground }],
686
+ allowFontScaling: true
566
687
  },
567
688
  title
568
- ), description && !isCompact ? /* @__PURE__ */ React23.createElement(Text, { style: [styles10.description, { color: colors.mutedForeground }] }, description) : null),
689
+ ), description && !isCompact ? /* @__PURE__ */ React23.createElement(Text, { style: [styles10.description, { color: colors.mutedForeground }], allowFontScaling: true }, description) : null),
569
690
  action && !isCompact ? /* @__PURE__ */ React23.createElement(View, { style: styles10.action }, action) : null
570
691
  );
571
692
  }
@@ -617,6 +738,7 @@ var styles10 = StyleSheet.create({
617
738
  marginTop: 8
618
739
  }
619
740
  });
741
+ var webInputResetStyle2 = Platform.OS === "web" ? { outlineStyle: "none", outlineWidth: 0, outlineColor: "transparent", boxShadow: "none" } : {};
620
742
  function Textarea({
621
743
  label,
622
744
  error,
@@ -639,11 +761,12 @@ function Textarea({
639
761
  style: [
640
762
  styles11.input,
641
763
  {
642
- borderColor: error ? colors.destructive : focused ? colors.ring : colors.border,
764
+ borderColor: error ? colors.destructive : focused ? colors.ring ?? colors.primary : colors.border,
643
765
  color: colors.foreground,
644
766
  backgroundColor: colors.background,
645
767
  minHeight: rows * 30
646
768
  },
769
+ webInputResetStyle2,
647
770
  style
648
771
  ],
649
772
  onFocus: (e) => {
@@ -662,18 +785,17 @@ function Textarea({
662
785
  }
663
786
  var styles11 = StyleSheet.create({
664
787
  container: {
665
- gap: 6
788
+ gap: 8
666
789
  },
667
790
  label: {
668
791
  fontSize: 15,
669
- fontWeight: "500",
670
- marginBottom: 6
792
+ fontWeight: "500"
671
793
  },
672
794
  input: {
673
795
  borderWidth: 1.5,
674
- borderRadius: 14,
675
- paddingHorizontal: 20,
676
- paddingVertical: 16,
796
+ borderRadius: 8,
797
+ paddingHorizontal: 16,
798
+ paddingVertical: 14,
677
799
  fontSize: 17
678
800
  },
679
801
  helperText: {
@@ -701,7 +823,7 @@ function Checkbox({
701
823
  {
702
824
  style: [styles12.row, style],
703
825
  onPress: () => {
704
- Haptics11.selectionAsync();
826
+ Haptics12.selectionAsync();
705
827
  onCheckedChange?.(!checked);
706
828
  },
707
829
  onPressIn: handlePressIn,
@@ -740,16 +862,16 @@ var styles12 = StyleSheet.create({
740
862
  gap: 12
741
863
  },
742
864
  box: {
743
- width: 28,
744
- height: 28,
865
+ width: 24,
866
+ height: 24,
745
867
  borderRadius: 8,
746
868
  borderWidth: 1.5,
747
869
  alignItems: "center",
748
870
  justifyContent: "center"
749
871
  },
750
872
  checkmark: {
751
- width: 15,
752
- height: 9,
873
+ width: 12,
874
+ height: 7,
753
875
  borderLeftWidth: 2,
754
876
  borderBottomWidth: 2,
755
877
  transform: [{ rotate: "-45deg" }, { translateY: -1 }]
@@ -759,7 +881,7 @@ var styles12 = StyleSheet.create({
759
881
  lineHeight: 22
760
882
  }
761
883
  });
762
- var nativeDriver2 = Platform.OS !== "web";
884
+ var nativeDriver3 = Platform.OS !== "web";
763
885
  var TRACK_WIDTH = 60;
764
886
  var TRACK_HEIGHT = 36;
765
887
  var THUMB_SIZE = 28;
@@ -773,7 +895,7 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
773
895
  Animated.parallel([
774
896
  Animated.spring(translateX, {
775
897
  toValue: checked ? THUMB_TRAVEL : 0,
776
- useNativeDriver: nativeDriver2,
898
+ useNativeDriver: nativeDriver3,
777
899
  bounciness: 4
778
900
  }),
779
901
  Animated.timing(trackOpacity, {
@@ -787,17 +909,17 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
787
909
  inputRange: [0, 1],
788
910
  outputRange: [colors.muted, colors.primary]
789
911
  });
790
- return /* @__PURE__ */ React23.createElement(
912
+ return /* @__PURE__ */ React23.createElement(View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React23.createElement(
791
913
  TouchableOpacity,
792
914
  {
793
915
  onPress: () => {
794
- Haptics11.selectionAsync();
916
+ Haptics12.selectionAsync();
795
917
  onCheckedChange?.(!checked);
796
918
  },
797
919
  disabled,
798
920
  activeOpacity: 0.8,
799
921
  touchSoundDisabled: true,
800
- style: [styles13.wrapper, { opacity: disabled ? 0.45 : 1 }, style]
922
+ style: styles13.wrapper
801
923
  },
802
924
  /* @__PURE__ */ React23.createElement(Animated.View, { style: [styles13.track, { backgroundColor: trackColor }] }, /* @__PURE__ */ React23.createElement(
803
925
  Animated.View,
@@ -808,7 +930,7 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
808
930
  ]
809
931
  }
810
932
  ))
811
- );
933
+ ));
812
934
  }
813
935
  var styles13 = StyleSheet.create({
814
936
  wrapper: {},
@@ -886,53 +1008,51 @@ function Toggle({
886
1008
  if (typeof prop === "function") return prop(pressed);
887
1009
  return prop;
888
1010
  };
889
- if (!pressed) return renderProp(icon);
890
- const active = renderProp(activeIcon);
891
- if (active) return /* @__PURE__ */ React23.createElement(React23.Fragment, null, active);
892
- return /* @__PURE__ */ React23.createElement(View, { style: [styles14.checkContainer, { borderColor: colors.primary }] }, /* @__PURE__ */ React23.createElement(Text, { style: [styles14.checkMark, { color: colors.primary }] }, "\u2713"));
1011
+ if (pressed) {
1012
+ const active = renderProp(activeIcon);
1013
+ if (active) return /* @__PURE__ */ React23.createElement(React23.Fragment, null, active);
1014
+ return /* @__PURE__ */ React23.createElement(FontAwesome5, { name: "check-circle", size: 20, color: colors.primary });
1015
+ }
1016
+ const custom = renderProp(icon);
1017
+ if (custom) return /* @__PURE__ */ React23.createElement(React23.Fragment, null, custom);
1018
+ return /* @__PURE__ */ React23.createElement(FontAwesome5, { name: "circle", size: 20, color: colors.mutedForeground });
893
1019
  };
894
- return /* @__PURE__ */ React23.createElement(Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23.createElement(
895
- Animated.View,
1020
+ return /* @__PURE__ */ React23.createElement(Animated.View, { style: [{ transform: [{ scale }] }, disabled && styles14.disabled, style] }, /* @__PURE__ */ React23.createElement(
1021
+ TouchableOpacity,
896
1022
  {
897
- style: [
898
- styles14.base,
899
- sizeStyles[size],
900
- { borderColor, backgroundColor, borderWidth: 2 },
901
- disabled && styles14.disabled,
902
- style
903
- ]
1023
+ onPress: () => {
1024
+ Haptics12.selectionAsync();
1025
+ onPressedChange?.(!pressed);
1026
+ },
1027
+ onPressIn: handlePressIn,
1028
+ onPressOut: handlePressOut,
1029
+ disabled,
1030
+ activeOpacity: 1,
1031
+ touchSoundDisabled: true,
1032
+ ...props
904
1033
  },
905
1034
  /* @__PURE__ */ React23.createElement(
906
- TouchableOpacity,
1035
+ Animated.View,
907
1036
  {
908
- style: styles14.touchable,
909
- onPress: () => {
910
- Haptics11.selectionAsync();
911
- onPressedChange?.(!pressed);
912
- },
913
- onPressIn: handlePressIn,
914
- onPressOut: handlePressOut,
915
- disabled,
916
- activeOpacity: 1,
917
- touchSoundDisabled: true,
918
- ...props
1037
+ style: [
1038
+ styles14.base,
1039
+ sizeStyles[size],
1040
+ { borderColor, backgroundColor, borderWidth: 2 }
1041
+ ]
919
1042
  },
920
- /* @__PURE__ */ React23.createElement(LeftIcon, null),
921
- label ? /* @__PURE__ */ React23.createElement(Animated.Text, { style: [styles14.label, { color: textColor }] }, label) : null
1043
+ /* @__PURE__ */ React23.createElement(View, { style: styles14.inner }, /* @__PURE__ */ React23.createElement(LeftIcon, null), label ? /* @__PURE__ */ React23.createElement(Animated.Text, { style: [styles14.label, { color: textColor }] }, label) : null)
922
1044
  )
923
1045
  ));
924
1046
  }
925
1047
  var styles14 = StyleSheet.create({
926
1048
  base: {
927
- borderRadius: 8,
928
- overflow: "hidden"
1049
+ borderRadius: 8
929
1050
  },
930
- touchable: {
1051
+ inner: {
931
1052
  flexDirection: "row",
932
1053
  alignItems: "center",
933
1054
  justifyContent: "center",
934
- gap: 8,
935
- flex: 1
1055
+ gap: 8
936
1056
  },
937
1057
  disabled: {
938
1058
  opacity: 0.45
@@ -940,18 +1060,6 @@ var styles14 = StyleSheet.create({
940
1060
  label: {
941
1061
  fontSize: 14,
942
1062
  fontWeight: "500"
943
- },
944
- checkContainer: {
945
- width: 24,
946
- height: 24,
947
- borderRadius: 12,
948
- borderWidth: 2,
949
- alignItems: "center",
950
- justifyContent: "center"
951
- },
952
- checkMark: {
953
- fontSize: 14,
954
- fontWeight: "700"
955
1063
  }
956
1064
  });
957
1065
  function RadioItem({
@@ -974,7 +1082,7 @@ function RadioItem({
974
1082
  style: styles15.row,
975
1083
  onPress: () => {
976
1084
  if (!option.disabled) {
977
- Haptics11.selectionAsync();
1085
+ Haptics12.selectionAsync();
978
1086
  onSelect();
979
1087
  }
980
1088
  },
@@ -1028,7 +1136,7 @@ function RadioGroup({
1028
1136
  }
1029
1137
  var styles15 = StyleSheet.create({
1030
1138
  container: {
1031
- gap: 10
1139
+ gap: 12
1032
1140
  },
1033
1141
  horizontal: {
1034
1142
  flexDirection: "row",
@@ -1037,7 +1145,7 @@ var styles15 = StyleSheet.create({
1037
1145
  row: {
1038
1146
  flexDirection: "row",
1039
1147
  alignItems: "center",
1040
- gap: 10
1148
+ gap: 12
1041
1149
  },
1042
1150
  radio: {
1043
1151
  width: 24,
@@ -1132,7 +1240,7 @@ function Tabs({ tabs, value, onValueChange, children, style }) {
1132
1240
  }
1133
1241
  }, [active]);
1134
1242
  const handlePress = (v) => {
1135
- Haptics11.selectionAsync();
1243
+ Haptics12.selectionAsync();
1136
1244
  if (!value) setInternal(v);
1137
1245
  onValueChange?.(v);
1138
1246
  };
@@ -1257,7 +1365,7 @@ function AccordionItemComponent({
1257
1365
  {
1258
1366
  style: styles17.trigger,
1259
1367
  onPress: () => {
1260
- Haptics11.selectionAsync();
1368
+ Haptics12.selectionAsync();
1261
1369
  onToggle();
1262
1370
  },
1263
1371
  onPressIn: handlePressIn,
@@ -1266,13 +1374,7 @@ function AccordionItemComponent({
1266
1374
  touchSoundDisabled: true
1267
1375
  },
1268
1376
  /* @__PURE__ */ React23.createElement(Text, { style: [styles17.triggerText, { color: colors.foreground }] }, item.trigger),
1269
- /* @__PURE__ */ React23.createElement(
1270
- ReanimatedAnimated.Text,
1271
- {
1272
- style: [styles17.chevron, { color: colors.foreground }, rotationStyle]
1273
- },
1274
- "\u25BE"
1275
- )
1377
+ /* @__PURE__ */ React23.createElement(ReanimatedAnimated.View, { style: [styles17.chevron, rotationStyle] }, /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-down", size: 20, color: colors.foreground }))
1276
1378
  )), /* @__PURE__ */ React23.createElement(ReanimatedAnimated.View, { style: heightStyle }, /* @__PURE__ */ React23.createElement(View, { style: styles17.content, onLayout }, item.content)));
1277
1379
  }
1278
1380
  function Accordion({ items, type = "single", defaultValue, style }) {
@@ -1315,7 +1417,6 @@ var styles17 = StyleSheet.create({
1315
1417
  flex: 1
1316
1418
  },
1317
1419
  chevron: {
1318
- fontSize: 18,
1319
1420
  marginLeft: 8
1320
1421
  },
1321
1422
  content: {
@@ -1331,116 +1432,63 @@ function Slider({
1331
1432
  step = 0,
1332
1433
  onValueChange,
1333
1434
  onSlidingComplete,
1435
+ label,
1436
+ showValue = false,
1437
+ formatValue: formatValue2 = (v) => v.toFixed(2),
1438
+ accessibilityLabel,
1334
1439
  disabled,
1335
1440
  style
1336
1441
  }) {
1337
1442
  const { colors } = useTheme();
1338
- const trackWidth = useRef(0);
1339
1443
  const lastSteppedValue = useRef(value);
1340
- const [internalValue, setInternalValue] = useState(value);
1341
- const currentValue = value ?? internalValue;
1342
- const clamp = (v) => Math.min(Math.max(v, minimumValue), maximumValue);
1343
- const snapToStep = (v) => {
1344
- if (!step) return v;
1345
- return Math.round((v - minimumValue) / step) * step + minimumValue;
1346
- };
1347
- const xToValue = (x) => {
1348
- const ratio = Math.min(Math.max(x / trackWidth.current, 0), 1);
1349
- const raw = ratio * (maximumValue - minimumValue) + minimumValue;
1350
- return clamp(snapToStep(raw));
1351
- };
1352
- const panResponder = useRef(
1353
- PanResponder.create({
1354
- onStartShouldSetPanResponder: () => !disabled,
1355
- onMoveShouldSetPanResponder: () => !disabled,
1356
- onPanResponderGrant: (e) => {
1357
- const x = e.nativeEvent.locationX;
1358
- const newValue = xToValue(x);
1359
- setInternalValue(newValue);
1360
- onValueChange?.(newValue);
1361
- },
1362
- onPanResponderMove: (e) => {
1363
- const x = e.nativeEvent.locationX;
1364
- const newValue = xToValue(x);
1365
- if (newValue !== lastSteppedValue.current) {
1366
- lastSteppedValue.current = newValue;
1367
- Haptics11.selectionAsync();
1368
- }
1369
- setInternalValue(newValue);
1370
- onValueChange?.(newValue);
1371
- },
1372
- onPanResponderRelease: (e) => {
1373
- const x = e.nativeEvent.locationX;
1374
- const newValue = xToValue(x);
1375
- setInternalValue(newValue);
1376
- onSlidingComplete?.(newValue);
1377
- }
1378
- })
1379
- ).current;
1380
- const onLayout = (e) => {
1381
- trackWidth.current = e.nativeEvent.layout.width;
1444
+ const handleValueChange = (v) => {
1445
+ if (step && v !== lastSteppedValue.current) {
1446
+ lastSteppedValue.current = v;
1447
+ Haptics12.selectionAsync();
1448
+ }
1449
+ onValueChange?.(v);
1382
1450
  };
1383
- const percent = (currentValue - minimumValue) / (maximumValue - minimumValue) * 100;
1384
- return /* @__PURE__ */ React23.createElement(
1385
- View,
1451
+ return /* @__PURE__ */ React23.createElement(View, { style: [styles18.wrapper, style], accessibilityLabel }, label || showValue ? /* @__PURE__ */ React23.createElement(View, { style: styles18.header }, label ? /* @__PURE__ */ React23.createElement(Text, { style: [styles18.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React23.createElement(Text, { style: [styles18.valueText, { color: colors.mutedForeground }], allowFontScaling: true }, formatValue2(value)) : null) : null, /* @__PURE__ */ React23.createElement(View, { style: disabled ? styles18.disabled : void 0 }, /* @__PURE__ */ React23.createElement(
1452
+ RNSlider,
1386
1453
  {
1387
- style: [styles18.container, disabled && styles18.disabled, style],
1388
- ...panResponder.panHandlers,
1389
- onLayout
1390
- },
1391
- /* @__PURE__ */ React23.createElement(View, { style: [styles18.track, { backgroundColor: colors.muted }] }, /* @__PURE__ */ React23.createElement(
1392
- View,
1393
- {
1394
- style: [styles18.range, { width: `${percent}%`, backgroundColor: colors.primary }]
1395
- }
1396
- )),
1397
- /* @__PURE__ */ React23.createElement(
1398
- View,
1399
- {
1400
- style: [
1401
- styles18.thumb,
1402
- {
1403
- left: `${percent}%`,
1404
- backgroundColor: colors.primary,
1405
- borderColor: colors.background,
1406
- transform: [{ translateX: -14 }]
1407
- }
1408
- ],
1409
- pointerEvents: "none"
1410
- }
1411
- )
1412
- );
1454
+ value,
1455
+ minimumValue,
1456
+ maximumValue,
1457
+ step: step || 0,
1458
+ disabled,
1459
+ onValueChange: handleValueChange,
1460
+ onSlidingComplete,
1461
+ minimumTrackTintColor: colors.primary,
1462
+ maximumTrackTintColor: colors.muted,
1463
+ thumbTintColor: colors.primary,
1464
+ style: styles18.slider,
1465
+ accessibilityLabel
1466
+ }
1467
+ )));
1413
1468
  }
1414
1469
  var styles18 = StyleSheet.create({
1415
- container: {
1416
- height: 32,
1417
- justifyContent: "center",
1418
- position: "relative"
1470
+ wrapper: {
1471
+ gap: 8
1419
1472
  },
1420
- disabled: {
1421
- opacity: 0.45
1473
+ header: {
1474
+ flexDirection: "row",
1475
+ justifyContent: "space-between",
1476
+ alignItems: "center"
1422
1477
  },
1423
- track: {
1424
- height: 6,
1425
- borderRadius: 3,
1426
- overflow: "hidden",
1427
- width: "100%"
1478
+ label: {
1479
+ fontSize: 15,
1480
+ fontWeight: "500"
1428
1481
  },
1429
- range: {
1430
- height: "100%",
1431
- borderRadius: 3
1482
+ valueText: {
1483
+ fontSize: 14,
1484
+ fontWeight: "500"
1432
1485
  },
1433
- thumb: {
1434
- position: "absolute",
1435
- width: 28,
1436
- height: 28,
1437
- borderRadius: 14,
1438
- borderWidth: 2,
1439
- shadowColor: "#000",
1440
- shadowOffset: { width: 0, height: 1 },
1441
- shadowOpacity: 0.2,
1442
- shadowRadius: 2,
1443
- elevation: 2
1486
+ slider: {
1487
+ width: "100%",
1488
+ height: 40
1489
+ },
1490
+ disabled: {
1491
+ opacity: 0.45
1444
1492
  }
1445
1493
  });
1446
1494
  function Sheet({
@@ -1456,7 +1504,7 @@ function Sheet({
1456
1504
  const ref = useRef(null);
1457
1505
  useEffect(() => {
1458
1506
  if (open) {
1459
- Haptics11.impactAsync(Haptics11.ImpactFeedbackStyle.Light);
1507
+ Haptics12.impactAsync(Haptics12.ImpactFeedbackStyle.Light);
1460
1508
  ref.current?.present();
1461
1509
  } else {
1462
1510
  ref.current?.dismiss();
@@ -1512,6 +1560,9 @@ var styles19 = StyleSheet.create({
1512
1560
  lineHeight: 20
1513
1561
  }
1514
1562
  });
1563
+ var isIOS = Platform.OS === "ios";
1564
+ var isAndroid = Platform.OS === "android";
1565
+ var isWeb = Platform.OS === "web";
1515
1566
  function Select({
1516
1567
  options,
1517
1568
  value,
@@ -1523,8 +1574,10 @@ function Select({
1523
1574
  style
1524
1575
  }) {
1525
1576
  const { colors } = useTheme();
1526
- const bottomSheetRef = useRef(null);
1527
1577
  const scale = useRef(new Animated.Value(1)).current;
1578
+ const [pickerVisible, setPickerVisible] = useState(false);
1579
+ const [pendingValue, setPendingValue] = useState(value);
1580
+ const pickerRef = useRef(null);
1528
1581
  const selected = options.find((o) => o.value === value);
1529
1582
  const handlePressIn = () => {
1530
1583
  if (disabled) return;
@@ -1534,24 +1587,26 @@ function Select({
1534
1587
  Animated.spring(scale, { toValue: 1, useNativeDriver: true, speed: 40, bounciness: 4 }).start();
1535
1588
  };
1536
1589
  const handleOpen = () => {
1537
- if (!disabled) {
1538
- Haptics11.selectionAsync();
1539
- bottomSheetRef.current?.present();
1590
+ if (disabled) return;
1591
+ Haptics12.selectionAsync();
1592
+ if (isIOS) {
1593
+ setPendingValue(value);
1594
+ setPickerVisible(true);
1595
+ } else if (isAndroid) {
1596
+ pickerRef.current?.focus();
1540
1597
  }
1541
1598
  };
1542
- const renderBackdrop = useCallback(
1543
- (props) => /* @__PURE__ */ React23.createElement(
1544
- BottomSheetBackdrop,
1545
- {
1546
- ...props,
1547
- disappearsOnIndex: -1,
1548
- appearsOnIndex: 0,
1549
- pressBehavior: "close"
1550
- }
1551
- ),
1552
- []
1553
- );
1554
- return /* @__PURE__ */ React23.createElement(View, { style: [styles20.container, style] }, label ? /* @__PURE__ */ React23.createElement(Text, { style: [styles20.label, { color: colors.foreground }] }, label) : null, /* @__PURE__ */ React23.createElement(Animated.View, { style: { transform: [{ scale }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React23.createElement(
1599
+ const handleDismiss = () => {
1600
+ setPickerVisible(false);
1601
+ };
1602
+ const handleConfirm = () => {
1603
+ if (pendingValue !== void 0 && pendingValue !== "") {
1604
+ Haptics12.selectionAsync();
1605
+ onValueChange?.(pendingValue);
1606
+ }
1607
+ setPickerVisible(false);
1608
+ };
1609
+ return /* @__PURE__ */ React23.createElement(View, { style: [styles20.container, style] }, label ? /* @__PURE__ */ React23.createElement(Text, { style: [styles20.label, { color: colors.foreground }] }, label) : null, !isWeb ? /* @__PURE__ */ React23.createElement(Animated.View, { style: { transform: [{ scale }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React23.createElement(
1555
1610
  TouchableOpacity,
1556
1611
  {
1557
1612
  style: [
@@ -1574,125 +1629,169 @@ function Select({
1574
1629
  styles20.triggerText,
1575
1630
  { color: selected ? colors.foreground : colors.mutedForeground }
1576
1631
  ],
1577
- numberOfLines: 1
1632
+ numberOfLines: 1,
1633
+ allowFontScaling: true
1578
1634
  },
1579
1635
  selected?.label ?? placeholder
1580
1636
  ),
1581
- /* @__PURE__ */ React23.createElement(Text, { style: [styles20.chevron, { color: colors.mutedForeground }] }, "\u25BE")
1582
- )), error ? /* @__PURE__ */ React23.createElement(Text, { style: [styles20.helperText, { color: colors.destructive }] }, error) : null, /* @__PURE__ */ React23.createElement(
1583
- BottomSheetModal,
1637
+ /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-with-circle-down", size: 20, color: colors.mutedForeground })
1638
+ )) : null, isIOS ? /* @__PURE__ */ React23.createElement(
1639
+ Modal,
1584
1640
  {
1585
- ref: bottomSheetRef,
1586
- enableDynamicSizing: true,
1587
- enablePanDownToClose: true,
1588
- backdropComponent: renderBackdrop,
1589
- backgroundStyle: [styles20.sheetBackground, { backgroundColor: colors.card }],
1590
- handleIndicatorStyle: [styles20.sheetHandle, { backgroundColor: colors.border }]
1641
+ visible: pickerVisible,
1642
+ transparent: true,
1643
+ animationType: "slide",
1644
+ onRequestClose: handleDismiss
1591
1645
  },
1592
- /* @__PURE__ */ React23.createElement(BottomSheetView, { style: styles20.sheetContent }, label ? /* @__PURE__ */ React23.createElement(Text, { style: [styles20.sheetTitle, { color: colors.foreground }] }, label) : null, options.map((item) => {
1593
- const isSelected = item.value === value;
1594
- return /* @__PURE__ */ React23.createElement(
1595
- TouchableOpacity,
1646
+ /* @__PURE__ */ React23.createElement(TouchableOpacity, { style: styles20.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
1647
+ /* @__PURE__ */ React23.createElement(View, { style: [styles20.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React23.createElement(View, { style: [styles20.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React23.createElement(Text, { style: [styles20.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React23.createElement(View, null), /* @__PURE__ */ React23.createElement(TouchableOpacity, { onPress: handleConfirm, style: styles20.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React23.createElement(Text, { style: [styles20.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React23.createElement(
1648
+ Picker,
1649
+ {
1650
+ selectedValue: pendingValue ?? "",
1651
+ onValueChange: (val) => setPendingValue(val),
1652
+ itemStyle: { color: colors.foreground }
1653
+ },
1654
+ !value ? /* @__PURE__ */ React23.createElement(Picker.Item, { label: placeholder, value: "", color: colors.mutedForeground, enabled: false }) : null,
1655
+ options.map((o) => /* @__PURE__ */ React23.createElement(
1656
+ Picker.Item,
1596
1657
  {
1597
- key: item.value,
1598
- style: [
1599
- styles20.option,
1600
- isSelected && { backgroundColor: colors.accent },
1601
- item.disabled && styles20.disabledOption
1602
- ],
1603
- onPress: () => {
1604
- if (!item.disabled) {
1605
- Haptics11.selectionAsync();
1606
- onValueChange?.(item.value);
1607
- bottomSheetRef.current?.dismiss();
1608
- }
1609
- },
1610
- activeOpacity: 0.7,
1611
- touchSoundDisabled: true
1612
- },
1613
- /* @__PURE__ */ React23.createElement(
1614
- Text,
1615
- {
1616
- style: [
1617
- styles20.optionText,
1618
- { color: item.disabled ? colors.mutedForeground : colors.foreground },
1619
- isSelected && { fontWeight: "500" }
1620
- ]
1621
- },
1622
- item.label
1623
- ),
1624
- isSelected ? /* @__PURE__ */ React23.createElement(Text, { style: [styles20.checkmark, { color: colors.primary }] }, "\u2713") : null
1625
- );
1626
- }))
1627
- ));
1658
+ key: o.value,
1659
+ label: o.label,
1660
+ value: o.value,
1661
+ enabled: !o.disabled,
1662
+ color: o.disabled ? colors.mutedForeground : colors.foreground
1663
+ }
1664
+ ))
1665
+ ))
1666
+ ) : null, isAndroid ? /* @__PURE__ */ React23.createElement(
1667
+ Picker,
1668
+ {
1669
+ ref: pickerRef,
1670
+ selectedValue: value ?? "",
1671
+ onValueChange: (val) => {
1672
+ if (val !== "") {
1673
+ Haptics12.selectionAsync();
1674
+ onValueChange?.(val);
1675
+ }
1676
+ },
1677
+ mode: "dialog",
1678
+ enabled: !disabled,
1679
+ prompt: label,
1680
+ style: styles20.androidHiddenPicker
1681
+ },
1682
+ !value ? /* @__PURE__ */ React23.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
1683
+ options.map((o) => /* @__PURE__ */ React23.createElement(
1684
+ Picker.Item,
1685
+ {
1686
+ key: o.value,
1687
+ label: o.label,
1688
+ value: o.value,
1689
+ enabled: !o.disabled
1690
+ }
1691
+ ))
1692
+ ) : null, isWeb ? /* @__PURE__ */ React23.createElement(
1693
+ Picker,
1694
+ {
1695
+ selectedValue: value ?? "",
1696
+ onValueChange: (val) => {
1697
+ if (val !== "") {
1698
+ onValueChange?.(val);
1699
+ }
1700
+ },
1701
+ enabled: !disabled,
1702
+ style: [
1703
+ styles20.webPicker,
1704
+ {
1705
+ borderColor: error ? colors.destructive : colors.border,
1706
+ color: selected ? colors.foreground : colors.mutedForeground,
1707
+ backgroundColor: colors.background,
1708
+ opacity: disabled ? 0.45 : 1
1709
+ }
1710
+ ]
1711
+ },
1712
+ /* @__PURE__ */ React23.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }),
1713
+ options.map((o) => /* @__PURE__ */ React23.createElement(
1714
+ Picker.Item,
1715
+ {
1716
+ key: o.value,
1717
+ label: o.label,
1718
+ value: o.value,
1719
+ enabled: !o.disabled
1720
+ }
1721
+ ))
1722
+ ) : null, error ? /* @__PURE__ */ React23.createElement(Text, { style: [styles20.helperText, { color: colors.destructive }] }, error) : null);
1628
1723
  }
1629
1724
  var styles20 = StyleSheet.create({
1630
1725
  container: {
1631
- gap: 6
1726
+ gap: 8
1632
1727
  },
1633
1728
  label: {
1634
1729
  fontSize: 15,
1635
- fontWeight: "500",
1636
- marginBottom: 2
1730
+ fontWeight: "500"
1637
1731
  },
1638
1732
  trigger: {
1639
1733
  flexDirection: "row",
1640
1734
  alignItems: "center",
1641
1735
  justifyContent: "space-between",
1642
1736
  borderWidth: 1.5,
1643
- borderRadius: 14,
1644
- paddingHorizontal: 20,
1645
- paddingVertical: 16
1737
+ borderRadius: 8,
1738
+ paddingHorizontal: 16,
1739
+ paddingVertical: 14,
1740
+ shadowColor: "#000",
1741
+ shadowOffset: { width: 0, height: 1 },
1742
+ shadowOpacity: 0.04,
1743
+ shadowRadius: 2,
1744
+ elevation: 1
1646
1745
  },
1647
1746
  triggerText: {
1648
1747
  fontSize: 17,
1649
1748
  flex: 1
1650
1749
  },
1651
1750
  chevron: {
1652
- fontSize: 16,
1653
1751
  marginLeft: 8
1654
1752
  },
1655
1753
  helperText: {
1656
1754
  fontSize: 13
1657
1755
  },
1658
- sheetBackground: {
1659
- borderTopLeftRadius: 24,
1660
- borderTopRightRadius: 24
1661
- },
1662
- sheetHandle: {
1663
- width: 36,
1664
- height: 4,
1665
- borderRadius: 2
1666
- },
1667
- sheetContent: {
1668
- paddingHorizontal: 20,
1669
- paddingBottom: 36
1756
+ iosBackdrop: {
1757
+ flex: 1,
1758
+ backgroundColor: "rgba(0,0,0,0.4)"
1670
1759
  },
1671
- sheetTitle: {
1672
- fontSize: 17,
1673
- fontWeight: "600",
1674
- paddingVertical: 16,
1675
- paddingHorizontal: 4
1760
+ iosSheet: {
1761
+ borderTopLeftRadius: 16,
1762
+ borderTopRightRadius: 16,
1763
+ paddingBottom: 32
1676
1764
  },
1677
- option: {
1765
+ iosToolbar: {
1678
1766
  flexDirection: "row",
1679
1767
  alignItems: "center",
1680
1768
  justifyContent: "space-between",
1681
1769
  paddingHorizontal: 16,
1682
- paddingVertical: 16,
1683
- borderRadius: 12
1770
+ paddingVertical: 12,
1771
+ borderBottomWidth: 1
1684
1772
  },
1685
- optionText: {
1773
+ iosToolbarTitle: {
1686
1774
  fontSize: 17,
1687
- flex: 1
1775
+ fontWeight: "600"
1688
1776
  },
1689
- disabledOption: {
1690
- opacity: 0.45
1777
+ iosDoneBtn: {
1778
+ padding: 4
1691
1779
  },
1692
- checkmark: {
1693
- fontSize: 16,
1694
- fontWeight: "600",
1695
- marginLeft: 8
1780
+ iosDoneBtnText: {
1781
+ fontSize: 17,
1782
+ fontWeight: "600"
1783
+ },
1784
+ androidHiddenPicker: {
1785
+ height: 0,
1786
+ opacity: 0,
1787
+ position: "absolute"
1788
+ },
1789
+ webPicker: {
1790
+ borderWidth: 1.5,
1791
+ borderRadius: 8,
1792
+ paddingHorizontal: 16,
1793
+ paddingVertical: 14,
1794
+ fontSize: 17
1696
1795
  }
1697
1796
  });
1698
1797
  var ToastContext = createContext({
@@ -1750,8 +1849,9 @@ function ToastNotification({ item, onDismiss }) {
1750
1849
  destructive: colors.destructiveForeground,
1751
1850
  success: colors.successForeground
1752
1851
  }[item.variant ?? "default"];
1753
- const leftIcon = item.icon ?? /* @__PURE__ */ React23.createElement(Text, { style: [styles21.defaultIcon, { color: textColor }] }, item.variant === "success" ? "\u2713" : item.variant === "destructive" ? "\u2716" : "\u2139");
1754
- return /* @__PURE__ */ React23.createElement(GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React23.createElement(ReanimatedAnimated.View, { style: [styles21.toast, { backgroundColor: bgColor }, animatedStyle] }, /* @__PURE__ */ React23.createElement(View, { style: styles21.leftIconContainer }, leftIcon), /* @__PURE__ */ React23.createElement(View, { style: styles21.toastContent }, item.title ? /* @__PURE__ */ React23.createElement(Text, { style: [styles21.toastTitle, { color: textColor }] }, item.title) : null, item.description ? /* @__PURE__ */ React23.createElement(Text, { style: [styles21.toastDescription, { color: textColor, opacity: 0.85 }] }, item.description) : null), /* @__PURE__ */ React23.createElement(TouchableOpacity, { onPress: onDismiss, style: styles21.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React23.createElement(Text, { style: [styles21.dismissIcon, { color: textColor }] }, "\u2715"))));
1852
+ const defaultIcon = item.variant === "success" ? /* @__PURE__ */ React23.createElement(FontAwesome5, { name: "check-circle", size: 22, color: textColor }) : item.variant === "destructive" ? /* @__PURE__ */ React23.createElement(MaterialIcons, { name: "error-outline", size: 24, color: textColor }) : /* @__PURE__ */ React23.createElement(Entypo, { name: "info-with-circle", size: 22, color: textColor });
1853
+ const leftIcon = item.icon ?? defaultIcon;
1854
+ return /* @__PURE__ */ React23.createElement(GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React23.createElement(ReanimatedAnimated.View, { style: [styles21.toast, { backgroundColor: bgColor }, animatedStyle] }, /* @__PURE__ */ React23.createElement(View, { style: styles21.leftIconContainer }, leftIcon), /* @__PURE__ */ React23.createElement(View, { style: styles21.toastContent }, item.title ? /* @__PURE__ */ React23.createElement(Text, { style: [styles21.toastTitle, { color: textColor }] }, item.title) : null, item.description ? /* @__PURE__ */ React23.createElement(Text, { style: [styles21.toastDescription, { color: textColor, opacity: 0.85 }] }, item.description) : null), /* @__PURE__ */ React23.createElement(TouchableOpacity, { onPress: onDismiss, style: styles21.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React23.createElement(AntDesign, { name: "close-circle", size: 18, color: textColor }))));
1755
1855
  }
1756
1856
  function ToastProvider({ children }) {
1757
1857
  const [toasts, setToasts] = useState([]);
@@ -1759,18 +1859,18 @@ function ToastProvider({ children }) {
1759
1859
  const toast = useCallback((item) => {
1760
1860
  const id = Math.random().toString(36).slice(2);
1761
1861
  if (item.variant === "success") {
1762
- Haptics11.notificationAsync(Haptics11.NotificationFeedbackType.Success);
1862
+ Haptics12.notificationAsync(Haptics12.NotificationFeedbackType.Success);
1763
1863
  } else if (item.variant === "destructive") {
1764
- Haptics11.notificationAsync(Haptics11.NotificationFeedbackType.Error);
1864
+ Haptics12.notificationAsync(Haptics12.NotificationFeedbackType.Error);
1765
1865
  } else {
1766
- Haptics11.impactAsync(Haptics11.ImpactFeedbackStyle.Light);
1866
+ Haptics12.impactAsync(Haptics12.ImpactFeedbackStyle.Light);
1767
1867
  }
1768
1868
  setToasts((prev) => [{ ...item, id }, ...prev].slice(0, 3));
1769
1869
  }, []);
1770
1870
  const dismiss = useCallback((id) => {
1771
1871
  setToasts((prev) => prev.filter((t) => t.id !== id));
1772
1872
  }, []);
1773
- return /* @__PURE__ */ React23.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React23.createElement(View, { style: [styles21.container, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React23.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
1873
+ return /* @__PURE__ */ React23.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React23.createElement(View, { style: [styles21.container, Platform.OS === "web" && styles21.containerWeb, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React23.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
1774
1874
  }
1775
1875
  var styles21 = StyleSheet.create({
1776
1876
  container: {
@@ -1780,6 +1880,12 @@ var styles21 = StyleSheet.create({
1780
1880
  gap: 8,
1781
1881
  zIndex: 9999
1782
1882
  },
1883
+ containerWeb: {
1884
+ left: void 0,
1885
+ right: void 0,
1886
+ alignSelf: "center",
1887
+ width: 400
1888
+ },
1783
1889
  toast: {
1784
1890
  flexDirection: "row",
1785
1891
  alignItems: "center",
@@ -1797,15 +1903,11 @@ var styles21 = StyleSheet.create({
1797
1903
  gap: 4
1798
1904
  },
1799
1905
  leftIconContainer: {
1800
- width: 36,
1906
+ width: 40,
1801
1907
  alignItems: "center",
1802
1908
  justifyContent: "center",
1803
1909
  marginRight: 8
1804
1910
  },
1805
- defaultIcon: {
1806
- fontSize: 22,
1807
- fontWeight: "700"
1808
- },
1809
1911
  toastTitle: {
1810
1912
  fontSize: 15,
1811
1913
  fontWeight: "600"
@@ -1814,11 +1916,8 @@ var styles21 = StyleSheet.create({
1814
1916
  fontSize: 14
1815
1917
  },
1816
1918
  dismissButton: {
1817
- padding: 12,
1919
+ padding: 8,
1818
1920
  marginLeft: 4
1819
- },
1820
- dismissIcon: {
1821
- fontSize: 14
1822
1921
  }
1823
1922
  });
1824
1923
  function formatCurrency(raw, separator) {
@@ -1832,12 +1931,14 @@ function CurrencyInput({
1832
1931
  onChangeValue,
1833
1932
  prefix = "$",
1834
1933
  thousandsSeparator = ".",
1934
+ size = "default",
1835
1935
  label,
1836
1936
  error,
1837
1937
  hint,
1838
1938
  placeholder,
1839
1939
  editable,
1840
- containerStyle
1940
+ containerStyle,
1941
+ style
1841
1942
  }) {
1842
1943
  const handleChange = (text) => {
1843
1944
  const withoutPrefix = prefix && text.startsWith(prefix) ? text.slice(prefix.length) : text;
@@ -1848,6 +1949,7 @@ function CurrencyInput({
1848
1949
  const raw = parseFloat(formatted.replace(separatorRegex, "") || "0");
1849
1950
  onChangeValue?.(isNaN(raw) ? 0 : raw);
1850
1951
  };
1952
+ const inputStyle = size === "large" ? { fontSize: 36 } : {};
1851
1953
  return /* @__PURE__ */ React23.createElement(
1852
1954
  Input,
1853
1955
  {
@@ -1859,7 +1961,8 @@ function CurrencyInput({
1859
1961
  hint,
1860
1962
  placeholder: placeholder ?? `${prefix}0`,
1861
1963
  editable,
1862
- containerStyle
1964
+ containerStyle,
1965
+ style: [inputStyle, style]
1863
1966
  }
1864
1967
  );
1865
1968
  }
@@ -1887,58 +1990,32 @@ var styles22 = StyleSheet.create({
1887
1990
  fontWeight: "700"
1888
1991
  }
1889
1992
  });
1890
- function formatCurrency2(raw, separator) {
1891
- const digits = raw.replace(/\D/g, "");
1892
- if (!digits) return "";
1893
- return digits.replace(/\B(?=(\d{3})+(?!\d))/g, separator);
1894
- }
1895
- function CurrencyInputLarge({
1896
- value,
1897
- onChangeText,
1898
- onChangeValue,
1899
- prefix = "$",
1900
- thousandsSeparator = ".",
1901
- label,
1902
- error,
1903
- hint,
1904
- placeholder,
1905
- editable,
1906
- containerStyle
1993
+ var nativeDriver4 = Platform.OS !== "web";
1994
+ function ListItem({
1995
+ leftRender,
1996
+ rightRender,
1997
+ trailing,
1998
+ icon,
1999
+ title,
2000
+ subtitle,
2001
+ caption,
2002
+ variant = "plain",
2003
+ showChevron = false,
2004
+ showSeparator = false,
2005
+ onPress,
2006
+ disabled,
2007
+ style,
2008
+ titleStyle,
2009
+ subtitleStyle,
2010
+ captionStyle
1907
2011
  }) {
1908
- const handleChange = (text) => {
1909
- const withoutPrefix = prefix && text.startsWith(prefix) ? text.slice(prefix.length) : text;
1910
- const formatted = formatCurrency2(withoutPrefix, thousandsSeparator);
1911
- const display = formatted ? `${prefix}${formatted}` : "";
1912
- onChangeText?.(display);
1913
- const separatorRegex = new RegExp(`\\${thousandsSeparator}`, "g");
1914
- const raw = parseFloat(formatted.replace(separatorRegex, "") || "0");
1915
- onChangeValue?.(isNaN(raw) ? 0 : raw);
1916
- };
1917
- return /* @__PURE__ */ React23.createElement(
1918
- Input,
1919
- {
1920
- value,
1921
- onChangeText: handleChange,
1922
- keyboardType: "numeric",
1923
- label,
1924
- error,
1925
- hint,
1926
- placeholder: placeholder ?? `${prefix}0`,
1927
- editable,
1928
- containerStyle,
1929
- style: { fontSize: 36 }
1930
- }
1931
- );
1932
- }
1933
- var nativeDriver3 = Platform.OS !== "web";
1934
- function ListItem({ icon, title, subtitle, trailing, onPress, disabled, style }) {
1935
2012
  const { colors } = useTheme();
1936
2013
  const scale = useRef(new Animated.Value(1)).current;
1937
2014
  const handlePressIn = () => {
1938
2015
  if (!onPress || disabled) return;
1939
2016
  Animated.spring(scale, {
1940
2017
  toValue: 0.97,
1941
- useNativeDriver: nativeDriver3,
2018
+ useNativeDriver: nativeDriver4,
1942
2019
  speed: 40,
1943
2020
  bounciness: 0
1944
2021
  }).start();
@@ -1946,19 +2023,32 @@ function ListItem({ icon, title, subtitle, trailing, onPress, disabled, style })
1946
2023
  const handlePressOut = () => {
1947
2024
  Animated.spring(scale, {
1948
2025
  toValue: 1,
1949
- useNativeDriver: nativeDriver3,
2026
+ useNativeDriver: nativeDriver4,
1950
2027
  speed: 40,
1951
2028
  bounciness: 4
1952
2029
  }).start();
1953
2030
  };
1954
2031
  const handlePress = () => {
1955
- Haptics11.selectionAsync();
2032
+ Haptics12.selectionAsync();
1956
2033
  onPress?.();
1957
2034
  };
2035
+ const effectiveLeft = leftRender ?? icon;
2036
+ const effectiveRight = rightRender ?? trailing;
2037
+ const cardStyle = variant === "card" ? {
2038
+ backgroundColor: colors.card,
2039
+ borderRadius: 12,
2040
+ borderWidth: 1,
2041
+ borderColor: colors.border,
2042
+ shadowColor: "#000",
2043
+ shadowOffset: { width: 0, height: 2 },
2044
+ shadowOpacity: 0.06,
2045
+ shadowRadius: 6,
2046
+ elevation: 2
2047
+ } : {};
1958
2048
  return /* @__PURE__ */ React23.createElement(Animated.View, { style: [{ transform: [{ scale }] }, disabled && styles23.disabled] }, /* @__PURE__ */ React23.createElement(
1959
2049
  TouchableOpacity,
1960
2050
  {
1961
- style: [styles23.container, style],
2051
+ style: [styles23.container, cardStyle, style],
1962
2052
  onPress: onPress ? handlePress : void 0,
1963
2053
  onPressIn: handlePressIn,
1964
2054
  onPressOut: handlePressOut,
@@ -1966,10 +2056,49 @@ function ListItem({ icon, title, subtitle, trailing, onPress, disabled, style })
1966
2056
  activeOpacity: 1,
1967
2057
  touchSoundDisabled: true
1968
2058
  },
1969
- icon ? /* @__PURE__ */ React23.createElement(View, { style: styles23.iconWrapper }, icon) : null,
1970
- /* @__PURE__ */ React23.createElement(View, { style: styles23.content }, /* @__PURE__ */ React23.createElement(Text, { style: [styles23.title, { color: colors.foreground }], allowFontScaling: true }, title), subtitle ? /* @__PURE__ */ React23.createElement(Text, { style: [styles23.subtitle, { color: colors.mutedForeground }], allowFontScaling: true }, subtitle) : null),
1971
- trailing !== void 0 ? typeof trailing === "string" ? /* @__PURE__ */ React23.createElement(Text, { style: [styles23.trailing, { color: colors.mutedForeground }], allowFontScaling: true }, trailing) : trailing : null
1972
- ));
2059
+ effectiveLeft ? /* @__PURE__ */ React23.createElement(View, { style: styles23.leftContainer }, effectiveLeft) : null,
2060
+ /* @__PURE__ */ React23.createElement(View, { style: styles23.content }, /* @__PURE__ */ React23.createElement(
2061
+ Text,
2062
+ {
2063
+ style: [styles23.title, { color: colors.foreground }, titleStyle],
2064
+ numberOfLines: 2,
2065
+ allowFontScaling: true
2066
+ },
2067
+ title
2068
+ ), subtitle ? /* @__PURE__ */ React23.createElement(
2069
+ Text,
2070
+ {
2071
+ style: [styles23.subtitle, { color: colors.mutedForeground }, subtitleStyle],
2072
+ numberOfLines: 2,
2073
+ allowFontScaling: true
2074
+ },
2075
+ subtitle
2076
+ ) : null, caption ? /* @__PURE__ */ React23.createElement(
2077
+ Text,
2078
+ {
2079
+ style: [styles23.caption, { color: colors.mutedForeground }, captionStyle],
2080
+ numberOfLines: 1,
2081
+ allowFontScaling: true
2082
+ },
2083
+ caption
2084
+ ) : null),
2085
+ effectiveRight !== void 0 ? /* @__PURE__ */ React23.createElement(View, { style: styles23.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React23.createElement(
2086
+ Text,
2087
+ {
2088
+ style: [styles23.rightText, { color: colors.mutedForeground }],
2089
+ allowFontScaling: true
2090
+ },
2091
+ effectiveRight
2092
+ ) : effectiveRight) : showChevron ? /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.mutedForeground }) : null
2093
+ ), showSeparator ? /* @__PURE__ */ React23.createElement(
2094
+ View,
2095
+ {
2096
+ style: [
2097
+ styles23.separator,
2098
+ { backgroundColor: colors.border, marginLeft: effectiveLeft ? 16 + 44 + 12 : 16 }
2099
+ ]
2100
+ }
2101
+ ) : null);
1973
2102
  }
1974
2103
  var styles23 = StyleSheet.create({
1975
2104
  container: {
@@ -1979,31 +2108,54 @@ var styles23 = StyleSheet.create({
1979
2108
  paddingVertical: 14,
1980
2109
  gap: 12
1981
2110
  },
1982
- iconWrapper: {
2111
+ leftContainer: {
2112
+ width: 44,
2113
+ height: 44,
1983
2114
  alignItems: "center",
1984
- justifyContent: "center"
2115
+ justifyContent: "center",
2116
+ flexShrink: 0
1985
2117
  },
1986
2118
  content: {
1987
2119
  flex: 1,
1988
- gap: 3
2120
+ gap: 4
1989
2121
  },
1990
2122
  title: {
1991
- fontSize: 16,
2123
+ fontSize: 17,
1992
2124
  fontWeight: "500",
1993
- lineHeight: 22
2125
+ lineHeight: 24
1994
2126
  },
1995
2127
  subtitle: {
1996
- fontSize: 13,
1997
- lineHeight: 18
2128
+ fontSize: 14,
2129
+ fontWeight: "400",
2130
+ lineHeight: 20
2131
+ },
2132
+ caption: {
2133
+ fontSize: 12,
2134
+ fontWeight: "400",
2135
+ lineHeight: 16,
2136
+ opacity: 0.7
1998
2137
  },
1999
- trailing: {
2138
+ rightContainer: {
2139
+ alignItems: "flex-end",
2140
+ justifyContent: "center",
2141
+ flexShrink: 0,
2142
+ maxWidth: 160
2143
+ },
2144
+ rightText: {
2000
2145
  fontSize: 15
2001
2146
  },
2147
+ chevron: {
2148
+ marginLeft: 4
2149
+ },
2150
+ separator: {
2151
+ height: StyleSheet.hairlineWidth,
2152
+ marginRight: 16
2153
+ },
2002
2154
  disabled: {
2003
2155
  opacity: 0.45
2004
2156
  }
2005
2157
  });
2006
- var nativeDriver4 = Platform.OS !== "web";
2158
+ var nativeDriver5 = Platform.OS !== "web";
2007
2159
  function Chip({ label, selected = false, onPress, style }) {
2008
2160
  const { colors } = useTheme();
2009
2161
  const scale = useRef(new Animated.Value(1)).current;
@@ -2019,7 +2171,7 @@ function Chip({ label, selected = false, onPress, style }) {
2019
2171
  const handlePressIn = () => {
2020
2172
  Animated.spring(scale, {
2021
2173
  toValue: 0.95,
2022
- useNativeDriver: nativeDriver4,
2174
+ useNativeDriver: nativeDriver5,
2023
2175
  speed: 40,
2024
2176
  bounciness: 0
2025
2177
  }).start();
@@ -2027,13 +2179,13 @@ function Chip({ label, selected = false, onPress, style }) {
2027
2179
  const handlePressOut = () => {
2028
2180
  Animated.spring(scale, {
2029
2181
  toValue: 1,
2030
- useNativeDriver: nativeDriver4,
2182
+ useNativeDriver: nativeDriver5,
2031
2183
  speed: 40,
2032
2184
  bounciness: 4
2033
2185
  }).start();
2034
2186
  };
2035
2187
  const handlePress = () => {
2036
- Haptics11.selectionAsync();
2188
+ Haptics12.selectionAsync();
2037
2189
  onPress?.();
2038
2190
  };
2039
2191
  const backgroundColor = pressAnim.interpolate({
@@ -2060,14 +2212,35 @@ function Chip({ label, selected = false, onPress, style }) {
2060
2212
  /* @__PURE__ */ React23.createElement(Animated.View, { style: [styles24.chip, { backgroundColor, borderColor }] }, /* @__PURE__ */ React23.createElement(Animated.Text, { style: [styles24.label, { color: textColor }], allowFontScaling: true }, label))
2061
2213
  ));
2062
2214
  }
2063
- function ChipGroup({ options, value, onValueChange, style }) {
2215
+ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
2216
+ const handlePress = (optionValue) => {
2217
+ if (!multiSelect) {
2218
+ onValueChange?.(optionValue);
2219
+ return;
2220
+ }
2221
+ const currentArray = Array.isArray(value) ? value : value ? [value] : [];
2222
+ const isSelected2 = currentArray.includes(optionValue);
2223
+ let newArray;
2224
+ if (isSelected2) {
2225
+ newArray = currentArray.filter((v) => v !== optionValue);
2226
+ } else {
2227
+ newArray = [...currentArray, optionValue];
2228
+ }
2229
+ onValueChange?.(newArray);
2230
+ };
2231
+ const isSelected = (optionValue) => {
2232
+ if (Array.isArray(value)) {
2233
+ return value.includes(optionValue);
2234
+ }
2235
+ return optionValue === value;
2236
+ };
2064
2237
  return /* @__PURE__ */ React23.createElement(View, { style: [styles24.group, style] }, options.map((opt) => /* @__PURE__ */ React23.createElement(
2065
2238
  Chip,
2066
2239
  {
2067
2240
  key: opt.value,
2068
2241
  label: opt.label,
2069
- selected: opt.value === value,
2070
- onPress: () => onValueChange?.(opt.value)
2242
+ selected: isSelected(opt.value),
2243
+ onPress: () => handlePress(opt.value)
2071
2244
  }
2072
2245
  )));
2073
2246
  }
@@ -2187,7 +2360,7 @@ var MONTH_NAMES = [
2187
2360
  function MonthPicker({ value, onChange, style }) {
2188
2361
  const { colors } = useTheme();
2189
2362
  const handlePrev = () => {
2190
- Haptics11.selectionAsync();
2363
+ Haptics12.selectionAsync();
2191
2364
  if (value.month === 1) {
2192
2365
  onChange({ month: 12, year: value.year - 1 });
2193
2366
  } else {
@@ -2195,7 +2368,7 @@ function MonthPicker({ value, onChange, style }) {
2195
2368
  }
2196
2369
  };
2197
2370
  const handleNext = () => {
2198
- Haptics11.selectionAsync();
2371
+ Haptics12.selectionAsync();
2199
2372
  if (value.month === 12) {
2200
2373
  onChange({ month: 1, year: value.year + 1 });
2201
2374
  } else {
@@ -2210,7 +2383,7 @@ function MonthPicker({ value, onChange, style }) {
2210
2383
  activeOpacity: 0.6,
2211
2384
  touchSoundDisabled: true
2212
2385
  },
2213
- /* @__PURE__ */ React23.createElement(Text, { style: [styles27.arrowText, { color: colors.foreground }] }, "\u2039")
2386
+ /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
2214
2387
  ), /* @__PURE__ */ React23.createElement(Text, { style: [styles27.label, { color: colors.foreground }], allowFontScaling: true }, MONTH_NAMES[value.month - 1], " ", value.year), /* @__PURE__ */ React23.createElement(
2215
2388
  TouchableOpacity,
2216
2389
  {
@@ -2219,7 +2392,7 @@ function MonthPicker({ value, onChange, style }) {
2219
2392
  activeOpacity: 0.6,
2220
2393
  touchSoundDisabled: true
2221
2394
  },
2222
- /* @__PURE__ */ React23.createElement(Text, { style: [styles27.arrowText, { color: colors.foreground }] }, "\u203A")
2395
+ /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
2223
2396
  ));
2224
2397
  }
2225
2398
  var styles27 = StyleSheet.create({
@@ -2234,10 +2407,6 @@ var styles27 = StyleSheet.create({
2234
2407
  alignItems: "center",
2235
2408
  justifyContent: "center"
2236
2409
  },
2237
- arrowText: {
2238
- fontSize: 24,
2239
- lineHeight: 30
2240
- },
2241
2410
  label: {
2242
2411
  fontSize: 17,
2243
2412
  fontWeight: "500",
@@ -2247,4 +2416,4 @@ var styles27 = StyleSheet.create({
2247
2416
  }
2248
2417
  });
2249
2418
 
2250
- export { Accordion, AlertBanner, Avatar, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Chip, ChipGroup, ConfirmDialog, CurrencyDisplay, CurrencyInput, CurrencyInputLarge, EmptyState, Input, LabelValue, ListItem, MonthPicker, Progress, RadioGroup, Select, Separator, Sheet, Skeleton, Slider, Spinner, Switch, Tabs, TabsContent, Text2 as Text, Textarea, ThemeProvider, ToastProvider, Toggle, defaultDark, defaultLight, useTheme, useToast };
2419
+ export { Accordion, AlertBanner, Avatar, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Chip, ChipGroup, ConfirmDialog, CurrencyDisplay, CurrencyInput, CurrencyInput as CurrencyInputLarge, EmptyState, Input, LabelValue, ListItem, MonthPicker, Progress, RadioGroup, Select, Separator, Sheet, Skeleton, Slider, Spinner, Switch, Tabs, TabsContent, Text2 as Text, Textarea, ThemeProvider, ToastProvider, Toggle, defaultDark, defaultLight, useTheme, useToast };