@axzydev/axzy_ui_system 1.4.8 → 1.5.1

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 (223) hide show
  1. package/README.md +2 -11
  2. package/dist/index.cjs +1826 -1351
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.css +1 -1
  5. package/dist/index.css.map +1 -1
  6. package/dist/index.d.cts +115 -14
  7. package/dist/index.d.ts +115 -14
  8. package/dist/index.js +1481 -1010
  9. package/dist/index.js.map +1 -1
  10. package/dist/layered.css +1 -1
  11. package/package.json +3 -16
  12. package/src/App.tsx +90 -73
  13. package/src/components/atoms/badget/badget.tsx +23 -5
  14. package/src/components/atoms/chip/chip.tsx +3 -1
  15. package/src/components/atoms/image/image.tsx +3 -1
  16. package/src/components/atoms/input/input.tsx +8 -5
  17. package/src/components/atoms/loader/loader.tsx +3 -1
  18. package/src/components/atoms/slide/slide.props.ts +12 -0
  19. package/src/components/atoms/slide/slide.tsx +3 -0
  20. package/src/components/molecules/alert/alert.tsx +3 -1
  21. package/src/components/molecules/breadcrumbs/breadcrumbs.tsx +3 -1
  22. package/src/components/molecules/calendar/calendar.tsx +9 -6
  23. package/src/components/molecules/card/card.tsx +5 -2
  24. package/src/components/molecules/chip-input/chip-input.tsx +9 -7
  25. package/src/components/molecules/date-picker/datePicker.tsx +9 -9
  26. package/src/components/molecules/dropdown-menu/dropdown-menu.props.ts +1 -1
  27. package/src/components/molecules/dropdown-menu/dropdown-menu.tsx +6 -3
  28. package/src/components/molecules/field/field.tsx +3 -1
  29. package/src/components/molecules/form-header/form-header.tsx +3 -1
  30. package/src/components/molecules/line-bar-chart/line-bar-chart.props.ts +2 -2
  31. package/src/components/molecules/line-bar-chart/line-bar-chart.tsx +20 -15
  32. package/src/components/molecules/masked-input/masked-input.tsx +3 -1
  33. package/src/components/molecules/multi-select/multi-select.tsx +12 -9
  34. package/src/components/molecules/pagination/pagination.tsx +11 -5
  35. package/src/components/molecules/search-select/search-select.tsx +11 -9
  36. package/src/components/molecules/select/select.tsx +6 -4
  37. package/src/components/molecules/stepper/stepper.tsx +6 -4
  38. package/src/components/molecules/table/table.tsx +30 -28
  39. package/src/components/molecules/time-picker/timePicker.tsx +8 -6
  40. package/src/components/molecules/wysiwyg/wysiwyg.tsx +23 -12
  41. package/src/components/organisms/confirm-dialog/confirm-dialog.props.ts +4 -4
  42. package/src/components/organisms/confirm-dialog/confirm-dialog.tsx +16 -8
  43. package/src/components/organisms/data-table/dataTable.tsx +31 -25
  44. package/src/components/organisms/dialog/dialog.tsx +3 -0
  45. package/src/components/organisms/drawer/drawer.tsx +3 -0
  46. package/src/components/organisms/dropfile/dropfile.tsx +19 -17
  47. package/src/components/organisms/form-builder/fieldRenderer.tsx +4 -2
  48. package/src/components/organisms/navbar/navbar.tsx +4 -2
  49. package/src/components/organisms/page-header/page-header.tsx +3 -1
  50. package/src/components/organisms/searchTable/components/PaginationControls.tsx +8 -6
  51. package/src/components/organisms/searchTable/components/PaginationInfo.tsx +3 -1
  52. package/src/components/organisms/searchTable/components/SearchAndSortBar.tsx +7 -5
  53. package/src/components/organisms/searchTable/components/SearchInput.tsx +4 -2
  54. package/src/components/organisms/searchTable/components/SortButton.tsx +13 -11
  55. package/src/components/organisms/searchTable/components/TableEmptyState.tsx +4 -2
  56. package/src/components/organisms/searchTable/components/TableRow.tsx +6 -4
  57. package/src/components/organisms/searchTable/searchTable.tsx +4 -2
  58. package/src/components/organisms/sidebar/sidebar.props.ts +1 -1
  59. package/src/components/organisms/sidebar/sidebar.tsx +9 -4
  60. package/src/components/organisms/toast/toast.tsx +3 -1
  61. package/src/components/organisms/topbar/topbar.tsx +4 -2
  62. package/src/components/templates/page/page.props.ts +4 -4
  63. package/src/components/templates/page/page.tsx +6 -4
  64. package/src/components/theme-provider/themeProvider.tsx +28 -17
  65. package/src/dev.css +61 -2
  66. package/src/global.d.ts +10 -0
  67. package/src/i18n/context.ts +9 -0
  68. package/src/i18n/index.ts +22 -0
  69. package/src/i18n/locales/en.ts +163 -0
  70. package/src/i18n/locales/es.ts +165 -0
  71. package/src/i18n/provider.tsx +44 -0
  72. package/src/i18n/translator.ts +82 -0
  73. package/src/i18n/types.ts +54 -0
  74. package/src/i18n/useITTranslation.ts +20 -0
  75. package/src/index.css +0 -1
  76. package/src/index.ts +7 -1
  77. package/src/sandbox/LandingShowcase.tsx +224 -580
  78. package/src/sandbox/NotFoundShowcase.tsx +51 -36
  79. package/src/sandbox/TopbarSearch.tsx +6 -4
  80. package/src/sandbox/controls.tsx +180 -0
  81. package/src/sandbox/i18n.ts +1939 -0
  82. package/src/sandbox/icons.tsx +25 -0
  83. package/src/sandbox/locale.tsx +72 -0
  84. package/src/sandbox/ui.tsx +474 -0
  85. package/src/sandbox/useHashRoute.ts +46 -10
  86. package/src/showcases/DataShowcases.tsx +103 -87
  87. package/src/showcases/FeedbackShowcases.tsx +37 -30
  88. package/src/showcases/FormShowcases.tsx +303 -215
  89. package/src/showcases/GettingStartedShowcase.tsx +151 -145
  90. package/src/showcases/HelpShowcase.tsx +126 -128
  91. package/src/showcases/HomeShowcase.tsx +678 -482
  92. package/src/showcases/LayoutPrimitivesShowcases.tsx +129 -114
  93. package/src/showcases/NavigationShowcases.tsx +45 -37
  94. package/src/showcases/PageShowcases.tsx +171 -152
  95. package/src/showcases/ProductoDetalle.tsx +272 -129
  96. package/src/showcases/ShowcaseLayout.tsx +256 -219
  97. package/src/showcases/SizesShowcase.tsx +123 -64
  98. package/src/showcases/StructureShowcases.tsx +203 -138
  99. package/src/showcases/portfolioUi.tsx +153 -0
  100. package/src/showcases/techIcons.ts +3 -0
  101. package/src/utils/table.utils.ts +10 -2
  102. package/src/components/atoms/avatar/avatar.doc.mdx +0 -48
  103. package/src/components/atoms/avatar/avatar.stories.tsx +0 -64
  104. package/src/components/atoms/badget/badget.doc.mdx +0 -46
  105. package/src/components/atoms/badget/badget.stories.tsx +0 -75
  106. package/src/components/atoms/button/button.doc.mdx +0 -59
  107. package/src/components/atoms/button/button.stories.tsx +0 -173
  108. package/src/components/atoms/checkbox/checkbox.doc.mdx +0 -54
  109. package/src/components/atoms/checkbox/checkbox.stories.tsx +0 -53
  110. package/src/components/atoms/chip/chip.doc.mdx +0 -47
  111. package/src/components/atoms/chip/chip.stories.tsx +0 -64
  112. package/src/components/atoms/divider/divider.doc.mdx +0 -42
  113. package/src/components/atoms/divider/divider.stories.tsx +0 -33
  114. package/src/components/atoms/flex/flex.doc.mdx +0 -59
  115. package/src/components/atoms/flex/flex.stories.tsx +0 -70
  116. package/src/components/atoms/grid/grid.doc.mdx +0 -54
  117. package/src/components/atoms/grid/grid.stories.tsx +0 -71
  118. package/src/components/atoms/image/image.doc.mdx +0 -44
  119. package/src/components/atoms/image/image.stories.tsx +0 -48
  120. package/src/components/atoms/input/input.doc.mdx +0 -70
  121. package/src/components/atoms/input/input.stories.tsx +0 -113
  122. package/src/components/atoms/input-number/input-number.doc.mdx +0 -74
  123. package/src/components/atoms/input-number/input-number.stories.tsx +0 -111
  124. package/src/components/atoms/loader/loader.doc.mdx +0 -43
  125. package/src/components/atoms/loader/loader.stories.tsx +0 -104
  126. package/src/components/atoms/popover/popover.doc.mdx +0 -53
  127. package/src/components/atoms/popover/popover.stories.tsx +0 -24
  128. package/src/components/atoms/progress/progress.doc.mdx +0 -48
  129. package/src/components/atoms/progress/progress.stories.tsx +0 -39
  130. package/src/components/atoms/radio/radio.doc.mdx +0 -62
  131. package/src/components/atoms/radio/radio.stories.tsx +0 -48
  132. package/src/components/atoms/segmented-control/segmented-control.doc.mdx +0 -60
  133. package/src/components/atoms/segmented-control/segmented-control.stories.tsx +0 -62
  134. package/src/components/atoms/skeleton/skeleton.doc.mdx +0 -43
  135. package/src/components/atoms/skeleton/skeleton.stories.tsx +0 -29
  136. package/src/components/atoms/slide/slide.doc.mdx +0 -46
  137. package/src/components/atoms/slide/slide.stories.tsx +0 -120
  138. package/src/components/atoms/slider/slider.doc.mdx +0 -49
  139. package/src/components/atoms/slider/slider.stories.tsx +0 -29
  140. package/src/components/atoms/stack/stack.doc.mdx +0 -126
  141. package/src/components/atoms/stack/stack.stories.tsx +0 -283
  142. package/src/components/atoms/text/text.doc.mdx +0 -41
  143. package/src/components/atoms/text/text.stories.tsx +0 -66
  144. package/src/components/atoms/textarea/textarea.doc.mdx +0 -64
  145. package/src/components/atoms/textarea/textarea.stories.tsx +0 -26
  146. package/src/components/atoms/tooltip/tooltip.doc.mdx +0 -47
  147. package/src/components/atoms/tooltip/tooltip.stories.tsx +0 -19
  148. package/src/components/isolation/isolation.stories.tsx +0 -202
  149. package/src/components/molecules/accordion/accordion.doc.mdx +0 -47
  150. package/src/components/molecules/accordion/accordion.stories.tsx +0 -68
  151. package/src/components/molecules/alert/alert.doc.mdx +0 -48
  152. package/src/components/molecules/alert/alert.stories.tsx +0 -40
  153. package/src/components/molecules/breadcrumbs/breadcrumbs.doc.mdx +0 -57
  154. package/src/components/molecules/breadcrumbs/breadcrumbs.stories.tsx +0 -20
  155. package/src/components/molecules/calendar/calendar.doc.mdx +0 -76
  156. package/src/components/molecules/calendar/calendar.stories.tsx +0 -90
  157. package/src/components/molecules/card/card.doc.mdx +0 -54
  158. package/src/components/molecules/card/card.stories.tsx +0 -57
  159. package/src/components/molecules/chip-input/chip-input.doc.mdx +0 -44
  160. package/src/components/molecules/chip-input/chip-input.stories.tsx +0 -52
  161. package/src/components/molecules/date-picker/date-picker.doc.mdx +0 -65
  162. package/src/components/molecules/date-picker/date-picker.stories.tsx +0 -88
  163. package/src/components/molecules/dropdown-menu/dropdown-menu.doc.mdx +0 -46
  164. package/src/components/molecules/dropdown-menu/dropdown-menu.stories.tsx +0 -41
  165. package/src/components/molecules/empty-state/empty-state.doc.mdx +0 -50
  166. package/src/components/molecules/empty-state/empty-state.stories.tsx +0 -19
  167. package/src/components/molecules/field/field.doc.mdx +0 -43
  168. package/src/components/molecules/field/field.stories.tsx +0 -42
  169. package/src/components/molecules/form-header/form-header.doc.mdx +0 -38
  170. package/src/components/molecules/form-header/form-header.stories.tsx +0 -52
  171. package/src/components/molecules/masked-input/masked-input.doc.mdx +0 -78
  172. package/src/components/molecules/masked-input/masked-input.stories.tsx +0 -126
  173. package/src/components/molecules/multi-select/multi-select.doc.mdx +0 -55
  174. package/src/components/molecules/multi-select/multi-select.stories.tsx +0 -59
  175. package/src/components/molecules/pagination/pagination.doc.mdx +0 -62
  176. package/src/components/molecules/pagination/pagination.stories.tsx +0 -110
  177. package/src/components/molecules/search-select/search-select.doc.mdx +0 -77
  178. package/src/components/molecules/search-select/search-select.stories.tsx +0 -146
  179. package/src/components/molecules/select/select.doc.mdx +0 -75
  180. package/src/components/molecules/select/select.stories.tsx +0 -85
  181. package/src/components/molecules/stat-card/stat-card.doc.mdx +0 -48
  182. package/src/components/molecules/stat-card/stat-card.stories.tsx +0 -40
  183. package/src/components/molecules/stepper/stepper.doc.mdx +0 -54
  184. package/src/components/molecules/stepper/stepper.stories.tsx +0 -154
  185. package/src/components/molecules/table/table.doc.mdx +0 -140
  186. package/src/components/molecules/table/table.stories.tsx +0 -402
  187. package/src/components/molecules/tabs/tabs.doc.mdx +0 -52
  188. package/src/components/molecules/tabs/tabs.stories.tsx +0 -31
  189. package/src/components/molecules/time-picker/timePicker.doc.mdx +0 -68
  190. package/src/components/molecules/time-picker/timePicker.stories.tsx +0 -130
  191. package/src/components/molecules/wysiwyg/wysiwyg.stories.tsx +0 -95
  192. package/src/components/organisms/confirm-dialog/confirm-dialog.doc.mdx +0 -60
  193. package/src/components/organisms/confirm-dialog/confirm-dialog.stories.tsx +0 -32
  194. package/src/components/organisms/data-table/ITDataTable.doc.mdx +0 -132
  195. package/src/components/organisms/data-table/ITDataTable.stories.tsx +0 -353
  196. package/src/components/organisms/dialog/dialog.doc.mdx +0 -54
  197. package/src/components/organisms/dialog/dialog.stories.tsx +0 -126
  198. package/src/components/organisms/drawer/drawer.doc.mdx +0 -59
  199. package/src/components/organisms/drawer/drawer.stories.tsx +0 -40
  200. package/src/components/organisms/dropfile/dropfile.doc.mdx +0 -74
  201. package/src/components/organisms/dropfile/dropfile.stories.tsx +0 -93
  202. package/src/components/organisms/form-builder/formBuilder.doc.mdx +0 -251
  203. package/src/components/organisms/form-builder/formBuilder.stories.tsx +0 -914
  204. package/src/components/organisms/navbar/navbar.doc.mdx +0 -77
  205. package/src/components/organisms/navbar/navbar.stories.tsx +0 -83
  206. package/src/components/organisms/page-header/page-header.doc.mdx +0 -54
  207. package/src/components/organisms/page-header/page-header.stories.tsx +0 -74
  208. package/src/components/organisms/searchTable/searchTable.doc.mdx +0 -79
  209. package/src/components/organisms/searchTable/searchTable.stories.tsx +0 -73
  210. package/src/components/organisms/sidebar/sidebar.doc.mdx +0 -176
  211. package/src/components/organisms/sidebar/sidebar.stories.tsx +0 -234
  212. package/src/components/organisms/toast/toast.doc.mdx +0 -50
  213. package/src/components/organisms/toast/toast.stories.tsx +0 -137
  214. package/src/components/organisms/topbar/topbar.doc.mdx +0 -72
  215. package/src/components/organisms/topbar/topbar.stories.tsx +0 -79
  216. package/src/components/organisms/triple-filter/tripleFilter.doc.mdx +0 -62
  217. package/src/components/organisms/triple-filter/tripleFilter.stories.tsx +0 -31
  218. package/src/components/templates/layout/layout.doc.mdx +0 -53
  219. package/src/components/templates/layout/layout.stories.tsx +0 -113
  220. package/src/components/templates/page/page.doc.mdx +0 -86
  221. package/src/components/templates/page/page.stories.tsx +0 -97
  222. package/src/components/theme-provider/themeProvider.doc.mdx +0 -85
  223. package/src/components/theme-provider/themeProvider.stories.tsx +0 -58
