@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
@@ -30,8 +30,10 @@ import ITText from "@/components/atoms/text/text";
30
30
  import ITTable from "@/components/molecules/table/table";
31
31
  import type { Column } from "@/components/molecules/table/table.props";
32
32
  import { ShowcaseLayout } from "./ShowcaseLayout";
33
+ import { useITTranslation } from "@/i18n";
33
34
 
34
35
  export const PageHeaderShowcase = () => {
36
+ const { t } = useITTranslation();
35
37
  const [showBack, setShowBack] = useState(true);
36
38
  const [showBreadcrumbs, setShowBreadcrumbs] = useState(true);
37
39
  const [showIcon, setShowIcon] = useState(true);
@@ -60,9 +62,9 @@ export const PageHeaderShowcase = () => {
60
62
  const actionEl =
61
63
  actionsVariant === "none" ? undefined : (
62
64
  <ITFlex gap={2}>
63
- <ITButton label="Add member" variant="filled" color="primary" size="sm" />
65
+ <ITButton label={t("showcase.pages.addMember")} variant="filled" color="primary" size="sm" />
64
66
  {(actionsVariant === "double" || actionsVariant === "full") && (
65
- <ITButton label="Export" variant="outlined" color="gray" size="sm" />
67
+ <ITButton label={t("showcase.pages.export")} variant="outlined" color="gray" size="sm" />
66
68
  )}
67
69
  </ITFlex>
68
70
  );
@@ -70,20 +72,20 @@ export const PageHeaderShowcase = () => {
70
72
  return (
71
73
  <ShowcaseLayout
72
74
  title="ITPageHeader"
73
- description="Encabezado estandarizado para pantallas. Incluye título, descripción, icono, breadcrumbs, botón de volver y área de acciones."
75
+ description={t("showcase.pages.pageHeaderDesc")}
74
76
  code={buildCode()}
75
77
  demo={
76
78
  <div className="w-full flex flex-col">
77
79
  <div className="border border-slate-200 dark:border-slate-700 rounded-xl bg-white dark:bg-slate-900/50 overflow-hidden">
78
80
  <div className="p-6 pb-4">
79
81
  <ITPageHeader
80
- title="Team members"
81
- description={showDesc ? "Manage invitations, roles and permissions for your organization workspace." : undefined}
82
+ title={t("showcase.pages.teamMembers")}
83
+ description={showDesc ? t("showcase.pages.teamDesc") : undefined}
82
84
  icon={showIcon ? <FaUsers size={20} /> : undefined}
83
85
  iconColor={showIcon ? iconColor : undefined}
84
86
  breadcrumbs={showBreadcrumbs ? [
85
- { label: "Admin", href: "#" },
86
- { label: "Team" },
87
+ { label: t("showcase.pages.crumbAdmin"), href: "#" },
88
+ { label: t("showcase.pages.crumbTeam") },
87
89
  ] : undefined}
88
90
  backAction={showBack ? () => {} : undefined}
89
91
  actions={actionEl}
@@ -98,7 +100,7 @@ export const PageHeaderShowcase = () => {
98
100
  <FaSearch size={12} className="absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" />
99
101
  <input
100
102
  type="text"
101
- placeholder="Search by name or email..."
103
+ placeholder={t("showcase.pages.searchByNameEmail")}
102
104
  className="w-full pl-9 pr-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500"
103
105
  />
104
106
  </div>
@@ -107,7 +109,7 @@ export const PageHeaderShowcase = () => {
107
109
  onChange={() => {}}
108
110
  className="px-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 outline-none focus:ring-2 focus:ring-primary-500"
109
111
  >
110
- <option value="all">All roles</option>
112
+ <option value="all">{t("showcase.pages.allRoles")}</option>
111
113
  <option value="admin">Admin</option>
112
114
  <option value="editor">Editor</option>
113
115
  <option value="viewer">Viewer</option>
@@ -117,12 +119,12 @@ export const PageHeaderShowcase = () => {
117
119
  onChange={() => {}}
118
120
  className="px-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 outline-none focus:ring-2 focus:ring-primary-500"
119
121
  >
120
- <option value="all">All status</option>
122
+ <option value="all">{t("showcase.pages.allStatus")}</option>
121
123
  <option value="active">Active</option>
122
124
  <option value="pending">Pending</option>
123
125
  <option value="inactive">Inactive</option>
124
126
  </select>
125
- <ITButton label="Clear" variant="text" color="gray" size="sm" />
127
+ <ITButton label={t("showcase.pages.clear")} variant="text" color="gray" size="sm" />
126
128
  </ITFlex>
127
129
  </div>
128
130
  )}
@@ -143,19 +145,25 @@ export const PageHeaderShowcase = () => {
143
145
  controls={
144
146
  <ITStack spacing={4}>
145
147
  <div>
146
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Header elements</p>
148
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.pages.headerElements")}</p>
147
149
  <ITFlex direction="column" gap={3}>
148
150
  <ITFlex justify="between" align="center">
149
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Back button</span>
150
- <ITSlideToggle isOn={showBack} onToggle={setShowBack} size="sm" />
151
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.backButton")}</span>
152
+ <ITSlideToggle isOn={showBack} onToggle={setShowBack} size="sm"
153
+ ariaLabel={t("showcase.pages.backButton")}
154
+ />
151
155
  </ITFlex>
152
156
  <ITFlex justify="between" align="center">
153
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Breadcrumbs</span>
154
- <ITSlideToggle isOn={showBreadcrumbs} onToggle={setShowBreadcrumbs} size="sm" />
157
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.breadcrumbs")}</span>
158
+ <ITSlideToggle isOn={showBreadcrumbs} onToggle={setShowBreadcrumbs} size="sm"
159
+ ariaLabel={t("showcase.pages.breadcrumbs")}
160
+ />
155
161
  </ITFlex>
156
162
  <ITFlex justify="between" align="center">
157
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Icon</span>
158
- <ITSlideToggle isOn={showIcon} onToggle={setShowIcon} size="sm" />
163
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.icon")}</span>
164
+ <ITSlideToggle isOn={showIcon} onToggle={setShowIcon} size="sm"
165
+ ariaLabel={t("showcase.pages.icon")}
166
+ />
159
167
  </ITFlex>
160
168
  {showIcon && (
161
169
  <ITFlex gap={2} align="center">
@@ -172,14 +180,16 @@ export const PageHeaderShowcase = () => {
172
180
  </ITFlex>
173
181
  )}
174
182
  <ITFlex justify="between" align="center">
175
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Description</span>
176
- <ITSlideToggle isOn={showDesc} onToggle={setShowDesc} size="sm" />
183
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.description")}</span>
184
+ <ITSlideToggle isOn={showDesc} onToggle={setShowDesc} size="sm"
185
+ ariaLabel={t("showcase.pages.description")}
186
+ />
177
187
  </ITFlex>
178
188
  </ITFlex>
179
189
  </div>
180
190
 
181
191
  <div>
182
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Actions</p>
192
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.pages.actions")}</p>
183
193
  <ITFlex gap={2} wrap="wrap">
184
194
  {(["none", "single", "double", "full"] as const).map((v) => (
185
195
  <ITButton
@@ -195,10 +205,12 @@ export const PageHeaderShowcase = () => {
195
205
  </div>
196
206
 
197
207
  <div>
198
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Filters</p>
208
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.pages.filters")}</p>
199
209
  <ITFlex justify="between" align="center">
200
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Show filter bar</span>
201
- <ITSlideToggle isOn={showFilters} onToggle={setShowFilters} size="sm" />
210
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.showFilterBar")}</span>
211
+ <ITSlideToggle isOn={showFilters} onToggle={setShowFilters} size="sm"
212
+ ariaLabel={t("showcase.pages.showFilterBar")}
213
+ />
202
214
  </ITFlex>
203
215
  </div>
204
216
  </ITStack>
@@ -207,20 +219,20 @@ export const PageHeaderShowcase = () => {
207
219
  <ITStack spacing={6}>
208
220
  {/* 1. Team management — full header + search + filter bar + user rows */}
209
221
  <div>
210
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Team management</h4>
211
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden bg-white dark:bg-slate-900/50">
222
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryTeamManagement")}</h3>
223
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-950">
212
224
  <div className="p-5 pb-3">
213
225
  <ITPageHeader
214
- title="Team members"
215
- description="Manage invitations, roles and permissions for your organization workspace."
226
+ title={t("showcase.pages.teamMembers")}
227
+ description={t("showcase.pages.teamDesc")}
216
228
  icon={<FaUsers size={20} />}
217
229
  iconColor="#6366f1"
218
- breadcrumbs={[{ label: "Admin", href: "#" }, { label: "Team" }]}
230
+ breadcrumbs={[{ label: t("showcase.pages.crumbAdmin"), href: "#" }, { label: t("showcase.pages.crumbTeam") }]}
219
231
  backAction={() => {}}
220
232
  actions={
221
233
  <ITFlex gap={2}>
222
- <ITButton label="Export" variant="outlined" color="gray" size="sm" />
223
- <ITButton label="Add member" variant="filled" color="primary" size="sm" />
234
+ <ITButton label={t("showcase.pages.export")} variant="outlined" color="gray" size="sm" />
235
+ <ITButton label={t("showcase.pages.addMember")} variant="filled" color="primary" size="sm" />
224
236
  </ITFlex>
225
237
  }
226
238
  />
@@ -228,15 +240,15 @@ export const PageHeaderShowcase = () => {
228
240
  <ITFlex gap={3} align="center" wrap="wrap" className="px-5 pb-3">
229
241
  <div className="flex-1 min-w-[180px] relative">
230
242
  <FaSearch size={12} className="absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" />
231
- <input type="text" placeholder="Search..." className="w-full pl-9 pr-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 outline-none focus:ring-2 focus:ring-primary-500 text-slate-800 dark:text-white" />
243
+ <input type="text" placeholder={t("showcase.pages.searchShort")} className="w-full pl-9 pr-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 outline-none focus:ring-2 focus:ring-primary-500 text-slate-800 dark:text-white" />
232
244
  </div>
233
245
  <select className="px-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 outline-none">
234
- <option>All roles</option>
246
+ <option>{t("showcase.pages.allRoles")}</option>
235
247
  <option>Admin</option>
236
248
  <option>Editor</option>
237
249
  </select>
238
250
  <select className="px-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 outline-none">
239
- <option>All status</option>
251
+ <option>{t("showcase.pages.allStatus")}</option>
240
252
  <option>Active</option>
241
253
  <option>Pending</option>
242
254
  </select>
@@ -270,35 +282,35 @@ export const PageHeaderShowcase = () => {
270
282
 
271
283
  {/* 2. Detail page — back + breadcrumbs + back button + save/cancel */}
272
284
  <div>
273
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Detail / Edit form</h4>
274
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden bg-white dark:bg-slate-900/50">
285
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryDetailEdit")}</h3>
286
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-950">
275
287
  <div className="p-5 pb-3">
276
288
  <ITPageHeader
277
- title="Edit product"
278
- description="Update product details, pricing and inventory information."
289
+ title={t("showcase.pages.editProduct")}
290
+ description={t("showcase.pages.editProductDesc")}
279
291
  icon={<FaBoxOpen size={20} />}
280
292
  iconColor="#ec4899"
281
- breadcrumbs={[{ label: "Products", href: "#" }, { label: "MacBook Pro 16", href: "#" }, { label: "Edit" }]}
293
+ breadcrumbs={[{ label: t("showcase.pages.crumbProducts"), href: "#" }, { label: "MacBook Pro 16", href: "#" }, { label: t("showcase.pages.crumbEdit") }]}
282
294
  backAction={() => {}}
283
295
  actions={
284
296
  <ITFlex gap={2}>
285
- <ITButton label="Cancel" variant="outlined" color="gray" size="sm" />
286
- <ITButton label="Save changes" variant="filled" color="primary" size="sm" />
297
+ <ITButton label={t("showcase.common.cancel")} variant="outlined" color="gray" size="sm" />
298
+ <ITButton label={t("showcase.pages.saveChanges")} variant="filled" color="primary" size="sm" />
287
299
  </ITFlex>
288
300
  }
289
301
  />
290
302
  </div>
291
303
  <ITGrid container spacing={3} className="px-5 pb-5">
292
304
  <ITGrid item xs={12} md={6}>
293
- <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Product name</label>
305
+ <label className="mb-1 block font-mono text-[10px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.productName")}</label>
294
306
  <input type="text" defaultValue="MacBook Pro 16" className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
295
307
  </ITGrid>
296
308
  <ITGrid item xs={12} md={3}>
297
- <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Price</label>
309
+ <label className="mb-1 block font-mono text-[10px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.price")}</label>
298
310
  <input type="text" defaultValue="$3,499" className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
299
311
  </ITGrid>
300
312
  <ITGrid item xs={12} md={3}>
301
- <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Stock</label>
313
+ <label className="mb-1 block font-mono text-[10px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.stock")}</label>
302
314
  <input type="text" defaultValue="24" className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
303
315
  </ITGrid>
304
316
  </ITGrid>
@@ -307,23 +319,23 @@ export const PageHeaderShowcase = () => {
307
319
 
308
320
  {/* 3. Dashboard header — icon + title + desc + date range + refresh */}
309
321
  <div>
310
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Dashboard</h4>
311
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden bg-white dark:bg-slate-900/50">
322
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryDashboard")}</h3>
323
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-950">
312
324
  <div className="p-5">
313
325
  <ITPageHeader
314
- title="Dashboard"
315
- description="Real-time overview of your business metrics and activity."
326
+ title={t("showcase.structure.navDashboard")}
327
+ description={t("showcase.pages.dashboardDesc")}
316
328
  icon={<FaChartLine size={20} />}
317
329
  iconColor="#10b981"
318
330
  actions={
319
331
  <ITFlex gap={2} align="center">
320
332
  <select className="px-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-700 dark:text-slate-200 outline-none focus:ring-2 focus:ring-primary-500">
321
- <option>Last 7 days</option>
322
- <option>Last 30 days</option>
323
- <option>This quarter</option>
324
- <option>Custom range</option>
333
+ <option>{t("showcase.pages.last7Days")}</option>
334
+ <option>{t("showcase.pages.last30Days")}</option>
335
+ <option>{t("showcase.pages.thisQuarter")}</option>
336
+ <option>{t("showcase.pages.customRange")}</option>
325
337
  </select>
326
- <ITButton label="Refresh" variant="outlined" color="gray" size="sm" />
338
+ <ITButton label={t("showcase.pages.refresh")} variant="outlined" color="gray" size="sm" />
327
339
  </ITFlex>
328
340
  }
329
341
  />
@@ -333,16 +345,16 @@ export const PageHeaderShowcase = () => {
333
345
 
334
346
  {/* 4. Settings header — no icon, no breadcrumbs, just title + desc + save */}
335
347
  <div>
336
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Settings / Preferences</h4>
337
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden bg-white dark:bg-slate-900/50">
348
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.gallerySettingsPrefs")}</h3>
349
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-950">
338
350
  <div className="p-5">
339
351
  <ITPageHeader
340
- title="General settings"
341
- description="Configure your workspace preferences, notifications and security options."
352
+ title={t("showcase.pages.generalSettings")}
353
+ description={t("showcase.pages.generalSettingsDesc")}
342
354
  actions={
343
355
  <ITFlex gap={2}>
344
- <ITButton label="Reset" variant="outlined" color="gray" size="sm" />
345
- <ITButton label="Save" variant="filled" color="primary" size="sm" />
356
+ <ITButton label={t("showcase.common.reset")} variant="outlined" color="gray" size="sm" />
357
+ <ITButton label={t("showcase.common.save")} variant="filled" color="primary" size="sm" />
346
358
  </ITFlex>
347
359
  }
348
360
  />
@@ -352,23 +364,23 @@ export const PageHeaderShowcase = () => {
352
364
 
353
365
  {/* 5. Users list — icon + breadcrumbs + search in actions + add button */}
354
366
  <div>
355
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Users list</h4>
356
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden bg-white dark:bg-slate-900/50">
367
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryUsersList")}</h3>
368
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-950">
357
369
  <div className="p-5">
358
370
  <ITPageHeader
359
- title="Users"
360
- description="1,245 registered users · 38 active right now"
371
+ title={t("showcase.structure.navUsers")}
372
+ description={t("showcase.pages.usersDesc")}
361
373
  icon={<FaUsers size={20} />}
362
374
  iconColor="#8b5cf6"
363
375
  backAction={() => {}}
364
- breadcrumbs={[{ label: "Admin", href: "#" }, { label: "Users" }]}
376
+ breadcrumbs={[{ label: t("showcase.pages.crumbAdmin"), href: "#" }, { label: t("showcase.structure.navUsers") }]}
365
377
  actions={
366
378
  <ITFlex gap={2}>
367
379
  <div className="relative">
368
380
  <FaSearch size={11} className="absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" />
369
- <input type="text" placeholder="Search..." className="w-[180px] pl-9 pr-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
381
+ <input type="text" placeholder={t("showcase.pages.searchShort")} className="w-[180px] pl-9 pr-3 py-2 text-xs border border-slate-200 dark:border-slate-700 rounded-lg bg-slate-50 dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
370
382
  </div>
371
- <ITButton label="Invite" variant="filled" color="primary" size="sm" />
383
+ <ITButton label={t("showcase.pages.invite")} variant="filled" color="primary" size="sm" />
372
384
  </ITFlex>
373
385
  }
374
386
  />
@@ -393,6 +405,7 @@ const USERS: Record<string, unknown>[] = [
393
405
  ];
394
406
 
395
407
  export const PageShowcase = () => {
408
+ const { t } = useITTranslation();
396
409
  const [state, setState] = useState<"normal" | "loading" | "error" | "empty">("normal");
397
410
  const [screen, setScreen] = useState<"list" | "detail">("list");
398
411
  const [selectedUser, setSelectedUser] = useState<Record<string, unknown> | null>(null);
@@ -544,26 +557,26 @@ export const PageShowcase = () => {
544
557
  return (
545
558
  <ShowcaseLayout
546
559
  title="ITPage"
547
- description="Template completo de página con tabla, detalle y 4 estados (carga, error, vacío, normal)."
560
+ description={t("showcase.pages.pageDesc")}
548
561
  code={buildCode()}
549
562
  demo={
550
- <div className="w-full border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden bg-white dark:bg-slate-900/50">
563
+ <div className="w-full overflow-hidden rounded-[10px] border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-950">
551
564
  {isDetail && user ? (
552
565
  <ITPage
553
566
  title={user.name as string}
554
- description={`Member · ${user.role as string} · ${(user.active as boolean) ? "Active" : "Inactive"}`}
567
+ description={t("showcase.pages.memberSummary", { role: user.role as string, status: (user.active as boolean) ? t("showcase.common.active") : t("showcase.data.inactive") })}
555
568
  icon={shouldShowIcon}
556
569
  iconColor={shouldShowIconColor}
557
- breadcrumbs={[{ label: "Team", href: "#" }, { label: user.name as string }]}
570
+ breadcrumbs={[{ label: t("showcase.pages.crumbTeam"), href: "#" }, { label: user.name as string }]}
558
571
  backAction={handleBackToList}
559
572
  loading={state === "loading"}
560
- error={state === "error" ? "Could not load user details. Please try again." : null}
561
- errorTitle="Details error"
573
+ error={state === "error" ? t("showcase.pages.userLoadError") : null}
574
+ errorTitle={t("showcase.pages.detailsError")}
562
575
  onRetry={() => setState("normal")}
563
576
  horizontalPadding={hPaddingValue}
564
577
  empty={state === "empty"}
565
- emptyTitle="No user data"
566
- emptyDescription="No information available for this user."
578
+ emptyTitle={t("showcase.pages.noUserData")}
579
+ emptyDescription={t("showcase.pages.noUserInfo")}
567
580
  >
568
581
  <ITGrid container spacing={4}>
569
582
  <ITGrid item xs={12} md={4}>
@@ -581,14 +594,14 @@ export const PageShowcase = () => {
581
594
  </ITCard>
582
595
  </ITGrid>
583
596
  <ITGrid item xs={12} md={8}>
584
- <ITCard title="Account details">
597
+ <ITCard title={t("showcase.pages.accountDetails")}>
585
598
  <ITStack spacing={4}>
586
599
  {[
587
- { label: "Full name", value: user.name as string },
588
- { label: "Email address", value: user.email as string },
589
- { label: "Role", value: user.role as string },
590
- { label: "Status", value: (user.active as boolean) ? "Active" : "Inactive" },
591
- { label: "Last login", value: new Date(user.lastLogin as string).toLocaleString("en-US") },
600
+ { label: t("showcase.pages.fullName"), value: user.name as string },
601
+ { label: t("showcase.pages.emailAddress"), value: user.email as string },
602
+ { label: t("showcase.pages.role"), value: user.role as string },
603
+ { label: t("showcase.pages.status"), value: (user.active as boolean) ? t("showcase.common.active") : t("showcase.data.inactive") },
604
+ { label: t("showcase.pages.lastLogin"), value: new Date(user.lastLogin as string).toLocaleString("en-US") },
592
605
  ].map((f) => (
593
606
  <div key={f.label}>
594
607
  <p className="text-[11px] font-bold uppercase tracking-wider text-slate-400 mb-0.5">{f.label}</p>
@@ -602,28 +615,28 @@ export const PageShowcase = () => {
602
615
  </ITPage>
603
616
  ) : (
604
617
  <ITPage
605
- title="Team members"
606
- description="Manage invitations, roles and permissions for your organization workspace."
618
+ title={t("showcase.pages.teamMembers")}
619
+ description={t("showcase.pages.teamDesc")}
607
620
  icon={shouldShowIcon}
608
621
  iconColor={shouldShowIconColor}
609
- breadcrumbs={[{ label: "Admin", href: "#" }, { label: "Team" }]}
622
+ breadcrumbs={[{ label: t("showcase.pages.crumbAdmin"), href: "#" }, { label: t("showcase.pages.crumbTeam") }]}
610
623
  loading={state === "loading"}
611
- error={state === "error" ? "Could not load team members. Check your connection and try again." : null}
612
- errorTitle="Connection error"
624
+ error={state === "error" ? t("showcase.pages.teamLoadError") : null}
625
+ errorTitle={t("showcase.pages.connectionError")}
613
626
  onRetry={() => setState("normal")}
614
627
  horizontalPadding={hPaddingValue}
615
628
  empty={state === "empty"}
616
- emptyTitle="No team members yet"
617
- emptyDescription="Invite your first team member to get started."
618
- emptyAction={<ITButton label="Invite members" size="sm" icon={<FaPlus />} />}
619
- actions={<ITButton label="Invite" size="sm" icon={<FaPlus />} />}
629
+ emptyTitle={t("showcase.pages.noTeamMembers")}
630
+ emptyDescription={t("showcase.pages.noTeamMembersHint")}
631
+ emptyAction={<ITButton label={t("showcase.pages.inviteMembers")} size="sm" icon={<FaPlus />} />}
632
+ actions={<ITButton label={t("showcase.pages.invite")} size="sm" icon={<FaPlus />} />}
620
633
  >
621
634
  <ITTable
622
635
  columns={columns}
623
636
  data={USERS}
624
637
  size="sm"
625
638
  defaultItemsPerPage={5}
626
- title="All members"
639
+ title={t("showcase.data.galleryAllMembers")}
627
640
  />
628
641
  </ITPage>
629
642
  )}
@@ -632,12 +645,12 @@ export const PageShowcase = () => {
632
645
  controls={
633
646
  <ITStack spacing={4}>
634
647
  <div>
635
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Page state</p>
648
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.pages.pageState")}</p>
636
649
  <ITFlex gap={2} wrap="wrap">
637
650
  {(["normal", "loading", "error", "empty"] as const).map((s) => (
638
651
  <ITButton
639
652
  key={s}
640
- label={s.charAt(0).toUpperCase() + s.slice(1)}
653
+ label={s === "normal" ? t("showcase.data.stateNormal") : s === "loading" ? t("showcase.data.stateLoading") : s === "error" ? t("showcase.data.stateError") : t("showcase.data.stateEmpty")}
641
654
  variant={state === s ? "filled" : "outlined"}
642
655
  size="sm"
643
656
  onClick={() => setState(s)}
@@ -647,17 +660,19 @@ export const PageShowcase = () => {
647
660
  </div>
648
661
 
649
662
  <ITFlex justify="between" align="center">
650
- <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Icon in header</span>
651
- <ITSlideToggle isOn={showIcon} onToggle={setShowIcon} size="sm" />
663
+ <span className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.iconInHeader")}</span>
664
+ <ITSlideToggle isOn={showIcon} onToggle={setShowIcon} size="sm"
665
+ ariaLabel={t("showcase.pages.iconInHeader")}
666
+ />
652
667
  </ITFlex>
653
668
 
654
669
  <div>
655
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Horizontal padding</p>
670
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.pages.horizontalPadding")}</p>
656
671
  <ITFlex gap={2} wrap="wrap">
657
672
  {(["default", "none", "tight", "wide"] as const).map((p) => (
658
673
  <ITButton
659
674
  key={p}
660
- label={p === "default" ? "Default" : p === "none" ? "px-0" : p === "tight" ? "px-2" : "px-8"}
675
+ label={p === "default" ? t("showcase.pages.paddingDefault") : p === "none" ? "px-0" : p === "tight" ? "px-2" : "px-8"}
661
676
  variant={hPadding === p ? "filled" : "outlined"}
662
677
  size="sm"
663
678
  onClick={() => setHPadding(p)}
@@ -668,16 +683,16 @@ export const PageShowcase = () => {
668
683
 
669
684
  {isNormal && (
670
685
  <div>
671
- <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">Screen</p>
686
+ <p className="text-xs font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2">{t("showcase.pages.screen")}</p>
672
687
  <ITFlex gap={2} wrap="wrap">
673
688
  <ITButton
674
- label="List"
689
+ label={t("showcase.pages.list")}
675
690
  variant={screen === "list" ? "filled" : "outlined"}
676
691
  size="sm"
677
692
  onClick={() => handleBackToList()}
678
693
  />
679
694
  <ITButton
680
- label="Detail (last viewed)"
695
+ label={t("showcase.pages.detailLastViewed")}
681
696
  variant={screen === "detail" ? "filled" : "outlined"}
682
697
  size="sm"
683
698
  disabled={!selectedUser}
@@ -686,7 +701,7 @@ export const PageShowcase = () => {
686
701
  </ITFlex>
687
702
  {selectedUser && (
688
703
  <p className="text-xs text-slate-500 mt-2">
689
- Selected: <span className="font-semibold text-slate-700 dark:text-slate-200">{selectedUser.name as string}</span>
704
+ {t("showcase.pages.selected")} <span className="font-semibold text-slate-700 dark:text-slate-200">{selectedUser.name as string}</span>
690
705
  </p>
691
706
  )}
692
707
  </div>
@@ -697,19 +712,19 @@ export const PageShowcase = () => {
697
712
  <ITStack spacing={6}>
698
713
  {/* 1. Users list with ITTable */}
699
714
  <div>
700
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Users — table with actions</h4>
701
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
715
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryUsersTable")}</h3>
716
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
702
717
  <ITPage
703
718
  horizontalPadding={hPaddingValue}
704
- title="Users"
705
- description="1,245 registered · 38 active now"
719
+ title={t("showcase.structure.navUsers")}
720
+ description={t("showcase.pages.usersDescShort")}
706
721
  icon={<FaUsers size={20} />}
707
722
  iconColor="#6366f1"
708
- breadcrumbs={[{ label: "Admin", href: "#" }, { label: "Users" }]}
723
+ breadcrumbs={[{ label: t("showcase.pages.crumbAdmin"), href: "#" }, { label: t("showcase.structure.navUsers") }]}
709
724
  actions={
710
725
  <ITFlex gap={2}>
711
- <ITButton label="Export" variant="outlined" size="sm" icon={<FaDownload />} />
712
- <ITButton label="Add user" size="sm" icon={<FaPlus />} />
726
+ <ITButton label={t("showcase.pages.export")} variant="outlined" size="sm" icon={<FaDownload />} />
727
+ <ITButton label={t("showcase.pages.addUser")} size="sm" icon={<FaPlus />} />
713
728
  </ITFlex>
714
729
  }
715
730
  >
@@ -725,20 +740,20 @@ export const PageShowcase = () => {
725
740
 
726
741
  {/* 2. Product detail */}
727
742
  <div>
728
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Product detail</h4>
729
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
743
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryProductDetail")}</h3>
744
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
730
745
  <ITPage
731
746
  horizontalPadding={hPaddingValue}
732
747
  title="MacBook Pro 16'' M3 Max"
733
748
  description="SKU: MBP-16-M3MAX-2024 · Stock: 24"
734
749
  icon={<FaBoxOpen size={20} />}
735
750
  iconColor="#ec4899"
736
- breadcrumbs={[{ label: "Products", href: "#" }, { label: "MacBook Pro 16" }]}
751
+ breadcrumbs={[{ label: t("showcase.pages.crumbProducts"), href: "#" }, { label: "MacBook Pro 16" }]}
737
752
  backAction={() => {}}
738
753
  actions={
739
754
  <ITFlex gap={2}>
740
- <ITButton label="Delete" variant="outlined" color="gray" size="sm" icon={<FaTrash />} />
741
- <ITButton label="Edit" size="sm" icon={<FaEdit />} />
755
+ <ITButton label={t("showcase.common.delete")} variant="outlined" color="gray" size="sm" icon={<FaTrash />} />
756
+ <ITButton label={t("showcase.common.edit")} size="sm" icon={<FaEdit />} />
742
757
  </ITFlex>
743
758
  }
744
759
  >
@@ -752,14 +767,14 @@ export const PageShowcase = () => {
752
767
  </ITGrid>
753
768
  <ITGrid item xs={12} md={7}>
754
769
  <ITStack spacing={3}>
755
- <ITCard title="Pricing">
770
+ <ITCard title={t("showcase.pages.pricing")}>
756
771
  <ITFlex align="baseline" gap={2}>
757
772
  <span className="text-3xl font-extrabold text-slate-800 dark:text-white">$3,499</span>
758
773
  <span className="text-sm text-slate-400 line-through">$3,799</span>
759
774
  <span className="text-xs font-bold text-emerald-600 bg-emerald-50 dark:bg-emerald-950/30 px-2 py-0.5 rounded-md">-8%</span>
760
775
  </ITFlex>
761
776
  </ITCard>
762
- <ITCard title="Description">
777
+ <ITCard title={t("showcase.pages.descriptionField")}>
763
778
  <ITText className="text-sm text-slate-600 dark:text-slate-300">
764
779
  Extreme performance for professionals. M3 Max chip with 16-core CPU, 40-core GPU, and 64GB unified memory.
765
780
  </ITText>
@@ -773,45 +788,45 @@ export const PageShowcase = () => {
773
788
 
774
789
  {/* 3. Edit profile form */}
775
790
  <div>
776
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Edit profile</h4>
777
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
791
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryEditProfile")}</h3>
792
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
778
793
  <ITPage
779
794
  horizontalPadding={hPaddingValue}
780
- title="Edit profile"
781
- description="Update your personal information and contact details"
795
+ title={t("showcase.pages.editProfile")}
796
+ description={t("showcase.pages.editProfileDesc")}
782
797
  icon={<FaEdit size={20} />}
783
798
  iconColor="#10b981"
784
- breadcrumbs={[{ label: "Account", href: "#" }, { label: "Edit profile" }]}
799
+ breadcrumbs={[{ label: t("showcase.pages.crumbAccount"), href: "#" }, { label: t("showcase.pages.editProfile") }]}
785
800
  backAction={() => {}}
786
801
  actions={
787
802
  <ITFlex gap={2}>
788
- <ITButton label="Cancel" variant="outlined" color="gray" size="sm" />
789
- <ITButton label="Save changes" size="sm" icon={<FaSave />} />
803
+ <ITButton label={t("showcase.common.cancel")} variant="outlined" color="gray" size="sm" />
804
+ <ITButton label={t("showcase.pages.saveChanges")} size="sm" icon={<FaSave />} />
790
805
  </ITFlex>
791
806
  }
792
807
  >
793
808
  <ITGrid container spacing={3}>
794
809
  <ITGrid item xs={12} md={4}>
795
- <ITCard title="Profile photo">
810
+ <ITCard title={t("showcase.pages.profilePhoto")}>
796
811
  <div className="flex flex-col items-center gap-4">
797
812
  <ITAvatar initials="AL" size="xl" />
798
- <ITButton label="Upload image" variant="outlined" size="sm" />
813
+ <ITButton label={t("showcase.pages.uploadImage")} variant="outlined" size="sm" />
799
814
  </div>
800
815
  </ITCard>
801
816
  </ITGrid>
802
817
  <ITGrid item xs={12} md={8}>
803
- <ITCard title="Personal information">
818
+ <ITCard title={t("showcase.pages.personalInformation")}>
804
819
  <ITGrid container spacing={3}>
805
820
  <ITGrid item xs={12} sm={6}>
806
- <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">First name</label>
821
+ <label className="mb-1 block font-mono text-[10px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.firstName")}</label>
807
822
  <input type="text" defaultValue="Ana" className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
808
823
  </ITGrid>
809
824
  <ITGrid item xs={12} sm={6}>
810
- <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Last name</label>
825
+ <label className="mb-1 block font-mono text-[10px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.lastName")}</label>
811
826
  <input type="text" defaultValue="López" className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
812
827
  </ITGrid>
813
828
  <ITGrid item xs={12}>
814
- <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Email</label>
829
+ <label className="mb-1 block font-mono text-[10px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.emailField")}</label>
815
830
  <input type="email" defaultValue="ana.lopez@axzy.dev" className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
816
831
  </ITGrid>
817
832
  </ITGrid>
@@ -824,19 +839,19 @@ export const PageShowcase = () => {
824
839
 
825
840
  {/* 4. Orders with table */}
826
841
  <div>
827
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Orders — status table</h4>
828
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
842
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.galleryOrdersTable")}</h3>
843
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
829
844
  <ITPage
830
845
  horizontalPadding={hPaddingValue}
831
- title="Orders"
832
- description="89 pending · 1,247 completed this month"
846
+ title={t("showcase.structure.navOrders")}
847
+ description={t("showcase.pages.ordersDesc")}
833
848
  icon={<FaShoppingCart size={20} />}
834
849
  iconColor="#f59e0b"
835
- breadcrumbs={[{ label: "Dashboard", href: "#" }, { label: "Orders" }]}
850
+ breadcrumbs={[{ label: t("showcase.structure.navDashboard"), href: "#" }, { label: t("showcase.structure.navOrders") }]}
836
851
  actions={
837
852
  <ITFlex gap={2}>
838
- <ITButton label="Export" variant="outlined" color="gray" size="sm" icon={<FaDownload />} />
839
- <ITButton label="New order" size="sm" icon={<FaPlus />} />
853
+ <ITButton label={t("showcase.pages.export")} variant="outlined" color="gray" size="sm" icon={<FaDownload />} />
854
+ <ITButton label={t("showcase.pages.newOrder")} size="sm" icon={<FaPlus />} />
840
855
  </ITFlex>
841
856
  }
842
857
  >
@@ -877,26 +892,26 @@ export const PageShowcase = () => {
877
892
 
878
893
  {/* 5. Settings with tabs */}
879
894
  <div>
880
- <h4 className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3">Settings</h4>
881
- <div className="border border-slate-200 dark:border-slate-700 rounded-xl overflow-hidden">
895
+ <h3 className="mb-3 font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.gallerySettings")}</h3>
896
+ <div className="overflow-hidden rounded-[10px] border border-slate-200 dark:border-slate-800">
882
897
  <ITPage
883
898
  horizontalPadding={hPaddingValue}
884
- title="Settings"
885
- description="Manage your account and workspace preferences"
899
+ title={t("showcase.structure.navConfiguration")}
900
+ description={t("showcase.pages.settingsDesc")}
886
901
  icon={<FaCog size={20} />}
887
902
  iconColor="#10b981"
888
- breadcrumbs={[{ label: "Account", href: "#" }, { label: "Settings" }]}
903
+ breadcrumbs={[{ label: t("showcase.pages.crumbAccount"), href: "#" }, { label: t("showcase.structure.navConfiguration") }]}
889
904
  >
890
905
  <ITGrid container spacing={3}>
891
906
  <ITGrid item xs={12} md={4}>
892
907
  <ITCard>
893
908
  <ITStack spacing={1}>
894
909
  {[
895
- { id: "general", label: "General", icon: <FaCog />, active: true },
896
- { id: "notif", label: "Notifications", icon: <FaBell /> },
897
- { id: "sec", label: "Security", icon: <FaShieldAlt /> },
898
- { id: "apariencia", label: "Appearance", icon: <FaPalette /> },
899
- { id: "billing", label: "Billing", icon: <FaDollarSign /> },
910
+ { id: "general", label: t("showcase.pages.settingsNavGeneral"), icon: <FaCog />, active: true },
911
+ { id: "notif", label: t("showcase.pages.settingsNavNotifications"), icon: <FaBell /> },
912
+ { id: "sec", label: t("showcase.pages.settingsNavSecurity"), icon: <FaShieldAlt /> },
913
+ { id: "apariencia", label: t("showcase.pages.settingsNavAppearance"), icon: <FaPalette /> },
914
+ { id: "billing", label: t("showcase.pages.settingsNavBilling"), icon: <FaDollarSign /> },
900
915
  ].map(item => (
901
916
  <button key={item.id} className={`flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors ${item.active ? "bg-primary-50 text-primary-700 dark:bg-primary-950/30 dark:text-primary-300" : "text-slate-600 dark:text-slate-300 hover:bg-slate-50 dark:hover:bg-slate-800"}`}>
902
917
  <span className="text-base">{item.icon}</span>
@@ -907,26 +922,30 @@ export const PageShowcase = () => {
907
922
  </ITCard>
908
923
  </ITGrid>
909
924
  <ITGrid item xs={12} md={8}>
910
- <ITCard title="General preferences">
925
+ <ITCard title={t("showcase.pages.generalPreferences")}>
911
926
  <ITStack spacing={4}>
912
927
  <div>
913
- <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Workspace name</label>
928
+ <label className="mb-1 block font-mono text-[10px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.workspaceName")}</label>
914
929
  <input type="text" defaultValue="AXZY Console" className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" />
915
930
  </div>
916
931
  <ITStack spacing={3} className="pt-2 border-t border-slate-100 dark:border-slate-800">
917
932
  <ITFlex justify="between" align="center">
918
933
  <div>
919
- <p className="text-sm font-semibold text-slate-700 dark:text-slate-200">Dark mode</p>
920
- <p className="text-xs text-slate-500">Follow system appearance</p>
934
+ <p className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.darkMode")}</p>
935
+ <p className="text-xs text-slate-500">{t("showcase.pages.followSystem")}</p>
921
936
  </div>
922
- <ITSlideToggle isOn={true} onToggle={() => {}} size="sm" />
937
+ <ITSlideToggle isOn={true} onToggle={() => {}} size="sm"
938
+ ariaLabel={t("showcase.pages.followSystem")}
939
+ />
923
940
  </ITFlex>
924
941
  <ITFlex justify="between" align="center">
925
942
  <div>
926
- <p className="text-sm font-semibold text-slate-700 dark:text-slate-200">Email notifications</p>
927
- <p className="text-xs text-slate-500">Receive activity alerts</p>
943
+ <p className="font-mono text-[11px] font-medium uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400">{t("showcase.pages.emailNotifications")}</p>
944
+ <p className="text-xs text-slate-500">{t("showcase.pages.receiveAlerts")}</p>
928
945
  </div>
929
- <ITSlideToggle isOn={false} onToggle={() => {}} size="sm" />
946
+ <ITSlideToggle isOn={false} onToggle={() => {}} size="sm"
947
+ ariaLabel={t("showcase.pages.receiveAlerts")}
948
+ />
930
949
  </ITFlex>
931
950
  </ITStack>
932
951
  </ITStack>