@lluc_llull/ui-lib 0.34.3 → 0.36.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 (71) hide show
  1. package/fesm2022/lluc_llull-ui-lib-content-asymmetric-media.mjs +10 -3
  2. package/fesm2022/lluc_llull-ui-lib-content-asymmetric-media.mjs.map +1 -1
  3. package/fesm2022/lluc_llull-ui-lib-content-category-progress.mjs +18 -5
  4. package/fesm2022/lluc_llull-ui-lib-content-category-progress.mjs.map +1 -1
  5. package/fesm2022/lluc_llull-ui-lib-content-columns-media-stacked.mjs +10 -3
  6. package/fesm2022/lluc_llull-ui-lib-content-columns-media-stacked.mjs.map +1 -1
  7. package/fesm2022/lluc_llull-ui-lib-content-contact-minimal.mjs +18 -5
  8. package/fesm2022/lluc_llull-ui-lib-content-contact-minimal.mjs.map +1 -1
  9. package/fesm2022/lluc_llull-ui-lib-content-hero-section.mjs +6 -13
  10. package/fesm2022/lluc_llull-ui-lib-content-hero-section.mjs.map +1 -1
  11. package/fesm2022/lluc_llull-ui-lib-content-media-intro.mjs +10 -3
  12. package/fesm2022/lluc_llull-ui-lib-content-media-intro.mjs.map +1 -1
  13. package/fesm2022/lluc_llull-ui-lib-content-media-split.mjs +34 -21
  14. package/fesm2022/lluc_llull-ui-lib-content-media-split.mjs.map +1 -1
  15. package/fesm2022/lluc_llull-ui-lib-content-mosaic-grid.mjs +10 -3
  16. package/fesm2022/lluc_llull-ui-lib-content-mosaic-grid.mjs.map +1 -1
  17. package/fesm2022/lluc_llull-ui-lib-content-section-intro.mjs +8 -1
  18. package/fesm2022/lluc_llull-ui-lib-content-section-intro.mjs.map +1 -1
  19. package/fesm2022/lluc_llull-ui-lib-content-split-previewer.mjs +20 -7
  20. package/fesm2022/lluc_llull-ui-lib-content-split-previewer.mjs.map +1 -1
  21. package/fesm2022/lluc_llull-ui-lib-content-split-showcase.mjs +12 -5
  22. package/fesm2022/lluc_llull-ui-lib-content-split-showcase.mjs.map +1 -1
  23. package/fesm2022/lluc_llull-ui-lib-content-stacked-rows.mjs +18 -5
  24. package/fesm2022/lluc_llull-ui-lib-content-stacked-rows.mjs.map +1 -1
  25. package/fesm2022/lluc_llull-ui-lib-content.mjs +172 -74
  26. package/fesm2022/lluc_llull-ui-lib-content.mjs.map +1 -1
  27. package/fesm2022/lluc_llull-ui-lib-directives.mjs +230 -11
  28. package/fesm2022/lluc_llull-ui-lib-directives.mjs.map +1 -1
  29. package/fesm2022/lluc_llull-ui-lib-feedback-404.mjs +10 -4
  30. package/fesm2022/lluc_llull-ui-lib-feedback-404.mjs.map +1 -1
  31. package/fesm2022/lluc_llull-ui-lib-feedback.mjs +10 -4
  32. package/fesm2022/lluc_llull-ui-lib-feedback.mjs.map +1 -1
  33. package/fesm2022/lluc_llull-ui-lib-footers-columns-footer.mjs +39 -15
  34. package/fesm2022/lluc_llull-ui-lib-footers-columns-footer.mjs.map +1 -1
  35. package/fesm2022/lluc_llull-ui-lib-footers-legal-footer.mjs +2 -2
  36. package/fesm2022/lluc_llull-ui-lib-footers-legal-footer.mjs.map +1 -1
  37. package/fesm2022/lluc_llull-ui-lib-footers-social-footer.mjs +2 -2
  38. package/fesm2022/lluc_llull-ui-lib-footers-social-footer.mjs.map +1 -1
  39. package/fesm2022/lluc_llull-ui-lib-footers-visual-footer.mjs +2 -2
  40. package/fesm2022/lluc_llull-ui-lib-footers-visual-footer.mjs.map +1 -1
  41. package/fesm2022/lluc_llull-ui-lib-footers.mjs +44 -21
  42. package/fesm2022/lluc_llull-ui-lib-footers.mjs.map +1 -1
  43. package/fesm2022/lluc_llull-ui-lib-forms-contact-form.mjs +254 -0
  44. package/fesm2022/lluc_llull-ui-lib-forms-contact-form.mjs.map +1 -0
  45. package/fesm2022/lluc_llull-ui-lib-forms.mjs +443 -0
  46. package/fesm2022/lluc_llull-ui-lib-forms.mjs.map +1 -0
  47. package/fesm2022/lluc_llull-ui-lib-headers-header-clear.mjs +4 -4
  48. package/fesm2022/lluc_llull-ui-lib-headers-header-clear.mjs.map +1 -1
  49. package/fesm2022/lluc_llull-ui-lib-headers-header-mobile.mjs +2 -2
  50. package/fesm2022/lluc_llull-ui-lib-headers-header-mobile.mjs.map +1 -1
  51. package/fesm2022/lluc_llull-ui-lib-headers.mjs +6 -6
  52. package/fesm2022/lluc_llull-ui-lib-headers.mjs.map +1 -1
  53. package/fesm2022/lluc_llull-ui-lib-mapper.mjs +6 -1
  54. package/fesm2022/lluc_llull-ui-lib-mapper.mjs.map +1 -1
  55. package/fesm2022/lluc_llull-ui-lib-modals.mjs +4 -4
  56. package/fesm2022/lluc_llull-ui-lib-modals.mjs.map +1 -1
  57. package/package.json +10 -1
  58. package/src/lib/styles/main.css +71 -1
  59. package/styles/main.css +71 -1
  60. package/types/lluc_llull-ui-lib-content-category-progress.d.ts +10 -0
  61. package/types/lluc_llull-ui-lib-content-contact-minimal.d.ts +10 -0
  62. package/types/lluc_llull-ui-lib-content-split-previewer.d.ts +10 -0
  63. package/types/lluc_llull-ui-lib-content.d.ts +30 -0
  64. package/types/lluc_llull-ui-lib-directives.d.ts +51 -2
  65. package/types/lluc_llull-ui-lib-feedback-404.d.ts +10 -0
  66. package/types/lluc_llull-ui-lib-feedback.d.ts +10 -0
  67. package/types/lluc_llull-ui-lib-footers-columns-footer.d.ts +1 -0
  68. package/types/lluc_llull-ui-lib-footers.d.ts +1 -0
  69. package/types/lluc_llull-ui-lib-forms-contact-form.d.ts +86 -0
  70. package/types/lluc_llull-ui-lib-forms.d.ts +220 -0
  71. package/types/lluc_llull-ui-lib-mapper.d.ts +1 -0
