@retray-dev/ui-kit 5.1.0 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React25 = require('react');
3
+ var React26 = require('react');
4
4
  var reactNative = require('react-native');
5
5
  var reactNativeSizeMatters = require('react-native-size-matters');
6
6
  var AntDesign = require('@expo/vector-icons/AntDesign');
@@ -21,7 +21,7 @@ var reactNativeSafeAreaContext = require('react-native-safe-area-context');
21
21
 
22
22
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
23
23
 
24
- var React25__default = /*#__PURE__*/_interopDefault(React25);
24
+ var React26__default = /*#__PURE__*/_interopDefault(React26);
25
25
  var AntDesign__default = /*#__PURE__*/_interopDefault(AntDesign);
26
26
  var Entypo__default = /*#__PURE__*/_interopDefault(Entypo);
27
27
  var Feather__default = /*#__PURE__*/_interopDefault(Feather);
@@ -150,23 +150,23 @@ function deriveColors(t, scheme) {
150
150
  }
151
151
 
152
152
  // src/theme/ThemeProvider.tsx
153
- var ThemeContext = React25.createContext({
153
+ var ThemeContext = React26.createContext({
154
154
  colors: deriveColors(defaultLight, "light"),
155
155
  colorScheme: "light"
156
156
  });
157
157
  function ThemeProvider({ children, theme, colorScheme = "system" }) {
158
158
  const systemScheme = reactNative.useColorScheme() ?? "light";
159
159
  const resolvedScheme = colorScheme === "system" ? systemScheme : colorScheme;
160
- const colors = React25.useMemo(() => {
160
+ const colors = React26.useMemo(() => {
161
161
  const base = resolvedScheme === "dark" ? defaultDark : defaultLight;
162
162
  const override = resolvedScheme === "dark" ? theme?.dark : theme?.light;
163
163
  const merged = override ? { ...base, ...override } : base;
164
164
  return deriveColors(merged, resolvedScheme);
165
165
  }, [resolvedScheme, theme]);
166
- return /* @__PURE__ */ React25__default.default.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
166
+ return /* @__PURE__ */ React26__default.default.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
167
167
  }
168
168
  function useTheme() {
169
- const context = React25.useContext(ThemeContext);
169
+ const context = React26.useContext(ThemeContext);
170
170
  if (!context) {
171
171
  throw new Error("useTheme must be used within a ThemeProvider");
172
172
  }
@@ -235,10 +235,10 @@ function Icon({ name, size, color, family }) {
235
235
  }
236
236
  if (!resolved) return null;
237
237
  const Component = resolved.component;
238
- return React25__default.default.createElement(Component, { name, size, color });
238
+ return React26__default.default.createElement(Component, { name, size, color });
239
239
  }
240
240
  function renderIcon(name, size, color) {
241
- return React25__default.default.createElement(Icon, { name, size, color });
241
+ return React26__default.default.createElement(Icon, { name, size, color });
242
242
  }
243
243
 
244
244
  // src/tokens.ts
@@ -406,7 +406,7 @@ var TYPOGRAPHY = {
406
406
  fontFamily: "Poppins-Medium",
407
407
  fontSize: 16,
408
408
  fontWeight: "500",
409
- lineHeight: 20,
409
+ lineHeight: 22,
410
410
  letterSpacing: 0
411
411
  },
412
412
  "button-sm": {
@@ -428,7 +428,7 @@ var containerSizeStyles = {
428
428
  var labelSizeStyles = {
429
429
  sm: { ...TYPOGRAPHY["button-sm"], fontSize: ms(TYPOGRAPHY["button-sm"].fontSize) },
430
430
  md: { ...TYPOGRAPHY["button-lg"], fontSize: ms(TYPOGRAPHY["button-lg"].fontSize) },
431
- lg: { ...TYPOGRAPHY["button-lg"], fontSize: ms(TYPOGRAPHY["button-lg"].fontSize + 1) }
431
+ lg: { ...TYPOGRAPHY["button-lg"], fontSize: ms(TYPOGRAPHY["button-lg"].fontSize + 1), lineHeight: mvs(24) }
432
432
  };
433
433
  var iconSizeMap = { sm: 16, md: 18, lg: 20 };
434
434
  function Button({
@@ -448,7 +448,7 @@ function Button({
448
448
  }) {
449
449
  const { colors } = useTheme();
450
450
  const isDisabled = disabled || loading;
451
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
451
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
452
452
  const handlePressIn = () => {
453
453
  if (isDisabled) return;
454
454
  reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver, speed: 40, bounciness: 0 }).start();
@@ -472,9 +472,13 @@ function Button({
472
472
  text: { color: colors.foreground },
473
473
  destructive: { color: colors.destructiveForeground }
474
474
  }[variant];
475
- const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], iconColor ?? labelVariantStyle.color) : typeof icon === "function" ? icon({ label, size, variant }) : icon;
475
+ const textColor = iconColor ?? labelVariantStyle.color;
476
+ const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], textColor) : typeof icon === "function" ? icon({ label, size, variant, color: textColor }) : icon;
476
477
  const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.foreground;
477
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [fullWidth && styles.fullWidth, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React25__default.default.createElement(
478
+ const styleArray = Array.isArray(style) ? style : style ? [style] : [];
479
+ const flatStyle = reactNative.StyleSheet.flatten(styleArray);
480
+ const { flex, ...restStyle } = flatStyle || {};
481
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [fullWidth && styles.fullWidth, flex !== void 0 && { flex }, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React26__default.default.createElement(
478
482
  reactNative.TouchableOpacity,
479
483
  {
480
484
  style: [
@@ -483,7 +487,7 @@ function Button({
483
487
  containerSizeStyles[size],
484
488
  fullWidth && styles.fullWidth,
485
489
  isDisabled && styles.disabled,
486
- style
490
+ restStyle
487
491
  ],
488
492
  disabled: isDisabled,
489
493
  activeOpacity: 1,
@@ -493,14 +497,15 @@ function Button({
493
497
  onPressOut: handlePressOut,
494
498
  ...props
495
499
  },
496
- loading ? /* @__PURE__ */ React25__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, effectiveIcon), /* @__PURE__ */ React25__default.default.createElement(
500
+ loading ? /* @__PURE__ */ React26__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, effectiveIcon), /* @__PURE__ */ React26__default.default.createElement(
497
501
  reactNative.Text,
498
502
  {
499
503
  style: [styles.label, labelVariantStyle, labelSizeStyles[size], effectiveIcon ? styles.labelWithIcon : void 0],
500
- allowFontScaling: true
504
+ allowFontScaling: true,
505
+ numberOfLines: 1
501
506
  },
502
507
  label
503
- ), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, effectiveIcon))
508
+ ), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, effectiveIcon))
504
509
  ));
505
510
  }
506
511
  var styles = reactNative.StyleSheet.create({
@@ -518,12 +523,46 @@ var styles = reactNative.StyleSheet.create({
518
523
  opacity: 0.45
519
524
  },
520
525
  label: {
521
- fontFamily: "Poppins-Medium"
526
+ fontFamily: "Poppins-Medium",
527
+ flexShrink: 1
522
528
  },
523
529
  labelWithIcon: {
524
530
  marginHorizontal: s(6)
525
531
  }
526
532
  });
533
+ function ButtonGroup({ children, gap = 12, vertical = false, style }) {
534
+ return /* @__PURE__ */ React26__default.default.createElement(
535
+ reactNative.View,
536
+ {
537
+ style: [
538
+ styles2.container,
539
+ vertical ? styles2.vertical : styles2.horizontal,
540
+ { gap: s(gap) },
541
+ style
542
+ ]
543
+ },
544
+ React26__default.default.Children.map(
545
+ children,
546
+ (child) => React26__default.default.isValidElement(child) ? React26__default.default.cloneElement(child, {
547
+ style: [
548
+ child.props.style,
549
+ { flex: 1 }
550
+ ]
551
+ }) : child
552
+ )
553
+ );
554
+ }
555
+ var styles2 = reactNative.StyleSheet.create({
556
+ container: {
557
+ width: "100%"
558
+ },
559
+ horizontal: {
560
+ flexDirection: "row"
561
+ },
562
+ vertical: {
563
+ flexDirection: "column"
564
+ }
565
+ });
527
566
  var nativeDriver2 = reactNative.Platform.OS !== "web";
528
567
  var sizeMap = {
529
568
  sm: { container: s(32), icon: 16 },
@@ -545,7 +584,7 @@ function IconButton({
545
584
  }) {
546
585
  const { colors } = useTheme();
547
586
  const isDisabled = disabled || loading;
548
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
587
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
549
588
  const handlePressIn = () => {
550
589
  if (isDisabled) return;
551
590
  reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver2, speed: 40, bounciness: 0 }).start();
@@ -577,14 +616,14 @@ function IconButton({
577
616
  const showBadge = badge !== void 0 && badge !== false && badge !== 0;
578
617
  const badgeCount = typeof badge === "number" ? Math.min(badge, 99) : null;
579
618
  const showCount = typeof badge === "number" && badge > 0;
580
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [styles2.wrapper, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React25__default.default.createElement(
619
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [styles3.wrapper, { transform: [{ scale: scale2 }] }] }, /* @__PURE__ */ React26__default.default.createElement(
581
620
  reactNative.TouchableOpacity,
582
621
  {
583
622
  style: [
584
- styles2.base,
623
+ styles3.base,
585
624
  containerVariantStyle,
586
625
  { width: containerSize, height: containerSize },
587
- isDisabled && styles2.disabled,
626
+ isDisabled && styles3.disabled,
588
627
  style
589
628
  ],
590
629
  disabled: isDisabled,
@@ -595,14 +634,14 @@ function IconButton({
595
634
  onPressOut: handlePressOut,
596
635
  ...props
597
636
  },
598
- loading ? /* @__PURE__ */ React25__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : resolvedIcon
599
- ), showBadge && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [
600
- styles2.badge,
637
+ loading ? /* @__PURE__ */ React26__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : resolvedIcon
638
+ ), showBadge && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
639
+ styles3.badge,
601
640
  { backgroundColor: colors.primary },
602
- showCount ? styles2.badgeCount : styles2.badgeDot
603
- ] }, showCount && /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles2.badgeText, { color: colors.primaryForeground }] }, badgeCount)));
641
+ showCount ? styles3.badgeCount : styles3.badgeDot
642
+ ] }, showCount && /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles3.badgeText, { color: colors.primaryForeground }] }, badgeCount)));
604
643
  }
605
- var styles2 = reactNative.StyleSheet.create({
644
+ var styles3 = reactNative.StyleSheet.create({
606
645
  wrapper: {
607
646
  alignSelf: "flex-start"
608
647
  },
@@ -679,7 +718,7 @@ function Text3({ variant = "body-md", color, style, children, ...props }) {
679
718
  const { colors } = useTheme();
680
719
  const colorKey = defaultColorVariant[variant] ?? "foreground";
681
720
  const resolvedColor = color ?? colors[colorKey];
682
- return /* @__PURE__ */ React25__default.default.createElement(
721
+ return /* @__PURE__ */ React26__default.default.createElement(
683
722
  reactNative.Text,
684
723
  {
685
724
  style: [variantStyles[variant], { color: resolvedColor }, style],
@@ -692,17 +731,17 @@ function Text3({ variant = "body-md", color, style, children, ...props }) {
692
731
  var webInputResetStyle = reactNative.Platform.OS === "web" ? { outlineStyle: "none", outlineWidth: 0, outlineColor: "transparent", boxShadow: "none" } : {};
693
732
  function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type = "text", containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, ...props }) {
694
733
  const { colors } = useTheme();
695
- const [focused, setFocused] = React25.useState(false);
696
- const [showPassword, setShowPassword] = React25.useState(false);
734
+ const [focused, setFocused] = React26.useState(false);
735
+ const [showPassword, setShowPassword] = React26.useState(false);
697
736
  const isPassword = type === "password";
698
737
  const effectiveSecure = isPassword ? !showPassword : secureTextEntry;
699
738
  const effectivePrefix = prefixIcon ? renderIcon(prefixIcon, 20, prefixIconColor ?? colors.foregroundMuted) : prefix;
700
- const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles3.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.foregroundMuted })) : suffixIcon ? renderIcon(suffixIcon, 20, suffixIconColor ?? colors.foregroundMuted) : suffix;
701
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles3.container, containerStyle] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles3.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React25__default.default.createElement(
739
+ const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.TouchableOpacity, { onPress: () => setShowPassword(!showPassword), style: styles4.passwordToggle, activeOpacity: 0.6 }, /* @__PURE__ */ React26__default.default.createElement(vectorIcons.AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.foregroundMuted })) : suffixIcon ? renderIcon(suffixIcon, 20, suffixIconColor ?? colors.foregroundMuted) : suffix;
740
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles4.container, containerStyle] }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles4.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React26__default.default.createElement(
702
741
  reactNative.View,
703
742
  {
704
743
  style: [
705
- styles3.inputWrapper,
744
+ styles4.inputWrapper,
706
745
  {
707
746
  borderColor: error ? colors.destructive : focused ? colors.primary : colors.border,
708
747
  backgroundColor: colors.background
@@ -710,12 +749,12 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, p
710
749
  inputWrapperStyle
711
750
  ]
712
751
  },
713
- effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles3.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles3.prefixContainer }, effectivePrefix) : null,
714
- /* @__PURE__ */ React25__default.default.createElement(
752
+ effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles4.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles4.prefixContainer }, effectivePrefix) : null,
753
+ /* @__PURE__ */ React26__default.default.createElement(
715
754
  reactNative.TextInput,
716
755
  {
717
756
  style: [
718
- styles3.input,
757
+ styles4.input,
719
758
  {
720
759
  color: colors.foreground
721
760
  },
@@ -736,10 +775,10 @@ function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, p
736
775
  ...props
737
776
  }
738
777
  ),
739
- effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles3.suffixText, { color: colors.foregroundMuted }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles3.suffixContainer }, effectiveSuffix) : null
740
- ), error ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles3.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles3.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
778
+ effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles4.suffixText, { color: colors.foregroundMuted }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles4.suffixContainer }, effectiveSuffix) : null
779
+ ), error ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles4.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles4.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
741
780
  }
