holygrail5 1.0.19 → 1.0.21

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 (77) hide show
  1. package/README.md +88 -18
  2. package/config.json +205 -77
  3. package/dist/assets/fonts/suisse-intl-light.woff +0 -0
  4. package/dist/assets/fonts/suisse-intl-light.woff2 +0 -0
  5. package/dist/assets/fonts/suisse-intl-medium.woff +0 -0
  6. package/dist/assets/fonts/suisse-intl-medium.woff2 +0 -0
  7. package/dist/assets/fonts/suisse-intl-regular.woff +0 -0
  8. package/dist/assets/fonts/suisse-intl-regular.woff2 +0 -0
  9. package/dist/assets/fonts/suisse-intl-semibold.woff +0 -0
  10. package/dist/assets/fonts/suisse-intl-semibold.woff2 +0 -0
  11. package/dist/assets/fonts/suisse-works-bold.woff +0 -0
  12. package/dist/assets/fonts/suisse-works-bold.woff2 +0 -0
  13. package/dist/assets/fonts/suisse-works-medium.woff +0 -0
  14. package/dist/assets/fonts/suisse-works-medium.woff2 +0 -0
  15. package/dist/assets/fonts/suisse-works-regular.woff +0 -0
  16. package/dist/assets/fonts/suisse-works-regular.woff2 +0 -0
  17. package/dist/componentes.html +429 -0
  18. package/dist/developer-guide.md +7 -7
  19. package/dist/guide-styles.css +197 -25
  20. package/dist/index.html +807 -689
  21. package/dist/output.css +217 -114
  22. package/dist/skills.html +14 -8
  23. package/dist/themes/dutti-demo.html +713 -19
  24. package/dist/themes/dutti.css +67 -16
  25. package/dist/themes/limited-demo.html +1121 -0
  26. package/dist/themes/limited.css +2493 -0
  27. package/package.json +1 -1
  28. package/src/.data/.previous-values.json +151 -84
  29. package/src/assets/fonts/suisse-intl-light.woff +0 -0
  30. package/src/assets/fonts/suisse-intl-light.woff2 +0 -0
  31. package/src/assets/fonts/suisse-intl-medium.woff +0 -0
  32. package/src/assets/fonts/suisse-intl-medium.woff2 +0 -0
  33. package/src/assets/fonts/suisse-intl-regular.woff +0 -0
  34. package/src/assets/fonts/suisse-intl-regular.woff2 +0 -0
  35. package/src/assets/fonts/suisse-intl-semibold.woff +0 -0
  36. package/src/assets/fonts/suisse-intl-semibold.woff2 +0 -0
  37. package/src/assets/fonts/suisse-works-bold.woff +0 -0
  38. package/src/assets/fonts/suisse-works-bold.woff2 +0 -0
  39. package/src/assets/fonts/suisse-works-medium.woff +0 -0
  40. package/src/assets/fonts/suisse-works-medium.woff2 +0 -0
  41. package/src/assets/fonts/suisse-works-regular.woff +0 -0
  42. package/src/assets/fonts/suisse-works-regular.woff2 +0 -0
  43. package/src/build/asset-manager.js +94 -3
  44. package/src/build/build-orchestrator.js +74 -12
  45. package/src/build/components-generator.js +584 -0
  46. package/src/build/skills-generator.js +43 -5
  47. package/src/build/theme-config-loader.js +58 -0
  48. package/src/build/theme-transformer.js +109 -16
  49. package/src/build/theme-vars-table-generator.js +349 -0
  50. package/src/build/typo-table-generator.js +154 -0
  51. package/src/docs-generator/guide-styles.css +197 -24
  52. package/src/docs-generator/html-generator.js +92 -246
  53. package/src/docs-generator/sections/colors-section.js +109 -0
  54. package/src/docs-generator/value-tracker.js +154 -0
  55. package/src/generators/typo-generator.js +2 -1
  56. package/src/generators/utils.js +90 -1
  57. package/src/skills.html +1 -0
  58. package/src/watch-config.js +99 -32
  59. package/themes/{dutti → _base}/_buttons.css +2 -2
  60. package/themes/{dutti → _base}/_checkboxes.css +1 -1
  61. package/themes/{dutti → _base}/_forms.css +1 -1
  62. package/themes/{dutti → _base}/_inputs.css +55 -10
  63. package/themes/{dutti → _base}/_labels.css +1 -1
  64. package/themes/dutti/README.md +67 -21
  65. package/themes/dutti/_variables.css +7 -1
  66. package/themes/dutti/demo.html +18 -14
  67. package/themes/dutti/theme.css +22 -44
  68. package/themes/dutti/theme.json +86 -0
  69. package/themes/limited/_variables.css +123 -0
  70. package/themes/limited/demo.html +296 -0
  71. package/themes/limited/theme.css +32 -0
  72. package/themes/limited/theme.json +105 -0
  73. /package/themes/{dutti → _base}/_containers.css +0 -0
  74. /package/themes/{dutti → _base}/_radios.css +0 -0
  75. /package/themes/{dutti → _base}/_switches.css +0 -0
  76. /package/themes/{dutti → _base}/components/_icons.css +0 -0
  77. /package/themes/{dutti → _base}/objects/_grid.css +0 -0