@@ -0,0 +1,443 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Component, Input, forwardRef } from "@angular/core";
3
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
4
+ var FormFieldComponent = class FormFieldComponent {
5
+ controlId = "";
6
+ label = "";
7
+ required = false;
8
+ hint = "";
9
+ error = "";
10
+ get errorId() {
11
+ return `${this.controlId}-error`;
12
+ }
13
+ get hintId() {
14
+ return `${this.controlId}-hint`;
15
+ }
16
+ static ɵfac = i0.ɵɵngDeclareFactory({
17
+ minVersion: "12.0.0",
18
+ version: "22.2.4",
19
+ ngImport: i0,
20
+ type: FormFieldComponent,
21
+ deps: [],
22
+ target: i0.ɵɵFactoryTarget.Component
23
+ });
24
+ static ɵcmp = i0.ɵɵngDeclareComponent({
25
+ minVersion: "17.0.0",
26
+ version: "22.2.4",
27
+ type: FormFieldComponent,
28
+ isStandalone: true,
29
+ selector: "lib-form-field",
30
+ inputs: {
31
+ controlId: "controlId",
32
+ label: "label",
33
+ required: "required",
34
+ hint: "hint",
35
+ error: "error"
36
+ },
37
+ host: { classAttribute: "form-field" },
38
+ ngImport: i0,
39
+ template: "@if (label) {\n <label [for]=\"controlId\">\n {{ label }}\n @if (required) {\n <span class=\"form-field-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n}\n<ng-content />\n@if (hint && !error) {\n <span class=\"form-field-hint\" [id]=\"hintId\">{{ hint }}</span>\n}\n@if (error) {\n <span class=\"form-field-error\" [id]=\"errorId\" role=\"alert\">{{ error }}</span>\n}\n",
40
+ styles: [":host{display:flex;min-width:0;flex-direction:column;gap:.65rem}:host>label{color:var(--text-primary);font-family:var(--font-base);font-size:.9rem;letter-spacing:.04em;text-transform:uppercase;padding-top:1rem}.form-field-required{color:var(--color-secondary)}.form-field-hint{color:var(--text-primary-60);font-size:.8rem;line-height:1.4}.form-field-error{color:#b42318;font-size:.875rem;line-height:1.4}\n"]
41
+ });
42
+ };
43
+ i0.ɵɵngDeclareClassMetadata({
44
+ minVersion: "12.0.0",
45
+ version: "22.2.4",
46
+ ngImport: i0,
47
+ type: FormFieldComponent,
48
+ decorators: [{
49
+ type: Component,
50
+ args: [{
51
+ selector: "lib-form-field",
52
+ standalone: true,
53
+ host: { class: "form-field" },
54
+ template: "@if (label) {\n <label [for]=\"controlId\">\n {{ label }}\n @if (required) {\n <span class=\"form-field-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n}\n<ng-content />\n@if (hint && !error) {\n <span class=\"form-field-hint\" [id]=\"hintId\">{{ hint }}</span>\n}\n@if (error) {\n <span class=\"form-field-error\" [id]=\"errorId\" role=\"alert\">{{ error }}</span>\n}\n",
55
+ styles: [":host{display:flex;min-width:0;flex-direction:column;gap:.65rem}:host>label{color:var(--text-primary);font-family:var(--font-base);font-size:.9rem;letter-spacing:.04em;text-transform:uppercase;padding-top:1rem}.form-field-required{color:var(--color-secondary)}.form-field-hint{color:var(--text-primary-60);font-size:.8rem;line-height:1.4}.form-field-error{color:#b42318;font-size:.875rem;line-height:1.4}\n"]
56
+ }]
57
+ }],
58
+ propDecorators: {
59
+ controlId: [{
60
+ type: Input,
61
+ args: [{ required: true }]
62
+ }],
63
+ label: [{ type: Input }],
64
+ required: [{ type: Input }],
65
+ hint: [{ type: Input }],
66
+ error: [{ type: Input }]
67
+ }
68
+ });
69
+ var FormInputComponent = class FormInputComponent {
70
+ id = "";
71
+ type = "text";
72
+ placeholder = "";
73
+ autocomplete = "";
74
+ describedBy = "";
75
+ maxLength = null;
76
+ required = false;
77
+ invalid = false;
78
+ value = "";
79
+ disabled = false;
80
+ onChange = () => {};
81
+ onTouched = () => {};
82
+ writeValue(value) {
83
+ this.value = value ?? "";
84
+ }
85
+ registerOnChange(fn) {
86
+ this.onChange = fn;
87
+ }
88
+ registerOnTouched(fn) {
89
+ this.onTouched = fn;
90
+ }
91
+ setDisabledState(disabled) {
92
+ this.disabled = disabled;
93
+ }
94
+ handleInput(event) {
95
+ this.value = event.target.value;
96
+ this.onChange(this.value);
97
+ }
98
+ handleBlur() {
99
+ this.onTouched();
100
+ }
101
+ static ɵfac = i0.ɵɵngDeclareFactory({
102
+ minVersion: "12.0.0",
103
+ version: "22.2.4",
104
+ ngImport: i0,
105
+ type: FormInputComponent,
106
+ deps: [],
107
+ target: i0.ɵɵFactoryTarget.Component
108
+ });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({
110
+ minVersion: "14.0.0",
111
+ version: "22.2.4",
112
+ type: FormInputComponent,
113
+ isStandalone: true,
114
+ selector: "lib-form-input",
115
+ inputs: {
116
+ id: "id",
117
+ type: "type",
118
+ placeholder: "placeholder",
119
+ autocomplete: "autocomplete",
120
+ describedBy: "describedBy",
121
+ maxLength: "maxLength",
122
+ required: "required",
123
+ invalid: "invalid"
124
+ },
125
+ providers: [{
126
+ provide: NG_VALUE_ACCESSOR,
127
+ useExisting: forwardRef(() => FormInputComponent),
128
+ multi: true
129
+ }],
130
+ ngImport: i0,
131
+ template: "<input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.maxlength]=\"maxLength ?? null\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n/>\n",
132
+ styles: [":host{display:block;min-width:0}input{box-sizing:border-box;width:100%;min-height:3.5rem;border:4px solid var(--border-primary);border-radius:0;padding:.9rem 1rem;background:var(--surface-primary);color:var(--text-primary);font:1rem/1.5 var(--font-base);transition:border-color .16s ease,box-shadow .16s ease}input::placeholder{color:var(--text-primary-50);opacity:1}input:hover:not(:disabled){border-color:var(--text-primary)}input:focus-visible{border-color:var(--color-secondary);outline:2px solid var(--color-secondary);outline-offset:3px;box-shadow:inset 0 -3px 0 var(--color-secondary)}input[aria-invalid=true]{border-color:#b42318}input:disabled{cursor:not-allowed;opacity:.65}@media(prefers-reduced-motion:reduce){input{transition:none}}\n"]
133
+ });
134
+ };
135
+ i0.ɵɵngDeclareClassMetadata({
136
+ minVersion: "12.0.0",
137
+ version: "22.2.4",
138
+ ngImport: i0,
139
+ type: FormInputComponent,
140
+ decorators: [{
141
+ type: Component,
142
+ args: [{
143
+ selector: "lib-form-input",
144
+ standalone: true,
145
+ providers: [{
146
+ provide: NG_VALUE_ACCESSOR,
147
+ useExisting: forwardRef(() => FormInputComponent),
148
+ multi: true
149
+ }],
150
+ template: "<input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.maxlength]=\"maxLength ?? null\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n/>\n",
151
+ styles: [":host{display:block;min-width:0}input{box-sizing:border-box;width:100%;min-height:3.5rem;border:4px solid var(--border-primary);border-radius:0;padding:.9rem 1rem;background:var(--surface-primary);color:var(--text-primary);font:1rem/1.5 var(--font-base);transition:border-color .16s ease,box-shadow .16s ease}input::placeholder{color:var(--text-primary-50);opacity:1}input:hover:not(:disabled){border-color:var(--text-primary)}input:focus-visible{border-color:var(--color-secondary);outline:2px solid var(--color-secondary);outline-offset:3px;box-shadow:inset 0 -3px 0 var(--color-secondary)}input[aria-invalid=true]{border-color:#b42318}input:disabled{cursor:not-allowed;opacity:.65}@media(prefers-reduced-motion:reduce){input{transition:none}}\n"]
152
+ }]
153
+ }],
154
+ propDecorators: {
155
+ id: [{
156
+ type: Input,
157
+ args: [{ required: true }]
158
+ }],
159
+ type: [{ type: Input }],
160
+ placeholder: [{ type: Input }],
161
+ autocomplete: [{ type: Input }],
162
+ describedBy: [{ type: Input }],
163
+ maxLength: [{ type: Input }],
164
+ required: [{ type: Input }],
165
+ invalid: [{ type: Input }]
166
+ }
167
+ });
168
+ var FormSelectComponent = class FormSelectComponent {
169
+ id = "";
170
+ options = [];
171
+ placeholder = "";
172
+ describedBy = "";
173
+ required = false;
174
+ invalid = false;
175
+ value = "";
176
+ disabled = false;
177
+ onChange = () => {};
178
+ onTouched = () => {};
179
+ writeValue(value) {
180
+ this.value = value ?? "";
181
+ }
182
+ registerOnChange(fn) {
183
+ this.onChange = fn;
184
+ }
185
+ registerOnTouched(fn) {
186
+ this.onTouched = fn;
187
+ }
188
+ setDisabledState(disabled) {
189
+ this.disabled = disabled;
190
+ }
191
+ handleChange(event) {
192
+ this.value = event.target.value;
193
+ this.onChange(this.value);
194
+ }
195
+ handleBlur() {
196
+ this.onTouched();
197
+ }
198
+ static ɵfac = i0.ɵɵngDeclareFactory({
199
+ minVersion: "12.0.0",
200
+ version: "22.2.4",
201
+ ngImport: i0,
202
+ type: FormSelectComponent,
203
+ deps: [],
204
+ target: i0.ɵɵFactoryTarget.Component
205
+ });
206
+ static ɵcmp = i0.ɵɵngDeclareComponent({
207
+ minVersion: "17.0.0",
208
+ version: "22.2.4",
209
+ type: FormSelectComponent,
210
+ isStandalone: true,
211
+ selector: "lib-form-select",
212
+ inputs: {
213
+ id: "id",
214
+ options: "options",
215
+ placeholder: "placeholder",
216
+ describedBy: "describedBy",
217
+ required: "required",
218
+ invalid: "invalid"
219
+ },
220
+ providers: [{
221
+ provide: NG_VALUE_ACCESSOR,
222
+ useExisting: forwardRef(() => FormSelectComponent),
223
+ multi: true
224
+ }],
225
+ ngImport: i0,
226
+ template: "<select\n [id]=\"id\"\n [value]=\"value\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (change)=\"handleChange($event)\"\n (blur)=\"handleBlur()\"\n>\n @if (placeholder) {\n <option value=\"\" disabled>{{ placeholder }}</option>\n }\n @for (option of options; track option.value) {\n <option [value]=\"option.value\" [disabled]=\"option.disabled ?? false\">\n {{ option.label }}\n </option>\n }\n</select>\n",
227
+ styles: [":host{display:block;min-width:0}select{box-sizing:border-box;width:100%;min-height:3.5rem;border:4px solid var(--border-primary);border-radius:0;padding:.9rem 1rem;background:var(--surface-primary);color:var(--text-primary);font:1rem/1.5 var(--font-base)}select:hover:not(:disabled){border-color:var(--text-primary)}select:focus-visible{border-color:var(--color-secondary);outline:2px solid var(--color-secondary);outline-offset:3px}select[aria-invalid=true]{border-color:#b42318}select:disabled{cursor:not-allowed;opacity:.65}\n"]
228
+ });
229
+ };
230
+ i0.ɵɵngDeclareClassMetadata({
231
+ minVersion: "12.0.0",
232
+ version: "22.2.4",
233
+ ngImport: i0,
234
+ type: FormSelectComponent,
235
+ decorators: [{
236
+ type: Component,
237
+ args: [{
238
+ selector: "lib-form-select",
239
+ standalone: true,
240
+ providers: [{
241
+ provide: NG_VALUE_ACCESSOR,
242
+ useExisting: forwardRef(() => FormSelectComponent),
243
+ multi: true
244
+ }],
245
+ template: "<select\n [id]=\"id\"\n [value]=\"value\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (change)=\"handleChange($event)\"\n (blur)=\"handleBlur()\"\n>\n @if (placeholder) {\n <option value=\"\" disabled>{{ placeholder }}</option>\n }\n @for (option of options; track option.value) {\n <option [value]=\"option.value\" [disabled]=\"option.disabled ?? false\">\n {{ option.label }}\n </option>\n }\n</select>\n",
246
+ styles: [":host{display:block;min-width:0}select{box-sizing:border-box;width:100%;min-height:3.5rem;border:4px solid var(--border-primary);border-radius:0;padding:.9rem 1rem;background:var(--surface-primary);color:var(--text-primary);font:1rem/1.5 var(--font-base)}select:hover:not(:disabled){border-color:var(--text-primary)}select:focus-visible{border-color:var(--color-secondary);outline:2px solid var(--color-secondary);outline-offset:3px}select[aria-invalid=true]{border-color:#b42318}select:disabled{cursor:not-allowed;opacity:.65}\n"]
247
+ }]
248
+ }],
249
+ propDecorators: {
250
+ id: [{
251
+ type: Input,
252
+ args: [{ required: true }]
253
+ }],
254
+ options: [{ type: Input }],
255
+ placeholder: [{ type: Input }],
256
+ describedBy: [{ type: Input }],
257
+ required: [{ type: Input }],
258
+ invalid: [{ type: Input }]
259
+ }
260
+ });
261
+ var FormTextareaComponent = class FormTextareaComponent {
262
+ id = "";
263
+ placeholder = "";
264
+ describedBy = "";
265
+ rows = 6;
266
+ maxLength = null;
267
+ required = false;
268
+ invalid = false;
269
+ showCounter = false;
270
+ value = "";
271
+ disabled = false;
272
+ onChange = () => {};
273
+ onTouched = () => {};
274
+ writeValue(value) {
275
+ this.value = value ?? "";
276
+ }
277
+ registerOnChange(fn) {
278
+ this.onChange = fn;
279
+ }
280
+ registerOnTouched(fn) {
281
+ this.onTouched = fn;
282
+ }
283
+ setDisabledState(disabled) {
284
+ this.disabled = disabled;
285
+ }
286
+ handleInput(event) {
287
+ this.value = event.target.value;
288
+ this.onChange(this.value);
289
+ }
290
+ handleBlur() {
291
+ this.onTouched();
292
+ }
293
+ static ɵfac = i0.ɵɵngDeclareFactory({
294
+ minVersion: "12.0.0",
295
+ version: "22.2.4",
296
+ ngImport: i0,
297
+ type: FormTextareaComponent,
298
+ deps: [],
299
+ target: i0.ɵɵFactoryTarget.Component
300
+ });
301
+ static ɵcmp = i0.ɵɵngDeclareComponent({
302
+ minVersion: "17.0.0",
303
+ version: "22.2.4",
304
+ type: FormTextareaComponent,
305
+ isStandalone: true,
306
+ selector: "lib-form-textarea",
307
+ inputs: {
308
+ id: "id",
309
+ placeholder: "placeholder",
310
+ describedBy: "describedBy",
311
+ rows: "rows",
312
+ maxLength: "maxLength",
313
+ required: "required",
314
+ invalid: "invalid",
315
+ showCounter: "showCounter"
316
+ },
317
+ providers: [{
318
+ provide: NG_VALUE_ACCESSOR,
319
+ useExisting: forwardRef(() => FormTextareaComponent),
320
+ multi: true
321
+ }],
322
+ ngImport: i0,
323
+ template: "<textarea\n [id]=\"id\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [rows]=\"rows\"\n [attr.maxlength]=\"maxLength ?? null\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n></textarea>\n@if (showCounter && maxLength) {\n <span class=\"form-textarea-counter\" aria-live=\"polite\">\n {{ value.length }} / {{ maxLength }}\n </span>\n}\n",
324
+ styles: [":host{display:block;min-width:0}textarea{box-sizing:border-box;display:block;width:100%;min-height:12rem;border:4px solid var(--border-primary);border-radius:0;padding:.9rem 1rem;background:var(--surface-primary);color:var(--text-primary);font:1rem/1.5 var(--font-base);resize:vertical;transition:border-color .16s ease,box-shadow .16s ease}textarea::placeholder{color:var(--text-primary-50);opacity:1}textarea:hover:not(:disabled){border-color:var(--text-primary)}textarea:focus-visible{border-color:var(--color-secondary);outline:2px solid var(--color-secondary);outline-offset:3px;box-shadow:inset 0 -3px 0 var(--color-secondary)}textarea[aria-invalid=true]{border-color:#b42318}textarea:disabled{cursor:not-allowed;opacity:.65}.form-textarea-counter{display:block;margin-top:.35rem;color:var(--text-primary-60);font-size:.75rem;text-align:right}@media(prefers-reduced-motion:reduce){textarea{transition:none}}\n"]
325
+ });
326
+ };
327
+ i0.ɵɵngDeclareClassMetadata({
328
+ minVersion: "12.0.0",
329
+ version: "22.2.4",
330
+ ngImport: i0,
331
+ type: FormTextareaComponent,
332
+ decorators: [{
333
+ type: Component,
334
+ args: [{
335
+ selector: "lib-form-textarea",
336
+ standalone: true,
337
+ providers: [{
338
+ provide: NG_VALUE_ACCESSOR,
339
+ useExisting: forwardRef(() => FormTextareaComponent),
340
+ multi: true
341
+ }],
342
+ template: "<textarea\n [id]=\"id\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [rows]=\"rows\"\n [attr.maxlength]=\"maxLength ?? null\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n></textarea>\n@if (showCounter && maxLength) {\n <span class=\"form-textarea-counter\" aria-live=\"polite\">\n {{ value.length }} / {{ maxLength }}\n </span>\n}\n",
343
+ styles: [":host{display:block;min-width:0}textarea{box-sizing:border-box;display:block;width:100%;min-height:12rem;border:4px solid var(--border-primary);border-radius:0;padding:.9rem 1rem;background:var(--surface-primary);color:var(--text-primary);font:1rem/1.5 var(--font-base);resize:vertical;transition:border-color .16s ease,box-shadow .16s ease}textarea::placeholder{color:var(--text-primary-50);opacity:1}textarea:hover:not(:disabled){border-color:var(--text-primary)}textarea:focus-visible{border-color:var(--color-secondary);outline:2px solid var(--color-secondary);outline-offset:3px;box-shadow:inset 0 -3px 0 var(--color-secondary)}textarea[aria-invalid=true]{border-color:#b42318}textarea:disabled{cursor:not-allowed;opacity:.65}.form-textarea-counter{display:block;margin-top:.35rem;color:var(--text-primary-60);font-size:.75rem;text-align:right}@media(prefers-reduced-motion:reduce){textarea{transition:none}}\n"]
344
+ }]
345
+ }],
346
+ propDecorators: {
347
+ id: [{
348
+ type: Input,
349
+ args: [{ required: true }]
350
+ }],
351
+ placeholder: [{ type: Input }],
352
+ describedBy: [{ type: Input }],
353
+ rows: [{ type: Input }],
354
+ maxLength: [{ type: Input }],
355
+ required: [{ type: Input }],
356
+ invalid: [{ type: Input }],
357
+ showCounter: [{ type: Input }]
358
+ }
359
+ });
360
+ var FormToggleComponent = class FormToggleComponent {
361
+ id = "";
362
+ describedBy = "";
363
+ checked = false;
364
+ disabled = false;
365
+ onChange = () => {};
366
+ onTouched = () => {};
367
+ writeValue(value) {
368
+ this.checked = value ?? false;
369
+ }
370
+ registerOnChange(fn) {
371
+ this.onChange = fn;
372
+ }
373
+ registerOnTouched(fn) {
374
+ this.onTouched = fn;
375
+ }
376
+ setDisabledState(disabled) {
377
+ this.disabled = disabled;
378
+ }
379
+ handleChange(event) {
380
+ this.checked = event.target.checked;
381
+ this.onChange(this.checked);
382
+ }
383
+ handleBlur() {
384
+ this.onTouched();
385
+ }
386
+ static ɵfac = i0.ɵɵngDeclareFactory({
387
+ minVersion: "12.0.0",
388
+ version: "22.2.4",
389
+ ngImport: i0,
390
+ type: FormToggleComponent,
391
+ deps: [],
392
+ target: i0.ɵɵFactoryTarget.Component
393
+ });
394
+ static ɵcmp = i0.ɵɵngDeclareComponent({
395
+ minVersion: "14.0.0",
396
+ version: "22.2.4",
397
+ type: FormToggleComponent,
398
+ isStandalone: true,
399
+ selector: "lib-form-toggle",
400
+ inputs: {
401
+ id: "id",
402
+ describedBy: "describedBy"
403
+ },
404
+ providers: [{
405
+ provide: NG_VALUE_ACCESSOR,
406
+ useExisting: forwardRef(() => FormToggleComponent),
407
+ multi: true
408
+ }],
409
+ ngImport: i0,
410
+ template: "<label class=\"form-toggle\" [for]=\"id\">\n <input\n [id]=\"id\"\n type=\"checkbox\"\n role=\"switch\"\n [checked]=\"checked\"\n [attr.aria-describedby]=\"describedBy || null\"\n [disabled]=\"disabled\"\n (change)=\"handleChange($event)\"\n (blur)=\"handleBlur()\"\n />\n <span class=\"form-toggle-track\" aria-hidden=\"true\"><span></span></span>\n <span class=\"form-toggle-label\"><ng-content /></span>\n</label>\n",
411
+ styles: [":host{display:inline-block}.form-toggle{display:inline-flex;align-items:center;gap:.75rem;cursor:pointer;font:1rem/1.5 var(--font-base)}.form-toggle input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.form-toggle-track{display:inline-flex;width:2.75rem;height:1.5rem;align-items:center;border:1px solid var(--border-primary-50);padding:.15rem;background:var(--surface-secondary);transition:background-color .16s ease}.form-toggle-track>span{width:1rem;height:1rem;background:var(--text-primary);transition:transform .16s ease}.form-toggle input:checked+.form-toggle-track{border-color:var(--color-secondary);background:var(--color-secondary)}.form-toggle input:checked+.form-toggle-track>span{background:var(--color-primary);transform:translate(1.2rem)}.form-toggle input:focus-visible+.form-toggle-track{outline:2px solid var(--color-secondary);outline-offset:3px}.form-toggle input:disabled+.form-toggle-track,.form-toggle input:disabled~.form-toggle-label{cursor:not-allowed;opacity:.6}@media(prefers-reduced-motion:reduce){.form-toggle-track,.form-toggle-track>span{transition:none}}\n"]
412
+ });
413
+ };
414
+ i0.ɵɵngDeclareClassMetadata({
415
+ minVersion: "12.0.0",
416
+ version: "22.2.4",
417
+ ngImport: i0,
418
+ type: FormToggleComponent,
419
+ decorators: [{
420
+ type: Component,
421
+ args: [{
422
+ selector: "lib-form-toggle",
423
+ standalone: true,
424
+ providers: [{
425
+ provide: NG_VALUE_ACCESSOR,
426
+ useExisting: forwardRef(() => FormToggleComponent),
427
+ multi: true
428
+ }],
429
+ template: "<label class=\"form-toggle\" [for]=\"id\">\n <input\n [id]=\"id\"\n type=\"checkbox\"\n role=\"switch\"\n [checked]=\"checked\"\n [attr.aria-describedby]=\"describedBy || null\"\n [disabled]=\"disabled\"\n (change)=\"handleChange($event)\"\n (blur)=\"handleBlur()\"\n />\n <span class=\"form-toggle-track\" aria-hidden=\"true\"><span></span></span>\n <span class=\"form-toggle-label\"><ng-content /></span>\n</label>\n",
430
+ styles: [":host{display:inline-block}.form-toggle{display:inline-flex;align-items:center;gap:.75rem;cursor:pointer;font:1rem/1.5 var(--font-base)}.form-toggle input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.form-toggle-track{display:inline-flex;width:2.75rem;height:1.5rem;align-items:center;border:1px solid var(--border-primary-50);padding:.15rem;background:var(--surface-secondary);transition:background-color .16s ease}.form-toggle-track>span{width:1rem;height:1rem;background:var(--text-primary);transition:transform .16s ease}.form-toggle input:checked+.form-toggle-track{border-color:var(--color-secondary);background:var(--color-secondary)}.form-toggle input:checked+.form-toggle-track>span{background:var(--color-primary);transform:translate(1.2rem)}.form-toggle input:focus-visible+.form-toggle-track{outline:2px solid var(--color-secondary);outline-offset:3px}.form-toggle input:disabled+.form-toggle-track,.form-toggle input:disabled~.form-toggle-label{cursor:not-allowed;opacity:.6}@media(prefers-reduced-motion:reduce){.form-toggle-track,.form-toggle-track>span{transition:none}}\n"]
431
+ }]
432
+ }],
433
+ propDecorators: {
434
+ id: [{
435
+ type: Input,
436
+ args: [{ required: true }]
437
+ }],
438
+ describedBy: [{ type: Input }]
439
+ }
440
+ });
441
+ export { FormFieldComponent, FormInputComponent, FormSelectComponent, FormTextareaComponent, FormToggleComponent };
442
+
443
+ //# sourceMappingURL=lluc_llull-ui-lib-forms.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lluc_llull-ui-lib-forms.mjs","names":[],"sources":["../../../projects/ui-lib/forms/form-field/form-field.component.ts","../../../projects/ui-lib/forms/form-field/form-field.component.html","../../../projects/ui-lib/forms/form-input/form-input.component.ts","../../../projects/ui-lib/forms/form-input/form-input.component.html","../../../projects/ui-lib/forms/form-select/form-select.component.ts","../../../projects/ui-lib/forms/form-select/form-select.component.html","../../../projects/ui-lib/forms/form-textarea/form-textarea.component.ts","../../../projects/ui-lib/forms/form-textarea/form-textarea.component.html","../../../projects/ui-lib/forms/form-toggle/form-toggle.component.ts","../../../projects/ui-lib/forms/form-toggle/form-toggle.component.html"],"sourcesContent":["import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'lib-form-field',\n standalone: true,\n templateUrl: './form-field.component.html',\n styleUrl: './form-field.component.scss',\n host: {\n class: 'form-field',\n },\n})\nexport class FormFieldComponent {\n @Input({ required: true }) controlId = '';\n @Input() label = '';\n @Input() required = false;\n @Input() hint = '';\n @Input() error = '';\n\n get errorId(): string {\n return `${this.controlId}-error`;\n }\n\n get hintId(): string {\n return `${this.controlId}-hint`;\n }\n}\n","@if (label) {\n <label [for]=\"controlId\">\n {{ label }}\n @if (required) {\n <span class=\"form-field-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n}\n<ng-content />\n@if (hint && !error) {\n <span class=\"form-field-hint\" [id]=\"hintId\">{{ hint }}</span>\n}\n@if (error) {\n <span class=\"form-field-error\" [id]=\"errorId\" role=\"alert\">{{ error }}</span>\n}\n","import { Component, forwardRef, Input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type UiLibInputType = 'text' | 'email' | 'tel' | 'url' | 'search' | 'password';\n\n@Component({\n selector: 'lib-form-input',\n standalone: true,\n templateUrl: './form-input.component.html',\n styleUrl: './form-input.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FormInputComponent),\n multi: true,\n },\n ],\n})\nexport class FormInputComponent implements ControlValueAccessor {\n @Input({ required: true }) id = '';\n @Input() type: UiLibInputType = 'text';\n @Input() placeholder = '';\n @Input() autocomplete = '';\n @Input() describedBy = '';\n @Input() maxLength: number | null = null;\n @Input() required = false;\n @Input() invalid = false;\n\n value = '';\n disabled = false;\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n handleInput(event: Event): void {\n this.value = (event.target as HTMLInputElement).value;\n this.onChange(this.value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","<input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.maxlength]=\"maxLength ?? null\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n/>\n","import { Component, forwardRef, Input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface UiLibSelectOptionI {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'lib-form-select',\n standalone: true,\n templateUrl: './form-select.component.html',\n styleUrl: './form-select.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FormSelectComponent),\n multi: true,\n },\n ],\n})\nexport class FormSelectComponent implements ControlValueAccessor {\n @Input({ required: true }) id = '';\n @Input() options: UiLibSelectOptionI[] = [];\n @Input() placeholder = '';\n @Input() describedBy = '';\n @Input() required = false;\n @Input() invalid = false;\n\n value = '';\n disabled = false;\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n handleChange(event: Event): void {\n this.value = (event.target as HTMLSelectElement).value;\n this.onChange(this.value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","<select\n [id]=\"id\"\n [value]=\"value\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (change)=\"handleChange($event)\"\n (blur)=\"handleBlur()\"\n>\n @if (placeholder) {\n <option value=\"\" disabled>{{ placeholder }}</option>\n }\n @for (option of options; track option.value) {\n <option [value]=\"option.value\" [disabled]=\"option.disabled ?? false\">\n {{ option.label }}\n </option>\n }\n</select>\n","import { Component, forwardRef, Input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'lib-form-textarea',\n standalone: true,\n templateUrl: './form-textarea.component.html',\n styleUrl: './form-textarea.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FormTextareaComponent),\n multi: true,\n },\n ],\n})\nexport class FormTextareaComponent implements ControlValueAccessor {\n @Input({ required: true }) id = '';\n @Input() placeholder = '';\n @Input() describedBy = '';\n @Input() rows = 6;\n @Input() maxLength: number | null = null;\n @Input() required = false;\n @Input() invalid = false;\n @Input() showCounter = false;\n\n value = '';\n disabled = false;\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n handleInput(event: Event): void {\n this.value = (event.target as HTMLTextAreaElement).value;\n this.onChange(this.value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","<textarea\n [id]=\"id\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [rows]=\"rows\"\n [attr.maxlength]=\"maxLength ?? null\"\n [attr.aria-describedby]=\"describedBy || null\"\n [attr.aria-invalid]=\"invalid ? 'true' : null\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n></textarea>\n@if (showCounter && maxLength) {\n <span class=\"form-textarea-counter\" aria-live=\"polite\">\n {{ value.length }} / {{ maxLength }}\n </span>\n}\n","import { Component, forwardRef, Input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'lib-form-toggle',\n standalone: true,\n templateUrl: './form-toggle.component.html',\n styleUrl: './form-toggle.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FormToggleComponent),\n multi: true,\n },\n ],\n})\nexport class FormToggleComponent implements ControlValueAccessor {\n @Input({ required: true }) id = '';\n @Input() describedBy = '';\n\n checked = false;\n disabled = false;\n private onChange: (value: boolean) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: boolean | null): void {\n this.checked = value ?? false;\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n handleChange(event: Event): void {\n this.checked = (event.target as HTMLInputElement).checked;\n this.onChange(this.checked);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","<label class=\"form-toggle\" [for]=\"id\">\n <input\n [id]=\"id\"\n type=\"checkbox\"\n role=\"switch\"\n [checked]=\"checked\"\n [attr.aria-describedby]=\"describedBy || null\"\n [disabled]=\"disabled\"\n (change)=\"handleChange($event)\"\n (blur)=\"handleBlur()\"\n />\n <span class=\"form-toggle-track\" aria-hidden=\"true\"><span></span></span>\n <span class=\"form-toggle-label\"><ng-content /></span>\n</label>\n"],"mappings":"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"}
@@ -89,8 +89,8 @@ var HeaderClearComponent = class HeaderClearComponent {
89
89
  },
