@retray-dev/ui-kit 10.1.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 (192) hide show
  1. package/COMPONENTS.md +419 -38
  2. package/README.md +14 -5
  3. package/dist/Accordion.js +1 -1
  4. package/dist/Accordion.mjs +3 -3
  5. package/dist/AlertBanner.js +1 -1
  6. package/dist/AlertBanner.mjs +3 -3
  7. package/dist/AppHeader.js +1 -1
  8. package/dist/AppHeader.mjs +4 -4
  9. package/dist/Avatar.mjs +2 -2
  10. package/dist/Badge.js +1 -1
  11. package/dist/Badge.mjs +3 -3
  12. package/dist/Button.js +1 -1
  13. package/dist/Button.mjs +3 -3
  14. package/dist/Card.mjs +2 -2
  15. package/dist/CategoryStrip.js +1 -1
  16. package/dist/CategoryStrip.mjs +3 -3
  17. package/dist/Checkbox.mjs +2 -2
  18. package/dist/Chip.js +1 -1
  19. package/dist/Chip.mjs +3 -3
  20. package/dist/ConfirmDialog.d.mts +1 -6
  21. package/dist/ConfirmDialog.d.ts +1 -6
  22. package/dist/ConfirmDialog.js +30 -24
  23. package/dist/ConfirmDialog.mjs +4 -4
  24. package/dist/CurrencyDisplay.mjs +2 -2
  25. package/dist/CurrencyInput.d.mts +3 -8
  26. package/dist/CurrencyInput.d.ts +3 -8
  27. package/dist/CurrencyInput.js +4 -2
  28. package/dist/CurrencyInput.mjs +4 -4
  29. package/dist/DetailRow.d.mts +1 -1
  30. package/dist/DetailRow.d.ts +1 -1
  31. package/dist/DetailRow.js +1 -1
  32. package/dist/DetailRow.mjs +3 -3
  33. package/dist/EmptyState.js +1 -1
  34. package/dist/EmptyState.mjs +4 -4
  35. package/dist/ErrorBoundary.js +1 -1
  36. package/dist/ErrorBoundary.mjs +3 -3
  37. package/dist/Form.mjs +2 -2
  38. package/dist/IconButton.js +1 -1
  39. package/dist/IconButton.mjs +3 -3
  40. package/dist/IconPicker.d.mts +17 -0
  41. package/dist/IconPicker.d.ts +17 -0
  42. package/dist/IconPicker.js +1424 -0
  43. package/dist/IconPicker.mjs +8 -0
  44. package/dist/ImageUpload.d.mts +3 -1
  45. package/dist/ImageUpload.d.ts +3 -1
  46. package/dist/ImageUpload.js +28 -10
  47. package/dist/ImageUpload.mjs +3 -3
  48. package/dist/ImageViewer.js +1 -1
  49. package/dist/ImageViewer.mjs +5 -5
  50. package/dist/Input.js +1 -1
  51. package/dist/Input.mjs +3 -3
  52. package/dist/LabelValue.js +1 -1
  53. package/dist/LabelValue.mjs +3 -3
  54. package/dist/ListGroup.mjs +2 -2
  55. package/dist/ListItem.d.mts +7 -7
  56. package/dist/ListItem.d.ts +7 -7
  57. package/dist/ListItem.js +13 -8
  58. package/dist/ListItem.mjs +3 -3
  59. package/dist/MediaCard.js +1 -1
  60. package/dist/MediaCard.mjs +3 -3
  61. package/dist/MenuGroup.mjs +2 -2
  62. package/dist/MenuItem.js +1 -1
  63. package/dist/MenuItem.mjs +3 -3
  64. package/dist/MonthPicker.mjs +2 -2
  65. package/dist/NumberStepper.d.mts +19 -0
  66. package/dist/NumberStepper.d.ts +19 -0
  67. package/dist/NumberStepper.js +410 -0
  68. package/dist/NumberStepper.mjs +9 -0
  69. package/dist/PagerDots.js +1 -1
  70. package/dist/PagerDots.mjs +3 -3
  71. package/dist/Pressable.d.mts +15 -7
  72. package/dist/Pressable.d.ts +15 -7
  73. package/dist/Pressable.js +7 -3
  74. package/dist/Pressable.mjs +1 -1
  75. package/dist/PricingCard.js +1 -1
  76. package/dist/PricingCard.mjs +5 -5
  77. package/dist/Progress.mjs +2 -2
  78. package/dist/RadioGroup.mjs +2 -2
  79. package/dist/RetrayProvider.mjs +3 -3
  80. package/dist/Select.mjs +2 -2
  81. package/dist/SelectableGrid.js +1 -1
  82. package/dist/SelectableGrid.mjs +3 -3
  83. package/dist/Separator.mjs +2 -2
  84. package/dist/Sheet.d.mts +4 -46
  85. package/dist/Sheet.d.ts +4 -46
  86. package/dist/Sheet.js +46 -114
  87. package/dist/Sheet.mjs +2 -3
  88. package/dist/SheetSelect.js +1 -1
  89. package/dist/SheetSelect.mjs +3 -3
  90. package/dist/Skeleton.mjs +2 -2
  91. package/dist/Slider.mjs +2 -2
  92. package/dist/Spinner.mjs +2 -2
  93. package/dist/Stats.d.mts +30 -0
  94. package/dist/Stats.d.ts +30 -0
  95. package/dist/Stats.js +429 -0
  96. package/dist/Stats.mjs +9 -0
  97. package/dist/Switch.mjs +2 -2
  98. package/dist/TabBar.js +1 -1
  99. package/dist/TabBar.mjs +3 -3
  100. package/dist/Tabs.mjs +2 -2
  101. package/dist/Text.d.mts +3 -1
  102. package/dist/Text.d.ts +3 -1
  103. package/dist/Text.js +3 -3
  104. package/dist/Text.mjs +2 -2
  105. package/dist/Textarea.js +1 -1
  106. package/dist/Textarea.mjs +3 -3
  107. package/dist/Toast.mjs +2 -2
  108. package/dist/Toggle.js +1 -1
  109. package/dist/Toggle.mjs +3 -3
  110. package/dist/{chunk-DJ7RN37L.mjs → chunk-265G6A46.mjs} +2 -2
  111. package/dist/{chunk-WOEYDUJZ.mjs → chunk-2A2LEFZG.mjs} +2 -2
  112. package/dist/{chunk-ID72TK46.mjs → chunk-2CBQKU7H.mjs} +1 -1
  113. package/dist/{chunk-OB4JUQ3O.mjs → chunk-2I2AYECM.mjs} +1 -1
  114. package/dist/{chunk-WJLKJMKR.mjs → chunk-357YO24D.mjs} +4 -4
  115. package/dist/{chunk-GQYFLP3D.mjs → chunk-3GEYJ7I5.mjs} +1 -1
  116. package/dist/{chunk-AV4EMIRH.mjs → chunk-3N2M3WZL.mjs} +1 -1
  117. package/dist/{chunk-TERDKCLE.mjs → chunk-3UYAZ7I4.mjs} +2 -2
  118. package/dist/{chunk-JMOZEC77.mjs → chunk-4WFMPFZB.mjs} +1 -1
  119. package/dist/chunk-5OLNXP3S.mjs +144 -0
  120. package/dist/{chunk-6OAZJ577.mjs → chunk-7HSILTC4.mjs} +3 -3
  121. package/dist/{chunk-IRRY3CRZ.mjs → chunk-AKM4EPOT.mjs} +1 -1
  122. package/dist/{chunk-VGTDN7SW.mjs → chunk-AQEVCEXV.mjs} +2 -2
  123. package/dist/{chunk-WBOOUHSS.mjs → chunk-BCWEHE34.mjs} +1 -1
  124. package/dist/{chunk-AJ7ZDNBT.mjs → chunk-BOVUP27T.mjs} +1 -1
  125. package/dist/{chunk-BRKYVJVV.mjs → chunk-BQZE3HAW.mjs} +1 -1
  126. package/dist/{chunk-MLF3EZFW.mjs → chunk-D3Y2T42P.mjs} +2 -2
  127. package/dist/{chunk-3U4SSNWP.mjs → chunk-DF6DU42P.mjs} +2 -2
  128. package/dist/{chunk-ZJKGQMYH.mjs → chunk-DI7CBDL6.mjs} +2 -2
  129. package/dist/{chunk-2TFTAWVJ.mjs → chunk-DOGIPOF5.mjs} +2 -2
  130. package/dist/{chunk-MBMXYJJV.mjs → chunk-E7NEHHXV.mjs} +7 -3
  131. package/dist/{chunk-MX6HRKMI.mjs → chunk-EFLFRAHD.mjs} +1 -1
  132. package/dist/{chunk-SOYNZDVY.mjs → chunk-EMUWGDWC.mjs} +6 -1
  133. package/dist/{chunk-4I7D47FH.mjs → chunk-F4V6XLP4.mjs} +4 -4
  134. package/dist/{chunk-UREA2GYY.mjs → chunk-FA2KMTH5.mjs} +2 -2
  135. package/dist/{chunk-Y2NS74WS.mjs → chunk-FFTYLPSB.mjs} +46 -98
  136. package/dist/{chunk-OHBNABL5.mjs → chunk-FUVYSVGR.mjs} +14 -9
  137. package/dist/{chunk-KIHCWCWL.mjs → chunk-FVTVCJAH.mjs} +2 -2
  138. package/dist/{chunk-Y4GL2MHX.mjs → chunk-GK4VRMNE.mjs} +30 -12
  139. package/dist/{chunk-6Q64UFIA.mjs → chunk-HJ46DTJE.mjs} +1 -1
  140. package/dist/{chunk-WF2XDFRK.mjs → chunk-HLMPMUK2.mjs} +1 -1
  141. package/dist/{chunk-GD6KXMG5.mjs → chunk-I4V5XZPS.mjs} +1 -1
  142. package/dist/{chunk-AZJF2BLK.mjs → chunk-ISY26JQJ.mjs} +2 -2
  143. package/dist/{chunk-X4G6APW6.mjs → chunk-J6Q2YJEV.mjs} +1 -1
  144. package/dist/{chunk-KZL5VTYK.mjs → chunk-JCZQOY4O.mjs} +31 -24
  145. package/dist/{chunk-CZCQZHG6.mjs → chunk-JNVAIDLK.mjs} +2 -2
  146. package/dist/{chunk-SOA2Z4RB.mjs → chunk-JULSIZDM.mjs} +1 -1
  147. package/dist/{chunk-T7XZ7H7Y.mjs → chunk-KA7LTET3.mjs} +17 -3
  148. package/dist/chunk-KHYX4IOM.mjs +1114 -0
  149. package/dist/{chunk-LXJIIOYQ.mjs → chunk-LRM4AVYY.mjs} +2 -2
  150. package/dist/{chunk-VQ57HWPL.mjs → chunk-MYZ2EDYU.mjs} +2 -2
  151. package/dist/chunk-N4ZPVCJH.mjs +126 -0
  152. package/dist/{chunk-NA7PARID.mjs → chunk-NXI4YDZ2.mjs} +2 -2
  153. package/dist/{chunk-4K625MVM.mjs → chunk-OULVKTWL.mjs} +2 -2
  154. package/dist/{chunk-A4MDAP7G.mjs → chunk-P64WHW4A.mjs} +2 -2
  155. package/dist/{chunk-URI2WBIV.mjs → chunk-P73V2EKS.mjs} +2 -2
  156. package/dist/{chunk-ZUR7AU5R.mjs → chunk-PGERH3P7.mjs} +2 -2
  157. package/dist/{chunk-2UYENBLV.mjs → chunk-QSFV2P7O.mjs} +1 -1
  158. package/dist/{chunk-JT7HKXRB.mjs → chunk-S3KJCPEJ.mjs} +1 -1
  159. package/dist/{chunk-6MKGPAR2.mjs → chunk-V6NFJXKO.mjs} +2 -2
  160. package/dist/{chunk-A3A6KNQN.mjs → chunk-WOEWGSTU.mjs} +1 -1
  161. package/dist/{chunk-JUXSWN54.mjs → chunk-X26S5EVZ.mjs} +4 -2
  162. package/dist/{chunk-YFZ3ELX5.mjs → chunk-XBAGGKLW.mjs} +2 -2
  163. package/dist/{chunk-JB67UOB5.mjs → chunk-ZHMSAYLT.mjs} +2 -2
  164. package/dist/fonts.d.mts +1 -7
  165. package/dist/fonts.d.ts +1 -7
  166. package/dist/fonts.js +0 -2
  167. package/dist/fonts.mjs +1 -2
  168. package/dist/index.d.mts +7 -1
  169. package/dist/index.d.ts +7 -1
  170. package/dist/index.js +1831 -475
  171. package/dist/index.mjs +54 -51
  172. package/package.json +3 -3
  173. package/src/components/ConfirmDialog/ConfirmDialog.tsx +39 -30
  174. package/src/components/CurrencyInput/CurrencyInput.tsx +4 -7
  175. package/src/components/DetailRow/DetailRow.tsx +1 -1
  176. package/src/components/IconPicker/IconPicker.tsx +395 -0
  177. package/src/components/IconPicker/index.ts +1 -0
  178. package/src/components/ImageUpload/ImageUpload.tsx +34 -12
  179. package/src/components/ListItem/ListItem.tsx +43 -28
  180. package/src/components/NumberStepper/NumberStepper.tsx +147 -0
  181. package/src/components/NumberStepper/index.ts +1 -0
  182. package/src/components/Pressable/Pressable.tsx +20 -8
  183. package/src/components/Sheet/Sheet.tsx +64 -172
  184. package/src/components/Stats/Stats.tsx +226 -0
  185. package/src/components/Stats/index.ts +2 -0
  186. package/src/components/Text/Text.tsx +4 -2
  187. package/src/fonts.ts +0 -7
  188. package/src/index.ts +7 -1
  189. package/src/theme/colorUtils.ts +9 -0
  190. package/src/utils/curatedIcons.ts +849 -0
  191. package/src/utils/fontGuard.ts +2 -1
  192. package/src/utils/icons.ts +20 -2
