@axzydev/axzy_ui_system 1.4.7 → 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 (226) hide show
  1. package/README.md +2 -11
  2. package/dist/index.cjs +2174 -1570
  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 +232 -19
  7. package/dist/index.d.ts +232 -19
  8. package/dist/index.js +1838 -1238
  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.props.ts +10 -2
  39. package/src/components/molecules/table/table.tsx +163 -114
  40. package/src/components/molecules/time-picker/timePicker.tsx +8 -6
  41. package/src/components/molecules/wysiwyg/wysiwyg.tsx +23 -12
  42. package/src/components/organisms/confirm-dialog/confirm-dialog.props.ts +4 -4
  43. package/src/components/organisms/confirm-dialog/confirm-dialog.tsx +16 -8
  44. package/src/components/organisms/data-table/dataTable.props.ts +3 -2
  45. package/src/components/organisms/data-table/dataTable.tsx +149 -81
  46. package/src/components/organisms/dialog/dialog.tsx +3 -0
  47. package/src/components/organisms/drawer/drawer.tsx +3 -0
  48. package/src/components/organisms/dropfile/dropfile.tsx +19 -17
  49. package/src/components/organisms/form-builder/fieldRenderer.tsx +4 -2
  50. package/src/components/organisms/navbar/navbar.tsx +4 -2
  51. package/src/components/organisms/page-header/page-header.tsx +3 -1
  52. package/src/components/organisms/searchTable/components/PaginationControls.tsx +8 -6
  53. package/src/components/organisms/searchTable/components/PaginationInfo.tsx +3 -1
  54. package/src/components/organisms/searchTable/components/SearchAndSortBar.tsx +7 -5
  55. package/src/components/organisms/searchTable/components/SearchInput.tsx +4 -2
  56. package/src/components/organisms/searchTable/components/SortButton.tsx +13 -11
  57. package/src/components/organisms/searchTable/components/TableEmptyState.tsx +4 -2
  58. package/src/components/organisms/searchTable/components/TableRow.tsx +6 -4
  59. package/src/components/organisms/searchTable/searchTable.tsx +4 -2
  60. package/src/components/organisms/sidebar/sidebar.props.ts +1 -1
  61. package/src/components/organisms/sidebar/sidebar.tsx +9 -4
  62. package/src/components/organisms/toast/toast.tsx +3 -1
  63. package/src/components/organisms/topbar/topbar.tsx +4 -2
  64. package/src/components/templates/page/page.props.ts +4 -4
  65. package/src/components/templates/page/page.tsx +6 -4
  66. package/src/components/theme-provider/themeProvider.tsx +28 -17
  67. package/src/dev.css +77 -2
  68. package/src/global.d.ts +10 -0
  69. package/src/i18n/context.ts +9 -0
  70. package/src/i18n/index.ts +22 -0
  71. package/src/i18n/locales/en.ts +163 -0
  72. package/src/i18n/locales/es.ts +165 -0
  73. package/src/i18n/provider.tsx +44 -0
  74. package/src/i18n/translator.ts +82 -0
  75. package/src/i18n/types.ts +54 -0
  76. package/src/i18n/useITTranslation.ts +20 -0
  77. package/src/index.css +0 -1
  78. package/src/index.ts +9 -3
  79. package/src/sandbox/LandingShowcase.tsx +224 -580
  80. package/src/sandbox/NotFoundShowcase.tsx +51 -36
  81. package/src/sandbox/TopbarSearch.tsx +6 -4
  82. package/src/sandbox/controls.tsx +180 -0
  83. package/src/sandbox/i18n.ts +1929 -0
  84. package/src/sandbox/icons.tsx +25 -0
  85. package/src/sandbox/locale.tsx +72 -0
  86. package/src/sandbox/ui.tsx +377 -0
  87. package/src/sandbox/useHashRoute.ts +46 -10
  88. package/src/showcases/DataShowcases.tsx +201 -80
  89. package/src/showcases/FeedbackShowcases.tsx +37 -30
  90. package/src/showcases/FormShowcases.tsx +302 -214
  91. package/src/showcases/GettingStartedShowcase.tsx +151 -145
  92. package/src/showcases/HelpShowcase.tsx +126 -128
  93. package/src/showcases/HomeShowcase.tsx +678 -482
  94. package/src/showcases/LayoutPrimitivesShowcases.tsx +129 -114
  95. package/src/showcases/NavigationShowcases.tsx +45 -37
  96. package/src/showcases/PageShowcases.tsx +171 -152
  97. package/src/showcases/ProductoDetalle.tsx +272 -129
  98. package/src/showcases/ShowcaseLayout.tsx +270 -216
  99. package/src/showcases/SizesShowcase.tsx +123 -64
  100. package/src/showcases/StructureShowcases.tsx +157 -131
  101. package/src/showcases/portfolioUi.tsx +153 -0
  102. package/src/showcases/techIcons.ts +3 -0
  103. package/src/types/table.types.ts +110 -0
  104. package/src/utils/table.utils.ts +10 -2
  105. package/src/components/atoms/avatar/avatar.doc.mdx +0 -48
  106. package/src/components/atoms/avatar/avatar.stories.tsx +0 -64
  107. package/src/components/atoms/badget/badget.doc.mdx +0 -46
  108. package/src/components/atoms/badget/badget.stories.tsx +0 -75
  109. package/src/components/atoms/button/button.doc.mdx +0 -59
  110. package/src/components/atoms/button/button.stories.tsx +0 -173
  111. package/src/components/atoms/checkbox/checkbox.doc.mdx +0 -54
  112. package/src/components/atoms/checkbox/checkbox.stories.tsx +0 -53
  113. package/src/components/atoms/chip/chip.doc.mdx +0 -47
  114. package/src/components/atoms/chip/chip.stories.tsx +0 -64
  115. package/src/components/atoms/divider/divider.doc.mdx +0 -42
  116. package/src/components/atoms/divider/divider.stories.tsx +0 -33
  117. package/src/components/atoms/flex/flex.doc.mdx +0 -59
  118. package/src/components/atoms/flex/flex.stories.tsx +0 -70
  119. package/src/components/atoms/grid/grid.doc.mdx +0 -54
  120. package/src/components/atoms/grid/grid.stories.tsx +0 -71
  121. package/src/components/atoms/image/image.doc.mdx +0 -44
  122. package/src/components/atoms/image/image.stories.tsx +0 -48
  123. package/src/components/atoms/input/input.doc.mdx +0 -70
  124. package/src/components/atoms/input/input.stories.tsx +0 -113
  125. package/src/components/atoms/input-number/input-number.doc.mdx +0 -74
  126. package/src/components/atoms/input-number/input-number.stories.tsx +0 -111
  127. package/src/components/atoms/loader/loader.doc.mdx +0 -43
  128. package/src/components/atoms/loader/loader.stories.tsx +0 -104
  129. package/src/components/atoms/popover/popover.doc.mdx +0 -53
  130. package/src/components/atoms/popover/popover.stories.tsx +0 -24
  131. package/src/components/atoms/progress/progress.doc.mdx +0 -48
  132. package/src/components/atoms/progress/progress.stories.tsx +0 -39
  133. package/src/components/atoms/radio/radio.doc.mdx +0 -62
  134. package/src/components/atoms/radio/radio.stories.tsx +0 -48
  135. package/src/components/atoms/segmented-control/segmented-control.doc.mdx +0 -60
  136. package/src/components/atoms/segmented-control/segmented-control.stories.tsx +0 -62
  137. package/src/components/atoms/skeleton/skeleton.doc.mdx +0 -43
  138. package/src/components/atoms/skeleton/skeleton.stories.tsx +0 -29
  139. package/src/components/atoms/slide/slide.doc.mdx +0 -46
  140. package/src/components/atoms/slide/slide.stories.tsx +0 -120
  141. package/src/components/atoms/slider/slider.doc.mdx +0 -49
  142. package/src/components/atoms/slider/slider.stories.tsx +0 -29
  143. package/src/components/atoms/stack/stack.doc.mdx +0 -126
  144. package/src/components/atoms/stack/stack.stories.tsx +0 -283
  145. package/src/components/atoms/text/text.doc.mdx +0 -41
  146. package/src/components/atoms/text/text.stories.tsx +0 -66
  147. package/src/components/atoms/textarea/textarea.doc.mdx +0 -64
  148. package/src/components/atoms/textarea/textarea.stories.tsx +0 -26
  149. package/src/components/atoms/tooltip/tooltip.doc.mdx +0 -47
  150. package/src/components/atoms/tooltip/tooltip.stories.tsx +0 -19
  151. package/src/components/isolation/isolation.stories.tsx +0 -202
  152. package/src/components/molecules/accordion/accordion.doc.mdx +0 -47
  153. package/src/components/molecules/accordion/accordion.stories.tsx +0 -68
  154. package/src/components/molecules/alert/alert.doc.mdx +0 -48
  155. package/src/components/molecules/alert/alert.stories.tsx +0 -40
  156. package/src/components/molecules/breadcrumbs/breadcrumbs.doc.mdx +0 -57
  157. package/src/components/molecules/breadcrumbs/breadcrumbs.stories.tsx +0 -20
  158. package/src/components/molecules/calendar/calendar.doc.mdx +0 -76
  159. package/src/components/molecules/calendar/calendar.stories.tsx +0 -90
  160. package/src/components/molecules/card/card.doc.mdx +0 -54
  161. package/src/components/molecules/card/card.stories.tsx +0 -57
  162. package/src/components/molecules/chip-input/chip-input.doc.mdx +0 -44
  163. package/src/components/molecules/chip-input/chip-input.stories.tsx +0 -52
  164. package/src/components/molecules/date-picker/date-picker.doc.mdx +0 -65
  165. package/src/components/molecules/date-picker/date-picker.stories.tsx +0 -88
  166. package/src/components/molecules/dropdown-menu/dropdown-menu.doc.mdx +0 -46
  167. package/src/components/molecules/dropdown-menu/dropdown-menu.stories.tsx +0 -41
  168. package/src/components/molecules/empty-state/empty-state.doc.mdx +0 -50
  169. package/src/components/molecules/empty-state/empty-state.stories.tsx +0 -19
  170. package/src/components/molecules/field/field.doc.mdx +0 -43
  171. package/src/components/molecules/field/field.stories.tsx +0 -42
  172. package/src/components/molecules/form-header/form-header.doc.mdx +0 -38
  173. package/src/components/molecules/form-header/form-header.stories.tsx +0 -52
  174. package/src/components/molecules/masked-input/masked-input.doc.mdx +0 -78
  175. package/src/components/molecules/masked-input/masked-input.stories.tsx +0 -126
  176. package/src/components/molecules/multi-select/multi-select.doc.mdx +0 -55
  177. package/src/components/molecules/multi-select/multi-select.stories.tsx +0 -59
  178. package/src/components/molecules/pagination/pagination.doc.mdx +0 -62
  179. package/src/components/molecules/pagination/pagination.stories.tsx +0 -110
  180. package/src/components/molecules/search-select/search-select.doc.mdx +0 -77
  181. package/src/components/molecules/search-select/search-select.stories.tsx +0 -146
  182. package/src/components/molecules/select/select.doc.mdx +0 -75
  183. package/src/components/molecules/select/select.stories.tsx +0 -85
  184. package/src/components/molecules/stat-card/stat-card.doc.mdx +0 -48
  185. package/src/components/molecules/stat-card/stat-card.stories.tsx +0 -40
  186. package/src/components/molecules/stepper/stepper.doc.mdx +0 -54
  187. package/src/components/molecules/stepper/stepper.stories.tsx +0 -154
  188. package/src/components/molecules/table/table.doc.mdx +0 -123
  189. package/src/components/molecules/table/table.stories.tsx +0 -402
  190. package/src/components/molecules/tabs/tabs.doc.mdx +0 -52
  191. package/src/components/molecules/tabs/tabs.stories.tsx +0 -31
  192. package/src/components/molecules/time-picker/timePicker.doc.mdx +0 -68
  193. package/src/components/molecules/time-picker/timePicker.stories.tsx +0 -130
  194. package/src/components/molecules/wysiwyg/wysiwyg.stories.tsx +0 -95
  195. package/src/components/organisms/confirm-dialog/confirm-dialog.doc.mdx +0 -60
  196. package/src/components/organisms/confirm-dialog/confirm-dialog.stories.tsx +0 -32
  197. package/src/components/organisms/data-table/ITDataTable.doc.mdx +0 -115
  198. package/src/components/organisms/data-table/ITDataTable.stories.tsx +0 -353
  199. package/src/components/organisms/dialog/dialog.doc.mdx +0 -54
  200. package/src/components/organisms/dialog/dialog.stories.tsx +0 -126
  201. package/src/components/organisms/drawer/drawer.doc.mdx +0 -59
  202. package/src/components/organisms/drawer/drawer.stories.tsx +0 -40
  203. package/src/components/organisms/dropfile/dropfile.doc.mdx +0 -74
  204. package/src/components/organisms/dropfile/dropfile.stories.tsx +0 -93
  205. package/src/components/organisms/form-builder/formBuilder.doc.mdx +0 -251
  206. package/src/components/organisms/form-builder/formBuilder.stories.tsx +0 -914
  207. package/src/components/organisms/navbar/navbar.doc.mdx +0 -77
  208. package/src/components/organisms/navbar/navbar.stories.tsx +0 -83
  209. package/src/components/organisms/page-header/page-header.doc.mdx +0 -54
  210. package/src/components/organisms/page-header/page-header.stories.tsx +0 -74
  211. package/src/components/organisms/searchTable/searchTable.doc.mdx +0 -79
  212. package/src/components/organisms/searchTable/searchTable.stories.tsx +0 -73
  213. package/src/components/organisms/sidebar/sidebar.doc.mdx +0 -176
  214. package/src/components/organisms/sidebar/sidebar.stories.tsx +0 -234
  215. package/src/components/organisms/toast/toast.doc.mdx +0 -50
  216. package/src/components/organisms/toast/toast.stories.tsx +0 -137
  217. package/src/components/organisms/topbar/topbar.doc.mdx +0 -72
  218. package/src/components/organisms/topbar/topbar.stories.tsx +0 -79
  219. package/src/components/organisms/triple-filter/tripleFilter.doc.mdx +0 -62
  220. package/src/components/organisms/triple-filter/tripleFilter.stories.tsx +0 -31
  221. package/src/components/templates/layout/layout.doc.mdx +0 -53
  222. package/src/components/templates/layout/layout.stories.tsx +0 -113
  223. package/src/components/templates/page/page.doc.mdx +0 -86
  224. package/src/components/templates/page/page.stories.tsx +0 -97
  225. package/src/components/theme-provider/themeProvider.doc.mdx +0 -85
  226. package/src/components/theme-provider/themeProvider.stories.tsx +0 -58