90
90
  usesOnChanges: true,
91
91
  ngImport: i0,
92
- template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
93
- styles: [".header-clear{border-radius:0;position:sticky;top:0;z-index:100;padding-block:0;margin-top:1rem;transition:background .3s ease,box-shadow .3s ease;background:var(--header-bg)}.header-clear.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-clear.is-scrolled .header-logo a{padding-inline:1.5rem}.header-clear.is-scrolled .header-logo span{color:var(--header-logo-text-dark)}.header-clear.is-scrolled .header-actions{padding-inline:1.5rem}.header-clear.is-scrolled .header-actions .btn-header{background:var(--header-bg-fixed-light)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:left}.header-logo span{display:flex;min-width:10rem}.header-actions{display:flex;align-items:center;justify-content:flex-end;gap:1rem}.lang{text-transform:uppercase}\n"],
92
+ template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'currentColor'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
93
+ styles: [".header-clear{border-radius:0;position:sticky;top:0;z-index:100;padding-block:0;margin-top:1rem;transition:background .3s ease,box-shadow .3s ease;background:var(--header-bg)}.header-clear.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014;border:4px solid var(--border-primary)}.header-clear.is-scrolled .header-logo a{padding-inline:1.5rem}.header-clear.is-scrolled .header-logo span{color:var(--header-logo-text-dark)}.header-clear.is-scrolled .header-actions{padding-inline:1.5rem}.header-clear.is-scrolled .header-actions .btn-header{border:4px solid var(--border-primary);background:var(--button-header-bg)}.header-clear.is-scrolled .header-actions .btn-header:hover{background:var(--button-header-bg-scrolled-hover)!important}.header-clear.is-scrolled.is-over-light{background:var(--header-bg-fixed-light)}.header-clear.is-scrolled.is-over-light .header-logo span{color:var(--header-logo-text-light)}.header-clear.is-scrolled.is-over-dark,.header-clear.is-scrolled.is-over-dark .header-actions .btn-header{border:4px solid var(--border-secondary)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:left}.header-logo span{display:flex;min-width:10rem}.header-actions{display:flex;align-items:center;justify-content:flex-end;gap:1rem}.lang{text-transform:uppercase}\n"],
94
94
  dependencies: [
95
95
  {
96
96
  kind: "ngmodule",
@@ -152,8 +152,8 @@ i0.ɵɵngDeclareClassMetadata({
152
152
  HeaderScrollDirective
153
153
  ],
154
154
  changeDetection: ChangeDetectionStrategy.OnPush,
155
- template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
156
- styles: [".header-clear{border-radius:0;position:sticky;top:0;z-index:100;padding-block:0;margin-top:1rem;transition:background .3s ease,box-shadow .3s ease;background:var(--header-bg)}.header-clear.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-clear.is-scrolled .header-logo a{padding-inline:1.5rem}.header-clear.is-scrolled .header-logo span{color:var(--header-logo-text-dark)}.header-clear.is-scrolled .header-actions{padding-inline:1.5rem}.header-clear.is-scrolled .header-actions .btn-header{background:var(--header-bg-fixed-light)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:left}.header-logo span{display:flex;min-width:10rem}.header-actions{display:flex;align-items:center;justify-content:flex-end;gap:1rem}.lang{text-transform:uppercase}\n"]
155
+ template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'currentColor'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
156
+ styles: [".header-clear{border-radius:0;position:sticky;top:0;z-index:100;padding-block:0;margin-top:1rem;transition:background .3s ease,box-shadow .3s ease;background:var(--header-bg)}.header-clear.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014;border:4px solid var(--border-primary)}.header-clear.is-scrolled .header-logo a{padding-inline:1.5rem}.header-clear.is-scrolled .header-logo span{color:var(--header-logo-text-dark)}.header-clear.is-scrolled .header-actions{padding-inline:1.5rem}.header-clear.is-scrolled .header-actions .btn-header{border:4px solid var(--border-primary);background:var(--button-header-bg)}.header-clear.is-scrolled .header-actions .btn-header:hover{background:var(--button-header-bg-scrolled-hover)!important}.header-clear.is-scrolled.is-over-light{background:var(--header-bg-fixed-light)}.header-clear.is-scrolled.is-over-light .header-logo span{color:var(--header-logo-text-light)}.header-clear.is-scrolled.is-over-dark,.header-clear.is-scrolled.is-over-dark .header-actions .btn-header{border:4px solid var(--border-secondary)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:left}.header-logo span{display:flex;min-width:10rem}.header-actions{display:flex;align-items:center;justify-content:flex-end;gap:1rem}.lang{text-transform:uppercase}\n"]
157
157
  }]
158
158
  }],
