@retray-dev/ui-kit 10.2.0 → 12.1.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.
Files changed (153) hide show
  1. package/COMPONENTS.md +287 -37
  2. package/README.md +11 -2
  3. package/dist/Accordion.mjs +2 -2
  4. package/dist/AlertBanner.mjs +2 -2
  5. package/dist/AppHeader.mjs +3 -3
  6. package/dist/Avatar.mjs +2 -2
  7. package/dist/Badge.mjs +2 -2
  8. package/dist/Button.mjs +2 -2
  9. package/dist/Card.mjs +2 -2
  10. package/dist/CategoryStrip.mjs +2 -2
  11. package/dist/Checkbox.mjs +2 -2
  12. package/dist/Chip.mjs +2 -2
  13. package/dist/ConfirmDialog.d.mts +1 -6
  14. package/dist/ConfirmDialog.d.ts +1 -6
  15. package/dist/ConfirmDialog.js +29 -23
  16. package/dist/ConfirmDialog.mjs +3 -3
  17. package/dist/CurrencyDisplay.mjs +2 -2
  18. package/dist/CurrencyInput.d.mts +3 -8
  19. package/dist/CurrencyInput.d.ts +3 -8
  20. package/dist/CurrencyInput.js +3 -1
  21. package/dist/CurrencyInput.mjs +3 -3
  22. package/dist/DetailRow.mjs +2 -2
  23. package/dist/EmptyState.mjs +3 -3
  24. package/dist/ErrorBoundary.mjs +2 -2
  25. package/dist/Form.mjs +2 -2
  26. package/dist/IconButton.mjs +2 -2
  27. package/dist/IconPicker.js +675 -248
  28. package/dist/IconPicker.mjs +3 -2
  29. package/dist/ImageUpload.mjs +3 -3
  30. package/dist/ImageViewer.mjs +4 -4
  31. package/dist/Input.mjs +2 -2
  32. package/dist/LabelValue.mjs +2 -2
  33. package/dist/ListGroup.mjs +2 -2
  34. package/dist/ListItem.d.mts +7 -7
  35. package/dist/ListItem.d.ts +7 -7
  36. package/dist/ListItem.js +12 -7
  37. package/dist/ListItem.mjs +2 -2
  38. package/dist/MediaCard.mjs +2 -2
  39. package/dist/MenuGroup.mjs +2 -2
  40. package/dist/MenuItem.mjs +2 -2
  41. package/dist/MonthPicker.mjs +2 -2
  42. package/dist/NumberStepper.mjs +2 -2
  43. package/dist/PagerDots.mjs +2 -2
  44. package/dist/Pressable.d.mts +15 -7
  45. package/dist/Pressable.d.ts +15 -7
  46. package/dist/Pressable.js +7 -3
  47. package/dist/Pressable.mjs +1 -1
  48. package/dist/PricingCard.mjs +4 -4
  49. package/dist/Progress.mjs +2 -2
  50. package/dist/RadioGroup.mjs +2 -2
  51. package/dist/RetrayProvider.mjs +3 -3
  52. package/dist/Select.mjs +2 -2
  53. package/dist/SelectableGrid.mjs +2 -2
  54. package/dist/Separator.mjs +2 -2
  55. package/dist/Sheet.d.mts +4 -46
  56. package/dist/Sheet.d.ts +4 -46
  57. package/dist/Sheet.js +46 -114
  58. package/dist/Sheet.mjs +2 -3
  59. package/dist/SheetSelect.mjs +2 -2
  60. package/dist/Skeleton.mjs +2 -2
  61. package/dist/Slider.mjs +2 -2
  62. package/dist/Spinner.mjs +2 -2
  63. package/dist/Stats.d.mts +30 -0
  64. package/dist/Stats.d.ts +30 -0
  65. package/dist/Stats.js +429 -0
  66. package/dist/Stats.mjs +9 -0
  67. package/dist/Switch.mjs +2 -2
  68. package/dist/TabBar.mjs +2 -2
  69. package/dist/Tabs.mjs +2 -2
  70. package/dist/Text.d.mts +3 -1
  71. package/dist/Text.d.ts +3 -1
  72. package/dist/Text.js +3 -3
  73. package/dist/Text.mjs +2 -2
  74. package/dist/Textarea.mjs +2 -2
  75. package/dist/Toast.mjs +2 -2
  76. package/dist/Toggle.mjs +2 -2
  77. package/dist/{chunk-YJ7I257J.mjs → chunk-265G6A46.mjs} +1 -1
  78. package/dist/{chunk-ELXBDILQ.mjs → chunk-2A2LEFZG.mjs} +2 -2
  79. package/dist/{chunk-ID72TK46.mjs → chunk-2CBQKU7H.mjs} +1 -1
  80. package/dist/{chunk-OB4JUQ3O.mjs → chunk-2I2AYECM.mjs} +1 -1
  81. package/dist/{chunk-WJLKJMKR.mjs → chunk-357YO24D.mjs} +4 -4
  82. package/dist/{chunk-GQYFLP3D.mjs → chunk-3GEYJ7I5.mjs} +1 -1
  83. package/dist/{chunk-AV4EMIRH.mjs → chunk-3N2M3WZL.mjs} +1 -1
  84. package/dist/{chunk-VF2ATYN3.mjs → chunk-3UYAZ7I4.mjs} +1 -1
  85. package/dist/{chunk-JMOZEC77.mjs → chunk-4WFMPFZB.mjs} +1 -1
  86. package/dist/chunk-5OLNXP3S.mjs +144 -0
  87. package/dist/{chunk-6SECQ2ZF.mjs → chunk-7HSILTC4.mjs} +2 -2
  88. package/dist/{chunk-IRRY3CRZ.mjs → chunk-AKM4EPOT.mjs} +1 -1
  89. package/dist/{chunk-IX3NYLYQ.mjs → chunk-AQEVCEXV.mjs} +1 -1
  90. package/dist/{chunk-WBOOUHSS.mjs → chunk-BCWEHE34.mjs} +1 -1
  91. package/dist/{chunk-AJ7ZDNBT.mjs → chunk-BOVUP27T.mjs} +1 -1
  92. package/dist/{chunk-BRKYVJVV.mjs → chunk-BQZE3HAW.mjs} +1 -1
  93. package/dist/{chunk-Z6SFHN6T.mjs → chunk-D3Y2T42P.mjs} +1 -1
  94. package/dist/{chunk-T2KCAHOS.mjs → chunk-DF6DU42P.mjs} +1 -1
  95. package/dist/{chunk-TB6SD2FT.mjs → chunk-DI7CBDL6.mjs} +1 -1
  96. package/dist/{chunk-HTHGSXFG.mjs → chunk-DOGIPOF5.mjs} +1 -1
  97. package/dist/{chunk-MBMXYJJV.mjs → chunk-E7NEHHXV.mjs} +7 -3
  98. package/dist/{chunk-MX6HRKMI.mjs → chunk-EFLFRAHD.mjs} +1 -1
  99. package/dist/{chunk-SOYNZDVY.mjs → chunk-EMUWGDWC.mjs} +6 -1
  100. package/dist/{chunk-AJRVDP2H.mjs → chunk-F4V6XLP4.mjs} +3 -3
  101. package/dist/{chunk-DYT7BG5I.mjs → chunk-FA2KMTH5.mjs} +1 -1
  102. package/dist/{chunk-Y2NS74WS.mjs → chunk-FFTYLPSB.mjs} +46 -98
  103. package/dist/{chunk-VKID2D2I.mjs → chunk-FUVYSVGR.mjs} +13 -8
  104. package/dist/{chunk-7LWRKMF5.mjs → chunk-FVTVCJAH.mjs} +1 -1
  105. package/dist/{chunk-TZDGAP5N.mjs → chunk-GK4VRMNE.mjs} +2 -2
  106. package/dist/{chunk-6Q64UFIA.mjs → chunk-HJ46DTJE.mjs} +1 -1
  107. package/dist/{chunk-WF2XDFRK.mjs → chunk-HLMPMUK2.mjs} +1 -1
  108. package/dist/{chunk-GD6KXMG5.mjs → chunk-I4V5XZPS.mjs} +1 -1
  109. package/dist/{chunk-TBNZHU6C.mjs → chunk-ISY26JQJ.mjs} +2 -2
  110. package/dist/{chunk-X4G6APW6.mjs → chunk-J6Q2YJEV.mjs} +1 -1
  111. package/dist/{chunk-WYEUNUTP.mjs → chunk-JCZQOY4O.mjs} +31 -24
  112. package/dist/{chunk-U2XJFYED.mjs → chunk-JNVAIDLK.mjs} +1 -1
  113. package/dist/{chunk-SOA2Z4RB.mjs → chunk-JULSIZDM.mjs} +1 -1
  114. package/dist/chunk-KHYX4IOM.mjs +1114 -0
  115. package/dist/{chunk-RYZC432S.mjs → chunk-LRM4AVYY.mjs} +1 -1
  116. package/dist/{chunk-6L4G6PBT.mjs → chunk-MYZ2EDYU.mjs} +1 -1
  117. package/dist/{chunk-BUMAMSTZ.mjs → chunk-N4ZPVCJH.mjs} +1 -1
  118. package/dist/{chunk-Z4VHZ7B5.mjs → chunk-NXI4YDZ2.mjs} +1 -1
  119. package/dist/{chunk-ZZ2R6KZ3.mjs → chunk-OULVKTWL.mjs} +1 -1
  120. package/dist/{chunk-FCSSQK3L.mjs → chunk-P64WHW4A.mjs} +1 -1
  121. package/dist/{chunk-KOO4WITD.mjs → chunk-P73V2EKS.mjs} +1 -1
  122. package/dist/{chunk-SXLKNTA4.mjs → chunk-PGERH3P7.mjs} +1 -1
  123. package/dist/{chunk-2UYENBLV.mjs → chunk-QSFV2P7O.mjs} +1 -1
  124. package/dist/{chunk-JT7HKXRB.mjs → chunk-S3KJCPEJ.mjs} +1 -1
  125. package/dist/{chunk-BEMIQXXU.mjs → chunk-V6NFJXKO.mjs} +1 -1
  126. package/dist/{chunk-A3A6KNQN.mjs → chunk-WOEWGSTU.mjs} +1 -1
  127. package/dist/{chunk-NMU5FMQJ.mjs → chunk-X26S5EVZ.mjs} +4 -2
  128. package/dist/{chunk-YFZ3ELX5.mjs → chunk-XBAGGKLW.mjs} +2 -2
  129. package/dist/{chunk-S2R7UVOE.mjs → chunk-ZHMSAYLT.mjs} +1 -1
  130. package/dist/fonts.d.mts +1 -7
  131. package/dist/fonts.d.ts +1 -7
  132. package/dist/fonts.js +0 -2
  133. package/dist/fonts.mjs +1 -2
  134. package/dist/index.d.mts +4 -1
  135. package/dist/index.d.ts +4 -1
  136. package/dist/index.js +1184 -708
  137. package/dist/index.mjs +53 -52
  138. package/package.json +3 -3
  139. package/src/components/ConfirmDialog/ConfirmDialog.tsx +39 -30
  140. package/src/components/CurrencyInput/CurrencyInput.tsx +4 -7
  141. package/src/components/IconPicker/IconPicker.tsx +124 -112
  142. package/src/components/ListItem/ListItem.tsx +43 -28
  143. package/src/components/Pressable/Pressable.tsx +20 -8
  144. package/src/components/Sheet/Sheet.tsx +64 -172
  145. package/src/components/Stats/Stats.tsx +226 -0
  146. package/src/components/Stats/index.ts +2 -0
  147. package/src/components/Text/Text.tsx +4 -2
  148. package/src/fonts.ts +0 -7
  149. package/src/index.ts +4 -0
  150. package/src/theme/colorUtils.ts +9 -0
  151. package/src/utils/curatedIcons.ts +698 -135
  152. package/src/utils/fontGuard.ts +2 -1
  153. package/dist/chunk-53Z3NYGE.mjs +0 -742
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React25 = require('react');
3
+ var React54 = 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 BottomSheet = require('@gorhom/bottom-sheet');
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 React25__default = /*#__PURE__*/_interopDefault(React25);
27
+ var React54__default = /*#__PURE__*/_interopDefault(React54);
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 = {
@@ -168,23 +172,23 @@ function deriveColors(t, scheme) {
168
172
  }
169
173
 
170
174
  // src/theme/ThemeProvider.tsx
171
- var ThemeContext = React25.createContext({
175
+ var ThemeContext = React54.createContext({
172
176
  colors: deriveColors(defaultLight, "light"),
173
177
  colorScheme: "light"
174
178
  });
175
179
  function ThemeProvider({ children, theme, colorScheme = "system" }) {
176
180
  const systemScheme = reactNative.useColorScheme() ?? "light";
177
181
  const resolvedScheme = colorScheme === "system" ? systemScheme : colorScheme;
178
- const colors = React25.useMemo(() => {
182
+ const colors = React54.useMemo(() => {
179
183
  const base = resolvedScheme === "dark" ? defaultDark : defaultLight;
180
184
  const override = resolvedScheme === "dark" ? theme?.dark : theme?.light;
181
185
  const merged = override ? { ...base, ...override } : base;
182
186
  return deriveColors(merged, resolvedScheme);
183
187
  }, [resolvedScheme, theme]);
184
- return /* @__PURE__ */ React25__default.default.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
188
+ return /* @__PURE__ */ React54__default.default.createElement(ThemeContext.Provider, { value: { colors, colorScheme: resolvedScheme } }, children);
185
189
  }
186
190
  function useTheme() {
187
- const context = React25.useContext(ThemeContext);
191
+ const context = React54.useContext(ThemeContext);
188
192
  if (!context) {
189
193
  throw new Error("useTheme must be used within a ThemeProvider");
190
194
  }
@@ -408,10 +412,10 @@ function Icon({ name, size, color, family }) {
408
412
  }
409
413
  if (!resolved) return null;
410
414
  const Component = resolved.component;
411
- return React25__default.default.createElement(Component, { name, size, color });
415
+ return React54__default.default.createElement(Component, { name, size, color });
412
416
  }
413
417
  function renderIcon(name, size, color) {
414
- return React25__default.default.createElement(Icon, { name, size, color });
418
+ return React54__default.default.createElement(Icon, { name, size, color });
415
419
  }
416
420
 
417
421
  // src/tokens.ts
@@ -736,7 +740,7 @@ function ButtonBase({
736
740
  const styleArray = Array.isArray(style) ? style : style ? [style] : [];
737
741
  const flatStyle = reactNative.StyleSheet.flatten(styleArray);
738
742
  const { flex, ...restStyle } = flatStyle || {};
739
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [fullWidth && styles.fullWidth, flex !== void 0 && { flex }] }, /* @__PURE__ */ React25__default.default.createElement(
743
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [fullWidth && styles.fullWidth, flex !== void 0 && { flex }] }, /* @__PURE__ */ React54__default.default.createElement(
740
744
  PressableButton,
741
745
  {
742
746
  style: [
@@ -757,7 +761,7 @@ function ButtonBase({
757
761
  accessibilityHint,
758
762
  accessibilityState: { disabled: isDisabled, busy: loading }
759
763
  },
760
- loading ? /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, /* @__PURE__ */ React25__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor, style: { marginRight: s(6) } }), /* @__PURE__ */ React25__default.default.createElement(
764
+ loading ? /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, /* @__PURE__ */ React54__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor, style: { marginRight: s(6) } }), /* @__PURE__ */ React54__default.default.createElement(
761
765
  reactNative.Text,
762
766
  {
763
767
  style: [styles.label, labelVariantStyle, labelSizeStyles[size], styles.labelLoading],
@@ -765,7 +769,7 @@ function ButtonBase({
765
769
  numberOfLines: 1
766
770
  },
767
771
  label
768
- )) : /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, effectiveIcon), /* @__PURE__ */ React25__default.default.createElement(
772
+ )) : /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, effectiveIcon), /* @__PURE__ */ React54__default.default.createElement(
769
773
  reactNative.Text,
770
774
  {
771
775
  style: [styles.label, labelVariantStyle, labelSizeStyles[size], effectiveIcon ? styles.labelWithIcon : void 0],
@@ -773,10 +777,10 @@ function ButtonBase({
773
777
  numberOfLines: 1
774
778
  },
775
779
  label
776
- ), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, effectiveIcon))
780
+ ), effectiveIcon && iconPosition === "right" && /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, effectiveIcon))
777
781
  ));
778
782
  }
779
- var Button = React25__default.default.memo(ButtonBase);
783
+ var Button = React54__default.default.memo(ButtonBase);
780
784
  var styles = reactNative.StyleSheet.create({
781
785
  base: {
782
786
  borderRadius: RADIUS.md,
@@ -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__ */ React25__default.default.createElement(
809
+ return /* @__PURE__ */ React54__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
- React25__default.default.Children.map(children, (child) => {
816
- if (!React25__default.default.isValidElement(child)) return child;
819
+ React54__default.default.Children.map(children, (child) => {
820
+ if (!React54__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 React25__default.default.cloneElement(child, extraProps);
828
+ return React54__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__ */ React25__default.default.createElement(reactNative.View, { style: styles3.wrapper }, /* @__PURE__ */ React25__default.default.createElement(
889
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles3.wrapper }, /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : resolvedIcon
906
- ), showBadge && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [
909
+ loading ? /* @__PURE__ */ React54__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor }) : resolvedIcon
910
+ ), showBadge && /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.Text, { style: [styles3.badgeText, { color: colors.primaryForeground }] }, badgeCount)));
914
+ ] }, showCount && /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles3.badgeText, { color: colors.primaryForeground }] }, badgeCount)));
911
915
  }
912
- var IconButton = React25__default.default.memo(IconButtonBase);
916
+ var IconButton = React54__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 { SohneFonts } from '@retray-dev/ui-kit/fonts'\n\n const [fontsLoaded] = useFonts(SohneFonts)\n if (!fontsLoaded) return null\n"
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__ */ React25__default.default.createElement(
1011
+ return /* @__PURE__ */ React54__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 = React25__default.default.memo(TextBase);
1021
+ var Text3 = React54__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] = React25.useState(false);
1022
- const [showPassword, setShowPassword] = React25.useState(false);
1025
+ const [focused, setFocused] = React54.useState(false);
1026
+ const [showPassword, setShowPassword] = React54.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__ */ React25__default.default.createElement(
1031
+ const effectiveSuffix = isPassword && !suffix && !suffixIcon ? /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(vectorIcons.AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.foregroundMuted })
1040
+ /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.View, { style: [styles4.container, isDisabled && styles4.containerDisabled, containerStyle] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles4.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React25__default.default.createElement(
1043
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles4.container, isDisabled && styles4.containerDisabled, containerStyle] }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles4.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.Text, { style: [styles4.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles4.prefixContainer }, effectivePrefix) : null,
1052
- sheetMode ? /* @__PURE__ */ React25__default.default.createElement(
1053
- BottomSheet.BottomSheetTextInput,
1055
+ effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles4.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles4.prefixContainer }, effectivePrefix) : null,
1056
+ sheetMode ? /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(
1080
+ ) : /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.Text, { style: [styles4.suffixText, { color: colors.foregroundMuted }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles4.suffixContainer }, effectiveSuffix) : null
1102
- ), error ? /* @__PURE__ */ React25__default.default.createElement(
1105
+ effectiveSuffix ? typeof effectiveSuffix === "string" ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles4.suffixText, { color: colors.foregroundMuted }, suffixStyle], allowFontScaling: true }, effectiveSuffix) : /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles4.suffixContainer }, effectiveSuffix) : null
1106
+ ), error ? /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.Text, { style: [styles4.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
1114
+ ) : null, !error && hint ? /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(
1216
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.Text, { style: [styles5.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content
1224
+ typeof content === "string" ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles5.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content
1221
1225
  );
1222
1226
  }
1223
- var Badge = React25__default.default.memo(BadgeBase);
1227
+ var Badge = React54__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__ */ React25__default.default.createElement(reactNative.View, { style: [styles6.card, variantStyle, style] }, children);
1272
+ const cardContent = /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles6.card, variantStyle, style] }, children);
1269
1273
  if (onPress) {
1270
- return /* @__PURE__ */ React25__default.default.createElement(
1274
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.View, { style: [styles6.header, style] }, children);
1290
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.Text, { style: [styles6.title, { color: colors.foreground }, style], allowFontScaling: true }, children);
1294
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.Text, { style: [styles6.description, { color: colors.foregroundSubtle }, style], allowFontScaling: true }, children);
1298
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.View, { style: [styles6.content, style] }, children);
1301
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles6.content, style] }, children);
1298
1302
  }
1299
1303
  function CardFooter({ children, style }) {
1300
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles6.footer, style] }, children);
1304
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(
1342
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(
1377
+ return /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props }),
1382
- /* @__PURE__ */ React25__default.default.createElement(
1385
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap2[size], color: color ?? colors.primary, ...props }),
1386
+ /* @__PURE__ */ React54__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__ */ React25__default.default.createElement(
1396
+ return /* @__PURE__ */ React54__default.default.createElement(
1393
1397
  reactNative.ActivityIndicator,
1394
1398
  {
1395
1399
  size: sizeMap2[size],
@@ -1421,9 +1425,9 @@ function Skeleton({
1421
1425
  }) {
1422
1426
  const { colors, colorScheme } = useTheme();
1423
1427
  const shimmer = Animated12.useSharedValue(0);
1424
- const [containerWidth, setContainerWidth] = React25.useState(300);
1428
+ const [containerWidth, setContainerWidth] = React54.useState(300);
1425
1429
  const shimmerHighlight = colorScheme === "dark" ? "rgba(255,255,255,0.08)" : "rgba(255,255,255,0.7)";
1426
- React25.useEffect(() => {
1430
+ React54.useEffect(() => {
1427
1431
  shimmer.value = Animated12.withRepeat(
1428
1432
  Animated12.withTiming(1, { duration: TIMINGS.shimmer.duration, easing: Animated12.Easing.linear }),
1429
1433
  -1,
@@ -1436,7 +1440,7 @@ function Skeleton({
1436
1440
  const resolvedWidth = preset === "circle" ? s(diameter) : preset === "text" ? "60%" : width;
1437
1441
  const resolvedHeight = preset === "circle" ? s(diameter) : preset === "text" ? 14 : height;
1438
1442
  const resolvedRadius = preset === "circle" ? 9999 : preset === "text" ? 4 : borderRadius;
1439
- return /* @__PURE__ */ React25__default.default.createElement(
1443
+ return /* @__PURE__ */ React54__default.default.createElement(
1440
1444
  reactNative.View,
1441
1445
  {
1442
1446
  style: [
@@ -1449,7 +1453,7 @@ function Skeleton({
1449
1453
  accessibilityLabel: "Loading",
1450
1454
  accessibilityState: { busy: true }
1451
1455
  },
1452
- /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [reactNative.StyleSheet.absoluteFill, shimmerStyle] }, /* @__PURE__ */ React25__default.default.createElement(
1456
+ /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [reactNative.StyleSheet.absoluteFill, shimmerStyle] }, /* @__PURE__ */ React54__default.default.createElement(
1453
1457
  expoLinearGradient.LinearGradient,
1454
1458
  {
1455
1459
  colors: ["transparent", shimmerHighlight, "transparent"],
@@ -1469,10 +1473,10 @@ var aspectRatioMap = {
1469
1473
  };
1470
1474
  function MediaCardSkeleton({ aspectRatio = "4:3", showSubtitle = true, style }) {
1471
1475
  const ratio = aspectRatioMap[aspectRatio];
1472
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, /* @__PURE__ */ React25__default.default.createElement(Skeleton, { width: "100%", height: void 0, style: skeletonStyles.fill, borderRadius: RADIUS.md }))), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: skeletonStyles.meta }, /* @__PURE__ */ React25__default.default.createElement(Skeleton, { width: "70%", height: vs(14), borderRadius: RADIUS.xs }), showSubtitle ? /* @__PURE__ */ React25__default.default.createElement(Skeleton, { width: "45%", height: vs(12), borderRadius: RADIUS.xs }) : null));
1476
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, /* @__PURE__ */ React54__default.default.createElement(Skeleton, { width: "100%", height: void 0, style: skeletonStyles.fill, borderRadius: RADIUS.md }))), /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: skeletonStyles.meta }, /* @__PURE__ */ React54__default.default.createElement(Skeleton, { width: "70%", height: vs(14), borderRadius: RADIUS.xs }), showSubtitle ? /* @__PURE__ */ React54__default.default.createElement(Skeleton, { width: "45%", height: vs(12), borderRadius: RADIUS.xs }) : null));
1473
1477
  }
1474
1478
  function ListItemSkeleton({ showAvatar = true, showSubtitle = true, style }) {
1475
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [skeletonStyles.row, style] }, showAvatar ? /* @__PURE__ */ React25__default.default.createElement(Skeleton, { preset: "circle", diameter: 40 }) : null, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: skeletonStyles.rowText }, /* @__PURE__ */ React25__default.default.createElement(Skeleton, { width: "60%", height: vs(14), borderRadius: RADIUS.xs }), showSubtitle ? /* @__PURE__ */ React25__default.default.createElement(Skeleton, { width: "40%", height: vs(12), borderRadius: RADIUS.xs }) : null));
1479
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [skeletonStyles.row, style] }, showAvatar ? /* @__PURE__ */ React54__default.default.createElement(Skeleton, { preset: "circle", diameter: 40 }) : null, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: skeletonStyles.rowText }, /* @__PURE__ */ React54__default.default.createElement(Skeleton, { width: "60%", height: vs(14), borderRadius: RADIUS.xs }), showSubtitle ? /* @__PURE__ */ React54__default.default.createElement(Skeleton, { width: "40%", height: vs(12), borderRadius: RADIUS.xs }) : null));
1476
1480
  }
1477
1481
  function ListSkeleton({
1478
1482
  count = 6,
@@ -1483,10 +1487,10 @@ function ListSkeleton({
1483
1487
  style
1484
1488
  }) {
1485
1489
  if (columns <= 1) {
1486
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [{ gap: vs(gap) }, style] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React25__default.default.createElement(ListItemSkeleton, { key: i, showAvatar })));
1490
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [{ gap: vs(gap) }, style] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React54__default.default.createElement(ListItemSkeleton, { key: i, showAvatar })));
1487
1491
  }
