desy-html 16.0.2 → 16.0.3

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.
package/AGENTS.md CHANGED
@@ -155,8 +155,9 @@ desy-html/
155
155
 
156
156
  To customize for different organizations:
157
157
  1. Edit `branding/branding.config.js` or create `branding/branding.config.{name}.js`
158
- 2. Replace logos in `branding/logos/`
159
- 3. Run `BRANDING_CONFIG={name} npm run build`
158
+ 2. Add favicon files to `branding/logos/` (favicon.svg, favicon.ico, apple-touch-icon.png)
159
+ 3. Replace logos in `branding/logos/`
160
+ 4. Run `BRANDING_CONFIG={name} npm run build`
160
161
 
161
162
  ## Common Patterns
162
163
 
package/TESTING_PLAN.md CHANGED
@@ -27,6 +27,10 @@ This document defines the complete testing plan to execute before publishing the
27
27
  - [ ] Verify background images exist:
28
28
  - `branding/images/header-background.svg`
29
29
  - `branding/images/header-background-lg.svg`
30
+ - [ ] Verify favicon files exist:
31
+ - `branding/logos/favicon.svg`
32
+ - `branding/logos/favicon.ico`
33
+ - `branding/logos/apple-touch-icon.png`
30
34
 
31
35
  ### 1.2. package.json Exports Review
32
36
 
@@ -53,6 +57,7 @@ This document defines the complete testing plan to execute before publishing the
53
57
  - Organization logos (aragon-*.svg)
54
58
  - EU logos (*.svg in subfolder or root)
55
59
  - Background images (header-background*.svg)
60
+ - [ ] Verify favicon files are copied to dist (favicon.ico, apple-touch-icon.png)
56
61
 
57
62
  ### 2.3. Production Paths Verification
58
63
 
@@ -75,6 +80,7 @@ Using the browser agent, test the following pages:
75
80
  - [ ] Verify organization logo displays (not broken, no 404)
76
81
  - [ ] Verify primary colors are Aragón's (#00607a)
77
82
  - [ ] Verify typography is correct (Open Sans)
83
+ - [ ] Verify favicon displays in browser tab (not broken, no 404)
78
84
 
79
85
  #### Header
80
86
 
@@ -351,6 +357,7 @@ The project is ready for npm publishing when:
351
357
  - [ ] Organization logos display correctly
352
358
  - [ ] EU logos display correctly
353
359
  - [ ] Header background images display correctly
360
+ - [ ] Favicon files are generated and load correctly
354
361
  - [ ] All interactive components work correctly
355
362
  - [ ] No 404 errors in console
356
363
  - [ ] No JavaScript errors in console
@@ -29,6 +29,11 @@ export default {
29
29
  plurifondo: '/branding/logos/eu/logo-plurifondo.svg',
30
30
  },
31
31
  },
32
+ favicon: {
33
+ svg: '/branding/logos/favicon.svg',
34
+ ico: '/branding/logos/favicon.ico',
35
+ appleTouch: '/branding/logos/apple-touch-icon.png'
36
+ },
32
37
  };
33
38
  ```
34
39
 
@@ -133,6 +138,18 @@ Additional images.
133
138
  | `headerBackground` | string | No | Header background image |
134
139
  | `headerBackgroundLg` | string | No | Large header background image |
135
140
 
141
+ ### favicon
142
+
143
+ Favicon configuration for browser tabs and mobile devices.
144
+
145
+ | Field | Type | Required | Size | Description |
146
+ | ------------------ | ------ | -------- | --------- | ---------------------------------------------------------- |
147
+ | `favicon.svg` | string | Yes | 32×32 | Main favicon in SVG format (modern browsers) |
148
+ | `favicon.ico` | string | Yes | 32×32 | Legacy favicon in ICO format (fallback for older browsers) |
149
+ | `favicon.appleTouch` | string | Yes | 180×180 | Apple Touch Icon for iOS home screen |
150
+
151
+ > **Note:** For optimal compatibility, use the following sizes: 32×32 for browser tabs (both SVG and ICO), and 180×180 for Apple Touch Icon. The plugin automatically copies these files to `/dist` during build.
152
+
136
153
  ## CSS Variables
137
154
 
138
155
  The following CSS variables are available for runtime customization:
@@ -197,6 +214,9 @@ You only need:
197
214
  - `logos.organization.expanded`
198
215
  - `logos.organization.mini`
199
216
  - `logos.organization.alt`
217
+ - `favicon.svg`
218
+ - `favicon.ico`
219
+ - `favicon.appleTouch`
200
220
 
201
221
  See `branding/branding.config.yourorganization.js` for a minimal example.
202
222
 
@@ -339,6 +359,12 @@ export default {
339
359
  headerBackground: '/branding/images/header-background.svg',
340
360
  headerBackgroundLg: '/branding/images/header-background-lg.svg',
341
361
  },
362
+
363
+ favicon: {
364
+ svg: '/branding/logos/favicon.svg',
365
+ ico: '/branding/logos/favicon.ico',
366
+ appleTouch: '/branding/logos/apple-touch-icon.png',
367
+ },
342
368
  };
343
369
  ```