159
159
  ctorParameters: () => [{ type: i1.ThemeService }],
@@ -1 +1 @@
1
- {"version":3,"file":"lluc_llull-ui-lib-headers-header-clear.mjs","names":[],"sources":["../../../projects/ui-lib/headers/header-clear/header-clear.component.ts","../../../projects/ui-lib/headers/header-clear/header-clear.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-clear',\n standalone: true,\n imports: [CommonModule, NavModalComponent, LinkTypeDirective, UiIconComponent, HeaderScrollDirective],\n templateUrl: './header-clear.component.html',\n styleUrl: './header-clear.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderClearComponent implements OnInit, OnDestroy, OnChanges {\n isMenuOpen = false;\n isMenuClosing = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n if (this.isMenuOpen) {\n this.closeMenu();\n return;\n }\n\n this.isMenuClosing = false;\n this.isMenuOpen = true;\n }\n\n closeMenu(): void {\n if (!this.isMenuOpen && !this.isMenuClosing) return;\n\n this.isMenuClosing = true;\n this.isMenuOpen = false;\n }\n\n finishMenuClose(event: TransitionEvent): void {\n if (!this.isMenuClosing || event.propertyName !== 'visibility') return;\n if (!(event.target instanceof HTMLElement) || !event.target.classList.contains('modal-content')) return;\n\n this.isMenuClosing = false;\n }\n}\n","<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n"],"mappings":";;;;;;;;AAgCA,IAAa,uBAAb,MAAa,qBAAoB;CAiBT;CAhBpB,aAAa;CACb,gBAAgB;CAChB,eAAsB;CACd;CAEC;CACA;CACA;CACA;CACA;CACA;CACA,OAAe;CAEd,YAAY,IAAI,aAAY;CAC5B,QAAQ,IAAI,aAAY;CAElC,YAAoB,cAA0B;EAA1B,KAAA,eAAA;CAA6B;CAEjD,WAAQ;EACJ,KAAK,oBAAoB,KAAK,aAAa,cAAc,WAAW,UAAS;GACzE,KAAK,eAAe;EACxB,CAAC;CACL;CAEA,cAAW;EACP,KAAK,WAAW,YAAY,KAAK,YAAY,KAAK,IAAI;CAC1D;CAEA,cAAW;EACP,KAAK,mBAAmB,YAAW;CACvC;CAEA,qBAAkB;EACd,KAAK,UAAU,KAAI;CACvB;CAEA,cAAW;EACP,KAAK,aAAa,YAAW;EAC7B,KAAK,MAAM,KAAI;CACnB;CAEA,aAAU;EACN,IAAI,KAAK,YAAY;GACjB,KAAK,UAAS;GACd;EACJ;EAEA,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,YAAS;EACL,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,eAAe;EAE7C,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,gBAAgB,OAAsB;EAClC,IAAI,CAAC,KAAK,iBAAiB,MAAM,iBAAiB,cAAc;EAChE,IAAI,EAAE,MAAM,kBAAkB,gBAAgB,CAAC,MAAM,OAAO,UAAU,SAAS,eAAe,GAAG;EAEjG,KAAK,gBAAgB;CACzB;CAhES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA,EAAA,OAAA,GAAA,aAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;GAAA,UAAA;GAAA,UAAA;GAAA,aAAA;GAAA,UAAA;GAAA,YAAA;GAAA,MAAA;EAAA;EAAA,SAAA;GAAA,WAAA;GAAA,OAAA;EAAA;EAAA,eAAA;EAAA,UAAA;EAAA,UChCjC;EA2CA,QAAA,CAAA,q4BAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDhBc;GAAY;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,OAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA,CAAA,YAAA,MAAA;IAAA,SAAA,CAAA,eAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAe,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAqB,UAAA;IAAA,QAAA,CAAA,iBAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAK3F,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EARhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAkB,YAChB;GAAI,SACP;IAAC;IAAc;IAAmB;IAAmB;IAAiB;GAAqB;GAAC,iBAGpF,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,q4BAAA;EAAA,CAAA;;;;E,SAQ9C,MAAA,M;E,aACA,MAAA,M;E,aACA,MAAA,M;E,gBACA,MAAA,M;E,aACA,MAAA,M;E,eACA,MAAA,M;E,SACA,MAAA,M;E,cAEA,MAAA,O;E,UACA,MAAA,O"}
1
+ {"version":3,"file":"lluc_llull-ui-lib-headers-header-clear.mjs","names":[],"sources":["../../../projects/ui-lib/headers/header-clear/header-clear.component.ts","../../../projects/ui-lib/headers/header-clear/header-clear.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-clear',\n standalone: true,\n imports: [CommonModule, NavModalComponent, LinkTypeDirective, UiIconComponent, HeaderScrollDirective],\n templateUrl: './header-clear.component.html',\n styleUrl: './header-clear.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderClearComponent implements OnInit, OnDestroy, OnChanges {\n isMenuOpen = false;\n isMenuClosing = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n if (this.isMenuOpen) {\n this.closeMenu();\n return;\n }\n\n this.isMenuClosing = false;\n this.isMenuOpen = true;\n }\n\n closeMenu(): void {\n if (!this.isMenuOpen && !this.isMenuClosing) return;\n\n this.isMenuClosing = true;\n this.isMenuOpen = false;\n }\n\n finishMenuClose(event: TransitionEvent): void {\n if (!this.isMenuClosing || event.propertyName !== 'visibility') return;\n if (!(event.target instanceof HTMLElement) || !event.target.classList.contains('modal-content')) return;\n\n this.isMenuClosing = false;\n }\n}\n","<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'currentColor'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n"],"mappings":";;;;;;;;AAgCA,IAAa,uBAAb,MAAa,qBAAoB;CAiBT;CAhBpB,aAAa;CACb,gBAAgB;CAChB,eAAsB;CACd;CAEC;CACA;CACA;CACA;CACA;CACA;CACA,OAAe;CAEd,YAAY,IAAI,aAAY;CAC5B,QAAQ,IAAI,aAAY;CAElC,YAAoB,cAA0B;EAA1B,KAAA,eAAA;CAA6B;CAEjD,WAAQ;EACJ,KAAK,oBAAoB,KAAK,aAAa,cAAc,WAAW,UAAS;GACzE,KAAK,eAAe;EACxB,CAAC;CACL;CAEA,cAAW;EACP,KAAK,WAAW,YAAY,KAAK,YAAY,KAAK,IAAI;CAC1D;CAEA,cAAW;EACP,KAAK,mBAAmB,YAAW;CACvC;CAEA,qBAAkB;EACd,KAAK,UAAU,KAAI;CACvB;CAEA,cAAW;EACP,KAAK,aAAa,YAAW;EAC7B,KAAK,MAAM,KAAI;CACnB;CAEA,aAAU;EACN,IAAI,KAAK,YAAY;GACjB,KAAK,UAAS;GACd;EACJ;EAEA,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,YAAS;EACL,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,eAAe;EAE7C,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,gBAAgB,OAAsB;EAClC,IAAI,CAAC,KAAK,iBAAiB,MAAM,iBAAiB,cAAc;EAChE,IAAI,EAAE,MAAM,kBAAkB,gBAAgB,CAAC,MAAM,OAAO,UAAU,SAAS,eAAe,GAAG;EAEjG,KAAK,gBAAgB;CACzB;CAhES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA,EAAA,OAAA,GAAA,aAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;GAAA,UAAA;GAAA,UAAA;GAAA,aAAA;GAAA,UAAA;GAAA,YAAA;GAAA,MAAA;EAAA;EAAA,SAAA;GAAA,WAAA;GAAA,OAAA;EAAA;EAAA,eAAA;EAAA,UAAA;EAAA,UChCjC;EA2CA,QAAA,CAAA,u4CAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDhBc;GAAY;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,OAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA,CAAA,YAAA,MAAA;IAAA,SAAA,CAAA,eAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAe,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAqB,UAAA;IAAA,QAAA,CAAA,iBAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAK3F,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EARhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAkB,YAChB;GAAI,SACP;IAAC;IAAc;IAAmB;IAAmB;IAAiB;GAAqB;GAAC,iBAGpF,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,u4CAAA;EAAA,CAAA;;;;E,SAQ9C,MAAA,M;E,aACA,MAAA,M;E,aACA,MAAA,M;E,gBACA,MAAA,M;E,aACA,MAAA,M;E,eACA,MAAA,M;E,SACA,MAAA,M;E,cAEA,MAAA,O;E,UACA,MAAA,O"}
@@ -90,7 +90,7 @@ var HeaderMobileComponent = class HeaderMobileComponent {
90
90
  usesOnChanges: true,
91
91
  ngImport: i0,
92
92
  template: "<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
93
- styles: [".header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;z-index:100;width:100vw;background:var(--header-bg);transition:background .3s ease,box-shadow .3s ease}.header-mobile.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:center}.header-actions{position:fixed;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;background-color:var(--header-mobile-bg);z-index:100;box-sizing:border-box}.header-actions .center{margin:0 auto}.lang{text-transform:uppercase}\n"],
93
+ styles: [".header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;left:0;right:0;z-index:100;box-sizing:border-box;background:var(--header-bg);transition:background .3s ease,box-shadow .3s ease}.header-mobile.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014;border:4px solid black}.header-mobile.is-scrolled.is-over-light{background:var(--header-bg-fixed-light)}.header-mobile.is-scrolled.is-over-dark{border:4px solid var(--border-secondary)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:center}.header-actions{position:fixed;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;background-color:var(--header-mobile-bg);z-index:100;box-sizing:border-box;border:4px solid black}.header-actions .center{margin:0 auto}.lang{text-transform:uppercase}\n"],
94
94
  dependencies: [
95
95
  {
96
96
  kind: "ngmodule",
@@ -153,7 +153,7 @@ i0.ɵɵngDeclareClassMetadata({
153
153
  ],
154
154
  changeDetection: ChangeDetectionStrategy.OnPush,
155
155
  template: "<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
156
- styles: [".header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;z-index:100;width:100vw;background:var(--header-bg);transition:background .3s ease,box-shadow .3s ease}.header-mobile.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:center}.header-actions{position:fixed;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;background-color:var(--header-mobile-bg);z-index:100;box-sizing:border-box}.header-actions .center{margin:0 auto}.lang{text-transform:uppercase}\n"]
156
+ styles: [".header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;left:0;right:0;z-index:100;box-sizing:border-box;background:var(--header-bg);transition:background .3s ease,box-shadow .3s ease}.header-mobile.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014;border:4px solid black}.header-mobile.is-scrolled.is-over-light{background:var(--header-bg-fixed-light)}.header-mobile.is-scrolled.is-over-dark{border:4px solid var(--border-secondary)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:center}.header-actions{position:fixed;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;background-color:var(--header-mobile-bg);z-index:100;box-sizing:border-box;border:4px solid black}.header-actions .center{margin:0 auto}.lang{text-transform:uppercase}\n"]
157
157
  }]
158
158
  }],