1488
1492
  const widthPct = `${100 / columns}%`;
1489
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [skeletonStyles.grid, { marginHorizontal: -s(gap) / 2 }, style] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { key: i, style: { width: widthPct, paddingHorizontal: s(gap) / 2, marginBottom: vs(gap) } }, /* @__PURE__ */ React25__default.default.createElement(MediaCardSkeleton, { aspectRatio }))));
1493
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [skeletonStyles.grid, { marginHorizontal: -s(gap) / 2 }, style] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { key: i, style: { width: widthPct, paddingHorizontal: s(gap) / 2, marginBottom: vs(gap) } }, /* @__PURE__ */ React54__default.default.createElement(MediaCardSkeleton, { aspectRatio }))));
1490
1494
  }
1491
1495
  Skeleton.MediaCard = MediaCardSkeleton;
1492
1496
  Skeleton.ListItem = ListItemSkeleton;
@@ -1549,7 +1553,7 @@ function getInitials(fallback, fallbackText) {
1549
1553
  }
1550
1554
  function AvatarBase({ src, fallback, fallbackText, size = "md", status, style }) {
1551
1555
  const { colors } = useTheme();
1552
- const [imageError, setImageError] = React25.useState(false);
1556
+ const [imageError, setImageError] = React54.useState(false);
1553
1557
  const dimension = typeof size === "number" ? size : sizeMap3[size];
1554
1558
  const fontSize = typeof size === "number" ? size * 0.38 : fontSizeMap[size];
1555
1559
  const showFallback = !src || imageError;
@@ -1568,21 +1572,21 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
1568
1572
  overflow: "hidden"
1569
1573
  };
1570
1574
  const a11yLabel = fallbackText || fallback || "Avatar";
1571
- return /* @__PURE__ */ React25__default.default.createElement(
1575
+ return /* @__PURE__ */ React54__default.default.createElement(
1572
1576
  reactNative.View,
1573
1577
  {
1574
1578
  style: [styles10.wrapper, style],
1575
1579
  accessibilityRole: "image",
1576
1580
  accessibilityLabel: a11yLabel
1577
1581
  },
1578
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles10.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React25__default.default.createElement(
1582
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles10.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React54__default.default.createElement(
1579
1583
  reactNative.Image,
1580
1584
  {
1581
1585
  source: { uri: src },
1582
1586
  style: { width: dimension, height: dimension },
1583
1587
  onError: () => setImageError(true)
1584
1588
  }
1585
- ) : /* @__PURE__ */ React25__default.default.createElement(
1589
+ ) : /* @__PURE__ */ React54__default.default.createElement(
1586
1590
  reactNative.Text,
1587
1591
  {
1588
1592
  style: [styles10.fallback, { color: colors.foregroundMuted, fontSize }],
@@ -1590,7 +1594,7 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
1590
1594
  },
1591
1595
  getInitials(fallback, fallbackText)
1592
1596
  )),
1593
- status && /* @__PURE__ */ React25__default.default.createElement(
1597
+ status && /* @__PURE__ */ React54__default.default.createElement(
1594
1598
  reactNative.View,
1595
1599
  {
1596
1600
  style: [
@@ -1608,7 +1612,7 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
1608
1612
  )
1609
1613
  );
1610
1614
  }
1611
- var Avatar = React25__default.default.memo(AvatarBase);
1615
+ var Avatar = React54__default.default.memo(AvatarBase);
1612
1616
  var styles10 = reactNative.StyleSheet.create({
1613
1617
  wrapper: {
1614
1618
  alignSelf: "flex-start",
@@ -1633,15 +1637,15 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
1633
1637
  const accentColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : variant === "warning" ? colors.warning : colors.foreground;
1634
1638
  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
1639
  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__ */ React25__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: ms(16), color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: ms(17), color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: ms(17), color: accentColor }) : (
1640
+ const defaultIcon = variant === "success" ? /* @__PURE__ */ React54__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: ms(16), color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React54__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: ms(17), color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React54__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: ms(17), color: accentColor }) : (
1637
1641
  // AUDIT FIX: default variant previously used colors.primary (near-black)
1638
1642
  // as the info icon tint — ambiguous and heavy. accentResolved gives it
1639
1643
  // a meaningful chromatic signal when an accent is defined.
1640
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: ms(16), color: accentColor })
1644
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: ms(16), color: accentColor })
1641
1645
  );
1642
1646
  const effectiveIcon = iconName ? renderIcon(iconName, ms(16), iconColor ?? accentColor) : icon ?? defaultIcon;
1643
1647
  const a11yLabel = description ? `${title}. ${description}` : title;
1644
- return /* @__PURE__ */ React25__default.default.createElement(
1648
+ return /* @__PURE__ */ React54__default.default.createElement(
1645
1649
  reactNative.View,
1646
1650
  {
1647
1651
  style: [
@@ -1652,9 +1656,9 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
1652
1656
  accessibilityRole: "alert",
1653
1657
  accessibilityLabel: a11yLabel
1654
1658
  },
1655
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles11.iconSlot }, effectiveIcon),
1656
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles11.content }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles11.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles11.description, { color: colors.foreground, opacity: 0.85 }], allowFontScaling: true }, description) : null),
1657
- onDismiss ? /* @__PURE__ */ React25__default.default.createElement(
1659
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles11.iconSlot }, effectiveIcon),
1660
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles11.content }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles11.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles11.description, { color: colors.foreground, opacity: 0.85 }], allowFontScaling: true }, description) : null),
1661
+ onDismiss ? /* @__PURE__ */ React54__default.default.createElement(
1658
1662
  reactNative.TouchableOpacity,
1659
1663
  {
1660
1664
  onPress: onDismiss,
@@ -1663,7 +1667,7 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
1663
1667
  accessibilityRole: "button",
1664
1668
  accessibilityLabel: "Dismiss"
1665
1669
  },
1666
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "x", size: ms(16), color: colors.foregroundMuted })
1670
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Feather, { name: "x", size: ms(16), color: colors.foregroundMuted })
1667
1671
  ) : null
1668
1672
  );
1669
1673
  }
@@ -1700,9 +1704,9 @@ var styles11 = reactNative.StyleSheet.create({
1700
1704
  function Progress({ value = 0, max = 100, variant = "default", style, accessibilityLabel }) {
1701
1705
  const { colors } = useTheme();
1702
1706
  const percent = Math.min(Math.max(value / max * 100, 0), 100);
1703
- const [trackWidth, setTrackWidth] = React25.useState(0);
1707
+ const [trackWidth, setTrackWidth] = React54.useState(0);
1704
1708
  const animatedWidth = Animated12.useSharedValue(0);
1705
- React25.useEffect(() => {
1709
+ React54.useEffect(() => {
1706
1710
  if (trackWidth === 0) return;
1707
1711
  animatedWidth.value = Animated12.withSpring(percent / 100 * trackWidth, SPRINGS.glide);
1708
1712
  }, [percent, trackWidth, animatedWidth]);
@@ -1710,7 +1714,7 @@ function Progress({ value = 0, max = 100, variant = "default", style, accessibil
1710
1714
  width: animatedWidth.value
1711
1715
  }));
1712
1716
  const indicatorColor = variant === "success" ? colors.success : variant === "warning" ? colors.warning : variant === "destructive" ? colors.destructive : colors.primary;
1713
- return /* @__PURE__ */ React25__default.default.createElement(
1717
+ return /* @__PURE__ */ React54__default.default.createElement(
1714
1718
  reactNative.View,
1715
1719
  {
1716
1720
  style: [styles12.track, { backgroundColor: colors.surface }, style],
@@ -1719,7 +1723,7 @@ function Progress({ value = 0, max = 100, variant = "default", style, accessibil
1719
1723
  accessibilityLabel,
1720
1724
  accessibilityValue: { min: 0, max: 100, now: Math.round(percent) }
1721
1725
  },
1722
- /* @__PURE__ */ React25__default.default.createElement(
1726
+ /* @__PURE__ */ React54__default.default.createElement(
1723
1727
  Animated12__default.default.View,
1724
1728
  {
1725
1729
  style: [styles12.indicator, { backgroundColor: indicatorColor }, indicatorAnimatedStyle]
@@ -1743,7 +1747,7 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, act
1743
1747
  const { colors } = useTheme();
1744
1748
  const isCompact = size === "compact";
1745
1749
  const effectiveIcon = iconName ? renderIcon(iconName, isCompact ? 32 : 48, iconColor ?? colors.foregroundMuted) : icon;
1746
- return /* @__PURE__ */ React25__default.default.createElement(
1750
+ return /* @__PURE__ */ React54__default.default.createElement(
1747
1751
  reactNative.View,
1748
1752
  {
1749
1753
  style: [
@@ -1753,7 +1757,7 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, act
1753
1757
  style
1754
1758
  ]
1755
1759
  },
1756
- effectiveIcon ? /* @__PURE__ */ React25__default.default.createElement(
1760
+ effectiveIcon ? /* @__PURE__ */ React54__default.default.createElement(
1757
1761
  reactNative.View,
1758
1762
  {
1759
1763
  style: [
@@ -1764,15 +1768,15 @@ function EmptyState({ icon, iconName, iconColor, title, description, action, act
1764
1768
  },
1765
1769
  effectiveIcon
1766
1770
  ) : null,
1767
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles13.textWrapper }, /* @__PURE__ */ React25__default.default.createElement(
1771
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles13.textWrapper }, /* @__PURE__ */ React54__default.default.createElement(
1768
1772
  reactNative.Text,
1769
1773
  {
1770
1774
  style: [styles13.title, isCompact && styles13.titleCompact, { color: colors.foreground }],
1771
1775
  allowFontScaling: true
1772
1776
  },
1773
1777
  title
1774
- ), description && !isCompact ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles13.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null),
1775
- !isCompact && (action ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles13.action }, action) : actionLabel && onAction ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles13.action }, /* @__PURE__ */ React25__default.default.createElement(Button, { label: actionLabel, variant: "primary", onPress: onAction })) : null)
1778
+ ), description && !isCompact ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles13.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null),
1779
+ !isCompact && (action ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles13.action }, action) : actionLabel && onAction ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles13.action }, /* @__PURE__ */ React54__default.default.createElement(Button, { label: actionLabel, variant: "primary", onPress: onAction })) : null)
1776
1780
  );
1777
1781
  }
1778
1782
  var styles13 = reactNative.StyleSheet.create({
@@ -1831,7 +1835,7 @@ var styles13 = reactNative.StyleSheet.create({
1831
1835
  function useColorTransition(active, options = {}) {
1832
1836
  const { duration = TIMINGS.state.duration } = options;
1833
1837
  const progress = Animated12.useSharedValue(active ? 1 : 0);
1834
- React25.useEffect(() => {
1838
+ React54.useEffect(() => {
1835
1839
  progress.value = Animated12.withTiming(active ? 1 : 0, { duration, easing: EASINGS.standard });
1836
1840
  }, [active, duration, progress]);
1837
1841
  return progress;
@@ -1855,7 +1859,7 @@ function Textarea({
1855
1859
  ...props
1856
1860
  }) {
1857
1861
  const { colors } = useTheme();
1858
- const [focused, setFocused] = React25.useState(false);
1862
+ const [focused, setFocused] = React54.useState(false);
1859
1863
  const focusProgress = useColorTransition(focused, {
1860
1864
  duration: focused ? TIMINGS.focusIn.duration : TIMINGS.focusOut.duration
1861
1865
  });
@@ -1864,7 +1868,7 @@ function Textarea({
1864
1868
  borderColor: error ? colors.destructive : Animated12.interpolateColor(focusProgress.value, [0, 1], [colors.border, colors.primary]),
1865
1869
  borderWidth: error ? 2 : Animated12.interpolate(focusProgress.value, [0, 1], [1, 2])
1866
1870
  }));
1867
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles14.container, containerStyle] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles14.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React25__default.default.createElement(
1871
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles14.container, containerStyle] }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles14.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React54__default.default.createElement(
1868
1872
  Animated12__default.default.View,
1869
1873
  {
1870
1874
  style: [
@@ -1872,9 +1876,9 @@ function Textarea({
1872
1876
  { backgroundColor: colors.background }
1873
1877
  ]
1874
1878
  },
1875
- /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [styles14.borderOverlay, borderAnimStyle], pointerEvents: "none" }),
1876
- resolvedPrefixIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles14.prefixIcon }, resolvedPrefixIcon) : null,
1877
- /* @__PURE__ */ React25__default.default.createElement(
1879
+ /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [styles14.borderOverlay, borderAnimStyle], pointerEvents: "none" }),
1880
+ resolvedPrefixIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles14.prefixIcon }, resolvedPrefixIcon) : null,
1881
+ /* @__PURE__ */ React54__default.default.createElement(
1878
1882
  reactNative.TextInput,
1879
1883
  {
1880
1884
  multiline: true,
@@ -1903,7 +1907,7 @@ function Textarea({
1903
1907
  ...props
1904
1908
  }
1905
1909
  )
1906
- ), error ? /* @__PURE__ */ React25__default.default.createElement(
1910
+ ), error ? /* @__PURE__ */ React54__default.default.createElement(
1907
1911
  reactNative.Text,
1908
1912
  {
1909
1913
  style: [styles14.helperText, { color: colors.destructive }],
@@ -1911,7 +1915,7 @@ function Textarea({
1911
1915
  accessibilityLiveRegion: "polite"
1912
1916
  },
1913
1917
  error
1914
- ) : null, !error && hint ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles14.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
1918
+ ) : null, !error && hint ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles14.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null);
1915
1919
  }
1916
1920
  var styles14 = reactNative.StyleSheet.create({
1917
1921
  container: {
@@ -1971,7 +1975,7 @@ function Checkbox({
1971
1975
  // AUDIT FIX: opacity was applied only to the box, leaving the label at full
1972
1976
  // opacity when disabled — a contradictory visual signal. Now the entire row
1973
1977
  // dims uniformly so label and control communicate the same disabled state.
1974
- /* @__PURE__ */ React25__default.default.createElement(
1978
+ /* @__PURE__ */ React54__default.default.createElement(
1975
1979
  PressableButton,
1976
1980
  {
1977
1981
  style: [styles15.row, disabled && styles15.rowDisabled, style],
@@ -1983,7 +1987,7 @@ function Checkbox({
1983
1987
  accessibilityLabel: accessibilityLabel ?? label,
1984
1988
  accessibilityState: { checked, disabled: !!disabled }
1985
1989
  },
1986
- /* @__PURE__ */ React25__default.default.createElement(
1990
+ /* @__PURE__ */ React54__default.default.createElement(
1987
1991
  reactNativeEase.EaseView,
1988
1992
  {
1989
1993
  style: styles15.box,
@@ -1993,9 +1997,9 @@ function Checkbox({
1993
1997
  },
1994
1998
  transition: COLOR_TRANSITION
1995
1999
  },
1996
- /* @__PURE__ */ React25__default.default.createElement(reactNativeEase.EaseView, { animate: { opacity: checked ? 1 : 0 }, transition: OPACITY_TRANSITION }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles15.checkmark, { borderColor: colors.primaryForeground }] }))
2000
+ /* @__PURE__ */ React54__default.default.createElement(reactNativeEase.EaseView, { animate: { opacity: checked ? 1 : 0 }, transition: OPACITY_TRANSITION }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles15.checkmark, { borderColor: colors.primaryForeground }] }))
1997
2001
  ),
1998
- label ? /* @__PURE__ */ React25__default.default.createElement(
2002
+ label ? /* @__PURE__ */ React54__default.default.createElement(
1999
2003
  reactNative.Text,
2000
2004
  {
2001
2005
  style: [styles15.label, { color: colors.foreground }],
@@ -2047,7 +2051,7 @@ var DISABLED_OPACITY = 0.45;
2047
2051
  function Switch({ checked = false, onCheckedChange, disabled, style, accessibilityLabel }) {
2048
2052
  const { colors } = useTheme();
2049
2053
  const isDisabled = !!disabled;
2050
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [{ alignSelf: "flex-start" }, style] }, /* @__PURE__ */ React25__default.default.createElement(
2054
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [{ alignSelf: "flex-start" }, style] }, /* @__PURE__ */ React54__default.default.createElement(
2051
2055
  reactNative.TouchableOpacity,
2052
2056
  {
2053
2057
  onPress: () => {
@@ -2062,14 +2066,14 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
2062
2066
  accessibilityState: { checked, disabled: isDisabled },
2063
2067
  style: styles16.touchable
2064
2068
  },
2065
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles16.trackContainer }, /* @__PURE__ */ React25__default.default.createElement(
2069
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles16.trackContainer }, /* @__PURE__ */ React54__default.default.createElement(
2066
2070
  reactNativeEase.EaseView,
2067
2071
  {
2068
2072
  style: [styles16.track, isDisabled && styles16.disabledTrack],
2069
2073
  animate: { backgroundColor: checked ? colors.primary : colors.surfaceStrong },
2070
2074
  transition: COLOR_TRANSITION
2071
2075
  }
2072
- ), /* @__PURE__ */ React25__default.default.createElement(
2076
+ ), /* @__PURE__ */ React54__default.default.createElement(
2073
2077
  reactNativeEase.EaseView,
2074
2078
  {
2075
2079
  style: [styles16.trackBorder, { borderWidth: 1.5 }],
@@ -2077,30 +2081,30 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
2077
2081
  animate: { borderColor: checked ? "transparent" : colors.border },
2078
2082
  transition: COLOR_TRANSITION
2079
2083
  }
2080
- ), /* @__PURE__ */ React25__default.default.createElement(
2084
+ ), /* @__PURE__ */ React54__default.default.createElement(
2081
2085
  reactNativeEase.EaseView,
2082
2086
  {
2083
2087
  style: [styles16.thumb, { backgroundColor: colors.primaryForeground }],
2084
2088
  animate: { translateX: checked ? THUMB_TRAVEL : 0 },
2085
2089
  transition: SPRING_ELASTIC
2086
2090
  },
2087
- /* @__PURE__ */ React25__default.default.createElement(
2091
+ /* @__PURE__ */ React54__default.default.createElement(
2088
2092
  reactNativeEase.EaseView,
2089
2093
  {
2090
2094
  style: styles16.iconWrapper,
2091
2095
  animate: { opacity: checked ? isDisabled ? DISABLED_OPACITY : 1 : 0 },
2092
2096
  transition: OPACITY_TRANSITION
2093
2097
  },
2094
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "check", size: ICON_SIZE, color: colors.primary })
2098
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Feather, { name: "check", size: ICON_SIZE, color: colors.primary })
2095
2099
  ),
2096
- /* @__PURE__ */ React25__default.default.createElement(
2100
+ /* @__PURE__ */ React54__default.default.createElement(
2097
2101
  reactNativeEase.EaseView,
2098
2102
  {
2099
2103
  style: styles16.iconWrapper,
2100
2104
  animate: { opacity: checked ? 0 : isDisabled ? DISABLED_OPACITY : 1 },
2101
2105
  transition: OPACITY_TRANSITION
2102
2106
  },
2103
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "x", size: ICON_SIZE, color: colors.foregroundMuted })
2107
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Feather, { name: "x", size: ICON_SIZE, color: colors.foregroundMuted })
2104
2108
  )
2105
2109
  ))
2106
2110
  ));
@@ -2153,15 +2157,15 @@ function ToggleIcon({ pressed, iconName, activeIconName, icon, activeIcon, iconC
2153
2157
  return prop;
2154
2158
  };
2155
2159
  if (pressed) {
2156
- if (activeIconName) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? primaryColor));
2160
+ if (activeIconName) return /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? primaryColor));
2157
2161
  const active = renderProp(activeIcon);
2158
- if (active) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, active);
2159
- return /* @__PURE__ */ React25__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: primaryColor });
2162
+ if (active) return /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, active);
2163
+ return /* @__PURE__ */ React54__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: primaryColor });
2160
2164
  }
2161
- if (iconName) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? mutedColor));
2165
+ if (iconName) return /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? mutedColor));
2162
2166
  const custom = renderProp(icon);
2163
- if (custom) return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, custom);
2164
- return /* @__PURE__ */ React25__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: mutedColor });
2167
+ if (custom) return /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, custom);
2168
+ return /* @__PURE__ */ React54__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: mutedColor });
2165
2169
  }
