@retray-dev/ui-kit 2.3.0 → 2.5.1

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.
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  import React23, { createContext, useMemo, useContext, useRef, useState, useEffect, useCallback } from 'react';
2
2
  import { Platform, StyleSheet, useColorScheme, Animated, TouchableOpacity, ActivityIndicator, Text, View, TextInput, Image, Easing, Modal } from 'react-native';
3
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';
6
7
  import RNSlider from '@react-native-community/slider';
@@ -81,9 +82,9 @@ function useTheme() {
81
82
  }
82
83
  var nativeDriver = Platform.OS !== "web";
83
84
  var containerSizeStyles = {
84
- sm: { paddingHorizontal: 20, paddingVertical: 12 },
85
- md: { paddingHorizontal: 24, paddingVertical: 16 },
86
- lg: { paddingHorizontal: 32, paddingVertical: 20 }
85
+ sm: { paddingHorizontal: 20, paddingVertical: 10 },
86
+ md: { paddingHorizontal: 24, paddingVertical: 14 },
87
+ lg: { paddingHorizontal: 32, paddingVertical: 18 }
87
88
  };
88
89
  var labelSizeStyles = {
89
90
  sm: { fontSize: 15 },
@@ -176,7 +177,7 @@ var styles = StyleSheet.create({
176
177
  fontWeight: "600"
177
178
  },
178
179
  labelWithIcon: {
179
- marginHorizontal: 6
180
+ marginHorizontal: 8
180
181
  }
181
182
  });