344
370
 
@@ -66,4 +66,11 @@ export default {
66
66
  headerBackground: '/branding/images/header-background.svg',
67
67
  headerBackgroundLg: '/branding/images/header-background-lg.svg',
68
68
  },
69
+
70
+ // Favicon Configuration
71
+ favicon: {
72
+ svg: '/branding/logos/favicon.svg',
73
+ ico: '/branding/logos/favicon.ico',
74
+ appleTouch: '/branding/logos/apple-touch-icon.png'
75
+ },
69
76
  };
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" aria-label="Ir a la página de inicio de la aplicación" role="img"><defs><clipPath id="b-logo-mini"><path fill="rgb(252, 228, 0)" d="M0 0h32v32.001H0z"/></clipPath><clipPath id="a-logo-mini"><path d="M0 0h32v32H0z"/></clipPath></defs><g clip-path="url(#a-logo-mini)"><path fill="rgb(252, 228, 0)" d="M0 .305h32v32.001H0z"/><g clip-path="url(#b-logo-mini)" transform="translate(0 .305)"><g fill="#dd171b" fill-rule="evenodd"><path d="m31.997 6.145-7.686 1.539a14.764 14.764 0 0 1-8.028-1.042 15.267 15.267 0 0 0-5.073-1.846 12.725 12.725 0 0 0-3.59-.011l-5.13.918a94.41 94.41 0 0 1-2.491.442V.324a7.213 7.213 0 0 1 3.952-.09 10.087 10.087 0 0 1 2.118.951 17.859 17.859 0 0 0 4.36 1.993 14.13 14.13 0 0 0 6.7-.034l4.8-.872 5.016-.906 5.048-1.04ZM6.705 24.619a14.812 14.812 0 0 1 9.7 1.03 12.363 12.363 0 0 0 8.437 1.529l7.154-1.291v5.8a8.37 8.37 0 0 1-3.055.26 6.509 6.509 0 0 1-1.619-.464l-3.714-1.948a12.4 12.4 0 0 0-7.2-.838l-15.366 2.82L0 31.686v-5.8l1.28-.26 3.363-.623c.679-.125 1.393-.249 2.061-.385ZM-.003 15.32v-4.462l13.23-2.417a15.734 15.734 0 0 1 9.252 1.665 12.723 12.723 0 0 0 8.606.94l.914-.192v4.462L29.08 13.65a12.472 12.472 0 0 0-6.941-1.031l-8.131 1.483c-.974.182-2.921.532-2.921.532l-7.406 1.371a5.23 5.23 0 0 1-3.684-.685ZM31.997 16.851v4.393l-13.11 2.413a15.735 15.735 0 0 1-9.252-1.665 12.721 12.721 0 0 0-8.606-.94l-1.03.193v-4.394l3.035 1.6a12.476 12.476 0 0 0 6.941 1.03l8.13-1.483c.974-.182 2.922-.532 2.922-.532l7.406-1.371a5.219 5.219 0 0 1 3.564.756Z"/></g></g></g></svg>
@@ -121,6 +121,33 @@ export function brandingPlugin(config) {
121
121
  }
122
122
 
123
123
  return hasChanges ? { code: transformed, map: null } : null;
124
+ },
125
+
126
+ closeBundle() {
127
+ const distDir = path.resolve(process.cwd(), 'dist');
128
+ const favicon = config?.favicon;
129
+
130
+ if (!favicon) return;
131
+
132
+ const faviconFiles = [
133
+ { key: 'svg', fileName: 'favicon.svg' },
134
+ { key: 'ico', fileName: 'favicon.ico' },
135
+ { key: 'appleTouch', fileName: 'apple-touch-icon.png' }
136
+ ];
137
+
138
+ for (const { key, fileName } of faviconFiles) {
139
+ if (favicon[key]) {
140
+ const src = path.resolve(process.cwd(), 'branding/logos', fileName);
141
+ if (fs.existsSync(src)) {
142
+ try {
143
+ fs.copyFileSync(src, path.join(distDir, fileName));
144
+ console.log(`✓ Favicon ${fileName} copied to dist`);
145
+ } catch (err) {
146
+ console.warn(`Warning: Could not copy ${fileName}:`, err.message);
147
+ }
148
+ }
149
+ }
150
+ }
124
151
  }
