@retray-dev/ui-kit 10.2.0 → 12.2.0

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