@retray-dev/ui-kit 5.1.0 → 5.4.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.
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import React25, { createContext, useMemo, useContext, useRef, useState, useEffect, useCallback } from 'react';
2
- import { Platform, StyleSheet, useColorScheme, Animated, TouchableOpacity, ActivityIndicator, Text, View, TextInput, Image, Easing, Modal, ScrollView, Pressable } from 'react-native';
3
- import { verticalScale, scale, moderateScale, moderateVerticalScale } from 'react-native-size-matters';
1
+ import React26, { createContext, useMemo, useContext, useRef, useState, useEffect, useCallback } from 'react';
2
+ import { Platform, StyleSheet, useColorScheme, Animated, TouchableOpacity, ActivityIndicator, Text, View, TextInput, Image, Easing, Modal, ScrollView, KeyboardAvoidingView, Pressable } from 'react-native';
3
+ import { verticalScale, scale, moderateVerticalScale, moderateScale } from 'react-native-size-matters';
4
4
  import AntDesign from '@expo/vector-icons/AntDesign';
5
5
  import Entypo from '@expo/vector-icons/Entypo';
6
6
  import Feather from '@expo/vector-icons/Feather';
@@ -11,7 +11,7 @@ import { AntDesign as AntDesign$1, Feather as Feather$1, Entypo as Entypo$1, Fon
11
11
  import { LinearGradient } from 'expo-linear-gradient';
12
12
  import Animated11, { useSharedValue, useDerivedValue, withTiming, Easing as Easing$1, useAnimatedStyle, withSpring } from 'react-native-reanimated';
13
13
  import RNSlider from '@react-native-community/slider';
14
- import { BottomSheetModal, BottomSheetView, BottomSheetBackdrop } from '@gorhom/bottom-sheet';
14
+ import { BottomSheetModal, BottomSheetView, BottomSheetScrollView, BottomSheetBackdrop } from '@gorhom/bottom-sheet';
15
15
  export { BottomSheetModalProvider } from '@gorhom/bottom-sheet';
16
16
  import { Picker } from '@react-native-picker/picker';
17
17
  import { scheduleOnRN } from 'react-native-worklets';
@@ -150,7 +150,7 @@ function ThemeProvider({ children, theme, colorScheme = "system" }) {
150
150
  const merged = override ? { ...base, ...override } : base;
151
151
  return deriveColors(merged, resolvedScheme);
152
152
  }, [resolvedScheme, theme]);
153
- return /* @__PURE__ */ React25.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
153
+ return /* @__PURE__ */ React26.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
154
154
  }
155
155
  function useTheme() {
156
156
  const context = useContext(ThemeContext);
@@ -222,10 +222,10 @@ function Icon({ name, size, color, family }) {
222
222
  }
223
223
  if (!resolved) return null;
224
224
  const Component = resolved.component;
225
- return React25.createElement(Component, { name, size, color });
225
+ return React26.createElement(Component, { name, size, color });
226
226
  }
227
227
  function renderIcon(name, size, color) {
228
- return React25.createElement(Icon, { name, size, color });
228
+ return React26.createElement(Icon, { name, size, color });
229
229
  }
230
230
 
231
231
  // src/tokens.ts
@@ -393,7 +393,7 @@ var TYPOGRAPHY = {
393
393
  fontFamily: "Poppins-Medium",
394
394
  fontSize: 16,
395
395
  fontWeight: "500",
396
- lineHeight: 20,
396
+ lineHeight: 22,
397
397
  letterSpacing: 0
398
398
  },