125
152
  };
126
153
  }
@@ -18,6 +18,13 @@
18
18
  <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,600;0,700;1,400;1,600;1,700&display=swap" rel="stylesheet">
19
19
  {% endif %}
20
20
  <link rel="stylesheet" href="css/styles.css">
21
+ {% if branding and branding.favicon %}
22
+ <link rel="icon" href="{{ branding.favicon.svg }}" type="image/svg+xml">
23
+ <link rel="icon" href="{{ branding.favicon.ico }}" sizes="32x32">
24
+ <link rel="apple-touch-icon" href="{{ branding.favicon.appleTouch }}">
25
+ {% else %}
26
+ <link rel="icon" type="image/x-icon" href="https://aplicaciones.aragon.es/favicon.ico">
27
+ {% endif %}
21
28
  <style>
22
29
  pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
23
30
  Theme: StackOverflow Light
package/docs/index.html CHANGED
@@ -147,6 +147,11 @@ cd desy-html</code></pre>
147
147
 
148
148
  <h2>Changelog (English)</h2>
149
149
  <p>What's new in the latest version of desy-html</p>
150
+ <h3>v.16.0.3</h3>
151
+ <ul class="text-sm">
152
+ <li>Fixed breakpoints variants in text classes.</li>
153
+ <li>Added missing params in header components.</li>
154
+ </ul>
150
155
  <h3>v.16.0.2</h3>
151
156
  <ul class="text-sm">
152
157
  <li>Fixed a bug in footer logos urls.</li>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "desy-html",
3
- "version": "16.0.2",
3
+ "version": "16.0.3",
4
4
  "description": "desy-html contains the code you need to start building a user interface for Gobierno de Aragón government webapps.",
5
5
  "type": "module",