@@ -0,0 +1,165 @@
1
+ import type { ITMessages } from "../types";
2
+
3
+ /**
4
+ * Catálogo base en español (locale por defecto de la librería).
5
+ *
6
+ * Las keys siguen `docs/i18n/conventions.md` (`namespace.clave`) y el inventario de
7
+ * `docs/i18n/strings.md`. Añade nuevas keys aquí y en `en.ts` a la vez.
8
+ */
9
+ const es: ITMessages = {
10
+ // ---------------------------------------------------------------- common
11
+ "common.loading": "Cargando...",
12
+ "common.loadingOptions": "Cargando opciones...",
13
+ "common.loadError": "Error cargando",
14
+ "common.search": "Buscar...",
15
+ "common.clear": "Limpiar",
16
+ "common.clearSelection": "Limpiar selección",
17
+ "common.all": "Todos",
18
+ "common.true": "Verdadero",
19
+ "common.false": "Falso",
20
+ "common.back": "Atrás",
21
+ "common.next": "Siguiente",
22
+ "common.finish": "Finalizar",
23
+ "common.accept": "Aceptar",
24
+ "common.confirm": "Confirmar",
25
+ "common.cancel": "Cancelar",
26
+ "common.close": "Cerrar",
27
+ "common.dismiss": "Descartar",
28
+ "common.closeNotification": "Cerrar notificación",
29
+ "common.menu": "Menú",
30
+ "common.userAvatar": "Usuario actual",
31
+ "common.retry": "Reintentar",
32
+ "common.error": "Error",
33
+ "common.noData": "Sin datos",
34
+ "common.empty": "No hay información para mostrar",
35
+ "common.noResults": "No se encontraron resultados",
36
+ "common.delete": "Eliminar",
37
+ "common.copy": "Copiar",
38
+
39
+ // ------------------------------------------------------------- validation
40
+ "field.required": "Este campo es requerido",
41
+
42
+ // ------------------------------------------------------------------ atoms
43
+ "image.fallbackAlt": "Fallback",
44
+ "chip.remove": "Quitar {label}",
45
+ "input.invalidFormat": "Formato inválido",
46
+ "input.showPassword": "Mostrar contraseña",
47
+ "input.hidePassword": "Ocultar contraseña",
48
+
49
+ // -------------------------------------------------------------- molecules
50
+ "card.imageAlt": "Imagen de tarjeta",
51
+ "select.placeholder": "Selecciona una opción",
52
+ "select.noResults": "No se encontraron resultados",
53
+ "multiSelect.placeholder": "Selecciona opciones",
54
+ "chipInput.placeholder": "Escribe y presiona Enter",
55
+ "chipInput.maxTags": "Máximo {count} etiquetas",
56
+ "chipInput.duplicate": "Etiqueta duplicada",
57
+ "dropdownMenu.open": "Abrir menú",
58
+ "lineBarChart.lineLabel": "Serie A",
59
+ "lineBarChart.barLabel": "Serie B",
60
+ "datePicker.invalid": "Fecha inválida",
61
+ "datePicker.placeholder": "dd/mm/aaaa",
62
+ "datePicker.rangePlaceholder": "dd/mm/aaaa - dd/mm/aaaa",
63
+ "calendar.today": "Hoy",
64
+ "timePicker.accept": "Aceptar",
65
+ "timePicker.placeholder": "HH:MM",
66
+ "timePicker.invalid": "Hora inválida",
67
+ "timePicker.hours": "Horas",
68
+ "timePicker.minutes": "Minutos",
69
+ "table.showAll": "Mostrar todos",
70
+ "table.filterTrue": "Filtrar solo verdaderos",
71
+ "table.filterFalse": "Filtrar solo falsos",
72
+ "table.sortBy": "Ordenar por {label}",
73
+ "table.filterToggle": "{action} para {label}",
74
+ "table.viewTable": "Tabla",
75
+ "table.viewCards": "Tarjetas",
76
+ "table.noResults": "No se encontraron resultados",
77
+ "table.adjustFilters": "Intenta ajustar los filtros",
78
+ "table.loading": "Cargando datos...",
79
+ "table.selectAll": "Seleccionar todo",
80
+ "wysiwyg.bold": "Negrita",
81
+ "wysiwyg.italic": "Itálica",
82
+ "wysiwyg.underline": "Subrayado",
83
+ "wysiwyg.highlight": "Marcador",
84
+ "wysiwyg.bulletList": "Lista con viñetas",
85
+ "wysiwyg.numberedList": "Lista numerada",
86
+ "wysiwyg.clearFormat": "Limpiar formato",
87
+ "pagination.itemsPerPage": "Mostrar",
88
+ "pagination.of": "de",
89
+ "breadcrumbs.aria": "Ruta de navegación",
90
+ "pageHeader.back": "Volver",
91
+ "pagination.showing": "Mostrando {from}-{to} de {total}",
92
+ "pagination.page": "Página {page}",
93
+ "pagination.aria": "Paginación",
94
+ "pagination.previous": "Página anterior",
95
+ "pagination.next": "Página siguiente",
96
+ "stepper.stepOf": "Paso {current} de {total}",
97
+ "stepper.stepAria": "Paso {n} {label}",
98
+
99
+ // -------------------------------------------------------------- organisms
100
+ "confirmDialog.title": "Confirmar acción",
101
+ "confirmDialog.message": "¿Estás seguro de que deseas continuar?",
102
+ "dropfile.upload": "Subir archivo",
103
+ "dropfile.status.pending": "Pendiente",
104
+ "dropfile.status.uploading": "Subiendo...",
105
+ "dropfile.status.uploaded": "Subido",
106
+ "dropfile.status.error": "Error",
107
+ "dropfile.dropHere": "¡Suelta aquí!",
108
+ "dropfile.clickOrDrag": "Haz clic o arrastra",
109
+ "dropfile.imageLoaded": "Imagen cargada",
110
+ "dropfile.noPreview": "Sin vista previa",
111
+ "dropfile.previewAlt": "Vista previa",
112
+ "dropfile.fileTypeNotAllowed": "Tipo de archivo no permitido.",
113
+ "dropfile.fileLoaded": "Archivo cargado",
114
+ "sidebar.notifications": "Notificaciones",
115
+ "sidebar.navAria": "Componentes de la librería",
116
+ "sidebar.noSubmenu": "No hay submenú",
117
+ // ---------------------------------------------------------------- sandbox
118
+ "searchTable.searchPlaceholder": "Buscar en todos los campos...",
119
+ "searchTable.showing": "Mostrando {from}-{to} de {total} resultados",
120
+ "searchTable.emptySearch": "No se encontraron resultados para tu búsqueda",
121
+ "searchTable.empty": "No se encontraron resultados",
122
+ "searchTable.showLabel": "Mostrar:",
123
+ "searchTable.pageOf": "Página {current} de {total}",
124
+ "searchTable.prev": "Página anterior",
125
+ "searchTable.next": "Página siguiente",
126
+ "searchTable.sort": "Ordenar",
127
+ "searchTable.sortAsc": "Asc ↑",
128
+ "searchTable.sortDesc": "Desc ↓",
129
+ "searchTable.clearSearch": "Limpiar búsqueda",
130
+ "searchTable.showingCount": "Mostrando {from} de {total} resultados",
131
+ "searchTable.sortTable": "Ordenar tabla",
132
+ "searchTable.sortAria": "Ordenar tabla {direction}",
133
+ "searchTable.sortAscending": "ascendente",
134
+ "searchTable.sortDescending": "descendente",
135
+ "formBuilder.arrayField": "Array Field: {label}",
136
+ "formBuilder.loadingOptions": "Cargando opciones...",
137
+
138
+ // ------------------------------------------------- ITThemeProvider (editor)
139
+ "themeProvider.fab.ariaLabel": "Configurar Paleta de Colores",
140
+ "themeProvider.designer.title": "Diseñador de Temas",
141
+ "themeProvider.designer.appearance": "Apariencia",
142
+ "themeProvider.designer.presets": "Presets",
143
+ "themeProvider.designer.myThemes": "Mis Temas",
144
+ "themeProvider.designer.presetNamePlaceholder": "Nombre del tema...",
145
+ "themeProvider.designer.save": "Guardar",
146
+ "themeProvider.designer.cancelSave": "X",
147
+ "themeProvider.designer.saveCurrent": "Guardar actual",
148
+ "themeProvider.designer.reset": "Restaurar default",
149
+ "themeProvider.designer.autosave": "Los cambios se guardan automáticamente",
150
+ "themeProvider.designer.close": "Cerrar",
151
+ "themeProvider.designer.deletePreset": "Eliminar",
152
+ "themeProvider.tabs.brand": "Marca",
153
+ "themeProvider.tabs.layout": "Nav & Sidebar",
154
+ "themeProvider.tabs.tables": "Tablas",
155
+ "themeProvider.mode.light": "Claro",
156
+ "themeProvider.mode.dark": "Oscuro",
157
+ "themeProvider.mode.system": "Sistema",
158
+ "themeProvider.presets.midnightIndigo": "Midnight Indigo 🌌",
159
+ "themeProvider.presets.coralReef": "Coral Reef 🪸",
160
+ "themeProvider.presets.oceanicTeal": "Oceanic Teal 🌊",
161
+ "themeProvider.presets.goldenHour": "Golden Hour ☀️",
162
+ "themeProvider.presets.deepForest": "Deep Forest 🌲",
163
+ };
164
+
165
+ export default es;
@@ -0,0 +1,44 @@
1
+ import { useMemo } from "react";
2
+ import { ITI18nContext } from "./context";
3
+ import { createI18n } from "./translator";
4
+ import type { ITI18nProviderProps } from "./types";
5
+
6
+ /**
7
+ * Provee locale y mensajes al árbol de componentes.
8
+ *
9
+ * Sin provider, los componentes usan el catálogo base en español. Con provider,
10
+ * cualquier prop de texto explícita de un componente sigue teniendo prioridad
11
+ * sobre el catálogo.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <ITThemeProvider>
16
+ * <ITI18nProvider locale="en">
17
+ * <App />
18
+ * </ITI18nProvider>
19
+ * </ITThemeProvider>
20
+ * ```
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * // Overrides parciales sobre el catálogo incluido
25
+ * <ITI18nProvider locale="es" messages={{ es: { "common.cancel": "Abortar" } }}>
26
+ * <App />
27
+ * </ITI18nProvider>
28
+ * ```
29
+ */
30
+ export function ITI18nProvider({
31
+ locale,
32
+ fallbackLocale,
33
+ messages,
34
+ children,
35
+ }: ITI18nProviderProps) {
36
+ const value = useMemo(
37
+ () => createI18n({ locale, fallbackLocale, messages }),
38
+ [locale, fallbackLocale, messages]
39
+ );
40
+
41
+ return <ITI18nContext.Provider value={value}>{children}</ITI18nContext.Provider>;
42
+ }
43
+
44
+ export default ITI18nProvider;
@@ -0,0 +1,82 @@
1
+ import { enUS, es as esDateLocale } from "date-fns/locale";
2
+ import type { Locale } from "date-fns";
3
+ import es from "./locales/es";
4
+ import en from "./locales/en";
5
+ import type { ITI18nOptions, ITI18nValue, ITMessagesByLocale } from "./types";
6
+
7
+ /** Locale por defecto de la librería (mantiene el comportamiento histórico). */
8
+ export const DEFAULT_LOCALE = "es";
9
+
10
+ /** Catálogo base incluido en el paquete. */
11
+ export const baseCatalog: ITMessagesByLocale = { es, en };
12
+
13
+ const INTL_LOCALES: Record<string, string> = { es: "es-MX", en: "en-US" };
14
+ const DATE_LOCALES: Record<string, Locale> = { es: esDateLocale, en: enUS };
15
+
16
+ /** Mapea `es`/`en` a una locale BCP-47 para `Intl.*` (default: la propia locale). */
17
+ export function toIntlLocale(locale: string): string {
18
+ return INTL_LOCALES[locale] ?? locale;
19
+ }
20
+
21
+ /** Devuelve la locale de `date-fns` para la locale dada (fallback: español). */
22
+ export function toDateLocale(locale: string): Locale {
23
+ return DATE_LOCALES[locale] ?? DATE_LOCALES[DEFAULT_LOCALE];
24
+ }
25
+
26
+ /** Sustituye los placeholders `{var}` de un texto. */
27
+ export function interpolate(template: string, vars?: Record<string, string | number>): string {
28
+ if (!vars) return template;
29
+ return template.replace(/\{(\w+)\}/g, (match, key) =>
30
+ vars[key] !== undefined ? String(vars[key]) : match
31
+ );
32
+ }
33
+
34
+ /**
35
+ * Fusiona el catálogo base con los mensajes propios.
36
+ * Prioridad (mayor → menor): `messages[locale]` → `messages[fallback]` →
37
+ * catálogo base `[locale]` → catálogo base `[fallback]` → la propia key.
38
+ */
39
+ export function resolveMessages({ locale, fallbackLocale, messages }: Required<Pick<ITI18nOptions, "locale" | "fallbackLocale">> & Pick<ITI18nOptions, "messages">): Record<string, string> {
40
+ const custom = messages ?? {};
41
+ return {
42
+ ...BASE[fallbackLocale],
43
+ ...BASE[locale],
44
+ ...custom[fallbackLocale],
45
+ ...custom[locale],
46
+ };
47
+ }
48
+
49
+ const BASE: Record<string, Record<string, string> | undefined> = { es, en };
50
+
51
+ /**
52
+ * Construye el valor de contexto de i18n (traductor + formateadores).
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * const i18n = createI18n({ locale: "en" });
57
+ * i18n.t("common.cancel"); // "Cancel"
58
+ * i18n.formatCurrency(1234.5); // "$1,234.50"
59
+ * ```
60
+ */
61
+ export function createI18n(options: ITI18nOptions = {}): ITI18nValue {
62
+ const locale = options.locale ?? DEFAULT_LOCALE;
63
+ const fallbackLocale = options.fallbackLocale ?? DEFAULT_LOCALE;
64
+ const messages = resolveMessages({ locale, fallbackLocale, messages: options.messages });
65
+ const intlLocale = toIntlLocale(locale);
66
+
67
+ const t = (key: string, vars?: Record<string, string | number>): string =>
68
+ interpolate(messages[key] ?? key, vars);
69
+
70
+ return {
71
+ locale,
72
+ fallbackLocale,
73
+ t,
74
+ dateLocale: toDateLocale(locale),
75
+ formatNumber: (value: number, opts?: Intl.NumberFormatOptions): string =>
76
+ new Intl.NumberFormat(intlLocale, opts).format(value),
77
+ formatCurrency: (value: number, currency = "MXN", opts?: Intl.NumberFormatOptions): string =>
78
+ new Intl.NumberFormat(intlLocale, { style: "currency", currency, ...opts }).format(value),
79
+ formatDate: (value: Date | number | string, opts?: Intl.DateTimeFormatOptions): string =>
80
+ new Intl.DateTimeFormat(intlLocale, opts).format(value instanceof Date ? value : new Date(value)),
81
+ };
82
+ }
@@ -0,0 +1,54 @@
1
+ import type { ReactNode } from "react";
2
+ import type { Locale } from "date-fns";
3
+
4
+ /** Supported base locales shipped with the library. */
5
+ export type ITLocale = "es" | "en";
6
+
7
+ /** Message catalog: flat `namespace.key` → text. */
8
+ export type ITMessages = Record<string, string>;
9
+
10
+ /** Message overrides keyed by locale. */
11
+ export type ITMessagesByLocale = Record<string, ITMessages>;
12
+
13
+ /** Interpolation variables for `t()`. */
14
+ export type ITVars = Record<string, string | number>;
15
+
16
+ /** Options used to build an i18n value. */
17
+ export interface ITI18nOptions {
18
+ /** Active locale. @default "es" */
19
+ locale?: string;
20
+ /** Locale used for missing keys. @default "es" */
21
+ fallbackLocale?: string;
22
+ /** Custom messages merged over the built-in catalog. */
23
+ messages?: ITMessagesByLocale;
24
+ }
25
+
26
+ /** Contract of the i18n context (returned by `useITTranslation()`). */
27
+ export interface ITI18nValue {
28
+ /** Active locale. */
29
+ locale: string;
30
+ /** Fallback locale. */
31
+ fallbackLocale: string;
32
+ /** Translate a `namespace.key` and interpolate `{var}` placeholders. */
33
+ t: (key: string, vars?: ITVars) => string;
34
+ /** Format a number using `Intl.NumberFormat(locale)`. */
35
+ formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;
36
+ /** Format a currency using `Intl.NumberFormat(locale)`. */
37
+ formatCurrency: (value: number, currency?: string, options?: Intl.NumberFormatOptions) => string;
38
+ /** Format a date using `Intl.DateTimeFormat(locale)`. */
39
+ formatDate: (value: Date | number | string, options?: Intl.DateTimeFormatOptions) => string;
40
+ /** Matching `date-fns` locale. */
41
+ dateLocale: Locale;
42
+ }
43
+
44
+ /** Props for `ITI18nProvider`. */
45
+ export interface ITI18nProviderProps {
46
+ /** Active locale. @default "es" */
47
+ locale?: string;
48
+ /** Fallback locale for missing keys. @default "es" */
49
+ fallbackLocale?: string;
50
+ /** Custom messages merged over the built-in catalog, keyed by locale. */
51
+ messages?: ITMessagesByLocale;
52
+ /** Application tree. */
53
+ children: ReactNode;
54
+ }
@@ -0,0 +1,20 @@
1
+ import { useContext } from "react";
2
+ import { ITI18nContext } from "./context";
3
+ import type { ITI18nValue } from "./types";
4
+
5
+ /**
6
+ * Devuelve el traductor y los formateadores de la locale activa.
7
+ *
8
+ * Funciona aunque no exista `ITI18nProvider` (cae al catálogo base en español).
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * const { t, formatCurrency } = useITTranslation();
13
+ * return <ITButton label={t("common.cancel")} onClick={onCancel} />;
14
+ * ```
15
+ */
16
+ export function useITTranslation(): ITI18nValue {
17
+ return useContext(ITI18nContext);
18
+ }
19
+
20
+ export default useITTranslation;
package/src/index.css CHANGED
@@ -1,7 +1,6 @@
1
1
  @import "tailwindcss";
