@lluc_llull/ui-lib 0.12.5 → 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 +305 -256
- package/fesm2022/lluc_llull-ui-lib.mjs.map +1 -1
- package/lib/components/core/headers/header-clear/header-clear.component.d.ts +6 -4
- package/lib/components/core/headers/header-mobile/header-mobile.component.d.ts +6 -4
- package/lib/components/core/modals/lang-modal/lang-modal.component.d.ts +2 -2
- package/lib/components/shared/ui-icon/ui-icon.component.d.ts +5 -1
- package/lib/directives/index.d.ts +0 -1
- package/lib/{components/effects → effects}/dynamic-background/effects/sphere-deform/sphere-deform.effect.d.ts +1 -1
- package/lib/interfaces/page-config.interface.d.ts +1 -0
- package/lib/services/mapper/cdn.token.d.ts +2 -0
- package/lib/services/mapper/component-mappers/index.d.ts +1 -1
- package/lib/services/mapper/component-mappers/lang-modal.mapper.d.ts +2 -5
- package/lib/services/mapper/component-mappers/nav-modal.mapper.d.ts +2 -3
- package/lib/services/mapper/component-mappers/types.d.ts +1 -1
- package/lib/services/mapper/index.d.ts +1 -0
- package/lib/services/mapper/mapper.service.d.ts +1 -0
- package/lib/utils/utils.d.ts +2 -2
- package/package.json +26 -15
- package/public-api.d.ts +1 -1
- package/src/lib/effects/dynamic-background/dynamic-background.component.d.ts +26 -0
- package/src/lib/effects/dynamic-background/effects/dynamic-effect.interface.d.ts +6 -0
- package/src/lib/effects/dynamic-background/effects/effect-registry.d.ts +3 -0
- package/src/lib/effects/dynamic-background/effects/sphere-deform/sphere-deform.effect.d.ts +13 -0
- package/src/lib/effects/dynamic-background/index.d.ts +1 -0
- package/src/lib/effects/index.d.ts +1 -0
- package/src/lib/sliders/index.d.ts +1 -0
- package/src/lib/sliders/swiper.directive.d.ts +12 -0
- package/src/lib/styles/main.css +2 -2
- package/styles/main.css +2 -2
- package/esm2022/lib/Enum/index.mjs +0 -2
- package/esm2022/lib/Enum/link-type.enum.mjs +0 -9
- package/esm2022/lib/components/core/content/category-progress/category-progress.component.mjs +0 -18
- package/esm2022/lib/components/core/content/category-progress/category-progress.interface.mjs +0 -2
- package/esm2022/lib/components/core/content/category-progress/index.mjs +0 -3
- package/esm2022/lib/components/core/content/hero-section/hero-section.component.mjs +0 -25
- package/esm2022/lib/components/core/content/hero-section/hero-section.interface.mjs +0 -2
- package/esm2022/lib/components/core/content/hero-section/hero-section.stories.mjs +0 -25
- package/esm2022/lib/components/core/content/hero-section/index.mjs +0 -4
- package/esm2022/lib/components/core/content/index.mjs +0 -4
- package/esm2022/lib/components/core/content/section-intro/index.mjs +0 -3
- package/esm2022/lib/components/core/content/section-intro/section-intro.component.mjs +0 -23
- package/esm2022/lib/components/core/content/section-intro/section-intro.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/index.mjs +0 -5
- package/esm2022/lib/components/core/footers/legal-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/legal-footer/legal-footer.component.mjs +0 -27
- package/esm2022/lib/components/core/footers/legal-footer/legal-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/links-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/links-footer/links-footer.component.mjs +0 -15
- package/esm2022/lib/components/core/footers/links-footer/links-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/social-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/social-footer/social-footer.component.mjs +0 -20
- package/esm2022/lib/components/core/footers/social-footer/social-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/footers/visual-footer/index.mjs +0 -3
- package/esm2022/lib/components/core/footers/visual-footer/visual-footer.component.mjs +0 -29
- package/esm2022/lib/components/core/footers/visual-footer/visual-footer.interface.mjs +0 -2
- package/esm2022/lib/components/core/headers/header-clear/header-clear.component.mjs +0 -59
- package/esm2022/lib/components/core/headers/header-clear/header-clear.interface.mjs +0 -2
- package/esm2022/lib/components/core/headers/header-clear/index.mjs +0 -3
- package/esm2022/lib/components/core/headers/header-mobile/header-mobile.component.mjs +0 -59
- package/esm2022/lib/components/core/headers/header-mobile/header-mobile.interface.mjs +0 -2
- package/esm2022/lib/components/core/headers/header-mobile/index.mjs +0 -3
- package/esm2022/lib/components/core/headers/index.mjs +0 -3
- package/esm2022/lib/components/core/index.mjs +0 -5
- package/esm2022/lib/components/core/modals/index.mjs +0 -3
- package/esm2022/lib/components/core/modals/lang-modal/index.mjs +0 -3
- package/esm2022/lib/components/core/modals/lang-modal/lang-modal.component.mjs +0 -33
- package/esm2022/lib/components/core/modals/lang-modal/lang-modal.interface.mjs +0 -2
- package/esm2022/lib/components/core/modals/nav-modal/index.mjs +0 -3
- package/esm2022/lib/components/core/modals/nav-modal/nav-modal.component.mjs +0 -25
- package/esm2022/lib/components/core/modals/nav-modal/nav-modal.interface.mjs +0 -2
- package/esm2022/lib/components/effects/dynamic-background/dynamic-background.component.mjs +0 -87
- package/esm2022/lib/components/effects/dynamic-background/effects/dynamic-effect.interface.mjs +0 -2
- package/esm2022/lib/components/effects/dynamic-background/effects/effect-registry.mjs +0 -7
- package/esm2022/lib/components/effects/dynamic-background/effects/sphere-deform/sphere-deform.effect.mjs +0 -37
- package/esm2022/lib/components/effects/dynamic-background/index.mjs +0 -2
- package/esm2022/lib/components/effects/index.mjs +0 -2
- package/esm2022/lib/components/shared/index.mjs +0 -2
- package/esm2022/lib/components/shared/ui-icon/index.mjs +0 -3
- package/esm2022/lib/components/shared/ui-icon/ui-icon.component.mjs +0 -40
- package/esm2022/lib/components/shared/ui-icon/ui-icon.interface.mjs +0 -2
- package/esm2022/lib/directives/index.mjs +0 -3
- package/esm2022/lib/directives/link-type.directive.mjs +0 -106
- package/esm2022/lib/directives/swiper.directive.mjs +0 -43
- package/esm2022/lib/interfaces/index.mjs +0 -8
- package/esm2022/lib/interfaces/page-config.interface.mjs +0 -2
- package/esm2022/lib/interfaces/site-config.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-address.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-button.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-image.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-lang-item.interface.mjs +0 -2
- package/esm2022/lib/interfaces/ui-lib-nav-items.interface.mjs +0 -2
- package/esm2022/lib/modules/icons/icon.module.mjs +0 -22
- package/esm2022/lib/modules/icons/index.mjs +0 -2
- package/esm2022/lib/modules/index.mjs +0 -2
- package/esm2022/lib/services/index.mjs +0 -4
- package/esm2022/lib/services/mapper/component-mappers/category-progress.mapper.mjs +0 -12
- package/esm2022/lib/services/mapper/component-mappers/header-clear.mapper.mjs +0 -18
- package/esm2022/lib/services/mapper/component-mappers/hero-section.mapper.mjs +0 -10
- package/esm2022/lib/services/mapper/component-mappers/index.mjs +0 -23
- package/esm2022/lib/services/mapper/component-mappers/lang-modal.mapper.mjs +0 -14
- package/esm2022/lib/services/mapper/component-mappers/legal-footer.mapper.mjs +0 -9
- package/esm2022/lib/services/mapper/component-mappers/links-footer.mapper.mjs +0 -5
- package/esm2022/lib/services/mapper/component-mappers/nav-modal.mapper.mjs +0 -48
- package/esm2022/lib/services/mapper/component-mappers/section-intro.mapper.mjs +0 -9
- package/esm2022/lib/services/mapper/component-mappers/social-footer.mapper.mjs +0 -7
- package/esm2022/lib/services/mapper/component-mappers/types.mjs +0 -2
- package/esm2022/lib/services/mapper/component-mappers/visual-footer.mapper.mjs +0 -18
- package/esm2022/lib/services/mapper/index.mjs +0 -3
- package/esm2022/lib/services/mapper/mapper.service.mjs +0 -45
- package/esm2022/lib/services/screen-sizer/index.mjs +0 -2
- package/esm2022/lib/services/screen-sizer/screen-sizer.service.mjs +0 -84
- package/esm2022/lib/services/theme/index.mjs +0 -2
- package/esm2022/lib/services/theme/theme.service.mjs +0 -73
- package/esm2022/lib/utils/index.mjs +0 -2
- package/esm2022/lib/utils/utils.mjs +0 -38
- package/esm2022/lluc_llull-ui-lib.mjs +0 -5
- package/esm2022/public-api.mjs +0 -21
- /package/lib/{components/effects → effects}/dynamic-background/dynamic-background.component.d.ts +0 -0
- /package/lib/{components/effects → effects}/dynamic-background/effects/dynamic-effect.interface.d.ts +0 -0
- /package/lib/{components/effects → effects}/dynamic-background/effects/effect-registry.d.ts +0 -0
- /package/lib/{components/effects → effects}/dynamic-background/index.d.ts +0 -0
- /package/lib/{components/effects → effects}/index.d.ts +0 -0
- /package/lib/{directives → sliders}/swiper.directive.d.ts +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as i1$1 from '@angular/common';
|
|
2
2
|
import { CommonModule, isPlatformBrowser } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Input, ChangeDetectionStrategy, Component, EventEmitter, inject, PLATFORM_ID, HostListener, Output, Directive, NgModule, Optional, Inject, Injectable, ViewChild, signal } from '@angular/core';
|
|
4
|
+
import { Input, ChangeDetectionStrategy, Component, EventEmitter, inject, PLATFORM_ID, HostListener, Output, Directive, NgModule, Optional, Inject, Injectable, ViewChild, InjectionToken, signal } from '@angular/core';
|
|
5
5
|
import * as i1 from '@angular/router';
|
|
6
|
+
import * as simpleIcons from 'simple-icons';
|
|
7
|
+
import * as i1$2 from 'lucide-angular';
|
|
8
|
+
import { Twitter, ArrowLeft, ArrowRight, ArrowUpRight, LucideAngularModule } from 'lucide-angular';
|
|
6
9
|
import Swiper from 'swiper';
|
|
7
10
|
import { Navigation, Pagination, Autoplay } from 'swiper/modules';
|
|
8
|
-
import { siX, siYoutube, siTiktok, siFacebook, siInstagram } from 'simple-icons';
|
|
9
|
-
import * as i1$2 from 'lucide-angular';
|
|
10
|
-
import { ArrowLeft, ArrowRight, ArrowUpRight, LucideAngularModule } from 'lucide-angular';
|
|
11
11
|
import * as i1$3 from '@angular/material/dialog';
|
|
12
12
|
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
13
13
|
import { BehaviorSubject, fromEvent } from 'rxjs';
|
|
@@ -15,10 +15,13 @@ import * as THREE from 'three';
|
|
|
15
15
|
import { debounceTime, map, distinctUntilChanged, startWith } from 'rxjs/operators';
|
|
16
16
|
|
|
17
17
|
class CategoryProgressComponent {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
pretitle;
|
|
19
|
+
title;
|
|
20
|
+
categories;
|
|
21
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: CategoryProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: CategoryProgressComponent, isStandalone: true, selector: "lib-category-progress", inputs: { pretitle: "pretitle", title: "title", categories: "categories" }, ngImport: i0, template: "<div class=\"category-progress\">\n @if (pretitle) {\n <h3 class=\"pretitle\">{{ pretitle }}</h3>\n }\n @if (title) {\n <h2 class=\"title\">{{ title }}</h2>\n }\n <div class=\"progress-grid\">\n @for (category of categories; track $index) {\n <div class=\"category\">\n <h3 class=\"subtitle\">{{ category.title }}</h3>\n\n @for (item of category.items; track $index) {\n <div class=\"item\">\n <span class=\"label\">{{ item.label }}</span>\n <div class=\"bar\">\n <div class=\"fill\" [style.width.%]=\"item.value\"></div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.category-progress{text-align:start;padding:2rem 10rem;align-items:start}@media (max-width: 768px){.category-progress{padding:2rem 4rem}}.title{text-transform:uppercase}.progress-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:2rem}.category{display:flex;flex-direction:column;gap:1.5rem}.category-title{font-weight:600;font-size:1.1rem}.item .label{font-size:.9rem;margin-bottom:.3rem;display:block}.item .bar{background-color:var(--progress-bg);height:6px;border-radius:3px;overflow:hidden}.item .bar .fill{background-color:var(--progress-color);height:100%;width:0;transition:width .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
20
23
|
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: CategoryProgressComponent, decorators: [{
|
|
22
25
|
type: Component,
|
|
23
26
|
args: [{ selector: 'lib-category-progress', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"category-progress\">\n @if (pretitle) {\n <h3 class=\"pretitle\">{{ pretitle }}</h3>\n }\n @if (title) {\n <h2 class=\"title\">{{ title }}</h2>\n }\n <div class=\"progress-grid\">\n @for (category of categories; track $index) {\n <div class=\"category\">\n <h3 class=\"subtitle\">{{ category.title }}</h3>\n\n @for (item of category.items; track $index) {\n <div class=\"item\">\n <span class=\"label\">{{ item.label }}</span>\n <div class=\"bar\">\n <div class=\"fill\" [style.width.%]=\"item.value\"></div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":root{--font-titles: \"Bebas Neue\", system-ui, sans-serif;--font-base: \"Inter\", system-ui, sans-serif;--font-size-base: 16px;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 2rem}.category-progress{text-align:start;padding:2rem 10rem;align-items:start}@media (max-width: 768px){.category-progress{padding:2rem 4rem}}.title{text-transform:uppercase}.progress-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:2rem}.category{display:flex;flex-direction:column;gap:1.5rem}.category-title{font-weight:600;font-size:1.1rem}.item .label{font-size:.9rem;margin-bottom:.3rem;display:block}.item .bar{background-color:var(--progress-bg);height:6px;border-radius:3px;overflow:hidden}.item .bar .fill{background-color:var(--progress-color);height:100%;width:0;transition:width .3s ease}\n"] }]
|
|
24
27
|
}], propDecorators: { pretitle: [{
|
|
@@ -39,11 +42,15 @@ var LinkType;
|
|
|
39
42
|
})(LinkType || (LinkType = {}));
|
|
40
43
|
|
|
41
44
|
class LinkTypeDirective {
|
|
45
|
+
router;
|
|
46
|
+
elRef;
|
|
47
|
+
linkType;
|
|
48
|
+
href;
|
|
49
|
+
anchorClicked = new EventEmitter();
|
|
50
|
+
platformId = inject(PLATFORM_ID);
|
|
42
51
|
constructor(router, elRef) {
|
|
43
52
|
this.router = router;
|
|
44
53
|
this.elRef = elRef;
|
|
45
|
-
this.anchorClicked = new EventEmitter();
|
|
46
|
-
this.platformId = inject(PLATFORM_ID);
|
|
47
54
|
}
|
|
48
55
|
ngOnInit() {
|
|
49
56
|
this.setupLinkAttributes();
|
|
@@ -83,9 +90,8 @@ class LinkTypeDirective {
|
|
|
83
90
|
}
|
|
84
91
|
}
|
|
85
92
|
navigateInternal(url) {
|
|
86
|
-
const cleanedUrl = url.trim().replace(/\/+$/, '');
|
|
87
93
|
this.anchorClicked.emit();
|
|
88
|
-
this.router.navigateByUrl(
|
|
94
|
+
this.router.navigateByUrl(url);
|
|
89
95
|
}
|
|
90
96
|
openExternal(url) {
|
|
91
97
|
if (isPlatformBrowser(this.platformId)) {
|
|
@@ -118,10 +124,10 @@ class LinkTypeDirective {
|
|
|
118
124
|
element.style.pointerEvents = 'none';
|
|
119
125
|
}
|
|
120
126
|
}
|
|
121
|
-
static
|
|
122
|
-
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 });
|
|
123
129
|
}
|
|
124
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinkTypeDirective, decorators: [{
|
|
125
131
|
type: Directive,
|
|
126
132
|
args: [{
|
|
127
133
|
selector: '[linkType]',
|
|
@@ -139,10 +145,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
139
145
|
}] } });
|
|
140
146
|
|
|
141
147
|
class HeroSectionComponent {
|
|
142
|
-
|
|
143
|
-
|
|
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 });
|
|
144
156
|
}
|
|
145
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeroSectionComponent, decorators: [{
|
|
146
158
|
type: Component,
|
|
147
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"] }]
|
|
148
160
|
}], propDecorators: { pretitle: [{
|
|
@@ -183,10 +195,15 @@ const Default = {
|
|
|
183
195
|
};
|
|
184
196
|
|
|
185
197
|
class SectionIntroComponent {
|
|
186
|
-
|
|
187
|
-
|
|
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 });
|
|
188
205
|
}
|
|
189
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
206
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SectionIntroComponent, decorators: [{
|
|
190
207
|
type: Component,
|
|
191
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"] }]
|
|
192
209
|
}], propDecorators: { pretitle: [{
|
|
@@ -201,53 +218,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
201
218
|
type: Input
|
|
202
219
|
}] } });
|
|
203
220
|
|
|
204
|
-
Swiper.use([Navigation, Pagination, Autoplay]);
|
|
205
|
-
class SwiperDirective {
|
|
206
|
-
constructor(el) {
|
|
207
|
-
this.el = el;
|
|
208
|
-
}
|
|
209
|
-
ngAfterViewInit() {
|
|
210
|
-
this.swiperInstance = new Swiper(this.el.nativeElement, {
|
|
211
|
-
spaceBetween: 16,
|
|
212
|
-
navigation: {
|
|
213
|
-
nextEl: '.swiper-button-next',
|
|
214
|
-
prevEl: '.swiper-button-prev',
|
|
215
|
-
},
|
|
216
|
-
pagination: { clickable: true },
|
|
217
|
-
breakpoints: {
|
|
218
|
-
0: { slidesPerView: 1 }, // móviles
|
|
219
|
-
480: { slidesPerView: 1 }, // small tablets
|
|
220
|
-
768: { slidesPerView: 3 }, // tablets
|
|
221
|
-
1024: { slidesPerView: 4 }, // laptops
|
|
222
|
-
1280: { slidesPerView: 7 }, // desktop → máximo 7
|
|
223
|
-
},
|
|
224
|
-
...this.swiperConfig,
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
ngOnDestroy() {
|
|
228
|
-
this.swiperInstance?.destroy(true, true);
|
|
229
|
-
}
|
|
230
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwiperDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
231
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SwiperDirective, isStandalone: true, selector: "[appSwiper]", inputs: { swiperConfig: "swiperConfig" }, ngImport: i0 }); }
|
|
232
|
-
}
|
|
233
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwiperDirective, decorators: [{
|
|
234
|
-
type: Directive,
|
|
235
|
-
args: [{
|
|
236
|
-
selector: '[appSwiper]',
|
|
237
|
-
standalone: true,
|
|
238
|
-
}]
|
|
239
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { swiperConfig: [{
|
|
240
|
-
type: Input
|
|
241
|
-
}] } });
|
|
242
|
-
|
|
243
221
|
class LegalFooterComponent {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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"] }] });
|
|
249
229
|
}
|
|
250
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
230
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LegalFooterComponent, decorators: [{
|
|
251
231
|
type: Component,
|
|
252
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"] }]
|
|
253
233
|
}], propDecorators: { year: [{
|
|
@@ -263,10 +243,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
263
243
|
}] } });
|
|
264
244
|
|
|
265
245
|
class LinksFooterComponent {
|
|
266
|
-
|
|
267
|
-
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 });
|
|
268
249
|
}
|
|
269
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
250
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LinksFooterComponent, decorators: [{
|
|
270
251
|
type: Component,
|
|
271
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"] }]
|
|
272
253
|
}], propDecorators: { links: [{
|
|
@@ -277,13 +258,14 @@ const icons = {
|
|
|
277
258
|
ArrowUpRight,
|
|
278
259
|
ArrowRight,
|
|
279
260
|
ArrowLeft,
|
|
261
|
+
Twitter
|
|
280
262
|
};
|
|
281
263
|
class IconsModule {
|
|
282
|
-
static
|
|
283
|
-
static
|
|
284
|
-
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] });
|
|
285
267
|
}
|
|
286
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
268
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: IconsModule, decorators: [{
|
|
287
269
|
type: NgModule,
|
|
288
270
|
args: [{
|
|
289
271
|
imports: [LucideAngularModule.pick(icons)],
|
|
@@ -291,31 +273,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
291
273
|
}]
|
|
292
274
|
}] });
|
|
293
275
|
|
|
294
|
-
const brandIcons = {
|
|
295
|
-
instagram: siInstagram,
|
|
296
|
-
facebook: siFacebook,
|
|
297
|
-
tiktok: siTiktok,
|
|
298
|
-
youtube: siYoutube,
|
|
299
|
-
twitter: siX,
|
|
300
|
-
x: siX,
|
|
301
|
-
};
|
|
302
276
|
class UiIconComponent {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
277
|
+
name;
|
|
278
|
+
size = 24;
|
|
279
|
+
color = 'currentColor';
|
|
280
|
+
icon;
|
|
281
|
+
ngOnChanges() {
|
|
282
|
+
this.icon = this.resolveBrandIcon();
|
|
306
283
|
}
|
|
307
284
|
get isBrandIcon() {
|
|
308
|
-
return !!
|
|
285
|
+
return !!this.icon;
|
|
309
286
|
}
|
|
310
287
|
get brandIcon() {
|
|
311
|
-
return
|
|
288
|
+
return this.icon ?? null;
|
|
289
|
+
}
|
|
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;
|
|
312
295
|
}
|
|
313
|
-
static
|
|
314
|
-
static
|
|
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"] }] });
|
|
315
298
|
}
|
|
316
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
299
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: UiIconComponent, decorators: [{
|
|
317
300
|
type: Component,
|
|
318
|
-
args: [{ selector: 'ui-icon', standalone: true, imports: [CommonModule, IconsModule], template: "<!-- SimpleIcons -->\n<ng-container *ngIf=\"isBrandIcon; else lucideIcon\">\n <svg\n class=\"ui-icon ui-icon--brand\"\n [attr.width]=\"size\"\n [attr.height]=\"size\"\n [attr.fill]=\"color\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path [attr.d]=\"brandIcon
|
|
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"] }]
|
|
319
302
|
}], propDecorators: { name: [{
|
|
320
303
|
type: Input
|
|
321
304
|
}], size: [{
|
|
@@ -324,11 +307,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
324
307
|
type: Input
|
|
325
308
|
}] } });
|
|
326
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
|
+
|
|
327
352
|
class SocialFooterComponent {
|
|
328
|
-
|
|
329
|
-
|
|
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 });
|
|
330
358
|
}
|
|
331
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
359
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: SocialFooterComponent, decorators: [{
|
|
332
360
|
type: Component,
|
|
333
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"] }]
|
|
334
362
|
}], propDecorators: { images: [{
|
|
@@ -340,10 +368,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
340
368
|
}] } });
|
|
341
369
|
|
|
342
370
|
class VisualFooterComponent {
|
|
343
|
-
|
|
344
|
-
|
|
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 });
|
|
345
381
|
}
|
|
346
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
382
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: VisualFooterComponent, decorators: [{
|
|
347
383
|
type: Component,
|
|
348
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"] }]
|
|
349
385
|
}], propDecorators: { contactTitle: [{
|
|
@@ -364,14 +400,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
364
400
|
type: Input
|
|
365
401
|
}] } });
|
|
366
402
|
|
|
367
|
-
const mapLangModal = (
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
return
|
|
371
|
-
const
|
|
372
|
-
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;
|
|
373
408
|
return {
|
|
374
|
-
id: lang.id,
|
|
409
|
+
id: lang.id ?? index,
|
|
375
410
|
code: lang.code,
|
|
376
411
|
label,
|
|
377
412
|
};
|
|
@@ -379,6 +414,9 @@ const mapLangModal = (props, currentLang = 'es') => {
|
|
|
379
414
|
};
|
|
380
415
|
|
|
381
416
|
class LangModalComponent {
|
|
417
|
+
data;
|
|
418
|
+
dialogRef;
|
|
419
|
+
langs;
|
|
382
420
|
constructor(data, dialogRef) {
|
|
383
421
|
this.data = data;
|
|
384
422
|
this.dialogRef = dialogRef;
|
|
@@ -390,12 +428,12 @@ class LangModalComponent {
|
|
|
390
428
|
closeModal() {
|
|
391
429
|
this.dialogRef?.close();
|
|
392
430
|
}
|
|
393
|
-
static
|
|
394
|
-
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 });
|
|
395
433
|
}
|
|
396
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
434
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: LangModalComponent, decorators: [{
|
|
397
435
|
type: Component,
|
|
398
|
-
args: [{ selector: 'lib-lang-modal', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n @if (langs && langs.length > 0) {\n <ol>\n @for (lang of langs; track
|
|
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"] }]
|
|
399
437
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
400
438
|
type: Optional
|
|
401
439
|
}, {
|
|
@@ -406,18 +444,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
406
444
|
}] }] });
|
|
407
445
|
|
|
408
446
|
class NavModalComponent {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
447
|
+
navItems;
|
|
448
|
+
socialItems;
|
|
449
|
+
close = new EventEmitter();
|
|
412
450
|
closeModal() {
|
|
413
451
|
this.close.emit();
|
|
414
452
|
}
|
|
415
|
-
static
|
|
416
|
-
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 });
|
|
417
455
|
}
|
|
418
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
456
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: NavModalComponent, decorators: [{
|
|
419
457
|
type: Component,
|
|
420
|
-
args: [{ selector: 'lib-nav-modal', standalone: true, imports: [CommonModule, LinkTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-content\">\n <button (click)=\"closeModal()\" class=\"close-btn\">\u2715</button>\n @if (navItems
|
|
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"] }]
|
|
421
459
|
}], propDecorators: { navItems: [{
|
|
422
460
|
type: Input
|
|
423
461
|
}], socialItems: [{
|
|
@@ -426,11 +464,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
426
464
|
type: Output
|
|
427
465
|
}] } });
|
|
428
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
|
+
|
|
429
495
|
class ThemeService {
|
|
496
|
+
platformId;
|
|
497
|
+
currentThemeSubject = new BehaviorSubject('light');
|
|
498
|
+
currentTheme$ = this.currentThemeSubject.asObservable();
|
|
430
499
|
constructor(platformId) {
|
|
431
500
|
this.platformId = platformId;
|
|
432
|
-
this.currentThemeSubject = new BehaviorSubject('light');
|
|
433
|
-
this.currentTheme$ = this.currentThemeSubject.asObservable();
|
|
434
501
|
// Aplicar tema por defecto al inicio
|
|
435
502
|
if (isPlatformBrowser(this.platformId)) {
|
|
436
503
|
this.applyTheme('light');
|
|
@@ -482,10 +549,10 @@ class ThemeService {
|
|
|
482
549
|
root.setAttribute('data-theme', 'light');
|
|
483
550
|
}
|
|
484
551
|
}
|
|
485
|
-
static
|
|
486
|
-
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' });
|
|
487
554
|
}
|
|
488
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
555
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ThemeService, decorators: [{
|
|
489
556
|
type: Injectable,
|
|
490
557
|
args: [{
|
|
491
558
|
providedIn: 'root',
|
|
@@ -496,18 +563,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
496
563
|
}] }] });
|
|
497
564
|
|
|
498
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();
|
|
499
579
|
constructor(themeService) {
|
|
500
580
|
this.themeService = themeService;
|
|
501
|
-
this.isMenuOpen = false;
|
|
502
|
-
this.currentTheme = 'light';
|
|
503
|
-
this.langModal = new EventEmitter();
|
|
504
|
-
this.theme = new EventEmitter();
|
|
505
581
|
}
|
|
506
582
|
ngOnInit() {
|
|
507
583
|
this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {
|
|
508
584
|
this.currentTheme = theme;
|
|
509
585
|
});
|
|
510
586
|
}
|
|
587
|
+
ngOnChanges() {
|
|
588
|
+
this.navItems = mapNavModal(this.navigation, this.lang);
|
|
589
|
+
}
|
|
511
590
|
ngOnDestroy() {
|
|
512
591
|
this.themeSubscription?.unsubscribe();
|
|
513
592
|
}
|
|
@@ -524,24 +603,26 @@ class HeaderClearComponent {
|
|
|
524
603
|
getThemeIcon() {
|
|
525
604
|
return this.currentTheme === 'light' ? '🌙' : '☀️';
|
|
526
605
|
}
|
|
527
|
-
static
|
|
528
|
-
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 });
|
|
529
608
|
}
|
|
530
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
609
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderClearComponent, decorators: [{
|
|
531
610
|
type: Component,
|
|
532
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"] }]
|
|
533
612
|
}], ctorParameters: () => [{ type: ThemeService }], propDecorators: { logo: [{
|
|
534
613
|
type: Input
|
|
535
614
|
}], logoDark: [{
|
|
536
615
|
type: Input
|
|
537
|
-
}], lang: [{
|
|
538
|
-
type: Input
|
|
539
616
|
}], navItems: [{
|
|
540
617
|
type: Input
|
|
541
618
|
}], socialItems: [{
|
|
542
619
|
type: Input
|
|
543
620
|
}], homeLink: [{
|
|
544
621
|
type: Input
|
|
622
|
+
}], navigation: [{
|
|
623
|
+
type: Input
|
|
624
|
+
}], lang: [{
|
|
625
|
+
type: Input
|
|
545
626
|
}], langModal: [{
|
|
546
627
|
type: Output
|
|
547
628
|
}], theme: [{
|
|
@@ -549,18 +630,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
549
630
|
}] } });
|
|
550
631
|
|
|
551
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();
|
|
552
646
|
constructor(themeService) {
|
|
553
647
|
this.themeService = themeService;
|
|
554
|
-
this.isMenuOpen = false;
|
|
555
|
-
this.currentTheme = 'light';
|
|
556
|
-
this.langModal = new EventEmitter();
|
|
557
|
-
this.theme = new EventEmitter();
|
|
558
648
|
}
|
|
559
649
|
ngOnInit() {
|
|
560
650
|
this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {
|
|
561
651
|
this.currentTheme = theme;
|
|
562
652
|
});
|
|
563
653
|
}
|
|
654
|
+
ngOnChanges() {
|
|
655
|
+
this.navItems = mapNavModal(this.navigation, this.lang);
|
|
656
|
+
}
|
|
564
657
|
ngOnDestroy() {
|
|
565
658
|
this.themeSubscription?.unsubscribe();
|
|
566
659
|
}
|
|
@@ -577,24 +670,26 @@ class HeaderMobileComponent {
|
|
|
577
670
|
getThemeIcon() {
|
|
578
671
|
return this.currentTheme === 'light' ? '🌙' : '☀️';
|
|
579
672
|
}
|
|
580
|
-
static
|
|
581
|
-
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 });
|
|
582
675
|
}
|
|
583
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
676
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: HeaderMobileComponent, decorators: [{
|
|
584
677
|
type: Component,
|
|
585
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"] }]
|
|
586
679
|
}], ctorParameters: () => [{ type: ThemeService }], propDecorators: { logo: [{
|
|
587
680
|
type: Input
|
|
588
681
|
}], logoDark: [{
|
|
589
682
|
type: Input
|
|
590
|
-
}], lang: [{
|
|
591
|
-
type: Input
|
|
592
683
|
}], navItems: [{
|
|
593
684
|
type: Input
|
|
594
685
|
}], socialItems: [{
|
|
595
686
|
type: Input
|
|
596
687
|
}], homeLink: [{
|
|
597
688
|
type: Input
|
|
689
|
+
}], navigation: [{
|
|
690
|
+
type: Input
|
|
691
|
+
}], lang: [{
|
|
692
|
+
type: Input
|
|
598
693
|
}], langModal: [{
|
|
599
694
|
type: Output
|
|
600
695
|
}], theme: [{
|
|
@@ -602,11 +697,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
602
697
|
}] } });
|
|
603
698
|
|
|
604
699
|
class SphereDeformEffect {
|
|
700
|
+
size;
|
|
701
|
+
rotationSpeed;
|
|
702
|
+
color;
|
|
703
|
+
mesh;
|
|
704
|
+
time = 0;
|
|
605
705
|
constructor(size, rotationSpeed, color) {
|
|
606
706
|
this.size = size;
|
|
607
707
|
this.rotationSpeed = rotationSpeed;
|
|
608
708
|
this.color = color;
|
|
609
|
-
this.time = 0;
|
|
610
709
|
}
|
|
611
710
|
init(scene, _options) {
|
|
612
711
|
const geometry = new THREE.SphereGeometry(this.size, 128, 128);
|
|
@@ -644,26 +743,19 @@ const EFFECT_REGISTRY = {
|
|
|
644
743
|
};
|
|
645
744
|
|
|
646
745
|
class DynamicBackgroundComponent {
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
const width = window.innerWidth;
|
|
661
|
-
const height = window.innerHeight;
|
|
662
|
-
this.camera.aspect = width / height;
|
|
663
|
-
this.camera.updateProjectionMatrix();
|
|
664
|
-
this.renderer.setSize(width, height);
|
|
665
|
-
};
|
|
666
|
-
}
|
|
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;
|
|
667
759
|
ngOnInit() {
|
|
668
760
|
if (this.isBrowser) {
|
|
669
761
|
this.initScene();
|
|
@@ -704,10 +796,22 @@ class DynamicBackgroundComponent {
|
|
|
704
796
|
this.currentEffect = new EffectClass(this.size, this.rotationSpeed, this.elementColor);
|
|
705
797
|
this.currentEffect.init(this.scene, {});
|
|
706
798
|
}
|
|
707
|
-
|
|
708
|
-
|
|
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 });
|
|
709
813
|
}
|
|
710
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
814
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicBackgroundComponent, decorators: [{
|
|
711
815
|
type: Component,
|
|
712
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"] }]
|
|
713
817
|
}], propDecorators: { canvasRef: [{
|
|
@@ -749,93 +853,38 @@ function mapButtons(data) {
|
|
|
749
853
|
icon: item.icon,
|
|
750
854
|
}));
|
|
751
855
|
}
|
|
752
|
-
function mapImage(data) {
|
|
856
|
+
function mapImage(data, cdn) {
|
|
753
857
|
if (!data || typeof data !== 'object')
|
|
754
858
|
return null;
|
|
859
|
+
const src = data.url ?? data.src ?? '';
|
|
755
860
|
return {
|
|
756
|
-
url:
|
|
861
|
+
url: src.startsWith('http') ? src : (cdn ?? '') + src,
|
|
757
862
|
alt: data.alt ?? '',
|
|
758
863
|
width: data.width,
|
|
759
864
|
height: data.height,
|
|
760
865
|
format: data.format,
|
|
761
866
|
};
|
|
762
867
|
}
|
|
763
|
-
function mapImageOrGallery(data) {
|
|
868
|
+
function mapImageOrGallery(data, cdn) {
|
|
764
869
|
if (!data)
|
|
765
870
|
return [];
|
|
766
|
-
// Si es array → galería
|
|
767
871
|
if (Array.isArray(data)) {
|
|
768
872
|
return data
|
|
769
873
|
.filter((img) => img && typeof img === 'object')
|
|
770
|
-
.map((img) => mapImage(img))
|
|
874
|
+
.map((img) => mapImage(img, cdn))
|
|
771
875
|
.filter(Boolean);
|
|
772
876
|
}
|
|
773
|
-
|
|
774
|
-
const single = mapImage(data);
|
|
877
|
+
const single = mapImage(data, cdn);
|
|
775
878
|
return single ? [single] : [];
|
|
776
879
|
}
|
|
777
880
|
|
|
778
|
-
|
|
779
|
-
const isArray = Array.isArray;
|
|
780
|
-
const isHttp = (u) => !!u && /^https?:\/\//i.test(u ?? '');
|
|
781
|
-
const mapNavModalWithLang = (props, _langCode) => mapNavModal(props);
|
|
782
|
-
const mapNavModal = (props) => {
|
|
783
|
-
if (!isArray(props))
|
|
784
|
-
return [];
|
|
785
|
-
return props
|
|
786
|
-
.map((item) => {
|
|
787
|
-
const link = item?.nav_link ?? {};
|
|
788
|
-
const url = link.url ?? link.external_url ?? undefined;
|
|
789
|
-
const mapped = {
|
|
790
|
-
label: item?.label ?? link?.name ?? '',
|
|
791
|
-
url,
|
|
792
|
-
linkType: link?.linktype,
|
|
793
|
-
name: link?.name,
|
|
794
|
-
active: link?.active ?? true,
|
|
795
|
-
children: isArray(link?.children) ? link.children : [], // UiLibButtonI[]
|
|
796
|
-
};
|
|
797
|
-
if (!mapped.label || !mapped.url)
|
|
798
|
-
return null;
|
|
799
|
-
return mapped;
|
|
800
|
-
})
|
|
801
|
-
.filter((x) => !!x);
|
|
802
|
-
};
|
|
803
|
-
const mapSocialLinks = (props) => {
|
|
804
|
-
if (!isArray(props))
|
|
805
|
-
return [];
|
|
806
|
-
return props
|
|
807
|
-
.map((item) => {
|
|
808
|
-
const link = item?.nav_link ?? item ?? {};
|
|
809
|
-
const url = link.url ?? link.external_url ?? undefined;
|
|
810
|
-
const mapped = {
|
|
811
|
-
label: item?.label ?? link?.name ?? '',
|
|
812
|
-
url: url ?? '',
|
|
813
|
-
linkType: link?.linktype ?? (isHttp(url) ? 'external' : 'internal'),
|
|
814
|
-
icon: (item?.icon ?? link?.icon ?? ''),
|
|
815
|
-
order: item?.order ?? link?.order,
|
|
816
|
-
};
|
|
817
|
-
if (!mapped.label || !mapped.url)
|
|
818
|
-
return null;
|
|
819
|
-
if (mapped.icon == null)
|
|
820
|
-
mapped.icon = '';
|
|
821
|
-
return mapped;
|
|
822
|
-
})
|
|
823
|
-
.filter((x) => !!x);
|
|
824
|
-
};
|
|
825
|
-
|
|
826
|
-
const mapHeaderClear = (props) => {
|
|
827
|
-
// Obtener el idioma de las props
|
|
828
|
-
const currentLang = props?.lang || 'es';
|
|
829
|
-
// Mapear solo los navLinks del nav-modal con el idioma correcto
|
|
830
|
-
const navItems = mapNavModalWithLang(props?.['nav-modal']?.navLinks || [], currentLang);
|
|
831
|
-
const socialItems = mapSocialLinks(props?.['nav-modal']?.socialLinks || []);
|
|
881
|
+
const mapHeaderClear = (props, cdn) => {
|
|
832
882
|
return {
|
|
833
|
-
logo: mapImage(props?.logo),
|
|
834
|
-
logoDark: mapImage(props?.logoDark),
|
|
835
|
-
lang:
|
|
836
|
-
|
|
837
|
-
socialItems:
|
|
838
|
-
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),
|
|
839
888
|
};
|
|
840
889
|
};
|
|
841
890
|
|
|
@@ -894,7 +943,6 @@ const mapVisualFooter = (props) => ({
|
|
|
894
943
|
const componentMappers = {
|
|
895
944
|
'hero-section': mapHeroSection,
|
|
896
945
|
'header-clear': mapHeaderClear,
|
|
897
|
-
'nav-modal': mapNavModal,
|
|
898
946
|
'lang-modal': mapLangModal,
|
|
899
947
|
'section-intro': mapSectionIntro,
|
|
900
948
|
'category-progress': mapCategoryProgress,
|
|
@@ -904,10 +952,11 @@ const componentMappers = {
|
|
|
904
952
|
'visual-footer': mapVisualFooter,
|
|
905
953
|
};
|
|
906
954
|
|
|
955
|
+
const CDN_BASE_URL = new InjectionToken('CDN_BASE_URL');
|
|
956
|
+
|
|
907
957
|
class MapperService {
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
}
|
|
958
|
+
platformId = inject(PLATFORM_ID);
|
|
959
|
+
cdn = inject(CDN_BASE_URL);
|
|
911
960
|
mapComponents(body) {
|
|
912
961
|
if (!body || body.length === 0) {
|
|
913
962
|
return [];
|
|
@@ -924,7 +973,7 @@ class MapperService {
|
|
|
924
973
|
};
|
|
925
974
|
if (mapper) {
|
|
926
975
|
try {
|
|
927
|
-
mapped.props = mapper(component.props);
|
|
976
|
+
mapped.props = mapper(component.props, this.cdn);
|
|
928
977
|
}
|
|
929
978
|
catch (e) {
|
|
930
979
|
console.error(`Error mapping props for component "${name}"`, e);
|
|
@@ -936,10 +985,10 @@ class MapperService {
|
|
|
936
985
|
return mapped;
|
|
937
986
|
});
|
|
938
987
|
}
|
|
939
|
-
static
|
|
940
|
-
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' });
|
|
941
990
|
}
|
|
942
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
991
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MapperService, decorators: [{
|
|
943
992
|
type: Injectable,
|
|
944
993
|
args: [{
|
|
945
994
|
providedIn: 'root',
|
|
@@ -947,6 +996,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
947
996
|
}] });
|
|
948
997
|
|
|
949
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);
|
|
950
1016
|
get width() {
|
|
951
1017
|
if (isPlatformBrowser(this.platformId)) {
|
|
952
1018
|
return Math.min(window.innerWidth, window.outerWidth);
|
|
@@ -954,23 +1020,6 @@ class ScreenSizerService {
|
|
|
954
1020
|
return 0;
|
|
955
1021
|
}
|
|
956
1022
|
constructor() {
|
|
957
|
-
this.breakpoints = {
|
|
958
|
-
xs: 480,
|
|
959
|
-
sm: 768,
|
|
960
|
-
md: 1024,
|
|
961
|
-
lg: 1280,
|
|
962
|
-
xl: 1536,
|
|
963
|
-
};
|
|
964
|
-
this.isXs = signal(false);
|
|
965
|
-
this.isSm = signal(false);
|
|
966
|
-
this.isMd = signal(false);
|
|
967
|
-
this.isLg = signal(false);
|
|
968
|
-
this.isXl = signal(false);
|
|
969
|
-
this.minSm = signal(false);
|
|
970
|
-
this.minMd = signal(false);
|
|
971
|
-
this.minLg = signal(false);
|
|
972
|
-
this.minXl = signal(false);
|
|
973
|
-
this.platformId = inject(PLATFORM_ID);
|
|
974
1023
|
if (isPlatformBrowser(this.platformId)) {
|
|
975
1024
|
fromEvent(window, 'resize')
|
|
976
1025
|
.pipe(debounceTime(200), map(() => this.width), distinctUntilChanged(), startWith(this.width))
|
|
@@ -1017,10 +1066,10 @@ class ScreenSizerService {
|
|
|
1017
1066
|
minXlInstant() {
|
|
1018
1067
|
return this.minXl();
|
|
1019
1068
|
}
|
|
1020
|
-
static
|
|
1021
|
-
static
|
|
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' });
|
|
1022
1071
|
}
|
|
1023
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1072
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: ScreenSizerService, decorators: [{
|
|
1024
1073
|
type: Injectable,
|
|
1025
1074
|
args: [{ providedIn: 'root' }]
|
|
1026
1075
|
}], ctorParameters: () => [] });
|
|
@@ -1035,5 +1084,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1035
1084
|
* Generated bundle index. Do not edit.
|
|
1036
1085
|
*/
|
|
1037
1086
|
|
|
1038
|
-
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 };
|
|
1039
1088
|
//# sourceMappingURL=lluc_llull-ui-lib.mjs.map
|