2166
2170
  var sizeStyles = {
2167
2171
  sm: { paddingHorizontal: s(12), paddingVertical: vs(8), minWidth: s(40), minHeight: vs(40) },
@@ -2192,7 +2196,7 @@ function Toggle({
2192
2196
  selectionAsync();
2193
2197
  onPressedChange?.(!pressed);
2194
2198
  };
2195
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [disabled && styles17.disabled, style] }, /* @__PURE__ */ React25__default.default.createElement(
2199
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [disabled && styles17.disabled, style] }, /* @__PURE__ */ React54__default.default.createElement(
2196
2200
  PressableButton,
2197
2201
  {
2198
2202
  onPress: handlePress,
@@ -2204,7 +2208,7 @@ function Toggle({
2204
2208
  accessibilityLabel: accessibilityLabel ?? label,
2205
2209
  accessibilityState: { selected: pressed, disabled: !!disabled }
2206
2210
  },
2207
- /* @__PURE__ */ React25__default.default.createElement(
2211
+ /* @__PURE__ */ React54__default.default.createElement(
2208
2212
  reactNativeEase.EaseView,
2209
2213
  {
2210
2214
  style: [styles17.base, sizeStyles[size], { borderWidth: 2 }],
@@ -2214,7 +2218,7 @@ function Toggle({
2214
2218
  },
2215
2219
  transition: COLOR_TRANSITION
2216
2220
  },
2217
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles17.inner }, /* @__PURE__ */ React25__default.default.createElement(
2221
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles17.inner }, /* @__PURE__ */ React54__default.default.createElement(
2218
2222
  ToggleIcon,
2219
2223
  {
2220
2224
  pressed,
@@ -2228,7 +2232,7 @@ function Toggle({
2228
2232
  primaryColor: colors.primary,
2229
2233
  mutedColor: colors.foregroundMuted
2230
2234
  }
2231
- ), label ? /* @__PURE__ */ React25__default.default.createElement(
2235
+ ), label ? /* @__PURE__ */ React54__default.default.createElement(
2232
2236
  reactNative.Text,
2233
2237
  {
2234
2238
  style: [styles17.label, { color: pressed ? colors.primary : colors.foreground }],
@@ -2258,9 +2262,9 @@ var styles17 = reactNative.StyleSheet.create({
2258
2262
  }
2259
2263
  });
2260
2264
  function useHover() {
2261
- const [hovered, setHovered] = React25.useState(false);
2262
- const onMouseEnter = React25.useCallback(() => setHovered(true), []);
2263
- const onMouseLeave = React25.useCallback(() => setHovered(false), []);
2265
+ const [hovered, setHovered] = React54.useState(false);
2266
+ const onMouseEnter = React54.useCallback(() => setHovered(true), []);
2267
+ const onMouseLeave = React54.useCallback(() => setHovered(false), []);
2264
2268
  if (reactNative.Platform.OS !== "web") {
2265
2269
  return { hovered: false, hoverHandlers: {} };
2266
2270
  }
@@ -2277,11 +2281,11 @@ function usePressScale({
2277
2281
  } = {}) {
2278
2282
  const scale2 = Animated12.useSharedValue(1);
2279
2283
  const { hovered, hoverHandlers } = useHover();
2280
- const onPressIn = React25.useCallback(() => {
2284
+ const onPressIn = React54.useCallback(() => {
2281
2285
  if (disabled) return;
2282
2286
  scale2.value = Animated12.withSpring(pressScale, pressInSpring);
2283
2287
  }, [disabled, pressScale, pressInSpring, scale2]);
2284
- const onPressOut = React25.useCallback(() => {
2288
+ const onPressOut = React54.useCallback(() => {
2285
2289
  if (disabled) return;
2286
2290
  scale2.value = Animated12.withSpring(1, pressOutSpring);
2287
2291
  }, [disabled, pressOutSpring, scale2]);
@@ -2314,7 +2318,7 @@ function RadioItem({
2314
2318
  // AUDIT FIX: opacity was applied only to the radio circle, leaving the label
2315
2319
  // at full opacity when disabled. The whole row now dims uniformly so users
2316
2320
  // get a single, consistent disabled signal across the entire item.
2317
- /* @__PURE__ */ React25__default.default.createElement(
2321
+ /* @__PURE__ */ React54__default.default.createElement(
2318
2322
  reactNative.TouchableOpacity,
2319
2323
  {
2320
2324
  style: [styles18.row, option.disabled && styles18.rowDisabled],
@@ -2333,14 +2337,14 @@ function RadioItem({
2333
2337
  accessibilityLabel: option.label,
2334
2338
  accessibilityState: { checked: selected, disabled: !!option.disabled }
2335
2339
  },
2336
- /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React25__default.default.createElement(
2340
+ /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React54__default.default.createElement(
2337
2341
  reactNativeEase.EaseView,
2338
2342
  {
2339
2343
  style: styles18.radio,
2340
2344
  animate: { borderColor: selected ? colors.primary : colors.border },
2341
2345
  transition: COLOR_TRANSITION
2342
2346
  },
2343
- /* @__PURE__ */ React25__default.default.createElement(
2347
+ /* @__PURE__ */ React54__default.default.createElement(
2344
2348
  reactNativeEase.EaseView,
2345
2349
  {
2346
2350
  style: [styles18.dot, { backgroundColor: colors.primary }],
@@ -2349,7 +2353,7 @@ function RadioItem({
2349
2353
  }
2350
2354
  )
2351
2355
  )),
2352
- /* @__PURE__ */ React25__default.default.createElement(
2356
+ /* @__PURE__ */ React54__default.default.createElement(
2353
2357
  reactNative.Text,
2354
2358
  {
2355
2359
  style: [styles18.label, { color: colors.foreground }],
@@ -2368,14 +2372,14 @@ function RadioGroup({
2368
2372
  style,
2369
2373
  accessibilityLabel
2370
2374
  }) {
2371
- return /* @__PURE__ */ React25__default.default.createElement(
2375
+ return /* @__PURE__ */ React54__default.default.createElement(
2372
2376
  reactNative.View,
2373
2377
  {
2374
2378
  style: [styles18.container, orientation === "horizontal" && styles18.horizontal, style],
2375
2379
  accessibilityRole: "radiogroup",
2376
2380
  accessibilityLabel
2377
2381
  },
2378
- options.map((option) => /* @__PURE__ */ React25__default.default.createElement(
2382
+ options.map((option) => /* @__PURE__ */ React54__default.default.createElement(
2379
2383
  RadioItem,
2380
2384
  {
2381
2385
  key: option.value,
@@ -2431,7 +2435,7 @@ function TabTrigger({
2431
2435
  }) {
2432
2436
  const { colors } = useTheme();
2433
2437
  const isUnderline = variant === "underline";
2434
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { onLayout, style: styles19.triggerWrap }, /* @__PURE__ */ React25__default.default.createElement(
2438
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { onLayout, style: styles19.triggerWrap }, /* @__PURE__ */ React54__default.default.createElement(
2435
2439
  PressableTab,
2436
2440
  {
2437
2441
  style: [
@@ -2446,7 +2450,7 @@ function TabTrigger({
2446
2450
  accessibilityState: { selected: isActive },
2447
2451
  accessibilityLabel: tab.label
2448
2452
  },
2449
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles19.triggerInner }, tab.icon ? typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon : null, /* @__PURE__ */ React25__default.default.createElement(
2453
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles19.triggerInner }, tab.icon ? typeof tab.icon === "function" ? tab.icon(isActive) : tab.icon : null, /* @__PURE__ */ React54__default.default.createElement(
2450
2454
  reactNative.Text,
2451
2455
  {
2452
2456
  style: [
@@ -2464,14 +2468,14 @@ function TabTrigger({
2464
2468
  ));
2465
2469
  }
2466
2470
  function Tabs({ tabs, variant = "pill", value, onValueChange, children, style }) {
2467
- const [internal, setInternal] = React25.useState(tabs[0]?.value ?? "");
2471
+ const [internal, setInternal] = React54.useState(tabs[0]?.value ?? "");
2468
2472
  const { colors } = useTheme();
2469
2473
  const active = value ?? internal;
2470
- const tabLayouts = React25.useRef({});
2474
+ const tabLayouts = React54.useRef({});
2471
2475
  const pillX = Animated12.useSharedValue(0);
2472
2476
  const pillWidth = Animated12.useSharedValue(0);
2473
- const initialised = React25.useRef(false);
2474
- const animatePill = React25.useCallback((tabValue, animate) => {
2477
+ const initialised = React54.useRef(false);
2478
+ const animatePill = React54.useCallback((tabValue, animate) => {
2475
2479
  const layout = tabLayouts.current[tabValue];
2476
2480
  if (!layout) return;
2477
2481
  if (animate) {
@@ -2482,7 +2486,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
2482
2486
  pillWidth.value = layout.width;
2483
2487
  }
2484
2488
  }, [pillX, pillWidth]);
2485
- React25.useEffect(() => {
2489
+ React54.useEffect(() => {
2486
2490
  if (initialised.current) animatePill(active, true);
2487
2491
  }, [active, animatePill]);
2488
2492
  const handlePress = (v) => {
@@ -2494,7 +2498,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
2494
2498
  transform: [{ translateX: pillX.value }],
2495
2499
  width: pillWidth.value
2496
2500
  }));
2497
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React25__default.default.createElement(
2501
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style }, /* @__PURE__ */ React54__default.default.createElement(
2498
2502
  reactNative.View,
2499
2503
  {
2500
2504
  style: [
@@ -2502,7 +2506,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
2502
2506
  ],
2503
2507
  accessibilityRole: "tablist"
2504
2508
  },
2505
- variant === "pill" && /* @__PURE__ */ React25__default.default.createElement(
2509
+ variant === "pill" && /* @__PURE__ */ React54__default.default.createElement(
2506
2510
  Animated12__default.default.View,
2507
2511
  {
2508
2512
  style: [
@@ -2524,7 +2528,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
2524
2528
  ]
2525
2529
  }
2526
2530
  ),
2527
- tabs.map((tab) => /* @__PURE__ */ React25__default.default.createElement(
2531
+ tabs.map((tab) => /* @__PURE__ */ React54__default.default.createElement(
2528
2532
  TabTrigger,
2529
2533
  {
2530
2534
  key: tab.value,
@@ -2546,7 +2550,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
2546
2550
  }
2547
2551
  function TabsContent({ value, activeValue, children, style }) {
2548
2552
  if (value !== activeValue) return null;
2549
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style, accessibilityRole: "none" }, children);
2553
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style, accessibilityRole: "none" }, children);
2550
2554
  }
2551
2555
  var styles19 = reactNative.StyleSheet.create({
2552
2556
  list: {
@@ -2607,7 +2611,7 @@ function AccordionItemComponent({
2607
2611
  const resolvedIcon = item.iconName ? renderIcon(item.iconName, ms(16), item.iconColor ?? colors.foregroundMuted) : item.icon;
2608
2612
  const isExpanded = Animated12.useSharedValue(isOpen);
2609
2613
  const height = Animated12.useSharedValue(0);
2610
- React25__default.default.useEffect(() => {
2614
+ React54__default.default.useEffect(() => {
2611
2615
  isExpanded.value = isOpen;
2612
2616
  }, [isOpen, isExpanded]);
2613
2617
  const derivedHeight = Animated12.useDerivedValue(
@@ -2629,7 +2633,7 @@ function AccordionItemComponent({
2629
2633
  const rotationStyle = Animated12.useAnimatedStyle(() => ({
2630
2634
  transform: [{ rotate: `${derivedRotation.value * 180}deg` }]
2631
2635
  }));
2632
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles20.item, { backgroundColor: colors.card, borderColor: colors.border }] }, /* @__PURE__ */ React25__default.default.createElement(
2636
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles20.item, { backgroundColor: colors.card, borderColor: colors.border }] }, /* @__PURE__ */ React54__default.default.createElement(
2633
2637
  reactNative.Pressable,
2634
2638
  {
2635
2639
  style: ({ pressed }) => [styles20.trigger, { opacity: pressed ? 0.6 : 1 }],
@@ -2641,9 +2645,9 @@ function AccordionItemComponent({
2641
2645
  accessibilityState: { expanded: isOpen },
2642
2646
  accessibilityLabel: typeof item.trigger === "string" ? item.trigger : void 0
2643
2647
  },
2644
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles20.triggerContent }, resolvedIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles20.icon }, resolvedIcon) : null, typeof item.trigger === "string" ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles20.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger) : item.trigger),
2645
- /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [styles20.chevron, rotationStyle] }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
2646
- ), /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: bodyStyle }, /* @__PURE__ */ React25__default.default.createElement(
2648
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles20.triggerContent }, resolvedIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles20.icon }, resolvedIcon) : null, typeof item.trigger === "string" ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles20.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger) : item.trigger),
2649
+ /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [styles20.chevron, rotationStyle] }, /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
2650
+ ), /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: bodyStyle }, /* @__PURE__ */ React54__default.default.createElement(
2647
2651
  reactNative.View,
2648
2652
  {
2649
2653
  style: styles20.content,
@@ -2651,11 +2655,11 @@ function AccordionItemComponent({
2651
2655
  height.value = e.nativeEvent.layout.height;
2652
2656
  }
2653
2657
  },
2654
- typeof item.content === "string" || typeof item.content === "number" ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles20.contentText, { color: colors.foregroundMuted }], allowFontScaling: true }, item.content) : item.content
2658
+ typeof item.content === "string" || typeof item.content === "number" ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles20.contentText, { color: colors.foregroundMuted }], allowFontScaling: true }, item.content) : item.content
2655
2659
  )));
2656
2660
  }
2657
2661
  function Accordion({ items, type = "single", defaultValue, style }) {
2658
- const [openValues, setOpenValues] = React25.useState(() => {
2662
+ const [openValues, setOpenValues] = React54.useState(() => {
2659
2663
  if (!defaultValue) return [];
2660
2664
  return Array.isArray(defaultValue) ? defaultValue : [defaultValue];
2661
2665
  });
@@ -2668,7 +2672,7 @@ function Accordion({ items, type = "single", defaultValue, style }) {
2668
2672
  );
2669
2673
  }
2670
2674
  };
2671
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles20.list, style] }, items.map((item) => /* @__PURE__ */ React25__default.default.createElement(
2675
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles20.list, style] }, items.map((item) => /* @__PURE__ */ React54__default.default.createElement(
2672
2676
  AccordionItemComponent,
2673
2677
  {
2674
2678
  key: item.value,
@@ -2740,7 +2744,7 @@ function Slider({
2740
2744
  style
2741
2745
  }) {
2742
2746
  const { colors } = useTheme();
2743
- const lastSteppedValue = React25.useRef(value);
2747
+ const lastSteppedValue = React54.useRef(value);
2744
2748
  const handleValueChange = (v) => {
2745
2749
  if (step && v !== lastSteppedValue.current) {
2746
2750
  lastSteppedValue.current = v;
@@ -2748,7 +2752,7 @@ function Slider({
2748
2752
  }
2749
2753
  onValueChange?.(v);
2750
2754
  };
2751
- return /* @__PURE__ */ React25__default.default.createElement(
2755
+ return /* @__PURE__ */ React54__default.default.createElement(
2752
2756
  reactNative.View,
2753
2757
  {
2754
2758
  style: [styles21.wrapper, style],
@@ -2761,8 +2765,8 @@ function Slider({
2761
2765
  text: formatValue2(value)
2762
2766
  }
2763
2767
  },
2764
- label || showValue ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles21.header }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles21.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles21.valueText, { color: colors.foregroundMuted }], allowFontScaling: true }, formatValue2(value)) : null) : null,
2765
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: disabled ? styles21.disabled : void 0 }, /* @__PURE__ */ React25__default.default.createElement(
2768
+ label || showValue ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles21.header }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles21.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, showValue ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles21.valueText, { color: colors.foregroundMuted }], allowFontScaling: true }, formatValue2(value)) : null) : null,
2769
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: disabled ? styles21.disabled : void 0 }, /* @__PURE__ */ React54__default.default.createElement(
2766
2770
  RNSlider__default.default,
2767
2771
  {
2768
2772
  value,
@@ -2806,73 +2810,69 @@ var styles21 = reactNative.StyleSheet.create({
2806
2810
  opacity: 0.45
2807
2811
  }
2808
2812
  });
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
2813
  function SheetHeader({ children, style }) {
2813
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles22.header, style] }, children);
2814
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles22.header, style] }, children);
2814
2815
  }
2815
2816
  function SheetContent({ children, style }) {
2816
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles22.sheetContent, style] }, children);
2817
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles22.sheetContent, style] }, children);
2817
2818
  }
2818
2819
  function SheetFooter({ children, style }) {
2819
2820
  const { colors } = useTheme();
2820
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles22.sheetFooter, { backgroundColor: colors.card, borderTopColor: colors.border }, style] }, children);
2821
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles22.sheetFooter, { backgroundColor: colors.card, borderTopColor: colors.border }, style] }, children);
2821
2822
  }
2822
2823
  function Sheet({
2823
2824
  open,
2824
2825
  onClose,
2825
2826
  title,
2826
2827
  subtitle,
2827
- description,
2828
2828
  showCloseButton = false,
2829
2829
  children,
2830
2830
  style,
2831
2831
  contentStyle,
2832
- scrollable,
2832
+ scrollable = false,
2833
2833
  maxHeight,
2834
- keyboardBehavior,
2834
+ keyboardBehavior = "interactive",
2835
2835
  keyboardBlurBehavior = "restore",
2836
2836
  enableBlurKeyboardOnGesture = true,
2837
2837
  android_keyboardInputMode = "adjustPan",
2838
2838
  footer,
2839
- snapPoints,
2840
- responsive = false,
2841
- dialogMaxWidth = 480
2839
+ snapPoints
2842
2840
  }) {
2843
2841
  const { colors } = useTheme();
2844
2842
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
2845
- const { width: windowWidth } = reactNative.useWindowDimensions();
2846
- const ref = React25.useRef(null);
2847
- const asDialog = responsive && windowWidth >= BREAKPOINTS.wide;
2848
- const effectiveKeyboardBehavior = keyboardBehavior ?? "interactive";
2849
- React25.useEffect(() => {
2843
+ const ref = React54.useRef(null);
2844
+ const wasOpened = React54.useRef(false);
2845
+ const name = React54.useId();
2846
+ React54.useEffect(() => {
2850
2847
  if (open) {
2851
2848
  impactMedium();
2852
- ref.current?.snapToIndex(0);
2853
- } else {
2854
- ref.current?.close();
2849
+ ref.current?.present();
2850
+ wasOpened.current = true;
2851
+ } else if (wasOpened.current) {
2852
+ ref.current?.dismiss();
2855
2853
  }
2856
2854
  }, [open]);
2857
- const renderBackdrop = React25.useCallback((props) => /* @__PURE__ */ React25__default.default.createElement(
2858
- BottomSheet.BottomSheetBackdrop,
2859
- {
2860
- ...props,
2861
- disappearsOnIndex: -1,
2862
- appearsOnIndex: 0,
2863
- pressBehavior: "close"
2864
- }
2865
- ), []);
2866
- const childArray = React25__default.default.Children.toArray(children);
2867
- const customHeader = childArray.find((child) => React25__default.default.isValidElement(child) && child.type === SheetHeader);
2868
- const customContent = childArray.find((child) => React25__default.default.isValidElement(child) && child.type === SheetContent);
2869
- const customFooter = childArray.find((child) => React25__default.default.isValidElement(child) && child.type === SheetFooter);
2855
+ const renderBackdrop = React54.useCallback(
2856
+ (props) => /* @__PURE__ */ React54__default.default.createElement(
2857
+ bottomSheet.BottomSheetBackdrop,
2858
+ {
2859
+ ...props,
2860
+ disappearsOnIndex: -1,
2861
+ appearsOnIndex: 0,
2862
+ pressBehavior: "close"
2863
+ }
2864
+ ),
2865
+ []
2866
+ );
2867
+ const childArray = React54__default.default.Children.toArray(children);
2868
+ const customHeader = childArray.find((child) => React54__default.default.isValidElement(child) && child.type === SheetHeader);
2869
+ const customContent = childArray.find((child) => React54__default.default.isValidElement(child) && child.type === SheetContent);
2870
+ const customFooter = childArray.find((child) => React54__default.default.isValidElement(child) && child.type === SheetFooter);
2870
2871
  const filteredChildren = customHeader || customContent || customFooter ? childArray.filter(
2871
- (child) => !React25__default.default.isValidElement(child) || child.type !== SheetHeader && child.type !== SheetContent && child.type !== SheetFooter
2872
+ (child) => !React54__default.default.isValidElement(child) || child.type !== SheetHeader && child.type !== SheetContent && child.type !== SheetFooter
2872
2873
  ) : children;
2873
- const effectiveSubtitle = subtitle ?? description;
2874
- const showHeader = !!(title || effectiveSubtitle || showCloseButton) && !customHeader;
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(
2874
+ const showHeader = !!(title || subtitle || showCloseButton) && !customHeader;
2875
+ const headerNode = customHeader ? customHeader : showHeader ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles22.header, { backgroundColor: colors.card }], accessibilityRole: "header" }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles22.headerRow }, title ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles22.title, { color: colors.foreground }], allowFontScaling: true }, title) : /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: { flex: 1 } }), showCloseButton ? /* @__PURE__ */ React54__default.default.createElement(
2876
2876
  reactNative.TouchableOpacity,
2877
2877
  {
2878
2878
  onPress: onClose,
@@ -2883,78 +2883,50 @@ function Sheet({
2883
2883
  accessibilityLabel: "Close",
2884
2884
  hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }
2885
2885
  },
2886
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.AntDesign, { name: "close", size: ms(18), color: colors.foregroundMuted })
2887
- ) : null), effectiveSubtitle ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles22.subtitle, { color: colors.foregroundMuted }], allowFontScaling: true }, effectiveSubtitle) : null) : null;
2886
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.AntDesign, { name: "close", size: ms(18), color: colors.foregroundMuted })
2887
+ ) : null), subtitle ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles22.subtitle, { color: colors.foregroundMuted }], allowFontScaling: true }, subtitle) : null) : null;
2888
2888
  const contentNode = customContent ? customContent : filteredChildren;
2889
2889
  const effectiveFooter = customFooter ? customFooter : footer;
2890
- const renderFooter = React25.useCallback((props) => {
2891
- if (!effectiveFooter) return null;
2892
- return /* @__PURE__ */ React25__default.default.createElement(BottomSheet.BottomSheetFooter, { ...props }, effectiveFooter);
2893
- }, [effectiveFooter]);
2894
- if (asDialog) {
2895
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Modal, { visible: open, transparent: true, animationType: "fade", onRequestClose: onClose }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Pressable, { style: styles22.dialogBackdrop, onPress: onClose, accessibilityRole: "button", accessibilityLabel: "Close" }, /* @__PURE__ */ React25__default.default.createElement(
2896
- reactNative.Pressable,
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;
2890
+ const renderFooter = React54.useCallback(
2891
+ (props) => {
2892
+ if (!effectiveFooter) return null;
2893
+ return /* @__PURE__ */ React54__default.default.createElement(bottomSheet.BottomSheetFooter, { ...props }, effectiveFooter);
2894
+ },
2895
+ [effectiveFooter]
2896
+ );
2921
2897
  const useDynamicSizing = !snapPoints;
2922
- return /* @__PURE__ */ React25__default.default.createElement(
2923
- BottomSheet__default.default,
2898
+ return /* @__PURE__ */ React54__default.default.createElement(
2899
+ bottomSheet.BottomSheetModal,
2924
2900
  {
2925
2901
  ref,
2926
- index: -1,
2927
- onClose,
2902
+ name,
2903
+ onDismiss: onClose,
2928
2904
  enableDynamicSizing: useDynamicSizing,
2929
2905
  snapPoints,
2930
- maxDynamicContentSize: useDynamicSizing ? effectiveMaxHeight : void 0,
2906
+ maxDynamicContentSize: useDynamicSizing && maxHeight ? maxHeight : void 0,
2931
2907
  backdropComponent: renderBackdrop,
2932
2908
  footerComponent: effectiveFooter ? renderFooter : void 0,
2933
- backgroundStyle: [styles22.background, { backgroundColor: colors.card }],
2934
- handleIndicatorStyle: [styles22.handle, { backgroundColor: colors.border }],
2909
+ backgroundStyle: { ...styles22.background, backgroundColor: colors.card },
2910
+ handleIndicatorStyle: { ...styles22.handle, backgroundColor: colors.border },
2935
2911
  enablePanDownToClose: true,
2936
2912
  topInset: insets.top,
2937
- keyboardBehavior: effectiveKeyboardBehavior,
2913
+ keyboardBehavior,
2938
2914
  keyboardBlurBehavior,
2939
2915
  android_keyboardInputMode,
2940
2916
  enableBlurKeyboardOnGesture
2941
2917
  },
2942
- useScroll ? /* @__PURE__ */ React25__default.default.createElement(
2943
- BottomSheet.BottomSheetScrollView,
2918
+ scrollable ? /* @__PURE__ */ React54__default.default.createElement(
2919
+ bottomSheet.BottomSheetScrollView,
2944
2920
  {
2945
- contentContainerStyle: [
2946
- styles22.scrollContent,
2947
- style
2948
- ],
2921
+ contentContainerStyle: [styles22.scrollContent, style],
2949
2922
  style: contentStyle,
2950
2923
  showsVerticalScrollIndicator: true,
2951
- indicatorStyle: "black",
2952
- persistentScrollbar: isAndroid,
2924
+ bounces: false,
2953
2925
  stickyHeaderIndices: headerNode ? [0] : void 0
2954
2926
  },
2955
2927
  headerNode,
2956
2928
  contentNode
2957
- ) : /* @__PURE__ */ React25__default.default.createElement(BottomSheet.BottomSheetView, { style: [styles22.content, contentStyle, style] }, headerNode, contentNode)
2929
+ ) : /* @__PURE__ */ React54__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles22.content, contentStyle, style] }, headerNode, contentNode)
2958
2930
  );
2959
2931
  }
2960
2932
  Sheet.Header = SheetHeader;
