@retray-dev/ui-kit 10.2.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/COMPONENTS.md +287 -37
  2. package/README.md +11 -2
  3. package/dist/Accordion.mjs +2 -2
  4. package/dist/AlertBanner.mjs +2 -2
  5. package/dist/AppHeader.mjs +3 -3
  6. package/dist/Avatar.mjs +2 -2
  7. package/dist/Badge.mjs +2 -2
  8. package/dist/Button.mjs +2 -2
  9. package/dist/Card.mjs +2 -2
  10. package/dist/CategoryStrip.mjs +2 -2
  11. package/dist/Checkbox.mjs +2 -2
  12. package/dist/Chip.mjs +2 -2
  13. package/dist/ConfirmDialog.d.mts +1 -6
  14. package/dist/ConfirmDialog.d.ts +1 -6
  15. package/dist/ConfirmDialog.js +29 -23
  16. package/dist/ConfirmDialog.mjs +3 -3
  17. package/dist/CurrencyDisplay.mjs +2 -2
  18. package/dist/CurrencyInput.d.mts +3 -8
  19. package/dist/CurrencyInput.d.ts +3 -8
  20. package/dist/CurrencyInput.js +3 -1
  21. package/dist/CurrencyInput.mjs +3 -3
  22. package/dist/DetailRow.mjs +2 -2
  23. package/dist/EmptyState.mjs +3 -3
  24. package/dist/ErrorBoundary.mjs +2 -2
  25. package/dist/Form.mjs +2 -2
  26. package/dist/IconButton.mjs +2 -2
  27. package/dist/IconPicker.js +675 -248
  28. package/dist/IconPicker.mjs +3 -2
  29. package/dist/ImageUpload.mjs +3 -3
  30. package/dist/ImageViewer.mjs +4 -4
  31. package/dist/Input.mjs +2 -2
  32. package/dist/LabelValue.mjs +2 -2
  33. package/dist/ListGroup.mjs +2 -2
  34. package/dist/ListItem.d.mts +7 -7
  35. package/dist/ListItem.d.ts +7 -7
  36. package/dist/ListItem.js +12 -7
  37. package/dist/ListItem.mjs +2 -2
  38. package/dist/MediaCard.mjs +2 -2
  39. package/dist/MenuGroup.mjs +2 -2
  40. package/dist/MenuItem.mjs +2 -2
  41. package/dist/MonthPicker.mjs +2 -2
  42. package/dist/NumberStepper.mjs +2 -2
  43. package/dist/PagerDots.mjs +2 -2
  44. package/dist/Pressable.d.mts +15 -7
  45. package/dist/Pressable.d.ts +15 -7
  46. package/dist/Pressable.js +7 -3
  47. package/dist/Pressable.mjs +1 -1
  48. package/dist/PricingCard.mjs +4 -4
  49. package/dist/Progress.mjs +2 -2
  50. package/dist/RadioGroup.mjs +2 -2
  51. package/dist/RetrayProvider.mjs +3 -3
  52. package/dist/Select.mjs +2 -2
  53. package/dist/SelectableGrid.mjs +2 -2
  54. package/dist/Separator.mjs +2 -2
  55. package/dist/Sheet.d.mts +4 -46
  56. package/dist/Sheet.d.ts +4 -46
  57. package/dist/Sheet.js +46 -114
  58. package/dist/Sheet.mjs +2 -3
  59. package/dist/SheetSelect.mjs +2 -2
  60. package/dist/Skeleton.mjs +2 -2
  61. package/dist/Slider.mjs +2 -2
  62. package/dist/Spinner.mjs +2 -2
  63. package/dist/Stats.d.mts +30 -0
  64. package/dist/Stats.d.ts +30 -0
  65. package/dist/Stats.js +429 -0
  66. package/dist/Stats.mjs +9 -0
  67. package/dist/Switch.mjs +2 -2
  68. package/dist/TabBar.mjs +2 -2
  69. package/dist/Tabs.mjs +2 -2
  70. package/dist/Text.d.mts +3 -1
  71. package/dist/Text.d.ts +3 -1
  72. package/dist/Text.js +3 -3
  73. package/dist/Text.mjs +2 -2
  74. package/dist/Textarea.mjs +2 -2
  75. package/dist/Toast.mjs +2 -2
  76. package/dist/Toggle.mjs +2 -2
  77. package/dist/{chunk-YJ7I257J.mjs → chunk-265G6A46.mjs} +1 -1
  78. package/dist/{chunk-ELXBDILQ.mjs → chunk-2A2LEFZG.mjs} +2 -2
  79. package/dist/{chunk-ID72TK46.mjs → chunk-2CBQKU7H.mjs} +1 -1
  80. package/dist/{chunk-OB4JUQ3O.mjs → chunk-2I2AYECM.mjs} +1 -1
  81. package/dist/{chunk-WJLKJMKR.mjs → chunk-357YO24D.mjs} +4 -4
  82. package/dist/{chunk-GQYFLP3D.mjs → chunk-3GEYJ7I5.mjs} +1 -1
  83. package/dist/{chunk-AV4EMIRH.mjs → chunk-3N2M3WZL.mjs} +1 -1
  84. package/dist/{chunk-VF2ATYN3.mjs → chunk-3UYAZ7I4.mjs} +1 -1
  85. package/dist/{chunk-JMOZEC77.mjs → chunk-4WFMPFZB.mjs} +1 -1
  86. package/dist/chunk-5OLNXP3S.mjs +144 -0
  87. package/dist/{chunk-6SECQ2ZF.mjs → chunk-7HSILTC4.mjs} +2 -2
  88. package/dist/{chunk-IRRY3CRZ.mjs → chunk-AKM4EPOT.mjs} +1 -1
  89. package/dist/{chunk-IX3NYLYQ.mjs → chunk-AQEVCEXV.mjs} +1 -1
  90. package/dist/{chunk-WBOOUHSS.mjs → chunk-BCWEHE34.mjs} +1 -1
  91. package/dist/{chunk-AJ7ZDNBT.mjs → chunk-BOVUP27T.mjs} +1 -1
  92. package/dist/{chunk-BRKYVJVV.mjs → chunk-BQZE3HAW.mjs} +1 -1
  93. package/dist/{chunk-Z6SFHN6T.mjs → chunk-D3Y2T42P.mjs} +1 -1
  94. package/dist/{chunk-T2KCAHOS.mjs → chunk-DF6DU42P.mjs} +1 -1
  95. package/dist/{chunk-TB6SD2FT.mjs → chunk-DI7CBDL6.mjs} +1 -1
  96. package/dist/{chunk-HTHGSXFG.mjs → chunk-DOGIPOF5.mjs} +1 -1
  97. package/dist/{chunk-MBMXYJJV.mjs → chunk-E7NEHHXV.mjs} +7 -3
  98. package/dist/{chunk-MX6HRKMI.mjs → chunk-EFLFRAHD.mjs} +1 -1
  99. package/dist/{chunk-SOYNZDVY.mjs → chunk-EMUWGDWC.mjs} +6 -1
  100. package/dist/{chunk-AJRVDP2H.mjs → chunk-F4V6XLP4.mjs} +3 -3
  101. package/dist/{chunk-DYT7BG5I.mjs → chunk-FA2KMTH5.mjs} +1 -1
  102. package/dist/{chunk-Y2NS74WS.mjs → chunk-FFTYLPSB.mjs} +46 -98
  103. package/dist/{chunk-VKID2D2I.mjs → chunk-FUVYSVGR.mjs} +13 -8
  104. package/dist/{chunk-7LWRKMF5.mjs → chunk-FVTVCJAH.mjs} +1 -1
  105. package/dist/{chunk-TZDGAP5N.mjs → chunk-GK4VRMNE.mjs} +2 -2
  106. package/dist/{chunk-6Q64UFIA.mjs → chunk-HJ46DTJE.mjs} +1 -1
  107. package/dist/{chunk-WF2XDFRK.mjs → chunk-HLMPMUK2.mjs} +1 -1
  108. package/dist/{chunk-GD6KXMG5.mjs → chunk-I4V5XZPS.mjs} +1 -1
  109. package/dist/{chunk-TBNZHU6C.mjs → chunk-ISY26JQJ.mjs} +2 -2
  110. package/dist/{chunk-X4G6APW6.mjs → chunk-J6Q2YJEV.mjs} +1 -1
  111. package/dist/{chunk-WYEUNUTP.mjs → chunk-JCZQOY4O.mjs} +31 -24
  112. package/dist/{chunk-U2XJFYED.mjs → chunk-JNVAIDLK.mjs} +1 -1
  113. package/dist/{chunk-SOA2Z4RB.mjs → chunk-JULSIZDM.mjs} +1 -1
  114. package/dist/chunk-KHYX4IOM.mjs +1114 -0
  115. package/dist/{chunk-RYZC432S.mjs → chunk-LRM4AVYY.mjs} +1 -1
  116. package/dist/{chunk-6L4G6PBT.mjs → chunk-MYZ2EDYU.mjs} +1 -1
  117. package/dist/{chunk-BUMAMSTZ.mjs → chunk-N4ZPVCJH.mjs} +1 -1
  118. package/dist/{chunk-Z4VHZ7B5.mjs → chunk-NXI4YDZ2.mjs} +1 -1
  119. package/dist/{chunk-ZZ2R6KZ3.mjs → chunk-OULVKTWL.mjs} +1 -1
  120. package/dist/{chunk-FCSSQK3L.mjs → chunk-P64WHW4A.mjs} +1 -1
  121. package/dist/{chunk-KOO4WITD.mjs → chunk-P73V2EKS.mjs} +1 -1
  122. package/dist/{chunk-SXLKNTA4.mjs → chunk-PGERH3P7.mjs} +1 -1
  123. package/dist/{chunk-2UYENBLV.mjs → chunk-QSFV2P7O.mjs} +1 -1
  124. package/dist/{chunk-JT7HKXRB.mjs → chunk-S3KJCPEJ.mjs} +1 -1
  125. package/dist/{chunk-BEMIQXXU.mjs → chunk-V6NFJXKO.mjs} +1 -1
  126. package/dist/{chunk-A3A6KNQN.mjs → chunk-WOEWGSTU.mjs} +1 -1
  127. package/dist/{chunk-NMU5FMQJ.mjs → chunk-X26S5EVZ.mjs} +4 -2
  128. package/dist/{chunk-YFZ3ELX5.mjs → chunk-XBAGGKLW.mjs} +2 -2
  129. package/dist/{chunk-S2R7UVOE.mjs → chunk-ZHMSAYLT.mjs} +1 -1
  130. package/dist/fonts.d.mts +1 -7
  131. package/dist/fonts.d.ts +1 -7
  132. package/dist/fonts.js +0 -2
  133. package/dist/fonts.mjs +1 -2
  134. package/dist/index.d.mts +4 -1
  135. package/dist/index.d.ts +4 -1
  136. package/dist/index.js +1184 -708
  137. package/dist/index.mjs +53 -52
  138. package/package.json +3 -3
  139. package/src/components/ConfirmDialog/ConfirmDialog.tsx +39 -30
  140. package/src/components/CurrencyInput/CurrencyInput.tsx +4 -7
  141. package/src/components/IconPicker/IconPicker.tsx +124 -112
  142. package/src/components/ListItem/ListItem.tsx +43 -28
  143. package/src/components/Pressable/Pressable.tsx +20 -8
  144. package/src/components/Sheet/Sheet.tsx +64 -172
  145. package/src/components/Stats/Stats.tsx +226 -0
  146. package/src/components/Stats/index.ts +2 -0
  147. package/src/components/Text/Text.tsx +4 -2
  148. package/src/fonts.ts +0 -7
  149. package/src/index.ts +4 -0
  150. package/src/theme/colorUtils.ts +9 -0
  151. package/src/utils/curatedIcons.ts +698 -135
  152. package/src/utils/fontGuard.ts +2 -1
  153. package/dist/chunk-53Z3NYGE.mjs +0 -742