2
2
 
3
3
  @source "./**/*.{ts,tsx}";
4
- @source "../.storybook/**/*.{ts,tsx}";
5
4
 
6
5
  @variant dark (&:is(.dark &));
7
6
 
package/src/index.ts CHANGED
@@ -138,6 +138,10 @@ import { createValidationSchema } from "./types/yup.types";
138
138
 
139
139
  import { getContrastTextColor, isLightColor, resolveCssColor } from "./utils/color.utils";
140
140
 
141
+ // I18N
142
+ import { ITI18nProvider, useITTranslation, esMessages, enMessages } from "./i18n";
143
+ import type { ITI18nProviderProps, ITI18nValue, ITLocale, ITMessages, ITMessagesByLocale } from "./i18n";
144
+
141
145
  export {
142
146
  // Hooks
143
147
  useClickOutside, useDebouncedSearch, useEditableRow, useFloatingPanel, useTableState,
@@ -157,10 +161,12 @@ export {
157
161
  ITTable, ITTabs, ITText, ITTextarea, ITTripleFilter, ITThemeProvider,
158
162
  useITTheme, useITThemeSafe, useITFlatAppearance, ITTimePicker, ITToast, ITWysiwyg,
159
163
  UploadStatus, FileTypeEnum,
160
- getContrastTextColor, isLightColor, resolveCssColor
164
+ getContrastTextColor, isLightColor, resolveCssColor,
165
+ ITI18nProvider, useITTranslation, esMessages, enMessages
161
166
  };
162
167
 
163
168
  export type {
169
+ ITI18nProviderProps, ITI18nValue, ITLocale, ITMessages, ITMessagesByLocale,
164
170
  Column, ColumnFilters, ColumnFilterMode, ColumnFilterValue, FieldConfig,
165
171
  FieldConfigV2,
166
172
  ITAccordionItem, ITAccordionProps,