742
- var styles3 = reactNative.StyleSheet.create({
781
+ var styles4 = reactNative.StyleSheet.create({
743
782
  container: {
744
783
  gap: vs(8)
745
784
  },
@@ -830,9 +869,9 @@ function Badge({ label, children, variant = "default", size = "md", icon, iconNa
830
869
  }[variant];
831
870
  const effectiveIcon = iconName ? renderIcon(iconName, sizeIconSize[size], iconColor ?? textColor) : icon;
832
871
  const content = children ?? label;
833
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles4.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, effectiveIcon, typeof content === "string" ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles4.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
872
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles5.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, effectiveIcon, typeof content === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles5.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
834
873
  }
835
- var styles4 = reactNative.StyleSheet.create({
874
+ var styles5 = reactNative.StyleSheet.create({
836
875
  container: {
837
876
  borderRadius: 9999,
838
877
  alignSelf: "flex-start",
@@ -846,7 +885,7 @@ var styles4 = reactNative.StyleSheet.create({
846
885
  var nativeDriver3 = reactNative.Platform.OS !== "web";
847
886
  function Card({ children, variant = "elevated", onPress, style }) {
848
887
  const { colors } = useTheme();
849
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
888
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
850
889
  const handlePressIn = () => {
851
890
  if (!onPress) return;
852
891
  reactNative.Animated.spring(scale2, {
@@ -893,9 +932,9 @@ function Card({ children, variant = "elevated", onPress, style }) {
893
932
  elevation: 0
894
933
  }
895
934
  }[variant];
896
- const cardContent = /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles5.card, variantStyle, style] }, children);
935
+ const cardContent = /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles6.card, variantStyle, style] }, children);
897
936
  if (onPress) {
898
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25__default.default.createElement(
937
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26__default.default.createElement(
899
938
  reactNative.TouchableOpacity,
900
939
  {
901
940
  onPress: handlePress,
@@ -910,23 +949,23 @@ function Card({ children, variant = "elevated", onPress, style }) {
910
949
  return cardContent;
911
950
  }
912
951
  function CardHeader({ children, style }) {
913
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles5.header, style] }, children);
952
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles6.header, style] }, children);
914
953
  }
915
954
  function CardTitle({ children, style }) {
916
955
  const { colors } = useTheme();
917
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles5.title, { color: colors.foreground }, style], allowFontScaling: true }, children);
956
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles6.title, { color: colors.foreground }, style], allowFontScaling: true }, children);
918
957
  }
919
958
  function CardDescription({ children, style }) {
920
959
  const { colors } = useTheme();
921
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles5.description, { color: colors.foregroundMuted }, style], allowFontScaling: true }, children);
960
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles6.description, { color: colors.foregroundMuted }, style], allowFontScaling: true }, children);
922
961
  }
923
962
  function CardContent({ children, style }) {
924
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles5.content, style] }, children);
963
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles6.content, style] }, children);
925
964
  }
926
965
  function CardFooter({ children, style }) {
927
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles5.footer, style] }, children);
966
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles6.footer, style] }, children);
928
967
  }
