@lluc_llull/ui-lib 0.12.5 → 0.14.2
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/fesm2022/lluc_llull-ui-lib-src-lib-effects.mjs +144 -0
- package/fesm2022/lluc_llull-ui-lib-src-lib-effects.mjs.map +1 -0
- package/fesm2022/lluc_llull-ui-lib-src-lib-sliders.mjs +53 -0
- package/fesm2022/lluc_llull-ui-lib-src-lib-sliders.mjs.map +1 -0
- package/fesm2022/lluc_llull-ui-lib.mjs +357 -302
- package/fesm2022/lluc_llull-ui-lib.mjs.map +1 -1
- package/lib/components/core/headers/header-clear/header-clear.component.d.ts +6 -4
- package/lib/components/core/headers/header-mobile/header-mobile.component.d.ts +6 -4
- package/lib/components/core/modals/lang-modal/lang-modal.component.d.ts +2 -2
- package/lib/components/shared/ui-icon/ui-icon.component.d.ts +5 -1
- package/lib/directives/index.d.ts +0 -1
- package/lib/directives/link-type.directive.d.ts +5 -4
- package/lib/{components/effects → effects}/dynamic-background/effects/sphere-deform/sphere-deform.effect.d.ts +1 -1
- package/lib/interfaces/page-config.interface.d.ts +1 -0
- package/lib/services/mapper/cdn.token.d.ts +2 -0
- package/lib/services/mapper/component-mappers/index.d.ts +1 -1
- package/lib/services/mapper/component-mappers/lang-modal.mapper.d.ts +2 -5
- package/lib/services/mapper/component-mappers/nav-modal.mapper.d.ts +2 -3
- package/lib/services/mapper/component-mappers/types.d.ts +1 -1
- package/lib/services/mapper/index.d.ts +1 -0
- package/lib/services/mapper/mapper.service.d.ts +1 -0
- package/lib/utils/utils.d.ts +2 -2
- package/package.json +26 -15
- package/public-api.d.ts +1 -1
- package/src/lib/effects/dynamic-background/dynamic-background.component.d.ts +26 -0
- package/src/lib/effects/dynamic-background/effects/dynamic-effect.interface.d.ts +6 -0
- package/src/lib/effects/dynamic-background/effects/effect-registry.d.ts +3 -0
- package/src/lib/effects/dynamic-background/effects/sphere-deform/sphere-deform.effect.d.ts +13 -0
- package/src/lib/effects/dynamic-background/index.d.ts +1 -0
- package/src/lib/effects/index.d.ts +1 -0
- package/src/lib/sliders/index.d.ts +1 -0
- package/src/lib/sliders/swiper.directive.d.ts +12 -0
- package/src/lib/styles/main.css +2 -2
- package/styles/main.css +2 -2
- package/esm2022/lib/Enum/index.mjs +0 -2
- package/esm2022/lib/Enum/link-type.enum.mjs +0 -9
- package/esm2022/lib/components/core/content/category-progress/category-progress.component.mjs +0 -18
- package/esm2022/lib/components/core/content/category-progress/category-progress.interface.mjs +0 -2
- package/esm2022/lib/components/core/content/category-progress/index.mjs +0 -3
- package/esm2022/lib/components/core/content/hero-section/hero-section.component.mjs +0 -25
- package/esm2022/lib/components/core/content/hero-section/hero-section.interface.mjs +0 -2
- package/esm2022/lib/components/core/content/hero-section/hero-section.stories.mjs +0 -25
- package/esm2022/lib/components/core/content/hero-section/index.mjs +0 -4
- package/esm2022/lib/components/core/content/index.mjs +0 -4
- package/esm2022/lib/components/core/content/section-intro/index.mjs +0 -3
- package/esm2022/lib/components/core/content/section-intro/section-intro.component.mjs +0 -23
- package/esm2022/lib/components/core/content/section-intro/section-intro.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/index.mjs +0 -5
- package/esm2022/lib/components/core/footers/legal-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/legal-footer/legal-footer.component.mjs +0 -27
- package/esm2022/lib/components/core/footers/legal-footer/legal-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/links-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/links-footer/links-footer.component.mjs +0 -15
- package/esm2022/lib/components/core/footers/links-footer/links-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/social-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/social-footer/social-footer.component.mjs +0 -20
- package/esm2022/lib/components/core/footers/social-footer/social-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/visual-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/visual-footer/visual-footer.component.mjs +0 -29
- package/esm2022/lib/components/core/footers/visual-footer/visual-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/headers/header-clear/header-clear.component.mjs +0 -59
- package/esm2022/lib/components/core/headers/header-clear/header-clear.interface.mjs +0 -2
- package/esm2022/lib/components/core/headers/header-clear/index.mjs +0 -3
- package/esm2022/lib/components/core/headers/header-mobile/header-mobile.component.mjs +0 -59
- package/esm2022/lib/components/core/headers/header-mobile/header-mobile.interface.mjs +0 -2
- package/esm2022/lib/components/core/headers/header-mobile/index.mjs +0 -3
- package/esm2022/lib/components/core/headers/index.mjs +0 -3
- package/esm2022/lib/components/core/index.mjs +0 -5
- package/esm2022/lib/components/core/modals/index.mjs +0 -3
- package/esm2022/lib/components/core/modals/lang-modal/index.mjs +0 -3
- package/esm2022/lib/components/core/modals/lang-modal/lang-modal.component.mjs +0 -33
- package/esm2022/lib/components/core/modals/lang-modal/lang-modal.interface.mjs +0 -2
- package/esm2022/lib/components/core/modals/nav-modal/index.mjs +0 -3
- package/esm2022/lib/components/core/modals/nav-modal/nav-modal.component.mjs +0 -25
- package/esm2022/lib/components/core/modals/nav-modal/nav-modal.interface.mjs +0 -2
- package/esm2022/lib/components/effects/dynamic-background/dynamic-background.component.mjs +0 -87
- package/esm2022/lib/components/effects/dynamic-background/effects/dynamic-effect.interface.mjs +0 -2
- package/esm2022/lib/components/effects/dynamic-background/effects/effect-registry.mjs +0 -7
- package/esm2022/lib/components/effects/dynamic-background/effects/sphere-deform/sphere-deform.effect.mjs +0 -37
- package/esm2022/lib/components/effects/dynamic-background/index.mjs +0 -2
- package/esm2022/lib/components/effects/index.mjs +0 -2
- package/esm2022/lib/components/shared/index.mjs +0 -2
- package/esm2022/lib/components/shared/ui-icon/index.mjs +0 -3
- package/esm2022/lib/components/shared/ui-icon/ui-icon.component.mjs +0 -40
- package/esm2022/lib/components/shared/ui-icon/ui-icon.interface.mjs +0 -2
- package/esm2022/lib/directives/index.mjs +0 -3
- package/esm2022/lib/directives/link-type.directive.mjs +0 -106
- package/esm2022/lib/directives/swiper.directive.mjs +0 -43
- package/esm2022/lib/interfaces/index.mjs +0 -8
- package/esm2022/lib/interfaces/page-config.interface.mjs +0 -2
- package/esm2022/lib/interfaces/site-config.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-address.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-button.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-image.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-lang-item.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-nav-items.interface.mjs +0 -2
- package/esm2022/lib/modules/icons/icon.module.mjs +0 -22
- package/esm2022/lib/modules/icons/index.mjs +0 -2
- package/esm2022/lib/modules/index.mjs +0 -2
- package/esm2022/lib/services/index.mjs +0 -4
- package/esm2022/lib/services/mapper/component-mappers/category-progress.mapper.mjs +0 -12
- package/esm2022/lib/services/mapper/component-mappers/header-clear.mapper.mjs +0 -18
- package/esm2022/lib/services/mapper/component-mappers/hero-section.mapper.mjs +0 -10
- package/esm2022/lib/services/mapper/component-mappers/index.mjs +0 -23
- package/esm2022/lib/services/mapper/component-mappers/lang-modal.mapper.mjs +0 -14
- package/esm2022/lib/services/mapper/component-mappers/legal-footer.mapper.mjs +0 -9
- package/esm2022/lib/services/mapper/component-mappers/links-footer.mapper.mjs +0 -5
- package/esm2022/lib/services/mapper/component-mappers/nav-modal.mapper.mjs +0 -48
- package/esm2022/lib/services/mapper/component-mappers/section-intro.mapper.mjs +0 -9
- package/esm2022/lib/services/mapper/component-mappers/social-footer.mapper.mjs +0 -7
- package/esm2022/lib/services/mapper/component-mappers/types.mjs +0 -2
- package/esm2022/lib/services/mapper/component-mappers/visual-footer.mapper.mjs +0 -18
- package/esm2022/lib/services/mapper/index.mjs +0 -3
- package/esm2022/lib/services/mapper/mapper.service.mjs +0 -45
- package/esm2022/lib/services/screen-sizer/index.mjs +0 -2
- package/esm2022/lib/services/screen-sizer/screen-sizer.service.mjs +0 -84
- package/esm2022/lib/services/theme/index.mjs +0 -2
- package/esm2022/lib/services/theme/theme.service.mjs +0 -73
- package/esm2022/lib/utils/index.mjs +0 -2
- package/esm2022/lib/utils/utils.mjs +0 -38
- package/esm2022/lluc_llull-ui-lib.mjs +0 -5
- package/esm2022/public-api.mjs +0 -21
- /package/lib/{components/effects → effects}/dynamic-background/dynamic-background.component.d.ts +0 -0
- /package/lib/{components/effects → effects}/dynamic-background/effects/dynamic-effect.interface.d.ts +0 -0
- /package/lib/{components/effects → effects}/dynamic-background/effects/effect-registry.d.ts +0 -0
- /package/lib/{components/effects → effects}/dynamic-background/index.d.ts +0 -0
- /package/lib/{components/effects → effects}/index.d.ts +0 -0
- /package/lib/{directives → sliders}/swiper.directive.d.ts +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as i1$1 from '@angular/common';
|
|
2
2
|
import { CommonModule, isPlatformBrowser } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Input, ChangeDetectionStrategy, Component, EventEmitter, inject, PLATFORM_ID, HostListener, Output, Directive, NgModule, Optional, Inject, Injectable, ViewChild, signal } from '@angular/core';
|
|
4
|
+
import { Input, ChangeDetectionStrategy, Component, EventEmitter, inject, PLATFORM_ID, HostListener, Output, Directive, NgModule, Optional, Inject, Injectable, ViewChild, InjectionToken, signal } from '@angular/core';
|
|
5
5
|
import * as i1 from '@angular/router';
|
|
6
|
+
import * as simpleIcons from 'simple-icons';
|
|
7
|
+
import * as i1$2 from 'lucide-angular';
|
|
8
|
+
import { Twitter, ArrowLeft, ArrowRight, ArrowUpRight, LucideAngularModule } from 'lucide-angular';
|
|
6
9
|
import Swiper from 'swiper';
|
|
7
10
|
import { Navigation, Pagination, Autoplay } from 'swiper/modules';
|
|
8
|
-
import { siX, siYoutube, siTiktok, siFacebook, siInstagram } from 'simple-icons';
|
|
9
|
-
import * as i1$2 from 'lucide-angular';
|
|
10
|
-
import { ArrowLeft, ArrowRight, ArrowUpRight, LucideAngularModule } from 'lucide-angular';
|
|
11
11
|
import * as i1$3 from '@angular/material/dialog';
|
|
12
12
|
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
13
13
|
import { BehaviorSubject, fromEvent } from 'rxjs';
|
|
@@ -15,10 +15,13 @@ import * as THREE from 'three';
|
|
|
15
15
|
import { debounceTime, map, distinctUntilChanged, startWith } from 'rxjs/operators';
|
|
16
16
|
|
|
17
17
|
class CategoryProgressComponent {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
pretitle;
|
|
19
|
+
title;
|
|
20
|
+
categories;
|
|
21
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: CategoryProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: CategoryProgressComponent, isStandalone: true, selector: "lib-category-progress", inputs: { pretitle: "pretitle", title: "title", categories: "categories" }, ngImport: i0, template: "<div class=\"category-progress\">\n @if (pretitle) {\n <h3 class=\"pretitle\">{{ pretitle }}</h3>\n }\n @if (title) {\n <h2 class=\"title\">{{ title }}</h2>\n }\n <div class=\"progress-grid\">\n @for (category of categories; track $index) {\n <div class=\"category\">\n <h3 class=\"subtitle\">{{ category.title }}</h3>\n\n @for (item of category.items; track $index) {\n <div class=\"item\">\n <span class=\"label\">{{ item.label }}</span>\n <div class=\"bar\">\n <div class=\"fill\" [style.width.%]=\"item.value\"></div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.category-progress{text-align:start;padding:2rem 10rem;align-items:start}@media (max-width: 768px){.category-progress{padding:2rem 4rem}}.title{text-transform:uppercase}.progress-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:2rem}.category{display:flex;flex-direction:column;gap:1.5rem}.category-title{font-weight:600;font-size:1.1rem}.item .label{font-size:.9rem;margin-bottom:.3rem;display:block}.item .bar{background-color:var(--progress-bg);height:6px;border-radius:3px;overflow:hidden}.item .bar .fill{background-color:var(--progress-color);height:100%;width:0;transition:width .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
20
23
|
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: CategoryProgressComponent, decorators: [{
|
|
22
25
|
type: Component,
|
|
23
26
|
args: [{ selector: 'lib-category-progress', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"category-progress\">\n @if (pretitle) {\n <h3 class=\"pretitle\">{{ pretitle }}</h3>\n }\n @if (title) {\n <h2 class=\"title\">{{ title }}</h2>\n }\n <div class=\"progress-grid\">\n @for (category of categories; track $index) {\n <div class=\"category\">\n <h3 class=\"subtitle\">{{ category.title }}</h3>\n\n @for (item of category.items; track $index) {\n <div class=\"item\">\n <span class=\"label\">{{ item.label }}</span>\n <div class=\"bar\">\n <div class=\"fill\" [style.width.%]=\"item.value\"></div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.category-progress{text-align:start;padding:2rem 10rem;align-items:start}@media (max-width: 768px){.category-progress{padding:2rem 4rem}}.title{text-transform:uppercase}.progress-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:2rem}.category{display:flex;flex-direction:column;gap:1.5rem}.category-title{font-weight:600;font-size:1.1rem}.item .label{font-size:.9rem;margin-bottom:.3rem;display:block}.item .bar{background-color:var(--progress-bg);height:6px;border-radius:3px;overflow:hidden}.item .bar .fill{background-color:var(--progress-color);height:100%;width:0;transition:width .3s ease}\n"] }]
|
|
24
27
|
}], propDecorators: { pretitle: [{
|
|
@@ -39,89 +42,98 @@ var LinkType;
|
|
|
39
42
|
})(LinkType || (LinkType = {}));
|
|
40
43
|
|
|
41
44
|
class LinkTypeDirective {
|
|
45
|
+
router;
|
|
46
|
+
elRef;
|
|
47
|
+
linkType;
|
|
48
|
+
href;
|
|
49
|
+
anchorClicked = new EventEmitter();
|
|
50
|
+
platformId = inject(PLATFORM_ID);
|
|
51
|
+
isBrowser = isPlatformBrowser(this.platformId);
|
|
42
52
|
constructor(router, elRef) {
|
|
43
53
|
this.router = router;
|
|
44
54
|
this.elRef = elRef;
|
|
45
|
-
this.anchorClicked = new EventEmitter();
|
|
46
|
-
this.platformId = inject(PLATFORM_ID);
|
|
47
55
|
}
|
|
48
56
|
ngOnInit() {
|
|
49
|
-
this.
|
|
57
|
+
this.setupAttributes();
|
|
50
58
|
}
|
|
51
59
|
onClick(event) {
|
|
52
|
-
if (!this.linkType || !this.href)
|
|
53
|
-
this.disableLink();
|
|
60
|
+
if (!this.linkType || !this.href)
|
|
54
61
|
return;
|
|
55
|
-
}
|
|
56
|
-
event.preventDefault();
|
|
57
62
|
switch (this.linkType) {
|
|
58
63
|
case 'internal':
|
|
64
|
+
event.preventDefault();
|
|
59
65
|
this.navigateInternal(this.href);
|
|
60
66
|
break;
|
|
61
|
-
case 'external':
|
|
62
|
-
case 'pdf':
|
|
63
|
-
this.openExternal(this.href);
|
|
64
|
-
break;
|
|
65
67
|
case 'anchor':
|
|
68
|
+
event.preventDefault();
|
|
66
69
|
this.scrollToAnchor(this.href);
|
|
67
70
|
break;
|
|
68
71
|
case 'nolink':
|
|
69
|
-
|
|
72
|
+
event.preventDefault();
|
|
70
73
|
break;
|
|
74
|
+
case 'external':
|
|
75
|
+
case 'pdf':
|
|
71
76
|
default:
|
|
72
|
-
|
|
77
|
+
break;
|
|
73
78
|
}
|
|
74
79
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
setupAttributes() {
|
|
81
|
+
const element = this.elRef.nativeElement;
|
|
82
|
+
const resolvedHref = this.resolveHref();
|
|
83
|
+
if (!resolvedHref)
|
|
78
84
|
return;
|
|
85
|
+
element.setAttribute('href', resolvedHref);
|
|
86
|
+
if (this.linkType === 'external' || this.linkType === 'pdf') {
|
|
87
|
+
element.setAttribute('target', '_blank');
|
|
88
|
+
element.setAttribute('rel', 'noopener noreferrer nofollow');
|
|
79
89
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
90
|
+
}
|
|
91
|
+
resolveHref() {
|
|
92
|
+
if (!this.href)
|
|
93
|
+
return '';
|
|
94
|
+
// si ya es absoluta, no tocarla
|
|
95
|
+
if (this.href.startsWith('/')) {
|
|
96
|
+
return this.href;
|
|
97
|
+
}
|
|
98
|
+
if (this.linkType === 'internal') {
|
|
99
|
+
const lang = this.getCurrentLang();
|
|
100
|
+
return `/${lang}/${this.href}`;
|
|
83
101
|
}
|
|
102
|
+
return this.href;
|
|
84
103
|
}
|
|
85
104
|
navigateInternal(url) {
|
|
86
|
-
|
|
105
|
+
// si ya es absoluta, navega directamente
|
|
106
|
+
if (url.startsWith('/')) {
|
|
107
|
+
this.router.navigateByUrl(url);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const lang = this.getCurrentLang();
|
|
87
111
|
this.anchorClicked.emit();
|
|
88
|
-
this.router.
|
|
112
|
+
this.router.navigate(['/', lang, url]);
|
|
89
113
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
114
|
+
getCurrentLang() {
|
|
115
|
+
const firstSegment = this.router.url.split('?')[0].split('#')[0].split('/')[1];
|
|
116
|
+
return firstSegment || 'es';
|
|
94
117
|
}
|
|
95
118
|
scrollToAnchor(id) {
|
|
96
|
-
if (
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
disableLink() {
|
|
110
|
-
const element = this.elRef.nativeElement;
|
|
111
|
-
const parentLi = element.closest('li');
|
|
112
|
-
const isInMenu = parentLi?.classList.contains('menu-item-has-children');
|
|
113
|
-
if (!isInMenu) {
|
|
114
|
-
element.removeAttribute('href');
|
|
115
|
-
element.setAttribute('aria-disabled', 'true');
|
|
116
|
-
element.setAttribute('tabindex', '-1');
|
|
117
|
-
element.style.cursor = 'default';
|
|
118
|
-
element.style.pointerEvents = 'none';
|
|
119
|
-
}
|
|
119
|
+
if (!this.isBrowser)
|
|
120
|
+
return;
|
|
121
|
+
const cleanId = id.replace(/^#/, '');
|
|
122
|
+
const el = document.getElementById(cleanId);
|
|
123
|
+
if (!el)
|
|
124
|
+
return;
|
|
125
|
+
const yOffset = -160;
|
|
126
|
+
const y = el.getBoundingClientRect().top + window.scrollY + yOffset;
|
|
127
|
+
window.scrollTo({
|
|
128
|
+
top: y,
|
|
129
|
+
behavior: 'smooth',
|
|
130
|
+
});
|
|
131
|
+
this.anchorClicked.emit();
|
|
120
132
|
}
|
|
121
|
-
static
|
|
122
|
-
static
|
|
133
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinkTypeDirective, deps: [{ token: i1.Router }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
134
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.19", type: LinkTypeDirective, isStandalone: true, selector: "[linkType]", inputs: { linkType: "linkType", href: "href" }, outputs: { anchorClicked: "anchorClicked" }, host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 });
|
|
123
135
|
}
|
|
124
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinkTypeDirective, decorators: [{
|
|
125
137
|
type: Directive,
|
|
126
138
|
args: [{
|
|
127
139
|
selector: '[linkType]',
|
|
@@ -139,10 +151,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
139
151
|
}] } });
|
|
140
152
|
|
|
141
153
|
class HeroSectionComponent {
|
|
142
|
-
|
|
143
|
-
|
|
154
|
+
pretitle;
|
|
155
|
+
title;
|
|
156
|
+
subtitle;
|
|
157
|
+
text;
|
|
158
|
+
buttons;
|
|
159
|
+
highlight;
|
|
160
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeroSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
161
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: HeroSectionComponent, isStandalone: true, selector: "lib-hero-section", inputs: { pretitle: "pretitle", title: "title", subtitle: "subtitle", text: "text", buttons: "buttons", highlight: "highlight" }, ngImport: i0, template: "<div class=\"hero-section\">\n @if (pretitle) {\n <h2 class=\"pretitle\">{{ pretitle }}</h2>\n }\n @if (title) {\n <h1 class=\"title\">\n @if (highlight && title.includes(highlight)) {\n {{ title.replace(highlight, '') }}\n <span class=\"highlight-text\">\n {{ highlight }}\n <div class=\"wave-wrapper\">\n <div class=\"wave\"></div>\n </div>\n </span>\n } @else {\n {{ title }}\n }\n </h1>\n }\n @if (subtitle) {\n <h2 class=\"subtitle\">{{ subtitle }}</h2>\n }\n @if (text) {\n <p class=\"text\">{{ text }}</p>\n }\n @if (buttons && buttons.length > 0) {\n <div class=\"buttons\">\n @for (button of buttons; track $index) {\n <a class=\"btn btn-link\" [href]=\"button.url\" [linkType]=\"button.linkType\">\n <span>{{ button.icon }}</span>\n {{ button.label }}\n </a>\n }\n </div>\n }\n</div>\n", styles: [":host{display:flex;flex:1 1 auto;height:100%}.hero-section{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;padding:2rem}.buttons{display:flex;flex-wrap:wrap;justify-content:center}.title{text-transform:uppercase;font-size:4.5rem}.title .highlight-text{cursor:help;display:inline;position:relative;z-index:99}.title .highlight-text .wave-wrapper{position:absolute;top:90%;left:0;width:100%;height:30px;z-index:-1}.title .highlight-text .wave{position:absolute;background-image:url('data:image/svg+xml,<?xml version=\"1.0\" encoding=\"utf-8\"?>%0A<!-- Generator: Adobe Illustrator 26.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->%0A<svg version=\"1.1\" id=\"Calque_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"%0A%09 viewBox=\"0 0 27.6 8.4\" style=\"enable-background:new 0 0 27.6 8.4;\" xml:space=\"preserve\">%0A<style type=\"text/css\">%0A%09.st0{fill:none;stroke:%23FFFFFF;stroke-width:2;stroke-miterlimit:10;}%0A<\\/style>%0A<path class=\"st0\" d=\"M0,1c2.7,0,5.2,1.2,6.9,3.2s4.2,3.2,6.9,3.2c2.7,0,5.2-1.2,6.9-3.2S24.9,1,27.6,1\"/>%0A</svg>%0A');background-repeat:repeat-x;background-position-x:0;background-position-y:0;top:-1.2rem;opacity:.5;width:100%;height:50%}.title .highlight-text:hover .wave{animation:moveWave 5s infinite linear}@media (max-width: 768px){.title .highlight-text{display:block;margin-top:.5rem}}@keyframes moveWave{0%{background-position-x:0}to{background-position-x:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
144
162
|
}
|
|
145
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
163
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeroSectionComponent, decorators: [{
|
|
146
164
|
type: Component,
|
|
147
165
|
args: [{ selector: 'lib-hero-section', standalone: true, imports: [CommonModule, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"hero-section\">\n @if (pretitle) {\n <h2 class=\"pretitle\">{{ pretitle }}</h2>\n }\n @if (title) {\n <h1 class=\"title\">\n @if (highlight && title.includes(highlight)) {\n {{ title.replace(highlight, '') }}\n <span class=\"highlight-text\">\n {{ highlight }}\n <div class=\"wave-wrapper\">\n <div class=\"wave\"></div>\n </div>\n </span>\n } @else {\n {{ title }}\n }\n </h1>\n }\n @if (subtitle) {\n <h2 class=\"subtitle\">{{ subtitle }}</h2>\n }\n @if (text) {\n <p class=\"text\">{{ text }}</p>\n }\n @if (buttons && buttons.length > 0) {\n <div class=\"buttons\">\n @for (button of buttons; track $index) {\n <a class=\"btn btn-link\" [href]=\"button.url\" [linkType]=\"button.linkType\">\n <span>{{ button.icon }}</span>\n {{ button.label }}\n </a>\n }\n </div>\n }\n</div>\n", styles: [":host{display:flex;flex:1 1 auto;height:100%}.hero-section{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;padding:2rem}.buttons{display:flex;flex-wrap:wrap;justify-content:center}.title{text-transform:uppercase;font-size:4.5rem}.title .highlight-text{cursor:help;display:inline;position:relative;z-index:99}.title .highlight-text .wave-wrapper{position:absolute;top:90%;left:0;width:100%;height:30px;z-index:-1}.title .highlight-text .wave{position:absolute;background-image:url('data:image/svg+xml,<?xml version=\"1.0\" encoding=\"utf-8\"?>%0A<!-- Generator: Adobe Illustrator 26.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->%0A<svg version=\"1.1\" id=\"Calque_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"%0A%09 viewBox=\"0 0 27.6 8.4\" style=\"enable-background:new 0 0 27.6 8.4;\" xml:space=\"preserve\">%0A<style type=\"text/css\">%0A%09.st0{fill:none;stroke:%23FFFFFF;stroke-width:2;stroke-miterlimit:10;}%0A<\\/style>%0A<path class=\"st0\" d=\"M0,1c2.7,0,5.2,1.2,6.9,3.2s4.2,3.2,6.9,3.2c2.7,0,5.2-1.2,6.9-3.2S24.9,1,27.6,1\"/>%0A</svg>%0A');background-repeat:repeat-x;background-position-x:0;background-position-y:0;top:-1.2rem;opacity:.5;width:100%;height:50%}.title .highlight-text:hover .wave{animation:moveWave 5s infinite linear}@media (max-width: 768px){.title .highlight-text{display:block;margin-top:.5rem}}@keyframes moveWave{0%{background-position-x:0}to{background-position-x:100%}}\n"] }]
|
|
148
166
|
}], propDecorators: { pretitle: [{
|
|
@@ -183,10 +201,15 @@ const Default = {
|
|
|
183
201
|
};
|
|
184
202
|
|
|
185
203
|
class SectionIntroComponent {
|
|
186
|
-
|
|
187
|
-
|
|
204
|
+
pretitle;
|
|
205
|
+
title;
|
|
206
|
+
subtitle;
|
|
207
|
+
text;
|
|
208
|
+
button;
|
|
209
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SectionIntroComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
210
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: SectionIntroComponent, isStandalone: true, selector: "lib-section-intro", inputs: { pretitle: "pretitle", title: "title", subtitle: "subtitle", text: "text", button: "button" }, ngImport: i0, template: "<div class=\"section-intro\">\n @if (pretitle) {\n <h2 class=\"pretitle\">{{ pretitle }}</h2>\n }\n @if (title) {\n <h1 class=\"title\">{{ title }}</h1>\n }\n @if (subtitle) {\n <h2 class=\"subtitle\">{{ subtitle }}</h2>\n }\n @if (text) {\n <p class=\"text\">{{ text }}</p>\n }\n @if (button) {\n <a [href]=\"button.url\" [linkType]=\"button.linkType\" class=\"btn btn-link\">\n {{ button.label }}\n </a>\n }\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.section-intro{text-align:start;padding:2rem 10rem;align-items:start}@media (max-width: 768px){.section-intro{padding:2rem 4rem}}.title,.subtitle{text-transform:uppercase}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
188
211
|
}
|
|
189
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SectionIntroComponent, decorators: [{
|
|
190
213
|
type: Component,
|
|
191
214
|
args: [{ selector: 'lib-section-intro', standalone: true, imports: [CommonModule, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"section-intro\">\n @if (pretitle) {\n <h2 class=\"pretitle\">{{ pretitle }}</h2>\n }\n @if (title) {\n <h1 class=\"title\">{{ title }}</h1>\n }\n @if (subtitle) {\n <h2 class=\"subtitle\">{{ subtitle }}</h2>\n }\n @if (text) {\n <p class=\"text\">{{ text }}</p>\n }\n @if (button) {\n <a [href]=\"button.url\" [linkType]=\"button.linkType\" class=\"btn btn-link\">\n {{ button.label }}\n </a>\n }\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.section-intro{text-align:start;padding:2rem 10rem;align-items:start}@media (max-width: 768px){.section-intro{padding:2rem 4rem}}.title,.subtitle{text-transform:uppercase}\n"] }]
|
|
192
215
|
}], propDecorators: { pretitle: [{
|
|
@@ -201,53 +224,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
201
224
|
type: Input
|
|
202
225
|
}] } });
|
|
203
226
|
|
|
204
|
-
Swiper.use([Navigation, Pagination, Autoplay]);
|
|
205
|
-
class SwiperDirective {
|
|
206
|
-
constructor(el) {
|
|
207
|
-
this.el = el;
|
|
208
|
-
}
|
|
209
|
-
ngAfterViewInit() {
|
|
210
|
-
this.swiperInstance = new Swiper(this.el.nativeElement, {
|
|
211
|
-
spaceBetween: 16,
|
|
212
|
-
navigation: {
|
|
213
|
-
nextEl: '.swiper-button-next',
|
|
214
|
-
prevEl: '.swiper-button-prev',
|
|
215
|
-
},
|
|
216
|
-
pagination: { clickable: true },
|
|
217
|
-
breakpoints: {
|
|
218
|
-
0: { slidesPerView: 1 }, // móviles
|
|
219
|
-
480: { slidesPerView: 1 }, // small tablets
|
|
220
|
-
768: { slidesPerView: 3 }, // tablets
|
|
221
|
-
1024: { slidesPerView: 4 }, // laptops
|
|
222
|
-
1280: { slidesPerView: 7 }, // desktop → máximo 7
|
|
223
|
-
},
|
|
224
|
-
...this.swiperConfig,
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
ngOnDestroy() {
|
|
228
|
-
this.swiperInstance?.destroy(true, true);
|
|
229
|
-
}
|
|
230
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwiperDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
231
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SwiperDirective, isStandalone: true, selector: "[appSwiper]", inputs: { swiperConfig: "swiperConfig" }, ngImport: i0 }); }
|
|
232
|
-
}
|
|
233
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwiperDirective, decorators: [{
|
|
234
|
-
type: Directive,
|
|
235
|
-
args: [{
|
|
236
|
-
selector: '[appSwiper]',
|
|
237
|
-
standalone: true,
|
|
238
|
-
}]
|
|
239
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { swiperConfig: [{
|
|
240
|
-
type: Input
|
|
241
|
-
}] } });
|
|
242
|
-
|
|
243
227
|
class LegalFooterComponent {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
228
|
+
year;
|
|
229
|
+
brand;
|
|
230
|
+
credits;
|
|
231
|
+
links;
|
|
232
|
+
variant = 'simple';
|
|
233
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LegalFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
234
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: LegalFooterComponent, isStandalone: true, selector: "lib-legal-footer", inputs: { year: "year", brand: "brand", credits: "credits", links: "links", variant: "variant" }, ngImport: i0, template: "<div class=\"legal-footer\" [ngClass]=\"variant\">\n <!-- Variante simple -->\n @if (variant === 'simple') {\n <div class=\"legal-footer__simple\">\n <span class=\"legal-footer__simple-brand\">\n <b>{{ brand }} \u00A9 {{ year }}</b>\n </span>\n <span class=\"legal-footer__simple-credits\">{{ credits }}</span>\n </div>\n }\n\n <!-- Variante extendida -->\n @if (variant === 'extended') {\n <div class=\"legal-footer__extended\">\n <span class=\"legal-footer__year\">\n <b>{{ brand }} \u00A9 {{ year }}</b>\n </span>\n\n <div class=\"legal-footer__right\">\n @if (links?.length) {\n <ul class=\"legal-footer__links\">\n @for (link of links; track $index) {\n <li>\n <a [href]=\"link.url\">{{ link.label }}</a>\n </li>\n }\n <li class=\"legal-footer__credits\">{{ credits }}</li>\n </ul>\n }\n </div>\n </div>\n }\n</div>\n", styles: [":root[data-theme=dark]{color-scheme:dark;--color-primary: #007bff;--color-secondary: #8a94a1;--color-text: #f3f4f6;--color-bg: #0f0f10;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #2b3035;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #f3f4f6;--button-link-text-hover: #79b6ff;--header-clear-bg: #0f0f10;--header-mobile-bg: #0f0f10;--header-logo-text: #f9f9f9;--modal-bg: #17181a;--close-btn: #f3f4f6;--item-text: #f3f4f6;--progress-color: #f9f9f9;--progress-bg: #79b6ff;--footer-bg: #0f0f10;--footer-text: #f3f4f6;--footer-text-hover: #79b6ff;--footer-links: #f3f4f6;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #0f0f10;--footer-arrows-bg: #dddddd;--footer-arrows-bg-hover: #f3f3f3}:root,:root[data-theme=light]{color-scheme:light;--color-primary: #007bff;--color-secondary: #6c757d;--color-text: #111111;--color-bg: #f9f9f9;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #6c757d;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #111111;--button-link-text-hover: #007bff;--header-clear-bg: #007bff;--header-mobile-bg: #007bff;--header-logo-text: #f9f9f9;--modal-bg: #f9f9f9;--close-btn: #111111;--item-text: #111111;--progress-color: #79b6ff;--progress-bg: #dde8f5;--footer-bg: #dadada;--footer-text: #000;--footer-text-hover: #79b6ff;--footer-links: #000;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #fff;--footer-arrows-bg: #b6b6b6;--footer-arrows-bg-hover: #8b8a8a}:root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.legal-footer{font-size:var(--font-size-base);padding:1rem 0;text-align:center;background-color:var(--footer-bg)}.legal-footer__simple{display:flex;justify-content:space-between;gap:1rem;color:var(--footer-text)}.legal-footer__simple-brand{margin-left:3rem}.legal-footer__simple-credits{margin-right:3rem}.legal-footer__extended{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}@media (max-width: 480px){.legal-footer__extended{flex-direction:column;align-items:flex-start;width:100%}.legal-footer__extended .legal-footer__right{display:block!important;width:100%}.legal-footer__extended .legal-footer__links{display:block;width:100%;gap:0!important}.legal-footer__extended .legal-footer__links li{width:80%;padding:1rem;margin:0 2rem;border-bottom:1px solid var(--footer-links)}.legal-footer__extended .legal-footer__links li a{display:block;width:100%;text-align:left}.legal-footer__extended .legal-footer__year,.legal-footer__extended .legal-footer__credits{width:80%;padding:1rem;margin:0 2rem;border-bottom:1px solid var(--footer-links);display:grid;justify-content:flex-start}.legal-footer__extended .legal-footer__credits{border-bottom:none}}@media (min-width: 768px){.legal-footer__extended{flex-direction:column;align-items:flex-start;width:100%}.legal-footer__extended .legal-footer__right{display:block!important;width:100%}.legal-footer__extended .legal-footer__links{display:grid;grid-template-columns:1fr 1fr;gap:0 1rem!important;width:100%}.legal-footer__extended .legal-footer__links li{width:75%;padding:1rem 0;margin:0 3rem;border-bottom:1px solid var(--footer-links)}.legal-footer__extended .legal-footer__links li a{display:block;width:100%;text-align:left}.legal-footer__extended .legal-footer__year{width:37%;padding:1rem 0;margin:0 3rem;border-bottom:1px solid var(--footer-links);display:grid;justify-content:flex-start}.legal-footer__extended .legal-footer__credits{display:grid;justify-content:flex-start}}@media (min-width: 1024px){.legal-footer__extended{flex-direction:row;justify-content:space-between;align-items:center}.legal-footer__extended .legal-footer__year{border:none;margin-left:3rem;padding:0;width:auto}.legal-footer__extended .legal-footer__right{display:flex;align-items:center;gap:2rem;width:auto}.legal-footer__extended .legal-footer__links{display:flex;gap:1.5rem;margin:0;padding:0;list-style:none;justify-content:right}.legal-footer__extended .legal-footer__links li{border:none;margin:0;padding:0;width:auto}.legal-footer__extended .legal-footer__links li a{text-align:left;padding:0}.legal-footer__extended .legal-footer__credits{margin-right:3rem!important;padding:0}}.legal-footer .legal-footer__right{display:flex;align-items:center;gap:1.5rem;flex:1}.legal-footer .legal-footer__links{list-style:none;margin:0;padding:0}.legal-footer .legal-footer__links a{text-decoration:none;color:var(--footer-links)}.legal-footer .legal-footer__links a:hover{color:var(--footer-links-hover);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
249
235
|
}
|
|
250
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
236
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LegalFooterComponent, decorators: [{
|
|
251
237
|
type: Component,
|
|
252
238
|
args: [{ selector: 'lib-legal-footer', standalone: true, imports: [CommonModule, LinkTypeDirective], template: "<div class=\"legal-footer\" [ngClass]=\"variant\">\n <!-- Variante simple -->\n @if (variant === 'simple') {\n <div class=\"legal-footer__simple\">\n <span class=\"legal-footer__simple-brand\">\n <b>{{ brand }} \u00A9 {{ year }}</b>\n </span>\n <span class=\"legal-footer__simple-credits\">{{ credits }}</span>\n </div>\n }\n\n <!-- Variante extendida -->\n @if (variant === 'extended') {\n <div class=\"legal-footer__extended\">\n <span class=\"legal-footer__year\">\n <b>{{ brand }} \u00A9 {{ year }}</b>\n </span>\n\n <div class=\"legal-footer__right\">\n @if (links?.length) {\n <ul class=\"legal-footer__links\">\n @for (link of links; track $index) {\n <li>\n <a [href]=\"link.url\">{{ link.label }}</a>\n </li>\n }\n <li class=\"legal-footer__credits\">{{ credits }}</li>\n </ul>\n }\n </div>\n </div>\n }\n</div>\n", styles: [":root[data-theme=dark]{color-scheme:dark;--color-primary: #007bff;--color-secondary: #8a94a1;--color-text: #f3f4f6;--color-bg: #0f0f10;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #2b3035;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #f3f4f6;--button-link-text-hover: #79b6ff;--header-clear-bg: #0f0f10;--header-mobile-bg: #0f0f10;--header-logo-text: #f9f9f9;--modal-bg: #17181a;--close-btn: #f3f4f6;--item-text: #f3f4f6;--progress-color: #f9f9f9;--progress-bg: #79b6ff;--footer-bg: #0f0f10;--footer-text: #f3f4f6;--footer-text-hover: #79b6ff;--footer-links: #f3f4f6;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #0f0f10;--footer-arrows-bg: #dddddd;--footer-arrows-bg-hover: #f3f3f3}:root,:root[data-theme=light]{color-scheme:light;--color-primary: #007bff;--color-secondary: #6c757d;--color-text: #111111;--color-bg: #f9f9f9;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #6c757d;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #111111;--button-link-text-hover: #007bff;--header-clear-bg: #007bff;--header-mobile-bg: #007bff;--header-logo-text: #f9f9f9;--modal-bg: #f9f9f9;--close-btn: #111111;--item-text: #111111;--progress-color: #79b6ff;--progress-bg: #dde8f5;--footer-bg: #dadada;--footer-text: #000;--footer-text-hover: #79b6ff;--footer-links: #000;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #fff;--footer-arrows-bg: #b6b6b6;--footer-arrows-bg-hover: #8b8a8a}:root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.legal-footer{font-size:var(--font-size-base);padding:1rem 0;text-align:center;background-color:var(--footer-bg)}.legal-footer__simple{display:flex;justify-content:space-between;gap:1rem;color:var(--footer-text)}.legal-footer__simple-brand{margin-left:3rem}.legal-footer__simple-credits{margin-right:3rem}.legal-footer__extended{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}@media (max-width: 480px){.legal-footer__extended{flex-direction:column;align-items:flex-start;width:100%}.legal-footer__extended .legal-footer__right{display:block!important;width:100%}.legal-footer__extended .legal-footer__links{display:block;width:100%;gap:0!important}.legal-footer__extended .legal-footer__links li{width:80%;padding:1rem;margin:0 2rem;border-bottom:1px solid var(--footer-links)}.legal-footer__extended .legal-footer__links li a{display:block;width:100%;text-align:left}.legal-footer__extended .legal-footer__year,.legal-footer__extended .legal-footer__credits{width:80%;padding:1rem;margin:0 2rem;border-bottom:1px solid var(--footer-links);display:grid;justify-content:flex-start}.legal-footer__extended .legal-footer__credits{border-bottom:none}}@media (min-width: 768px){.legal-footer__extended{flex-direction:column;align-items:flex-start;width:100%}.legal-footer__extended .legal-footer__right{display:block!important;width:100%}.legal-footer__extended .legal-footer__links{display:grid;grid-template-columns:1fr 1fr;gap:0 1rem!important;width:100%}.legal-footer__extended .legal-footer__links li{width:75%;padding:1rem 0;margin:0 3rem;border-bottom:1px solid var(--footer-links)}.legal-footer__extended .legal-footer__links li a{display:block;width:100%;text-align:left}.legal-footer__extended .legal-footer__year{width:37%;padding:1rem 0;margin:0 3rem;border-bottom:1px solid var(--footer-links);display:grid;justify-content:flex-start}.legal-footer__extended .legal-footer__credits{display:grid;justify-content:flex-start}}@media (min-width: 1024px){.legal-footer__extended{flex-direction:row;justify-content:space-between;align-items:center}.legal-footer__extended .legal-footer__year{border:none;margin-left:3rem;padding:0;width:auto}.legal-footer__extended .legal-footer__right{display:flex;align-items:center;gap:2rem;width:auto}.legal-footer__extended .legal-footer__links{display:flex;gap:1.5rem;margin:0;padding:0;list-style:none;justify-content:right}.legal-footer__extended .legal-footer__links li{border:none;margin:0;padding:0;width:auto}.legal-footer__extended .legal-footer__links li a{text-align:left;padding:0}.legal-footer__extended .legal-footer__credits{margin-right:3rem!important;padding:0}}.legal-footer .legal-footer__right{display:flex;align-items:center;gap:1.5rem;flex:1}.legal-footer .legal-footer__links{list-style:none;margin:0;padding:0}.legal-footer .legal-footer__links a{text-decoration:none;color:var(--footer-links)}.legal-footer .legal-footer__links a:hover{color:var(--footer-links-hover);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}\n"] }]
|
|
253
239
|
}], propDecorators: { year: [{
|
|
@@ -263,10 +249,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
263
249
|
}] } });
|
|
264
250
|
|
|
265
251
|
class LinksFooterComponent {
|
|
266
|
-
|
|
267
|
-
static
|
|
252
|
+
links;
|
|
253
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinksFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
254
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: LinksFooterComponent, isStandalone: true, selector: "lib-links-footer", inputs: { links: "links" }, ngImport: i0, template: "@if (links) {\n <div class=\"links-footer\">\n <ul>\n @for (link of links; track $index) {\n <li>\n <a [href]=\"link.url\" [linkType]=\"link.linkType\" class=\"btn btn-link\">\n {{ link.label }}\n </a>\n </li>\n }\n </ul>\n </div>\n}\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.links-footer ul{display:flex;gap:.5rem;list-style:none;padding:0;margin:0;justify-content:center;flex-wrap:wrap}.links-footer ul li{position:relative}.links-footer ul li:before{content:\"\";position:absolute;display:block;height:15px;width:1px;background-color:var(--button-link-text);left:0;top:50%;transform:translateY(-50%)}.links-footer ul li:first-child:before{content:none}.links-footer a.btn-link{font-weight:400;font-size:.9rem;text-decoration:none;color:var(--button-link-text)}.links-footer a.btn-link:after{content:none!important}.links-footer a.btn-link:hover{color:var(--button-link-text-hover);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
268
255
|
}
|
|
269
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinksFooterComponent, decorators: [{
|
|
270
257
|
type: Component,
|
|
271
258
|
args: [{ selector: 'lib-links-footer', standalone: true, imports: [CommonModule, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (links) {\n <div class=\"links-footer\">\n <ul>\n @for (link of links; track $index) {\n <li>\n <a [href]=\"link.url\" [linkType]=\"link.linkType\" class=\"btn btn-link\">\n {{ link.label }}\n </a>\n </li>\n }\n </ul>\n </div>\n}\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.links-footer ul{display:flex;gap:.5rem;list-style:none;padding:0;margin:0;justify-content:center;flex-wrap:wrap}.links-footer ul li{position:relative}.links-footer ul li:before{content:\"\";position:absolute;display:block;height:15px;width:1px;background-color:var(--button-link-text);left:0;top:50%;transform:translateY(-50%)}.links-footer ul li:first-child:before{content:none}.links-footer a.btn-link{font-weight:400;font-size:.9rem;text-decoration:none;color:var(--button-link-text)}.links-footer a.btn-link:after{content:none!important}.links-footer a.btn-link:hover{color:var(--button-link-text-hover);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}\n"] }]
|
|
272
259
|
}], propDecorators: { links: [{
|
|
@@ -277,13 +264,14 @@ const icons = {
|
|
|
277
264
|
ArrowUpRight,
|
|
278
265
|
ArrowRight,
|
|
279
266
|
ArrowLeft,
|
|
267
|
+
Twitter
|
|
280
268
|
};
|
|
281
269
|
class IconsModule {
|
|
282
|
-
static
|
|
283
|
-
static
|
|
284
|
-
static
|
|
270
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
271
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, imports: [i1$2.LucideAngularModule], exports: [LucideAngularModule] });
|
|
272
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, imports: [LucideAngularModule.pick(icons), LucideAngularModule] });
|
|
285
273
|
}
|
|
286
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
274
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, decorators: [{
|
|
287
275
|
type: NgModule,
|
|
288
276
|
args: [{
|
|
289
277
|
imports: [LucideAngularModule.pick(icons)],
|
|
@@ -291,31 +279,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
291
279
|
}]
|
|
292
280
|
}] });
|
|
293
281
|
|
|
294
|
-
const brandIcons = {
|
|
295
|
-
instagram: siInstagram,
|
|
296
|
-
facebook: siFacebook,
|
|
297
|
-
tiktok: siTiktok,
|
|
298
|
-
youtube: siYoutube,
|
|
299
|
-
twitter: siX,
|
|
300
|
-
x: siX,
|
|
301
|
-
};
|
|
302
282
|
class UiIconComponent {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
283
|
+
name;
|
|
284
|
+
size = 24;
|
|
285
|
+
color = 'currentColor';
|
|
286
|
+
icon;
|
|
287
|
+
ngOnChanges() {
|
|
288
|
+
this.icon = this.resolveBrandIcon();
|
|
306
289
|
}
|
|
307
290
|
get isBrandIcon() {
|
|
308
|
-
return !!
|
|
291
|
+
return !!this.icon;
|
|
309
292
|
}
|
|
310
293
|
get brandIcon() {
|
|
311
|
-
return
|
|
294
|
+
return this.icon ?? null;
|
|
312
295
|
}
|
|
313
|
-
|
|
314
|
-
|
|
296
|
+
resolveBrandIcon() {
|
|
297
|
+
if (!this.name)
|
|
298
|
+
return null;
|
|
299
|
+
const key = 'si' + this.name.replace(/[^a-z0-9]/gi, '').replace(/^\w/, (c) => c.toUpperCase());
|
|
300
|
+
return simpleIcons[key] ?? null;
|
|
301
|
+
}
|
|
302
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: UiIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
303
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.19", type: UiIconComponent, isStandalone: true, selector: "ui-icon", inputs: { name: "name", size: "size", color: "color" }, usesOnChanges: true, ngImport: i0, template: "<!-- SimpleIcons -->\n<ng-container *ngIf=\"isBrandIcon; else lucideIcon\">\n <svg\n class=\"ui-icon ui-icon--brand\"\n [attr.width]=\"size\"\n [attr.height]=\"size\"\n [attr.fill]=\"color\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path [attr.d]=\"brandIcon?.path\"></path>\n </svg>\n</ng-container>\n\n<!-- Lucide -->\n<ng-template #lucideIcon>\n <lucide-icon\n class=\"ui-icon ui-icon--lucide\"\n [name]=\"name\"\n [size]=\"size\"\n [color]=\"color\"\n ></lucide-icon>\n</ng-template>\n", styles: [".ui-icon{display:inline-flex;align-items:center;justify-content:center;line-height:0;flex-shrink:0}.ui-icon--brand svg{display:block;width:100%!important;height:100%!important}.ui-icon--lucide{display:inline-flex}.ui-icon--lucide svg{display:block;width:100%!important;height:100%!important;min-width:1em;min-height:1em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IconsModule }, { kind: "component", type: i1$2.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] });
|
|
315
304
|
}
|
|
316
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
305
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: UiIconComponent, decorators: [{
|
|
317
306
|
type: Component,
|
|
318
|
-
args: [{ selector: 'ui-icon', standalone: true, imports: [CommonModule, IconsModule], template: "<!-- SimpleIcons -->\n<ng-container *ngIf=\"isBrandIcon; else lucideIcon\">\n <svg\n class=\"ui-icon ui-icon--brand\"\n [attr.width]=\"size\"\n [attr.height]=\"size\"\n [attr.fill]=\"color\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path [attr.d]=\"brandIcon
|
|
307
|
+
args: [{ selector: 'ui-icon', standalone: true, imports: [CommonModule, IconsModule], template: "<!-- SimpleIcons -->\n<ng-container *ngIf=\"isBrandIcon; else lucideIcon\">\n <svg\n class=\"ui-icon ui-icon--brand\"\n [attr.width]=\"size\"\n [attr.height]=\"size\"\n [attr.fill]=\"color\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path [attr.d]=\"brandIcon?.path\"></path>\n </svg>\n</ng-container>\n\n<!-- Lucide -->\n<ng-template #lucideIcon>\n <lucide-icon\n class=\"ui-icon ui-icon--lucide\"\n [name]=\"name\"\n [size]=\"size\"\n [color]=\"color\"\n ></lucide-icon>\n</ng-template>\n", styles: [".ui-icon{display:inline-flex;align-items:center;justify-content:center;line-height:0;flex-shrink:0}.ui-icon--brand svg{display:block;width:100%!important;height:100%!important}.ui-icon--lucide{display:inline-flex}.ui-icon--lucide svg{display:block;width:100%!important;height:100%!important;min-width:1em;min-height:1em}\n"] }]
|
|
319
308
|
}], propDecorators: { name: [{
|
|
320
309
|
type: Input
|
|
321
310
|
}], size: [{
|
|
@@ -324,11 +313,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
324
313
|
type: Input
|
|
325
314
|
}] } });
|
|
326
315
|
|
|
316
|
+
Swiper.use([Navigation, Pagination, Autoplay]);
|
|
317
|
+
class SwiperDirective {
|
|
318
|
+
el;
|
|
319
|
+
swiperConfig;
|
|
320
|
+
swiperInstance;
|
|
321
|
+
constructor(el) {
|
|
322
|
+
this.el = el;
|
|
323
|
+
}
|
|
324
|
+
ngAfterViewInit() {
|
|
325
|
+
this.swiperInstance = new Swiper(this.el.nativeElement, {
|
|
326
|
+
spaceBetween: 16,
|
|
327
|
+
navigation: {
|
|
328
|
+
nextEl: '.swiper-button-next',
|
|
329
|
+
prevEl: '.swiper-button-prev',
|
|
330
|
+
},
|
|
331
|
+
pagination: { clickable: true },
|
|
332
|
+
breakpoints: {
|
|
333
|
+
0: { slidesPerView: 1 }, // móviles
|
|
334
|
+
480: { slidesPerView: 1 }, // small tablets
|
|
335
|
+
768: { slidesPerView: 3 }, // tablets
|
|
336
|
+
1024: { slidesPerView: 4 }, // laptops
|
|
337
|
+
1280: { slidesPerView: 7 }, // desktop → máximo 7
|
|
338
|
+
},
|
|
339
|
+
...this.swiperConfig,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
ngOnDestroy() {
|
|
343
|
+
this.swiperInstance?.destroy(true, true);
|
|
344
|
+
}
|
|
345
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SwiperDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
346
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.19", type: SwiperDirective, isStandalone: true, selector: "[appSwiper]", inputs: { swiperConfig: "swiperConfig" }, ngImport: i0 });
|
|
347
|
+
}
|
|
348
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SwiperDirective, decorators: [{
|
|
349
|
+
type: Directive,
|
|
350
|
+
args: [{
|
|
351
|
+
selector: '[appSwiper]',
|
|
352
|
+
standalone: true,
|
|
353
|
+
}]
|
|
354
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { swiperConfig: [{
|
|
355
|
+
type: Input
|
|
356
|
+
}] } });
|
|
357
|
+
|
|
327
358
|
class SocialFooterComponent {
|
|
328
|
-
|
|
329
|
-
|
|
359
|
+
images;
|
|
360
|
+
socials;
|
|
361
|
+
hashtag;
|
|
362
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SocialFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
363
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: SocialFooterComponent, isStandalone: true, selector: "lib-social-footer", inputs: { images: "images", socials: "socials", hashtag: "hashtag" }, ngImport: i0, template: "<div class=\"social-footer\">\n <div class=\"social-footer__slider-images swiper\" appSwiper>\n <div class=\"swiper-wrapper\">\n @for (image of images; track $index) {\n <div class=\"swiper-slide\">\n <img [src]=\"image?.url\" [alt]=\"image?.alt || ''\" />\n </div>\n }\n </div>\n <div class=\"swiper-button-prev\">\n <ui-icon name=\"arrow-left\" [size]=\"18\" color=\"#fff\"></ui-icon>\n </div>\n <div class=\"swiper-button-next\">\n <ui-icon name=\"arrow-right\" [size]=\"18\" color=\"#fff\"></ui-icon>\n </div>\n </div>\n\n <div class=\"social-footer__bottom-section\">\n @if (hashtag) {\n <div class=\"social-footer__hashtag\">\n <span>{{ hashtag }}</span>\n </div>\n }\n @if (socials) {\n <div class=\"social-footer__socials\">\n @for (social of socials; track $index) {\n <a [href]=\"social.url\" [attr.aria-label]=\"social.label\" [linkType]=\"social.linkType\">\n @if (social.icon) {\n <ui-icon [name]=\"social.icon\" [size]=\"28\"></ui-icon>\n }\n </a>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":root[data-theme=dark]{color-scheme:dark;--color-primary: #007bff;--color-secondary: #8a94a1;--color-text: #f3f4f6;--color-bg: #0f0f10;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #2b3035;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #f3f4f6;--button-link-text-hover: #79b6ff;--header-clear-bg: #0f0f10;--header-mobile-bg: #0f0f10;--header-logo-text: #f9f9f9;--modal-bg: #17181a;--close-btn: #f3f4f6;--item-text: #f3f4f6;--progress-color: #f9f9f9;--progress-bg: #79b6ff;--footer-bg: #0f0f10;--footer-text: #f3f4f6;--footer-text-hover: #79b6ff;--footer-links: #f3f4f6;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #0f0f10;--footer-arrows-bg: #dddddd;--footer-arrows-bg-hover: #f3f3f3}:root,:root[data-theme=light]{color-scheme:light;--color-primary: #007bff;--color-secondary: #6c757d;--color-text: #111111;--color-bg: #f9f9f9;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #6c757d;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #111111;--button-link-text-hover: #007bff;--header-clear-bg: #007bff;--header-mobile-bg: #007bff;--header-logo-text: #f9f9f9;--modal-bg: #f9f9f9;--close-btn: #111111;--item-text: #111111;--progress-color: #79b6ff;--progress-bg: #dde8f5;--footer-bg: #dadada;--footer-text: #000;--footer-text-hover: #79b6ff;--footer-links: #000;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #fff;--footer-arrows-bg: #b6b6b6;--footer-arrows-bg-hover: #8b8a8a}:root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.social-footer{padding:2rem 1rem;text-align:center}.social-footer__slider-images{margin:0 4rem 2rem;position:relative}.social-footer__slider-images .swiper-wrapper{display:flex;align-items:center}.social-footer__slider-images .swiper-slide{flex:0 0 auto;width:auto}.social-footer__slider-images .swiper-slide img{display:block;border-radius:.75rem;width:160px;height:auto;object-fit:cover}.social-footer__slider-images .swiper-button-prev,.social-footer__slider-images .swiper-button-next{display:flex;align-items:center;justify-content:center;position:absolute;top:50%;transform:translateY(-50%);z-index:10;width:32px;height:32px;border-radius:50%;background:var(--footer-arrows-bg);color:var(--footer-arrows)}.social-footer__slider-images .swiper-button-prev ui-icon,.social-footer__slider-images .swiper-button-prev lucide-icon,.social-footer__slider-images .swiper-button-prev svg,.social-footer__slider-images .swiper-button-next ui-icon,.social-footer__slider-images .swiper-button-next lucide-icon,.social-footer__slider-images .swiper-button-next svg{display:block;width:18px;height:18px}.social-footer__slider-images .swiper-button-prev:hover,.social-footer__slider-images .swiper-button-next:hover{background:var(--footer-arrows-bg-hover);color:var(--footer-arrows-hover)}.social-footer__slider-images .swiper-button-prev{left:-40px}.social-footer__slider-images .swiper-button-next{right:-40px}.social-footer__slider-images .swiper-button-prev:after,.social-footer__slider-images .swiper-button-next:after{content:none!important}.social-footer__bottom-section{display:flex;justify-content:space-between;align-items:flex-end;flex-wrap:wrap;gap:1rem;margin-inline:4rem}@media (max-width: 768px){.social-footer__bottom-section{flex-direction:column;align-items:center;text-align:center}}.social-footer__hashtag{font-size:2rem;font-weight:700}.social-footer__socials{display:flex;gap:1.5rem}.social-footer__socials a{font-size:1.25rem;color:var(--footer-text, #999);transition:color .3s ease}.social-footer__socials a:hover{color:var(--footer-link-hover, #000)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }, { kind: "directive", type: SwiperDirective, selector: "[appSwiper]", inputs: ["swiperConfig"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
330
364
|
}
|
|
331
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
365
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SocialFooterComponent, decorators: [{
|
|
332
366
|
type: Component,
|
|
333
367
|
args: [{ selector: 'lib-social-footer', standalone: true, imports: [CommonModule, LinkTypeDirective, SwiperDirective, UiIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"social-footer\">\n <div class=\"social-footer__slider-images swiper\" appSwiper>\n <div class=\"swiper-wrapper\">\n @for (image of images; track $index) {\n <div class=\"swiper-slide\">\n <img [src]=\"image?.url\" [alt]=\"image?.alt || ''\" />\n </div>\n }\n </div>\n <div class=\"swiper-button-prev\">\n <ui-icon name=\"arrow-left\" [size]=\"18\" color=\"#fff\"></ui-icon>\n </div>\n <div class=\"swiper-button-next\">\n <ui-icon name=\"arrow-right\" [size]=\"18\" color=\"#fff\"></ui-icon>\n </div>\n </div>\n\n <div class=\"social-footer__bottom-section\">\n @if (hashtag) {\n <div class=\"social-footer__hashtag\">\n <span>{{ hashtag }}</span>\n </div>\n }\n @if (socials) {\n <div class=\"social-footer__socials\">\n @for (social of socials; track $index) {\n <a [href]=\"social.url\" [attr.aria-label]=\"social.label\" [linkType]=\"social.linkType\">\n @if (social.icon) {\n <ui-icon [name]=\"social.icon\" [size]=\"28\"></ui-icon>\n }\n </a>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":root[data-theme=dark]{color-scheme:dark;--color-primary: #007bff;--color-secondary: #8a94a1;--color-text: #f3f4f6;--color-bg: #0f0f10;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #2b3035;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #f3f4f6;--button-link-text-hover: #79b6ff;--header-clear-bg: #0f0f10;--header-mobile-bg: #0f0f10;--header-logo-text: #f9f9f9;--modal-bg: #17181a;--close-btn: #f3f4f6;--item-text: #f3f4f6;--progress-color: #f9f9f9;--progress-bg: #79b6ff;--footer-bg: #0f0f10;--footer-text: #f3f4f6;--footer-text-hover: #79b6ff;--footer-links: #f3f4f6;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #0f0f10;--footer-arrows-bg: #dddddd;--footer-arrows-bg-hover: #f3f3f3}:root,:root[data-theme=light]{color-scheme:light;--color-primary: #007bff;--color-secondary: #6c757d;--color-text: #111111;--color-bg: #f9f9f9;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #6c757d;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #111111;--button-link-text-hover: #007bff;--header-clear-bg: #007bff;--header-mobile-bg: #007bff;--header-logo-text: #f9f9f9;--modal-bg: #f9f9f9;--close-btn: #111111;--item-text: #111111;--progress-color: #79b6ff;--progress-bg: #dde8f5;--footer-bg: #dadada;--footer-text: #000;--footer-text-hover: #79b6ff;--footer-links: #000;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #fff;--footer-arrows-bg: #b6b6b6;--footer-arrows-bg-hover: #8b8a8a}:root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.social-footer{padding:2rem 1rem;text-align:center}.social-footer__slider-images{margin:0 4rem 2rem;position:relative}.social-footer__slider-images .swiper-wrapper{display:flex;align-items:center}.social-footer__slider-images .swiper-slide{flex:0 0 auto;width:auto}.social-footer__slider-images .swiper-slide img{display:block;border-radius:.75rem;width:160px;height:auto;object-fit:cover}.social-footer__slider-images .swiper-button-prev,.social-footer__slider-images .swiper-button-next{display:flex;align-items:center;justify-content:center;position:absolute;top:50%;transform:translateY(-50%);z-index:10;width:32px;height:32px;border-radius:50%;background:var(--footer-arrows-bg);color:var(--footer-arrows)}.social-footer__slider-images .swiper-button-prev ui-icon,.social-footer__slider-images .swiper-button-prev lucide-icon,.social-footer__slider-images .swiper-button-prev svg,.social-footer__slider-images .swiper-button-next ui-icon,.social-footer__slider-images .swiper-button-next lucide-icon,.social-footer__slider-images .swiper-button-next svg{display:block;width:18px;height:18px}.social-footer__slider-images .swiper-button-prev:hover,.social-footer__slider-images .swiper-button-next:hover{background:var(--footer-arrows-bg-hover);color:var(--footer-arrows-hover)}.social-footer__slider-images .swiper-button-prev{left:-40px}.social-footer__slider-images .swiper-button-next{right:-40px}.social-footer__slider-images .swiper-button-prev:after,.social-footer__slider-images .swiper-button-next:after{content:none!important}.social-footer__bottom-section{display:flex;justify-content:space-between;align-items:flex-end;flex-wrap:wrap;gap:1rem;margin-inline:4rem}@media (max-width: 768px){.social-footer__bottom-section{flex-direction:column;align-items:center;text-align:center}}.social-footer__hashtag{font-size:2rem;font-weight:700}.social-footer__socials{display:flex;gap:1.5rem}.social-footer__socials a{font-size:1.25rem;color:var(--footer-text, #999);transition:color .3s ease}.social-footer__socials a:hover{color:var(--footer-link-hover, #000)}\n"] }]
|
|
334
368
|
}], propDecorators: { images: [{
|
|
@@ -340,10 +374,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
340
374
|
}] } });
|
|
341
375
|
|
|
342
376
|
class VisualFooterComponent {
|
|
343
|
-
|
|
344
|
-
|
|
377
|
+
contactTitle;
|
|
378
|
+
contactPhone;
|
|
379
|
+
contactEmail;
|
|
380
|
+
addressTitle;
|
|
381
|
+
address;
|
|
382
|
+
socialsTitle;
|
|
383
|
+
socials;
|
|
384
|
+
image;
|
|
385
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: VisualFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
386
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: VisualFooterComponent, isStandalone: true, selector: "lib-visual-footer", inputs: { contactTitle: "contactTitle", contactPhone: "contactPhone", contactEmail: "contactEmail", addressTitle: "addressTitle", address: "address", socialsTitle: "socialsTitle", socials: "socials", image: "image" }, ngImport: i0, template: "<div class=\"visual-footer\">\n <div class=\"visual-footer__texts\">\n <div class=\"visual-footer__contact\">\n @if (contactTitle) {\n <h2 class=\"title\">{{ contactTitle }}</h2>\n }\n @if (contactPhone) {\n <a [href]=\"contactPhone.url\" [linkType]=\"contactPhone.linkType\" class=\"btn btn-link\">\n <span>{{ contactPhone.label }}</span>\n </a>\n }\n @if (contactEmail) {\n <a [href]=\"contactEmail.url\" [linkType]=\"contactEmail.linkType\" class=\"btn btn-link\">\n <span>{{ contactEmail.label }}</span>\n </a>\n }\n </div>\n <div class=\"visual-footer__address\">\n @if (addressTitle) {\n <h2 class=\"title\">{{ addressTitle }}</h2>\n }\n <p class=\"text\">\n <span>{{ address?.address }}</span>\n <span>{{ address?.cp }} {{ address?.city }}</span>\n <span>{{ address?.province }} {{ address?.country }}</span>\n </p>\n </div>\n <div class=\"visual-footer__socials\">\n @if (socialsTitle) {\n <h2 class=\"title\">{{ socialsTitle }}</h2>\n }\n @if (socials) {\n @for (social of socials; track $index) {\n <a [href]=\"social.url\" [linkType]=\"social.linkType\" class=\"btn btn-link\">\n <span>{{ social.label }}</span>\n </a>\n }\n }\n </div>\n </div>\n <div class=\"visual-footer__image\">\n @if (image) {\n <img [src]=\"image.url\" [alt]=\"image.alt\" loading=\"lazy\" />\n }\n </div>\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}:root[data-theme=dark]{color-scheme:dark;--color-primary: #007bff;--color-secondary: #8a94a1;--color-text: #f3f4f6;--color-bg: #0f0f10;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #2b3035;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #f3f4f6;--button-link-text-hover: #79b6ff;--header-clear-bg: #0f0f10;--header-mobile-bg: #0f0f10;--header-logo-text: #f9f9f9;--modal-bg: #17181a;--close-btn: #f3f4f6;--item-text: #f3f4f6;--progress-color: #f9f9f9;--progress-bg: #79b6ff;--footer-bg: #0f0f10;--footer-text: #f3f4f6;--footer-text-hover: #79b6ff;--footer-links: #f3f4f6;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #0f0f10;--footer-arrows-bg: #dddddd;--footer-arrows-bg-hover: #f3f3f3}:root,:root[data-theme=light]{color-scheme:light;--color-primary: #007bff;--color-secondary: #6c757d;--color-text: #111111;--color-bg: #f9f9f9;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #6c757d;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #111111;--button-link-text-hover: #007bff;--header-clear-bg: #007bff;--header-mobile-bg: #007bff;--header-logo-text: #f9f9f9;--modal-bg: #f9f9f9;--close-btn: #111111;--item-text: #111111;--progress-color: #79b6ff;--progress-bg: #dde8f5;--footer-bg: #dadada;--footer-text: #000;--footer-text-hover: #79b6ff;--footer-links: #000;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #fff;--footer-arrows-bg: #b6b6b6;--footer-arrows-bg-hover: #8b8a8a}.visual-footer{display:grid;grid-template-columns:1fr 2fr;gap:2rem;align-items:stretch;padding:4rem;background:var(--footer-bg)}.visual-footer__texts{display:flex;flex-direction:column;gap:2rem}.visual-footer__texts .btn{padding:var(--spacing-sm) 0}.visual-footer__texts .btn-link{display:inline;width:fit-content}.visual-footer__texts .title{font-size:1.5rem}.visual-footer__texts .text{font-weight:300;margin:0;display:flex;flex-direction:column;gap:.25rem}.visual-footer__image img{width:100%;height:auto;border-radius:.5rem;object-fit:cover}.visual-footer__contact,.visual-footer__address,.visual-footer__socials{display:flex;flex-direction:column;gap:.25rem}@media (max-width: 768px){.visual-footer{grid-template-columns:1fr}.visual-footer__image{order:-1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
345
387
|
}
|
|
346
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
388
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: VisualFooterComponent, decorators: [{
|
|
347
389
|
type: Component,
|
|
348
390
|
args: [{ selector: 'lib-visual-footer', standalone: true, imports: [CommonModule, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"visual-footer\">\n <div class=\"visual-footer__texts\">\n <div class=\"visual-footer__contact\">\n @if (contactTitle) {\n <h2 class=\"title\">{{ contactTitle }}</h2>\n }\n @if (contactPhone) {\n <a [href]=\"contactPhone.url\" [linkType]=\"contactPhone.linkType\" class=\"btn btn-link\">\n <span>{{ contactPhone.label }}</span>\n </a>\n }\n @if (contactEmail) {\n <a [href]=\"contactEmail.url\" [linkType]=\"contactEmail.linkType\" class=\"btn btn-link\">\n <span>{{ contactEmail.label }}</span>\n </a>\n }\n </div>\n <div class=\"visual-footer__address\">\n @if (addressTitle) {\n <h2 class=\"title\">{{ addressTitle }}</h2>\n }\n <p class=\"text\">\n <span>{{ address?.address }}</span>\n <span>{{ address?.cp }} {{ address?.city }}</span>\n <span>{{ address?.province }} {{ address?.country }}</span>\n </p>\n </div>\n <div class=\"visual-footer__socials\">\n @if (socialsTitle) {\n <h2 class=\"title\">{{ socialsTitle }}</h2>\n }\n @if (socials) {\n @for (social of socials; track $index) {\n <a [href]=\"social.url\" [linkType]=\"social.linkType\" class=\"btn btn-link\">\n <span>{{ social.label }}</span>\n </a>\n }\n }\n </div>\n </div>\n <div class=\"visual-footer__image\">\n @if (image) {\n <img [src]=\"image.url\" [alt]=\"image.alt\" loading=\"lazy\" />\n }\n </div>\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}:root[data-theme=dark]{color-scheme:dark;--color-primary: #007bff;--color-secondary: #8a94a1;--color-text: #f3f4f6;--color-bg: #0f0f10;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #2b3035;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #f3f4f6;--button-link-text-hover: #79b6ff;--header-clear-bg: #0f0f10;--header-mobile-bg: #0f0f10;--header-logo-text: #f9f9f9;--modal-bg: #17181a;--close-btn: #f3f4f6;--item-text: #f3f4f6;--progress-color: #f9f9f9;--progress-bg: #79b6ff;--footer-bg: #0f0f10;--footer-text: #f3f4f6;--footer-text-hover: #79b6ff;--footer-links: #f3f4f6;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #0f0f10;--footer-arrows-bg: #dddddd;--footer-arrows-bg-hover: #f3f3f3}:root,:root[data-theme=light]{color-scheme:light;--color-primary: #007bff;--color-secondary: #6c757d;--color-text: #111111;--color-bg: #f9f9f9;--button-primary-bg: #007bff;--button-primary-text: #f9f9f9;--button-primary-bg-hover: #033468;--button-primary-text-hover: #f9f9f9;--button-secondary-bg: #6c757d;--button-secondary-text: #f9f9f9;--button-secondary-bg-hover: #1c1e20;--button-secondary-text-hover: #f9f9f9;--button-link-text: #111111;--button-link-text-hover: #007bff;--header-clear-bg: #007bff;--header-mobile-bg: #007bff;--header-logo-text: #f9f9f9;--modal-bg: #f9f9f9;--close-btn: #111111;--item-text: #111111;--progress-color: #79b6ff;--progress-bg: #dde8f5;--footer-bg: #dadada;--footer-text: #000;--footer-text-hover: #79b6ff;--footer-links: #000;--footer-links-hover: #79b6ff;--footer-arrows: #fff;--footer-arrows-hover: #fff;--footer-arrows-bg: #b6b6b6;--footer-arrows-bg-hover: #8b8a8a}.visual-footer{display:grid;grid-template-columns:1fr 2fr;gap:2rem;align-items:stretch;padding:4rem;background:var(--footer-bg)}.visual-footer__texts{display:flex;flex-direction:column;gap:2rem}.visual-footer__texts .btn{padding:var(--spacing-sm) 0}.visual-footer__texts .btn-link{display:inline;width:fit-content}.visual-footer__texts .title{font-size:1.5rem}.visual-footer__texts .text{font-weight:300;margin:0;display:flex;flex-direction:column;gap:.25rem}.visual-footer__image img{width:100%;height:auto;border-radius:.5rem;object-fit:cover}.visual-footer__contact,.visual-footer__address,.visual-footer__socials{display:flex;flex-direction:column;gap:.25rem}@media (max-width: 768px){.visual-footer{grid-template-columns:1fr}.visual-footer__image{order:-1}}\n"] }]
|
|
349
391
|
}], propDecorators: { contactTitle: [{
|
|
@@ -364,14 +406,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
364
406
|
type: Input
|
|
365
407
|
}] } });
|
|
366
408
|
|
|
367
|
-
const mapLangModal = (
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
return
|
|
371
|
-
const
|
|
372
|
-
const label = found?.label || lang.code;
|
|
409
|
+
const mapLangModal = (langs, currentLang = 'es') => {
|
|
410
|
+
if (!Array.isArray(langs))
|
|
411
|
+
return [];
|
|
412
|
+
return langs.map((lang, index) => {
|
|
413
|
+
const label = lang.labels?.[currentLang] || lang.labels?.[lang.code] || lang.code;
|
|
373
414
|
return {
|
|
374
|
-
id: lang.id,
|
|
415
|
+
id: lang.id ?? index,
|
|
375
416
|
code: lang.code,
|
|
376
417
|
label,
|
|
377
418
|
};
|
|
@@ -379,6 +420,9 @@ const mapLangModal = (props, currentLang = 'es') => {
|
|
|
379
420
|
};
|
|
380
421
|
|
|
381
422
|
class LangModalComponent {
|
|
423
|
+
data;
|
|
424
|
+
dialogRef;
|
|
425
|
+
langs;
|
|
382
426
|
constructor(data, dialogRef) {
|
|
383
427
|
this.data = data;
|
|
384
428
|
this.dialogRef = dialogRef;
|
|
@@ -390,12 +434,12 @@ class LangModalComponent {
|
|
|
390
434
|
closeModal() {
|
|
391
435
|
this.dialogRef?.close();
|
|
392
436
|
}
|
|
393
|
-
static
|
|
394
|
-
static
|
|
437
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LangModalComponent, deps: [{ token: MAT_DIALOG_DATA, optional: true }, { token: i1$3.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
438
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: LangModalComponent, isStandalone: true, selector: "lib-lang-modal", ngImport: i0, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n @if (langs && langs.length > 0) {\n <ol>\n @for (lang of langs; track lang.id) {\n <li (click)=\"selectLang(lang)\">\n <span class=\"modal-item\">{{ lang.label }}</span>\n </li>\n }\n </ol>\n }\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}:host{position:fixed;inset:0;width:100vw;height:100vh;background:var(--modal-bg);z-index:1000;display:flex;align-items:center;justify-content:center}.close-btn{position:absolute;top:1rem;right:2rem;background:none;border:none;color:var(--close-btn);font-size:1.5rem;font-weight:700;cursor:pointer;z-index:1001}ol{padding:0;margin:0;text-align:center;width:100%;max-width:400px;list-style:none;counter-reset:item}li{cursor:pointer;text-align:start;text-transform:uppercase;counter-increment:item}li:before{content:counter(item,decimal-leading-zero) \". \"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
395
439
|
}
|
|
396
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LangModalComponent, decorators: [{
|
|
397
441
|
type: Component,
|
|
398
|
-
args: [{ selector: 'lib-lang-modal', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n @if (langs && langs.length > 0) {\n <ol>\n @for (lang of langs; track
|
|
442
|
+
args: [{ selector: 'lib-lang-modal', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n @if (langs && langs.length > 0) {\n <ol>\n @for (lang of langs; track lang.id) {\n <li (click)=\"selectLang(lang)\">\n <span class=\"modal-item\">{{ lang.label }}</span>\n </li>\n }\n </ol>\n }\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}:host{position:fixed;inset:0;width:100vw;height:100vh;background:var(--modal-bg);z-index:1000;display:flex;align-items:center;justify-content:center}.close-btn{position:absolute;top:1rem;right:2rem;background:none;border:none;color:var(--close-btn);font-size:1.5rem;font-weight:700;cursor:pointer;z-index:1001}ol{padding:0;margin:0;text-align:center;width:100%;max-width:400px;list-style:none;counter-reset:item}li{cursor:pointer;text-align:start;text-transform:uppercase;counter-increment:item}li:before{content:counter(item,decimal-leading-zero) \". \"}\n"] }]
|
|
399
443
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
400
444
|
type: Optional
|
|
401
445
|
}, {
|
|
@@ -406,18 +450,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
406
450
|
}] }] });
|
|
407
451
|
|
|
408
452
|
class NavModalComponent {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
453
|
+
navItems;
|
|
454
|
+
socialItems;
|
|
455
|
+
close = new EventEmitter();
|
|
412
456
|
closeModal() {
|
|
413
457
|
this.close.emit();
|
|
414
458
|
}
|
|
415
|
-
static
|
|
416
|
-
static
|
|
459
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: NavModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
460
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: NavModalComponent, isStandalone: true, selector: "lib-nav-modal", inputs: { navItems: "navItems", socialItems: "socialItems" }, outputs: { close: "close" }, ngImport: i0, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n\n @if (navItems?.length) {\n <ol>\n @for (item of navItems; track item.name) {\n <a [href]=\"item.url\" [linkType]=\"item.linkType\" (click)=\"closeModal()\">\n <li>\n <span class=\"modal-item\">{{ item.label }}</span>\n </li>\n </a>\n }\n </ol>\n }\n\n @if (socialItems?.length) {\n <div class=\"buttons\">\n @for (social of socialItems; track social.label) {\n <a class=\"btn btn-link\" [href]=\"social.url\" [linkType]=\"social.linkType\">\n <span>{{ social.icon }}</span>\n {{ social.label }}\n </a>\n }\n </div>\n }\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}:host{position:fixed;inset:0;width:100vw;height:100vh;background:var(--modal-bg);z-index:1000;display:flex;align-items:center;justify-content:center}.close-btn{position:absolute;top:1rem;right:2rem;background:none;border:none;color:var(--close-btn);font-size:1.5rem;font-weight:700;cursor:pointer;z-index:1001}ol{padding:0;margin:0;text-align:center;width:100%;max-width:400px;list-style:none;counter-reset:item}li{cursor:pointer;text-align:start;counter-increment:item}a{text-decoration:none;text-transform:uppercase;color:var(--item-color)}li:before{content:counter(item,decimal-leading-zero) \". \"}.buttons{display:flex;flex-wrap:wrap;justify-content:center}.buttons a{text-transform:lowercase}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
417
461
|
}
|
|
418
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
462
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: NavModalComponent, decorators: [{
|
|
419
463
|
type: Component,
|
|
420
|
-
args: [{ selector: 'lib-nav-modal', standalone: true, imports: [CommonModule, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n @if (navItems
|
|
464
|
+
args: [{ selector: 'lib-nav-modal', standalone: true, imports: [CommonModule, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n\n @if (navItems?.length) {\n <ol>\n @for (item of navItems; track item.name) {\n <a [href]=\"item.url\" [linkType]=\"item.linkType\" (click)=\"closeModal()\">\n <li>\n <span class=\"modal-item\">{{ item.label }}</span>\n </li>\n </a>\n }\n </ol>\n }\n\n @if (socialItems?.length) {\n <div class=\"buttons\">\n @for (social of socialItems; track social.label) {\n <a class=\"btn btn-link\" [href]=\"social.url\" [linkType]=\"social.linkType\">\n <span>{{ social.icon }}</span>\n {{ social.label }}\n </a>\n }\n </div>\n }\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}:host{position:fixed;inset:0;width:100vw;height:100vh;background:var(--modal-bg);z-index:1000;display:flex;align-items:center;justify-content:center}.close-btn{position:absolute;top:1rem;right:2rem;background:none;border:none;color:var(--close-btn);font-size:1.5rem;font-weight:700;cursor:pointer;z-index:1001}ol{padding:0;margin:0;text-align:center;width:100%;max-width:400px;list-style:none;counter-reset:item}li{cursor:pointer;text-align:start;counter-increment:item}a{text-decoration:none;text-transform:uppercase;color:var(--item-color)}li:before{content:counter(item,decimal-leading-zero) \". \"}.buttons{display:flex;flex-wrap:wrap;justify-content:center}.buttons a{text-transform:lowercase}\n"] }]
|
|
421
465
|
}], propDecorators: { navItems: [{
|
|
422
466
|
type: Input
|
|
423
467
|
}], socialItems: [{
|
|
@@ -426,11 +470,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
426
470
|
type: Output
|
|
427
471
|
}] } });
|
|
428
472
|
|
|
473
|
+
const mapNavModal = (navigation, lang) => {
|
|
474
|
+
if (!navigation?.items || !Array.isArray(navigation.items))
|
|
475
|
+
return [];
|
|
476
|
+
return navigation.items.map((item) => {
|
|
477
|
+
const slug = item.slug;
|
|
478
|
+
const url = slug === 'home' || slug === '' ? `/${lang}` : `/${lang}/${slug}`;
|
|
479
|
+
return {
|
|
480
|
+
label: item.label?.[lang] ?? item.label?.['es'] ?? slug,
|
|
481
|
+
url,
|
|
482
|
+
linkType: 'internal',
|
|
483
|
+
name: slug,
|
|
484
|
+
active: true,
|
|
485
|
+
children: [],
|
|
486
|
+
};
|
|
487
|
+
});
|
|
488
|
+
};
|
|
489
|
+
const mapSocialLinks = (navigation) => {
|
|
490
|
+
if (!navigation?.social || !Array.isArray(navigation.social))
|
|
491
|
+
return [];
|
|
492
|
+
return navigation.social.map((item, index) => ({
|
|
493
|
+
label: item.label ?? '',
|
|
494
|
+
url: item.url ?? '',
|
|
495
|
+
linkType: item.linkType ?? 'external',
|
|
496
|
+
icon: item.icon ?? '',
|
|
497
|
+
order: item.order ?? index,
|
|
498
|
+
}));
|
|
499
|
+
};
|
|
500
|
+
|
|
429
501
|
class ThemeService {
|
|
502
|
+
platformId;
|
|
503
|
+
currentThemeSubject = new BehaviorSubject('light');
|
|
504
|
+
currentTheme$ = this.currentThemeSubject.asObservable();
|
|
430
505
|
constructor(platformId) {
|
|
431
506
|
this.platformId = platformId;
|
|
432
|
-
this.currentThemeSubject = new BehaviorSubject('light');
|
|
433
|
-
this.currentTheme$ = this.currentThemeSubject.asObservable();
|
|
434
507
|
// Aplicar tema por defecto al inicio
|
|
435
508
|
if (isPlatformBrowser(this.platformId)) {
|
|
436
509
|
this.applyTheme('light');
|
|
@@ -482,10 +555,10 @@ class ThemeService {
|
|
|
482
555
|
root.setAttribute('data-theme', 'light');
|
|
483
556
|
}
|
|
484
557
|
}
|
|
485
|
-
static
|
|
486
|
-
static
|
|
558
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ThemeService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
559
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ThemeService, providedIn: 'root' });
|
|
487
560
|
}
|
|
488
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
561
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ThemeService, decorators: [{
|
|
489
562
|
type: Injectable,
|
|
490
563
|
args: [{
|
|
491
564
|
providedIn: 'root',
|
|
@@ -496,18 +569,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
496
569
|
}] }] });
|
|
497
570
|
|
|
498
571
|
class HeaderClearComponent {
|
|
572
|
+
themeService;
|
|
573
|
+
isMenuOpen = false;
|
|
574
|
+
currentTheme = 'light';
|
|
575
|
+
themeSubscription;
|
|
576
|
+
logo;
|
|
577
|
+
logoDark;
|
|
578
|
+
navItems;
|
|
579
|
+
socialItems;
|
|
580
|
+
homeLink;
|
|
581
|
+
navigation;
|
|
582
|
+
lang = 'es';
|
|
583
|
+
langModal = new EventEmitter();
|
|
584
|
+
theme = new EventEmitter();
|
|
499
585
|
constructor(themeService) {
|
|
500
586
|
this.themeService = themeService;
|
|
501
|
-
this.isMenuOpen = false;
|
|
502
|
-
this.currentTheme = 'light';
|
|
503
|
-
this.langModal = new EventEmitter();
|
|
504
|
-
this.theme = new EventEmitter();
|
|
505
587
|
}
|
|
506
588
|
ngOnInit() {
|
|
507
589
|
this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {
|
|
508
590
|
this.currentTheme = theme;
|
|
509
591
|
});
|
|
510
592
|
}
|
|
593
|
+
ngOnChanges() {
|
|
594
|
+
this.navItems = mapNavModal(this.navigation, this.lang);
|
|
595
|
+
}
|
|
511
596
|
ngOnDestroy() {
|
|
512
597
|
this.themeSubscription?.unsubscribe();
|
|
513
598
|
}
|
|
@@ -524,24 +609,26 @@ class HeaderClearComponent {
|
|
|
524
609
|
getThemeIcon() {
|
|
525
610
|
return this.currentTheme === 'light' ? '🌙' : '☀️';
|
|
526
611
|
}
|
|
527
|
-
static
|
|
528
|
-
static
|
|
612
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderClearComponent, deps: [{ token: ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
613
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: HeaderClearComponent, isStandalone: true, selector: "lib-header-clear", inputs: { logo: "logo", logoDark: "logoDark", navItems: "navItems", socialItems: "socialItems", homeLink: "homeLink", navigation: "navigation", lang: "lang" }, outputs: { langModal: "langModal", theme: "theme" }, usesOnChanges: true, ngImport: i0, template: "<header class=\"header-clear\">\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 <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions\">\n <!-- Idioma -->\n <button class=\"btn btn-primary\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-primary\" (click)=\"toggleTheme()\">\n <span>{{ getThemeIcon() }}</span>\n </button>\n\n <!-- Icono de men\u00FA -->\n <button class=\"btn btn-primary\" (click)=\"toggleMenu()\">\n <span>\u2630</span>\n </button>\n </div>\n</header>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"isMenuOpen = false\"\n ></lib-nav-modal>\n}\n", styles: [".header-clear{display:flex;justify-content:space-between;align-items:center;padding:1rem 2rem;border-radius:0;position:sticky;top:0;z-index:100}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:36px;height:36px;object-fit:contain;object-position:center}.header-actions{display:flex;align-items:center;gap:1rem}.lang{text-transform:uppercase}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: NavModalComponent, selector: "lib-nav-modal", inputs: ["navItems", "socialItems"], outputs: ["close"] }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
529
614
|
}
|
|
530
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
615
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderClearComponent, decorators: [{
|
|
531
616
|
type: Component,
|
|
532
617
|
args: [{ selector: 'lib-header-clear', standalone: true, imports: [CommonModule, LangModalComponent, NavModalComponent, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<header class=\"header-clear\">\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 <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions\">\n <!-- Idioma -->\n <button class=\"btn btn-primary\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-primary\" (click)=\"toggleTheme()\">\n <span>{{ getThemeIcon() }}</span>\n </button>\n\n <!-- Icono de men\u00FA -->\n <button class=\"btn btn-primary\" (click)=\"toggleMenu()\">\n <span>\u2630</span>\n </button>\n </div>\n</header>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"isMenuOpen = false\"\n ></lib-nav-modal>\n}\n", styles: [".header-clear{display:flex;justify-content:space-between;align-items:center;padding:1rem 2rem;border-radius:0;position:sticky;top:0;z-index:100}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:36px;height:36px;object-fit:contain;object-position:center}.header-actions{display:flex;align-items:center;gap:1rem}.lang{text-transform:uppercase}\n"] }]
|
|
533
618
|
}], ctorParameters: () => [{ type: ThemeService }], propDecorators: { logo: [{
|
|
534
619
|
type: Input
|
|
535
620
|
}], logoDark: [{
|
|
536
621
|
type: Input
|
|
537
|
-
}], lang: [{
|
|
538
|
-
type: Input
|
|
539
622
|
}], navItems: [{
|
|
540
623
|
type: Input
|
|
541
624
|
}], socialItems: [{
|
|
542
625
|
type: Input
|
|
543
626
|
}], homeLink: [{
|
|
544
627
|
type: Input
|
|
628
|
+
}], navigation: [{
|
|
629
|
+
type: Input
|
|
630
|
+
}], lang: [{
|
|
631
|
+
type: Input
|
|
545
632
|
}], langModal: [{
|
|
546
633
|
type: Output
|
|
547
634
|
}], theme: [{
|
|
@@ -549,18 +636,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
549
636
|
}] } });
|
|
550
637
|
|
|
551
638
|
class HeaderMobileComponent {
|
|
639
|
+
themeService;
|
|
640
|
+
isMenuOpen = false;
|
|
641
|
+
currentTheme = 'light';
|
|
642
|
+
themeSubscription;
|
|
643
|
+
logo;
|
|
644
|
+
logoDark;
|
|
645
|
+
navItems;
|
|
646
|
+
socialItems;
|
|
647
|
+
homeLink;
|
|
648
|
+
navigation;
|
|
649
|
+
lang = 'es';
|
|
650
|
+
langModal = new EventEmitter();
|
|
651
|
+
theme = new EventEmitter();
|
|
552
652
|
constructor(themeService) {
|
|
553
653
|
this.themeService = themeService;
|
|
554
|
-
this.isMenuOpen = false;
|
|
555
|
-
this.currentTheme = 'light';
|
|
556
|
-
this.langModal = new EventEmitter();
|
|
557
|
-
this.theme = new EventEmitter();
|
|
558
654
|
}
|
|
559
655
|
ngOnInit() {
|
|
560
656
|
this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {
|
|
561
657
|
this.currentTheme = theme;
|
|
562
658
|
});
|
|
563
659
|
}
|
|
660
|
+
ngOnChanges() {
|
|
661
|
+
this.navItems = mapNavModal(this.navigation, this.lang);
|
|
662
|
+
}
|
|
564
663
|
ngOnDestroy() {
|
|
565
664
|
this.themeSubscription?.unsubscribe();
|
|
566
665
|
}
|
|
@@ -577,24 +676,26 @@ class HeaderMobileComponent {
|
|
|
577
676
|
getThemeIcon() {
|
|
578
677
|
return this.currentTheme === 'light' ? '🌙' : '☀️';
|
|
579
678
|
}
|
|
580
|
-
static
|
|
581
|
-
static
|
|
679
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderMobileComponent, deps: [{ token: ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
680
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: HeaderMobileComponent, isStandalone: true, selector: "lib-header-mobile", inputs: { logo: "logo", logoDark: "logoDark", navItems: "navItems", socialItems: "socialItems", homeLink: "homeLink", navigation: "navigation", lang: "lang" }, outputs: { langModal: "langModal", theme: "theme" }, usesOnChanges: true, ngImport: i0, template: "<header class=\"header-mobile\">\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 <span>LLUC LLULL</span>\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-primary\" (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-primary\" (click)=\"toggleTheme()\">\n <span>{{ getThemeIcon() }}</span>\n </button>\n </div>\n\n <!-- Icono de men\u00FA -->\n <div class=\"right\">\n <button class=\"btn btn-primary\" (click)=\"toggleMenu()\">\n <span>\u2630</span>\n </button>\n </div>\n</div>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"isMenuOpen = false\"\n ></lib-nav-modal>\n}\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;z-index:100;background-color:var(--header-mobile-bg);width:100vw}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:36px;height:36px;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"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: NavModalComponent, selector: "lib-nav-modal", inputs: ["navItems", "socialItems"], outputs: ["close"] }, { kind: "directive", type: LinkTypeDirective, selector: "[linkType]", inputs: ["linkType", "href"], outputs: ["anchorClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
582
681
|
}
|
|
583
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
682
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderMobileComponent, decorators: [{
|
|
584
683
|
type: Component,
|
|
585
684
|
args: [{ selector: 'lib-header-mobile', standalone: true, imports: [CommonModule, LangModalComponent, NavModalComponent, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<header class=\"header-mobile\">\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 <span>LLUC LLULL</span>\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-primary\" (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-primary\" (click)=\"toggleTheme()\">\n <span>{{ getThemeIcon() }}</span>\n </button>\n </div>\n\n <!-- Icono de men\u00FA -->\n <div class=\"right\">\n <button class=\"btn btn-primary\" (click)=\"toggleMenu()\">\n <span>\u2630</span>\n </button>\n </div>\n</div>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"isMenuOpen = false\"\n ></lib-nav-modal>\n}\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;z-index:100;background-color:var(--header-mobile-bg);width:100vw}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:36px;height:36px;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"] }]
|
|
586
685
|
}], ctorParameters: () => [{ type: ThemeService }], propDecorators: { logo: [{
|
|
587
686
|
type: Input
|
|
588
687
|
}], logoDark: [{
|
|
589
688
|
type: Input
|
|
590
|
-
}], lang: [{
|
|
591
|
-
type: Input
|
|
592
689
|
}], navItems: [{
|
|
593
690
|
type: Input
|
|
594
691
|
}], socialItems: [{
|
|
595
692
|
type: Input
|
|
596
693
|
}], homeLink: [{
|
|
597
694
|
type: Input
|
|
695
|
+
}], navigation: [{
|
|
696
|
+
type: Input
|
|
697
|
+
}], lang: [{
|
|
698
|
+
type: Input
|
|
598
699
|
}], langModal: [{
|
|
599
700
|
type: Output
|
|
600
701
|
}], theme: [{
|
|
@@ -602,11 +703,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
602
703
|
}] } });
|
|
603
704
|
|
|
604
705
|
class SphereDeformEffect {
|
|
706
|
+
size;
|
|
707
|
+
rotationSpeed;
|
|
708
|
+
color;
|
|
709
|
+
mesh;
|
|
710
|
+
time = 0;
|
|
605
711
|
constructor(size, rotationSpeed, color) {
|
|
606
712
|
this.size = size;
|
|
607
713
|
this.rotationSpeed = rotationSpeed;
|
|
608
714
|
this.color = color;
|
|
609
|
-
this.time = 0;
|
|
610
715
|
}
|
|
611
716
|
init(scene, _options) {
|
|
612
717
|
const geometry = new THREE.SphereGeometry(this.size, 128, 128);
|
|
@@ -644,26 +749,19 @@ const EFFECT_REGISTRY = {
|
|
|
644
749
|
};
|
|
645
750
|
|
|
646
751
|
class DynamicBackgroundComponent {
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
const width = window.innerWidth;
|
|
661
|
-
const height = window.innerHeight;
|
|
662
|
-
this.camera.aspect = width / height;
|
|
663
|
-
this.camera.updateProjectionMatrix();
|
|
664
|
-
this.renderer.setSize(width, height);
|
|
665
|
-
};
|
|
666
|
-
}
|
|
752
|
+
canvasRef;
|
|
753
|
+
effect = 'sphere-deform';
|
|
754
|
+
rotationSpeed = 0.01;
|
|
755
|
+
size = 2;
|
|
756
|
+
backgroundColor = '#000000';
|
|
757
|
+
elementColor;
|
|
758
|
+
platformId = inject(PLATFORM_ID);
|
|
759
|
+
isBrowser = isPlatformBrowser(this.platformId);
|
|
760
|
+
scene;
|
|
761
|
+
camera;
|
|
762
|
+
renderer;
|
|
763
|
+
animationId;
|
|
764
|
+
currentEffect;
|
|
667
765
|
ngOnInit() {
|
|
668
766
|
if (this.isBrowser) {
|
|
669
767
|
this.initScene();
|
|
@@ -704,10 +802,22 @@ class DynamicBackgroundComponent {
|
|
|
704
802
|
this.currentEffect = new EffectClass(this.size, this.rotationSpeed, this.elementColor);
|
|
705
803
|
this.currentEffect.init(this.scene, {});
|
|
706
804
|
}
|
|
707
|
-
|
|
708
|
-
|
|
805
|
+
animate = () => {
|
|
806
|
+
this.animationId = requestAnimationFrame(this.animate);
|
|
807
|
+
this.currentEffect.animate();
|
|
808
|
+
this.renderer.render(this.scene, this.camera);
|
|
809
|
+
};
|
|
810
|
+
onResize = () => {
|
|
811
|
+
const width = window.innerWidth;
|
|
812
|
+
const height = window.innerHeight;
|
|
813
|
+
this.camera.aspect = width / height;
|
|
814
|
+
this.camera.updateProjectionMatrix();
|
|
815
|
+
this.renderer.setSize(width, height);
|
|
816
|
+
};
|
|
817
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicBackgroundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
818
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.19", type: DynamicBackgroundComponent, isStandalone: true, selector: "lib-dynamic-background", inputs: { effect: "effect", rotationSpeed: "rotationSpeed", size: "size", backgroundColor: "backgroundColor", elementColor: "elementColor" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["bgCanvas"], descendants: true, static: true }], ngImport: i0, template: "<canvas #bgCanvas class=\"dynamic-bg-canvas\"></canvas>\n", styles: [".dynamic-bg-canvas{position:absolute;top:0;left:0;width:100%;height:100%;display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
709
819
|
}
|
|
710
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
820
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicBackgroundComponent, decorators: [{
|
|
711
821
|
type: Component,
|
|
712
822
|
args: [{ selector: 'lib-dynamic-background', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<canvas #bgCanvas class=\"dynamic-bg-canvas\"></canvas>\n", styles: [".dynamic-bg-canvas{position:absolute;top:0;left:0;width:100%;height:100%;display:block}\n"] }]
|
|
713
823
|
}], propDecorators: { canvasRef: [{
|
|
@@ -744,98 +854,43 @@ function mapButtons(data) {
|
|
|
744
854
|
.filter((item) => item && typeof item === 'object')
|
|
745
855
|
.map((item) => ({
|
|
746
856
|
label: item.label ?? '',
|
|
747
|
-
url: item.url ?? '
|
|
857
|
+
url: item.link_type === 'internal' ? (item.page ?? '') : (item.url ?? ''),
|
|
748
858
|
linkType: item.link_type ?? 'none',
|
|
749
859
|
icon: item.icon,
|
|
750
860
|
}));
|
|
751
861
|
}
|
|
752
|
-
function mapImage(data) {
|
|
862
|
+
function mapImage(data, cdn) {
|
|
753
863
|
if (!data || typeof data !== 'object')
|
|
754
864
|
return null;
|
|
865
|
+
const src = data.url ?? data.src ?? '';
|
|
755
866
|
return {
|
|
756
|
-
url:
|
|
867
|
+
url: src.startsWith('http') ? src : (cdn ?? '') + src,
|
|
757
868
|
alt: data.alt ?? '',
|
|
758
869
|
width: data.width,
|
|
759
870
|
height: data.height,
|
|
760
871
|
format: data.format,
|
|
761
872
|
};
|
|
762
873
|
}
|
|
763
|
-
function mapImageOrGallery(data) {
|
|
874
|
+
function mapImageOrGallery(data, cdn) {
|
|
764
875
|
if (!data)
|
|
765
876
|
return [];
|
|
766
|
-
// Si es array → galería
|
|
767
877
|
if (Array.isArray(data)) {
|
|
768
878
|
return data
|
|
769
879
|
.filter((img) => img && typeof img === 'object')
|
|
770
|
-
.map((img) => mapImage(img))
|
|
880
|
+
.map((img) => mapImage(img, cdn))
|
|
771
881
|
.filter(Boolean);
|
|
772
882
|
}
|
|
773
|
-
|
|
774
|
-
const single = mapImage(data);
|
|
883
|
+
const single = mapImage(data, cdn);
|
|
775
884
|
return single ? [single] : [];
|
|
776
885
|
}
|
|
777
886
|
|
|
778
|
-
|
|
779
|
-
const isArray = Array.isArray;
|
|
780
|
-
const isHttp = (u) => !!u && /^https?:\/\//i.test(u ?? '');
|
|
781
|
-
const mapNavModalWithLang = (props, _langCode) => mapNavModal(props);
|
|
782
|
-
const mapNavModal = (props) => {
|
|
783
|
-
if (!isArray(props))
|
|
784
|
-
return [];
|
|
785
|
-
return props
|
|
786
|
-
.map((item) => {
|
|
787
|
-
const link = item?.nav_link ?? {};
|
|
788
|
-
const url = link.url ?? link.external_url ?? undefined;
|
|
789
|
-
const mapped = {
|
|
790
|
-
label: item?.label ?? link?.name ?? '',
|
|
791
|
-
url,
|
|
792
|
-
linkType: link?.linktype,
|
|
793
|
-
name: link?.name,
|
|
794
|
-
active: link?.active ?? true,
|
|
795
|
-
children: isArray(link?.children) ? link.children : [], // UiLibButtonI[]
|
|
796
|
-
};
|
|
797
|
-
if (!mapped.label || !mapped.url)
|
|
798
|
-
return null;
|
|
799
|
-
return mapped;
|
|
800
|
-
})
|
|
801
|
-
.filter((x) => !!x);
|
|
802
|
-
};
|
|
803
|
-
const mapSocialLinks = (props) => {
|
|
804
|
-
if (!isArray(props))
|
|
805
|
-
return [];
|
|
806
|
-
return props
|
|
807
|
-
.map((item) => {
|
|
808
|
-
const link = item?.nav_link ?? item ?? {};
|
|
809
|
-
const url = link.url ?? link.external_url ?? undefined;
|
|
810
|
-
const mapped = {
|
|
811
|
-
label: item?.label ?? link?.name ?? '',
|
|
812
|
-
url: url ?? '',
|
|
813
|
-
linkType: link?.linktype ?? (isHttp(url) ? 'external' : 'internal'),
|
|
814
|
-
icon: (item?.icon ?? link?.icon ?? ''),
|
|
815
|
-
order: item?.order ?? link?.order,
|
|
816
|
-
};
|
|
817
|
-
if (!mapped.label || !mapped.url)
|
|
818
|
-
return null;
|
|
819
|
-
if (mapped.icon == null)
|
|
820
|
-
mapped.icon = '';
|
|
821
|
-
return mapped;
|
|
822
|
-
})
|
|
823
|
-
.filter((x) => !!x);
|
|
824
|
-
};
|
|
825
|
-
|
|
826
|
-
const mapHeaderClear = (props) => {
|
|
827
|
-
// Obtener el idioma de las props
|
|
828
|
-
const currentLang = props?.lang || 'es';
|
|
829
|
-
// Mapear solo los navLinks del nav-modal con el idioma correcto
|
|
830
|
-
const navItems = mapNavModalWithLang(props?.['nav-modal']?.navLinks || [], currentLang);
|
|
831
|
-
const socialItems = mapSocialLinks(props?.['nav-modal']?.socialLinks || []);
|
|
887
|
+
const mapHeaderClear = (props, cdn) => {
|
|
832
888
|
return {
|
|
833
|
-
logo: mapImage(props?.logo),
|
|
834
|
-
logoDark: mapImage(props?.logoDark),
|
|
835
|
-
lang:
|
|
836
|
-
|
|
837
|
-
socialItems:
|
|
838
|
-
homeLink: navItems[0],
|
|
889
|
+
logo: mapImage(props?.logo, cdn),
|
|
890
|
+
logoDark: mapImage(props?.logoDark, cdn),
|
|
891
|
+
lang: props?.lang || 'es',
|
|
892
|
+
navigation: props?.navigation,
|
|
893
|
+
socialItems: mapSocialLinks(props?.navigation),
|
|
839
894
|
};
|
|
840
895
|
};
|
|
841
896
|
|
|
@@ -894,7 +949,6 @@ const mapVisualFooter = (props) => ({
|
|
|
894
949
|
const componentMappers = {
|
|
895
950
|
'hero-section': mapHeroSection,
|
|
896
951
|
'header-clear': mapHeaderClear,
|
|
897
|
-
'nav-modal': mapNavModal,
|
|
898
952
|
'lang-modal': mapLangModal,
|
|
899
953
|
'section-intro': mapSectionIntro,
|
|
900
954
|
'category-progress': mapCategoryProgress,
|
|
@@ -904,10 +958,11 @@ const componentMappers = {
|
|
|
904
958
|
'visual-footer': mapVisualFooter,
|
|
905
959
|
};
|
|
906
960
|
|
|
961
|
+
const CDN_BASE_URL = new InjectionToken('CDN_BASE_URL');
|
|
962
|
+
|
|
907
963
|
class MapperService {
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
}
|
|
964
|
+
platformId = inject(PLATFORM_ID);
|
|
965
|
+
cdn = inject(CDN_BASE_URL);
|
|
911
966
|
mapComponents(body) {
|
|
912
967
|
if (!body || body.length === 0) {
|
|
913
968
|
return [];
|
|
@@ -924,7 +979,7 @@ class MapperService {
|
|
|
924
979
|
};
|
|
925
980
|
if (mapper) {
|
|
926
981
|
try {
|
|
927
|
-
mapped.props = mapper(component.props);
|
|
982
|
+
mapped.props = mapper(component.props, this.cdn);
|
|
928
983
|
}
|
|
929
984
|
catch (e) {
|
|
930
985
|
console.error(`Error mapping props for component "${name}"`, e);
|
|
@@ -936,10 +991,10 @@ class MapperService {
|
|
|
936
991
|
return mapped;
|
|
937
992
|
});
|
|
938
993
|
}
|
|
939
|
-
static
|
|
940
|
-
static
|
|
994
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MapperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
995
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MapperService, providedIn: 'root' });
|
|
941
996
|
}
|
|
942
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
997
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MapperService, decorators: [{
|
|
943
998
|
type: Injectable,
|
|
944
999
|
args: [{
|
|
945
1000
|
providedIn: 'root',
|
|
@@ -947,6 +1002,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
947
1002
|
}] });
|
|
948
1003
|
|
|
949
1004
|
class ScreenSizerService {
|
|
1005
|
+
breakpoints = {
|
|
1006
|
+
xs: 480,
|
|
1007
|
+
sm: 768,
|
|
1008
|
+
md: 1024,
|
|
1009
|
+
lg: 1280,
|
|
1010
|
+
xl: 1536,
|
|
1011
|
+
};
|
|
1012
|
+
isXs = signal(false);
|
|
1013
|
+
isSm = signal(false);
|
|
1014
|
+
isMd = signal(false);
|
|
1015
|
+
isLg = signal(false);
|
|
1016
|
+
isXl = signal(false);
|
|
1017
|
+
minSm = signal(false);
|
|
1018
|
+
minMd = signal(false);
|
|
1019
|
+
minLg = signal(false);
|
|
1020
|
+
minXl = signal(false);
|
|
1021
|
+
platformId = inject(PLATFORM_ID);
|
|
950
1022
|
get width() {
|
|
951
1023
|
if (isPlatformBrowser(this.platformId)) {
|
|
952
1024
|
return Math.min(window.innerWidth, window.outerWidth);
|
|
@@ -954,23 +1026,6 @@ class ScreenSizerService {
|
|
|
954
1026
|
return 0;
|
|
955
1027
|
}
|
|
956
1028
|
constructor() {
|
|
957
|
-
this.breakpoints = {
|
|
958
|
-
xs: 480,
|
|
959
|
-
sm: 768,
|
|
960
|
-
md: 1024,
|
|
961
|
-
lg: 1280,
|
|
962
|
-
xl: 1536,
|
|
963
|
-
};
|
|
964
|
-
this.isXs = signal(false);
|
|
965
|
-
this.isSm = signal(false);
|
|
966
|
-
this.isMd = signal(false);
|
|
967
|
-
this.isLg = signal(false);
|
|
968
|
-
this.isXl = signal(false);
|
|
969
|
-
this.minSm = signal(false);
|
|
970
|
-
this.minMd = signal(false);
|
|
971
|
-
this.minLg = signal(false);
|
|
972
|
-
this.minXl = signal(false);
|
|
973
|
-
this.platformId = inject(PLATFORM_ID);
|
|
974
1029
|
if (isPlatformBrowser(this.platformId)) {
|
|
975
1030
|
fromEvent(window, 'resize')
|
|
976
1031
|
.pipe(debounceTime(200), map(() => this.width), distinctUntilChanged(), startWith(this.width))
|
|
@@ -1017,10 +1072,10 @@ class ScreenSizerService {
|
|
|
1017
1072
|
minXlInstant() {
|
|
1018
1073
|
return this.minXl();
|
|
1019
1074
|
}
|
|
1020
|
-
static
|
|
1021
|
-
static
|
|
1075
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ScreenSizerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1076
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ScreenSizerService, providedIn: 'root' });
|
|
1022
1077
|
}
|
|
1023
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1078
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ScreenSizerService, decorators: [{
|
|
1024
1079
|
type: Injectable,
|
|
1025
1080
|
args: [{ providedIn: 'root' }]
|
|
1026
1081
|
}], ctorParameters: () => [] });
|
|
@@ -1035,5 +1090,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1035
1090
|
* Generated bundle index. Do not edit.
|
|
1036
1091
|
*/
|
|
1037
1092
|
|
|
1038
|
-
export { CategoryProgressComponent, Default, DynamicBackgroundComponent, HeaderClearComponent, HeaderMobileComponent, HeroSectionComponent, IconsModule, LangModalComponent, LegalFooterComponent, LinkType, LinkTypeDirective, LinksFooterComponent, MapperService, NavModalComponent, ScreenSizerService, SectionIntroComponent, SocialFooterComponent,
|
|
1093
|
+
export { CDN_BASE_URL, CategoryProgressComponent, Default, DynamicBackgroundComponent, HeaderClearComponent, HeaderMobileComponent, HeroSectionComponent, IconsModule, LangModalComponent, LegalFooterComponent, LinkType, LinkTypeDirective, LinksFooterComponent, MapperService, NavModalComponent, ScreenSizerService, SectionIntroComponent, SocialFooterComponent, ThemeService, UiIconComponent, VisualFooterComponent, componentMappers, mapButtons, mapImage, mapImageOrGallery };
|
|
1039
1094
|
//# sourceMappingURL=lluc_llull-ui-lib.mjs.map
|