6
6
  "author": {
@@ -2,169 +2,167 @@
2
2
  text.css
3
3
  ========================================================================== */
4
4
 
5
- @layer components {
6
- .c-h0 {
7
- @apply mb-8;
8
- font-size: 2.5rem;
9
- font-family: var(--font-heading);
10
- @apply font-bold;
11
- @apply leading-tight;
12
- }
5
+ @utility c-h0 {
6
+ @apply mb-8;
7
+ font-size: 2.5rem;
8
+ font-family: var(--font-heading);
9
+ @apply font-bold;
10
+ @apply leading-tight;
11
+ }
13
12
 
14
- .c-h1 {
15
- @apply mb-lg;
16
- @apply text-3xl;
17
- font-family: var(--font-heading);
18
- @apply font-bold;
19
- @apply leading-tight;
20
- }
13
+ @utility c-h1 {
14
+ @apply mb-lg;
15
+ @apply text-3xl;
16
+ font-family: var(--font-heading);
17
+ @apply font-bold;
18
+ @apply leading-tight;
19
+ }
21
20
 
22
- .c-h2 {
23
- @apply mb-base;
24
- @apply text-2xl;
25
- font-family: var(--font-heading);
26
- @apply font-bold;
27
- @apply leading-tight;
28
- }
21
+ @utility c-h2 {
22
+ @apply mb-base;
23
+ @apply text-2xl;
24
+ font-family: var(--font-heading);
25
+ @apply font-bold;
26
+ @apply leading-tight;
27
+ }
29
28
 
30
- .c-h3 {
31
- @apply mb-sm;
32
- @apply text-lg;
33
- font-family: var(--font-heading);
34
- @apply font-bold;
35
- @apply leading-tight;
36
- }
29
+ @utility c-h3 {
30
+ @apply mb-sm;
31
+ @apply text-lg;
32
+ font-family: var(--font-heading);
33
+ @apply font-bold;
34
+ @apply leading-tight;
35
+ }
37
36
 
38
- .c-h4 {
39
- @apply mb-sm;
40
- @apply text-base;
41
- font-family: var(--font-heading);
42
- @apply font-bold;
43
- @apply leading-tight;
44
- }
37
+ @utility c-h4 {
38
+ @apply mb-sm;
39
+ @apply text-base;
40
+ font-family: var(--font-heading);
41
+ @apply font-bold;
42
+ @apply leading-tight;
43
+ }
45
44
 
46
- .c-link {
47
- @apply text-primary-base;
48
- @apply underline;
45
+ @utility c-link {
46
+ @apply text-primary-base;
47
+ @apply underline;
49
48
 
50
- &:hover {
51
- @apply text-primary-dark;
52
- }
49
+ &:hover {
50
+ @apply text-primary-dark;
51
+ }
53
52
 
54
- &:focus {
55
- @apply bg-warning-base;
56
- @apply shadow-outline-focus;
57
- @apply outline-hidden;
58
- @apply text-black;
59
- }
53
+ &:focus {
54
+ @apply bg-warning-base;
55
+ @apply shadow-outline-focus;
56
+ @apply outline-hidden;
57
+ @apply text-black;
60
58
  }
59
+ }
61
60
 
62
- .c-link--alert {
63
- @apply text-alert-base;
64
- @apply underline;
65
- @apply font-semibold;
61
+ @utility c-link--alert {
62
+ @apply text-alert-base;
63
+ @apply underline;
64
+ @apply font-semibold;
66
65
 
67
- &:hover {
68
- @apply text-alert-dark;
69
- }
66
+ &:hover {
67
+ @apply text-alert-dark;
70
68
  }
69
+ }
71
70
 
72
- .c-link--neutral {
73
- @apply text-neutral-dark;
74
- @apply underline;
71
+ @utility c-link--neutral {
72
+ @apply text-neutral-dark;
73
+ @apply underline;
75
74
 
76
- &:hover {
77
- @apply text-black;
78
- }
75
+ &:hover {
76
+ @apply text-black;
79
77
  }
78
+ }
80
79
 
81
- .c-link--full {
82
- &::after {
83
- content: '';
84
- @apply absolute;
85
- @apply inset-0;
86
- }
80
+ @utility c-link--full {
81
+ &::after {
82
+ content: "";
83
+ @apply absolute;
84
+ @apply inset-0;
87
85
  }
86
+ }
88
87
 
89
- .c-link--no-underline {
90
- @apply no-underline;
88
+ @utility c-link--no-underline {
89
+ @apply no-underline;
91
90
 
92
- &:hover {
93
- @apply underline;
94
- }
91
+ &:hover {
92
+ @apply underline;
95
93
  }
94
+ }
96
95
 
97
- .c-paragraph-lg {
98
- @apply mb-lg;
99
- @apply text-lg;
100
- }
96
+ @utility c-paragraph-lg {
97
+ @apply mb-lg;
98
+ @apply text-lg;
99
+ }
101
100
 
102
- .c-paragraph-base {
103
- @apply mb-base;
104
- @apply text-base;
105
- }
101
+ @utility c-paragraph-base {
102
+ @apply mb-base;
103
+ @apply text-base;
104
+ }
106
105
 
107
- .c-paragraph-sm {
108
- @apply mb-sm;
109
- @apply text-sm;
110
- }
106
+ @utility c-paragraph-sm {
107
+ @apply mb-sm;
108
+ @apply text-sm;
109
+ }
110
+
111
+ @utility c-ul {
112
+ @apply mb-base;
113
+ @apply list-none;
111
114
 
112
- .c-ul {
115
+ li {
116
+ @apply relative;
113
117
  @apply mb-base;
114
- @apply list-none;
115
-
116
- li {
117
- @apply relative;
118
- @apply mb-base;
119
- @apply pl-8;
120
-
121
- &::before {
122
- content: '';
123
- @apply absolute;
124
- top: 0.625rem;
125
- left: 0.25rem;
126
- @apply w-1.5;
127
- @apply h-1.5;
128
- @apply bg-black;
129
- @apply rounded-full;
130
- }
131
-
132
- &:last-of-type {
133
- @apply mb-0;
134
- }
118
+ @apply pl-8;
119
+
120
+ &::before {
121
+ content: "";
122
+ @apply absolute;
123
+ top: 0.625rem;
124
+ left: 0.25rem;
125
+ @apply w-1.5;
126
+ @apply h-1.5;
127
+ @apply bg-black;
128
+ @apply rounded-full;
129
+ }
130
+
131
+ &:last-of-type {
132
+ @apply mb-0;
135
133
  }
136
134
  }
135
+ }
137
136
 
138
- .c-ul--no-bullets {
139
- li {
140
- @apply pl-0;
137
+ @utility c-ul--no-bullets {
138
+ li {
139
+ @apply pl-0;
141
140
 
142
- &::before {
143
- @apply hidden;
144
- }
141
+ &::before {
142
+ @apply hidden;
145
143
  }
146
144
  }
145
+ }
147
146
 
148
- .c-ol {
147
+ @utility c-ol {
148
+ @apply mb-base;
149
+ counter-reset: list-counter;
150
+
151
+ li {
152
+ @apply relative;
149
153
  @apply mb-base;
150
- counter-reset: list-counter;
151
-
152
- li {
153
- @apply relative;
154
- @apply mb-base;
155
- @apply pl-8;
156
-
157
- &::before {
158
- counter-increment: list-counter;
159
- content: counter(list-counter) '.';
160
- @apply absolute;
161
- left: 0.25rem;
162
- @apply text-black;
163
- }
164
-
165
- &:last-of-type {
166
- @apply mb-0;
167
- }
154
+ @apply pl-8;
155
+
156
+ &::before {
157
+ counter-increment: list-counter;
158
+ content: counter(list-counter) ".";
159
+ @apply absolute;
160
+ left: 0.25rem;
161
+ @apply text-black;
162
+ }
163
+
164
+ &:last-of-type {
165
+ @apply mb-0;
168
166
  }
169
167
  }
170
168
  }
@@ -4,8 +4,6 @@
4
4
  @import "tailwindcss";
5
5
  /* Custom base */
6
6
  @import './base.css';
7
- /* Branding variables for runtime customization */
8
- @import './branding-variables.css';
9
7
 
10
8
  /* Custom components */
11
9
  @import './component.text.css';
@@ -3,6 +3,21 @@ params:
3
3
  type: component
4
4
  required: false
5
5
  description: The skipLink component parameters
6
+ - name: logoExpanded
7
+ type: string
8
+ required: false
9
+ default: branding.logos.organization.expanded
10
+ description: URL del logo expandido (con texto). Por defecto usa branding.logos.organization.expanded
11
+ - name: logoCompact
12
+ type: string
13
+ required: false
14
+ default: branding.logos.organization.compact
15
+ description: URL del logo compacto (solo icono). Por defecto usa branding.logos.organization.compact
16
+ - name: logoAlt
17
+ type: string
18
+ required: false
19
+ default: branding.logos.organization.alt
20
+ description: Texto alternativo del logo. Por defecto usa branding.logos.organization.alt
6
21
  - name: homepageUrl
7
22
  type: string
8
23
  required: false
@@ -74,7 +89,7 @@ params:
74
89
  description: HTML attributes (for example data attributes) to add to the dropdown element.
75
90
  - name: contentHtml
76
91
  type: string
77
- required: true
92
+ required: false
78
93
  description: Html content inside the subnav once opened.
79
94
  - name: items
80
95
  type: array
@@ -156,7 +171,7 @@ params:
156
171
  description: HTML attributes (for example data attributes) to add to the dropdown element.
157
172
  - name: contentHtml
158
173
  type: string
159
- required: true
174
+ required: false
160
175
  description: Html content inside the dropdown once opened.
161
176
  - name: items
162
177
  type: array
@@ -174,7 +174,7 @@ params:
174
174
  description: HTML attributes (for example data attributes) to add to the dropdown element.
175
175
  - name: contentHtml
176
176
  type: string
177
- required: true
177
+ required: false
178
178
  description: Html content inside the dropdown once opened.
179
179
  - name: items
180
180
  type: array
@@ -316,6 +316,10 @@ params:
316
316
  required: false
317
317
  description: Options for the offcanvas menu.
318
318
  params:
319
+ - name: labelledId
320
+ type: string
321
+ required: false
322
+ description: ID para conectar con aria-labelledby del offcanvas. Útil para accesibilidad.
319
323
  - name: text
320
324
  type: string
321
325
  required: true
@@ -1,4 +1,14 @@
1
1
  params:
2
+ - name: logoSrc
3
+ type: string
4
+ required: false
5
+ default: branding.logos.organization.mini
6
+ description: URL del logo de la organización. Por defecto usa el valor de branding.logos.organization.mini
7
+ - name: logoAlt
8
+ type: string
9
+ required: false
10
+ default: branding.logos.organization.alt
11
+ description: Texto alternativo del logo. Por defecto usa el valor de branding.logos.organization.alt
2
12
  - name: homepageUrl
3
13
  type: string
4
14
  required: false
@@ -5,7 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>{{ title if title else "Project title" }}</title>
7
7
  <link rel="stylesheet" href="/src/css/styles.css">
8
- <link rel="icon" type="image/x-icon" href="https://aplicaciones.aragon.es/favicon.ico">
8
+ {% if branding and branding.favicon %}
9
+ <link rel="icon" href="{{ branding.favicon.svg }}" type="image/svg+xml">
10
+ <link rel="icon" href="{{ branding.favicon.ico }}" sizes="32x32">
11
+ <link rel="apple-touch-icon" href="{{ branding.favicon.appleTouch }}">
12
+ {% else %}
13
+ <link rel="icon" type="image/x-icon" href="https://aplicaciones.aragon.es/favicon.ico">
14
+ {% endif %}
9
15
  {% if branding and branding.typography and branding.typography.fontUrl %}
10
16
  {% if 'fonts.googleapis.com' in branding.typography.fontUrl %}
11
17
  <link rel="preconnect" href="https://fonts.googleapis.com">
@@ -1,37 +0,0 @@
1
- /**
2
- * Branding Variables
3
- *
4
- * CSS custom properties for runtime branding customization.
5
- * These variables can be overridden at runtime via JavaScript
6
- * to customize the appearance without rebuilding.
7
- *
8
- * Los colores se configuran en src/css/styles.css
9
- * Edita las variables: --color-primary-base, --color-primary-light, --color-primary-dark
10
- *
11
- * LOGO SYSTEM
12
- * ===========
13
- * The system uses three logo variants for different contexts:
14
- *
15
- * --branding-logo-expanded: Full logo with text. Shown in the main header
16
- * on desktop when there is enough space.
17
- * Used by: header component (desktop version)
18
- *
19
- * --branding-logo-mini: Standard size logo.
20
- * Shown in header-mini and header-advanced.
21
- * Used by: header-mini, header-advanced components
22
- *
23
- * --branding-logo-compact: Compact logo, typically just the symbol/coat of arms.
24
- * Shown in reduced spaces or on mobile.
25
- * Used by: header component (mobile/responsive version)
26
- */
27
-
28
- :root {
29
- /* Expanded logo - Main header on desktop (full logo with text) */
30
- --branding-logo-expanded: url('/images/aragon-expanded.svg');
31
-
32
- /* Mini logo - Header-mini and header-advanced (standard size) */
33
- --branding-logo-mini: url('/images/aragon-mini.svg');
34
-
35
- /* Compact logo - Main header on mobile (symbol/coat of arms only) */
36
- --branding-logo-compact: url('/images/aragon-compact.svg');
37
- }