@@ -3001,8 +2973,7 @@ var styles22 = reactNative.StyleSheet.create({
3001
2973
  },
3002
2974
  scrollContent: {
3003
2975
  paddingHorizontal: s(16),
3004
- paddingBottom: vs(32),
3005
- paddingRight: s(16)
2976
+ paddingBottom: vs(32)
3006
2977
  },
3007
2978
  sheetContent: {
3008
2979
  gap: vs(16)
@@ -3013,28 +2984,10 @@ var styles22 = reactNative.StyleSheet.create({
3013
2984
  borderTopWidth: 1,
3014
2985
  flexDirection: "row",
3015
2986
  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
2987
  }
3035
2988
  });
3036
2989
  var isIOS = reactNative.Platform.OS === "ios";
3037
- var isAndroid2 = reactNative.Platform.OS === "android";
2990
+ var isAndroid = reactNative.Platform.OS === "android";
3038
2991
  var isWeb2 = reactNative.Platform.OS === "web";
3039
2992
  function Select({
3040
2993
  options,
@@ -3052,9 +3005,9 @@ function Select({
3052
3005
  pressScale: PRESS_SCALE.button,
3053
3006
  disabled
3054
3007
  });
3055
- const [pickerVisible, setPickerVisible] = React25.useState(false);
3056
- const [pendingValue, setPendingValue] = React25.useState(value);
3057
- const pickerRef = React25.useRef(null);
3008
+ const [pickerVisible, setPickerVisible] = React54.useState(false);
3009
+ const [pendingValue, setPendingValue] = React54.useState(value);
3010
+ const pickerRef = React54.useRef(null);
3058
3011
  const selected = options.find((o) => o.value === value);
3059
3012
  const handleOpen = () => {
3060
3013
  if (disabled) return;
@@ -3062,7 +3015,7 @@ function Select({
3062
3015
  if (isIOS) {
3063
3016
  setPendingValue(value);
3064
3017
  setPickerVisible(true);
3065
- } else if (isAndroid2) {
3018
+ } else if (isAndroid) {
3066
3019
  pickerRef.current?.focus?.();
3067
3020
  }
3068
3021
  };
@@ -3076,7 +3029,7 @@ function Select({
3076
3029
  }
3077
3030
  setPickerVisible(false);
3078
3031
  };
3079
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles23.container, style] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles23.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, !isWeb2 ? /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [animatedStyle, { opacity: disabled ? 0.45 : 1 }] }, /* @__PURE__ */ React25__default.default.createElement(
3032
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles23.container, style] }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles23.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, !isWeb2 ? /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [animatedStyle, { opacity: disabled ? 0.45 : 1 }] }, /* @__PURE__ */ React54__default.default.createElement(
3080
3033
  reactNative.TouchableOpacity,
3081
3034
  {
3082
3035
  style: [
@@ -3096,7 +3049,7 @@ function Select({
3096
3049
  accessibilityValue: { text: selected?.label ?? placeholder },
3097
3050
  accessibilityState: { disabled: !!disabled, expanded: pickerVisible }
3098
3051
  },
3099
- /* @__PURE__ */ React25__default.default.createElement(
3052
+ /* @__PURE__ */ React54__default.default.createElement(
3100
3053
  reactNative.Text,
3101
3054
  {
3102
3055
  style: [
@@ -3108,8 +3061,8 @@ function Select({
3108
3061
  },
3109
3062
  selected?.label ?? placeholder
3110
3063
  ),
3111
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 20, color: colors.foregroundMuted })
3112
- )) : null, isIOS ? /* @__PURE__ */ React25__default.default.createElement(
3064
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 20, color: colors.foregroundMuted })
3065
+ )) : null, isIOS ? /* @__PURE__ */ React54__default.default.createElement(
3113
3066
  reactNative.Modal,
3114
3067
  {
3115
3068
  visible: pickerVisible,
@@ -3117,16 +3070,16 @@ function Select({
3117
3070
  animationType: "slide",
3118
3071
  onRequestClose: handleDismiss
3119
3072
  },
3120
- /* @__PURE__ */ React25__default.default.createElement(reactNative.TouchableOpacity, { style: styles23.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
3121
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles23.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles23.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles23.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, null), /* @__PURE__ */ React25__default.default.createElement(reactNative.TouchableOpacity, { onPress: handleConfirm, style: styles23.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles23.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React25__default.default.createElement(
3073
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.TouchableOpacity, { style: styles23.iosBackdrop, activeOpacity: 1, onPress: handleDismiss }),
3074
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles23.iosSheet, { backgroundColor: colors.card }] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles23.iosToolbar, { borderBottomColor: colors.border }] }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles23.iosToolbarTitle, { color: colors.foreground }], allowFontScaling: true }, label) : /* @__PURE__ */ React54__default.default.createElement(reactNative.View, null), /* @__PURE__ */ React54__default.default.createElement(reactNative.TouchableOpacity, { onPress: handleConfirm, style: styles23.iosDoneBtn, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles23.iosDoneBtnText, { color: colors.primary }], allowFontScaling: true }, "Done"))), /* @__PURE__ */ React54__default.default.createElement(
3122
3075
  picker.Picker,
3123
3076
  {
3124
3077
  selectedValue: pendingValue ?? "",
3125
3078
  onValueChange: (val) => setPendingValue(val),
3126
3079
  itemStyle: { color: colors.foreground }
3127
3080
  },
3128
- !value ? /* @__PURE__ */ React25__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
3129
- options.map((o) => /* @__PURE__ */ React25__default.default.createElement(
3081
+ !value ? /* @__PURE__ */ React54__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", color: colors.foregroundMuted, enabled: false }) : null,
3082
+ options.map((o) => /* @__PURE__ */ React54__default.default.createElement(
3130
3083
  picker.Picker.Item,
3131
3084
  {
3132
3085
  key: o.value,
@@ -3137,7 +3090,7 @@ function Select({
3137
3090
  }
3138
3091
  ))
3139
3092
  ))
3140
- ) : null, isAndroid2 ? /* @__PURE__ */ React25__default.default.createElement(
3093
+ ) : null, isAndroid ? /* @__PURE__ */ React54__default.default.createElement(
3141
3094
  picker.Picker,
3142
3095
  {
3143
3096
  ref: pickerRef,
@@ -3153,8 +3106,8 @@ function Select({
3153
3106
  prompt: label,
3154
3107
  style: styles23.androidHiddenPicker
3155
3108
  },
3156
- !value ? /* @__PURE__ */ React25__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
3157
- options.map((o) => /* @__PURE__ */ React25__default.default.createElement(
3109
+ !value ? /* @__PURE__ */ React54__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }) : null,
3110
+ options.map((o) => /* @__PURE__ */ React54__default.default.createElement(
3158
3111
  picker.Picker.Item,
3159
3112
  {
3160
3113
  key: o.value,
@@ -3163,7 +3116,7 @@ function Select({
3163
3116
  enabled: !o.disabled
3164
3117
  }
3165
3118
  ))
3166
- ) : null, isWeb2 ? /* @__PURE__ */ React25__default.default.createElement(
3119
+ ) : null, isWeb2 ? /* @__PURE__ */ React54__default.default.createElement(
3167
3120
  picker.Picker,
3168
3121
  {
3169
3122
  selectedValue: value ?? "",
@@ -3183,8 +3136,8 @@ function Select({
3183
3136
  }
3184
3137
  ]
3185
3138
  },
3186
- /* @__PURE__ */ React25__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }),
3187
- options.map((o) => /* @__PURE__ */ React25__default.default.createElement(
3139
+ /* @__PURE__ */ React54__default.default.createElement(picker.Picker.Item, { label: placeholder, value: "", enabled: false }),
3140
+ options.map((o) => /* @__PURE__ */ React54__default.default.createElement(
3188
3141
  picker.Picker.Item,
3189
3142
  {
3190
3143
  key: o.value,
@@ -3193,7 +3146,7 @@ function Select({
3193
3146
  enabled: !o.disabled
3194
3147
  }
3195
3148
  ))
3196
- ) : null, error ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles23.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null);
3149
+ ) : null, error ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles23.helperText, { color: colors.destructive }], allowFontScaling: true }, error) : null);
3197
3150
  }
3198
3151
  var styles23 = reactNative.StyleSheet.create({
3199
3152
  container: {
@@ -3274,7 +3227,7 @@ function useToast() {
3274
3227
  function ToastProvider({ children }) {
3275
3228
  const { colorScheme } = useTheme();
3276
3229
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
3277
- return /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, children, /* @__PURE__ */ React25__default.default.createElement(
3230
+ return /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, children, /* @__PURE__ */ React54__default.default.createElement(
3278
3231
  sonnerNative.Toaster,
3279
3232
  {
3280
3233
  theme: colorScheme,
@@ -3324,7 +3277,8 @@ function CurrencyInput({
3324
3277
  editable,
3325
3278
  containerStyle,
3326
3279
  style,
3327
- sheetMode
3280
+ sheetMode,
3281
+ ...props
3328
3282
  }) {
3329
3283
  const handleChange = (text) => {
3330
3284
  const withoutPrefix = prefix && text.startsWith(prefix) ? text.slice(prefix.length) : text;
@@ -3342,9 +3296,10 @@ function CurrencyInput({
3342
3296
  fontSize: isLarge ? ms(32) : ms(17)
3343
3297
  };
3344
3298
  const displayValue = value && prefix && value.startsWith(prefix) ? value.slice(prefix.length) : value;
3345
- return /* @__PURE__ */ React25__default.default.createElement(
3299
+ return /* @__PURE__ */ React54__default.default.createElement(
3346
3300
  Input,
3347
3301
  {
3302
+ ...props,
3348
3303
  value: displayValue,
3349
3304
  onChangeText: handleChange,
3350
3305
  keyboardType: "numeric",
@@ -3392,7 +3347,7 @@ function CurrencyDisplayBase({ value, prefix = "$", showDecimals = false, textCo
3392
3347
  const baseFontSize = variant ? variantFontSize[variant] : ms(56);
3393
3348
  const fontSize = maxFontSize ?? baseFontSize;
3394
3349
  const letterSpacing = variant ? variantLetterSpacing[variant] : -2;
3395
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles24.container, style] }, /* @__PURE__ */ React25__default.default.createElement(
3350
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles24.container, style] }, /* @__PURE__ */ React54__default.default.createElement(
3396
3351
  reactNative.Text,
3397
3352
  {
3398
3353
  style: [styles24.amount, { color: textColor ?? colors.foreground, fontSize, letterSpacing }],
@@ -3404,7 +3359,7 @@ function CurrencyDisplayBase({ value, prefix = "$", showDecimals = false, textCo
3404
3359
  formatted
3405
3360
  ));
3406
3361
  }
3407
- var CurrencyDisplay = React25__default.default.memo(CurrencyDisplayBase);
3362
+ var CurrencyDisplay = React54__default.default.memo(CurrencyDisplayBase);
3408
3363
  var styles24 = reactNative.StyleSheet.create({
3409
3364
  container: {
3410
3365
  alignSelf: "flex-start"
@@ -3419,8 +3374,7 @@ function ListItemBase({
3419
3374
  imageSource,
3420
3375
  leftRender,
3421
3376
  rightRender,
3422
- trailing,
3423
- icon,
3377
+ rightActions,
3424
3378
  leftIcon,
3425
3379
  rightIcon,
3426
3380
  leftIconColor,
@@ -3445,8 +3399,8 @@ function ListItemBase({
3445
3399
  selectionAsync();
3446
3400
  onPress?.();
3447
3401
  };
3448
- const effectiveLeft = imageSource ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Image, { source: imageSource, style: styles25.image }) : leftIcon ? renderIcon(leftIcon, 24, leftIconColor ?? colors.foreground) : leftRender ?? icon;
3449
- const effectiveRight = rightIcon ? renderIcon(rightIcon, 24, rightIconColor ?? colors.foregroundMuted) : rightRender ?? trailing;
3402
+ const effectiveLeft = imageSource ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Image, { source: imageSource, style: styles25.image }) : leftIcon ? renderIcon(leftIcon, 24, leftIconColor ?? colors.foreground) : leftRender;
3403
+ const hasRightContent = !!(rightIcon || rightActions && rightActions.length > 0 || rightRender !== void 0 || showChevron);
3450
3404
  const cardStyle = variant === "card" ? {
3451
3405
  backgroundColor: colors.card,
3452
3406
  borderRadius: RADIUS.md,
@@ -3459,7 +3413,7 @@ function ListItemBase({
3459
3413
  elevation: 2
3460
3414
  } : {};
3461
3415
  const a11yLabel = accessibilityLabel ?? [title, subtitle, caption].filter(Boolean).join(". ");
3462
- const content = /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, effectiveLeft ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles25.leftContainer }, effectiveLeft) : null, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles25.content }, /* @__PURE__ */ React25__default.default.createElement(
3416
+ const content = /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, effectiveLeft ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles25.leftContainer }, effectiveLeft) : null, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles25.content }, /* @__PURE__ */ React54__default.default.createElement(
3463
3417
  reactNative.Text,
3464
3418
  {
3465
3419
  style: [styles25.title, { color: colors.foreground }, titleStyle],
@@ -3467,7 +3421,7 @@ function ListItemBase({
3467
3421
  allowFontScaling: true
3468
3422
  },
3469
3423
  title
3470
- ), subtitle ? /* @__PURE__ */ React25__default.default.createElement(
3424
+ ), subtitle ? /* @__PURE__ */ React54__default.default.createElement(
3471
3425
  reactNative.Text,
3472
3426
  {
3473
3427
  style: [styles25.subtitle, { color: colors.foregroundMuted }, subtitleStyle],
@@ -3475,7 +3429,7 @@ function ListItemBase({
3475
3429
  allowFontScaling: true
3476
3430
  },
3477
3431
  subtitle
3478
- ) : null, caption ? /* @__PURE__ */ React25__default.default.createElement(
3432
+ ) : null, caption ? /* @__PURE__ */ React54__default.default.createElement(
3479
3433
  reactNative.Text,
3480
3434
  {
3481
3435
  style: [styles25.caption, { color: colors.foregroundMuted }, captionStyle],
@@ -3483,16 +3437,16 @@ function ListItemBase({
3483
3437
  allowFontScaling: true
3484
3438
  },
3485
3439
  caption
3486
- ) : null), effectiveRight !== void 0 ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles25.rightContainer }, typeof effectiveRight === "string" ? /* @__PURE__ */ React25__default.default.createElement(
3440
+ ) : null), hasRightContent ? rightIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles25.rightContainer }, renderIcon(rightIcon, 24, rightIconColor ?? colors.foregroundMuted)) : rightActions && rightActions.length > 0 ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles25.rightActionsContainer }, rightActions.map((action, i) => /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, { key: i }, action))) : rightRender !== void 0 ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles25.rightContainer }, typeof rightRender === "string" ? /* @__PURE__ */ React54__default.default.createElement(
3487
3441
  reactNative.Text,
3488
3442
  {
3489
3443
  style: [styles25.rightText, { color: colors.foregroundMuted }],
3490
3444
  allowFontScaling: true
3491
3445
  },
3492
- effectiveRight
3493
- ) : effectiveRight) : showChevron ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null);
3446
+ rightRender
3447
+ ) : rightRender) : showChevron ? /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Entypo, { name: "chevron-with-circle-right", size: 20, color: colors.foregroundMuted }) : null : null);
3494
3448
  if (onPress) {
3495
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: disabled && styles25.disabled }, /* @__PURE__ */ React25__default.default.createElement(
3449
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: disabled && styles25.disabled }, /* @__PURE__ */ React54__default.default.createElement(
3496
3450
  PressableRow,
3497
3451
  {
3498
3452
  style: [styles25.container, cardStyle, style],
@@ -3506,11 +3460,11 @@ function ListItemBase({
3506
3460
  accessibilityState: { disabled: !!disabled }
3507
3461
  },
3508
3462
  content
3509
- ), showSeparator ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles25.separator, { backgroundColor: colors.separator }] }) : null);
3463
+ ), showSeparator ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles25.separator, { backgroundColor: colors.separator }] }) : null);
3510
3464
  }
3511
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [disabled && styles25.disabled] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles25.container, cardStyle, style] }, content), showSeparator ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles25.separator, { backgroundColor: colors.separator }] }) : null);
3465
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [disabled && styles25.disabled] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles25.container, cardStyle, style] }, content), showSeparator ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles25.separator, { backgroundColor: colors.separator }] }) : null);
3512
3466
  }
3513
- var ListItem = React25__default.default.memo(ListItemBase);
3467
+ var ListItem = React54__default.default.memo(ListItemBase);
3514
3468
  var styles25 = reactNative.StyleSheet.create({
3515
3469
  container: {
3516
3470
  flexDirection: "row",
@@ -3557,6 +3511,12 @@ var styles25 = reactNative.StyleSheet.create({
3557
3511
  flexShrink: 0,
3558
3512
  maxWidth: s(160)
3559
3513
  },
3514
+ rightActionsContainer: {
3515
+ flexDirection: "row",
3516
+ alignItems: "center",
3517
+ gap: s(8),
3518
+ flexShrink: 0
3519
+ },
3560
3520
  rightText: {
3561
3521
  fontFamily: "Sohne-Regular",
3562
3522
  fontSize: ms(14)
@@ -3571,17 +3531,17 @@ var styles25 = reactNative.StyleSheet.create({
3571
3531
  });
3572
3532
  function ListGroup({ children, variant = "plain", style }) {
3573
3533
  const { colors } = useTheme();
3574
- const processedChildren = React25__default.default.Children.map(children, (child, index) => {
3575
- if (!React25__default.default.isValidElement(child)) return child;
3534
+ const processedChildren = React54__default.default.Children.map(children, (child, index) => {
3535
+ if (!React54__default.default.isValidElement(child)) return child;
3576
3536
  if (child.type === ListGroupHeader || child.type === ListGroupFooter) {
3577
3537
  return child;
3578
3538
  }
3579
3539
  const childProps = child.props;
3580
3540
  const isListItem = "title" in childProps;
3581
3541
  if (!isListItem) return child;
3582
- const isLast = index === React25__default.default.Children.count(children) - 1;
3542
+ const isLast = index === React54__default.default.Children.count(children) - 1;
3583
3543
  if (childProps["showSeparator"] === void 0 && !isLast) {
3584
- return React25__default.default.cloneElement(child, {
3544
+ return React54__default.default.cloneElement(child, {
3585
3545
  showSeparator: true
3586
3546
  });
3587
3547
  }
@@ -3599,21 +3559,21 @@ function ListGroup({ children, variant = "plain", style }) {
3599
3559
  elevation: 2,
3600
3560
  paddingVertical: vs(4)
3601
3561
  } : {};
3602
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles26.container, cardStyle, style] }, processedChildren);
3562
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles26.container, cardStyle, style] }, processedChildren);
3603
3563
  }
3604
3564
  function ListGroupHeader({ children, style }) {
3605
3565
  const { colors } = useTheme();
3606
3566
  if (typeof children === "string") {
3607
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles26.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3567
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles26.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3608
3568
  }
3609
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, children);
3569
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, children);
3610
3570
  }
3611
3571
  function ListGroupFooter({ children, style }) {
3612
3572
  const { colors } = useTheme();
3613
3573
  if (typeof children === "string") {
3614
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles26.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3574
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles26.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3615
3575
  }
3616
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, children);
3576
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, children);
3617
3577
  }
3618
3578
  ListGroup.Header = ListGroupHeader;
3619
3579
  ListGroup.Footer = ListGroupFooter;
@@ -3677,7 +3637,7 @@ function MenuItemBase({
3677
3637
  elevation: 2
3678
3638
  } : {};
3679
3639
  const a11yLabel = accessibilityLabel ?? (subtitle ? `${label}. ${subtitle}` : label);
3680
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: disabled && styles27.disabled }, /* @__PURE__ */ React25__default.default.createElement(
3640
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: disabled && styles27.disabled }, /* @__PURE__ */ React54__default.default.createElement(
3681
3641
  PressableRow,
3682
3642
  {
3683
3643
  style: [styles27.container, cardStyle, style],
@@ -3690,8 +3650,8 @@ function MenuItemBase({
3690
3650
  accessibilityLabel: a11yLabel,
3691
3651
  accessibilityState: { disabled }
3692
3652
  },
3693
- resolvedIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles27.iconContainer }, resolvedIcon) : null,
3694
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles27.labelContainer }, /* @__PURE__ */ React25__default.default.createElement(
3653
+ resolvedIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles27.iconContainer }, resolvedIcon) : null,
3654
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles27.labelContainer }, /* @__PURE__ */ React54__default.default.createElement(
3695
3655
  reactNative.Text,
3696
3656
  {
3697
3657
  style: [styles27.label, { color: colors.foreground }, labelStyle],
@@ -3699,7 +3659,7 @@ function MenuItemBase({
3699
3659
  allowFontScaling: true
3700
3660
  },
3701
3661
  label
3702
- ), subtitle ? /* @__PURE__ */ React25__default.default.createElement(
3662
+ ), subtitle ? /* @__PURE__ */ React54__default.default.createElement(
3703
3663
  reactNative.Text,
3704
3664
  {
3705
3665
  style: [styles27.subtitle, { color: colors.foregroundMuted }],
@@ -3708,7 +3668,7 @@ function MenuItemBase({
3708
3668
  },
3709
3669
  subtitle
3710
3670
  ) : null),
3711
- rightRender !== void 0 ? /* @__PURE__ */ React25__default.default.createElement(
3671
+ rightRender !== void 0 ? /* @__PURE__ */ React54__default.default.createElement(
3712
3672
  reactNative.View,
3713
3673
  {
3714
3674
  style: styles27.rightContainer,
@@ -3717,10 +3677,10 @@ function MenuItemBase({
3717
3677
  }
3718
3678
  },
3719
3679
  rightRender
3720
- ) : showChevron ? /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 18, color: colors.foregroundMuted }) : null
3721
- ), showSeparator ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles27.separator, { backgroundColor: colors.separator }] }) : null);
3680
+ ) : showChevron ? /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 18, color: colors.foregroundMuted }) : null
3681
+ ), showSeparator ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles27.separator, { backgroundColor: colors.separator }] }) : null);
3722
3682
  }
3723
- var MenuItem = React25__default.default.memo(MenuItemBase);
3683
+ var MenuItem = React54__default.default.memo(MenuItemBase);
3724
3684
  var styles27 = reactNative.StyleSheet.create({
3725
3685
  container: {
3726
3686
  flexDirection: "row",
@@ -3764,17 +3724,17 @@ var styles27 = reactNative.StyleSheet.create({
3764
3724
  });
3765
3725
  function MenuGroup({ children, variant = "plain", style }) {
3766
3726
  const { colors } = useTheme();
3767
- const processedChildren = React25__default.default.Children.map(children, (child, index) => {
3768
- if (!React25__default.default.isValidElement(child)) return child;
3727
+ const processedChildren = React54__default.default.Children.map(children, (child, index) => {
3728
+ if (!React54__default.default.isValidElement(child)) return child;
3769
3729
  if (child.type === MenuGroupHeader || child.type === MenuGroupFooter) {
3770
3730
  return child;
3771
3731
  }
3772
3732
  const childProps = child.props;
3773
3733
  const isMenuItem = "onPress" in childProps;
3774
3734
  if (!isMenuItem) return child;
3775
- const isLast = index === React25__default.default.Children.count(children) - 1;
3735
+ const isLast = index === React54__default.default.Children.count(children) - 1;
3776
3736
  if (childProps["showSeparator"] === void 0 && !isLast) {
3777
- return React25__default.default.cloneElement(child, {
3737
+ return React54__default.default.cloneElement(child, {
3778
3738
  showSeparator: true
3779
3739
  });
3780
3740
  }
@@ -3792,21 +3752,21 @@ function MenuGroup({ children, variant = "plain", style }) {
3792
3752
  elevation: 2,
3793
3753
  paddingVertical: vs(4)
3794
3754
  } : {};
3795
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles28.container, cardStyle, style] }, processedChildren);
3755
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles28.container, cardStyle, style] }, processedChildren);
3796
3756
  }
3797
3757
  function MenuGroupHeader({ children, style }) {
3798
3758
  const { colors } = useTheme();
3799
3759
  if (typeof children === "string") {
3800
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles28.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3760
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles28.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3801
3761
  }
3802
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, children);
3762
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, children);
3803
3763
  }
3804
3764
  function MenuGroupFooter({ children, style }) {
3805
3765
  const { colors } = useTheme();
3806
3766
  if (typeof children === "string") {
3807
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles28.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3767
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles28.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
3808
3768
  }
3809
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, children);
3769
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, children);
3810
3770
  }
3811
3771
  MenuGroup.Header = MenuGroupHeader;
3812
3772
  MenuGroup.Footer = MenuGroupFooter;
@@ -3843,7 +3803,7 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
3843
3803
  onPress?.();
3844
3804
  };
3845
3805
  const resolvedIcon = iconName ? renderIcon(iconName, ms(13), selected ? colors.primaryForeground : colors.foreground) : icon;
3846
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles29.wrapper, style] }, /* @__PURE__ */ React25__default.default.createElement(
3806
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles29.wrapper, style] }, /* @__PURE__ */ React54__default.default.createElement(
3847
3807
  PressableChip,
3848
3808
  {
3849
3809
  onPress: handlePress,
@@ -3853,7 +3813,7 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
3853
3813
  accessibilityLabel: accessibilityLabel ?? label,
3854
3814
  accessibilityState: { selected }
3855
3815
  },
3856
- /* @__PURE__ */ React25__default.default.createElement(
3816
+ /* @__PURE__ */ React54__default.default.createElement(
3857
3817
  reactNativeEase.EaseView,
3858
3818
  {
3859
3819
  style: styles29.chip,
@@ -3863,8 +3823,8 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
3863
3823
  },
3864
3824
  transition: COLOR_TRANSITION
3865
3825
  },
3866
- resolvedIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles29.chipIcon }, resolvedIcon) : null,
3867
- /* @__PURE__ */ React25__default.default.createElement(
3826
+ resolvedIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles29.chipIcon }, resolvedIcon) : null,
3827
+ /* @__PURE__ */ React54__default.default.createElement(
3868
3828
  reactNative.Text,
3869
3829
  {
3870
3830
  style: [styles29.label, { color: selected ? colors.primaryForeground : colors.foreground }],
@@ -3875,7 +3835,7 @@ function ChipBase({ label, selected = false, onPress, icon, iconName, style, acc
3875
3835
  )
3876
3836
  ));
3877
3837
  }
3878
- var Chip = React25__default.default.memo(ChipBase);
3838
+ var Chip = React54__default.default.memo(ChipBase);
3879
3839
  function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
3880
3840
  const handlePress = (optionValue) => {
3881
3841
  if (!multiSelect) {
@@ -3891,7 +3851,7 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
3891
3851
  if (Array.isArray(value)) return value.includes(optionValue);
3892
3852
  return optionValue === value;
3893
3853
  };
3894
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles29.group, style] }, options.map((opt) => /* @__PURE__ */ React25__default.default.createElement(
3854
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles29.group, style] }, options.map((opt) => /* @__PURE__ */ React54__default.default.createElement(
3895
3855
  Chip,
3896
3856
  {
3897
3857
  key: opt.value,
@@ -3941,7 +3901,6 @@ function ConfirmDialog({
3941
3901
  visible,
3942
3902
  title,
3943
3903
  subtitle,
3944
- description,
3945
3904
  confirmLabel = "Confirm",
3946
3905
  cancelLabel = "Cancel",
3947
3906
  confirmVariant = "primary",
@@ -3951,38 +3910,45 @@ function ConfirmDialog({
3951
3910
  onCancel
3952
3911
  }) {
3953
3912
  const { colors } = useTheme();
3954
- const ref = React25.useRef(null);
3955
- const effectiveSubtitle = subtitle ?? description;
3956
- React25.useEffect(() => {
3913
+ const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
3914
+ const ref = React54.useRef(null);
3915
+ const wasOpened = React54.useRef(false);
3916
+ const name = React54.useId();
3917
+ React54.useEffect(() => {
3957
3918
  if (visible) {
3958
3919
  impactMedium();
3959
- ref.current?.snapToIndex(0);
3960
- } else {
3961
- ref.current?.close();
3920
+ ref.current?.present();
3921
+ wasOpened.current = true;
3922
+ } else if (wasOpened.current) {
3923
+ ref.current?.dismiss();
3962
3924
  }
3963
3925
  }, [visible]);
3964
- const renderBackdrop = (props) => /* @__PURE__ */ React25__default.default.createElement(
3965
- BottomSheet.BottomSheetBackdrop,
3966
- {
3967
- ...props,
3968
- disappearsOnIndex: -1,
3969
- appearsOnIndex: 0,
3970
- pressBehavior: "close"
3971
- }
3926
+ const renderBackdrop = React54.useCallback(
3927
+ (props) => /* @__PURE__ */ React54__default.default.createElement(
3928
+ bottomSheet.BottomSheetBackdrop,
3929
+ {
3930
+ ...props,
3931
+ disappearsOnIndex: -1,
3932
+ appearsOnIndex: 0,
3933
+ pressBehavior: "close"
3934
+ }
3935
+ ),
3936
+ []
3972
3937
  );
3973
- return /* @__PURE__ */ React25__default.default.createElement(
3974
- BottomSheet__default.default,
3938
+ return /* @__PURE__ */ React54__default.default.createElement(
3939
+ bottomSheet.BottomSheetModal,
3975
3940
  {
3976
3941
  ref,
3977
- index: -1,
3978
- onClose: onCancel,
3942
+ name,
3943
+ onDismiss: onCancel,
3979
3944
  enableDynamicSizing: true,
3980
3945
  backdropComponent: renderBackdrop,
3981
- backgroundStyle: [styles30.background, { backgroundColor: colors.card }],
3982
- handleIndicatorStyle: [styles30.handle, { backgroundColor: colors.border }],
3983
- enablePanDownToClose: true
3946
+ backgroundStyle: { ...styles30.background, backgroundColor: colors.card },
3947
+ handleIndicatorStyle: { ...styles30.handle, backgroundColor: colors.border },
3948
+ enablePanDownToClose: true,
3949
+ topInset: insets.top
3984
3950
  },
3985
- /* @__PURE__ */ React25__default.default.createElement(BottomSheet.BottomSheetView, { style: styles30.content }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles30.header, accessibilityRole: "header" }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles30.headerRow }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles30.title, { color: colors.foreground }], allowFontScaling: true }, title), showCloseButton ? /* @__PURE__ */ React25__default.default.createElement(
3951
+ /* @__PURE__ */ React54__default.default.createElement(bottomSheet.BottomSheetView, { style: styles30.content }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles30.header, accessibilityRole: "header" }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles30.headerRow }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles30.title, { color: colors.foreground }], allowFontScaling: true }, title), showCloseButton ? /* @__PURE__ */ React54__default.default.createElement(
3986
3952
  reactNative.TouchableOpacity,
3987
3953
  {
3988
3954
  onPress: onCancel,
@@ -3993,8 +3959,8 @@ function ConfirmDialog({
3993
3959
  accessibilityLabel: "Close",
3994
3960
  hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }
3995
3961
  },
3996
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "x", size: ms(18), color: colors.foregroundMuted })
3997
- ) : null), effectiveSubtitle ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles30.subtitle, { color: colors.foregroundMuted }], allowFontScaling: true }, effectiveSubtitle) : null), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles30.actions }, /* @__PURE__ */ React25__default.default.createElement(
3962
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Feather, { name: "x", size: ms(18), color: colors.foregroundMuted })
3963
+ ) : null), subtitle ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles30.subtitle, { color: colors.foregroundMuted }], allowFontScaling: true }, subtitle) : null), /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles30.actions }, /* @__PURE__ */ React54__default.default.createElement(
3998
3964
  Button,
3999
3965
  {
4000
3966
  label: confirmLabel,
@@ -4006,7 +3972,7 @@ function ConfirmDialog({
4006
3972
  notificationSuccess();
4007
3973
  onConfirm();
4008
3974
  },
4009
- icon: /* @__PURE__ */ React25__default.default.createElement(
3975
+ icon: /* @__PURE__ */ React54__default.default.createElement(
4010
3976
  vectorIcons.Feather,
4011
3977
  {
4012
3978
  name: confirmVariant === "destructive" ? "trash-2" : "check",
@@ -4015,7 +3981,7 @@ function ConfirmDialog({
4015
3981
  }
4016
3982
  )
4017
3983
  }
4018
- ), /* @__PURE__ */ React25__default.default.createElement(
3984
+ ), /* @__PURE__ */ React54__default.default.createElement(
4019
3985
  Button,
4020
3986
  {
4021
3987
  label: cancelLabel,
@@ -4025,7 +3991,7 @@ function ConfirmDialog({
4025
3991
  selectionAsync();
4026
3992
  onCancel();
4027
3993
  },
4028
- icon: /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "x", size: 15, color: colors.foreground })
3994
+ icon: /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Feather, { name: "x", size: 15, color: colors.foreground })
4029
3995
  }
4030
3996
  )))
