@axzydev/axzy_ui_system 1.4.8 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +2 -11
  2. package/dist/index.cjs +1826 -1351
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.css +1 -1
  5. package/dist/index.css.map +1 -1
  6. package/dist/index.d.cts +115 -14
  7. package/dist/index.d.ts +115 -14
  8. package/dist/index.js +1481 -1010
  9. package/dist/index.js.map +1 -1
  10. package/dist/layered.css +1 -1
  11. package/package.json +3 -16
  12. package/src/App.tsx +90 -73
  13. package/src/components/atoms/badget/badget.tsx +23 -5
  14. package/src/components/atoms/chip/chip.tsx +3 -1
  15. package/src/components/atoms/image/image.tsx +3 -1
  16. package/src/components/atoms/input/input.tsx +8 -5
  17. package/src/components/atoms/loader/loader.tsx +3 -1
  18. package/src/components/atoms/slide/slide.props.ts +12 -0
  19. package/src/components/atoms/slide/slide.tsx +3 -0
  20. package/src/components/molecules/alert/alert.tsx +3 -1
  21. package/src/components/molecules/breadcrumbs/breadcrumbs.tsx +3 -1
  22. package/src/components/molecules/calendar/calendar.tsx +9 -6
  23. package/src/components/molecules/card/card.tsx +5 -2
  24. package/src/components/molecules/chip-input/chip-input.tsx +9 -7
  25. package/src/components/molecules/date-picker/datePicker.tsx +9 -9
  26. package/src/components/molecules/dropdown-menu/dropdown-menu.props.ts +1 -1
  27. package/src/components/molecules/dropdown-menu/dropdown-menu.tsx +6 -3
  28. package/src/components/molecules/field/field.tsx +3 -1
  29. package/src/components/molecules/form-header/form-header.tsx +3 -1
  30. package/src/components/molecules/line-bar-chart/line-bar-chart.props.ts +2 -2
  31. package/src/components/molecules/line-bar-chart/line-bar-chart.tsx +20 -15
  32. package/src/components/molecules/masked-input/masked-input.tsx +3 -1
  33. package/src/components/molecules/multi-select/multi-select.tsx +12 -9
  34. package/src/components/molecules/pagination/pagination.tsx +11 -5
  35. package/src/components/molecules/search-select/search-select.tsx +11 -9
  36. package/src/components/molecules/select/select.tsx +6 -4
  37. package/src/components/molecules/stepper/stepper.tsx +6 -4
  38. package/src/components/molecules/table/table.tsx +30 -28
  39. package/src/components/molecules/time-picker/timePicker.tsx +8 -6
  40. package/src/components/molecules/wysiwyg/wysiwyg.tsx +23 -12
  41. package/src/components/organisms/confirm-dialog/confirm-dialog.props.ts +4 -4
  42. package/src/components/organisms/confirm-dialog/confirm-dialog.tsx +16 -8
  43. package/src/components/organisms/data-table/dataTable.tsx +31 -25
  44. package/src/components/organisms/dialog/dialog.tsx +3 -0
  45. package/src/components/organisms/drawer/drawer.tsx +3 -0
  46. package/src/components/organisms/dropfile/dropfile.tsx +19 -17
  47. package/src/components/organisms/form-builder/fieldRenderer.tsx +4 -2
  48. package/src/components/organisms/navbar/navbar.tsx +4 -2
  49. package/src/components/organisms/page-header/page-header.tsx +3 -1
  50. package/src/components/organisms/searchTable/components/PaginationControls.tsx +8 -6
  51. package/src/components/organisms/searchTable/components/PaginationInfo.tsx +3 -1
  52. package/src/components/organisms/searchTable/components/SearchAndSortBar.tsx +7 -5
  53. package/src/components/organisms/searchTable/components/SearchInput.tsx +4 -2
  54. package/src/components/organisms/searchTable/components/SortButton.tsx +13 -11
  55. package/src/components/organisms/searchTable/components/TableEmptyState.tsx +4 -2
  56. package/src/components/organisms/searchTable/components/TableRow.tsx +6 -4
  57. package/src/components/organisms/searchTable/searchTable.tsx +4 -2
  58. package/src/components/organisms/sidebar/sidebar.props.ts +1 -1
  59. package/src/components/organisms/sidebar/sidebar.tsx +9 -4
  60. package/src/components/organisms/toast/toast.tsx +3 -1
  61. package/src/components/organisms/topbar/topbar.tsx +4 -2
  62. package/src/components/templates/page/page.props.ts +4 -4
  63. package/src/components/templates/page/page.tsx +6 -4
  64. package/src/components/theme-provider/themeProvider.tsx +28 -17
  65. package/src/dev.css +77 -2
  66. package/src/global.d.ts +10 -0
  67. package/src/i18n/context.ts +9 -0
  68. package/src/i18n/index.ts +22 -0
  69. package/src/i18n/locales/en.ts +163 -0
  70. package/src/i18n/locales/es.ts +165 -0
  71. package/src/i18n/provider.tsx +44 -0
  72. package/src/i18n/translator.ts +82 -0
  73. package/src/i18n/types.ts +54 -0
  74. package/src/i18n/useITTranslation.ts +20 -0
  75. package/src/index.css +0 -1
  76. package/src/index.ts +7 -1
  77. package/src/sandbox/LandingShowcase.tsx +224 -580
  78. package/src/sandbox/NotFoundShowcase.tsx +51 -36
  79. package/src/sandbox/TopbarSearch.tsx +6 -4
  80. package/src/sandbox/controls.tsx +180 -0
  81. package/src/sandbox/i18n.ts +1929 -0
  82. package/src/sandbox/icons.tsx +25 -0
  83. package/src/sandbox/locale.tsx +72 -0
  84. package/src/sandbox/ui.tsx +377 -0
  85. package/src/sandbox/useHashRoute.ts +46 -10
  86. package/src/showcases/DataShowcases.tsx +103 -87
  87. package/src/showcases/FeedbackShowcases.tsx +37 -30
  88. package/src/showcases/FormShowcases.tsx +302 -214
  89. package/src/showcases/GettingStartedShowcase.tsx +151 -145
  90. package/src/showcases/HelpShowcase.tsx +126 -128
  91. package/src/showcases/HomeShowcase.tsx +678 -482
  92. package/src/showcases/LayoutPrimitivesShowcases.tsx +129 -114
  93. package/src/showcases/NavigationShowcases.tsx +45 -37
  94. package/src/showcases/PageShowcases.tsx +171 -152
  95. package/src/showcases/ProductoDetalle.tsx +272 -129
  96. package/src/showcases/ShowcaseLayout.tsx +270 -216
  97. package/src/showcases/SizesShowcase.tsx +123 -64
  98. package/src/showcases/StructureShowcases.tsx +157 -131
  99. package/src/showcases/portfolioUi.tsx +153 -0
  100. package/src/showcases/techIcons.ts +3 -0
  101. package/src/utils/table.utils.ts +10 -2
  102. package/src/components/atoms/avatar/avatar.doc.mdx +0 -48
  103. package/src/components/atoms/avatar/avatar.stories.tsx +0 -64
  104. package/src/components/atoms/badget/badget.doc.mdx +0 -46
  105. package/src/components/atoms/badget/badget.stories.tsx +0 -75
  106. package/src/components/atoms/button/button.doc.mdx +0 -59
  107. package/src/components/atoms/button/button.stories.tsx +0 -173
  108. package/src/components/atoms/checkbox/checkbox.doc.mdx +0 -54
  109. package/src/components/atoms/checkbox/checkbox.stories.tsx +0 -53
  110. package/src/components/atoms/chip/chip.doc.mdx +0 -47
  111. package/src/components/atoms/chip/chip.stories.tsx +0 -64
  112. package/src/components/atoms/divider/divider.doc.mdx +0 -42
  113. package/src/components/atoms/divider/divider.stories.tsx +0 -33
  114. package/src/components/atoms/flex/flex.doc.mdx +0 -59
  115. package/src/components/atoms/flex/flex.stories.tsx +0 -70
  116. package/src/components/atoms/grid/grid.doc.mdx +0 -54
  117. package/src/components/atoms/grid/grid.stories.tsx +0 -71
  118. package/src/components/atoms/image/image.doc.mdx +0 -44
  119. package/src/components/atoms/image/image.stories.tsx +0 -48
  120. package/src/components/atoms/input/input.doc.mdx +0 -70
  121. package/src/components/atoms/input/input.stories.tsx +0 -113
  122. package/src/components/atoms/input-number/input-number.doc.mdx +0 -74
  123. package/src/components/atoms/input-number/input-number.stories.tsx +0 -111
  124. package/src/components/atoms/loader/loader.doc.mdx +0 -43
  125. package/src/components/atoms/loader/loader.stories.tsx +0 -104
  126. package/src/components/atoms/popover/popover.doc.mdx +0 -53
  127. package/src/components/atoms/popover/popover.stories.tsx +0 -24
  128. package/src/components/atoms/progress/progress.doc.mdx +0 -48
  129. package/src/components/atoms/progress/progress.stories.tsx +0 -39
  130. package/src/components/atoms/radio/radio.doc.mdx +0 -62
  131. package/src/components/atoms/radio/radio.stories.tsx +0 -48
  132. package/src/components/atoms/segmented-control/segmented-control.doc.mdx +0 -60
  133. package/src/components/atoms/segmented-control/segmented-control.stories.tsx +0 -62
  134. package/src/components/atoms/skeleton/skeleton.doc.mdx +0 -43
  135. package/src/components/atoms/skeleton/skeleton.stories.tsx +0 -29
  136. package/src/components/atoms/slide/slide.doc.mdx +0 -46
  137. package/src/components/atoms/slide/slide.stories.tsx +0 -120
  138. package/src/components/atoms/slider/slider.doc.mdx +0 -49
  139. package/src/components/atoms/slider/slider.stories.tsx +0 -29
  140. package/src/components/atoms/stack/stack.doc.mdx +0 -126
  141. package/src/components/atoms/stack/stack.stories.tsx +0 -283
  142. package/src/components/atoms/text/text.doc.mdx +0 -41
  143. package/src/components/atoms/text/text.stories.tsx +0 -66
  144. package/src/components/atoms/textarea/textarea.doc.mdx +0 -64
  145. package/src/components/atoms/textarea/textarea.stories.tsx +0 -26
  146. package/src/components/atoms/tooltip/tooltip.doc.mdx +0 -47
  147. package/src/components/atoms/tooltip/tooltip.stories.tsx +0 -19
  148. package/src/components/isolation/isolation.stories.tsx +0 -202
  149. package/src/components/molecules/accordion/accordion.doc.mdx +0 -47
  150. package/src/components/molecules/accordion/accordion.stories.tsx +0 -68
  151. package/src/components/molecules/alert/alert.doc.mdx +0 -48
  152. package/src/components/molecules/alert/alert.stories.tsx +0 -40
  153. package/src/components/molecules/breadcrumbs/breadcrumbs.doc.mdx +0 -57
  154. package/src/components/molecules/breadcrumbs/breadcrumbs.stories.tsx +0 -20
  155. package/src/components/molecules/calendar/calendar.doc.mdx +0 -76
  156. package/src/components/molecules/calendar/calendar.stories.tsx +0 -90
  157. package/src/components/molecules/card/card.doc.mdx +0 -54
  158. package/src/components/molecules/card/card.stories.tsx +0 -57
  159. package/src/components/molecules/chip-input/chip-input.doc.mdx +0 -44
  160. package/src/components/molecules/chip-input/chip-input.stories.tsx +0 -52
  161. package/src/components/molecules/date-picker/date-picker.doc.mdx +0 -65
  162. package/src/components/molecules/date-picker/date-picker.stories.tsx +0 -88
  163. package/src/components/molecules/dropdown-menu/dropdown-menu.doc.mdx +0 -46
  164. package/src/components/molecules/dropdown-menu/dropdown-menu.stories.tsx +0 -41
  165. package/src/components/molecules/empty-state/empty-state.doc.mdx +0 -50
  166. package/src/components/molecules/empty-state/empty-state.stories.tsx +0 -19
  167. package/src/components/molecules/field/field.doc.mdx +0 -43
  168. package/src/components/molecules/field/field.stories.tsx +0 -42
  169. package/src/components/molecules/form-header/form-header.doc.mdx +0 -38
  170. package/src/components/molecules/form-header/form-header.stories.tsx +0 -52
  171. package/src/components/molecules/masked-input/masked-input.doc.mdx +0 -78
  172. package/src/components/molecules/masked-input/masked-input.stories.tsx +0 -126
  173. package/src/components/molecules/multi-select/multi-select.doc.mdx +0 -55
  174. package/src/components/molecules/multi-select/multi-select.stories.tsx +0 -59
  175. package/src/components/molecules/pagination/pagination.doc.mdx +0 -62
  176. package/src/components/molecules/pagination/pagination.stories.tsx +0 -110
  177. package/src/components/molecules/search-select/search-select.doc.mdx +0 -77
  178. package/src/components/molecules/search-select/search-select.stories.tsx +0 -146
  179. package/src/components/molecules/select/select.doc.mdx +0 -75
  180. package/src/components/molecules/select/select.stories.tsx +0 -85
  181. package/src/components/molecules/stat-card/stat-card.doc.mdx +0 -48
  182. package/src/components/molecules/stat-card/stat-card.stories.tsx +0 -40
  183. package/src/components/molecules/stepper/stepper.doc.mdx +0 -54
  184. package/src/components/molecules/stepper/stepper.stories.tsx +0 -154
  185. package/src/components/molecules/table/table.doc.mdx +0 -140
  186. package/src/components/molecules/table/table.stories.tsx +0 -402
  187. package/src/components/molecules/tabs/tabs.doc.mdx +0 -52
  188. package/src/components/molecules/tabs/tabs.stories.tsx +0 -31
  189. package/src/components/molecules/time-picker/timePicker.doc.mdx +0 -68
  190. package/src/components/molecules/time-picker/timePicker.stories.tsx +0 -130
  191. package/src/components/molecules/wysiwyg/wysiwyg.stories.tsx +0 -95
  192. package/src/components/organisms/confirm-dialog/confirm-dialog.doc.mdx +0 -60
  193. package/src/components/organisms/confirm-dialog/confirm-dialog.stories.tsx +0 -32
  194. package/src/components/organisms/data-table/ITDataTable.doc.mdx +0 -132
  195. package/src/components/organisms/data-table/ITDataTable.stories.tsx +0 -353
  196. package/src/components/organisms/dialog/dialog.doc.mdx +0 -54
  197. package/src/components/organisms/dialog/dialog.stories.tsx +0 -126
  198. package/src/components/organisms/drawer/drawer.doc.mdx +0 -59
  199. package/src/components/organisms/drawer/drawer.stories.tsx +0 -40
  200. package/src/components/organisms/dropfile/dropfile.doc.mdx +0 -74
  201. package/src/components/organisms/dropfile/dropfile.stories.tsx +0 -93
  202. package/src/components/organisms/form-builder/formBuilder.doc.mdx +0 -251
  203. package/src/components/organisms/form-builder/formBuilder.stories.tsx +0 -914
  204. package/src/components/organisms/navbar/navbar.doc.mdx +0 -77
  205. package/src/components/organisms/navbar/navbar.stories.tsx +0 -83
  206. package/src/components/organisms/page-header/page-header.doc.mdx +0 -54
  207. package/src/components/organisms/page-header/page-header.stories.tsx +0 -74
  208. package/src/components/organisms/searchTable/searchTable.doc.mdx +0 -79
  209. package/src/components/organisms/searchTable/searchTable.stories.tsx +0 -73
  210. package/src/components/organisms/sidebar/sidebar.doc.mdx +0 -176
  211. package/src/components/organisms/sidebar/sidebar.stories.tsx +0 -234
  212. package/src/components/organisms/toast/toast.doc.mdx +0 -50
  213. package/src/components/organisms/toast/toast.stories.tsx +0 -137
  214. package/src/components/organisms/topbar/topbar.doc.mdx +0 -72
  215. package/src/components/organisms/topbar/topbar.stories.tsx +0 -79
  216. package/src/components/organisms/triple-filter/tripleFilter.doc.mdx +0 -62
  217. package/src/components/organisms/triple-filter/tripleFilter.stories.tsx +0 -31
  218. package/src/components/templates/layout/layout.doc.mdx +0 -53
  219. package/src/components/templates/layout/layout.stories.tsx +0 -113
  220. package/src/components/templates/page/page.doc.mdx +0 -86
  221. package/src/components/templates/page/page.stories.tsx +0 -97
  222. package/src/components/theme-provider/themeProvider.doc.mdx +0 -85
  223. package/src/components/theme-provider/themeProvider.stories.tsx +0 -58