929
- var styles5 = reactNative.StyleSheet.create({
968
+ var styles6 = reactNative.StyleSheet.create({
930
969
  card: {
931
970
  borderRadius: 14,
932
971
  // RADIUS.md — Airbnb property card spec
@@ -961,18 +1000,18 @@ var styles5 = reactNative.StyleSheet.create({
961
1000
  });
962
1001
  function Separator({ orientation = "horizontal", style }) {
963
1002
  const { colors } = useTheme();
964
- return /* @__PURE__ */ React25__default.default.createElement(
1003
+ return /* @__PURE__ */ React26__default.default.createElement(
965
1004
  reactNative.View,
966
1005
  {
967
1006
  style: [
968
- orientation === "horizontal" ? styles6.horizontal : styles6.vertical,
1007
+ orientation === "horizontal" ? styles7.horizontal : styles7.vertical,
969
1008
  { backgroundColor: colors.border },
970
1009
  style
971
1010
  ]
972
1011
  }
973
1012
  );
974
1013
  }
975
- var styles6 = reactNative.StyleSheet.create({
1014
+ var styles7 = reactNative.StyleSheet.create({
976
1015
  horizontal: {
977
1016
  height: 1,
978
1017
  width: "100%"
@@ -995,18 +1034,18 @@ var labelFontSize = {
995
1034
  function Spinner({ size = "md", color, label, ...props }) {
996
1035
  const { colors } = useTheme();
997
1036
  if (label) {
998
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles7.wrapper }, /* @__PURE__ */ React25__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props }), /* @__PURE__ */ React25__default.default.createElement(
1037
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles8.wrapper }, /* @__PURE__ */ React26__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props }), /* @__PURE__ */ React26__default.default.createElement(
999
1038
  reactNative.Text,
1000
1039
  {
1001
- style: [styles7.label, { color: colors.foregroundMuted, fontSize: labelFontSize[size] }],
1040
+ style: [styles8.label, { color: colors.foregroundMuted, fontSize: labelFontSize[size] }],
1002
1041
  allowFontScaling: true
1003
1042
  },
1004
1043
  label
1005
1044
  ));
1006
1045
  }
1007
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props });
1046
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props });
1008
1047
  }
1009
- var styles7 = reactNative.StyleSheet.create({
1048
+ var styles8 = reactNative.StyleSheet.create({
1010
1049
  wrapper: {
1011
1050
  alignItems: "center",
1012
1051
  gap: vs(6)
@@ -1025,10 +1064,10 @@ function Skeleton({
1025
1064
  style
1026
1065
  }) {
1027
1066
  const { colors, colorScheme } = useTheme();
1028
- const shimmerAnim = React25.useRef(new reactNative.Animated.Value(0)).current;
1029
- const [containerWidth, setContainerWidth] = React25.useState(300);
1067
+ const shimmerAnim = React26.useRef(new reactNative.Animated.Value(0)).current;
1068
+ const [containerWidth, setContainerWidth] = React26.useState(300);
1030
1069
  const shimmerHighlight = colorScheme === "dark" ? "rgba(255,255,255,0.08)" : "rgba(255,255,255,0.7)";
1031
- React25.useEffect(() => {
1070
+ React26.useEffect(() => {
1032
1071
  const animation = reactNative.Animated.loop(
1033
1072
  reactNative.Animated.timing(shimmerAnim, { toValue: 1, duration: 1200, useNativeDriver: true })
1034
1073
  );
@@ -1042,17 +1081,17 @@ function Skeleton({
1042
1081
  const resolvedWidth = preset === "circle" ? s(diameter) : preset === "text" ? "60%" : width;
1043
1082
  const resolvedHeight = preset === "circle" ? s(diameter) : preset === "text" ? 14 : height;
1044
1083
  const resolvedRadius = preset === "circle" ? 9999 : preset === "text" ? 4 : borderRadius;
1045
- return /* @__PURE__ */ React25__default.default.createElement(
1084
+ return /* @__PURE__ */ React26__default.default.createElement(
1046
1085
  reactNative.View,
1047
1086
  {
1048
1087
  style: [
1049
- styles8.base,
1088
+ styles9.base,
1050
1089
  { width: resolvedWidth, height: resolvedHeight, borderRadius: resolvedRadius, backgroundColor: colors.surface },
1051
1090
  style
1052
1091
  ],
1053
1092
  onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width)
1054
1093
  },
1055
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [reactNative.StyleSheet.absoluteFill, { transform: [{ translateX }] }] }, /* @__PURE__ */ React25__default.default.createElement(
1094
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [reactNative.StyleSheet.absoluteFill, { transform: [{ translateX }] }] }, /* @__PURE__ */ React26__default.default.createElement(
1056
1095
  expoLinearGradient.LinearGradient,
1057
1096
  {
1058
1097
  colors: ["transparent", shimmerHighlight, "transparent"],
@@ -1063,7 +1102,7 @@ function Skeleton({
1063
1102
  ))
1064
1103
  );
1065
1104
  }
1066
- var styles8 = reactNative.StyleSheet.create({
1105
+ var styles9 = reactNative.StyleSheet.create({
1067
1106
  base: {
1068
1107
  overflow: "hidden"
1069
1108
  }
@@ -1086,12 +1125,22 @@ var statusSizeMap = {
1086
1125
  lg: 13,
1087
1126
  xl: 16
1088
1127
  };
1089
- function Avatar({ src, fallback, size = "md", status, style }) {
1128
+ function getInitials(fallback, fallbackText) {
1129
+ if (fallback) return fallback.slice(0, 2).toUpperCase();
1130
+ if (fallbackText) {
1131
+ const words = fallbackText.trim().split(/\s+/);
1132
+ if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
1133
+ return (words[0][0] + words[words.length - 1][0]).toUpperCase();
1134
+ }
1135
+ return "?";
1136
+ }
1137
+ function Avatar({ src, fallback, fallbackText, size = "md", status, style }) {
1090
1138
  const { colors } = useTheme();
1091
- const [imageError, setImageError] = React25.useState(false);
1092
- const dimension = sizeMap3[size];
1139
+ const [imageError, setImageError] = React26.useState(false);
1140
+ const dimension = typeof size === "number" ? size : sizeMap3[size];
1141
+ const fontSize = typeof size === "number" ? size * 0.38 : fontSizeMap[size];
1093
1142
  const showFallback = !src || imageError;
1094
- const statusSize = statusSizeMap[size];
1143
+ const statusSize = typeof size === "number" ? size * 0.25 : statusSizeMap[size];
1095
1144
  const statusColor = {
1096
1145
  online: "#22c55e",
1097
1146
  offline: "transparent",
@@ -1105,25 +1154,25 @@ function Avatar({ src, fallback, size = "md", status, style }) {
1105
1154
  backgroundColor: colors.surface,
1106
1155
  overflow: "hidden"
1107
1156
  };
1108
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles9.wrapper, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles9.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React25__default.default.createElement(
1157
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles10.wrapper, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles10.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React26__default.default.createElement(
1109
1158
  reactNative.Image,
1110
1159
  {
1111
1160
  source: { uri: src },
1112
1161
  style: { width: dimension, height: dimension },
1113
1162
  onError: () => setImageError(true)
1114
1163
  }
1115
- ) : /* @__PURE__ */ React25__default.default.createElement(
1164
+ ) : /* @__PURE__ */ React26__default.default.createElement(
1116
1165
  reactNative.Text,
1117
1166
  {
1118
- style: [styles9.fallback, { color: colors.foregroundMuted, fontSize: fontSizeMap[size] }],
1167
+ style: [styles10.fallback, { color: colors.foregroundMuted, fontSize }],
1119
1168
  allowFontScaling: true
1120
1169
  },
1121
- fallback?.slice(0, 2).toUpperCase() ?? "?"
1122
- )), status && /* @__PURE__ */ React25__default.default.createElement(
1170
+ getInitials(fallback, fallbackText)
1171
+ )), status && /* @__PURE__ */ React26__default.default.createElement(
1123
1172
  reactNative.View,
1124
1173
  {
1125
1174
  style: [
1126
- styles9.statusDot,
1175
+ styles10.statusDot,
1127
1176
  {
1128
1177
  width: statusSize,
1129
1178
  height: statusSize,
@@ -1136,7 +1185,7 @@ function Avatar({ src, fallback, size = "md", status, style }) {
1136
1185
  }
1137
1186
  ));
1138
1187
  }
1139
- var styles9 = reactNative.StyleSheet.create({
1188
+ var styles10 = reactNative.StyleSheet.create({
1140
1189
  wrapper: {
1141
1190
  alignSelf: "flex-start",
1142
1191
  position: "relative"
@@ -1161,11 +1210,11 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
1161
1210
  const accentColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : variant === "warning" ? colors.warning : colors.primary;
1162
1211
  const titleColor = variant === "default" ? colors.foreground : accentColor;
1163
1212
  const descColor = variant === "default" ? colors.foregroundMuted : accentColor;
1164
- const defaultIcon = variant === "success" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: 17, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 16, color: accentColor });
1213
+ const defaultIcon = variant === "success" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: 17, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 16, color: accentColor });
1165
1214
  const effectiveIcon = iconName ? renderIcon(iconName, 16, iconColor ?? accentColor) : icon ?? defaultIcon;
1166
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles10.container, { backgroundColor: bgColor, borderColor }, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles10.iconSlot }, effectiveIcon), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles10.content }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles10.title, { color: titleColor }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles10.description, { color: descColor }], allowFontScaling: true }, description) : null));
1215
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles11.container, { backgroundColor: bgColor, borderColor }, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles11.iconSlot }, effectiveIcon), /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles11.content }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles11.title, { color: titleColor }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles11.description, { color: descColor }], allowFontScaling: true }, description) : null));
1167
1216
  }
1168
- var styles10 = reactNative.StyleSheet.create({
1217
+ var styles11 = reactNative.StyleSheet.create({
1169
1218
  container: {
1170
1219
  flexDirection: "row",
1171
1220
  alignItems: "flex-start",
@@ -1197,9 +1246,9 @@ var styles10 = reactNative.StyleSheet.create({
1197
1246
  function Progress({ value = 0, max = 100, variant = "default", style }) {
1198
1247
  const { colors } = useTheme();
1199
1248
  const percent = Math.min(Math.max(value / max * 100, 0), 100);
1200
- const [trackWidth, setTrackWidth] = React25.useState(0);
1201
- const animatedWidth = React25.useRef(new reactNative.Animated.Value(0)).current;
1202
- React25.useEffect(() => {
1249
+ const [trackWidth, setTrackWidth] = React26.useState(0);
1250
+ const animatedWidth = React26.useRef(new reactNative.Animated.Value(0)).current;
1251
+ React26.useEffect(() => {
1203
1252
  if (trackWidth === 0) return;
1204
1253
  reactNative.Animated.spring(animatedWidth, {
1205
1254
  toValue: percent / 100 * trackWidth,
@@ -1209,21 +1258,21 @@ function Progress({ value = 0, max = 100, variant = "default", style }) {
1209
1258
  }).start();
1210
1259
  }, [percent, trackWidth]);
1211
1260
  const indicatorColor = variant === "success" ? colors.success : variant === "warning" ? colors.warning : variant === "destructive" ? colors.destructive : colors.primary;
1212
- return /* @__PURE__ */ React25__default.default.createElement(
1261
+ return /* @__PURE__ */ React26__default.default.createElement(
1213
1262
  reactNative.View,
1214
1263
  {
1215
- style: [styles11.track, { backgroundColor: colors.surface }, style],
1264
+ style: [styles12.track, { backgroundColor: colors.surface }, style],
1216
1265
  onLayout: (e) => setTrackWidth(e.nativeEvent.layout.width)
1217
1266
  },
1218
- /* @__PURE__ */ React25__default.default.createElement(
1267
+ /* @__PURE__ */ React26__default.default.createElement(
1219
1268
  reactNative.Animated.View,
1220
1269
  {
1221
- style: [styles11.indicator, { width: animatedWidth, backgroundColor: indicatorColor }]
1270
+ style: [styles12.indicator, { width: animatedWidth, backgroundColor: indicatorColor }]
1222
1271
  }
1223
1272
  )
1224
1273
  );
1225
1274
  }
1226
- var styles11 = reactNative.StyleSheet.create({
1275
+ var styles12 = reactNative.StyleSheet.create({
1227
1276
  track: {
1228
1277
  height: vs(8),
1229
1278
  borderRadius: 9999,
@@ -1239,39 +1288,39 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, siz
1239
1288
  const { colors } = useTheme();
1240
1289
  const isCompact = size === "compact";
1241
1290
  const effectiveIcon = iconName ? renderIcon(iconName, isCompact ? 32 : 48, iconColor ?? colors.foregroundMuted) : icon;
1242
- return /* @__PURE__ */ React25__default.default.createElement(
1291
+ return /* @__PURE__ */ React26__default.default.createElement(
1243
1292
  reactNative.View,
1244
1293
  {
1245
1294
  style: [
1246
- styles12.container,
1247
- isCompact && styles12.containerCompact,
1295
+ styles13.container,
1296
+ isCompact && styles13.containerCompact,
1248
1297
  { borderColor: colors.border },
1249
1298
  style
1250
1299
  ]
1251
1300
  },
1252
- effectiveIcon ? /* @__PURE__ */ React25__default.default.createElement(
1301
+ effectiveIcon ? /* @__PURE__ */ React26__default.default.createElement(
1253
1302
  reactNative.View,
1254
1303
  {
1255
1304
  style: [
1256
- styles12.iconWrapper,
1257
- isCompact && styles12.iconWrapperCompact,
1305
+ styles13.iconWrapper,
1306
+ isCompact && styles13.iconWrapperCompact,
1258
1307
  { backgroundColor: colors.surface }
1259
1308
  ]
1260
1309
  },
1261
1310
  effectiveIcon
1262
1311
  ) : null,
1263
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles12.textWrapper }, /* @__PURE__ */ React25__default.default.createElement(
1312
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles13.textWrapper }, /* @__PURE__ */ React26__default.default.createElement(
1264
1313
  reactNative.Text,
1265
1314
  {
1266
- style: [styles12.title, isCompact && styles12.titleCompact, { color: colors.foreground }],
1315
+ style: [styles13.title, isCompact && styles13.titleCompact, { color: colors.foreground }],
1267
1316
  allowFontScaling: true
1268
1317
  },
1269
1318
  title
1270
- ), description && !isCompact ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles12.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null),
1271
- action && !isCompact ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles12.action }, action) : null
1319
+ ), description && !isCompact ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles13.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null),
1320
+ action && !isCompact ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles13.action }, action) : null
1272
1321
  );
1273
1322
  }
1274
- var styles12 = reactNative.StyleSheet.create({
1323
+ var styles13 = reactNative.StyleSheet.create({
1275
1324
  container: {
1276
1325
  alignItems: "center",
1277
1326
  justifyContent: "center",
@@ -1326,6 +1375,9 @@ function Textarea({
1326
1375
  error,
1327
1376
  hint,
1328
1377
  rows = 4,
1378
+ prefixIcon,
1379
+ prefixIconNode,
1380
+ prefixIconColor,
1329
1381
  containerStyle,
1330
1382
  style,
1331
1383
  onFocus,
@@ -1333,58 +1385,84 @@ function Textarea({
1333
1385
  ...props
1334
1386
  }) {
1335
1387
  const { colors } = useTheme();
1336
- const [focused, setFocused] = React25.useState(false);
1337
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles13.container, containerStyle] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles13.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React25__default.default.createElement(
1338
- reactNative.TextInput,
1388
+ const [focused, setFocused] = React26.useState(false);
1389
+ const resolvedPrefixIcon = prefixIcon ? renderIcon(prefixIcon, ms(16), prefixIconColor ?? colors.foregroundMuted) : prefixIconNode;
1390
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles14.container, containerStyle] }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles14.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React26__default.default.createElement(
1391
+ reactNative.View,
1339
1392
  {
1340
- multiline: true,
1341
- numberOfLines: rows,
1342
- textAlignVertical: "top",
1343
1393
  style: [
1344
- styles13.input,
1394
+ styles14.inputWrapper,
1345
1395
  {
1346
1396
  borderColor: error ? colors.destructive : focused ? colors.ring ?? colors.primary : colors.border,
1347
- color: colors.foreground,
1348
- backgroundColor: colors.background,
1349
- minHeight: rows * vs(30)
1397
+ backgroundColor: colors.background
1398
+ }
1399
+ ]
1400
+ },
1401
+ resolvedPrefixIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles14.prefixIcon }, resolvedPrefixIcon) : null,
1402
+ /* @__PURE__ */ React26__default.default.createElement(
1403
+ reactNative.TextInput,
1404
+ {
1405
+ multiline: true,
1406
+ numberOfLines: rows,
1407
+ textAlignVertical: "top",
1408
+ style: [
1409
+ styles14.input,
1410
+ {
1411
+ color: colors.foreground,
1412
+ minHeight: rows * vs(30)
1413
+ },
1414
+ webInputResetStyle2,
1415
+ style
1416
+ ],
1417
+ onFocus: (e) => {
1418
+ setFocused(true);
1419
+ onFocus?.(e);
1350
1420
  },
1351
- webInputResetStyle2,
1352
- style
1353
- ],
1354
- onFocus: (e) => {
1355
- setFocused(true);
1356
- onFocus?.(e);
1357
- },
1358
- onBlur: (e) => {
1359
- setFocused(false);
1360
- onBlur?.(e);
1361
- },
1362
- placeholderTextColor: colors.foregroundMuted,
1363
- allowFontScaling: true,
1364
- ...props
1365
- }
1366
- ), error ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles13.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles13.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
1421
+ onBlur: (e) => {
1422
+ setFocused(false);
1423
+ onBlur?.(e);
1424
+ },
1425
+ placeholderTextColor: colors.foregroundMuted,
1426
+ allowFontScaling: true,
1427
+ ...props
1428
+ }
1429
+ )
1430
+ ), error ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles14.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null, !error && hint ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles14.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
1367
1431
  }
1368
- var styles13 = reactNative.StyleSheet.create({
1432
+ var styles14 = reactNative.StyleSheet.create({
1369
1433
  container: {
1370
- gap: vs(8)
1434
+ gap: vs(4)
1371
1435
  },
1372
1436
  label: {
1373
1437
  fontFamily: "Poppins-Medium",
1374
- fontSize: ms(13)
1438
+ fontSize: ms(13),
1439
+ lineHeight: vs(18),
1440
+ marginBottom: vs(2)
1375
1441
  },
1376
- input: {
1377
- fontFamily: "Poppins-Regular",
1378
- borderWidth: 2,
1379
- borderRadius: ms(8),
1442
+ inputWrapper: {
1443
+ borderWidth: 1,
1444
+ borderRadius: 8,
1380
1445
  paddingHorizontal: s(14),
1381
1446
  paddingVertical: vs(11),
1382
- fontSize: ms(15),
1383
- includeFontPadding: false
1447
+ gap: s(8)
1448
+ },
1449
+ prefixIcon: {
1450
+ alignItems: "flex-start",
1451
+ justifyContent: "flex-start",
1452
+ paddingTop: vs(2)
1453
+ },
1454
+ input: {
1455
+ fontFamily: "Poppins-Regular",
1456
+ fontSize: ms(14),
1457
+ lineHeight: vs(22),
1458
+ padding: 0,
1459
+ margin: 0
1384
1460
  },
1385
1461
  helperText: {
1386
1462
  fontFamily: "Poppins-Regular",
1387
- fontSize: ms(13)
1463
+ fontSize: ms(12),
1464
+ lineHeight: vs(16),
1465
+ marginTop: vs(4)
1388
1466
  }
1389
1467
  });
1390
1468
  var nativeDriver4 = reactNative.Platform.OS !== "web";
@@ -1396,10 +1474,10 @@ function Checkbox({
1396
1474
  style
1397
1475
  }) {
1398
1476
  const { colors } = useTheme();
1399
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
1400
- const bgOpacity = React25.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1401
- const checkOpacity = React25.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1402
- React25.useEffect(() => {
1477
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
1478
+ const bgOpacity = React26.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1479
+ const checkOpacity = React26.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1480
+ React26.useEffect(() => {
1403
1481
  reactNative.Animated.parallel([
1404
1482
  reactNative.Animated.timing(bgOpacity, {
1405
1483
  toValue: checked ? 1 : 0,
@@ -1428,10 +1506,10 @@ function Checkbox({
1428
1506
  const handlePressOut = () => {
1429
1507
  reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver4, speed: 40, bounciness: 0 }).start();
1430
1508
  };
1431
- return /* @__PURE__ */ React25__default.default.createElement(
1509
+ return /* @__PURE__ */ React26__default.default.createElement(
1432
1510
  reactNative.TouchableOpacity,
1433
1511
  {
1434
- style: [styles14.row, style],
1512
+ style: [styles15.row, style],
1435
1513
  onPress: () => {
1436
1514
  selectionAsync();
1437
1515
  onCheckedChange?.(!checked);
@@ -1442,11 +1520,11 @@ function Checkbox({
1442
1520
  activeOpacity: 1,
1443
1521
  touchSoundDisabled: true
1444
1522
  },
1445
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25__default.default.createElement(
1523
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26__default.default.createElement(
1446
1524
  reactNative.Animated.View,
1447
1525
  {
1448
1526
  style: [
1449
- styles14.box,
1527
+ styles15.box,
1450
1528
  {
1451
1529
  borderColor,
1452
1530
  backgroundColor,
@@ -1454,19 +1532,19 @@ function Checkbox({
1454
1532
  }
1455
1533
  ]
1456
1534
  },
1457
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: { opacity: checkOpacity } }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles14.checkmark, { borderColor: colors.primaryForeground }] }))
1535
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: { opacity: checkOpacity } }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles15.checkmark, { borderColor: colors.primaryForeground }] }))
1458
1536
  )),
1459
- label ? /* @__PURE__ */ React25__default.default.createElement(
1537
+ label ? /* @__PURE__ */ React26__default.default.createElement(
1460
1538
  reactNative.Text,
1461
1539
  {
1462
- style: [styles14.label, { color: disabled ? colors.foregroundMuted : colors.foreground }],
1540
+ style: [styles15.label, { color: disabled ? colors.foregroundMuted : colors.foreground }],
1463
1541
  allowFontScaling: true
1464
1542
  },
1465
1543
  label
1466
1544
  ) : null
1467
1545
  );
1468
1546
  }
1469
- var styles14 = reactNative.StyleSheet.create({
1547
+ var styles15 = reactNative.StyleSheet.create({
1470
1548
  row: {
1471
1549
  flexDirection: "row",
1472
1550
  alignItems: "center",
@@ -1502,11 +1580,11 @@ var THUMB_TRAVEL = TRACK_WIDTH - THUMB_SIZE - THUMB_OFFSET * 2;
1502
1580
  var ICON_SIZE = s(13);
1503
1581
  function Switch({ checked = false, onCheckedChange, disabled, style }) {
1504
1582
  const { colors } = useTheme();
1505
- const translateX = React25.useRef(new reactNative.Animated.Value(checked ? THUMB_TRAVEL : 0)).current;
1506
- const trackOpacity = React25.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1507
- const checkOpacity = React25.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1508
- const crossOpacity = React25.useRef(new reactNative.Animated.Value(checked ? 0 : 1)).current;
1509
- React25.useEffect(() => {
1583
+ const translateX = React26.useRef(new reactNative.Animated.Value(checked ? THUMB_TRAVEL : 0)).current;
1584
+ const trackOpacity = React26.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1585
+ const checkOpacity = React26.useRef(new reactNative.Animated.Value(checked ? 1 : 0)).current;
1586
+ const crossOpacity = React26.useRef(new reactNative.Animated.Value(checked ? 0 : 1)).current;
1587
+ React26.useEffect(() => {
1510
1588
  reactNative.Animated.parallel([
1511
1589
  reactNative.Animated.spring(translateX, {
1512
1590
  toValue: checked ? THUMB_TRAVEL : 0,
@@ -1534,7 +1612,7 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
1534
1612
  inputRange: [0, 1],
1535
1613
  outputRange: [colors.surface, colors.primary]
1536
1614
  });
1537
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React25__default.default.createElement(
1615
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React26__default.default.createElement(
1538
1616
  reactNative.TouchableOpacity,
1539
1617
  {
1540
1618
  onPress: () => {
@@ -1544,22 +1622,22 @@ function Switch({ checked = false, onCheckedChange, disabled, style }) {
1544
1622
  disabled,
1545
1623
  activeOpacity: 0.8,
1546
1624
  touchSoundDisabled: true,
1547
- style: styles15.wrapper
1625
+ style: styles16.wrapper
1548
1626
  },
1549
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [styles15.track, { backgroundColor: trackColor }] }, /* @__PURE__ */ React25__default.default.createElement(
1627
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [styles16.track, { backgroundColor: trackColor }] }, /* @__PURE__ */ React26__default.default.createElement(
1550
1628
  reactNative.Animated.View,
1551
1629
  {
1552
1630
  style: [
1553
- styles15.thumb,
1631
+ styles16.thumb,
1554
1632
  { backgroundColor: colors.primaryForeground, transform: [{ translateX }] }
1555
1633
  ]
1556
1634
  },
1557
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [styles15.iconWrapper, { opacity: checkOpacity }] }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "check", size: ICON_SIZE, color: colors.primary })),
1558
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [styles15.iconWrapper, { opacity: crossOpacity }] }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "x", size: ICON_SIZE, color: colors.foregroundMuted }))
1635
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [styles16.iconWrapper, { opacity: checkOpacity }] }, /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Feather, { name: "check", size: ICON_SIZE, color: colors.primary })),
1636
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [styles16.iconWrapper, { opacity: crossOpacity }] }, /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Feather, { name: "x", size: ICON_SIZE, color: colors.foregroundMuted }))
1559
1637
  ))
1560
1638
  ));
1561
1639
  }
1562
- var styles15 = reactNative.StyleSheet.create({
1640
+ var styles16 = reactNative.StyleSheet.create({
1563
1641
  wrapper: {},
1564
1642
  track: {
1565
1643
  width: TRACK_WIDTH,
@@ -1611,9 +1689,9 @@ function Toggle({
1611
1689
  ...props
1612
1690
  }) {
1613
1691
  const { colors } = useTheme();
1614
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
1615
- const pressAnim = React25.useRef(new reactNative.Animated.Value(pressed ? 1 : 0)).current;
1616
- React25.useEffect(() => {
1692
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
1693
+ const pressAnim = React26.useRef(new reactNative.Animated.Value(pressed ? 1 : 0)).current;
1694
+ React26.useEffect(() => {
1617
1695
  reactNative.Animated.timing(pressAnim, {
1618
1696
  toValue: pressed ? 1 : 0,
1619
1697
  duration: 150,
@@ -1648,17 +1726,17 @@ function Toggle({
1648
1726
  return prop;
1649
1727
  };
1650
1728
  if (pressed) {
1651
- if (activeIconName) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? colors.primary));
1729
+ if (activeIconName) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? colors.primary));
1652
1730
  const active = renderProp(activeIcon);
1653
- if (active) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, active);
1654
- return /* @__PURE__ */ React25__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: colors.primary });
1731
+ if (active) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, active);
1732
+ return /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: colors.primary });
1655
1733
  }
1656
- if (iconName) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? colors.foregroundMuted));
1734
+ if (iconName) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? colors.foregroundMuted));
1657
1735
  const custom = renderProp(icon);
1658
- if (custom) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, custom);
1659
- return /* @__PURE__ */ React25__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: colors.foregroundMuted });
1736
+ if (custom) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, custom);
1737
+ return /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: colors.foregroundMuted });
1660
1738
  };
1661
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles16.disabled, style] }, /* @__PURE__ */ React25__default.default.createElement(
1739
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles17.disabled, style] }, /* @__PURE__ */ React26__default.default.createElement(
1662
1740
  reactNative.TouchableOpacity,
1663
1741
  {
1664
1742
  onPress: () => {
@@ -1672,20 +1750,20 @@ function Toggle({
1672
1750
  touchSoundDisabled: true,
1673
1751
  ...props
1674
1752
  },
1675
- /* @__PURE__ */ React25__default.default.createElement(
1753
+ /* @__PURE__ */ React26__default.default.createElement(
1676
1754
  reactNative.Animated.View,
1677
1755
  {
1678
1756
  style: [
1679
- styles16.base,
1757
+ styles17.base,
1680
1758
  sizeStyles[size],
1681
1759
  { borderColor, backgroundColor, borderWidth: 2 }
1682
1760
  ]
1683
1761
  },
1684
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles16.inner }, /* @__PURE__ */ React25__default.default.createElement(LeftIcon, null), label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.Text, { style: [styles16.label, { color: textColor }], allowFontScaling: true }, label) : null)
1762
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles17.inner }, /* @__PURE__ */ React26__default.default.createElement(LeftIcon, null), label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.Text, { style: [styles17.label, { color: textColor }], allowFontScaling: true }, label) : null)
1685
1763
  )
1686
1764
  ));
1687
1765
  }
1688
- var styles16 = reactNative.StyleSheet.create({
1766
+ var styles17 = reactNative.StyleSheet.create({
1689
1767
  base: {
1690
1768
  borderRadius: ms(8)
1691
1769
  },
@@ -1710,7 +1788,7 @@ function RadioItem({
1710
1788
  onSelect
1711
1789
  }) {
1712
1790
  const { colors } = useTheme();
1713
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
1791
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
1714
1792
  const handlePressIn = () => {
1715
1793
  if (option.disabled) return;
1716
1794
  reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver7, speed: 40, bounciness: 0 }).start();
@@ -1718,10 +1796,10 @@ function RadioItem({
1718
1796
  const handlePressOut = () => {
1719
1797
  reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver7, speed: 40, bounciness: 4 }).start();
1720
1798
  };
1721
- return /* @__PURE__ */ React25__default.default.createElement(
1799
+ return /* @__PURE__ */ React26__default.default.createElement(
1722
1800
  reactNative.TouchableOpacity,
1723
1801
  {
1724
- style: styles17.row,
1802
+ style: styles18.row,
1725
1803
  onPress: () => {
1726
1804
  if (!option.disabled) {
1727
1805
  selectionAsync();
@@ -1734,11 +1812,11 @@ function RadioItem({
1734
1812
  touchSoundDisabled: true,
1735
1813
  disabled: option.disabled
1736
1814
  },
1737
- /* @__PURE__ */ React25__default.default.createElement(
1815
+ /* @__PURE__ */ React26__default.default.createElement(
1738
1816
  reactNative.Animated.View,
1739
1817
  {
1740
1818
  style: [
1741
- styles17.radio,
1819
+ styles18.radio,
1742
1820
  {
1743
1821
  borderColor: selected ? colors.primary : colors.border,
1744
1822
  opacity: option.disabled ? 0.45 : 1,
@@ -1746,13 +1824,13 @@ function RadioItem({
1746
1824
  }
1747
1825
  ]
1748
1826
  },
1749
- selected ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles17.dot, { backgroundColor: colors.primary }] }) : null
1827
+ selected ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles18.dot, { backgroundColor: colors.primary }] }) : null
1750
1828
  ),
1751
- /* @__PURE__ */ React25__default.default.createElement(
1829
+ /* @__PURE__ */ React26__default.default.createElement(
1752
1830
  reactNative.Text,
1753
1831
  {
1754
1832
  style: [
1755
- styles17.label,
1833
+ styles18.label,
1756
1834
  { color: option.disabled ? colors.foregroundMuted : colors.foreground }
1757
1835
  ],
1758
1836
  allowFontScaling: true
@@ -1768,7 +1846,7 @@ function RadioGroup({
1768
1846
  orientation = "vertical",
1769
1847
  style
1770
1848
  }) {
1771
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles17.container, orientation === "horizontal" && styles17.horizontal, style] }, options.map((option) => /* @__PURE__ */ React25__default.default.createElement(
1849
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles18.container, orientation === "horizontal" && styles18.horizontal, style] }, options.map((option) => /* @__PURE__ */ React26__default.default.createElement(
1772
1850
  RadioItem,
1773
1851
  {
1774
1852
  key: option.value,
@@ -1778,7 +1856,7 @@ function RadioGroup({
1778
1856
  }
1779
1857
  )));
1780
1858
  }
1781
- var styles17 = reactNative.StyleSheet.create({
1859
+ var styles18 = reactNative.StyleSheet.create({
1782
1860
  container: {
1783
1861
  gap: vs(12)
1784
1862
  },
@@ -1819,7 +1897,7 @@ function TabTrigger({
1819
1897
  variant
1820
1898
  }) {
1821
1899
  const { colors } = useTheme();
1822
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
1900
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
1823
1901
  const handlePressIn = () => {
1824
1902
  reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver8, speed: 40, bounciness: 0 }).start();
1825
1903
  };
@@ -1827,12 +1905,12 @@ function TabTrigger({
1827
1905
  reactNative.Animated.spring(scale2, { toValue: 1, useNativeDriver: nativeDriver8, speed: 40, bounciness: 4 }).start();
1828
1906
  };
1829
1907
  const isUnderline = variant === "underline";
1830
- return /* @__PURE__ */ React25__default.default.createElement(
1908
+ return /* @__PURE__ */ React26__default.default.createElement(
1831
1909
  reactNative.TouchableOpacity,
1832
1910
  {
1833
1911
  style: [
1834
- styles18.trigger,
1835
- isUnderline && styles18.triggerUnderline,
1912
+ styles19.trigger,
1913
+ isUnderline && styles19.triggerUnderline,
1836
1914
  isUnderline && isActive && { borderBottomColor: colors.primary }
1837
1915
  ],
1838
1916
  onPress,
@@ -1842,13 +1920,13 @@ function TabTrigger({
1842
1920
  activeOpacity: 1,
1843
1921
  touchSoundDisabled: true
1844
1922
  },
1845
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles18.triggerInner }, tab.icon ? typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon : null, /* @__PURE__ */ React25__default.default.createElement(
1923
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles19.triggerInner }, tab.icon ? typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon : null, /* @__PURE__ */ React26__default.default.createElement(
1846
1924
  reactNative.Text,
1847
1925
  {
1848
1926
  style: [
1849
- styles18.triggerLabel,
1927
+ styles19.triggerLabel,
1850
1928
  { color: isActive ? colors.foreground : colors.foregroundMuted },
1851
- isActive && (isUnderline ? styles18.activeTriggerLabelUnderline : styles18.activeTriggerLabel)
1929
+ isActive && (isUnderline ? styles19.activeTriggerLabelUnderline : styles19.activeTriggerLabel)
1852
1930
  ],
1853
1931
  allowFontScaling: true
1854
1932
  },
@@ -1857,13 +1935,13 @@ function TabTrigger({
1857
1935
  );
1858
1936
  }
1859
1937
  function Tabs({ tabs, variant = "pill", value, onValueChange, children, style }) {
1860
- const [internal, setInternal] = React25.useState(tabs[0]?.value ?? "");
1938
+ const [internal, setInternal] = React26.useState(tabs[0]?.value ?? "");
1861
1939
  const { colors } = useTheme();
1862
1940
  const active = value ?? internal;
1863
- const tabLayouts = React25.useRef({});
1864
- const pillX = React25.useRef(new reactNative.Animated.Value(0)).current;
1865
- const pillWidth = React25.useRef(new reactNative.Animated.Value(0)).current;
1866
- const initialised = React25.useRef(false);
1941
+ const tabLayouts = React26.useRef({});
1942
+ const pillX = React26.useRef(new reactNative.Animated.Value(0)).current;
1943
+ const pillWidth = React26.useRef(new reactNative.Animated.Value(0)).current;
1944
+ const initialised = React26.useRef(false);
1867
1945
  const animatePill = (tabValue, animate) => {
1868
1946
  const layout = tabLayouts.current[tabValue];
1869
1947
  if (!layout) return;
@@ -1877,7 +1955,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
1877
1955
  pillWidth.setValue(layout.width);
1878
1956
  }
1879
1957
  };
1880
- React25.useEffect(() => {
1958
+ React26.useEffect(() => {
1881
1959
  if (initialised.current) animatePill(active, true);
1882
1960
  }, [active]);
1883
1961
  const handlePress = (v) => {
@@ -1885,13 +1963,13 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
1885
1963
  if (!value) setInternal(v);
1886
1964
  onValueChange?.(v);
1887
1965
  };
1888
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [
1889
- variant === "pill" ? [styles18.list, { backgroundColor: colors.surface }] : styles18.listUnderline
1890
- ] }, variant === "pill" && /* @__PURE__ */ React25__default.default.createElement(
1966
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
1967
+ variant === "pill" ? [styles19.list, { backgroundColor: colors.surface }] : styles19.listUnderline
1968
+ ] }, variant === "pill" && /* @__PURE__ */ React26__default.default.createElement(
1891
1969
  reactNative.Animated.View,
1892
1970
  {
1893
1971
  style: [
1894
- styles18.pill,
1972
+ styles19.pill,
1895
1973
  {
1896
1974
  backgroundColor: colors.background,
1897
1975
  position: "absolute",
@@ -1908,7 +1986,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
1908
1986
  }
1909
1987
  ]
1910
1988
  }
1911
- ), tabs.map((tab) => /* @__PURE__ */ React25__default.default.createElement(
1989
+ ), tabs.map((tab) => /* @__PURE__ */ React26__default.default.createElement(
1912
1990
  TabTrigger,
1913
1991
  {
1914
1992
  key: tab.value,
@@ -1929,9 +2007,9 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
1929
2007
  }
1930
2008
  function TabsContent({ value, activeValue, children, style }) {
1931
2009
  if (value !== activeValue) return null;
1932
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style }, children);
2010
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style }, children);
1933
2011
  }
1934
- var styles18 = reactNative.StyleSheet.create({
2012
+ var styles19 = reactNative.StyleSheet.create({
1935
2013
  list: {
1936
2014
  flexDirection: "row",
1937
2015
  borderRadius: 12,
@@ -1984,9 +2062,10 @@ function AccordionItemComponent({
1984
2062
  onToggle
1985
2063
  }) {
1986
2064
  const { colors } = useTheme();
2065
+ const resolvedIcon = item.iconName ? renderIcon(item.iconName, ms(16), item.iconColor ?? colors.foregroundMuted) : item.icon;
1987
2066
  const isExpanded = Animated11.useSharedValue(isOpen);
1988
2067
  const height = Animated11.useSharedValue(0);
1989
- React25__default.default.useEffect(() => {
2068
+ React26__default.default.useEffect(() => {
1990
2069
  isExpanded.value = isOpen;
1991
2070
  }, [isOpen]);
1992
2071
  const derivedHeight = Animated11.useDerivedValue(
@@ -2008,21 +2087,21 @@ function AccordionItemComponent({
2008
2087
  const rotationStyle = Animated11.useAnimatedStyle(() => ({
2009
2088
  transform: [{ rotate: `${derivedRotation.value * 180}deg` }]
2010
2089
  }));
2011
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles19.item, { backgroundColor: colors.card, borderColor: colors.border }] }, /* @__PURE__ */ React25__default.default.createElement(
2090
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles20.item, { backgroundColor: colors.card, borderColor: colors.border }] }, /* @__PURE__ */ React26__default.default.createElement(
2012
2091
  reactNative.Pressable,
2013
2092
  {
2014
- style: ({ pressed }) => [styles19.trigger, { opacity: pressed ? 0.6 : 1 }],
2093
+ style: ({ pressed }) => [styles20.trigger, { opacity: pressed ? 0.6 : 1 }],
2015
2094
  onPress: () => {
2016
2095
  selectionAsync();
2017
2096
  onToggle();
2018
2097
  }
2019
2098
  },
2020
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles19.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger),
2021
- /* @__PURE__ */ React25__default.default.createElement(Animated11__default.default.View, { style: [styles19.chevron, rotationStyle] }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
2022
- ), /* @__PURE__ */ React25__default.default.createElement(Animated11__default.default.View, { style: bodyStyle }, /* @__PURE__ */ React25__default.default.createElement(
2099
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles20.triggerContent }, resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles20.icon }, resolvedIcon) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles20.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger)),
2100
+ /* @__PURE__ */ React26__default.default.createElement(Animated11__default.default.View, { style: [styles20.chevron, rotationStyle] }, /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
2101
+ ), /* @__PURE__ */ React26__default.default.createElement(Animated11__default.default.View, { style: bodyStyle }, /* @__PURE__ */ React26__default.default.createElement(
2023
2102
  reactNative.View,
2024
2103
  {
2025
- style: styles19.content,
2104
+ style: styles20.content,
2026
2105
  onLayout: (e) => {
2027
2106
  height.value = e.nativeEvent.layout.height;
2028
2107
  }
@@ -2031,7 +2110,7 @@ function AccordionItemComponent({
2031
2110
  )));
2032
2111
  }
2033
2112
  function Accordion({ items, type = "single", defaultValue, style }) {
2034
- const [openValues, setOpenValues] = React25.useState(() => {
2113
+ const [openValues, setOpenValues] = React26.useState(() => {
2035
2114
  if (!defaultValue) return [];
2036
2115
  return Array.isArray(defaultValue) ? defaultValue : [defaultValue];
2037
2116
  });
@@ -2044,7 +2123,7 @@ function Accordion({ items, type = "single", defaultValue, style }) {
2044
2123
  );
2045
2124
  }
2046
2125
  };
2047
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles19.list, style] }, items.map((item) => /* @__PURE__ */ React25__default.default.createElement(
2126
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles20.list, style] }, items.map((item) => /* @__PURE__ */ React26__default.default.createElement(
2048
2127
  AccordionItemComponent,
2049
2128
  {
2050
2129
  key: item.value,
@@ -2054,7 +2133,7 @@ function Accordion({ items, type = "single", defaultValue, style }) {
2054
2133
  }
2055
2134
  )));
2056
2135
  }
2057
- var styles19 = reactNative.StyleSheet.create({
2136
+ var styles20 = reactNative.StyleSheet.create({
2058
2137
  list: {
2059
2138
  gap: s(6)
2060
2139
  },
@@ -2070,10 +2149,19 @@ var styles19 = reactNative.StyleSheet.create({
2070
2149
  paddingHorizontal: s(14),
2071
2150
  paddingVertical: vs(12)
2072
2151
  },
2152
+ triggerContent: {
2153
+ flexDirection: "row",
2154
+ alignItems: "center",
2155
+ gap: s(8),
2156
+ flex: 1
2157
+ },
2158
+ icon: {
2159
+ alignItems: "center",
2160
+ justifyContent: "center"
2161
+ },
2073
2162
  triggerText: {
2074
2163
  fontFamily: "Poppins-Medium",
2075
- fontSize: ms(14),
2076
- flex: 1
2164
+ fontSize: ms(14)
2077
2165
  },
2078
2166
  chevron: {
2079
2167
  marginLeft: s(8)
@@ -2102,7 +2190,7 @@ function Slider({
2102
2190
  style
2103
2191
  }) {
2104
2192
  const { colors } = useTheme();
2105
- const lastSteppedValue = React25.useRef(value);
2193
+ const lastSteppedValue = React26.useRef(value);
2106
2194
  const handleValueChange = (v) => {
2107
2195
  if (step && v !== lastSteppedValue.current) {
2108
2196
  lastSteppedValue.current = v;
@@ -2110,7 +2198,7 @@ function Slider({
2110
2198
  }
2111
2199
  onValueChange?.(v);
2112
2200
  };
2113
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles20.wrapper, style], accessibilityLabel }, label || showValue ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles20.header }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles20.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles20.valueText, { color: colors.foregroundMuted }], allowFontScaling: true }, formatValue2(value)) : null) : null, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: disabled ? styles20.disabled : void 0 }, /* @__PURE__ */ React25__default.default.createElement(
2201
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles21.wrapper, style], accessibilityLabel }, label || showValue ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles21.header }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles21.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles21.valueText, { color: colors.foregroundMuted }], allowFontScaling: true }, formatValue2(value)) : null) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: disabled ? styles21.disabled : void 0 }, /* @__PURE__ */ React26__default.default.createElement(
2114
2202
  RNSlider__default.default,
2115
2203
  {
2116
2204
  value,
@@ -2123,12 +2211,12 @@ function Slider({
2123
2211
  minimumTrackTintColor: colors.primary,
2124
2212
  maximumTrackTintColor: colors.surface,
2125
2213
  thumbTintColor: colors.primary,
2126
- style: styles20.slider,
2214
+ style: styles21.slider,
2127
2215
  accessibilityLabel
2128
2216
  }
2129
2217
  )));
2130
2218
  }
2131
- var styles20 = reactNative.StyleSheet.create({
2219
+ var styles21 = reactNative.StyleSheet.create({
2132
2220
  wrapper: {
2133
2221
  gap: vs(8)
2134
2222
  },
@@ -2159,11 +2247,15 @@ function Sheet({
2159
2247
  title,
2160
2248
  description,
2161
2249
  children,
2162
- style
2250
+ style,
2251
+ scrollable,
2252
+ maxHeight,
2253
+ keyboardBehavior,
2254
+ keyboardOffset = 0
2163
2255
  }) {
2164
2256
  const { colors } = useTheme();
2165
- const ref = React25.useRef(null);
2166
- React25.useEffect(() => {
2257
+ const ref = React26.useRef(null);
2258
+ React26.useEffect(() => {
2167
2259
  if (open) {
2168
2260
  impactLight();
2169
2261
  ref.current?.present();
@@ -2171,7 +2263,7 @@ function Sheet({
2171
2263
  ref.current?.dismiss();
2172
2264
  }
2173
2265
  }, [open]);
2174
- const renderBackdrop = (props) => /* @__PURE__ */ React25__default.default.createElement(
2266
+ const renderBackdrop = (props) => /* @__PURE__ */ React26__default.default.createElement(
2175
2267
  bottomSheet.BottomSheetBackdrop,
2176
2268
  {
2177
2269
  ...props,
@@ -2180,21 +2272,28 @@ function Sheet({
2180
2272
  pressBehavior: "close"
2181
2273
  }
2182
2274
  );
2183
- return /* @__PURE__ */ React25__default.default.createElement(
2275
+ const headerNode = title || description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles22.header }, title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles22.title, { color: colors.foreground }], allowFontScaling: true }, title) : null, description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles22.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null;
2276
+ const useScroll = scrollable || !!maxHeight;
2277
+ const wrapKeyboard = (node) => {
2278
+ if (!keyboardBehavior || keyboardBehavior === "none") return node;
2279
+ const behavior = keyboardBehavior ?? reactNative.Platform.select({ ios: "padding", android: "height" });
2280
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.KeyboardAvoidingView, { behavior, keyboardVerticalOffset: keyboardOffset }, node);
2281
+ };
2282
+ return /* @__PURE__ */ React26__default.default.createElement(
2184
2283
  bottomSheet.BottomSheetModal,
2185
2284
  {
2186
2285
  ref,
2187
2286
  enableDynamicSizing: true,
2188
2287
  onDismiss: onClose,
2189
2288
  backdropComponent: renderBackdrop,
2190
- backgroundStyle: [styles21.background, { backgroundColor: colors.card }],
2191
- handleIndicatorStyle: [styles21.handle, { backgroundColor: colors.border }],
2289
+ backgroundStyle: [styles22.background, { backgroundColor: colors.card }],
2290
+ handleIndicatorStyle: [styles22.handle, { backgroundColor: colors.border }],
2192
2291
  enablePanDownToClose: true
2193
2292
  },
2194
- /* @__PURE__ */ React25__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles21.content, style] }, title || description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles21.header }, title ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles21.title, { color: colors.foreground }], allowFontScaling: true }, title) : null, description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles21.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null, children)
2293
+ /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style: maxHeight ? { maxHeight } : void 0 }, wrapKeyboard(useScroll ? /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetScrollView, { contentContainerStyle: [styles22.content, style] }, headerNode, children) : /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles22.content, style] }, headerNode, children)))
2195
2294
  );
2196
2295
  }
2197
- var styles21 = reactNative.StyleSheet.create({
2296
+ var styles22 = reactNative.StyleSheet.create({
2198
2297
  background: {
2199
2298
  borderTopLeftRadius: ms(16),
2200
2299
  borderTopRightRadius: ms(16)
@@ -2237,10 +2336,10 @@ function Select({
2237
2336
  style
2238
2337
  }) {
2239
2338
  const { colors } = useTheme();
2240
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
2241
- const [pickerVisible, setPickerVisible] = React25.useState(false);
2242
- const [pendingValue, setPendingValue] = React25.useState(value);
2243
- const pickerRef = React25.useRef(null);
2339
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
2340
+ const [pickerVisible, setPickerVisible] = React26.useState(false);
2341
+ const [pendingValue, setPendingValue] = React26.useState(value);
2342
+ const pickerRef = React26.useRef(null);
2244
2343
  const selected = options.find((o) => o.value === value);
2245
2344
  const handlePressIn = () => {
2246
2345
  if (disabled) return;
@@ -2269,11 +2368,11 @@ function Select({
2269
2368
  }
2270
2369
  setPickerVisible(false);
2271
2370
  };
2272
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles22.container, style] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles22.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, !isWeb2 ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React25__default.default.createElement(
2371
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles23.container, style] }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles23.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, !isWeb2 ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }], opacity: disabled ? 0.45 : 1 } }, /* @__PURE__ */ React26__default.default.createElement(
2273
2372
  reactNative.TouchableOpacity,
2274
2373
  {
2275
2374
  style: [
2276
- styles22.trigger,
2375
+ styles23.trigger,
2277
2376
  {
2278
2377
  borderColor: error ? colors.destructive : colors.border,
2279
2378
  backgroundColor: colors.background
@@ -2285,11 +2384,11 @@ function Select({
2285
2384
  activeOpacity: 1,
2286
2385
  touchSoundDisabled: true
2287
2386
  },
2288
- /* @__PURE__ */ React25__default.default.createElement(
2387
+ /* @__PURE__ */ React26__default.default.createElement(
2289
2388
  reactNative.Text,
2290
2389
  {
2291
2390
  style: [
2292
- styles22.triggerText,
2391
+ styles23.triggerText,
2293
2392
  { color: selected ? colors.foreground : colors.foregroundMuted }
2294
2393
  ],
2295
2394
  numberOfLines: 1,
@@ -2297,8 +2396,8 @@ function Select({
2297
2396
  },
2298
2397
  selected?.label ?? placeholder
2299
2398
  ),
2300
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-down", size: 20, color: colors.foregroundMuted })
2301
- )) : null, isIOS ? /* @__PURE__ */ React25__default.default.createElement(
2399
+ /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-down", size: 20, color: colors.foregroundMuted })
2400
+ )) : null, isIOS ? /* @__PURE__ */ React26__default.default.createElement(
2302
2401
  reactNative.Modal,
2303
2402
  {
2304
2403
  visible: pickerVisible,
@@ -2306,16 +2405,16 @@ function Select({
2306
2405
  animationType: "slide",
2307
2406
  onRequestClose: handleDismiss
2308
2407
  },
2309
- /* @__PURE__ */ React25__default.default.createElement(reactNative.TouchableOpacity, { style: styles22.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
2310
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles22.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles22.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles22.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, null), /* @__PURE__ */ React25__default.default.createElement(reactNative.TouchableOpacity, { onPress: handleConfirm, style: styles22.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles22.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React25__default.default.createElement(
2408
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.TouchableOpacity, { style: styles23.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
2409
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles23.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles23.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles23.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, null), /* @__PURE__ */ React26__default.default.createElement(reactNative.TouchableOpacity, { onPress: handleConfirm, style: styles23.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles23.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React26__default.default.createElement(
2311
2410
  picker.Picker,
2312
2411
  {
2313
2412
  selectedValue: pendingValue ?? "",
2314
2413
  onValueChange: (val) => setPendingValue(val),
2315
2414
  itemStyle: { color: colors.foreground }
2316
2415
  },
2317
- !value ? /* @__PURE__ */ React25__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
2318
- options.map((o) => /* @__PURE__ */ React25__default.default.createElement(
2416
+ !value ? /* @__PURE__ */ React26__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
2417
+ options.map((o) => /* @__PURE__ */ React26__default.default.createElement(
2319
2418
  picker.Picker.Item,
2320
2419
  {
2321
2420
  key: o.value,
@@ -2326,7 +2425,7 @@ function Select({
2326
2425
  }
2327
2426
  ))
2328
2427
  ))
2329
- ) : null, isAndroid ? /* @__PURE__ */ React25__default.default.createElement(
2428
+ ) : null, isAndroid ? /* @__PURE__ */ React26__default.default.createElement(
2330
2429
  picker.Picker,
2331
2430
  {
2332
2431
  ref: pickerRef,
@@ -2340,10 +2439,10 @@ function Select({
2340
2439
  mode: "dialog",
2341
2440
  enabled: !disabled,
2342
2441
  prompt: label,
2343
- style: styles22.androidHiddenPicker
2442
+ style: styles23.androidHiddenPicker
2344
2443
  },
2345
- !value ? /* @__PURE__ */ React25__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
2346
- options.map((o) => /* @__PURE__ */ React25__default.default.createElement(
2444
+ !value ? /* @__PURE__ */ React26__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
2445
+ options.map((o) => /* @__PURE__ */ React26__default.default.createElement(
2347
2446
  picker.Picker.Item,
2348
2447
  {
2349
2448
  key: o.value,
@@ -2352,7 +2451,7 @@ function Select({
2352
2451
  enabled: !o.disabled
2353
2452
  }
2354
2453
  ))
2355
- ) : null, isWeb2 ? /* @__PURE__ */ React25__default.default.createElement(
2454
+ ) : null, isWeb2 ? /* @__PURE__ */ React26__default.default.createElement(
2356
2455
  picker.Picker,
2357
2456
  {
2358
2457
  selectedValue: value ?? "",
@@ -2363,7 +2462,7 @@ function Select({
2363
2462
  },
2364
2463
  enabled: !disabled,
2365
2464
  style: [
2366
- styles22.webPicker,
2465
+ styles23.webPicker,
2367
2466
  {
2368
2467
  borderColor: error ? colors.destructive : colors.border,
2369
2468
  color: selected ? colors.foreground : colors.foregroundMuted,
@@ -2372,8 +2471,8 @@ function Select({
2372
2471
  }
2373
2472
  ]
2374
2473
  },
2375
- /* @__PURE__ */ React25__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }),
2376
- options.map((o) => /* @__PURE__ */ React25__default.default.createElement(
2474
+ /* @__PURE__ */ React26__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }),
2475
+ options.map((o) => /* @__PURE__ */ React26__default.default.createElement(
2377
2476
  picker.Picker.Item,
2378
2477
  {
2379
2478
  key: o.value,
@@ -2382,9 +2481,9 @@ function Select({
2382
2481
  enabled: !o.disabled
2383
2482
  }
2384
2483
  ))
2385
- ) : null, error ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles22.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null);
2484
+ ) : null, error ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles23.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null);
2386
2485
  }
2387
- var styles22 = reactNative.StyleSheet.create({
2486
+ var styles23 = reactNative.StyleSheet.create({
2388
2487
  container: {
2389
2488
  gap: vs(8)
2390
2489
  },
@@ -2454,14 +2553,14 @@ var styles22 = reactNative.StyleSheet.create({
2454
2553
  fontSize: ms(15)
2455
2554
  }
2456
2555
  });
2457
- var ToastContext = React25.createContext({
2556
+ var ToastContext = React26.createContext({
2458
2557
  toast: () => {
2459
2558
  },
2460
2559
  dismiss: () => {
2461
2560
  }
2462
2561
  });
2463
2562
  function useToast() {
2464
- return React25.useContext(ToastContext);
2563
+ return React26.useContext(ToastContext);
2465
2564
  }
2466
2565
  var SWIPE_THRESHOLD = 80;
2467
2566
  var VELOCITY_THRESHOLD = 800;
@@ -2470,7 +2569,7 @@ function ToastNotification({ item, onDismiss }) {
2470
2569
  const translateY = Animated11.useSharedValue(-80);
2471
2570
  const translateX = Animated11.useSharedValue(0);
2472
2571
  const opacity = Animated11.useSharedValue(0);
2473
- React25.useEffect(() => {
2572
+ React26.useEffect(() => {
2474
2573
  translateY.value = Animated11.withTiming(0, { duration: 120, easing: Animated11.Easing.out(Animated11.Easing.exp) });
2475
2574
  opacity.value = Animated11.withTiming(1, { duration: 100 });
2476
2575
  const timer = setTimeout(() => {
@@ -2520,25 +2619,25 @@ function ToastNotification({ item, onDismiss }) {
2520
2619
  }[variant];
2521
2620
  const titleColor = variant === "default" ? colors.foreground : accentColor;
2522
2621
  const descColor = variant === "default" ? colors.foregroundMuted : accentColor;
2523
- const defaultIcon = variant === "success" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.AntDesign, { name: "exclamation-circle", size: 16, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 16, color: accentColor });
2622
+ const defaultIcon = variant === "success" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: 16, color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.AntDesign, { name: "exclamation-circle", size: 16, color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: 17, color: accentColor }) : /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: 16, color: accentColor });
2524
2623
  const leftIcon = item.iconName ? renderIcon(item.iconName, 16, item.iconColor ?? accentColor) : item.icon ?? defaultIcon;
2525
- return /* @__PURE__ */ React25__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React25__default.default.createElement(Animated11__default.default.View, { style: [styles23.toast, { backgroundColor: bgColor, borderColor }, animatedStyle] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles23.leftIconContainer }, leftIcon), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles23.toastContent }, item.title ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles23.toastTitle, { color: titleColor }], allowFontScaling: true }, item.title) : null, item.description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles23.toastDescription, { color: descColor }], allowFontScaling: true }, item.description) : null), item.action && /* @__PURE__ */ React25__default.default.createElement(
2624
+ return /* @__PURE__ */ React26__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: panGesture }, /* @__PURE__ */ React26__default.default.createElement(Animated11__default.default.View, { style: [styles24.toast, { backgroundColor: bgColor, borderColor }, animatedStyle] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles24.leftIconContainer }, leftIcon), /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles24.toastContent }, item.title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles24.toastTitle, { color: titleColor }], allowFontScaling: true }, item.title) : null, item.description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles24.toastDescription, { color: descColor }], allowFontScaling: true }, item.description) : null), item.action && /* @__PURE__ */ React26__default.default.createElement(
2526
2625
  reactNative.TouchableOpacity,
2527
2626
  {
2528
2627
  onPress: () => {
2529
2628
  item.action.onPress();
2530
2629
  onDismiss();
2531
2630
  },
2532
- style: styles23.actionButton,
2631
+ style: styles24.actionButton,
2533
2632
  touchSoundDisabled: true
2534
2633
  },
2535
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles23.actionLabel, { color: accentColor }], allowFontScaling: true }, item.action.label)
2536
- ), /* @__PURE__ */ React25__default.default.createElement(reactNative.TouchableOpacity, { onPress: onDismiss, style: styles23.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.AntDesign, { name: "close-circle", size: 16, color: descColor }))));
2634
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles24.actionLabel, { color: accentColor }], allowFontScaling: true }, item.action.label)
2635
+ ), /* @__PURE__ */ React26__default.default.createElement(reactNative.TouchableOpacity, { onPress: onDismiss, style: styles24.dismissButton, touchSoundDisabled: true }, /* @__PURE__ */ React26__default.default.createElement(vectorIcons.AntDesign, { name: "close-circle", size: 16, color: descColor }))));
2537
2636
  }
2538
2637
  function ToastProvider({ children }) {
2539
- const [toasts, setToasts] = React25.useState([]);
2638
+ const [toasts, setToasts] = React26.useState([]);
2540
2639
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
2541
- const toast = React25.useCallback((item) => {
2640
+ const toast = React26.useCallback((item) => {
2542
2641
  const id = Math.random().toString(36).slice(2);
2543
2642
  if (item.variant === "success") {
2544
2643
  notificationSuccess();
@@ -2551,12 +2650,12 @@ function ToastProvider({ children }) {
2551
2650
  }
2552
2651
  setToasts((prev) => [{ ...item, id }, ...prev].slice(0, 3));
2553
2652
  }, []);
2554
- const dismiss = React25.useCallback((id) => {
2653
+ const dismiss = React26.useCallback((id) => {
2555
2654
  setToasts((prev) => prev.filter((t) => t.id !== id));
2556
2655
  }, []);
2557
- return /* @__PURE__ */ React25__default.default.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles23.container, reactNative.Platform.OS === "web" && styles23.containerWeb, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React25__default.default.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
2656
+ return /* @__PURE__ */ React26__default.default.createElement(ToastContext.Provider, { value: { toast, dismiss } }, children, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles24.container, reactNative.Platform.OS === "web" && styles24.containerWeb, { top: insets.top + 8 }], pointerEvents: "box-none" }, toasts.map((item) => /* @__PURE__ */ React26__default.default.createElement(ToastNotification, { key: item.id, item, onDismiss: () => dismiss(item.id) }))));
2558
2657
  }
2559
- var styles23 = reactNative.StyleSheet.create({
2658
+ var styles24 = reactNative.StyleSheet.create({
2560
2659
  container: {
2561
2660
  position: "absolute",
2562
2661
  left: s(16),
@@ -2653,7 +2752,7 @@ function CurrencyInput({
2653
2752
  const inputStyle = size === "large" ? { fontFamily: "Poppins-Regular", fontSize: ms(36) } : { fontFamily: "Poppins-Regular" };
2654
2753
  const dollarIcon = renderIcon("dollar-sign", size === "large" ? 24 : 16, colors.foregroundMuted);
2655
2754
  const displayValue = value && prefix && value.startsWith(prefix) ? value.slice(prefix.length) : value;
2656
- return /* @__PURE__ */ React25__default.default.createElement(
2755
+ return /* @__PURE__ */ React26__default.default.createElement(
2657
2756
  Input,
2658
2757
  {
2659
2758
  value: displayValue,
@@ -2671,6 +2770,12 @@ function CurrencyInput({
2671
2770
  }
2672
2771
  );
2673
2772
  }
2773
+ var variantFontSize = {
2774
+ hero: ms(48),
2775
+ large: ms(32),
2776
+ medium: ms(18),
2777
+ small: ms(14)
2778
+ };
2674
2779
  function formatValue(value, prefix, showDecimals) {
2675
2780
  const num = typeof value === "string" ? parseFloat(value.replace(/[^0-9.-]/g, "")) : value;
2676
2781
  if (isNaN(num)) return `${prefix}0`;
@@ -2683,16 +2788,27 @@ function formatValue(value, prefix, showDecimals) {
2683
2788
  }
2684
2789
  return `${sign}${prefix}${intPart}`;
2685
2790
  }
2686
- function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, style }) {
2791
+ function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, variant, autoScale, maxFontSize, style }) {
2687
2792
  const { colors } = useTheme();
2688
2793
  const formatted = formatValue(value, prefix, showDecimals);
2689
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles24.container, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles24.amount, { color: textColor ?? colors.foreground }], allowFontScaling: true }, formatted));
2794
+ const baseFontSize = variant ? variantFontSize[variant] : ms(56);
2795
+ const fontSize = maxFontSize ?? baseFontSize;
2796
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles25.container, style] }, /* @__PURE__ */ React26__default.default.createElement(
2797
+ reactNative.Text,
2798
+ {
2799
+ style: [styles25.amount, { color: textColor ?? colors.foreground, fontSize }],
2800
+ allowFontScaling: true,
2801
+ numberOfLines: autoScale ? 1 : void 0,
2802
+ adjustsFontSizeToFit: autoScale,
2803
+ minimumFontScale: autoScale ? 0.5 : void 0
2804
+ },
2805
+ formatted
2806
+ ));
2690
2807
  }
2691
- var styles24 = reactNative.StyleSheet.create({
2808
+ var styles25 = reactNative.StyleSheet.create({
2692
2809
  container: {},
2693
2810
  amount: {
2694
2811
  fontFamily: "Poppins-Bold",
2695
- fontSize: ms(56),
2696
2812
  letterSpacing: -2
2697
2813
  }
2698
2814
  });
@@ -2720,7 +2836,7 @@ function ListItem({
2720
2836
  captionStyle
2721
2837
  }) {
2722
2838
  const { colors } = useTheme();
2723
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
2839
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
2724
2840
  const handlePressIn = () => {
2725
2841
  if (!onPress || disabled) return;
2726
2842
  reactNative.Animated.spring(scale2, {
@@ -2755,10 +2871,10 @@ function ListItem({
2755
2871
  shadowRadius: 6,
2756
2872
  elevation: 2
2757
2873
  } : {};
2758
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles25.disabled] }, /* @__PURE__ */ React25__default.default.createElement(
2874
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [{ transform: [{ scale: scale2 }] }, disabled && styles26.disabled] }, /* @__PURE__ */ React26__default.default.createElement(
2759
2875
  reactNative.TouchableOpacity,
2760
2876
  {
2761
- style: [styles25.container, cardStyle, style],
2877
+ style: [styles26.container, cardStyle, style],
2762
2878
  onPress: onPress ? handlePress : void 0,
2763
2879
  onPressIn: handlePressIn,
2764
2880
  onPressOut: handlePressOut,
@@ -2766,51 +2882,51 @@ function ListItem({
2766
2882
  activeOpacity: 1,
2767
2883
  touchSoundDisabled: true
2768
2884
  },
2769
- effectiveLeft ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles25.leftContainer }, effectiveLeft) : null,
2770
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles25.content }, /* @__PURE__ */ React25__default.default.createElement(
2885
+ effectiveLeft ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles26.leftContainer }, effectiveLeft) : null,
2886
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles26.content }, /* @__PURE__ */ React26__default.default.createElement(
2771
2887
  reactNative.Text,
2772
2888
  {
2773
- style: [styles25.title, { color: colors.foreground }, titleStyle],
2889
+ style: [styles26.title, { color: colors.foreground }, titleStyle],
2774
2890
  numberOfLines: 2,
2775
2891
  allowFontScaling: true
2776
2892
  },
2777
2893
  title
2778
- ), subtitle ? /* @__PURE__ */ React25__default.default.createElement(
2894
+ ), subtitle ? /* @__PURE__ */ React26__default.default.createElement(
2779
2895
  reactNative.Text,
2780
2896
  {
2781
- style: [styles25.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
2897
+ style: [styles26.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
2782
2898
  numberOfLines: 2,
2783
2899
  allowFontScaling: true
2784
2900
  },
2785
2901
  subtitle
2786
- ) : null, caption ? /* @__PURE__ */ React25__default.default.createElement(
2902
+ ) : null, caption ? /* @__PURE__ */ React26__default.default.createElement(
2787
2903
  reactNative.Text,
2788
2904
  {
2789
- style: [styles25.caption, { color: colors.foregroundMuted }, captionStyle],
2905
+ style: [styles26.caption, { color: colors.foregroundMuted }, captionStyle],
2790
2906
  numberOfLines: 1,
2791
2907
  allowFontScaling: true
2792
2908
  },
2793
2909
  caption
2794
2910
  ) : null),
2795
- effectiveRight !== void 0 ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles25.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React25__default.default.createElement(
2911
+ effectiveRight !== void 0 ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles26.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React26__default.default.createElement(
2796
2912
  reactNative.Text,
2797
2913
  {
2798
- style: [styles25.rightText, { color: colors.foregroundMuted }],
2914
+ style: [styles26.rightText, { color: colors.foregroundMuted }],
2799
2915
  allowFontScaling: true
2800
2916
  },
2801
2917
  effectiveRight
2802
- ) : effectiveRight) : showChevron ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null
2803
- ), showSeparator ? /* @__PURE__ */ React25__default.default.createElement(
2918
+ ) : effectiveRight) : showChevron ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null
2919
+ ), showSeparator ? /* @__PURE__ */ React26__default.default.createElement(
2804
2920
  reactNative.View,
2805
2921
  {
2806
2922
  style: [
2807
- styles25.separator,
2923
+ styles26.separator,
2808
2924
  { backgroundColor: colors.border, marginLeft: effectiveLeft ? s(16) + s(44) + s(12) : s(16) }
2809
2925
  ]
2810
2926
  }
2811
2927
  ) : null);
2812
2928
  }
2813
- var styles25 = reactNative.StyleSheet.create({
2929
+ var styles26 = reactNative.StyleSheet.create({
2814
2930
  container: {
2815
2931
  flexDirection: "row",
2816
2932
  alignItems: "center",
@@ -2869,9 +2985,9 @@ var styles25 = reactNative.StyleSheet.create({
2869
2985
  var nativeDriver11 = reactNative.Platform.OS !== "web";
2870
2986
  function Chip({ label, selected = false, onPress, icon, iconName, style }) {
2871
2987
  const { colors } = useTheme();
2872
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
2873
- const pressAnim = React25.useRef(new reactNative.Animated.Value(selected ? 1 : 0)).current;
2874
- React25.useEffect(() => {
2988
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
2989
+ const pressAnim = React26.useRef(new reactNative.Animated.Value(selected ? 1 : 0)).current;
2990
+ React26.useEffect(() => {
2875
2991
  reactNative.Animated.timing(pressAnim, {
2876
2992
  toValue: selected ? 1 : 0,
2877
2993
  duration: 150,
@@ -2912,7 +3028,7 @@ function Chip({ label, selected = false, onPress, icon, iconName, style }) {
2912
3028
  outputRange: [colors.border, colors.primary]
2913
3029
  });
2914
3030
  const resolvedIcon = iconName ? renderIcon(iconName, ms(13), selected ? colors.primaryForeground : colors.foreground) : icon;
2915
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [styles26.wrapper, { transform: [{ scale: scale2 }] }, style] }, /* @__PURE__ */ React25__default.default.createElement(
3031
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [styles27.wrapper, { transform: [{ scale: scale2 }] }, style] }, /* @__PURE__ */ React26__default.default.createElement(
2916
3032
  reactNative.TouchableOpacity,
2917
3033
  {
2918
3034
  onPress: handlePress,
@@ -2921,7 +3037,7 @@ function Chip({ label, selected = false, onPress, icon, iconName, style }) {
2921
3037
  activeOpacity: 1,
2922
3038
  touchSoundDisabled: true
2923
3039
  },
2924
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: [styles26.chip, { backgroundColor, borderColor }] }, resolvedIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles26.chipIcon }, resolvedIcon) : null, /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.Text, { style: [styles26.label, { color: textColor }], allowFontScaling: true }, label))
3040
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: [styles27.chip, { backgroundColor, borderColor }] }, resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles27.chipIcon }, resolvedIcon) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.Text, { style: [styles27.label, { color: textColor }], allowFontScaling: true }, label))
2925
3041
  ));
2926
3042
  }
2927
3043
  function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
@@ -2946,17 +3062,19 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
2946
3062
  }
2947
3063
  return optionValue === value;
2948
3064
  };
2949
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles26.group, style] }, options.map((opt) => /* @__PURE__ */ React25__default.default.createElement(
3065
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles27.group, style] }, options.map((opt) => /* @__PURE__ */ React26__default.default.createElement(
2950
3066
  Chip,
2951
3067
  {
2952
3068
  key: opt.value,
2953
3069
  label: opt.label,
2954
3070
  selected: isSelected(opt.value),
2955
- onPress: () => handlePress(opt.value)
3071
+ onPress: opt.disabled ? void 0 : () => handlePress(opt.value),
3072
+ iconName: opt.iconName,
3073
+ style: opt.disabled ? { opacity: 0.4 } : void 0
2956
3074
  }
2957
3075
  )));
2958
3076
  }
2959
- var styles26 = reactNative.StyleSheet.create({
3077
+ var styles27 = reactNative.StyleSheet.create({
2960
3078
  wrapper: {},
2961
3079
  chip: {
2962
3080
  borderRadius: 999,
@@ -2994,8 +3112,8 @@ function ConfirmDialog({
2994
3112
  onCancel
2995
3113
  }) {
2996
3114
  const { colors } = useTheme();
2997
- const ref = React25.useRef(null);
2998
- React25.useEffect(() => {
3115
+ const ref = React26.useRef(null);
3116
+ React26.useEffect(() => {
2999
3117
  if (visible) {
3000
3118
  impactLight();
3001
3119
  ref.current?.present();
@@ -3003,7 +3121,7 @@ function ConfirmDialog({
3003
3121
  ref.current?.dismiss();
3004
3122
  }
3005
3123
  }, [visible]);
3006
- const renderBackdrop = (props) => /* @__PURE__ */ React25__default.default.createElement(
3124
+ const renderBackdrop = (props) => /* @__PURE__ */ React26__default.default.createElement(
3007
3125
  bottomSheet.BottomSheetBackdrop,
3008
3126
  {
3009
3127
  ...props,
@@ -3012,34 +3130,25 @@ function ConfirmDialog({
3012
3130
  pressBehavior: "close"
3013
3131
  }
3014
3132
  );
3015
- return /* @__PURE__ */ React25__default.default.createElement(
3133
+ return /* @__PURE__ */ React26__default.default.createElement(
3016
3134
  bottomSheet.BottomSheetModal,
3017
3135
  {
3018
3136
  ref,
3019
3137
  enableDynamicSizing: true,
3020
3138
  onDismiss: onCancel,
3021
3139
  backdropComponent: renderBackdrop,
3022
- backgroundStyle: [styles27.background, { backgroundColor: colors.card }],
3023
- handleIndicatorStyle: [styles27.handle, { backgroundColor: colors.border }],
3140
+ backgroundStyle: [styles28.background, { backgroundColor: colors.card }],
3141
+ handleIndicatorStyle: [styles28.handle, { backgroundColor: colors.border }],
3024
3142
  enablePanDownToClose: true
3025
3143
  },
3026
- /* @__PURE__ */ React25__default.default.createElement(bottomSheet.BottomSheetView, { style: styles27.content }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles27.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles27.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles27.actions }, /* @__PURE__ */ React25__default.default.createElement(
3027
- Button,
3028
- {
3029
- label: cancelLabel,
3030
- variant: "secondary",
3031
- fullWidth: true,
3032
- onPress: onCancel,
3033
- icon: /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "x", size: 15, color: colors.foreground })
3034
- }
3035
- ), /* @__PURE__ */ React25__default.default.createElement(
3144
+ /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style: styles28.content }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles28.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles28.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles28.actions }, /* @__PURE__ */ React26__default.default.createElement(
3036
3145
  Button,
3037
3146
  {
3038
3147
  label: confirmLabel,
3039
3148
  variant: confirmVariant,
3040
3149
  fullWidth: true,
3041
3150
  onPress: onConfirm,
3042
- icon: /* @__PURE__ */ React25__default.default.createElement(
3151
+ icon: /* @__PURE__ */ React26__default.default.createElement(
3043
3152
  vectorIcons.Feather,
3044
3153
  {
3045
3154
  name: confirmVariant === "destructive" ? "trash-2" : "check",
@@ -3048,10 +3157,19 @@ function ConfirmDialog({
3048
3157
  }
3049
3158
  )
3050
3159
  }
3160
+ ), /* @__PURE__ */ React26__default.default.createElement(
3161
+ Button,
3162
+ {
3163
+ label: cancelLabel,
3164
+ variant: "secondary",
3165
+ fullWidth: true,
3166
+ onPress: onCancel,
3167
+ icon: /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Feather, { name: "x", size: 15, color: colors.foreground })
3168
+ }
3051
3169
  )))
3052
3170
  );
3053
3171
  }
3054
- var styles27 = reactNative.StyleSheet.create({
3172
+ var styles28 = reactNative.StyleSheet.create({
3055
3173
  background: {
3056
3174
  borderTopLeftRadius: ms(16),
3057
3175
  borderTopRightRadius: ms(16)
@@ -3081,17 +3199,27 @@ var styles27 = reactNative.StyleSheet.create({
3081
3199
  marginTop: vs(8)
3082
3200
  }
3083
3201
  });
3084
- function LabelValue({ label, value, style }) {
3202
+ function LabelValue({ label, value, iconName, iconColor, style }) {
3085
3203
  const { colors } = useTheme();
3086
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles28.container, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles28.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label), typeof value === "string" ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles28.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
3204
+ const resolvedIcon = iconName ? renderIcon(iconName, ms(14), iconColor ?? colors.foregroundMuted) : null;
3205
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles29.container, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles29.labelSide }, resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles29.icon }, resolvedIcon) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles29.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label)), typeof value === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles29.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
3087
3206
  }
3088
- var styles28 = reactNative.StyleSheet.create({
3207
+ var styles29 = reactNative.StyleSheet.create({
3089
3208
  container: {
3090
3209
  flexDirection: "row",
3091
3210
  justifyContent: "space-between",
3092
3211
  alignItems: "center",
3093
3212
  gap: s(12)
3094
3213
  },
3214
+ labelSide: {
3215
+ flexDirection: "row",
3216
+ alignItems: "center",
3217
+ gap: s(4)
3218
+ },
3219
+ icon: {
3220
+ alignItems: "center",
3221
+ justifyContent: "center"
3222
+ },
3095
3223
  label: {
3096
3224
  fontFamily: "Poppins-Regular",
3097
3225
  fontSize: ms(13),
@@ -3104,22 +3232,19 @@ var styles28 = reactNative.StyleSheet.create({
3104
3232
  textAlign: "right"
3105
3233
  }
3106
3234
  });
3107
- var MONTH_NAMES = [
3108
- "January",
3109
- "February",
3110
- "March",
3111
- "April",
3112
- "May",
3113
- "June",
3114
- "July",
3115
- "August",
3116
- "September",
3117
- "October",
3118
- "November",
3119
- "December"
3120
- ];
3121
- function MonthPicker({ value, onChange, style }) {
3235
+ var MONTH_NAMES = {
3236
+ en: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
3237
+ es: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"],
3238
+ pt: ["janeiro", "fevereiro", "mar\xE7o", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"],
3239
+ fr: ["janvier", "f\xE9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\xFBt", "septembre", "octobre", "novembre", "d\xE9cembre"]
3240
+ };
3241
+ function MonthPicker({ value, onChange, locale = "en", formatLabel, style }) {
3122
3242
  const { colors } = useTheme();
3243
+ const getLabel = () => {
3244
+ if (formatLabel) return formatLabel(value);
3245
+ const names = MONTH_NAMES[locale] ?? MONTH_NAMES.en;
3246
+ return `${names[value.month - 1]} ${value.year}`;
3247
+ };
3123
3248
  const handlePrev = () => {
3124
3249
  selectionAsync();
3125
3250
  if (value.month === 1) {
@@ -3136,27 +3261,27 @@ function MonthPicker({ value, onChange, style }) {
3136
3261
  onChange({ month: value.month + 1, year: value.year });
3137
3262
  }
3138
3263
  };
3139
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles29.container, style] }, /* @__PURE__ */ React25__default.default.createElement(
3264
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles30.container, style] }, /* @__PURE__ */ React26__default.default.createElement(
3140
3265
  reactNative.TouchableOpacity,
3141
3266
  {
3142
- style: styles29.arrow,
3267
+ style: styles30.arrow,
3143
3268
  onPress: handlePrev,
3144
3269
  activeOpacity: 0.6,
3145
3270
  touchSoundDisabled: true
3146
3271
  },
3147
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
3148
- ), /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles29.label, { color: colors.foreground }], allowFontScaling: true }, MONTH_NAMES[value.month - 1], " ", value.year), /* @__PURE__ */ React25__default.default.createElement(
3272
+ /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
3273
+ ), /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles30.label, { color: colors.foreground }], allowFontScaling: true }, getLabel()), /* @__PURE__ */ React26__default.default.createElement(
3149
3274
  reactNative.TouchableOpacity,
3150
3275
  {
3151
- style: styles29.arrow,
3276
+ style: styles30.arrow,
3152
3277
  onPress: handleNext,
3153
3278
  activeOpacity: 0.6,
3154
3279
  touchSoundDisabled: true
3155
3280
  },
3156
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
3281
+ /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
3157
3282
  ));
3158
3283
  }
3159
- var styles29 = reactNative.StyleSheet.create({
3284
+ var styles30 = reactNative.StyleSheet.create({
3160
3285
  container: {
3161
3286
  flexDirection: "row",
3162
3287
  alignItems: "center",
@@ -3177,9 +3302,9 @@ var styles29 = reactNative.StyleSheet.create({
3177
3302
  }
3178
3303
  });
3179
3304
  function useHover() {
3180
- const [hovered, setHovered] = React25.useState(false);
3181
- const onMouseEnter = React25.useCallback(() => setHovered(true), []);
3182
- const onMouseLeave = React25.useCallback(() => setHovered(false), []);
3305
+ const [hovered, setHovered] = React26.useState(false);
3306
+ const onMouseEnter = React26.useCallback(() => setHovered(true), []);
3307
+ const onMouseLeave = React26.useCallback(() => setHovered(false), []);
3183
3308
  if (reactNative.Platform.OS !== "web") {
3184
3309
  return { hovered: false, hoverHandlers: {} };
3185
3310
  }
@@ -3212,7 +3337,7 @@ function MediaCard({
3212
3337
  footer
3213
3338
  }) {
3214
3339
  const { colors } = useTheme();
3215
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
3340
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
3216
3341
  const { hovered, hoverHandlers } = useHover();
3217
3342
  const handlePressIn = () => {
3218
3343
  if (!onPress) return;
@@ -3229,27 +3354,27 @@ function MediaCard({
3229
3354
  };
3230
3355
  const ratio = aspectRatioMap[aspectRatio];
3231
3356
  const resolvedActionIcon = actionIconName ? renderIcon(actionIconName, 18, actionActive ? colors.primary : colors.background) : actionIcon ?? renderIcon("heart", 18, actionActive ? colors.primary : colors.background);
3232
- const cardContent = /* @__PURE__ */ React25__default.default.createElement(
3357
+ const cardContent = /* @__PURE__ */ React26__default.default.createElement(
3233
3358
  reactNative.View,
3234
3359
  {
3235
3360
  style: [
3236
- styles30.card,
3237
- hovered && styles30.cardHovered,
3361
+ styles31.card,
3362
+ hovered && styles31.cardHovered,
3238
3363
  style
3239
3364
  ],
3240
3365
  ...reactNative.Platform.OS === "web" ? hoverHandlers : {}
3241
3366
  },
3242
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles30.imageContainer, imageStyle] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React25__default.default.createElement(
3367
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles31.imageContainer, imageStyle] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React26__default.default.createElement(
3243
3368
  reactNative.Image,
3244
3369
  {
3245
3370
  source: imageSource,
3246
- style: styles30.image,
3371
+ style: styles31.image,
3247
3372
  resizeMode: "cover"
3248
3373
  }
3249
- ) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles30.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles30.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React25__default.default.createElement(
3374
+ ) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles31.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles31.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React26__default.default.createElement(
3250
3375
  reactNative.TouchableOpacity,
3251
3376
  {
3252
- style: [styles30.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
3377
+ style: [styles31.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
3253
3378
  onPress: () => {
3254
3379
  impactLight();
3255
3380
  onActionPress?.();
@@ -3259,10 +3384,10 @@ function MediaCard({
3259
3384
  },
3260
3385
  resolvedActionIcon
3261
3386
  )),
3262
- (title || subtitle || caption || footer) && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles30.meta }, title ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles30.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles30.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles30.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
3387
+ (title || subtitle || caption || footer) && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles31.meta }, title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
3263
3388
  );
3264
3389
  if (onPress) {
3265
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25__default.default.createElement(
3390
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26__default.default.createElement(
3266
3391
  reactNative.TouchableOpacity,
3267
3392
  {
3268
3393
  onPress: handlePress,
@@ -3276,7 +3401,7 @@ function MediaCard({
3276
3401
  }
3277
3402
  return cardContent;
3278
3403
  }
3279
- var styles30 = reactNative.StyleSheet.create({
3404
+ var styles31 = reactNative.StyleSheet.create({
3280
3405
  card: {
3281
3406
  borderRadius: RADIUS.md,
3282
3407
  // 14px — Airbnb property card spec
@@ -3341,7 +3466,7 @@ function CategoryChip({
3341
3466
  onPress
3342
3467
  }) {
3343
3468
  const { colors } = useTheme();
3344
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
3469
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
3345
3470
  const handlePressIn = () => {
3346
3471
  reactNative.Animated.spring(scale2, { toValue: 0.95, useNativeDriver: nativeDriver13, speed: 40, bounciness: 0 }).start();
3347
3472
  };
@@ -3352,11 +3477,11 @@ function CategoryChip({
3352
3477
  const textColor = selected ? colors.primaryForeground : colors.foregroundSubtle;
3353
3478
  const borderColor = selected ? colors.primary : colors.border;
3354
3479
  const resolvedIcon = typeof item.icon === "string" ? renderIcon(item.icon, 16, textColor) : item.icon ?? null;
3355
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React25__default.default.createElement(
3480
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.Animated.View, { style: { transform: [{ scale: scale2 }] } }, /* @__PURE__ */ React26__default.default.createElement(
3356
3481
  reactNative.TouchableOpacity,
3357
3482
  {
3358
3483
  style: [
3359
- styles31.chip,
3484
+ styles32.chip,
3360
3485
  {
3361
3486
  backgroundColor: bgColor,
3362
3487
  borderColor
@@ -3368,9 +3493,9 @@ function CategoryChip({
3368
3493
  activeOpacity: 1,
3369
3494
  touchSoundDisabled: true
3370
3495
  },
3371
- resolvedIcon && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles31.chipIcon }, resolvedIcon),
3372
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles31.chipLabel, { color: textColor }], allowFontScaling: true }, item.label),
3373
- item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles31.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles31.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
3496
+ resolvedIcon && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles32.chipIcon }, resolvedIcon),
3497
+ /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles32.chipLabel, { color: textColor }], allowFontScaling: true }, item.label),
3498
+ item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles32.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles32.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
3374
3499
  ));
3375
3500
  }
3376
3501
  function CategoryStrip({
@@ -3392,15 +3517,15 @@ function CategoryStrip({
3392
3517
  onValueChange?.(v === value ? "" : v);
3393
3518
  }
3394
3519
  };
3395
- return /* @__PURE__ */ React25__default.default.createElement(
3520
+ return /* @__PURE__ */ React26__default.default.createElement(
3396
3521
  reactNative.ScrollView,
3397
3522
  {
3398
3523
  horizontal: true,
3399
3524
  showsHorizontalScrollIndicator: false,
3400
- contentContainerStyle: [styles31.container, style],
3401
- style: styles31.scroll
3525
+ contentContainerStyle: [styles32.container, style],
3526
+ style: styles32.scroll
3402
3527
  },
3403
- categories.map((cat) => /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { key: cat.value, style: itemStyle }, /* @__PURE__ */ React25__default.default.createElement(
3528
+ categories.map((cat) => /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { key: cat.value, style: itemStyle }, /* @__PURE__ */ React26__default.default.createElement(
3404
3529
  CategoryChip,
3405
3530
  {
3406
3531
  item: cat,
@@ -3410,7 +3535,7 @@ function CategoryStrip({
3410
3535
  )))
3411
3536
  );
3412
3537
  }
3413
- var styles31 = reactNative.StyleSheet.create({
3538
+ var styles32 = reactNative.StyleSheet.create({
3414
3539
  scroll: {
3415
3540
  flexGrow: 0
3416
3541
  },
@@ -3463,7 +3588,7 @@ function Pressable2({
3463
3588
  hoverScale = 1.02,
3464
3589
  ...touchableProps
3465
3590
  }) {
3466
- const scale2 = React25.useRef(new reactNative.Animated.Value(1)).current;
3591
+ const scale2 = React26.useRef(new reactNative.Animated.Value(1)).current;
3467
3592
  const { hovered, hoverHandlers } = useHover();
3468
3593
  const handlePressIn = () => {
3469
3594
  if (disabled) return;
@@ -3489,7 +3614,7 @@ function Pressable2({
3489
3614
  onPress();
3490
3615
  };
3491
3616
  const hoverScaleValue = hovered && hoverScale !== 1 ? hoverScale : 1;
3492
- return /* @__PURE__ */ React25__default.default.createElement(
3617
+ return /* @__PURE__ */ React26__default.default.createElement(
3493
3618
  reactNative.Animated.View,
3494
3619
  {
3495
3620
  style: [
@@ -3498,7 +3623,7 @@ function Pressable2({
3498
3623
  ],
3499
3624
  ...reactNative.Platform.OS === "web" ? hoverHandlers : {}
3500
3625
  },
3501
- /* @__PURE__ */ React25__default.default.createElement(
3626
+ /* @__PURE__ */ React26__default.default.createElement(
3502
3627
  reactNative.TouchableOpacity,
3503
3628
  {
3504
3629
  onPress: handlePress,
@@ -3513,6 +3638,103 @@ function Pressable2({
3513
3638
  )
3514
3639
  );
3515
3640
  }
3641
+ var weightMap = {
3642
+ normal: "Poppins-Regular",
3643
+ medium: "Poppins-Medium",
3644
+ semibold: "Poppins-SemiBold",
3645
+ bold: "Poppins-Bold"
3646
+ };
3647
+ function DetailRow({
3648
+ label,
3649
+ value,
3650
+ separator = "dotted",
3651
+ labelWeight = "normal",
3652
+ valueColor,
3653
+ leftIcon,
3654
+ leftIconName,
3655
+ leftIconColor,
3656
+ rightIconName,
3657
+ rightIconColor,
3658
+ style,
3659
+ labelStyle,
3660
+ valueStyle
3661
+ }) {
3662
+ const { colors } = useTheme();
3663
+ const resolvedLeftIcon = leftIconName ? renderIcon(leftIconName, ms(14), leftIconColor ?? colors.foregroundMuted) : leftIcon;
3664
+ const resolvedRightIcon = rightIconName ? renderIcon(rightIconName, ms(14), rightIconColor ?? colors.foregroundMuted) : null;
3665
+ const separatorStyle = separator === "none" ? null : {
3666
+ flex: 1,
3667
+ height: 1,
3668
+ borderBottomWidth: 1,
3669
+ borderStyle: separator,
3670
+ borderColor: "rgba(128,128,128,0.3)",
3671
+ marginHorizontal: s(4)
3672
+ };
3673
+ return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles33.row, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.labelSide }, resolvedLeftIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.icon }, resolvedLeftIcon) : null, typeof label === "string" ? /* @__PURE__ */ React26__default.default.createElement(
3674
+ reactNative.Text,
3675
+ {
3676
+ style: [styles33.labelText, { color: colors.foregroundMuted, fontFamily: weightMap[labelWeight] }, labelStyle],
3677
+ allowFontScaling: true
3678
+ },
3679
+ label
3680
+ ) : label), separatorStyle ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: separatorStyle }) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.spacer }), /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.valueSide }, /* @__PURE__ */ React26__default.default.createElement(
3681
+ reactNative.Text,
3682
+ {
3683
+ style: [styles33.valueText, { color: valueColor ?? colors.foreground }, valueStyle],
3684
+ allowFontScaling: true
3685
+ },
3686
+ value
3687
+ ), resolvedRightIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.icon }, resolvedRightIcon) : null));
3688
+ }
3689
+ var styles33 = reactNative.StyleSheet.create({
3690
+ row: {
3691
+ flexDirection: "row",
3692
+ alignItems: "center",
3693
+ gap: s(4)
3694
+ },
3695
+ labelSide: {
3696
+ flexDirection: "row",
3697
+ alignItems: "center",
3698
+ gap: s(4),
3699
+ flexShrink: 0
3700
+ },
3701
+ icon: {
3702
+ alignItems: "center",
3703
+ justifyContent: "center"
3704
+ },
3705
+ spacer: {
3706
+ flex: 1
3707
+ },
3708
+ labelText: {
3709
+ fontSize: ms(13),
3710
+ lineHeight: mvs(18)
3711
+ },
3712
+ valueSide: {
3713
+ flexDirection: "row",
3714
+ alignItems: "center",
3715
+ gap: s(4),
3716
+ flexShrink: 0
3717
+ },
3718
+ valueText: {
3719
+ fontFamily: "Poppins-SemiBold",
3720
+ fontSize: ms(13),
3721
+ lineHeight: mvs(18)
3722
+ }
3723
+ });
3724
+
3725
+ // src/utils/typography.ts
3726
+ function getResponsiveFontSize(text, maxSize, steps = [
3727
+ { maxLen: 10, subtract: 0 },
3728
+ { maxLen: 12, subtract: 4 },
3729
+ { maxLen: 14, subtract: 6 }
3730
+ ]) {
3731
+ const len = text.length;
3732
+ const sorted = [...steps].sort((a, b) => a.maxLen - b.maxLen);
3733
+ for (const step of sorted) {
3734
+ if (len <= step.maxLen) return maxSize - step.subtract;
3735
+ }
3736
+ return maxSize - 8;
3737
+ }
3516
3738
 
3517
3739
  Object.defineProperty(exports, "BottomSheetModalProvider", {
3518
3740
  enumerable: true,
@@ -3524,6 +3746,7 @@ exports.Avatar = Avatar;
3524
3746
  exports.BREAKPOINTS = BREAKPOINTS;
3525
3747
  exports.Badge = Badge;
3526
3748
  exports.Button = Button;
3749
+ exports.ButtonGroup = ButtonGroup;
3527
3750
  exports.Card = Card;
3528
3751
  exports.CardContent = CardContent;
3529
3752
  exports.CardDescription = CardDescription;
@@ -3538,6 +3761,7 @@ exports.ConfirmDialog = ConfirmDialog;
3538
3761
  exports.CurrencyDisplay = CurrencyDisplay;
3539
3762
  exports.CurrencyInput = CurrencyInput;
3540
3763
  exports.CurrencyInputLarge = CurrencyInput;
3764
+ exports.DetailRow = DetailRow;
3541
3765
  exports.EmptyState = EmptyState;
3542
3766
  exports.ICON_SIZES = ICON_SIZES;
3543
3767
  exports.Icon = Icon;
@@ -3571,6 +3795,7 @@ exports.Toggle = Toggle;
3571
3795
  exports.defaultDark = defaultDark;
3572
3796
  exports.defaultLight = defaultLight;
3573
3797
  exports.deriveColors = deriveColors;
3798
+ exports.getResponsiveFontSize = getResponsiveFontSize;
3574
3799
  exports.renderIcon = renderIcon;
3575
3800
  exports.useTheme = useTheme;
3576
3801
  exports.useToast = useToast;