@retray-dev/ui-kit 10.2.0 → 12.2.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 +384 -40
- package/README.md +14 -5
- package/dist/Accordion.d.mts +6 -0
- package/dist/Accordion.d.ts +6 -0
- package/dist/Accordion.js +16 -0
- package/dist/Accordion.mjs +2 -2
- package/dist/AlertBanner.js +2 -0
- package/dist/AlertBanner.mjs +2 -2
- package/dist/AppHeader.js +2 -0
- package/dist/AppHeader.mjs +3 -3
- package/dist/Avatar.js +2 -0
- package/dist/Avatar.mjs +2 -2
- package/dist/Badge.js +2 -0
- package/dist/Badge.mjs +2 -2
- package/dist/Button.js +17 -17
- package/dist/Button.mjs +2 -2
- package/dist/Card.js +2 -0
- package/dist/Card.mjs +2 -2
- package/dist/CategoryStrip.js +2 -0
- package/dist/CategoryStrip.mjs +2 -2
- package/dist/Checkbox.js +2 -0
- package/dist/Checkbox.mjs +2 -2
- package/dist/Chip.js +2 -0
- package/dist/Chip.mjs +2 -2
- package/dist/ConfirmDialog.d.mts +1 -6
- package/dist/ConfirmDialog.d.ts +1 -6
- package/dist/ConfirmDialog.js +53 -41
- package/dist/ConfirmDialog.mjs +3 -3
- package/dist/CurrencyDisplay.js +2 -0
- package/dist/CurrencyDisplay.mjs +2 -2
- package/dist/CurrencyInput.d.mts +3 -8
- package/dist/CurrencyInput.d.ts +3 -8
- package/dist/CurrencyInput.js +5 -1
- package/dist/CurrencyInput.mjs +3 -3
- package/dist/DetailRow.js +2 -0
- package/dist/DetailRow.mjs +2 -2
- package/dist/EmptyState.js +17 -17
- package/dist/EmptyState.mjs +3 -3
- package/dist/ErrorBoundary.js +2 -0
- package/dist/ErrorBoundary.mjs +2 -2
- package/dist/Form.js +2 -0
- package/dist/Form.mjs +2 -2
- package/dist/IconButton.js +2 -0
- package/dist/IconButton.mjs +2 -2
- package/dist/IconPicker.js +677 -248
- package/dist/IconPicker.mjs +3 -2
- package/dist/ImageUpload.d.mts +3 -1
- package/dist/ImageUpload.d.ts +3 -1
- package/dist/ImageUpload.js +10 -3
- package/dist/ImageUpload.mjs +3 -3
- package/dist/ImageViewer.js +2 -0
- package/dist/ImageViewer.mjs +4 -4
- package/dist/Input.js +2 -0
- package/dist/Input.mjs +2 -2
- package/dist/LabelValue.js +2 -0
- package/dist/LabelValue.mjs +2 -2
- package/dist/ListGroup.js +2 -0
- package/dist/ListGroup.mjs +2 -2
- package/dist/ListItem.d.mts +7 -7
- package/dist/ListItem.d.ts +7 -7
- package/dist/ListItem.js +14 -7
- package/dist/ListItem.mjs +2 -2
- package/dist/MediaCard.js +2 -0
- package/dist/MediaCard.mjs +2 -2
- package/dist/MenuGroup.js +2 -0
- package/dist/MenuGroup.mjs +2 -2
- package/dist/MenuItem.js +2 -0
- package/dist/MenuItem.mjs +2 -2
- package/dist/MonthPicker.js +2 -0
- package/dist/MonthPicker.mjs +2 -2
- package/dist/NumberStepper.js +2 -0
- package/dist/NumberStepper.mjs +2 -2
- package/dist/PagerDots.js +2 -0
- package/dist/PagerDots.mjs +2 -2
- package/dist/Pressable.d.mts +15 -7
- package/dist/Pressable.d.ts +15 -7
- package/dist/Pressable.js +7 -3
- package/dist/Pressable.mjs +1 -1
- package/dist/PricingCard.js +17 -17
- package/dist/PricingCard.mjs +4 -4
- package/dist/Progress.js +2 -0
- package/dist/Progress.mjs +2 -2
- package/dist/RadioGroup.js +2 -0
- package/dist/RadioGroup.mjs +2 -2
- package/dist/RetrayProvider.d.mts +1 -1
- package/dist/RetrayProvider.d.ts +1 -1
- package/dist/RetrayProvider.js +2 -0
- package/dist/RetrayProvider.mjs +3 -3
- package/dist/Select.js +2 -0
- package/dist/Select.mjs +2 -2
- package/dist/SelectableCard.d.mts +27 -0
- package/dist/SelectableCard.d.ts +27 -0
- package/dist/SelectableCard.js +511 -0
- package/dist/SelectableCard.mjs +8 -0
- package/dist/SelectableGrid.js +2 -0
- package/dist/SelectableGrid.mjs +2 -2
- package/dist/Separator.js +2 -0
- package/dist/Separator.mjs +2 -2
- package/dist/Sheet.d.mts +4 -46
- package/dist/Sheet.d.ts +4 -46
- package/dist/Sheet.js +55 -115
- package/dist/Sheet.mjs +2 -3
- package/dist/SheetSelect.js +2 -0
- package/dist/SheetSelect.mjs +2 -2
- package/dist/Skeleton.d.mts +3 -1
- package/dist/Skeleton.d.ts +3 -1
- package/dist/Skeleton.js +5 -2
- package/dist/Skeleton.mjs +2 -2
- package/dist/Slider.js +2 -0
- package/dist/Slider.mjs +2 -2
- package/dist/Spinner.js +2 -0
- package/dist/Spinner.mjs +2 -2
- package/dist/Stats.d.mts +33 -0
- package/dist/Stats.d.ts +33 -0
- package/dist/Stats.js +453 -0
- package/dist/Stats.mjs +9 -0
- package/dist/Switch.js +2 -0
- package/dist/Switch.mjs +2 -2
- package/dist/TabBar.js +2 -0
- package/dist/TabBar.mjs +2 -2
- package/dist/Tabs.js +2 -0
- package/dist/Tabs.mjs +2 -2
- package/dist/Text.d.mts +3 -1
- package/dist/Text.d.ts +3 -1
- package/dist/Text.js +5 -3
- package/dist/Text.mjs +2 -2
- package/dist/Textarea.js +2 -0
- package/dist/Textarea.mjs +2 -2
- package/dist/Toast.js +2 -0
- package/dist/Toast.mjs +2 -2
- package/dist/Toggle.js +2 -0
- package/dist/Toggle.mjs +2 -2
- package/dist/{chunk-U2XJFYED.mjs → chunk-2BA3JMKK.mjs} +1 -1
- package/dist/{chunk-NMU5FMQJ.mjs → chunk-2HFD4IHU.mjs} +4 -2
- package/dist/{chunk-S2R7UVOE.mjs → chunk-2LG326TT.mjs} +1 -1
- package/dist/chunk-2P2CB235.mjs +236 -0
- package/dist/{chunk-6L4G6PBT.mjs → chunk-3XCFYSX4.mjs} +1 -1
- package/dist/{chunk-HTHGSXFG.mjs → chunk-4J2PXL36.mjs} +16 -18
- package/dist/{chunk-BEMIQXXU.mjs → chunk-4OORJ2DY.mjs} +1 -1
- package/dist/chunk-4XOB5TTD.mjs +166 -0
- package/dist/{chunk-FCSSQK3L.mjs → chunk-57V2LXCK.mjs} +1 -1
- package/dist/{chunk-6Q64UFIA.mjs → chunk-7AFZWSCI.mjs} +1 -1
- package/dist/{chunk-IX3NYLYQ.mjs → chunk-7ELGZ66G.mjs} +1 -1
- package/dist/{chunk-GD6KXMG5.mjs → chunk-AENAVIKT.mjs} +1 -1
- package/dist/{chunk-ID72TK46.mjs → chunk-BXF4AMHY.mjs} +1 -1
- package/dist/{chunk-SOA2Z4RB.mjs → chunk-C43HRKXH.mjs} +1 -1
- package/dist/{chunk-TZDGAP5N.mjs → chunk-CF27NBXO.mjs} +11 -6
- package/dist/{chunk-SXLKNTA4.mjs → chunk-DF7JA72E.mjs} +1 -1
- package/dist/{chunk-AJRVDP2H.mjs → chunk-E5UKLSJZ.mjs} +3 -3
- package/dist/{chunk-MBMXYJJV.mjs → chunk-E7NEHHXV.mjs} +7 -3
- package/dist/{chunk-VKID2D2I.mjs → chunk-EDLCGYIO.mjs} +13 -8
- package/dist/{chunk-BUMAMSTZ.mjs → chunk-ELGEOM7I.mjs} +1 -1
- package/dist/{chunk-DYT7BG5I.mjs → chunk-F3YTWO3T.mjs} +1 -1
- package/dist/{chunk-VF2ATYN3.mjs → chunk-GH67YXG6.mjs} +1 -1
- package/dist/{chunk-WJLKJMKR.mjs → chunk-GUTDFUNF.mjs} +4 -4
- package/dist/{chunk-6SECQ2ZF.mjs → chunk-HC4VVCWY.mjs} +2 -2
- package/dist/{chunk-A3A6KNQN.mjs → chunk-HEDQPK4I.mjs} +1 -1
- package/dist/{chunk-GQYFLP3D.mjs → chunk-IVSRW4HS.mjs} +1 -1
- package/dist/{chunk-KOO4WITD.mjs → chunk-KSUWPU2F.mjs} +1 -1
- package/dist/{chunk-WBOOUHSS.mjs → chunk-LIS6I5UP.mjs} +1 -1
- package/dist/{chunk-X4G6APW6.mjs → chunk-LNPKGWBG.mjs} +1 -1
- package/dist/{chunk-T2KCAHOS.mjs → chunk-LOBLCFMN.mjs} +1 -1
- package/dist/{chunk-ELXBDILQ.mjs → chunk-LPV4NJJK.mjs} +2 -2
- package/dist/{chunk-Y2NS74WS.mjs → chunk-M3C7XM2M.mjs} +53 -99
- package/dist/{chunk-BRKYVJVV.mjs → chunk-MEPSKGBO.mjs} +1 -1
- package/dist/{chunk-TBNZHU6C.mjs → chunk-MVMGPZN6.mjs} +2 -2
- package/dist/{chunk-YJ7I257J.mjs → chunk-NHDI3VQB.mjs} +15 -1
- package/dist/{chunk-Z6SFHN6T.mjs → chunk-NJG7DHVF.mjs} +1 -1
- package/dist/{chunk-RYZC432S.mjs → chunk-NLZY4TXU.mjs} +1 -1
- package/dist/{chunk-ZZ2R6KZ3.mjs → chunk-OLVJFKXS.mjs} +1 -1
- package/dist/{chunk-AJ7ZDNBT.mjs → chunk-QDAZGZUF.mjs} +4 -3
- package/dist/{chunk-JT7HKXRB.mjs → chunk-QOLWA2PW.mjs} +1 -1
- package/dist/{chunk-WYEUNUTP.mjs → chunk-QXDGGOLC.mjs} +38 -25
- package/dist/{chunk-JMOZEC77.mjs → chunk-RJNLAH76.mjs} +1 -1
- package/dist/{chunk-WF2XDFRK.mjs → chunk-RMRS44MQ.mjs} +1 -1
- package/dist/chunk-SAWUXP3A.mjs +1114 -0
- package/dist/{chunk-OB4JUQ3O.mjs → chunk-TS7DGUIR.mjs} +1 -1
- package/dist/{chunk-AV4EMIRH.mjs → chunk-UBUXUMER.mjs} +1 -1
- package/dist/{chunk-IRRY3CRZ.mjs → chunk-ULGNQPNE.mjs} +1 -1
- package/dist/{chunk-7LWRKMF5.mjs → chunk-UNNRUJTM.mjs} +1 -1
- package/dist/{chunk-TB6SD2FT.mjs → chunk-UQ4742ET.mjs} +1 -1
- package/dist/{chunk-MX6HRKMI.mjs → chunk-VJBUCITV.mjs} +1 -1
- package/dist/{chunk-2UYENBLV.mjs → chunk-YMYIEVZP.mjs} +1 -1
- package/dist/{chunk-SOYNZDVY.mjs → chunk-YTXRIXNZ.mjs} +8 -1
- package/dist/{chunk-YFZ3ELX5.mjs → chunk-ZIMY2QUM.mjs} +2 -2
- package/dist/{chunk-Z4VHZ7B5.mjs → chunk-ZR6HSEAB.mjs} +1 -1
- package/dist/fonts.d.mts +1 -7
- package/dist/fonts.d.ts +1 -7
- package/dist/fonts.js +0 -2
- package/dist/fonts.mjs +1 -2
- package/dist/{index-wt-orHUi.d.ts → index-CY34hxPN.d.mts} +1 -0
- package/dist/{index-wt-orHUi.d.mts → index-CY34hxPN.d.ts} +1 -0
- package/dist/index.d.mts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +1517 -761
- package/dist/index.mjs +54 -52
- package/package.json +3 -3
- package/src/components/Accordion/Accordion.tsx +20 -0
- package/src/components/Button/Button.tsx +29 -26
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +47 -31
- package/src/components/CurrencyInput/CurrencyInput.tsx +4 -7
- package/src/components/IconPicker/IconPicker.tsx +124 -112
- package/src/components/ImageUpload/ImageUpload.tsx +10 -3
- package/src/components/ListItem/ListItem.tsx +43 -28
- package/src/components/Pressable/Pressable.tsx +20 -8
- package/src/components/SelectableCard/SelectableCard.tsx +304 -0
- package/src/components/SelectableCard/index.ts +1 -0
- package/src/components/Sheet/Sheet.tsx +72 -173
- package/src/components/Skeleton/Skeleton.tsx +5 -2
- package/src/components/Stats/Stats.tsx +254 -0
- package/src/components/Stats/index.ts +2 -0
- package/src/components/Text/Text.tsx +4 -2
- package/src/fonts.ts +0 -7
- package/src/index.ts +5 -0
- package/src/theme/colorUtils.ts +9 -0
- package/src/theme/colors.ts +7 -0
- package/src/theme/types.ts +4 -1
- package/src/utils/curatedIcons.ts +698 -135
- package/src/utils/fontGuard.ts +2 -1
- package/dist/chunk-53Z3NYGE.mjs +0 -742
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React55 = require('react');
|
|
4
4
|
var reactNative = require('react-native');
|
|
5
5
|
var reactNativeSizeMatters = require('react-native-size-matters');
|
|
6
6
|
var AntDesign = require('@expo/vector-icons/AntDesign');
|
|
@@ -12,7 +12,7 @@ var Ionicons = require('@expo/vector-icons/Ionicons');
|
|
|
12
12
|
var pressto = require('pressto');
|
|
13
13
|
var Animated12 = require('react-native-reanimated');
|
|
14
14
|
var expoFont = require('expo-font');
|
|
15
|
-
var
|
|
15
|
+
var bottomSheet = require('@gorhom/bottom-sheet');
|
|
16
16
|
var reactNativeEase = require('react-native-ease');
|
|
17
17
|
var vectorIcons = require('@expo/vector-icons');
|
|
18
18
|
var expoLinearGradient = require('expo-linear-gradient');
|
|
@@ -24,7 +24,7 @@ var reactNativeGestureHandler = require('react-native-gesture-handler');
|
|
|
24
24
|
|
|
25
25
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
26
26
|
|
|
27
|
-
var
|
|
27
|
+
var React55__default = /*#__PURE__*/_interopDefault(React55);
|
|
28
28
|
var AntDesign__default = /*#__PURE__*/_interopDefault(AntDesign);
|
|
29
29
|
var Entypo__default = /*#__PURE__*/_interopDefault(Entypo);
|
|
30
30
|
var Feather__default = /*#__PURE__*/_interopDefault(Feather);
|
|
@@ -32,7 +32,6 @@ var FontAwesome5__default = /*#__PURE__*/_interopDefault(FontAwesome5);
|
|
|
32
32
|
var MaterialIcons__default = /*#__PURE__*/_interopDefault(MaterialIcons);
|
|
33
33
|
var Ionicons__default = /*#__PURE__*/_interopDefault(Ionicons);
|
|
34
34
|
var Animated12__default = /*#__PURE__*/_interopDefault(Animated12);
|
|
35
|
-
var BottomSheet__default = /*#__PURE__*/_interopDefault(BottomSheet);
|
|
36
35
|
var RNSlider__default = /*#__PURE__*/_interopDefault(RNSlider);
|
|
37
36
|
|
|
38
37
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
@@ -93,6 +92,11 @@ function darken(hex, amount) {
|
|
|
93
92
|
if (!rgb) return hex;
|
|
94
93
|
return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount));
|
|
95
94
|
}
|
|
95
|
+
function withAlpha(hex, alpha) {
|
|
96
|
+
const rgb = hexToRgb(hex);
|
|
97
|
+
if (!rgb) return hex;
|
|
98
|
+
return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
|
|
99
|
+
}
|
|
96
100
|
|
|
97
101
|
// src/theme/colors.ts
|
|
98
102
|
var defaultLight = {
|
|
@@ -140,6 +144,7 @@ function deriveColors(t, scheme) {
|
|
|
140
144
|
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
|
|
141
145
|
const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
|
|
142
146
|
const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
|
|
147
|
+
const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
|
|
143
148
|
const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
|
|
144
149
|
const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
|
|
145
150
|
const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
|
|
@@ -152,6 +157,7 @@ function deriveColors(t, scheme) {
|
|
|
152
157
|
foregroundMuted,
|
|
153
158
|
surface,
|
|
154
159
|
surfaceStrong,
|
|
160
|
+
skeleton,
|
|
155
161
|
destructiveTint,
|
|
156
162
|
destructiveBorder,
|
|
157
163
|
successTint,
|
|
@@ -168,23 +174,23 @@ function deriveColors(t, scheme) {
|
|
|
168
174
|
}
|
|
169
175
|
|
|
170
176
|
// src/theme/ThemeProvider.tsx
|
|
171
|
-
var ThemeContext =
|
|
177
|
+
var ThemeContext = React55.createContext({
|
|
172
178
|
colors: deriveColors(defaultLight, "light"),
|
|
173
179
|
colorScheme: "light"
|
|
174
180
|
});
|
|
175
181
|
function ThemeProvider({ children, theme, colorScheme = "system" }) {
|
|
176
182
|
const systemScheme = reactNative.useColorScheme() ?? "light";
|
|
177
183
|
const resolvedScheme = colorScheme === "system" ? systemScheme : colorScheme;
|
|
178
|
-
const colors =
|
|
184
|
+
const colors = React55.useMemo(() => {
|
|
179
185
|
const base = resolvedScheme === "dark" ? defaultDark : defaultLight;
|
|
180
186
|
const override = resolvedScheme === "dark" ? theme?.dark : theme?.light;
|
|
181
187
|
const merged = override ? { ...base, ...override } : base;
|
|
182
188
|
return deriveColors(merged, resolvedScheme);
|
|
183
189
|
}, [resolvedScheme, theme]);
|
|
184
|
-
return /* @__PURE__ */
|
|
190
|
+
return /* @__PURE__ */ React55__default.default.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
|
|
185
191
|
}
|
|
186
192
|
function useTheme() {
|
|
187
|
-
const context =
|
|
193
|
+
const context = React55.useContext(ThemeContext);
|
|
188
194
|
if (!context) {
|
|
189
195
|
throw new Error("useTheme must be used within a ThemeProvider");
|
|
190
196
|
}
|
|
@@ -408,10 +414,10 @@ function Icon({ name, size, color, family }) {
|
|
|
408
414
|
}
|
|
409
415
|
if (!resolved) return null;
|
|
410
416
|
const Component = resolved.component;
|
|
411
|
-
return
|
|
417
|
+
return React55__default.default.createElement(Component, { name, size, color });
|
|
412
418
|
}
|
|
413
419
|
function renderIcon(name, size, color) {
|
|
414
|
-
return
|
|
420
|
+
return React55__default.default.createElement(Icon, { name, size, color });
|
|
415
421
|
}
|
|
416
422
|
|
|
417
423
|
// src/tokens.ts
|
|
@@ -715,28 +721,30 @@ function ButtonBase({
|
|
|
715
721
|
impactMedium();
|
|
716
722
|
onPress?.();
|
|
717
723
|
};
|
|
718
|
-
const containerVariantStyle = {
|
|
724
|
+
const containerVariantStyle = isDisabled ? {
|
|
725
|
+
primary: { backgroundColor: colors.surface },
|
|
726
|
+
secondary: { backgroundColor: "transparent", borderWidth: 1.5, borderColor: colors.border },
|
|
727
|
+
text: { backgroundColor: "transparent" },
|
|
728
|
+
destructive: { backgroundColor: colors.surface }
|
|
729
|
+
}[variant] : {
|
|
719
730
|
primary: { backgroundColor: colors.primary },
|
|
720
731
|
secondary: { backgroundColor: "transparent", borderWidth: 1.5, borderColor: colors.primary },
|
|
721
732
|
text: { backgroundColor: "transparent" },
|
|
722
733
|
destructive: { backgroundColor: colors.destructive }
|
|
723
734
|
}[variant];
|
|
724
|
-
const
|
|
725
|
-
primary:
|
|
726
|
-
secondary:
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
// carry the brand voltage. Falls back to primary when no accent is defined.
|
|
730
|
-
text: { color: colors.accentResolved },
|
|
731
|
-
destructive: { color: colors.destructiveForeground }
|
|
735
|
+
const labelColor = isDisabled ? colors.foregroundMuted : {
|
|
736
|
+
primary: colors.primaryForeground,
|
|
737
|
+
secondary: colors.primary,
|
|
738
|
+
text: colors.accentResolved,
|
|
739
|
+
destructive: colors.destructiveForeground
|
|
732
740
|
}[variant];
|
|
733
|
-
const textColor = iconColor ??
|
|
741
|
+
const textColor = iconColor ?? labelColor;
|
|
734
742
|
const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], textColor) : typeof icon === "function" ? icon({ label, size, variant, color: textColor }) : icon;
|
|
735
|
-
const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.accentResolved;
|
|
743
|
+
const spinnerColor = isDisabled ? colors.foregroundMuted : variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.accentResolved;
|
|
736
744
|
const styleArray = Array.isArray(style) ? style : style ? [style] : [];
|
|
737
745
|
const flatStyle = reactNative.StyleSheet.flatten(styleArray);
|
|
738
746
|
const { flex, ...restStyle } = flatStyle || {};
|
|
739
|
-
return /* @__PURE__ */
|
|
747
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [fullWidth && styles.fullWidth, flex !== void 0 && { flex }] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
740
748
|
PressableButton,
|
|
741
749
|
{
|
|
742
750
|
style: [
|
|
@@ -744,7 +752,6 @@ function ButtonBase({
|
|
|
744
752
|
containerVariantStyle,
|
|
745
753
|
containerSizeStyles[size],
|
|
746
754
|
fullWidth && styles.fullWidth,
|
|
747
|
-
isDisabled && styles.disabled,
|
|
748
755
|
restStyle
|
|
749
756
|
],
|
|
750
757
|
enabled: !isDisabled,
|
|
@@ -757,26 +764,26 @@ function ButtonBase({
|
|
|
757
764
|
accessibilityHint,
|
|
758
765
|
accessibilityState: { disabled: isDisabled, busy: loading }
|
|
759
766
|
},
|
|
760
|
-
loading ? /* @__PURE__ */
|
|
767
|
+
loading ? /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, /* @__PURE__ */ React55__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor, style: { marginRight: s(6) } }), /* @__PURE__ */ React55__default.default.createElement(
|
|
761
768
|
reactNative.Text,
|
|
762
769
|
{
|
|
763
|
-
style: [styles.label,
|
|
770
|
+
style: [styles.label, { color: labelColor }, labelSizeStyles[size], styles.labelLoading],
|
|
764
771
|
allowFontScaling: true,
|
|
765
772
|
numberOfLines: 1
|
|
766
773
|
},
|
|
767
774
|
label
|
|
768
|
-
)) : /* @__PURE__ */
|
|
775
|
+
)) : /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, effectiveIcon), /* @__PURE__ */ React55__default.default.createElement(
|
|
769
776
|
reactNative.Text,
|
|
770
777
|
{
|
|
771
|
-
style: [styles.label,
|
|
778
|
+
style: [styles.label, { color: labelColor }, labelSizeStyles[size], effectiveIcon ? styles.labelWithIcon : void 0],
|
|
772
779
|
allowFontScaling: true,
|
|
773
780
|
numberOfLines: 1
|
|
774
781
|
},
|
|
775
782
|
label
|
|
776
|
-
), effectiveIcon && iconPosition === "right" && /* @__PURE__ */
|
|
783
|
+
), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, effectiveIcon))
|
|
777
784
|
));
|
|
778
785
|
}
|
|
779
|
-
var Button =
|
|
786
|
+
var Button = React55__default.default.memo(ButtonBase);
|
|
780
787
|
var styles = reactNative.StyleSheet.create({
|
|
781
788
|
base: {
|
|
782
789
|
borderRadius: RADIUS.md,
|
|
@@ -787,9 +794,6 @@ var styles = reactNative.StyleSheet.create({
|
|
|
787
794
|
fullWidth: {
|
|
788
795
|
width: "100%"
|
|
789
796
|
},
|
|
790
|
-
disabled: {
|
|
791
|
-
opacity: 0.45
|
|
792
|
-
},
|
|
793
797
|
label: {
|
|
794
798
|
fontFamily: "Sohne-Medium",
|
|
795
799
|
flexShrink: 1
|
|
@@ -802,7 +806,7 @@ var styles = reactNative.StyleSheet.create({
|
|
|
802
806
|
}
|
|
803
807
|
});
|
|
804
808
|
function ButtonGroup({ children, gap = 12, vertical = false, style }) {
|
|
805
|
-
return /* @__PURE__ */
|
|
809
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
806
810
|
reactNative.View,
|
|
807
811
|
{
|
|
808
812
|
style: [
|
|
@@ -812,8 +816,8 @@ function ButtonGroup({ children, gap = 12, vertical = false, style }) {
|
|
|
812
816
|
style
|
|
813
817
|
]
|
|
814
818
|
},
|
|
815
|
-
|
|
816
|
-
if (!
|
|
819
|
+
React55__default.default.Children.map(children, (child) => {
|
|
820
|
+
if (!React55__default.default.isValidElement(child)) return child;
|
|
817
821
|
const childProps = child.props;
|
|
818
822
|
const extraProps = {
|
|
819
823
|
style: [child.props.style, { flex: 1 }]
|
|
@@ -821,7 +825,7 @@ function ButtonGroup({ children, gap = 12, vertical = false, style }) {
|
|
|
821
825
|
if (!vertical && "label" in childProps && childProps["size"] === void 0) {
|
|
822
826
|
extraProps["size"] = "sm";
|
|
823
827
|
}
|
|
824
|
-
return
|
|
828
|
+
return React55__default.default.cloneElement(child, extraProps);
|
|
825
829
|
})
|
|
826
830
|
);
|
|
827
831
|
}
|
|
@@ -882,7 +886,7 @@ function IconButtonBase({
|
|
|
882
886
|
const showBadge = badge !== void 0 && badge !== false && badge !== 0;
|
|
883
887
|
const badgeCount = typeof badge === "number" ? Math.min(badge, 99) : null;
|
|
884
888
|
const showCount = typeof badge === "number" && badge > 0;
|
|
885
|
-
return /* @__PURE__ */
|
|
889
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles3.wrapper }, /* @__PURE__ */ React55__default.default.createElement(
|
|
886
890
|
PressableButton,
|
|
887
891
|
{
|
|
888
892
|
style: [
|
|
@@ -902,14 +906,14 @@ function IconButtonBase({
|
|
|
902
906
|
accessibilityHint,
|
|
903
907
|
accessibilityState: { disabled: isDisabled, busy: loading }
|
|
904
908
|
},
|
|
905
|
-
loading ? /* @__PURE__ */
|
|
906
|
-
), showBadge && /* @__PURE__ */
|
|
909
|
+
loading ? /* @__PURE__ */ React55__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : resolvedIcon
|
|
910
|
+
), showBadge && /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [
|
|
907
911
|
styles3.badge,
|
|
908
912
|
{ backgroundColor: colors.primary },
|
|
909
913
|
showCount ? styles3.badgeCount : styles3.badgeDot
|
|
910
|
-
] }, showCount && /* @__PURE__ */
|
|
914
|
+
] }, showCount && /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles3.badgeText, { color: colors.primaryForeground }] }, badgeCount)));
|
|
911
915
|
}
|
|
912
|
-
var IconButton =
|
|
916
|
+
var IconButton = React55__default.default.memo(IconButtonBase);
|
|
913
917
|
var styles3 = reactNative.StyleSheet.create({
|
|
914
918
|
wrapper: {
|
|
915
919
|
alignSelf: "flex-start"
|
|
@@ -954,7 +958,7 @@ function warnIfFontsMissing() {
|
|
|
954
958
|
try {
|
|
955
959
|
if (!expoFont.isLoaded("Sohne-Regular")) {
|
|
956
960
|
console.warn(
|
|
957
|
-
"[retray-ui-kit] Sohne fonts are not loaded \u2014 text will fall back to the system font. Load them at your app root before rendering any UI kit component:\n\n import { useFonts } from 'expo-font'\n import {
|
|
961
|
+
"[retray-ui-kit] Sohne fonts are not loaded \u2014 text will fall back to the system font. Load them at your app root before rendering any UI kit component:\n\n import { useFonts } from 'expo-font'\n import { SohneFontNames } from '@retray-dev/ui-kit/fonts'\n // Copy the SohneFonts boilerplate from CONSUMER.md into your App.tsx\n\n const [fontsLoaded] = useFonts(SohneFonts)\n if (!fontsLoaded) return null\n"
|
|
958
962
|
);
|
|
959
963
|
}
|
|
960
964
|
} catch {
|
|
@@ -999,32 +1003,32 @@ var defaultColorVariant = {
|
|
|
999
1003
|
"button-lg": "foreground",
|
|
1000
1004
|
"button-sm": "foreground"
|
|
1001
1005
|
};
|
|
1002
|
-
function TextBase({ variant = "body-md", color, style, children, ...props }) {
|
|
1006
|
+
function TextBase({ variant = "body-md", color, style, uppercase, children, ...props }) {
|
|
1003
1007
|
warnIfFontsMissing();
|
|
1004
1008
|
const { colors } = useTheme();
|
|
1005
1009
|
const colorKey = defaultColorVariant[variant] ?? "foreground";
|
|
1006
1010
|
const resolvedColor = color ?? colors[colorKey];
|
|
1007
|
-
return /* @__PURE__ */
|
|
1011
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1008
1012
|
reactNative.Text,
|
|
1009
1013
|
{
|
|
1010
|
-
style: [variantStyles[variant], { color: resolvedColor }, style],
|
|
1014
|
+
style: [variantStyles[variant], { color: resolvedColor }, uppercase && { textTransform: "uppercase" }, style],
|
|
1011
1015
|
allowFontScaling: true,
|
|
1012
1016
|
...props
|
|
1013
1017
|
},
|
|
1014
1018
|
children
|
|
1015
1019
|
);
|
|
1016
1020
|
}
|
|
1017
|
-
var Text3 =
|
|
1021
|
+
var Text3 = React55__default.default.memo(TextBase);
|
|
1018
1022
|
var webInputResetStyle = reactNative.Platform.OS === "web" ? { outlineStyle: "none", outlineWidth: 0, outlineColor: "transparent", boxShadow: "none" } : {};
|
|
1019
1023
|
function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type = "text", containerStyle, inputWrapperStyle, sheetMode = false, style, onFocus, onBlur, secureTextEntry, editable, accessibilityLabel, ...props }) {
|
|
1020
1024
|
const { colors } = useTheme();
|
|
1021
|
-
const [focused, setFocused] =
|
|
1022
|
-
const [showPassword, setShowPassword] =
|
|
1025
|
+
const [focused, setFocused] = React55.useState(false);
|
|
1026
|
+
const [showPassword, setShowPassword] = React55.useState(false);
|
|
1023
1027
|
const isDisabled = disabled || editable === false;
|
|
1024
1028
|
const isPassword = type === "password";
|
|
1025
1029
|
const effectiveSecure = isPassword ? !showPassword : secureTextEntry;
|
|
1026
1030
|
const effectivePrefix = prefixIcon ? renderIcon(prefixIcon, 20, prefixIconColor ?? colors.foregroundMuted) : prefix;
|
|
1027
|
-
const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */
|
|
1031
|
+
const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1028
1032
|
reactNative.TouchableOpacity,
|
|
1029
1033
|
{
|
|
1030
1034
|
onPress: () => setShowPassword(!showPassword),
|
|
@@ -1033,10 +1037,10 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
1033
1037
|
accessibilityRole: "button",
|
|
1034
1038
|
accessibilityLabel: showPassword ? "Hide password" : "Show password"
|
|
1035
1039
|
},
|
|
1036
|
-
/* @__PURE__ */
|
|
1040
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.foregroundMuted })
|
|
1037
1041
|
) : suffixIcon ? renderIcon(suffixIcon, 20, suffixIconColor ?? colors.foregroundMuted) : suffix;
|
|
1038
1042
|
const borderColor = error ? colors.destructive : focused ? colors.primary : colors.border;
|
|
1039
|
-
return /* @__PURE__ */
|
|
1043
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles4.container, isDisabled && styles4.containerDisabled, containerStyle] }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles4.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React55__default.default.createElement(
|
|
1040
1044
|
reactNativeEase.EaseView,
|
|
1041
1045
|
{
|
|
1042
1046
|
style: [
|
|
@@ -1048,9 +1052,9 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
1048
1052
|
animate: { borderColor },
|
|
1049
1053
|
transition: COLOR_TRANSITION
|
|
1050
1054
|
},
|
|
1051
|
-
effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */
|
|
1052
|
-
sheetMode ? /* @__PURE__ */
|
|
1053
|
-
|
|
1055
|
+
effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles4.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles4.prefixContainer }, effectivePrefix) : null,
|
|
1056
|
+
sheetMode ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1057
|
+
bottomSheet.BottomSheetTextInput,
|
|
1054
1058
|
{
|
|
1055
1059
|
style: [
|
|
1056
1060
|
styles4.input,
|
|
@@ -1073,7 +1077,7 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
1073
1077
|
accessibilityLabel: accessibilityLabel ?? label,
|
|
1074
1078
|
...props
|
|
1075
1079
|
}
|
|
1076
|
-
) : /* @__PURE__ */
|
|
1080
|
+
) : /* @__PURE__ */ React55__default.default.createElement(
|
|
1077
1081
|
reactNative.TextInput,
|
|
1078
1082
|
{
|
|
1079
1083
|
style: [
|
|
@@ -1098,8 +1102,8 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
1098
1102
|
...props
|
|
1099
1103
|
}
|
|
1100
1104
|
),
|
|
1101
|
-
effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */
|
|
1102
|
-
), error ? /* @__PURE__ */
|
|
1105
|
+
effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles4.suffixText, { color: colors.foregroundMuted }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles4.suffixContainer }, effectiveSuffix) : null
|
|
1106
|
+
), error ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1103
1107
|
reactNative.Text,
|
|
1104
1108
|
{
|
|
1105
1109
|
style: [styles4.helperText, { color: colors.destructive }],
|
|
@@ -1107,7 +1111,7 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
1107
1111
|
accessibilityLiveRegion: "polite"
|
|
1108
1112
|
},
|
|
1109
1113
|
error
|
|
1110
|
-
) : null, !error && hint ? /* @__PURE__ */
|
|
1114
|
+
) : null, !error && hint ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles4.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
|
|
1111
1115
|
}
|
|
1112
1116
|
var styles4 = reactNative.StyleSheet.create({
|
|
1113
1117
|
container: {
|
|
@@ -1209,7 +1213,7 @@ function BadgeBase({ label, children, variant = "default", size = "md", icon, ic
|
|
|
1209
1213
|
const effectiveIcon = iconName ? renderIcon(iconName, sizeIconSize[size], iconColor ?? textColor) : icon;
|
|
1210
1214
|
const content = children ?? label;
|
|
1211
1215
|
const a11yLabel = typeof content === "string" ? content : label;
|
|
1212
|
-
return /* @__PURE__ */
|
|
1216
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1213
1217
|
reactNative.View,
|
|
1214
1218
|
{
|
|
1215
1219
|
style: [styles5.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style],
|
|
@@ -1217,10 +1221,10 @@ function BadgeBase({ label, children, variant = "default", size = "md", icon, ic
|
|
|
1217
1221
|
accessibilityLabel: a11yLabel
|
|
1218
1222
|
},
|
|
1219
1223
|
effectiveIcon,
|
|
1220
|
-
typeof content === "string" ? /* @__PURE__ */
|
|
1224
|
+
typeof content === "string" ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles5.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content
|
|
1221
1225
|
);
|
|
1222
1226
|
}
|
|
1223
|
-
var Badge =
|
|
1227
|
+
var Badge = React55__default.default.memo(BadgeBase);
|
|
1224
1228
|
var styles5 = reactNative.StyleSheet.create({
|
|
1225
1229
|
container: {
|
|
1226
1230
|
borderRadius: 9999,
|
|
@@ -1265,9 +1269,9 @@ function Card({ children, variant = "elevated", onPress, style, accessibilityLab
|
|
|
1265
1269
|
elevation: 0
|
|
1266
1270
|
}
|
|
1267
1271
|
}[variant];
|
|
1268
|
-
const cardContent = /* @__PURE__ */
|
|
1272
|
+
const cardContent = /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles6.card, variantStyle, style] }, children);
|
|
1269
1273
|
if (onPress) {
|
|
1270
|
-
return /* @__PURE__ */
|
|
1274
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1271
1275
|
PressableCard,
|
|
1272
1276
|
{
|
|
1273
1277
|
onPress: handlePress,
|
|
@@ -1283,21 +1287,21 @@ function Card({ children, variant = "elevated", onPress, style, accessibilityLab
|
|
|
1283
1287
|
return cardContent;
|
|
1284
1288
|
}
|
|
1285
1289
|
function CardHeader({ children, style }) {
|
|
1286
|
-
return /* @__PURE__ */
|
|
1290
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles6.header, style] }, children);
|
|
1287
1291
|
}
|
|
1288
1292
|
function CardTitle({ children, style }) {
|
|
1289
1293
|
const { colors } = useTheme();
|
|
1290
|
-
return /* @__PURE__ */
|
|
1294
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles6.title, { color: colors.foreground }, style], allowFontScaling: true }, children);
|
|
1291
1295
|
}
|
|
1292
1296
|
function CardDescription({ children, style }) {
|
|
1293
1297
|
const { colors } = useTheme();
|
|
1294
|
-
return /* @__PURE__ */
|
|
1298
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles6.description, { color: colors.foregroundSubtle }, style], allowFontScaling: true }, children);
|
|
1295
1299
|
}
|
|
1296
1300
|
function CardContent({ children, style }) {
|
|
1297
|
-
return /* @__PURE__ */
|
|
1301
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles6.content, style] }, children);
|
|
1298
1302
|
}
|
|
1299
1303
|
function CardFooter({ children, style }) {
|
|
1300
|
-
return /* @__PURE__ */
|
|
1304
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles6.footer, style] }, children);
|
|
1301
1305
|
}
|
|
1302
1306
|
var styles6 = reactNative.StyleSheet.create({
|
|
1303
1307
|
card: {
|
|
@@ -1335,7 +1339,7 @@ var styles6 = reactNative.StyleSheet.create({
|
|
|
1335
1339
|
});
|
|
1336
1340
|
function Separator({ orientation = "horizontal", style }) {
|
|
1337
1341
|
const { colors } = useTheme();
|
|
1338
|
-
return /* @__PURE__ */
|
|
1342
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1339
1343
|
reactNative.View,
|
|
1340
1344
|
{
|
|
1341
1345
|
style: [
|
|
@@ -1370,7 +1374,7 @@ function Spinner({ size = "md", color, label, ...props }) {
|
|
|
1370
1374
|
const { colors } = useTheme();
|
|
1371
1375
|
const a11yLabel = label || "Loading";
|
|
1372
1376
|
if (label) {
|
|
1373
|
-
return /* @__PURE__ */
|
|
1377
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1374
1378
|
reactNative.View,
|
|
1375
1379
|
{
|
|
1376
1380
|
style: styles8.wrapper,
|
|
@@ -1378,8 +1382,8 @@ function Spinner({ size = "md", color, label, ...props }) {
|
|
|
1378
1382
|
accessibilityLabel: a11yLabel,
|
|
1379
1383
|
accessibilityState: { busy: true }
|
|
1380
1384
|
},
|
|
1381
|
-
/* @__PURE__ */
|
|
1382
|
-
/* @__PURE__ */
|
|
1385
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props }),
|
|
1386
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
1383
1387
|
reactNative.Text,
|
|
1384
1388
|
{
|
|
1385
1389
|
style: [styles8.label, { color: colors.foregroundMuted, fontSize: labelFontSize[size] }],
|
|
@@ -1389,7 +1393,7 @@ function Spinner({ size = "md", color, label, ...props }) {
|
|
|
1389
1393
|
)
|
|
1390
1394
|
);
|
|
1391
1395
|
}
|
|
1392
|
-
return /* @__PURE__ */
|
|
1396
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1393
1397
|
reactNative.ActivityIndicator,
|
|
1394
1398
|
{
|
|
1395
1399
|
size: sizeMap2[size],
|
|
@@ -1417,13 +1421,14 @@ function Skeleton({
|
|
|
1417
1421
|
borderRadius = 6,
|
|
1418
1422
|
preset = "base",
|
|
1419
1423
|
diameter = 40,
|
|
1424
|
+
backgroundColor,
|
|
1420
1425
|
style
|
|
1421
1426
|
}) {
|
|
1422
1427
|
const { colors, colorScheme } = useTheme();
|
|
1423
1428
|
const shimmer = Animated12.useSharedValue(0);
|
|
1424
|
-
const [containerWidth, setContainerWidth] =
|
|
1425
|
-
const shimmerHighlight = colorScheme === "dark" ? "rgba(255,255,255,0.08)" : "rgba(
|
|
1426
|
-
|
|
1429
|
+
const [containerWidth, setContainerWidth] = React55.useState(300);
|
|
1430
|
+
const shimmerHighlight = colorScheme === "dark" ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.07)";
|
|
1431
|
+
React55.useEffect(() => {
|
|
1427
1432
|
shimmer.value = Animated12.withRepeat(
|
|
1428
1433
|
Animated12.withTiming(1, { duration: TIMINGS.shimmer.duration, easing: Animated12.Easing.linear }),
|
|
1429
1434
|
-1,
|
|
@@ -1436,12 +1441,12 @@ function Skeleton({
|
|
|
1436
1441
|
const resolvedWidth = preset === "circle" ? s(diameter) : preset === "text" ? "60%" : width;
|
|
1437
1442
|
const resolvedHeight = preset === "circle" ? s(diameter) : preset === "text" ? 14 : height;
|
|
1438
1443
|
const resolvedRadius = preset === "circle" ? 9999 : preset === "text" ? 4 : borderRadius;
|
|
1439
|
-
return /* @__PURE__ */
|
|
1444
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1440
1445
|
reactNative.View,
|
|
1441
1446
|
{
|
|
1442
1447
|
style: [
|
|
1443
1448
|
styles9.base,
|
|
1444
|
-
{ width: resolvedWidth, height: resolvedHeight, borderRadius: resolvedRadius, backgroundColor: colors.
|
|
1449
|
+
{ width: resolvedWidth, height: resolvedHeight, borderRadius: resolvedRadius, backgroundColor: backgroundColor ?? colors.skeleton },
|
|
1445
1450
|
style
|
|
1446
1451
|
],
|
|
1447
1452
|
onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width),
|
|
@@ -1449,7 +1454,7 @@ function Skeleton({
|
|
|
1449
1454
|
accessibilityLabel: "Loading",
|
|
1450
1455
|
accessibilityState: { busy: true }
|
|
1451
1456
|
},
|
|
1452
|
-
/* @__PURE__ */
|
|
1457
|
+
/* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [reactNative.StyleSheet.absoluteFill, shimmerStyle] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
1453
1458
|
expoLinearGradient.LinearGradient,
|
|
1454
1459
|
{
|
|
1455
1460
|
colors: ["transparent", shimmerHighlight, "transparent"],
|
|
@@ -1469,10 +1474,10 @@ var aspectRatioMap = {
|
|
|
1469
1474
|
};
|
|
1470
1475
|
function MediaCardSkeleton({ aspectRatio = "4:3", showSubtitle = true, style }) {
|
|
1471
1476
|
const ratio = aspectRatioMap[aspectRatio];
|
|
1472
|
-
return /* @__PURE__ */
|
|
1477
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, /* @__PURE__ */ React55__default.default.createElement(Skeleton, { width: "100%", height: void 0, style: skeletonStyles.fill, borderRadius: RADIUS.md }))), /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: skeletonStyles.meta }, /* @__PURE__ */ React55__default.default.createElement(Skeleton, { width: "70%", height: vs(14), borderRadius: RADIUS.xs }), showSubtitle ? /* @__PURE__ */ React55__default.default.createElement(Skeleton, { width: "45%", height: vs(12), borderRadius: RADIUS.xs }) : null));
|
|
1473
1478
|
}
|
|
1474
1479
|
function ListItemSkeleton({ showAvatar = true, showSubtitle = true, style }) {
|
|
1475
|
-
return /* @__PURE__ */
|
|
1480
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [skeletonStyles.row, style] }, showAvatar ? /* @__PURE__ */ React55__default.default.createElement(Skeleton, { preset: "circle", diameter: 40 }) : null, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: skeletonStyles.rowText }, /* @__PURE__ */ React55__default.default.createElement(Skeleton, { width: "60%", height: vs(14), borderRadius: RADIUS.xs }), showSubtitle ? /* @__PURE__ */ React55__default.default.createElement(Skeleton, { width: "40%", height: vs(12), borderRadius: RADIUS.xs }) : null));
|
|
1476
1481
|
}
|
|
1477
1482
|
function ListSkeleton({
|
|
1478
1483
|
count = 6,
|
|
@@ -1483,10 +1488,10 @@ function ListSkeleton({
|
|
|
1483
1488
|
style
|
|
1484
1489
|
}) {
|
|
1485
1490
|
if (columns <= 1) {
|
|
1486
|
-
return /* @__PURE__ */
|
|
1491
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [{ gap: vs(gap) }, style] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React55__default.default.createElement(ListItemSkeleton, { key: i, showAvatar })));
|
|
1487
1492
|
}
|
|
1488
1493
|
const widthPct = `${100 / columns}%`;
|
|
1489
|
-
return /* @__PURE__ */
|
|
1494
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [skeletonStyles.grid, { marginHorizontal: -s(gap) / 2 }, style] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { key: i, style: { width: widthPct, paddingHorizontal: s(gap) / 2, marginBottom: vs(gap) } }, /* @__PURE__ */ React55__default.default.createElement(MediaCardSkeleton, { aspectRatio }))));
|
|
1490
1495
|
}
|
|
1491
1496
|
Skeleton.MediaCard = MediaCardSkeleton;
|
|
1492
1497
|
Skeleton.ListItem = ListItemSkeleton;
|
|
@@ -1549,7 +1554,7 @@ function getInitials(fallback, fallbackText) {
|
|
|
1549
1554
|
}
|
|
1550
1555
|
function AvatarBase({ src, fallback, fallbackText, size = "md", status, style }) {
|
|
1551
1556
|
const { colors } = useTheme();
|
|
1552
|
-
const [imageError, setImageError] =
|
|
1557
|
+
const [imageError, setImageError] = React55.useState(false);
|
|
1553
1558
|
const dimension = typeof size === "number" ? size : sizeMap3[size];
|
|
1554
1559
|
const fontSize = typeof size === "number" ? size * 0.38 : fontSizeMap[size];
|
|
1555
1560
|
const showFallback = !src || imageError;
|
|
@@ -1568,21 +1573,21 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
|
|
|
1568
1573
|
overflow: "hidden"
|
|
1569
1574
|
};
|
|
1570
1575
|
const a11yLabel = fallbackText || fallback || "Avatar";
|
|
1571
|
-
return /* @__PURE__ */
|
|
1576
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1572
1577
|
reactNative.View,
|
|
1573
1578
|
{
|
|
1574
1579
|
style: [styles10.wrapper, style],
|
|
1575
1580
|
accessibilityRole: "image",
|
|
1576
1581
|
accessibilityLabel: a11yLabel
|
|
1577
1582
|
},
|
|
1578
|
-
/* @__PURE__ */
|
|
1583
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles10.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1579
1584
|
reactNative.Image,
|
|
1580
1585
|
{
|
|
1581
1586
|
source: { uri: src },
|
|
1582
1587
|
style: { width: dimension, height: dimension },
|
|
1583
1588
|
onError: () => setImageError(true)
|
|
1584
1589
|
}
|
|
1585
|
-
) : /* @__PURE__ */
|
|
1590
|
+
) : /* @__PURE__ */ React55__default.default.createElement(
|
|
1586
1591
|
reactNative.Text,
|
|
1587
1592
|
{
|
|
1588
1593
|
style: [styles10.fallback, { color: colors.foregroundMuted, fontSize }],
|
|
@@ -1590,7 +1595,7 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
|
|
|
1590
1595
|
},
|
|
1591
1596
|
getInitials(fallback, fallbackText)
|
|
1592
1597
|
)),
|
|
1593
|
-
status && /* @__PURE__ */
|
|
1598
|
+
status && /* @__PURE__ */ React55__default.default.createElement(
|
|
1594
1599
|
reactNative.View,
|
|
1595
1600
|
{
|
|
1596
1601
|
style: [
|
|
@@ -1608,7 +1613,7 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
|
|
|
1608
1613
|
)
|
|
1609
1614
|
);
|
|
1610
1615
|
}
|
|
1611
|
-
var Avatar =
|
|
1616
|
+
var Avatar = React55__default.default.memo(AvatarBase);
|
|
1612
1617
|
var styles10 = reactNative.StyleSheet.create({
|
|
1613
1618
|
wrapper: {
|
|
1614
1619
|
alignSelf: "flex-start",
|
|
@@ -1633,15 +1638,15 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
|
|
|
1633
1638
|
const accentColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : variant === "warning" ? colors.warning : colors.foreground;
|
|
1634
1639
|
const bgColor = variant === "destructive" ? isDark ? "rgba(239, 83, 80, 0.15)" : "rgba(199, 40, 40, 0.10)" : variant === "success" ? isDark ? "rgba(46, 125, 82, 0.15)" : "rgba(26, 122, 69, 0.10)" : variant === "warning" ? isDark ? "rgba(245, 166, 35, 0.15)" : "rgba(154, 82, 0, 0.10)" : colors.surface;
|
|
1635
1640
|
const borderColor = variant === "destructive" ? isDark ? "rgba(239, 83, 80, 0.30)" : "rgba(199, 40, 40, 0.25)" : variant === "success" ? isDark ? "rgba(46, 125, 82, 0.30)" : "rgba(26, 122, 69, 0.25)" : variant === "warning" ? isDark ? "rgba(245, 166, 35, 0.30)" : "rgba(154, 82, 0, 0.25)" : colors.border;
|
|
1636
|
-
const defaultIcon = variant === "success" ? /* @__PURE__ */
|
|
1641
|
+
const defaultIcon = variant === "success" ? /* @__PURE__ */ React55__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: ms(16), color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React55__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: ms(17), color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React55__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: ms(17), color: accentColor }) : (
|
|
1637
1642
|
// AUDIT FIX: default variant previously used colors.primary (near-black)
|
|
1638
1643
|
// as the info icon tint — ambiguous and heavy. accentResolved gives it
|
|
1639
1644
|
// a meaningful chromatic signal when an accent is defined.
|
|
1640
|
-
/* @__PURE__ */
|
|
1645
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: ms(16), color: accentColor })
|
|
1641
1646
|
);
|
|
1642
1647
|
const effectiveIcon = iconName ? renderIcon(iconName, ms(16), iconColor ?? accentColor) : icon ?? defaultIcon;
|
|
1643
1648
|
const a11yLabel = description ? `${title}. ${description}` : title;
|
|
1644
|
-
return /* @__PURE__ */
|
|
1649
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1645
1650
|
reactNative.View,
|
|
1646
1651
|
{
|
|
1647
1652
|
style: [
|
|
@@ -1652,9 +1657,9 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
|
|
|
1652
1657
|
accessibilityRole: "alert",
|
|
1653
1658
|
accessibilityLabel: a11yLabel
|
|
1654
1659
|
},
|
|
1655
|
-
/* @__PURE__ */
|
|
1656
|
-
/* @__PURE__ */
|
|
1657
|
-
onDismiss ? /* @__PURE__ */
|
|
1660
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles11.iconSlot }, effectiveIcon),
|
|
1661
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles11.content }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles11.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles11.description, { color: colors.foreground, opacity: 0.85 }], allowFontScaling: true }, description) : null),
|
|
1662
|
+
onDismiss ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1658
1663
|
reactNative.TouchableOpacity,
|
|
1659
1664
|
{
|
|
1660
1665
|
onPress: onDismiss,
|
|
@@ -1663,7 +1668,7 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
|
|
|
1663
1668
|
accessibilityRole: "button",
|
|
1664
1669
|
accessibilityLabel: "Dismiss"
|
|
1665
1670
|
},
|
|
1666
|
-
/* @__PURE__ */
|
|
1671
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Feather, { name: "x", size: ms(16), color: colors.foregroundMuted })
|
|
1667
1672
|
) : null
|
|
1668
1673
|
);
|
|
1669
1674
|
}
|
|
@@ -1700,9 +1705,9 @@ var styles11 = reactNative.StyleSheet.create({
|
|
|
1700
1705
|
function Progress({ value = 0, max = 100, variant = "default", style, accessibilityLabel }) {
|
|
1701
1706
|
const { colors } = useTheme();
|
|
1702
1707
|
const percent = Math.min(Math.max(value / max * 100, 0), 100);
|
|
1703
|
-
const [trackWidth, setTrackWidth] =
|
|
1708
|
+
const [trackWidth, setTrackWidth] = React55.useState(0);
|
|
1704
1709
|
const animatedWidth = Animated12.useSharedValue(0);
|
|
1705
|
-
|
|
1710
|
+
React55.useEffect(() => {
|
|
1706
1711
|
if (trackWidth === 0) return;
|
|
1707
1712
|
animatedWidth.value = Animated12.withSpring(percent / 100 * trackWidth, SPRINGS.glide);
|
|
1708
1713
|
}, [percent, trackWidth, animatedWidth]);
|
|
@@ -1710,7 +1715,7 @@ function Progress({ value = 0, max = 100, variant = "default", style, accessibil
|
|
|
1710
1715
|
width: animatedWidth.value
|
|
1711
1716
|
}));
|
|
1712
1717
|
const indicatorColor = variant === "success" ? colors.success : variant === "warning" ? colors.warning : variant === "destructive" ? colors.destructive : colors.primary;
|
|
1713
|
-
return /* @__PURE__ */
|
|
1718
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1714
1719
|
reactNative.View,
|
|
1715
1720
|
{
|
|
1716
1721
|
style: [styles12.track, { backgroundColor: colors.surface }, style],
|
|
@@ -1719,7 +1724,7 @@ function Progress({ value = 0, max = 100, variant = "default", style, accessibil
|
|
|
1719
1724
|
accessibilityLabel,
|
|
1720
1725
|
accessibilityValue: { min: 0, max: 100, now: Math.round(percent) }
|
|
1721
1726
|
},
|
|
1722
|
-
/* @__PURE__ */
|
|
1727
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
1723
1728
|
Animated12__default.default.View,
|
|
1724
1729
|
{
|
|
1725
1730
|
style: [styles12.indicator, { backgroundColor: indicatorColor }, indicatorAnimatedStyle]
|
|
@@ -1743,7 +1748,7 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, act
|
|
|
1743
1748
|
const { colors } = useTheme();
|
|
1744
1749
|
const isCompact = size === "compact";
|
|
1745
1750
|
const effectiveIcon = iconName ? renderIcon(iconName, isCompact ? 32 : 48, iconColor ?? colors.foregroundMuted) : icon;
|
|
1746
|
-
return /* @__PURE__ */
|
|
1751
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
1747
1752
|
reactNative.View,
|
|
1748
1753
|
{
|
|
1749
1754
|
style: [
|
|
@@ -1753,7 +1758,7 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, act
|
|
|
1753
1758
|
style
|
|
1754
1759
|
]
|
|
1755
1760
|
},
|
|
1756
|
-
effectiveIcon ? /* @__PURE__ */
|
|
1761
|
+
effectiveIcon ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1757
1762
|
reactNative.View,
|
|
1758
1763
|
{
|
|
1759
1764
|
style: [
|
|
@@ -1764,15 +1769,15 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, act
|
|
|
1764
1769
|
},
|
|
1765
1770
|
effectiveIcon
|
|
1766
1771
|
) : null,
|
|
1767
|
-
/* @__PURE__ */
|
|
1772
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles13.textWrapper }, /* @__PURE__ */ React55__default.default.createElement(
|
|
1768
1773
|
reactNative.Text,
|
|
1769
1774
|
{
|
|
1770
1775
|
style: [styles13.title, isCompact && styles13.titleCompact, { color: colors.foreground }],
|
|
1771
1776
|
allowFontScaling: true
|
|
1772
1777
|
},
|
|
1773
1778
|
title
|
|
1774
|
-
), description && !isCompact ? /* @__PURE__ */
|
|
1775
|
-
!isCompact && (action ? /* @__PURE__ */
|
|
1779
|
+
), description && !isCompact ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles13.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null),
|
|
1780
|
+
!isCompact && (action ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles13.action }, action) : actionLabel && onAction ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles13.action }, /* @__PURE__ */ React55__default.default.createElement(Button, { label: actionLabel, variant: "primary", onPress: onAction })) : null)
|
|
1776
1781
|
);
|
|
1777
1782
|
}
|
|
1778
1783
|
var styles13 = reactNative.StyleSheet.create({
|
|
@@ -1831,7 +1836,7 @@ var styles13 = reactNative.StyleSheet.create({
|
|
|
1831
1836
|
function useColorTransition(active, options = {}) {
|
|
1832
1837
|
const { duration = TIMINGS.state.duration } = options;
|
|
1833
1838
|
const progress = Animated12.useSharedValue(active ? 1 : 0);
|
|
1834
|
-
|
|
1839
|
+
React55.useEffect(() => {
|
|
1835
1840
|
progress.value = Animated12.withTiming(active ? 1 : 0, { duration, easing: EASINGS.standard });
|
|
1836
1841
|
}, [active, duration, progress]);
|
|
1837
1842
|
return progress;
|
|
@@ -1855,7 +1860,7 @@ function Textarea({
|
|
|
1855
1860
|
...props
|
|
1856
1861
|
}) {
|
|
1857
1862
|
const { colors } = useTheme();
|
|
1858
|
-
const [focused, setFocused] =
|
|
1863
|
+
const [focused, setFocused] = React55.useState(false);
|
|
1859
1864
|
const focusProgress = useColorTransition(focused, {
|
|
1860
1865
|
duration: focused ? TIMINGS.focusIn.duration : TIMINGS.focusOut.duration
|
|
1861
1866
|
});
|
|
@@ -1864,7 +1869,7 @@ function Textarea({
|
|
|
1864
1869
|
borderColor: error ? colors.destructive : Animated12.interpolateColor(focusProgress.value, [0, 1], [colors.border, colors.primary]),
|
|
1865
1870
|
borderWidth: error ? 2 : Animated12.interpolate(focusProgress.value, [0, 1], [1, 2])
|
|
1866
1871
|
}));
|
|
1867
|
-
return /* @__PURE__ */
|
|
1872
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles14.container, containerStyle] }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles14.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React55__default.default.createElement(
|
|
1868
1873
|
Animated12__default.default.View,
|
|
1869
1874
|
{
|
|
1870
1875
|
style: [
|
|
@@ -1872,9 +1877,9 @@ function Textarea({
|
|
|
1872
1877
|
{ backgroundColor: colors.background }
|
|
1873
1878
|
]
|
|
1874
1879
|
},
|
|
1875
|
-
/* @__PURE__ */
|
|
1876
|
-
resolvedPrefixIcon ? /* @__PURE__ */
|
|
1877
|
-
/* @__PURE__ */
|
|
1880
|
+
/* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [styles14.borderOverlay, borderAnimStyle], pointerEvents: "none" }),
|
|
1881
|
+
resolvedPrefixIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles14.prefixIcon }, resolvedPrefixIcon) : null,
|
|
1882
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
1878
1883
|
reactNative.TextInput,
|
|
1879
1884
|
{
|
|
1880
1885
|
multiline: true,
|
|
@@ -1903,7 +1908,7 @@ function Textarea({
|
|
|
1903
1908
|
...props
|
|
1904
1909
|
}
|
|
1905
1910
|
)
|
|
1906
|
-
), error ? /* @__PURE__ */
|
|
1911
|
+
), error ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1907
1912
|
reactNative.Text,
|
|
1908
1913
|
{
|
|
1909
1914
|
style: [styles14.helperText, { color: colors.destructive }],
|
|
@@ -1911,7 +1916,7 @@ function Textarea({
|
|
|
1911
1916
|
accessibilityLiveRegion: "polite"
|
|
1912
1917
|
},
|
|
1913
1918
|
error
|
|
1914
|
-
) : null, !error && hint ? /* @__PURE__ */
|
|
1919
|
+
) : null, !error && hint ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles14.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
|
|
1915
1920
|
}
|
|
1916
1921
|
var styles14 = reactNative.StyleSheet.create({
|
|
1917
1922
|
container: {
|
|
@@ -1971,7 +1976,7 @@ function Checkbox({
|
|
|
1971
1976
|
// AUDIT FIX: opacity was applied only to the box, leaving the label at full
|
|
1972
1977
|
// opacity when disabled — a contradictory visual signal. Now the entire row
|
|
1973
1978
|
// dims uniformly so label and control communicate the same disabled state.
|
|
1974
|
-
/* @__PURE__ */
|
|
1979
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
1975
1980
|
PressableButton,
|
|
1976
1981
|
{
|
|
1977
1982
|
style: [styles15.row, disabled && styles15.rowDisabled, style],
|
|
@@ -1983,7 +1988,7 @@ function Checkbox({
|
|
|
1983
1988
|
accessibilityLabel: accessibilityLabel ?? label,
|
|
1984
1989
|
accessibilityState: { checked, disabled: !!disabled }
|
|
1985
1990
|
},
|
|
1986
|
-
/* @__PURE__ */
|
|
1991
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
1987
1992
|
reactNativeEase.EaseView,
|
|
1988
1993
|
{
|
|
1989
1994
|
style: styles15.box,
|
|
@@ -1993,9 +1998,9 @@ function Checkbox({
|
|
|
1993
1998
|
},
|
|
1994
1999
|
transition: COLOR_TRANSITION
|
|
1995
2000
|
},
|
|
1996
|
-
/* @__PURE__ */
|
|
2001
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNativeEase.EaseView, { animate: { opacity: checked ? 1 : 0 }, transition: OPACITY_TRANSITION }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles15.checkmark, { borderColor: colors.primaryForeground }] }))
|
|
1997
2002
|
),
|
|
1998
|
-
label ? /* @__PURE__ */
|
|
2003
|
+
label ? /* @__PURE__ */ React55__default.default.createElement(
|
|
1999
2004
|
reactNative.Text,
|
|
2000
2005
|
{
|
|
2001
2006
|
style: [styles15.label, { color: colors.foreground }],
|
|
@@ -2047,7 +2052,7 @@ var DISABLED_OPACITY = 0.45;
|
|
|
2047
2052
|
function Switch({ checked = false, onCheckedChange, disabled, style, accessibilityLabel }) {
|
|
2048
2053
|
const { colors } = useTheme();
|
|
2049
2054
|
const isDisabled = !!disabled;
|
|
2050
|
-
return /* @__PURE__ */
|
|
2055
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [{ alignSelf: "flex-start" }, style] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2051
2056
|
reactNative.TouchableOpacity,
|
|
2052
2057
|
{
|
|
2053
2058
|
onPress: () => {
|
|
@@ -2062,14 +2067,14 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
|
|
|
2062
2067
|
accessibilityState: { checked, disabled: isDisabled },
|
|
2063
2068
|
style: styles16.touchable
|
|
2064
2069
|
},
|
|
2065
|
-
/* @__PURE__ */
|
|
2070
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles16.trackContainer }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2066
2071
|
reactNativeEase.EaseView,
|
|
2067
2072
|
{
|
|
2068
2073
|
style: [styles16.track, isDisabled && styles16.disabledTrack],
|
|
2069
2074
|
animate: { backgroundColor: checked ? colors.primary : colors.surfaceStrong },
|
|
2070
2075
|
transition: COLOR_TRANSITION
|
|
2071
2076
|
}
|
|
2072
|
-
), /* @__PURE__ */
|
|
2077
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
2073
2078
|
reactNativeEase.EaseView,
|
|
2074
2079
|
{
|
|
2075
2080
|
style: [styles16.trackBorder, { borderWidth: 1.5 }],
|
|
@@ -2077,30 +2082,30 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
|
|
|
2077
2082
|
animate: { borderColor: checked ? "transparent" : colors.border },
|
|
2078
2083
|
transition: COLOR_TRANSITION
|
|
2079
2084
|
}
|
|
2080
|
-
), /* @__PURE__ */
|
|
2085
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
2081
2086
|
reactNativeEase.EaseView,
|
|
2082
2087
|
{
|
|
2083
2088
|
style: [styles16.thumb, { backgroundColor: colors.primaryForeground }],
|
|
2084
2089
|
animate: { translateX: checked ? THUMB_TRAVEL : 0 },
|
|
2085
2090
|
transition: SPRING_ELASTIC
|
|
2086
2091
|
},
|
|
2087
|
-
/* @__PURE__ */
|
|
2092
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
2088
2093
|
reactNativeEase.EaseView,
|
|
2089
2094
|
{
|
|
2090
2095
|
style: styles16.iconWrapper,
|
|
2091
2096
|
animate: { opacity: checked ? isDisabled ? DISABLED_OPACITY : 1 : 0 },
|
|
2092
2097
|
transition: OPACITY_TRANSITION
|
|
2093
2098
|
},
|
|
2094
|
-
/* @__PURE__ */
|
|
2099
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Feather, { name: "check", size: ICON_SIZE, color: colors.primary })
|
|
2095
2100
|
),
|
|
2096
|
-
/* @__PURE__ */
|
|
2101
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
2097
2102
|
reactNativeEase.EaseView,
|
|
2098
2103
|
{
|
|
2099
2104
|
style: styles16.iconWrapper,
|
|
2100
2105
|
animate: { opacity: checked ? 0 : isDisabled ? DISABLED_OPACITY : 1 },
|
|
2101
2106
|
transition: OPACITY_TRANSITION
|
|
2102
2107
|
},
|
|
2103
|
-
/* @__PURE__ */
|
|
2108
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Feather, { name: "x", size: ICON_SIZE, color: colors.foregroundMuted })
|
|
2104
2109
|
)
|
|
2105
2110
|
))
|
|
2106
2111
|
));
|
|
@@ -2153,15 +2158,15 @@ function ToggleIcon({ pressed, iconName, activeIconName, icon, activeIcon, iconC
|
|
|
2153
2158
|
return prop;
|
|
2154
2159
|
};
|
|
2155
2160
|
if (pressed) {
|
|
2156
|
-
if (activeIconName) return /* @__PURE__ */
|
|
2161
|
+
if (activeIconName) return /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? primaryColor));
|
|
2157
2162
|
const active = renderProp(activeIcon);
|
|
2158
|
-
if (active) return /* @__PURE__ */
|
|
2159
|
-
return /* @__PURE__ */
|
|
2163
|
+
if (active) return /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, active);
|
|
2164
|
+
return /* @__PURE__ */ React55__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: primaryColor });
|
|
2160
2165
|
}
|
|
2161
|
-
if (iconName) return /* @__PURE__ */
|
|
2166
|
+
if (iconName) return /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? mutedColor));
|
|
2162
2167
|
const custom = renderProp(icon);
|
|
2163
|
-
if (custom) return /* @__PURE__ */
|
|
2164
|
-
return /* @__PURE__ */
|
|
2168
|
+
if (custom) return /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, custom);
|
|
2169
|
+
return /* @__PURE__ */ React55__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: mutedColor });
|
|
2165
2170
|
}
|
|
2166
2171
|
var sizeStyles = {
|
|
2167
2172
|
sm: { paddingHorizontal: s(12), paddingVertical: vs(8), minWidth: s(40), minHeight: vs(40) },
|
|
@@ -2192,7 +2197,7 @@ function Toggle({
|
|
|
2192
2197
|
selectionAsync();
|
|
2193
2198
|
onPressedChange?.(!pressed);
|
|
2194
2199
|
};
|
|
2195
|
-
return /* @__PURE__ */
|
|
2200
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [disabled && styles17.disabled, style] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2196
2201
|
PressableButton,
|
|
2197
2202
|
{
|
|
2198
2203
|
onPress: handlePress,
|
|
@@ -2204,7 +2209,7 @@ function Toggle({
|
|
|
2204
2209
|
accessibilityLabel: accessibilityLabel ?? label,
|
|
2205
2210
|
accessibilityState: { selected: pressed, disabled: !!disabled }
|
|
2206
2211
|
},
|
|
2207
|
-
/* @__PURE__ */
|
|
2212
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
2208
2213
|
reactNativeEase.EaseView,
|
|
2209
2214
|
{
|
|
2210
2215
|
style: [styles17.base, sizeStyles[size], { borderWidth: 2 }],
|
|
@@ -2214,7 +2219,7 @@ function Toggle({
|
|
|
2214
2219
|
},
|
|
2215
2220
|
transition: COLOR_TRANSITION
|
|
2216
2221
|
},
|
|
2217
|
-
/* @__PURE__ */
|
|
2222
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles17.inner }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2218
2223
|
ToggleIcon,
|
|
2219
2224
|
{
|
|
2220
2225
|
pressed,
|
|
@@ -2228,7 +2233,7 @@ function Toggle({
|
|
|
2228
2233
|
primaryColor: colors.primary,
|
|
2229
2234
|
mutedColor: colors.foregroundMuted
|
|
2230
2235
|
}
|
|
2231
|
-
), label ? /* @__PURE__ */
|
|
2236
|
+
), label ? /* @__PURE__ */ React55__default.default.createElement(
|
|
2232
2237
|
reactNative.Text,
|
|
2233
2238
|
{
|
|
2234
2239
|
style: [styles17.label, { color: pressed ? colors.primary : colors.foreground }],
|
|
@@ -2258,9 +2263,9 @@ var styles17 = reactNative.StyleSheet.create({
|
|
|
2258
2263
|
}
|
|
2259
2264
|
});
|
|
2260
2265
|
function useHover() {
|
|
2261
|
-
const [hovered, setHovered] =
|
|
2262
|
-
const onMouseEnter =
|
|
2263
|
-
const onMouseLeave =
|
|
2266
|
+
const [hovered, setHovered] = React55.useState(false);
|
|
2267
|
+
const onMouseEnter = React55.useCallback(() => setHovered(true), []);
|
|
2268
|
+
const onMouseLeave = React55.useCallback(() => setHovered(false), []);
|
|
2264
2269
|
if (reactNative.Platform.OS !== "web") {
|
|
2265
2270
|
return { hovered: false, hoverHandlers: {} };
|
|
2266
2271
|
}
|
|
@@ -2277,11 +2282,11 @@ function usePressScale({
|
|
|
2277
2282
|
} = {}) {
|
|
2278
2283
|
const scale2 = Animated12.useSharedValue(1);
|
|
2279
2284
|
const { hovered, hoverHandlers } = useHover();
|
|
2280
|
-
const onPressIn =
|
|
2285
|
+
const onPressIn = React55.useCallback(() => {
|
|
2281
2286
|
if (disabled) return;
|
|
2282
2287
|
scale2.value = Animated12.withSpring(pressScale, pressInSpring);
|
|
2283
2288
|
}, [disabled, pressScale, pressInSpring, scale2]);
|
|
2284
|
-
const onPressOut =
|
|
2289
|
+
const onPressOut = React55.useCallback(() => {
|
|
2285
2290
|
if (disabled) return;
|
|
2286
2291
|
scale2.value = Animated12.withSpring(1, pressOutSpring);
|
|
2287
2292
|
}, [disabled, pressOutSpring, scale2]);
|
|
@@ -2314,7 +2319,7 @@ function RadioItem({
|
|
|
2314
2319
|
// AUDIT FIX: opacity was applied only to the radio circle, leaving the label
|
|
2315
2320
|
// at full opacity when disabled. The whole row now dims uniformly so users
|
|
2316
2321
|
// get a single, consistent disabled signal across the entire item.
|
|
2317
|
-
/* @__PURE__ */
|
|
2322
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
2318
2323
|
reactNative.TouchableOpacity,
|
|
2319
2324
|
{
|
|
2320
2325
|
style: [styles18.row, option.disabled && styles18.rowDisabled],
|
|
@@ -2333,14 +2338,14 @@ function RadioItem({
|
|
|
2333
2338
|
accessibilityLabel: option.label,
|
|
2334
2339
|
accessibilityState: { checked: selected, disabled: !!option.disabled }
|
|
2335
2340
|
},
|
|
2336
|
-
/* @__PURE__ */
|
|
2341
|
+
/* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2337
2342
|
reactNativeEase.EaseView,
|
|
2338
2343
|
{
|
|
2339
2344
|
style: styles18.radio,
|
|
2340
2345
|
animate: { borderColor: selected ? colors.primary : colors.border },
|
|
2341
2346
|
transition: COLOR_TRANSITION
|
|
2342
2347
|
},
|
|
2343
|
-
/* @__PURE__ */
|
|
2348
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
2344
2349
|
reactNativeEase.EaseView,
|
|
2345
2350
|
{
|
|
2346
2351
|
style: [styles18.dot, { backgroundColor: colors.primary }],
|
|
@@ -2349,7 +2354,7 @@ function RadioItem({
|
|
|
2349
2354
|
}
|
|
2350
2355
|
)
|
|
2351
2356
|
)),
|
|
2352
|
-
/* @__PURE__ */
|
|
2357
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
2353
2358
|
reactNative.Text,
|
|
2354
2359
|
{
|
|
2355
2360
|
style: [styles18.label, { color: colors.foreground }],
|
|
@@ -2368,14 +2373,14 @@ function RadioGroup({
|
|
|
2368
2373
|
style,
|
|
2369
2374
|
accessibilityLabel
|
|
2370
2375
|
}) {
|
|
2371
|
-
return /* @__PURE__ */
|
|
2376
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
2372
2377
|
reactNative.View,
|
|
2373
2378
|
{
|
|
2374
2379
|
style: [styles18.container, orientation === "horizontal" && styles18.horizontal, style],
|
|
2375
2380
|
accessibilityRole: "radiogroup",
|
|
2376
2381
|
accessibilityLabel
|
|
2377
2382
|
},
|
|
2378
|
-
options.map((option) => /* @__PURE__ */
|
|
2383
|
+
options.map((option) => /* @__PURE__ */ React55__default.default.createElement(
|
|
2379
2384
|
RadioItem,
|
|
2380
2385
|
{
|
|
2381
2386
|
key: option.value,
|
|
@@ -2431,7 +2436,7 @@ function TabTrigger({
|
|
|
2431
2436
|
}) {
|
|
2432
2437
|
const { colors } = useTheme();
|
|
2433
2438
|
const isUnderline = variant === "underline";
|
|
2434
|
-
return /* @__PURE__ */
|
|
2439
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { onLayout, style: styles19.triggerWrap }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2435
2440
|
PressableTab,
|
|
2436
2441
|
{
|
|
2437
2442
|
style: [
|
|
@@ -2446,7 +2451,7 @@ function TabTrigger({
|
|
|
2446
2451
|
accessibilityState: { selected: isActive },
|
|
2447
2452
|
accessibilityLabel: tab.label
|
|
2448
2453
|
},
|
|
2449
|
-
/* @__PURE__ */
|
|
2454
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles19.triggerInner }, tab.icon ? typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon : null, /* @__PURE__ */ React55__default.default.createElement(
|
|
2450
2455
|
reactNative.Text,
|
|
2451
2456
|
{
|
|
2452
2457
|
style: [
|
|
@@ -2464,14 +2469,14 @@ function TabTrigger({
|
|
|
2464
2469
|
));
|
|
2465
2470
|
}
|
|
2466
2471
|
function Tabs({ tabs, variant = "pill", value, onValueChange, children, style }) {
|
|
2467
|
-
const [internal, setInternal] =
|
|
2472
|
+
const [internal, setInternal] = React55.useState(tabs[0]?.value ?? "");
|
|
2468
2473
|
const { colors } = useTheme();
|
|
2469
2474
|
const active = value ?? internal;
|
|
2470
|
-
const tabLayouts =
|
|
2475
|
+
const tabLayouts = React55.useRef({});
|
|
2471
2476
|
const pillX = Animated12.useSharedValue(0);
|
|
2472
2477
|
const pillWidth = Animated12.useSharedValue(0);
|
|
2473
|
-
const initialised =
|
|
2474
|
-
const animatePill =
|
|
2478
|
+
const initialised = React55.useRef(false);
|
|
2479
|
+
const animatePill = React55.useCallback((tabValue, animate) => {
|
|
2475
2480
|
const layout = tabLayouts.current[tabValue];
|
|
2476
2481
|
if (!layout) return;
|
|
2477
2482
|
if (animate) {
|
|
@@ -2482,7 +2487,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
|
|
|
2482
2487
|
pillWidth.value = layout.width;
|
|
2483
2488
|
}
|
|
2484
2489
|
}, [pillX, pillWidth]);
|
|
2485
|
-
|
|
2490
|
+
React55.useEffect(() => {
|
|
2486
2491
|
if (initialised.current) animatePill(active, true);
|
|
2487
2492
|
}, [active, animatePill]);
|
|
2488
2493
|
const handlePress = (v) => {
|
|
@@ -2494,7 +2499,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
|
|
|
2494
2499
|
transform: [{ translateX: pillX.value }],
|
|
2495
2500
|
width: pillWidth.value
|
|
2496
2501
|
}));
|
|
2497
|
-
return /* @__PURE__ */
|
|
2502
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2498
2503
|
reactNative.View,
|
|
2499
2504
|
{
|
|
2500
2505
|
style: [
|
|
@@ -2502,7 +2507,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
|
|
|
2502
2507
|
],
|
|
2503
2508
|
accessibilityRole: "tablist"
|
|
2504
2509
|
},
|
|
2505
|
-
variant === "pill" && /* @__PURE__ */
|
|
2510
|
+
variant === "pill" && /* @__PURE__ */ React55__default.default.createElement(
|
|
2506
2511
|
Animated12__default.default.View,
|
|
2507
2512
|
{
|
|
2508
2513
|
style: [
|
|
@@ -2524,7 +2529,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
|
|
|
2524
2529
|
]
|
|
2525
2530
|
}
|
|
2526
2531
|
),
|
|
2527
|
-
tabs.map((tab) => /* @__PURE__ */
|
|
2532
|
+
tabs.map((tab) => /* @__PURE__ */ React55__default.default.createElement(
|
|
2528
2533
|
TabTrigger,
|
|
2529
2534
|
{
|
|
2530
2535
|
key: tab.value,
|
|
@@ -2546,7 +2551,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
|
|
|
2546
2551
|
}
|
|
2547
2552
|
function TabsContent({ value, activeValue, children, style }) {
|
|
2548
2553
|
if (value !== activeValue) return null;
|
|
2549
|
-
return /* @__PURE__ */
|
|
2554
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style, accessibilityRole: "none" }, children);
|
|
2550
2555
|
}
|
|
2551
2556
|
var styles19 = reactNative.StyleSheet.create({
|
|
2552
2557
|
list: {
|
|
@@ -2607,7 +2612,7 @@ function AccordionItemComponent({
|
|
|
2607
2612
|
const resolvedIcon = item.iconName ? renderIcon(item.iconName, ms(16), item.iconColor ?? colors.foregroundMuted) : item.icon;
|
|
2608
2613
|
const isExpanded = Animated12.useSharedValue(isOpen);
|
|
2609
2614
|
const height = Animated12.useSharedValue(0);
|
|
2610
|
-
|
|
2615
|
+
React55__default.default.useEffect(() => {
|
|
2611
2616
|
isExpanded.value = isOpen;
|
|
2612
2617
|
}, [isOpen, isExpanded]);
|
|
2613
2618
|
const derivedHeight = Animated12.useDerivedValue(
|
|
@@ -2629,7 +2634,7 @@ function AccordionItemComponent({
|
|
|
2629
2634
|
const rotationStyle = Animated12.useAnimatedStyle(() => ({
|
|
2630
2635
|
transform: [{ rotate: `${derivedRotation.value * 180}deg` }]
|
|
2631
2636
|
}));
|
|
2632
|
-
return /* @__PURE__ */
|
|
2637
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles20.item, { backgroundColor: colors.card, borderColor: colors.border }] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2633
2638
|
reactNative.Pressable,
|
|
2634
2639
|
{
|
|
2635
2640
|
style: ({ pressed }) => [styles20.trigger, { opacity: pressed ? 0.6 : 1 }],
|
|
@@ -2641,9 +2646,17 @@ function AccordionItemComponent({
|
|
|
2641
2646
|
accessibilityState: { expanded: isOpen },
|
|
2642
2647
|
accessibilityLabel: typeof item.trigger === "string" ? item.trigger : void 0
|
|
2643
2648
|
},
|
|
2644
|
-
/* @__PURE__ */
|
|
2645
|
-
|
|
2646
|
-
|
|
2649
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles20.triggerContent }, resolvedIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles20.icon }, resolvedIcon) : null, typeof item.trigger === "string" ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles20.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger) : item.trigger),
|
|
2650
|
+
item.triggerActions ? /* @__PURE__ */ React55__default.default.createElement(
|
|
2651
|
+
reactNative.View,
|
|
2652
|
+
{
|
|
2653
|
+
style: styles20.triggerActions,
|
|
2654
|
+
onTouchEnd: (e) => e.stopPropagation()
|
|
2655
|
+
},
|
|
2656
|
+
item.triggerActions
|
|
2657
|
+
) : null,
|
|
2658
|
+
/* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [styles20.chevron, rotationStyle] }, /* @__PURE__ */ React55__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
|
|
2659
|
+
), /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: bodyStyle }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2647
2660
|
reactNative.View,
|
|
2648
2661
|
{
|
|
2649
2662
|
style: styles20.content,
|
|
@@ -2651,11 +2664,11 @@ function AccordionItemComponent({
|
|
|
2651
2664
|
height.value = e.nativeEvent.layout.height;
|
|
2652
2665
|
}
|
|
2653
2666
|
},
|
|
2654
|
-
typeof item.content === "string" || typeof item.content === "number" ? /* @__PURE__ */
|
|
2667
|
+
typeof item.content === "string" || typeof item.content === "number" ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles20.contentText, { color: colors.foregroundMuted }], allowFontScaling: true }, item.content) : item.content
|
|
2655
2668
|
)));
|
|
2656
2669
|
}
|
|
2657
2670
|
function Accordion({ items, type = "single", defaultValue, style }) {
|
|
2658
|
-
const [openValues, setOpenValues] =
|
|
2671
|
+
const [openValues, setOpenValues] = React55.useState(() => {
|
|
2659
2672
|
if (!defaultValue) return [];
|
|
2660
2673
|
return Array.isArray(defaultValue) ? defaultValue : [defaultValue];
|
|
2661
2674
|
});
|
|
@@ -2668,7 +2681,7 @@ function Accordion({ items, type = "single", defaultValue, style }) {
|
|
|
2668
2681
|
);
|
|
2669
2682
|
}
|
|
2670
2683
|
};
|
|
2671
|
-
return /* @__PURE__ */
|
|
2684
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles20.list, style] }, items.map((item) => /* @__PURE__ */ React55__default.default.createElement(
|
|
2672
2685
|
AccordionItemComponent,
|
|
2673
2686
|
{
|
|
2674
2687
|
key: item.value,
|
|
@@ -2711,6 +2724,12 @@ var styles20 = reactNative.StyleSheet.create({
|
|
|
2711
2724
|
chevron: {
|
|
2712
2725
|
marginLeft: s(8)
|
|
2713
2726
|
},
|
|
2727
|
+
triggerActions: {
|
|
2728
|
+
flexDirection: "row",
|
|
2729
|
+
alignItems: "center",
|
|
2730
|
+
gap: s(4),
|
|
2731
|
+
marginLeft: s(8)
|
|
2732
|
+
},
|
|
2714
2733
|
// position:'absolute' is the key — the inner View escapes the animated wrapper's
|
|
2715
2734
|
// clipped height so onLayout always reports the true content height.
|
|
2716
2735
|
content: {
|
|
@@ -2740,7 +2759,7 @@ function Slider({
|
|
|
2740
2759
|
style
|
|
2741
2760
|
}) {
|
|
2742
2761
|
const { colors } = useTheme();
|
|
2743
|
-
const lastSteppedValue =
|
|
2762
|
+
const lastSteppedValue = React55.useRef(value);
|
|
2744
2763
|
const handleValueChange = (v) => {
|
|
2745
2764
|
if (step && v !== lastSteppedValue.current) {
|
|
2746
2765
|
lastSteppedValue.current = v;
|
|
@@ -2748,7 +2767,7 @@ function Slider({
|
|
|
2748
2767
|
}
|
|
2749
2768
|
onValueChange?.(v);
|
|
2750
2769
|
};
|
|
2751
|
-
return /* @__PURE__ */
|
|
2770
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
2752
2771
|
reactNative.View,
|
|
2753
2772
|
{
|
|
2754
2773
|
style: [styles21.wrapper, style],
|
|
@@ -2761,8 +2780,8 @@ function Slider({
|
|
|
2761
2780
|
text: formatValue2(value)
|
|
2762
2781
|
}
|
|
2763
2782
|
},
|
|
2764
|
-
label || showValue ? /* @__PURE__ */
|
|
2765
|
-
/* @__PURE__ */
|
|
2783
|
+
label || showValue ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles21.header }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles21.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles21.valueText, { color: colors.foregroundMuted }], allowFontScaling: true }, formatValue2(value)) : null) : null,
|
|
2784
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: disabled ? styles21.disabled : void 0 }, /* @__PURE__ */ React55__default.default.createElement(
|
|
2766
2785
|
RNSlider__default.default,
|
|
2767
2786
|
{
|
|
2768
2787
|
value,
|
|
@@ -2806,73 +2825,75 @@ var styles21 = reactNative.StyleSheet.create({
|
|
|
2806
2825
|
opacity: 0.45
|
|
2807
2826
|
}
|
|
2808
2827
|
});
|
|
2809
|
-
var SCREEN_HEIGHT = reactNative.Dimensions.get("window").height;
|
|
2810
|
-
var DEFAULT_MAX_HEIGHT = SCREEN_HEIGHT * 0.85;
|
|
2811
|
-
var isAndroid = reactNative.Platform.OS === "android";
|
|
2812
2828
|
function SheetHeader({ children, style }) {
|
|
2813
|
-
return /* @__PURE__ */
|
|
2829
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles22.header, style] }, children);
|
|
2814
2830
|
}
|
|
2815
2831
|
function SheetContent({ children, style }) {
|
|
2816
|
-
return /* @__PURE__ */
|
|
2832
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles22.sheetContent, style] }, children);
|
|
2817
2833
|
}
|
|
2818
2834
|
function SheetFooter({ children, style }) {
|
|
2819
2835
|
const { colors } = useTheme();
|
|
2820
|
-
return /* @__PURE__ */
|
|
2836
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles22.sheetFooter, { backgroundColor: colors.card, borderTopColor: colors.border }, style] }, children);
|
|
2821
2837
|
}
|
|
2822
2838
|
function Sheet({
|
|
2823
2839
|
open,
|
|
2824
2840
|
onClose,
|
|
2825
2841
|
title,
|
|
2826
2842
|
subtitle,
|
|
2827
|
-
description,
|
|
2828
2843
|
showCloseButton = false,
|
|
2829
2844
|
children,
|
|
2830
2845
|
style,
|
|
2831
2846
|
contentStyle,
|
|
2832
|
-
scrollable,
|
|
2847
|
+
scrollable = false,
|
|
2833
2848
|
maxHeight,
|
|
2834
|
-
keyboardBehavior,
|
|
2849
|
+
keyboardBehavior = "interactive",
|
|
2835
2850
|
keyboardBlurBehavior = "restore",
|
|
2836
2851
|
enableBlurKeyboardOnGesture = true,
|
|
2837
2852
|
android_keyboardInputMode = "adjustPan",
|
|
2838
2853
|
footer,
|
|
2839
|
-
snapPoints
|
|
2840
|
-
responsive = false,
|
|
2841
|
-
dialogMaxWidth = 480
|
|
2854
|
+
snapPoints
|
|
2842
2855
|
}) {
|
|
2843
2856
|
const { colors } = useTheme();
|
|
2844
2857
|
const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
|
|
2845
|
-
const
|
|
2846
|
-
const
|
|
2847
|
-
const
|
|
2848
|
-
const
|
|
2849
|
-
|
|
2850
|
-
|
|
2858
|
+
const ref = React55.useRef(null);
|
|
2859
|
+
const wasOpened = React55.useRef(false);
|
|
2860
|
+
const isPresentedRef = React55.useRef(false);
|
|
2861
|
+
const name = React55.useId();
|
|
2862
|
+
const handleDismiss = React55.useCallback(() => {
|
|
2863
|
+
isPresentedRef.current = false;
|
|
2864
|
+
onClose?.();
|
|
2865
|
+
}, [onClose]);
|
|
2866
|
+
React55.useEffect(() => {
|
|
2867
|
+
if (open && !isPresentedRef.current) {
|
|
2851
2868
|
impactMedium();
|
|
2852
|
-
ref.current?.
|
|
2853
|
-
|
|
2854
|
-
|
|
2869
|
+
ref.current?.present();
|
|
2870
|
+
wasOpened.current = true;
|
|
2871
|
+
isPresentedRef.current = true;
|
|
2872
|
+
} else if (!open && wasOpened.current && isPresentedRef.current) {
|
|
2873
|
+
ref.current?.dismiss();
|
|
2855
2874
|
}
|
|
2856
2875
|
}, [open]);
|
|
2857
|
-
const renderBackdrop =
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
const
|
|
2876
|
+
const renderBackdrop = React55.useCallback(
|
|
2877
|
+
(props) => /* @__PURE__ */ React55__default.default.createElement(
|
|
2878
|
+
bottomSheet.BottomSheetBackdrop,
|
|
2879
|
+
{
|
|
2880
|
+
...props,
|
|
2881
|
+
disappearsOnIndex: -1,
|
|
2882
|
+
appearsOnIndex: 0,
|
|
2883
|
+
pressBehavior: "close"
|
|
2884
|
+
}
|
|
2885
|
+
),
|
|
2886
|
+
[]
|
|
2887
|
+
);
|
|
2888
|
+
const childArray = React55__default.default.Children.toArray(children);
|
|
2889
|
+
const customHeader = childArray.find((child) => React55__default.default.isValidElement(child) && child.type === SheetHeader);
|
|
2890
|
+
const customContent = childArray.find((child) => React55__default.default.isValidElement(child) && child.type === SheetContent);
|
|
2891
|
+
const customFooter = childArray.find((child) => React55__default.default.isValidElement(child) && child.type === SheetFooter);
|
|
2870
2892
|
const filteredChildren = customHeader || customContent || customFooter ? childArray.filter(
|
|
2871
|
-
(child) => !
|
|
2893
|
+
(child) => !React55__default.default.isValidElement(child) || child.type !== SheetHeader && child.type !== SheetContent && child.type !== SheetFooter
|
|
2872
2894
|
) : children;
|
|
2873
|
-
const
|
|
2874
|
-
const
|
|
2875
|
-
const headerNode = customHeader ? customHeader : showHeader ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles22.header, { backgroundColor: colors.card }], accessibilityRole: "header" }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles22.headerRow }, title ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles22.title, { color: colors.foreground }], allowFontScaling: true }, title) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: { flex: 1 } }), showCloseButton ? /* @__PURE__ */ React25__default.default.createElement(
|
|
2895
|
+
const showHeader = !!(title || subtitle || showCloseButton) && !customHeader;
|
|
2896
|
+
const headerNode = customHeader ? customHeader : showHeader ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles22.header, { backgroundColor: colors.card }], accessibilityRole: "header" }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles22.headerRow }, title ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles22.title, { color: colors.foreground }], allowFontScaling: true }, title) : /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: { flex: 1 } }), showCloseButton ? /* @__PURE__ */ React55__default.default.createElement(
|
|
2876
2897
|
reactNative.TouchableOpacity,
|
|
2877
2898
|
{
|
|
2878
2899
|
onPress: onClose,
|
|
@@ -2883,78 +2904,50 @@ function Sheet({
|
|
|
2883
2904
|
accessibilityLabel: "Close",
|
|
2884
2905
|
hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }
|
|
2885
2906
|
},
|
|
2886
|
-
/* @__PURE__ */
|
|
2887
|
-
) : null),
|
|
2907
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.AntDesign, { name: "close", size: ms(18), color: colors.foregroundMuted })
|
|
2908
|
+
) : null), subtitle ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles22.subtitle, { color: colors.foregroundMuted }], allowFontScaling: true }, subtitle) : null) : null;
|
|
2888
2909
|
const contentNode = customContent ? customContent : filteredChildren;
|
|
2889
2910
|
const effectiveFooter = customFooter ? customFooter : footer;
|
|
2890
|
-
const renderFooter =
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
{
|
|
2898
|
-
style: [
|
|
2899
|
-
styles22.dialogCard,
|
|
2900
|
-
{ backgroundColor: colors.card, maxWidth: dialogMaxWidth, maxHeight: SCREEN_HEIGHT * 0.85 }
|
|
2901
|
-
],
|
|
2902
|
-
onPress: () => {
|
|
2903
|
-
}
|
|
2904
|
-
},
|
|
2905
|
-
headerNode,
|
|
2906
|
-
/* @__PURE__ */ React25__default.default.createElement(
|
|
2907
|
-
reactNative.ScrollView,
|
|
2908
|
-
{
|
|
2909
|
-
contentContainerStyle: [styles22.dialogContent, style],
|
|
2910
|
-
style: contentStyle,
|
|
2911
|
-
showsVerticalScrollIndicator: true,
|
|
2912
|
-
bounces: false
|
|
2913
|
-
},
|
|
2914
|
-
contentNode
|
|
2915
|
-
),
|
|
2916
|
-
effectiveFooter
|
|
2917
|
-
)));
|
|
2918
|
-
}
|
|
2919
|
-
const useScroll = scrollable || !!maxHeight;
|
|
2920
|
-
const effectiveMaxHeight = maxHeight ?? DEFAULT_MAX_HEIGHT;
|
|
2911
|
+
const renderFooter = React55.useCallback(
|
|
2912
|
+
(props) => {
|
|
2913
|
+
if (!effectiveFooter) return null;
|
|
2914
|
+
return /* @__PURE__ */ React55__default.default.createElement(bottomSheet.BottomSheetFooter, { ...props }, effectiveFooter);
|
|
2915
|
+
},
|
|
2916
|
+
[effectiveFooter]
|
|
2917
|
+
);
|
|
2921
2918
|
const useDynamicSizing = !snapPoints;
|
|
2922
|
-
return /* @__PURE__ */
|
|
2923
|
-
|
|
2919
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
2920
|
+
bottomSheet.BottomSheetModal,
|
|
2924
2921
|
{
|
|
2925
2922
|
ref,
|
|
2926
|
-
|
|
2927
|
-
|
|
2923
|
+
name,
|
|
2924
|
+
onDismiss: handleDismiss,
|
|
2928
2925
|
enableDynamicSizing: useDynamicSizing,
|
|
2929
2926
|
snapPoints,
|
|
2930
|
-
maxDynamicContentSize: useDynamicSizing ?
|
|
2927
|
+
maxDynamicContentSize: useDynamicSizing && maxHeight ? maxHeight : void 0,
|
|
2931
2928
|
backdropComponent: renderBackdrop,
|
|
2932
2929
|
footerComponent: effectiveFooter ? renderFooter : void 0,
|
|
2933
|
-
backgroundStyle:
|
|
2934
|
-
handleIndicatorStyle:
|
|
2930
|
+
backgroundStyle: { ...styles22.background, backgroundColor: colors.card },
|
|
2931
|
+
handleIndicatorStyle: { ...styles22.handle, backgroundColor: colors.border },
|
|
2935
2932
|
enablePanDownToClose: true,
|
|
2936
2933
|
topInset: insets.top,
|
|
2937
|
-
keyboardBehavior
|
|
2934
|
+
keyboardBehavior,
|
|
2938
2935
|
keyboardBlurBehavior,
|
|
2939
2936
|
android_keyboardInputMode,
|
|
2940
2937
|
enableBlurKeyboardOnGesture
|
|
2941
2938
|
},
|
|
2942
|
-
|
|
2943
|
-
|
|
2939
|
+
scrollable ? /* @__PURE__ */ React55__default.default.createElement(
|
|
2940
|
+
bottomSheet.BottomSheetScrollView,
|
|
2944
2941
|
{
|
|
2945
|
-
contentContainerStyle: [
|
|
2946
|
-
styles22.scrollContent,
|
|
2947
|
-
style
|
|
2948
|
-
],
|
|
2942
|
+
contentContainerStyle: [styles22.scrollContent, style],
|
|
2949
2943
|
style: contentStyle,
|
|
2950
2944
|
showsVerticalScrollIndicator: true,
|
|
2951
|
-
|
|
2952
|
-
persistentScrollbar: isAndroid,
|
|
2945
|
+
bounces: false,
|
|
2953
2946
|
stickyHeaderIndices: headerNode ? [0] : void 0
|
|
2954
2947
|
},
|
|
2955
2948
|
headerNode,
|
|
2956
2949
|
contentNode
|
|
2957
|
-
) : /* @__PURE__ */
|
|
2950
|
+
) : /* @__PURE__ */ React55__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles22.content, contentStyle, style] }, headerNode, contentNode)
|
|
2958
2951
|
);
|
|
2959
2952
|
}
|
|
2960
2953
|
Sheet.Header = SheetHeader;
|
|
@@ -3001,8 +2994,7 @@ var styles22 = reactNative.StyleSheet.create({
|
|
|
3001
2994
|
},
|
|
3002
2995
|
scrollContent: {
|
|
3003
2996
|
paddingHorizontal: s(16),
|
|
3004
|
-
paddingBottom: vs(32)
|
|
3005
|
-
paddingRight: s(16)
|
|
2997
|
+
paddingBottom: vs(32)
|
|
3006
2998
|
},
|
|
3007
2999
|
sheetContent: {
|
|
3008
3000
|
gap: vs(16)
|
|
@@ -3013,28 +3005,10 @@ var styles22 = reactNative.StyleSheet.create({
|
|
|
3013
3005
|
borderTopWidth: 1,
|
|
3014
3006
|
flexDirection: "row",
|
|
3015
3007
|
gap: s(12)
|
|
3016
|
-
},
|
|
3017
|
-
dialogBackdrop: {
|
|
3018
|
-
flex: 1,
|
|
3019
|
-
backgroundColor: "rgba(0,0,0,0.5)",
|
|
3020
|
-
alignItems: "center",
|
|
3021
|
-
justifyContent: "center",
|
|
3022
|
-
padding: s(24)
|
|
3023
|
-
},
|
|
3024
|
-
dialogCard: {
|
|
3025
|
-
width: "100%",
|
|
3026
|
-
borderRadius: RADIUS.lg,
|
|
3027
|
-
paddingTop: vs(16),
|
|
3028
|
-
overflow: "hidden",
|
|
3029
|
-
...SHADOWS.xl
|
|
3030
|
-
},
|
|
3031
|
-
dialogContent: {
|
|
3032
|
-
paddingHorizontal: s(16),
|
|
3033
|
-
paddingBottom: vs(16)
|
|
3034
3008
|
}
|
|
3035
3009
|
});
|
|
3036
3010
|
var isIOS = reactNative.Platform.OS === "ios";
|
|
3037
|
-
var
|
|
3011
|
+
var isAndroid = reactNative.Platform.OS === "android";
|
|
3038
3012
|
var isWeb2 = reactNative.Platform.OS === "web";
|
|
3039
3013
|
function Select({
|
|
3040
3014
|
options,
|
|
@@ -3052,9 +3026,9 @@ function Select({
|
|
|
3052
3026
|
pressScale: PRESS_SCALE.button,
|
|
3053
3027
|
disabled
|
|
3054
3028
|
});
|
|
3055
|
-
const [pickerVisible, setPickerVisible] =
|
|
3056
|
-
const [pendingValue, setPendingValue] =
|
|
3057
|
-
const pickerRef =
|
|
3029
|
+
const [pickerVisible, setPickerVisible] = React55.useState(false);
|
|
3030
|
+
const [pendingValue, setPendingValue] = React55.useState(value);
|
|
3031
|
+
const pickerRef = React55.useRef(null);
|
|
3058
3032
|
const selected = options.find((o) => o.value === value);
|
|
3059
3033
|
const handleOpen = () => {
|
|
3060
3034
|
if (disabled) return;
|
|
@@ -3062,7 +3036,7 @@ function Select({
|
|
|
3062
3036
|
if (isIOS) {
|
|
3063
3037
|
setPendingValue(value);
|
|
3064
3038
|
setPickerVisible(true);
|
|
3065
|
-
} else if (
|
|
3039
|
+
} else if (isAndroid) {
|
|
3066
3040
|
pickerRef.current?.focus?.();
|
|
3067
3041
|
}
|
|
3068
3042
|
};
|
|
@@ -3076,7 +3050,7 @@ function Select({
|
|
|
3076
3050
|
}
|
|
3077
3051
|
setPickerVisible(false);
|
|
3078
3052
|
};
|
|
3079
|
-
return /* @__PURE__ */
|
|
3053
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles23.container, style] }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles23.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, !isWeb2 ? /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [animatedStyle, { opacity: disabled ? 0.45 : 1 }] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3080
3054
|
reactNative.TouchableOpacity,
|
|
3081
3055
|
{
|
|
3082
3056
|
style: [
|
|
@@ -3096,7 +3070,7 @@ function Select({
|
|
|
3096
3070
|
accessibilityValue: { text: selected?.label ?? placeholder },
|
|
3097
3071
|
accessibilityState: { disabled: !!disabled, expanded: pickerVisible }
|
|
3098
3072
|
},
|
|
3099
|
-
/* @__PURE__ */
|
|
3073
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
3100
3074
|
reactNative.Text,
|
|
3101
3075
|
{
|
|
3102
3076
|
style: [
|
|
@@ -3108,8 +3082,8 @@ function Select({
|
|
|
3108
3082
|
},
|
|
3109
3083
|
selected?.label ?? placeholder
|
|
3110
3084
|
),
|
|
3111
|
-
/* @__PURE__ */
|
|
3112
|
-
)) : null, isIOS ? /* @__PURE__ */
|
|
3085
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 20, color: colors.foregroundMuted })
|
|
3086
|
+
)) : null, isIOS ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3113
3087
|
reactNative.Modal,
|
|
3114
3088
|
{
|
|
3115
3089
|
visible: pickerVisible,
|
|
@@ -3117,16 +3091,16 @@ function Select({
|
|
|
3117
3091
|
animationType: "slide",
|
|
3118
3092
|
onRequestClose: handleDismiss
|
|
3119
3093
|
},
|
|
3120
|
-
/* @__PURE__ */
|
|
3121
|
-
/* @__PURE__ */
|
|
3094
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.TouchableOpacity, { style: styles23.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
|
|
3095
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles23.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles23.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles23.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React55__default.default.createElement(reactNative.View, null), /* @__PURE__ */ React55__default.default.createElement(reactNative.TouchableOpacity, { onPress: handleConfirm, style: styles23.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles23.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React55__default.default.createElement(
|
|
3122
3096
|
picker.Picker,
|
|
3123
3097
|
{
|
|
3124
3098
|
selectedValue: pendingValue ?? "",
|
|
3125
3099
|
onValueChange: (val) => setPendingValue(val),
|
|
3126
3100
|
itemStyle: { color: colors.foreground }
|
|
3127
3101
|
},
|
|
3128
|
-
!value ? /* @__PURE__ */
|
|
3129
|
-
options.map((o) => /* @__PURE__ */
|
|
3102
|
+
!value ? /* @__PURE__ */ React55__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
|
|
3103
|
+
options.map((o) => /* @__PURE__ */ React55__default.default.createElement(
|
|
3130
3104
|
picker.Picker.Item,
|
|
3131
3105
|
{
|
|
3132
3106
|
key: o.value,
|
|
@@ -3137,7 +3111,7 @@ function Select({
|
|
|
3137
3111
|
}
|
|
3138
3112
|
))
|
|
3139
3113
|
))
|
|
3140
|
-
) : null,
|
|
3114
|
+
) : null, isAndroid ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3141
3115
|
picker.Picker,
|
|
3142
3116
|
{
|
|
3143
3117
|
ref: pickerRef,
|
|
@@ -3153,8 +3127,8 @@ function Select({
|
|
|
3153
3127
|
prompt: label,
|
|
3154
3128
|
style: styles23.androidHiddenPicker
|
|
3155
3129
|
},
|
|
3156
|
-
!value ? /* @__PURE__ */
|
|
3157
|
-
options.map((o) => /* @__PURE__ */
|
|
3130
|
+
!value ? /* @__PURE__ */ React55__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
|
|
3131
|
+
options.map((o) => /* @__PURE__ */ React55__default.default.createElement(
|
|
3158
3132
|
picker.Picker.Item,
|
|
3159
3133
|
{
|
|
3160
3134
|
key: o.value,
|
|
@@ -3163,7 +3137,7 @@ function Select({
|
|
|
3163
3137
|
enabled: !o.disabled
|
|
3164
3138
|
}
|
|
3165
3139
|
))
|
|
3166
|
-
) : null, isWeb2 ? /* @__PURE__ */
|
|
3140
|
+
) : null, isWeb2 ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3167
3141
|
picker.Picker,
|
|
3168
3142
|
{
|
|
3169
3143
|
selectedValue: value ?? "",
|
|
@@ -3183,8 +3157,8 @@ function Select({
|
|
|
3183
3157
|
}
|
|
3184
3158
|
]
|
|
3185
3159
|
},
|
|
3186
|
-
/* @__PURE__ */
|
|
3187
|
-
options.map((o) => /* @__PURE__ */
|
|
3160
|
+
/* @__PURE__ */ React55__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }),
|
|
3161
|
+
options.map((o) => /* @__PURE__ */ React55__default.default.createElement(
|
|
3188
3162
|
picker.Picker.Item,
|
|
3189
3163
|
{
|
|
3190
3164
|
key: o.value,
|
|
@@ -3193,7 +3167,7 @@ function Select({
|
|
|
3193
3167
|
enabled: !o.disabled
|
|
3194
3168
|
}
|
|
3195
3169
|
))
|
|
3196
|
-
) : null, error ? /* @__PURE__ */
|
|
3170
|
+
) : null, error ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles23.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null);
|
|
3197
3171
|
}
|
|
3198
3172
|
var styles23 = reactNative.StyleSheet.create({
|
|
3199
3173
|
container: {
|
|
@@ -3274,7 +3248,7 @@ function useToast() {
|
|
|
3274
3248
|
function ToastProvider({ children }) {
|
|
3275
3249
|
const { colorScheme } = useTheme();
|
|
3276
3250
|
const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
|
|
3277
|
-
return /* @__PURE__ */
|
|
3251
|
+
return /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, children, /* @__PURE__ */ React55__default.default.createElement(
|
|
3278
3252
|
sonnerNative.Toaster,
|
|
3279
3253
|
{
|
|
3280
3254
|
theme: colorScheme,
|
|
@@ -3324,7 +3298,8 @@ function CurrencyInput({
|
|
|
3324
3298
|
editable,
|
|
3325
3299
|
containerStyle,
|
|
3326
3300
|
style,
|
|
3327
|
-
sheetMode
|
|
3301
|
+
sheetMode,
|
|
3302
|
+
...props
|
|
3328
3303
|
}) {
|
|
3329
3304
|
const handleChange = (text) => {
|
|
3330
3305
|
const withoutPrefix = prefix && text.startsWith(prefix) ? text.slice(prefix.length) : text;
|
|
@@ -3342,9 +3317,10 @@ function CurrencyInput({
|
|
|
3342
3317
|
fontSize: isLarge ? ms(32) : ms(17)
|
|
3343
3318
|
};
|
|
3344
3319
|
const displayValue = value && prefix && value.startsWith(prefix) ? value.slice(prefix.length) : value;
|
|
3345
|
-
return /* @__PURE__ */
|
|
3320
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
3346
3321
|
Input,
|
|
3347
3322
|
{
|
|
3323
|
+
...props,
|
|
3348
3324
|
value: displayValue,
|
|
3349
3325
|
onChangeText: handleChange,
|
|
3350
3326
|
keyboardType: "numeric",
|
|
@@ -3392,7 +3368,7 @@ function CurrencyDisplayBase({ value, prefix = "$", showDecimals = false, textCo
|
|
|
3392
3368
|
const baseFontSize = variant ? variantFontSize[variant] : ms(56);
|
|
3393
3369
|
const fontSize = maxFontSize ?? baseFontSize;
|
|
3394
3370
|
const letterSpacing = variant ? variantLetterSpacing[variant] : -2;
|
|
3395
|
-
return /* @__PURE__ */
|
|
3371
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles24.container, style] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3396
3372
|
reactNative.Text,
|
|
3397
3373
|
{
|
|
3398
3374
|
style: [styles24.amount, { color: textColor ?? colors.foreground, fontSize, letterSpacing }],
|
|
@@ -3404,7 +3380,7 @@ function CurrencyDisplayBase({ value, prefix = "$", showDecimals = false, textCo
|
|
|
3404
3380
|
formatted
|
|
3405
3381
|
));
|
|
3406
3382
|
}
|
|
3407
|
-
var CurrencyDisplay =
|
|
3383
|
+
var CurrencyDisplay = React55__default.default.memo(CurrencyDisplayBase);
|
|
3408
3384
|
var styles24 = reactNative.StyleSheet.create({
|
|
3409
3385
|
container: {
|
|
3410
3386
|
alignSelf: "flex-start"
|
|
@@ -3419,8 +3395,7 @@ function ListItemBase({
|
|
|
3419
3395
|
imageSource,
|
|
3420
3396
|
leftRender,
|
|
3421
3397
|
rightRender,
|
|
3422
|
-
|
|
3423
|
-
icon,
|
|
3398
|
+
rightActions,
|
|
3424
3399
|
leftIcon,
|
|
3425
3400
|
rightIcon,
|
|
3426
3401
|
leftIconColor,
|
|
@@ -3445,8 +3420,8 @@ function ListItemBase({
|
|
|
3445
3420
|
selectionAsync();
|
|
3446
3421
|
onPress?.();
|
|
3447
3422
|
};
|
|
3448
|
-
const effectiveLeft = imageSource ? /* @__PURE__ */
|
|
3449
|
-
const
|
|
3423
|
+
const effectiveLeft = imageSource ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Image, { source: imageSource, style: styles25.image }) : leftIcon ? renderIcon(leftIcon, 24, leftIconColor ?? colors.foreground) : leftRender;
|
|
3424
|
+
const hasRightContent = !!(rightIcon || rightActions && rightActions.length > 0 || rightRender !== void 0 || showChevron);
|
|
3450
3425
|
const cardStyle = variant === "card" ? {
|
|
3451
3426
|
backgroundColor: colors.card,
|
|
3452
3427
|
borderRadius: RADIUS.md,
|
|
@@ -3459,7 +3434,7 @@ function ListItemBase({
|
|
|
3459
3434
|
elevation: 2
|
|
3460
3435
|
} : {};
|
|
3461
3436
|
const a11yLabel = accessibilityLabel ?? [title, subtitle, caption].filter(Boolean).join(". ");
|
|
3462
|
-
const content = /* @__PURE__ */
|
|
3437
|
+
const content = /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, effectiveLeft ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles25.leftContainer }, effectiveLeft) : null, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles25.content }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3463
3438
|
reactNative.Text,
|
|
3464
3439
|
{
|
|
3465
3440
|
style: [styles25.title, { color: colors.foreground }, titleStyle],
|
|
@@ -3467,7 +3442,7 @@ function ListItemBase({
|
|
|
3467
3442
|
allowFontScaling: true
|
|
3468
3443
|
},
|
|
3469
3444
|
title
|
|
3470
|
-
), subtitle ? /* @__PURE__ */
|
|
3445
|
+
), subtitle ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3471
3446
|
reactNative.Text,
|
|
3472
3447
|
{
|
|
3473
3448
|
style: [styles25.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
|
|
@@ -3475,7 +3450,7 @@ function ListItemBase({
|
|
|
3475
3450
|
allowFontScaling: true
|
|
3476
3451
|
},
|
|
3477
3452
|
subtitle
|
|
3478
|
-
) : null, caption ? /* @__PURE__ */
|
|
3453
|
+
) : null, caption ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3479
3454
|
reactNative.Text,
|
|
3480
3455
|
{
|
|
3481
3456
|
style: [styles25.caption, { color: colors.foregroundMuted }, captionStyle],
|
|
@@ -3483,16 +3458,16 @@ function ListItemBase({
|
|
|
3483
3458
|
allowFontScaling: true
|
|
3484
3459
|
},
|
|
3485
3460
|
caption
|
|
3486
|
-
) : null),
|
|
3461
|
+
) : null), hasRightContent ? rightIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles25.rightContainer }, renderIcon(rightIcon, 24, rightIconColor ?? colors.foregroundMuted)) : rightActions && rightActions.length > 0 ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles25.rightActionsContainer }, rightActions.map((action, i) => /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, { key: i }, action))) : rightRender !== void 0 ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles25.rightContainer }, typeof rightRender === "string" ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3487
3462
|
reactNative.Text,
|
|
3488
3463
|
{
|
|
3489
3464
|
style: [styles25.rightText, { color: colors.foregroundMuted }],
|
|
3490
3465
|
allowFontScaling: true
|
|
3491
3466
|
},
|
|
3492
|
-
|
|
3493
|
-
) :
|
|
3467
|
+
rightRender
|
|
3468
|
+
) : rightRender) : showChevron ? /* @__PURE__ */ React55__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null : null);
|
|
3494
3469
|
if (onPress) {
|
|
3495
|
-
return /* @__PURE__ */
|
|
3470
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: disabled && styles25.disabled }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3496
3471
|
PressableRow,
|
|
3497
3472
|
{
|
|
3498
3473
|
style: [styles25.container, cardStyle, style],
|
|
@@ -3506,11 +3481,11 @@ function ListItemBase({
|
|
|
3506
3481
|
accessibilityState: { disabled: !!disabled }
|
|
3507
3482
|
},
|
|
3508
3483
|
content
|
|
3509
|
-
), showSeparator ? /* @__PURE__ */
|
|
3484
|
+
), showSeparator ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles25.separator, { backgroundColor: colors.separator }] }) : null);
|
|
3510
3485
|
}
|
|
3511
|
-
return /* @__PURE__ */
|
|
3486
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [disabled && styles25.disabled] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles25.container, cardStyle, style] }, content), showSeparator ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles25.separator, { backgroundColor: colors.separator }] }) : null);
|
|
3512
3487
|
}
|
|
3513
|
-
var ListItem =
|
|
3488
|
+
var ListItem = React55__default.default.memo(ListItemBase);
|
|
3514
3489
|
var styles25 = reactNative.StyleSheet.create({
|
|
3515
3490
|
container: {
|
|
3516
3491
|
flexDirection: "row",
|
|
@@ -3557,6 +3532,12 @@ var styles25 = reactNative.StyleSheet.create({
|
|
|
3557
3532
|
flexShrink: 0,
|
|
3558
3533
|
maxWidth: s(160)
|
|
3559
3534
|
},
|
|
3535
|
+
rightActionsContainer: {
|
|
3536
|
+
flexDirection: "row",
|
|
3537
|
+
alignItems: "center",
|
|
3538
|
+
gap: s(8),
|
|
3539
|
+
flexShrink: 0
|
|
3540
|
+
},
|
|
3560
3541
|
rightText: {
|
|
3561
3542
|
fontFamily: "Sohne-Regular",
|
|
3562
3543
|
fontSize: ms(14)
|
|
@@ -3571,17 +3552,17 @@ var styles25 = reactNative.StyleSheet.create({
|
|
|
3571
3552
|
});
|
|
3572
3553
|
function ListGroup({ children, variant = "plain", style }) {
|
|
3573
3554
|
const { colors } = useTheme();
|
|
3574
|
-
const processedChildren =
|
|
3575
|
-
if (!
|
|
3555
|
+
const processedChildren = React55__default.default.Children.map(children, (child, index) => {
|
|
3556
|
+
if (!React55__default.default.isValidElement(child)) return child;
|
|
3576
3557
|
if (child.type === ListGroupHeader || child.type === ListGroupFooter) {
|
|
3577
3558
|
return child;
|
|
3578
3559
|
}
|
|
3579
3560
|
const childProps = child.props;
|
|
3580
3561
|
const isListItem = "title" in childProps;
|
|
3581
3562
|
if (!isListItem) return child;
|
|
3582
|
-
const isLast = index ===
|
|
3563
|
+
const isLast = index === React55__default.default.Children.count(children) - 1;
|
|
3583
3564
|
if (childProps["showSeparator"] === void 0 && !isLast) {
|
|
3584
|
-
return
|
|
3565
|
+
return React55__default.default.cloneElement(child, {
|
|
3585
3566
|
showSeparator: true
|
|
3586
3567
|
});
|
|
3587
3568
|
}
|
|
@@ -3599,21 +3580,21 @@ function ListGroup({ children, variant = "plain", style }) {
|
|
|
3599
3580
|
elevation: 2,
|
|
3600
3581
|
paddingVertical: vs(4)
|
|
3601
3582
|
} : {};
|
|
3602
|
-
return /* @__PURE__ */
|
|
3583
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles26.container, cardStyle, style] }, processedChildren);
|
|
3603
3584
|
}
|
|
3604
3585
|
function ListGroupHeader({ children, style }) {
|
|
3605
3586
|
const { colors } = useTheme();
|
|
3606
3587
|
if (typeof children === "string") {
|
|
3607
|
-
return /* @__PURE__ */
|
|
3588
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles26.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3608
3589
|
}
|
|
3609
|
-
return /* @__PURE__ */
|
|
3590
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, children);
|
|
3610
3591
|
}
|
|
3611
3592
|
function ListGroupFooter({ children, style }) {
|
|
3612
3593
|
const { colors } = useTheme();
|
|
3613
3594
|
if (typeof children === "string") {
|
|
3614
|
-
return /* @__PURE__ */
|
|
3595
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles26.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3615
3596
|
}
|
|
3616
|
-
return /* @__PURE__ */
|
|
3597
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, children);
|
|
3617
3598
|
}
|
|
3618
3599
|
ListGroup.Header = ListGroupHeader;
|
|
3619
3600
|
ListGroup.Footer = ListGroupFooter;
|
|
@@ -3677,7 +3658,7 @@ function MenuItemBase({
|
|
|
3677
3658
|
elevation: 2
|
|
3678
3659
|
} : {};
|
|
3679
3660
|
const a11yLabel = accessibilityLabel ?? (subtitle ? `${label}. ${subtitle}` : label);
|
|
3680
|
-
return /* @__PURE__ */
|
|
3661
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: disabled && styles27.disabled }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3681
3662
|
PressableRow,
|
|
3682
3663
|
{
|
|
3683
3664
|
style: [styles27.container, cardStyle, style],
|
|
@@ -3690,8 +3671,8 @@ function MenuItemBase({
|
|
|
3690
3671
|
accessibilityLabel: a11yLabel,
|
|
3691
3672
|
accessibilityState: { disabled }
|
|
3692
3673
|
},
|
|
3693
|
-
resolvedIcon ? /* @__PURE__ */
|
|
3694
|
-
/* @__PURE__ */
|
|
3674
|
+
resolvedIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles27.iconContainer }, resolvedIcon) : null,
|
|
3675
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles27.labelContainer }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3695
3676
|
reactNative.Text,
|
|
3696
3677
|
{
|
|
3697
3678
|
style: [styles27.label, { color: colors.foreground }, labelStyle],
|
|
@@ -3699,7 +3680,7 @@ function MenuItemBase({
|
|
|
3699
3680
|
allowFontScaling: true
|
|
3700
3681
|
},
|
|
3701
3682
|
label
|
|
3702
|
-
), subtitle ? /* @__PURE__ */
|
|
3683
|
+
), subtitle ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3703
3684
|
reactNative.Text,
|
|
3704
3685
|
{
|
|
3705
3686
|
style: [styles27.subtitle, { color: colors.foregroundMuted }],
|
|
@@ -3708,7 +3689,7 @@ function MenuItemBase({
|
|
|
3708
3689
|
},
|
|
3709
3690
|
subtitle
|
|
3710
3691
|
) : null),
|
|
3711
|
-
rightRender !== void 0 ? /* @__PURE__ */
|
|
3692
|
+
rightRender !== void 0 ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3712
3693
|
reactNative.View,
|
|
3713
3694
|
{
|
|
3714
3695
|
style: styles27.rightContainer,
|
|
@@ -3717,10 +3698,10 @@ function MenuItemBase({
|
|
|
3717
3698
|
}
|
|
3718
3699
|
},
|
|
3719
3700
|
rightRender
|
|
3720
|
-
) : showChevron ? /* @__PURE__ */
|
|
3721
|
-
), showSeparator ? /* @__PURE__ */
|
|
3701
|
+
) : showChevron ? /* @__PURE__ */ React55__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 18, color: colors.foregroundMuted }) : null
|
|
3702
|
+
), showSeparator ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles27.separator, { backgroundColor: colors.separator }] }) : null);
|
|
3722
3703
|
}
|
|
3723
|
-
var MenuItem =
|
|
3704
|
+
var MenuItem = React55__default.default.memo(MenuItemBase);
|
|
3724
3705
|
var styles27 = reactNative.StyleSheet.create({
|
|
3725
3706
|
container: {
|
|
3726
3707
|
flexDirection: "row",
|
|
@@ -3764,17 +3745,17 @@ var styles27 = reactNative.StyleSheet.create({
|
|
|
3764
3745
|
});
|
|
3765
3746
|
function MenuGroup({ children, variant = "plain", style }) {
|
|
3766
3747
|
const { colors } = useTheme();
|
|
3767
|
-
const processedChildren =
|
|
3768
|
-
if (!
|
|
3748
|
+
const processedChildren = React55__default.default.Children.map(children, (child, index) => {
|
|
3749
|
+
if (!React55__default.default.isValidElement(child)) return child;
|
|
3769
3750
|
if (child.type === MenuGroupHeader || child.type === MenuGroupFooter) {
|
|
3770
3751
|
return child;
|
|
3771
3752
|
}
|
|
3772
3753
|
const childProps = child.props;
|
|
3773
3754
|
const isMenuItem = "onPress" in childProps;
|
|
3774
3755
|
if (!isMenuItem) return child;
|
|
3775
|
-
const isLast = index ===
|
|
3756
|
+
const isLast = index === React55__default.default.Children.count(children) - 1;
|
|
3776
3757
|
if (childProps["showSeparator"] === void 0 && !isLast) {
|
|
3777
|
-
return
|
|
3758
|
+
return React55__default.default.cloneElement(child, {
|
|
3778
3759
|
showSeparator: true
|
|
3779
3760
|
});
|
|
3780
3761
|
}
|
|
@@ -3792,21 +3773,21 @@ function MenuGroup({ children, variant = "plain", style }) {
|
|
|
3792
3773
|
elevation: 2,
|
|
3793
3774
|
paddingVertical: vs(4)
|
|
3794
3775
|
} : {};
|
|
3795
|
-
return /* @__PURE__ */
|
|
3776
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles28.container, cardStyle, style] }, processedChildren);
|
|
3796
3777
|
}
|
|
3797
3778
|
function MenuGroupHeader({ children, style }) {
|
|
3798
3779
|
const { colors } = useTheme();
|
|
3799
3780
|
if (typeof children === "string") {
|
|
3800
|
-
return /* @__PURE__ */
|
|
3781
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles28.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3801
3782
|
}
|
|
3802
|
-
return /* @__PURE__ */
|
|
3783
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, children);
|
|
3803
3784
|
}
|
|
3804
3785
|
function MenuGroupFooter({ children, style }) {
|
|
3805
3786
|
const { colors } = useTheme();
|
|
3806
3787
|
if (typeof children === "string") {
|
|
3807
|
-
return /* @__PURE__ */
|
|
3788
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles28.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3808
3789
|
}
|
|
3809
|
-
return /* @__PURE__ */
|
|
3790
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, children);
|
|
3810
3791
|
}
|
|
3811
3792
|
MenuGroup.Header = MenuGroupHeader;
|
|
3812
3793
|
MenuGroup.Footer = MenuGroupFooter;
|
|
@@ -3843,7 +3824,7 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
|
|
|
3843
3824
|
onPress?.();
|
|
3844
3825
|
};
|
|
3845
3826
|
const resolvedIcon = iconName ? renderIcon(iconName, ms(13), selected ? colors.primaryForeground : colors.foreground) : icon;
|
|
3846
|
-
return /* @__PURE__ */
|
|
3827
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles29.wrapper, style] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3847
3828
|
PressableChip,
|
|
3848
3829
|
{
|
|
3849
3830
|
onPress: handlePress,
|
|
@@ -3853,7 +3834,7 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
|
|
|
3853
3834
|
accessibilityLabel: accessibilityLabel ?? label,
|
|
3854
3835
|
accessibilityState: { selected }
|
|
3855
3836
|
},
|
|
3856
|
-
/* @__PURE__ */
|
|
3837
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
3857
3838
|
reactNativeEase.EaseView,
|
|
3858
3839
|
{
|
|
3859
3840
|
style: styles29.chip,
|
|
@@ -3863,8 +3844,8 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
|
|
|
3863
3844
|
},
|
|
3864
3845
|
transition: COLOR_TRANSITION
|
|
3865
3846
|
},
|
|
3866
|
-
resolvedIcon ? /* @__PURE__ */
|
|
3867
|
-
/* @__PURE__ */
|
|
3847
|
+
resolvedIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles29.chipIcon }, resolvedIcon) : null,
|
|
3848
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
3868
3849
|
reactNative.Text,
|
|
3869
3850
|
{
|
|
3870
3851
|
style: [styles29.label, { color: selected ? colors.primaryForeground : colors.foreground }],
|
|
@@ -3875,7 +3856,7 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
|
|
|
3875
3856
|
)
|
|
3876
3857
|
));
|
|
3877
3858
|
}
|
|
3878
|
-
var Chip =
|
|
3859
|
+
var Chip = React55__default.default.memo(ChipBase);
|
|
3879
3860
|
function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
|
|
3880
3861
|
const handlePress = (optionValue) => {
|
|
3881
3862
|
if (!multiSelect) {
|
|
@@ -3891,7 +3872,7 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
|
|
|
3891
3872
|
if (Array.isArray(value)) return value.includes(optionValue);
|
|
3892
3873
|
return optionValue === value;
|
|
3893
3874
|
};
|
|
3894
|
-
return /* @__PURE__ */
|
|
3875
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles29.group, style] }, options.map((opt) => /* @__PURE__ */ React55__default.default.createElement(
|
|
3895
3876
|
Chip,
|
|
3896
3877
|
{
|
|
3897
3878
|
key: opt.value,
|
|
@@ -3941,7 +3922,6 @@ function ConfirmDialog({
|
|
|
3941
3922
|
visible,
|
|
3942
3923
|
title,
|
|
3943
3924
|
subtitle,
|
|
3944
|
-
description,
|
|
3945
3925
|
confirmLabel = "Confirm",
|
|
3946
3926
|
cancelLabel = "Cancel",
|
|
3947
3927
|
confirmVariant = "primary",
|
|
@@ -3951,38 +3931,51 @@ function ConfirmDialog({
|
|
|
3951
3931
|
onCancel
|
|
3952
3932
|
}) {
|
|
3953
3933
|
const { colors } = useTheme();
|
|
3954
|
-
const
|
|
3955
|
-
const
|
|
3956
|
-
|
|
3957
|
-
|
|
3934
|
+
const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
|
|
3935
|
+
const ref = React55.useRef(null);
|
|
3936
|
+
const wasOpened = React55.useRef(false);
|
|
3937
|
+
const isPresentedRef = React55.useRef(false);
|
|
3938
|
+
const name = React55.useId();
|
|
3939
|
+
const handleDismiss = React55.useCallback(() => {
|
|
3940
|
+
isPresentedRef.current = false;
|
|
3941
|
+
onCancel();
|
|
3942
|
+
}, [onCancel]);
|
|
3943
|
+
React55.useEffect(() => {
|
|
3944
|
+
if (visible && !isPresentedRef.current) {
|
|
3958
3945
|
impactMedium();
|
|
3959
|
-
ref.current?.
|
|
3960
|
-
|
|
3961
|
-
|
|
3946
|
+
ref.current?.present();
|
|
3947
|
+
wasOpened.current = true;
|
|
3948
|
+
isPresentedRef.current = true;
|
|
3949
|
+
} else if (!visible && wasOpened.current && isPresentedRef.current) {
|
|
3950
|
+
ref.current?.dismiss();
|
|
3962
3951
|
}
|
|
3963
3952
|
}, [visible]);
|
|
3964
|
-
const renderBackdrop =
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3968
|
-
|
|
3969
|
-
|
|
3970
|
-
|
|
3971
|
-
|
|
3953
|
+
const renderBackdrop = React55.useCallback(
|
|
3954
|
+
(props) => /* @__PURE__ */ React55__default.default.createElement(
|
|
3955
|
+
bottomSheet.BottomSheetBackdrop,
|
|
3956
|
+
{
|
|
3957
|
+
...props,
|
|
3958
|
+
disappearsOnIndex: -1,
|
|
3959
|
+
appearsOnIndex: 0,
|
|
3960
|
+
pressBehavior: "close"
|
|
3961
|
+
}
|
|
3962
|
+
),
|
|
3963
|
+
[]
|
|
3972
3964
|
);
|
|
3973
|
-
return /* @__PURE__ */
|
|
3974
|
-
|
|
3965
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
3966
|
+
bottomSheet.BottomSheetModal,
|
|
3975
3967
|
{
|
|
3976
3968
|
ref,
|
|
3977
|
-
|
|
3978
|
-
|
|
3969
|
+
name,
|
|
3970
|
+
onDismiss: handleDismiss,
|
|
3979
3971
|
enableDynamicSizing: true,
|
|
3980
3972
|
backdropComponent: renderBackdrop,
|
|
3981
|
-
backgroundStyle:
|
|
3982
|
-
handleIndicatorStyle:
|
|
3983
|
-
enablePanDownToClose: true
|
|
3973
|
+
backgroundStyle: { ...styles30.background, backgroundColor: colors.card },
|
|
3974
|
+
handleIndicatorStyle: { ...styles30.handle, backgroundColor: colors.border },
|
|
3975
|
+
enablePanDownToClose: true,
|
|
3976
|
+
topInset: insets.top
|
|
3984
3977
|
},
|
|
3985
|
-
/* @__PURE__ */
|
|
3978
|
+
/* @__PURE__ */ React55__default.default.createElement(bottomSheet.BottomSheetView, { style: styles30.content }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles30.header, accessibilityRole: "header" }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles30.headerRow }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles30.title, { color: colors.foreground }], allowFontScaling: true }, title), showCloseButton ? /* @__PURE__ */ React55__default.default.createElement(
|
|
3986
3979
|
reactNative.TouchableOpacity,
|
|
3987
3980
|
{
|
|
3988
3981
|
onPress: onCancel,
|
|
@@ -3993,8 +3986,8 @@ function ConfirmDialog({
|
|
|
3993
3986
|
accessibilityLabel: "Close",
|
|
3994
3987
|
hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }
|
|
3995
3988
|
},
|
|
3996
|
-
/* @__PURE__ */
|
|
3997
|
-
) : null),
|
|
3989
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Feather, { name: "x", size: ms(18), color: colors.foregroundMuted })
|
|
3990
|
+
) : null), subtitle ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles30.subtitle, { color: colors.foregroundMuted }], allowFontScaling: true }, subtitle) : null), /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles30.actions }, /* @__PURE__ */ React55__default.default.createElement(
|
|
3998
3991
|
Button,
|
|
3999
3992
|
{
|
|
4000
3993
|
label: confirmLabel,
|
|
@@ -4006,7 +3999,7 @@ function ConfirmDialog({
|
|
|
4006
3999
|
notificationSuccess();
|
|
4007
4000
|
onConfirm();
|
|
4008
4001
|
},
|
|
4009
|
-
icon: /* @__PURE__ */
|
|
4002
|
+
icon: /* @__PURE__ */ React55__default.default.createElement(
|
|
4010
4003
|
vectorIcons.Feather,
|
|
4011
4004
|
{
|
|
4012
4005
|
name: confirmVariant === "destructive" ? "trash-2" : "check",
|
|
@@ -4015,7 +4008,7 @@ function ConfirmDialog({
|
|
|
4015
4008
|
}
|
|
4016
4009
|
)
|
|
4017
4010
|
}
|
|
4018
|
-
), /* @__PURE__ */
|
|
4011
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
4019
4012
|
Button,
|
|
4020
4013
|
{
|
|
4021
4014
|
label: cancelLabel,
|
|
@@ -4025,7 +4018,7 @@ function ConfirmDialog({
|
|
|
4025
4018
|
selectionAsync();
|
|
4026
4019
|
onCancel();
|
|
4027
4020
|
},
|
|
4028
|
-
icon: /* @__PURE__ */
|
|
4021
|
+
icon: /* @__PURE__ */ React55__default.default.createElement(vectorIcons.Feather, { name: "x", size: 15, color: colors.foreground })
|
|
4029
4022
|
}
|
|
4030
4023
|
)))
|
|
4031
4024
|
);
|
|
@@ -4076,9 +4069,9 @@ var styles30 = reactNative.StyleSheet.create({
|
|
|
4076
4069
|
function LabelValueBase({ label, value, iconName, iconColor, style }) {
|
|
4077
4070
|
const { colors } = useTheme();
|
|
4078
4071
|
const resolvedIcon = iconName ? renderIcon(iconName, ms(14), iconColor ?? colors.foregroundMuted) : null;
|
|
4079
|
-
return /* @__PURE__ */
|
|
4072
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles31.container, style] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles31.labelSide }, resolvedIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles31.icon }, resolvedIcon) : null, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles31.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label)), typeof value === "string" ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles31.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
|
|
4080
4073
|
}
|
|
4081
|
-
var LabelValue =
|
|
4074
|
+
var LabelValue = React55__default.default.memo(LabelValueBase);
|
|
4082
4075
|
var styles31 = reactNative.StyleSheet.create({
|
|
4083
4076
|
container: {
|
|
4084
4077
|
flexDirection: "row",
|
|
@@ -4143,7 +4136,7 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
|
|
|
4143
4136
|
selectionAsync();
|
|
4144
4137
|
onChange(fromIndex(index + 1));
|
|
4145
4138
|
};
|
|
4146
|
-
return /* @__PURE__ */
|
|
4139
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles32.container, style], accessibilityRole: "adjustable", accessibilityLabel: getLabel() }, /* @__PURE__ */ React55__default.default.createElement(
|
|
4147
4140
|
reactNative.TouchableOpacity,
|
|
4148
4141
|
{
|
|
4149
4142
|
style: [styles32.arrow, prevDisabled && styles32.arrowDisabled],
|
|
@@ -4156,8 +4149,8 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
|
|
|
4156
4149
|
accessibilityState: { disabled: prevDisabled },
|
|
4157
4150
|
hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }
|
|
4158
4151
|
},
|
|
4159
|
-
/* @__PURE__ */
|
|
4160
|
-
), /* @__PURE__ */
|
|
4152
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
|
|
4153
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
4161
4154
|
reactNative.Text,
|
|
4162
4155
|
{
|
|
4163
4156
|
style: [styles32.label, { color: colors.foreground }],
|
|
@@ -4165,7 +4158,7 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
|
|
|
4165
4158
|
accessibilityLiveRegion: "polite"
|
|
4166
4159
|
},
|
|
4167
4160
|
getLabel()
|
|
4168
|
-
), /* @__PURE__ */
|
|
4161
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
4169
4162
|
reactNative.TouchableOpacity,
|
|
4170
4163
|
{
|
|
4171
4164
|
style: [styles32.arrow, nextDisabled && styles32.arrowDisabled],
|
|
@@ -4178,7 +4171,7 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
|
|
|
4178
4171
|
accessibilityState: { disabled: nextDisabled },
|
|
4179
4172
|
hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }
|
|
4180
4173
|
},
|
|
4181
|
-
/* @__PURE__ */
|
|
4174
|
+
/* @__PURE__ */ React55__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
|
|
4182
4175
|
));
|
|
4183
4176
|
}
|
|
4184
4177
|
var styles32 = reactNative.StyleSheet.create({
|
|
@@ -4244,7 +4237,7 @@ function MediaCardBase({
|
|
|
4244
4237
|
const ratio = aspectRatioMap2[aspectRatio];
|
|
4245
4238
|
const resolvedActionIcon = actionIconName ? renderIcon(actionIconName, 18, actionActive ? colors.primary : colors.background) : actionIcon ?? renderIcon("heart", 18, actionActive ? colors.primary : colors.background);
|
|
4246
4239
|
const a11yLabel = accessibilityLabel ?? [title, subtitle].filter(Boolean).join(". ");
|
|
4247
|
-
const cardContent = /* @__PURE__ */
|
|
4240
|
+
const cardContent = /* @__PURE__ */ React55__default.default.createElement(
|
|
4248
4241
|
reactNative.View,
|
|
4249
4242
|
{
|
|
4250
4243
|
style: [
|
|
@@ -4254,14 +4247,14 @@ function MediaCardBase({
|
|
|
4254
4247
|
],
|
|
4255
4248
|
...reactNative.Platform.OS === "web" ? hoverHandlers : {}
|
|
4256
4249
|
},
|
|
4257
|
-
/* @__PURE__ */
|
|
4250
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles33.imageContainer, imageStyle] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React55__default.default.createElement(
|
|
4258
4251
|
reactNative.Image,
|
|
4259
4252
|
{
|
|
4260
4253
|
source: imageSource,
|
|
4261
4254
|
style: styles33.image,
|
|
4262
4255
|
resizeMode: "cover"
|
|
4263
4256
|
}
|
|
4264
|
-
) : /* @__PURE__ */
|
|
4257
|
+
) : /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles33.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles33.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React55__default.default.createElement(
|
|
4265
4258
|
reactNative.TouchableOpacity,
|
|
4266
4259
|
{
|
|
4267
4260
|
style: [styles33.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
|
|
@@ -4278,10 +4271,10 @@ function MediaCardBase({
|
|
|
4278
4271
|
},
|
|
4279
4272
|
resolvedActionIcon
|
|
4280
4273
|
)),
|
|
4281
|
-
(title || subtitle || caption || footer) && /* @__PURE__ */
|
|
4274
|
+
(title || subtitle || caption || footer) && /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles33.meta }, title ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles33.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles33.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles33.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
|
|
4282
4275
|
);
|
|
4283
4276
|
if (onPress) {
|
|
4284
|
-
return /* @__PURE__ */
|
|
4277
|
+
return /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: animatedStyle }, /* @__PURE__ */ React55__default.default.createElement(
|
|
4285
4278
|
reactNative.TouchableOpacity,
|
|
4286
4279
|
{
|
|
4287
4280
|
onPress: handlePress,
|
|
@@ -4297,7 +4290,7 @@ function MediaCardBase({
|
|
|
4297
4290
|
}
|
|
4298
4291
|
return cardContent;
|
|
4299
4292
|
}
|
|
4300
|
-
var MediaCard =
|
|
4293
|
+
var MediaCard = React55__default.default.memo(MediaCardBase);
|
|
4301
4294
|
var styles33 = reactNative.StyleSheet.create({
|
|
4302
4295
|
card: {
|
|
4303
4296
|
borderRadius: RADIUS.md,
|
|
@@ -4355,7 +4348,7 @@ var styles33 = reactNative.StyleSheet.create({
|
|
|
4355
4348
|
lineHeight: mvs(16)
|
|
4356
4349
|
}
|
|
4357
4350
|
});
|
|
4358
|
-
var CategoryChip =
|
|
4351
|
+
var CategoryChip = React55__default.default.memo(function CategoryChip2({
|
|
4359
4352
|
item,
|
|
4360
4353
|
selected,
|
|
4361
4354
|
onSelect
|
|
@@ -4366,7 +4359,7 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
|
|
|
4366
4359
|
});
|
|
4367
4360
|
const iconColor = selected ? colors.primaryForeground : colors.foregroundSubtle;
|
|
4368
4361
|
const resolvedIcon = typeof item.icon === "string" ? renderIcon(item.icon, 16, iconColor) : item.icon ?? null;
|
|
4369
|
-
return /* @__PURE__ */
|
|
4362
|
+
return /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: scaleStyle, ...hoverHandlers }, /* @__PURE__ */ React55__default.default.createElement(
|
|
4370
4363
|
reactNative.TouchableOpacity,
|
|
4371
4364
|
{
|
|
4372
4365
|
onPress: () => onSelect(item.value),
|
|
@@ -4378,7 +4371,7 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
|
|
|
4378
4371
|
accessibilityLabel: item.label,
|
|
4379
4372
|
accessibilityState: { selected }
|
|
4380
4373
|
},
|
|
4381
|
-
/* @__PURE__ */
|
|
4374
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
4382
4375
|
reactNativeEase.EaseView,
|
|
4383
4376
|
{
|
|
4384
4377
|
style: styles34.chip,
|
|
@@ -4388,8 +4381,8 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
|
|
|
4388
4381
|
},
|
|
4389
4382
|
transition: COLOR_TRANSITION
|
|
4390
4383
|
},
|
|
4391
|
-
resolvedIcon && /* @__PURE__ */
|
|
4392
|
-
/* @__PURE__ */
|
|
4384
|
+
resolvedIcon && /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles34.chipIcon }, resolvedIcon),
|
|
4385
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
4393
4386
|
reactNative.Text,
|
|
4394
4387
|
{
|
|
4395
4388
|
style: [styles34.chipLabel, { color: selected ? colors.primaryForeground : colors.foregroundSubtle }],
|
|
@@ -4397,7 +4390,7 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
|
|
|
4397
4390
|
},
|
|
4398
4391
|
item.label
|
|
4399
4392
|
),
|
|
4400
|
-
item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */
|
|
4393
|
+
item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles34.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles34.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
|
|
4401
4394
|
)
|
|
4402
4395
|
));
|
|
4403
4396
|
});
|
|
@@ -4411,7 +4404,7 @@ function CategoryStrip({
|
|
|
4411
4404
|
accessibilityLabel
|
|
4412
4405
|
}) {
|
|
4413
4406
|
const selected = Array.isArray(value) ? value : value ? [value] : [];
|
|
4414
|
-
const handlePress =
|
|
4407
|
+
const handlePress = React55.useCallback(
|
|
4415
4408
|
(v) => {
|
|
4416
4409
|
selectionAsync();
|
|
4417
4410
|
if (multiSelect) {
|
|
@@ -4424,7 +4417,7 @@ function CategoryStrip({
|
|
|
4424
4417
|
},
|
|
4425
4418
|
[multiSelect, value, onValueChange]
|
|
4426
4419
|
);
|
|
4427
|
-
return /* @__PURE__ */
|
|
4420
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
4428
4421
|
reactNative.ScrollView,
|
|
4429
4422
|
{
|
|
4430
4423
|
horizontal: true,
|
|
@@ -4434,7 +4427,7 @@ function CategoryStrip({
|
|
|
4434
4427
|
accessibilityRole: multiSelect ? void 0 : "radiogroup",
|
|
4435
4428
|
accessibilityLabel
|
|
4436
4429
|
},
|
|
4437
|
-
categories.map((cat) => /* @__PURE__ */
|
|
4430
|
+
categories.map((cat) => /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { key: cat.value, style: itemStyle }, /* @__PURE__ */ React55__default.default.createElement(
|
|
4438
4431
|
CategoryChip,
|
|
4439
4432
|
{
|
|
4440
4433
|
item: cat,
|
|
@@ -4485,21 +4478,24 @@ var styles34 = reactNative.StyleSheet.create({
|
|
|
4485
4478
|
lineHeight: 14
|
|
4486
4479
|
}
|
|
4487
4480
|
});
|
|
4488
|
-
function
|
|
4481
|
+
function Pressable2({
|
|
4489
4482
|
children,
|
|
4490
4483
|
onPress,
|
|
4491
4484
|
pressScale: _pressScale = PRESS_SCALE.card,
|
|
4492
4485
|
haptics = true,
|
|
4493
4486
|
style,
|
|
4494
4487
|
disabled,
|
|
4495
|
-
hoverScale: _hoverScale = 1.02
|
|
4488
|
+
hoverScale: _hoverScale = 1.02,
|
|
4489
|
+
accessibilityRole,
|
|
4490
|
+
accessibilityState,
|
|
4491
|
+
accessibilityLabel
|
|
4496
4492
|
}) {
|
|
4497
4493
|
const handlePress = () => {
|
|
4498
4494
|
if (disabled || !onPress) return;
|
|
4499
4495
|
if (haptics) impactLight();
|
|
4500
4496
|
onPress();
|
|
4501
4497
|
};
|
|
4502
|
-
return /* @__PURE__ */
|
|
4498
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
4503
4499
|
PressableCard,
|
|
4504
4500
|
{
|
|
4505
4501
|
style,
|
|
@@ -4508,8 +4504,9 @@ function Pressable3({
|
|
|
4508
4504
|
rippleColor: "transparent",
|
|
4509
4505
|
touchSoundDisabled: true,
|
|
4510
4506
|
activateOnHover: true,
|
|
4511
|
-
accessibilityRole: "button",
|
|
4512
|
-
accessibilityState: { disabled: !!disabled }
|
|
4507
|
+
accessibilityRole: accessibilityRole ?? "button",
|
|
4508
|
+
accessibilityState: accessibilityState ?? { disabled: !!disabled },
|
|
4509
|
+
accessibilityLabel
|
|
4513
4510
|
},
|
|
4514
4511
|
children
|
|
4515
4512
|
);
|
|
@@ -4546,23 +4543,23 @@ function DetailRowBase({
|
|
|
4546
4543
|
borderColor: "rgba(128,128,128,0.3)",
|
|
4547
4544
|
marginHorizontal: s(4)
|
|
4548
4545
|
};
|
|
4549
|
-
return /* @__PURE__ */
|
|
4546
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles35.row, style] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles35.labelSide }, resolvedLeftIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedLeftIcon) : null, typeof label === "string" ? /* @__PURE__ */ React55__default.default.createElement(
|
|
4550
4547
|
reactNative.Text,
|
|
4551
4548
|
{
|
|
4552
4549
|
style: [styles35.labelText, { color: colors.foregroundMuted, fontFamily: weightMap[labelWeight] }, labelStyle],
|
|
4553
4550
|
allowFontScaling: true
|
|
4554
4551
|
},
|
|
4555
4552
|
label
|
|
4556
|
-
) : label), separatorStyle ? /* @__PURE__ */
|
|
4553
|
+
) : label), separatorStyle ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: separatorStyle }) : /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles35.spacer }), /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles35.valueSide }, typeof value === "string" ? /* @__PURE__ */ React55__default.default.createElement(
|
|
4557
4554
|
reactNative.Text,
|
|
4558
4555
|
{
|
|
4559
4556
|
style: [styles35.valueText, { color: valueColor ?? colors.foreground }, valueStyle],
|
|
4560
4557
|
allowFontScaling: true
|
|
4561
4558
|
},
|
|
4562
4559
|
value
|
|
4563
|
-
) : value, resolvedRightIcon ? /* @__PURE__ */
|
|
4560
|
+
) : value, resolvedRightIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedRightIcon) : null));
|
|
4564
4561
|
}
|
|
4565
|
-
var DetailRow =
|
|
4562
|
+
var DetailRow = React55__default.default.memo(DetailRowBase);
|
|
4566
4563
|
var styles35 = reactNative.StyleSheet.create({
|
|
4567
4564
|
row: {
|
|
4568
4565
|
flexDirection: "row",
|
|
@@ -4599,7 +4596,7 @@ var styles35 = reactNative.StyleSheet.create({
|
|
|
4599
4596
|
}
|
|
4600
4597
|
});
|
|
4601
4598
|
function Form({ children, style }) {
|
|
4602
|
-
return /* @__PURE__ */
|
|
4599
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles36.form, style] }, children);
|
|
4603
4600
|
}
|
|
4604
4601
|
function FormField({
|
|
4605
4602
|
children,
|
|
@@ -4611,14 +4608,14 @@ function FormField({
|
|
|
4611
4608
|
errorStyle
|
|
4612
4609
|
}) {
|
|
4613
4610
|
const { colors } = useTheme();
|
|
4614
|
-
return /* @__PURE__ */
|
|
4611
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles36.field, style] }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles36.label, { color: colors.foreground }, labelStyle], allowFontScaling: true }, label, required ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: { color: colors.destructive } }, " *") : null) : null, children, error ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles36.error, { color: colors.destructive }, errorStyle], allowFontScaling: true }, error) : null);
|
|
4615
4612
|
}
|
|
4616
4613
|
function FormSection({ children, title, description, style }) {
|
|
4617
4614
|
const { colors } = useTheme();
|
|
4618
|
-
return /* @__PURE__ */
|
|
4615
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles36.section, style] }, title ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles36.sectionHeader }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles36.sectionTitle, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles36.sectionDescription, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null, children);
|
|
4619
4616
|
}
|
|
4620
4617
|
function FormFooter({ children, style }) {
|
|
4621
|
-
return /* @__PURE__ */
|
|
4618
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles36.footer, style] }, children);
|
|
4622
4619
|
}
|
|
4623
4620
|
Form.Field = FormField;
|
|
4624
4621
|
Form.Section = FormSection;
|
|
@@ -4667,7 +4664,7 @@ var defaultKeyExtractor = (item, index) => {
|
|
|
4667
4664
|
return id !== void 0 ? String(id) : String(index);
|
|
4668
4665
|
};
|
|
4669
4666
|
function VirtualListInner({ itemHeight, keyExtractor, renderItem, ...props }, ref) {
|
|
4670
|
-
const getItemLayout =
|
|
4667
|
+
const getItemLayout = React55.useCallback(
|
|
4671
4668
|
(_data, index) => ({
|
|
4672
4669
|
length: itemHeight ?? 0,
|
|
4673
4670
|
offset: (itemHeight ?? 0) * index,
|
|
@@ -4675,7 +4672,7 @@ function VirtualListInner({ itemHeight, keyExtractor, renderItem, ...props }, re
|
|
|
4675
4672
|
}),
|
|
4676
4673
|
[itemHeight]
|
|
4677
4674
|
);
|
|
4678
|
-
return /* @__PURE__ */
|
|
4675
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
4679
4676
|
reactNative.FlatList,
|
|
4680
4677
|
{
|
|
4681
4678
|
ref,
|
|
@@ -4687,9 +4684,9 @@ function VirtualListInner({ itemHeight, keyExtractor, renderItem, ...props }, re
|
|
|
4687
4684
|
}
|
|
4688
4685
|
);
|
|
4689
4686
|
}
|
|
4690
|
-
var VirtualList =
|
|
4687
|
+
var VirtualList = React55__default.default.forwardRef(VirtualListInner);
|
|
4691
4688
|
function RetrayProvider({ children, theme, colorScheme = "system" }) {
|
|
4692
|
-
return /* @__PURE__ */
|
|
4689
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNativeSafeAreaContext.SafeAreaProvider, { initialMetrics: reactNativeSafeAreaContext.initialWindowMetrics }, /* @__PURE__ */ React55__default.default.createElement(reactNativeGestureHandler.GestureHandlerRootView, { style: styles37.root }, /* @__PURE__ */ React55__default.default.createElement(ThemeProvider, { theme, colorScheme }, /* @__PURE__ */ React55__default.default.createElement(bottomSheet.BottomSheetModalProvider, null, /* @__PURE__ */ React55__default.default.createElement(ToastProvider, null, children)))));
|
|
4693
4690
|
}
|
|
4694
4691
|
var styles37 = reactNative.StyleSheet.create({
|
|
4695
4692
|
root: { flex: 1 }
|
|
@@ -4701,7 +4698,7 @@ function DefaultErrorFallback({
|
|
|
4701
4698
|
message
|
|
4702
4699
|
}) {
|
|
4703
4700
|
const { colors } = useTheme();
|
|
4704
|
-
return /* @__PURE__ */
|
|
4701
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles38.container, { backgroundColor: colors.background }], accessibilityRole: "alert" }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles38.iconCircle, { backgroundColor: colors.destructiveTint }] }, renderIcon("alert-triangle", ms(28), colors.destructive)), /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles38.title, { color: colors.foreground }], allowFontScaling: true }, title), /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles38.message, { color: colors.foregroundMuted }], allowFontScaling: true }, message ?? error.message ?? "An unexpected error occurred."), /* @__PURE__ */ React55__default.default.createElement(
|
|
4705
4702
|
reactNative.TouchableOpacity,
|
|
4706
4703
|
{
|
|
4707
4704
|
style: [styles38.button, { backgroundColor: colors.primary }],
|
|
@@ -4714,10 +4711,10 @@ function DefaultErrorFallback({
|
|
|
4714
4711
|
accessibilityRole: "button",
|
|
4715
4712
|
accessibilityLabel: "Try again"
|
|
4716
4713
|
},
|
|
4717
|
-
/* @__PURE__ */
|
|
4714
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles38.buttonLabel, { color: colors.primaryForeground }], allowFontScaling: true }, "Try again")
|
|
4718
4715
|
));
|
|
4719
4716
|
}
|
|
4720
|
-
var ErrorBoundary = class extends
|
|
4717
|
+
var ErrorBoundary = class extends React55__default.default.Component {
|
|
4721
4718
|
constructor() {
|
|
4722
4719
|
super(...arguments);
|
|
4723
4720
|
this.state = { error: null };
|
|
@@ -4741,7 +4738,7 @@ var ErrorBoundary = class extends React25__default.default.Component {
|
|
|
4741
4738
|
if (fallback !== void 0) {
|
|
4742
4739
|
return fallback;
|
|
4743
4740
|
}
|
|
4744
|
-
return /* @__PURE__ */
|
|
4741
|
+
return /* @__PURE__ */ React55__default.default.createElement(DefaultErrorFallback, { error, reset: this.reset, title, message });
|
|
4745
4742
|
}
|
|
4746
4743
|
return this.props.children;
|
|
4747
4744
|
}
|
|
@@ -4790,20 +4787,20 @@ var styles38 = reactNative.StyleSheet.create({
|
|
|
4790
4787
|
});
|
|
4791
4788
|
function Dot({ active, size, activeColor, inactiveColor, onPress, index, total }) {
|
|
4792
4789
|
const progress = Animated12.useSharedValue(active ? 1 : 0);
|
|
4793
|
-
|
|
4790
|
+
React55.useEffect(() => {
|
|
4794
4791
|
progress.value = Animated12.withSpring(active ? 1 : 0, SPRINGS.glide);
|
|
4795
4792
|
}, [active, progress]);
|
|
4796
4793
|
const animatedStyle = Animated12.useAnimatedStyle(() => ({
|
|
4797
4794
|
width: size + progress.value * size * 1.5,
|
|
4798
4795
|
backgroundColor: Animated12.interpolateColor(progress.value, [0, 1], [inactiveColor, activeColor])
|
|
4799
4796
|
}));
|
|
4800
|
-
const dot = /* @__PURE__ */
|
|
4797
|
+
const dot = /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [{ height: size, borderRadius: size / 2 }, animatedStyle] });
|
|
4801
4798
|
if (!onPress) return dot;
|
|
4802
4799
|
const handlePress = () => {
|
|
4803
4800
|
selectionAsync();
|
|
4804
4801
|
onPress();
|
|
4805
4802
|
};
|
|
4806
|
-
return /* @__PURE__ */
|
|
4803
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
4807
4804
|
reactNative.TouchableOpacity,
|
|
4808
4805
|
{
|
|
4809
4806
|
onPress: handlePress,
|
|
@@ -4852,14 +4849,14 @@ function PagerDots({
|
|
|
4852
4849
|
onDotPress(activeIndex + 1);
|
|
4853
4850
|
}
|
|
4854
4851
|
};
|
|
4855
|
-
return /* @__PURE__ */
|
|
4852
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
4856
4853
|
reactNative.View,
|
|
4857
4854
|
{
|
|
4858
4855
|
style: [styles39.container, { gap: s(spacing) }, style],
|
|
4859
4856
|
accessibilityRole: "adjustable",
|
|
4860
4857
|
accessibilityLabel: `Page ${activeIndex + 1} of ${count}`
|
|
4861
4858
|
},
|
|
4862
|
-
hasControls && /* @__PURE__ */
|
|
4859
|
+
hasControls && /* @__PURE__ */ React55__default.default.createElement(
|
|
4863
4860
|
reactNative.TouchableOpacity,
|
|
4864
4861
|
{
|
|
4865
4862
|
onPress: handlePrevious,
|
|
@@ -4873,7 +4870,7 @@ function PagerDots({
|
|
|
4873
4870
|
},
|
|
4874
4871
|
renderIcon("chevron-left", s(18), canGoPrev ? colors.foreground : colors.foregroundMuted)
|
|
4875
4872
|
),
|
|
4876
|
-
/* @__PURE__ */
|
|
4873
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles39.dotsRow, { gap: s(spacing) }] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React55__default.default.createElement(
|
|
4877
4874
|
Dot,
|
|
4878
4875
|
{
|
|
4879
4876
|
key: i,
|
|
@@ -4886,7 +4883,7 @@ function PagerDots({
|
|
|
4886
4883
|
onPress: onDotPress ? () => onDotPress(i) : void 0
|
|
4887
4884
|
}
|
|
4888
4885
|
))),
|
|
4889
|
-
hasControls && /* @__PURE__ */
|
|
4886
|
+
hasControls && /* @__PURE__ */ React55__default.default.createElement(
|
|
4890
4887
|
reactNative.TouchableOpacity,
|
|
4891
4888
|
{
|
|
4892
4889
|
onPress: handleNext,
|
|
@@ -4937,7 +4934,7 @@ function AppHeader({
|
|
|
4937
4934
|
const { width } = reactNative.useWindowDimensions();
|
|
4938
4935
|
const isWide = width >= BREAKPOINTS.wide;
|
|
4939
4936
|
const centered = titleAlign === "center" || titleAlign === "auto" && isWide;
|
|
4940
|
-
const leftNode = left ?? (onBack ? /* @__PURE__ */
|
|
4937
|
+
const leftNode = left ?? (onBack ? /* @__PURE__ */ React55__default.default.createElement(
|
|
4941
4938
|
IconButton,
|
|
4942
4939
|
{
|
|
4943
4940
|
iconName: backIconName,
|
|
@@ -4947,7 +4944,7 @@ function AppHeader({
|
|
|
4947
4944
|
accessibilityLabel: "Go back"
|
|
4948
4945
|
}
|
|
4949
4946
|
) : null);
|
|
4950
|
-
const titleBlock = /* @__PURE__ */
|
|
4947
|
+
const titleBlock = /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles40.titleBlock, centered && styles40.titleBlockCentered], pointerEvents: "none" }, title ? /* @__PURE__ */ React55__default.default.createElement(
|
|
4951
4948
|
reactNative.Text,
|
|
4952
4949
|
{
|
|
4953
4950
|
style: [styles40.title, { color: colors.foreground }, centered && styles40.textCentered],
|
|
@@ -4956,7 +4953,7 @@ function AppHeader({
|
|
|
4956
4953
|
accessibilityRole: "header"
|
|
4957
4954
|
},
|
|
4958
4955
|
title
|
|
4959
|
-
) : null, subtitle ? /* @__PURE__ */
|
|
4956
|
+
) : null, subtitle ? /* @__PURE__ */ React55__default.default.createElement(
|
|
4960
4957
|
reactNative.Text,
|
|
4961
4958
|
{
|
|
4962
4959
|
style: [styles40.subtitle, { color: colors.foregroundMuted }, centered && styles40.textCentered],
|
|
@@ -4965,7 +4962,7 @@ function AppHeader({
|
|
|
4965
4962
|
},
|
|
4966
4963
|
subtitle
|
|
4967
4964
|
) : null);
|
|
4968
|
-
return /* @__PURE__ */
|
|
4965
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
4969
4966
|
reactNative.View,
|
|
4970
4967
|
{
|
|
4971
4968
|
style: [
|
|
@@ -4979,7 +4976,7 @@ function AppHeader({
|
|
|
4979
4976
|
style
|
|
4980
4977
|
]
|
|
4981
4978
|
},
|
|
4982
|
-
/* @__PURE__ */
|
|
4979
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles40.bar }, centered ? /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, titleBlock), /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles40.side }, leftNode), /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles40.side, styles40.sideRight] }, right)) : /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles40.side }, leftNode), titleBlock, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles40.side, styles40.sideRight] }, right)))
|
|
4983
4980
|
);
|
|
4984
4981
|
}
|
|
4985
4982
|
var styles40 = reactNative.StyleSheet.create({
|
|
@@ -5036,7 +5033,7 @@ function Cell({ item, selected, width, onPress }) {
|
|
|
5036
5033
|
});
|
|
5037
5034
|
const iconColor = selected ? colors.primary : colors.foregroundSubtle;
|
|
5038
5035
|
const iconNode = item.icon ?? (item.iconName ? renderIcon(item.iconName, ms(24), iconColor) : null);
|
|
5039
|
-
return /* @__PURE__ */
|
|
5036
|
+
return /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [{ width }, animatedStyle] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
5040
5037
|
reactNative.TouchableOpacity,
|
|
5041
5038
|
{
|
|
5042
5039
|
onPress,
|
|
@@ -5059,7 +5056,7 @@ function Cell({ item, selected, width, onPress }) {
|
|
|
5059
5056
|
]
|
|
5060
5057
|
},
|
|
5061
5058
|
iconNode,
|
|
5062
|
-
item.label ? /* @__PURE__ */
|
|
5059
|
+
item.label ? /* @__PURE__ */ React55__default.default.createElement(
|
|
5063
5060
|
reactNative.Text,
|
|
5064
5061
|
{
|
|
5065
5062
|
style: [styles41.label, { color: selected ? colors.primary : colors.foreground }],
|
|
@@ -5080,7 +5077,7 @@ function SelectableGrid({
|
|
|
5080
5077
|
orientation = "grid",
|
|
5081
5078
|
style
|
|
5082
5079
|
}) {
|
|
5083
|
-
const [containerWidth, setContainerWidth] =
|
|
5080
|
+
const [containerWidth, setContainerWidth] = React55.useState(0);
|
|
5084
5081
|
const gapPx = s(gap);
|
|
5085
5082
|
const cellWidth = containerWidth > 0 ? (containerWidth - gapPx * (numColumns - 1)) / numColumns - 0.5 : 0;
|
|
5086
5083
|
const horizCellWidth = s(72);
|
|
@@ -5090,7 +5087,7 @@ function SelectableGrid({
|
|
|
5090
5087
|
onChange(item.value);
|
|
5091
5088
|
};
|
|
5092
5089
|
if (orientation === "horizontal") {
|
|
5093
|
-
return /* @__PURE__ */
|
|
5090
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5094
5091
|
reactNative.ScrollView,
|
|
5095
5092
|
{
|
|
5096
5093
|
horizontal: true,
|
|
@@ -5098,7 +5095,7 @@ function SelectableGrid({
|
|
|
5098
5095
|
contentContainerStyle: [styles41.horizontal, { gap: gapPx }, style],
|
|
5099
5096
|
accessibilityRole: multiple ? void 0 : "radiogroup"
|
|
5100
5097
|
},
|
|
5101
|
-
items.map((item) => /* @__PURE__ */
|
|
5098
|
+
items.map((item) => /* @__PURE__ */ React55__default.default.createElement(
|
|
5102
5099
|
Cell,
|
|
5103
5100
|
{
|
|
5104
5101
|
key: String(item.value),
|
|
@@ -5110,14 +5107,14 @@ function SelectableGrid({
|
|
|
5110
5107
|
))
|
|
5111
5108
|
);
|
|
5112
5109
|
}
|
|
5113
|
-
return /* @__PURE__ */
|
|
5110
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5114
5111
|
reactNative.View,
|
|
5115
5112
|
{
|
|
5116
5113
|
style: [styles41.grid, { gap: gapPx }, style],
|
|
5117
5114
|
onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width),
|
|
5118
5115
|
accessibilityRole: multiple ? void 0 : "radiogroup"
|
|
5119
5116
|
},
|
|
5120
|
-
cellWidth > 0 ? items.map((item) => /* @__PURE__ */
|
|
5117
|
+
cellWidth > 0 ? items.map((item) => /* @__PURE__ */ React55__default.default.createElement(
|
|
5121
5118
|
Cell,
|
|
5122
5119
|
{
|
|
5123
5120
|
key: String(item.value),
|
|
@@ -5158,6 +5155,230 @@ var styles41 = reactNative.StyleSheet.create({
|
|
|
5158
5155
|
textAlign: "center"
|
|
5159
5156
|
}
|
|
5160
5157
|
});
|
|
5158
|
+
var SelectableCardContext = React55.createContext(null);
|
|
5159
|
+
function SelectableCardGroup({
|
|
5160
|
+
type,
|
|
5161
|
+
value,
|
|
5162
|
+
onValueChange,
|
|
5163
|
+
variant = "elevated",
|
|
5164
|
+
gap = s(8),
|
|
5165
|
+
style,
|
|
5166
|
+
children
|
|
5167
|
+
}) {
|
|
5168
|
+
return /* @__PURE__ */ React55__default.default.createElement(SelectableCardContext.Provider, { value: { type, value, onValueChange, variant } }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles42.group, { gap }, style] }, children));
|
|
5169
|
+
}
|
|
5170
|
+
function SelectableCard({
|
|
5171
|
+
value,
|
|
5172
|
+
title,
|
|
5173
|
+
description,
|
|
5174
|
+
iconName,
|
|
5175
|
+
icon,
|
|
5176
|
+
disabled = false,
|
|
5177
|
+
style
|
|
5178
|
+
}) {
|
|
5179
|
+
const ctx = React55.useContext(SelectableCardContext);
|
|
5180
|
+
if (!ctx) {
|
|
5181
|
+
throw new Error("SelectableCard must be used inside <SelectableCard.Group>");
|
|
5182
|
+
}
|
|
5183
|
+
const { colors } = useTheme();
|
|
5184
|
+
const { type, value: selectedValue, onValueChange, variant } = ctx;
|
|
5185
|
+
const isSelected2 = type === "radio" ? selectedValue === value : Array.isArray(selectedValue) && selectedValue.includes(value);
|
|
5186
|
+
const handlePress = () => {
|
|
5187
|
+
if (disabled) return;
|
|
5188
|
+
impactLight();
|
|
5189
|
+
if (type === "radio") {
|
|
5190
|
+
onValueChange(value);
|
|
5191
|
+
} else {
|
|
5192
|
+
const arr = Array.isArray(selectedValue) ? selectedValue : [];
|
|
5193
|
+
if (arr.includes(value)) {
|
|
5194
|
+
onValueChange(arr.filter((v) => v !== value));
|
|
5195
|
+
} else {
|
|
5196
|
+
onValueChange([...arr, value]);
|
|
5197
|
+
}
|
|
5198
|
+
}
|
|
5199
|
+
};
|
|
5200
|
+
const variantStyle = (() => {
|
|
5201
|
+
const borderWidth = 2;
|
|
5202
|
+
const base = {
|
|
5203
|
+
elevated: {
|
|
5204
|
+
backgroundColor: colors.card,
|
|
5205
|
+
borderWidth,
|
|
5206
|
+
borderColor: "transparent"
|
|
5207
|
+
// reserve space for selected border
|
|
5208
|
+
},
|
|
5209
|
+
outlined: {
|
|
5210
|
+
backgroundColor: colors.card,
|
|
5211
|
+
borderWidth,
|
|
5212
|
+
borderColor: colors.border
|
|
5213
|
+
},
|
|
5214
|
+
filled: {
|
|
5215
|
+
backgroundColor: colors.surfaceStrong,
|
|
5216
|
+
borderWidth,
|
|
5217
|
+
borderColor: colors.border
|
|
5218
|
+
}
|
|
5219
|
+
}[variant];
|
|
5220
|
+
if (isSelected2 && !disabled) {
|
|
5221
|
+
return {
|
|
5222
|
+
...base,
|
|
5223
|
+
borderColor: colors.primary,
|
|
5224
|
+
shadowColor: "transparent",
|
|
5225
|
+
shadowOpacity: 0,
|
|
5226
|
+
shadowRadius: 0,
|
|
5227
|
+
elevation: 0
|
|
5228
|
+
};
|
|
5229
|
+
}
|
|
5230
|
+
if (disabled) {
|
|
5231
|
+
return {
|
|
5232
|
+
...base,
|
|
5233
|
+
shadowColor: "transparent",
|
|
5234
|
+
shadowOpacity: 0,
|
|
5235
|
+
shadowRadius: 0,
|
|
5236
|
+
elevation: 0,
|
|
5237
|
+
borderColor: colors.border
|
|
5238
|
+
};
|
|
5239
|
+
}
|
|
5240
|
+
return base;
|
|
5241
|
+
})();
|
|
5242
|
+
const resolvedIcon = iconName ? renderIcon(iconName, ms(22), disabled ? colors.foregroundMuted : colors.foregroundMuted) : icon;
|
|
5243
|
+
const resolvedIconElement = resolvedIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles42.iconWrapper, disabled && { opacity: 0.45 }] }, resolvedIcon) : null;
|
|
5244
|
+
const selectorAccessibilityRole = type === "radio" ? "radio" : "checkbox";
|
|
5245
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5246
|
+
reactNative.Pressable,
|
|
5247
|
+
{
|
|
5248
|
+
onPress: handlePress,
|
|
5249
|
+
disabled,
|
|
5250
|
+
accessibilityRole: "button",
|
|
5251
|
+
accessibilityLabel: `${title}${description ? `, ${description}` : ""}`,
|
|
5252
|
+
accessibilityState: { selected: isSelected2, disabled },
|
|
5253
|
+
style: [
|
|
5254
|
+
styles42.card,
|
|
5255
|
+
variantStyle,
|
|
5256
|
+
isSelected2 && !disabled && styles42.cardSelected,
|
|
5257
|
+
style
|
|
5258
|
+
]
|
|
5259
|
+
},
|
|
5260
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles42.row }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles42.selectorContainer, accessibilityRole: selectorAccessibilityRole, accessibilityState: { selected: isSelected2, disabled } }, type === "radio" ? /* @__PURE__ */ React55__default.default.createElement(
|
|
5261
|
+
reactNativeEase.EaseView,
|
|
5262
|
+
{
|
|
5263
|
+
style: styles42.radioCircle,
|
|
5264
|
+
animate: { borderColor: !disabled && isSelected2 ? colors.primary : colors.border },
|
|
5265
|
+
transition: COLOR_TRANSITION
|
|
5266
|
+
},
|
|
5267
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
5268
|
+
reactNativeEase.EaseView,
|
|
5269
|
+
{
|
|
5270
|
+
animate: {
|
|
5271
|
+
scale: !disabled && isSelected2 ? 1 : 0,
|
|
5272
|
+
opacity: !disabled && isSelected2 ? 1 : 0
|
|
5273
|
+
},
|
|
5274
|
+
transition: SPRING_ELASTIC
|
|
5275
|
+
},
|
|
5276
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles42.radioDot, { backgroundColor: colors.primary }] })
|
|
5277
|
+
)
|
|
5278
|
+
) : /* @__PURE__ */ React55__default.default.createElement(
|
|
5279
|
+
reactNativeEase.EaseView,
|
|
5280
|
+
{
|
|
5281
|
+
style: styles42.checkboxBox,
|
|
5282
|
+
animate: {
|
|
5283
|
+
borderColor: !disabled && isSelected2 ? colors.primary : colors.border,
|
|
5284
|
+
backgroundColor: !disabled && isSelected2 ? colors.primary : "transparent"
|
|
5285
|
+
},
|
|
5286
|
+
transition: COLOR_TRANSITION
|
|
5287
|
+
},
|
|
5288
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
5289
|
+
reactNativeEase.EaseView,
|
|
5290
|
+
{
|
|
5291
|
+
animate: { opacity: !disabled && isSelected2 ? 1 : 0 },
|
|
5292
|
+
transition: OPACITY_TRANSITION
|
|
5293
|
+
},
|
|
5294
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles42.checkmark, { borderColor: colors.primaryForeground }] })
|
|
5295
|
+
)
|
|
5296
|
+
)), resolvedIconElement, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles42.textArea }, /* @__PURE__ */ React55__default.default.createElement(
|
|
5297
|
+
reactNative.Text,
|
|
5298
|
+
{
|
|
5299
|
+
style: [styles42.title, { color: disabled ? colors.foregroundMuted : colors.foreground }],
|
|
5300
|
+
allowFontScaling: true,
|
|
5301
|
+
numberOfLines: 2
|
|
5302
|
+
},
|
|
5303
|
+
title
|
|
5304
|
+
), description ? /* @__PURE__ */ React55__default.default.createElement(
|
|
5305
|
+
reactNative.Text,
|
|
5306
|
+
{
|
|
5307
|
+
style: [styles42.description, { color: disabled ? colors.foregroundMuted : colors.foregroundSubtle }],
|
|
5308
|
+
allowFontScaling: true,
|
|
5309
|
+
numberOfLines: 4
|
|
5310
|
+
},
|
|
5311
|
+
description
|
|
5312
|
+
) : null))
|
|
5313
|
+
);
|
|
5314
|
+
}
|
|
5315
|
+
var styles42 = reactNative.StyleSheet.create({
|
|
5316
|
+
group: {
|
|
5317
|
+
width: "100%"
|
|
5318
|
+
},
|
|
5319
|
+
card: {
|
|
5320
|
+
borderRadius: RADIUS.md,
|
|
5321
|
+
borderWidth: 1
|
|
5322
|
+
},
|
|
5323
|
+
cardSelected: {
|
|
5324
|
+
backgroundColor: void 0
|
|
5325
|
+
// overridden by variantStyle
|
|
5326
|
+
},
|
|
5327
|
+
row: {
|
|
5328
|
+
flexDirection: "row",
|
|
5329
|
+
alignItems: "flex-start",
|
|
5330
|
+
padding: s(16),
|
|
5331
|
+
gap: s(12)
|
|
5332
|
+
},
|
|
5333
|
+
selectorContainer: {
|
|
5334
|
+
paddingTop: vs(1)
|
|
5335
|
+
},
|
|
5336
|
+
radioCircle: {
|
|
5337
|
+
width: s(24),
|
|
5338
|
+
height: s(24),
|
|
5339
|
+
borderRadius: s(12),
|
|
5340
|
+
borderWidth: 2,
|
|
5341
|
+
alignItems: "center",
|
|
5342
|
+
justifyContent: "center"
|
|
5343
|
+
},
|
|
5344
|
+
radioDot: {
|
|
5345
|
+
width: s(10),
|
|
5346
|
+
height: s(10),
|
|
5347
|
+
borderRadius: s(5)
|
|
5348
|
+
},
|
|
5349
|
+
checkboxBox: {
|
|
5350
|
+
width: s(24),
|
|
5351
|
+
height: s(24),
|
|
5352
|
+
borderRadius: ms(4),
|
|
5353
|
+
borderWidth: 2,
|
|
5354
|
+
alignItems: "center",
|
|
5355
|
+
justifyContent: "center"
|
|
5356
|
+
},
|
|
5357
|
+
checkmark: {
|
|
5358
|
+
width: s(12),
|
|
5359
|
+
height: vs(7),
|
|
5360
|
+
borderLeftWidth: 2,
|
|
5361
|
+
borderBottomWidth: 2,
|
|
5362
|
+
transform: [{ rotate: "-45deg" }, { translateY: -1 }]
|
|
5363
|
+
},
|
|
5364
|
+
iconWrapper: {
|
|
5365
|
+
paddingTop: vs(1)
|
|
5366
|
+
},
|
|
5367
|
+
textArea: {
|
|
5368
|
+
flex: 1,
|
|
5369
|
+
gap: vs(4)
|
|
5370
|
+
},
|
|
5371
|
+
title: {
|
|
5372
|
+
fontFamily: "Sohne-SemiBold",
|
|
5373
|
+
fontSize: ms(16),
|
|
5374
|
+
lineHeight: mvs(22)
|
|
5375
|
+
},
|
|
5376
|
+
description: {
|
|
5377
|
+
fontFamily: "Sohne-Regular",
|
|
5378
|
+
fontSize: ms(13),
|
|
5379
|
+
lineHeight: mvs(18)
|
|
5380
|
+
}
|
|
5381
|
+
});
|
|
5161
5382
|
var normalize = (f) => typeof f === "string" ? { label: f, included: true } : { included: true, ...f };
|
|
5162
5383
|
function PricingCard({
|
|
5163
5384
|
name,
|
|
@@ -5173,11 +5394,11 @@ function PricingCard({
|
|
|
5173
5394
|
style
|
|
5174
5395
|
}) {
|
|
5175
5396
|
const { colors } = useTheme();
|
|
5176
|
-
return /* @__PURE__ */
|
|
5397
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5177
5398
|
reactNative.View,
|
|
5178
5399
|
{
|
|
5179
5400
|
style: [
|
|
5180
|
-
|
|
5401
|
+
styles43.card,
|
|
5181
5402
|
{
|
|
5182
5403
|
backgroundColor: colors.card,
|
|
5183
5404
|
borderColor: highlighted ? colors.primary : colors.border,
|
|
@@ -5188,39 +5409,39 @@ function PricingCard({
|
|
|
5188
5409
|
],
|
|
5189
5410
|
accessibilityRole: "summary"
|
|
5190
5411
|
},
|
|
5191
|
-
/* @__PURE__ */
|
|
5192
|
-
/* @__PURE__ */
|
|
5193
|
-
description ? /* @__PURE__ */
|
|
5194
|
-
features.length > 0 ? /* @__PURE__ */
|
|
5412
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles43.header }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles43.name, { color: colors.foreground }], allowFontScaling: true }, name), badge ? /* @__PURE__ */ React55__default.default.createElement(Badge, { label: badge, variant: highlighted ? "default" : "secondary", size: "sm" }) : null),
|
|
5413
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles43.priceRow }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles43.price, { color: colors.foreground }], allowFontScaling: true }, price), period ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles43.period, { color: colors.foregroundMuted }], allowFontScaling: true }, period) : null),
|
|
5414
|
+
description ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles43.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null,
|
|
5415
|
+
features.length > 0 ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles43.features }, features.map(normalize).map((f, i) => /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { key: i, style: styles43.featureRow }, renderIcon(
|
|
5195
5416
|
f.included ? "check" : "minus",
|
|
5196
5417
|
ms(16),
|
|
5197
5418
|
f.included ? colors.success : colors.foregroundMuted
|
|
5198
|
-
), /* @__PURE__ */
|
|
5419
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
5199
5420
|
reactNative.Text,
|
|
5200
5421
|
{
|
|
5201
5422
|
style: [
|
|
5202
|
-
|
|
5423
|
+
styles43.featureLabel,
|
|
5203
5424
|
{ color: f.included ? colors.foreground : colors.foregroundMuted },
|
|
5204
|
-
!f.included &&
|
|
5425
|
+
!f.included && styles43.featureExcluded
|
|
5205
5426
|
],
|
|
5206
5427
|
allowFontScaling: true
|
|
5207
5428
|
},
|
|
5208
5429
|
f.label
|
|
5209
5430
|
)))) : null,
|
|
5210
|
-
ctaLabel ? /* @__PURE__ */
|
|
5431
|
+
ctaLabel ? /* @__PURE__ */ React55__default.default.createElement(
|
|
5211
5432
|
Button,
|
|
5212
5433
|
{
|
|
5213
5434
|
label: ctaLabel,
|
|
5214
5435
|
variant: highlighted ? "primary" : "secondary",
|
|
5215
5436
|
fullWidth: true,
|
|
5216
5437
|
onPress: onCtaPress,
|
|
5217
|
-
style:
|
|
5438
|
+
style: styles43.cta
|
|
5218
5439
|
}
|
|
5219
5440
|
) : null,
|
|
5220
|
-
footnote ? /* @__PURE__ */
|
|
5441
|
+
footnote ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles43.footnote, { color: colors.foregroundMuted }], allowFontScaling: true }, footnote) : null
|
|
5221
5442
|
);
|
|
5222
5443
|
}
|
|
5223
|
-
var
|
|
5444
|
+
var styles43 = reactNative.StyleSheet.create({
|
|
5224
5445
|
card: {
|
|
5225
5446
|
borderRadius: RADIUS.md,
|
|
5226
5447
|
padding: s(16),
|
|
@@ -5299,11 +5520,11 @@ function TabBar({
|
|
|
5299
5520
|
const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
|
|
5300
5521
|
const resolvedActive = activeColor ?? colors.primary;
|
|
5301
5522
|
const resolvedInactive = inactiveColor ?? colors.foregroundMuted;
|
|
5302
|
-
return /* @__PURE__ */
|
|
5523
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5303
5524
|
reactNative.View,
|
|
5304
5525
|
{
|
|
5305
5526
|
style: [
|
|
5306
|
-
|
|
5527
|
+
styles44.container,
|
|
5307
5528
|
{
|
|
5308
5529
|
backgroundColor: colors.card,
|
|
5309
5530
|
borderTopColor: colors.border,
|
|
@@ -5319,11 +5540,11 @@ function TabBar({
|
|
|
5319
5540
|
const iconNode = item.icon ?? (item.iconName ? renderIcon(item.iconName, ms(24), tint) : null);
|
|
5320
5541
|
const showBadge = item.badge !== void 0 && item.badge !== false;
|
|
5321
5542
|
const badgeCount = typeof item.badge === "number" ? item.badge : void 0;
|
|
5322
|
-
return /* @__PURE__ */
|
|
5543
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5323
5544
|
reactNative.TouchableOpacity,
|
|
5324
5545
|
{
|
|
5325
5546
|
key: item.key,
|
|
5326
|
-
style:
|
|
5547
|
+
style: styles44.tab,
|
|
5327
5548
|
onPress: () => {
|
|
5328
5549
|
if (!active) selectionAsync();
|
|
5329
5550
|
onTabPress(item.key);
|
|
@@ -5334,23 +5555,23 @@ function TabBar({
|
|
|
5334
5555
|
accessibilityState: { selected: active },
|
|
5335
5556
|
accessibilityLabel: item.label ?? item.key
|
|
5336
5557
|
},
|
|
5337
|
-
/* @__PURE__ */
|
|
5558
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, null, iconNode, showBadge ? /* @__PURE__ */ React55__default.default.createElement(
|
|
5338
5559
|
reactNative.View,
|
|
5339
5560
|
{
|
|
5340
5561
|
style: [
|
|
5341
|
-
|
|
5562
|
+
styles44.badge,
|
|
5342
5563
|
{ backgroundColor: colors.destructive, borderColor: colors.card },
|
|
5343
|
-
badgeCount === void 0 &&
|
|
5564
|
+
badgeCount === void 0 && styles44.badgeDot
|
|
5344
5565
|
]
|
|
5345
5566
|
},
|
|
5346
|
-
badgeCount !== void 0 ? /* @__PURE__ */
|
|
5567
|
+
badgeCount !== void 0 ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles44.badgeText, { color: colors.destructiveForeground }], allowFontScaling: false }, badgeCount > 99 ? "99+" : badgeCount) : null
|
|
5347
5568
|
) : null),
|
|
5348
|
-
item.label ? /* @__PURE__ */
|
|
5569
|
+
item.label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles44.label, { color: tint }], numberOfLines: 1, allowFontScaling: true }, item.label) : null
|
|
5349
5570
|
);
|
|
5350
5571
|
})
|
|
5351
5572
|
);
|
|
5352
5573
|
}
|
|
5353
|
-
var
|
|
5574
|
+
var styles44 = reactNative.StyleSheet.create({
|
|
5354
5575
|
container: {
|
|
5355
5576
|
flexDirection: "row",
|
|
5356
5577
|
borderTopWidth: reactNative.StyleSheet.hairlineWidth
|
|
@@ -5404,7 +5625,7 @@ function ZoomableImage({ source, width, height, onZoomChange }) {
|
|
|
5404
5625
|
const translateY = Animated12.useSharedValue(0);
|
|
5405
5626
|
const savedX = Animated12.useSharedValue(0);
|
|
5406
5627
|
const savedY = Animated12.useSharedValue(0);
|
|
5407
|
-
const reportZoom =
|
|
5628
|
+
const reportZoom = React55.useCallback((zoomed) => onZoomChange(zoomed), [onZoomChange]);
|
|
5408
5629
|
const reset = () => {
|
|
5409
5630
|
"worklet";
|
|
5410
5631
|
scale2.value = Animated12.withTiming(1);
|
|
@@ -5450,17 +5671,17 @@ function ZoomableImage({ source, width, height, onZoomChange }) {
|
|
|
5450
5671
|
{ scale: scale2.value }
|
|
5451
5672
|
]
|
|
5452
5673
|
}));
|
|
5453
|
-
return /* @__PURE__ */
|
|
5674
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: composed }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [{ width, height }, styles45.imageWrap], collapsable: false }, /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [{ width, height }, animatedStyle] }, /* @__PURE__ */ React55__default.default.createElement(reactNative.Image, { source, style: { width, height }, resizeMode: "contain" }))));
|
|
5454
5675
|
}
|
|
5455
5676
|
function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
5456
5677
|
const window = reactNative.useWindowDimensions();
|
|
5457
5678
|
const width = window.width > 0 ? window.width : reactNative.Dimensions.get("window").width;
|
|
5458
5679
|
const height = window.height > 0 ? window.height : reactNative.Dimensions.get("window").height;
|
|
5459
5680
|
const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
|
|
5460
|
-
const [index, setIndex] =
|
|
5461
|
-
const [pagingEnabled, setPagingEnabled] =
|
|
5462
|
-
const scrollRef =
|
|
5463
|
-
|
|
5681
|
+
const [index, setIndex] = React55.useState(initialIndex);
|
|
5682
|
+
const [pagingEnabled, setPagingEnabled] = React55.useState(true);
|
|
5683
|
+
const scrollRef = React55__default.default.useRef(null);
|
|
5684
|
+
React55__default.default.useEffect(() => {
|
|
5464
5685
|
if (!visible) return;
|
|
5465
5686
|
const handle = requestAnimationFrame(() => {
|
|
5466
5687
|
setIndex(initialIndex);
|
|
@@ -5471,7 +5692,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
|
5471
5692
|
}, [visible, initialIndex, width]);
|
|
5472
5693
|
const dragY = Animated12.useSharedValue(0);
|
|
5473
5694
|
const DISMISS_THRESHOLD = height * 0.18;
|
|
5474
|
-
const closeViewer =
|
|
5695
|
+
const closeViewer = React55.useCallback(() => onClose(), [onClose]);
|
|
5475
5696
|
const swipeDown = reactNativeGestureHandler.Gesture.Pan().enabled(pagingEnabled).activeOffsetY(12).failOffsetX([-16, 16]).onUpdate((e) => {
|
|
5476
5697
|
dragY.value = Math.max(0, e.translationY);
|
|
5477
5698
|
}).onEnd((e) => {
|
|
@@ -5481,7 +5702,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
|
5481
5702
|
dragY.value = Animated12.withTiming(0);
|
|
5482
5703
|
}
|
|
5483
5704
|
});
|
|
5484
|
-
|
|
5705
|
+
React55__default.default.useEffect(() => {
|
|
5485
5706
|
if (visible) dragY.value = 0;
|
|
5486
5707
|
}, [visible, dragY]);
|
|
5487
5708
|
const dismissStyle = Animated12.useAnimatedStyle(() => ({
|
|
@@ -5498,7 +5719,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
|
5498
5719
|
scrollRef.current?.scrollTo({ x: page * width, animated: true });
|
|
5499
5720
|
setIndex(page);
|
|
5500
5721
|
};
|
|
5501
|
-
return /* @__PURE__ */
|
|
5722
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.Modal, { visible, transparent: false, animationType: "fade", onRequestClose: onClose, statusBarTranslucent: true }, /* @__PURE__ */ React55__default.default.createElement(reactNativeGestureHandler.GestureHandlerRootView, { style: styles45.root }, /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [styles45.backdrop, backdropStyle], pointerEvents: "none" }), /* @__PURE__ */ React55__default.default.createElement(Animated12__default.default.View, { style: [styles45.container, dismissStyle] }, /* @__PURE__ */ React55__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: swipeDown }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles45.root, collapsable: false }, /* @__PURE__ */ React55__default.default.createElement(
|
|
5502
5723
|
reactNative.ScrollView,
|
|
5503
5724
|
{
|
|
5504
5725
|
ref: scrollRef,
|
|
@@ -5509,7 +5730,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
|
5509
5730
|
onMomentumScrollEnd: onMomentumEnd,
|
|
5510
5731
|
bounces: false
|
|
5511
5732
|
},
|
|
5512
|
-
images.map((source, i) => /* @__PURE__ */
|
|
5733
|
+
images.map((source, i) => /* @__PURE__ */ React55__default.default.createElement(
|
|
5513
5734
|
ZoomableImage,
|
|
5514
5735
|
{
|
|
5515
5736
|
key: i,
|
|
@@ -5519,7 +5740,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
|
5519
5740
|
onZoomChange: (zoomed) => setPagingEnabled(!zoomed)
|
|
5520
5741
|
}
|
|
5521
5742
|
))
|
|
5522
|
-
))), /* @__PURE__ */
|
|
5743
|
+
))), /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles45.closeButtonWrapper, { top: insets.top + vs(8) }] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
5523
5744
|
IconButton,
|
|
5524
5745
|
{
|
|
5525
5746
|
iconName: "x",
|
|
@@ -5530,7 +5751,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
|
5530
5751
|
onPress: onClose,
|
|
5531
5752
|
accessibilityLabel: "Close"
|
|
5532
5753
|
}
|
|
5533
|
-
)), images.length > 1 ? /* @__PURE__ */
|
|
5754
|
+
)), images.length > 1 ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles45.dots, { bottom: insets.bottom + vs(16) }], pointerEvents: "box-none" }, /* @__PURE__ */ React55__default.default.createElement(
|
|
5534
5755
|
PagerDots,
|
|
5535
5756
|
{
|
|
5536
5757
|
count: images.length,
|
|
@@ -5541,7 +5762,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
|
5541
5762
|
}
|
|
5542
5763
|
)) : null)));
|
|
5543
5764
|
}
|
|
5544
|
-
var
|
|
5765
|
+
var styles45 = reactNative.StyleSheet.create({
|
|
5545
5766
|
root: {
|
|
5546
5767
|
flex: 1
|
|
5547
5768
|
},
|
|
@@ -5580,7 +5801,7 @@ function SheetSelectChip({
|
|
|
5580
5801
|
};
|
|
5581
5802
|
const iconColor = selected ? colors.primaryForeground : colors.foreground;
|
|
5582
5803
|
const resolvedIcon = option.iconName ? renderIcon(option.iconName, ms(13), iconColor) : null;
|
|
5583
|
-
return /* @__PURE__ */
|
|
5804
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5584
5805
|
PressableChip,
|
|
5585
5806
|
{
|
|
5586
5807
|
onPress: option.disabled ? void 0 : handlePress,
|
|
@@ -5590,21 +5811,21 @@ function SheetSelectChip({
|
|
|
5590
5811
|
accessibilityLabel: option.disabled ? `${option.label}, unavailable` : option.label,
|
|
5591
5812
|
accessibilityState: { selected, disabled: option.disabled }
|
|
5592
5813
|
},
|
|
5593
|
-
/* @__PURE__ */
|
|
5814
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
5594
5815
|
reactNativeEase.EaseView,
|
|
5595
5816
|
{
|
|
5596
|
-
style: [
|
|
5817
|
+
style: [styles46.chip, option.disabled && styles46.chipDisabled],
|
|
5597
5818
|
animate: {
|
|
5598
5819
|
backgroundColor: selected ? colors.primary : colors.surface,
|
|
5599
5820
|
borderColor: selected ? colors.primary : colors.border
|
|
5600
5821
|
},
|
|
5601
5822
|
transition: COLOR_TRANSITION
|
|
5602
5823
|
},
|
|
5603
|
-
resolvedIcon ? /* @__PURE__ */
|
|
5604
|
-
/* @__PURE__ */
|
|
5824
|
+
resolvedIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles46.chipIcon }, resolvedIcon) : null,
|
|
5825
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
5605
5826
|
reactNative.Text,
|
|
5606
5827
|
{
|
|
5607
|
-
style: [
|
|
5828
|
+
style: [styles46.chipLabel, { color: selected ? colors.primaryForeground : colors.foreground }],
|
|
5608
5829
|
allowFontScaling: true
|
|
5609
5830
|
},
|
|
5610
5831
|
option.label
|
|
@@ -5638,7 +5859,7 @@ function SheetSelect({
|
|
|
5638
5859
|
const newArray = alreadySelected ? currentArray.filter((v) => v !== optionValue) : [...currentArray, optionValue];
|
|
5639
5860
|
onValueChange?.(newArray);
|
|
5640
5861
|
};
|
|
5641
|
-
const chips = options.map((opt) => /* @__PURE__ */
|
|
5862
|
+
const chips = options.map((opt) => /* @__PURE__ */ React55__default.default.createElement(
|
|
5642
5863
|
SheetSelectChip,
|
|
5643
5864
|
{
|
|
5644
5865
|
key: opt.value,
|
|
@@ -5647,17 +5868,17 @@ function SheetSelect({
|
|
|
5647
5868
|
onPress: () => handlePress(opt.value)
|
|
5648
5869
|
}
|
|
5649
5870
|
));
|
|
5650
|
-
return /* @__PURE__ */
|
|
5871
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles46.container, style], accessibilityLabel }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles46.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, wrap ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles46.wrapContainer }, chips) : /* @__PURE__ */ React55__default.default.createElement(
|
|
5651
5872
|
reactNative.ScrollView,
|
|
5652
5873
|
{
|
|
5653
5874
|
horizontal: true,
|
|
5654
5875
|
showsHorizontalScrollIndicator: false,
|
|
5655
|
-
contentContainerStyle:
|
|
5876
|
+
contentContainerStyle: styles46.scrollContent
|
|
5656
5877
|
},
|
|
5657
5878
|
chips
|
|
5658
|
-
), error ? /* @__PURE__ */
|
|
5879
|
+
), error ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles46.error, { color: colors.destructive }], allowFontScaling: true, accessibilityLiveRegion: "polite" }, error) : null);
|
|
5659
5880
|
}
|
|
5660
|
-
var
|
|
5881
|
+
var styles46 = reactNative.StyleSheet.create({
|
|
5661
5882
|
container: {
|
|
5662
5883
|
gap: vs(8)
|
|
5663
5884
|
},
|
|
@@ -5712,11 +5933,13 @@ function ImageUpload({
|
|
|
5712
5933
|
height = 200,
|
|
5713
5934
|
borderRadius = RADIUS.lg,
|
|
5714
5935
|
resizeMode = "cover",
|
|
5936
|
+
allowsEditing = true,
|
|
5715
5937
|
disabled = false,
|
|
5716
5938
|
style,
|
|
5717
5939
|
accessibilityLabel
|
|
5718
5940
|
}) {
|
|
5719
5941
|
const { colors } = useTheme();
|
|
5942
|
+
const [imageLoaded, setImageLoaded] = React55.useState(false);
|
|
5720
5943
|
const handlePress = async () => {
|
|
5721
5944
|
if (disabled || loading) return;
|
|
5722
5945
|
impactLight();
|
|
@@ -5741,10 +5964,11 @@ function ImageUpload({
|
|
|
5741
5964
|
}
|
|
5742
5965
|
const result = await picker.launchImageLibraryAsync({
|
|
5743
5966
|
mediaTypes: ["images"],
|
|
5744
|
-
allowsEditing
|
|
5967
|
+
allowsEditing,
|
|
5745
5968
|
quality: 0.8
|
|
5746
5969
|
});
|
|
5747
5970
|
if (!result.canceled && result.assets?.[0]) {
|
|
5971
|
+
setImageLoaded(false);
|
|
5748
5972
|
onChange?.(result.assets[0].uri);
|
|
5749
5973
|
}
|
|
5750
5974
|
};
|
|
@@ -5755,10 +5979,10 @@ function ImageUpload({
|
|
|
5755
5979
|
borderWidth: value ? 0 : 1,
|
|
5756
5980
|
borderStyle: "dashed",
|
|
5757
5981
|
borderColor: colors.border,
|
|
5758
|
-
backgroundColor: value ? "transparent" : colors.surface,
|
|
5982
|
+
backgroundColor: value && imageLoaded ? "transparent" : colors.surface,
|
|
5759
5983
|
overflow: "hidden"
|
|
5760
5984
|
};
|
|
5761
|
-
return /* @__PURE__ */
|
|
5985
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
5762
5986
|
PressableCard,
|
|
5763
5987
|
{
|
|
5764
5988
|
onPress: handlePress,
|
|
@@ -5770,27 +5994,29 @@ function ImageUpload({
|
|
|
5770
5994
|
accessibilityState: { disabled: disabled || loading },
|
|
5771
5995
|
style: [containerStyle, style]
|
|
5772
5996
|
},
|
|
5773
|
-
value ? /* @__PURE__ */
|
|
5997
|
+
value ? /* @__PURE__ */ React55__default.default.createElement(
|
|
5774
5998
|
reactNative.Image,
|
|
5775
5999
|
{
|
|
5776
6000
|
source: { uri: value },
|
|
5777
6001
|
style: [reactNative.StyleSheet.absoluteFillObject, { borderRadius }],
|
|
5778
|
-
resizeMode
|
|
6002
|
+
resizeMode,
|
|
6003
|
+
onLoad: () => setImageLoaded(true),
|
|
6004
|
+
onError: () => setImageLoaded(true)
|
|
5779
6005
|
}
|
|
5780
|
-
) : /* @__PURE__ */
|
|
6006
|
+
) : /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles47.placeholder }, /* @__PURE__ */ React55__default.default.createElement(vectorIcons.Feather, { name: "image", size: ms(28), color: colors.foregroundMuted }), showPlaceholderText ? /* @__PURE__ */ React55__default.default.createElement(
|
|
5781
6007
|
reactNative.Text,
|
|
5782
6008
|
{
|
|
5783
|
-
style: [
|
|
6009
|
+
style: [styles47.placeholderText, { color: colors.foregroundMuted }],
|
|
5784
6010
|
numberOfLines: 1,
|
|
5785
6011
|
allowFontScaling: true
|
|
5786
6012
|
},
|
|
5787
6013
|
placeholder
|
|
5788
6014
|
) : null),
|
|
5789
|
-
loading ? /* @__PURE__ */
|
|
5790
|
-
value && !loading ? /* @__PURE__ */
|
|
6015
|
+
loading ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles47.loadingOverlay, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React55__default.default.createElement(Spinner, { size: "md" })) : null,
|
|
6016
|
+
value && !loading ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles47.editBadge, pointerEvents: "none" }, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles47.editBadgeInner, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React55__default.default.createElement(vectorIcons.Feather, { name: "edit-2", size: ms(12), color: "#fff" }))) : null
|
|
5791
6017
|
);
|
|
5792
6018
|
}
|
|
5793
|
-
var
|
|
6019
|
+
var styles47 = reactNative.StyleSheet.create({
|
|
5794
6020
|
placeholder: {
|
|
5795
6021
|
flex: 1,
|
|
5796
6022
|
alignItems: "center",
|
|
@@ -5823,6 +6049,7 @@ var styles46 = reactNative.StyleSheet.create({
|
|
|
5823
6049
|
|
|
5824
6050
|
// src/utils/curatedIcons.ts
|
|
5825
6051
|
var CURATED_ICONS = [
|
|
6052
|
+
// ─── Food ────────────────────────────────────────────────────────────────────
|
|
5826
6053
|
{
|
|
5827
6054
|
name: "food",
|
|
5828
6055
|
label: "Food",
|
|
@@ -5830,97 +6057,178 @@ var CURATED_ICONS = [
|
|
|
5830
6057
|
categoryIcon: "coffee",
|
|
5831
6058
|
icons: [
|
|
5832
6059
|
// Bebidas
|
|
6060
|
+
"beer-outline",
|
|
6061
|
+
"wine-outline",
|
|
6062
|
+
"cafe-outline",
|
|
6063
|
+
"water-outline",
|
|
5833
6064
|
"coffee",
|
|
5834
|
-
|
|
5835
|
-
"
|
|
5836
|
-
"
|
|
5837
|
-
"
|
|
5838
|
-
"
|
|
5839
|
-
"
|
|
5840
|
-
|
|
5841
|
-
|
|
5842
|
-
"
|
|
5843
|
-
"
|
|
5844
|
-
"
|
|
5845
|
-
"
|
|
5846
|
-
"
|
|
5847
|
-
"
|
|
5848
|
-
"
|
|
5849
|
-
"
|
|
5850
|
-
"
|
|
5851
|
-
"
|
|
5852
|
-
"
|
|
5853
|
-
|
|
5854
|
-
"
|
|
6065
|
+
// Comida
|
|
6066
|
+
"pizza-outline",
|
|
6067
|
+
"fast-food-outline",
|
|
6068
|
+
"fish-outline",
|
|
6069
|
+
"ice-cream-outline",
|
|
6070
|
+
"egg-outline",
|
|
6071
|
+
"nutrition-outline",
|
|
6072
|
+
// Servicio y operación
|
|
6073
|
+
"restaurant-outline",
|
|
6074
|
+
"server-outline",
|
|
6075
|
+
"menu-outline",
|
|
6076
|
+
"basket-outline",
|
|
6077
|
+
"receipt-outline",
|
|
6078
|
+
"pricetag-outline",
|
|
6079
|
+
"pricetags-outline",
|
|
6080
|
+
"reorder-four-outline",
|
|
6081
|
+
"reorder-three-outline",
|
|
6082
|
+
"cart-outline",
|
|
6083
|
+
"cash-outline",
|
|
6084
|
+
"wallet-outline",
|
|
6085
|
+
"storefront-outline",
|
|
5855
6086
|
// Delivery / pedidos
|
|
6087
|
+
"truck",
|
|
6088
|
+
"package",
|
|
5856
6089
|
"shopping-bag",
|
|
6090
|
+
"shopping-cart",
|
|
6091
|
+
// Ubicación y reserva
|
|
6092
|
+
"map-pin",
|
|
6093
|
+
"home",
|
|
6094
|
+
"calendar",
|
|
5857
6095
|
"clock",
|
|
6096
|
+
// Experiencia
|
|
5858
6097
|
"star",
|
|
5859
6098
|
"heart",
|
|
5860
|
-
"
|
|
5861
|
-
"
|
|
6099
|
+
"bookmark",
|
|
6100
|
+
"thumbs-up",
|
|
6101
|
+
"check",
|
|
6102
|
+
"gift"
|
|
5862
6103
|
]
|
|
5863
6104
|
},
|
|
6105
|
+
// ─── Sports ──────────────────────────────────────────────────────────────────
|
|
5864
6106
|
{
|
|
5865
6107
|
name: "sports",
|
|
5866
6108
|
label: "Sports",
|
|
5867
6109
|
labelEs: "Deportes",
|
|
5868
|
-
categoryIcon: "
|
|
6110
|
+
categoryIcon: "trophy-outline",
|
|
5869
6111
|
icons: [
|
|
5870
|
-
// Deportes
|
|
5871
|
-
"
|
|
5872
|
-
"
|
|
5873
|
-
"
|
|
5874
|
-
"bicycle",
|
|
5875
|
-
"
|
|
5876
|
-
"
|
|
5877
|
-
|
|
5878
|
-
"
|
|
6112
|
+
// Deportes
|
|
6113
|
+
"american-football-outline",
|
|
6114
|
+
"baseball-outline",
|
|
6115
|
+
"basketball-outline",
|
|
6116
|
+
"bicycle-outline",
|
|
6117
|
+
"football-outline",
|
|
6118
|
+
"tennisball-outline",
|
|
6119
|
+
"golf-outline",
|
|
6120
|
+
"fitness-outline",
|
|
6121
|
+
"car-sport-outline",
|
|
6122
|
+
"game-controller-outline",
|
|
6123
|
+
// Competición y logros
|
|
6124
|
+
"trophy-outline",
|
|
6125
|
+
"medal-outline",
|
|
5879
6126
|
"award",
|
|
6127
|
+
"target",
|
|
5880
6128
|
"flag",
|
|
5881
|
-
"
|
|
6129
|
+
"crosshair",
|
|
6130
|
+
// Outdoor
|
|
6131
|
+
"compass-outline",
|
|
6132
|
+
"map-outline",
|
|
6133
|
+
"trail-sign-outline",
|
|
6134
|
+
"bonfire-outline",
|
|
6135
|
+
"snow-outline",
|
|
6136
|
+
"flame-outline",
|
|
6137
|
+
"sun",
|
|
6138
|
+
"droplet",
|
|
6139
|
+
"wind",
|
|
6140
|
+
"map",
|
|
6141
|
+
"map-pin",
|
|
6142
|
+
"navigation",
|
|
6143
|
+
"navigation-2",
|
|
6144
|
+
// Rendimiento y métricas
|
|
6145
|
+
"stats-chart-outline",
|
|
6146
|
+
"trending-up-outline",
|
|
6147
|
+
"trending-down-outline",
|
|
6148
|
+
"bar-chart-outline",
|
|
6149
|
+
"pie-chart-outline",
|
|
6150
|
+
"analytics-outline",
|
|
6151
|
+
"activity",
|
|
5882
6152
|
"zap",
|
|
5883
|
-
|
|
5884
|
-
"
|
|
6153
|
+
"watch",
|
|
6154
|
+
"trending-up",
|
|
6155
|
+
"trending-down",
|
|
6156
|
+
"bar-chart-2",
|
|
5885
6157
|
"clock",
|
|
5886
|
-
"
|
|
5887
|
-
"sun",
|
|
5888
|
-
"user",
|
|
5889
|
-
"users"
|
|
6158
|
+
"calendar"
|
|
5890
6159
|
]
|
|
5891
6160
|
},
|
|
6161
|
+
// ─── Business ────────────────────────────────────────────────────────────────
|
|
5892
6162
|
{
|
|
5893
6163
|
name: "business",
|
|
5894
6164
|
label: "Business",
|
|
5895
6165
|
labelEs: "Negocios",
|
|
5896
6166
|
categoryIcon: "briefcase",
|
|
5897
6167
|
icons: [
|
|
6168
|
+
// Empresa
|
|
6169
|
+
"briefcase",
|
|
6170
|
+
"users",
|
|
6171
|
+
"user",
|
|
6172
|
+
"user-plus",
|
|
6173
|
+
"user-check",
|
|
6174
|
+
"user-x",
|
|
6175
|
+
"briefcase-outline",
|
|
6176
|
+
"business-outline",
|
|
6177
|
+
"id-card-outline",
|
|
6178
|
+
// Comercio y operación
|
|
5898
6179
|
"shopping-cart",
|
|
5899
6180
|
"shopping-bag",
|
|
5900
6181
|
"credit-card",
|
|
5901
6182
|
"dollar-sign",
|
|
5902
6183
|
"percent",
|
|
5903
|
-
"
|
|
6184
|
+
"tag",
|
|
6185
|
+
"gift",
|
|
6186
|
+
"cart-outline",
|
|
6187
|
+
"cash-outline",
|
|
6188
|
+
"wallet-outline",
|
|
6189
|
+
"storefront-outline",
|
|
6190
|
+
"pricetag-outline",
|
|
6191
|
+
"pricetags-outline",
|
|
6192
|
+
"receipt-outline",
|
|
6193
|
+
"card-outline",
|
|
6194
|
+
// Logística
|
|
5904
6195
|
"truck",
|
|
5905
6196
|
"package",
|
|
5906
|
-
|
|
6197
|
+
// Documentos
|
|
6198
|
+
"file",
|
|
6199
|
+
"file-text",
|
|
6200
|
+
"file-plus",
|
|
6201
|
+
"folder",
|
|
6202
|
+
"paperclip",
|
|
6203
|
+
"document-outline",
|
|
6204
|
+
"document-text-outline",
|
|
6205
|
+
"documents-outline",
|
|
6206
|
+
"folder-outline",
|
|
6207
|
+
// Comunicación de negocio
|
|
6208
|
+
"mail",
|
|
6209
|
+
"phone",
|
|
6210
|
+
"phone-call",
|
|
6211
|
+
"send",
|
|
6212
|
+
"message-square",
|
|
6213
|
+
"mail-outline",
|
|
6214
|
+
// Análisis
|
|
5907
6215
|
"bar-chart",
|
|
5908
6216
|
"bar-chart-2",
|
|
5909
6217
|
"pie-chart",
|
|
5910
6218
|
"trending-up",
|
|
5911
6219
|
"trending-down",
|
|
5912
6220
|
"activity",
|
|
5913
|
-
"
|
|
5914
|
-
"bookmark",
|
|
5915
|
-
"pocket"
|
|
6221
|
+
"globe"
|
|
5916
6222
|
]
|
|
5917
6223
|
},
|
|
6224
|
+
// ─── Objects ─────────────────────────────────────────────────────────────────
|
|
5918
6225
|
{
|
|
5919
6226
|
name: "objects",
|
|
5920
6227
|
label: "Objects",
|
|
5921
6228
|
labelEs: "Objetos",
|
|
5922
|
-
categoryIcon: "
|
|
6229
|
+
categoryIcon: "package",
|
|
5923
6230
|
icons: [
|
|
6231
|
+
// Archivos y carpetas
|
|
5924
6232
|
"file",
|
|
5925
6233
|
"file-text",
|
|
5926
6234
|
"file-plus",
|
|
@@ -5928,108 +6236,193 @@ var CURATED_ICONS = [
|
|
|
5928
6236
|
"folder",
|
|
5929
6237
|
"folder-plus",
|
|
5930
6238
|
"folder-minus",
|
|
6239
|
+
"archive",
|
|
6240
|
+
"save",
|
|
6241
|
+
"paperclip",
|
|
6242
|
+
"document-outline",
|
|
6243
|
+
"document-text-outline",
|
|
6244
|
+
"documents-outline",
|
|
6245
|
+
"folder-outline",
|
|
6246
|
+
"folder-open-outline",
|
|
6247
|
+
"file-tray-outline",
|
|
6248
|
+
"file-tray-full-outline",
|
|
6249
|
+
"file-tray-stacked-outline",
|
|
6250
|
+
"archive-outline",
|
|
6251
|
+
"save-outline",
|
|
6252
|
+
// Seguridad
|
|
5931
6253
|
"lock",
|
|
5932
6254
|
"unlock",
|
|
5933
6255
|
"key",
|
|
5934
6256
|
"shield",
|
|
5935
6257
|
"shield-off",
|
|
5936
|
-
"
|
|
5937
|
-
"
|
|
5938
|
-
"
|
|
5939
|
-
"
|
|
5940
|
-
"
|
|
5941
|
-
|
|
5942
|
-
"
|
|
6258
|
+
"lock-closed-outline",
|
|
6259
|
+
"lock-open-outline",
|
|
6260
|
+
"key-outline",
|
|
6261
|
+
"shield-outline",
|
|
6262
|
+
"shield-checkmark-outline",
|
|
6263
|
+
// Dispositivos
|
|
6264
|
+
"monitor",
|
|
6265
|
+
"tablet",
|
|
6266
|
+
"smartphone",
|
|
6267
|
+
"tv",
|
|
5943
6268
|
"server",
|
|
6269
|
+
"database",
|
|
5944
6270
|
"hard-drive",
|
|
5945
6271
|
"cpu",
|
|
5946
|
-
"
|
|
5947
|
-
"
|
|
5948
|
-
"
|
|
5949
|
-
"
|
|
6272
|
+
"radio",
|
|
6273
|
+
"laptop-outline",
|
|
6274
|
+
"phone-portrait-outline",
|
|
6275
|
+
"phone-landscape-outline",
|
|
6276
|
+
"tablet-landscape-outline",
|
|
6277
|
+
"tablet-portrait-outline",
|
|
6278
|
+
"tv-outline",
|
|
6279
|
+
"server-outline",
|
|
6280
|
+
"hardware-chip-outline",
|
|
6281
|
+
"watch-outline"
|
|
5950
6282
|
]
|
|
5951
6283
|
},
|
|
6284
|
+
// ─── Status ──────────────────────────────────────────────────────────────────
|
|
5952
6285
|
{
|
|
5953
6286
|
name: "status",
|
|
5954
6287
|
label: "Status",
|
|
5955
6288
|
labelEs: "Estado",
|
|
5956
6289
|
categoryIcon: "alert-circle",
|
|
5957
6290
|
icons: [
|
|
6291
|
+
// Alertas
|
|
5958
6292
|
"alert-circle",
|
|
5959
6293
|
"alert-triangle",
|
|
5960
6294
|
"alert-octagon",
|
|
5961
6295
|
"info",
|
|
5962
6296
|
"help-circle",
|
|
6297
|
+
"alert-circle-outline",
|
|
6298
|
+
"alert-outline",
|
|
6299
|
+
"information-circle-outline",
|
|
6300
|
+
"help-circle-outline",
|
|
6301
|
+
// Notificaciones
|
|
5963
6302
|
"bell",
|
|
5964
6303
|
"bell-off",
|
|
6304
|
+
"notifications-outline",
|
|
6305
|
+
"notifications-off-outline",
|
|
6306
|
+
"notifications-circle-outline",
|
|
6307
|
+
// Visibilidad
|
|
5965
6308
|
"eye",
|
|
5966
6309
|
"eye-off",
|
|
6310
|
+
"eye-outline",
|
|
6311
|
+
"eye-off-outline",
|
|
6312
|
+
// Indicadores
|
|
5967
6313
|
"flag",
|
|
5968
6314
|
"zap",
|
|
5969
6315
|
"zap-off",
|
|
5970
6316
|
"loader",
|
|
5971
|
-
"
|
|
5972
|
-
"
|
|
6317
|
+
"activity",
|
|
6318
|
+
"flash-outline",
|
|
6319
|
+
"bulb-outline",
|
|
6320
|
+
// Éxito / error / advertencia
|
|
6321
|
+
"check",
|
|
6322
|
+
"check-circle",
|
|
6323
|
+
"x",
|
|
6324
|
+
"x-circle",
|
|
6325
|
+
"x-octagon",
|
|
6326
|
+
"slash",
|
|
6327
|
+
"plus-circle",
|
|
6328
|
+
"minus-circle",
|
|
6329
|
+
"checkmark-circle-outline",
|
|
6330
|
+
"checkmark-done-circle-outline",
|
|
6331
|
+
"close-circle-outline",
|
|
6332
|
+
"add-circle-outline",
|
|
6333
|
+
"remove-circle-outline",
|
|
6334
|
+
// Estados de proceso
|
|
6335
|
+
"play-circle",
|
|
6336
|
+
"pause-circle",
|
|
6337
|
+
"stop-circle",
|
|
6338
|
+
"play-circle-outline",
|
|
6339
|
+
"pause-circle-outline",
|
|
6340
|
+
"stop-circle-outline"
|
|
5973
6341
|
]
|
|
5974
6342
|
},
|
|
6343
|
+
// ─── Actions ─────────────────────────────────────────────────────────────────
|
|
5975
6344
|
{
|
|
5976
6345
|
name: "actions",
|
|
5977
6346
|
label: "Actions",
|
|
5978
6347
|
labelEs: "Acciones",
|
|
5979
6348
|
categoryIcon: "edit-3",
|
|
5980
6349
|
icons: [
|
|
6350
|
+
// Crear / añadir
|
|
5981
6351
|
"plus",
|
|
5982
6352
|
"plus-circle",
|
|
5983
6353
|
"plus-square",
|
|
6354
|
+
"add-outline",
|
|
6355
|
+
"add-circle-outline",
|
|
6356
|
+
// Eliminar / quitar
|
|
5984
6357
|
"minus",
|
|
5985
6358
|
"minus-circle",
|
|
5986
6359
|
"minus-square",
|
|
6360
|
+
"trash",
|
|
6361
|
+
"trash-2",
|
|
5987
6362
|
"x",
|
|
5988
6363
|
"x-circle",
|
|
5989
6364
|
"x-square",
|
|
5990
6365
|
"x-octagon",
|
|
6366
|
+
"slash",
|
|
6367
|
+
"trash-outline",
|
|
6368
|
+
"trash-bin-outline",
|
|
6369
|
+
"remove-outline",
|
|
6370
|
+
"remove-circle-outline",
|
|
6371
|
+
"close-circle-outline",
|
|
6372
|
+
"backspace-outline",
|
|
6373
|
+
"cut-outline",
|
|
6374
|
+
// Confirmar
|
|
5991
6375
|
"check",
|
|
5992
6376
|
"check-circle",
|
|
5993
6377
|
"check-square",
|
|
6378
|
+
"checkmark-circle-outline",
|
|
6379
|
+
// Editar
|
|
5994
6380
|
"edit",
|
|
5995
6381
|
"edit-2",
|
|
5996
6382
|
"edit-3",
|
|
5997
|
-
"trash",
|
|
5998
|
-
"trash-2",
|
|
5999
6383
|
"copy",
|
|
6000
6384
|
"clipboard",
|
|
6001
6385
|
"scissors",
|
|
6386
|
+
"create-outline",
|
|
6387
|
+
"pencil-outline",
|
|
6388
|
+
"duplicate-outline",
|
|
6389
|
+
"copy-outline",
|
|
6390
|
+
"clipboard-outline",
|
|
6391
|
+
// Mover datos
|
|
6002
6392
|
"download",
|
|
6003
6393
|
"download-cloud",
|
|
6004
6394
|
"upload",
|
|
6005
6395
|
"upload-cloud",
|
|
6006
|
-
"
|
|
6007
|
-
"
|
|
6008
|
-
"
|
|
6009
|
-
"link-2",
|
|
6010
|
-
"search",
|
|
6011
|
-
"zoom-in",
|
|
6012
|
-
"zoom-out",
|
|
6013
|
-
"save",
|
|
6014
|
-
"archive",
|
|
6015
|
-
"log-in",
|
|
6016
|
-
"log-out",
|
|
6017
|
-
"power",
|
|
6018
|
-
"refresh-cw",
|
|
6019
|
-
"rotate-cw",
|
|
6020
|
-
"slash"
|
|
6396
|
+
"download-outline",
|
|
6397
|
+
"cloud-download-outline",
|
|
6398
|
+
"cloud-upload-outline"
|
|
6021
6399
|
]
|
|
6022
6400
|
},
|
|
6401
|
+
// ─── Communication ───────────────────────────────────────────────────────────
|
|
6023
6402
|
{
|
|
6024
6403
|
name: "communication",
|
|
6025
6404
|
label: "Communication",
|
|
6026
6405
|
labelEs: "Comunicaci\xF3n",
|
|
6027
6406
|
categoryIcon: "message-circle",
|
|
6028
6407
|
icons: [
|
|
6029
|
-
|
|
6408
|
+
// Mensajería
|
|
6030
6409
|
"message-circle",
|
|
6031
6410
|
"message-square",
|
|
6032
6411
|
"send",
|
|
6412
|
+
"mail",
|
|
6413
|
+
"inbox",
|
|
6414
|
+
"at-sign",
|
|
6415
|
+
"mail-outline",
|
|
6416
|
+
"mail-open-outline",
|
|
6417
|
+
"mail-unread-outline",
|
|
6418
|
+
"chatbubble-outline",
|
|
6419
|
+
"chatbubble-ellipses-outline",
|
|
6420
|
+
"chatbubbles-outline",
|
|
6421
|
+
"send-outline",
|
|
6422
|
+
"attach-outline",
|
|
6423
|
+
"at-outline",
|
|
6424
|
+
"at-circle-outline",
|
|
6425
|
+
// Llamadas
|
|
6033
6426
|
"phone",
|
|
6034
6427
|
"phone-call",
|
|
6035
6428
|
"phone-incoming",
|
|
@@ -6037,30 +6430,45 @@ var CURATED_ICONS = [
|
|
|
6037
6430
|
"phone-missed",
|
|
6038
6431
|
"phone-off",
|
|
6039
6432
|
"phone-forwarded",
|
|
6040
|
-
"
|
|
6041
|
-
"
|
|
6433
|
+
"voicemail",
|
|
6434
|
+
"call-outline",
|
|
6435
|
+
"phone-portrait-outline",
|
|
6436
|
+
"phone-landscape-outline",
|
|
6437
|
+
// Personas
|
|
6042
6438
|
"user",
|
|
6043
6439
|
"user-plus",
|
|
6044
6440
|
"user-minus",
|
|
6045
6441
|
"user-check",
|
|
6046
6442
|
"user-x",
|
|
6047
6443
|
"users",
|
|
6444
|
+
"person-outline",
|
|
6445
|
+
"person-circle-outline",
|
|
6446
|
+
"person-add-outline",
|
|
6447
|
+
"person-remove-outline",
|
|
6448
|
+
"people-outline",
|
|
6449
|
+
"people-circle-outline",
|
|
6450
|
+
// Reacciones
|
|
6048
6451
|
"smile",
|
|
6049
6452
|
"frown",
|
|
6050
6453
|
"meh",
|
|
6051
6454
|
"heart",
|
|
6052
6455
|
"thumbs-up",
|
|
6053
6456
|
"thumbs-down",
|
|
6054
|
-
"
|
|
6055
|
-
"
|
|
6457
|
+
"happy-outline",
|
|
6458
|
+
"sad-outline",
|
|
6459
|
+
"heart-outline",
|
|
6460
|
+
"thumbs-up-outline",
|
|
6461
|
+
"thumbs-down-outline"
|
|
6056
6462
|
]
|
|
6057
6463
|
},
|
|
6464
|
+
// ─── Navigation ──────────────────────────────────────────────────────────────
|
|
6058
6465
|
{
|
|
6059
6466
|
name: "navigation",
|
|
6060
6467
|
label: "Navigation",
|
|
6061
6468
|
labelEs: "Navegaci\xF3n",
|
|
6062
6469
|
categoryIcon: "compass",
|
|
6063
6470
|
icons: [
|
|
6471
|
+
// Flechas cardinales
|
|
6064
6472
|
"arrow-up",
|
|
6065
6473
|
"arrow-down",
|
|
6066
6474
|
"arrow-left",
|
|
@@ -6069,6 +6477,13 @@ var CURATED_ICONS = [
|
|
|
6069
6477
|
"arrow-up-right",
|
|
6070
6478
|
"arrow-down-left",
|
|
6071
6479
|
"arrow-down-right",
|
|
6480
|
+
"arrow-up-outline",
|
|
6481
|
+
"arrow-down-outline",
|
|
6482
|
+
"arrow-back-outline",
|
|
6483
|
+
"arrow-forward-outline",
|
|
6484
|
+
"arrow-undo-outline",
|
|
6485
|
+
"arrow-redo-outline",
|
|
6486
|
+
// Chevrones
|
|
6072
6487
|
"chevron-up",
|
|
6073
6488
|
"chevron-down",
|
|
6074
6489
|
"chevron-left",
|
|
@@ -6077,6 +6492,13 @@ var CURATED_ICONS = [
|
|
|
6077
6492
|
"chevrons-down",
|
|
6078
6493
|
"chevrons-left",
|
|
6079
6494
|
"chevrons-right",
|
|
6495
|
+
"chevron-up-outline",
|
|
6496
|
+
"chevron-down-outline",
|
|
6497
|
+
"chevron-back-outline",
|
|
6498
|
+
"chevron-forward-outline",
|
|
6499
|
+
"chevron-collapse-outline",
|
|
6500
|
+
"chevron-expand-outline",
|
|
6501
|
+
// Esquinas
|
|
6080
6502
|
"corner-up-left",
|
|
6081
6503
|
"corner-up-right",
|
|
6082
6504
|
"corner-down-left",
|
|
@@ -6085,10 +6507,14 @@ var CURATED_ICONS = [
|
|
|
6085
6507
|
"corner-left-down",
|
|
6086
6508
|
"corner-right-up",
|
|
6087
6509
|
"corner-right-down",
|
|
6510
|
+
// Giro / refrescar
|
|
6088
6511
|
"refresh-cw",
|
|
6089
6512
|
"refresh-ccw",
|
|
6090
6513
|
"rotate-cw",
|
|
6091
6514
|
"rotate-ccw",
|
|
6515
|
+
"refresh-outline",
|
|
6516
|
+
"reload-outline",
|
|
6517
|
+
// Orientación y mapa
|
|
6092
6518
|
"navigation",
|
|
6093
6519
|
"navigation-2",
|
|
6094
6520
|
"compass",
|
|
@@ -6097,119 +6523,248 @@ var CURATED_ICONS = [
|
|
|
6097
6523
|
"target",
|
|
6098
6524
|
"crosshair",
|
|
6099
6525
|
"home",
|
|
6100
|
-
"
|
|
6101
|
-
"
|
|
6102
|
-
"
|
|
6103
|
-
"
|
|
6104
|
-
"
|
|
6105
|
-
"
|
|
6106
|
-
"
|
|
6526
|
+
"anchor",
|
|
6527
|
+
"compass-outline",
|
|
6528
|
+
"map-outline",
|
|
6529
|
+
"location-outline",
|
|
6530
|
+
"navigate-outline",
|
|
6531
|
+
"pin-outline",
|
|
6532
|
+
"home-outline"
|
|
6107
6533
|
]
|
|
6108
6534
|
},
|
|
6535
|
+
// ─── Media ───────────────────────────────────────────────────────────────────
|
|
6109
6536
|
{
|
|
6110
6537
|
name: "media",
|
|
6111
6538
|
label: "Media",
|
|
6112
6539
|
labelEs: "Medios",
|
|
6113
6540
|
categoryIcon: "image",
|
|
6114
6541
|
icons: [
|
|
6542
|
+
// Visual
|
|
6115
6543
|
"image",
|
|
6116
6544
|
"film",
|
|
6117
6545
|
"video",
|
|
6118
6546
|
"video-off",
|
|
6547
|
+
"camera",
|
|
6548
|
+
"camera-off",
|
|
6549
|
+
"image-outline",
|
|
6550
|
+
"images-outline",
|
|
6551
|
+
"film-outline",
|
|
6552
|
+
"videocam-outline",
|
|
6553
|
+
"videocam-off-outline",
|
|
6554
|
+
"camera-outline",
|
|
6555
|
+
"camera-reverse-outline",
|
|
6556
|
+
// Reproducción
|
|
6119
6557
|
"play",
|
|
6120
6558
|
"play-circle",
|
|
6121
6559
|
"pause",
|
|
6122
6560
|
"pause-circle",
|
|
6123
6561
|
"square",
|
|
6124
6562
|
"stop-circle",
|
|
6563
|
+
"fast-forward",
|
|
6564
|
+
"rewind",
|
|
6565
|
+
"skip-forward",
|
|
6566
|
+
"skip-back",
|
|
6567
|
+
"repeat",
|
|
6568
|
+
"shuffle",
|
|
6569
|
+
"play-outline",
|
|
6570
|
+
"pause-outline",
|
|
6571
|
+
"play-circle-outline",
|
|
6572
|
+
"pause-circle-outline",
|
|
6573
|
+
"stop-circle-outline",
|
|
6574
|
+
"play-back-outline",
|
|
6575
|
+
"play-forward-outline",
|
|
6576
|
+
"play-skip-back-outline",
|
|
6577
|
+
"play-skip-forward-outline",
|
|
6578
|
+
"repeat-outline",
|
|
6579
|
+
"shuffle-outline",
|
|
6580
|
+
// Audio
|
|
6125
6581
|
"music",
|
|
6126
6582
|
"headphones",
|
|
6127
6583
|
"speaker",
|
|
6128
|
-
"camera",
|
|
6129
|
-
"camera-off",
|
|
6130
|
-
"mic",
|
|
6131
|
-
"mic-off",
|
|
6132
6584
|
"volume",
|
|
6133
6585
|
"volume-1",
|
|
6134
6586
|
"volume-2",
|
|
6135
6587
|
"volume-x",
|
|
6136
|
-
"
|
|
6137
|
-
"
|
|
6138
|
-
"
|
|
6139
|
-
"
|
|
6140
|
-
"
|
|
6141
|
-
"
|
|
6142
|
-
"
|
|
6588
|
+
"mic",
|
|
6589
|
+
"mic-off",
|
|
6590
|
+
"mic-outline",
|
|
6591
|
+
"mic-off-outline",
|
|
6592
|
+
"mic-circle-outline",
|
|
6593
|
+
"musical-note-outline",
|
|
6594
|
+
"musical-notes-outline",
|
|
6595
|
+
"volume-high-outline",
|
|
6596
|
+
"volume-low-outline",
|
|
6597
|
+
"volume-medium-outline",
|
|
6598
|
+
"volume-mute-outline",
|
|
6599
|
+
"volume-off-outline"
|
|
6143
6600
|
]
|
|
6144
6601
|
},
|
|
6602
|
+
// ─── Layout ──────────────────────────────────────────────────────────────────
|
|
6145
6603
|
{
|
|
6146
6604
|
name: "layout",
|
|
6147
6605
|
label: "Layout",
|
|
6148
6606
|
labelEs: "Dise\xF1o",
|
|
6149
6607
|
categoryIcon: "grid",
|
|
6150
6608
|
icons: [
|
|
6151
|
-
|
|
6152
|
-
"more-horizontal",
|
|
6153
|
-
"more-vertical",
|
|
6609
|
+
// Estructura
|
|
6154
6610
|
"grid",
|
|
6155
6611
|
"columns",
|
|
6156
6612
|
"sidebar",
|
|
6157
6613
|
"layout",
|
|
6158
6614
|
"list",
|
|
6615
|
+
"menu",
|
|
6616
|
+
"table",
|
|
6617
|
+
"trello",
|
|
6618
|
+
"grid-outline",
|
|
6619
|
+
"list-outline",
|
|
6620
|
+
"menu-outline",
|
|
6621
|
+
"layers-outline",
|
|
6622
|
+
// Alineación
|
|
6159
6623
|
"align-left",
|
|
6160
6624
|
"align-center",
|
|
6161
6625
|
"align-right",
|
|
6162
6626
|
"align-justify",
|
|
6627
|
+
// Tipografía
|
|
6163
6628
|
"bold",
|
|
6164
6629
|
"italic",
|
|
6165
6630
|
"underline",
|
|
6166
6631
|
"type",
|
|
6167
|
-
"filter",
|
|
6168
|
-
"crop",
|
|
6169
|
-
"layers",
|
|
6170
6632
|
"hash",
|
|
6171
|
-
|
|
6172
|
-
"trello",
|
|
6633
|
+
// Formas
|
|
6173
6634
|
"circle",
|
|
6174
6635
|
"square",
|
|
6175
6636
|
"triangle",
|
|
6176
6637
|
"hexagon",
|
|
6177
6638
|
"octagon",
|
|
6178
|
-
"
|
|
6179
|
-
"
|
|
6639
|
+
"square-outline",
|
|
6640
|
+
"triangle-outline",
|
|
6641
|
+
"diamond-outline",
|
|
6642
|
+
"shapes-outline",
|
|
6643
|
+
// Herramientas de diseño
|
|
6644
|
+
"pen-tool",
|
|
6645
|
+
"crop",
|
|
6646
|
+
"layers",
|
|
6647
|
+
"filter",
|
|
6648
|
+
"sliders",
|
|
6649
|
+
"aperture",
|
|
6650
|
+
"crop-outline",
|
|
6651
|
+
"filter-outline",
|
|
6652
|
+
"color-fill-outline",
|
|
6653
|
+
"color-filter-outline",
|
|
6654
|
+
"color-palette-outline",
|
|
6655
|
+
"color-wand-outline",
|
|
6656
|
+
"brush-outline",
|
|
6657
|
+
// Edición
|
|
6658
|
+
"edit",
|
|
6659
|
+
"edit-2",
|
|
6660
|
+
"edit-3",
|
|
6661
|
+
"copy",
|
|
6662
|
+
"trash",
|
|
6663
|
+
"move",
|
|
6664
|
+
"create-outline",
|
|
6665
|
+
"pencil-outline",
|
|
6666
|
+
"move-outline",
|
|
6667
|
+
"resize-outline",
|
|
6668
|
+
"duplicate-outline",
|
|
6669
|
+
// Navegación UI
|
|
6670
|
+
"more-horizontal",
|
|
6671
|
+
"more-vertical",
|
|
6672
|
+
"maximize",
|
|
6673
|
+
"minimize",
|
|
6674
|
+
"zoom-in",
|
|
6675
|
+
"zoom-out",
|
|
6676
|
+
"eye",
|
|
6677
|
+
"eye-off",
|
|
6678
|
+
"eye-outline",
|
|
6679
|
+
"eye-off-outline",
|
|
6680
|
+
"ellipsis-horizontal-circle-outline",
|
|
6681
|
+
"ellipsis-vertical-circle-outline"
|
|
6180
6682
|
]
|
|
6181
6683
|
},
|
|
6684
|
+
// ─── Nature ──────────────────────────────────────────────────────────────────
|
|
6182
6685
|
{
|
|
6183
6686
|
name: "nature",
|
|
6184
6687
|
label: "Nature",
|
|
6185
6688
|
labelEs: "Naturaleza",
|
|
6186
|
-
categoryIcon: "
|
|
6689
|
+
categoryIcon: "sunny-outline",
|
|
6187
6690
|
icons: [
|
|
6691
|
+
// Sol, luna y estrellas
|
|
6692
|
+
"sunny-outline",
|
|
6693
|
+
"moon-outline",
|
|
6694
|
+
"star-outline",
|
|
6695
|
+
"star-half-outline",
|
|
6696
|
+
"partly-sunny-outline",
|
|
6188
6697
|
"sun",
|
|
6698
|
+
"moon",
|
|
6189
6699
|
"sunrise",
|
|
6190
6700
|
"sunset",
|
|
6191
|
-
|
|
6701
|
+
// Clima
|
|
6702
|
+
"rainy-outline",
|
|
6703
|
+
"thunderstorm-outline",
|
|
6704
|
+
"snow-outline",
|
|
6705
|
+
"cloudy-outline",
|
|
6706
|
+
"cloudy-night-outline",
|
|
6707
|
+
"cloud-outline",
|
|
6708
|
+
"cloud-done-outline",
|
|
6709
|
+
"cloud-download-outline",
|
|
6710
|
+
"cloud-upload-outline",
|
|
6711
|
+
"cloud-offline-outline",
|
|
6712
|
+
"cloud-circle-outline",
|
|
6192
6713
|
"cloud",
|
|
6193
6714
|
"cloud-drizzle",
|
|
6194
6715
|
"cloud-lightning",
|
|
6195
|
-
"cloud-off",
|
|
6196
6716
|
"cloud-rain",
|
|
6197
6717
|
"cloud-snow",
|
|
6198
|
-
"
|
|
6199
|
-
"umbrella",
|
|
6200
|
-
"thermometer",
|
|
6718
|
+
"cloud-off",
|
|
6719
|
+
"umbrella-outline",
|
|
6720
|
+
"thermometer-outline",
|
|
6201
6721
|
"droplet",
|
|
6722
|
+
"wind",
|
|
6723
|
+
// Agua y fuego
|
|
6724
|
+
"water-outline",
|
|
6725
|
+
"flame-outline",
|
|
6726
|
+
"bonfire-outline",
|
|
6727
|
+
"eyedrop-outline",
|
|
6728
|
+
// Flora y fauna
|
|
6729
|
+
"leaf-outline",
|
|
6730
|
+
"flower-outline",
|
|
6731
|
+
"bug-outline",
|
|
6732
|
+
"fish-outline",
|
|
6733
|
+
"paw-outline",
|
|
6734
|
+
// Outdoor
|
|
6735
|
+
"binoculars-outline",
|
|
6736
|
+
"telescope-outline",
|
|
6737
|
+
"compass-outline",
|
|
6738
|
+
"map-outline",
|
|
6739
|
+
"location-outline",
|
|
6740
|
+
"flag-outline",
|
|
6741
|
+
"trail-sign-outline",
|
|
6742
|
+
"earth-outline",
|
|
6743
|
+
"globe-outline",
|
|
6744
|
+
"planet-outline",
|
|
6745
|
+
"compass",
|
|
6746
|
+
"map",
|
|
6747
|
+
"map-pin",
|
|
6748
|
+
"flag",
|
|
6749
|
+
"navigation",
|
|
6750
|
+
"navigation-2",
|
|
6751
|
+
"target",
|
|
6752
|
+
"crosshair",
|
|
6202
6753
|
"life-buoy"
|
|
6203
6754
|
]
|
|
6204
6755
|
},
|
|
6756
|
+
// ─── Brands ──────────────────────────────────────────────────────────────────
|
|
6205
6757
|
{
|
|
6206
6758
|
name: "brands",
|
|
6207
6759
|
label: "Brands",
|
|
6208
6760
|
labelEs: "Marcas",
|
|
6209
6761
|
categoryIcon: "globe",
|
|
6210
6762
|
icons: [
|
|
6763
|
+
// Feather brand icons — outlined, consistent with the rest of the library
|
|
6211
6764
|
"github",
|
|
6212
6765
|
"gitlab",
|
|
6766
|
+
"codepen",
|
|
6767
|
+
"codesandbox",
|
|
6213
6768
|
"twitter",
|
|
6214
6769
|
"facebook",
|
|
6215
6770
|
"instagram",
|
|
@@ -6221,21 +6776,56 @@ var CURATED_ICONS = [
|
|
|
6221
6776
|
"figma",
|
|
6222
6777
|
"framer",
|
|
6223
6778
|
"chrome",
|
|
6224
|
-
"codepen",
|
|
6225
|
-
"codesandbox",
|
|
6226
|
-
"globe",
|
|
6227
6779
|
"rss",
|
|
6228
|
-
|
|
6229
|
-
|
|
6230
|
-
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
"
|
|
6234
|
-
"
|
|
6235
|
-
"
|
|
6236
|
-
"
|
|
6237
|
-
"
|
|
6238
|
-
"
|
|
6780
|
+
// Filled / flat brand logos (FA5 brands) — kept in a second
|
|
6781
|
+
// visual tier. Rendered as the brand's official silhouette.
|
|
6782
|
+
// Visually consistent (all flat single-color) but heavier than the
|
|
6783
|
+
// Feather outlined set above. Use these only when an outlined Feather
|
|
6784
|
+
// version of the brand doesn't exist.
|
|
6785
|
+
"reddit",
|
|
6786
|
+
"tiktok",
|
|
6787
|
+
"pinterest",
|
|
6788
|
+
"whatsapp",
|
|
6789
|
+
"discord",
|
|
6790
|
+
"snapchat",
|
|
6791
|
+
"telegram",
|
|
6792
|
+
"viber",
|
|
6793
|
+
"line",
|
|
6794
|
+
"vimeo",
|
|
6795
|
+
"tumblr",
|
|
6796
|
+
"behance",
|
|
6797
|
+
"medium",
|
|
6798
|
+
"soundcloud",
|
|
6799
|
+
"google",
|
|
6800
|
+
"apple",
|
|
6801
|
+
"android",
|
|
6802
|
+
"windows",
|
|
6803
|
+
"linux",
|
|
6804
|
+
"amazon",
|
|
6805
|
+
"paypal",
|
|
6806
|
+
"stripe",
|
|
6807
|
+
"shopify",
|
|
6808
|
+
"dropbox",
|
|
6809
|
+
"spotify",
|
|
6810
|
+
"steam",
|
|
6811
|
+
"atlassian",
|
|
6812
|
+
"jira",
|
|
6813
|
+
"confluence",
|
|
6814
|
+
"bitbucket",
|
|
6815
|
+
"jenkins",
|
|
6816
|
+
"docker",
|
|
6817
|
+
"aws",
|
|
6818
|
+
"node",
|
|
6819
|
+
"react",
|
|
6820
|
+
"angular",
|
|
6821
|
+
"wordpress",
|
|
6822
|
+
"drupal",
|
|
6823
|
+
"joomla",
|
|
6824
|
+
"squarespace",
|
|
6825
|
+
"wix",
|
|
6826
|
+
"magento",
|
|
6827
|
+
"terminal",
|
|
6828
|
+
"pen-tool"
|
|
6239
6829
|
]
|
|
6240
6830
|
}
|
|
6241
6831
|
];
|
|
@@ -6247,7 +6837,7 @@ var ALL_CURATED_ICONS = [
|
|
|
6247
6837
|
var NUM_COLUMNS = 6;
|
|
6248
6838
|
var GAP = 6;
|
|
6249
6839
|
var TRIGGER_SIZE = s(56);
|
|
6250
|
-
var
|
|
6840
|
+
var SCREEN_HEIGHT = reactNative.Dimensions.get("window").height;
|
|
6251
6841
|
function IconCell({ name, selected, size, onPress }) {
|
|
6252
6842
|
const { colors } = useTheme();
|
|
6253
6843
|
const handlePress = () => {
|
|
@@ -6256,7 +6846,7 @@ function IconCell({ name, selected, size, onPress }) {
|
|
|
6256
6846
|
};
|
|
6257
6847
|
const iconColor = selected ? colors.primaryForeground : colors.foreground;
|
|
6258
6848
|
const bg = selected ? colors.primary : "transparent";
|
|
6259
|
-
return /* @__PURE__ */
|
|
6849
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
6260
6850
|
reactNative.TouchableOpacity,
|
|
6261
6851
|
{
|
|
6262
6852
|
onPress: handlePress,
|
|
@@ -6265,12 +6855,12 @@ function IconCell({ name, selected, size, onPress }) {
|
|
|
6265
6855
|
accessibilityRole: "button",
|
|
6266
6856
|
accessibilityState: { selected },
|
|
6267
6857
|
accessibilityLabel: name,
|
|
6268
|
-
style: [
|
|
6858
|
+
style: [styles48.cell, { width: size, height: size, backgroundColor: bg }]
|
|
6269
6859
|
},
|
|
6270
6860
|
renderIcon(name, ms(20), iconColor)
|
|
6271
6861
|
);
|
|
6272
6862
|
}
|
|
6273
|
-
var IconCellMemo =
|
|
6863
|
+
var IconCellMemo = React55__default.default.memo(IconCell);
|
|
6274
6864
|
function IconPicker({
|
|
6275
6865
|
value,
|
|
6276
6866
|
onChange,
|
|
@@ -6284,13 +6874,13 @@ function IconPicker({
|
|
|
6284
6874
|
}) {
|
|
6285
6875
|
const { colors } = useTheme();
|
|
6286
6876
|
const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
|
|
6287
|
-
const sheetRef =
|
|
6288
|
-
const catScrollRef =
|
|
6289
|
-
const [
|
|
6290
|
-
const [
|
|
6291
|
-
const [
|
|
6292
|
-
const sheetName =
|
|
6293
|
-
const activeIcons =
|
|
6877
|
+
const sheetRef = React55.useRef(null);
|
|
6878
|
+
const catScrollRef = React55.useRef(null);
|
|
6879
|
+
const [activeCategory, setActiveCategory] = React55.useState(null);
|
|
6880
|
+
const [containerWidth, setContainerWidth] = React55.useState(() => reactNative.Dimensions.get("window").width - s(16) * 2);
|
|
6881
|
+
const [ready, setReady] = React55.useState(false);
|
|
6882
|
+
const sheetName = React55.useId();
|
|
6883
|
+
const activeIcons = React55.useMemo(() => {
|
|
6294
6884
|
if (activeCategory) {
|
|
6295
6885
|
return CURATED_ICONS.find((c) => c.name === activeCategory)?.icons ?? ALL_CURATED_ICONS;
|
|
6296
6886
|
}
|
|
@@ -6298,44 +6888,36 @@ function IconPicker({
|
|
|
6298
6888
|
}, [activeCategory]);
|
|
6299
6889
|
const gapPx = s(gap);
|
|
6300
6890
|
const cellSize = containerWidth > 0 ? Math.floor((containerWidth - gapPx * (numColumns - 1)) / numColumns) : 0;
|
|
6301
|
-
const rows =
|
|
6891
|
+
const rows = React55.useMemo(() => {
|
|
6302
6892
|
const result = [];
|
|
6303
6893
|
for (let i = 0; i < activeIcons.length; i += numColumns) {
|
|
6304
6894
|
result.push(activeIcons.slice(i, i + numColumns));
|
|
6305
6895
|
}
|
|
6306
6896
|
return result;
|
|
6307
6897
|
}, [activeIcons, numColumns]);
|
|
6308
|
-
|
|
6309
|
-
|
|
6310
|
-
|
|
6311
|
-
|
|
6312
|
-
|
|
6313
|
-
sheetRef.current?.dismiss();
|
|
6314
|
-
}
|
|
6315
|
-
}, [open]);
|
|
6316
|
-
const handleSelect = React25.useCallback(
|
|
6898
|
+
const handleDismiss = React55.useCallback(() => {
|
|
6899
|
+
setActiveCategory(null);
|
|
6900
|
+
setReady(false);
|
|
6901
|
+
}, []);
|
|
6902
|
+
const handleSelect = React55.useCallback(
|
|
6317
6903
|
(iconName) => {
|
|
6318
6904
|
onChange(iconName);
|
|
6319
|
-
setOpen(false);
|
|
6320
|
-
setActiveCategory(null);
|
|
6321
6905
|
},
|
|
6322
6906
|
[onChange]
|
|
6323
6907
|
);
|
|
6324
|
-
const handleOpen =
|
|
6908
|
+
const handleOpen = React55.useCallback(() => {
|
|
6325
6909
|
if (disabled) return;
|
|
6910
|
+
impactMedium();
|
|
6326
6911
|
setActiveCategory(null);
|
|
6327
|
-
|
|
6912
|
+
setReady(false);
|
|
6913
|
+
sheetRef.current?.present();
|
|
6328
6914
|
}, [disabled]);
|
|
6329
|
-
const
|
|
6330
|
-
|
|
6331
|
-
setActiveCategory(null);
|
|
6332
|
-
}, []);
|
|
6333
|
-
const renderBackdrop = React25.useCallback(
|
|
6334
|
-
(props) => /* @__PURE__ */ React25__default.default.createElement(BottomSheet.BottomSheetBackdrop, { ...props, disappearsOnIndex: -1, appearsOnIndex: 0, pressBehavior: "close" }),
|
|
6915
|
+
const renderBackdrop = React55.useCallback(
|
|
6916
|
+
(props) => /* @__PURE__ */ React55__default.default.createElement(bottomSheet.BottomSheetBackdrop, { ...props, disappearsOnIndex: -1, appearsOnIndex: 0, pressBehavior: "close" }),
|
|
6335
6917
|
[]
|
|
6336
6918
|
);
|
|
6337
6919
|
const selectedIcon = value ? renderIcon(value, ms(28), colors.foreground) : null;
|
|
6338
|
-
return /* @__PURE__ */
|
|
6920
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles48.triggerContainer, style] }, label ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles48.triggerLabel, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React55__default.default.createElement(
|
|
6339
6921
|
reactNative.TouchableOpacity,
|
|
6340
6922
|
{
|
|
6341
6923
|
onPress: handleOpen,
|
|
@@ -6346,133 +6928,143 @@ function IconPicker({
|
|
|
6346
6928
|
accessibilityLabel: label ?? "Seleccionar icono",
|
|
6347
6929
|
accessibilityState: { disabled },
|
|
6348
6930
|
style: [
|
|
6349
|
-
|
|
6931
|
+
styles48.trigger,
|
|
6350
6932
|
{
|
|
6351
6933
|
backgroundColor: disabled ? colors.surface : colors.background,
|
|
6352
6934
|
width: TRIGGER_SIZE,
|
|
6353
6935
|
height: TRIGGER_SIZE,
|
|
6354
6936
|
borderColor: error ? colors.destructive : value ? colors.primary : colors.border
|
|
6355
6937
|
},
|
|
6356
|
-
disabled &&
|
|
6938
|
+
disabled && styles48.triggerDisabled
|
|
6357
6939
|
]
|
|
6358
6940
|
},
|
|
6359
6941
|
selectedIcon ?? renderIcon("plus", ms(24), colors.foregroundMuted)
|
|
6360
|
-
), error ? /* @__PURE__ */
|
|
6942
|
+
), error ? /* @__PURE__ */ React55__default.default.createElement(
|
|
6361
6943
|
reactNative.Text,
|
|
6362
6944
|
{
|
|
6363
|
-
style: [
|
|
6945
|
+
style: [styles48.helperText, { color: colors.destructive }],
|
|
6364
6946
|
allowFontScaling: true,
|
|
6365
6947
|
accessibilityLiveRegion: "polite"
|
|
6366
6948
|
},
|
|
6367
6949
|
error
|
|
6368
|
-
) : null, !error && hint ? /* @__PURE__ */
|
|
6369
|
-
|
|
6950
|
+
) : null, !error && hint ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles48.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null, /* @__PURE__ */ React55__default.default.createElement(
|
|
6951
|
+
bottomSheet.BottomSheetModal,
|
|
6370
6952
|
{
|
|
6371
6953
|
ref: sheetRef,
|
|
6372
6954
|
name: sheetName,
|
|
6373
|
-
onDismiss:
|
|
6955
|
+
onDismiss: handleDismiss,
|
|
6374
6956
|
enableDynamicSizing: true,
|
|
6375
|
-
maxDynamicContentSize:
|
|
6957
|
+
maxDynamicContentSize: SCREEN_HEIGHT * 0.7,
|
|
6376
6958
|
backdropComponent: renderBackdrop,
|
|
6377
|
-
backgroundStyle:
|
|
6378
|
-
handleIndicatorStyle:
|
|
6959
|
+
backgroundStyle: { ...styles48.sheetBackground, backgroundColor: colors.card },
|
|
6960
|
+
handleIndicatorStyle: { ...styles48.handle, backgroundColor: colors.border },
|
|
6379
6961
|
enablePanDownToClose: true,
|
|
6380
6962
|
topInset: insets.top,
|
|
6381
6963
|
android_keyboardInputMode: "adjustPan"
|
|
6382
6964
|
},
|
|
6383
|
-
/* @__PURE__ */
|
|
6384
|
-
|
|
6965
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
6966
|
+
bottomSheet.BottomSheetScrollView,
|
|
6385
6967
|
{
|
|
6386
|
-
contentContainerStyle:
|
|
6968
|
+
contentContainerStyle: styles48.sheetContent,
|
|
6387
6969
|
showsVerticalScrollIndicator: true
|
|
6388
6970
|
},
|
|
6389
|
-
/* @__PURE__ */
|
|
6390
|
-
|
|
6391
|
-
reactNativeGestureHandler.ScrollView,
|
|
6971
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
6972
|
+
reactNative.View,
|
|
6392
6973
|
{
|
|
6393
|
-
|
|
6394
|
-
|
|
6395
|
-
|
|
6396
|
-
|
|
6397
|
-
|
|
6974
|
+
style: styles48.gridContainer,
|
|
6975
|
+
onLayout: (e) => {
|
|
6976
|
+
setContainerWidth(e.nativeEvent.layout.width);
|
|
6977
|
+
setReady(true);
|
|
6978
|
+
}
|
|
6398
6979
|
},
|
|
6399
|
-
/* @__PURE__ */
|
|
6400
|
-
|
|
6980
|
+
!ready ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles48.loader }, /* @__PURE__ */ React55__default.default.createElement(Spinner, { size: "md", color: colors.primary, label: "Cargando iconos..." })) : /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles48.sectionLabel, { color: colors.foregroundSubtle }], allowFontScaling: true }, "Categor\xEDas"), /* @__PURE__ */ React55__default.default.createElement(
|
|
6981
|
+
reactNativeGestureHandler.ScrollView,
|
|
6401
6982
|
{
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
accessibilityState: { selected: activeCategory === null },
|
|
6408
|
-
style: [
|
|
6409
|
-
styles47.categoryChip,
|
|
6410
|
-
{
|
|
6411
|
-
backgroundColor: activeCategory === null ? colors.primary : colors.surface,
|
|
6412
|
-
borderColor: activeCategory === null ? colors.primary : colors.border
|
|
6413
|
-
}
|
|
6414
|
-
]
|
|
6983
|
+
ref: catScrollRef,
|
|
6984
|
+
horizontal: true,
|
|
6985
|
+
showsHorizontalScrollIndicator: false,
|
|
6986
|
+
contentContainerStyle: styles48.categoryStrip,
|
|
6987
|
+
style: styles48.categoryScroll
|
|
6415
6988
|
},
|
|
6416
|
-
/* @__PURE__ */
|
|
6417
|
-
reactNative.
|
|
6989
|
+
/* @__PURE__ */ React55__default.default.createElement(
|
|
6990
|
+
reactNative.TouchableOpacity,
|
|
6418
6991
|
{
|
|
6992
|
+
onPress: () => setActiveCategory(null),
|
|
6993
|
+
activeOpacity: 0.7,
|
|
6994
|
+
touchSoundDisabled: true,
|
|
6995
|
+
accessibilityRole: "button",
|
|
6996
|
+
accessibilityLabel: "Todos",
|
|
6997
|
+
accessibilityState: { selected: activeCategory === null },
|
|
6419
6998
|
style: [
|
|
6420
|
-
|
|
6421
|
-
{
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
|
|
6999
|
+
styles48.categoryChip,
|
|
7000
|
+
{
|
|
7001
|
+
backgroundColor: activeCategory === null ? colors.primary : colors.surface,
|
|
7002
|
+
borderColor: activeCategory === null ? colors.primary : colors.border
|
|
7003
|
+
}
|
|
7004
|
+
]
|
|
6425
7005
|
},
|
|
6426
|
-
"
|
|
6427
|
-
|
|
6428
|
-
),
|
|
6429
|
-
CURATED_ICONS.map((cat) => /* @__PURE__ */ React25__default.default.createElement(
|
|
6430
|
-
reactNative.TouchableOpacity,
|
|
6431
|
-
{
|
|
6432
|
-
key: cat.name,
|
|
6433
|
-
onPress: () => setActiveCategory(cat.name),
|
|
6434
|
-
activeOpacity: 0.7,
|
|
6435
|
-
touchSoundDisabled: true,
|
|
6436
|
-
accessibilityRole: "button",
|
|
6437
|
-
accessibilityLabel: cat.labelEs,
|
|
6438
|
-
accessibilityState: { selected: activeCategory === cat.name },
|
|
6439
|
-
style: [
|
|
6440
|
-
styles47.categoryChip,
|
|
7006
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles48.categoryChipInner }, renderIcon("grid", ms(14), activeCategory === null ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React55__default.default.createElement(
|
|
7007
|
+
reactNative.Text,
|
|
6441
7008
|
{
|
|
6442
|
-
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
|
|
7009
|
+
style: [
|
|
7010
|
+
styles48.categoryChipText,
|
|
7011
|
+
{ color: activeCategory === null ? colors.primaryForeground : colors.foreground }
|
|
7012
|
+
],
|
|
7013
|
+
allowFontScaling: true,
|
|
7014
|
+
numberOfLines: 1
|
|
7015
|
+
},
|
|
7016
|
+
"Todos"
|
|
7017
|
+
))
|
|
7018
|
+
),
|
|
7019
|
+
CURATED_ICONS.map((cat) => /* @__PURE__ */ React55__default.default.createElement(
|
|
7020
|
+
reactNative.TouchableOpacity,
|
|
6449
7021
|
{
|
|
7022
|
+
key: cat.name,
|
|
7023
|
+
onPress: () => setActiveCategory(cat.name),
|
|
7024
|
+
activeOpacity: 0.7,
|
|
7025
|
+
touchSoundDisabled: true,
|
|
7026
|
+
accessibilityRole: "button",
|
|
7027
|
+
accessibilityLabel: cat.labelEs,
|
|
7028
|
+
accessibilityState: { selected: activeCategory === cat.name },
|
|
6450
7029
|
style: [
|
|
6451
|
-
|
|
6452
|
-
{
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
7030
|
+
styles48.categoryChip,
|
|
7031
|
+
{
|
|
7032
|
+
backgroundColor: activeCategory === cat.name ? colors.primary : colors.surface,
|
|
7033
|
+
borderColor: activeCategory === cat.name ? colors.primary : colors.border
|
|
7034
|
+
}
|
|
7035
|
+
]
|
|
6456
7036
|
},
|
|
6457
|
-
cat.
|
|
7037
|
+
/* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles48.categoryChipInner }, renderIcon(cat.categoryIcon, ms(14), activeCategory === cat.name ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React55__default.default.createElement(
|
|
7038
|
+
reactNative.Text,
|
|
7039
|
+
{
|
|
7040
|
+
style: [
|
|
7041
|
+
styles48.categoryChipText,
|
|
7042
|
+
{ color: activeCategory === cat.name ? colors.primaryForeground : colors.foreground }
|
|
7043
|
+
],
|
|
7044
|
+
allowFontScaling: true,
|
|
7045
|
+
numberOfLines: 1
|
|
7046
|
+
},
|
|
7047
|
+
cat.labelEs
|
|
7048
|
+
))
|
|
6458
7049
|
))
|
|
6459
|
-
))
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6465
|
-
|
|
6466
|
-
|
|
6467
|
-
|
|
6468
|
-
|
|
6469
|
-
|
|
6470
|
-
|
|
6471
|
-
|
|
7050
|
+
), /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles48.separator, { backgroundColor: colors.border }] }), cellSize > 0 ? rows.map((row, i) => /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { key: row[0] ?? `row-${i}`, style: [styles48.row, { marginBottom: gapPx }] }, row.map((name) => /* @__PURE__ */ React55__default.default.createElement(
|
|
7051
|
+
IconCellMemo,
|
|
7052
|
+
{
|
|
7053
|
+
key: name,
|
|
7054
|
+
name,
|
|
7055
|
+
selected: value === name,
|
|
7056
|
+
size: cellSize,
|
|
7057
|
+
onPress: () => {
|
|
7058
|
+
handleSelect(name);
|
|
7059
|
+
sheetRef.current?.dismiss();
|
|
7060
|
+
}
|
|
7061
|
+
}
|
|
7062
|
+
)), Array.from({ length: numColumns - row.length }).map((_, j) => /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { key: `spacer-${j}`, style: { width: cellSize, height: cellSize } })))) : null)
|
|
7063
|
+
)
|
|
6472
7064
|
)
|
|
6473
7065
|
));
|
|
6474
7066
|
}
|
|
6475
|
-
var
|
|
7067
|
+
var styles48 = reactNative.StyleSheet.create({
|
|
6476
7068
|
triggerContainer: {
|
|
6477
7069
|
gap: vs(8)
|
|
6478
7070
|
},
|
|
@@ -6548,6 +7140,11 @@ var styles47 = reactNative.StyleSheet.create({
|
|
|
6548
7140
|
borderRadius: RADIUS.md,
|
|
6549
7141
|
alignItems: "center",
|
|
6550
7142
|
justifyContent: "center"
|
|
7143
|
+
},
|
|
7144
|
+
loader: {
|
|
7145
|
+
minHeight: vs(200),
|
|
7146
|
+
alignItems: "center",
|
|
7147
|
+
justifyContent: "center"
|
|
6551
7148
|
}
|
|
6552
7149
|
});
|
|
6553
7150
|
var sizeConfig = {
|
|
@@ -6581,18 +7178,18 @@ function NumberStepperBase({
|
|
|
6581
7178
|
};
|
|
6582
7179
|
const { button: buttonSize, icon: iconSize, valueFontSize, valueLineHeight, valueMinWidth } = sizeConfig[size];
|
|
6583
7180
|
const displayValue = String(value);
|
|
6584
|
-
return /* @__PURE__ */
|
|
7181
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles49.container, style] }, /* @__PURE__ */ React55__default.default.createElement(
|
|
6585
7182
|
PressableButton,
|
|
6586
7183
|
{
|
|
6587
7184
|
style: [
|
|
6588
|
-
|
|
7185
|
+
styles49.button,
|
|
6589
7186
|
{
|
|
6590
7187
|
width: buttonSize,
|
|
6591
7188
|
height: buttonSize,
|
|
6592
7189
|
backgroundColor: colors.surface,
|
|
6593
7190
|
borderColor: colors.border
|
|
6594
7191
|
},
|
|
6595
|
-
!canDecrement &&
|
|
7192
|
+
!canDecrement && styles49.buttonDisabled
|
|
6596
7193
|
],
|
|
6597
7194
|
enabled: canDecrement,
|
|
6598
7195
|
onPress: handleDecrement,
|
|
@@ -6603,11 +7200,11 @@ function NumberStepperBase({
|
|
|
6603
7200
|
accessibilityState: { disabled: !canDecrement }
|
|
6604
7201
|
},
|
|
6605
7202
|
renderIcon("minus", iconSize, canDecrement ? colors.foreground : colors.foregroundMuted)
|
|
6606
|
-
), /* @__PURE__ */
|
|
7203
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
6607
7204
|
reactNative.Text,
|
|
6608
7205
|
{
|
|
6609
7206
|
style: [
|
|
6610
|
-
|
|
7207
|
+
styles49.value,
|
|
6611
7208
|
{
|
|
6612
7209
|
color: colors.foreground,
|
|
6613
7210
|
fontSize: valueFontSize,
|
|
@@ -6620,18 +7217,18 @@ function NumberStepperBase({
|
|
|
6620
7217
|
accessibilityRole: "text"
|
|
6621
7218
|
},
|
|
6622
7219
|
displayValue
|
|
6623
|
-
), /* @__PURE__ */
|
|
7220
|
+
), /* @__PURE__ */ React55__default.default.createElement(
|
|
6624
7221
|
PressableButton,
|
|
6625
7222
|
{
|
|
6626
7223
|
style: [
|
|
6627
|
-
|
|
7224
|
+
styles49.button,
|
|
6628
7225
|
{
|
|
6629
7226
|
width: buttonSize,
|
|
6630
7227
|
height: buttonSize,
|
|
6631
7228
|
backgroundColor: colors.surface,
|
|
6632
7229
|
borderColor: colors.border
|
|
6633
7230
|
},
|
|
6634
|
-
!canIncrement &&
|
|
7231
|
+
!canIncrement && styles49.buttonDisabled
|
|
6635
7232
|
],
|
|
6636
7233
|
enabled: canIncrement,
|
|
6637
7234
|
onPress: handleIncrement,
|
|
@@ -6644,8 +7241,8 @@ function NumberStepperBase({
|
|
|
6644
7241
|
renderIcon("plus", iconSize, canIncrement ? colors.foreground : colors.foregroundMuted)
|
|
6645
7242
|
));
|
|
6646
7243
|
}
|
|
6647
|
-
var NumberStepper =
|
|
6648
|
-
var
|
|
7244
|
+
var NumberStepper = React55__default.default.memo(NumberStepperBase);
|
|
7245
|
+
var styles49 = reactNative.StyleSheet.create({
|
|
6649
7246
|
container: {
|
|
6650
7247
|
flexDirection: "row",
|
|
6651
7248
|
alignItems: "center",
|
|
@@ -6665,6 +7262,161 @@ var styles48 = reactNative.StyleSheet.create({
|
|
|
6665
7262
|
textAlign: "center"
|
|
6666
7263
|
}
|
|
6667
7264
|
});
|
|
7265
|
+
var COMPACT_THRESHOLD = s(150);
|
|
7266
|
+
function StatsComponent({
|
|
7267
|
+
value,
|
|
7268
|
+
label,
|
|
7269
|
+
description,
|
|
7270
|
+
icon,
|
|
7271
|
+
iconName,
|
|
7272
|
+
iconColor,
|
|
7273
|
+
variant = "elevated",
|
|
7274
|
+
size = "default",
|
|
7275
|
+
onPress,
|
|
7276
|
+
style,
|
|
7277
|
+
accessibilityLabel
|
|
7278
|
+
}) {
|
|
7279
|
+
const { colors } = useTheme();
|
|
7280
|
+
const [containerWidth, setContainerWidth] = React55.useState(0);
|
|
7281
|
+
const handleLayout = React55.useCallback((e) => {
|
|
7282
|
+
const w = e.nativeEvent.layout.width;
|
|
7283
|
+
if (w > 0 && w !== containerWidth) {
|
|
7284
|
+
setContainerWidth(w);
|
|
7285
|
+
}
|
|
7286
|
+
}, [containerWidth]);
|
|
7287
|
+
const handlePress = () => {
|
|
7288
|
+
if (!onPress) return;
|
|
7289
|
+
impactLight();
|
|
7290
|
+
onPress();
|
|
7291
|
+
};
|
|
7292
|
+
const isCompact = containerWidth > 0 && containerWidth < COMPACT_THRESHOLD && !!(icon ?? iconName);
|
|
7293
|
+
const sizeStyles2 = size === "compact" ? {
|
|
7294
|
+
valueFontFamily: "Sohne-SemiBold",
|
|
7295
|
+
valueFontSize: ms(16),
|
|
7296
|
+
valueLineHeight: mvs(20),
|
|
7297
|
+
labelFontSize: ms(11),
|
|
7298
|
+
labelLineHeight: mvs(14),
|
|
7299
|
+
descriptionFontSize: ms(10),
|
|
7300
|
+
descriptionLineHeight: mvs(14),
|
|
7301
|
+
iconSize: ms(18),
|
|
7302
|
+
padding: s(12)
|
|
7303
|
+
} : {
|
|
7304
|
+
valueFontFamily: "Sohne-Bold",
|
|
7305
|
+
valueFontSize: ms(21),
|
|
7306
|
+
valueLineHeight: mvs(25),
|
|
7307
|
+
labelFontSize: ms(13),
|
|
7308
|
+
labelLineHeight: mvs(18),
|
|
7309
|
+
descriptionFontSize: ms(12),
|
|
7310
|
+
descriptionLineHeight: mvs(16),
|
|
7311
|
+
iconSize: ms(20),
|
|
7312
|
+
padding: s(16)
|
|
7313
|
+
};
|
|
7314
|
+
const variantStyle = {
|
|
7315
|
+
elevated: {
|
|
7316
|
+
backgroundColor: colors.card,
|
|
7317
|
+
borderWidth: 0,
|
|
7318
|
+
shadowColor: "#000",
|
|
7319
|
+
shadowOffset: { width: 0, height: 4 },
|
|
7320
|
+
shadowOpacity: 0.09,
|
|
7321
|
+
shadowRadius: 14,
|
|
7322
|
+
elevation: 4
|
|
7323
|
+
},
|
|
7324
|
+
outlined: {
|
|
7325
|
+
backgroundColor: colors.card,
|
|
7326
|
+
borderColor: colors.border,
|
|
7327
|
+
shadowOpacity: 0,
|
|
7328
|
+
elevation: 0
|
|
7329
|
+
},
|
|
7330
|
+
filled: {
|
|
7331
|
+
backgroundColor: colors.surfaceStrong,
|
|
7332
|
+
borderColor: colors.border,
|
|
7333
|
+
shadowOpacity: 0,
|
|
7334
|
+
elevation: 0
|
|
7335
|
+
}
|
|
7336
|
+
}[variant];
|
|
7337
|
+
const iconColorResolved = iconColor ?? colors.primary;
|
|
7338
|
+
const resolvedIcon = iconName ? renderIcon(iconName, sizeStyles2.iconSize, iconColorResolved) : icon;
|
|
7339
|
+
const iconElement = resolvedIcon ? /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles50.iconWrapper }, resolvedIcon) : null;
|
|
7340
|
+
const valueElement = /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles50.value, { color: colors.foreground, fontFamily: sizeStyles2.valueFontFamily, fontSize: sizeStyles2.valueFontSize, lineHeight: sizeStyles2.valueLineHeight }], allowFontScaling: true }, value);
|
|
7341
|
+
const cardContent = /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles50.card, variantStyle, { padding: sizeStyles2.padding }, style], onLayout: handleLayout }, isCompact ? /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, iconElement, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles50.compactValue }, valueElement), /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles50.label, { color: colors.foregroundSubtle, fontSize: sizeStyles2.labelFontSize, lineHeight: sizeStyles2.labelLineHeight }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles50.description, { color: colors.foregroundMuted, fontSize: sizeStyles2.descriptionFontSize, lineHeight: sizeStyles2.descriptionLineHeight }], allowFontScaling: true }, description) : null) : /* @__PURE__ */ React55__default.default.createElement(React55__default.default.Fragment, null, /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles50.valueRow }, iconElement, valueElement), /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles50.label, { color: colors.foregroundSubtle, fontSize: sizeStyles2.labelFontSize, lineHeight: sizeStyles2.labelLineHeight }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React55__default.default.createElement(reactNative.Text, { style: [styles50.description, { color: colors.foregroundMuted, fontSize: sizeStyles2.descriptionFontSize, lineHeight: sizeStyles2.descriptionLineHeight }], allowFontScaling: true }, description) : null));
|
|
7342
|
+
if (onPress) {
|
|
7343
|
+
return /* @__PURE__ */ React55__default.default.createElement(
|
|
7344
|
+
PressableCard,
|
|
7345
|
+
{
|
|
7346
|
+
onPress: handlePress,
|
|
7347
|
+
rippleColor: "transparent",
|
|
7348
|
+
touchSoundDisabled: true,
|
|
7349
|
+
activateOnHover: true,
|
|
7350
|
+
accessibilityRole: "button",
|
|
7351
|
+
accessibilityLabel
|
|
7352
|
+
},
|
|
7353
|
+
cardContent
|
|
7354
|
+
);
|
|
7355
|
+
}
|
|
7356
|
+
return cardContent;
|
|
7357
|
+
}
|
|
7358
|
+
function StatsGroup({ children, gap = s(12), style }) {
|
|
7359
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: [styles50.group, { gap }, style] }, React55__default.default.Children.map(children, (child) => {
|
|
7360
|
+
if (!React55__default.default.isValidElement(child)) return child;
|
|
7361
|
+
const childStyle = child.props.style;
|
|
7362
|
+
const mergedStyle = childStyle ? [childStyle, { alignSelf: "stretch" }] : [{ alignSelf: "stretch" }];
|
|
7363
|
+
return /* @__PURE__ */ React55__default.default.createElement(reactNative.View, { style: styles50.groupItem }, React55__default.default.cloneElement(
|
|
7364
|
+
child,
|
|
7365
|
+
{ style: mergedStyle }
|
|
7366
|
+
));
|
|
7367
|
+
}));
|
|
7368
|
+
}
|
|
7369
|
+
var Stats = Object.assign(React55__default.default.memo(StatsComponent), { Group: StatsGroup });
|
|
7370
|
+
var styles50 = reactNative.StyleSheet.create({
|
|
7371
|
+
card: {
|
|
7372
|
+
borderRadius: RADIUS.md,
|
|
7373
|
+
borderWidth: 1,
|
|
7374
|
+
padding: s(16),
|
|
7375
|
+
alignSelf: "flex-start",
|
|
7376
|
+
alignItems: "center",
|
|
7377
|
+
justifyContent: "center"
|
|
7378
|
+
},
|
|
7379
|
+
valueRow: {
|
|
7380
|
+
flexDirection: "row",
|
|
7381
|
+
alignItems: "center",
|
|
7382
|
+
justifyContent: "center",
|
|
7383
|
+
gap: s(8)
|
|
7384
|
+
},
|
|
7385
|
+
iconWrapper: {
|
|
7386
|
+
alignItems: "center",
|
|
7387
|
+
justifyContent: "center"
|
|
7388
|
+
},
|
|
7389
|
+
compactValue: {
|
|
7390
|
+
marginTop: vs(8)
|
|
7391
|
+
},
|
|
7392
|
+
value: {
|
|
7393
|
+
fontFamily: "Sohne-Bold",
|
|
7394
|
+
fontSize: ms(28),
|
|
7395
|
+
lineHeight: mvs(32),
|
|
7396
|
+
textAlign: "center"
|
|
7397
|
+
},
|
|
7398
|
+
label: {
|
|
7399
|
+
fontFamily: "Sohne-Regular",
|
|
7400
|
+
fontSize: ms(13),
|
|
7401
|
+
lineHeight: mvs(18),
|
|
7402
|
+
marginTop: vs(8),
|
|
7403
|
+
textAlign: "center"
|
|
7404
|
+
},
|
|
7405
|
+
description: {
|
|
7406
|
+
fontFamily: "Sohne-Regular",
|
|
7407
|
+
fontSize: ms(12),
|
|
7408
|
+
lineHeight: mvs(16),
|
|
7409
|
+
marginTop: vs(4),
|
|
7410
|
+
textAlign: "center"
|
|
7411
|
+
},
|
|
7412
|
+
group: {
|
|
7413
|
+
flexDirection: "row",
|
|
7414
|
+
width: "100%"
|
|
7415
|
+
},
|
|
7416
|
+
groupItem: {
|
|
7417
|
+
flex: 1
|
|
7418
|
+
}
|
|
7419
|
+
});
|
|
6668
7420
|
|
|
6669
7421
|
// src/utils/typography.ts
|
|
6670
7422
|
function getResponsiveFontSize(text, maxSize, steps = [
|
|
@@ -6680,14 +7432,14 @@ function getResponsiveFontSize(text, maxSize, steps = [
|
|
|
6680
7432
|
return maxSize - 8;
|
|
6681
7433
|
}
|
|
6682
7434
|
function useConfirmDialog(options) {
|
|
6683
|
-
const [visible, setVisible] =
|
|
6684
|
-
const [target, setTarget] =
|
|
6685
|
-
const [loading, setLoading] =
|
|
6686
|
-
const open =
|
|
7435
|
+
const [visible, setVisible] = React55.useState(false);
|
|
7436
|
+
const [target, setTarget] = React55.useState(null);
|
|
7437
|
+
const [loading, setLoading] = React55.useState(false);
|
|
7438
|
+
const open = React55.useCallback((t) => {
|
|
6687
7439
|
setTarget(t ?? null);
|
|
6688
7440
|
setVisible(true);
|
|
6689
7441
|
}, []);
|
|
6690
|
-
const handleConfirm =
|
|
7442
|
+
const handleConfirm = React55.useCallback(async () => {
|
|
6691
7443
|
setLoading(true);
|
|
6692
7444
|
try {
|
|
6693
7445
|
await options.onConfirm();
|
|
@@ -6697,7 +7449,7 @@ function useConfirmDialog(options) {
|
|
|
6697
7449
|
setTarget(null);
|
|
6698
7450
|
}
|
|
6699
7451
|
}, [options]);
|
|
6700
|
-
const handleCancel =
|
|
7452
|
+
const handleCancel = React55.useCallback(() => {
|
|
6701
7453
|
setVisible(false);
|
|
6702
7454
|
setTarget(null);
|
|
6703
7455
|
options.onCancel?.();
|
|
@@ -6718,11 +7470,11 @@ function useConfirmDialog(options) {
|
|
|
6718
7470
|
|
|
6719
7471
|
Object.defineProperty(exports, "BottomSheetModalProvider", {
|
|
6720
7472
|
enumerable: true,
|
|
6721
|
-
get: function () { return
|
|
7473
|
+
get: function () { return bottomSheet.BottomSheetModalProvider; }
|
|
6722
7474
|
});
|
|
6723
7475
|
Object.defineProperty(exports, "SheetTextInput", {
|
|
6724
7476
|
enumerable: true,
|
|
6725
|
-
get: function () { return
|
|
7477
|
+
get: function () { return bottomSheet.BottomSheetTextInput; }
|
|
6726
7478
|
});
|
|
6727
7479
|
Object.defineProperty(exports, "toast", {
|
|
6728
7480
|
enumerable: true,
|
|
@@ -6776,7 +7528,7 @@ exports.MenuItem = MenuItem;
|
|
|
6776
7528
|
exports.MonthPicker = MonthPicker;
|
|
6777
7529
|
exports.NumberStepper = NumberStepper;
|
|
6778
7530
|
exports.PagerDots = PagerDots;
|
|
6779
|
-
exports.Pressable =
|
|
7531
|
+
exports.Pressable = Pressable2;
|
|
6780
7532
|
exports.PricingCard = PricingCard;
|
|
6781
7533
|
exports.Progress = Progress;
|
|
6782
7534
|
exports.RADIUS = RADIUS;
|
|
@@ -6785,6 +7537,8 @@ exports.RetrayProvider = RetrayProvider;
|
|
|
6785
7537
|
exports.SHADOWS = SHADOWS;
|
|
6786
7538
|
exports.SPACING = SPACING;
|
|
6787
7539
|
exports.Select = Select;
|
|
7540
|
+
exports.SelectableCard = SelectableCard;
|
|
7541
|
+
exports.SelectableCardGroup = SelectableCardGroup;
|
|
6788
7542
|
exports.SelectableGrid = SelectableGrid;
|
|
6789
7543
|
exports.Separator = Separator;
|
|
6790
7544
|
exports.Sheet = Sheet;
|
|
@@ -6792,6 +7546,7 @@ exports.SheetSelect = SheetSelect;
|
|
|
6792
7546
|
exports.Skeleton = Skeleton;
|
|
6793
7547
|
exports.Slider = Slider;
|
|
6794
7548
|
exports.Spinner = Spinner;
|
|
7549
|
+
exports.Stats = Stats;
|
|
6795
7550
|
exports.Switch = Switch;
|
|
6796
7551
|
exports.TYPOGRAPHY = TYPOGRAPHY;
|
|
6797
7552
|
exports.TabBar = TabBar;
|
|
@@ -6823,3 +7578,4 @@ exports.selectionAsync = selectionAsync;
|
|
|
6823
7578
|
exports.useConfirmDialog = useConfirmDialog;
|
|
6824
7579
|
exports.useTheme = useTheme;
|
|
6825
7580
|
exports.useToast = useToast;
|
|
7581
|
+
exports.withAlpha = withAlpha;
|