399
399
  "button-sm": {
@@ -415,7 +415,7 @@ var containerSizeStyles = {
415
415
  var labelSizeStyles = {
416
416
  sm: { ...TYPOGRAPHY["button-sm"], fontSize: ms(TYPOGRAPHY["button-sm"].fontSize) },
417
417
  md: { ...TYPOGRAPHY["button-lg"], fontSize: ms(TYPOGRAPHY["button-lg"].fontSize) },
418
- lg: { ...TYPOGRAPHY["button-lg"], fontSize: ms(TYPOGRAPHY["button-lg"].fontSize + 1) }
418
+ lg: { ...TYPOGRAPHY["button-lg"], fontSize: ms(TYPOGRAPHY["button-lg"].fontSize + 1), lineHeight: mvs(24) }
419
419
  };
420
420
  var iconSizeMap = { sm: 16, md: 18, lg: 20 };
421
421
  function Button({
@@ -459,9 +459,13 @@ function Button({
459
459
  text: { color: colors.foreground },
460
460
  destructive: { color: colors.destructiveForeground }
461
461
  }[variant];
462
- const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], iconColor ?? labelVariantStyle.color) : typeof icon === "function" ? icon({ label, size, variant }) : icon;
462
+ const textColor = iconColor ?? labelVariantStyle.color;
463
+ const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], textColor) : typeof icon === "function" ? icon({ label, size, variant, color: textColor }) : icon;
463
464
  const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.foreground;
464
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: [fullWidth && styles.fullWidth, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React25.createElement(
465
+ const styleArray = Array.isArray(style) ? style : style ? [style] : [];
466
+ const flatStyle = StyleSheet.flatten(styleArray);
467
+ const { flex, ...restStyle } = flatStyle || {};
468
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: [fullWidth && styles.fullWidth, flex !== void 0 && { flex }, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React26.createElement(
465
469
  TouchableOpacity,
466
470
  {
467
471
  style: [
@@ -470,7 +474,7 @@ function Button({
470
474
  containerSizeStyles[size],
471
475
  fullWidth && styles.fullWidth,
472
476
  isDisabled && styles.disabled,
473
- style
477
+ restStyle
474
478
  ],
475
479
  disabled: isDisabled,
476
480
  activeOpacity: 1,
@@ -480,14 +484,15 @@ function Button({
480
484
  onPressOut: handlePressOut,
481
485
  ...props
482
486
  },
483
- loading ? /* @__PURE__ */ React25.createElement(ActivityIndicator, { size: "small", color: spinnerColor }) : /* @__PURE__ */ React25.createElement(React25.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React25.createElement(React25.Fragment, null, effectiveIcon), /* @__PURE__ */ React25.createElement(
487
+ loading ? /* @__PURE__ */ React26.createElement(ActivityIndicator, { size: "small", color: spinnerColor }) : /* @__PURE__ */ React26.createElement(React26.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React26.createElement(React26.Fragment, null, effectiveIcon), /* @__PURE__ */ React26.createElement(
484
488
  Text,
485
489
  {
486
490
  style: [styles.label, labelVariantStyle, labelSizeStyles[size], effectiveIcon ? styles.labelWithIcon : void 0],
487
- allowFontScaling: true
491
+ allowFontScaling: true,
492
+ numberOfLines: 1
488
493
  },
489
494
  label
490
- ), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React25.createElement(React25.Fragment, null, effectiveIcon))
495
+ ), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React26.createElement(React26.Fragment, null, effectiveIcon))
491
496
  ));
492
497
  }
493
498
  var styles = StyleSheet.create({
@@ -505,12 +510,46 @@ var styles = StyleSheet.create({
505
510
  opacity: 0.45
506
511
  },
507
512
  label: {
508
- fontFamily: "Poppins-Medium"
513
+ fontFamily: "Poppins-Medium",
514
+ flexShrink: 1
509
515
  },
510
516
  labelWithIcon: {
511
517
  marginHorizontal: s(6)
512
518
  }
513
519
  });
520
+ function ButtonGroup({ children, gap = 12, vertical = false, style }) {
521
+ return /* @__PURE__ */ React26.createElement(
522
+ View,
523
+ {
524
+ style: [
525
+ styles2.container,
526
+ vertical ? styles2.vertical : styles2.horizontal,
527
+ { gap: s(gap) },
528
+ style
529
+ ]
530
+ },
531
+ React26.Children.map(
532
+ children,
533
+ (child) => React26.isValidElement(child) ? React26.cloneElement(child, {
534
+ style: [
535
+ child.props.style,
536
+ { flex: 1 }
537
+ ]
538
+ }) : child
539
+ )
540
+ );
541
+ }
542
+ var styles2 = StyleSheet.create({
543
+ container: {
544
+ width: "100%"
545
+ },
546
+ horizontal: {
547
+ flexDirection: "row"
548
+ },
549
+ vertical: {
550
+ flexDirection: "column"
551
+ }
552
+ });
514
553
  var nativeDriver2 = Platform.OS !== "web";
515
554
  var sizeMap = {
516
555
  sm: { container: s(32), icon: 16 },
@@ -564,14 +603,14 @@ function IconButton({
564
603
  const showBadge = badge !== void 0 && badge !== false && badge !== 0;
565
604
  const badgeCount = typeof badge === "number" ? Math.min(badge, 99) : null;
566
605
  const showCount = typeof badge === "number" && badge > 0;
567
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: [styles2.wrapper, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React25.createElement(
606
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: [styles3.wrapper, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React26.createElement(
568
607
  TouchableOpacity,
569
608
  {
570
609
  style: [
571
- styles2.base,
610
+ styles3.base,
572
611
  containerVariantStyle,
573
612
  { width: containerSize, height: containerSize },
574
- isDisabled && styles2.disabled,
613
+ isDisabled && styles3.disabled,
575
614
  style
576
615
  ],
577
616
  disabled: isDisabled,
@@ -582,14 +621,14 @@ function IconButton({
582
621
  onPressOut: handlePressOut,
583
622
  ...props
584
623
  },
585
- loading ? /* @__PURE__ */ React25.createElement(ActivityIndicator, { size: "small", color: spinnerColor }) : resolvedIcon
586
- ), showBadge && /* @__PURE__ */ React25.createElement(View, { style: [
587
- styles2.badge,
624
+ loading ? /* @__PURE__ */ React26.createElement(ActivityIndicator, { size: "small", color: spinnerColor }) : resolvedIcon
625
+ ), showBadge && /* @__PURE__ */ React26.createElement(View, { style: [
626
+ styles3.badge,
588
627
  { backgroundColor: colors.primary },
589
- showCount ? styles2.badgeCount : styles2.badgeDot
590
- ] }, showCount && /* @__PURE__ */ React25.createElement(Text, { style: [styles2.badgeText, { color: colors.primaryForeground }] }, badgeCount)));
628
+ showCount ? styles3.badgeCount : styles3.badgeDot
629
+ ] }, showCount && /* @__PURE__ */ React26.createElement(Text, { style: [styles3.badgeText, { color: colors.primaryForeground }] }, badgeCount)));
591
630
  }
592
- var styles2 = StyleSheet.create({
631
+ var styles3 = StyleSheet.create({
593
632
  wrapper: {
594
633
  alignSelf: "flex-start"
595
634
  },
@@ -666,7 +705,7 @@ function Text3({ variant = "body-md", color, style, children, ...props }) {
666
705
  const { colors } = useTheme();
667
706
  const colorKey = defaultColorVariant[variant] ?? "foreground";
668
707
  const resolvedColor = color ?? colors[colorKey];
669
- return /* @__PURE__ */ React25.createElement(
708
+ return /* @__PURE__ */ React26.createElement(
670
709
  Text,
671
710
  {
672
711
  style: [variantStyles[variant], { color: resolvedColor }, style],
@@ -684,12 +723,12 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, p
684
723
  const isPassword = type === "password";
685
724
  const effectiveSecure = isPassword ? !showPassword : secureTextEntry;
686
725
  const effectivePrefix = prefixIcon ? renderIcon(prefixIcon, 20, prefixIconColor ?? colors.foregroundMuted) : prefix;
687
- const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */ React25.createElement(TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles3.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React25.createElement(AntDesign$1, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.foregroundMuted })) : suffixIcon ? renderIcon(suffixIcon, 20, suffixIconColor ?? colors.foregroundMuted) : suffix;
688
- return /* @__PURE__ */ React25.createElement(View, { style: [styles3.container, containerStyle] }, label ? /* @__PURE__ */ React25.createElement(Text, { style: [styles3.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React25.createElement(
726
+ const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */ React26.createElement(TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles4.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React26.createElement(AntDesign$1, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.foregroundMuted })) : suffixIcon ? renderIcon(suffixIcon, 20, suffixIconColor ?? colors.foregroundMuted) : suffix;
727
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles4.container, containerStyle] }, label ? /* @__PURE__ */ React26.createElement(Text, { style: [styles4.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React26.createElement(
689
728
  View,
690
729
  {
691
730
  style: [
692
- styles3.inputWrapper,
731
+ styles4.inputWrapper,
693
732
  {
694
733
  borderColor: error ? colors.destructive : focused ? colors.primary : colors.border,
695
734
  backgroundColor: colors.background
@@ -697,12 +736,12 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, p
697
736
  inputWrapperStyle
698
737
  ]
699
738
  },
700
- effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React25.createElement(Text, { style: [styles3.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React25.createElement(View, { style: styles3.prefixContainer }, effectivePrefix) : null,
701
- /* @__PURE__ */ React25.createElement(
739
+ effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React26.createElement(Text, { style: [styles4.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React26.createElement(View, { style: styles4.prefixContainer }, effectivePrefix) : null,
740
+ /* @__PURE__ */ React26.createElement(
702
741
  TextInput,
703
742
  {
704
743
  style: [
705
- styles3.input,
744
+ styles4.input,
706
745
  {
707
746
  color: colors.foreground
708
747
  },
@@ -723,10 +762,10 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, p
723
762
  ...props
724
763
  }
725
764
  ),
726
- effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React25.createElement(Text, { style: [styles3.suffixText, { color: colors.foregroundMuted }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React25.createElement(View, { style: styles3.suffixContainer }, effectiveSuffix) : null
727
- ), error ? /* @__PURE__ */ React25.createElement(Text, { style: [styles3.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React25.createElement(Text, { style: [styles3.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
765
+ effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React26.createElement(Text, { style: [styles4.suffixText, { color: colors.foregroundMuted }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React26.createElement(View, { style: styles4.suffixContainer }, effectiveSuffix) : null
766
+ ), error ? /* @__PURE__ */ React26.createElement(Text, { style: [styles4.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React26.createElement(Text, { style: [styles4.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
728
767
  }
729
- var styles3 = StyleSheet.create({
768
+ var styles4 = StyleSheet.create({
730
769
  container: {
731
770
  gap: vs(8)
732
771
  },
@@ -817,9 +856,9 @@ function Badge({ label, children, variant = "default", size = "md", icon, iconNa
817
856
  }[variant];
818
857
  const effectiveIcon = iconName ? renderIcon(iconName, sizeIconSize[size], iconColor ?? textColor) : icon;
819
858
  const content = children ?? label;
820
- return /* @__PURE__ */ React25.createElement(View, { style: [styles4.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, effectiveIcon, typeof content === "string" ? /* @__PURE__ */ React25.createElement(Text, { style: [styles4.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
859
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles5.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, effectiveIcon, typeof content === "string" ? /* @__PURE__ */ React26.createElement(Text, { style: [styles5.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
821
860
  }
822
- var styles4 = StyleSheet.create({
861
+ var styles5 = StyleSheet.create({
823
862
  container: {
824
863
  borderRadius: 9999,
825
864
  alignSelf: "flex-start",
@@ -880,9 +919,9 @@ function Card({ children, variant = "elevated", onPress, style }) {
880
919
  elevation: 0
881
920
  }
882
921
  }[variant];
883
- const cardContent = /* @__PURE__ */ React25.createElement(View, { style: [styles5.card, variantStyle, style] }, children);
922
+ const cardContent = /* @__PURE__ */ React26.createElement(View, { style: [styles6.card, variantStyle, style] }, children);
884
923
  if (onPress) {
885
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25.createElement(
924
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26.createElement(
886
925
  TouchableOpacity,
887
926
  {
888
927
  onPress: handlePress,
@@ -897,23 +936,23 @@ function Card({ children, variant = "elevated", onPress, style }) {
897
936
  return cardContent;
898
937
  }
899
938
  function CardHeader({ children, style }) {
900
- return /* @__PURE__ */ React25.createElement(View, { style: [styles5.header, style] }, children);
939
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles6.header, style] }, children);
901
940
  }
902
941
  function CardTitle({ children, style }) {
903
942
  const { colors } = useTheme();
904
- return /* @__PURE__ */ React25.createElement(Text, { style: [styles5.title, { color: colors.foreground }, style], allowFontScaling: true }, children);
943
+ return /* @__PURE__ */ React26.createElement(Text, { style: [styles6.title, { color: colors.foreground }, style], allowFontScaling: true }, children);
905
944
  }
906
945
  function CardDescription({ children, style }) {
907
946
  const { colors } = useTheme();
908
- return /* @__PURE__ */ React25.createElement(Text, { style: [styles5.description, { color: colors.foregroundMuted }, style], allowFontScaling: true }, children);
947
+ return /* @__PURE__ */ React26.createElement(Text, { style: [styles6.description, { color: colors.foregroundMuted }, style], allowFontScaling: true }, children);
909
948
  }
910
949
  function CardContent({ children, style }) {
911
- return /* @__PURE__ */ React25.createElement(View, { style: [styles5.content, style] }, children);
950
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles6.content, style] }, children);
912
951
  }
913
952
  function CardFooter({ children, style }) {
914
- return /* @__PURE__ */ React25.createElement(View, { style: [styles5.footer, style] }, children);
953
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles6.footer, style] }, children);
915
954
  }
916
- var styles5 = StyleSheet.create({
955
+ var styles6 = StyleSheet.create({
917
956
  card: {
918
957
  borderRadius: 14,
919
958
  // RADIUS.md — Airbnb property card spec
@@ -948,18 +987,18 @@ var styles5 = StyleSheet.create({
948
987
  });
949
988
  function Separator({ orientation = "horizontal", style }) {
950
989
  const { colors } = useTheme();
951
- return /* @__PURE__ */ React25.createElement(
990
+ return /* @__PURE__ */ React26.createElement(
952
991
  View,
953
992
  {
954
993
  style: [
955
- orientation === "horizontal" ? styles6.horizontal : styles6.vertical,
994
+ orientation === "horizontal" ? styles7.horizontal : styles7.vertical,
956
995
  { backgroundColor: colors.border },
957
996
  style
958
997
  ]
959
998
  }
960
999
  );
961
1000
  }
962
- var styles6 = StyleSheet.create({
1001
+ var styles7 = StyleSheet.create({
963
1002
  horizontal: {
964
1003
  height: 1,
965
1004
  width: "100%"
@@ -982,18 +1021,18 @@ var labelFontSize = {
982
1021
  function Spinner({ size = "md", color, label, ...props }) {
983
1022
  const { colors } = useTheme();
984
1023
  if (label) {
985
- return /* @__PURE__ */ React25.createElement(View, { style: styles7.wrapper }, /* @__PURE__ */ React25.createElement(ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props }), /* @__PURE__ */ React25.createElement(
1024
+ return /* @__PURE__ */ React26.createElement(View, { style: styles8.wrapper }, /* @__PURE__ */ React26.createElement(ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props }), /* @__PURE__ */ React26.createElement(
986
1025
  Text,
987
1026
  {
988
- style: [styles7.label, { color: colors.foregroundMuted, fontSize: labelFontSize[size] }],
1027
+ style: [styles8.label, { color: colors.foregroundMuted, fontSize: labelFontSize[size] }],
989
1028
  allowFontScaling: true
990
1029
  },
991
1030
  label
992
1031
  ));
993
1032
  }
994
- return /* @__PURE__ */ React25.createElement(ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props });
1033
+ return /* @__PURE__ */ React26.createElement(ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props });
995
1034
  }
996
- var styles7 = StyleSheet.create({
1035
+ var styles8 = StyleSheet.create({
997
1036
  wrapper: {
998
1037
  alignItems: "center",
999
1038
  gap: vs(6)
@@ -1029,17 +1068,17 @@ function Skeleton({
1029
1068
  const resolvedWidth = preset === "circle" ? s(diameter) : preset === "text" ? "60%" : width;
1030
1069
  const resolvedHeight = preset === "circle" ? s(diameter) : preset === "text" ? 14 : height;
1031
1070
  const resolvedRadius = preset === "circle" ? 9999 : preset === "text" ? 4 : borderRadius;
1032
- return /* @__PURE__ */ React25.createElement(
1071
+ return /* @__PURE__ */ React26.createElement(
1033
1072
  View,
1034
1073
  {
1035
1074
  style: [
1036
- styles8.base,
1075
+ styles9.base,
1037
1076
  { width: resolvedWidth, height: resolvedHeight, borderRadius: resolvedRadius, backgroundColor: colors.surface },
1038
1077
  style
1039
1078
  ],
1040
1079
  onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width)
1041
1080
  },
1042
- /* @__PURE__ */ React25.createElement(Animated.View, { style: [StyleSheet.absoluteFill, { transform: [{ translateX }] }] }, /* @__PURE__ */ React25.createElement(
1081
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: [StyleSheet.absoluteFill, { transform: [{ translateX }] }] }, /* @__PURE__ */ React26.createElement(
1043
1082
  LinearGradient,
1044
1083
  {
1045
1084
  colors: ["transparent", shimmerHighlight, "transparent"],
@@ -1050,7 +1089,7 @@ function Skeleton({
1050
1089
  ))
1051
1090
  );
1052
1091
  }
1053
- var styles8 = StyleSheet.create({
1092
+ var styles9 = StyleSheet.create({
1054
1093
  base: {
1055
1094
  overflow: "hidden"
1056
1095
  }
@@ -1073,12 +1112,22 @@ var statusSizeMap = {
1073
1112
  lg: 13,
1074
1113
  xl: 16
1075
1114
  };
1076
- function Avatar({ src, fallback, size = "md", status, style }) {
1115
+ function getInitials(fallback, fallbackText) {
1116
+ if (fallback) return fallback.slice(0, 2).toUpperCase();
1117
+ if (fallbackText) {
1118
+ const words = fallbackText.trim().split(/\s+/);
1119
+ if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
1120
+ return (words[0][0] + words[words.length - 1][0]).toUpperCase();
1121
+ }
1122
+ return "?";
1123
+ }
1124
+ function Avatar({ src, fallback, fallbackText, size = "md", status, style }) {
1077
1125
  const { colors } = useTheme();
1078
1126
  const [imageError, setImageError] = useState(false);
1079
- const dimension = sizeMap3[size];
1127
+ const dimension = typeof size === "number" ? size : sizeMap3[size];
1128
+ const fontSize = typeof size === "number" ? size * 0.38 : fontSizeMap[size];
1080
1129
  const showFallback = !src || imageError;
1081
- const statusSize = statusSizeMap[size];
1130
+ const statusSize = typeof size === "number" ? size * 0.25 : statusSizeMap[size];
1082
1131
  const statusColor = {
1083
1132
  online: "#22c55e",
1084
1133
  offline: "transparent",
@@ -1092,25 +1141,25 @@ function Avatar({ src, fallback, size = "md", status, style }) {
1092
1141
  backgroundColor: colors.surface,
1093
1142
  overflow: "hidden"
1094
1143
  };
1095
- return /* @__PURE__ */ React25.createElement(View, { style: [styles9.wrapper, style] }, /* @__PURE__ */ React25.createElement(View, { style: [styles9.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React25.createElement(
1144
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles10.wrapper, style] }, /* @__PURE__ */ React26.createElement(View, { style: [styles10.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React26.createElement(
1096
1145
  Image,
1097
1146
  {
1098
1147
  source: { uri: src },
1099
1148
  style: { width: dimension, height: dimension },
1100
1149
  onError: () => setImageError(true)
1101
1150
  }
1102
- ) : /* @__PURE__ */ React25.createElement(
1151
+ ) : /* @__PURE__ */ React26.createElement(
1103
1152
  Text,
1104
1153
  {
1105
- style: [styles9.fallback, { color: colors.foregroundMuted, fontSize: fontSizeMap[size] }],
1154
+ style: [styles10.fallback, { color: colors.foregroundMuted, fontSize }],
1106
1155
  allowFontScaling: true
1107
1156
  },
1108
- fallback?.slice(0, 2).toUpperCase() ?? "?"
1109
- )), status && /* @__PURE__ */ React25.createElement(
1157
+ getInitials(fallback, fallbackText)
1158
+ )), status && /* @__PURE__ */ React26.createElement(
1110
1159
  View,
1111
1160
  {
1112
1161
  style: [
1113
- styles9.statusDot,
1162
+ styles10.statusDot,
1114
1163
  {
1115
1164
  width: statusSize,
1116
1165
  height: statusSize,
@@ -1123,7 +1172,7 @@ function Avatar({ src, fallback, size = "md", status, style }) {
1123
1172
  }
1124
1173
  ));
1125
1174
  }
1126
- var styles9 = StyleSheet.create({
1175
+ var styles10 = StyleSheet.create({
1127
1176
  wrapper: {
1128
1177
  alignSelf: "flex-start",
1129
1178
  position: "relative"
@@ -1148,11 +1197,11 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
1148
1197
  const accentColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : variant === "warning" ? colors.warning : colors.primary;
1149
1198
  const titleColor = variant === "default" ? colors.foreground : accentColor;
1150
1199
  const descColor = variant === "default" ? colors.foregroundMuted : accentColor;
1151
- const defaultIcon = variant === "success" ? /* @__PURE__ */ React25.createElement(FontAwesome5$1, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React25.createElement(MaterialIcons$1, { name: "error-outline", size: 17, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React25.createElement(MaterialIcons$1, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React25.createElement(Entypo$1, { name: "info-with-circle", size: 16, color: accentColor });
1200
+ const defaultIcon = variant === "success" ? /* @__PURE__ */ React26.createElement(FontAwesome5$1, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React26.createElement(MaterialIcons$1, { name: "error-outline", size: 17, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React26.createElement(MaterialIcons$1, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React26.createElement(Entypo$1, { name: "info-with-circle", size: 16, color: accentColor });
1152
1201
  const effectiveIcon = iconName ? renderIcon(iconName, 16, iconColor ?? accentColor) : icon ?? defaultIcon;
1153
- return /* @__PURE__ */ React25.createElement(View, { style: [styles10.container, { backgroundColor: bgColor, borderColor }, style] }, /* @__PURE__ */ React25.createElement(View, { style: styles10.iconSlot }, effectiveIcon), /* @__PURE__ */ React25.createElement(View, { style: styles10.content }, /* @__PURE__ */ React25.createElement(Text, { style: [styles10.title, { color: titleColor }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React25.createElement(Text, { style: [styles10.description, { color: descColor }], allowFontScaling: true }, description) : null));
1202
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles11.container, { backgroundColor: bgColor, borderColor }, style] }, /* @__PURE__ */ React26.createElement(View, { style: styles11.iconSlot }, effectiveIcon), /* @__PURE__ */ React26.createElement(View, { style: styles11.content }, /* @__PURE__ */ React26.createElement(Text, { style: [styles11.title, { color: titleColor }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26.createElement(Text, { style: [styles11.description, { color: descColor }], allowFontScaling: true }, description) : null));
1154
1203
  }
1155
- var styles10 = StyleSheet.create({
1204
+ var styles11 = StyleSheet.create({
1156
1205
  container: {
1157
1206
  flexDirection: "row",
1158
1207
  alignItems: "flex-start",
@@ -1196,21 +1245,21 @@ function Progress({ value = 0, max = 100, variant = "default", style }) {
1196
1245
  }).start();
1197
1246
  }, [percent, trackWidth]);
1198
1247
  const indicatorColor = variant === "success" ? colors.success : variant === "warning" ? colors.warning : variant === "destructive" ? colors.destructive : colors.primary;
1199
- return /* @__PURE__ */ React25.createElement(
1248
+ return /* @__PURE__ */ React26.createElement(
1200
1249
  View,
1201
1250
  {
1202
- style: [styles11.track, { backgroundColor: colors.surface }, style],
1251
+ style: [styles12.track, { backgroundColor: colors.surface }, style],
1203
1252
  onLayout: (e) => setTrackWidth(e.nativeEvent.layout.width)
1204
1253
  },
1205
- /* @__PURE__ */ React25.createElement(
1254
+ /* @__PURE__ */ React26.createElement(
1206
1255
  Animated.View,
1207
1256
  {
1208
- style: [styles11.indicator, { width: animatedWidth, backgroundColor: indicatorColor }]
1257
+ style: [styles12.indicator, { width: animatedWidth, backgroundColor: indicatorColor }]
1209
1258
  }
1210
1259
  )
1211
1260
  );
1212
1261
  }
1213
- var styles11 = StyleSheet.create({
1262
+ var styles12 = StyleSheet.create({
1214
1263
  track: {
1215
1264
  height: vs(8),
1216
1265
  borderRadius: 9999,
@@ -1226,39 +1275,39 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, siz
1226
1275
  const { colors } = useTheme();
1227
1276
  const isCompact = size === "compact";
1228
1277
  const effectiveIcon = iconName ? renderIcon(iconName, isCompact ? 32 : 48, iconColor ?? colors.foregroundMuted) : icon;
1229
- return /* @__PURE__ */ React25.createElement(
1278
+ return /* @__PURE__ */ React26.createElement(
1230
1279
  View,
1231
1280
  {
1232
1281
  style: [
1233
- styles12.container,
1234
- isCompact && styles12.containerCompact,
1282
+ styles13.container,
1283
+ isCompact && styles13.containerCompact,
1235
1284
  { borderColor: colors.border },
1236
1285
  style
1237
1286
  ]
1238
1287
  },
1239
- effectiveIcon ? /* @__PURE__ */ React25.createElement(
1288
+ effectiveIcon ? /* @__PURE__ */ React26.createElement(
1240
1289
  View,
1241
1290
  {
1242
1291
  style: [
1243
- styles12.iconWrapper,
1244
- isCompact && styles12.iconWrapperCompact,
1292
+ styles13.iconWrapper,
1293
+ isCompact && styles13.iconWrapperCompact,
1245
1294
  { backgroundColor: colors.surface }
1246
1295
  ]
1247
1296
  },
1248
1297
  effectiveIcon
1249
1298
  ) : null,
1250
- /* @__PURE__ */ React25.createElement(View, { style: styles12.textWrapper }, /* @__PURE__ */ React25.createElement(
1299
+ /* @__PURE__ */ React26.createElement(View, { style: styles13.textWrapper }, /* @__PURE__ */ React26.createElement(
1251
1300
  Text,
1252
1301
  {
1253
- style: [styles12.title, isCompact && styles12.titleCompact, { color: colors.foreground }],
1302
+ style: [styles13.title, isCompact && styles13.titleCompact, { color: colors.foreground }],
1254
1303
  allowFontScaling: true
1255
1304
  },
1256
1305
  title
1257
- ), description && !isCompact ? /* @__PURE__ */ React25.createElement(Text, { style: [styles12.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null),
1258
- action && !isCompact ? /* @__PURE__ */ React25.createElement(View, { style: styles12.action }, action) : null
1306
+ ), description && !isCompact ? /* @__PURE__ */ React26.createElement(Text, { style: [styles13.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null),
1307
+ action && !isCompact ? /* @__PURE__ */ React26.createElement(View, { style: styles13.action }, action) : null
1259
1308
  );
1260
1309
  }
1261
- var styles12 = StyleSheet.create({
1310
+ var styles13 = StyleSheet.create({
1262
1311
  container: {
1263
1312
  alignItems: "center",
1264
1313
  justifyContent: "center",
@@ -1313,6 +1362,9 @@ function Textarea({
1313
1362
  error,
1314
1363
  hint,
1315
1364
  rows = 4,
1365
+ prefixIcon,
1366
+ prefixIconNode,
1367
+ prefixIconColor,
1316
1368
  containerStyle,
1317
1369
  style,
1318
1370
  onFocus,
@@ -1321,57 +1373,83 @@ function Textarea({
1321
1373
  }) {
1322
1374
  const { colors } = useTheme();
1323
1375
  const [focused, setFocused] = useState(false);
1324
- return /* @__PURE__ */ React25.createElement(View, { style: [styles13.container, containerStyle] }, label ? /* @__PURE__ */ React25.createElement(Text, { style: [styles13.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React25.createElement(
1325
- TextInput,
1376
+ const resolvedPrefixIcon = prefixIcon ? renderIcon(prefixIcon, ms(16), prefixIconColor ?? colors.foregroundMuted) : prefixIconNode;
1377
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles14.container, containerStyle] }, label ? /* @__PURE__ */ React26.createElement(Text, { style: [styles14.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React26.createElement(
1378
+ View,
1326
1379
  {
1327
- multiline: true,
1328
- numberOfLines: rows,
1329
- textAlignVertical: "top",
1330
1380
  style: [
1331
- styles13.input,
1381
+ styles14.inputWrapper,
1332
1382
  {
1333
1383
  borderColor: error ? colors.destructive : focused ? colors.ring ?? colors.primary : colors.border,
1334
- color: colors.foreground,
1335
- backgroundColor: colors.background,
1336
- minHeight: rows * vs(30)
1384
+ backgroundColor: colors.background
1385
+ }
1386
+ ]
1387
+ },
1388
+ resolvedPrefixIcon ? /* @__PURE__ */ React26.createElement(View, { style: styles14.prefixIcon }, resolvedPrefixIcon) : null,
1389
+ /* @__PURE__ */ React26.createElement(
1390
+ TextInput,
1391
+ {
1392
+ multiline: true,
1393
+ numberOfLines: rows,
1394
+ textAlignVertical: "top",
1395
+ style: [
1396
+ styles14.input,
1397
+ {
1398
+ color: colors.foreground,
1399
+ minHeight: rows * vs(30)
1400
+ },
1401
+ webInputResetStyle2,
1402
+ style
1403
+ ],
1404
+ onFocus: (e) => {
1405
+ setFocused(true);
1406
+ onFocus?.(e);
1337
1407
  },
1338
- webInputResetStyle2,
1339
- style
1340
- ],
1341
- onFocus: (e) => {
1342
- setFocused(true);
1343
- onFocus?.(e);
1344
- },
1345
- onBlur: (e) => {
1346
- setFocused(false);
1347
- onBlur?.(e);
1348
- },
1349
- placeholderTextColor: colors.foregroundMuted,
1350
- allowFontScaling: true,
1351
- ...props
1352
- }
1353
- ), error ? /* @__PURE__ */ React25.createElement(Text, { style: [styles13.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React25.createElement(Text, { style: [styles13.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
1408
+ onBlur: (e) => {
1409
+ setFocused(false);
1410
+ onBlur?.(e);
1411
+ },
1412
+ placeholderTextColor: colors.foregroundMuted,
1413
+ allowFontScaling: true,
1414
+ ...props
1415
+ }
1416
+ )
1417
+ ), error ? /* @__PURE__ */ React26.createElement(Text, { style: [styles14.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React26.createElement(Text, { style: [styles14.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
1354
1418
  }
1355
- var styles13 = StyleSheet.create({
1419
+ var styles14 = StyleSheet.create({
1356
1420
  container: {
1357
- gap: vs(8)
1421
+ gap: vs(4)
1358
1422
  },
1359
1423
  label: {
1360
1424
  fontFamily: "Poppins-Medium",
1361
- fontSize: ms(13)
1425
+ fontSize: ms(13),
1426
+ lineHeight: vs(18),
1427
+ marginBottom: vs(2)
1362
1428
  },
1363
- input: {
1364
- fontFamily: "Poppins-Regular",
1365
- borderWidth: 2,
1366
- borderRadius: ms(8),
1429
+ inputWrapper: {
1430
+ borderWidth: 1,
1431
+ borderRadius: 8,
1367
1432
  paddingHorizontal: s(14),
1368
1433
  paddingVertical: vs(11),
1369
- fontSize: ms(15),
1370
- includeFontPadding: false
1434
+ gap: s(8)
1435
+ },
1436
+ prefixIcon: {
1437
+ alignItems: "flex-start",
1438
+ justifyContent: "flex-start",
1439
+ paddingTop: vs(2)
1440
+ },
1441
+ input: {
1442
+ fontFamily: "Poppins-Regular",
1443
+ fontSize: ms(14),
1444
+ lineHeight: vs(22),
1445
+ padding: 0,
1446
+ margin: 0
1371
1447
  },
1372
1448
  helperText: {
1373
1449
  fontFamily: "Poppins-Regular",
1374
- fontSize: ms(13)
1450
+ fontSize: ms(12),
1451
+ lineHeight: vs(16),
1452
+ marginTop: vs(4)
1375
1453
  }
1376
1454
  });
1377
1455
  var nativeDriver4 = Platform.OS !== "web";
@@ -1415,10 +1493,10 @@ function Checkbox({
1415
1493
  const handlePressOut = () => {
1416
1494
  Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver4, speed: 40, bounciness: 0 }).start();
1417
1495
  };
1418
- return /* @__PURE__ */ React25.createElement(
1496
+ return /* @__PURE__ */ React26.createElement(
1419
1497
  TouchableOpacity,
1420
1498
  {
1421
- style: [styles14.row, style],
1499
+ style: [styles15.row, style],
1422
1500
  onPress: () => {
1423
1501
  selectionAsync();
1424
1502
  onCheckedChange?.(!checked);
@@ -1429,11 +1507,11 @@ function Checkbox({
1429
1507
  activeOpacity: 1,
1430
1508
  touchSoundDisabled: true
1431
1509
  },
1432
- /* @__PURE__ */ React25.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25.createElement(
1510
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26.createElement(
1433
1511
  Animated.View,
1434
1512
  {
1435
1513
  style: [
1436
- styles14.box,
1514
+ styles15.box,
1437
1515
  {
1438
1516
  borderColor,
1439
1517
  backgroundColor,
@@ -1441,19 +1519,19 @@ function Checkbox({
1441
1519
  }
1442
1520
  ]
1443
1521
  },
1444
- /* @__PURE__ */ React25.createElement(Animated.View, { style: { opacity: checkOpacity } }, /* @__PURE__ */ React25.createElement(View, { style: [styles14.checkmark, { borderColor: colors.primaryForeground }] }))
1522
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: { opacity: checkOpacity } }, /* @__PURE__ */ React26.createElement(View, { style: [styles15.checkmark, { borderColor: colors.primaryForeground }] }))
1445
1523
  )),
1446
- label ? /* @__PURE__ */ React25.createElement(
1524
+ label ? /* @__PURE__ */ React26.createElement(
1447
1525
  Text,
1448
1526
  {
1449
- style: [styles14.label, { color: disabled ? colors.foregroundMuted : colors.foreground }],
1527
+ style: [styles15.label, { color: disabled ? colors.foregroundMuted : colors.foreground }],
1450
1528
  allowFontScaling: true
1451
1529
  },
1452
1530
  label
1453
1531
  ) : null
1454
1532
  );
1455
1533
  }
1456
- var styles14 = StyleSheet.create({
1534
+ var styles15 = StyleSheet.create({
1457
1535
  row: {
1458
1536
  flexDirection: "row",
1459
1537
  alignItems: "center",
@@ -1521,7 +1599,7 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
1521
1599
  inputRange: [0, 1],
1522
1600
  outputRange: [colors.surface, colors.primary]
1523
1601
  });
1524
- return /* @__PURE__ */ React25.createElement(View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React25.createElement(
1602
+ return /* @__PURE__ */ React26.createElement(View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React26.createElement(
1525
1603
  TouchableOpacity,
1526
1604
  {
1527
1605
  onPress: () => {
@@ -1531,22 +1609,22 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
1531
1609
  disabled,
1532
1610
  activeOpacity: 0.8,
1533
1611
  touchSoundDisabled: true,
1534
- style: styles15.wrapper
1612
+ style: styles16.wrapper
1535
1613
  },
1536
- /* @__PURE__ */ React25.createElement(Animated.View, { style: [styles15.track, { backgroundColor: trackColor }] }, /* @__PURE__ */ React25.createElement(
1614
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: [styles16.track, { backgroundColor: trackColor }] }, /* @__PURE__ */ React26.createElement(
1537
1615
  Animated.View,
1538
1616
  {
1539
1617
  style: [
1540
- styles15.thumb,
1618
+ styles16.thumb,
1541
1619
  { backgroundColor: colors.primaryForeground, transform: [{ translateX }] }
1542
1620
  ]
1543
1621
  },
1544
- /* @__PURE__ */ React25.createElement(Animated.View, { style: [styles15.iconWrapper, { opacity: checkOpacity }] }, /* @__PURE__ */ React25.createElement(Feather$1, { name: "check", size: ICON_SIZE, color: colors.primary })),
1545
- /* @__PURE__ */ React25.createElement(Animated.View, { style: [styles15.iconWrapper, { opacity: crossOpacity }] }, /* @__PURE__ */ React25.createElement(Feather$1, { name: "x", size: ICON_SIZE, color: colors.foregroundMuted }))
1622
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: [styles16.iconWrapper, { opacity: checkOpacity }] }, /* @__PURE__ */ React26.createElement(Feather$1, { name: "check", size: ICON_SIZE, color: colors.primary })),
1623
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: [styles16.iconWrapper, { opacity: crossOpacity }] }, /* @__PURE__ */ React26.createElement(Feather$1, { name: "x", size: ICON_SIZE, color: colors.foregroundMuted }))
1546
1624
  ))
1547
1625
  ));
1548
1626
  }
1549
- var styles15 = StyleSheet.create({
1627
+ var styles16 = StyleSheet.create({
1550
1628
  wrapper: {},
1551
1629
  track: {
1552
1630
  width: TRACK_WIDTH,
@@ -1635,17 +1713,17 @@ function Toggle({
1635
1713
  return prop;
1636
1714
  };
1637
1715
  if (pressed) {
1638
- if (activeIconName) return /* @__PURE__ */ React25.createElement(React25.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? colors.primary));
1716
+ if (activeIconName) return /* @__PURE__ */ React26.createElement(React26.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? colors.primary));
1639
1717
  const active = renderProp(activeIcon);
1640
- if (active) return /* @__PURE__ */ React25.createElement(React25.Fragment, null, active);
1641
- return /* @__PURE__ */ React25.createElement(FontAwesome5$1, { name: "check-circle", size: iconSize, color: colors.primary });
1718
+ if (active) return /* @__PURE__ */ React26.createElement(React26.Fragment, null, active);
1719
+ return /* @__PURE__ */ React26.createElement(FontAwesome5$1, { name: "check-circle", size: iconSize, color: colors.primary });
1642
1720
  }
1643
- if (iconName) return /* @__PURE__ */ React25.createElement(React25.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? colors.foregroundMuted));
1721
+ if (iconName) return /* @__PURE__ */ React26.createElement(React26.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? colors.foregroundMuted));
1644
1722
  const custom = renderProp(icon);
1645
- if (custom) return /* @__PURE__ */ React25.createElement(React25.Fragment, null, custom);
1646
- return /* @__PURE__ */ React25.createElement(FontAwesome5$1, { name: "circle", size: iconSize, color: colors.foregroundMuted });
1723
+ if (custom) return /* @__PURE__ */ React26.createElement(React26.Fragment, null, custom);
1724
+ return /* @__PURE__ */ React26.createElement(FontAwesome5$1, { name: "circle", size: iconSize, color: colors.foregroundMuted });
1647
1725
  };
1648
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles16.disabled, style] }, /* @__PURE__ */ React25.createElement(
1726
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles17.disabled, style] }, /* @__PURE__ */ React26.createElement(
1649
1727
  TouchableOpacity,
1650
1728
  {
1651
1729
  onPress: () => {
@@ -1659,20 +1737,20 @@ function Toggle({
1659
1737
  touchSoundDisabled: true,
1660
1738
  ...props
1661
1739
  },
1662
- /* @__PURE__ */ React25.createElement(
1740
+ /* @__PURE__ */ React26.createElement(
1663
1741
  Animated.View,
1664
1742
  {
1665
1743
  style: [
1666
- styles16.base,
1744
+ styles17.base,
1667
1745
  sizeStyles[size],
1668
1746
  { borderColor, backgroundColor, borderWidth: 2 }
1669
1747
  ]
1670
1748
  },
1671
- /* @__PURE__ */ React25.createElement(View, { style: styles16.inner }, /* @__PURE__ */ React25.createElement(LeftIcon, null), label ? /* @__PURE__ */ React25.createElement(Animated.Text, { style: [styles16.label, { color: textColor }], allowFontScaling: true }, label) : null)
1749
+ /* @__PURE__ */ React26.createElement(View, { style: styles17.inner }, /* @__PURE__ */ React26.createElement(LeftIcon, null), label ? /* @__PURE__ */ React26.createElement(Animated.Text, { style: [styles17.label, { color: textColor }], allowFontScaling: true }, label) : null)
1672
1750
  )
1673
1751
  ));
1674
1752
  }
1675
- var styles16 = StyleSheet.create({
1753
+ var styles17 = StyleSheet.create({
1676
1754
  base: {
1677
1755
  borderRadius: ms(8)
1678
1756
  },
@@ -1705,10 +1783,10 @@ function RadioItem({
1705
1783
  const handlePressOut = () => {
1706
1784
  Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver7, speed: 40, bounciness: 4 }).start();
1707
1785
  };
1708
- return /* @__PURE__ */ React25.createElement(
1786
+ return /* @__PURE__ */ React26.createElement(
1709
1787
  TouchableOpacity,
1710
1788
  {
1711
- style: styles17.row,
1789
+ style: styles18.row,
1712
1790
  onPress: () => {
1713
1791
  if (!option.disabled) {
1714
1792
  selectionAsync();
@@ -1721,11 +1799,11 @@ function RadioItem({
1721
1799
  touchSoundDisabled: true,
1722
1800
  disabled: option.disabled
1723
1801
  },
1724
- /* @__PURE__ */ React25.createElement(
1802
+ /* @__PURE__ */ React26.createElement(
1725
1803
  Animated.View,
1726
1804
  {
1727
1805
  style: [
1728
- styles17.radio,
1806
+ styles18.radio,
1729
1807
  {
1730
1808
  borderColor: selected ? colors.primary : colors.border,
1731
1809
  opacity: option.disabled ? 0.45 : 1,
@@ -1733,13 +1811,13 @@ function RadioItem({
1733
1811
  }
1734
1812
  ]
1735
1813
  },
1736
- selected ? /* @__PURE__ */ React25.createElement(View, { style: [styles17.dot, { backgroundColor: colors.primary }] }) : null
1814
+ selected ? /* @__PURE__ */ React26.createElement(View, { style: [styles18.dot, { backgroundColor: colors.primary }] }) : null
1737
1815
  ),
1738
- /* @__PURE__ */ React25.createElement(
1816
+ /* @__PURE__ */ React26.createElement(
1739
1817
  Text,
1740
1818
  {
1741
1819
  style: [
1742
- styles17.label,
1820
+ styles18.label,
1743
1821
  { color: option.disabled ? colors.foregroundMuted : colors.foreground }
1744
1822
  ],
1745
1823
  allowFontScaling: true
@@ -1755,7 +1833,7 @@ function RadioGroup({
1755
1833
  orientation = "vertical",
1756
1834
  style
1757
1835
  }) {
1758
- return /* @__PURE__ */ React25.createElement(View, { style: [styles17.container, orientation === "horizontal" && styles17.horizontal, style] }, options.map((option) => /* @__PURE__ */ React25.createElement(
1836
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles18.container, orientation === "horizontal" && styles18.horizontal, style] }, options.map((option) => /* @__PURE__ */ React26.createElement(
1759
1837
  RadioItem,
1760
1838
  {
1761
1839
  key: option.value,
@@ -1765,7 +1843,7 @@ function RadioGroup({
1765
1843
  }
1766
1844
  )));
1767
1845
  }
1768
- var styles17 = StyleSheet.create({
1846
+ var styles18 = StyleSheet.create({
1769
1847
  container: {
1770
1848
  gap: vs(12)
1771
1849
  },
@@ -1814,12 +1892,12 @@ function TabTrigger({
1814
1892
  Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver8, speed: 40, bounciness: 4 }).start();
1815
1893
  };
1816
1894
  const isUnderline = variant === "underline";
1817
- return /* @__PURE__ */ React25.createElement(
1895
+ return /* @__PURE__ */ React26.createElement(
1818
1896
  TouchableOpacity,
1819
1897
  {
1820
1898
  style: [
1821
- styles18.trigger,
1822
- isUnderline && styles18.triggerUnderline,
1899
+ styles19.trigger,
1900
+ isUnderline && styles19.triggerUnderline,
1823
1901
  isUnderline && isActive && { borderBottomColor: colors.primary }
1824
1902
  ],
1825
1903
  onPress,
@@ -1829,13 +1907,13 @@ function TabTrigger({
1829
1907
  activeOpacity: 1,
1830
1908
  touchSoundDisabled: true
1831
1909
  },
1832
- /* @__PURE__ */ React25.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25.createElement(View, { style: styles18.triggerInner }, tab.icon ? typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon : null, /* @__PURE__ */ React25.createElement(
1910
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26.createElement(View, { style: styles19.triggerInner }, tab.icon ? typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon : null, /* @__PURE__ */ React26.createElement(
1833
1911
  Text,
1834
1912
  {
1835
1913
  style: [
1836
- styles18.triggerLabel,
1914
+ styles19.triggerLabel,
1837
1915
  { color: isActive ? colors.foreground : colors.foregroundMuted },
1838
- isActive && (isUnderline ? styles18.activeTriggerLabelUnderline : styles18.activeTriggerLabel)
1916
+ isActive && (isUnderline ? styles19.activeTriggerLabelUnderline : styles19.activeTriggerLabel)
1839
1917
  ],
1840
1918
  allowFontScaling: true
1841
1919
  },
@@ -1872,13 +1950,13 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
1872
1950
  if (!value) setInternal(v);
1873
1951
  onValueChange?.(v);
1874
1952
  };
1875
- return /* @__PURE__ */ React25.createElement(View, { style }, /* @__PURE__ */ React25.createElement(View, { style: [
1876
- variant === "pill" ? [styles18.list, { backgroundColor: colors.surface }] : styles18.listUnderline
1877
- ] }, variant === "pill" && /* @__PURE__ */ React25.createElement(
1953
+ return /* @__PURE__ */ React26.createElement(View, { style }, /* @__PURE__ */ React26.createElement(View, { style: [
1954
+ variant === "pill" ? [styles19.list, { backgroundColor: colors.surface }] : styles19.listUnderline
1955
+ ] }, variant === "pill" && /* @__PURE__ */ React26.createElement(
1878
1956
  Animated.View,
1879
1957
  {
1880
1958
  style: [
1881
- styles18.pill,
1959
+ styles19.pill,
1882
1960
  {
1883
1961
  backgroundColor: colors.background,
1884
1962
  position: "absolute",
@@ -1895,7 +1973,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
1895
1973
  }
1896
1974
  ]
1897
1975
  }
1898
- ), tabs.map((tab) => /* @__PURE__ */ React25.createElement(
1976
+ ), tabs.map((tab) => /* @__PURE__ */ React26.createElement(
1899
1977
  TabTrigger,
1900
1978
  {
1901
1979
  key: tab.value,
@@ -1916,9 +1994,9 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
1916
1994
  }
1917
1995
  function TabsContent({ value, activeValue, children, style }) {
1918
1996
  if (value !== activeValue) return null;
1919
- return /* @__PURE__ */ React25.createElement(View, { style }, children);
1997
+ return /* @__PURE__ */ React26.createElement(View, { style }, children);
1920
1998
  }
1921
- var styles18 = StyleSheet.create({
1999
+ var styles19 = StyleSheet.create({
1922
2000
  list: {
1923
2001
  flexDirection: "row",
1924
2002
  borderRadius: 12,
@@ -1971,9 +2049,10 @@ function AccordionItemComponent({
1971
2049
  onToggle
1972
2050
  }) {
1973
2051
  const { colors } = useTheme();
2052
+ const resolvedIcon = item.iconName ? renderIcon(item.iconName, ms(16), item.iconColor ?? colors.foregroundMuted) : item.icon;
1974
2053
  const isExpanded = useSharedValue(isOpen);
1975
2054
  const height = useSharedValue(0);
1976
- React25.useEffect(() => {
2055
+ React26.useEffect(() => {
1977
2056
  isExpanded.value = isOpen;
1978
2057
  }, [isOpen]);
1979
2058
  const derivedHeight = useDerivedValue(
@@ -1995,21 +2074,21 @@ function AccordionItemComponent({
1995
2074
  const rotationStyle = useAnimatedStyle(() => ({
1996
2075
  transform: [{ rotate: `${derivedRotation.value * 180}deg` }]
1997
2076
  }));
1998
- return /* @__PURE__ */ React25.createElement(View, { style: [styles19.item, { backgroundColor: colors.card, borderColor: colors.border }] }, /* @__PURE__ */ React25.createElement(
2077
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles20.item, { backgroundColor: colors.card, borderColor: colors.border }] }, /* @__PURE__ */ React26.createElement(
1999
2078
  Pressable,
2000
2079
  {
2001
- style: ({ pressed }) => [styles19.trigger, { opacity: pressed ? 0.6 : 1 }],
2080
+ style: ({ pressed }) => [styles20.trigger, { opacity: pressed ? 0.6 : 1 }],
2002
2081
  onPress: () => {
2003
2082
  selectionAsync();
2004
2083
  onToggle();
2005
2084
  }
2006
2085
  },
2007
- /* @__PURE__ */ React25.createElement(Text, { style: [styles19.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger),
2008
- /* @__PURE__ */ React25.createElement(Animated11.View, { style: [styles19.chevron, rotationStyle] }, /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
2009
- ), /* @__PURE__ */ React25.createElement(Animated11.View, { style: bodyStyle }, /* @__PURE__ */ React25.createElement(
2086
+ /* @__PURE__ */ React26.createElement(View, { style: styles20.triggerContent }, resolvedIcon ? /* @__PURE__ */ React26.createElement(View, { style: styles20.icon }, resolvedIcon) : null, /* @__PURE__ */ React26.createElement(Text, { style: [styles20.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger)),
2087
+ /* @__PURE__ */ React26.createElement(Animated11.View, { style: [styles20.chevron, rotationStyle] }, /* @__PURE__ */ React26.createElement(Entypo$1, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
2088
+ ), /* @__PURE__ */ React26.createElement(Animated11.View, { style: bodyStyle }, /* @__PURE__ */ React26.createElement(
2010
2089
  View,
2011
2090
  {
2012
- style: styles19.content,
2091
+ style: styles20.content,
2013
2092
  onLayout: (e) => {
2014
2093
  height.value = e.nativeEvent.layout.height;
2015
2094
  }
@@ -2031,7 +2110,7 @@ function Accordion({ items, type = "single", defaultValue, style }) {
2031
2110
  );
2032
2111
  }
2033
2112
  };
2034
- return /* @__PURE__ */ React25.createElement(View, { style: [styles19.list, style] }, items.map((item) => /* @__PURE__ */ React25.createElement(
2113
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles20.list, style] }, items.map((item) => /* @__PURE__ */ React26.createElement(
2035
2114
  AccordionItemComponent,
2036
2115
  {
2037
2116
  key: item.value,
@@ -2041,7 +2120,7 @@ function Accordion({ items, type = "single", defaultValue, style }) {
2041
2120
  }
2042
2121
  )));
2043
2122
  }
2044
- var styles19 = StyleSheet.create({
2123
+ var styles20 = StyleSheet.create({
2045
2124
  list: {
2046
2125
  gap: s(6)
2047
2126
  },
@@ -2057,10 +2136,19 @@ var styles19 = StyleSheet.create({
2057
2136
  paddingHorizontal: s(14),
2058
2137
  paddingVertical: vs(12)
2059
2138
  },
2139
+ triggerContent: {
2140
+ flexDirection: "row",
2141
+ alignItems: "center",
2142
+ gap: s(8),
2143
+ flex: 1
2144
+ },
2145
+ icon: {
2146
+ alignItems: "center",
2147
+ justifyContent: "center"
2148
+ },
2060
2149
  triggerText: {
2061
2150
  fontFamily: "Poppins-Medium",
2062
- fontSize: ms(14),
2063
- flex: 1
2151
+ fontSize: ms(14)
2064
2152
  },
2065
2153
  chevron: {
2066
2154
  marginLeft: s(8)
@@ -2097,7 +2185,7 @@ function Slider({
2097
2185
  }
2098
2186
  onValueChange?.(v);
2099
2187
  };
2100
- return /* @__PURE__ */ React25.createElement(View, { style: [styles20.wrapper, style], accessibilityLabel }, label || showValue ? /* @__PURE__ */ React25.createElement(View, { style: styles20.header }, label ? /* @__PURE__ */ React25.createElement(Text, { style: [styles20.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React25.createElement(Text, { style: [styles20.valueText, { color: colors.foregroundMuted }], allowFontScaling: true }, formatValue2(value)) : null) : null, /* @__PURE__ */ React25.createElement(View, { style: disabled ? styles20.disabled : void 0 }, /* @__PURE__ */ React25.createElement(
2188
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles21.wrapper, style], accessibilityLabel }, label || showValue ? /* @__PURE__ */ React26.createElement(View, { style: styles21.header }, label ? /* @__PURE__ */ React26.createElement(Text, { style: [styles21.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React26.createElement(Text, { style: [styles21.valueText, { color: colors.foregroundMuted }], allowFontScaling: true }, formatValue2(value)) : null) : null, /* @__PURE__ */ React26.createElement(View, { style: disabled ? styles21.disabled : void 0 }, /* @__PURE__ */ React26.createElement(
2101
2189
  RNSlider,
2102
2190
  {
2103
2191
  value,
@@ -2110,12 +2198,12 @@ function Slider({
2110
2198
  minimumTrackTintColor: colors.primary,
2111
2199
  maximumTrackTintColor: colors.surface,
2112
2200
  thumbTintColor: colors.primary,
2113
- style: styles20.slider,
2201
+ style: styles21.slider,
2114
2202
  accessibilityLabel
2115
2203
  }
2116
2204
  )));
2117
2205
  }
2118
- var styles20 = StyleSheet.create({
2206
+ var styles21 = StyleSheet.create({
2119
2207
  wrapper: {
2120
2208
  gap: vs(8)
2121
2209
  },
@@ -2146,7 +2234,11 @@ function Sheet({
2146
2234
  title,
2147
2235
  description,
2148
2236
  children,
2149
- style
2237
+ style,
2238
+ scrollable,
2239
+ maxHeight,
2240
+ keyboardBehavior,
2241
+ keyboardOffset = 0
2150
2242
  }) {
2151
2243
  const { colors } = useTheme();
2152
2244
  const ref = useRef(null);
@@ -2158,7 +2250,7 @@ function Sheet({
2158
2250
  ref.current?.dismiss();
2159
2251
  }
2160
2252
  }, [open]);
2161
- const renderBackdrop = (props) => /* @__PURE__ */ React25.createElement(
2253
+ const renderBackdrop = (props) => /* @__PURE__ */ React26.createElement(
2162
2254
  BottomSheetBackdrop,
2163
2255
  {
2164
2256
  ...props,
@@ -2167,21 +2259,28 @@ function Sheet({
2167
2259
  pressBehavior: "close"
2168
2260
  }
2169
2261
  );
2170
- return /* @__PURE__ */ React25.createElement(
2262
+ const headerNode = title || description ? /* @__PURE__ */ React26.createElement(View, { style: styles22.header }, title ? /* @__PURE__ */ React26.createElement(Text, { style: [styles22.title, { color: colors.foreground }], allowFontScaling: true }, title) : null, description ? /* @__PURE__ */ React26.createElement(Text, { style: [styles22.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null;
2263
+ const useScroll = scrollable || !!maxHeight;
2264
+ const wrapKeyboard = (node) => {
2265
+ if (!keyboardBehavior || keyboardBehavior === "none") return node;
2266
+ const behavior = keyboardBehavior ?? Platform.select({ ios: "padding", android: "height" });
2267
+ return /* @__PURE__ */ React26.createElement(KeyboardAvoidingView, { behavior, keyboardVerticalOffset: keyboardOffset }, node);
2268
+ };
2269
+ return /* @__PURE__ */ React26.createElement(
2171
2270
  BottomSheetModal,
2172
2271
  {
2173
2272
  ref,
2174
2273
  enableDynamicSizing: true,
2175
2274
  onDismiss: onClose,
2176
2275
  backdropComponent: renderBackdrop,
2177
- backgroundStyle: [styles21.background, { backgroundColor: colors.card }],
2178
- handleIndicatorStyle: [styles21.handle, { backgroundColor: colors.border }],
2276
+ backgroundStyle: [styles22.background, { backgroundColor: colors.card }],
2277
+ handleIndicatorStyle: [styles22.handle, { backgroundColor: colors.border }],
2179
2278
  enablePanDownToClose: true
2180
2279
  },
2181
- /* @__PURE__ */ React25.createElement(BottomSheetView, { style: [styles21.content, style] }, title || description ? /* @__PURE__ */ React25.createElement(View, { style: styles21.header }, title ? /* @__PURE__ */ React25.createElement(Text, { style: [styles21.title, { color: colors.foreground }], allowFontScaling: true }, title) : null, description ? /* @__PURE__ */ React25.createElement(Text, { style: [styles21.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null, children)
2280
+ /* @__PURE__ */ React26.createElement(BottomSheetView, { style: maxHeight ? { maxHeight } : void 0 }, wrapKeyboard(useScroll ? /* @__PURE__ */ React26.createElement(BottomSheetScrollView, { contentContainerStyle: [styles22.content, style] }, headerNode, children) : /* @__PURE__ */ React26.createElement(BottomSheetView, { style: [styles22.content, style] }, headerNode, children)))
2182
2281
  );
2183
2282
  }
2184
- var styles21 = StyleSheet.create({
2283
+ var styles22 = StyleSheet.create({
2185
2284
  background: {
2186
2285
  borderTopLeftRadius: ms(16),
2187
2286
  borderTopRightRadius: ms(16)
@@ -2256,11 +2355,11 @@ function Select({
2256
2355
  }
2257
2356
  setPickerVisible(false);
2258
2357
  };
2259
- return /* @__PURE__ */ React25.createElement(View, { style: [styles22.container, style] }, label ? /* @__PURE__ */ React25.createElement(Text, { style: [styles22.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, !isWeb2 ? /* @__PURE__ */ React25.createElement(Animated.View, { style: { transform: [{ scale: scale2 }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React25.createElement(
2358
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles23.container, style] }, label ? /* @__PURE__ */ React26.createElement(Text, { style: [styles23.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, !isWeb2 ? /* @__PURE__ */ React26.createElement(Animated.View, { style: { transform: [{ scale: scale2 }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React26.createElement(
2260
2359
  TouchableOpacity,
2261
2360
  {
2262
2361
  style: [
2263
- styles22.trigger,
2362
+ styles23.trigger,
2264
2363
  {
2265
2364
  borderColor: error ? colors.destructive : colors.border,
2266
2365
  backgroundColor: colors.background
@@ -2272,11 +2371,11 @@ function Select({
2272
2371
  activeOpacity: 1,
2273
2372
  touchSoundDisabled: true
2274
2373
  },
2275
- /* @__PURE__ */ React25.createElement(
2374
+ /* @__PURE__ */ React26.createElement(
2276
2375
  Text,
2277
2376
  {
2278
2377
  style: [
2279
- styles22.triggerText,
2378
+ styles23.triggerText,
2280
2379
  { color: selected ? colors.foreground : colors.foregroundMuted }
2281
2380
  ],
2282
2381
  numberOfLines: 1,
@@ -2284,8 +2383,8 @@ function Select({
2284
2383
  },
2285
2384
  selected?.label ?? placeholder
2286
2385
  ),
2287
- /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-with-circle-down", size: 20, color: colors.foregroundMuted })
2288
- )) : null, isIOS ? /* @__PURE__ */ React25.createElement(
2386
+ /* @__PURE__ */ React26.createElement(Entypo$1, { name: "chevron-with-circle-down", size: 20, color: colors.foregroundMuted })
2387
+ )) : null, isIOS ? /* @__PURE__ */ React26.createElement(
2289
2388
  Modal,
2290
2389
  {
2291
2390
  visible: pickerVisible,
@@ -2293,16 +2392,16 @@ function Select({
2293
2392
  animationType: "slide",
2294
2393
  onRequestClose: handleDismiss
2295
2394
  },
2296
- /* @__PURE__ */ React25.createElement(TouchableOpacity, { style: styles22.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
2297
- /* @__PURE__ */ React25.createElement(View, { style: [styles22.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React25.createElement(View, { style: [styles22.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React25.createElement(Text, { style: [styles22.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React25.createElement(View, null), /* @__PURE__ */ React25.createElement(TouchableOpacity, { onPress: handleConfirm, style: styles22.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React25.createElement(Text, { style: [styles22.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React25.createElement(
2395
+ /* @__PURE__ */ React26.createElement(TouchableOpacity, { style: styles23.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
2396
+ /* @__PURE__ */ React26.createElement(View, { style: [styles23.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React26.createElement(View, { style: [styles23.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React26.createElement(Text, { style: [styles23.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React26.createElement(View, null), /* @__PURE__ */ React26.createElement(TouchableOpacity, { onPress: handleConfirm, style: styles23.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React26.createElement(Text, { style: [styles23.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React26.createElement(
2298
2397
  Picker,
2299
2398
  {
2300
2399
  selectedValue: pendingValue ?? "",
2301
2400
  onValueChange: (val) => setPendingValue(val),
2302
2401
  itemStyle: { color: colors.foreground }
2303
2402
  },
2304
- !value ? /* @__PURE__ */ React25.createElement(Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
2305
- options.map((o) => /* @__PURE__ */ React25.createElement(
2403
+ !value ? /* @__PURE__ */ React26.createElement(Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
2404
+ options.map((o) => /* @__PURE__ */ React26.createElement(
2306
2405
  Picker.Item,
2307
2406
  {
2308
2407
  key: o.value,
@@ -2313,7 +2412,7 @@ function Select({
2313
2412
  }
2314
2413
  ))
2315
2414
  ))
2316
- ) : null, isAndroid ? /* @__PURE__ */ React25.createElement(
2415
+ ) : null, isAndroid ? /* @__PURE__ */ React26.createElement(
2317
2416
  Picker,
2318
2417
  {
2319
2418
  ref: pickerRef,
@@ -2327,10 +2426,10 @@ function Select({
2327
2426
  mode: "dialog",
2328
2427
  enabled: !disabled,
2329
2428
  prompt: label,
2330
- style: styles22.androidHiddenPicker
2429
+ style: styles23.androidHiddenPicker
2331
2430
  },
2332
- !value ? /* @__PURE__ */ React25.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
2333
- options.map((o) => /* @__PURE__ */ React25.createElement(
2431
+ !value ? /* @__PURE__ */ React26.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
2432
+ options.map((o) => /* @__PURE__ */ React26.createElement(
2334
2433
  Picker.Item,
2335
2434
  {
2336
2435
  key: o.value,
@@ -2339,7 +2438,7 @@ function Select({
2339
2438
  enabled: !o.disabled
2340
2439
  }
2341
2440
  ))
2342
- ) : null, isWeb2 ? /* @__PURE__ */ React25.createElement(
2441
+ ) : null, isWeb2 ? /* @__PURE__ */ React26.createElement(
2343
2442
  Picker,
2344
2443
  {
2345
2444
  selectedValue: value ?? "",
@@ -2350,7 +2449,7 @@ function Select({
2350
2449
  },
2351
2450
  enabled: !disabled,
2352
2451
  style: [
2353
- styles22.webPicker,
2452
+ styles23.webPicker,
2354
2453
  {
2355
2454
  borderColor: error ? colors.destructive : colors.border,
2356
2455
  color: selected ? colors.foreground : colors.foregroundMuted,
@@ -2359,8 +2458,8 @@ function Select({
2359
2458
  }
2360
2459
  ]
2361
2460
  },
2362
- /* @__PURE__ */ React25.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }),
2363
- options.map((o) => /* @__PURE__ */ React25.createElement(
2461
+ /* @__PURE__ */ React26.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }),
2462
+ options.map((o) => /* @__PURE__ */ React26.createElement(
2364
2463
  Picker.Item,
2365
2464
  {
2366
2465
  key: o.value,
@@ -2369,9 +2468,9 @@ function Select({
2369
2468
  enabled: !o.disabled
2370
2469
  }
2371
2470
  ))
2372
- ) : null, error ? /* @__PURE__ */ React25.createElement(Text, { style: [styles22.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null);
2471
+ ) : null, error ? /* @__PURE__ */ React26.createElement(Text, { style: [styles23.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null);
2373
2472
  }
2374
- var styles22 = StyleSheet.create({
2473
+ var styles23 = StyleSheet.create({
2375
2474
  container: {
2376
2475
  gap: vs(8)
2377
2476
  },
@@ -2507,20 +2606,20 @@ function ToastNotification({ item, onDismiss }) {
2507
2606
  }[variant];
2508
2607
  const titleColor = variant === "default" ? colors.foreground : accentColor;
2509
2608
  const descColor = variant === "default" ? colors.foregroundMuted : accentColor;
2510
- const defaultIcon = variant === "success" ? /* @__PURE__ */ React25.createElement(FontAwesome5$1, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React25.createElement(AntDesign$1, { name: "exclamation-circle", size: 16, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React25.createElement(MaterialIcons$1, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React25.createElement(Entypo$1, { name: "info-with-circle", size: 16, color: accentColor });
2609
+ const defaultIcon = variant === "success" ? /* @__PURE__ */ React26.createElement(FontAwesome5$1, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React26.createElement(AntDesign$1, { name: "exclamation-circle", size: 16, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React26.createElement(MaterialIcons$1, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React26.createElement(Entypo$1, { name: "info-with-circle", size: 16, color: accentColor });
2511
2610
  const leftIcon = item.iconName ? renderIcon(item.iconName, 16, item.iconColor ?? accentColor) : item.icon ?? defaultIcon;
2512
- return /* @__PURE__ */ React25.createElement(GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React25.createElement(Animated11.View, { style: [styles23.toast, { backgroundColor: bgColor, borderColor }, animatedStyle] }, /* @__PURE__ */ React25.createElement(View, { style: styles23.leftIconContainer }, leftIcon), /* @__PURE__ */ React25.createElement(View, { style: styles23.toastContent }, item.title ? /* @__PURE__ */ React25.createElement(Text, { style: [styles23.toastTitle, { color: titleColor }], allowFontScaling: true }, item.title) : null, item.description ? /* @__PURE__ */ React25.createElement(Text, { style: [styles23.toastDescription, { color: descColor }], allowFontScaling: true }, item.description) : null), item.action && /* @__PURE__ */ React25.createElement(
2611
+ return /* @__PURE__ */ React26.createElement(GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React26.createElement(Animated11.View, { style: [styles24.toast, { backgroundColor: bgColor, borderColor }, animatedStyle] }, /* @__PURE__ */ React26.createElement(View, { style: styles24.leftIconContainer }, leftIcon), /* @__PURE__ */ React26.createElement(View, { style: styles24.toastContent }, item.title ? /* @__PURE__ */ React26.createElement(Text, { style: [styles24.toastTitle, { color: titleColor }], allowFontScaling: true }, item.title) : null, item.description ? /* @__PURE__ */ React26.createElement(Text, { style: [styles24.toastDescription, { color: descColor }], allowFontScaling: true }, item.description) : null), item.action && /* @__PURE__ */ React26.createElement(
2513
2612
  TouchableOpacity,
2514
2613
  {
2515
2614
  onPress: () => {
2516
2615
  item.action.onPress();
2517
2616
  onDismiss();
2518
2617
  },
2519
- style: styles23.actionButton,
2618
+ style: styles24.actionButton,
2520
2619
  touchSoundDisabled: true
2521
2620
  },
2522
- /* @__PURE__ */ React25.createElement(Text, { style: [styles23.actionLabel, { color: accentColor }], allowFontScaling: true }, item.action.label)
2523
- ), /* @__PURE__ */ React25.createElement(TouchableOpacity, { onPress: onDismiss, style: styles23.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React25.createElement(AntDesign$1, { name: "close-circle", size: 16, color: descColor }))));
2621
+ /* @__PURE__ */ React26.createElement(Text, { style: [styles24.actionLabel, { color: accentColor }], allowFontScaling: true }, item.action.label)
2622
+ ), /* @__PURE__ */ React26.createElement(TouchableOpacity, { onPress: onDismiss, style: styles24.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React26.createElement(AntDesign$1, { name: "close-circle", size: 16, color: descColor }))));
2524
2623
  }
2525
2624
  function ToastProvider({ children }) {
2526
2625
  const [toasts, setToasts] = useState([]);
@@ -2541,9 +2640,9 @@ function ToastProvider({ children }) {
2541
2640
  const dismiss = useCallback((id) => {
2542
2641
  setToasts((prev) => prev.filter((t) => t.id !== id));
2543
2642
  }, []);
2544
- return /* @__PURE__ */ React25.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React25.createElement(View, { style: [styles23.container, Platform.OS === "web" && styles23.containerWeb, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React25.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
2643
+ return /* @__PURE__ */ React26.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React26.createElement(View, { style: [styles24.container, Platform.OS === "web" && styles24.containerWeb, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React26.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
2545
2644
  }
2546
- var styles23 = StyleSheet.create({
2645
+ var styles24 = StyleSheet.create({
2547
2646
  container: {
2548
2647
  position: "absolute",
2549
2648
  left: s(16),
@@ -2640,7 +2739,7 @@ function CurrencyInput({
2640
2739
  const inputStyle = size === "large" ? { fontFamily: "Poppins-Regular", fontSize: ms(36) } : { fontFamily: "Poppins-Regular" };
2641
2740
  const dollarIcon = renderIcon("dollar-sign", size === "large" ? 24 : 16, colors.foregroundMuted);
2642
2741
  const displayValue = value && prefix && value.startsWith(prefix) ? value.slice(prefix.length) : value;
2643
- return /* @__PURE__ */ React25.createElement(
2742
+ return /* @__PURE__ */ React26.createElement(
2644
2743
  Input,
2645
2744
  {
2646
2745
  value: displayValue,
@@ -2658,6 +2757,12 @@ function CurrencyInput({
2658
2757
  }
2659
2758
  );
2660
2759
  }
2760
+ var variantFontSize = {
2761
+ hero: ms(48),
2762
+ large: ms(32),
2763
+ medium: ms(18),
2764
+ small: ms(14)
2765
+ };
2661
2766
  function formatValue(value, prefix, showDecimals) {
2662
2767
  const num = typeof value === "string" ? parseFloat(value.replace(/[^0-9.-]/g, "")) : value;
2663
2768
  if (isNaN(num)) return `${prefix}0`;
@@ -2670,16 +2775,27 @@ function formatValue(value, prefix, showDecimals) {
2670
2775
  }
2671
2776
  return `${sign}${prefix}${intPart}`;
2672
2777
  }
2673
- function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, style }) {
2778
+ function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, variant, autoScale, maxFontSize, style }) {
2674
2779
  const { colors } = useTheme();
2675
2780
  const formatted = formatValue(value, prefix, showDecimals);
2676
- return /* @__PURE__ */ React25.createElement(View, { style: [styles24.container, style] }, /* @__PURE__ */ React25.createElement(Text, { style: [styles24.amount, { color: textColor ?? colors.foreground }], allowFontScaling: true }, formatted));
2781
+ const baseFontSize = variant ? variantFontSize[variant] : ms(56);
2782
+ const fontSize = maxFontSize ?? baseFontSize;
2783
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles25.container, style] }, /* @__PURE__ */ React26.createElement(
2784
+ Text,
2785
+ {
2786
+ style: [styles25.amount, { color: textColor ?? colors.foreground, fontSize }],
2787
+ allowFontScaling: true,
2788
+ numberOfLines: autoScale ? 1 : void 0,
2789
+ adjustsFontSizeToFit: autoScale,
2790
+ minimumFontScale: autoScale ? 0.5 : void 0
2791
+ },
2792
+ formatted
2793
+ ));
2677
2794
  }
2678
- var styles24 = StyleSheet.create({
2795
+ var styles25 = StyleSheet.create({
2679
2796
  container: {},
2680
2797
  amount: {
2681
2798
  fontFamily: "Poppins-Bold",
2682
- fontSize: ms(56),
2683
2799
  letterSpacing: -2
2684
2800
  }
2685
2801
  });
@@ -2742,10 +2858,10 @@ function ListItem({
2742
2858
  shadowRadius: 6,
2743
2859
  elevation: 2
2744
2860
  } : {};
2745
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles25.disabled] }, /* @__PURE__ */ React25.createElement(
2861
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles26.disabled] }, /* @__PURE__ */ React26.createElement(
2746
2862
  TouchableOpacity,
2747
2863
  {
2748
- style: [styles25.container, cardStyle, style],
2864
+ style: [styles26.container, cardStyle, style],
2749
2865
  onPress: onPress ? handlePress : void 0,
2750
2866
  onPressIn: handlePressIn,
2751
2867
  onPressOut: handlePressOut,
@@ -2753,51 +2869,51 @@ function ListItem({
2753
2869
  activeOpacity: 1,
2754
2870
  touchSoundDisabled: true
2755
2871
  },
2756
- effectiveLeft ? /* @__PURE__ */ React25.createElement(View, { style: styles25.leftContainer }, effectiveLeft) : null,
2757
- /* @__PURE__ */ React25.createElement(View, { style: styles25.content }, /* @__PURE__ */ React25.createElement(
2872
+ effectiveLeft ? /* @__PURE__ */ React26.createElement(View, { style: styles26.leftContainer }, effectiveLeft) : null,
2873
+ /* @__PURE__ */ React26.createElement(View, { style: styles26.content }, /* @__PURE__ */ React26.createElement(
2758
2874
  Text,
2759
2875
  {
2760
- style: [styles25.title, { color: colors.foreground }, titleStyle],
2876
+ style: [styles26.title, { color: colors.foreground }, titleStyle],
2761
2877
  numberOfLines: 2,
2762
2878
  allowFontScaling: true
2763
2879
  },
2764
2880
  title
2765
- ), subtitle ? /* @__PURE__ */ React25.createElement(
2881
+ ), subtitle ? /* @__PURE__ */ React26.createElement(
2766
2882
  Text,
2767
2883
  {
2768
- style: [styles25.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
2884
+ style: [styles26.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
2769
2885
  numberOfLines: 2,
2770
2886
  allowFontScaling: true
2771
2887
  },
2772
2888
  subtitle
2773
- ) : null, caption ? /* @__PURE__ */ React25.createElement(
2889
+ ) : null, caption ? /* @__PURE__ */ React26.createElement(
2774
2890
  Text,
2775
2891
  {
2776
- style: [styles25.caption, { color: colors.foregroundMuted }, captionStyle],
2892
+ style: [styles26.caption, { color: colors.foregroundMuted }, captionStyle],
2777
2893
  numberOfLines: 1,
2778
2894
  allowFontScaling: true
2779
2895
  },
2780
2896
  caption
2781
2897
  ) : null),
2782
- effectiveRight !== void 0 ? /* @__PURE__ */ React25.createElement(View, { style: styles25.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React25.createElement(
2898
+ effectiveRight !== void 0 ? /* @__PURE__ */ React26.createElement(View, { style: styles26.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React26.createElement(
2783
2899
  Text,
2784
2900
  {
2785
- style: [styles25.rightText, { color: colors.foregroundMuted }],
2901
+ style: [styles26.rightText, { color: colors.foregroundMuted }],
2786
2902
  allowFontScaling: true
2787
2903
  },
2788
2904
  effectiveRight
2789
- ) : effectiveRight) : showChevron ? /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null
2790
- ), showSeparator ? /* @__PURE__ */ React25.createElement(
2905
+ ) : effectiveRight) : showChevron ? /* @__PURE__ */ React26.createElement(Entypo$1, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null
2906
+ ), showSeparator ? /* @__PURE__ */ React26.createElement(
2791
2907
  View,
2792
2908
  {
2793
2909
  style: [
2794
- styles25.separator,
2910
+ styles26.separator,
2795
2911
  { backgroundColor: colors.border, marginLeft: effectiveLeft ? s(16) + s(44) + s(12) : s(16) }
2796
2912
  ]
2797
2913
  }
2798
2914
  ) : null);
2799
2915
  }
2800
- var styles25 = StyleSheet.create({
2916
+ var styles26 = StyleSheet.create({
2801
2917
  container: {
2802
2918
  flexDirection: "row",
2803
2919
  alignItems: "center",
@@ -2899,7 +3015,7 @@ function Chip({ label, selected = false, onPress, icon, iconName, style }) {
2899
3015
  outputRange: [colors.border, colors.primary]
2900
3016
  });
2901
3017
  const resolvedIcon = iconName ? renderIcon(iconName, ms(13), selected ? colors.primaryForeground : colors.foreground) : icon;
2902
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: [styles26.wrapper, { transform: [{ scale: scale2 }] }, style] }, /* @__PURE__ */ React25.createElement(
3018
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: [styles27.wrapper, { transform: [{ scale: scale2 }] }, style] }, /* @__PURE__ */ React26.createElement(
2903
3019
  TouchableOpacity,
2904
3020
  {
2905
3021
  onPress: handlePress,
@@ -2908,7 +3024,7 @@ function Chip({ label, selected = false, onPress, icon, iconName, style }) {
2908
3024
  activeOpacity: 1,
2909
3025
  touchSoundDisabled: true
2910
3026
  },
2911
- /* @__PURE__ */ React25.createElement(Animated.View, { style: [styles26.chip, { backgroundColor, borderColor }] }, resolvedIcon ? /* @__PURE__ */ React25.createElement(View, { style: styles26.chipIcon }, resolvedIcon) : null, /* @__PURE__ */ React25.createElement(Animated.Text, { style: [styles26.label, { color: textColor }], allowFontScaling: true }, label))
3027
+ /* @__PURE__ */ React26.createElement(Animated.View, { style: [styles27.chip, { backgroundColor, borderColor }] }, resolvedIcon ? /* @__PURE__ */ React26.createElement(View, { style: styles27.chipIcon }, resolvedIcon) : null, /* @__PURE__ */ React26.createElement(Animated.Text, { style: [styles27.label, { color: textColor }], allowFontScaling: true }, label))
2912
3028
  ));
2913
3029
  }
2914
3030
  function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
@@ -2933,17 +3049,19 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
2933
3049
  }
2934
3050
  return optionValue === value;
2935
3051
  };
2936
- return /* @__PURE__ */ React25.createElement(View, { style: [styles26.group, style] }, options.map((opt) => /* @__PURE__ */ React25.createElement(
3052
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles27.group, style] }, options.map((opt) => /* @__PURE__ */ React26.createElement(
2937
3053
  Chip,
2938
3054
  {
2939
3055
  key: opt.value,
2940
3056
  label: opt.label,
2941
3057
  selected: isSelected(opt.value),
2942
- onPress: () => handlePress(opt.value)
3058
+ onPress: opt.disabled ? void 0 : () => handlePress(opt.value),
3059
+ iconName: opt.iconName,
3060
+ style: opt.disabled ? { opacity: 0.4 } : void 0
2943
3061
  }
2944
3062
  )));
2945
3063
  }
2946
- var styles26 = StyleSheet.create({
3064
+ var styles27 = StyleSheet.create({
2947
3065
  wrapper: {},
2948
3066
  chip: {
2949
3067
  borderRadius: 999,
@@ -2990,7 +3108,7 @@ function ConfirmDialog({
2990
3108
  ref.current?.dismiss();
2991
3109
  }
2992
3110
  }, [visible]);
2993
- const renderBackdrop = (props) => /* @__PURE__ */ React25.createElement(
3111
+ const renderBackdrop = (props) => /* @__PURE__ */ React26.createElement(
2994
3112
  BottomSheetBackdrop,
2995
3113
  {
2996
3114
  ...props,
@@ -2999,34 +3117,25 @@ function ConfirmDialog({
2999
3117
  pressBehavior: "close"
3000
3118
  }
3001
3119
  );
3002
- return /* @__PURE__ */ React25.createElement(
3120
+ return /* @__PURE__ */ React26.createElement(
3003
3121
  BottomSheetModal,
3004
3122
  {
3005
3123
  ref,
3006
3124
  enableDynamicSizing: true,
3007
3125
  onDismiss: onCancel,
3008
3126
  backdropComponent: renderBackdrop,
3009
- backgroundStyle: [styles27.background, { backgroundColor: colors.card }],
3010
- handleIndicatorStyle: [styles27.handle, { backgroundColor: colors.border }],
3127
+ backgroundStyle: [styles28.background, { backgroundColor: colors.card }],
3128
+ handleIndicatorStyle: [styles28.handle, { backgroundColor: colors.border }],
3011
3129
  enablePanDownToClose: true
3012
3130
  },
3013
- /* @__PURE__ */ React25.createElement(BottomSheetView, { style: styles27.content }, /* @__PURE__ */ React25.createElement(Text, { style: [styles27.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React25.createElement(Text, { style: [styles27.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null, /* @__PURE__ */ React25.createElement(View, { style: styles27.actions }, /* @__PURE__ */ React25.createElement(
3014
- Button,
3015
- {
3016
- label: cancelLabel,
3017
- variant: "secondary",
3018
- fullWidth: true,
3019
- onPress: onCancel,
3020
- icon: /* @__PURE__ */ React25.createElement(Feather$1, { name: "x", size: 15, color: colors.foreground })
3021
- }
3022
- ), /* @__PURE__ */ React25.createElement(
3131
+ /* @__PURE__ */ React26.createElement(BottomSheetView, { style: styles28.content }, /* @__PURE__ */ React26.createElement(Text, { style: [styles28.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26.createElement(Text, { style: [styles28.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null, /* @__PURE__ */ React26.createElement(View, { style: styles28.actions }, /* @__PURE__ */ React26.createElement(
3023
3132
  Button,
3024
3133
  {
3025
3134
  label: confirmLabel,
3026
3135
  variant: confirmVariant,
3027
3136
  fullWidth: true,
3028
3137
  onPress: onConfirm,
3029
- icon: /* @__PURE__ */ React25.createElement(
3138
+ icon: /* @__PURE__ */ React26.createElement(
3030
3139
  Feather$1,
3031
3140
  {
3032
3141
  name: confirmVariant === "destructive" ? "trash-2" : "check",
@@ -3035,10 +3144,19 @@ function ConfirmDialog({
3035
3144
  }
3036
3145
  )
3037
3146
  }
3147
+ ), /* @__PURE__ */ React26.createElement(
3148
+ Button,
3149
+ {
3150
+ label: cancelLabel,
3151
+ variant: "secondary",
3152
+ fullWidth: true,
3153
+ onPress: onCancel,
3154
+ icon: /* @__PURE__ */ React26.createElement(Feather$1, { name: "x", size: 15, color: colors.foreground })
3155
+ }
3038
3156
  )))
3039
3157
  );
3040
3158
  }
3041
- var styles27 = StyleSheet.create({
3159
+ var styles28 = StyleSheet.create({
3042
3160
  background: {
3043
3161
  borderTopLeftRadius: ms(16),
3044
3162
  borderTopRightRadius: ms(16)
@@ -3068,17 +3186,27 @@ var styles27 = StyleSheet.create({
3068
3186
  marginTop: vs(8)
3069
3187
  }
3070
3188
  });
3071
- function LabelValue({ label, value, style }) {
3189
+ function LabelValue({ label, value, iconName, iconColor, style }) {
3072
3190
  const { colors } = useTheme();
3073
- return /* @__PURE__ */ React25.createElement(View, { style: [styles28.container, style] }, /* @__PURE__ */ React25.createElement(Text, { style: [styles28.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label), typeof value === "string" ? /* @__PURE__ */ React25.createElement(Text, { style: [styles28.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
3191
+ const resolvedIcon = iconName ? renderIcon(iconName, ms(14), iconColor ?? colors.foregroundMuted) : null;
3192
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles29.container, style] }, /* @__PURE__ */ React26.createElement(View, { style: styles29.labelSide }, resolvedIcon ? /* @__PURE__ */ React26.createElement(View, { style: styles29.icon }, resolvedIcon) : null, /* @__PURE__ */ React26.createElement(Text, { style: [styles29.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label)), typeof value === "string" ? /* @__PURE__ */ React26.createElement(Text, { style: [styles29.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
3074
3193
  }
3075
- var styles28 = StyleSheet.create({
3194
+ var styles29 = StyleSheet.create({
3076
3195
  container: {
3077
3196
  flexDirection: "row",
3078
3197
  justifyContent: "space-between",
3079
3198
  alignItems: "center",
3080
3199
  gap: s(12)
3081
3200
  },
3201
+ labelSide: {
3202
+ flexDirection: "row",
3203
+ alignItems: "center",
3204
+ gap: s(4)
3205
+ },
3206
+ icon: {
3207
+ alignItems: "center",
3208
+ justifyContent: "center"
3209
+ },
3082
3210
  label: {
3083
3211
  fontFamily: "Poppins-Regular",
3084
3212
  fontSize: ms(13),
@@ -3091,22 +3219,19 @@ var styles28 = StyleSheet.create({
3091
3219
  textAlign: "right"
3092
3220
  }
3093
3221
  });
3094
- var MONTH_NAMES = [
3095
- "January",
3096
- "February",
3097
- "March",
3098
- "April",
3099
- "May",
3100
- "June",
3101
- "July",
3102
- "August",
3103
- "September",
3104
- "October",
3105
- "November",
3106
- "December"
3107
- ];
3108
- function MonthPicker({ value, onChange, style }) {
3222
+ var MONTH_NAMES = {
3223
+ en: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
3224
+ es: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"],
3225
+ pt: ["janeiro", "fevereiro", "mar\xE7o", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"],
3226
+ fr: ["janvier", "f\xE9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\xFBt", "septembre", "octobre", "novembre", "d\xE9cembre"]
3227
+ };
3228
+ function MonthPicker({ value, onChange, locale = "en", formatLabel, style }) {
3109
3229
  const { colors } = useTheme();
3230
+ const getLabel = () => {
3231
+ if (formatLabel) return formatLabel(value);
3232
+ const names = MONTH_NAMES[locale] ?? MONTH_NAMES.en;
3233
+ return `${names[value.month - 1]} ${value.year}`;
3234
+ };
3110
3235
  const handlePrev = () => {
3111
3236
  selectionAsync();
3112
3237
  if (value.month === 1) {
@@ -3123,27 +3248,27 @@ function MonthPicker({ value, onChange, style }) {
3123
3248
  onChange({ month: value.month + 1, year: value.year });
3124
3249
  }
3125
3250
  };
3126
- return /* @__PURE__ */ React25.createElement(View, { style: [styles29.container, style] }, /* @__PURE__ */ React25.createElement(
3251
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles30.container, style] }, /* @__PURE__ */ React26.createElement(
3127
3252
  TouchableOpacity,
3128
3253
  {
3129
- style: styles29.arrow,
3254
+ style: styles30.arrow,
3130
3255
  onPress: handlePrev,
3131
3256
  activeOpacity: 0.6,
3132
3257
  touchSoundDisabled: true
3133
3258
  },
3134
- /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-left", size: 22, color: colors.foreground })
3135
- ), /* @__PURE__ */ React25.createElement(Text, { style: [styles29.label, { color: colors.foreground }], allowFontScaling: true }, MONTH_NAMES[value.month - 1], " ", value.year), /* @__PURE__ */ React25.createElement(
3259
+ /* @__PURE__ */ React26.createElement(Entypo$1, { name: "chevron-left", size: 22, color: colors.foreground })
3260
+ ), /* @__PURE__ */ React26.createElement(Text, { style: [styles30.label, { color: colors.foreground }], allowFontScaling: true }, getLabel()), /* @__PURE__ */ React26.createElement(
3136
3261
  TouchableOpacity,
3137
3262
  {
3138
- style: styles29.arrow,
3263
+ style: styles30.arrow,
3139
3264
  onPress: handleNext,
3140
3265
  activeOpacity: 0.6,
3141
3266
  touchSoundDisabled: true
3142
3267
  },
3143
- /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-right", size: 22, color: colors.foreground })
3268
+ /* @__PURE__ */ React26.createElement(Entypo$1, { name: "chevron-right", size: 22, color: colors.foreground })
3144
3269
  ));
3145
3270
  }
3146
- var styles29 = StyleSheet.create({
3271
+ var styles30 = StyleSheet.create({
3147
3272
  container: {
3148
3273
  flexDirection: "row",
3149
3274
  alignItems: "center",
@@ -3216,27 +3341,27 @@ function MediaCard({
3216
3341
  };
3217
3342
  const ratio = aspectRatioMap[aspectRatio];
3218
3343
  const resolvedActionIcon = actionIconName ? renderIcon(actionIconName, 18, actionActive ? colors.primary : colors.background) : actionIcon ?? renderIcon("heart", 18, actionActive ? colors.primary : colors.background);
3219
- const cardContent = /* @__PURE__ */ React25.createElement(
3344
+ const cardContent = /* @__PURE__ */ React26.createElement(
3220
3345
  View,
3221
3346
  {
3222
3347
  style: [
3223
- styles30.card,
3224
- hovered && styles30.cardHovered,
3348
+ styles31.card,
3349
+ hovered && styles31.cardHovered,
3225
3350
  style
3226
3351
  ],
3227
3352
  ...Platform.OS === "web" ? hoverHandlers : {}
3228
3353
  },
3229
- /* @__PURE__ */ React25.createElement(View, { style: [styles30.imageContainer, imageStyle] }, /* @__PURE__ */ React25.createElement(View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React25.createElement(View, { style: StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React25.createElement(
3354
+ /* @__PURE__ */ React26.createElement(View, { style: [styles31.imageContainer, imageStyle] }, /* @__PURE__ */ React26.createElement(View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React26.createElement(View, { style: StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React26.createElement(
3230
3355
  Image,
3231
3356
  {
3232
3357
  source: imageSource,
3233
- style: styles30.image,
3358
+ style: styles31.image,
3234
3359
  resizeMode: "cover"
3235
3360
  }
3236
- ) : /* @__PURE__ */ React25.createElement(View, { style: [styles30.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React25.createElement(View, { style: styles30.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React25.createElement(
3361
+ ) : /* @__PURE__ */ React26.createElement(View, { style: [styles31.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React26.createElement(View, { style: styles31.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React26.createElement(
3237
3362
  TouchableOpacity,
3238
3363
  {
3239
- style: [styles30.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
3364
+ style: [styles31.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
3240
3365
  onPress: () => {
3241
3366
  impactLight();
3242
3367
  onActionPress?.();
@@ -3246,10 +3371,10 @@ function MediaCard({
3246
3371
  },
3247
3372
  resolvedActionIcon
3248
3373
  )),
3249
- (title || subtitle || caption || footer) && /* @__PURE__ */ React25.createElement(View, { style: styles30.meta }, title ? /* @__PURE__ */ React25.createElement(Text, { style: [styles30.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React25.createElement(Text, { style: [styles30.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React25.createElement(Text, { style: [styles30.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
3374
+ (title || subtitle || caption || footer) && /* @__PURE__ */ React26.createElement(View, { style: styles31.meta }, title ? /* @__PURE__ */ React26.createElement(Text, { style: [styles31.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React26.createElement(Text, { style: [styles31.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React26.createElement(Text, { style: [styles31.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
3250
3375
  );
3251
3376
  if (onPress) {
3252
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25.createElement(
3377
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26.createElement(
3253
3378
  TouchableOpacity,
3254
3379
  {
3255
3380
  onPress: handlePress,
@@ -3263,7 +3388,7 @@ function MediaCard({
3263
3388
  }
3264
3389
  return cardContent;
3265
3390
  }
3266
- var styles30 = StyleSheet.create({
3391
+ var styles31 = StyleSheet.create({
3267
3392
  card: {
3268
3393
  borderRadius: RADIUS.md,
3269
3394
  // 14px — Airbnb property card spec
@@ -3339,11 +3464,11 @@ function CategoryChip({
3339
3464
  const textColor = selected ? colors.primaryForeground : colors.foregroundSubtle;
3340
3465
  const borderColor = selected ? colors.primary : colors.border;
3341
3466
  const resolvedIcon = typeof item.icon === "string" ? renderIcon(item.icon, 16, textColor) : item.icon ?? null;
3342
- return /* @__PURE__ */ React25.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25.createElement(
3467
+ return /* @__PURE__ */ React26.createElement(Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26.createElement(
3343
3468
  TouchableOpacity,
3344
3469
  {
3345
3470
  style: [
3346
- styles31.chip,
3471
+ styles32.chip,
3347
3472
  {
3348
3473
  backgroundColor: bgColor,
3349
3474
  borderColor
@@ -3355,9 +3480,9 @@ function CategoryChip({
3355
3480
  activeOpacity: 1,
3356
3481
  touchSoundDisabled: true
3357
3482
  },
3358
- resolvedIcon && /* @__PURE__ */ React25.createElement(View, { style: styles31.chipIcon }, resolvedIcon),
3359
- /* @__PURE__ */ React25.createElement(Text, { style: [styles31.chipLabel, { color: textColor }], allowFontScaling: true }, item.label),
3360
- item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React25.createElement(View, { style: [styles31.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React25.createElement(Text, { style: [styles31.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
3483
+ resolvedIcon && /* @__PURE__ */ React26.createElement(View, { style: styles32.chipIcon }, resolvedIcon),
3484
+ /* @__PURE__ */ React26.createElement(Text, { style: [styles32.chipLabel, { color: textColor }], allowFontScaling: true }, item.label),
3485
+ item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React26.createElement(View, { style: [styles32.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React26.createElement(Text, { style: [styles32.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
3361
3486
  ));
3362
3487
  }
3363
3488
  function CategoryStrip({
@@ -3379,15 +3504,15 @@ function CategoryStrip({
3379
3504
  onValueChange?.(v === value ? "" : v);
3380
3505
  }
3381
3506
  };
3382
- return /* @__PURE__ */ React25.createElement(
3507
+ return /* @__PURE__ */ React26.createElement(
3383
3508
  ScrollView,
3384
3509
  {
3385
3510
  horizontal: true,
3386
3511
  showsHorizontalScrollIndicator: false,
3387
- contentContainerStyle: [styles31.container, style],
3388
- style: styles31.scroll
3512
+ contentContainerStyle: [styles32.container, style],
3513
+ style: styles32.scroll
3389
3514
  },
3390
- categories.map((cat) => /* @__PURE__ */ React25.createElement(View, { key: cat.value, style: itemStyle }, /* @__PURE__ */ React25.createElement(
3515
+ categories.map((cat) => /* @__PURE__ */ React26.createElement(View, { key: cat.value, style: itemStyle }, /* @__PURE__ */ React26.createElement(
3391
3516
  CategoryChip,
3392
3517
  {
3393
3518
  item: cat,
@@ -3397,7 +3522,7 @@ function CategoryStrip({
3397
3522
  )))
3398
3523
  );
3399
3524
  }
3400
- var styles31 = StyleSheet.create({
3525
+ var styles32 = StyleSheet.create({
3401
3526
  scroll: {
3402
3527
  flexGrow: 0
3403
3528
  },
@@ -3476,7 +3601,7 @@ function Pressable2({
3476
3601
  onPress();
3477
3602
  };
3478
3603
  const hoverScaleValue = hovered && hoverScale !== 1 ? hoverScale : 1;
3479
- return /* @__PURE__ */ React25.createElement(
3604
+ return /* @__PURE__ */ React26.createElement(
3480
3605
  Animated.View,
3481
3606
  {
3482
3607
  style: [
@@ -3485,7 +3610,7 @@ function Pressable2({
3485
3610
  ],
3486
3611
  ...Platform.OS === "web" ? hoverHandlers : {}
3487
3612
  },
3488
- /* @__PURE__ */ React25.createElement(
3613
+ /* @__PURE__ */ React26.createElement(
3489
3614
  TouchableOpacity,
3490
3615
  {
3491
3616
  onPress: handlePress,
@@ -3500,5 +3625,102 @@ function Pressable2({
3500
3625
  )
3501
3626
  );
3502
3627
  }
3628
+ var weightMap = {
3629
+ normal: "Poppins-Regular",
3630
+ medium: "Poppins-Medium",
3631
+ semibold: "Poppins-SemiBold",
3632
+ bold: "Poppins-Bold"
3633
+ };
3634
+ function DetailRow({
3635
+ label,
3636
+ value,
3637
+ separator = "dotted",
3638
+ labelWeight = "normal",
3639
+ valueColor,
3640
+ leftIcon,
3641
+ leftIconName,
3642
+ leftIconColor,
3643
+ rightIconName,
3644
+ rightIconColor,
3645
+ style,
3646
+ labelStyle,
3647
+ valueStyle
3648
+ }) {
3649
+ const { colors } = useTheme();
3650
+ const resolvedLeftIcon = leftIconName ? renderIcon(leftIconName, ms(14), leftIconColor ?? colors.foregroundMuted) : leftIcon;
3651
+ const resolvedRightIcon = rightIconName ? renderIcon(rightIconName, ms(14), rightIconColor ?? colors.foregroundMuted) : null;
3652
+ const separatorStyle = separator === "none" ? null : {
3653
+ flex: 1,
3654
+ height: 1,
3655
+ borderBottomWidth: 1,
3656
+ borderStyle: separator,
3657
+ borderColor: "rgba(128,128,128,0.3)",
3658
+ marginHorizontal: s(4)
3659
+ };
3660
+ return /* @__PURE__ */ React26.createElement(View, { style: [styles33.row, style] }, /* @__PURE__ */ React26.createElement(View, { style: styles33.labelSide }, resolvedLeftIcon ? /* @__PURE__ */ React26.createElement(View, { style: styles33.icon }, resolvedLeftIcon) : null, typeof label === "string" ? /* @__PURE__ */ React26.createElement(
3661
+ Text,
3662
+ {
3663
+ style: [styles33.labelText, { color: colors.foregroundMuted, fontFamily: weightMap[labelWeight] }, labelStyle],
3664
+ allowFontScaling: true
3665
+ },
3666
+ label
3667
+ ) : label), separatorStyle ? /* @__PURE__ */ React26.createElement(View, { style: separatorStyle }) : /* @__PURE__ */ React26.createElement(View, { style: styles33.spacer }), /* @__PURE__ */ React26.createElement(View, { style: styles33.valueSide }, /* @__PURE__ */ React26.createElement(
3668
+ Text,
3669
+ {
3670
+ style: [styles33.valueText, { color: valueColor ?? colors.foreground }, valueStyle],
3671
+ allowFontScaling: true
3672
+ },
3673
+ value
3674
+ ), resolvedRightIcon ? /* @__PURE__ */ React26.createElement(View, { style: styles33.icon }, resolvedRightIcon) : null));
3675
+ }
3676
+ var styles33 = StyleSheet.create({
3677
+ row: {
3678
+ flexDirection: "row",
3679
+ alignItems: "center",
3680
+ gap: s(4)
3681
+ },
3682
+ labelSide: {
3683
+ flexDirection: "row",
3684
+ alignItems: "center",
3685
+ gap: s(4),
3686
+ flexShrink: 0
3687
+ },
3688
+ icon: {
3689
+ alignItems: "center",
3690
+ justifyContent: "center"
3691
+ },
3692
+ spacer: {
3693
+ flex: 1
3694
+ },
3695
+ labelText: {
3696
+ fontSize: ms(13),
3697
+ lineHeight: mvs(18)
3698
+ },
3699
+ valueSide: {
3700
+ flexDirection: "row",
3701
+ alignItems: "center",
3702
+ gap: s(4),
3703
+ flexShrink: 0
3704
+ },
3705
+ valueText: {
3706
+ fontFamily: "Poppins-SemiBold",
3707
+ fontSize: ms(13),
3708
+ lineHeight: mvs(18)
3709
+ }
3710
+ });
3711
+
3712
+ // src/utils/typography.ts
3713
+ function getResponsiveFontSize(text, maxSize, steps = [
3714
+ { maxLen: 10, subtract: 0 },
3715
+ { maxLen: 12, subtract: 4 },
3716
+ { maxLen: 14, subtract: 6 }
3717
+ ]) {
3718
+ const len = text.length;
3719
+ const sorted = [...steps].sort((a, b) => a.maxLen - b.maxLen);
3720
+ for (const step of sorted) {
3721
+ if (len <= step.maxLen) return maxSize - step.subtract;
3722
+ }
3723
+ return maxSize - 8;
3724
+ }
3503
3725
 
3504
- export { Accordion, AlertBanner, Avatar, BREAKPOINTS, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryStrip, Checkbox, Chip, ChipGroup, ConfirmDialog, CurrencyDisplay, CurrencyInput, CurrencyInput as CurrencyInputLarge, EmptyState, ICON_SIZES, Icon, IconButton, Input, LabelValue, ListItem, MediaCard, MonthPicker, Pressable2 as Pressable, Progress, RADIUS, RadioGroup, SHADOWS, SPACING, Select, Separator, Sheet, Skeleton, Slider, Spinner, Switch, TYPOGRAPHY, Tabs, TabsContent, Text3 as Text, Textarea, ThemeProvider, ToastProvider, Toggle, defaultDark, defaultLight, deriveColors, renderIcon, useTheme, useToast };
3726
+ export { Accordion, AlertBanner, Avatar, BREAKPOINTS, Badge, Button, ButtonGroup, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryStrip, Checkbox, Chip, ChipGroup, ConfirmDialog, CurrencyDisplay, CurrencyInput, CurrencyInput as CurrencyInputLarge, DetailRow, EmptyState, ICON_SIZES, Icon, IconButton, Input, LabelValue, ListItem, MediaCard, MonthPicker, Pressable2 as Pressable, Progress, RADIUS, RadioGroup, SHADOWS, SPACING, Select, Separator, Sheet, Skeleton, Slider, Spinner, Switch, TYPOGRAPHY, Tabs, TabsContent, Text3 as Text, Textarea, ThemeProvider, ToastProvider, Toggle, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, renderIcon, useTheme, useToast };