@axzydev/axzy_ui_system 1.4.8 → 1.5.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 (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 +77 -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 +1929 -0
  82. package/src/sandbox/icons.tsx +25 -0
  83. package/src/sandbox/locale.tsx +72 -0
  84. package/src/sandbox/ui.tsx +377 -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 +302 -214
  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 +270 -216
  97. package/src/showcases/SizesShowcase.tsx +123 -64
  98. package/src/showcases/StructureShowcases.tsx +157 -131
  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
@@ -14,6 +14,7 @@ import {
14
14
  ITDataTableResponse
15
15
  } from "../index";
16
16
  import { ShowcaseLayout } from "./ShowcaseLayout";
17
+ import { useITTranslation } from "@/i18n";
17
18
 
18
19
  const TABLE_DATA: Record<string, unknown>[] = [
19
20
  { id: 1, name: "Sofía Castillo", email: "sofia@axzy.dev", role: "Admin", status: "active", lastLogin: "2026-07-18T09:30:00", sales: 28400 },
@@ -148,6 +149,7 @@ const roleColor = (r: string) =>
148
149
 
149
150
  // 1. ITTable Showcase
150
151
  export const TableShowcase = () => {
152
+ const { t } = useITTranslation();
151
153
  const [variant, setVariant] = useState<any>("default");
152
154
  const [size, setSize] = useState<any>("sm");
153
155
  const [useCustomCard, setUseCustomCard] = useState(true);
@@ -231,10 +233,10 @@ export const TableShowcase = () => {
231
233
  type: "actions",
232
234
  actions: () => (
233
235
  <div className="flex gap-1">
234
- <button className="p-1.5 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 text-slate-400 hover:text-primary-600 transition-colors" title="View">
236
+ <button className="p-1.5 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 text-slate-400 hover:text-primary-600 transition-colors" title={t("showcase.common.view")}>
235
237
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
236
238
  </button>
237
- <button className="p-1.5 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 text-slate-400 hover:text-blue-600 transition-colors" title="Edit">
239
+ <button className="p-1.5 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 text-slate-400 hover:text-blue-600 transition-colors" title={t("showcase.common.edit")}>
238
240
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
239
241
  </button>
240
242
  </div>
@@ -289,20 +291,20 @@ export const TableShowcase = () => {
289
291
  return (
290
292
  <ShowcaseLayout
291
293
  title="ITTable"
292
- description="Tabla con vista responsive Table / Cards, paginación, filtros y template de card personalizable."
294
+ description={t("showcase.data.tableDesc")}
293
295
  code={code}
294
296
  demo={
295
297
  <div className="w-full space-y-2">
296
298
  <div className="text-xs font-medium text-slate-500 dark:text-slate-400 px-1">
297
299
  {selectedRow
298
- ? `Selected: ${selectedRow.name as string}`
299
- : "Click a row/card or press Enter/Space to select"}
300
+ ? t("showcase.data.selectedName", { name: selectedRow.name as string })
301
+ : t("showcase.data.clickToSelect")}
300
302
  </div>
301
303
  <div className="w-full bg-white dark:bg-slate-900 rounded-xl overflow-hidden shadow-sm">
302
304
  <ITTable
303
305
  columns={columns}
304
306
  data={TABLE_DATA}
305
- title="Team members"
307
+ title={t("showcase.data.teamMembers")}
306
308
  variant={variant}
307
309
  size={size}
308
310
  defaultItemsPerPage={5}
@@ -316,7 +318,7 @@ export const TableShowcase = () => {
316
318
  <>
317
319
  <ITSelect
318
320
  name="var_ctrl"
319
- label="Table variant"
321
+ label={t("showcase.data.tableVariant")}
320
322
  value={variant}
321
323
  onChange={(e: any) => setVariant(e.target.value)}
322
324
  options={[
@@ -327,7 +329,7 @@ export const TableShowcase = () => {
327
329
  />
328
330
  <ITSelect
329
331
  name="sz_ctrl"
330
- label="Row size"
332
+ label={t("showcase.data.rowSize")}
331
333
  value={size}
332
334
  onChange={(e: any) => setSize(e.target.value)}
333
335
  options={[
@@ -337,12 +339,14 @@ export const TableShowcase = () => {
337
339
  ]}
338
340
  />
339
341
  <div className="flex items-center justify-between pt-2">
340
- <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">Custom card template</span>
341
- <ITSlideToggle isOn={useCustomCard} onToggle={setUseCustomCard} size="sm" />
342
+ <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">{t("showcase.data.customCardTemplate")}</span>
343
+ <ITSlideToggle isOn={useCustomCard} onToggle={setUseCustomCard} size="sm"
344
+ ariaLabel={t("showcase.data.customCardTemplate")}
345
+ />
342
346
  </div>
343
347
  {!useCustomCard && (
344
348
  <div className="p-2 bg-slate-100 dark:bg-slate-800 rounded text-xs text-slate-500">
345
- Default card active — shows all columns as label-value pairs
349
+ {t("showcase.data.defaultCardActive")}
346
350
  </div>
347
351
  )}
348
352
  </>
@@ -414,7 +418,7 @@ export const TableShowcase = () => {
414
418
  gallery={
415
419
  <div className="space-y-6">
416
420
  <div>
417
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Custom cards with hover</h4>
421
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryCustomCardsHover")}</h3>
418
422
  <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
419
423
  {TABLE_DATA.slice(0, 4).map((row, i) => {
420
424
  const initials = (row.name as string).split(" ").map((w: string) => w[0]).join("");
@@ -451,8 +455,8 @@ export const TableShowcase = () => {
451
455
  </div>
452
456
 
453
457
  <div>
454
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">ITTable with default cards</h4>
455
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
458
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryDefaultCards")}</h3>
459
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
456
460
  <ITTable
457
461
  columns={columns}
458
462
  data={TABLE_DATA.slice(0, 6)}
@@ -465,13 +469,13 @@ export const TableShowcase = () => {
465
469
  </div>
466
470
 
467
471
  <div>
468
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">ITTable with custom cards + pagination</h4>
469
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
472
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryCustomCardsPagination")}</h3>
473
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
470
474
  <ITTable
471
475
  columns={columns}
472
476
  data={TABLE_DATA}
473
477
  size="sm"
474
- title="All members"
478
+ title={t("showcase.data.galleryAllMembers")}
475
479
  defaultItemsPerPage={4}
476
480
  renderCard={(row: any) => {
477
481
  const initials = (row.name as string).split(" ").map((w: string) => w[0]).join("");
@@ -497,12 +501,12 @@ export const TableShowcase = () => {
497
501
  </div>
498
502
 
499
503
  <div>
500
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Compact fixed layout — no horizontal scroll</h4>
501
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden" style={{ maxWidth: 560 }}>
504
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryCompactFixed")}</h3>
505
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800" style={{ maxWidth: 560 }}>
502
506
  <ITTable
503
507
  columns={fixedColumns}
504
508
  data={TABLE_DATA}
505
- title="Fixed layout"
509
+ title={t("showcase.data.galleryFixedLayout")}
506
510
  layout="fixed"
507
511
  density="compact"
508
512
  defaultItemsPerPage={5}
@@ -511,12 +515,12 @@ export const TableShowcase = () => {
511
515
  </div>
512
516
 
513
517
  <div>
514
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Pinned columns — left (Name) &amp; right (Actions)</h4>
515
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden" style={{ maxWidth: 520 }}>
518
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryPinnedNameActions")}</h3>
519
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800" style={{ maxWidth: 520 }}>
516
520
  <ITTable
517
521
  columns={pinnedColumns}
518
522
  data={TABLE_DATA}
519
- title="Pinned columns"
523
+ title={t("showcase.data.galleryPinnedColumns")}
520
524
  layout="fixed"
521
525
  density="compact"
522
526
  defaultItemsPerPage={5}
@@ -528,12 +532,12 @@ export const TableShowcase = () => {
528
532
  </div>
529
533
 
530
534
  <div>
531
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Auto cards fallback (&lt; 640px container)</h4>
532
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden" style={{ maxWidth: 420 }}>
535
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryAutoCards")}</h3>
536
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800" style={{ maxWidth: 420 }}>
533
537
  <ITTable
534
538
  columns={columns}
535
539
  data={TABLE_DATA.slice(0, 6)}
536
- title="Narrow container"
540
+ title={t("showcase.data.galleryNarrowContainer")}
537
541
  autoCardBreakpoint={640}
538
542
  defaultItemsPerPage={6}
539
543
  />
@@ -541,12 +545,12 @@ export const TableShowcase = () => {
541
545
  </div>
542
546
 
543
547
  <div>
544
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Virtualized table — 300 rows (only visible window mounted)</h4>
545
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
548
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryVirtualized")}</h3>
549
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
546
550
  <ITTable
547
551
  columns={virtualColumns}
548
552
  data={virtualData}
549
- title="Virtualized · 300 rows"
553
+ title={t("showcase.data.galleryVirtualizedTitle")}
550
554
  virtualized
551
555
  stickyHeader
552
556
  layout="fixed"
@@ -559,12 +563,12 @@ export const TableShowcase = () => {
559
563
  </div>
560
564
 
561
565
  <div>
562
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Column filters: ITSearchSelect + ITDatePicker (single &amp; range)</h4>
563
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
566
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryColumnFilters")}</h3>
567
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
564
568
  <ITTable
565
569
  columns={filterDemoColumns}
566
570
  data={filterDemoData}
567
- title="Filter demo"
571
+ title={t("showcase.data.galleryFilterDemo")}
568
572
  size="sm"
569
573
  defaultItemsPerPage={8}
570
574
  />
@@ -575,12 +579,12 @@ export const TableShowcase = () => {
575
579
  </div>
576
580
 
577
581
  <div>
578
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Design overrides — colors + design slots, sin switch</h4>
579
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
582
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryDesignOverrides")}</h3>
583
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
580
584
  <ITTable
581
585
  columns={columns}
582
586
  data={TABLE_DATA.slice(0, 5)}
583
- title="Custom design"
587
+ title={t("showcase.data.galleryCustomDesign")}
584
588
  defaultItemsPerPage={5}
585
589
  showViewToggle={false}
586
590
  colors={{
@@ -605,8 +609,8 @@ export const TableShowcase = () => {
605
609
  </div>
606
610
 
607
611
  <div>
608
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Per-column design — header y celda por columna</h4>
609
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
612
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryPerColumnDesign")}</h3>
613
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
610
614
  <ITTable
611
615
  columns={columns.map((col: any) =>
612
616
  col.key === "sales"
@@ -616,7 +620,7 @@ export const TableShowcase = () => {
616
620
  : col
617
621
  )}
618
622
  data={TABLE_DATA.slice(0, 5)}
619
- title="Per-column"
623
+ title={t("showcase.data.galleryPerColumnTitle")}
620
624
  defaultItemsPerPage={5}
621
625
  showViewToggle={false}
622
626
  />
@@ -633,6 +637,7 @@ export const TableShowcase = () => {
633
637
 
634
638
  // 2. ITDataTable Showcase
635
639
  export const DataTableShowcase = () => {
640
+ const { t } = useITTranslation();
636
641
  const [useCustomCard, setUseCustomCard] = useState(true);
637
642
  const [apiState, setApiState] = useState<"normal" | "loading" | "empty" | "error">("normal");
638
643
  const [reloadKey, setReloadKey] = useState(0);
@@ -815,21 +820,21 @@ export const DataTableShowcase = () => {
815
820
  return (
816
821
  <ShowcaseLayout
817
822
  title="ITDataTable"
818
- description="Tabla auto-suficiente con carga dinámica, filtros, paginación y vista responsive Cards/Table."
823
+ description={t("showcase.data.dataTableDesc")}
819
824
  code={code}
820
825
  demo={
821
826
  <div className="w-full space-y-2">
822
827
  <div className="text-xs font-medium text-slate-500 dark:text-slate-400 px-1">
823
828
  {selectedRow
824
- ? `Selected: ${selectedRow.name as string} (id ${selectedRow.id as number})`
825
- : "Click a row/card or press Enter/Space to select"}
829
+ ? t("showcase.data.selectedNameId", { name: selectedRow.name as string, id: selectedRow.id as number })
830
+ : t("showcase.data.clickToSelect")}
826
831
  </div>
827
832
  <div className="w-full bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl overflow-hidden shadow-md">
828
833
  <ITDataTable
829
834
  key={reloadKey}
830
835
  columns={userColumns}
831
836
  fetchData={fetchData}
832
- title={apiState === "error" ? "Connection error" : apiState === "empty" ? "No data" : "Users"}
837
+ title={apiState === "error" ? t("showcase.data.titleConnectionError") : apiState === "empty" ? t("showcase.data.titleNoData") : t("showcase.data.titleUsers")}
833
838
  defaultItemsPerPage={4}
834
839
  size={dtSize}
835
840
  layout={dtLayout}
@@ -849,7 +854,7 @@ export const DataTableShowcase = () => {
849
854
  </div>
850
855
  <span className={`px-2 py-0.5 text-[9px] font-bold uppercase tracking-wider rounded-md ${
851
856
  row.active ? "bg-emerald-100 text-emerald-700 dark:bg-emerald-950/30 dark:text-emerald-300" : "bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-400"
852
- }`}>{row.active ? "Active" : "Inactive"}</span>
857
+ }`}>{row.active ? t("showcase.common.active") : t("showcase.data.inactive")}</span>
853
858
  </div>
854
859
  <div className="flex items-center justify-between">
855
860
  <span className={`px-1.5 py-0.5 text-[10px] font-bold rounded ${
@@ -869,7 +874,7 @@ export const DataTableShowcase = () => {
869
874
  controls={
870
875
  <div className="space-y-3">
871
876
  <div>
872
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">API state</p>
877
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.data.apiState")}</p>
873
878
  <div className="flex flex-wrap gap-2">
874
879
  {(["normal", "loading", "empty", "error"] as const).map((s) => (
875
880
  <button
@@ -881,22 +886,24 @@ export const DataTableShowcase = () => {
881
886
  : "bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-slate-200 dark:hover:bg-slate-700"
882
887
  }`}
883
888
  >
884
- {s === "normal" ? "✅ Normal" : s === "loading" ? "⏳ Loading" : s === "empty" ? "📭 Empty" : "💥 Error"}
889
+ {s === "normal" ? `✅ ${t("showcase.data.stateNormal")}` : s === "loading" ? `⏳ ${t("showcase.data.stateLoading")}` : s === "empty" ? `📭 ${t("showcase.data.stateEmpty")}` : `💥 ${t("showcase.data.stateError")}`}
885
890
  </button>
886
891
  ))}
887
892
  </div>
888
893
  </div>
889
894
  <div className="flex items-center justify-between pt-1">
890
- <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">Custom card template</span>
891
- <ITSlideToggle isOn={useCustomCard} onToggle={setUseCustomCard} size="sm" />
895
+ <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">{t("showcase.data.customCardTemplate")}</span>
896
+ <ITSlideToggle isOn={useCustomCard} onToggle={setUseCustomCard} size="sm"
897
+ ariaLabel={t("showcase.data.customCardTemplate")}
898
+ />
892
899
  </div>
893
900
  {!useCustomCard && (
894
901
  <div className="p-2 bg-slate-100 dark:bg-slate-800 rounded text-xs text-slate-500">
895
- Default card active — shows all columns as label-value pairs
902
+ {t("showcase.data.defaultCardActive")}
896
903
  </div>
897
904
  )}
898
905
  <div>
899
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Borders</p>
906
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.data.borders")}</p>
900
907
  <div className="flex flex-wrap gap-2">
901
908
  {(["default", "blue", "rose", "none"] as const).map((s) => (
902
909
  <button
@@ -911,16 +918,16 @@ export const DataTableShowcase = () => {
911
918
  : "bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-slate-200 dark:hover:bg-slate-700"
912
919
  }`}
913
920
  >
914
- {s === "default" ? "Gray" : s === "blue" ? "Blue" : s === "rose" ? "Rose" : "None"}
921
+ {s === "default" ? t("showcase.data.borderGray") : s === "blue" ? t("showcase.data.borderBlue") : s === "rose" ? t("showcase.data.borderRose") : t("showcase.data.borderNone")}
915
922
  </button>
916
923
  ))}
917
924
  </div>
918
925
  </div>
919
926
  <div className="space-y-3">
920
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Table capabilities</p>
927
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.data.tableCapabilities")}</p>
921
928
  <ITSelect
922
929
  name="dt_size"
923
- label="Size"
930
+ label={t("showcase.common.size")}
924
931
  value={dtSize}
925
932
  onChange={(e: any) => setDtSize(e.target.value as "sm" | "md" | "lg")}
926
933
  options={[
@@ -931,7 +938,7 @@ export const DataTableShowcase = () => {
931
938
  />
932
939
  <ITSelect
933
940
  name="dt_density"
934
- label="Density"
941
+ label={t("showcase.data.density")}
935
942
  value={dtDensity}
936
943
  onChange={(e: any) => setDtDensity(e.target.value as "compact" | "normal" | "comfortable")}
937
944
  options={[
@@ -942,7 +949,7 @@ export const DataTableShowcase = () => {
942
949
  />
943
950
  <ITSelect
944
951
  name="dt_layout"
945
- label="Layout"
952
+ label={t("showcase.data.layout")}
946
953
  value={dtLayout}
947
954
  onChange={(e: any) => setDtLayout(e.target.value as "auto" | "fixed")}
948
955
  options={[
@@ -952,7 +959,7 @@ export const DataTableShowcase = () => {
952
959
  />
953
960
  <ITSelect
954
961
  name="dt_autocards"
955
- label="Auto cards below (px)"
962
+ label={t("showcase.data.autoCardsBelow")}
956
963
  value={String(dtAutoCardBreakpoint)}
957
964
  onChange={(e: any) => setDtAutoCardBreakpoint(Number(e.target.value))}
958
965
  options={[
@@ -963,16 +970,20 @@ export const DataTableShowcase = () => {
963
970
  ]}
964
971
  />
965
972
  <div className="flex items-center justify-between pt-2">
966
- <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">Virtualized (gallery)</span>
967
- <ITSlideToggle isOn={dtVirtualized} onToggle={setDtVirtualized} size="sm" />
973
+ <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">{t("showcase.data.virtualizedGallery")}</span>
974
+ <ITSlideToggle isOn={dtVirtualized} onToggle={setDtVirtualized} size="sm"
975
+ ariaLabel={t("showcase.data.virtualizedGallery")}
976
+ />
968
977
  </div>
969
978
  <div className="flex items-center justify-between">
970
- <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">Sticky header</span>
971
- <ITSlideToggle isOn={dtStickyHeader} onToggle={setDtStickyHeader} size="sm" disabled={!dtVirtualized} />
979
+ <span className="text-sm font-semibold text-gray-700 dark:text-slate-300">{t("showcase.data.stickyHeader")}</span>
980
+ <ITSlideToggle isOn={dtStickyHeader} onToggle={setDtStickyHeader} size="sm" disabled={!dtVirtualized}
981
+ ariaLabel={t("showcase.data.stickyHeader")}
982
+ />
972
983
  </div>
973
984
  {dtVirtualized && (
974
985
  <div className="p-2 bg-slate-100 dark:bg-slate-800 rounded text-xs text-slate-500">
975
- size, density, layout y auto-cards aplican al demo principal; virtualized y sticky header solo al bloque "Server-side virtualization" de la galería. Ese bloque no recibe autoCardBreakpoint: las cards nunca se virtualizan y el fallback de auto-cards desactivaría la virtualización en silencio.
986
+ {t("showcase.data.capabilitiesHint")}
976
987
  </div>
977
988
  )}
978
989
  </div>
@@ -1051,10 +1062,10 @@ export const DataTableShowcase = () => {
1051
1062
  gallery={
1052
1063
  <div className="space-y-6">
1053
1064
  <div>
1054
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Custom cards with hover</h4>
1055
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
1065
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryCustomCardsHover")}</h3>
1066
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
1056
1067
  <GalleryDataTable
1057
- title="Team members"
1068
+ title={t("showcase.data.teamMembers")}
1058
1069
  defaultItemsPerPage={4}
1059
1070
  renderCard={(row: any) => {
1060
1071
  const initials = (row.name as string).split(" ").map((w: string) => w[0]).join("");
@@ -1070,7 +1081,7 @@ export const DataTableShowcase = () => {
1070
1081
  </div>
1071
1082
  <span className={`px-2 py-0.5 text-[10px] font-bold uppercase tracking-wider rounded-md ${
1072
1083
  row.active ? "bg-emerald-100 text-emerald-700 dark:bg-emerald-950/30 dark:text-emerald-300" : "bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-400"
1073
- }`}>{row.active ? "Active" : "Inactive"}</span>
1084
+ }`}>{row.active ? t("showcase.common.active") : t("showcase.data.inactive")}</span>
1074
1085
  </div>
1075
1086
  <div className="flex items-center gap-2 text-xs text-slate-500 mb-3">
1076
1087
  <span className={`px-2 py-0.5 rounded-md font-semibold ${
@@ -1094,8 +1105,8 @@ export const DataTableShowcase = () => {
1094
1105
  </div>
1095
1106
 
1096
1107
  <div>
1097
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Default cards with pagination</h4>
1098
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
1108
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryDefaultCardsPagination")}</h3>
1109
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
1099
1110
  <GalleryDataTable
1100
1111
  size="sm"
1101
1112
  defaultItemsPerPage={3}
@@ -1105,12 +1116,12 @@ export const DataTableShowcase = () => {
1105
1116
  </div>
1106
1117
 
1107
1118
  <div>
1108
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Design overrides — colors + design slots, sin switch</h4>
1109
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
1119
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryDesignOverrides")}</h3>
1120
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
1110
1121
  <ITDataTable
1111
1122
  columns={userColumns}
1112
1123
  fetchData={fetchData}
1113
- title="Custom design"
1124
+ title={t("showcase.data.galleryCustomDesign")}
1114
1125
  defaultItemsPerPage={4}
1115
1126
  debounceMs={0}
1116
1127
  showViewToggle={false}
@@ -1129,12 +1140,12 @@ export const DataTableShowcase = () => {
1129
1140
  </div>
1130
1141
 
1131
1142
  <div>
1132
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Pinned columns — left (ID) &amp; right (Active)</h4>
1133
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden" style={{ maxWidth: 520 }}>
1143
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryPinnedIdActive")}</h3>
1144
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800" style={{ maxWidth: 520 }}>
1134
1145
  <ITDataTable
1135
1146
  columns={pinnedColumns}
1136
1147
  fetchData={fetchData}
1137
- title="Pinned columns"
1148
+ title={t("showcase.data.galleryPinnedColumns")}
1138
1149
  layout="fixed"
1139
1150
  density="compact"
1140
1151
  defaultItemsPerPage={4}
@@ -1147,13 +1158,13 @@ export const DataTableShowcase = () => {
1147
1158
  </div>
1148
1159
 
1149
1160
  <div>
1150
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Server-side virtualization — 240 rows {dtVirtualized ? "(page 200)" : "(page 10)"}</h4>
1151
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
1161
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.galleryServerVirtualization", { page: dtVirtualized ? 200 : 10 })}</h3>
1162
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
1152
1163
  <ITDataTable
1153
1164
  key={dtVirtualized ? "dt-virt-on" : "dt-virt-off"}
1154
1165
  columns={virtualUserColumns}
1155
1166
  fetchData={virtualFetchData}
1156
- title="Virtualized users"
1167
+ title={t("showcase.data.galleryVirtualizedUsers")}
1157
1168
  defaultItemsPerPage={dtVirtualized ? 200 : 10}
1158
1169
  itemsPerPageOptions={dtVirtualized ? [50, 100, 200] : [5, 10, 20]}
1159
1170
  size={dtSize}
@@ -1233,6 +1244,7 @@ function GalleryDataTable({ title, size, defaultItemsPerPage, defaultView, rende
1233
1244
 
1234
1245
  // 3. ITBadget Showcase
1235
1246
  export const BadgetShowcase = () => {
1247
+ const { t } = useITTranslation();
1236
1248
  const [color, setColor] = useState<any>("success");
1237
1249
  const [size, setSize] = useState<any>("medium");
1238
1250
  const [labelText, setLabelText] = useState("Activo");
@@ -1242,7 +1254,7 @@ export const BadgetShowcase = () => {
1242
1254
  return (
1243
1255
  <ShowcaseLayout
1244
1256
  title="ITBadget"
1245
- description="Badges (etiquetas) estilizados para representar estados o categorías de items."
1257
+ description={t("showcase.data.badgetDesc")}
1246
1258
  code={code}
1247
1259
  demo={
1248
1260
  <ITBadget label={labelText} color={color} size={size} />
@@ -1251,14 +1263,14 @@ export const BadgetShowcase = () => {
1251
1263
  <>
1252
1264
  <ITInput
1253
1265
  name="label"
1254
- label="Texto"
1266
+ label={t("showcase.data.textLabel")}
1255
1267
  value={labelText}
1256
1268
  onChange={(e: any) => setLabelText(e.target.value)}
1257
1269
  onBlur={() => { }}
1258
1270
  />
1259
1271
  <ITSelect
1260
1272
  name="color"
1261
- label="Color"
1273
+ label={t("showcase.common.color")}
1262
1274
  value={color}
1263
1275
  onChange={(e: any) => setColor(e.target.value)}
1264
1276
  options={[
@@ -1272,7 +1284,7 @@ export const BadgetShowcase = () => {
1272
1284
  />
1273
1285
  <ITSelect
1274
1286
  name="size"
1275
- label="Tamaño"
1287
+ label={t("showcase.common.size")}
1276
1288
  value={size}
1277
1289
  onChange={(e: any) => setSize(e.target.value)}
1278
1290
  options={[
@@ -1303,6 +1315,7 @@ export const BadgetShowcase = () => {
1303
1315
 
1304
1316
  // 4. ITImage Showcase
1305
1317
  export const ImageShowcase = () => {
1318
+ const { t } = useITTranslation();
1306
1319
  const [broken, setBroken] = useState(false);
1307
1320
  const src = broken ? "https://nonexistent.image.site/broken.jpg" : "https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=400&q=80";
1308
1321
 
@@ -1311,26 +1324,28 @@ export const ImageShowcase = () => {
1311
1324
  return (
1312
1325
  <ShowcaseLayout
1313
1326
  title="ITImage"
1314
- description="Componente de renderizado de imágenes inteligente con cargador interno y fallback automático ante fallas de red."
1327
+ description={t("showcase.data.imageDesc")}
1315
1328
  code={code}
1316
1329
  demo={
1317
1330
  <div className="w-full max-w-sm flex flex-col items-center gap-3">
1318
1331
  <ITImage
1319
1332
  src={src}
1320
- alt="Demo abstracta"
1333
+ alt={t("showcase.data.imageAlt")}
1321
1334
  fallback="https://placehold.co/400x200?text=Error+Carga+Imagen"
1322
1335
  className="rounded-xl object-cover h-40 w-full shadow-md"
1323
1336
  />
1324
1337
  <span className="text-xs text-slate-500 font-mono">
1325
- {broken ? "Cargando URL Rota (Fallback Activo)" : "Cargando URL Correcta"}
1338
+ {broken ? t("showcase.data.imageBroken") : t("showcase.data.imageOk")}
1326
1339
  </span>
1327
1340
  </div>
1328
1341
  }
1329
1342
  controls={
1330
1343
  <>
1331
1344
  <div className="flex items-center justify-between pt-2">
1332
- <span className="text-sm font-semibold text-gray-700">Forzar Error de Carga (URL rota)</span>
1333
- <ITSlideToggle isOn={broken} onToggle={setBroken} activeColor="danger" size="sm" />
1345
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.data.forceError")}</span>
1346
+ <ITSlideToggle isOn={broken} onToggle={setBroken} activeColor="danger" size="sm"
1347
+ ariaLabel={t("showcase.data.forceError")}
1348
+ />
1334
1349
  </div>
1335
1350
  </>
1336
1351
  }
@@ -1340,6 +1355,7 @@ export const ImageShowcase = () => {
1340
1355
 
1341
1356
  // ITChip Showcase
1342
1357
  export const ChipShowcase = () => {
1358
+ const { t } = useITTranslation();
1343
1359
  const [active, setActive] = useState<string[]>(["mx"]);
1344
1360
 
1345
1361
  const toggle = (id: string) =>
@@ -1356,7 +1372,7 @@ export const ChipShowcase = () => {
1356
1372
  return (
1357
1373
  <ShowcaseLayout
1358
1374
  title="ITChip"
1359
- description="Etiqueta compacta (tag / pill) para labels, filtros activos y selecciones múltiples. Variantes soft, filled y outlined, icono, botón de quitar (X) y estado seleccionado."
1375
+ description={t("showcase.data.chipDesc")}
1360
1376
  code={code}
1361
1377
  demo={
1362
1378
  <div className="w-full max-w-lg space-y-5">
@@ -1378,13 +1394,13 @@ export const ChipShowcase = () => {
1378
1394
  </div>
1379
1395
  <div className="flex flex-wrap items-center gap-2">
1380
1396
  <ITChip label="México" color="danger" variant="outlined" removable onRemove={() => {}} />
1381
- <ITChip label="Deshabilitado" color="secondary" disabled />
1397
+ <ITChip label={t("showcase.data.chipDisabled")} color="secondary" disabled />
1382
1398
  </div>
1383
1399
  </div>
1384
1400
  }
1385
1401
  controls={
1386
1402
  <p className="text-xs text-slate-500">
1387
- Los chips con onClick son toggles de filtro (role=button, Enter/Space). Los chips removibles muestran una X.
1403
+ {t("showcase.data.chipHint")}
1388
1404
  </p>
1389
1405
  }
1390
1406
  doc={{