@retray-dev/ui-kit 5.2.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';
@@ -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
  },
@@ -2148,7 +2236,9 @@ function Sheet({
2148
2236
  children,
2149
2237
  style,
2150
2238
  scrollable,
2151
- maxHeight
2239
+ maxHeight,
2240
+ keyboardBehavior,
2241
+ keyboardOffset = 0
2152
2242
  }) {
2153
2243
  const { colors } = useTheme();
2154
2244
  const ref = useRef(null);
@@ -2160,7 +2250,7 @@ function Sheet({
2160
2250
  ref.current?.dismiss();
2161
2251
  }
2162
2252
  }, [open]);
2163
- const renderBackdrop = (props) => /* @__PURE__ */ React25.createElement(
2253
+ const renderBackdrop = (props) => /* @__PURE__ */ React26.createElement(
2164
2254
  BottomSheetBackdrop,
2165
2255
  {
2166
2256
  ...props,
@@ -2169,23 +2259,28 @@ function Sheet({
2169
2259
  pressBehavior: "close"
2170
2260
  }
2171
2261
  );
2172
- const headerNode = 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;
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;
2173
2263
  const useScroll = scrollable || !!maxHeight;
2174
- return /* @__PURE__ */ React25.createElement(
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(
2175
2270
  BottomSheetModal,
2176
2271
  {
2177
2272
  ref,
2178
2273
  enableDynamicSizing: true,
2179
2274
  onDismiss: onClose,
2180
2275
  backdropComponent: renderBackdrop,
2181
- backgroundStyle: [styles21.background, { backgroundColor: colors.card }],
2182
- handleIndicatorStyle: [styles21.handle, { backgroundColor: colors.border }],
2276
+ backgroundStyle: [styles22.background, { backgroundColor: colors.card }],
2277
+ handleIndicatorStyle: [styles22.handle, { backgroundColor: colors.border }],
2183
2278
  enablePanDownToClose: true
2184
2279
  },
2185
- /* @__PURE__ */ React25.createElement(BottomSheetView, { style: maxHeight ? { maxHeight } : void 0 }, useScroll ? /* @__PURE__ */ React25.createElement(BottomSheetScrollView, { contentContainerStyle: [styles21.content, style] }, headerNode, children) : /* @__PURE__ */ React25.createElement(BottomSheetView, { style: [styles21.content, style] }, headerNode, 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)))
2186
2281
  );
2187
2282
  }
2188
- var styles21 = StyleSheet.create({
2283
+ var styles22 = StyleSheet.create({
2189
2284
  background: {
2190
2285
  borderTopLeftRadius: ms(16),
2191
2286
  borderTopRightRadius: ms(16)
@@ -2260,11 +2355,11 @@ function Select({
2260
2355
  }
2261
2356
  setPickerVisible(false);
2262
2357
  };
2263
- 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(
2264
2359
  TouchableOpacity,
2265
2360
  {
2266
2361
  style: [
2267
- styles22.trigger,
2362
+ styles23.trigger,
2268
2363
  {
2269
2364
  borderColor: error ? colors.destructive : colors.border,
2270
2365
  backgroundColor: colors.background
@@ -2276,11 +2371,11 @@ function Select({
2276
2371
  activeOpacity: 1,
2277
2372
  touchSoundDisabled: true
2278
2373
  },
2279
- /* @__PURE__ */ React25.createElement(
2374
+ /* @__PURE__ */ React26.createElement(
2280
2375
  Text,
2281
2376
  {
2282
2377
  style: [
2283
- styles22.triggerText,
2378
+ styles23.triggerText,
2284
2379
  { color: selected ? colors.foreground : colors.foregroundMuted }
2285
2380
  ],
2286
2381
  numberOfLines: 1,
@@ -2288,8 +2383,8 @@ function Select({
2288
2383
  },
2289
2384
  selected?.label ?? placeholder
2290
2385
  ),
2291
- /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-with-circle-down", size: 20, color: colors.foregroundMuted })
2292
- )) : 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(
2293
2388
  Modal,
2294
2389
  {
2295
2390
  visible: pickerVisible,
@@ -2297,16 +2392,16 @@ function Select({
2297
2392
  animationType: "slide",
2298
2393
  onRequestClose: handleDismiss
2299
2394
  },
2300
- /* @__PURE__ */ React25.createElement(TouchableOpacity, { style: styles22.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
2301
- /* @__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(
2302
2397
  Picker,
2303
2398
  {
2304
2399
  selectedValue: pendingValue ?? "",
2305
2400
  onValueChange: (val) => setPendingValue(val),
2306
2401
  itemStyle: { color: colors.foreground }
2307
2402
  },
2308
- !value ? /* @__PURE__ */ React25.createElement(Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
2309
- 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(
2310
2405
  Picker.Item,
2311
2406
  {
2312
2407
  key: o.value,
@@ -2317,7 +2412,7 @@ function Select({
2317
2412
  }
2318
2413
  ))
2319
2414
  ))
2320
- ) : null, isAndroid ? /* @__PURE__ */ React25.createElement(
2415
+ ) : null, isAndroid ? /* @__PURE__ */ React26.createElement(
2321
2416
  Picker,
2322
2417
  {
2323
2418
  ref: pickerRef,
@@ -2331,10 +2426,10 @@ function Select({
2331
2426
  mode: "dialog",
2332
2427
  enabled: !disabled,
2333
2428
  prompt: label,
2334
- style: styles22.androidHiddenPicker
2429
+ style: styles23.androidHiddenPicker
2335
2430
  },
2336
- !value ? /* @__PURE__ */ React25.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
2337
- 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(
2338
2433
  Picker.Item,
2339
2434
  {
2340
2435
  key: o.value,
@@ -2343,7 +2438,7 @@ function Select({
2343
2438
  enabled: !o.disabled
2344
2439
  }
2345
2440
  ))
2346
- ) : null, isWeb2 ? /* @__PURE__ */ React25.createElement(
2441
+ ) : null, isWeb2 ? /* @__PURE__ */ React26.createElement(
2347
2442
  Picker,
2348
2443
  {
2349
2444
  selectedValue: value ?? "",
@@ -2354,7 +2449,7 @@ function Select({
2354
2449
  },
2355
2450
  enabled: !disabled,
2356
2451
  style: [
2357
- styles22.webPicker,
2452
+ styles23.webPicker,
2358
2453
  {
2359
2454
  borderColor: error ? colors.destructive : colors.border,
2360
2455
  color: selected ? colors.foreground : colors.foregroundMuted,
@@ -2363,8 +2458,8 @@ function Select({
2363
2458
  }
2364
2459
  ]
2365
2460
  },
2366
- /* @__PURE__ */ React25.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }),
2367
- options.map((o) => /* @__PURE__ */ React25.createElement(
2461
+ /* @__PURE__ */ React26.createElement(Picker.Item, { label: placeholder, value: "", enabled: false }),
2462
+ options.map((o) => /* @__PURE__ */ React26.createElement(
2368
2463
  Picker.Item,
2369
2464
  {
2370
2465
  key: o.value,
@@ -2373,9 +2468,9 @@ function Select({
2373
2468
  enabled: !o.disabled
2374
2469
  }
2375
2470
  ))
2376
- ) : 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);
2377
2472
  }
2378
- var styles22 = StyleSheet.create({
2473
+ var styles23 = StyleSheet.create({
2379
2474
  container: {
2380
2475
  gap: vs(8)
2381
2476
  },
@@ -2511,20 +2606,20 @@ function ToastNotification({ item, onDismiss }) {
2511
2606
  }[variant];
2512
2607
  const titleColor = variant === "default" ? colors.foreground : accentColor;
2513
2608
  const descColor = variant === "default" ? colors.foregroundMuted : accentColor;
2514
- 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 });
2515
2610
  const leftIcon = item.iconName ? renderIcon(item.iconName, 16, item.iconColor ?? accentColor) : item.icon ?? defaultIcon;
2516
- 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(
2517
2612
  TouchableOpacity,
2518
2613
  {
2519
2614
  onPress: () => {
2520
2615
  item.action.onPress();
2521
2616
  onDismiss();
2522
2617
  },
2523
- style: styles23.actionButton,
2618
+ style: styles24.actionButton,
2524
2619
  touchSoundDisabled: true
2525
2620
  },
2526
- /* @__PURE__ */ React25.createElement(Text, { style: [styles23.actionLabel, { color: accentColor }], allowFontScaling: true }, item.action.label)
2527
- ), /* @__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 }))));
2528
2623
  }
2529
2624
  function ToastProvider({ children }) {
2530
2625
  const [toasts, setToasts] = useState([]);
@@ -2545,9 +2640,9 @@ function ToastProvider({ children }) {
2545
2640
  const dismiss = useCallback((id) => {
2546
2641
  setToasts((prev) => prev.filter((t) => t.id !== id));
2547
2642
  }, []);
2548
- 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) }))));
2549
2644
  }
2550
- var styles23 = StyleSheet.create({
2645
+ var styles24 = StyleSheet.create({
2551
2646
  container: {
2552
2647
  position: "absolute",
2553
2648
  left: s(16),
@@ -2644,7 +2739,7 @@ function CurrencyInput({
2644
2739
  const inputStyle = size === "large" ? { fontFamily: "Poppins-Regular", fontSize: ms(36) } : { fontFamily: "Poppins-Regular" };
2645
2740
  const dollarIcon = renderIcon("dollar-sign", size === "large" ? 24 : 16, colors.foregroundMuted);
2646
2741
  const displayValue = value && prefix && value.startsWith(prefix) ? value.slice(prefix.length) : value;
2647
- return /* @__PURE__ */ React25.createElement(
2742
+ return /* @__PURE__ */ React26.createElement(
2648
2743
  Input,
2649
2744
  {
2650
2745
  value: displayValue,
@@ -2662,6 +2757,12 @@ function CurrencyInput({
2662
2757
  }
2663
2758
  );
2664
2759
  }
2760
+ var variantFontSize = {
2761
+ hero: ms(48),
2762
+ large: ms(32),
2763
+ medium: ms(18),
2764
+ small: ms(14)
2765
+ };
2665
2766
  function formatValue(value, prefix, showDecimals) {
2666
2767
  const num = typeof value === "string" ? parseFloat(value.replace(/[^0-9.-]/g, "")) : value;
2667
2768
  if (isNaN(num)) return `${prefix}0`;
@@ -2674,16 +2775,27 @@ function formatValue(value, prefix, showDecimals) {
2674
2775
  }
2675
2776
  return `${sign}${prefix}${intPart}`;
2676
2777
  }
2677
- function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, style }) {
2778
+ function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, variant, autoScale, maxFontSize, style }) {
2678
2779
  const { colors } = useTheme();
2679
2780
  const formatted = formatValue(value, prefix, showDecimals);
2680
- 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
+ ));
2681
2794
  }
2682
- var styles24 = StyleSheet.create({
2795
+ var styles25 = StyleSheet.create({
2683
2796
  container: {},
2684
2797
  amount: {
2685
2798
  fontFamily: "Poppins-Bold",
2686
- fontSize: ms(56),
2687
2799
  letterSpacing: -2
2688
2800
  }
2689
2801
  });
@@ -2746,10 +2858,10 @@ function ListItem({
2746
2858
  shadowRadius: 6,
2747
2859
  elevation: 2
2748
2860
  } : {};
2749
- 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(
2750
2862
  TouchableOpacity,
2751
2863
  {
2752
- style: [styles25.container, cardStyle, style],
2864
+ style: [styles26.container, cardStyle, style],
2753
2865
  onPress: onPress ? handlePress : void 0,
2754
2866
  onPressIn: handlePressIn,
2755
2867
  onPressOut: handlePressOut,
@@ -2757,51 +2869,51 @@ function ListItem({
2757
2869
  activeOpacity: 1,
2758
2870
  touchSoundDisabled: true
2759
2871
  },
2760
- effectiveLeft ? /* @__PURE__ */ React25.createElement(View, { style: styles25.leftContainer }, effectiveLeft) : null,
2761
- /* @__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(
2762
2874
  Text,
2763
2875
  {
2764
- style: [styles25.title, { color: colors.foreground }, titleStyle],
2876
+ style: [styles26.title, { color: colors.foreground }, titleStyle],
2765
2877
  numberOfLines: 2,
2766
2878
  allowFontScaling: true
2767
2879
  },
2768
2880
  title
2769
- ), subtitle ? /* @__PURE__ */ React25.createElement(
2881
+ ), subtitle ? /* @__PURE__ */ React26.createElement(
2770
2882
  Text,
2771
2883
  {
2772
- style: [styles25.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
2884
+ style: [styles26.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
2773
2885
  numberOfLines: 2,
2774
2886
  allowFontScaling: true
2775
2887
  },
2776
2888
  subtitle
2777
- ) : null, caption ? /* @__PURE__ */ React25.createElement(
2889
+ ) : null, caption ? /* @__PURE__ */ React26.createElement(
2778
2890
  Text,
2779
2891
  {
2780
- style: [styles25.caption, { color: colors.foregroundMuted }, captionStyle],
2892
+ style: [styles26.caption, { color: colors.foregroundMuted }, captionStyle],
2781
2893
  numberOfLines: 1,
2782
2894
  allowFontScaling: true
2783
2895
  },
2784
2896
  caption
2785
2897
  ) : null),
2786
- 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(
2787
2899
  Text,
2788
2900
  {
2789
- style: [styles25.rightText, { color: colors.foregroundMuted }],
2901
+ style: [styles26.rightText, { color: colors.foregroundMuted }],
2790
2902
  allowFontScaling: true
2791
2903
  },
2792
2904
  effectiveRight
2793
- ) : effectiveRight) : showChevron ? /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null
2794
- ), 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(
2795
2907
  View,
2796
2908
  {
2797
2909
  style: [
2798
- styles25.separator,
2910
+ styles26.separator,
2799
2911
  { backgroundColor: colors.border, marginLeft: effectiveLeft ? s(16) + s(44) + s(12) : s(16) }
2800
2912
  ]
2801
2913
  }
2802
2914
  ) : null);
2803
2915
  }
2804
- var styles25 = StyleSheet.create({
2916
+ var styles26 = StyleSheet.create({
2805
2917
  container: {
2806
2918
  flexDirection: "row",
2807
2919
  alignItems: "center",
@@ -2903,7 +3015,7 @@ function Chip({ label, selected = false, onPress, icon, iconName, style }) {
2903
3015
  outputRange: [colors.border, colors.primary]
2904
3016
  });
2905
3017
  const resolvedIcon = iconName ? renderIcon(iconName, ms(13), selected ? colors.primaryForeground : colors.foreground) : icon;
2906
- 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(
2907
3019
  TouchableOpacity,
2908
3020
  {
2909
3021
  onPress: handlePress,
@@ -2912,7 +3024,7 @@ function Chip({ label, selected = false, onPress, icon, iconName, style }) {
2912
3024
  activeOpacity: 1,
2913
3025
  touchSoundDisabled: true
2914
3026
  },
2915
- /* @__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))
2916
3028
  ));
2917
3029
  }
2918
3030
  function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
@@ -2937,17 +3049,19 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
2937
3049
  }
2938
3050
  return optionValue === value;
2939
3051
  };
2940
- 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(
2941
3053
  Chip,
2942
3054
  {
2943
3055
  key: opt.value,
2944
3056
  label: opt.label,
2945
3057
  selected: isSelected(opt.value),
2946
- 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
2947
3061
  }
2948
3062
  )));
2949
3063
  }
2950
- var styles26 = StyleSheet.create({
3064
+ var styles27 = StyleSheet.create({
2951
3065
  wrapper: {},
2952
3066
  chip: {
2953
3067
  borderRadius: 999,
@@ -2994,7 +3108,7 @@ function ConfirmDialog({
2994
3108
  ref.current?.dismiss();
2995
3109
  }
2996
3110
  }, [visible]);
2997
- const renderBackdrop = (props) => /* @__PURE__ */ React25.createElement(
3111
+ const renderBackdrop = (props) => /* @__PURE__ */ React26.createElement(
2998
3112
  BottomSheetBackdrop,
2999
3113
  {
3000
3114
  ...props,
@@ -3003,25 +3117,25 @@ function ConfirmDialog({
3003
3117
  pressBehavior: "close"
3004
3118
  }
3005
3119
  );
3006
- return /* @__PURE__ */ React25.createElement(
3120
+ return /* @__PURE__ */ React26.createElement(
3007
3121
  BottomSheetModal,
3008
3122
  {
3009
3123
  ref,
3010
3124
  enableDynamicSizing: true,
3011
3125
  onDismiss: onCancel,
3012
3126
  backdropComponent: renderBackdrop,
3013
- backgroundStyle: [styles27.background, { backgroundColor: colors.card }],
3014
- handleIndicatorStyle: [styles27.handle, { backgroundColor: colors.border }],
3127
+ backgroundStyle: [styles28.background, { backgroundColor: colors.card }],
3128
+ handleIndicatorStyle: [styles28.handle, { backgroundColor: colors.border }],
3015
3129
  enablePanDownToClose: true
3016
3130
  },
3017
- /* @__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(
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(
3018
3132
  Button,
3019
3133
  {
3020
3134
  label: confirmLabel,
3021
3135
  variant: confirmVariant,
3022
3136
  fullWidth: true,
3023
3137
  onPress: onConfirm,
3024
- icon: /* @__PURE__ */ React25.createElement(
3138
+ icon: /* @__PURE__ */ React26.createElement(
3025
3139
  Feather$1,
3026
3140
  {
3027
3141
  name: confirmVariant === "destructive" ? "trash-2" : "check",
@@ -3030,19 +3144,19 @@ function ConfirmDialog({
3030
3144
  }
3031
3145
  )
3032
3146
  }
3033
- ), /* @__PURE__ */ React25.createElement(
3147
+ ), /* @__PURE__ */ React26.createElement(
3034
3148
  Button,
3035
3149
  {
3036
3150
  label: cancelLabel,
3037
3151
  variant: "secondary",
3038
3152
  fullWidth: true,
3039
3153
  onPress: onCancel,
3040
- icon: /* @__PURE__ */ React25.createElement(Feather$1, { name: "x", size: 15, color: colors.foreground })
3154
+ icon: /* @__PURE__ */ React26.createElement(Feather$1, { name: "x", size: 15, color: colors.foreground })
3041
3155
  }
3042
3156
  )))
3043
3157
  );
3044
3158
  }
3045
- var styles27 = StyleSheet.create({
3159
+ var styles28 = StyleSheet.create({
3046
3160
  background: {
3047
3161
  borderTopLeftRadius: ms(16),
3048
3162
  borderTopRightRadius: ms(16)
@@ -3072,17 +3186,27 @@ var styles27 = StyleSheet.create({
3072
3186
  marginTop: vs(8)
3073
3187
  }
3074
3188
  });
3075
- function LabelValue({ label, value, style }) {
3189
+ function LabelValue({ label, value, iconName, iconColor, style }) {
3076
3190
  const { colors } = useTheme();
3077
- 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);
3078
3193
  }
3079
- var styles28 = StyleSheet.create({
3194
+ var styles29 = StyleSheet.create({
3080
3195
  container: {
3081
3196
  flexDirection: "row",
3082
3197
  justifyContent: "space-between",
3083
3198
  alignItems: "center",
3084
3199
  gap: s(12)
3085
3200
  },
3201
+ labelSide: {
3202
+ flexDirection: "row",
3203
+ alignItems: "center",
3204
+ gap: s(4)
3205
+ },
3206
+ icon: {
3207
+ alignItems: "center",
3208
+ justifyContent: "center"
3209
+ },
3086
3210
  label: {
3087
3211
  fontFamily: "Poppins-Regular",
3088
3212
  fontSize: ms(13),
@@ -3095,22 +3219,19 @@ var styles28 = StyleSheet.create({
3095
3219
  textAlign: "right"
3096
3220
  }
3097
3221
  });
3098
- var MONTH_NAMES = [
3099
- "January",
3100
- "February",
3101
- "March",
3102
- "April",
3103
- "May",
3104
- "June",
3105
- "July",
3106
- "August",
3107
- "September",
3108
- "October",
3109
- "November",
3110
- "December"
3111
- ];
3112
- 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 }) {
3113
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
+ };
3114
3235
  const handlePrev = () => {
3115
3236
  selectionAsync();
3116
3237
  if (value.month === 1) {
@@ -3127,27 +3248,27 @@ function MonthPicker({ value, onChange, style }) {
3127
3248
  onChange({ month: value.month + 1, year: value.year });
3128
3249
  }
3129
3250
  };
3130
- 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(
3131
3252
  TouchableOpacity,
3132
3253
  {
3133
- style: styles29.arrow,
3254
+ style: styles30.arrow,
3134
3255
  onPress: handlePrev,
3135
3256
  activeOpacity: 0.6,
3136
3257
  touchSoundDisabled: true
3137
3258
  },
3138
- /* @__PURE__ */ React25.createElement(Entypo$1, { name: "chevron-left", size: 22, color: colors.foreground })
3139
- ), /* @__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(
3140
3261
  TouchableOpacity,
3141
3262
  {
3142
- style: styles29.arrow,
3263
+ style: styles30.arrow,
3143
3264
  onPress: handleNext,
3144
3265
  activeOpacity: 0.6,
3145
3266
  touchSoundDisabled: true
3146
3267
  },
3147
- /* @__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 })
3148
3269
  ));
3149
3270
  }
3150
- var styles29 = StyleSheet.create({
3271
+ var styles30 = StyleSheet.create({
3151
3272
  container: {
3152
3273
  flexDirection: "row",
3153
3274
  alignItems: "center",
@@ -3220,27 +3341,27 @@ function MediaCard({
3220
3341
  };
3221
3342
  const ratio = aspectRatioMap[aspectRatio];
3222
3343
  const resolvedActionIcon = actionIconName ? renderIcon(actionIconName, 18, actionActive ? colors.primary : colors.background) : actionIcon ?? renderIcon("heart", 18, actionActive ? colors.primary : colors.background);
3223
- const cardContent = /* @__PURE__ */ React25.createElement(
3344
+ const cardContent = /* @__PURE__ */ React26.createElement(
3224
3345
  View,
3225
3346
  {
3226
3347
  style: [
3227
- styles30.card,
3228
- hovered && styles30.cardHovered,
3348
+ styles31.card,
3349
+ hovered && styles31.cardHovered,
3229
3350
  style
3230
3351
  ],
3231
3352
  ...Platform.OS === "web" ? hoverHandlers : {}
3232
3353
  },
3233
- /* @__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(
3234
3355
  Image,
3235
3356
  {
3236
3357
  source: imageSource,
3237
- style: styles30.image,
3358
+ style: styles31.image,
3238
3359
  resizeMode: "cover"
3239
3360
  }
3240
- ) : /* @__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(
3241
3362
  TouchableOpacity,
3242
3363
  {
3243
- style: [styles30.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
3364
+ style: [styles31.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
3244
3365
  onPress: () => {
3245
3366
  impactLight();
3246
3367
  onActionPress?.();
@@ -3250,10 +3371,10 @@ function MediaCard({
3250
3371
  },
3251
3372
  resolvedActionIcon
3252
3373
  )),
3253
- (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)
3254
3375
  );
3255
3376
  if (onPress) {
3256
- 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(
3257
3378
  TouchableOpacity,
3258
3379
  {
3259
3380
  onPress: handlePress,
@@ -3267,7 +3388,7 @@ function MediaCard({
3267
3388
  }
3268
3389
  return cardContent;
3269
3390
  }
3270
- var styles30 = StyleSheet.create({
3391
+ var styles31 = StyleSheet.create({
3271
3392
  card: {
3272
3393
  borderRadius: RADIUS.md,
3273
3394
  // 14px — Airbnb property card spec
@@ -3343,11 +3464,11 @@ function CategoryChip({
3343
3464
  const textColor = selected ? colors.primaryForeground : colors.foregroundSubtle;
3344
3465
  const borderColor = selected ? colors.primary : colors.border;
3345
3466
  const resolvedIcon = typeof item.icon === "string" ? renderIcon(item.icon, 16, textColor) : item.icon ?? null;
3346
- 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(
3347
3468
  TouchableOpacity,
3348
3469
  {
3349
3470
  style: [
3350
- styles31.chip,
3471
+ styles32.chip,
3351
3472
  {
3352
3473
  backgroundColor: bgColor,
3353
3474
  borderColor
@@ -3359,9 +3480,9 @@ function CategoryChip({
3359
3480
  activeOpacity: 1,
3360
3481
  touchSoundDisabled: true
3361
3482
  },
3362
- resolvedIcon && /* @__PURE__ */ React25.createElement(View, { style: styles31.chipIcon }, resolvedIcon),
3363
- /* @__PURE__ */ React25.createElement(Text, { style: [styles31.chipLabel, { color: textColor }], allowFontScaling: true }, item.label),
3364
- 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)))
3365
3486
  ));
3366
3487
  }
3367
3488
  function CategoryStrip({
@@ -3383,15 +3504,15 @@ function CategoryStrip({
3383
3504
  onValueChange?.(v === value ? "" : v);
3384
3505
  }
3385
3506
  };
3386
- return /* @__PURE__ */ React25.createElement(
3507
+ return /* @__PURE__ */ React26.createElement(
3387
3508
  ScrollView,
3388
3509
  {
3389
3510
  horizontal: true,
3390
3511
  showsHorizontalScrollIndicator: false,
3391
- contentContainerStyle: [styles31.container, style],
3392
- style: styles31.scroll
3512
+ contentContainerStyle: [styles32.container, style],
3513
+ style: styles32.scroll
3393
3514
  },
3394
- 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(
3395
3516
  CategoryChip,
3396
3517
  {
3397
3518
  item: cat,
@@ -3401,7 +3522,7 @@ function CategoryStrip({
3401
3522
  )))
3402
3523
  );
3403
3524
  }
3404
- var styles31 = StyleSheet.create({
3525
+ var styles32 = StyleSheet.create({
3405
3526
  scroll: {
3406
3527
  flexGrow: 0
3407
3528
  },
@@ -3480,7 +3601,7 @@ function Pressable2({
3480
3601
  onPress();
3481
3602
  };
3482
3603
  const hoverScaleValue = hovered && hoverScale !== 1 ? hoverScale : 1;
3483
- return /* @__PURE__ */ React25.createElement(
3604
+ return /* @__PURE__ */ React26.createElement(
3484
3605
  Animated.View,
3485
3606
  {
3486
3607
  style: [
@@ -3489,7 +3610,7 @@ function Pressable2({
3489
3610
  ],
3490
3611
  ...Platform.OS === "web" ? hoverHandlers : {}
3491
3612
  },
3492
- /* @__PURE__ */ React25.createElement(
3613
+ /* @__PURE__ */ React26.createElement(
3493
3614
  TouchableOpacity,
3494
3615
  {
3495
3616
  onPress: handlePress,
@@ -3504,5 +3625,102 @@ function Pressable2({
3504
3625
  )
3505
3626
  );
3506
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
+ }
3507
3725
 
3508
- 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 };