4031
3997
  );
@@ -4076,9 +4042,9 @@ var styles30 = reactNative.StyleSheet.create({
4076
4042
  function LabelValueBase({ label, value, iconName, iconColor, style }) {
4077
4043
  const { colors } = useTheme();
4078
4044
  const resolvedIcon = iconName ? renderIcon(iconName, ms(14), iconColor ?? colors.foregroundMuted) : null;
4079
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles31.container, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles31.labelSide }, resolvedIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles31.icon }, resolvedIcon) : null, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles31.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label)), typeof value === "string" ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles31.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
4045
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles31.container, style] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles31.labelSide }, resolvedIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles31.icon }, resolvedIcon) : null, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles31.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label)), typeof value === "string" ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles31.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
4080
4046
  }
4081
- var LabelValue = React25__default.default.memo(LabelValueBase);
4047
+ var LabelValue = React54__default.default.memo(LabelValueBase);
4082
4048
  var styles31 = reactNative.StyleSheet.create({
4083
4049
  container: {
4084
4050
  flexDirection: "row",
@@ -4143,7 +4109,7 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
4143
4109
  selectionAsync();
4144
4110
  onChange(fromIndex(index + 1));
4145
4111
  };
4146
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles32.container, style], accessibilityRole: "adjustable", accessibilityLabel: getLabel() }, /* @__PURE__ */ React25__default.default.createElement(
4112
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles32.container, style], accessibilityRole: "adjustable", accessibilityLabel: getLabel() }, /* @__PURE__ */ React54__default.default.createElement(
4147
4113
  reactNative.TouchableOpacity,
4148
4114
  {
4149
4115
  style: [styles32.arrow, prevDisabled && styles32.arrowDisabled],
@@ -4156,8 +4122,8 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
4156
4122
  accessibilityState: { disabled: prevDisabled },
4157
4123
  hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }
4158
4124
  },
4159
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
4160
- ), /* @__PURE__ */ React25__default.default.createElement(
4125
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Entypo, { name: "chevron-left", size: 22, color: colors.foreground })
4126
+ ), /* @__PURE__ */ React54__default.default.createElement(
4161
4127
  reactNative.Text,
4162
4128
  {
4163
4129
  style: [styles32.label, { color: colors.foreground }],
@@ -4165,7 +4131,7 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
4165
4131
  accessibilityLiveRegion: "polite"
4166
4132
  },
4167
4133
  getLabel()
4168
- ), /* @__PURE__ */ React25__default.default.createElement(
4134
+ ), /* @__PURE__ */ React54__default.default.createElement(
4169
4135
  reactNative.TouchableOpacity,
4170
4136
  {
4171
4137
  style: [styles32.arrow, nextDisabled && styles32.arrowDisabled],
@@ -4178,7 +4144,7 @@ function MonthPicker({ value, onChange, minValue, maxValue, locale = "en", forma
4178
4144
  accessibilityState: { disabled: nextDisabled },
4179
4145
  hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }
4180
4146
  },
4181
- /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
4147
+ /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
4182
4148
  ));
4183
4149
  }
4184
4150
  var styles32 = reactNative.StyleSheet.create({
@@ -4244,7 +4210,7 @@ function MediaCardBase({
4244
4210
  const ratio = aspectRatioMap2[aspectRatio];
4245
4211
  const resolvedActionIcon = actionIconName ? renderIcon(actionIconName, 18, actionActive ? colors.primary : colors.background) : actionIcon ?? renderIcon("heart", 18, actionActive ? colors.primary : colors.background);
4246
4212
  const a11yLabel = accessibilityLabel ?? [title, subtitle].filter(Boolean).join(". ");
4247
- const cardContent = /* @__PURE__ */ React25__default.default.createElement(
4213
+ const cardContent = /* @__PURE__ */ React54__default.default.createElement(
4248
4214
  reactNative.View,
4249
4215
  {
4250
4216
  style: [
@@ -4254,14 +4220,14 @@ function MediaCardBase({
4254
4220
  ],
4255
4221
  ...reactNative.Platform.OS === "web" ? hoverHandlers : {}
4256
4222
  },
4257
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles33.imageContainer, imageStyle] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React25__default.default.createElement(
4223
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles33.imageContainer, imageStyle] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React54__default.default.createElement(
4258
4224
  reactNative.Image,
4259
4225
  {
4260
4226
  source: imageSource,
4261
4227
  style: styles33.image,
4262
4228
  resizeMode: "cover"
4263
4229
  }
4264
- ) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles33.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles33.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React25__default.default.createElement(
4230
+ ) : /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles33.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles33.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React54__default.default.createElement(
4265
4231
  reactNative.TouchableOpacity,
4266
4232
  {
4267
4233
  style: [styles33.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
@@ -4278,10 +4244,10 @@ function MediaCardBase({
4278
4244
  },
4279
4245
  resolvedActionIcon
4280
4246
  )),
4281
- (title || subtitle || caption || footer) && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles33.meta }, title ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles33.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles33.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles33.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
4247
+ (title || subtitle || caption || footer) && /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles33.meta }, title ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles33.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles33.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles33.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
4282
4248
  );
4283
4249
  if (onPress) {
4284
- return /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: animatedStyle }, /* @__PURE__ */ React25__default.default.createElement(
4250
+ return /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: animatedStyle }, /* @__PURE__ */ React54__default.default.createElement(
4285
4251
  reactNative.TouchableOpacity,
4286
4252
  {
4287
4253
  onPress: handlePress,
@@ -4297,7 +4263,7 @@ function MediaCardBase({
4297
4263
  }
4298
4264
  return cardContent;
4299
4265
  }
4300
- var MediaCard = React25__default.default.memo(MediaCardBase);
4266
+ var MediaCard = React54__default.default.memo(MediaCardBase);
4301
4267
  var styles33 = reactNative.StyleSheet.create({
4302
4268
  card: {
4303
4269
  borderRadius: RADIUS.md,
@@ -4355,7 +4321,7 @@ var styles33 = reactNative.StyleSheet.create({
4355
4321
  lineHeight: mvs(16)
4356
4322
  }
4357
4323
  });
4358
- var CategoryChip = React25__default.default.memo(function CategoryChip2({
4324
+ var CategoryChip = React54__default.default.memo(function CategoryChip2({
4359
4325
  item,
4360
4326
  selected,
4361
4327
  onSelect
@@ -4366,7 +4332,7 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
4366
4332
  });
4367
4333
  const iconColor = selected ? colors.primaryForeground : colors.foregroundSubtle;
4368
4334
  const resolvedIcon = typeof item.icon === "string" ? renderIcon(item.icon, 16, iconColor) : item.icon ?? null;
4369
- return /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: scaleStyle, ...hoverHandlers }, /* @__PURE__ */ React25__default.default.createElement(
4335
+ return /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: scaleStyle, ...hoverHandlers }, /* @__PURE__ */ React54__default.default.createElement(
4370
4336
  reactNative.TouchableOpacity,
4371
4337
  {
4372
4338
  onPress: () => onSelect(item.value),
@@ -4378,7 +4344,7 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
4378
4344
  accessibilityLabel: item.label,
4379
4345
  accessibilityState: { selected }
4380
4346
  },
4381
- /* @__PURE__ */ React25__default.default.createElement(
4347
+ /* @__PURE__ */ React54__default.default.createElement(
4382
4348
  reactNativeEase.EaseView,
4383
4349
  {
4384
4350
  style: styles34.chip,
@@ -4388,8 +4354,8 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
4388
4354
  },
4389
4355
  transition: COLOR_TRANSITION
4390
4356
  },
4391
- resolvedIcon && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles34.chipIcon }, resolvedIcon),
4392
- /* @__PURE__ */ React25__default.default.createElement(
4357
+ resolvedIcon && /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles34.chipIcon }, resolvedIcon),
4358
+ /* @__PURE__ */ React54__default.default.createElement(
4393
4359
  reactNative.Text,
4394
4360
  {
4395
4361
  style: [styles34.chipLabel, { color: selected ? colors.primaryForeground : colors.foregroundSubtle }],
@@ -4397,7 +4363,7 @@ var CategoryChip = React25__default.default.memo(function CategoryChip2({
4397
4363
  },
4398
4364
  item.label
4399
4365
  ),
4400
- item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles34.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles34.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
4366
+ item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles34.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles34.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
4401
4367
  )
4402
4368
  ));
4403
4369
  });
@@ -4411,7 +4377,7 @@ function CategoryStrip({
4411
4377
  accessibilityLabel
4412
4378
  }) {
4413
4379
  const selected = Array.isArray(value) ? value : value ? [value] : [];
4414
- const handlePress = React25.useCallback(
4380
+ const handlePress = React54.useCallback(
4415
4381
  (v) => {
4416
4382
  selectionAsync();
4417
4383
  if (multiSelect) {
@@ -4424,7 +4390,7 @@ function CategoryStrip({
4424
4390
  },
4425
4391
  [multiSelect, value, onValueChange]
4426
4392
  );
4427
- return /* @__PURE__ */ React25__default.default.createElement(
4393
+ return /* @__PURE__ */ React54__default.default.createElement(
4428
4394
  reactNative.ScrollView,
4429
4395
  {
4430
4396
  horizontal: true,
@@ -4434,7 +4400,7 @@ function CategoryStrip({
4434
4400
  accessibilityRole: multiSelect ? void 0 : "radiogroup",
4435
4401
  accessibilityLabel
4436
4402
  },
4437
- categories.map((cat) => /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { key: cat.value, style: itemStyle }, /* @__PURE__ */ React25__default.default.createElement(
4403
+ categories.map((cat) => /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { key: cat.value, style: itemStyle }, /* @__PURE__ */ React54__default.default.createElement(
4438
4404
  CategoryChip,
4439
4405
  {
4440
4406
  item: cat,
@@ -4485,21 +4451,24 @@ var styles34 = reactNative.StyleSheet.create({
4485
4451
  lineHeight: 14
4486
4452
  }
4487
4453
  });
4488
- function Pressable3({
4454
+ function Pressable2({
4489
4455
  children,
4490
4456
  onPress,
4491
4457
  pressScale: _pressScale = PRESS_SCALE.card,
4492
4458
  haptics = true,
4493
4459
  style,
4494
4460
  disabled,
4495
- hoverScale: _hoverScale = 1.02
4461
+ hoverScale: _hoverScale = 1.02,
4462
+ accessibilityRole,
4463
+ accessibilityState,
4464
+ accessibilityLabel
4496
4465
  }) {
4497
4466
  const handlePress = () => {
4498
4467
  if (disabled || !onPress) return;
4499
4468
  if (haptics) impactLight();
4500
4469
  onPress();
4501
4470
  };
4502
- return /* @__PURE__ */ React25__default.default.createElement(
4471
+ return /* @__PURE__ */ React54__default.default.createElement(
4503
4472
  PressableCard,
4504
4473
  {
4505
4474
  style,
@@ -4508,8 +4477,9 @@ function Pressable3({
4508
4477
  rippleColor: "transparent",
4509
4478
  touchSoundDisabled: true,
4510
4479
  activateOnHover: true,
4511
- accessibilityRole: "button",
4512
- accessibilityState: { disabled: !!disabled }
4480
+ accessibilityRole: accessibilityRole ?? "button",
4481
+ accessibilityState: accessibilityState ?? { disabled: !!disabled },
4482
+ accessibilityLabel
4513
4483
  },
4514
4484
  children
4515
4485
  );
@@ -4546,23 +4516,23 @@ function DetailRowBase({
4546
4516
  borderColor: "rgba(128,128,128,0.3)",
4547
4517
  marginHorizontal: s(4)
4548
4518
  };
4549
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles35.row, style] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles35.labelSide }, resolvedLeftIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedLeftIcon) : null, typeof label === "string" ? /* @__PURE__ */ React25__default.default.createElement(
4519
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles35.row, style] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles35.labelSide }, resolvedLeftIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedLeftIcon) : null, typeof label === "string" ? /* @__PURE__ */ React54__default.default.createElement(
4550
4520
  reactNative.Text,
4551
4521
  {
4552
4522
  style: [styles35.labelText, { color: colors.foregroundMuted, fontFamily: weightMap[labelWeight] }, labelStyle],
4553
4523
  allowFontScaling: true
4554
4524
  },
4555
4525
  label
4556
- ) : label), separatorStyle ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: separatorStyle }) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles35.spacer }), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles35.valueSide }, typeof value === "string" ? /* @__PURE__ */ React25__default.default.createElement(
4526
+ ) : label), separatorStyle ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: separatorStyle }) : /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles35.spacer }), /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles35.valueSide }, typeof value === "string" ? /* @__PURE__ */ React54__default.default.createElement(
4557
4527
  reactNative.Text,
4558
4528
  {
4559
4529
  style: [styles35.valueText, { color: valueColor ?? colors.foreground }, valueStyle],
4560
4530
  allowFontScaling: true
4561
4531
  },
4562
4532
  value
4563
- ) : value, resolvedRightIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedRightIcon) : null));
4533
+ ) : value, resolvedRightIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedRightIcon) : null));
4564
4534
  }
4565
- var DetailRow = React25__default.default.memo(DetailRowBase);
4535
+ var DetailRow = React54__default.default.memo(DetailRowBase);
4566
4536
  var styles35 = reactNative.StyleSheet.create({
4567
4537
  row: {
4568
4538
  flexDirection: "row",
@@ -4599,7 +4569,7 @@ var styles35 = reactNative.StyleSheet.create({
4599
4569
  }
4600
4570
  });
4601
4571
  function Form({ children, style }) {
4602
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles36.form, style] }, children);
4572
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles36.form, style] }, children);
4603
4573
  }
4604
4574
  function FormField({
4605
4575
  children,
@@ -4611,14 +4581,14 @@ function FormField({
4611
4581
  errorStyle
4612
4582
  }) {
4613
4583
  const { colors } = useTheme();
4614
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles36.field, style] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles36.label, { color: colors.foreground }, labelStyle], allowFontScaling: true }, label, required ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: { color: colors.destructive } }, " *") : null) : null, children, error ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles36.error, { color: colors.destructive }, errorStyle], allowFontScaling: true }, error) : null);
4584
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles36.field, style] }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles36.label, { color: colors.foreground }, labelStyle], allowFontScaling: true }, label, required ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: { color: colors.destructive } }, " *") : null) : null, children, error ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles36.error, { color: colors.destructive }, errorStyle], allowFontScaling: true }, error) : null);
4615
4585
  }
4616
4586
  function FormSection({ children, title, description, style }) {
4617
4587
  const { colors } = useTheme();
4618
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles36.section, style] }, title ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles36.sectionHeader }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles36.sectionTitle, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles36.sectionDescription, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null, children);
4588
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles36.section, style] }, title ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles36.sectionHeader }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles36.sectionTitle, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles36.sectionDescription, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null, children);
4619
4589
  }
4620
4590
  function FormFooter({ children, style }) {
4621
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles36.footer, style] }, children);
4591
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles36.footer, style] }, children);
4622
4592
  }
4623
4593
  Form.Field = FormField;
4624
4594
  Form.Section = FormSection;
@@ -4667,7 +4637,7 @@ var defaultKeyExtractor = (item, index) => {
4667
4637
  return id !== void 0 ? String(id) : String(index);
4668
4638
  };
4669
4639
  function VirtualListInner({ itemHeight, keyExtractor, renderItem, ...props }, ref) {
4670
- const getItemLayout = React25.useCallback(
4640
+ const getItemLayout = React54.useCallback(
4671
4641
  (_data, index) => ({
4672
4642
  length: itemHeight ?? 0,
4673
4643
  offset: (itemHeight ?? 0) * index,
@@ -4675,7 +4645,7 @@ function VirtualListInner({ itemHeight, keyExtractor, renderItem, ...props }, re
4675
4645
  }),
4676
4646
  [itemHeight]
4677
4647
  );
4678
- return /* @__PURE__ */ React25__default.default.createElement(
4648
+ return /* @__PURE__ */ React54__default.default.createElement(
4679
4649
  reactNative.FlatList,
4680
4650
  {
4681
4651
  ref,
@@ -4687,9 +4657,9 @@ function VirtualListInner({ itemHeight, keyExtractor, renderItem, ...props }, re
4687
4657
  }
4688
4658
  );
4689
4659
  }
4690
- var VirtualList = React25__default.default.forwardRef(VirtualListInner);
4660
+ var VirtualList = React54__default.default.forwardRef(VirtualListInner);
4691
4661
  function RetrayProvider({ children, theme, colorScheme = "system" }) {
4692
- return /* @__PURE__ */ React25__default.default.createElement(reactNativeSafeAreaContext.SafeAreaProvider, { initialMetrics: reactNativeSafeAreaContext.initialWindowMetrics }, /* @__PURE__ */ React25__default.default.createElement(reactNativeGestureHandler.GestureHandlerRootView, { style: styles37.root }, /* @__PURE__ */ React25__default.default.createElement(ThemeProvider, { theme, colorScheme }, /* @__PURE__ */ React25__default.default.createElement(BottomSheet.BottomSheetModalProvider, null, /* @__PURE__ */ React25__default.default.createElement(ToastProvider, null, children)))));
4662
+ return /* @__PURE__ */ React54__default.default.createElement(reactNativeSafeAreaContext.SafeAreaProvider, { initialMetrics: reactNativeSafeAreaContext.initialWindowMetrics }, /* @__PURE__ */ React54__default.default.createElement(reactNativeGestureHandler.GestureHandlerRootView, { style: styles37.root }, /* @__PURE__ */ React54__default.default.createElement(ThemeProvider, { theme, colorScheme }, /* @__PURE__ */ React54__default.default.createElement(bottomSheet.BottomSheetModalProvider, null, /* @__PURE__ */ React54__default.default.createElement(ToastProvider, null, children)))));
4693
4663
  }
4694
4664
  var styles37 = reactNative.StyleSheet.create({
4695
4665
  root: { flex: 1 }
@@ -4701,7 +4671,7 @@ function DefaultErrorFallback({
4701
4671
  message
4702
4672
  }) {
4703
4673
  const { colors } = useTheme();
4704
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles38.container, { backgroundColor: colors.background }], accessibilityRole: "alert" }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles38.iconCircle, { backgroundColor: colors.destructiveTint }] }, renderIcon("alert-triangle", ms(28), colors.destructive)), /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles38.title, { color: colors.foreground }], allowFontScaling: true }, title), /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles38.message, { color: colors.foregroundMuted }], allowFontScaling: true }, message ?? error.message ?? "An unexpected error occurred."), /* @__PURE__ */ React25__default.default.createElement(
4674
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles38.container, { backgroundColor: colors.background }], accessibilityRole: "alert" }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles38.iconCircle, { backgroundColor: colors.destructiveTint }] }, renderIcon("alert-triangle", ms(28), colors.destructive)), /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles38.title, { color: colors.foreground }], allowFontScaling: true }, title), /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles38.message, { color: colors.foregroundMuted }], allowFontScaling: true }, message ?? error.message ?? "An unexpected error occurred."), /* @__PURE__ */ React54__default.default.createElement(
4705
4675
  reactNative.TouchableOpacity,
4706
4676
  {
4707
4677
  style: [styles38.button, { backgroundColor: colors.primary }],
@@ -4714,10 +4684,10 @@ function DefaultErrorFallback({
4714
4684
  accessibilityRole: "button",
4715
4685
  accessibilityLabel: "Try again"
4716
4686
  },
4717
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles38.buttonLabel, { color: colors.primaryForeground }], allowFontScaling: true }, "Try again")
4687
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles38.buttonLabel, { color: colors.primaryForeground }], allowFontScaling: true }, "Try again")
4718
4688
  ));
4719
4689
  }
4720
- var ErrorBoundary = class extends React25__default.default.Component {
4690
+ var ErrorBoundary = class extends React54__default.default.Component {
4721
4691
  constructor() {
4722
4692
  super(...arguments);
4723
4693
  this.state = { error: null };
@@ -4741,7 +4711,7 @@ var ErrorBoundary = class extends React25__default.default.Component {
4741
4711
  if (fallback !== void 0) {
4742
4712
  return fallback;
4743
4713
  }
4744
- return /* @__PURE__ */ React25__default.default.createElement(DefaultErrorFallback, { error, reset: this.reset, title, message });
4714
+ return /* @__PURE__ */ React54__default.default.createElement(DefaultErrorFallback, { error, reset: this.reset, title, message });
4745
4715
  }
4746
4716
  return this.props.children;
4747
4717
  }
@@ -4790,20 +4760,20 @@ var styles38 = reactNative.StyleSheet.create({
4790
4760
  });
4791
4761
  function Dot({ active, size, activeColor, inactiveColor, onPress, index, total }) {
4792
4762
  const progress = Animated12.useSharedValue(active ? 1 : 0);
4793
- React25.useEffect(() => {
4763
+ React54.useEffect(() => {
4794
4764
  progress.value = Animated12.withSpring(active ? 1 : 0, SPRINGS.glide);
4795
4765
  }, [active, progress]);
4796
4766
  const animatedStyle = Animated12.useAnimatedStyle(() => ({
4797
4767
  width: size + progress.value * size * 1.5,
4798
4768
  backgroundColor: Animated12.interpolateColor(progress.value, [0, 1], [inactiveColor, activeColor])
4799
4769
  }));
4800
- const dot = /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [{ height: size, borderRadius: size / 2 }, animatedStyle] });
4770
+ const dot = /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [{ height: size, borderRadius: size / 2 }, animatedStyle] });
4801
4771
  if (!onPress) return dot;
4802
4772
  const handlePress = () => {
4803
4773
  selectionAsync();
4804
4774
  onPress();
4805
4775
  };
4806
- return /* @__PURE__ */ React25__default.default.createElement(
4776
+ return /* @__PURE__ */ React54__default.default.createElement(
4807
4777
  reactNative.TouchableOpacity,
4808
4778
  {
4809
4779
  onPress: handlePress,
@@ -4852,14 +4822,14 @@ function PagerDots({
4852
4822
  onDotPress(activeIndex + 1);
4853
4823
  }
4854
4824
  };
4855
- return /* @__PURE__ */ React25__default.default.createElement(
4825
+ return /* @__PURE__ */ React54__default.default.createElement(
4856
4826
  reactNative.View,
4857
4827
  {
4858
4828
  style: [styles39.container, { gap: s(spacing) }, style],
4859
4829
  accessibilityRole: "adjustable",
4860
4830
  accessibilityLabel: `Page ${activeIndex + 1} of ${count}`
4861
4831
  },
4862
- hasControls && /* @__PURE__ */ React25__default.default.createElement(
4832
+ hasControls && /* @__PURE__ */ React54__default.default.createElement(
4863
4833
  reactNative.TouchableOpacity,
4864
4834
  {
4865
4835
  onPress: handlePrevious,
@@ -4873,7 +4843,7 @@ function PagerDots({
4873
4843
  },
4874
4844
  renderIcon("chevron-left", s(18), canGoPrev ? colors.foreground : colors.foregroundMuted)
4875
4845
  ),
4876
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles39.dotsRow, { gap: s(spacing) }] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React25__default.default.createElement(
4846
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles39.dotsRow, { gap: s(spacing) }] }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React54__default.default.createElement(
4877
4847
  Dot,
4878
4848
  {
4879
4849
  key: i,
@@ -4886,7 +4856,7 @@ function PagerDots({
4886
4856
  onPress: onDotPress ? () => onDotPress(i) : void 0
4887
4857
  }
4888
4858
  ))),
4889
- hasControls && /* @__PURE__ */ React25__default.default.createElement(
4859
+ hasControls && /* @__PURE__ */ React54__default.default.createElement(
4890
4860
  reactNative.TouchableOpacity,
4891
4861
  {
4892
4862
  onPress: handleNext,
@@ -4937,7 +4907,7 @@ function AppHeader({
4937
4907
  const { width } = reactNative.useWindowDimensions();
4938
4908
  const isWide = width >= BREAKPOINTS.wide;
4939
4909
  const centered = titleAlign === "center" || titleAlign === "auto" && isWide;
4940
- const leftNode = left ?? (onBack ? /* @__PURE__ */ React25__default.default.createElement(
4910
+ const leftNode = left ?? (onBack ? /* @__PURE__ */ React54__default.default.createElement(
4941
4911
  IconButton,
4942
4912
  {
4943
4913
  iconName: backIconName,
@@ -4947,7 +4917,7 @@ function AppHeader({
4947
4917
  accessibilityLabel: "Go back"
4948
4918
  }
4949
4919
  ) : null);
4950
- const titleBlock = /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles40.titleBlock, centered && styles40.titleBlockCentered], pointerEvents: "none" }, title ? /* @__PURE__ */ React25__default.default.createElement(
4920
+ const titleBlock = /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles40.titleBlock, centered && styles40.titleBlockCentered], pointerEvents: "none" }, title ? /* @__PURE__ */ React54__default.default.createElement(
4951
4921
  reactNative.Text,
4952
4922
  {
4953
4923
  style: [styles40.title, { color: colors.foreground }, centered && styles40.textCentered],
@@ -4956,7 +4926,7 @@ function AppHeader({
4956
4926
  accessibilityRole: "header"
4957
4927
  },
4958
4928
  title
4959
- ) : null, subtitle ? /* @__PURE__ */ React25__default.default.createElement(
4929
+ ) : null, subtitle ? /* @__PURE__ */ React54__default.default.createElement(
4960
4930
  reactNative.Text,
4961
4931
  {
4962
4932
  style: [styles40.subtitle, { color: colors.foregroundMuted }, centered && styles40.textCentered],
@@ -4965,7 +4935,7 @@ function AppHeader({
4965
4935
  },
4966
4936
  subtitle
4967
4937
  ) : null);
4968
- return /* @__PURE__ */ React25__default.default.createElement(
4938
+ return /* @__PURE__ */ React54__default.default.createElement(
4969
4939
  reactNative.View,
4970
4940
  {
4971
4941
  style: [
@@ -4979,7 +4949,7 @@ function AppHeader({
4979
4949
  style
4980
4950
  ]
4981
4951
  },
4982
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles40.bar }, centered ? /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, titleBlock), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles40.side }, leftNode), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles40.side, styles40.sideRight] }, right)) : /* @__PURE__ */ React25__default.default.createElement(React25__default.default.Fragment, null, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles40.side }, leftNode), titleBlock, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles40.side, styles40.sideRight] }, right)))
4952
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles40.bar }, centered ? /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, titleBlock), /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles40.side }, leftNode), /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles40.side, styles40.sideRight] }, right)) : /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles40.side }, leftNode), titleBlock, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles40.side, styles40.sideRight] }, right)))
4983
4953
  );