@@ -1,85 +1,144 @@
1
- import React, { useState } from "react";
1
+ import { useState } from "react";
2
2
  import { FaCode } from "react-icons/fa";
3
- import {
4
- ITButton,
5
- ITInput,
6
- ITSelect,
7
- ITBadget,
8
- } from "../index";
9
- import { CodeViewer } from "./ShowcaseLayout";
3
+ import { ITBadget, ITButton, ITInput, ITSelect } from "../index";
4
+ import { BloqueCodigo, BotonAccion, EYEBROW, FILETE } from "@/sandbox/ui";
5
+ import { useITTranslation } from "@/i18n";
10
6
 
11
7
  type SizeKey = "sm" | "md" | "lg";
12
8
 
13
- const sizes: SizeKey[] = ["sm", "md", "lg"];
9
+ const SIZES: SizeKey[] = ["sm", "md", "lg"];
14
10
 
15
- const sizeDemoCode = (s: SizeKey) => `// Medida estándar "${s}" — misma escala en todos los componentes
11
+ /** Código de ejemplo de cada medida, mostrado en el bloque desplegable. */
12
+ const codigoDeMedida = (s: SizeKey) => `// Medida estándar "${s}" — misma escala en todos los componentes
16
13
  <ITInput size="${s}" label="Nombre" />