@@ -0,0 +1,429 @@
1
+ <!DOCTYPE html>
2
+ <html lang="es">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>HolyGrail5 — Componentes base</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Instrument+Sans:regular,100,500,600,700">
10
+ <!-- Framework base -->
11
+ <link rel="stylesheet" href="output.css">
12
+ <!-- Tema base genérico: dutti (variables + componentes) -->
13
+ <link rel="stylesheet" href="themes/dutti.css">
14
+ <!-- Estilos compartidos de guía (header, sidebar, demo-*) -->
15
+ <link rel="stylesheet" href="guide-styles.css">
16
+ <style>
17
+ body {
18
+ font-family: 'Instrument Sans', sans-serif !important;
19
+ }
20
+
21
+ /* Descripción de cada sección (debajo del título) */
22
+ .cmp-desc {
23
+ font-size: 14px;
24
+ line-height: 1.6;
25
+ color: #555;
26
+ margin: 0 0 1.5rem;
27
+ max-width: 720px;
28
+ }
29
+ .cmp-desc code {
30
+ background: #f3f3f3;
31
+ padding: 2px 6px;
32
+ border-radius: 4px;
33
+ font-size: 0.88em;
34
+ }
35
+
36
+ /* Preview de cada componente dentro de .demo-item */
37
+ .cmp-preview {
38
+ min-height: 48px;
39
+ display: flex;
40
+ align-items: center;
41
+ flex-wrap: wrap;
42
+ gap: 0.5rem;
43
+ margin-bottom: var(--hg-spacing-12);
44
+ }
45
+
46
+ /* Los inputs con floating label necesitan respirar: el label flota
47
+ encima, el helper-text se apila debajo. */
48
+ #inputs .cmp-preview,
49
+ #forms .cmp-preview {
50
+ display: block;
51
+ }
52
+ #inputs .cmp-preview > .form-input-label-2,
53
+ #forms .cmp-preview > .form-group {
54
+ width: 100%;
55
+ }
56
+
57
+ /* Containers y Grid son estructuras de layout: interesan como
58
+ bloques a 100% del item, no como chips alineados horizontalmente. */
59
+ #containers .demo-grid,
60
+ #grid .demo-grid {
61
+ grid-template-columns: 1fr;
62
+ }
63
+ #containers .cmp-preview,
64
+ #grid .cmp-preview {
65
+ display: block;
66
+ }
67
+ #containers .cmp-preview > [class^="container"],
68
+ #grid .cmp-preview > [class^="hg-grid-"] {
69
+ width: 100%;
70
+ max-width: 100%;
71
+ }
72
+ </style>
73
+ </head>
74
+ <body>
75
+
76
+ <div class="guide-header">
77
+ <a href="index.html" class="guide-logo" style="text-decoration:none;">HolyGrail5</a>
78
+ <div style="display: flex; align-items: center; gap: 1rem;">
79
+ <nav class="guide-nav">
80
+ <a href="index.html">Guía</a>
81
+ <a href="componentes.html" class="active">Componentes</a>
82
+ <a href="themes/dutti-demo.html">Tema Dutti</a>
83
+ <a href="themes/limited-demo.html">Tema Limited</a>
84
+ <a href="skills.html">Skills</a>
85
+ </nav>
86
+ <button class="guide-header-button" onclick="toggleSidebar()">☰</button>
87
+ </div>
88
+ </div>
89
+
90
+ <div class="guide-sidebar-overlay" onclick="toggleSidebar()"></div>
91
+
92
+ <aside class="guide-sidebar">
93
+ <div class="guide-sidebar-header">
94
+ <div>HolyGrail5</div>
95
+ <p class="guide-sidebar-subtitle">Componentes base</p>
96
+ </div>
97
+
98
+ <nav class="guide-sidebar-nav">
99
+ <p class="guide-sidebar-title">Componentes</p>
100
+
101
+ <a href="#buttons" class="guide-menu-item">Botones</a>
102
+ <a href="#inputs" class="guide-menu-item">Inputs</a>
103
+ <a href="#labels" class="guide-menu-item">Labels</a>
104
+ <a href="#checkboxes" class="guide-menu-item">Checkboxes</a>
105
+ <a href="#radios" class="guide-menu-item">Radios</a>
106
+ <a href="#switches" class="guide-menu-item">Switches</a>
107
+ <a href="#forms" class="guide-menu-item">Formularios</a>
108
+ <a href="#containers" class="guide-menu-item">Containers</a>
109
+ <a href="#grid" class="guide-menu-item">Grid</a>
110
+ </nav>
111
+ </aside>
112
+
113
+ <script>
114
+ function toggleSidebar() {
115
+ const sidebar = document.querySelector('.guide-sidebar');
116
+ const overlay = document.querySelector('.guide-sidebar-overlay');
117
+ sidebar.classList.toggle('open');
118
+ overlay.classList.toggle('active');
119
+ }
120
+
121
+ function closeSidebar() {
122
+ const sidebar = document.querySelector('.guide-sidebar');
123
+ const overlay = document.querySelector('.guide-sidebar-overlay');
124
+ sidebar.classList.remove('open');
125
+ overlay.classList.remove('active');
126
+ }
127
+
128
+ window.toggleSidebar = toggleSidebar;
129
+ window.closeSidebar = closeSidebar;
130
+ </script>
131
+
132
+ <main class="demo-container guide-main-content">
133
+ <h2 class="demo-title">Componentes base</h2>
134
+
135
+ <div class="demo-section-2">
136
+ <h3>¿Qué es esta página?</h3>
137
+ <p class="mb-16">
138
+ Librería de componentes compartidos que viven en
139
+ <code>themes/_base/</code>. Se renderizan con el tema
140
+ <strong>Dutti</strong>
141
+ como base genérica del framework; cualquier otro tema puede
142
+ aplicarse encima para redefinir la identidad visual sin tocar
143
+ el HTML.
144
+ </p>
145
+ </div>
146
+
147
+
148
+ <section class="demo-section" id="buttons">
149
+ <h2 class="demo-title">Botones</h2>
150
+ <p class="cmp-desc">Variantes estándar del framework: <code>primary</code>, <code>secondary</code>, <code>tertiary</code>, <code>label-m</code>, <code>link</code> y <code>badge</code>. Clases en <code>themes/_base/_buttons.css</code>. Cada tema puede sobreescribirlas con su propia identidad visual.</p>
151
+
152
+ <h3 class="demo-subtitle">Variantes</h3>
153
+ <div class="demo-grid">
154
+ <div class="demo-item">
155
+ <div class="cmp-preview"><button class="btn btn-primary">Primary</button></div>
156
+ <div class="demo-code">.btn .btn-primary</div>
157
+ </div>
158
+ <div class="demo-item">
159
+ <div class="cmp-preview"><button class="btn btn-secondary">Secondary</button></div>
160
+ <div class="demo-code">.btn .btn-secondary</div>
161
+ </div>
162
+ <div class="demo-item">
163
+ <div class="cmp-preview"><button class="btn btn-tertiary">Tertiary</button></div>
164
+ <div class="demo-code">.btn .btn-tertiary</div>
165
+ </div>
166
+ <div class="demo-item">
167
+ <div class="cmp-preview"><button class="btn btn-tertiary hg-text-underline">Tertiary underline</button></div>
168
+ <div class="demo-code">.btn .btn-tertiary .hg-text-underline</div>
169
+ </div>
170
+ <div class="demo-item">
171
+ <div class="cmp-preview"><button class="btn btn-label-m">Label M</button></div>
172
+ <div class="demo-code">.btn .btn-label-m</div>
173
+ </div>
174
+ <div class="demo-item">
175
+ <div class="cmp-preview"><button class="btn btn-link">Link</button></div>
176
+ <div class="demo-code">.btn .btn-link</div>
177
+ </div>
178
+ <div class="demo-item">
179
+ <div class="cmp-preview"><button class="btn btn-badge">Badge</button></div>
180
+ <div class="demo-code">.btn .btn-badge</div>
181
+ </div>
182
+ <div class="demo-item">
183
+ <div class="cmp-preview"><button class="btn btn-primary" disabled>Disabled</button></div>
184
+ <div class="demo-code">.btn[disabled]</div>
185
+ </div>
186
+ </div>
187
+ <h3 class="demo-subtitle">Tamaños</h3>
188
+ <div class="demo-grid">
189
+ <div class="demo-item">
190
+ <div class="cmp-preview"><button class="btn btn-primary btn-sm">Small</button></div>
191
+ <div class="demo-code">.btn .btn-sm</div>
192
+ </div>
193
+ <div class="demo-item">
194
+ <div class="cmp-preview"><button class="btn btn-primary btn-md">Medium</button></div>
195
+ <div class="demo-code">.btn .btn-md</div>
196
+ </div>
197
+ <div class="demo-item">
198
+ <div class="cmp-preview"><button class="btn btn-primary btn-lg">Large</button></div>
199
+ <div class="demo-code">.btn .btn-lg</div>
200
+ </div>
201
+ </div>
202
+ <h3 class="demo-subtitle">Ancho completo</h3>
203
+ <div class="demo-grid">
204
+ <div class="demo-item">
205
+ <div class="cmp-preview"><button class="btn btn-primary btn-md btn-full">Botón ancho completo</button></div>
206
+ <div class="demo-code">.btn .btn-full</div>
207
+ </div>
208
+ </div>
209
+ </section>
210
+
211
+ <section class="demo-section" id="inputs">
212
+ <h2 class="demo-title">Inputs</h2>
213
+ <p class="cmp-desc">Campos de formulario base con <strong>floating label</strong>: texto, email, password, textarea y select. Cada input vive dentro de <code>.form-input-label-2</code> para que el label se anime al enfocar o al contener valor. Clases en <code>themes/_base/_inputs.css</code>.</p>
214
+
215
+ <h3 class="demo-subtitle">Tipos</h3>
216
+ <div class="demo-grid">
217
+ <div class="demo-item">
218
+ <div class="cmp-preview"><div class="form-input-label-2"><input type="text" id="cmp-input-text" class="input" placeholder=" " /><label for="cmp-input-text">Texto</label></div></div>
219
+ <div class="demo-code">.form-input-label-2 &gt; .input</div>
220
+ </div>
221
+ <div class="demo-item">
222
+ <div class="cmp-preview"><div class="form-input-label-2"><input type="email" id="cmp-input-email" class="input" placeholder=" " /><label for="cmp-input-email">Email</label></div></div>
223
+ <div class="demo-code">.input (type=email)</div>
224
+ </div>
225
+ <div class="demo-item">
226
+ <div class="cmp-preview"><div class="form-input-label-2"><input type="password" id="cmp-input-password" class="input" placeholder=" " /><label for="cmp-input-password">Contraseña</label></div></div>
227
+ <div class="demo-code">.input (type=password)</div>
228
+ </div>
229
+ <div class="demo-item">
230
+ <div class="cmp-preview"><div class="form-input-label-2"><textarea id="cmp-input-textarea" class="input" placeholder=" " rows="3"></textarea><label for="cmp-input-textarea">Comentario</label></div></div>
231
+ <div class="demo-code">.input (textarea)</div>
232
+ </div>
233
+ <div class="demo-item">
234
+ <div class="cmp-preview"><div class="form-input-label-2"><select id="cmp-input-select" class="input"><option>Opción A</option><option>Opción B</option></select><label for="cmp-input-select">Selecciona</label></div></div>
235
+ <div class="demo-code">.input (select)</div>
236
+ </div>
237
+ </div>
238
+ <h3 class="demo-subtitle">Estados</h3>
239
+ <div class="demo-grid">
240
+ <div class="demo-item">
241
+ <div class="cmp-preview"><div class="form-input-label-2"><input type="text" id="cmp-input-error" class="input input-error" value="Valor inválido" placeholder=" " /><label for="cmp-input-error">Error</label></div><span class="helper-text helper-text-error">Este campo tiene un error</span></div>
242
+ <div class="demo-code">.input-error + .helper-text-error</div>
243
+ </div>
244
+ <div class="demo-item">
245
+ <div class="cmp-preview"><div class="form-input-label-2"><input type="text" id="cmp-input-success" class="input input-success" value="Valor válido" placeholder=" " /><label for="cmp-input-success">Success</label></div><span class="helper-text helper-text-success">Campo válido</span></div>
246
+ <div class="demo-code">.input-success + .helper-text-success</div>
247
+ </div>
248
+ <div class="demo-item">
249
+ <div class="cmp-preview"><div class="form-input-label-2"><input type="text" id="cmp-input-warning" class="input input-warning" value="Atención" placeholder=" " /><label for="cmp-input-warning">Warning</label></div><span class="helper-text helper-text-warning">Revisa este campo</span></div>
250
+ <div class="demo-code">.input-warning + .helper-text-warning</div>
251
+ </div>
252
+ <div class="demo-item">
253
+ <div class="cmp-preview"><div class="form-input-label-2"><input type="text" id="cmp-input-disabled" class="input" value="No editable" placeholder=" " disabled /><label for="cmp-input-disabled">Disabled</label></div></div>
254
+ <div class="demo-code">.input[disabled]</div>
255
+ </div>
256
+ </div>
257
+ </section>
258
+
259
+ <section class="demo-section" id="labels">
260
+ <h2 class="demo-title">Labels</h2>
261
+ <p class="cmp-desc">Etiquetas de formulario: base, obligatoria e inline. Clases en <code>themes/_base/_labels.css</code>.</p>
262
+
263
+ <h3 class="demo-subtitle">Variantes</h3>
264
+ <div class="demo-grid">
265
+ <div class="demo-item">
266
+ <div class="cmp-preview"><label class="label">Nombre</label></div>
267
+ <div class="demo-code">.label</div>
268
+ </div>
269
+ <div class="demo-item">
270
+ <div class="cmp-preview"><label class="label label-required">Email</label></div>
271
+ <div class="demo-code">.label .label-required</div>
272
+ </div>
273
+ <div class="demo-item">
274
+ <div class="cmp-preview"><label class="label label-inline"><input type="checkbox" /> Acepto los términos</label></div>
275
+ <div class="demo-code">.label .label-inline</div>
276
+ </div>
277
+ </div>
278
+ </section>
279
+
280
+ <section class="demo-section" id="checkboxes">
281
+ <h2 class="demo-title">Checkboxes</h2>
282
+ <p class="cmp-desc">Checkbox con input nativo oculto y marca SVG inline dentro de <code>.checkbox-indicator</code>. El estado visible se controla 100% con CSS (sin JS). Clases en <code>themes/_base/_checkboxes.css</code>.</p>
283
+
284
+ <h3 class="demo-subtitle">Estados</h3>
285
+ <div class="demo-grid">
286
+ <div class="demo-item">
287
+ <div class="cmp-preview"><label class="checkbox"><input type="checkbox" /><span class="checkbox-indicator"><svg class="cbox__icon" viewBox="0 0 10 8" width="10" height="8" aria-hidden="true" focusable="false"><path d="M9.05823.198273 9.69185.801721 3.5417 7.25937.308228 3.86422.941848 3.26077 3.5417 5.99062 9.05823.198273Z" fill="currentColor"/></svg></span><span class="checkbox-label">Sin marcar</span></label></div>
288
+ <div class="demo-code">.checkbox</div>
289
+ </div>
290
+ <div class="demo-item">
291
+ <div class="cmp-preview"><label class="checkbox"><input type="checkbox" checked /><span class="checkbox-indicator"><svg class="cbox__icon" viewBox="0 0 10 8" width="10" height="8" aria-hidden="true" focusable="false"><path d="M9.05823.198273 9.69185.801721 3.5417 7.25937.308228 3.86422.941848 3.26077 3.5417 5.99062 9.05823.198273Z" fill="currentColor"/></svg></span><span class="checkbox-label">Marcado</span></label></div>
292
+ <div class="demo-code">.checkbox (checked)</div>
293
+ </div>
294
+ <div class="demo-item">
295
+ <div class="cmp-preview"><label class="checkbox"><input type="checkbox" disabled /><span class="checkbox-indicator"><svg class="cbox__icon" viewBox="0 0 10 8" width="10" height="8" aria-hidden="true" focusable="false"><path d="M9.05823.198273 9.69185.801721 3.5417 7.25937.308228 3.86422.941848 3.26077 3.5417 5.99062 9.05823.198273Z" fill="currentColor"/></svg></span><span class="checkbox-label">Disabled</span></label></div>
296
+ <div class="demo-code">.checkbox[disabled]</div>
297
+ </div>
298
+ </div>
299
+ </section>
300
+
301
+ <section class="demo-section" id="radios">
302
+ <h2 class="demo-title">Radios</h2>
303
+ <p class="cmp-desc">Radio buttons con el patrón <code>.checkbox-radio</code>: el input nativo se oculta visualmente y el círculo se pinta con <code>label::before</code>. Clases en <code>themes/_base/_radios.css</code>.</p>
304
+
305
+ <h3 class="demo-subtitle">Grupo</h3>
306
+ <div class="demo-grid">
307
+ <div class="demo-item">
308
+ <div class="cmp-preview"><div class="checkbox-radio"><input id="cmp-radio-1" name="cmp-radio" type="radio" value="A" /><label for="cmp-radio-1"><i class="ico-radio"></i><span class="title-m">Opción A</span></label></div></div>
309
+ <div class="demo-code">.checkbox-radio</div>
310
+ </div>
311
+ <div class="demo-item">
312
+ <div class="cmp-preview"><div class="checkbox-radio"><input id="cmp-radio-2" name="cmp-radio" type="radio" value="B" checked /><label for="cmp-radio-2"><i class="ico-radio"></i><span class="title-m">Opción B (activa)</span></label></div></div>
313
+ <div class="demo-code">.checkbox-radio (checked)</div>
314
+ </div>
315
+ <div class="demo-item">
316
+ <div class="cmp-preview"><div class="checkbox-radio"><input id="cmp-radio-3" name="cmp-radio-2" type="radio" value="C" disabled /><label for="cmp-radio-3"><i class="ico-radio"></i><span class="title-m">Disabled</span></label></div></div>
317
+ <div class="demo-code">.checkbox-radio[disabled]</div>
318
+ </div>
319
+ </div>
320
+ </section>
321
+
322
+ <section class="demo-section" id="switches">
323
+ <h2 class="demo-title">Switches</h2>
324
+ <p class="cmp-desc">Interruptores on/off con el patrón <code>.checkbox-item-2</code>: pista rectangular y un <code>.checkbox-circle</code> que se desplaza al marcar. Clases en <code>themes/_base/_switches.css</code>.</p>
325
+
326
+ <h3 class="demo-subtitle">Estados</h3>
327
+ <div class="demo-grid">
328
+ <div class="demo-item">
329
+ <div class="cmp-preview"><div class="checkbox-item-2"><input id="cmp-switch-1" name="cmp-switch-1" type="checkbox" /><label for="cmp-switch-1"><div class="checkbox-circle"></div><span class="theta">Inactivo</span></label></div></div>
330
+ <div class="demo-code">.checkbox-item-2</div>
331
+ </div>
332
+ <div class="demo-item">
333
+ <div class="cmp-preview"><div class="checkbox-item-2"><input id="cmp-switch-2" name="cmp-switch-2" type="checkbox" checked /><label for="cmp-switch-2"><div class="checkbox-circle"></div><span class="theta">Activado</span></label></div></div>
334
+ <div class="demo-code">.checkbox-item-2 (checked)</div>
335
+ </div>
336
+ <div class="demo-item">
337
+ <div class="cmp-preview"><div class="checkbox-item-2"><input id="cmp-switch-3" name="cmp-switch-3" type="checkbox" disabled /><label for="cmp-switch-3"><div class="checkbox-circle"></div><span class="theta">Disabled</span></label></div></div>
338
+ <div class="demo-code">.checkbox-item-2[disabled]</div>
339
+ </div>
340
+ <div class="demo-item">
341
+ <div class="cmp-preview"><div class="checkbox-item-2 is-error"><input id="cmp-switch-4" name="cmp-switch-4" type="checkbox" /><label for="cmp-switch-4"><div class="checkbox-circle"></div><span class="theta">Error</span></label></div></div>
342
+ <div class="demo-code">.checkbox-item-2.is-error</div>
343
+ </div>
344
+ </div>
345
+ </section>
346
+
347
+ <section class="demo-section" id="forms">
348
+ <h2 class="demo-title">Formularios</h2>
349
+ <p class="cmp-desc">Composición de campos con label flotante + estado. <code>.form-group</code> apila verticalmente los campos; cada uno usa <code>.form-input-label-2</code> para el floating label y (opcionalmente) <code>.helper-text</code> para el mensaje de estado. Clases en <code>themes/_base/_forms.css</code>.</p>
350
+
351
+ <h3 class="demo-subtitle">Grupo de formulario</h3>
352
+ <div class="demo-grid">
353
+ <div class="demo-item">
354
+ <div class="cmp-preview"><div class="form-group"><div class="form-input-label-2"><input type="email" id="cmp-form-email" class="input" placeholder=" " /><label for="cmp-form-email">Email</label></div></div></div>
355
+ <div class="demo-code">.form-group &gt; .form-input-label-2</div>
356
+ </div>
357
+ <div class="demo-item">
358
+ <div class="cmp-preview"><div class="form-group"><div class="form-input-label-2"><textarea id="cmp-form-msg" class="input" rows="3" placeholder=" "></textarea><label for="cmp-form-msg">Mensaje</label></div></div></div>
359
+ <div class="demo-code">.form-group (con textarea)</div>
360
+ </div>
361
+ <div class="demo-item">
362
+ <div class="cmp-preview"><div class="form-group"><div class="form-input-label-2"><input type="text" id="cmp-form-err" class="input input-error" value="" placeholder=" " /><label for="cmp-form-err">Nombre</label></div><span class="helper-text helper-text-error">Este campo es obligatorio</span></div></div>
363
+ <div class="demo-code">.form-group (con helper-text)</div>
364
+ </div>
365
+ </div>
366
+ </section>
367
+
368
+ <section class="demo-section" id="containers">
369
+ <h2 class="demo-title">Containers</h2>
370
+ <p class="cmp-desc">Contenedores centrados con <code>max-width</code> responsivo y/o fijo. <code>.container</code> escala con los breakpoints; <code>.container-2</code> es más estrecho; las variantes <code>.container-640</code>, <code>.container-512</code> y <code>.container-360</code> fijan un ancho concreto. Clases en <code>themes/_base/_containers.css</code>.</p>
371
+
372
+ <h3 class="demo-subtitle">Responsivos</h3>
373
+ <div class="demo-grid">
374
+ <div class="demo-item">
375
+ <div class="cmp-preview"><div class="container" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">.container</div></div>
376
+ <div class="demo-code">.container</div>
377
+ </div>
378
+ <div class="demo-item">
379
+ <div class="cmp-preview"><div class="container-2" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">.container-2</div></div>
380
+ <div class="demo-code">.container-2</div>
381
+ </div>
382
+ </div>
383
+ <h3 class="demo-subtitle">Anchos fijos</h3>
384
+ <div class="demo-grid">
385
+ <div class="demo-item">
386
+ <div class="cmp-preview"><div class="container-640" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">.container-640</div></div>
387
+ <div class="demo-code">.container-640</div>
388
+ </div>
389
+ <div class="demo-item">
390
+ <div class="cmp-preview"><div class="container-512" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">.container-512</div></div>
391
+ <div class="demo-code">.container-512</div>
392
+ </div>
393
+ <div class="demo-item">
394
+ <div class="cmp-preview"><div class="container-360" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">.container-360</div></div>
395
+ <div class="demo-code">.container-360</div>
396
+ </div>
397
+ </div>
398
+ </section>
399
+
400
+ <section class="demo-section" id="grid">
401
+ <h2 class="demo-title">Grid</h2>
402
+ <p class="cmp-desc">Utilidades de CSS Grid inspiradas en Tailwind. El contenedor debe tener <code>display:grid</code> y usar <code>.hg-grid-cols-N</code> para definir N columnas; los hijos usan <code>.hg-col-span-N</code> para ocupar varias. Con el prefijo <code>md:</code> se activan a partir de 768&nbsp;px. Clases en <code>themes/_base/objects/_grid.css</code>.</p>
403
+
404
+ <h3 class="demo-subtitle">Columnas iguales</h3>
405
+ <div class="demo-grid">
406
+ <div class="demo-item">
407
+ <div class="cmp-preview"><div class="hg-grid-cols-3" style="display:grid; gap:var(--hg-spacing-8);"><div style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">1</div><div style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">2</div><div style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">3</div></div></div>
408
+ <div class="demo-code">.hg-grid-cols-3</div>
409
+ </div>
410
+ <div class="demo-item">
411
+ <div class="cmp-preview"><div class="hg-grid-cols-4" style="display:grid; gap:var(--hg-spacing-8);"><div style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">1</div><div style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">2</div><div style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">3</div><div style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">4</div></div></div>
412
+ <div class="demo-code">.hg-grid-cols-4</div>
413
+ </div>
414
+ </div>
415
+ <h3 class="demo-subtitle">Col-span</h3>
416
+ <div class="demo-grid">
417
+ <div class="demo-item">
418
+ <div class="cmp-preview"><div class="hg-grid-cols-12" style="display:grid; gap:var(--hg-spacing-8);"><div class="hg-col-span-8" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">span 8</div><div class="hg-col-span-4" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">span 4</div></div></div>
419
+ <div class="demo-code">.hg-grid-cols-12 &gt; .hg-col-span-{8,4}</div>
420
+ </div>
421
+ <div class="demo-item">
422
+ <div class="cmp-preview"><div class="hg-grid-cols-12" style="display:grid; gap:var(--hg-spacing-8);"><div class="hg-col-span-6" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">span 6</div><div class="hg-col-span-6" style="background:var(--hg-color-light-grey); padding:var(--hg-spacing-16);">span 6</div></div></div>
423
+ <div class="demo-code">.hg-grid-cols-12 &gt; .hg-col-span-6</div>
424
+ </div>
425
+ </div>
426
+ </section>
427
+ </main>
428
+ </body>
429
+ </html>
@@ -94,14 +94,14 @@ Definidos en `config.colors`. Cada color genera una variable `--hg-color-{nombre
94
94
  ```css
