@lluc_llull/ui-lib 0.12.4 → 0.14.1
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 +413 -348
- package/fesm2022/lluc_llull-ui-lib.mjs.map +1 -1
- package/lib/components/core/content/category-progress/category-progress.interface.d.ts +1 -1
- package/lib/components/core/content/hero-section/hero-section.interface.d.ts +1 -1
- package/lib/components/core/content/hero-section/hero-section.stories.d.ts +1 -1
- package/lib/components/core/content/index.d.ts +1 -1
- package/lib/components/core/footers/legal-footer/legal-footer.interface.d.ts +2 -2
- package/lib/components/core/footers/links-footer/links-footer.interface.d.ts +1 -1
- package/lib/components/core/footers/social-footer/social-footer.interface.d.ts +1 -1
- package/lib/components/core/footers/visual-footer/visual-footer.interface.d.ts +1 -1
- package/lib/components/core/headers/header-clear/header-clear.component.d.ts +6 -4
- package/lib/components/core/headers/header-clear/header-clear.interface.d.ts +1 -1
- package/lib/components/core/headers/header-mobile/header-mobile.component.d.ts +6 -4
- package/lib/components/core/headers/header-mobile/header-mobile.interface.d.ts +1 -1
- package/lib/components/core/index.d.ts +1 -1
- package/lib/components/core/modals/lang-modal/lang-modal.component.d.ts +2 -2
- package/lib/components/core/modals/nav-modal/nav-modal.interface.d.ts +1 -1
- package/lib/components/shared/ui-icon/ui-icon.component.d.ts +5 -1
- package/lib/directives/index.d.ts +0 -1
- package/lib/{components/effects → effects}/dynamic-background/effects/sphere-deform/sphere-deform.effect.d.ts +1 -1
- package/lib/interfaces/index.d.ts +1 -1
- package/lib/interfaces/page-config.interface.d.ts +1 -0
- package/lib/interfaces/ui-lib-button.interface.d.ts +1 -1
- package/lib/interfaces/ui-lib-nav-items.interface.d.ts +2 -2
- package/lib/services/mapper/cdn.token.d.ts +2 -0
- package/lib/services/mapper/component-mappers/header-clear.mapper.d.ts +1 -1
- 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 +3 -4
- package/lib/services/mapper/component-mappers/types.d.ts +1 -1
- package/lib/services/mapper/index.d.ts +2 -1
- 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 -24
- 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 -66
- 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,19 +1,37 @@
|
|
|
1
1
|
import * as i1$1 from '@angular/common';
|
|
2
|
-
import {
|
|
2
|
+
import { CommonModule, isPlatformBrowser } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { EventEmitter, inject, PLATFORM_ID, HostListener, Output,
|
|
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';
|
|
14
14
|
import * as THREE from 'three';
|
|
15
15
|
import { debounceTime, map, distinctUntilChanged, startWith } from 'rxjs/operators';
|
|
16
16
|
|
|
17
|
+
class CategoryProgressComponent {
|
|
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 });
|
|
23
|
+
}
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: CategoryProgressComponent, decorators: [{
|
|
25
|
+
type: Component,
|
|
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"] }]
|
|
27
|
+
}], propDecorators: { pretitle: [{
|
|
28
|
+
type: Input
|
|
29
|
+
}], title: [{
|
|
30
|
+
type: Input
|
|
31
|
+
}], categories: [{
|
|
32
|
+
type: Input
|
|
33
|
+
}] } });
|
|
34
|
+
|
|
17
35
|
var LinkType;
|
|
18
36
|
(function (LinkType) {
|
|
19
37
|
LinkType["Internal"] = "internal";
|
|
@@ -24,11 +42,15 @@ var LinkType;
|
|
|
24
42
|
})(LinkType || (LinkType = {}));
|
|
25
43
|
|
|
26
44
|
class LinkTypeDirective {
|
|
45
|
+
router;
|
|
46
|
+
elRef;
|
|
47
|
+
linkType;
|
|
48
|
+
href;
|
|
49
|
+
anchorClicked = new EventEmitter();
|
|
50
|
+
platformId = inject(PLATFORM_ID);
|
|
27
51
|
constructor(router, elRef) {
|
|
28
52
|
this.router = router;
|
|
29
53
|
this.elRef = elRef;
|
|
30
|
-
this.anchorClicked = new EventEmitter();
|
|
31
|
-
this.platformId = inject(PLATFORM_ID);
|
|
32
54
|
}
|
|
33
55
|
ngOnInit() {
|
|
34
56
|
this.setupLinkAttributes();
|
|
@@ -68,9 +90,8 @@ class LinkTypeDirective {
|
|
|
68
90
|
}
|
|
69
91
|
}
|
|
70
92
|
navigateInternal(url) {
|
|
71
|
-
const cleanedUrl = url.trim().replace(/\/+$/, '');
|
|
72
93
|
this.anchorClicked.emit();
|
|
73
|
-
this.router.navigateByUrl(
|
|
94
|
+
this.router.navigateByUrl(url);
|
|
74
95
|
}
|
|
75
96
|
openExternal(url) {
|
|
76
97
|
if (isPlatformBrowser(this.platformId)) {
|
|
@@ -103,10 +124,10 @@ class LinkTypeDirective {
|
|
|
103
124
|
element.style.pointerEvents = 'none';
|
|
104
125
|
}
|
|
105
126
|
}
|
|
106
|
-
static
|
|
107
|
-
static
|
|
127
|
+
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 });
|
|
128
|
+
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 });
|
|
108
129
|
}
|
|
109
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinkTypeDirective, decorators: [{
|
|
110
131
|
type: Directive,
|
|
111
132
|
args: [{
|
|
112
133
|
selector: '[linkType]',
|
|
@@ -123,55 +144,92 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
123
144
|
args: ['click', ['$event']]
|
|
124
145
|
}] } });
|
|
125
146
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
nextEl: '.swiper-button-next',
|
|
136
|
-
prevEl: '.swiper-button-prev',
|
|
137
|
-
},
|
|
138
|
-
pagination: { clickable: true },
|
|
139
|
-
breakpoints: {
|
|
140
|
-
0: { slidesPerView: 1 }, // móviles
|
|
141
|
-
480: { slidesPerView: 1 }, // small tablets
|
|
142
|
-
768: { slidesPerView: 3 }, // tablets
|
|
143
|
-
1024: { slidesPerView: 4 }, // laptops
|
|
144
|
-
1280: { slidesPerView: 7 }, // desktop → máximo 7
|
|
145
|
-
},
|
|
146
|
-
...this.swiperConfig,
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
ngOnDestroy() {
|
|
150
|
-
this.swiperInstance?.destroy(true, true);
|
|
151
|
-
}
|
|
152
|
-
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 }); }
|
|
153
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SwiperDirective, isStandalone: true, selector: "[appSwiper]", inputs: { swiperConfig: "swiperConfig" }, ngImport: i0 }); }
|
|
147
|
+
class HeroSectionComponent {
|
|
148
|
+
pretitle;
|
|
149
|
+
title;
|
|
150
|
+
subtitle;
|
|
151
|
+
text;
|
|
152
|
+
buttons;
|
|
153
|
+
highlight;
|
|
154
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeroSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
155
|
+
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 });
|
|
154
156
|
}
|
|
155
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
156
|
-
type:
|
|
157
|
-
args: [{
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeroSectionComponent, decorators: [{
|
|
158
|
+
type: Component,
|
|
159
|
+
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"] }]
|
|
160
|
+
}], propDecorators: { pretitle: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], title: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], subtitle: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], text: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], buttons: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], highlight: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}] } });
|
|
173
|
+
|
|
174
|
+
var heroSection_stories = {
|
|
175
|
+
title: 'Core/Content/HeroSection',
|
|
176
|
+
component: HeroSectionComponent,
|
|
177
|
+
tags: ['autodocs'],
|
|
178
|
+
argTypes: {
|
|
179
|
+
title: { control: 'text' },
|
|
180
|
+
subtitle: { control: 'text' },
|
|
181
|
+
text: { control: 'text' },
|
|
182
|
+
buttons: { control: 'object' },
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
const Default = {
|
|
186
|
+
args: {
|
|
187
|
+
title: 'Título de ejemplo',
|
|
188
|
+
subtitle: 'Subtítulo de ejemplo',
|
|
189
|
+
text: 'Texto descriptivo de ejemplo para el Hero Section.',
|
|
190
|
+
buttons: [
|
|
191
|
+
{ label: 'Botón 1', url: 'https://www.google.com', linkType: LinkType.External },
|
|
192
|
+
{ label: 'Botón 2', url: 'https://www.google.com', linkType: LinkType.External },
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
class SectionIntroComponent {
|
|
198
|
+
pretitle;
|
|
199
|
+
title;
|
|
200
|
+
subtitle;
|
|
201
|
+
text;
|
|
202
|
+
button;
|
|
203
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SectionIntroComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
204
|
+
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 });
|
|
205
|
+
}
|
|
206
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SectionIntroComponent, decorators: [{
|
|
207
|
+
type: Component,
|
|
208
|
+
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"] }]
|
|
209
|
+
}], propDecorators: { pretitle: [{
|
|
210
|
+
type: Input
|
|
211
|
+
}], title: [{
|
|
212
|
+
type: Input
|
|
213
|
+
}], subtitle: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], text: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}], button: [{
|
|
162
218
|
type: Input
|
|
163
219
|
}] } });
|
|
164
220
|
|
|
165
221
|
class LegalFooterComponent {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
222
|
+
year;
|
|
223
|
+
brand;
|
|
224
|
+
credits;
|
|
225
|
+
links;
|
|
226
|
+
variant = 'simple';
|
|
227
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LegalFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
228
|
+
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"] }] });
|
|
171
229
|
}
|
|
172
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
230
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LegalFooterComponent, decorators: [{
|
|
173
231
|
type: Component,
|
|
174
|
-
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\"
|
|
232
|
+
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"] }]
|
|
175
233
|
}], propDecorators: { year: [{
|
|
176
234
|
type: Input
|
|
177
235
|
}], brand: [{
|
|
@@ -185,12 +243,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
185
243
|
}] } });
|
|
186
244
|
|
|
187
245
|
class LinksFooterComponent {
|
|
188
|
-
|
|
189
|
-
static
|
|
246
|
+
links;
|
|
247
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinksFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
248
|
+
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 });
|
|
190
249
|
}
|
|
191
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
250
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinksFooterComponent, decorators: [{
|
|
192
251
|
type: Component,
|
|
193
|
-
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"] }]
|
|
252
|
+
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"] }]
|
|
194
253
|
}], propDecorators: { links: [{
|
|
195
254
|
type: Input
|
|
196
255
|
}] } });
|
|
@@ -199,47 +258,47 @@ const icons = {
|
|
|
199
258
|
ArrowUpRight,
|
|
200
259
|
ArrowRight,
|
|
201
260
|
ArrowLeft,
|
|
261
|
+
Twitter
|
|
202
262
|
};
|
|
203
263
|
class IconsModule {
|
|
204
|
-
static
|
|
205
|
-
static
|
|
206
|
-
static
|
|
264
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
265
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, imports: [i1$2.LucideAngularModule], exports: [LucideAngularModule] });
|
|
266
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, imports: [LucideAngularModule.pick(icons), LucideAngularModule] });
|
|
207
267
|
}
|
|
208
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
268
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, decorators: [{
|
|
209
269
|
type: NgModule,
|
|
210
270
|
args: [{
|
|
211
|
-
imports: [
|
|
212
|
-
|
|
213
|
-
],
|
|
214
|
-
exports: [LucideAngularModule]
|
|
271
|
+
imports: [LucideAngularModule.pick(icons)],
|
|
272
|
+
exports: [LucideAngularModule],
|
|
215
273
|
}]
|
|
216
274
|
}] });
|
|
217
275
|
|
|
218
|
-
const brandIcons = {
|
|
219
|
-
instagram: siInstagram,
|
|
220
|
-
facebook: siFacebook,
|
|
221
|
-
tiktok: siTiktok,
|
|
222
|
-
youtube: siYoutube,
|
|
223
|
-
twitter: siX,
|
|
224
|
-
x: siX,
|
|
225
|
-
};
|
|
226
276
|
class UiIconComponent {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
277
|
+
name;
|
|
278
|
+
size = 24;
|
|
279
|
+
color = 'currentColor';
|
|
280
|
+
icon;
|
|
281
|
+
ngOnChanges() {
|
|
282
|
+
this.icon = this.resolveBrandIcon();
|
|
230
283
|
}
|
|
231
284
|
get isBrandIcon() {
|
|
232
|
-
return !!
|
|
285
|
+
return !!this.icon;
|
|
233
286
|
}
|
|
234
287
|
get brandIcon() {
|
|
235
|
-
return
|
|
288
|
+
return this.icon ?? null;
|
|
236
289
|
}
|
|
237
|
-
|
|
238
|
-
|
|
290
|
+
resolveBrandIcon() {
|
|
291
|
+
if (!this.name)
|
|
292
|
+
return null;
|
|
293
|
+
const key = 'si' + this.name.replace(/[^a-z0-9]/gi, '').replace(/^\w/, (c) => c.toUpperCase());
|
|
294
|
+
return simpleIcons[key] ?? null;
|
|
295
|
+
}
|
|
296
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: UiIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
297
|
+
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"] }] });
|
|
239
298
|
}
|
|
240
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
299
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: UiIconComponent, decorators: [{
|
|
241
300
|
type: Component,
|
|
242
|
-
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
|
|
301
|
+
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"] }]
|
|
243
302
|
}], propDecorators: { name: [{
|
|
244
303
|
type: Input
|
|
245
304
|
}], size: [{
|
|
@@ -248,13 +307,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
248
307
|
type: Input
|
|
249
308
|
}] } });
|
|
250
309
|
|
|
310
|
+
Swiper.use([Navigation, Pagination, Autoplay]);
|
|
311
|
+
class SwiperDirective {
|
|
312
|
+
el;
|
|
313
|
+
swiperConfig;
|
|
314
|
+
swiperInstance;
|
|
315
|
+
constructor(el) {
|
|
316
|
+
this.el = el;
|
|
317
|
+
}
|
|
318
|
+
ngAfterViewInit() {
|
|
319
|
+
this.swiperInstance = new Swiper(this.el.nativeElement, {
|
|
320
|
+
spaceBetween: 16,
|
|
321
|
+
navigation: {
|
|
322
|
+
nextEl: '.swiper-button-next',
|
|
323
|
+
prevEl: '.swiper-button-prev',
|
|
324
|
+
},
|
|
325
|
+
pagination: { clickable: true },
|
|
326
|
+
breakpoints: {
|
|
327
|
+
0: { slidesPerView: 1 }, // móviles
|
|
328
|
+
480: { slidesPerView: 1 }, // small tablets
|
|
329
|
+
768: { slidesPerView: 3 }, // tablets
|
|
330
|
+
1024: { slidesPerView: 4 }, // laptops
|
|
331
|
+
1280: { slidesPerView: 7 }, // desktop → máximo 7
|
|
332
|
+
},
|
|
333
|
+
...this.swiperConfig,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
ngOnDestroy() {
|
|
337
|
+
this.swiperInstance?.destroy(true, true);
|
|
338
|
+
}
|
|
339
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SwiperDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
340
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.19", type: SwiperDirective, isStandalone: true, selector: "[appSwiper]", inputs: { swiperConfig: "swiperConfig" }, ngImport: i0 });
|
|
341
|
+
}
|
|
342
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SwiperDirective, decorators: [{
|
|
343
|
+
type: Directive,
|
|
344
|
+
args: [{
|
|
345
|
+
selector: '[appSwiper]',
|
|
346
|
+
standalone: true,
|
|
347
|
+
}]
|
|
348
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { swiperConfig: [{
|
|
349
|
+
type: Input
|
|
350
|
+
}] } });
|
|
351
|
+
|
|
251
352
|
class SocialFooterComponent {
|
|
252
|
-
|
|
253
|
-
|
|
353
|
+
images;
|
|
354
|
+
socials;
|
|
355
|
+
hashtag;
|
|
356
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SocialFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
357
|
+
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 });
|
|
254
358
|
}
|
|
255
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
359
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SocialFooterComponent, decorators: [{
|
|
256
360
|
type: Component,
|
|
257
|
-
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
|
|
361
|
+
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"] }]
|
|
258
362
|
}], propDecorators: { images: [{
|
|
259
363
|
type: Input
|
|
260
364
|
}], socials: [{
|
|
@@ -264,12 +368,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
264
368
|
}] } });
|
|
265
369
|
|
|
266
370
|
class VisualFooterComponent {
|
|
267
|
-
|
|
268
|
-
|
|
371
|
+
contactTitle;
|
|
372
|
+
contactPhone;
|
|
373
|
+
contactEmail;
|
|
374
|
+
addressTitle;
|
|
375
|
+
address;
|
|
376
|
+
socialsTitle;
|
|
377
|
+
socials;
|
|
378
|
+
image;
|
|
379
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: VisualFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
380
|
+
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 });
|
|
269
381
|
}
|
|
270
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
382
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: VisualFooterComponent, decorators: [{
|
|
271
383
|
type: Component,
|
|
272
|
-
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\"
|
|
384
|
+
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"] }]
|
|
273
385
|
}], propDecorators: { contactTitle: [{
|
|
274
386
|
type: Input
|
|
275
387
|
}], contactPhone: [{
|
|
@@ -288,21 +400,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
288
400
|
type: Input
|
|
289
401
|
}] } });
|
|
290
402
|
|
|
291
|
-
const mapLangModal = (
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
return
|
|
295
|
-
const
|
|
296
|
-
const label = found?.label || lang.code;
|
|
403
|
+
const mapLangModal = (langs, currentLang = 'es') => {
|
|
404
|
+
if (!Array.isArray(langs))
|
|
405
|
+
return [];
|
|
406
|
+
return langs.map((lang, index) => {
|
|
407
|
+
const label = lang.labels?.[currentLang] || lang.labels?.[lang.code] || lang.code;
|
|
297
408
|
return {
|
|
298
|
-
id: lang.id,
|
|
409
|
+
id: lang.id ?? index,
|
|
299
410
|
code: lang.code,
|
|
300
|
-
label
|
|
411
|
+
label,
|
|
301
412
|
};
|
|
302
413
|
});
|
|
303
414
|
};
|
|
304
415
|
|
|
305
416
|
class LangModalComponent {
|
|
417
|
+
data;
|
|
418
|
+
dialogRef;
|
|
419
|
+
langs;
|
|
306
420
|
constructor(data, dialogRef) {
|
|
307
421
|
this.data = data;
|
|
308
422
|
this.dialogRef = dialogRef;
|
|
@@ -314,12 +428,12 @@ class LangModalComponent {
|
|
|
314
428
|
closeModal() {
|
|
315
429
|
this.dialogRef?.close();
|
|
316
430
|
}
|
|
317
|
-
static
|
|
318
|
-
static
|
|
431
|
+
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 });
|
|
432
|
+
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 });
|
|
319
433
|
}
|
|
320
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
434
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LangModalComponent, decorators: [{
|
|
321
435
|
type: Component,
|
|
322
|
-
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
|
|
436
|
+
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"] }]
|
|
323
437
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
324
438
|
type: Optional
|
|
325
439
|
}, {
|
|
@@ -330,18 +444,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
330
444
|
}] }] });
|
|
331
445
|
|
|
332
446
|
class NavModalComponent {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
447
|
+
navItems;
|
|
448
|
+
socialItems;
|
|
449
|
+
close = new EventEmitter();
|
|
336
450
|
closeModal() {
|
|
337
451
|
this.close.emit();
|
|
338
452
|
}
|
|
339
|
-
static
|
|
340
|
-
static
|
|
453
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: NavModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
454
|
+
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 });
|
|
341
455
|
}
|
|
342
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
456
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: NavModalComponent, decorators: [{
|
|
343
457
|
type: Component,
|
|
344
|
-
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
|
|
458
|
+
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"] }]
|
|
345
459
|
}], propDecorators: { navItems: [{
|
|
346
460
|
type: Input
|
|
347
461
|
}], socialItems: [{
|
|
@@ -350,11 +464,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
350
464
|
type: Output
|
|
351
465
|
}] } });
|
|
352
466
|
|
|
467
|
+
const mapNavModal = (navigation, lang) => {
|
|
468
|
+
if (!navigation?.items || !Array.isArray(navigation.items))
|
|
469
|
+
return [];
|
|
470
|
+
return navigation.items.map((item) => {
|
|
471
|
+
const slug = item.slug;
|
|
472
|
+
const url = slug === 'home' || slug === '' ? `/${lang}` : `/${lang}/${slug}`;
|
|
473
|
+
return {
|
|
474
|
+
label: item.label?.[lang] ?? item.label?.['es'] ?? slug,
|
|
475
|
+
url,
|
|
476
|
+
linkType: 'internal',
|
|
477
|
+
name: slug,
|
|
478
|
+
active: true,
|
|
479
|
+
children: [],
|
|
480
|
+
};
|
|
481
|
+
});
|
|
482
|
+
};
|
|
483
|
+
const mapSocialLinks = (navigation) => {
|
|
484
|
+
if (!navigation?.social || !Array.isArray(navigation.social))
|
|
485
|
+
return [];
|
|
486
|
+
return navigation.social.map((item, index) => ({
|
|
487
|
+
label: item.label ?? '',
|
|
488
|
+
url: item.url ?? '',
|
|
489
|
+
linkType: item.linkType ?? 'external',
|
|
490
|
+
icon: item.icon ?? '',
|
|
491
|
+
order: item.order ?? index,
|
|
492
|
+
}));
|
|
493
|
+
};
|
|
494
|
+
|
|
353
495
|
class ThemeService {
|
|
496
|
+
platformId;
|
|
497
|
+
currentThemeSubject = new BehaviorSubject('light');
|
|
498
|
+
currentTheme$ = this.currentThemeSubject.asObservable();
|
|
354
499
|
constructor(platformId) {
|
|
355
500
|
this.platformId = platformId;
|
|
356
|
-
this.currentThemeSubject = new BehaviorSubject('light');
|
|
357
|
-
this.currentTheme$ = this.currentThemeSubject.asObservable();
|
|
358
501
|
// Aplicar tema por defecto al inicio
|
|
359
502
|
if (isPlatformBrowser(this.platformId)) {
|
|
360
503
|
this.applyTheme('light');
|
|
@@ -406,13 +549,13 @@ class ThemeService {
|
|
|
406
549
|
root.setAttribute('data-theme', 'light');
|
|
407
550
|
}
|
|
408
551
|
}
|
|
409
|
-
static
|
|
410
|
-
static
|
|
552
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ThemeService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
553
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ThemeService, providedIn: 'root' });
|
|
411
554
|
}
|
|
412
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
555
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ThemeService, decorators: [{
|
|
413
556
|
type: Injectable,
|
|
414
557
|
args: [{
|
|
415
|
-
providedIn: 'root'
|
|
558
|
+
providedIn: 'root',
|
|
416
559
|
}]
|
|
417
560
|
}], ctorParameters: () => [{ type: Object, decorators: [{
|
|
418
561
|
type: Inject,
|
|
@@ -420,18 +563,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
420
563
|
}] }] });
|
|
421
564
|
|
|
422
565
|
class HeaderClearComponent {
|
|
566
|
+
themeService;
|
|
567
|
+
isMenuOpen = false;
|
|
568
|
+
currentTheme = 'light';
|
|
569
|
+
themeSubscription;
|
|
570
|
+
logo;
|
|
571
|
+
logoDark;
|
|
572
|
+
navItems;
|
|
573
|
+
socialItems;
|
|
574
|
+
homeLink;
|
|
575
|
+
navigation;
|
|
576
|
+
lang = 'es';
|
|
577
|
+
langModal = new EventEmitter();
|
|
578
|
+
theme = new EventEmitter();
|
|
423
579
|
constructor(themeService) {
|
|
424
580
|
this.themeService = themeService;
|
|
425
|
-
this.isMenuOpen = false;
|
|
426
|
-
this.currentTheme = 'light';
|
|
427
|
-
this.langModal = new EventEmitter();
|
|
428
|
-
this.theme = new EventEmitter();
|
|
429
581
|
}
|
|
430
582
|
ngOnInit() {
|
|
431
|
-
this.themeSubscription = this.themeService.currentTheme$.subscribe(theme => {
|
|
583
|
+
this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {
|
|
432
584
|
this.currentTheme = theme;
|
|
433
585
|
});
|
|
434
586
|
}
|
|
587
|
+
ngOnChanges() {
|
|
588
|
+
this.navItems = mapNavModal(this.navigation, this.lang);
|
|
589
|
+
}
|
|
435
590
|
ngOnDestroy() {
|
|
436
591
|
this.themeSubscription?.unsubscribe();
|
|
437
592
|
}
|
|
@@ -448,24 +603,26 @@ class HeaderClearComponent {
|
|
|
448
603
|
getThemeIcon() {
|
|
449
604
|
return this.currentTheme === 'light' ? '🌙' : '☀️';
|
|
450
605
|
}
|
|
451
|
-
static
|
|
452
|
-
static
|
|
606
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderClearComponent, deps: [{ token: ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
607
|
+
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 });
|
|
453
608
|
}
|
|
454
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
609
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderClearComponent, decorators: [{
|
|
455
610
|
type: Component,
|
|
456
|
-
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
|
|
611
|
+
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"] }]
|
|
457
612
|
}], ctorParameters: () => [{ type: ThemeService }], propDecorators: { logo: [{
|
|
458
613
|
type: Input
|
|
459
614
|
}], logoDark: [{
|
|
460
615
|
type: Input
|
|
461
|
-
}], lang: [{
|
|
462
|
-
type: Input
|
|
463
616
|
}], navItems: [{
|
|
464
617
|
type: Input
|
|
465
618
|
}], socialItems: [{
|
|
466
619
|
type: Input
|
|
467
620
|
}], homeLink: [{
|
|
468
621
|
type: Input
|
|
622
|
+
}], navigation: [{
|
|
623
|
+
type: Input
|
|
624
|
+
}], lang: [{
|
|
625
|
+
type: Input
|
|
469
626
|
}], langModal: [{
|
|
470
627
|
type: Output
|
|
471
628
|
}], theme: [{
|
|
@@ -473,18 +630,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
473
630
|
}] } });
|
|
474
631
|
|
|
475
632
|
class HeaderMobileComponent {
|
|
633
|
+
themeService;
|
|
634
|
+
isMenuOpen = false;
|
|
635
|
+
currentTheme = 'light';
|
|
636
|
+
themeSubscription;
|
|
637
|
+
logo;
|
|
638
|
+
logoDark;
|
|
639
|
+
navItems;
|
|
640
|
+
socialItems;
|
|
641
|
+
homeLink;
|
|
642
|
+
navigation;
|
|
643
|
+
lang = 'es';
|
|
644
|
+
langModal = new EventEmitter();
|
|
645
|
+
theme = new EventEmitter();
|
|
476
646
|
constructor(themeService) {
|
|
477
647
|
this.themeService = themeService;
|
|
478
|
-
this.isMenuOpen = false;
|
|
479
|
-
this.currentTheme = 'light';
|
|
480
|
-
this.langModal = new EventEmitter();
|
|
481
|
-
this.theme = new EventEmitter();
|
|
482
648
|
}
|
|
483
649
|
ngOnInit() {
|
|
484
|
-
this.themeSubscription = this.themeService.currentTheme$.subscribe(theme => {
|
|
650
|
+
this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {
|
|
485
651
|
this.currentTheme = theme;
|
|
486
652
|
});
|
|
487
653
|
}
|
|
654
|
+
ngOnChanges() {
|
|
655
|
+
this.navItems = mapNavModal(this.navigation, this.lang);
|
|
656
|
+
}
|
|
488
657
|
ngOnDestroy() {
|
|
489
658
|
this.themeSubscription?.unsubscribe();
|
|
490
659
|
}
|
|
@@ -501,114 +670,42 @@ class HeaderMobileComponent {
|
|
|
501
670
|
getThemeIcon() {
|
|
502
671
|
return this.currentTheme === 'light' ? '🌙' : '☀️';
|
|
503
672
|
}
|
|
504
|
-
static
|
|
505
|
-
static
|
|
673
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderMobileComponent, deps: [{ token: ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
674
|
+
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 });
|
|
506
675
|
}
|
|
507
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
676
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderMobileComponent, decorators: [{
|
|
508
677
|
type: Component,
|
|
509
|
-
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
|
|
678
|
+
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"] }]
|
|
510
679
|
}], ctorParameters: () => [{ type: ThemeService }], propDecorators: { logo: [{
|
|
511
680
|
type: Input
|
|
512
681
|
}], logoDark: [{
|
|
513
682
|
type: Input
|
|
514
|
-
}], lang: [{
|
|
515
|
-
type: Input
|
|
516
683
|
}], navItems: [{
|
|
517
684
|
type: Input
|
|
518
685
|
}], socialItems: [{
|
|
519
686
|
type: Input
|
|
520
687
|
}], homeLink: [{
|
|
521
688
|
type: Input
|
|
689
|
+
}], navigation: [{
|
|
690
|
+
type: Input
|
|
691
|
+
}], lang: [{
|
|
692
|
+
type: Input
|
|
522
693
|
}], langModal: [{
|
|
523
694
|
type: Output
|
|
524
695
|
}], theme: [{
|
|
525
696
|
type: Output
|
|
526
697
|
}] } });
|
|
527
698
|
|
|
528
|
-
class HeroSectionComponent {
|
|
529
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeroSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
530
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", 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>{{ 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 }); }
|
|
531
|
-
}
|
|
532
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeroSectionComponent, decorators: [{
|
|
533
|
-
type: Component,
|
|
534
|
-
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>{{ 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"] }]
|
|
535
|
-
}], propDecorators: { pretitle: [{
|
|
536
|
-
type: Input
|
|
537
|
-
}], title: [{
|
|
538
|
-
type: Input
|
|
539
|
-
}], subtitle: [{
|
|
540
|
-
type: Input
|
|
541
|
-
}], text: [{
|
|
542
|
-
type: Input
|
|
543
|
-
}], buttons: [{
|
|
544
|
-
type: Input
|
|
545
|
-
}], highlight: [{
|
|
546
|
-
type: Input
|
|
547
|
-
}] } });
|
|
548
|
-
|
|
549
|
-
var heroSection_stories = {
|
|
550
|
-
title: 'Core/Content/HeroSection',
|
|
551
|
-
component: HeroSectionComponent,
|
|
552
|
-
tags: ['autodocs'],
|
|
553
|
-
argTypes: {
|
|
554
|
-
title: { control: 'text' },
|
|
555
|
-
subtitle: { control: 'text' },
|
|
556
|
-
text: { control: 'text' },
|
|
557
|
-
buttons: { control: 'object' },
|
|
558
|
-
},
|
|
559
|
-
};
|
|
560
|
-
const Default = {
|
|
561
|
-
args: {
|
|
562
|
-
title: 'Título de ejemplo',
|
|
563
|
-
subtitle: 'Subtítulo de ejemplo',
|
|
564
|
-
text: 'Texto descriptivo de ejemplo para el Hero Section.',
|
|
565
|
-
buttons: [
|
|
566
|
-
{ label: 'Botón 1', url: 'https://www.google.com', linkType: LinkType.External },
|
|
567
|
-
{ label: 'Botón 2', url: 'https://www.google.com', linkType: LinkType.External }
|
|
568
|
-
]
|
|
569
|
-
}
|
|
570
|
-
};
|
|
571
|
-
|
|
572
|
-
class SectionIntroComponent {
|
|
573
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SectionIntroComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
574
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", 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\n [href]=\"button.url\"\n [linkType]=\"button.linkType\"\n class=\"btn btn-link\"\n >\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 }); }
|
|
575
|
-
}
|
|
576
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SectionIntroComponent, decorators: [{
|
|
577
|
-
type: Component,
|
|
578
|
-
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\n [href]=\"button.url\"\n [linkType]=\"button.linkType\"\n class=\"btn btn-link\"\n >\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"] }]
|
|
579
|
-
}], propDecorators: { pretitle: [{
|
|
580
|
-
type: Input
|
|
581
|
-
}], title: [{
|
|
582
|
-
type: Input
|
|
583
|
-
}], subtitle: [{
|
|
584
|
-
type: Input
|
|
585
|
-
}], text: [{
|
|
586
|
-
type: Input
|
|
587
|
-
}], button: [{
|
|
588
|
-
type: Input
|
|
589
|
-
}] } });
|
|
590
|
-
|
|
591
|
-
class CategoryProgressComponent {
|
|
592
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CategoryProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
593
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", 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 \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 }); }
|
|
594
|
-
}
|
|
595
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CategoryProgressComponent, decorators: [{
|
|
596
|
-
type: Component,
|
|
597
|
-
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 \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"] }]
|
|
598
|
-
}], propDecorators: { pretitle: [{
|
|
599
|
-
type: Input
|
|
600
|
-
}], title: [{
|
|
601
|
-
type: Input
|
|
602
|
-
}], categories: [{
|
|
603
|
-
type: Input
|
|
604
|
-
}] } });
|
|
605
|
-
|
|
606
699
|
class SphereDeformEffect {
|
|
700
|
+
size;
|
|
701
|
+
rotationSpeed;
|
|
702
|
+
color;
|
|
703
|
+
mesh;
|
|
704
|
+
time = 0;
|
|
607
705
|
constructor(size, rotationSpeed, color) {
|
|
608
706
|
this.size = size;
|
|
609
707
|
this.rotationSpeed = rotationSpeed;
|
|
610
708
|
this.color = color;
|
|
611
|
-
this.time = 0;
|
|
612
709
|
}
|
|
613
710
|
init(scene, _options) {
|
|
614
711
|
const geometry = new THREE.SphereGeometry(this.size, 128, 128);
|
|
@@ -646,26 +743,19 @@ const EFFECT_REGISTRY = {
|
|
|
646
743
|
};
|
|
647
744
|
|
|
648
745
|
class DynamicBackgroundComponent {
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
const width = window.innerWidth;
|
|
663
|
-
const height = window.innerHeight;
|
|
664
|
-
this.camera.aspect = width / height;
|
|
665
|
-
this.camera.updateProjectionMatrix();
|
|
666
|
-
this.renderer.setSize(width, height);
|
|
667
|
-
};
|
|
668
|
-
}
|
|
746
|
+
canvasRef;
|
|
747
|
+
effect = 'sphere-deform';
|
|
748
|
+
rotationSpeed = 0.01;
|
|
749
|
+
size = 2;
|
|
750
|
+
backgroundColor = '#000000';
|
|
751
|
+
elementColor;
|
|
752
|
+
platformId = inject(PLATFORM_ID);
|
|
753
|
+
isBrowser = isPlatformBrowser(this.platformId);
|
|
754
|
+
scene;
|
|
755
|
+
camera;
|
|
756
|
+
renderer;
|
|
757
|
+
animationId;
|
|
758
|
+
currentEffect;
|
|
669
759
|
ngOnInit() {
|
|
670
760
|
if (this.isBrowser) {
|
|
671
761
|
this.initScene();
|
|
@@ -706,10 +796,22 @@ class DynamicBackgroundComponent {
|
|
|
706
796
|
this.currentEffect = new EffectClass(this.size, this.rotationSpeed, this.elementColor);
|
|
707
797
|
this.currentEffect.init(this.scene, {});
|
|
708
798
|
}
|
|
709
|
-
|
|
710
|
-
|
|
799
|
+
animate = () => {
|
|
800
|
+
this.animationId = requestAnimationFrame(this.animate);
|
|
801
|
+
this.currentEffect.animate();
|
|
802
|
+
this.renderer.render(this.scene, this.camera);
|
|
803
|
+
};
|
|
804
|
+
onResize = () => {
|
|
805
|
+
const width = window.innerWidth;
|
|
806
|
+
const height = window.innerHeight;
|
|
807
|
+
this.camera.aspect = width / height;
|
|
808
|
+
this.camera.updateProjectionMatrix();
|
|
809
|
+
this.renderer.setSize(width, height);
|
|
810
|
+
};
|
|
811
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicBackgroundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
812
|
+
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 });
|
|
711
813
|
}
|
|
712
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
814
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicBackgroundComponent, decorators: [{
|
|
713
815
|
type: Component,
|
|
714
816
|
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"] }]
|
|
715
817
|
}], propDecorators: { canvasRef: [{
|
|
@@ -734,8 +836,8 @@ const mapCategoryProgress = (props) => ({
|
|
|
734
836
|
title: item.title,
|
|
735
837
|
items: item.items?.map((subItem) => ({
|
|
736
838
|
label: subItem.name,
|
|
737
|
-
value: subItem.progress
|
|
738
|
-
}))
|
|
839
|
+
value: subItem.progress,
|
|
840
|
+
})),
|
|
739
841
|
})),
|
|
740
842
|
});
|
|
741
843
|
|
|
@@ -751,93 +853,38 @@ function mapButtons(data) {
|
|
|
751
853
|
icon: item.icon,
|
|
752
854
|
}));
|
|
753
855
|
}
|
|
754
|
-
function mapImage(data) {
|
|
856
|
+
function mapImage(data, cdn) {
|
|
755
857
|
if (!data || typeof data !== 'object')
|
|
756
858
|
return null;
|
|
859
|
+
const src = data.url ?? data.src ?? '';
|
|
757
860
|
return {
|
|
758
|
-
url:
|
|
861
|
+
url: src.startsWith('http') ? src : (cdn ?? '') + src,
|
|
759
862
|
alt: data.alt ?? '',
|
|
760
863
|
width: data.width,
|
|
761
864
|
height: data.height,
|
|
762
865
|
format: data.format,
|
|
763
866
|
};
|
|
764
867
|
}
|
|
765
|
-
function mapImageOrGallery(data) {
|
|
868
|
+
function mapImageOrGallery(data, cdn) {
|
|
766
869
|
if (!data)
|
|
767
870
|
return [];
|
|
768
|
-
// Si es array → galería
|
|
769
871
|
if (Array.isArray(data)) {
|
|
770
872
|
return data
|
|
771
873
|
.filter((img) => img && typeof img === 'object')
|
|
772
|
-
.map((img) => mapImage(img))
|
|
874
|
+
.map((img) => mapImage(img, cdn))
|
|
773
875
|
.filter(Boolean);
|
|
774
876
|
}
|
|
775
|
-
|
|
776
|
-
const single = mapImage(data);
|
|
877
|
+
const single = mapImage(data, cdn);
|
|
777
878
|
return single ? [single] : [];
|
|
778
879
|
}
|
|
779
880
|
|
|
780
|
-
|
|
781
|
-
const isArray = Array.isArray;
|
|
782
|
-
const isHttp = (u) => !!u && /^https?:\/\//i.test(u ?? '');
|
|
783
|
-
const mapNavModalWithLang = (props, _langCode) => mapNavModal(props);
|
|
784
|
-
const mapNavModal = (props) => {
|
|
785
|
-
if (!isArray(props))
|
|
786
|
-
return [];
|
|
787
|
-
return props
|
|
788
|
-
.map((item) => {
|
|
789
|
-
const link = item?.nav_link ?? {};
|
|
790
|
-
const url = link.url ?? link.external_url ?? undefined;
|
|
791
|
-
const mapped = {
|
|
792
|
-
label: item?.label ?? link?.name ?? '',
|
|
793
|
-
url,
|
|
794
|
-
linkType: link?.linktype,
|
|
795
|
-
name: link?.name,
|
|
796
|
-
active: link?.active ?? true,
|
|
797
|
-
children: isArray(link?.children) ? link.children : [], // UiLibButtonI[]
|
|
798
|
-
};
|
|
799
|
-
if (!mapped.label || !mapped.url)
|
|
800
|
-
return null;
|
|
801
|
-
return mapped;
|
|
802
|
-
})
|
|
803
|
-
.filter((x) => !!x);
|
|
804
|
-
};
|
|
805
|
-
const mapSocialLinks = (props) => {
|
|
806
|
-
if (!isArray(props))
|
|
807
|
-
return [];
|
|
808
|
-
return props
|
|
809
|
-
.map((item) => {
|
|
810
|
-
const link = item?.nav_link ?? item ?? {};
|
|
811
|
-
const url = link.url ?? link.external_url ?? undefined;
|
|
812
|
-
const mapped = {
|
|
813
|
-
label: item?.label ?? link?.name ?? '',
|
|
814
|
-
url: url ?? '',
|
|
815
|
-
linkType: link?.linktype ?? (isHttp(url) ? 'external' : 'internal'),
|
|
816
|
-
icon: (item?.icon ?? link?.icon ?? ''),
|
|
817
|
-
order: item?.order ?? link?.order,
|
|
818
|
-
};
|
|
819
|
-
if (!mapped.label || !mapped.url)
|
|
820
|
-
return null;
|
|
821
|
-
if (mapped.icon == null)
|
|
822
|
-
mapped.icon = '';
|
|
823
|
-
return mapped;
|
|
824
|
-
})
|
|
825
|
-
.filter((x) => !!x);
|
|
826
|
-
};
|
|
827
|
-
|
|
828
|
-
const mapHeaderClear = (props) => {
|
|
829
|
-
// Obtener el idioma de las props
|
|
830
|
-
const currentLang = props?.lang || 'es';
|
|
831
|
-
// Mapear solo los navLinks del nav-modal con el idioma correcto
|
|
832
|
-
const navItems = mapNavModalWithLang(props?.['nav-modal']?.navLinks || [], currentLang);
|
|
833
|
-
const socialItems = mapSocialLinks(props?.['nav-modal']?.socialLinks || []);
|
|
881
|
+
const mapHeaderClear = (props, cdn) => {
|
|
834
882
|
return {
|
|
835
|
-
logo: mapImage(props?.logo),
|
|
836
|
-
logoDark: mapImage(props?.logoDark),
|
|
837
|
-
lang:
|
|
838
|
-
|
|
839
|
-
socialItems:
|
|
840
|
-
homeLink: navItems[0]
|
|
883
|
+
logo: mapImage(props?.logo, cdn),
|
|
884
|
+
logoDark: mapImage(props?.logoDark, cdn),
|
|
885
|
+
lang: props?.lang || 'es',
|
|
886
|
+
navigation: props?.navigation,
|
|
887
|
+
socialItems: mapSocialLinks(props?.navigation),
|
|
841
888
|
};
|
|
842
889
|
};
|
|
843
890
|
|
|
@@ -896,7 +943,6 @@ const mapVisualFooter = (props) => ({
|
|
|
896
943
|
const componentMappers = {
|
|
897
944
|
'hero-section': mapHeroSection,
|
|
898
945
|
'header-clear': mapHeaderClear,
|
|
899
|
-
'nav-modal': mapNavModal,
|
|
900
946
|
'lang-modal': mapLangModal,
|
|
901
947
|
'section-intro': mapSectionIntro,
|
|
902
948
|
'category-progress': mapCategoryProgress,
|
|
@@ -906,10 +952,11 @@ const componentMappers = {
|
|
|
906
952
|
'visual-footer': mapVisualFooter,
|
|
907
953
|
};
|
|
908
954
|
|
|
955
|
+
const CDN_BASE_URL = new InjectionToken('CDN_BASE_URL');
|
|
956
|
+
|
|
909
957
|
class MapperService {
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
}
|
|
958
|
+
platformId = inject(PLATFORM_ID);
|
|
959
|
+
cdn = inject(CDN_BASE_URL);
|
|
913
960
|
mapComponents(body) {
|
|
914
961
|
if (!body || body.length === 0) {
|
|
915
962
|
return [];
|
|
@@ -926,7 +973,7 @@ class MapperService {
|
|
|
926
973
|
};
|
|
927
974
|
if (mapper) {
|
|
928
975
|
try {
|
|
929
|
-
mapped.props = mapper(component.props);
|
|
976
|
+
mapped.props = mapper(component.props, this.cdn);
|
|
930
977
|
}
|
|
931
978
|
catch (e) {
|
|
932
979
|
console.error(`Error mapping props for component "${name}"`, e);
|
|
@@ -938,10 +985,10 @@ class MapperService {
|
|
|
938
985
|
return mapped;
|
|
939
986
|
});
|
|
940
987
|
}
|
|
941
|
-
static
|
|
942
|
-
static
|
|
988
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MapperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
989
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MapperService, providedIn: 'root' });
|
|
943
990
|
}
|
|
944
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
991
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MapperService, decorators: [{
|
|
945
992
|
type: Injectable,
|
|
946
993
|
args: [{
|
|
947
994
|
providedIn: 'root',
|
|
@@ -949,6 +996,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
949
996
|
}] });
|
|
950
997
|
|
|
951
998
|
class ScreenSizerService {
|
|
999
|
+
breakpoints = {
|
|
1000
|
+
xs: 480,
|
|
1001
|
+
sm: 768,
|
|
1002
|
+
md: 1024,
|
|
1003
|
+
lg: 1280,
|
|
1004
|
+
xl: 1536,
|
|
1005
|
+
};
|
|
1006
|
+
isXs = signal(false);
|
|
1007
|
+
isSm = signal(false);
|
|
1008
|
+
isMd = signal(false);
|
|
1009
|
+
isLg = signal(false);
|
|
1010
|
+
isXl = signal(false);
|
|
1011
|
+
minSm = signal(false);
|
|
1012
|
+
minMd = signal(false);
|
|
1013
|
+
minLg = signal(false);
|
|
1014
|
+
minXl = signal(false);
|
|
1015
|
+
platformId = inject(PLATFORM_ID);
|
|
952
1016
|
get width() {
|
|
953
1017
|
if (isPlatformBrowser(this.platformId)) {
|
|
954
1018
|
return Math.min(window.innerWidth, window.outerWidth);
|
|
@@ -956,27 +1020,10 @@ class ScreenSizerService {
|
|
|
956
1020
|
return 0;
|
|
957
1021
|
}
|
|
958
1022
|
constructor() {
|
|
959
|
-
this.breakpoints = {
|
|
960
|
-
xs: 480,
|
|
961
|
-
sm: 768,
|
|
962
|
-
md: 1024,
|
|
963
|
-
lg: 1280,
|
|
964
|
-
xl: 1536,
|
|
965
|
-
};
|
|
966
|
-
this.isXs = signal(false);
|
|
967
|
-
this.isSm = signal(false);
|
|
968
|
-
this.isMd = signal(false);
|
|
969
|
-
this.isLg = signal(false);
|
|
970
|
-
this.isXl = signal(false);
|
|
971
|
-
this.minSm = signal(false);
|
|
972
|
-
this.minMd = signal(false);
|
|
973
|
-
this.minLg = signal(false);
|
|
974
|
-
this.minXl = signal(false);
|
|
975
|
-
this.platformId = inject(PLATFORM_ID);
|
|
976
1023
|
if (isPlatformBrowser(this.platformId)) {
|
|
977
1024
|
fromEvent(window, 'resize')
|
|
978
1025
|
.pipe(debounceTime(200), map(() => this.width), distinctUntilChanged(), startWith(this.width))
|
|
979
|
-
.subscribe(width => this.updateFlags(width));
|
|
1026
|
+
.subscribe((width) => this.updateFlags(width));
|
|
980
1027
|
}
|
|
981
1028
|
}
|
|
982
1029
|
updateFlags(width) {
|
|
@@ -992,19 +1039,37 @@ class ScreenSizerService {
|
|
|
992
1039
|
this.minXl.set(width >= xl);
|
|
993
1040
|
}
|
|
994
1041
|
// Métodos rápidos si no usas signals directamente
|
|
995
|
-
isXsInstant() {
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1042
|
+
isXsInstant() {
|
|
1043
|
+
return this.isXs();
|
|
1044
|
+
}
|
|
1045
|
+
isSmInstant() {
|
|
1046
|
+
return this.isSm();
|
|
1047
|
+
}
|
|
1048
|
+
isMdInstant() {
|
|
1049
|
+
return this.isMd();
|
|
1050
|
+
}
|
|
1051
|
+
isLgInstant() {
|
|
1052
|
+
return this.isLg();
|
|
1053
|
+
}
|
|
1054
|
+
isXlInstant() {
|
|
1055
|
+
return this.isXl();
|
|
1056
|
+
}
|
|
1057
|
+
minSmInstant() {
|
|
1058
|
+
return this.minSm();
|
|
1059
|
+
}
|
|
1060
|
+
minMdInstant() {
|
|
1061
|
+
return this.minMd();
|
|
1062
|
+
}
|
|
1063
|
+
minLgInstant() {
|
|
1064
|
+
return this.minLg();
|
|
1065
|
+
}
|
|
1066
|
+
minXlInstant() {
|
|
1067
|
+
return this.minXl();
|
|
1068
|
+
}
|
|
1069
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ScreenSizerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1070
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ScreenSizerService, providedIn: 'root' });
|
|
1006
1071
|
}
|
|
1007
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1072
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ScreenSizerService, decorators: [{
|
|
1008
1073
|
type: Injectable,
|
|
1009
1074
|
args: [{ providedIn: 'root' }]
|
|
1010
1075
|
}], ctorParameters: () => [] });
|
|
@@ -1019,5 +1084,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1019
1084
|
* Generated bundle index. Do not edit.
|
|
1020
1085
|
*/
|
|
1021
1086
|
|
|
1022
|
-
export { CategoryProgressComponent, Default, DynamicBackgroundComponent, HeaderClearComponent, HeaderMobileComponent, HeroSectionComponent, IconsModule, LangModalComponent, LegalFooterComponent, LinkType, LinkTypeDirective, LinksFooterComponent, MapperService, NavModalComponent, ScreenSizerService, SectionIntroComponent, SocialFooterComponent,
|
|
1087
|
+
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 };
|
|
1023
1088
|
//# sourceMappingURL=lluc_llull-ui-lib.mjs.map
|