159
159
  ctorParameters: () => [{ type: i1.ThemeService }],
@@ -1 +1 @@
1
- {"version":3,"file":"lluc_llull-ui-lib-headers-header-mobile.mjs","names":[],"sources":["../../../projects/ui-lib/headers/header-mobile/header-mobile.component.ts","../../../projects/ui-lib/headers/header-mobile/header-mobile.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-mobile',\n standalone: true,\n imports: [CommonModule, NavModalComponent, HeaderScrollDirective, LinkTypeDirective, UiIconComponent],\n templateUrl: './header-mobile.component.html',\n styleUrl: './header-mobile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderMobileComponent implements OnInit, OnChanges, OnDestroy {\n isMenuOpen = false;\n isMenuClosing = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n if (this.isMenuOpen) {\n this.closeMenu();\n return;\n }\n\n this.isMenuClosing = false;\n this.isMenuOpen = true;\n }\n\n closeMenu(): void {\n if (!this.isMenuOpen && !this.isMenuClosing) return;\n\n this.isMenuClosing = true;\n this.isMenuOpen = false;\n }\n\n finishMenuClose(event: TransitionEvent): void {\n if (!this.isMenuClosing || event.propertyName !== 'visibility') return;\n if (!(event.target instanceof HTMLElement) || !event.target.classList.contains('modal-content')) return;\n\n this.isMenuClosing = false;\n }\n}\n","<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n"],"mappings":";;;;;;;;AAgCA,IAAa,wBAAb,MAAa,sBAAqB;CAiBV;CAhBpB,aAAa;CACb,gBAAgB;CAChB,eAAsB;CACd;CAEC;CACA;CACA;CACA;CACA;CACA;CACA,OAAe;CAEd,YAAY,IAAI,aAAY;CAC5B,QAAQ,IAAI,aAAY;CAElC,YAAoB,cAA0B;EAA1B,KAAA,eAAA;CAA6B;CAEjD,WAAQ;EACJ,KAAK,oBAAoB,KAAK,aAAa,cAAc,WAAW,UAAS;GACzE,KAAK,eAAe;EACxB,CAAC;CACL;CAEA,cAAW;EACP,KAAK,WAAW,YAAY,KAAK,YAAY,KAAK,IAAI;CAC1D;CAEA,cAAW;EACP,KAAK,mBAAmB,YAAW;CACvC;CAEA,qBAAkB;EACd,KAAK,UAAU,KAAI;CACvB;CAEA,cAAW;EACP,KAAK,aAAa,YAAW;EAC7B,KAAK,MAAM,KAAI;CACnB;CAEA,aAAU;EACN,IAAI,KAAK,YAAY;GACjB,KAAK,UAAS;GACd;EACJ;EAEA,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,YAAS;EACL,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,eAAe;EAE7C,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,gBAAgB,OAAsB;EAClC,IAAI,CAAC,KAAK,iBAAiB,MAAM,iBAAiB,cAAc;EAChE,IAAI,EAAE,MAAM,kBAAkB,gBAAgB,CAAC,MAAM,OAAO,UAAU,SAAS,eAAe,GAAG;EAEjG,KAAK,gBAAgB;CACzB;CAhES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA,EAAA,OAAA,GAAA,aAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;GAAA,UAAA;GAAA,UAAA;GAAA,aAAA;GAAA,UAAA;GAAA,YAAA;GAAA,MAAA;EAAA;EAAA,SAAA;GAAA,WAAA;GAAA,OAAA;EAAA;EAAA,eAAA;EAAA,UAAA;EAAA,UChClC;EAgDA,QAAA,CAAA,swBAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDrBc;GAAY;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,OAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAqB,UAAA;IAAA,QAAA,CAAA,iBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA,CAAA,YAAA,MAAA;IAAA,SAAA,CAAA,eAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAe,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAK3F,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EARjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAmB,YACjB;GAAI,SACP;IAAC;IAAc;IAAmB;IAAuB;IAAmB;GAAe;GAAC,iBAGpF,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,swBAAA;EAAA,CAAA;;;;E,SAQ9C,MAAA,M;E,aACA,MAAA,M;E,aACA,MAAA,M;E,gBACA,MAAA,M;E,aACA,MAAA,M;E,eACA,MAAA,M;E,SACA,MAAA,M;E,cAEA,MAAA,O;E,UACA,MAAA,O"}
1
+ {"version":3,"file":"lluc_llull-ui-lib-headers-header-mobile.mjs","names":[],"sources":["../../../projects/ui-lib/headers/header-mobile/header-mobile.component.ts","../../../projects/ui-lib/headers/header-mobile/header-mobile.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-mobile',\n standalone: true,\n imports: [CommonModule, NavModalComponent, HeaderScrollDirective, LinkTypeDirective, UiIconComponent],\n templateUrl: './header-mobile.component.html',\n styleUrl: './header-mobile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderMobileComponent implements OnInit, OnChanges, OnDestroy {\n isMenuOpen = false;\n isMenuClosing = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n if (this.isMenuOpen) {\n this.closeMenu();\n return;\n }\n\n this.isMenuClosing = false;\n this.isMenuOpen = true;\n }\n\n closeMenu(): void {\n if (!this.isMenuOpen && !this.isMenuClosing) return;\n\n this.isMenuClosing = true;\n this.isMenuOpen = false;\n }\n\n finishMenuClose(event: TransitionEvent): void {\n if (!this.isMenuClosing || event.propertyName !== 'visibility') return;\n if (!(event.target instanceof HTMLElement) || !event.target.classList.contains('modal-content')) return;\n\n this.isMenuClosing = false;\n }\n}\n","<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n"],"mappings":";;;;;;;;AAgCA,IAAa,wBAAb,MAAa,sBAAqB;CAiBV;CAhBpB,aAAa;CACb,gBAAgB;CAChB,eAAsB;CACd;CAEC;CACA;CACA;CACA;CACA;CACA;CACA,OAAe;CAEd,YAAY,IAAI,aAAY;CAC5B,QAAQ,IAAI,aAAY;CAElC,YAAoB,cAA0B;EAA1B,KAAA,eAAA;CAA6B;CAEjD,WAAQ;EACJ,KAAK,oBAAoB,KAAK,aAAa,cAAc,WAAW,UAAS;GACzE,KAAK,eAAe;EACxB,CAAC;CACL;CAEA,cAAW;EACP,KAAK,WAAW,YAAY,KAAK,YAAY,KAAK,IAAI;CAC1D;CAEA,cAAW;EACP,KAAK,mBAAmB,YAAW;CACvC;CAEA,qBAAkB;EACd,KAAK,UAAU,KAAI;CACvB;CAEA,cAAW;EACP,KAAK,aAAa,YAAW;EAC7B,KAAK,MAAM,KAAI;CACnB;CAEA,aAAU;EACN,IAAI,KAAK,YAAY;GACjB,KAAK,UAAS;GACd;EACJ;EAEA,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,YAAS;EACL,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,eAAe;EAE7C,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACtB;CAEA,gBAAgB,OAAsB;EAClC,IAAI,CAAC,KAAK,iBAAiB,MAAM,iBAAiB,cAAc;EAChE,IAAI,EAAE,MAAM,kBAAkB,gBAAgB,CAAC,MAAM,OAAO,UAAU,SAAS,eAAe,GAAG;EAEjG,KAAK,gBAAgB;CACzB;CAhES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA,EAAA,OAAA,GAAA,aAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;GAAA,UAAA;GAAA,UAAA;GAAA,aAAA;GAAA,UAAA;GAAA,YAAA;GAAA,MAAA;EAAA;EAAA,SAAA;GAAA,WAAA;GAAA,OAAA;EAAA;EAAA,eAAA;EAAA,UAAA;EAAA,UChClC;EAgDA,QAAA,CAAA,++BAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDrBc;GAAY;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,OAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAqB,UAAA;IAAA,QAAA,CAAA,iBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA,CAAA,YAAA,MAAA;IAAA,SAAA,CAAA,eAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAe,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAK3F,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EARjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAmB,YACjB;GAAI,SACP;IAAC;IAAc;IAAmB;IAAuB;IAAmB;GAAe;GAAC,iBAGpF,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,++BAAA;EAAA,CAAA;;;;E,SAQ9C,MAAA,M;E,aACA,MAAA,M;E,aACA,MAAA,M;E,gBACA,MAAA,M;E,aACA,MAAA,M;E,eACA,MAAA,M;E,SACA,MAAA,M;E,cAEA,MAAA,O;E,UACA,MAAA,O"}