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
@@ -5,10 +5,12 @@ const path = require('path');
5
5
  const { loadConfig } = require('../config-loader');
6
6
  const { generateCSS } = require('../css-generator');
7
7
  const { generateHTML } = require('../docs-generator/html-generator');
8
- const { writeFile, combineThemeCSS } = require('../generators/utils');
8
+ const { writeFile, combineThemeCSS, resolveActiveThemes } = require('../generators/utils');
9
9
  const { AssetManager } = require('./asset-manager');
10
10
  const { ThemeTransformer } = require('./theme-transformer');
11
11
  const { generateSkillsPage } = require('./skills-generator');
12
+ const { generateComponentsPage } = require('./components-generator');
13
+ const { loadThemeConfig } = require('./theme-config-loader');
12
14
 
13
15
  class BuildOrchestrator {
14
16
  constructor(options = {}) {
@@ -106,10 +108,14 @@ class BuildOrchestrator {
106
108
 
107
109
  /**
108
110
  * Transforma el HTML del tema agregando sidebar y scripts
109
- * @param {Object} themeConfig - Configuración del tema
111
+ * @param {Object} themeConfig - Configuración del tema en config.json (name + enabled)
112
+ * @param {Object} [fullConfig] - Config completo, para inyectar tablas dinámicas (typo, etc.)
113
+ * @param {Array<{name:string,label:string}>} [themesForNav] - Lista de
114
+ * temas activos a exponer en la nav. Si se omite, el ThemeTransformer
115
+ * cae al fallback estático.
110
116
  * @returns {boolean} - true si se transformó exitosamente
111
117
  */
112
- buildThemeHTML(themeConfig) {
118
+ buildThemeHTML(themeConfig, fullConfig = null, themesForNav = null) {
113
119
  if (!themeConfig || !themeConfig.enabled || !themeConfig.name) {
114
120
  return false;
115
121
  }
@@ -118,12 +124,19 @@ class BuildOrchestrator {
118
124
  const sourceFile = path.join(this.projectRoot, 'themes', themeName, 'demo.html');
119
125
  const outputDir = path.dirname(this.outputPath);
120
126
  const targetFile = path.join(outputDir, 'themes', `${themeName}-demo.html`);
121
-
127
+
128
+ // Cargar el theme.json del tema activo (opcional). Pasarlo al transformer
129
+ // permite a la demo mostrar metadatos y tablas de variables del tema.
130
+ const themeData = loadThemeConfig(this.projectRoot, themeName, this.silent);
131
+
122
132
  return this.themeTransformer.transform(
123
133
  sourceFile,
124
134
  targetFile,
125
135
  themeName,
126
- this.silent
136
+ this.silent,
137
+ fullConfig,
138
+ themeData,
139
+ themesForNav
127
140
  );
128
141
  }
129
142
 
@@ -160,15 +173,48 @@ class BuildOrchestrator {
160
173
  const assetsResult = this.assetManager.copyAssets('all', this.silent);
161
174
  result.assets = assetsResult;
162
175
 
163
- // 5. Generar tema si está habilitado
164
- if (configData.theme) {
165
- result.theme.css = this.buildThemeCSS(configData.theme);
166
- result.theme.html = this.buildThemeHTML(configData.theme);
176
+ // 5. Generar tema(s) si están habilitados.
177
+ // La resolución de temas activos (soporte de `config.themes[]` +
178
+ // fallback a `config.theme` singular) está centralizada en
179
+ // `resolveActiveThemes` para que todos los generadores (HTML de
180
+ // guía, nav de demos, skills.html, watch-config) usen la misma
181
+ // lista. Devuelve entradas con `{ name, enabled:true, label }`.
182
+ const activeThemes = resolveActiveThemes(configData);
183
+
184
+ // La lista para la nav sólo necesita `name` + `label`; el flag
185
+ // `enabled` ya fue filtrado por el helper.
186
+ const themesForNav = activeThemes.map(t => ({ name: t.name, label: t.label }));
187
+
188
+ // Para iterar el build, necesitamos las entradas originales del
189
+ // config (pueden incluir flags adicionales específicos de un
190
+ // tema). Igual que antes, seguimos soportando la forma antigua.
191
+ const themeList = Array.isArray(configData.themes)
192
+ ? configData.themes
193
+ : (configData.theme ? [configData.theme] : []);
194
+
195
+ // Resultado agregado: true si AL MENOS un tema se generó correctamente.
196
+ // Se expone además `themes` con el detalle por tema.
197
+ result.theme = { css: false, html: false };
198
+ result.themes = [];
199
+
200
+ for (const themeConfig of themeList) {
201
+ const cssOk = this.buildThemeCSS(themeConfig);
202
+ const htmlOk = this.buildThemeHTML(themeConfig, configData, themesForNav);
203
+ result.themes.push({
204
+ name: themeConfig && themeConfig.name,
205
+ css: cssOk,
206
+ html: htmlOk
207
+ });
208
+ if (cssOk) result.theme.css = true;
209
+ if (htmlOk) result.theme.html = true;
167
210
  }
168
211
 
169
- // 6. Generar página de skills si existe la carpeta skills/
212
+ // 6. Generar página de skills si existe la carpeta skills/.
213
+ // Pasamos el config para que la nav de skills.html enlace sólo a
214
+ // demos de temas realmente activos (dutti+limited por defecto,
215
+ // pero un consumidor puede tener sólo uno).
170
216
  try {
171
- const skillsHtml = generateSkillsPage(this.projectRoot);
217
+ const skillsHtml = generateSkillsPage(this.projectRoot, configData);
172
218
  if (skillsHtml) {
173
219
  const distDir = path.dirname(this.outputPath);
174
220
  const skillsPath = path.join(distDir, 'skills.html');
@@ -184,7 +230,23 @@ class BuildOrchestrator {
184
230
  } catch (err) {
185
231
  if (!this.silent) console.warn('⚠️ No se pudo generar skills.html:', err.message);
186
232
  }
187
-
233
+
234
+ // 7. Generar página de componentes base si existe themes/_base/.
235
+ // Se renderiza con el tema Dutti como base genérica (ver
236
+ // components-generator.js → BASE_THEME). La nav recibe la lista
237
+ // de temas activos para enlazar a sus demos.
238
+ try {
239
+ const componentsHtml = generateComponentsPage(this.projectRoot, configData);
240
+ if (componentsHtml) {
241
+ const distDir = path.dirname(this.outputPath);
242
+ const componentsPath = path.join(distDir, 'componentes.html');
243
+ writeFile(componentsPath, componentsHtml, 'Componentes');
244
+ result.components = true;
245
+ }
246
+ } catch (err) {
247
+ if (!this.silent) console.warn('⚠️ No se pudo generar componentes.html:', err.message);
248
+ }
249
+
188
250
  result.success = true;
189
251
 
190
252
  if (!this.silent) {