@@ -35,6 +35,7 @@ import {
35
35
  } from "../index";
36
36
  import type { ITSidebarProps } from "../index";
37
37
  import { ShowcaseLayout, CodeViewer } from "./ShowcaseLayout";
38
+ import { useITTranslation } from "@/i18n";
38
39
 
39
40
  // ─────────────────────────────────────────
40
41
  // 1. ITCard Showcase
@@ -252,19 +253,20 @@ const GallerySection = ({ title, subtitle, children }: { title: string; subtitle
252
253
  );
253
254
 
254
255
  const PatternCard = ({ title, desc, code, children }: { title: string; desc?: string; code?: string; children: React.ReactNode }) => {
256
+ const { t } = useITTranslation();
255
257
  const [showCode, setShowCode] = useState(false);
256
258
  return (
257
259
  <div className="bg-white dark:bg-slate-900/60 rounded-2xl border border-slate-200 dark:border-slate-700 shadow-sm hover:shadow-md transition-shadow overflow-hidden">
258
260
  <div className="flex items-start justify-between gap-2 p-4 pb-3">
259
261
  <div className="min-w-0">
260
- <p className="text-sm font-semibold text-slate-800 dark:text-slate-100">{title}</p>
262
+ <p className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{title}</p>
261
263
  {desc && <p className="text-[11px] text-slate-500 dark:text-slate-400 mt-0.5">{desc}</p>}
262
264
  </div>
263
265
  {code && (
264
266
  <ITButton variant="outlined" color="gray" size="sm" onClick={() => setShowCode(!showCode)}>
265
267
  <ITFlex align="center" gap={1}>
266
268
  <FaCode size={9} />
267
- {showCode ? "Hide code" : "Code"}
269
+ {showCode ? t("showcase.common.hideCode") : t("showcase.common.code")}
268
270
  </ITFlex>
269
271
  </ITButton>
270
272
  )}
@@ -280,6 +282,7 @@ const PatternCard = ({ title, desc, code, children }: { title: string; desc?: st
280
282
  };
281
283
 
282
284
  export const CardShowcase = () => {
285
+ const { t } = useITTranslation();
283
286
  const [title, setTitle] = useState("Monthly revenue");
284
287
  const [showActions, setShowActions] = useState(true);
285
288
  const [showImage, setShowImage] = useState(false);
@@ -301,7 +304,7 @@ export const CardShowcase = () => {
301
304
  return (
302
305
  <ShowcaseLayout
303
306
  title="ITCard"
304
- description="Contenedor multipropósito con cabecera opcional, imagen, contenido y pie de acciones. Se vuelve interactivo con `onClick` (efecto hover)."
307
+ description={t("showcase.structure.cardDesc")}
305
308
  code={buildCode()}
306
309
  demo={
307
310
  <div className="w-full max-w-xl flex flex-col">
@@ -327,7 +330,7 @@ export const CardShowcase = () => {
327
330
 
328
331
  {/* Fixed footer with active-property badges */}
329
332
  <div className="sticky bottom-0 mt-4 -mx-6 -mb-6 px-6 py-3 bg-white/95 dark:bg-slate-900/95 backdrop-blur-sm border-t border-slate-200 dark:border-slate-700 flex items-center flex-wrap gap-1.5 text-[10px] font-mono">
330
- <span className="text-[9px] uppercase tracking-wider font-bold text-slate-400 dark:text-slate-500 mr-1">Active:</span>
333
+ <span className="text-[9px] uppercase tracking-wider font-bold text-slate-400 dark:text-slate-500 mr-1">{t("showcase.common.activeLabel")}</span>
331
334
  {title && <span className="px-2 py-0.5 rounded-md bg-slate-900 text-white dark:bg-white dark:text-slate-900 font-semibold">title</span>}
332
335
  {showImage && <span className="px-2 py-0.5 rounded-md bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300">image</span>}
333
336
  {showActions && <span className="px-2 py-0.5 rounded-md bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300">actions</span>}
@@ -339,37 +342,43 @@ export const CardShowcase = () => {
339
342
  <ITStack spacing={4}>
340
343
  <ITInput
341
344
  name="title_ctrl"
342
- label="Title"
345
+ label={t("showcase.structure.cardTitleLabel")}
343
346
  value={title}
344
347
  onChange={(e: any) => setTitle(e.target.value)}
345
348
  onBlur={() => { }}
346
- placeholder="Leave empty to hide"
349
+ placeholder={t("showcase.structure.cardTitlePlaceholder")}
347
350
  />
348
351
  <div className="flex items-center justify-between pt-1">
349
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Show image</span>
350
- <ITSlideToggle isOn={showImage} onToggle={setShowImage} size="sm" />
352
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.structure.showImage")}</span>
353
+ <ITSlideToggle isOn={showImage} onToggle={setShowImage} size="sm"
354
+ ariaLabel={t("showcase.structure.showImage")}
355
+ />
351
356
  </div>
352
357
  <div className="flex items-center justify-between">
353
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Show actions</span>
354
- <ITSlideToggle isOn={showActions} onToggle={setShowActions} size="sm" />
358
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.structure.showActions")}</span>
359
+ <ITSlideToggle isOn={showActions} onToggle={setShowActions} size="sm"
360
+ ariaLabel={t("showcase.structure.showActions")}
361
+ />
355
362
  </div>
356
363
  <div className="flex items-center justify-between">
357
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Interactive (onClick)</span>
358
- <ITSlideToggle isOn={clickable} onToggle={setClickable} size="sm" />
364
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.structure.interactiveOnClick")}</span>
365
+ <ITSlideToggle isOn={clickable} onToggle={setClickable} size="sm"
366
+ ariaLabel={t("showcase.structure.interactiveOnClick")}
367
+ />
359
368
  </div>
360
369
  </ITStack>
361
370
  }
362
371
  gallery={
363
372
  <ITStack spacing={8}>
364
373
  <GallerySection
365
- title="Real UI cases"
366
- subtitle="Production-ready card layouts built with ITCard"
374
+ title={t("showcase.structure.galleryRealCases")}
375
+ subtitle={t("showcase.structure.galleryCardsSubtitle")}
367
376
  >
368
377
  <div className="grid grid-cols-1 lg:grid-cols-2 gap-5">
369
378
 
370
379
  {/* 1. Course progress — ITProgress + ITBadget + ITDivider + ITText */}
371
380
  <PatternCard
372
- title="Course progress"
381
+ title={t("showcase.structure.patternCourseProgress")}
373
382
  desc="ITProgress + ITBadget + ITDivider + ITText"
374
383
  code={CARD_PATTERN_CODES.course}
375
384
  >
@@ -403,7 +412,7 @@ export const CardShowcase = () => {
403
412
 
404
413
  {/* 2. Featured pricing plan — ITBadget outside + ITFlex + ITStack + ITDivider */}
405
414
  <PatternCard
406
- title="Featured pricing plan"
415
+ title={t("showcase.structure.patternPricing")}
407
416
  desc="ITBadget + ITDivider + ITStack with ITFlex items"
408
417
  code={CARD_PATTERN_CODES.pricing}
409
418
  >
@@ -443,7 +452,7 @@ export const CardShowcase = () => {
443
452
 
444
453
  {/* 3. Activity feed item — ITText + ITBadget for commit hash + ITDivider separators */}
445
454
  <PatternCard
446
- title="Activity feed item"
455
+ title={t("showcase.structure.patternActivity")}
447
456
  desc="ITText + ITBadget (commit hash) + ITDivider separators"
448
457
  code={CARD_PATTERN_CODES.activity}
449
458
  >
@@ -485,7 +494,7 @@ export const CardShowcase = () => {
485
494
 
486
495
  {/* 4. Team member profile — ITFlex + ITBadget for skills + ITText throughout */}
487
496
  <PatternCard
488
- title="Team member profile"
497
+ title={t("showcase.structure.patternTeamMember")}
489
498
  desc="ITFlex + ITBadget skills + ITText throughout"
490
499
  code={CARD_PATTERN_CODES.teamMember}
491
500
  >
@@ -530,6 +539,7 @@ export const CardShowcase = () => {
530
539
 
531
540
  // 2. ITText Showcase
532
541
  export const TextShowcase = () => {
542
+ const { t } = useITTranslation();
533
543
  const [element, setElement] = useState("p");
534
544
  const [size, setSize] = useState("text-base");
535
545
  const [bold, setBold] = useState(false);
@@ -583,7 +593,7 @@ export const TextShowcase = () => {
583
593
  return (
584
594
  <ShowcaseLayout
585
595
  title="ITText"
586
- description="Wrapper tipográfico semántico. Renderiza cualquier elemento HTML, con soporte para truncado por caracteres, clamp de líneas y corte programático."
596
+ description={t("showcase.structure.textDesc")}
587
597
  code={buildCode()}
588
598
  demo={
589
599
  <div className="w-full flex flex-col">
@@ -592,7 +602,7 @@ export const TextShowcase = () => {
592
602
  {/* BIG element indicator — makes the `as` change unmissable */}
593
603
  <ITStack spacing={2} alignItems="center" className="mb-5 text-center">
594
604
  <ITText muted as="span" className="text-[10px] uppercase tracking-wider font-bold">
595
- Rendering as
605
+ {t("showcase.structure.renderingAs")}
596
606
  </ITText>
597
607
  <code
598
608
  key={element}
@@ -617,7 +627,7 @@ export const TextShowcase = () => {
617
627
 
618
628
  {/* Fixed footer with active-property badges */}
619
629
  <div className="sticky bottom-0 mt-4 -mx-6 -mb-6 px-6 py-3 bg-white/95 dark:bg-slate-900/95 backdrop-blur-sm border-t border-slate-200 dark:border-slate-700 flex items-center flex-wrap gap-1.5 text-[10px] font-mono">
620
- <span className="text-[9px] uppercase tracking-wider font-bold text-slate-400 dark:text-slate-500 mr-1">Active:</span>
630
+ <span className="text-[9px] uppercase tracking-wider font-bold text-slate-400 dark:text-slate-500 mr-1">{t("showcase.common.activeLabel")}</span>
621
631
  {element !== "p" && <span className="px-2 py-0.5 rounded-md bg-slate-900 text-white dark:bg-white dark:text-slate-900 font-semibold">as=&quot;{element}&quot;</span>}
622
632
  <span className="px-2 py-0.5 rounded-md bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300">{size}</span>
623
633
  {bold && <span className="px-2 py-0.5 rounded-md bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300">font-bold</span>}
@@ -632,7 +642,7 @@ export const TextShowcase = () => {
632
642
  <ITStack spacing={4}>
633
643
  <ITSelect
634
644
  name="elem_ctrl"
635
- label="Elemento HTML (as)"
645
+ label={t("showcase.structure.elementAs")}
636
646
  value={element}
637
647
  onChange={(e) => setElement(e.target.value)}
638
648
  options={[
@@ -647,7 +657,7 @@ export const TextShowcase = () => {
647
657
  />
648
658
  <ITSelect
649
659
  name="sz_ctrl"
650
- label="Tamaño"
660
+ label={t("showcase.common.size")}
651
661
  value={size}
652
662
  onChange={(e) => setSize(e.target.value)}
653
663
  options={[
@@ -661,7 +671,7 @@ export const TextShowcase = () => {
661
671
  />
662
672
  <ITSelect
663
673
  name="clamp_ctrl"
664
- label="Número de líneas (lineClamp)"
674
+ label={t("showcase.structure.lineClampLabel")}
665
675
  value={String(lineClamp)}
666
676
  onChange={(e) => setLineClamp(Number(e.target.value))}
667
677
  options={[
@@ -674,39 +684,39 @@ export const TextShowcase = () => {
674
684
  />
675
685
  <ITInput
676
686
  name="max_ctrl"
677
- label="Texto máximo (caracteres)"
687
+ label={t("showcase.structure.maxTextLabel")}
678
688
  type="number"
679
689
  value={maxLength}
680
690
  onChange={(e) => setMaxLength(e.target.value)}
681
- placeholder="0 = sin límite"
691
+ placeholder={t("showcase.structure.noLimit")}
682
692
  />
683
693
  <ITFlex justify="between" align="center">
684
694
  <ITText muted as="span" className="text-[10px]">
685
- Trunca con "…" al superar (0 = desactivado).
695
+ {t("showcase.structure.truncateHint")}
686
696
  </ITText>
687
697
  <ITButton variant="text" color="primary" size="sm" onClick={() => setMaxLength("0")}>
688
- Reset
698
+ {t("showcase.common.reset")}
689
699
  </ITButton>
690
700
  </ITFlex>
691
701
  <ITInput
692
702
  name="break_ctrl"
693
- label="Salto de línea después de (caracteres)"
703
+ label={t("showcase.structure.breakLabel")}
694
704
  type="number"
695
705
  value={breakLength}
696
706
  onChange={(e) => setBreakLength(e.target.value)}
697
- placeholder="0 = sin salto"
707
+ placeholder={t("showcase.structure.noBreak")}
698
708
  />
699
709
  <ITFlex justify="between" align="center">
700
710
  <ITText muted as="span" className="text-[10px]">
701
- Inserta un &lt;br /&gt; al superar el límite.
711
+ {t("showcase.structure.brHint")}
702
712
  </ITText>
703
713
  <ITButton variant="text" color="primary" size="sm" onClick={() => setBreakLength("0")}>
704
- Reset
714
+ {t("showcase.common.reset")}
705
715
  </ITButton>
706
716
  </ITFlex>
707
717
  <div>
708
718
  <ITText as="label" htmlFor="break_ctrl" className="text-xs font-semibold text-slate-600 dark:text-slate-400 block mb-1">
709
- breakLengthWrap (corte cada N caracteres)
719
+ {t("showcase.structure.breakWrapLabel")}
710
720
  </ITText>
711
721
  <input
712
722
  id="break_ctrl"
@@ -716,42 +726,46 @@ export const TextShowcase = () => {
716
726
  value={breakLength}
717
727
  onChange={(e) => setBreakLength(e.target.value)}
718
728
  className="w-full bg-slate-50 dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-lg p-2 text-xs text-slate-800 dark:text-slate-100 outline-none focus:ring-2 focus:ring-primary-500"
719
- placeholder="0 = sin corte"
729
+ placeholder={t("showcase.structure.noCut")}
720
730
  />
721
731
  <ITFlex justify="between" align="center" className="mt-1.5">
722
732
  <ITText muted as="span" className="text-[10px]">
723
- Inserta oportunidades de corte cada N chars (0 = desactivado).
733
+ {t("showcase.structure.cutHint")}
724
734
  </ITText>
725
735
  <button
726
736
  type="button"
727
737
  onClick={() => setBreakLength("0")}
728
738
  className="text-[10px] font-semibold text-primary-600 hover:text-primary-700 dark:text-primary-400"
729
739
  >
730
- Reset
740
+ {t("showcase.common.reset")}
731
741
  </button>
732
742
  </ITFlex>
733
743
  </div>
734
744
  <div className="flex items-center justify-between pt-1">
735
- <ITText as="span" className="text-sm font-semibold text-slate-700 dark:text-slate-300">Negrita (font-bold)</ITText>
736
- <ITSlideToggle isOn={bold} onToggle={setBold} size="sm" />
745
+ <ITText as="span" className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.structure.boldLabel")}</ITText>
746
+ <ITSlideToggle isOn={bold} onToggle={setBold} size="sm"
747
+ ariaLabel={t("showcase.structure.boldLabel")}
748
+ />
737
749
  </div>
738
750
  <div className="flex items-center justify-between">
739
- <ITText as="span" className="text-sm font-semibold text-slate-700 dark:text-slate-300">Muted color</ITText>
740
- <ITSlideToggle isOn={muted} onToggle={setMuted} size="sm" />
751
+ <ITText as="span" className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.structure.mutedLabel")}</ITText>
752
+ <ITSlideToggle isOn={muted} onToggle={setMuted} size="sm"
753
+ ariaLabel={t("showcase.structure.mutedLabel")}
754
+ />
741
755
  </div>
742
756
  </ITStack>
743
757
  }
744
758
  gallery={
745
759
  <ITStack spacing={8}>
746
760
  <GallerySection
747
- title="Real UI cases"
748
- subtitle="Production-ready typography patterns built with ITText"
761
+ title={t("showcase.structure.galleryRealCases")}
762
+ subtitle={t("showcase.structure.galleryTextSubtitle")}
749
763
  >
750
764
  <div className="grid grid-cols-1 lg:grid-cols-2 gap-5">
751
765
 
752
766
  {/* 1. Article header — eyebrow + title + meta */}
753
767
  <PatternCard
754
- title="Article header"
768
+ title={t("showcase.structure.patternArticleHeader")}
755
769
  desc="eyebrow tag + h1 title + author/date/read-time meta"
756
770
  code={TEXT_PATTERN_CODES.articleHeader}
757
771
  >
@@ -779,7 +793,7 @@ export const TextShowcase = () => {
779
793
 
780
794
  {/* 2. Section heading — h2 + description + action link */}
781
795
  <PatternCard
782
- title="Section heading"
796
+ title={t("showcase.structure.patternSectionHeading")}
783
797
  desc="h2 title + description + action link on the right"
784
798
  code={TEXT_PATTERN_CODES.sectionHeading}
785
799
  >
@@ -798,7 +812,7 @@ export const TextShowcase = () => {
798
812
 
799
813
  {/* 3. Empty state — big title + description + muted helper */}
800
814
  <PatternCard
801
- title="Empty state"
815
+ title={t("showcase.structure.patternEmptyState")}
802
816
  desc="big title + description + muted helper text"
803
817
  code={TEXT_PATTERN_CODES.emptyState}
804
818
  >
@@ -826,7 +840,7 @@ export const TextShowcase = () => {
826
840
 
827
841
  {/* 4. Inline content — paragraph with bold name + inline code + muted meta */}
828
842
  <PatternCard
829
- title="Inline content"
843
+ title={t("showcase.structure.patternInlineContent")}
830
844
  desc="paragraph with bold name + inline code + muted timestamp"
831
845
  code={TEXT_PATTERN_CODES.inlineContent}
832
846
  >
@@ -854,13 +868,13 @@ export const TextShowcase = () => {
854
868
 
855
869
  {/* 5. Form labels — label + helper text */}
856
870
  <PatternCard
857
- title="Form labels"
871
+ title={t("showcase.structure.patternFormLabels")}
858
872
  desc="label + required asterisk + muted helper text"
859
873
  code={TEXT_PATTERN_CODES.formLabels}
860
874
  >
861
875
  <ITStack spacing={4} className="max-w-sm">
862
876
  <div>
863
- <ITText as="label" className="text-sm font-semibold text-slate-700 dark:text-slate-200 block mb-1">
877
+ <ITText as="label" className="block mb-1 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">
864
878
  Workspace name <ITText as="span" className="text-danger-500">*</ITText>
865
879
  </ITText>
866
880
  <ITInput
@@ -875,7 +889,7 @@ export const TextShowcase = () => {
875
889
  </ITText>
876
890
  </div>
877
891
  <div>
878
- <ITText as="label" className="text-sm font-semibold text-slate-700 dark:text-slate-200 block mb-1">
892
+ <ITText as="label" className="block mb-1 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">
879
893
  Description
880
894
  </ITText>
881
895
  <ITInput
@@ -903,6 +917,7 @@ export const TextShowcase = () => {
903
917
 
904
918
  // 3. ITLayout & ITNavbar Showcase
905
919
  export const LayoutShowcase = () => {
920
+ const { t } = useITTranslation();
906
921
  const [collapsed, setCollapsed] = useState(true);
907
922
  const [activeId, setActiveId] = useState("dashboard");
908
923
  const [navActiveId, setNavActiveId] = useState<string | null>("1");
@@ -913,55 +928,55 @@ export const LayoutShowcase = () => {
913
928
  centerContent: (
914
929
  <input
915
930
  type="search"
916
- placeholder="Buscar componente…"
931
+ placeholder={t("sandbox.search.placeholder")}
917
932
  className="w-full rounded-lg border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 px-3 py-1.5 text-xs text-slate-700 dark:text-slate-200 outline-none focus:ring-2 focus:ring-primary-500/40"
918
933
  />
919
934
  ),
920
935
  navItems: [
921
- { id: "home", label: "Inicio", icon: <FaHome />, action: () => setActiveId("home") },
922
- { id: "docs", label: "Documentos", icon: <FaFileAlt />, action: () => setActiveId("docs") },
923
- { id: "alerts", label: "Alertas", icon: <FaBell />, action: () => setActiveId("alerts") },
936
+ { id: "home", label: t("showcase.common.home"), icon: <FaHome />, action: () => setActiveId("home") },
937
+ { id: "docs", label: t("showcase.structure.navDocuments"), icon: <FaFileAlt />, action: () => setActiveId("docs") },
938
+ { id: "alerts", label: t("showcase.structure.navAlerts"), icon: <FaBell />, action: () => setActiveId("alerts") },
924
939
  ],
925
940
  onNavItemClick: (id: string) => setActiveId(id),
926
941
  userMenu: {
927
942
  userName: "Auditor AXZY",
928
943
  userEmail: "auditor@axzy.dev",
929
944
  menuItems: [
930
- { label: "Ajustes", onClick: () => {} },
931
- { label: "Cerrar sesión", onClick: () => {} },
945
+ { label: t("showcase.structure.navSettings"), onClick: () => {} },
946
+ { label: t("showcase.structure.navLogout"), onClick: () => {} },
932
947
  ],
933
948
  },
934
949
  };
935
950
 
936
951
  const sidebar: ITSidebarProps = {
937
952
  navigationItems: [
938
- { id: "dashboard", label: "Dashboard", icon: <FaChartLine />, isActive: activeId === "dashboard", action: () => setActiveId("dashboard") },
939
- { id: "users", label: "Usuarios", icon: <FaUsers />, isActive: activeId === "users", action: () => setActiveId("users"), badge: 4 },
953
+ { id: "dashboard", label: t("showcase.structure.navDashboard"), icon: <FaChartLine />, isActive: activeId === "dashboard", action: () => setActiveId("dashboard") },
954
+ { id: "users", label: t("showcase.structure.navUsers"), icon: <FaUsers />, isActive: activeId === "users", action: () => setActiveId("users"), badge: 4 },
940
955
  {
941
956
  id: "sales",
942
- label: "Ventas",
957
+ label: t("showcase.structure.navSales"),
943
958
  icon: <FaShoppingCart />,
944
959
  isActive: activeId === "sales" || activeId === "orders" || activeId === "quotes",
945
960
  subitems: [
946
961
  {
947
962
  id: "sales-gestion",
948
- label: "Gestión",
963
+ label: t("showcase.structure.navManagement"),
949
964
  items: [
950
- { id: "orders", label: "Órdenes", action: () => setActiveId("orders") },
951
- { id: "invoices", label: "Facturas", action: () => setActiveId("invoices") },
965
+ { id: "orders", label: t("showcase.structure.navOrders"), action: () => setActiveId("orders") },
966
+ { id: "invoices", label: t("showcase.structure.navInvoices"), action: () => setActiveId("invoices") },
952
967
  ],
953
968
  },
954
969
  {
955
970
  id: "sales-catalogo",
956
- label: "Catálogo",
971
+ label: t("showcase.structure.navCatalog"),
957
972
  items: [
958
- { id: "quotes", label: "Cotizaciones", action: () => setActiveId("quotes") },
973
+ { id: "quotes", label: t("showcase.structure.navQuotes"), action: () => setActiveId("quotes") },
959
974
  ],
960
975
  },
961
976
  ],
962
977
  },
963
- { id: "products", label: "Productos", icon: <FaBoxOpen />, isActive: activeId === "products", action: () => setActiveId("products"), badge: 12 },
964
- { id: "settings", label: "Configuración", icon: <FaCog />, isActive: activeId === "settings", action: () => setActiveId("settings"), badge: 3, badgeProps: { color: "warning", variant: "outlined" } },
978
+ { id: "products", label: t("showcase.structure.navProducts"), icon: <FaBoxOpen />, isActive: activeId === "products", action: () => setActiveId("products"), badge: 12 },
979
+ { id: "settings", label: t("showcase.structure.navConfiguration"), icon: <FaCog />, isActive: activeId === "settings", action: () => setActiveId("settings"), badge: 3, badgeProps: { color: "warning", variant: "outlined" } },
965
980
  ],
966
981
  isCollapsed: collapsed,
967
982
  header: (
@@ -976,7 +991,7 @@ export const LayoutShowcase = () => {
976
991
  notification: {
977
992
  count: 5,
978
993
  icon: <FaBell />,
979
- label: "Notificaciones",
994
+ label: t("sandbox.notifications"),
980
995
  onClick: () => setActiveId("notifications"),
981
996
  badgeProps: { color: "danger" },
982
997
  },
@@ -1027,27 +1042,15 @@ export const LayoutShowcase = () => {
1027
1042
  </ITLayout>`;
1028
1043
 
1029
1044
  const navbarItems = [
1030
- { id: "1", label: "Inicio", icon: <FaHome />, isActive: navActiveId === "1", action: () => setNavActiveId("1") },
1031
- { id: "2", label: "Documentos", icon: <FaFileAlt />, isActive: navActiveId === "2", action: () => setNavActiveId("2") },
1032
- { id: "3", label: "Alertas", icon: <FaBell />, isActive: navActiveId === "3", action: () => setNavActiveId("3") },
1045
+ { id: "1", label: t("showcase.common.home"), icon: <FaHome />, isActive: navActiveId === "1", action: () => setNavActiveId("1") },
1046
+ { id: "2", label: t("showcase.structure.navDocuments"), icon: <FaFileAlt />, isActive: navActiveId === "2", action: () => setNavActiveId("2") },
1047
+ { id: "3", label: t("showcase.structure.navAlerts"), icon: <FaBell />, isActive: navActiveId === "3", action: () => setNavActiveId("3") },
1033
1048
  ];
1034
1049
 
1035
- const navbarCode = `<ITNavbar
1036
- logoText="AXZY"
1037
- navigationItems={[
1038
- { id: "1", label: "Inicio", icon: <FaHome />, isActive: true },
1039
- { id: "2", label: "Documentos", icon: <FaFileAlt /> },
1040
- { id: "3", label: "Alertas", icon: <FaBell /> }
1041
- ]}
1042
- userMenu={{
1043
- userName: "Auditor AXZY",
1044
- userEmail: "auditor@axzy.dev",
1045
- menuItems: [{ label: "Ajustes", onClick: () => {} }]
1046
- }}
1047
- />`;
1048
1050
 
1049
1051
  return (
1050
1052
  <ShowcaseLayout
1053
+ demoAncho="completo"
1051
1054
  title="ITLayout & ITNavbar"
1052
1055
  description="Chasis estructural del portal con barra superior y lateral colapsable. Totalmente responsivo con drawer móvil."
1053
1056
  code={code}
@@ -1056,28 +1059,28 @@ export const LayoutShowcase = () => {
1056
1059
  <ITLayout topBar={topBar} sidebar={sidebar}>
1057
1060
  <ITStack spacing={5}>
1058
1061
  <ITPageHeader
1059
- title="Dashboard"
1060
- description="Resumen general del sistema"
1062
+ title={t("showcase.structure.navDashboard")}
1063
+ description={t("showcase.structure.dashboardDesc")}
1061
1064
  icon={<FaChartLine size={20} />}
1062
1065
  iconColor="#6366f1"
1063
1066
  />
1064
1067
  <ITGrid container spacing={3}>
1065
1068
  <ITGrid item xs={12} sm={6} lg={3}>
1066
- <ITStatCard label="Usuarios" value="1,245" trend="+12%" trendDirection="up" />
1069
+ <ITStatCard label={t("showcase.structure.navUsers")} value="1,245" trend="+12%" trendDirection="up" />
1067
1070
  </ITGrid>
1068
1071
  <ITGrid item xs={12} sm={6} lg={3}>
1069
- <ITStatCard label="Ventas Hoy" value="$4,320" trend="+5.4%" trendDirection="up" color="bg-blue-50 dark:bg-blue-950/20" />
1072
+ <ITStatCard label={t("showcase.structure.statSalesToday")} value="$4,320" trend="+5.4%" trendDirection="up" color="bg-blue-50 dark:bg-blue-950/20" />
1070
1073
  </ITGrid>
1071
1074
  <ITGrid item xs={12} sm={6} lg={3}>
1072
- <ITStatCard label="Órdenes" value="89" trend="-2.1%" trendDirection="down" color="bg-amber-50 dark:bg-amber-950/20" />
1075
+ <ITStatCard label={t("showcase.structure.navOrders")} value="89" trend="-2.1%" trendDirection="down" color="bg-amber-50 dark:bg-amber-950/20" />
1073
1076
  </ITGrid>
1074
1077
  <ITGrid item xs={12} sm={6} lg={3}>
1075
- <ITStatCard label="Tickets" value="12" trend="-8%" trendDirection="down" color="bg-rose-50 dark:bg-rose-950/20" />
1078
+ <ITStatCard label={t("showcase.structure.statTickets")} value="12" trend="-8%" trendDirection="down" color="bg-rose-50 dark:bg-rose-950/20" />
1076
1079
  </ITGrid>
1077
1080
  </ITGrid>
1078
- <ITCard title="Actividad reciente">
1081
+ <ITCard title={t("showcase.structure.recentActivity")}>
1079
1082
  <ITText className="text-sm text-slate-600 dark:text-slate-300">
1080
- El layout se adapta al colapsar/expandir el sidebar y muestra un drawer en móvil.
1083
+ {t("showcase.structure.layoutBody")}
1081
1084
  </ITText>
1082
1085
  </ITCard>
1083
1086
  </ITStack>
@@ -1087,19 +1090,23 @@ export const LayoutShowcase = () => {
1087
1090
  controls={
1088
1091
  <ITStack spacing={4}>
1089
1092
  <div className="flex items-center justify-between">
1090
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Sidebar colapsado</span>
1091
- <ITSlideToggle isOn={collapsed} onToggle={setCollapsed} size="sm" />
1093
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.structure.sidebarCollapsed")}</span>
1094
+ <ITSlideToggle isOn={collapsed} onToggle={setCollapsed} size="sm"
1095
+ ariaLabel={t("showcase.structure.sidebarCollapsed")}
1096
+ />
1092
1097
  </div>
1093
1098
  <div className="text-xs text-slate-500">
1094
- En móvil (&lt;lg) el sidebar se abre como drawer con un fondo oscuro. Usa el botón ☰ del topbar. En desktop el riel colapsado se expande al pasar el cursor; no hay botón de colapso en el sidebar.
1099
+ {t("showcase.structure.layoutHint")}
1095
1100
  </div>
1096
1101
  </ITStack>
1097
1102
  }
1098
1103
  gallery={
1099
- <ITStack spacing={6}>
1104
+ <ITStack spacing={8}>
1100
1105
  <div>
1101
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">ITNavbar (standalone)</h4>
1102
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden h-[420px]">
1106
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">
1107
+ {t("showcase.structure.galleryNavbarStandalone")}
1108
+ </h3>
1109
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
1103
1110
  <ITNavbar
1104
1111
  logoText="AXZY"
1105
1112
  navigationItems={navbarItems}
@@ -1107,74 +1114,90 @@ export const LayoutShowcase = () => {
1107
1114
  userName: "Auditor AXZY",
1108
1115
  userEmail: "auditor@axzy.dev",
1109
1116
  menuItems: [
1110
- { label: "Ajustes", onClick: () => {} },
1111
- { label: "Cerrar sesión", onClick: () => {} },
1117
+ { label: t("showcase.structure.navSettings"), onClick: () => {} },
1118
+ { label: t("showcase.structure.navLogout"), onClick: () => {} },
1112
1119
  ],
1113
1120
  }}
1114
1121
  >
1115
- <div className="p-8 text-center text-slate-500 text-sm">
1116
- {navActiveId ? `Item activo: "${navbarItems.find(i => i.isActive)?.label}"` : "Selecciona un item en la navegación"}
1122
+ <div className="p-6">
1123
+ <p className="font-mono text-[11px] uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">
1124
+ {navActiveId
1125
+ ? t("showcase.structure.activeItem", {
1126
+ label: navbarItems.find((item) => item.isActive)?.label ?? "",
1127
+ })
1128
+ : t("showcase.structure.selectNavItem")}
1129
+ </p>
1117
1130
  </div>
1118
1131
  </ITNavbar>
1119
1132
  </div>
1120
- <div className="mt-3">
1121
- <CodeViewer code={navbarCode} />
1122
- </div>
1123
1133
  </div>
1124
1134
 
1125
1135
  <div>
1126
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">ITNavbar con submenús</h4>
1127
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden h-[420px]">
1136
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">
1137
+ {t("showcase.structure.galleryNavbarSubmenus")}
1138
+ </h3>
1139
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
1128
1140
  <ITNavbar
1129
1141
  logoText="Admin"
1130
1142
  navigationItems={[
1131
- { id: "u", label: "Usuarios", icon: <FaUsers /> },
1143
+ { id: "u", label: t("showcase.structure.navUsers"), icon: <FaUsers /> },
1132
1144
  {
1133
1145
  id: "s",
1134
- label: "Ventas",
1146
+ label: t("showcase.structure.navSales"),
1135
1147
  icon: <FaShoppingCart />,
1136
1148
  subitems: [
1137
- { id: "o", label: "Órdenes", action: () => {} },
1138
- { id: "i", label: "Facturas", action: () => {} },
1149
+ { id: "o", label: t("showcase.structure.navOrders"), action: () => {} },
1150
+ { id: "i", label: t("showcase.structure.navInvoices"), action: () => {} },
1139
1151
  ],
1140
1152
  },
1141
- { id: "c", label: "Configuración", icon: <FaCog /> },
1153
+ { id: "c", label: t("showcase.structure.navConfiguration"), icon: <FaCog /> },
1142
1154
  ]}
1143
1155
  userMenu={{
1144
1156
  userName: "Admin",
1145
1157
  userEmail: "admin@axzy.dev",
1146
- menuItems: [{ label: "Salir", onClick: () => {} }],
1158
+ menuItems: [{ label: t("showcase.structure.navExit"), onClick: () => {} }],
1147
1159
  }}
1148
1160
  >
1149
- <div className="p-8 text-center text-slate-500 text-sm">
1150
- Haz clic en "Ventas" para expandir/colapsar el submenú
1161
+ <div className="p-6">
1162
+ <p className="font-mono text-[11px] uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">
1163
+ {t("showcase.structure.submenuHint")}
1164
+ </p>
1151
1165
  </div>
1152
1166
  </ITNavbar>
1153
1167
  </div>
1154
1168
  </div>
1155
1169
 
1156
1170
  <div>
1157
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">ITSidebar — badges + notificación</h4>
1158
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden h-[420px] flex">
1171
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">
1172
+ {t("showcase.structure.gallerySidebarBadges")}
1173
+ </h3>
1174
+ <div className="flex h-[320px] overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
1159
1175
  <ITSidebar
1160
1176
  visibleOnMobile
1161
1177
  className="h-full"
1162
1178
  subitemConnector="dot"
1163
1179
  navigationItems={[
1164
- { id: "home", label: "Inicio", icon: <FaHome />, isActive: true, action: () => {} },
1165
- { id: "inbox", label: "Bandeja", icon: <FaUsers />, badge: 12, action: () => {} },
1166
- { id: "alerts", label: "Alertas", icon: <FaBell />, badge: 3, badgeProps: { color: "warning", variant: "outlined" }, action: () => {} },
1167
- { id: "settings", label: "Configuración", icon: <FaCog />, action: () => {} },
1180
+ { id: "home", label: t("showcase.common.home"), icon: <FaHome />, isActive: true, action: () => {} },
1181
+ { id: "inbox", label: t("showcase.structure.navInbox"), icon: <FaUsers />, badge: 12, action: () => {} },
1182
+ { id: "alerts", label: t("showcase.structure.navAlerts"), icon: <FaBell />, badge: 3, badgeProps: { color: "warning", variant: "outlined" }, action: () => {} },
1183
+ { id: "settings", label: t("showcase.structure.navConfiguration"), icon: <FaCog />, action: () => {} },
1168
1184
  ]}
1169
1185
  notification={{
1170
1186
  count: 5,
1171
1187
  icon: <FaBell />,
1172
- label: "Notificaciones",
1188
+ label: t("sandbox.notifications"),
1173
1189
  onClick: () => {},
1174
1190
  }}
1175
1191
  />
1176
- <div className="flex-1 p-6 text-sm text-slate-500">
1177
- Cada ítem puede llevar un contador con <code className="font-mono text-xs">badge</code> + <code className="font-mono text-xs">badgeProps</code>, y el sidebar admite una fila <code className="font-mono text-xs">notification</code> con icono + ITBadget.
1192
+ <div className="flex-1 p-6">
1193
+ <p className="font-mono text-[11px] leading-relaxed text-slate-500 dark:text-slate-400">
1194
+ {t("showcase.structure.sidebarItemsHint1")}{" "}
1195
+ <code className="rounded-[4px] border border-slate-200 px-1 dark:border-slate-800">badge</code> +{" "}
1196
+ <code className="rounded-[4px] border border-slate-200 px-1 dark:border-slate-800">badgeProps</code>
1197
+ {t("showcase.structure.sidebarItemsHint2")}{" "}
1198
+ <code className="rounded-[4px] border border-slate-200 px-1 dark:border-slate-800">notification</code>{" "}
1199
+ {t("showcase.structure.sidebarItemsHint3")}
1200
+ </p>
1178
1201
  </div>
1179
1202
  </div>
1180
1203
  </div>
@@ -1215,13 +1238,14 @@ export const LayoutShowcase = () => {
1215
1238
  // ITAccordion Showcase
1216
1239
  // ─────────────────────────────────────────
1217
1240
  export const AccordionShowcase = () => {
1241
+ const { t } = useITTranslation();
1218
1242
  const [allowMultiple, setAllowMultiple] = useState(false);
1219
1243
 
1220
1244
  const items = [
1221
- { id: "what", title: "¿Qué es AXZY UI System?", content: "Una librería de componentes React + TypeScript con Tailwind CSS v4." },
1222
- { id: "install", title: "¿Cómo lo instalo?", content: "pnpm add @axzydev/axzy_ui_system" },
1223
- { id: "theme", title: "¿Puedo personalizar el tema?", content: "Sí, usa ITThemeProvider para definir la paleta y los tokens." },
1224
- { id: "disabled", title: "Sección deshabilitada", content: "No se puede abrir.", disabled: true },
1245
+ { id: "what", title: t("showcase.structure.accWhat"), content: t("showcase.structure.accWhatBody") },
1246
+ { id: "install", title: t("showcase.structure.accInstall"), content: "pnpm add @axzydev/axzy_ui_system" },
1247
+ { id: "theme", title: t("showcase.structure.accTheme"), content: t("showcase.structure.accThemeBody") },
1248
+ { id: "disabled", title: t("showcase.structure.accDisabled"), content: t("showcase.structure.accDisabledBody"), disabled: true },
1225
1249
  ];
1226
1250
 
1227
1251
  const code = `<ITAccordion\n allowMultiple={${allowMultiple}}\n defaultOpenIds={['what']}\n items={[\n { id: 'what', title: '¿Qué es AXZY?', content: '...' },\n { id: 'install', title: '¿Cómo lo instalo?', content: '...' },\n ]}\n/>`;
@@ -1229,7 +1253,7 @@ export const AccordionShowcase = () => {
1229
1253
  return (
1230
1254
  <ShowcaseLayout
1231
1255
  title="ITAccordion"
1232
- description="Secciones plegables para FAQs, paneles de configuración y contenido largo. Controlado o no controlado, single o multiple, con animación CSS grid-rows."
1256
+ description={t("showcase.structure.accordionDesc")}
1233
1257
  code={code}
1234
1258
  demo={
1235
1259
  <div className="w-full max-w-xl">
@@ -1238,18 +1262,20 @@ export const AccordionShowcase = () => {
1238
1262
  }
1239
1263
  controls={
1240
1264
  <div className="flex items-center justify-between">
1241
- <span className="text-sm font-semibold text-gray-700">Permitir múltiples abiertas</span>
1242
- <ITSlideToggle isOn={allowMultiple} onToggle={setAllowMultiple} size="sm" />
1265
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.structure.allowMultiple")}</span>
1266
+ <ITSlideToggle isOn={allowMultiple} onToggle={setAllowMultiple} size="sm"
1267
+ ariaLabel={t("showcase.structure.allowMultiple")}
1268
+ />
1243
1269
  </div>
1244
1270
  }
1245
1271
  gallery={
1246
1272
  <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
1247
1273
  <div>
1248
- <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">Bordered</p>
1274
+ <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">{t("showcase.structure.accordionBordered")}</p>
1249
1275
  <ITAccordion items={items.slice(0, 3)} variant="bordered" defaultOpenIds={["install"]} />
1250
1276
  </div>
1251
1277
  <div>
1252
- <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">Separated (default)</p>
1278
+ <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">{t("showcase.structure.accordionSeparated")}</p>
1253
1279
  <ITAccordion items={items.slice(0, 3)} defaultOpenIds={["theme"]} />
1254
1280
  </div>
1255
1281
  </div>