4984
4954
  }
4985
4955
  var styles40 = reactNative.StyleSheet.create({
@@ -5036,7 +5006,7 @@ function Cell({ item, selected, width, onPress }) {
5036
5006
  });
5037
5007
  const iconColor = selected ? colors.primary : colors.foregroundSubtle;
5038
5008
  const iconNode = item.icon ?? (item.iconName ? renderIcon(item.iconName, ms(24), iconColor) : null);
5039
- return /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [{ width }, animatedStyle] }, /* @__PURE__ */ React25__default.default.createElement(
5009
+ return /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [{ width }, animatedStyle] }, /* @__PURE__ */ React54__default.default.createElement(
5040
5010
  reactNative.TouchableOpacity,
5041
5011
  {
5042
5012
  onPress,
@@ -5059,7 +5029,7 @@ function Cell({ item, selected, width, onPress }) {
5059
5029
  ]
5060
5030
  },
5061
5031
  iconNode,
5062
- item.label ? /* @__PURE__ */ React25__default.default.createElement(
5032
+ item.label ? /* @__PURE__ */ React54__default.default.createElement(
5063
5033
  reactNative.Text,
5064
5034
  {
5065
5035
  style: [styles41.label, { color: selected ? colors.primary : colors.foreground }],
@@ -5080,7 +5050,7 @@ function SelectableGrid({
5080
5050
  orientation = "grid",
5081
5051
  style
5082
5052
  }) {
5083
- const [containerWidth, setContainerWidth] = React25.useState(0);
5053
+ const [containerWidth, setContainerWidth] = React54.useState(0);
5084
5054
  const gapPx = s(gap);
5085
5055
  const cellWidth = containerWidth > 0 ? (containerWidth - gapPx * (numColumns - 1)) / numColumns - 0.5 : 0;
5086
5056
  const horizCellWidth = s(72);
@@ -5090,7 +5060,7 @@ function SelectableGrid({
5090
5060
  onChange(item.value);
5091
5061
  };
5092
5062
  if (orientation === "horizontal") {
5093
- return /* @__PURE__ */ React25__default.default.createElement(
5063
+ return /* @__PURE__ */ React54__default.default.createElement(
5094
5064
  reactNative.ScrollView,
5095
5065
  {
5096
5066
  horizontal: true,
@@ -5098,7 +5068,7 @@ function SelectableGrid({
5098
5068
  contentContainerStyle: [styles41.horizontal, { gap: gapPx }, style],
5099
5069
  accessibilityRole: multiple ? void 0 : "radiogroup"
5100
5070
  },
5101
- items.map((item) => /* @__PURE__ */ React25__default.default.createElement(
5071
+ items.map((item) => /* @__PURE__ */ React54__default.default.createElement(
5102
5072
  Cell,
5103
5073
  {
5104
5074
  key: String(item.value),
@@ -5110,14 +5080,14 @@ function SelectableGrid({
5110
5080
  ))
5111
5081
  );
5112
5082
  }
5113
- return /* @__PURE__ */ React25__default.default.createElement(
5083
+ return /* @__PURE__ */ React54__default.default.createElement(
5114
5084
  reactNative.View,
5115
5085
  {
5116
5086
  style: [styles41.grid, { gap: gapPx }, style],
5117
5087
  onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width),
5118
5088
  accessibilityRole: multiple ? void 0 : "radiogroup"
5119
5089
  },
5120
- cellWidth > 0 ? items.map((item) => /* @__PURE__ */ React25__default.default.createElement(
5090
+ cellWidth > 0 ? items.map((item) => /* @__PURE__ */ React54__default.default.createElement(
5121
5091
  Cell,
5122
5092
  {
5123
5093
  key: String(item.value),
@@ -5173,7 +5143,7 @@ function PricingCard({
5173
5143
  style
5174
5144
  }) {
5175
5145
  const { colors } = useTheme();
5176
- return /* @__PURE__ */ React25__default.default.createElement(
5146
+ return /* @__PURE__ */ React54__default.default.createElement(
5177
5147
  reactNative.View,
5178
5148
  {
5179
5149
  style: [
@@ -5188,14 +5158,14 @@ function PricingCard({
5188
5158
  ],
5189
5159
  accessibilityRole: "summary"
5190
5160
  },
5191
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles42.header }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles42.name, { color: colors.foreground }], allowFontScaling: true }, name), badge ? /* @__PURE__ */ React25__default.default.createElement(Badge, { label: badge, variant: highlighted ? "default" : "secondary", size: "sm" }) : null),
5192
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles42.priceRow }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles42.price, { color: colors.foreground }], allowFontScaling: true }, price), period ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles42.period, { color: colors.foregroundMuted }], allowFontScaling: true }, period) : null),
5193
- description ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles42.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null,
5194
- features.length > 0 ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles42.features }, features.map(normalize).map((f, i) => /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { key: i, style: styles42.featureRow }, renderIcon(
5161
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles42.header }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles42.name, { color: colors.foreground }], allowFontScaling: true }, name), badge ? /* @__PURE__ */ React54__default.default.createElement(Badge, { label: badge, variant: highlighted ? "default" : "secondary", size: "sm" }) : null),
5162
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles42.priceRow }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles42.price, { color: colors.foreground }], allowFontScaling: true }, price), period ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles42.period, { color: colors.foregroundMuted }], allowFontScaling: true }, period) : null),
5163
+ description ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles42.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null,
5164
+ features.length > 0 ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles42.features }, features.map(normalize).map((f, i) => /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { key: i, style: styles42.featureRow }, renderIcon(
5195
5165
  f.included ? "check" : "minus",
5196
5166
  ms(16),
5197
5167
  f.included ? colors.success : colors.foregroundMuted
5198
- ), /* @__PURE__ */ React25__default.default.createElement(
5168
+ ), /* @__PURE__ */ React54__default.default.createElement(
5199
5169
  reactNative.Text,
5200
5170
  {
5201
5171
  style: [
@@ -5207,7 +5177,7 @@ function PricingCard({
5207
5177
  },
5208
5178
  f.label
5209
5179
  )))) : null,
5210
- ctaLabel ? /* @__PURE__ */ React25__default.default.createElement(
5180
+ ctaLabel ? /* @__PURE__ */ React54__default.default.createElement(
5211
5181
  Button,
5212
5182
  {
5213
5183
  label: ctaLabel,
@@ -5217,7 +5187,7 @@ function PricingCard({
5217
5187
  style: styles42.cta
5218
5188
  }
5219
5189
  ) : null,
5220
- footnote ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles42.footnote, { color: colors.foregroundMuted }], allowFontScaling: true }, footnote) : null
5190
+ footnote ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles42.footnote, { color: colors.foregroundMuted }], allowFontScaling: true }, footnote) : null
5221
5191
  );
5222
5192
  }
5223
5193
  var styles42 = reactNative.StyleSheet.create({
@@ -5299,7 +5269,7 @@ function TabBar({
5299
5269
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
5300
5270
  const resolvedActive = activeColor ?? colors.primary;
5301
5271
  const resolvedInactive = inactiveColor ?? colors.foregroundMuted;
5302
- return /* @__PURE__ */ React25__default.default.createElement(
5272
+ return /* @__PURE__ */ React54__default.default.createElement(
5303
5273
  reactNative.View,
5304
5274
  {
5305
5275
  style: [
@@ -5319,7 +5289,7 @@ function TabBar({
5319
5289
  const iconNode = item.icon ?? (item.iconName ? renderIcon(item.iconName, ms(24), tint) : null);
5320
5290
  const showBadge = item.badge !== void 0 && item.badge !== false;
5321
5291
  const badgeCount = typeof item.badge === "number" ? item.badge : void 0;
5322
- return /* @__PURE__ */ React25__default.default.createElement(
5292
+ return /* @__PURE__ */ React54__default.default.createElement(
5323
5293
  reactNative.TouchableOpacity,
5324
5294
  {
5325
5295
  key: item.key,
@@ -5334,7 +5304,7 @@ function TabBar({
5334
5304
  accessibilityState: { selected: active },
5335
5305
  accessibilityLabel: item.label ?? item.key
5336
5306
  },
5337
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, null, iconNode, showBadge ? /* @__PURE__ */ React25__default.default.createElement(
5307
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, null, iconNode, showBadge ? /* @__PURE__ */ React54__default.default.createElement(
5338
5308
  reactNative.View,
5339
5309
  {
5340
5310
  style: [
@@ -5343,9 +5313,9 @@ function TabBar({
5343
5313
  badgeCount === void 0 && styles43.badgeDot
5344
5314
  ]
5345
5315
  },
5346
- badgeCount !== void 0 ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles43.badgeText, { color: colors.destructiveForeground }], allowFontScaling: false }, badgeCount > 99 ? "99+" : badgeCount) : null
5316
+ badgeCount !== void 0 ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles43.badgeText, { color: colors.destructiveForeground }], allowFontScaling: false }, badgeCount > 99 ? "99+" : badgeCount) : null
5347
5317
  ) : null),
5348
- item.label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles43.label, { color: tint }], numberOfLines: 1, allowFontScaling: true }, item.label) : null
5318
+ item.label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles43.label, { color: tint }], numberOfLines: 1, allowFontScaling: true }, item.label) : null
5349
5319
  );
5350
5320
  })
5351
5321
  );
@@ -5404,7 +5374,7 @@ function ZoomableImage({ source, width, height, onZoomChange }) {
5404
5374
  const translateY = Animated12.useSharedValue(0);
5405
5375
  const savedX = Animated12.useSharedValue(0);
5406
5376
  const savedY = Animated12.useSharedValue(0);
5407
- const reportZoom = React25.useCallback((zoomed) => onZoomChange(zoomed), [onZoomChange]);
5377
+ const reportZoom = React54.useCallback((zoomed) => onZoomChange(zoomed), [onZoomChange]);
5408
5378
  const reset = () => {
5409
5379
  "worklet";
5410
5380
  scale2.value = Animated12.withTiming(1);
@@ -5450,17 +5420,17 @@ function ZoomableImage({ source, width, height, onZoomChange }) {
5450
5420
  { scale: scale2.value }
5451
5421
  ]
5452
5422
  }));
5453
- return /* @__PURE__ */ React25__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: composed }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [{ width, height }, styles44.imageWrap], collapsable: false }, /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [{ width, height }, animatedStyle] }, /* @__PURE__ */ React25__default.default.createElement(reactNative.Image, { source, style: { width, height }, resizeMode: "contain" }))));
5423
+ return /* @__PURE__ */ React54__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: composed }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [{ width, height }, styles44.imageWrap], collapsable: false }, /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [{ width, height }, animatedStyle] }, /* @__PURE__ */ React54__default.default.createElement(reactNative.Image, { source, style: { width, height }, resizeMode: "contain" }))));
5454
5424
  }
5455
5425
  function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
5456
5426
  const window = reactNative.useWindowDimensions();
5457
5427
  const width = window.width > 0 ? window.width : reactNative.Dimensions.get("window").width;
5458
5428
  const height = window.height > 0 ? window.height : reactNative.Dimensions.get("window").height;
5459
5429
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
5460
- const [index, setIndex] = React25.useState(initialIndex);
5461
- const [pagingEnabled, setPagingEnabled] = React25.useState(true);
5462
- const scrollRef = React25__default.default.useRef(null);
5463
- React25__default.default.useEffect(() => {
5430
+ const [index, setIndex] = React54.useState(initialIndex);
5431
+ const [pagingEnabled, setPagingEnabled] = React54.useState(true);
5432
+ const scrollRef = React54__default.default.useRef(null);
5433
+ React54__default.default.useEffect(() => {
5464
5434
  if (!visible) return;
5465
5435
  const handle = requestAnimationFrame(() => {
5466
5436
  setIndex(initialIndex);
@@ -5471,7 +5441,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
5471
5441
  }, [visible, initialIndex, width]);
5472
5442
  const dragY = Animated12.useSharedValue(0);
5473
5443
  const DISMISS_THRESHOLD = height * 0.18;
5474
- const closeViewer = React25.useCallback(() => onClose(), [onClose]);
5444
+ const closeViewer = React54.useCallback(() => onClose(), [onClose]);
5475
5445
  const swipeDown = reactNativeGestureHandler.Gesture.Pan().enabled(pagingEnabled).activeOffsetY(12).failOffsetX([-16, 16]).onUpdate((e) => {
5476
5446
  dragY.value = Math.max(0, e.translationY);
5477
5447
  }).onEnd((e) => {
@@ -5481,7 +5451,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
5481
5451
  dragY.value = Animated12.withTiming(0);
5482
5452
  }
5483
5453
  });
5484
- React25__default.default.useEffect(() => {
5454
+ React54__default.default.useEffect(() => {
5485
5455
  if (visible) dragY.value = 0;
5486
5456
  }, [visible, dragY]);
5487
5457
  const dismissStyle = Animated12.useAnimatedStyle(() => ({
@@ -5498,7 +5468,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
5498
5468
  scrollRef.current?.scrollTo({ x: page * width, animated: true });
5499
5469
  setIndex(page);
5500
5470
  };
5501
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.Modal, { visible, transparent: false, animationType: "fade", onRequestClose: onClose, statusBarTranslucent: true }, /* @__PURE__ */ React25__default.default.createElement(reactNativeGestureHandler.GestureHandlerRootView, { style: styles44.root }, /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [styles44.backdrop, backdropStyle], pointerEvents: "none" }), /* @__PURE__ */ React25__default.default.createElement(Animated12__default.default.View, { style: [styles44.container, dismissStyle] }, /* @__PURE__ */ React25__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: swipeDown }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles44.root, collapsable: false }, /* @__PURE__ */ React25__default.default.createElement(
5471
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.Modal, { visible, transparent: false, animationType: "fade", onRequestClose: onClose, statusBarTranslucent: true }, /* @__PURE__ */ React54__default.default.createElement(reactNativeGestureHandler.GestureHandlerRootView, { style: styles44.root }, /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [styles44.backdrop, backdropStyle], pointerEvents: "none" }), /* @__PURE__ */ React54__default.default.createElement(Animated12__default.default.View, { style: [styles44.container, dismissStyle] }, /* @__PURE__ */ React54__default.default.createElement(reactNativeGestureHandler.GestureDetector, { gesture: swipeDown }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles44.root, collapsable: false }, /* @__PURE__ */ React54__default.default.createElement(
5502
5472
  reactNative.ScrollView,
5503
5473
  {
5504
5474
  ref: scrollRef,
@@ -5509,7 +5479,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
5509
5479
  onMomentumScrollEnd: onMomentumEnd,
5510
5480
  bounces: false
5511
5481
  },
5512
- images.map((source, i) => /* @__PURE__ */ React25__default.default.createElement(
5482
+ images.map((source, i) => /* @__PURE__ */ React54__default.default.createElement(
5513
5483
  ZoomableImage,
5514
5484
  {
5515
5485
  key: i,
@@ -5519,7 +5489,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
5519
5489
  onZoomChange: (zoomed) => setPagingEnabled(!zoomed)
5520
5490
  }
5521
5491
  ))
5522
- ))), /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles44.closeButtonWrapper, { top: insets.top + vs(8) }] }, /* @__PURE__ */ React25__default.default.createElement(
5492
+ ))), /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles44.closeButtonWrapper, { top: insets.top + vs(8) }] }, /* @__PURE__ */ React54__default.default.createElement(
5523
5493
  IconButton,
5524
5494
  {
5525
5495
  iconName: "x",
@@ -5530,7 +5500,7 @@ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
5530
5500
  onPress: onClose,
5531
5501
  accessibilityLabel: "Close"
5532
5502
  }
5533
- )), images.length > 1 ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles44.dots, { bottom: insets.bottom + vs(16) }], pointerEvents: "box-none" }, /* @__PURE__ */ React25__default.default.createElement(
5503
+ )), images.length > 1 ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles44.dots, { bottom: insets.bottom + vs(16) }], pointerEvents: "box-none" }, /* @__PURE__ */ React54__default.default.createElement(
5534
5504
  PagerDots,
5535
5505
  {
5536
5506
  count: images.length,
@@ -5580,7 +5550,7 @@ function SheetSelectChip({
5580
5550
  };
5581
5551
  const iconColor = selected ? colors.primaryForeground : colors.foreground;
5582
5552
  const resolvedIcon = option.iconName ? renderIcon(option.iconName, ms(13), iconColor) : null;
5583
- return /* @__PURE__ */ React25__default.default.createElement(
5553
+ return /* @__PURE__ */ React54__default.default.createElement(
5584
5554
  PressableChip,
5585
5555
  {
5586
5556
  onPress: option.disabled ? void 0 : handlePress,
@@ -5590,7 +5560,7 @@ function SheetSelectChip({
5590
5560
  accessibilityLabel: option.disabled ? `${option.label}, unavailable` : option.label,
5591
5561
  accessibilityState: { selected, disabled: option.disabled }
5592
5562
  },
5593
- /* @__PURE__ */ React25__default.default.createElement(
5563
+ /* @__PURE__ */ React54__default.default.createElement(
5594
5564
  reactNativeEase.EaseView,
5595
5565
  {
5596
5566
  style: [styles45.chip, option.disabled && styles45.chipDisabled],
@@ -5600,8 +5570,8 @@ function SheetSelectChip({
5600
5570
  },
5601
5571
  transition: COLOR_TRANSITION
5602
5572
  },
5603
- resolvedIcon ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles45.chipIcon }, resolvedIcon) : null,
5604
- /* @__PURE__ */ React25__default.default.createElement(
5573
+ resolvedIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles45.chipIcon }, resolvedIcon) : null,
5574
+ /* @__PURE__ */ React54__default.default.createElement(
5605
5575
  reactNative.Text,
5606
5576
  {
5607
5577
  style: [styles45.chipLabel, { color: selected ? colors.primaryForeground : colors.foreground }],
@@ -5638,7 +5608,7 @@ function SheetSelect({
5638
5608
  const newArray = alreadySelected ? currentArray.filter((v) => v !== optionValue) : [...currentArray, optionValue];
5639
5609
  onValueChange?.(newArray);
5640
5610
  };
5641
- const chips = options.map((opt) => /* @__PURE__ */ React25__default.default.createElement(
5611
+ const chips = options.map((opt) => /* @__PURE__ */ React54__default.default.createElement(
5642
5612
  SheetSelectChip,
5643
5613
  {
5644
5614
  key: opt.value,
@@ -5647,7 +5617,7 @@ function SheetSelect({
5647
5617
  onPress: () => handlePress(opt.value)
5648
5618
  }
5649
5619
  ));
5650
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles45.container, style], accessibilityLabel }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles45.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, wrap ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles45.wrapContainer }, chips) : /* @__PURE__ */ React25__default.default.createElement(
5620
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles45.container, style], accessibilityLabel }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles45.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, wrap ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles45.wrapContainer }, chips) : /* @__PURE__ */ React54__default.default.createElement(
5651
5621
  reactNative.ScrollView,
5652
5622
  {
5653
5623
  horizontal: true,
@@ -5655,7 +5625,7 @@ function SheetSelect({
5655
5625
  contentContainerStyle: styles45.scrollContent
5656
5626
  },
5657
5627
  chips
5658
- ), error ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles45.error, { color: colors.destructive }], allowFontScaling: true, accessibilityLiveRegion: "polite" }, error) : null);
5628
+ ), error ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles45.error, { color: colors.destructive }], allowFontScaling: true, accessibilityLiveRegion: "polite" }, error) : null);
5659
5629
  }
5660
5630
  var styles45 = reactNative.StyleSheet.create({
5661
5631
  container: {
@@ -5758,7 +5728,7 @@ function ImageUpload({
5758
5728
  backgroundColor: value ? "transparent" : colors.surface,
5759
5729
  overflow: "hidden"
5760
5730
  };
5761
- return /* @__PURE__ */ React25__default.default.createElement(
5731
+ return /* @__PURE__ */ React54__default.default.createElement(
5762
5732
  PressableCard,
5763
5733
  {
5764
5734
  onPress: handlePress,
@@ -5770,14 +5740,14 @@ function ImageUpload({
5770
5740
  accessibilityState: { disabled: disabled || loading },
5771
5741
  style: [containerStyle, style]
5772
5742
  },
5773
- value ? /* @__PURE__ */ React25__default.default.createElement(
5743
+ value ? /* @__PURE__ */ React54__default.default.createElement(
5774
5744
  reactNative.Image,
5775
5745
  {
5776
5746
  source: { uri: value },
5777
5747
  style: [reactNative.StyleSheet.absoluteFillObject, { borderRadius }],
5778
5748
  resizeMode
5779
5749
  }
5780
- ) : /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles46.placeholder }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "image", size: ms(28), color: colors.foregroundMuted }), showPlaceholderText ? /* @__PURE__ */ React25__default.default.createElement(
5750
+ ) : /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles46.placeholder }, /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Feather, { name: "image", size: ms(28), color: colors.foregroundMuted }), showPlaceholderText ? /* @__PURE__ */ React54__default.default.createElement(
5781
5751
  reactNative.Text,
5782
5752
  {
5783
5753
  style: [styles46.placeholderText, { color: colors.foregroundMuted }],
@@ -5786,8 +5756,8 @@ function ImageUpload({
5786
5756
  },
5787
5757
  placeholder
5788
5758
  ) : null),
5789
- loading ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles46.loadingOverlay, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React25__default.default.createElement(Spinner, { size: "md" })) : null,
5790
- value && !loading ? /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles46.editBadge, pointerEvents: "none" }, /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles46.editBadgeInner, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React25__default.default.createElement(vectorIcons.Feather, { name: "edit-2", size: ms(12), color: "#fff" }))) : null
5759
+ loading ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles46.loadingOverlay, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React54__default.default.createElement(Spinner, { size: "md" })) : null,
5760
+ value && !loading ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles46.editBadge, pointerEvents: "none" }, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles46.editBadgeInner, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React54__default.default.createElement(vectorIcons.Feather, { name: "edit-2", size: ms(12), color: "#fff" }))) : null
5791
5761
  );
5792
5762
  }