@@ -0,0 +1,1114 @@
1
+ import { Spinner } from './chunk-BCWEHE34.mjs';
2
+ import { selectionAsync, impactMedium } from './chunk-EJ7ZPXOH.mjs';
3
+ import { RADIUS } from './chunk-QY3X2UYR.mjs';
4
+ import { renderIcon } from './chunk-KA7LTET3.mjs';
5
+ import { useTheme } from './chunk-EMUWGDWC.mjs';
6
+ import { s, vs, ms } from './chunk-2CE3TQVY.mjs';
7
+ import React, { useRef, useState, useId, useMemo, useCallback } from 'react';
8
+ import { Dimensions, StyleSheet, TouchableOpacity, View, Text } from 'react-native';
9
+ import { ScrollView } from 'react-native-gesture-handler';
10
+ import { BottomSheetBackdrop, BottomSheetModal, BottomSheetScrollView } from '@gorhom/bottom-sheet';
11
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
12
+
13
+ // src/utils/curatedIcons.ts
14
+ var CURATED_ICONS = [
15
+ // ─── Food ────────────────────────────────────────────────────────────────────
16
+ {
17
+ name: "food",
18
+ label: "Food",
19
+ labelEs: "Comida",
20
+ categoryIcon: "coffee",
21
+ icons: [
22
+ // Bebidas
23
+ "beer-outline",
24
+ "wine-outline",
25
+ "cafe-outline",
26
+ "water-outline",
27
+ "coffee",
28
+ // Comida
29
+ "pizza-outline",
30
+ "fast-food-outline",
31
+ "fish-outline",
32
+ "ice-cream-outline",
33
+ "egg-outline",
34
+ "nutrition-outline",
35
+ // Servicio y operación
36
+ "restaurant-outline",
37
+ "server-outline",
38
+ "menu-outline",
39
+ "basket-outline",
40
+ "receipt-outline",
41
+ "pricetag-outline",
42
+ "pricetags-outline",
43
+ "reorder-four-outline",
44
+ "reorder-three-outline",
45
+ "cart-outline",
46
+ "cash-outline",
47
+ "wallet-outline",
48
+ "storefront-outline",
49
+ // Delivery / pedidos
50
+ "truck",
51
+ "package",
52
+ "shopping-bag",
53
+ "shopping-cart",
54
+ // Ubicación y reserva
55
+ "map-pin",
56
+ "home",
57
+ "calendar",
58
+ "clock",
59
+ // Experiencia
60
+ "star",
61
+ "heart",
62
+ "bookmark",
63
+ "thumbs-up",
64
+ "check",
65
+ "gift"
66
+ ]
67
+ },
68
+ // ─── Sports ──────────────────────────────────────────────────────────────────
69
+ {
70
+ name: "sports",
71
+ label: "Sports",
72
+ labelEs: "Deportes",
73
+ categoryIcon: "trophy-outline",
74
+ icons: [
75
+ // Deportes
76
+ "american-football-outline",
77
+ "baseball-outline",
78
+ "basketball-outline",
79
+ "bicycle-outline",
80
+ "football-outline",
81
+ "tennisball-outline",
82
+ "golf-outline",
83
+ "fitness-outline",
84
+ "car-sport-outline",
85
+ "game-controller-outline",
86
+ // Competición y logros
87
+ "trophy-outline",
88
+ "medal-outline",
89
+ "award",
90
+ "target",
91
+ "flag",
92
+ "crosshair",
93
+ // Outdoor
94
+ "compass-outline",
95
+ "map-outline",
96
+ "trail-sign-outline",
97
+ "bonfire-outline",
98
+ "snow-outline",
99
+ "flame-outline",
100
+ "sun",
101
+ "droplet",
102
+ "wind",
103
+ "map",
104
+ "map-pin",
105
+ "navigation",
106
+ "navigation-2",
107
+ // Rendimiento y métricas
108
+ "stats-chart-outline",
109
+ "trending-up-outline",
110
+ "trending-down-outline",
111
+ "bar-chart-outline",
112
+ "pie-chart-outline",
113
+ "analytics-outline",
114
+ "activity",
115
+ "zap",
116
+ "watch",
117
+ "trending-up",
118
+ "trending-down",
119
+ "bar-chart-2",
120
+ "clock",
121
+ "calendar"
122
+ ]
123
+ },
124
+ // ─── Business ────────────────────────────────────────────────────────────────
125
+ {
126
+ name: "business",
127
+ label: "Business",
128
+ labelEs: "Negocios",
129
+ categoryIcon: "briefcase",
130
+ icons: [
131
+ // Empresa
132
+ "briefcase",
133
+ "users",
134
+ "user",
135
+ "user-plus",
136
+ "user-check",
137
+ "user-x",
138
+ "briefcase-outline",
139
+ "business-outline",
140
+ "id-card-outline",
141
+ // Comercio y operación
142
+ "shopping-cart",
143
+ "shopping-bag",
144
+ "credit-card",
145
+ "dollar-sign",
146
+ "percent",
147
+ "tag",
148
+ "gift",
149
+ "cart-outline",
150
+ "cash-outline",
151
+ "wallet-outline",
152
+ "storefront-outline",
153
+ "pricetag-outline",
154
+ "pricetags-outline",
155
+ "receipt-outline",
156
+ "card-outline",
157
+ // Logística
158
+ "truck",
159
+ "package",
160
+ // Documentos
161
+ "file",
162
+ "file-text",
163
+ "file-plus",
164
+ "folder",
165
+ "paperclip",
166
+ "document-outline",
167
+ "document-text-outline",
168
+ "documents-outline",
169
+ "folder-outline",
170
+ // Comunicación de negocio
171
+ "mail",
172
+ "phone",
173
+ "phone-call",
174
+ "send",
175
+ "message-square",
176
+ "mail-outline",
177
+ // Análisis
178
+ "bar-chart",
179
+ "bar-chart-2",
180
+ "pie-chart",
181
+ "trending-up",
182
+ "trending-down",
183
+ "activity",
184
+ "globe"
185
+ ]
186
+ },
187
+ // ─── Objects ─────────────────────────────────────────────────────────────────
188
+ {
189
+ name: "objects",
190
+ label: "Objects",
191
+ labelEs: "Objetos",
192
+ categoryIcon: "package",
193
+ icons: [
194
+ // Archivos y carpetas
195
+ "file",
196
+ "file-text",
197
+ "file-plus",
198
+ "file-minus",
199
+ "folder",
200
+ "folder-plus",
201
+ "folder-minus",
202
+ "archive",
203
+ "save",
204
+ "paperclip",
205
+ "document-outline",
206
+ "document-text-outline",
207
+ "documents-outline",
208
+ "folder-outline",
209
+ "folder-open-outline",
210
+ "file-tray-outline",
211
+ "file-tray-full-outline",
212
+ "file-tray-stacked-outline",
213
+ "archive-outline",
214
+ "save-outline",
215
+ // Seguridad
216
+ "lock",
217
+ "unlock",
218
+ "key",
219
+ "shield",
220
+ "shield-off",
221
+ "lock-closed-outline",
222
+ "lock-open-outline",
223
+ "key-outline",
224
+ "shield-outline",
225
+ "shield-checkmark-outline",
226
+ // Dispositivos
227
+ "monitor",
228
+ "tablet",
229
+ "smartphone",
230
+ "tv",
231
+ "server",
232
+ "database",
233
+ "hard-drive",
234
+ "cpu",
235
+ "radio",
236
+ "laptop-outline",
237
+ "phone-portrait-outline",
238
+ "phone-landscape-outline",
239
+ "tablet-landscape-outline",
240
+ "tablet-portrait-outline",
241
+ "tv-outline",
242
+ "server-outline",
243
+ "hardware-chip-outline",
244
+ "watch-outline"
245
+ ]
246
+ },
247
+ // ─── Status ──────────────────────────────────────────────────────────────────
248
+ {
249
+ name: "status",
250
+ label: "Status",
251
+ labelEs: "Estado",
252
+ categoryIcon: "alert-circle",
253
+ icons: [
254
+ // Alertas
255
+ "alert-circle",
256
+ "alert-triangle",
257
+ "alert-octagon",
258
+ "info",
259
+ "help-circle",
260
+ "alert-circle-outline",
261
+ "alert-outline",
262
+ "information-circle-outline",
263
+ "help-circle-outline",
264
+ // Notificaciones
265
+ "bell",
266
+ "bell-off",
267
+ "notifications-outline",
268
+ "notifications-off-outline",
269
+ "notifications-circle-outline",
270
+ // Visibilidad
271
+ "eye",
272
+ "eye-off",
273
+ "eye-outline",
274
+ "eye-off-outline",
275
+ // Indicadores
276
+ "flag",
277
+ "zap",
278
+ "zap-off",
279
+ "loader",
280
+ "activity",
281
+ "flash-outline",
282
+ "bulb-outline",
283
+ // Éxito / error / advertencia
284
+ "check",
285
+ "check-circle",
286
+ "x",
287
+ "x-circle",
288
+ "x-octagon",
289
+ "slash",
290
+ "plus-circle",
291
+ "minus-circle",
292
+ "checkmark-circle-outline",
293
+ "checkmark-done-circle-outline",
294
+ "close-circle-outline",
295
+ "add-circle-outline",
296
+ "remove-circle-outline",
297
+ // Estados de proceso
298
+ "play-circle",
299
+ "pause-circle",
300
+ "stop-circle",
301
+ "play-circle-outline",
302
+ "pause-circle-outline",
303
+ "stop-circle-outline"
304
+ ]
305
+ },
306
+ // ─── Actions ─────────────────────────────────────────────────────────────────
307
+ {
308
+ name: "actions",
309
+ label: "Actions",
310
+ labelEs: "Acciones",
311
+ categoryIcon: "edit-3",
312
+ icons: [
313
+ // Crear / añadir
314
+ "plus",
315
+ "plus-circle",
316
+ "plus-square",
317
+ "add-outline",
318
+ "add-circle-outline",
319
+ // Eliminar / quitar
320
+ "minus",
321
+ "minus-circle",
322
+ "minus-square",
323
+ "trash",
324
+ "trash-2",
325
+ "x",
326
+ "x-circle",
327
+ "x-square",
328
+ "x-octagon",
329
+ "slash",
330
+ "trash-outline",
331
+ "trash-bin-outline",
332
+ "remove-outline",
333
+ "remove-circle-outline",
334
+ "close-circle-outline",
335
+ "backspace-outline",
336
+ "cut-outline",
337
+ // Confirmar
338
+ "check",
339
+ "check-circle",
340
+ "check-square",
341
+ "checkmark-circle-outline",
342
+ // Editar
343
+ "edit",
344
+ "edit-2",
345
+ "edit-3",
346
+ "copy",
347
+ "clipboard",
348
+ "scissors",
349
+ "create-outline",
350
+ "pencil-outline",
351
+ "duplicate-outline",
352
+ "copy-outline",
353
+ "clipboard-outline",
354
+ // Mover datos
355
+ "download",
356
+ "download-cloud",
357
+ "upload",
358
+ "upload-cloud",
359
+ "download-outline",
360
+ "cloud-download-outline",
361
+ "cloud-upload-outline"
362
+ ]
363
+ },
364
+ // ─── Communication ───────────────────────────────────────────────────────────
365
+ {
366
+ name: "communication",
367
+ label: "Communication",
368
+ labelEs: "Comunicaci\xF3n",
369
+ categoryIcon: "message-circle",
370
+ icons: [
371
+ // Mensajería
372
+ "message-circle",
373
+ "message-square",
374
+ "send",
375
+ "mail",
376
+ "inbox",
377
+ "at-sign",
378
+ "mail-outline",
379
+ "mail-open-outline",
380
+ "mail-unread-outline",
381
+ "chatbubble-outline",
382
+ "chatbubble-ellipses-outline",
383
+ "chatbubbles-outline",
384
+ "send-outline",
385
+ "attach-outline",
386
+ "at-outline",
387
+ "at-circle-outline",
388
+ // Llamadas
389
+ "phone",
390
+ "phone-call",
391
+ "phone-incoming",
392
+ "phone-outgoing",
393
+ "phone-missed",
394
+ "phone-off",
395
+ "phone-forwarded",
396
+ "voicemail",
397
+ "call-outline",
398
+ "phone-portrait-outline",
399
+ "phone-landscape-outline",
400
+ // Personas
401
+ "user",
402
+ "user-plus",
403
+ "user-minus",
404
+ "user-check",
405
+ "user-x",
406
+ "users",
407
+ "person-outline",
408
+ "person-circle-outline",
409
+ "person-add-outline",
410
+ "person-remove-outline",
411
+ "people-outline",
412
+ "people-circle-outline",
413
+ // Reacciones
414
+ "smile",
415
+ "frown",
416
+ "meh",
417
+ "heart",
418
+ "thumbs-up",
419
+ "thumbs-down",
420
+ "happy-outline",
421
+ "sad-outline",
422
+ "heart-outline",
423
+ "thumbs-up-outline",
424
+ "thumbs-down-outline"
425
+ ]
426
+ },
427
+ // ─── Navigation ──────────────────────────────────────────────────────────────
428
+ {
429
+ name: "navigation",
430
+ label: "Navigation",
431
+ labelEs: "Navegaci\xF3n",
432
+ categoryIcon: "compass",
433
+ icons: [
434
+ // Flechas cardinales
435
+ "arrow-up",
436
+ "arrow-down",
437
+ "arrow-left",
438
+ "arrow-right",
439
+ "arrow-up-left",
440
+ "arrow-up-right",
441
+ "arrow-down-left",
442
+ "arrow-down-right",
443
+ "arrow-up-outline",
444
+ "arrow-down-outline",
445
+ "arrow-back-outline",
446
+ "arrow-forward-outline",
447
+ "arrow-undo-outline",
448
+ "arrow-redo-outline",
449
+ // Chevrones
450
+ "chevron-up",
451
+ "chevron-down",
452
+ "chevron-left",
453
+ "chevron-right",
454
+ "chevrons-up",
455
+ "chevrons-down",
456
+ "chevrons-left",
457
+ "chevrons-right",
458
+ "chevron-up-outline",
459
+ "chevron-down-outline",
460
+ "chevron-back-outline",
461
+ "chevron-forward-outline",
462
+ "chevron-collapse-outline",
463
+ "chevron-expand-outline",
464
+ // Esquinas
465
+ "corner-up-left",
466
+ "corner-up-right",
467
+ "corner-down-left",
468
+ "corner-down-right",
469
+ "corner-left-up",
470
+ "corner-left-down",
471
+ "corner-right-up",
472
+ "corner-right-down",
473
+ // Giro / refrescar
474
+ "refresh-cw",
475
+ "refresh-ccw",
476
+ "rotate-cw",
477
+ "rotate-ccw",
478
+ "refresh-outline",
479
+ "reload-outline",
480
+ // Orientación y mapa
481
+ "navigation",
482
+ "navigation-2",
483
+ "compass",
484
+ "map",
485
+ "map-pin",
486
+ "target",
487
+ "crosshair",
488
+ "home",
489
+ "anchor",
490
+ "compass-outline",
491
+ "map-outline",
492
+ "location-outline",
493
+ "navigate-outline",
494
+ "pin-outline",
495
+ "home-outline"
496
+ ]
497
+ },
498
+ // ─── Media ───────────────────────────────────────────────────────────────────
499
+ {
500
+ name: "media",
501
+ label: "Media",
502
+ labelEs: "Medios",
503
+ categoryIcon: "image",
504
+ icons: [
505
+ // Visual
506
+ "image",
507
+ "film",
508
+ "video",
509
+ "video-off",
510
+ "camera",
511
+ "camera-off",
512
+ "image-outline",
513
+ "images-outline",
514
+ "film-outline",
515
+ "videocam-outline",
516
+ "videocam-off-outline",
517
+ "camera-outline",
518
+ "camera-reverse-outline",
519
+ // Reproducción
520
+ "play",
521
+ "play-circle",
522
+ "pause",
523
+ "pause-circle",
524
+ "square",
525
+ "stop-circle",
526
+ "fast-forward",
527
+ "rewind",
528
+ "skip-forward",
529
+ "skip-back",
530
+ "repeat",
531
+ "shuffle",
532
+ "play-outline",
533
+ "pause-outline",
534
+ "play-circle-outline",
535
+ "pause-circle-outline",
536
+ "stop-circle-outline",
537
+ "play-back-outline",
538
+ "play-forward-outline",
539
+ "play-skip-back-outline",
540
+ "play-skip-forward-outline",
541
+ "repeat-outline",
542
+ "shuffle-outline",
543
+ // Audio
544
+ "music",
545
+ "headphones",
546
+ "speaker",
547
+ "volume",
548
+ "volume-1",
549
+ "volume-2",
550
+ "volume-x",
551
+ "mic",
552
+ "mic-off",
553
+ "mic-outline",
554
+ "mic-off-outline",
555
+ "mic-circle-outline",
556
+ "musical-note-outline",
557
+ "musical-notes-outline",
558
+ "volume-high-outline",
559
+ "volume-low-outline",
560
+ "volume-medium-outline",
561
+ "volume-mute-outline",
562
+ "volume-off-outline"
563
+ ]
564
+ },
565
+ // ─── Layout ──────────────────────────────────────────────────────────────────
566
+ {
567
+ name: "layout",
568
+ label: "Layout",
569
+ labelEs: "Dise\xF1o",
570
+ categoryIcon: "grid",
571
+ icons: [
572
+ // Estructura
573
+ "grid",
574
+ "columns",
575
+ "sidebar",
576
+ "layout",
577
+ "list",
578
+ "menu",
579
+ "table",
580
+ "trello",
581
+ "grid-outline",
582
+ "list-outline",
583
+ "menu-outline",
584
+ "layers-outline",
585
+ // Alineación
586
+ "align-left",
587
+ "align-center",
588
+ "align-right",
589
+ "align-justify",
590
+ // Tipografía
591
+ "bold",
592
+ "italic",
593
+ "underline",
594
+ "type",
595
+ "hash",
596
+ // Formas
597
+ "circle",
598
+ "square",
599
+ "triangle",
600
+ "hexagon",
601
+ "octagon",
602
+ "square-outline",
603
+ "triangle-outline",
604
+ "diamond-outline",
605
+ "shapes-outline",
606
+ // Herramientas de diseño
607
+ "pen-tool",
608
+ "crop",
609
+ "layers",
610
+ "filter",
611
+ "sliders",
612
+ "aperture",
613
+ "crop-outline",
614
+ "filter-outline",
615
+ "color-fill-outline",
616
+ "color-filter-outline",
617
+ "color-palette-outline",
618
+ "color-wand-outline",
619
+ "brush-outline",
620
+ // Edición
621
+ "edit",
622
+ "edit-2",
623
+ "edit-3",
624
+ "copy",
625
+ "trash",
626
+ "move",
627
+ "create-outline",
628
+ "pencil-outline",
629
+ "move-outline",
630
+ "resize-outline",
631
+ "duplicate-outline",
632
+ // Navegación UI
633
+ "more-horizontal",
634
+ "more-vertical",
635
+ "maximize",
636
+ "minimize",
637
+ "zoom-in",
638
+ "zoom-out",
639
+ "eye",
640
+ "eye-off",
641
+ "eye-outline",
642
+ "eye-off-outline",
643
+ "ellipsis-horizontal-circle-outline",
644
+ "ellipsis-vertical-circle-outline"
645
+ ]
646
+ },
647
+ // ─── Nature ──────────────────────────────────────────────────────────────────
648
+ {
649
+ name: "nature",
650
+ label: "Nature",
651
+ labelEs: "Naturaleza",
652
+ categoryIcon: "sunny-outline",
653
+ icons: [
654
+ // Sol, luna y estrellas
655
+ "sunny-outline",
656
+ "moon-outline",
657
+ "star-outline",
658
+ "star-half-outline",
659
+ "partly-sunny-outline",
660
+ "sun",
661
+ "moon",
662
+ "sunrise",
663
+ "sunset",
664
+ // Clima
665
+ "rainy-outline",
666
+ "thunderstorm-outline",
667
+ "snow-outline",
668
+ "cloudy-outline",
669
+ "cloudy-night-outline",
670
+ "cloud-outline",
671
+ "cloud-done-outline",
672
+ "cloud-download-outline",
673
+ "cloud-upload-outline",
674
+ "cloud-offline-outline",
675
+ "cloud-circle-outline",
676
+ "cloud",
677
+ "cloud-drizzle",
678
+ "cloud-lightning",
679
+ "cloud-rain",
680
+ "cloud-snow",
681
+ "cloud-off",
682
+ "umbrella-outline",
683
+ "thermometer-outline",
684
+ "droplet",
685
+ "wind",
686
+ // Agua y fuego
687
+ "water-outline",
688
+ "flame-outline",
689
+ "bonfire-outline",
690
+ "eyedrop-outline",
691
+ // Flora y fauna
692
+ "leaf-outline",
693
+ "flower-outline",
694
+ "bug-outline",
695
+ "fish-outline",
696
+ "paw-outline",
697
+ // Outdoor
698
+ "binoculars-outline",
699
+ "telescope-outline",
700
+ "compass-outline",
701
+ "map-outline",
702
+ "location-outline",
703
+ "flag-outline",
704
+ "trail-sign-outline",
705
+ "earth-outline",
706
+ "globe-outline",
707
+ "planet-outline",
708
+ "compass",
709
+ "map",
710
+ "map-pin",
711
+ "flag",
712
+ "navigation",
713
+ "navigation-2",
714
+ "target",
715
+ "crosshair",
716
+ "life-buoy"
717
+ ]
718
+ },
719
+ // ─── Brands ──────────────────────────────────────────────────────────────────
720
+ {
721
+ name: "brands",
722
+ label: "Brands",
723
+ labelEs: "Marcas",
724
+ categoryIcon: "globe",
725
+ icons: [
726
+ // Feather brand icons — outlined, consistent with the rest of the library
727
+ "github",
728
+ "gitlab",
729
+ "codepen",
730
+ "codesandbox",
731
+ "twitter",
732
+ "facebook",
733
+ "instagram",
734
+ "linkedin",
735
+ "youtube",
736
+ "dribbble",
737
+ "twitch",
738
+ "slack",
739
+ "figma",
740
+ "framer",
741
+ "chrome",
742
+ "rss",
743
+ // Filled / flat brand logos (FA5 brands) — kept in a second
744
+ // visual tier. Rendered as the brand's official silhouette.
745
+ // Visually consistent (all flat single-color) but heavier than the
746
+ // Feather outlined set above. Use these only when an outlined Feather
747
+ // version of the brand doesn't exist.
748
+ "reddit",
749
+ "tiktok",
750
+ "pinterest",
751
+ "whatsapp",
752
+ "discord",
753
+ "snapchat",
754
+ "telegram",
755
+ "viber",
756
+ "line",
757
+ "vimeo",
758
+ "tumblr",
759
+ "behance",
760
+ "medium",
761
+ "soundcloud",
762
+ "google",
763
+ "apple",
764
+ "android",
765
+ "windows",
766
+ "linux",
767
+ "amazon",
768
+ "paypal",
769
+ "stripe",
770
+ "shopify",
771
+ "dropbox",
772
+ "spotify",
773
+ "steam",
774
+ "atlassian",
775
+ "jira",
776
+ "confluence",
777
+ "bitbucket",
778
+ "jenkins",
779
+ "docker",
780
+ "aws",
781
+ "node",
782
+ "react",
783
+ "angular",
784
+ "wordpress",
785
+ "drupal",
786
+ "joomla",
787
+ "squarespace",
788
+ "wix",
789
+ "magento",
790
+ "terminal",
791
+ "pen-tool"
792
+ ]
793
+ }
794
+ ];
795
+ var ALL_CURATED_ICONS = [
796
+ ...new Set(CURATED_ICONS.flatMap((c) => c.icons))
797
+ ];
798
+
799
+ // src/components/IconPicker/IconPicker.tsx
800
+ var NUM_COLUMNS = 6;
801
+ var GAP = 6;
802
+ var TRIGGER_SIZE = s(56);
803
+ var SCREEN_HEIGHT = Dimensions.get("window").height;
804
+ function IconCell({ name, selected, size, onPress }) {
805
+ const { colors } = useTheme();
806
+ const handlePress = () => {
807
+ selectionAsync();
808
+ onPress();
809
+ };
810
+ const iconColor = selected ? colors.primaryForeground : colors.foreground;
811
+ const bg = selected ? colors.primary : "transparent";
812
+ return /* @__PURE__ */ React.createElement(
813
+ TouchableOpacity,
814
+ {
815
+ onPress: handlePress,
816
+ activeOpacity: 0.6,
817
+ touchSoundDisabled: true,
818
+ accessibilityRole: "button",
819
+ accessibilityState: { selected },
820
+ accessibilityLabel: name,
821
+ style: [styles.cell, { width: size, height: size, backgroundColor: bg }]
822
+ },
823
+ renderIcon(name, ms(20), iconColor)
824
+ );
825
+ }
826
+ var IconCellMemo = React.memo(IconCell);
827
+ function IconPicker({
828
+ value,
829
+ onChange,
830
+ label,
831
+ error,
832
+ hint,
833
+ disabled = false,
834
+ numColumns = NUM_COLUMNS,
835
+ gap = GAP,
836
+ style
837
+ }) {
838
+ const { colors } = useTheme();
839
+ const insets = useSafeAreaInsets();
840
+ const sheetRef = useRef(null);
841
+ const catScrollRef = useRef(null);
842
+ const [activeCategory, setActiveCategory] = useState(null);
843
+ const [containerWidth, setContainerWidth] = useState(() => Dimensions.get("window").width - s(16) * 2);
844
+ const [ready, setReady] = useState(false);
845
+ const sheetName = useId();
846
+ const activeIcons = useMemo(() => {
847
+ if (activeCategory) {
848
+ return CURATED_ICONS.find((c) => c.name === activeCategory)?.icons ?? ALL_CURATED_ICONS;
849
+ }
850
+ return ALL_CURATED_ICONS;
851
+ }, [activeCategory]);
852
+ const gapPx = s(gap);
853
+ const cellSize = containerWidth > 0 ? Math.floor((containerWidth - gapPx * (numColumns - 1)) / numColumns) : 0;
854
+ const rows = useMemo(() => {
855
+ const result = [];
856
+ for (let i = 0; i < activeIcons.length; i += numColumns) {
857
+ result.push(activeIcons.slice(i, i + numColumns));
858
+ }
859
+ return result;
860
+ }, [activeIcons, numColumns]);
861
+ const handleDismiss = useCallback(() => {
862
+ setActiveCategory(null);
863
+ setReady(false);
864
+ }, []);
865
+ const handleSelect = useCallback(
866
+ (iconName) => {
867
+ onChange(iconName);
868
+ },
869
+ [onChange]
870
+ );
871
+ const handleOpen = useCallback(() => {
872
+ if (disabled) return;
873
+ impactMedium();
874
+ setActiveCategory(null);
875
+ setReady(false);
876
+ sheetRef.current?.present();
877
+ }, [disabled]);
878
+ const renderBackdrop = useCallback(
879
+ (props) => /* @__PURE__ */ React.createElement(BottomSheetBackdrop, { ...props, disappearsOnIndex: -1, appearsOnIndex: 0, pressBehavior: "close" }),
880
+ []
881
+ );
882
+ const selectedIcon = value ? renderIcon(value, ms(28), colors.foreground) : null;
883
+ return /* @__PURE__ */ React.createElement(View, { style: [styles.triggerContainer, style] }, label ? /* @__PURE__ */ React.createElement(Text, { style: [styles.triggerLabel, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React.createElement(
884
+ TouchableOpacity,
885
+ {
886
+ onPress: handleOpen,
887
+ disabled,
888
+ activeOpacity: 0.7,
889
+ touchSoundDisabled: true,
890
+ accessibilityRole: "button",
891
+ accessibilityLabel: label ?? "Seleccionar icono",
892
+ accessibilityState: { disabled },
893
+ style: [
894
+ styles.trigger,
895
+ {
896
+ backgroundColor: disabled ? colors.surface : colors.background,
897
+ width: TRIGGER_SIZE,
898
+ height: TRIGGER_SIZE,
899
+ borderColor: error ? colors.destructive : value ? colors.primary : colors.border
900
+ },
901
+ disabled && styles.triggerDisabled
902
+ ]
903
+ },
904
+ selectedIcon ?? renderIcon("plus", ms(24), colors.foregroundMuted)
905
+ ), error ? /* @__PURE__ */ React.createElement(
906
+ Text,
907
+ {
908
+ style: [styles.helperText, { color: colors.destructive }],
909
+ allowFontScaling: true,
910
+ accessibilityLiveRegion: "polite"
911
+ },
912
+ error
913
+ ) : null, !error && hint ? /* @__PURE__ */ React.createElement(Text, { style: [styles.helperText, { color: colors.foregroundMuted }], allowFontScaling: true }, hint) : null, /* @__PURE__ */ React.createElement(
914
+ BottomSheetModal,
915
+ {
916
+ ref: sheetRef,
917
+ name: sheetName,
918
+ onDismiss: handleDismiss,
919
+ enableDynamicSizing: true,
920
+ maxDynamicContentSize: SCREEN_HEIGHT * 0.7,
921
+ backdropComponent: renderBackdrop,
922
+ backgroundStyle: { ...styles.sheetBackground, backgroundColor: colors.card },
923
+ handleIndicatorStyle: { ...styles.handle, backgroundColor: colors.border },
924
+ enablePanDownToClose: true,
925
+ topInset: insets.top,
926
+ android_keyboardInputMode: "adjustPan"
927
+ },
928
+ /* @__PURE__ */ React.createElement(
929
+ BottomSheetScrollView,
930
+ {
931
+ contentContainerStyle: styles.sheetContent,
932
+ showsVerticalScrollIndicator: true
933
+ },
934
+ /* @__PURE__ */ React.createElement(
935
+ View,
936
+ {
937
+ style: styles.gridContainer,
938
+ onLayout: (e) => {
939
+ setContainerWidth(e.nativeEvent.layout.width);
940
+ setReady(true);
941
+ }
942
+ },
943
+ !ready ? /* @__PURE__ */ React.createElement(View, { style: styles.loader }, /* @__PURE__ */ React.createElement(Spinner, { size: "md", color: colors.primary, label: "Cargando iconos..." })) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { style: [styles.sectionLabel, { color: colors.foregroundSubtle }], allowFontScaling: true }, "Categor\xEDas"), /* @__PURE__ */ React.createElement(
944
+ ScrollView,
945
+ {
946
+ ref: catScrollRef,
947
+ horizontal: true,
948
+ showsHorizontalScrollIndicator: false,
949
+ contentContainerStyle: styles.categoryStrip,
950
+ style: styles.categoryScroll
951
+ },
952
+ /* @__PURE__ */ React.createElement(
953
+ TouchableOpacity,
954
+ {
955
+ onPress: () => setActiveCategory(null),
956
+ activeOpacity: 0.7,
957
+ touchSoundDisabled: true,
958
+ accessibilityRole: "button",
959
+ accessibilityLabel: "Todos",
960
+ accessibilityState: { selected: activeCategory === null },
961
+ style: [
962
+ styles.categoryChip,
963
+ {
964
+ backgroundColor: activeCategory === null ? colors.primary : colors.surface,
965
+ borderColor: activeCategory === null ? colors.primary : colors.border
966
+ }
967
+ ]
968
+ },
969
+ /* @__PURE__ */ React.createElement(View, { style: styles.categoryChipInner }, renderIcon("grid", ms(14), activeCategory === null ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React.createElement(
970
+ Text,
971
+ {
972
+ style: [
973
+ styles.categoryChipText,
974
+ { color: activeCategory === null ? colors.primaryForeground : colors.foreground }
975
+ ],
976
+ allowFontScaling: true,
977
+ numberOfLines: 1
978
+ },
979
+ "Todos"
980
+ ))
981
+ ),
982
+ CURATED_ICONS.map((cat) => /* @__PURE__ */ React.createElement(
983
+ TouchableOpacity,
984
+ {
985
+ key: cat.name,
986
+ onPress: () => setActiveCategory(cat.name),
987
+ activeOpacity: 0.7,
988
+ touchSoundDisabled: true,
989
+ accessibilityRole: "button",
990
+ accessibilityLabel: cat.labelEs,
991
+ accessibilityState: { selected: activeCategory === cat.name },
992
+ style: [
993
+ styles.categoryChip,
994
+ {
995
+ backgroundColor: activeCategory === cat.name ? colors.primary : colors.surface,
996
+ borderColor: activeCategory === cat.name ? colors.primary : colors.border
997
+ }
998
+ ]
999
+ },
1000
+ /* @__PURE__ */ React.createElement(View, { style: styles.categoryChipInner }, renderIcon(cat.categoryIcon, ms(14), activeCategory === cat.name ? colors.primaryForeground : colors.foregroundSubtle), /* @__PURE__ */ React.createElement(
1001
+ Text,
1002
+ {
1003
+ style: [
1004
+ styles.categoryChipText,
1005
+ { color: activeCategory === cat.name ? colors.primaryForeground : colors.foreground }
1006
+ ],
1007
+ allowFontScaling: true,
1008
+ numberOfLines: 1
1009
+ },
1010
+ cat.labelEs
1011
+ ))
1012
+ ))
1013
+ ), /* @__PURE__ */ React.createElement(View, { style: [styles.separator, { backgroundColor: colors.border }] }), cellSize > 0 ? rows.map((row, i) => /* @__PURE__ */ React.createElement(View, { key: row[0] ?? `row-${i}`, style: [styles.row, { marginBottom: gapPx }] }, row.map((name) => /* @__PURE__ */ React.createElement(
1014
+ IconCellMemo,
1015
+ {
1016
+ key: name,
1017
+ name,
1018
+ selected: value === name,
1019
+ size: cellSize,
1020
+ onPress: () => {
1021
+ handleSelect(name);
1022
+ sheetRef.current?.dismiss();
1023
+ }
1024
+ }
1025
+ )), Array.from({ length: numColumns - row.length }).map((_, j) => /* @__PURE__ */ React.createElement(View, { key: `spacer-${j}`, style: { width: cellSize, height: cellSize } })))) : null)
1026
+ )
1027
+ )
1028
+ ));
1029
+ }
1030
+ var styles = StyleSheet.create({
1031
+ triggerContainer: {
1032
+ gap: vs(8)
1033
+ },
1034
+ triggerLabel: {
1035
+ fontFamily: "Sohne-Medium",
1036
+ fontSize: ms(14)
1037
+ },
1038
+ trigger: {
1039
+ borderRadius: RADIUS.md,
1040
+ borderWidth: 1,
1041
+ alignItems: "center",
1042
+ justifyContent: "center"
1043
+ },
1044
+ triggerDisabled: {
1045
+ opacity: 0.6
1046
+ },
1047
+ helperText: {
1048
+ fontFamily: "Sohne-Regular",
1049
+ fontSize: ms(13)
1050
+ },
1051
+ sheetBackground: {
1052
+ borderTopLeftRadius: ms(16),
1053
+ borderTopRightRadius: ms(16)
1054
+ },
1055
+ handle: {
1056
+ width: s(36),
1057
+ height: vs(4),
1058
+ borderRadius: ms(2)
1059
+ },
1060
+ sheetContent: {
1061
+ paddingHorizontal: s(16),
1062
+ paddingBottom: vs(24)
1063
+ },
1064
+ sectionLabel: {
1065
+ fontFamily: "Sohne-Medium",
1066
+ fontSize: ms(12),
1067
+ marginBottom: vs(8),
1068
+ textTransform: "uppercase",
1069
+ letterSpacing: 0.5
1070
+ },
1071
+ categoryScroll: {
1072
+ flexGrow: 0,
1073
+ flexShrink: 0
1074
+ },
1075
+ categoryStrip: {
1076
+ gap: s(8)
1077
+ },
1078
+ categoryChip: {
1079
+ borderRadius: RADIUS.full,
1080
+ borderWidth: 1,
1081
+ paddingVertical: vs(6),
1082
+ paddingHorizontal: s(12)
1083
+ },
1084
+ categoryChipInner: {
1085
+ flexDirection: "row",
1086
+ alignItems: "center",
1087
+ gap: s(6)
1088
+ },
1089
+ categoryChipText: {
1090
+ fontFamily: "Sohne-Medium",
1091
+ fontSize: ms(12)
1092
+ },
1093
+ separator: {
1094
+ height: StyleSheet.hairlineWidth,
1095
+ marginVertical: vs(12)
1096
+ },
1097
+ gridContainer: {},
1098
+ row: {
1099
+ flexDirection: "row",
1100
+ gap: GAP
1101
+ },
1102
+ cell: {
1103
+ borderRadius: RADIUS.md,
1104
+ alignItems: "center",
1105
+ justifyContent: "center"
1106
+ },
1107
+ loader: {
1108
+ minHeight: vs(200),
1109
+ alignItems: "center",
1110
+ justifyContent: "center"
1111
+ }
1112
+ });
1113
+
1114
+ export { IconPicker };