182
183
  var variantStyles = {
@@ -207,7 +208,7 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, t
207
208
  const [showPassword, setShowPassword] = useState(false);
208
209
  const isPassword = type === "password";
209
210
  const effectiveSecure = isPassword ? !showPassword : secureTextEntry;
210
- const effectiveSuffix = isPassword && !suffix ? /* @__PURE__ */ React23.createElement(TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles2.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React23.createElement(Text, { style: [styles2.suffixText, { color: colors.mutedForeground }] }, showPassword ? "\u{1F441}" : "\u{1F441}\u200D\u{1F5E8}")) : suffix;
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;
211
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(
212
213
  View,
213
214
  {
@@ -250,20 +251,19 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, t
250
251
  }
251
252
  var styles2 = StyleSheet.create({
252
253
  container: {
253
- gap: 6
254
+ gap: 8
254
255
  },
255
256
  label: {
256
257
  fontSize: 15,
257
- fontWeight: "500",
258
- marginBottom: 6
258
+ fontWeight: "500"
259
259
  },
260
260
  inputWrapper: {
261
261
  flexDirection: "row",
262
262
  alignItems: "center",
263
263
  borderWidth: 1.5,
264
- borderRadius: 14,
265
- paddingHorizontal: 20,
266
- paddingVertical: 16
264
+ borderRadius: 8,
265
+ paddingHorizontal: 16,
266
+ paddingVertical: 14
267
267
  },
268
268
  input: {
269
269
  flex: 1,
@@ -325,7 +325,7 @@ function Badge({ label, children, variant = "default", size = "md", icon, style
325
325
  }
326
326
  var styles3 = StyleSheet.create({
327
327
  container: {
328
- borderRadius: 8,
328
+ borderRadius: 6,
329
329
  alignSelf: "flex-start",
330
330
  flexDirection: "row",
331
331
  alignItems: "center"
@@ -370,10 +370,10 @@ function Card({ children, variant = "elevated", onPress, style }) {
370
370
  backgroundColor: colors.card,
371
371
  borderColor: colors.border,
372
372
  shadowColor: "#000",
373
- shadowOffset: { width: 0, height: 1 },
374
- shadowOpacity: 0.05,
375
- shadowRadius: 2,
376
- elevation: 1
373
+ shadowOffset: { width: 0, height: 4 },
374
+ shadowOpacity: 0.06,
375
+ shadowRadius: 12,
376
+ elevation: 3
377
377
  },
378
378
  outlined: {
379
379
  backgroundColor: colors.card,
@@ -423,16 +423,11 @@ function CardFooter({ children, style }) {
423
423
  }
424
424
  var styles4 = StyleSheet.create({
425
425
  card: {
426
- borderRadius: 20,
427
- borderWidth: 1,
428
- shadowColor: "#000",
429
- shadowOffset: { width: 0, height: 1 },
430
- shadowOpacity: 0.05,
431
- shadowRadius: 2,
432
- elevation: 1
426
+ borderRadius: 12,
427
+ borderWidth: 1
433
428
  },
434
429
  header: {
435
- padding: 28,
430
+ padding: 24,
436
431
  paddingBottom: 0,
437
432
  gap: 8
438
433
  },
@@ -446,10 +441,10 @@ var styles4 = StyleSheet.create({
446
441
  lineHeight: 22
447
442
  },
448
443
  content: {
449
- padding: 28
444
+ padding: 24
450
445
  },
451
446
  footer: {
452
- padding: 28,
447
+ padding: 24,
453
448
  paddingTop: 0,
454
449
  flexDirection: "row",
455
450
  alignItems: "center"
@@ -587,19 +582,24 @@ function AlertBanner({ title, description, variant = "default", icon, style }) {
587
582
  const borderColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.border;
588
583
  const titleColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.foreground;
589
584
  const descColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : colors.mutedForeground;
590
- const defaultIcon = variant === "destructive" ? "\u26A0" : variant === "success" ? "\u2713" : "\u2139";
591
- 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 }], allowFontScaling: true }, 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));
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));
592
587
  }
593
588
  var styles8 = StyleSheet.create({
594
589
  container: {
595
590
  flexDirection: "row",
596
591
  borderWidth: 1,
597
- borderRadius: 8,
592
+ borderRadius: 12,
598
593
  padding: 16,
599
- gap: 12
594
+ gap: 12,
595
+ shadowColor: "#000",
596
+ shadowOffset: { width: 0, height: 4 },
597
+ shadowOpacity: 0.06,
598
+ shadowRadius: 12,
599
+ elevation: 3
600
600
  },
601
601
  icon: {
602
- marginTop: 2
602
+ marginTop: 0
603
603
  },
604
604
  content: {
605
605
  flex: 1,
@@ -613,10 +613,6 @@ var styles8 = StyleSheet.create({
613
613
  description: {
614
614
  fontSize: 14,
615
615
  lineHeight: 20
616
- },
617
- defaultIcon: {
618
- fontSize: 18,
619
- fontWeight: "700"
620
616
  }
621
617
  });
622
618
  function Progress({ value = 0, max = 100, style }) {
@@ -789,18 +785,17 @@ function Textarea({
789
785
  }
790
786
  var styles11 = StyleSheet.create({
791
787
  container: {
792
- gap: 6
788
+ gap: 8
793
789
  },
794
790
  label: {
795
791
  fontSize: 15,
796
- fontWeight: "500",
797
- marginBottom: 6
792
+ fontWeight: "500"
798
793
  },
799
794
  input: {
800
795
  borderWidth: 1.5,
801
- borderRadius: 14,
802
- paddingHorizontal: 20,
803
- paddingVertical: 16,
796
+ borderRadius: 8,
797
+ paddingHorizontal: 16,
798
+ paddingVertical: 14,
804
799
  fontSize: 17
805
800
  },
806
801
  helperText: {
@@ -867,16 +862,16 @@ var styles12 = StyleSheet.create({
867
862
  gap: 12
868
863
  },
869
864
  box: {
870
- width: 28,
871
- height: 28,
865
+ width: 24,
866
+ height: 24,
872
867
  borderRadius: 8,
873
868
  borderWidth: 1.5,
874
869
  alignItems: "center",
875
870
  justifyContent: "center"
876
871
  },
877
872
  checkmark: {
878
- width: 15,
879
- height: 9,
873
+ width: 12,
874
+ height: 7,
880
875
  borderLeftWidth: 2,
881
876
  borderBottomWidth: 2,
882
877
  transform: [{ rotate: "-45deg" }, { translateY: -1 }]
@@ -1016,54 +1011,48 @@ function Toggle({
1016
1011
  if (pressed) {
1017
1012
  const active = renderProp(activeIcon);
1018
1013
  if (active) return /* @__PURE__ */ React23.createElement(React23.Fragment, null, active);
1019
- return /* @__PURE__ */ React23.createElement(View, { style: [styles14.checkContainer, { borderColor: colors.primary, backgroundColor: colors.primary }] }, /* @__PURE__ */ React23.createElement(Text, { style: [styles14.checkMark, { color: colors.primaryForeground }] }, "\u2713"));
1014
+ return /* @__PURE__ */ React23.createElement(FontAwesome5, { name: "check-circle", size: 20, color: colors.primary });
1020
1015
  }
1021
1016
  const custom = renderProp(icon);
1022
1017
  if (custom) return /* @__PURE__ */ React23.createElement(React23.Fragment, null, custom);
1023
- return /* @__PURE__ */ React23.createElement(View, { style: [styles14.checkContainer, { borderColor: colors.mutedForeground }] });
1018
+ return /* @__PURE__ */ React23.createElement(FontAwesome5, { name: "circle", size: 20, color: colors.mutedForeground });
1024
1019
  };
1025
- return /* @__PURE__ */ React23.createElement(Animated.View, { style: { transform: [{ scale }] } }, /* @__PURE__ */ React23.createElement(
1026
- Animated.View,
1020
+ return /* @__PURE__ */ React23.createElement(Animated.View, { style: [{ transform: [{ scale }] }, disabled && styles14.disabled, style] }, /* @__PURE__ */ React23.createElement(
1021
+ TouchableOpacity,
1027
1022
  {
1028
- style: [
1029
- styles14.base,
1030
- sizeStyles[size],
1031
- { borderColor, backgroundColor, borderWidth: 2 },
1032
- disabled && styles14.disabled,
1033
- style
1034
- ]
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
1035
1033
  },
1036
1034
  /* @__PURE__ */ React23.createElement(
1037
- TouchableOpacity,
1035
+ Animated.View,
1038
1036
  {
1039
- style: styles14.touchable,
1040
- onPress: () => {
1041
- Haptics12.selectionAsync();
1042
- onPressedChange?.(!pressed);
1043
- },
1044
- onPressIn: handlePressIn,
1045
- onPressOut: handlePressOut,
1046
- disabled,
1047
- activeOpacity: 1,
1048
- touchSoundDisabled: true,
1049
- ...props
1037
+ style: [
1038
+ styles14.base,
1039
+ sizeStyles[size],
1040
+ { borderColor, backgroundColor, borderWidth: 2 }
1041
+ ]
1050
1042
  },
1051
- /* @__PURE__ */ React23.createElement(LeftIcon, null),
1052
- 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)
1053
1044
  )
1054
1045
  ));
1055
1046
  }
1056
1047
  var styles14 = StyleSheet.create({
1057
1048
  base: {
1058
- borderRadius: 8,
1059
- overflow: "hidden"
1049
+ borderRadius: 8
1060
1050
  },
1061
- touchable: {
1051
+ inner: {
1062
1052
  flexDirection: "row",
1063
1053
  alignItems: "center",
1064
1054
  justifyContent: "center",
1065
- gap: 8,
1066
- flex: 1
1055
+ gap: 8
1067
1056
  },
1068
1057
  disabled: {
1069
1058
  opacity: 0.45
@@ -1071,18 +1060,6 @@ var styles14 = StyleSheet.create({
1071
1060
  label: {
1072
1061
  fontSize: 14,
1073
1062
  fontWeight: "500"
1074
- },
1075
- checkContainer: {
1076
- width: 24,
1077
- height: 24,
1078
- borderRadius: 12,
1079
- borderWidth: 2,
1080
- alignItems: "center",
1081
- justifyContent: "center"
1082
- },
1083
- checkMark: {
1084
- fontSize: 14,
1085
- fontWeight: "700"
1086
1063
  }
1087
1064
  });
1088
1065
  function RadioItem({
@@ -1159,7 +1136,7 @@ function RadioGroup({
1159
1136
  }
1160
1137
  var styles15 = StyleSheet.create({
1161
1138
  container: {
1162
- gap: 10
1139
+ gap: 12
1163
1140
  },
1164
1141
  horizontal: {
1165
1142
  flexDirection: "row",
@@ -1168,7 +1145,7 @@ var styles15 = StyleSheet.create({
1168
1145
  row: {
1169
1146
  flexDirection: "row",
1170
1147
  alignItems: "center",
1171
- gap: 10
1148
+ gap: 12
1172
1149
  },
1173
1150
  radio: {
1174
1151
  width: 24,
@@ -1397,13 +1374,7 @@ function AccordionItemComponent({
1397
1374
  touchSoundDisabled: true
1398
1375
  },
1399
1376
  /* @__PURE__ */ React23.createElement(Text, { style: [styles17.triggerText, { color: colors.foreground }] }, item.trigger),
1400
- /* @__PURE__ */ React23.createElement(
1401
- ReanimatedAnimated.Text,
1402
- {
1403
- style: [styles17.chevron, { color: colors.foreground }, rotationStyle]
1404
- },
1405
- "\u25BE"
1406
- )
1377
+ /* @__PURE__ */ React23.createElement(ReanimatedAnimated.View, { style: [styles17.chevron, rotationStyle] }, /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-down", size: 20, color: colors.foreground }))
1407
1378
  )), /* @__PURE__ */ React23.createElement(ReanimatedAnimated.View, { style: heightStyle }, /* @__PURE__ */ React23.createElement(View, { style: styles17.content, onLayout }, item.content)));
1408
1379
  }
1409
1380
  function Accordion({ items, type = "single", defaultValue, style }) {
@@ -1446,7 +1417,6 @@ var styles17 = StyleSheet.create({
1446
1417
  flex: 1
1447
1418
  },
1448
1419
  chevron: {
1449
- fontSize: 18,
1450
1420
  marginLeft: 8
1451
1421
  },
1452
1422
  content: {
@@ -1664,7 +1634,7 @@ function Select({
1664
1634
  },
1665
1635
  selected?.label ?? placeholder
1666
1636
  ),
1667
- /* @__PURE__ */ React23.createElement(Text, { style: [styles20.chevron, { color: colors.mutedForeground }] }, "\u25BE")
1637
+ /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-with-circle-down", size: 20, color: colors.mutedForeground })
1668
1638
  )) : null, isIOS ? /* @__PURE__ */ React23.createElement(
1669
1639
  Modal,
1670
1640
  {
@@ -1753,28 +1723,31 @@ function Select({
1753
1723
  }
1754
1724
  var styles20 = StyleSheet.create({
1755
1725
  container: {
1756
- gap: 6
1726
+ gap: 8
1757
1727
  },
1758
1728
  label: {
1759
1729
  fontSize: 15,
1760
- fontWeight: "500",
1761
- marginBottom: 2
1730
+ fontWeight: "500"
1762
1731
  },
1763
1732
  trigger: {
1764
1733
  flexDirection: "row",
1765
1734
  alignItems: "center",
1766
1735
  justifyContent: "space-between",
1767
1736
  borderWidth: 1.5,
1768
- borderRadius: 14,
1769
- paddingHorizontal: 20,
1770
- 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
1771
1745
  },
1772
1746
  triggerText: {
1773
1747
  fontSize: 17,
1774
1748
  flex: 1
1775
1749
  },
1776
1750
  chevron: {
1777
- fontSize: 16,
1778
1751
  marginLeft: 8
1779
1752
  },
1780
1753
  helperText: {
@@ -1785,15 +1758,15 @@ var styles20 = StyleSheet.create({
1785
1758
  backgroundColor: "rgba(0,0,0,0.4)"
1786
1759
  },
1787
1760
  iosSheet: {
1788
- borderTopLeftRadius: 24,
1789
- borderTopRightRadius: 24,
1761
+ borderTopLeftRadius: 16,
1762
+ borderTopRightRadius: 16,
1790
1763
  paddingBottom: 32
1791
1764
  },
1792
1765
  iosToolbar: {
1793
1766
  flexDirection: "row",
1794
1767
  alignItems: "center",
1795
1768
  justifyContent: "space-between",
1796
- paddingHorizontal: 20,
1769
+ paddingHorizontal: 16,
1797
1770
  paddingVertical: 12,
1798
1771
  borderBottomWidth: 1
1799
1772
  },
@@ -1815,9 +1788,9 @@ var styles20 = StyleSheet.create({
1815
1788
  },
1816
1789
  webPicker: {
1817
1790
  borderWidth: 1.5,
1818
- borderRadius: 14,
1819
- paddingHorizontal: 20,
1820
- paddingVertical: 16,
1791
+ borderRadius: 8,
1792
+ paddingHorizontal: 16,
1793
+ paddingVertical: 14,
1821
1794
  fontSize: 17
1822
1795
  }
1823
1796
  });
@@ -1876,8 +1849,9 @@ function ToastNotification({ item, onDismiss }) {
1876
1849
  destructive: colors.destructiveForeground,
1877
1850
  success: colors.successForeground
1878
1851
  }[item.variant ?? "default"];
1879
- const leftIcon = item.icon ?? /* @__PURE__ */ React23.createElement(Text, { style: [styles21.defaultIcon, { color: textColor }] }, item.variant === "success" ? "\u2713" : item.variant === "destructive" ? "\u2716" : "\u2139");
1880
- 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 }))));
1881
1855
  }
1882
1856
  function ToastProvider({ children }) {
1883
1857
  const [toasts, setToasts] = useState([]);
@@ -1896,7 +1870,7 @@ function ToastProvider({ children }) {
1896
1870
  const dismiss = useCallback((id) => {
1897
1871
  setToasts((prev) => prev.filter((t) => t.id !== id));
1898
1872
  }, []);
1899
- 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) }))));
1900
1874
  }
1901
1875
  var styles21 = StyleSheet.create({
1902
1876
  container: {
@@ -1906,6 +1880,12 @@ var styles21 = StyleSheet.create({
1906
1880
  gap: 8,
1907
1881
  zIndex: 9999
1908
1882
  },
1883
+ containerWeb: {
1884
+ left: void 0,
1885
+ right: void 0,
1886
+ alignSelf: "center",
1887
+ width: 400
1888
+ },
1909
1889
  toast: {
1910
1890
  flexDirection: "row",
1911
1891
  alignItems: "center",
@@ -1923,15 +1903,11 @@ var styles21 = StyleSheet.create({
1923
1903
  gap: 4
1924
1904
  },
1925
1905
  leftIconContainer: {
1926
- width: 36,
1906
+ width: 40,
1927
1907
  alignItems: "center",
1928
1908
  justifyContent: "center",
1929
1909
  marginRight: 8
1930
1910
  },
1931
- defaultIcon: {
1932
- fontSize: 22,
1933
- fontWeight: "700"
1934
- },
1935
1911
  toastTitle: {
1936
1912
  fontSize: 15,
1937
1913
  fontWeight: "600"
@@ -1940,11 +1916,8 @@ var styles21 = StyleSheet.create({
1940
1916
  fontSize: 14
1941
1917
  },
1942
1918
  dismissButton: {
1943
- padding: 12,
1919
+ padding: 8,
1944
1920
  marginLeft: 4
1945
- },
1946
- dismissIcon: {
1947
- fontSize: 14
1948
1921
  }
1949
1922
  });
1950
1923
  function formatCurrency(raw, separator) {
@@ -2018,7 +1991,24 @@ var styles22 = StyleSheet.create({
2018
1991
  }
2019
1992
  });
2020
1993
  var nativeDriver4 = Platform.OS !== "web";
2021
- function ListItem({ icon, title, subtitle, trailing, onPress, disabled, style }) {
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
2011
+ }) {
2022
2012
  const { colors } = useTheme();
2023
2013
  const scale = useRef(new Animated.Value(1)).current;
2024
2014
  const handlePressIn = () => {
@@ -2042,10 +2032,23 @@ function ListItem({ icon, title, subtitle, trailing, onPress, disabled, style })
2042
2032
  Haptics12.selectionAsync();
2043
2033
  onPress?.();
2044
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
+ } : {};
2045
2048
  return /* @__PURE__ */ React23.createElement(Animated.View, { style: [{ transform: [{ scale }] }, disabled && styles23.disabled] }, /* @__PURE__ */ React23.createElement(
2046
2049
  TouchableOpacity,
2047
2050
  {
2048
- style: [styles23.container, style],
2051
+ style: [styles23.container, cardStyle, style],
2049
2052
  onPress: onPress ? handlePress : void 0,
2050
2053
  onPressIn: handlePressIn,
2051
2054
  onPressOut: handlePressOut,
@@ -2053,10 +2056,49 @@ function ListItem({ icon, title, subtitle, trailing, onPress, disabled, style })
2053
2056
  activeOpacity: 1,
2054
2057
  touchSoundDisabled: true
2055
2058
  },
2056
- icon ? /* @__PURE__ */ React23.createElement(View, { style: styles23.iconWrapper }, icon) : null,
2057
- /* @__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),
2058
- trailing !== void 0 ? typeof trailing === "string" ? /* @__PURE__ */ React23.createElement(Text, { style: [styles23.trailing, { color: colors.mutedForeground }], allowFontScaling: true }, trailing) : trailing : null
2059
- ));
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);
2060
2102
  }
2061
2103
  var styles23 = StyleSheet.create({
2062
2104
  container: {
@@ -2066,26 +2108,49 @@ var styles23 = StyleSheet.create({
2066
2108
  paddingVertical: 14,
2067
2109
  gap: 12
2068
2110
  },
2069
- iconWrapper: {
2111
+ leftContainer: {
2112
+ width: 44,
2113
+ height: 44,
2070
2114
  alignItems: "center",
2071
- justifyContent: "center"
2115
+ justifyContent: "center",
2116
+ flexShrink: 0
2072
2117
  },
2073
2118
  content: {
2074
2119
  flex: 1,
2075
- gap: 3
2120
+ gap: 4
2076
2121
  },
2077
2122
  title: {
2078
- fontSize: 16,
2123
+ fontSize: 17,
2079
2124
  fontWeight: "500",
2080
- lineHeight: 22
2125
+ lineHeight: 24
2081
2126
  },
2082
2127
  subtitle: {
2083
- fontSize: 13,
2084
- 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
2137
+ },
2138
+ rightContainer: {
2139
+ alignItems: "flex-end",
2140
+ justifyContent: "center",
2141
+ flexShrink: 0,
2142
+ maxWidth: 160
2085
2143
  },
2086
- trailing: {
2144
+ rightText: {
2087
2145
  fontSize: 15
2088
2146
  },
2147
+ chevron: {
2148
+ marginLeft: 4
2149
+ },
2150
+ separator: {
2151
+ height: StyleSheet.hairlineWidth,
2152
+ marginRight: 16
2153
+ },
2089
2154
  disabled: {
2090
2155
  opacity: 0.45
2091
2156
  }
@@ -2318,7 +2383,7 @@ function MonthPicker({ value, onChange, style }) {
2318
2383
  activeOpacity: 0.6,
2319
2384
  touchSoundDisabled: true
2320
2385
  },
2321
- /* @__PURE__ */ React23.createElement(Text, { style: [styles27.arrowText, { color: colors.foreground }], allowFontScaling: true }, "\u2039")
2386
+ /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
2322
2387
  ), /* @__PURE__ */ React23.createElement(Text, { style: [styles27.label, { color: colors.foreground }], allowFontScaling: true }, MONTH_NAMES[value.month - 1], " ", value.year), /* @__PURE__ */ React23.createElement(
2323
2388
  TouchableOpacity,
2324
2389
  {
@@ -2327,7 +2392,7 @@ function MonthPicker({ value, onChange, style }) {
2327
2392
  activeOpacity: 0.6,
2328
2393
  touchSoundDisabled: true
2329
2394
  },
2330
- /* @__PURE__ */ React23.createElement(Text, { style: [styles27.arrowText, { color: colors.foreground }], allowFontScaling: true }, "\u203A")
2395
+ /* @__PURE__ */ React23.createElement(Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
2331
2396
  ));
2332
2397
  }
2333
2398
  var styles27 = StyleSheet.create({
@@ -2342,10 +2407,6 @@ var styles27 = StyleSheet.create({
2342
2407
  alignItems: "center",
2343
2408
  justifyContent: "center"
2344
2409
  },
2345
- arrowText: {
2346
- fontSize: 24,
2347
- lineHeight: 30
2348
- },
2349
2410
  label: {
2350
2411
  fontSize: 17,
2351
2412
  fontWeight: "500",