17
14
  <ITSelect size="${s}" label="Rol" />
18
15
  <ITButton size="${s}">Guardar</ITButton>
19
16
  <ITBadget size="${s}">Activo</ITBadget>`;
20
17
 
21
- const SizeRow = ({ size, isOpen, onToggleShow }: { size: SizeKey; isOpen: boolean; onToggleShow: () => void }) => (
22
- <div className="bg-white dark:bg-slate-900 rounded-xl border border-slate-200 dark:border-slate-700 shadow-sm overflow-hidden">
23
- <div className="px-6 py-4 border-b border-slate-200 dark:border-slate-700 flex items-center justify-between">
24
- <div>
25
- <h3 className="text-sm font-bold text-slate-800 dark:text-white uppercase">{size}</h3>
26
- <p className="text-xs text-slate-500 mt-1">Medida estándar del sistema</p>
27
- </div>
28
- <ITButton variant="outlined" color="gray" size="sm" onClick={onToggleShow}>
29
- <span className="inline-flex items-center gap-1.5"><FaCode size={12} /> Código</span>
30
- </ITButton>
31
- </div>
32
- <div className="px-6 py-5 space-y-4">
33
- <div>
34
- <p className="text-xs text-slate-400 mb-1.5">ITInput</p>
35
- <ITInput name={`names_${size}`} label="Nombre" placeholder="Ej: Juan" onChange={() => {}} onBlur={() => {}} size={size} />
36
- </div>
18
+ /**
19
+ * Una fila de medida: la etiqueta mono, los componentes en esa medida y el botón
20
+ * para ver el código. Filete entre filas, sin tarjetas anidadas.
21
+ */
22
+ const FilaMedida = ({
23
+ size,
24
+ abierta,
25
+ onToggle,
26
+ }: {
27
+ /** Medida que muestra la fila. */
28
+ size: SizeKey;
29
+ /** Si el bloque de código está desplegado. */
30
+ abierta: boolean;
31
+ /** Alterna el bloque de código. */
32
+ onToggle: () => void;
33
+ }) => {
34
+ const { t } = useITTranslation();
35
+
36
+ return (
37
+ <div className={`grid gap-5 border-b py-6 lg:grid-cols-[150px_minmax(0,1fr)] lg:gap-10 ${FILETE}`}>
37
38
  <div>
38
- <p className="text-xs text-slate-400 mb-1.5">ITSelect</p>
39
- <ITSelect
40
- name={`roles_${size}`}
41
- label="Rol"
42
- placeholder="Selecciona una opción"
43
- size={size}
44
- onChange={() => {}}
45
- onBlur={() => {}}
46
- options={[
47
- { label: "Administrador", value: "admin" },
48
- { label: "Colaborador", value: "staff" },
49
- ]}
50
- />
39
+ <p className="font-display text-[18px] font-bold tracking-[-0.02em] text-slate-900 uppercase dark:text-white">
40
+ {size}
41
+ </p>
42
+ <p className="mt-1 text-[12px] leading-relaxed text-slate-500 dark:text-slate-400">
43
+ {t("showcase.sizes.rowDesc")}
44
+ </p>
45
+ <BotonAccion
46
+ variante="text"
47
+ tamano="sm"
48
+ className="!mt-3 !px-0"
49
+ icono={<FaCode size={11} />}
50
+ onClick={onToggle}
51
+ >
52
+ {t("showcase.common.code")}
53
+ </BotonAccion>
51
54
  </div>
52
- <div className="flex flex-wrap items-center gap-3 pt-1">
53
- <p className="text-xs text-slate-400 mr-1">ITButton / ITBadget</p>
54
- <ITButton size={size}>Guardar</ITButton>
55
- <ITButton variant="outlined" color="gray" size={size}>Cancelar</ITButton>
56
- <ITBadget size={size}>Activo</ITBadget>
57
- <ITBadget size={size} variant="outlined">Borrador</ITBadget>
55
+
56
+ <div className="min-w-0">
57
+ <div className="grid gap-4 sm:grid-cols-2">
58
+ <ITInput
59
+ name={`names_${size}`}
60
+ label={t("showcase.sizes.name")}
61
+ placeholder={t("showcase.sizes.exampleName")}
62
+ onChange={() => {}}
63
+ onBlur={() => {}}
64
+ size={size}
65
+ />
66
+ <ITSelect
67
+ name={`roles_${size}`}
68
+ label={t("showcase.sizes.role")}
69
+ placeholder={t("showcase.sizes.placeholder")}
70
+ size={size}
71
+ onChange={() => {}}
72
+ onBlur={() => {}}
73
+ options={[
74
+ { label: "Administrador", value: "admin" },
75
+ { label: "Colaborador", value: "staff" },
76
+ ]}
77
+ />
78
+ </div>
79
+
80
+ <div className="mt-5 flex flex-wrap items-center gap-3">
81
+ <ITButton size={size}>{t("showcase.common.save")}</ITButton>
82
+ <ITButton variant="outlined" color="gray" size={size}>
83
+ {t("showcase.common.cancel")}
84
+ </ITButton>
85
+ <ITBadget size={size}>{t("showcase.common.active")}</ITBadget>
86
+ <ITBadget size={size} variant="outlined">
87
+ {t("showcase.sizes.draft")}
88
+ </ITBadget>
89
+ </div>
90
+
91
+ {abierta && (
92
+ <div className="mt-5">
93
+ <BloqueCodigo code={codigoDeMedida(size)} filename={`size="${size}"`} />
94
+ </div>
95
+ )}
58
96
  </div>
59
97
  </div>
60
- {isOpen && (
61
- <div className="border-t border-slate-200 dark:border-slate-700">
62
- <CodeViewer code={sizeDemoCode(size)} />
63
- </div>
64
- )}
65
- </div>
66
- );
98
+ );
99
+ };
67
100
 
101
+ /**
102
+ * Medidas del sistema (`#ui-system/general/sizes`): la misma escala
103
+ * `sm / md / lg` aplicada a input, select, botón y badge, en filas con filete.
104
+ *
105
+ * @example
106
+ * ```tsx
107
+ * <SizesShowcase />
108
+ * ```
109
+ */
68
110
  export const SizesShowcase = () => {
69
- const [openSize, setOpenSize] = useState<SizeKey | null>(null);
111
+ const { t } = useITTranslation();
112
+ const [abierta, setAbierta] = useState<SizeKey | null>(null);
70
113
 
71
114
  return (
72
- <div className="space-y-6">
73
- <div>
74
- <h2 className="text-xl font-bold text-slate-900 dark:text-white">Medidas estándar · sm / md / lg</h2>
75
- <p className="text-sm text-slate-500 mt-1">
76
- Una sola escala para todos los componentes. El tamaño del formulario, select, botón y badge
77
- se controla con la misma prop <code className="px-1 py-0.5 bg-slate-100 dark:bg-slate-800 rounded text-slate-700 dark:text-slate-300">size</code>.
115
+ <div className="animate-fadeIn pb-4">
116
+ <header className={`border-b pb-8 ${FILETE}`}>
117
+ <p className={EYEBROW}>{`sm · md · lg`}</p>
118
+ <h1 className="mt-2.5 font-display text-[32px] font-bold leading-[1.06] tracking-[-0.02em] text-slate-900 dark:text-white sm:text-[40px]">
119
+ {t("showcase.sizes.title")}
120
+ </h1>
121
+ <p className="mt-4 max-w-[68ch] text-[15px] leading-relaxed text-slate-600 dark:text-slate-300">
122
+ {t("showcase.sizes.desc")}{" "}
123
+ <code className="rounded-[6px] border border-slate-200 bg-slate-50 px-1.5 py-0.5 font-mono text-[12px] text-slate-700 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-200">
124
+ size
125
+ </code>
126
+ .
78
127
  </p>
79
- </div>
80
- {sizes.map((s) => (
81
- <SizeRow key={s} size={s} isOpen={openSize === s} onToggleShow={() => setOpenSize(openSize === s ? null : s)} />
82
- ))}
128
+ </header>
129
+
130
+ <section className="pt-10">
131
+ <div className={`border-t ${FILETE}`}>
132
+ {SIZES.map((size) => (
133
+ <FilaMedida
134
+ key={size}
135
+ size={size}
136
+ abierta={abierta === size}
137
+ onToggle={() => setAbierta(abierta === size ? null : size)}
138
+ />
139
+ ))}
140
+ </div>
141
+ </section>
83
142
  </div>
84
143
  );
85
- };
144
+ };