95
95
  /* Uso en CSS */
96
96
  color: var(--hg-color-primary);
97
- background: var(--hg-color-vanilla);
97
+ background: var(--hg-color-bg-cream);
98
98
  border-color: var(--hg-color-error);
99
99
 
100
100
  /* Uso inline en HTML (cuando no hay clase específica) */
101
101
  <div style="color: var(--hg-color-dark-grey)">Texto</div>
102
102
  ```
103
103
 
104
- Colores disponibles por defecto: `white`, `black`, `dark-grey`, `middle-grey`, `light-grey`, `grey-ultra`, `orange`, `mustard`, `primary`, `error`, `info`, `success`, `warning`, `feel`, `feel-dark`, `special`, `vanilla`, `silver`, `gold`, `platinum`, `charcoal`, `bg-light`, `sk-grey`, `bg-cream`.
104
+ Colores disponibles por defecto: `white`, `black`, `dark-grey`, `middle-grey`, `light-grey`, `grey-ultra`, `orange`, `mustard`, `primary`, `error`, `info`, `success`, `warning`, `feel`, `feel-dark`, `silver`, `gold`, `platinum`, `bg-light`, `bg-cream`.
105
105
 
106
106
  ### Spacing
107
107
 
@@ -129,7 +129,7 @@ Los valores px se convierten automáticamente a rem (base 16px).
129
129
  Las variables tipográficas se generan automáticamente y se deduplicam para evitar repeticiones:
130
130
 
131
131
  ```css
