@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
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React3 = require('react');
3
+ var React4 = require('react');
4
4
  var reactNative = require('react-native');
5
5
  var reactNativeGestureHandler = require('react-native-gesture-handler');
6
6
  var bottomSheet = require('@gorhom/bottom-sheet');
@@ -15,7 +15,7 @@ var reactNativeSizeMatters = require('react-native-size-matters');
15
15
 
16
16
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
17
17
 
18
- var React3__default = /*#__PURE__*/_interopDefault(React3);
18
+ var React4__default = /*#__PURE__*/_interopDefault(React4);
19
19
  var AntDesign__default = /*#__PURE__*/_interopDefault(AntDesign);
20
20
  var Entypo__default = /*#__PURE__*/_interopDefault(Entypo);
21
21
  var Feather__default = /*#__PURE__*/_interopDefault(Feather);
@@ -109,6 +109,7 @@ function deriveColors(t, scheme) {
109
109
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
110
110
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
111
111
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
112
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
112
113
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
113
114
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
114
115
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -121,6 +122,7 @@ function deriveColors(t, scheme) {
121
122
  foregroundMuted,
122
123
  surface,
123
124
  surfaceStrong,
125
+ skeleton,
124
126
  destructiveTint,
125
127
  destructiveBorder,
126
128
  successTint,
@@ -137,12 +139,12 @@ function deriveColors(t, scheme) {
137
139
  }
138
140
 
139
141
  // src/theme/ThemeProvider.tsx
140
- var ThemeContext = React3.createContext({
142
+ var ThemeContext = React4.createContext({
141
143
  colors: deriveColors(defaultLight, "light"),
142
144
  colorScheme: "light"
143
145
  });
144
146
  function useTheme() {
145
- const context = React3.useContext(ThemeContext);
147
+ const context = React4.useContext(ThemeContext);
146
148
  if (!context) {
147
149
  throw new Error("useTheme must be used within a ThemeProvider");
148
150
  }
@@ -184,14 +186,15 @@ function Icon({ name, size, color, family }) {
184
186
  }
185
187
  if (!resolved) return null;
186
188
  const Component = resolved.component;
187
- return React3__default.default.createElement(Component, { name, size, color });
189
+ return React4__default.default.createElement(Component, { name, size, color });
188
190
  }
189
191
  function renderIcon(name, size, color) {
190
- return React3__default.default.createElement(Icon, { name, size, color });
192
+ return React4__default.default.createElement(Icon, { name, size, color });
191
193
  }
192
194
 
193
195
  // src/utils/curatedIcons.ts
194
196
  var CURATED_ICONS = [
197
+ // ─── Food ────────────────────────────────────────────────────────────────────
195
198
  {
196
199
  name: "food",
197
200
  label: "Food",
@@ -199,97 +202,178 @@ var CURATED_ICONS = [
199
202
  categoryIcon: "coffee",
200
203
  icons: [
201
204
  // Bebidas
205
+ "beer-outline",
206
+ "wine-outline",
207
+ "cafe-outline",
208
+ "water-outline",
202
209
  "coffee",
203
- "wine-glass",
204
- "beer",
205
- "cocktail",
206
- "mug-hot",
207
- "glass-cheers",
208
- "wine",
209
- // Comidas
210
- "restaurant",
211
- "hamburger",
212
- "pizza-slice",
213
- "ice-cream",
214
- "cake",
215
- "egg",
216
- "fish",
217
- "bread-slice",
218
- "cookie",
219
- "cheese",
220
- "carrot",
221
- "hotdog",
222
- // Cocina / utilidades
223
- "utensils",
210
+ // Comida
211
+ "pizza-outline",
212
+ "fast-food-outline",
213
+ "fish-outline",
214
+ "ice-cream-outline",
215
+ "egg-outline",
216
+ "nutrition-outline",
217
+ // Servicio y operación
218
+ "restaurant-outline",
219
+ "server-outline",
220
+ "menu-outline",
221
+ "basket-outline",
222
+ "receipt-outline",
223
+ "pricetag-outline",
224
+ "pricetags-outline",
225
+ "reorder-four-outline",
226
+ "reorder-three-outline",
227
+ "cart-outline",
228
+ "cash-outline",
229
+ "wallet-outline",
230
+ "storefront-outline",
224
231
  // Delivery / pedidos
232
+ "truck",
233
+ "package",
225
234
  "shopping-bag",
235
+ "shopping-cart",
236
+ // Ubicación y reserva
237
+ "map-pin",
238
+ "home",
239
+ "calendar",
226
240
  "clock",
241
+ // Experiencia
227
242
  "star",
228
243
  "heart",
229
- "map-pin",
230
- "phone"
244
+ "bookmark",
245
+ "thumbs-up",
246
+ "check",
247
+ "gift"
231
248
  ]
232
249
  },
250
+ // ─── Sports ──────────────────────────────────────────────────────────────────
233
251
  {
234
252
  name: "sports",
235
253
  label: "Sports",
236
254
  labelEs: "Deportes",
237
- categoryIcon: "activity",
255
+ categoryIcon: "trophy-outline",
238
256
  icons: [
239
- // Deportes específicos
240
- "futbol",
241
- "dumbbell",
242
- "running",
243
- "bicycle",
244
- "heartbeat",
245
- "fitness-center",
246
- // Competencia / logros
247
- "target",
257
+ // Deportes
258
+ "american-football-outline",
259
+ "baseball-outline",
260
+ "basketball-outline",
261
+ "bicycle-outline",
262
+ "football-outline",
263
+ "tennisball-outline",
264
+ "golf-outline",
265
+ "fitness-outline",
266
+ "car-sport-outline",
267
+ "game-controller-outline",
268
+ // Competición y logros
269
+ "trophy-outline",
270
+ "medal-outline",
248
271
  "award",
272
+ "target",
249
273
  "flag",
250
- "star",
274
+ "crosshair",
275
+ // Outdoor
276
+ "compass-outline",
277
+ "map-outline",
278
+ "trail-sign-outline",
279
+ "bonfire-outline",
280
+ "snow-outline",
281
+ "flame-outline",
282
+ "sun",
283
+ "droplet",
284
+ "wind",
285
+ "map",
286
+ "map-pin",
287
+ "navigation",
288
+ "navigation-2",
289
+ // Rendimiento y métricas
290
+ "stats-chart-outline",
291
+ "trending-up-outline",
292
+ "trending-down-outline",
293
+ "bar-chart-outline",
294
+ "pie-chart-outline",
295
+ "analytics-outline",
296
+ "activity",
251
297
  "zap",
252
- // Bienestar
253
- "heart",
298
+ "watch",
299
+ "trending-up",
300
+ "trending-down",
301
+ "bar-chart-2",
254
302
  "clock",
255
- "activity",
256
- "sun",
257
- "user",
258
- "users"
303
+ "calendar"
259
304
  ]
260
305
  },
306
+ // ─── Business ────────────────────────────────────────────────────────────────
261
307
  {
262
308
  name: "business",
263
309
  label: "Business",
264
310
  labelEs: "Negocios",
265
311
  categoryIcon: "briefcase",
266
312
  icons: [
313
+ // Empresa
314
+ "briefcase",
315
+ "users",
316
+ "user",
317
+ "user-plus",
318
+ "user-check",
319
+ "user-x",
320
+ "briefcase-outline",
321
+ "business-outline",
322
+ "id-card-outline",
323
+ // Comercio y operación
267
324
  "shopping-cart",
268
325
  "shopping-bag",
269
326
  "credit-card",
270
327
  "dollar-sign",
271
328
  "percent",
272
- "briefcase",
329
+ "tag",
330
+ "gift",
331
+ "cart-outline",
332
+ "cash-outline",
333
+ "wallet-outline",
334
+ "storefront-outline",
335
+ "pricetag-outline",
336
+ "pricetags-outline",
337
+ "receipt-outline",
338
+ "card-outline",
339
+ // Logística
273
340
  "truck",
274
341
  "package",
275
- "gift",
342
+ // Documentos
343
+ "file",
344
+ "file-text",
345
+ "file-plus",
346
+ "folder",
347
+ "paperclip",
348
+ "document-outline",
349
+ "document-text-outline",
350
+ "documents-outline",
351
+ "folder-outline",
352
+ // Comunicación de negocio
353
+ "mail",
354
+ "phone",
355
+ "phone-call",
356
+ "send",
357
+ "message-square",
358
+ "mail-outline",
359
+ // Análisis
276
360
  "bar-chart",
277
361
  "bar-chart-2",
278
362
  "pie-chart",
279
363
  "trending-up",
280
364
  "trending-down",
281
365
  "activity",
282
- "tag",
283
- "bookmark",
284
- "pocket"
366
+ "globe"
285
367
  ]
286
368
  },
369
+ // ─── Objects ─────────────────────────────────────────────────────────────────
287
370
  {
288
371
  name: "objects",
289
372
  label: "Objects",
290
373
  labelEs: "Objetos",
291
- categoryIcon: "folder",
374
+ categoryIcon: "package",
292
375
  icons: [
376
+ // Archivos y carpetas
293
377
  "file",
294
378
  "file-text",
295
379
  "file-plus",
@@ -297,108 +381,193 @@ var CURATED_ICONS = [
297
381
  "folder",
298
382
  "folder-plus",
299
383
  "folder-minus",
384
+ "archive",
385
+ "save",
386
+ "paperclip",
387
+ "document-outline",
388
+ "document-text-outline",
389
+ "documents-outline",
390
+ "folder-outline",
391
+ "folder-open-outline",
392
+ "file-tray-outline",
393
+ "file-tray-full-outline",
394
+ "file-tray-stacked-outline",
395
+ "archive-outline",
396
+ "save-outline",
397
+ // Seguridad
300
398
  "lock",
301
399
  "unlock",
302
400
  "key",
303
401
  "shield",
304
402
  "shield-off",
305
- "settings",
306
- "sliders",
307
- "toggle-left",
308
- "toggle-right",
309
- "tool",
310
- "printer",
311
- "database",
403
+ "lock-closed-outline",
404
+ "lock-open-outline",
405
+ "key-outline",
406
+ "shield-outline",
407
+ "shield-checkmark-outline",
408
+ // Dispositivos
409
+ "monitor",
410
+ "tablet",
411
+ "smartphone",
412
+ "tv",
312
413
  "server",
414
+ "database",
313
415
  "hard-drive",
314
416
  "cpu",
315
- "paperclip",
316
- "aperture",
317
- "box",
318
- "radio"
417
+ "radio",
418
+ "laptop-outline",
419
+ "phone-portrait-outline",
420
+ "phone-landscape-outline",
421
+ "tablet-landscape-outline",
422
+ "tablet-portrait-outline",
423
+ "tv-outline",
424
+ "server-outline",
425
+ "hardware-chip-outline",
426
+ "watch-outline"
319
427
  ]
320
428
  },
429
+ // ─── Status ──────────────────────────────────────────────────────────────────
321
430
  {
322
431
  name: "status",
323
432
  label: "Status",
324
433
  labelEs: "Estado",
325
434
  categoryIcon: "alert-circle",
326
435
  icons: [
436
+ // Alertas
327
437
  "alert-circle",
328
438
  "alert-triangle",
329
439
  "alert-octagon",
330
440
  "info",
331
441
  "help-circle",
442
+ "alert-circle-outline",
443
+ "alert-outline",
444
+ "information-circle-outline",
445
+ "help-circle-outline",
446
+ // Notificaciones
332
447
  "bell",
333
448
  "bell-off",
449
+ "notifications-outline",
450
+ "notifications-off-outline",
451
+ "notifications-circle-outline",
452
+ // Visibilidad
334
453
  "eye",
335
454
  "eye-off",
455
+ "eye-outline",
456
+ "eye-off-outline",
457
+ // Indicadores
336
458
  "flag",
337
459
  "zap",
338
460
  "zap-off",
339
461
  "loader",
340
- "clock",
341
- "watch"
462
+ "activity",
463
+ "flash-outline",
464
+ "bulb-outline",
465
+ // Éxito / error / advertencia
466
+ "check",
467
+ "check-circle",
468
+ "x",
469
+ "x-circle",
470
+ "x-octagon",
471
+ "slash",
472
+ "plus-circle",
473
+ "minus-circle",
474
+ "checkmark-circle-outline",
475
+ "checkmark-done-circle-outline",
476
+ "close-circle-outline",
477
+ "add-circle-outline",
478
+ "remove-circle-outline",
479
+ // Estados de proceso
480
+ "play-circle",
481
+ "pause-circle",
482
+ "stop-circle",
483
+ "play-circle-outline",
484
+ "pause-circle-outline",
485
+ "stop-circle-outline"
342
486
  ]
343
487
  },
488
+ // ─── Actions ─────────────────────────────────────────────────────────────────
344
489
  {
345
490
  name: "actions",
346
491
  label: "Actions",
347
492
  labelEs: "Acciones",
348
493
  categoryIcon: "edit-3",
349
494
  icons: [
495
+ // Crear / añadir
350
496
  "plus",
351
497
  "plus-circle",
352
498
  "plus-square",
499
+ "add-outline",
500
+ "add-circle-outline",
501
+ // Eliminar / quitar
353
502
  "minus",
354
503
  "minus-circle",
355
504
  "minus-square",
505
+ "trash",
506
+ "trash-2",
356
507
  "x",
357
508
  "x-circle",
358
509
  "x-square",
359
510
  "x-octagon",
511
+ "slash",
512
+ "trash-outline",
513
+ "trash-bin-outline",
514
+ "remove-outline",
515
+ "remove-circle-outline",
516
+ "close-circle-outline",
517
+ "backspace-outline",
518
+ "cut-outline",
519
+ // Confirmar
360
520
  "check",
361
521
  "check-circle",
362
522
  "check-square",
523
+ "checkmark-circle-outline",
524
+ // Editar
363
525
  "edit",
364
526
  "edit-2",
365
527
  "edit-3",
366
- "trash",
367
- "trash-2",
368
528
  "copy",
369
529
  "clipboard",
370
530
  "scissors",
531
+ "create-outline",
532
+ "pencil-outline",
533
+ "duplicate-outline",
534
+ "copy-outline",
535
+ "clipboard-outline",
536
+ // Mover datos
371
537
  "download",
372
538
  "download-cloud",
373
539
  "upload",
374
540
  "upload-cloud",
375
- "share",
376
- "share-2",
377
- "link",
378
- "link-2",
379
- "search",
380
- "zoom-in",
381
- "zoom-out",
382
- "save",
383
- "archive",
384
- "log-in",
385
- "log-out",
386
- "power",
387
- "refresh-cw",
388
- "rotate-cw",
389
- "slash"
541
+ "download-outline",
542
+ "cloud-download-outline",
543
+ "cloud-upload-outline"
390
544
  ]
391
545
  },
546
+ // ─── Communication ───────────────────────────────────────────────────────────
392
547
  {
393
548
  name: "communication",
394
549
  label: "Communication",
395
550
  labelEs: "Comunicaci\xF3n",
396
551
  categoryIcon: "message-circle",
397
552
  icons: [
398
- "mail",
553
+ // Mensajería
399
554
  "message-circle",
400
555
  "message-square",
401
556
  "send",
557
+ "mail",
558
+ "inbox",
559
+ "at-sign",
560
+ "mail-outline",
561
+ "mail-open-outline",
562
+ "mail-unread-outline",
563
+ "chatbubble-outline",
564
+ "chatbubble-ellipses-outline",
565
+ "chatbubbles-outline",
566
+ "send-outline",
567
+ "attach-outline",
568
+ "at-outline",
569
+ "at-circle-outline",
570
+ // Llamadas
402
571
  "phone",
403
572
  "phone-call",
404
573
  "phone-incoming",
@@ -406,30 +575,45 @@ var CURATED_ICONS = [
406
575
  "phone-missed",
407
576
  "phone-off",
408
577
  "phone-forwarded",
409
- "at-sign",
410
- "inbox",
578
+ "voicemail",
579
+ "call-outline",
580
+ "phone-portrait-outline",
581
+ "phone-landscape-outline",
582
+ // Personas
411
583
  "user",
412
584
  "user-plus",
413
585
  "user-minus",
414
586
  "user-check",
415
587
  "user-x",
416
588
  "users",
589
+ "person-outline",
590
+ "person-circle-outline",
591
+ "person-add-outline",
592
+ "person-remove-outline",
593
+ "people-outline",
594
+ "people-circle-outline",
595
+ // Reacciones
417
596
  "smile",
418
597
  "frown",
419
598
  "meh",
420
599
  "heart",
421
600
  "thumbs-up",
422
601
  "thumbs-down",
423
- "star",
424
- "award"
602
+ "happy-outline",
603
+ "sad-outline",
604
+ "heart-outline",
605
+ "thumbs-up-outline",
606
+ "thumbs-down-outline"
425
607
  ]
426
608
  },
609
+ // ─── Navigation ──────────────────────────────────────────────────────────────
427
610
  {
428
611
  name: "navigation",
429
612
  label: "Navigation",
430
613
  labelEs: "Navegaci\xF3n",
431
614
  categoryIcon: "compass",
432
615
  icons: [
616
+ // Flechas cardinales
433
617
  "arrow-up",
434
618
  "arrow-down",
435
619
  "arrow-left",
@@ -438,6 +622,13 @@ var CURATED_ICONS = [
438
622
  "arrow-up-right",
439
623
  "arrow-down-left",
440
624
  "arrow-down-right",
625
+ "arrow-up-outline",
626
+ "arrow-down-outline",
627
+ "arrow-back-outline",
628
+ "arrow-forward-outline",
629
+ "arrow-undo-outline",
630
+ "arrow-redo-outline",
631
+ // Chevrones
441
632
  "chevron-up",
442
633
  "chevron-down",
443
634
  "chevron-left",
@@ -446,6 +637,13 @@ var CURATED_ICONS = [
446
637
  "chevrons-down",
447
638
  "chevrons-left",
448
639
  "chevrons-right",
640
+ "chevron-up-outline",
641
+ "chevron-down-outline",
642
+ "chevron-back-outline",
643
+ "chevron-forward-outline",
644
+ "chevron-collapse-outline",
645
+ "chevron-expand-outline",
646
+ // Esquinas
449
647
  "corner-up-left",
450
648
  "corner-up-right",
451
649
  "corner-down-left",
@@ -454,10 +652,14 @@ var CURATED_ICONS = [
454
652
  "corner-left-down",
455
653
  "corner-right-up",
456
654
  "corner-right-down",
655
+ // Giro / refrescar
457
656
  "refresh-cw",
458
657
  "refresh-ccw",
459
658
  "rotate-cw",
460
659
  "rotate-ccw",
660
+ "refresh-outline",
661
+ "reload-outline",
662
+ // Orientación y mapa
461
663
  "navigation",
462
664
  "navigation-2",
463
665
  "compass",
@@ -466,119 +668,248 @@ var CURATED_ICONS = [
466
668
  "target",
467
669
  "crosshair",
468
670
  "home",
469
- "maximize",
470
- "maximize-2",
471
- "minimize",
472
- "minimize-2",
473
- "external-link",
474
- "move",
475
- "anchor"
671
+ "anchor",
672
+ "compass-outline",
673
+ "map-outline",
674
+ "location-outline",
675
+ "navigate-outline",
676
+ "pin-outline",
677
+ "home-outline"
476
678
  ]
477
679
  },
680
+ // ─── Media ───────────────────────────────────────────────────────────────────
478
681
  {
479
682
  name: "media",
480
683
  label: "Media",
481
684
  labelEs: "Medios",
482
685
  categoryIcon: "image",
483
686
  icons: [
687
+ // Visual
484
688
  "image",
485
689
  "film",
486
690
  "video",
487
691
  "video-off",
692
+ "camera",
693
+ "camera-off",
694
+ "image-outline",
695
+ "images-outline",
696
+ "film-outline",
697
+ "videocam-outline",
698
+ "videocam-off-outline",
699
+ "camera-outline",
700
+ "camera-reverse-outline",
701
+ // Reproducción
488
702
  "play",
489
703
  "play-circle",
490
704
  "pause",
491
705
  "pause-circle",
492
706
  "square",
493
707
  "stop-circle",
708
+ "fast-forward",
709
+ "rewind",
710
+ "skip-forward",
711
+ "skip-back",
712
+ "repeat",
713
+ "shuffle",
714
+ "play-outline",
715
+ "pause-outline",
716
+ "play-circle-outline",
717
+ "pause-circle-outline",
718
+ "stop-circle-outline",
719
+ "play-back-outline",
720
+ "play-forward-outline",
721
+ "play-skip-back-outline",
722
+ "play-skip-forward-outline",
723
+ "repeat-outline",
724
+ "shuffle-outline",
725
+ // Audio
494
726
  "music",
495
727
  "headphones",
496
728
  "speaker",
497
- "camera",
498
- "camera-off",
499
- "mic",
500
- "mic-off",
501
729
  "volume",
502
730
  "volume-1",
503
731
  "volume-2",
504
732
  "volume-x",
505
- "fast-forward",
506
- "rewind",
507
- "skip-forward",
508
- "skip-back",
509
- "repeat",
510
- "shuffle",
511
- "disc"
733
+ "mic",
734
+ "mic-off",
735
+ "mic-outline",
736
+ "mic-off-outline",
737
+ "mic-circle-outline",
738
+ "musical-note-outline",
739
+ "musical-notes-outline",
740
+ "volume-high-outline",
741
+ "volume-low-outline",
742
+ "volume-medium-outline",
743
+ "volume-mute-outline",
744
+ "volume-off-outline"
512
745
  ]
513
746
  },
747
+ // ─── Layout ──────────────────────────────────────────────────────────────────
514
748
  {
515
749
  name: "layout",
516
750
  label: "Layout",
517
751
  labelEs: "Dise\xF1o",
518
752
  categoryIcon: "grid",
519
753
  icons: [
520
- "menu",
521
- "more-horizontal",
522
- "more-vertical",
754
+ // Estructura
523
755
  "grid",
524
756
  "columns",
525
757
  "sidebar",
526
758
  "layout",
527
759
  "list",
760
+ "menu",
761
+ "table",
762
+ "trello",
763
+ "grid-outline",
764
+ "list-outline",
765
+ "menu-outline",
766
+ "layers-outline",
767
+ // Alineación
528
768
  "align-left",
529
769
  "align-center",
530
770
  "align-right",
531
771
  "align-justify",
772
+ // Tipografía
532
773
  "bold",
533
774
  "italic",
534
775
  "underline",
535
776
  "type",
536
- "filter",
537
- "crop",
538
- "layers",
539
777
  "hash",
540
- "table",
541
- "trello",
778
+ // Formas
542
779
  "circle",
543
780
  "square",
544
781
  "triangle",
545
782
  "hexagon",
546
783
  "octagon",
547
- "feather",
548
- "pen-tool"
784
+ "square-outline",
785
+ "triangle-outline",
786
+ "diamond-outline",
787
+ "shapes-outline",
788
+ // Herramientas de diseño
789
+ "pen-tool",
790
+ "crop",
791
+ "layers",
792
+ "filter",
793
+ "sliders",
794
+ "aperture",
795
+ "crop-outline",
796
+ "filter-outline",
797
+ "color-fill-outline",
798
+ "color-filter-outline",
799
+ "color-palette-outline",
800
+ "color-wand-outline",
801
+ "brush-outline",
802
+ // Edición
803
+ "edit",
804
+ "edit-2",
805
+ "edit-3",
806
+ "copy",
807
+ "trash",
808
+ "move",
809
+ "create-outline",
810
+ "pencil-outline",
811
+ "move-outline",
812
+ "resize-outline",
813
+ "duplicate-outline",
814
+ // Navegación UI
815
+ "more-horizontal",
816
+ "more-vertical",
817
+ "maximize",
818
+ "minimize",
819
+ "zoom-in",
820
+ "zoom-out",
821
+ "eye",
822
+ "eye-off",
823
+ "eye-outline",
824
+ "eye-off-outline",
825
+ "ellipsis-horizontal-circle-outline",
826
+ "ellipsis-vertical-circle-outline"
549
827
  ]
550
828
  },
829
+ // ─── Nature ──────────────────────────────────────────────────────────────────
551
830
  {
552
831
  name: "nature",
553
832
  label: "Nature",
554
833
  labelEs: "Naturaleza",
555
- categoryIcon: "sun",
834
+ categoryIcon: "sunny-outline",
556
835
  icons: [
836
+ // Sol, luna y estrellas
837
+ "sunny-outline",
838
+ "moon-outline",
839
+ "star-outline",
840
+ "star-half-outline",
841
+ "partly-sunny-outline",
557
842
  "sun",
843
+ "moon",
558
844
  "sunrise",
559
845
  "sunset",
560
- "moon",
846
+ // Clima
847
+ "rainy-outline",
848
+ "thunderstorm-outline",
849
+ "snow-outline",
850
+ "cloudy-outline",
851
+ "cloudy-night-outline",
852
+ "cloud-outline",
853
+ "cloud-done-outline",
854
+ "cloud-download-outline",
855
+ "cloud-upload-outline",
856
+ "cloud-offline-outline",
857
+ "cloud-circle-outline",
561
858
  "cloud",
562
859
  "cloud-drizzle",
563
860
  "cloud-lightning",
564
- "cloud-off",
565
861
  "cloud-rain",
566
862
  "cloud-snow",
567
- "wind",
568
- "umbrella",
569
- "thermometer",
863
+ "cloud-off",
864
+ "umbrella-outline",
865
+ "thermometer-outline",
570
866
  "droplet",
867
+ "wind",
868
+ // Agua y fuego
869
+ "water-outline",
870
+ "flame-outline",
871
+ "bonfire-outline",
872
+ "eyedrop-outline",
873
+ // Flora y fauna
874
+ "leaf-outline",
875
+ "flower-outline",
876
+ "bug-outline",
877
+ "fish-outline",
878
+ "paw-outline",
879
+ // Outdoor
880
+ "binoculars-outline",
881
+ "telescope-outline",
882
+ "compass-outline",
883
+ "map-outline",
884
+ "location-outline",
885
+ "flag-outline",
886
+ "trail-sign-outline",
887
+ "earth-outline",
888
+ "globe-outline",
889
+ "planet-outline",
890
+ "compass",
891
+ "map",
892
+ "map-pin",
893
+ "flag",
894
+ "navigation",
895
+ "navigation-2",
896
+ "target",
897
+ "crosshair",
571
898
  "life-buoy"
572
899
  ]
573
900
  },
901
+ // ─── Brands ──────────────────────────────────────────────────────────────────
574
902
  {
575
903
  name: "brands",
576
904
  label: "Brands",
577
905
  labelEs: "Marcas",
578
906
  categoryIcon: "globe",
579
907
  icons: [
908
+ // Feather brand icons — outlined, consistent with the rest of the library
580
909
  "github",
581
910
  "gitlab",
911
+ "codepen",
912
+ "codesandbox",
582
913
  "twitter",
583
914
  "facebook",
584
915
  "instagram",
@@ -590,21 +921,56 @@ var CURATED_ICONS = [
590
921
  "figma",
591
922
  "framer",
592
923
  "chrome",
593
- "codepen",
594
- "codesandbox",
595
- "globe",
596
924
  "rss",
597
- "airplay",
598
- "cast",
599
- "bluetooth",
600
- "wifi",
601
- "wifi-off",
602
- "battery",
603
- "battery-charging",
604
- "monitor",
605
- "tablet",
606
- "smartphone",
607
- "tv"
925
+ // Filled / flat brand logos (FA5 brands) — kept in a second
926
+ // visual tier. Rendered as the brand's official silhouette.
927
+ // Visually consistent (all flat single-color) but heavier than the
928
+ // Feather outlined set above. Use these only when an outlined Feather
929
+ // version of the brand doesn't exist.
930
+ "reddit",
931
+ "tiktok",
932
+ "pinterest",
933
+ "whatsapp",
934
+ "discord",
935
+ "snapchat",
936
+ "telegram",
937
+ "viber",
938
+ "line",
939
+ "vimeo",
940
+ "tumblr",
941
+ "behance",
942
+ "medium",
943
+ "soundcloud",
944
+ "google",
945
+ "apple",
946
+ "android",
947
+ "windows",
948
+ "linux",
949
+ "amazon",
950
+ "paypal",
951
+ "stripe",
952
+ "shopify",
953
+ "dropbox",
954
+ "spotify",
955
+ "steam",
956
+ "atlassian",
957
+ "jira",
958
+ "confluence",
959
+ "bitbucket",
960
+ "jenkins",
961
+ "docker",
962
+ "aws",
963
+ "node",
964
+ "react",
965
+ "angular",
966
+ "wordpress",
967
+ "drupal",
968
+ "joomla",
969
+ "squarespace",
970
+ "wix",
971
+ "magento",
972
+ "terminal",
973
+ "pen-tool"
608
974
  ]
609
975
  }
610
976
  ];
@@ -679,12 +1045,68 @@ var isWeb = reactNative.Platform.OS === "web";
679
1045
  var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
680
1046
  var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
681
1047
  var ms = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateScale;
1048
+ var mvs = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateVerticalScale;
682
1049
 
683
1050
  // src/tokens.ts
684
1051
  var RADIUS = {
685
1052
  md: 14,
686
1053
  full: 9999
687
1054
  };
1055
+ var sizeMap = {
1056
+ sm: "small",
1057
+ md: "small",
1058
+ lg: "large"
1059
+ };
1060
+ var labelFontSize = {
1061
+ sm: ms(11),
1062
+ md: ms(13),
1063
+ lg: ms(14)
1064
+ };
1065
+ function Spinner({ size = "md", color, label, ...props }) {
1066
+ const { colors } = useTheme();
1067
+ const a11yLabel = label || "Loading";
1068
+ if (label) {
1069
+ return /* @__PURE__ */ React4__default.default.createElement(
1070
+ reactNative.View,
1071
+ {
1072
+ style: styles.wrapper,
1073
+ accessibilityRole: "progressbar",
1074
+ accessibilityLabel: a11yLabel,
1075
+ accessibilityState: { busy: true }
1076
+ },
1077
+ /* @__PURE__ */ React4__default.default.createElement(reactNative.ActivityIndicator, { size: sizeMap[size], color: color ?? colors.primary, ...props }),
1078
+ /* @__PURE__ */ React4__default.default.createElement(
1079
+ reactNative.Text,
1080
+ {
1081
+ style: [styles.label, { color: colors.foregroundMuted, fontSize: labelFontSize[size] }],
1082
+ allowFontScaling: true
1083
+ },
1084
+ label
1085
+ )
1086
+ );
1087
+ }
1088
+ return /* @__PURE__ */ React4__default.default.createElement(
1089
+ reactNative.ActivityIndicator,
1090
+ {
1091
+ size: sizeMap[size],
1092
+ color: color ?? colors.primary,
1093
+ accessibilityRole: "progressbar",
1094
+ accessibilityLabel: a11yLabel,
1095
+ accessibilityState: { busy: true },
1096
+ ...props
1097
+ }
1098
+ );
1099
+ }
1100
+ var styles = reactNative.StyleSheet.create({
1101
+ wrapper: {
1102
+ alignItems: "center",
1103
+ gap: vs(6)
1104
+ },
1105
+ label: {
1106
+ fontFamily: "Sohne-Regular",
1107
+ lineHeight: mvs(18)
1108
+ }
1109
+ });
688
1110
 
689
1111
  // src/components/IconPicker/IconPicker.tsx
690
1112
  var NUM_COLUMNS = 6;
@@ -699,7 +1121,7 @@ function IconCell({ name, selected, size, onPress }) {
699
1121
  };
700
1122
  const iconColor = selected ? colors.primaryForeground : colors.foreground;
701
1123
  const bg = selected ? colors.primary : "transparent";
702
- return /* @__PURE__ */ React3__default.default.createElement(
1124
+ return /* @__PURE__ */ React4__default.default.createElement(
703
1125
  reactNative.TouchableOpacity,
704
1126
  {
705
1127
  onPress: handlePress,
@@ -708,12 +1130,12 @@ function IconCell({ name, selected, size, onPress }) {
708
1130
  accessibilityRole: "button",
709
1131
  accessibilityState: { selected },
710
1132
  accessibilityLabel: name,
711
- style: [styles.cell, { width: size, height: size, backgroundColor: bg }]
1133
+ style: [styles2.cell, { width: size, height: size, backgroundColor: bg }]
712
1134
  },
713
1135
  renderIcon(name, ms(20), iconColor)
714
1136
  );
715
1137
  }
716
- var IconCellMemo = React3__default.default.memo(IconCell);
1138
+ var IconCellMemo = React4__default.default.memo(IconCell);
717
1139
  function IconPicker({
718
1140
  value,
719
1141
  onChange,
@@ -727,13 +1149,13 @@ function IconPicker({
727
1149
  }) {
728
1150
  const { colors } = useTheme();
729
1151
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
730
- const sheetRef = React3.useRef(null);
731
- const catScrollRef = React3.useRef(null);
732
- const [open, setOpen] = React3.useState(false);
733
- const [activeCategory, setActiveCategory] = React3.useState(null);
734
- const [containerWidth, setContainerWidth] = React3.useState(() => reactNative.Dimensions.get("window").width - s(16) * 2);
735
- const sheetName = React3.useId();
736
- const activeIcons = React3.useMemo(() => {
1152
+ const sheetRef = React4.useRef(null);
1153
+ const catScrollRef = React4.useRef(null);
1154
+ const [activeCategory, setActiveCategory] = React4.useState(null);
1155
+ const [containerWidth, setContainerWidth] = React4.useState(() => reactNative.Dimensions.get("window").width - s(16) * 2);
1156
+ const [ready, setReady] = React4.useState(false);
1157
+ const sheetName = React4.useId();
1158
+ const activeIcons = React4.useMemo(() => {
737
1159
  if (activeCategory) {
738
1160
  return CURATED_ICONS.find((c) => c.name === activeCategory)?.icons ?? ALL_CURATED_ICONS;
739
1161
  }
@@ -741,44 +1163,36 @@ function IconPicker({
741
1163
  }, [activeCategory]);
742
1164
  const gapPx = s(gap);
743
1165
  const cellSize = containerWidth > 0 ? Math.floor((containerWidth - gapPx * (numColumns - 1)) / numColumns) : 0;
744
- const rows = React3.useMemo(() => {
1166
+ const rows = React4.useMemo(() => {
745
1167
  const result = [];
746
1168
  for (let i = 0; i < activeIcons.length; i += numColumns) {
747
1169
  result.push(activeIcons.slice(i, i + numColumns));
748
1170
  }
749
1171
  return result;
750
1172
  }, [activeIcons, numColumns]);
751
- React3.useEffect(() => {
752
- if (open) {
753
- impactMedium();
754
- sheetRef.current?.present();
755
- } else {
756
- sheetRef.current?.dismiss();
757
- }
758
- }, [open]);
759
- const handleSelect = React3.useCallback(
1173
+ const handleDismiss = React4.useCallback(() => {
1174
+ setActiveCategory(null);
1175
+ setReady(false);
1176
+ }, []);
1177
+ const handleSelect = React4.useCallback(
760
1178
  (iconName) => {
761
1179
  onChange(iconName);
762
- setOpen(false);
763
- setActiveCategory(null);
764
1180
  },
765
1181
  [onChange]
766
1182
  );
767
- const handleOpen = React3.useCallback(() => {
1183
+ const handleOpen = React4.useCallback(() => {
768
1184
  if (disabled) return;
1185
+ impactMedium();
769
1186
  setActiveCategory(null);
770
- setOpen(true);
1187
+ setReady(false);
1188
+ sheetRef.current?.present();
771
1189
  }, [disabled]);
772
- const handleClose = React3.useCallback(() => {
773
- setOpen(false);
774
- setActiveCategory(null);
775
- }, []);
776
- const renderBackdrop = React3.useCallback(
777
- (props) => /* @__PURE__ */ React3__default.default.createElement(bottomSheet.BottomSheetBackdrop, { ...props, disappearsOnIndex: -1, appearsOnIndex: 0, pressBehavior: "close" }),
1190
+ const renderBackdrop = React4.useCallback(
1191
+ (props) => /* @__PURE__ */ React4__default.default.createElement(bottomSheet.BottomSheetBackdrop, { ...props, disappearsOnIndex: -1, appearsOnIndex: 0, pressBehavior: "close" }),
778
1192
  []
779
1193
  );
780
1194
  const selectedIcon = value ? renderIcon(value, ms(28), colors.foreground) : null;
781
- return /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.triggerContainer, style] }, label ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.triggerLabel, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React3__default.default.createElement(
1195
+ return /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { style: [styles2.triggerContainer, style] }, label ? /* @__PURE__ */ React4__default.default.createElement(reactNative.Text, { style: [styles2.triggerLabel, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React4__default.default.createElement(
782
1196
  reactNative.TouchableOpacity,
783
1197
  {
784
1198
  onPress: handleOpen,
@@ -789,133 +1203,143 @@ function IconPicker({
789
1203
  accessibilityLabel: label ?? "Seleccionar icono",
790
1204
  accessibilityState: { disabled },
791
1205
  style: [
792
- styles.trigger,
1206
+ styles2.trigger,
793
1207
  {
794
1208
  backgroundColor: disabled ? colors.surface : colors.background,
795
1209
  width: TRIGGER_SIZE,
796
1210
  height: TRIGGER_SIZE,
797
1211
  borderColor: error ? colors.destructive : value ? colors.primary : colors.border
798
1212
  },
799
- disabled && styles.triggerDisabled
1213
+ disabled && styles2.triggerDisabled
800
1214
  ]
801
1215
  },
802
1216
  selectedIcon ?? renderIcon("plus", ms(24), colors.foregroundMuted)
803
- ), error ? /* @__PURE__ */ React3__default.default.createElement(
1217
+ ), error ? /* @__PURE__ */ React4__default.default.createElement(
804
1218
  reactNative.Text,
805
1219
  {
806
- style: [styles.helperText, { color: colors.destructive }],
1220
+ style: [styles2.helperText, { color: colors.destructive }],
807
1221
  allowFontScaling: true,
808
1222
  accessibilityLiveRegion: "polite"
809
1223
  },
810
1224
  error
811
- ) : null, !error && hint ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null, /* @__PURE__ */ React3__default.default.createElement(
1225
+ ) : null, !error && hint ? /* @__PURE__ */ React4__default.default.createElement(reactNative.Text, { style: [styles2.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null, /* @__PURE__ */ React4__default.default.createElement(
812
1226
  bottomSheet.BottomSheetModal,
813
1227
  {
814
1228
  ref: sheetRef,
815
1229
  name: sheetName,
816
- onDismiss: handleClose,
1230
+ onDismiss: handleDismiss,
817
1231
  enableDynamicSizing: true,
818
1232
  maxDynamicContentSize: SCREEN_HEIGHT * 0.7,
819
1233
  backdropComponent: renderBackdrop,
820
- backgroundStyle: [styles.sheetBackground, { backgroundColor: colors.card }],
821
- handleIndicatorStyle: [styles.handle, { backgroundColor: colors.border }],
1234
+ backgroundStyle: { ...styles2.sheetBackground, backgroundColor: colors.card },
1235
+ handleIndicatorStyle: { ...styles2.handle, backgroundColor: colors.border },
822
1236
  enablePanDownToClose: true,
823
1237
  topInset: insets.top,
824
1238
  android_keyboardInputMode: "adjustPan"
825
1239
  },
826
- /* @__PURE__ */ React3__default.default.createElement(
1240
+ /* @__PURE__ */ React4__default.default.createElement(
827
1241
  bottomSheet.BottomSheetScrollView,
828
1242
  {
829
- contentContainerStyle: styles.sheetContent,
1243
+ contentContainerStyle: styles2.sheetContent,
830
1244
  showsVerticalScrollIndicator: true
831
1245
  },
832
- /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.sectionLabel, { color: colors.foregroundSubtle }], allowFontScaling: true }, "Categor\xEDas"),
833
- /* @__PURE__ */ React3__default.default.createElement(
834
- reactNativeGestureHandler.ScrollView,
1246
+ /* @__PURE__ */ React4__default.default.createElement(
1247
+ reactNative.View,
835
1248
  {
836
- ref: catScrollRef,
837
- horizontal: true,
838
- showsHorizontalScrollIndicator: false,
839
- contentContainerStyle: styles.categoryStrip,
840
- style: styles.categoryScroll
1249
+ style: styles2.gridContainer,
1250
+ onLayout: (e) => {
1251
+ setContainerWidth(e.nativeEvent.layout.width);
1252
+ setReady(true);
1253
+ }
841
1254
  },
842
- /* @__PURE__ */ React3__default.default.createElement(
843
- reactNative.TouchableOpacity,
1255
+ !ready ? /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { style: styles2.loader }, /* @__PURE__ */ React4__default.default.createElement(Spinner, { size: "md", color: colors.primary, label: "Cargando iconos..." })) : /* @__PURE__ */ React4__default.default.createElement(React4__default.default.Fragment, null, /* @__PURE__ */ React4__default.default.createElement(reactNative.Text, { style: [styles2.sectionLabel, { color: colors.foregroundSubtle }], allowFontScaling: true }, "Categor\xEDas"), /* @__PURE__ */ React4__default.default.createElement(
1256
+ reactNativeGestureHandler.ScrollView,
844
1257
  {
845
- onPress: () => setActiveCategory(null),
846
- activeOpacity: 0.7,
847
- touchSoundDisabled: true,
848
- accessibilityRole: "button",
849
- accessibilityLabel: "Todos",
850
- accessibilityState: { selected: activeCategory === null },
851
- style: [
852
- styles.categoryChip,
853
- {
854
- backgroundColor: activeCategory === null ? colors.primary : colors.surface,
855
- borderColor: activeCategory === null ? colors.primary : colors.border
856
- }
857
- ]
1258
+ ref: catScrollRef,
1259
+ horizontal: true,
1260
+ showsHorizontalScrollIndicator: false,
1261
+ contentContainerStyle: styles2.categoryStrip,
1262
+ style: styles2.categoryScroll
858
1263
  },
859
- /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.categoryChipInner }, renderIcon("grid", ms(14), activeCategory === null ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React3__default.default.createElement(
860
- reactNative.Text,
1264
+ /* @__PURE__ */ React4__default.default.createElement(
1265
+ reactNative.TouchableOpacity,
861
1266
  {
1267
+ onPress: () => setActiveCategory(null),
1268
+ activeOpacity: 0.7,
1269
+ touchSoundDisabled: true,
1270
+ accessibilityRole: "button",
1271
+ accessibilityLabel: "Todos",
1272
+ accessibilityState: { selected: activeCategory === null },
862
1273
  style: [
863
- styles.categoryChipText,
864
- { color: activeCategory === null ? colors.primaryForeground : colors.foreground }
865
- ],
866
- allowFontScaling: true,
867
- numberOfLines: 1
1274
+ styles2.categoryChip,
1275
+ {
1276
+ backgroundColor: activeCategory === null ? colors.primary : colors.surface,
1277
+ borderColor: activeCategory === null ? colors.primary : colors.border
1278
+ }
1279
+ ]
868
1280
  },
869
- "Todos"
870
- ))
871
- ),
872
- CURATED_ICONS.map((cat) => /* @__PURE__ */ React3__default.default.createElement(
873
- reactNative.TouchableOpacity,
874
- {
875
- key: cat.name,
876
- onPress: () => setActiveCategory(cat.name),
877
- activeOpacity: 0.7,
878
- touchSoundDisabled: true,
879
- accessibilityRole: "button",
880
- accessibilityLabel: cat.labelEs,
881
- accessibilityState: { selected: activeCategory === cat.name },
882
- style: [
883
- styles.categoryChip,
1281
+ /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { style: styles2.categoryChipInner }, renderIcon("grid", ms(14), activeCategory === null ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React4__default.default.createElement(
1282
+ reactNative.Text,
884
1283
  {
885
- backgroundColor: activeCategory === cat.name ? colors.primary : colors.surface,
886
- borderColor: activeCategory === cat.name ? colors.primary : colors.border
887
- }
888
- ]
889
- },
890
- /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.categoryChipInner }, renderIcon(cat.categoryIcon, ms(14), activeCategory === cat.name ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React3__default.default.createElement(
891
- reactNative.Text,
1284
+ style: [
1285
+ styles2.categoryChipText,
1286
+ { color: activeCategory === null ? colors.primaryForeground : colors.foreground }
1287
+ ],
1288
+ allowFontScaling: true,
1289
+ numberOfLines: 1
1290
+ },
1291
+ "Todos"
1292
+ ))
1293
+ ),
1294
+ CURATED_ICONS.map((cat) => /* @__PURE__ */ React4__default.default.createElement(
1295
+ reactNative.TouchableOpacity,
892
1296
  {
1297
+ key: cat.name,
1298
+ onPress: () => setActiveCategory(cat.name),
1299
+ activeOpacity: 0.7,
1300
+ touchSoundDisabled: true,
1301
+ accessibilityRole: "button",
1302
+ accessibilityLabel: cat.labelEs,
1303
+ accessibilityState: { selected: activeCategory === cat.name },
893
1304
  style: [
894
- styles.categoryChipText,
895
- { color: activeCategory === cat.name ? colors.primaryForeground : colors.foreground }
896
- ],
897
- allowFontScaling: true,
898
- numberOfLines: 1
1305
+ styles2.categoryChip,
1306
+ {
1307
+ backgroundColor: activeCategory === cat.name ? colors.primary : colors.surface,
1308
+ borderColor: activeCategory === cat.name ? colors.primary : colors.border
1309
+ }
1310
+ ]
899
1311
  },
900
- cat.labelEs
1312
+ /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { style: styles2.categoryChipInner }, renderIcon(cat.categoryIcon, ms(14), activeCategory === cat.name ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React4__default.default.createElement(
1313
+ reactNative.Text,
1314
+ {
1315
+ style: [
1316
+ styles2.categoryChipText,
1317
+ { color: activeCategory === cat.name ? colors.primaryForeground : colors.foreground }
1318
+ ],
1319
+ allowFontScaling: true,
1320
+ numberOfLines: 1
1321
+ },
1322
+ cat.labelEs
1323
+ ))
901
1324
  ))
902
- ))
903
- ),
904
- /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.separator, { backgroundColor: colors.border }] }),
905
- /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.gridContainer, onLayout: (e) => setContainerWidth(e.nativeEvent.layout.width) }, cellSize > 0 ? rows.map((row, i) => /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { key: row[0] ?? `row-${i}`, style: [styles.row, { marginBottom: gapPx }] }, row.map((name) => /* @__PURE__ */ React3__default.default.createElement(
906
- IconCellMemo,
907
- {
908
- key: name,
909
- name,
910
- selected: value === name,
911
- size: cellSize,
912
- onPress: () => handleSelect(name)
913
- }
914
- )), Array.from({ length: numColumns - row.length }).map((_, j) => /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { key: `spacer-${j}`, style: { width: cellSize, height: cellSize } })))) : null)
1325
+ ), /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { style: [styles2.separator, { backgroundColor: colors.border }] }), cellSize > 0 ? rows.map((row, i) => /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { key: row[0] ?? `row-${i}`, style: [styles2.row, { marginBottom: gapPx }] }, row.map((name) => /* @__PURE__ */ React4__default.default.createElement(
1326
+ IconCellMemo,
1327
+ {
1328
+ key: name,
1329
+ name,
1330
+ selected: value === name,
1331
+ size: cellSize,
1332
+ onPress: () => {
1333
+ handleSelect(name);
1334
+ sheetRef.current?.dismiss();
1335
+ }
1336
+ }
1337
+ )), Array.from({ length: numColumns - row.length }).map((_, j) => /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { key: `spacer-${j}`, style: { width: cellSize, height: cellSize } })))) : null)
1338
+ )
915
1339
  )
916
1340
  ));
917
1341
  }
918
- var styles = reactNative.StyleSheet.create({
1342
+ var styles2 = reactNative.StyleSheet.create({
919
1343
  triggerContainer: {
920
1344
  gap: vs(8)
921
1345
  },
@@ -991,6 +1415,11 @@ var styles = reactNative.StyleSheet.create({
991
1415
  borderRadius: RADIUS.md,
992
1416
  alignItems: "center",
993
1417
  justifyContent: "center"
1418
+ },
1419
+ loader: {
1420
+ minHeight: vs(200),
1421
+ alignItems: "center",
1422
+ justifyContent: "center"
994
1423
  }
995
1424
  });
996
1425