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