132
- --hg-typo-font-family-primary: arial, sans-serif;
132
+ --hg-typo-font-family-primary-regular: arial, sans-serif;
133
133
  --hg-typo-font-family-secondary: "ms-serif", serif;
134
134
  --hg-typo-font-size-12: 0.75rem;
135
135
  --hg-typo-font-size-14: 0.875rem;
@@ -393,7 +393,7 @@ Las clases son mobile-first. Los valores base aplican a mobile y un media query
393
393
  ```css
394
394
  /* CSS generado (ejemplo) */
395
395
  .hg-h2 {
396
- font-family: var(--hg-typo-font-family-primary);
396
+ font-family: var(--hg-typo-font-family-primary-regular);
397
397
  font-weight: var(--hg-typo-font-weight-900);
398
398
  font-size: var(--hg-typo-font-size-18); /* mobile */
399
399
  line-height: var(--hg-typo-line-height-1-976);
@@ -570,7 +570,7 @@ Clases para mantener proporciones en contenedores.
570
570
 
571
571
  ```html
572
572
  <header class="hg-position-sticky hg-z-50 hg-d-flex hg-justify-between hg-items-center p-16"
573
- style="top: 0; background: var(--hg-color-white); border-bottom: 1px solid var(--hg-color-sk-grey);">
573
+ style="top: 0; background: var(--hg-color-white); border-bottom: 1px solid var(--hg-color-middle-grey);">
574
574
  <span class="hg-title-l-b">Logo</span>