@@ -0,0 +1,849 @@
1
+ /**
2
+ * Curated icon set — 12 categories, themed icons, all outlined style.
3
+ * Ordered by usage probability: most-common categories first, niche last.
4
+ *
5
+ * All names resolve across 6 @expo/vector-icons families via renderIcon().
6
+ * Priority (lowest→highest): Ionicons → MaterialIcons → FontAwesome5 → Entypo → AntDesign → Feather.
7
+ * Feather is the highest priority — any name it has wins over all other families.
8
+ *
9
+ * ICON FAMILY RULES (strict):
10
+ * - Feather (stroke-outlined, always safe) — first choice for utility icons. ✅
11
+ * - Ionicons `-outline` suffix for domain-specific icons (food, sports, nature). ✅
12
+ * These names don't exist in any higher-priority family, so they resolve
13
+ * cleanly to Ionicons outline style — no collisions, no filled rendering.
14
+ * - FontAwesome5 brand glyphs (github, twitter, etc.) — consistent flat brand
15
+ * logos in the Brands category. They render as the official brand silhouette
16
+ * and are visually consistent across all brands.
17
+ * - AntDesign (filled) ❌ NEVER — renders filled.
18
+ * - Entypo (filled) ❌ NEVER — renders filled.
19
+ * - MaterialIcons (filled) ❌ NEVER — renders filled.
20
+ * - Ionicons base (filled) ❌ NEVER — always use the `-outline` variant.
21
+ * - FA5 regular/solid substyles (filled) ❌ NEVER.
22
+ *
23
+ * THEMATIC RULE (strict):
24
+ * - Every icon must be directly relevant to its category. No generic
25
+ * filler. Contextual relevance is allowed (e.g. truck/map-pin in Food
26
+ * for delivery/location), but icons that fit in any category (phone,
27
+ * mail, bell, search, etc.) are NOT used as filler — they belong in
28
+ * the appropriate category (Communication / Status / Actions).
29
+ * - No duplicate concepts per category (don't list both `arrow-up` and
30
+ * `arrow-up-outline` — pick the best outlined version once).
31
+ *
32
+ * Verify: check glyphMaps in node_modules/@expo/vector-icons/build/vendor/
33
+ * react-native-vector-icons/glyphmaps/
34
+ * - Feather.json, Ionicons.json, FA5Free.json, FA5Free_meta.json
35
+ */
36
+
37
+ export interface IconCategory {
38
+ name: string
39
+ label: string
40
+ labelEs: string
41
+ categoryIcon: string
42
+ icons: string[]
43
+ }
44
+
45
+ export const CURATED_ICONS: IconCategory[] = [
46
+ // ─── Food ────────────────────────────────────────────────────────────────────
47
+ {
48
+ name: 'food',
49
+ label: 'Food',
50
+ labelEs: 'Comida',
51
+ categoryIcon: 'coffee',
52
+ icons: [
53
+ // Bebidas
54
+ 'beer-outline',
55
+ 'wine-outline',
56
+ 'cafe-outline',
57
+ 'water-outline',
58
+ 'coffee',
59
+ // Comida
60
+ 'pizza-outline',
61
+ 'fast-food-outline',
62
+ 'fish-outline',
63
+ 'ice-cream-outline',
64
+ 'egg-outline',
65
+ 'nutrition-outline',
66
+ // Servicio y operación
67
+ 'restaurant-outline',
68
+ 'server-outline',
69
+ 'menu-outline',
70
+ 'basket-outline',
71
+ 'receipt-outline',
72
+ 'pricetag-outline',
73
+ 'pricetags-outline',
74
+ 'reorder-four-outline',
75
+ 'reorder-three-outline',
76
+ 'cart-outline',
77
+ 'cash-outline',
78
+ 'wallet-outline',
79
+ 'storefront-outline',
80
+ // Delivery / pedidos
81
+ 'truck',
82
+ 'package',
83
+ 'shopping-bag',
84
+ 'shopping-cart',
85
+ // Ubicación y reserva
86
+ 'map-pin',
87
+ 'home',
88
+ 'calendar',
89
+ 'clock',
90
+ // Experiencia
91
+ 'star',
92
+ 'heart',
93
+ 'bookmark',
94
+ 'thumbs-up',
95
+ 'check',
96
+ 'gift',
97
+ ],
98
+ },
99
+
100
+ // ─── Sports ──────────────────────────────────────────────────────────────────
101
+ {
102
+ name: 'sports',
103
+ label: 'Sports',
104
+ labelEs: 'Deportes',
105
+ categoryIcon: 'trophy-outline',
106
+ icons: [
107
+ // Deportes
108
+ 'american-football-outline',
109
+ 'baseball-outline',
110
+ 'basketball-outline',
111
+ 'bicycle-outline',
112
+ 'football-outline',
113
+ 'tennisball-outline',
114
+ 'golf-outline',
115
+ 'fitness-outline',
116
+ 'car-sport-outline',
117
+ 'game-controller-outline',
118
+ // Competición y logros
119
+ 'trophy-outline',
120
+ 'medal-outline',
121
+ 'award',
122
+ 'target',
123
+ 'flag',
124
+ 'crosshair',
125
+ // Outdoor
126
+ 'compass-outline',
127
+ 'map-outline',
128
+ 'trail-sign-outline',
129
+ 'bonfire-outline',
130
+ 'snow-outline',
131
+ 'flame-outline',
132
+ 'sun',
133
+ 'droplet',
134
+ 'wind',
135
+ 'map',
136
+ 'map-pin',
137
+ 'navigation',
138
+ 'navigation-2',
139
+ // Rendimiento y métricas
140
+ 'stats-chart-outline',
141
+ 'trending-up-outline',
142
+ 'trending-down-outline',
143
+ 'bar-chart-outline',
144
+ 'pie-chart-outline',
145
+ 'analytics-outline',
146
+ 'activity',
147
+ 'zap',
148
+ 'watch',
149
+ 'trending-up',
150
+ 'trending-down',
151
+ 'bar-chart-2',
152
+ 'clock',
153
+ 'calendar',
154
+ ],
155
+ },
156
+
157
+ // ─── Business ────────────────────────────────────────────────────────────────
158
+ {
159
+ name: 'business',
160
+ label: 'Business',
161
+ labelEs: 'Negocios',
162
+ categoryIcon: 'briefcase',
163
+ icons: [
164
+ // Empresa
165
+ 'briefcase',
166
+ 'users',
167
+ 'user',
168
+ 'user-plus',
169
+ 'user-check',
170
+ 'user-x',
171
+ 'briefcase-outline',
172
+ 'business-outline',
173
+ 'id-card-outline',
174
+ // Comercio y operación
175
+ 'shopping-cart',
176
+ 'shopping-bag',
177
+ 'credit-card',
178
+ 'dollar-sign',
179
+ 'percent',
180
+ 'tag',
181
+ 'gift',
182
+ 'cart-outline',
183
+ 'cash-outline',
184
+ 'wallet-outline',
185
+ 'storefront-outline',
186
+ 'pricetag-outline',
187
+ 'pricetags-outline',
188
+ 'receipt-outline',
189
+ 'card-outline',
190
+ // Logística
191
+ 'truck',
192
+ 'package',
193
+ // Documentos
194
+ 'file',
195
+ 'file-text',
196
+ 'file-plus',
197
+ 'folder',
198
+ 'paperclip',
199
+ 'document-outline',
200
+ 'document-text-outline',
201
+ 'documents-outline',
202
+ 'folder-outline',
203
+ // Comunicación de negocio
204
+ 'mail',
205
+ 'phone',
206
+ 'phone-call',
207
+ 'send',
208
+ 'message-square',
209
+ 'mail-outline',
210
+ // Análisis
211
+ 'bar-chart',
212
+ 'bar-chart-2',
213
+ 'pie-chart',
214
+ 'trending-up',
215
+ 'trending-down',
216
+ 'activity',
217
+ 'globe',
218
+ ],
219
+ },
220
+
221
+ // ─── Objects ─────────────────────────────────────────────────────────────────
222
+ {
223
+ name: 'objects',
224
+ label: 'Objects',
225
+ labelEs: 'Objetos',
226
+ categoryIcon: 'package',
227
+ icons: [
228
+ // Archivos y carpetas
229
+ 'file',
230
+ 'file-text',
231
+ 'file-plus',
232
+ 'file-minus',
233
+ 'folder',
234
+ 'folder-plus',
235
+ 'folder-minus',
236
+ 'archive',
237
+ 'save',
238
+ 'paperclip',
239
+ 'document-outline',
240
+ 'document-text-outline',
241
+ 'documents-outline',
242
+ 'folder-outline',
243
+ 'folder-open-outline',
244
+ 'file-tray-outline',
245
+ 'file-tray-full-outline',
246
+ 'file-tray-stacked-outline',
247
+ 'archive-outline',
248
+ 'save-outline',
249
+ // Seguridad
250
+ 'lock',
251
+ 'unlock',
252
+ 'key',
253
+ 'shield',
254
+ 'shield-off',
255
+ 'lock-closed-outline',
256
+ 'lock-open-outline',
257
+ 'key-outline',
258
+ 'shield-outline',
259
+ 'shield-checkmark-outline',
260
+ // Dispositivos
261
+ 'monitor',
262
+ 'tablet',
263
+ 'smartphone',
264
+ 'tv',
265
+ 'server',
266
+ 'database',
267
+ 'hard-drive',
268
+ 'cpu',
269
+ 'radio',
270
+ 'laptop-outline',
271
+ 'phone-portrait-outline',
272
+ 'phone-landscape-outline',
273
+ 'tablet-landscape-outline',
274
+ 'tablet-portrait-outline',
275
+ 'tv-outline',
276
+ 'server-outline',
277
+ 'hardware-chip-outline',
278
+ 'watch-outline',
279
+ ],
280
+ },
281
+
282
+ // ─── Status ──────────────────────────────────────────────────────────────────
283
+ {
284
+ name: 'status',
285
+ label: 'Status',
286
+ labelEs: 'Estado',
287
+ categoryIcon: 'alert-circle',
288
+ icons: [
289
+ // Alertas
290
+ 'alert-circle',
291
+ 'alert-triangle',
292
+ 'alert-octagon',
293
+ 'info',
294
+ 'help-circle',
295
+ 'alert-circle-outline',
296
+ 'alert-outline',
297
+ 'information-circle-outline',
298
+ 'help-circle-outline',
299
+ // Notificaciones
300
+ 'bell',
301
+ 'bell-off',
302
+ 'notifications-outline',
303
+ 'notifications-off-outline',
304
+ 'notifications-circle-outline',
305
+ // Visibilidad
306
+ 'eye',
307
+ 'eye-off',
308
+ 'eye-outline',
309
+ 'eye-off-outline',
310
+ // Indicadores
311
+ 'flag',
312
+ 'zap',
313
+ 'zap-off',
314
+ 'loader',
315
+ 'activity',
316
+ 'flash-outline',
317
+ 'bulb-outline',
318
+ // Éxito / error / advertencia
319
+ 'check',
320
+ 'check-circle',
321
+ 'x',
322
+ 'x-circle',
323
+ 'x-octagon',
324
+ 'slash',
325
+ 'plus-circle',
326
+ 'minus-circle',
327
+ 'checkmark-circle-outline',
328
+ 'checkmark-done-circle-outline',
329
+ 'close-circle-outline',
330
+ 'add-circle-outline',
331
+ 'remove-circle-outline',
332
+ // Estados de proceso
333
+ 'play-circle',
334
+ 'pause-circle',
335
+ 'stop-circle',
336
+ 'play-circle-outline',
337
+ 'pause-circle-outline',
338
+ 'stop-circle-outline',
339
+ ],
340
+ },
341
+
342
+ // ─── Actions ─────────────────────────────────────────────────────────────────
343
+ {
344
+ name: 'actions',
345
+ label: 'Actions',
346
+ labelEs: 'Acciones',
347
+ categoryIcon: 'edit-3',
348
+ icons: [
349
+ // Crear / añadir
350
+ 'plus',
351
+ 'plus-circle',
352
+ 'plus-square',
353
+ 'add-outline',
354
+ 'add-circle-outline',
355
+ // Eliminar / quitar
356
+ 'minus',
357
+ 'minus-circle',
358
+ 'minus-square',
359
+ 'trash',
360
+ 'trash-2',
361
+ 'x',
362
+ 'x-circle',
363
+ 'x-square',
364
+ 'x-octagon',
365
+ 'slash',
366
+ 'trash-outline',
367
+ 'trash-bin-outline',
368
+ 'remove-outline',
369
+ 'remove-circle-outline',
370
+ 'close-circle-outline',
371
+ 'backspace-outline',
372
+ 'cut-outline',
373
+ // Confirmar
374
+ 'check',
375
+ 'check-circle',
376
+ 'check-square',
377
+ 'checkmark-circle-outline',
378
+ // Editar
379
+ 'edit',
380
+ 'edit-2',
381
+ 'edit-3',
382
+ 'copy',
383
+ 'clipboard',
384
+ 'scissors',
385
+ 'create-outline',
386
+ 'pencil-outline',
387
+ 'duplicate-outline',
388
+ 'copy-outline',
389
+ 'clipboard-outline',
390
+ // Mover datos
391
+ 'download',
392
+ 'download-cloud',
393
+ 'upload',
394
+ 'upload-cloud',
395
+ 'download-outline',
396
+ 'cloud-download-outline',
397
+ 'cloud-upload-outline',
398
+ ],
399
+ },
400
+
401
+ // ─── Communication ───────────────────────────────────────────────────────────
402
+ {
403
+ name: 'communication',
404
+ label: 'Communication',
405
+ labelEs: 'Comunicación',
406
+ categoryIcon: 'message-circle',
407
+ icons: [
408
+ // Mensajería
409
+ 'message-circle',
410
+ 'message-square',
411
+ 'send',
412
+ 'mail',
413
+ 'inbox',
414
+ 'at-sign',
415
+ 'mail-outline',
416
+ 'mail-open-outline',
417
+ 'mail-unread-outline',
418
+ 'chatbubble-outline',
419
+ 'chatbubble-ellipses-outline',
420
+ 'chatbubbles-outline',
421
+ 'send-outline',
422
+ 'attach-outline',
423
+ 'at-outline',
424
+ 'at-circle-outline',
425
+ // Llamadas
426
+ 'phone',
427
+ 'phone-call',
428
+ 'phone-incoming',
429
+ 'phone-outgoing',
430
+ 'phone-missed',
431
+ 'phone-off',
432
+ 'phone-forwarded',
433
+ 'voicemail',
434
+ 'call-outline',
435
+ 'phone-portrait-outline',
436
+ 'phone-landscape-outline',
437
+ // Personas
438
+ 'user',
439
+ 'user-plus',
440
+ 'user-minus',
441
+ 'user-check',
442
+ 'user-x',
443
+ 'users',
444
+ 'person-outline',
445
+ 'person-circle-outline',
446
+ 'person-add-outline',
447
+ 'person-remove-outline',
448
+ 'people-outline',
449
+ 'people-circle-outline',
450
+ // Reacciones
451
+ 'smile',
452
+ 'frown',
453
+ 'meh',
454
+ 'heart',
455
+ 'thumbs-up',
456
+ 'thumbs-down',
457
+ 'happy-outline',
458
+ 'sad-outline',
459
+ 'heart-outline',
460
+ 'thumbs-up-outline',
461
+ 'thumbs-down-outline',
462
+ ],
463
+ },
464
+
465
+ // ─── Navigation ──────────────────────────────────────────────────────────────
466
+ {
467
+ name: 'navigation',
468
+ label: 'Navigation',
469
+ labelEs: 'Navegación',
470
+ categoryIcon: 'compass',
471
+ icons: [
472
+ // Flechas cardinales
473
+ 'arrow-up',
474
+ 'arrow-down',
475
+ 'arrow-left',
476
+ 'arrow-right',
477
+ 'arrow-up-left',
478
+ 'arrow-up-right',
479
+ 'arrow-down-left',
480
+ 'arrow-down-right',
481
+ 'arrow-up-outline',
482
+ 'arrow-down-outline',
483
+ 'arrow-back-outline',
484
+ 'arrow-forward-outline',
485
+ 'arrow-undo-outline',
486
+ 'arrow-redo-outline',
487
+ // Chevrones
488
+ 'chevron-up',
489
+ 'chevron-down',
490
+ 'chevron-left',
491
+ 'chevron-right',
492
+ 'chevrons-up',
493
+ 'chevrons-down',
494
+ 'chevrons-left',
495
+ 'chevrons-right',
496
+ 'chevron-up-outline',
497
+ 'chevron-down-outline',
498
+ 'chevron-back-outline',
499
+ 'chevron-forward-outline',
500
+ 'chevron-collapse-outline',
501
+ 'chevron-expand-outline',
502
+ // Esquinas
503
+ 'corner-up-left',
504
+ 'corner-up-right',
505
+ 'corner-down-left',
506
+ 'corner-down-right',
507
+ 'corner-left-up',
508
+ 'corner-left-down',
509
+ 'corner-right-up',
510
+ 'corner-right-down',
511
+ // Giro / refrescar
512
+ 'refresh-cw',
513
+ 'refresh-ccw',
514
+ 'rotate-cw',
515
+ 'rotate-ccw',
516
+ 'refresh-outline',
517
+ 'reload-outline',
518
+ // Orientación y mapa
519
+ 'navigation',
520
+ 'navigation-2',
521
+ 'compass',
522
+ 'map',
523
+ 'map-pin',
524
+ 'target',
525
+ 'crosshair',
526
+ 'home',
527
+ 'anchor',
528
+ 'compass-outline',
529
+ 'map-outline',
530
+ 'location-outline',
531
+ 'navigate-outline',
532
+ 'pin-outline',
533
+ 'home-outline',
534
+ ],
535
+ },
536
+
537
+ // ─── Media ───────────────────────────────────────────────────────────────────
538
+ {
539
+ name: 'media',
540
+ label: 'Media',
541
+ labelEs: 'Medios',
542
+ categoryIcon: 'image',
543
+ icons: [
544
+ // Visual
545
+ 'image',
546
+ 'film',
547
+ 'video',
548
+ 'video-off',
549
+ 'camera',
550
+ 'camera-off',
551
+ 'image-outline',
552
+ 'images-outline',
553
+ 'film-outline',
554
+ 'videocam-outline',
555
+ 'videocam-off-outline',
556
+ 'camera-outline',
557
+ 'camera-reverse-outline',
558
+ // Reproducción
559
+ 'play',
560
+ 'play-circle',
561
+ 'pause',
562
+ 'pause-circle',
563
+ 'square',
564
+ 'stop-circle',
565
+ 'fast-forward',
566
+ 'rewind',
567
+ 'skip-forward',
568
+ 'skip-back',
569
+ 'repeat',
570
+ 'shuffle',
571
+ 'play-outline',
572
+ 'pause-outline',
573
+ 'play-circle-outline',
574
+ 'pause-circle-outline',
575
+ 'stop-circle-outline',
576
+ 'play-back-outline',
577
+ 'play-forward-outline',
578
+ 'play-skip-back-outline',
579
+ 'play-skip-forward-outline',
580
+ 'repeat-outline',
581
+ 'shuffle-outline',
582
+ // Audio
583
+ 'music',
584
+ 'headphones',
585
+ 'speaker',
586
+ 'volume',
587
+ 'volume-1',
588
+ 'volume-2',
589
+ 'volume-x',
590
+ 'mic',
591
+ 'mic-off',
592
+ 'mic-outline',
593
+ 'mic-off-outline',
594
+ 'mic-circle-outline',
595
+ 'musical-note-outline',
596
+ 'musical-notes-outline',
597
+ 'volume-high-outline',
598
+ 'volume-low-outline',
599
+ 'volume-medium-outline',
600
+ 'volume-mute-outline',
601
+ 'volume-off-outline',
602
+ ],
603
+ },
604
+
605
+ // ─── Layout ──────────────────────────────────────────────────────────────────
606
+ {
607
+ name: 'layout',
608
+ label: 'Layout',
609
+ labelEs: 'Diseño',
610
+ categoryIcon: 'grid',
611
+ icons: [
612
+ // Estructura
613
+ 'grid',
614
+ 'columns',
615
+ 'sidebar',
616
+ 'layout',
617
+ 'list',
618
+ 'menu',
619
+ 'table',
620
+ 'trello',
621
+ 'grid-outline',
622
+ 'list-outline',
623
+ 'menu-outline',
624
+ 'layers-outline',
625
+ // Alineación
626
+ 'align-left',
627
+ 'align-center',
628
+ 'align-right',
629
+ 'align-justify',
630
+ // Tipografía
631
+ 'bold',
632
+ 'italic',
633
+ 'underline',
634
+ 'type',
635
+ 'hash',
636
+ // Formas
637
+ 'circle',
638
+ 'square',
639
+ 'triangle',
640
+ 'hexagon',
641
+ 'octagon',
642
+ 'square-outline',
643
+ 'triangle-outline',
644
+ 'diamond-outline',
645
+ 'shapes-outline',
646
+ // Herramientas de diseño
647
+ 'pen-tool',
648
+ 'crop',
649
+ 'layers',
650
+ 'filter',
651
+ 'sliders',
652
+ 'aperture',
653
+ 'crop-outline',
654
+ 'filter-outline',
655
+ 'color-fill-outline',
656
+ 'color-filter-outline',
657
+ 'color-palette-outline',
658
+ 'color-wand-outline',
659
+ 'brush-outline',
660
+ // Edición
661
+ 'edit',
662
+ 'edit-2',
663
+ 'edit-3',
664
+ 'copy',
665
+ 'trash',
666
+ 'move',
667
+ 'create-outline',
668
+ 'pencil-outline',
669
+ 'move-outline',
670
+ 'resize-outline',
671
+ 'duplicate-outline',
672
+ // Navegación UI
673
+ 'more-horizontal',
674
+ 'more-vertical',
675
+ 'maximize',
676
+ 'minimize',
677
+ 'zoom-in',
678
+ 'zoom-out',
679
+ 'eye',
680
+ 'eye-off',
681
+ 'eye-outline',
682
+ 'eye-off-outline',
683
+ 'ellipsis-horizontal-circle-outline',
684
+ 'ellipsis-vertical-circle-outline',
685
+ ],
686
+ },
687
+
688
+ // ─── Nature ──────────────────────────────────────────────────────────────────
689
+ {
690
+ name: 'nature',
691
+ label: 'Nature',
692
+ labelEs: 'Naturaleza',
693
+ categoryIcon: 'sunny-outline',
694
+ icons: [
695
+ // Sol, luna y estrellas
696
+ 'sunny-outline',
697
+ 'moon-outline',
698
+ 'star-outline',
699
+ 'star-half-outline',
700
+ 'partly-sunny-outline',
701
+ 'sun',
702
+ 'moon',
703
+ 'sunrise',
704
+ 'sunset',
705
+ // Clima
706
+ 'rainy-outline',
707
+ 'thunderstorm-outline',
708
+ 'snow-outline',
709
+ 'cloudy-outline',
710
+ 'cloudy-night-outline',
711
+ 'cloud-outline',
712
+ 'cloud-done-outline',
713
+ 'cloud-download-outline',
714
+ 'cloud-upload-outline',
715
+ 'cloud-offline-outline',
716
+ 'cloud-circle-outline',
717
+ 'cloud',
718
+ 'cloud-drizzle',
719
+ 'cloud-lightning',
720
+ 'cloud-rain',
721
+ 'cloud-snow',
722
+ 'cloud-off',
723
+ 'umbrella-outline',
724
+ 'thermometer-outline',
725
+ 'droplet',
726
+ 'wind',
727
+ // Agua y fuego
728
+ 'water-outline',
729
+ 'flame-outline',
730
+ 'bonfire-outline',
731
+ 'eyedrop-outline',
732
+ // Flora y fauna
733
+ 'leaf-outline',
734
+ 'flower-outline',
735
+ 'bug-outline',
736
+ 'fish-outline',
737
+ 'paw-outline',
738
+ // Outdoor
739
+ 'binoculars-outline',
740
+ 'telescope-outline',
741
+ 'compass-outline',
742
+ 'map-outline',
743
+ 'location-outline',
744
+ 'flag-outline',
745
+ 'trail-sign-outline',
746
+ 'earth-outline',
747
+ 'globe-outline',
748
+ 'planet-outline',
749
+ 'compass',
750
+ 'map',
751
+ 'map-pin',
752
+ 'flag',
753
+ 'navigation',
754
+ 'navigation-2',
755
+ 'target',
756
+ 'crosshair',
757
+ 'life-buoy',
758
+ ],
759
+ },
760
+
761
+ // ─── Brands ──────────────────────────────────────────────────────────────────
762
+ {
763
+ name: 'brands',
764
+ label: 'Brands',
765
+ labelEs: 'Marcas',
766
+ categoryIcon: 'globe',
767
+ icons: [
768
+ // Feather brand icons — outlined, consistent with the rest of the library
769
+ 'github',
770
+ 'gitlab',
771
+ 'codepen',
772
+ 'codesandbox',
773
+ 'twitter',
774
+ 'facebook',
775
+ 'instagram',
776
+ 'linkedin',
777
+ 'youtube',
778
+ 'dribbble',
779
+ 'twitch',
780
+ 'slack',
781
+ 'figma',
782
+ 'framer',
783
+ 'chrome',
784
+ 'rss',
785
+ // Filled / flat brand logos (FA5 brands) — kept in a second
786
+ // visual tier. Rendered as the brand's official silhouette.
787
+ // Visually consistent (all flat single-color) but heavier than the
788
+ // Feather outlined set above. Use these only when an outlined Feather
789
+ // version of the brand doesn't exist.
790
+ 'reddit',
791
+ 'tiktok',
792
+ 'pinterest',
793
+ 'whatsapp',
794
+ 'discord',
795
+ 'snapchat',
796
+ 'telegram',
797
+ 'viber',
798
+ 'line',
799
+ 'vimeo',
800
+ 'tumblr',
801
+ 'behance',
802
+ 'medium',
803
+ 'soundcloud',
804
+ 'google',
805
+ 'apple',
806
+ 'android',
807
+ 'windows',
808
+ 'linux',
809
+ 'amazon',
810
+ 'paypal',
811
+ 'stripe',
812
+ 'shopify',
813
+ 'dropbox',
814
+ 'spotify',
815
+ 'steam',
816
+ 'atlassian',
817
+ 'jira',
818
+ 'confluence',
819
+ 'bitbucket',
820
+ 'jenkins',
821
+ 'docker',
822
+ 'aws',
823
+ 'node',
824
+ 'react',
825
+ 'angular',
826
+ 'wordpress',
827
+ 'drupal',
828
+ 'joomla',
829
+ 'squarespace',
830
+ 'wix',
831
+ 'magento',
832
+ 'terminal',
833
+ 'pen-tool',
834
+ ],
835
+ },
836
+ ]
837
+
838
+ /** Flat deduplicated array of all curated icon names (for "Todos" / search). */
839
+ export const ALL_CURATED_ICONS: string[] = [
840
+ ...new Set(CURATED_ICONS.flatMap((c) => c.icons)),
841
+ ]
842
+
843
+ /** Resolve icon to its category label, or undefined if not found. */
844
+ export function getIconCategory(name: string): string | undefined {
845
+ for (const cat of CURATED_ICONS) {
846
+ if (cat.icons.includes(name)) return cat.label
847
+ }
848
+ return undefined
849
+ }