5793
5763
  var styles46 = reactNative.StyleSheet.create({
@@ -5823,6 +5793,7 @@ var styles46 = reactNative.StyleSheet.create({
5823
5793
 
5824
5794
  // src/utils/curatedIcons.ts
5825
5795
  var CURATED_ICONS = [
5796
+ // ─── Food ────────────────────────────────────────────────────────────────────
5826
5797
  {
5827
5798
  name: "food",
5828
5799
  label: "Food",
@@ -5830,97 +5801,178 @@ var CURATED_ICONS = [
5830
5801
  categoryIcon: "coffee",
5831
5802
  icons: [
5832
5803
  // Bebidas
5804
+ "beer-outline",
5805
+ "wine-outline",
5806
+ "cafe-outline",
5807
+ "water-outline",
5833
5808
  "coffee",
5834
- "wine-glass",
5835
- "beer",
5836
- "cocktail",
5837
- "mug-hot",
5838
- "glass-cheers",
5839
- "wine",
5840
- // Comidas
5841
- "restaurant",
5842
- "hamburger",
5843
- "pizza-slice",
5844
- "ice-cream",
5845
- "cake",
5846
- "egg",
5847
- "fish",
5848
- "bread-slice",
5849
- "cookie",
5850
- "cheese",
5851
- "carrot",
5852
- "hotdog",
5853
- // Cocina / utilidades
5854
- "utensils",
5809
+ // Comida
5810
+ "pizza-outline",
5811
+ "fast-food-outline",
5812
+ "fish-outline",
5813
+ "ice-cream-outline",
5814
+ "egg-outline",
5815
+ "nutrition-outline",
5816
+ // Servicio y operación
5817
+ "restaurant-outline",
5818
+ "server-outline",
5819
+ "menu-outline",
5820
+ "basket-outline",
5821
+ "receipt-outline",
5822
+ "pricetag-outline",
5823
+ "pricetags-outline",
5824
+ "reorder-four-outline",
5825
+ "reorder-three-outline",
5826
+ "cart-outline",
5827
+ "cash-outline",
5828
+ "wallet-outline",
5829
+ "storefront-outline",
5855
5830
  // Delivery / pedidos
5831
+ "truck",
5832
+ "package",
5856
5833
  "shopping-bag",
5834
+ "shopping-cart",
5835
+ // Ubicación y reserva
5836
+ "map-pin",
5837
+ "home",
5838
+ "calendar",
5857
5839
  "clock",
5840
+ // Experiencia
5858
5841
  "star",
5859
5842
  "heart",
5860
- "map-pin",
5861
- "phone"
5843
+ "bookmark",
5844
+ "thumbs-up",
5845
+ "check",
5846
+ "gift"
5862
5847
  ]
5863
5848
  },
5849
+ // ─── Sports ──────────────────────────────────────────────────────────────────
5864
5850
  {
5865
5851
  name: "sports",
5866
5852
  label: "Sports",
5867
5853
  labelEs: "Deportes",
5868
- categoryIcon: "activity",
5854
+ categoryIcon: "trophy-outline",
5869
5855
  icons: [
5870
- // Deportes específicos
5871
- "futbol",
5872
- "dumbbell",
5873
- "running",
5874
- "bicycle",
5875
- "heartbeat",
5876
- "fitness-center",
5877
- // Competencia / logros
5878
- "target",
5856
+ // Deportes
5857
+ "american-football-outline",
5858
+ "baseball-outline",
5859
+ "basketball-outline",
5860
+ "bicycle-outline",
5861
+ "football-outline",
5862
+ "tennisball-outline",
5863
+ "golf-outline",
5864
+ "fitness-outline",
5865
+ "car-sport-outline",
5866
+ "game-controller-outline",
5867
+ // Competición y logros
5868
+ "trophy-outline",
5869
+ "medal-outline",
5879
5870
  "award",
5871
+ "target",
5880
5872
  "flag",
5881
- "star",
5873
+ "crosshair",
5874
+ // Outdoor
5875
+ "compass-outline",
5876
+ "map-outline",
5877
+ "trail-sign-outline",
5878
+ "bonfire-outline",
5879
+ "snow-outline",
5880
+ "flame-outline",
5881
+ "sun",
5882
+ "droplet",
5883
+ "wind",
5884
+ "map",
5885
+ "map-pin",
5886
+ "navigation",
5887
+ "navigation-2",
5888
+ // Rendimiento y métricas
5889
+ "stats-chart-outline",
5890
+ "trending-up-outline",
5891
+ "trending-down-outline",
5892
+ "bar-chart-outline",
5893
+ "pie-chart-outline",
5894
+ "analytics-outline",
5895
+ "activity",
5882
5896
  "zap",
5883
- // Bienestar
5884
- "heart",
5897
+ "watch",
5898
+ "trending-up",
5899
+ "trending-down",
5900
+ "bar-chart-2",
5885
5901
  "clock",
5886
- "activity",
5887
- "sun",
5888
- "user",
5889
- "users"
5902
+ "calendar"
5890
5903
  ]
5891
5904
  },
5905
+ // ─── Business ────────────────────────────────────────────────────────────────
5892
5906
  {
5893
5907
  name: "business",
5894
5908
  label: "Business",
5895
5909
  labelEs: "Negocios",
5896
5910
  categoryIcon: "briefcase",
5897
5911
  icons: [
5912
+ // Empresa
5913
+ "briefcase",
5914
+ "users",
5915
+ "user",
5916
+ "user-plus",
5917
+ "user-check",
5918
+ "user-x",
5919
+ "briefcase-outline",
5920
+ "business-outline",
5921
+ "id-card-outline",
5922
+ // Comercio y operación
5898
5923
  "shopping-cart",
5899
5924
  "shopping-bag",
5900
5925
  "credit-card",
5901
5926
  "dollar-sign",
5902
5927
  "percent",
5903
- "briefcase",
5928
+ "tag",
5929
+ "gift",
5930
+ "cart-outline",
5931
+ "cash-outline",
5932
+ "wallet-outline",
5933
+ "storefront-outline",
5934
+ "pricetag-outline",
5935
+ "pricetags-outline",
5936
+ "receipt-outline",
5937
+ "card-outline",
5938
+ // Logística
5904
5939
  "truck",
5905
5940
  "package",
5906
- "gift",
5941
+ // Documentos
5942
+ "file",
5943
+ "file-text",
5944
+ "file-plus",
5945
+ "folder",
5946
+ "paperclip",
5947
+ "document-outline",
5948
+ "document-text-outline",
5949
+ "documents-outline",
5950
+ "folder-outline",
5951
+ // Comunicación de negocio
5952
+ "mail",
5953
+ "phone",
5954
+ "phone-call",
5955
+ "send",
5956
+ "message-square",
5957
+ "mail-outline",
5958
+ // Análisis
5907
5959
  "bar-chart",
5908
5960
  "bar-chart-2",
5909
5961
  "pie-chart",
5910
5962
  "trending-up",
5911
5963
  "trending-down",
5912
5964
  "activity",
5913
- "tag",
5914
- "bookmark",
5915
- "pocket"
5965
+ "globe"
5916
5966
  ]
5917
5967
  },
5968
+ // ─── Objects ─────────────────────────────────────────────────────────────────
5918
5969
  {
5919
5970
  name: "objects",
5920
5971
  label: "Objects",
5921
5972
  labelEs: "Objetos",
5922
- categoryIcon: "folder",
5973
+ categoryIcon: "package",
5923
5974
  icons: [
5975
+ // Archivos y carpetas
5924
5976
  "file",
5925
5977
  "file-text",
5926
5978
  "file-plus",
@@ -5928,108 +5980,193 @@ var CURATED_ICONS = [
5928
5980
  "folder",
5929
5981
  "folder-plus",
5930
5982
  "folder-minus",
5983
+ "archive",
5984
+ "save",
5985
+ "paperclip",
5986
+ "document-outline",
5987
+ "document-text-outline",
5988
+ "documents-outline",
5989
+ "folder-outline",
5990
+ "folder-open-outline",
5991
+ "file-tray-outline",
5992
+ "file-tray-full-outline",
5993
+ "file-tray-stacked-outline",
5994
+ "archive-outline",
5995
+ "save-outline",
5996
+ // Seguridad
5931
5997
  "lock",
5932
5998
  "unlock",
5933
5999
  "key",
5934
6000
  "shield",
5935
6001
  "shield-off",
5936
- "settings",
5937
- "sliders",
5938
- "toggle-left",
5939
- "toggle-right",
5940
- "tool",
5941
- "printer",
5942
- "database",
6002
+ "lock-closed-outline",
6003
+ "lock-open-outline",
6004
+ "key-outline",
6005
+ "shield-outline",
6006
+ "shield-checkmark-outline",
6007
+ // Dispositivos
6008
+ "monitor",
6009
+ "tablet",
6010
+ "smartphone",
6011
+ "tv",
5943
6012
  "server",
6013
+ "database",
5944
6014
  "hard-drive",
5945
6015
  "cpu",
5946
- "paperclip",
5947
- "aperture",
5948
- "box",
5949
- "radio"
6016
+ "radio",
6017
+ "laptop-outline",
6018
+ "phone-portrait-outline",
6019
+ "phone-landscape-outline",
6020
+ "tablet-landscape-outline",
6021
+ "tablet-portrait-outline",
6022
+ "tv-outline",
6023
+ "server-outline",
6024
+ "hardware-chip-outline",
6025
+ "watch-outline"
5950
6026
  ]
5951
6027
  },
6028
+ // ─── Status ──────────────────────────────────────────────────────────────────
5952
6029
  {
5953
6030
  name: "status",
5954
6031
  label: "Status",
5955
6032
  labelEs: "Estado",
5956
6033
  categoryIcon: "alert-circle",
5957
6034
  icons: [
6035
+ // Alertas
5958
6036
  "alert-circle",
5959
6037
  "alert-triangle",
5960
6038
  "alert-octagon",
5961
6039
  "info",
5962
6040
  "help-circle",
6041
+ "alert-circle-outline",
6042
+ "alert-outline",
6043
+ "information-circle-outline",
6044
+ "help-circle-outline",
6045
+ // Notificaciones
5963
6046
  "bell",
5964
6047
  "bell-off",
6048
+ "notifications-outline",
6049
+ "notifications-off-outline",
6050
+ "notifications-circle-outline",
6051
+ // Visibilidad
5965
6052
  "eye",
5966
6053
  "eye-off",
6054
+ "eye-outline",
6055
+ "eye-off-outline",
6056
+ // Indicadores
5967
6057
  "flag",
5968
6058
  "zap",
5969
6059
  "zap-off",
5970
6060
  "loader",
5971
- "clock",
5972
- "watch"
6061
+ "activity",
6062
+ "flash-outline",
6063
+ "bulb-outline",
6064
+ // Éxito / error / advertencia
6065
+ "check",
6066
+ "check-circle",
6067
+ "x",
6068
+ "x-circle",
6069
+ "x-octagon",
6070
+ "slash",
6071
+ "plus-circle",
6072
+ "minus-circle",
6073
+ "checkmark-circle-outline",
6074
+ "checkmark-done-circle-outline",
6075
+ "close-circle-outline",
6076
+ "add-circle-outline",
6077
+ "remove-circle-outline",
6078
+ // Estados de proceso
6079
+ "play-circle",
6080
+ "pause-circle",
6081
+ "stop-circle",
6082
+ "play-circle-outline",
6083
+ "pause-circle-outline",
6084
+ "stop-circle-outline"
5973
6085
  ]
5974
6086
  },
6087
+ // ─── Actions ─────────────────────────────────────────────────────────────────
5975
6088
  {
5976
6089
  name: "actions",
5977
6090
  label: "Actions",
5978
6091
  labelEs: "Acciones",
5979
6092
  categoryIcon: "edit-3",
5980
6093
  icons: [
6094
+ // Crear / añadir
5981
6095
  "plus",
5982
6096
  "plus-circle",
5983
6097
  "plus-square",
6098
+ "add-outline",
6099
+ "add-circle-outline",
6100
+ // Eliminar / quitar
5984
6101
  "minus",
5985
6102
  "minus-circle",
5986
6103
  "minus-square",
6104
+ "trash",
6105
+ "trash-2",
5987
6106
  "x",
5988
6107
  "x-circle",
5989
6108
  "x-square",
5990
6109
  "x-octagon",
6110
+ "slash",
6111
+ "trash-outline",
6112
+ "trash-bin-outline",
6113
+ "remove-outline",
6114
+ "remove-circle-outline",
6115
+ "close-circle-outline",
6116
+ "backspace-outline",
6117
+ "cut-outline",
6118
+ // Confirmar
5991
6119
  "check",
5992
6120
  "check-circle",
5993
6121
  "check-square",
6122
+ "checkmark-circle-outline",
6123
+ // Editar
5994
6124
  "edit",
5995
6125
  "edit-2",
5996
6126
  "edit-3",
5997
- "trash",
5998
- "trash-2",
5999
6127
  "copy",
6000
6128
  "clipboard",
6001
6129
  "scissors",
6130
+ "create-outline",
6131
+ "pencil-outline",
6132
+ "duplicate-outline",
6133
+ "copy-outline",
6134
+ "clipboard-outline",
6135
+ // Mover datos
6002
6136
  "download",
6003
6137
  "download-cloud",
6004
6138
  "upload",
6005
6139
  "upload-cloud",
6006
- "share",
6007
- "share-2",
6008
- "link",
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"
6140
+ "download-outline",
6141
+ "cloud-download-outline",
6142
+ "cloud-upload-outline"
6021
6143
  ]
6022
6144
  },
6145
+ // ─── Communication ───────────────────────────────────────────────────────────
6023
6146
  {
6024
6147
  name: "communication",
6025
6148
  label: "Communication",
6026
6149
  labelEs: "Comunicaci\xF3n",
6027
6150
  categoryIcon: "message-circle",
6028
6151
  icons: [
6029
- "mail",
6152
+ // Mensajería
6030
6153
  "message-circle",
6031
6154
  "message-square",
6032
6155
  "send",
6156
+ "mail",
6157
+ "inbox",
6158
+ "at-sign",
6159
+ "mail-outline",
6160
+ "mail-open-outline",
6161
+ "mail-unread-outline",
6162
+ "chatbubble-outline",
6163
+ "chatbubble-ellipses-outline",
6164
+ "chatbubbles-outline",
6165
+ "send-outline",
6166
+ "attach-outline",
6167
+ "at-outline",
6168
+ "at-circle-outline",
6169
+ // Llamadas
6033
6170
  "phone",
6034
6171
  "phone-call",
6035
6172
  "phone-incoming",
@@ -6037,30 +6174,45 @@ var CURATED_ICONS = [
6037
6174
  "phone-missed",
6038
6175
  "phone-off",
6039
6176
  "phone-forwarded",
6040
- "at-sign",
6041
- "inbox",
6177
+ "voicemail",
6178
+ "call-outline",
6179
+ "phone-portrait-outline",
6180
+ "phone-landscape-outline",
6181
+ // Personas
6042
6182
  "user",
6043
6183
  "user-plus",
6044
6184
  "user-minus",
6045
6185
  "user-check",
6046
6186
  "user-x",
6047
6187
  "users",
6188
+ "person-outline",
6189
+ "person-circle-outline",
6190
+ "person-add-outline",
6191
+ "person-remove-outline",
6192
+ "people-outline",
6193
+ "people-circle-outline",
6194
+ // Reacciones
6048
6195
  "smile",
6049
6196
  "frown",
6050
6197
  "meh",
6051
6198
  "heart",
6052
6199
  "thumbs-up",
6053
6200
  "thumbs-down",
6054
- "star",
6055
- "award"
6201
+ "happy-outline",
6202
+ "sad-outline",
6203
+ "heart-outline",
6204
+ "thumbs-up-outline",
6205
+ "thumbs-down-outline"
6056
6206
  ]
6057
6207
  },
6208
+ // ─── Navigation ──────────────────────────────────────────────────────────────
6058
6209
  {
6059
6210
  name: "navigation",
6060
6211
  label: "Navigation",
6061
6212
  labelEs: "Navegaci\xF3n",
6062
6213
  categoryIcon: "compass",
6063
6214
  icons: [
6215
+ // Flechas cardinales
6064
6216
  "arrow-up",
6065
6217
  "arrow-down",
6066
6218
  "arrow-left",
@@ -6069,6 +6221,13 @@ var CURATED_ICONS = [
6069
6221
  "arrow-up-right",
6070
6222
  "arrow-down-left",
6071
6223
  "arrow-down-right",
6224
+ "arrow-up-outline",
6225
+ "arrow-down-outline",
6226
+ "arrow-back-outline",
6227
+ "arrow-forward-outline",
6228
+ "arrow-undo-outline",
6229
+ "arrow-redo-outline",
6230
+ // Chevrones
6072
6231
  "chevron-up",
6073
6232
  "chevron-down",
6074
6233
  "chevron-left",
@@ -6077,6 +6236,13 @@ var CURATED_ICONS = [
6077
6236
  "chevrons-down",
6078
6237
  "chevrons-left",
6079
6238
  "chevrons-right",
6239
+ "chevron-up-outline",
6240
+ "chevron-down-outline",
6241
+ "chevron-back-outline",
6242
+ "chevron-forward-outline",
6243
+ "chevron-collapse-outline",
6244
+ "chevron-expand-outline",
6245
+ // Esquinas
6080
6246
  "corner-up-left",
6081
6247
  "corner-up-right",
6082
6248
  "corner-down-left",
@@ -6085,10 +6251,14 @@ var CURATED_ICONS = [
6085
6251
  "corner-left-down",
6086
6252
  "corner-right-up",
6087
6253
  "corner-right-down",
6254
+ // Giro / refrescar
6088
6255
  "refresh-cw",
6089
6256
  "refresh-ccw",
6090
6257
  "rotate-cw",
6091
6258
  "rotate-ccw",
6259
+ "refresh-outline",
6260
+ "reload-outline",
6261
+ // Orientación y mapa
6092
6262
  "navigation",
6093
6263
  "navigation-2",
6094
6264
  "compass",
@@ -6097,119 +6267,248 @@ var CURATED_ICONS = [
6097
6267
  "target",
6098
6268
  "crosshair",
6099
6269
  "home",
6100
- "maximize",
6101
- "maximize-2",
6102
- "minimize",
6103
- "minimize-2",
6104
- "external-link",
6105
- "move",
6106
- "anchor"
6270
+ "anchor",
6271
+ "compass-outline",
6272
+ "map-outline",
6273
+ "location-outline",
6274
+ "navigate-outline",
6275
+ "pin-outline",
6276
+ "home-outline"
6107
6277
  ]
6108
6278
  },
6279
+ // ─── Media ───────────────────────────────────────────────────────────────────
6109
6280
  {
6110
6281
  name: "media",
6111
6282
  label: "Media",
6112
6283
  labelEs: "Medios",
6113
6284
  categoryIcon: "image",
6114
6285
  icons: [
6286
+ // Visual
6115
6287
  "image",
6116
6288
  "film",
6117
6289
  "video",
6118
6290
  "video-off",
6291
+ "camera",
6292
+ "camera-off",
6293
+ "image-outline",
6294
+ "images-outline",
6295
+ "film-outline",
6296
+ "videocam-outline",
6297
+ "videocam-off-outline",
6298
+ "camera-outline",
6299
+ "camera-reverse-outline",
6300
+ // Reproducción
6119
6301
  "play",
6120
6302
  "play-circle",
6121
6303
  "pause",
6122
6304
  "pause-circle",
6123
6305
  "square",
6124
6306
  "stop-circle",
6307
+ "fast-forward",
6308
+ "rewind",
6309
+ "skip-forward",
6310
+ "skip-back",
6311
+ "repeat",
6312
+ "shuffle",
6313
+ "play-outline",
6314
+ "pause-outline",
6315
+ "play-circle-outline",
6316
+ "pause-circle-outline",
6317
+ "stop-circle-outline",
6318
+ "play-back-outline",
6319
+ "play-forward-outline",
6320
+ "play-skip-back-outline",
6321
+ "play-skip-forward-outline",
6322
+ "repeat-outline",
6323
+ "shuffle-outline",
6324
+ // Audio
6125
6325
  "music",
6126
6326
  "headphones",
6127
6327
  "speaker",
6128
- "camera",
6129
- "camera-off",
6130
- "mic",
6131
- "mic-off",
6132
6328
  "volume",
6133
6329
  "volume-1",
6134
6330
  "volume-2",
6135
6331
  "volume-x",
6136
- "fast-forward",
6137
- "rewind",
6138
- "skip-forward",
6139
- "skip-back",
6140
- "repeat",
6141
- "shuffle",
6142
- "disc"
6332
+ "mic",
6333
+ "mic-off",
6334
+ "mic-outline",
6335
+ "mic-off-outline",
6336
+ "mic-circle-outline",
6337
+ "musical-note-outline",
6338
+ "musical-notes-outline",
6339
+ "volume-high-outline",
6340
+ "volume-low-outline",
6341
+ "volume-medium-outline",
6342
+ "volume-mute-outline",
6343
+ "volume-off-outline"
6143
6344
  ]
6144
6345
  },
6346
+ // ─── Layout ──────────────────────────────────────────────────────────────────
6145
6347
  {
6146
6348
  name: "layout",
6147
6349
  label: "Layout",
6148
6350
  labelEs: "Dise\xF1o",
6149
6351
  categoryIcon: "grid",
6150
6352
  icons: [
6151
- "menu",
6152
- "more-horizontal",
6153
- "more-vertical",
6353
+ // Estructura
6154
6354
  "grid",
6155
6355
  "columns",
6156
6356
  "sidebar",
6157
6357
  "layout",
6158
6358
  "list",
6359
+ "menu",
6360
+ "table",
6361
+ "trello",
6362
+ "grid-outline",
6363
+ "list-outline",
6364
+ "menu-outline",
6365
+ "layers-outline",
6366
+ // Alineación
6159
6367
  "align-left",
6160
6368
  "align-center",
6161
6369
  "align-right",
6162
6370
  "align-justify",
6371
+ // Tipografía
6163
6372
  "bold",
6164
6373
  "italic",
6165
6374
  "underline",
6166
6375
  "type",
6167
- "filter",
6168
- "crop",
6169
- "layers",
6170
6376
  "hash",
6171
- "table",
6172
- "trello",
6377
+ // Formas
6173
6378
  "circle",
6174
6379
  "square",
6175
6380
  "triangle",
6176
6381
  "hexagon",
6177
6382
  "octagon",
6178
- "feather",
6179
- "pen-tool"
6383
+ "square-outline",
6384
+ "triangle-outline",
6385
+ "diamond-outline",
6386
+ "shapes-outline",
6387
+ // Herramientas de diseño
6388
+ "pen-tool",
6389
+ "crop",
6390
+ "layers",
6391
+ "filter",
6392
+ "sliders",
6393
+ "aperture",
6394
+ "crop-outline",
6395
+ "filter-outline",
6396
+ "color-fill-outline",
6397
+ "color-filter-outline",
6398
+ "color-palette-outline",
6399
+ "color-wand-outline",
6400
+ "brush-outline",
6401
+ // Edición
6402
+ "edit",
6403
+ "edit-2",
6404
+ "edit-3",
6405
+ "copy",
6406
+ "trash",
6407
+ "move",
6408
+ "create-outline",
6409
+ "pencil-outline",
6410
+ "move-outline",
6411
+ "resize-outline",
6412
+ "duplicate-outline",
6413
+ // Navegación UI
6414
+ "more-horizontal",
6415
+ "more-vertical",
6416
+ "maximize",
6417
+ "minimize",
6418
+ "zoom-in",
6419
+ "zoom-out",
6420
+ "eye",
6421
+ "eye-off",
6422
+ "eye-outline",
6423
+ "eye-off-outline",
6424
+ "ellipsis-horizontal-circle-outline",
6425
+ "ellipsis-vertical-circle-outline"
6180
6426
  ]
6181
6427
  },
6428
+ // ─── Nature ──────────────────────────────────────────────────────────────────
6182
6429
  {
6183
6430
  name: "nature",
6184
6431
  label: "Nature",
6185
6432
  labelEs: "Naturaleza",
6186
- categoryIcon: "sun",
6433
+ categoryIcon: "sunny-outline",
6187
6434
  icons: [
6435
+ // Sol, luna y estrellas
6436
+ "sunny-outline",
6437
+ "moon-outline",
6438
+ "star-outline",
6439
+ "star-half-outline",
6440
+ "partly-sunny-outline",
6188
6441
  "sun",
6442
+ "moon",
6189
6443
  "sunrise",
6190
6444
  "sunset",
6191
- "moon",
6445
+ // Clima
6446
+ "rainy-outline",
6447
+ "thunderstorm-outline",
6448
+ "snow-outline",
6449
+ "cloudy-outline",
6450
+ "cloudy-night-outline",
6451
+ "cloud-outline",
6452
+ "cloud-done-outline",
6453
+ "cloud-download-outline",
6454
+ "cloud-upload-outline",
6455
+ "cloud-offline-outline",
6456
+ "cloud-circle-outline",
6192
6457
  "cloud",
6193
6458
  "cloud-drizzle",
6194
6459
  "cloud-lightning",
6195
- "cloud-off",
6196
6460
  "cloud-rain",
6197
6461
  "cloud-snow",
6198
- "wind",
6199
- "umbrella",
6200
- "thermometer",
6462
+ "cloud-off",
6463
+ "umbrella-outline",
6464
+ "thermometer-outline",
6201
6465
  "droplet",
6466
+ "wind",
6467
+ // Agua y fuego
6468
+ "water-outline",
6469
+ "flame-outline",
6470
+ "bonfire-outline",
6471
+ "eyedrop-outline",
6472
+ // Flora y fauna
6473
+ "leaf-outline",
6474
+ "flower-outline",
6475
+ "bug-outline",
6476
+ "fish-outline",
6477
+ "paw-outline",
6478
+ // Outdoor
6479
+ "binoculars-outline",
6480
+ "telescope-outline",
6481
+ "compass-outline",
6482
+ "map-outline",
6483
+ "location-outline",
6484
+ "flag-outline",
6485
+ "trail-sign-outline",
6486
+ "earth-outline",
6487
+ "globe-outline",
6488
+ "planet-outline",
6489
+ "compass",
6490
+ "map",
6491
+ "map-pin",
6492
+ "flag",
6493
+ "navigation",
6494
+ "navigation-2",
6495
+ "target",
6496
+ "crosshair",
6202
6497
  "life-buoy"
6203
6498
  ]
6204
6499
  },
6500
+ // ─── Brands ──────────────────────────────────────────────────────────────────
6205
6501
  {
6206
6502
  name: "brands",
6207
6503
  label: "Brands",
6208
6504
  labelEs: "Marcas",
6209
6505
  categoryIcon: "globe",
6210
6506
  icons: [
6507
+ // Feather brand icons — outlined, consistent with the rest of the library
6211
6508
  "github",
6212
6509
  "gitlab",
6510
+ "codepen",
6511
+ "codesandbox",
6213
6512
  "twitter",
6214
6513
  "facebook",
6215
6514
  "instagram",
@@ -6221,21 +6520,56 @@ var CURATED_ICONS = [
6221
6520
  "figma",
6222
6521
  "framer",
6223
6522
  "chrome",
6224
- "codepen",
6225
- "codesandbox",
6226
- "globe",
6227
6523
  "rss",
6228
- "airplay",
6229
- "cast",
6230
- "bluetooth",
6231
- "wifi",
6232
- "wifi-off",
6233
- "battery",
6234
- "battery-charging",
6235
- "monitor",
6236
- "tablet",
6237
- "smartphone",
6238
- "tv"
6524
+ // Filled / flat brand logos (FA5 brands) — kept in a second
6525
+ // visual tier. Rendered as the brand's official silhouette.
6526
+ // Visually consistent (all flat single-color) but heavier than the
6527
+ // Feather outlined set above. Use these only when an outlined Feather
6528
+ // version of the brand doesn't exist.
6529
+ "reddit",
6530
+ "tiktok",
6531
+ "pinterest",
6532
+ "whatsapp",
6533
+ "discord",
6534
+ "snapchat",
6535
+ "telegram",
6536
+ "viber",
6537
+ "line",
6538
+ "vimeo",
6539
+ "tumblr",
6540
+ "behance",
6541
+ "medium",
6542
+ "soundcloud",
6543
+ "google",
6544
+ "apple",
6545
+ "android",
6546
+ "windows",
6547
+ "linux",
6548
+ "amazon",
6549
+ "paypal",
6550
+ "stripe",
6551
+ "shopify",
6552
+ "dropbox",
6553
+ "spotify",
6554
+ "steam",
6555
+ "atlassian",
6556
+ "jira",
6557
+ "confluence",
6558
+ "bitbucket",
6559
+ "jenkins",
6560
+ "docker",
6561
+ "aws",
6562
+ "node",
6563
+ "react",
6564
+ "angular",
6565
+ "wordpress",
6566
+ "drupal",
6567
+ "joomla",
6568
+ "squarespace",
6569
+ "wix",
6570
+ "magento",
6571
+ "terminal",
6572
+ "pen-tool"
6239
6573
  ]
6240
6574
  }
6241
6575
  ];
@@ -6247,7 +6581,7 @@ var ALL_CURATED_ICONS = [
6247
6581
  var NUM_COLUMNS = 6;
6248
6582
  var GAP = 6;
6249
6583
  var TRIGGER_SIZE = s(56);
6250
- var SCREEN_HEIGHT2 = reactNative.Dimensions.get("window").height;
6584
+ var SCREEN_HEIGHT = reactNative.Dimensions.get("window").height;
6251
6585
  function IconCell({ name, selected, size, onPress }) {
6252
6586
  const { colors } = useTheme();
6253
6587
  const handlePress = () => {
@@ -6256,7 +6590,7 @@ function IconCell({ name, selected, size, onPress }) {
6256
6590
  };
6257
6591
  const iconColor = selected ? colors.primaryForeground : colors.foreground;
6258
6592
  const bg = selected ? colors.primary : "transparent";
6259
- return /* @__PURE__ */ React25__default.default.createElement(
6593
+ return /* @__PURE__ */ React54__default.default.createElement(
6260
6594
  reactNative.TouchableOpacity,
6261
6595
  {
6262
6596
  onPress: handlePress,
@@ -6270,7 +6604,7 @@ function IconCell({ name, selected, size, onPress }) {
6270
6604
  renderIcon(name, ms(20), iconColor)
6271
6605
  );
6272
6606
  }
6273
- var IconCellMemo = React25__default.default.memo(IconCell);
6607
+ var IconCellMemo = React54__default.default.memo(IconCell);
6274
6608
  function IconPicker({
6275
6609
  value,
6276
6610
  onChange,
@@ -6284,13 +6618,13 @@ function IconPicker({
6284
6618
  }) {
6285
6619
  const { colors } = useTheme();
6286
6620
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
6287
- const sheetRef = React25.useRef(null);
6288
- const catScrollRef = React25.useRef(null);
6289
- const [open, setOpen] = React25.useState(false);
6290
- const [activeCategory, setActiveCategory] = React25.useState(null);
6291
- const [containerWidth, setContainerWidth] = React25.useState(() => reactNative.Dimensions.get("window").width - s(16) * 2);
6292
- const sheetName = React25.useId();
6293
- const activeIcons = React25.useMemo(() => {
6621
+ const sheetRef = React54.useRef(null);
6622
+ const catScrollRef = React54.useRef(null);
6623
+ const [activeCategory, setActiveCategory] = React54.useState(null);
6624
+ const [containerWidth, setContainerWidth] = React54.useState(() => reactNative.Dimensions.get("window").width - s(16) * 2);
6625
+ const [ready, setReady] = React54.useState(false);
6626
+ const sheetName = React54.useId();
6627
+ const activeIcons = React54.useMemo(() => {
6294
6628
  if (activeCategory) {
6295
6629
  return CURATED_ICONS.find((c) => c.name === activeCategory)?.icons ?? ALL_CURATED_ICONS;
6296
6630
  }
@@ -6298,44 +6632,36 @@ function IconPicker({
6298
6632
  }, [activeCategory]);
6299
6633
  const gapPx = s(gap);
6300
6634
  const cellSize = containerWidth > 0 ? Math.floor((containerWidth - gapPx * (numColumns - 1)) / numColumns) : 0;
6301
- const rows = React25.useMemo(() => {
6635
+ const rows = React54.useMemo(() => {
6302
6636
  const result = [];
6303
6637
  for (let i = 0; i < activeIcons.length; i += numColumns) {
6304
6638
  result.push(activeIcons.slice(i, i + numColumns));
6305
6639
  }
6306
6640
  return result;
6307
6641
  }, [activeIcons, numColumns]);
6308
- React25.useEffect(() => {
6309
- if (open) {
6310
- impactMedium();
6311
- sheetRef.current?.present();
6312
- } else {
6313
- sheetRef.current?.dismiss();
6314
- }
6315
- }, [open]);
6316
- const handleSelect = React25.useCallback(
6642
+ const handleDismiss = React54.useCallback(() => {
6643
+ setActiveCategory(null);
6644
+ setReady(false);
6645
+ }, []);
6646
+ const handleSelect = React54.useCallback(
6317
6647
  (iconName) => {
6318
6648
  onChange(iconName);
6319
- setOpen(false);
6320
- setActiveCategory(null);
6321
6649
  },
6322
6650
  [onChange]
6323
6651
  );
6324
- const handleOpen = React25.useCallback(() => {
6652
+ const handleOpen = React54.useCallback(() => {
6325
6653
  if (disabled) return;
6654
+ impactMedium();
6326
6655
  setActiveCategory(null);
6327
- setOpen(true);
6656
+ setReady(false);
6657
+ sheetRef.current?.present();
6328
6658
  }, [disabled]);
6329
- const handleClose = React25.useCallback(() => {
6330
- setOpen(false);
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" }),
6659
+ const renderBackdrop = React54.useCallback(
6660
+ (props) => /* @__PURE__ */ React54__default.default.createElement(bottomSheet.BottomSheetBackdrop, { ...props, disappearsOnIndex: -1, appearsOnIndex: 0, pressBehavior: "close" }),
6335
6661
  []
6336
6662
  );
6337
6663
  const selectedIcon = value ? renderIcon(value, ms(28), colors.foreground) : null;
6338
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles47.triggerContainer, style] }, label ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles47.triggerLabel, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React25__default.default.createElement(
6664
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles47.triggerContainer, style] }, label ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles47.triggerLabel, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React54__default.default.createElement(
6339
6665
  reactNative.TouchableOpacity,
6340
6666
  {
6341
6667
  onPress: handleOpen,
@@ -6357,7 +6683,7 @@ function IconPicker({
6357
6683
  ]
6358
6684
  },
6359
6685
  selectedIcon ?? renderIcon("plus", ms(24), colors.foregroundMuted)
6360
- ), error ? /* @__PURE__ */ React25__default.default.createElement(
6686
+ ), error ? /* @__PURE__ */ React54__default.default.createElement(
6361
6687
  reactNative.Text,
6362
6688
  {
6363
6689
  style: [styles47.helperText, { color: colors.destructive }],
@@ -6365,110 +6691,120 @@ function IconPicker({
6365
6691
  accessibilityLiveRegion: "polite"
6366
6692
  },
6367
6693
  error
6368
- ) : null, !error && hint ? /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles47.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null, /* @__PURE__ */ React25__default.default.createElement(
6369
- BottomSheet.BottomSheetModal,
6694
+ ) : null, !error && hint ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles47.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null, /* @__PURE__ */ React54__default.default.createElement(
6695
+ bottomSheet.BottomSheetModal,
6370
6696
  {
6371
6697
  ref: sheetRef,
6372
6698
  name: sheetName,
6373
- onDismiss: handleClose,
6699
+ onDismiss: handleDismiss,
6374
6700
  enableDynamicSizing: true,
6375
- maxDynamicContentSize: SCREEN_HEIGHT2 * 0.7,
6701
+ maxDynamicContentSize: SCREEN_HEIGHT * 0.7,
6376
6702
  backdropComponent: renderBackdrop,
6377
- backgroundStyle: [styles47.sheetBackground, { backgroundColor: colors.card }],
6378
- handleIndicatorStyle: [styles47.handle, { backgroundColor: colors.border }],
6703
+ backgroundStyle: { ...styles47.sheetBackground, backgroundColor: colors.card },
6704
+ handleIndicatorStyle: { ...styles47.handle, backgroundColor: colors.border },
6379
6705
  enablePanDownToClose: true,
6380
6706
  topInset: insets.top,
6381
6707
  android_keyboardInputMode: "adjustPan"
6382
6708
  },
6383
- /* @__PURE__ */ React25__default.default.createElement(
6384
- BottomSheet.BottomSheetScrollView,
6709
+ /* @__PURE__ */ React54__default.default.createElement(
6710
+ bottomSheet.BottomSheetScrollView,
6385
6711
  {
6386
6712
  contentContainerStyle: styles47.sheetContent,
6387
6713
  showsVerticalScrollIndicator: true
6388
6714
  },
6389
- /* @__PURE__ */ React25__default.default.createElement(reactNative.Text, { style: [styles47.sectionLabel, { color: colors.foregroundSubtle }], allowFontScaling: true }, "Categor\xEDas"),
6390
- /* @__PURE__ */ React25__default.default.createElement(
6391
- reactNativeGestureHandler.ScrollView,
6715
+ /* @__PURE__ */ React54__default.default.createElement(
6716
+ reactNative.View,
6392
6717
  {
6393
- ref: catScrollRef,
6394
- horizontal: true,
6395
- showsHorizontalScrollIndicator: false,
6396
- contentContainerStyle: styles47.categoryStrip,
6397
- style: styles47.categoryScroll
6718
+ style: styles47.gridContainer,
6719
+ onLayout: (e) => {
6720
+ setContainerWidth(e.nativeEvent.layout.width);
6721
+ setReady(true);
6722
+ }
6398
6723
  },
6399
- /* @__PURE__ */ React25__default.default.createElement(
6400
- reactNative.TouchableOpacity,
6724
+ !ready ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles47.loader }, /* @__PURE__ */ React54__default.default.createElement(Spinner, { size: "md", color: colors.primary, label: "Cargando iconos..." })) : /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles47.sectionLabel, { color: colors.foregroundSubtle }], allowFontScaling: true }, "Categor\xEDas"), /* @__PURE__ */ React54__default.default.createElement(
6725
+ reactNativeGestureHandler.ScrollView,
6401
6726
  {
6402
- onPress: () => setActiveCategory(null),
6403
- activeOpacity: 0.7,
6404
- touchSoundDisabled: true,
6405
- accessibilityRole: "button",
6406
- accessibilityLabel: "Todos",
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
- ]
6727
+ ref: catScrollRef,
6728
+ horizontal: true,
6729
+ showsHorizontalScrollIndicator: false,
6730
+ contentContainerStyle: styles47.categoryStrip,
6731
+ style: styles47.categoryScroll
6415
6732
  },
6416
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles47.categoryChipInner }, renderIcon("grid", ms(14), activeCategory === null ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React25__default.default.createElement(
6417
- reactNative.Text,
6733
+ /* @__PURE__ */ React54__default.default.createElement(
6734
+ reactNative.TouchableOpacity,
6418
6735
  {
6736
+ onPress: () => setActiveCategory(null),
6737
+ activeOpacity: 0.7,
6738
+ touchSoundDisabled: true,
6739
+ accessibilityRole: "button",
6740
+ accessibilityLabel: "Todos",
6741
+ accessibilityState: { selected: activeCategory === null },
6419
6742
  style: [
6420
- styles47.categoryChipText,
6421
- { color: activeCategory === null ? colors.primaryForeground : colors.foreground }
6422
- ],
6423
- allowFontScaling: true,
6424
- numberOfLines: 1
6743
+ styles47.categoryChip,
6744
+ {
6745
+ backgroundColor: activeCategory === null ? colors.primary : colors.surface,
6746
+ borderColor: activeCategory === null ? colors.primary : colors.border
6747
+ }
6748
+ ]
6425
6749
  },
6426
- "Todos"
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,
6750
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles47.categoryChipInner }, renderIcon("grid", ms(14), activeCategory === null ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React54__default.default.createElement(
6751
+ reactNative.Text,
6441
6752
  {
6442
- backgroundColor: activeCategory === cat.name ? colors.primary : colors.surface,
6443
- borderColor: activeCategory === cat.name ? colors.primary : colors.border
6444
- }
6445
- ]
6446
- },
6447
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles47.categoryChipInner }, renderIcon(cat.categoryIcon, ms(14), activeCategory === cat.name ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React25__default.default.createElement(
6448
- reactNative.Text,
6753
+ style: [
6754
+ styles47.categoryChipText,
6755
+ { color: activeCategory === null ? colors.primaryForeground : colors.foreground }
6756
+ ],
6757
+ allowFontScaling: true,
6758
+ numberOfLines: 1
6759
+ },
6760
+ "Todos"
6761
+ ))
6762
+ ),
6763
+ CURATED_ICONS.map((cat) => /* @__PURE__ */ React54__default.default.createElement(
6764
+ reactNative.TouchableOpacity,
6449
6765
  {
6766
+ key: cat.name,
6767
+ onPress: () => setActiveCategory(cat.name),
6768
+ activeOpacity: 0.7,
6769
+ touchSoundDisabled: true,
6770
+ accessibilityRole: "button",
6771
+ accessibilityLabel: cat.labelEs,
6772
+ accessibilityState: { selected: activeCategory === cat.name },
6450
6773
  style: [
6451
- styles47.categoryChipText,
6452
- { color: activeCategory === cat.name ? colors.primaryForeground : colors.foreground }
6453
- ],
6454
- allowFontScaling: true,
6455
- numberOfLines: 1
6774
+ styles47.categoryChip,
6775
+ {
6776
+ backgroundColor: activeCategory === cat.name ? colors.primary : colors.surface,
6777
+ borderColor: activeCategory === cat.name ? colors.primary : colors.border
6778
+ }
6779
+ ]
6456
6780
  },
6457
- cat.labelEs
6781
+ /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles47.categoryChipInner }, renderIcon(cat.categoryIcon, ms(14), activeCategory === cat.name ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React54__default.default.createElement(
6782
+ reactNative.Text,
6783
+ {
6784
+ style: [
6785
+ styles47.categoryChipText,
6786
+ { color: activeCategory === cat.name ? colors.primaryForeground : colors.foreground }
6787
+ ],
6788
+ allowFontScaling: true,
6789
+ numberOfLines: 1
6790
+ },
6791
+ cat.labelEs
6792
+ ))
6458
6793
  ))
6459
- ))
6460
- ),
6461
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles47.separator, { backgroundColor: colors.border }] }),
6462
- /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: styles47.gridContainer, onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width) }, cellSize > 0 ? rows.map((row, i) => /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { key: row[0] ?? `row-${i}`, style: [styles47.row, { marginBottom: gapPx }] }, row.map((name) => /* @__PURE__ */ React25__default.default.createElement(
6463
- IconCellMemo,
6464
- {
6465
- key: name,
6466
- name,
6467
- selected: value === name,
6468
- size: cellSize,
6469
- onPress: () => handleSelect(name)
6470
- }
6471
- )), Array.from({ length: numColumns - row.length }).map((_, j) => /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { key: `spacer-${j}`, style: { width: cellSize, height: cellSize } })))) : null)
6794
+ ), /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles47.separator, { backgroundColor: colors.border }] }), cellSize > 0 ? rows.map((row, i) => /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { key: row[0] ?? `row-${i}`, style: [styles47.row, { marginBottom: gapPx }] }, row.map((name) => /* @__PURE__ */ React54__default.default.createElement(
6795
+ IconCellMemo,
6796
+ {
6797
+ key: name,
6798
+ name,
6799
+ selected: value === name,
6800
+ size: cellSize,
6801
+ onPress: () => {
6802
+ handleSelect(name);
6803
+ sheetRef.current?.dismiss();
6804
+ }
6805
+ }
6806
+ )), Array.from({ length: numColumns - row.length }).map((_, j) => /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { key: `spacer-${j}`, style: { width: cellSize, height: cellSize } })))) : null)
6807
+ )
6472
6808
  )
6473
6809
  ));
6474
6810
  }
@@ -6548,6 +6884,11 @@ var styles47 = reactNative.StyleSheet.create({
6548
6884
  borderRadius: RADIUS.md,
6549
6885
  alignItems: "center",
6550
6886
  justifyContent: "center"
6887
+ },
6888
+ loader: {
6889
+ minHeight: vs(200),
6890
+ alignItems: "center",
6891
+ justifyContent: "center"
6551
6892
  }
6552
6893
  });
6553
6894
  var sizeConfig = {
@@ -6581,7 +6922,7 @@ function NumberStepperBase({
6581
6922
  };
6582
6923
  const { button: buttonSize, icon: iconSize, valueFontSize, valueLineHeight, valueMinWidth } = sizeConfig[size];
6583
6924
  const displayValue = String(value);
6584
- return /* @__PURE__ */ React25__default.default.createElement(reactNative.View, { style: [styles48.container, style] }, /* @__PURE__ */ React25__default.default.createElement(
6925
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles48.container, style] }, /* @__PURE__ */ React54__default.default.createElement(
6585
6926
  PressableButton,
6586
6927
  {
6587
6928
  style: [
@@ -6603,7 +6944,7 @@ function NumberStepperBase({
6603
6944
  accessibilityState: { disabled: !canDecrement }
6604
6945
  },
6605
6946
  renderIcon("minus", iconSize, canDecrement ? colors.foreground : colors.foregroundMuted)
6606
- ), /* @__PURE__ */ React25__default.default.createElement(
6947
+ ), /* @__PURE__ */ React54__default.default.createElement(
6607
6948
  reactNative.Text,
6608
6949
  {
6609
6950
  style: [
@@ -6620,7 +6961,7 @@ function NumberStepperBase({
6620
6961
  accessibilityRole: "text"
6621
6962
  },
6622
6963
  displayValue
6623
- ), /* @__PURE__ */ React25__default.default.createElement(
6964
+ ), /* @__PURE__ */ React54__default.default.createElement(
6624
6965
  PressableButton,
6625
6966
  {
6626
6967
  style: [
@@ -6644,7 +6985,7 @@ function NumberStepperBase({
6644
6985
  renderIcon("plus", iconSize, canIncrement ? colors.foreground : colors.foregroundMuted)
6645
6986
  ));
6646
6987
  }
6647
- var NumberStepper = React25__default.default.memo(NumberStepperBase);
6988
+ var NumberStepper = React54__default.default.memo(NumberStepperBase);
6648
6989
  var styles48 = reactNative.StyleSheet.create({
6649
6990
  container: {
6650
6991
  flexDirection: "row",
@@ -6665,6 +7006,139 @@ var styles48 = reactNative.StyleSheet.create({
6665
7006
  textAlign: "center"
6666
7007
  }
6667
7008
  });
7009
+ var COMPACT_THRESHOLD = s(150);
7010
+ function StatsComponent({
7011
+ value,
7012
+ label,
7013
+ description,
7014
+ icon,
7015
+ iconName,
7016
+ iconColor,
7017
+ variant = "elevated",
7018
+ onPress,
7019
+ style,
7020
+ accessibilityLabel
7021
+ }) {
7022
+ const { colors } = useTheme();
7023
+ const [containerWidth, setContainerWidth] = React54.useState(0);
7024
+ const handleLayout = React54.useCallback((e) => {
7025
+ const w = e.nativeEvent.layout.width;
7026
+ if (w > 0 && w !== containerWidth) {
7027
+ setContainerWidth(w);
7028
+ }
7029
+ }, [containerWidth]);
7030
+ const handlePress = () => {
7031
+ if (!onPress) return;
7032
+ impactLight();
7033
+ onPress();
7034
+ };
7035
+ const isCompact = containerWidth > 0 && containerWidth < COMPACT_THRESHOLD && !!(icon ?? iconName);
7036
+ const variantStyle = {
7037
+ elevated: {
7038
+ backgroundColor: colors.card,
7039
+ borderWidth: 0,
7040
+ shadowColor: "#000",
7041
+ shadowOffset: { width: 0, height: 4 },
7042
+ shadowOpacity: 0.09,
7043
+ shadowRadius: 14,
7044
+ elevation: 4
7045
+ },
7046
+ outlined: {
7047
+ backgroundColor: colors.card,
7048
+ borderColor: colors.border,
7049
+ shadowOpacity: 0,
7050
+ elevation: 0
7051
+ },
7052
+ filled: {
7053
+ backgroundColor: colors.surfaceStrong,
7054
+ borderColor: colors.border,
7055
+ shadowOpacity: 0,
7056
+ elevation: 0
7057
+ }
7058
+ }[variant];
7059
+ const iconColorResolved = iconColor ?? colors.primary;
7060
+ const resolvedIcon = iconName ? renderIcon(iconName, ms(22), iconColorResolved) : icon;
7061
+ const iconElement = resolvedIcon ? /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles49.iconWrapper }, resolvedIcon) : null;
7062
+ const valueElement = /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles49.value, { color: colors.foreground }], allowFontScaling: true }, value);
7063
+ const cardContent = /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles49.card, variantStyle, style], onLayout: handleLayout }, isCompact ? /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, iconElement, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles49.compactValue }, valueElement), /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles49.label, { color: colors.foregroundSubtle }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles49.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : /* @__PURE__ */ React54__default.default.createElement(React54__default.default.Fragment, null, /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles49.valueRow }, iconElement, valueElement), /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles49.label, { color: colors.foregroundSubtle }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React54__default.default.createElement(reactNative.Text, { style: [styles49.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null));
7064
+ if (onPress) {
7065
+ return /* @__PURE__ */ React54__default.default.createElement(
7066
+ PressableCard,
7067
+ {
7068
+ onPress: handlePress,
7069
+ rippleColor: "transparent",
7070
+ touchSoundDisabled: true,
7071
+ activateOnHover: true,
7072
+ accessibilityRole: "button",
7073
+ accessibilityLabel
7074
+ },
7075
+ cardContent
7076
+ );
7077
+ }
7078
+ return cardContent;
7079
+ }
7080
+ function StatsGroup({ children, gap = s(12), style }) {
7081
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: [styles49.group, { gap }, style] }, React54__default.default.Children.map(children, (child) => {
7082
+ if (!React54__default.default.isValidElement(child)) return child;
7083
+ const childStyle = child.props.style;
7084
+ const mergedStyle = childStyle ? [childStyle, { alignSelf: "stretch" }] : [{ alignSelf: "stretch" }];
7085
+ return /* @__PURE__ */ React54__default.default.createElement(reactNative.View, { style: styles49.groupItem }, React54__default.default.cloneElement(
7086
+ child,
7087
+ { style: mergedStyle }
7088
+ ));
7089
+ }));
7090
+ }
7091
+ var Stats = Object.assign(React54__default.default.memo(StatsComponent), { Group: StatsGroup });
7092
+ var styles49 = reactNative.StyleSheet.create({
7093
+ card: {
7094
+ borderRadius: RADIUS.md,
7095
+ borderWidth: 1,
7096
+ padding: s(16),
7097
+ alignSelf: "flex-start",
7098
+ alignItems: "center",
7099
+ justifyContent: "center"
7100
+ },
7101
+ valueRow: {
7102
+ flexDirection: "row",
7103
+ alignItems: "center",
7104
+ justifyContent: "center",
7105
+ gap: s(8)
7106
+ },
7107
+ iconWrapper: {
7108
+ alignItems: "center",
7109
+ justifyContent: "center"
7110
+ },
7111
+ compactValue: {
7112
+ marginTop: vs(8)
7113
+ },
7114
+ value: {
7115
+ fontFamily: "Sohne-Bold",
7116
+ fontSize: ms(28),
7117
+ lineHeight: mvs(32),
7118
+ textAlign: "center"
7119
+ },
7120
+ label: {
7121
+ fontFamily: "Sohne-Regular",
7122
+ fontSize: ms(13),
7123
+ lineHeight: mvs(18),
7124
+ marginTop: vs(8),
7125
+ textAlign: "center"
7126
+ },
7127
+ description: {
7128
+ fontFamily: "Sohne-Regular",
7129
+ fontSize: ms(12),
7130
+ lineHeight: mvs(16),
7131
+ marginTop: vs(4),
7132
+ textAlign: "center"
7133
+ },
7134
+ group: {
7135
+ flexDirection: "row",
7136
+ width: "100%"
7137
+ },
7138
+ groupItem: {
7139
+ flex: 1
7140
+ }
7141
+ });
6668
7142
 
6669
7143
  // src/utils/typography.ts
6670
7144
  function getResponsiveFontSize(text, maxSize, steps = [
@@ -6680,14 +7154,14 @@ function getResponsiveFontSize(text, maxSize, steps = [
6680
7154
  return maxSize - 8;
6681
7155
  }
6682
7156
  function useConfirmDialog(options) {
6683
- const [visible, setVisible] = React25.useState(false);
6684
- const [target, setTarget] = React25.useState(null);
6685
- const [loading, setLoading] = React25.useState(false);
6686
- const open = React25.useCallback((t) => {
7157
+ const [visible, setVisible] = React54.useState(false);
7158
+ const [target, setTarget] = React54.useState(null);
7159
+ const [loading, setLoading] = React54.useState(false);
7160
+ const open = React54.useCallback((t) => {
6687
7161
  setTarget(t ?? null);
6688
7162
  setVisible(true);
6689
7163
  }, []);
6690
- const handleConfirm = React25.useCallback(async () => {
7164
+ const handleConfirm = React54.useCallback(async () => {
6691
7165
  setLoading(true);
6692
7166
  try {
6693
7167
  await options.onConfirm();
@@ -6697,7 +7171,7 @@ function useConfirmDialog(options) {
6697
7171
  setTarget(null);
6698
7172
  }
6699
7173
  }, [options]);
6700
- const handleCancel = React25.useCallback(() => {
7174
+ const handleCancel = React54.useCallback(() => {
6701
7175
  setVisible(false);
6702
7176
  setTarget(null);
6703
7177
  options.onCancel?.();
@@ -6718,11 +7192,11 @@ function useConfirmDialog(options) {
6718
7192
 
6719
7193
  Object.defineProperty(exports, "BottomSheetModalProvider", {
6720
7194
  enumerable: true,
6721
- get: function () { return BottomSheet.BottomSheetModalProvider; }
7195
+ get: function () { return bottomSheet.BottomSheetModalProvider; }
6722
7196
  });
6723
7197
  Object.defineProperty(exports, "SheetTextInput", {
6724
7198
  enumerable: true,
6725
- get: function () { return BottomSheet.BottomSheetTextInput; }
7199
+ get: function () { return bottomSheet.BottomSheetTextInput; }
6726
7200
  });
6727
7201
  Object.defineProperty(exports, "toast", {
6728
7202
  enumerable: true,
@@ -6776,7 +7250,7 @@ exports.MenuItem = MenuItem;
6776
7250
  exports.MonthPicker = MonthPicker;
6777
7251
  exports.NumberStepper = NumberStepper;
6778
7252
  exports.PagerDots = PagerDots;
6779
- exports.Pressable = Pressable3;
7253
+ exports.Pressable = Pressable2;
6780
7254
  exports.PricingCard = PricingCard;
6781
7255
  exports.Progress = Progress;
6782
7256
  exports.RADIUS = RADIUS;
@@ -6792,6 +7266,7 @@ exports.SheetSelect = SheetSelect;
6792
7266
  exports.Skeleton = Skeleton;
6793
7267
  exports.Slider = Slider;
6794
7268
  exports.Spinner = Spinner;
7269
+ exports.Stats = Stats;
6795
7270
  exports.Switch = Switch;
6796
7271
  exports.TYPOGRAPHY = TYPOGRAPHY;
6797
7272
  exports.TabBar = TabBar;
@@ -6823,3 +7298,4 @@ exports.selectionAsync = selectionAsync;
6823
7298
  exports.useConfirmDialog = useConfirmDialog;
6824
7299
  exports.useTheme = useTheme;
6825
7300
  exports.useToast = useToast;
7301
+ exports.withAlpha = withAlpha;