575
575
  <nav class="hg-d-flex hg-gap-24">
576
576
  <a class="hg-text-m" href="#">Inicio</a>
@@ -585,7 +585,7 @@ Clases para mantener proporciones en contenedores.
585
585
  ```html
586
586
  <div class="row">
587
587
  <aside class="col-xs-12 col-md-3 hg-d-none md:hg-d-block p-16"
588
- style="border-right: 1px solid var(--hg-color-sk-grey);">
588
+ style="border-right: 1px solid var(--hg-color-middle-grey);">
589
589
  <nav class="hg-d-flex hg-flex-column hg-gap-8">
590
590
  <a class="hg-text-m" href="#">Sección 1</a>
591
591
  <a class="hg-text-m" href="#">Sección 2</a>
@@ -601,7 +601,7 @@ Clases para mantener proporciones en contenedores.
601
601
  ### Footer multicolumna
602
602
 
603
603
  ```html
604
- <footer class="pt-48 pb-24" style="background: var(--hg-color-charcoal); color: var(--hg-color-white);">
604
+ <footer class="pt-48 pb-24" style="background: var(--hg-color-grey-ultra); color: var(--hg-color-white);">
605
605
  <div class="row hg-px-16 md:hg-px-32 hg-gap-24">
606
606
  <div class="col-xs-12 col-md-4">
607
607
  <h4 class="hg-title-l-b" style="color: var(--hg-color-white);">Empresa</h4>