@lluc_llull/ui-lib 0.34.0 → 0.34.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/lluc_llull-ui-lib-footers-columns-footer.mjs +4 -4
- package/fesm2022/lluc_llull-ui-lib-footers-columns-footer.mjs.map +1 -1
- package/fesm2022/lluc_llull-ui-lib-footers.mjs +4 -4
- package/fesm2022/lluc_llull-ui-lib-footers.mjs.map +1 -1
- package/fesm2022/lluc_llull-ui-lib-headers-header-clear.mjs +24 -4
- package/fesm2022/lluc_llull-ui-lib-headers-header-clear.mjs.map +1 -1
- package/fesm2022/lluc_llull-ui-lib-headers-header-mobile.mjs +24 -4
- package/fesm2022/lluc_llull-ui-lib-headers-header-mobile.mjs.map +1 -1
- package/fesm2022/lluc_llull-ui-lib-headers.mjs +48 -8
- package/fesm2022/lluc_llull-ui-lib-headers.mjs.map +1 -1
- package/fesm2022/lluc_llull-ui-lib-modals.mjs +38 -40
- package/fesm2022/lluc_llull-ui-lib-modals.mjs.map +1 -1
- package/fesm2022/lluc_llull-ui-lib-shared.mjs +25 -1
- package/fesm2022/lluc_llull-ui-lib-shared.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/styles/main.css +16 -1
- package/styles/main.css +16 -1
- package/types/lluc_llull-ui-lib-headers-header-clear.d.ts +3 -0
- package/types/lluc_llull-ui-lib-headers-header-mobile.d.ts +3 -0
- package/types/lluc_llull-ui-lib-headers.d.ts +6 -0
- package/types/lluc_llull-ui-lib-modals.d.ts +23 -16
|
@@ -9,6 +9,7 @@ import * as i1 from "@lluc_llull/ui-lib/theme";
|
|
|
9
9
|
var HeaderClearComponent = class HeaderClearComponent {
|
|
10
10
|
themeService;
|
|
11
11
|
isMenuOpen = false;
|
|
12
|
+
isMenuClosing = false;
|
|
12
13
|
currentTheme = "light";
|
|
13
14
|
themeSubscription;
|
|
14
15
|
logo;
|
|
@@ -42,7 +43,22 @@ var HeaderClearComponent = class HeaderClearComponent {
|
|
|
42
43
|
this.theme.emit();
|
|
43
44
|
}
|
|
44
45
|
toggleMenu() {
|
|
45
|
-
this.isMenuOpen
|
|
46
|
+
if (this.isMenuOpen) {
|
|
47
|
+
this.closeMenu();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.isMenuClosing = false;
|
|
51
|
+
this.isMenuOpen = true;
|
|
52
|
+
}
|
|
53
|
+
closeMenu() {
|
|
54
|
+
if (!this.isMenuOpen && !this.isMenuClosing) return;
|
|
55
|
+
this.isMenuClosing = true;
|
|
56
|
+
this.isMenuOpen = false;
|
|
57
|
+
}
|
|
58
|
+
finishMenuClose(event) {
|
|
59
|
+
if (!this.isMenuClosing || event.propertyName !== "visibility") return;
|
|
60
|
+
if (!(event.target instanceof HTMLElement) || !event.target.classList.contains("modal-content")) return;
|
|
61
|
+
this.isMenuClosing = false;
|
|
46
62
|
}
|
|
47
63
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
48
64
|
minVersion: "12.0.0",
|
|
@@ -73,7 +89,7 @@ var HeaderClearComponent = class HeaderClearComponent {
|
|
|
73
89
|
},
|
|
74
90
|
usesOnChanges: true,
|
|
75
91
|
ngImport: i0,
|
|
76
|
-
template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"
|
|
92
|
+
template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
|
|
77
93
|
styles: [".header-clear{border-radius:0;position:sticky;top:0;z-index:100;padding-block:0;margin-top:1rem;transition:background .3s ease,box-shadow .3s ease;background:var(--header-bg)}.header-clear.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-clear.is-scrolled .header-logo a{padding-inline:1.5rem}.header-clear.is-scrolled .header-logo span{color:var(--header-logo-text-dark)}.header-clear.is-scrolled .header-actions{padding-inline:1.5rem}.header-clear.is-scrolled .header-actions .btn-header{background:var(--header-bg-fixed-light)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:left}.header-logo span{display:flex;min-width:10rem}.header-actions{display:flex;align-items:center;justify-content:flex-end;gap:1rem}.lang{text-transform:uppercase}\n"],
|
|
78
94
|
dependencies: [
|
|
79
95
|
{
|
|
@@ -84,7 +100,11 @@ var HeaderClearComponent = class HeaderClearComponent {
|
|
|
84
100
|
kind: "component",
|
|
85
101
|
type: NavModalComponent,
|
|
86
102
|
selector: "lib-nav-modal",
|
|
87
|
-
inputs: [
|
|
103
|
+
inputs: [
|
|
104
|
+
"navItems",
|
|
105
|
+
"socialItems",
|
|
106
|
+
"closing"
|
|
107
|
+
],
|
|
88
108
|
outputs: ["close"]
|
|
89
109
|
},
|
|
90
110
|
{
|
|
@@ -132,7 +152,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
132
152
|
HeaderScrollDirective
|
|
133
153
|
],
|
|
134
154
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
135
|
-
template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"
|
|
155
|
+
template: "<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
|
|
136
156
|
styles: [".header-clear{border-radius:0;position:sticky;top:0;z-index:100;padding-block:0;margin-top:1rem;transition:background .3s ease,box-shadow .3s ease;background:var(--header-bg)}.header-clear.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-clear.is-scrolled .header-logo a{padding-inline:1.5rem}.header-clear.is-scrolled .header-logo span{color:var(--header-logo-text-dark)}.header-clear.is-scrolled .header-actions{padding-inline:1.5rem}.header-clear.is-scrolled .header-actions .btn-header{background:var(--header-bg-fixed-light)}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:left}.header-logo span{display:flex;min-width:10rem}.header-actions{display:flex;align-items:center;justify-content:flex-end;gap:1rem}.lang{text-transform:uppercase}\n"]
|
|
137
157
|
}]
|
|
138
158
|
}],
|
|
@@ -152,6 +172,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
152
172
|
var HeaderMobileComponent = class HeaderMobileComponent {
|
|
153
173
|
themeService;
|
|
154
174
|
isMenuOpen = false;
|
|
175
|
+
isMenuClosing = false;
|
|
155
176
|
currentTheme = "light";
|
|
156
177
|
themeSubscription;
|
|
157
178
|
logo;
|
|
@@ -185,7 +206,22 @@ var HeaderMobileComponent = class HeaderMobileComponent {
|
|
|
185
206
|
this.theme.emit();
|
|
186
207
|
}
|
|
187
208
|
toggleMenu() {
|
|
188
|
-
this.isMenuOpen
|
|
209
|
+
if (this.isMenuOpen) {
|
|
210
|
+
this.closeMenu();
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.isMenuClosing = false;
|
|
214
|
+
this.isMenuOpen = true;
|
|
215
|
+
}
|
|
216
|
+
closeMenu() {
|
|
217
|
+
if (!this.isMenuOpen && !this.isMenuClosing) return;
|
|
218
|
+
this.isMenuClosing = true;
|
|
219
|
+
this.isMenuOpen = false;
|
|
220
|
+
}
|
|
221
|
+
finishMenuClose(event) {
|
|
222
|
+
if (!this.isMenuClosing || event.propertyName !== "visibility") return;
|
|
223
|
+
if (!(event.target instanceof HTMLElement) || !event.target.classList.contains("modal-content")) return;
|
|
224
|
+
this.isMenuClosing = false;
|
|
189
225
|
}
|
|
190
226
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
191
227
|
minVersion: "12.0.0",
|
|
@@ -216,7 +252,7 @@ var HeaderMobileComponent = class HeaderMobileComponent {
|
|
|
216
252
|
},
|
|
217
253
|
usesOnChanges: true,
|
|
218
254
|
ngImport: i0,
|
|
219
|
-
template: "<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"
|
|
255
|
+
template: "<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
|
|
220
256
|
styles: [".header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;z-index:100;width:100vw;background:var(--header-bg);transition:background .3s ease,box-shadow .3s ease}.header-mobile.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:center}.header-actions{position:fixed;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;background-color:var(--header-mobile-bg);z-index:100;box-sizing:border-box}.header-actions .center{margin:0 auto}.lang{text-transform:uppercase}\n"],
|
|
221
257
|
dependencies: [
|
|
222
258
|
{
|
|
@@ -227,7 +263,11 @@ var HeaderMobileComponent = class HeaderMobileComponent {
|
|
|
227
263
|
kind: "component",
|
|
228
264
|
type: NavModalComponent,
|
|
229
265
|
selector: "lib-nav-modal",
|
|
230
|
-
inputs: [
|
|
266
|
+
inputs: [
|
|
267
|
+
"navItems",
|
|
268
|
+
"socialItems",
|
|
269
|
+
"closing"
|
|
270
|
+
],
|
|
231
271
|
outputs: ["close"]
|
|
232
272
|
},
|
|
233
273
|
{
|
|
@@ -275,7 +315,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
275
315
|
UiIconComponent
|
|
276
316
|
],
|
|
277
317
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
278
|
-
template: "<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"
|
|
318
|
+
template: "<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n",
|
|
279
319
|
styles: [".header-mobile{display:flex;justify-content:center;align-items:center;padding:1rem 0;border-radius:0;position:fixed;top:0;z-index:100;width:100vw;background:var(--header-bg);transition:background .3s ease,box-shadow .3s ease}.header-mobile.is-scrolled{background:var(--header-bg-fixed-dark);box-shadow:0 2px 12px #00000014}.header-logo{display:flex;align-items:center;gap:.5rem;color:var(--header-logo-text)}.header-logo img{width:80px;height:80px;object-fit:contain;object-position:center}.header-actions{position:fixed;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;background-color:var(--header-mobile-bg);z-index:100;box-sizing:border-box}.header-actions .center{margin:0 auto}.lang{text-transform:uppercase}\n"]
|
|
280
320
|
}]
|
|
281
321
|
}],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lluc_llull-ui-lib-headers.mjs","names":[],"sources":["../../../projects/ui-lib/headers/header-clear/header-clear.component.ts","../../../projects/ui-lib/headers/header-clear/header-clear.component.html","../../../projects/ui-lib/headers/header-mobile/header-mobile.component.ts","../../../projects/ui-lib/headers/header-mobile/header-mobile.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-clear',\n standalone: true,\n imports: [CommonModule, NavModalComponent, LinkTypeDirective, UiIconComponent, HeaderScrollDirective],\n templateUrl: './header-clear.component.html',\n styleUrl: './header-clear.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderClearComponent implements OnInit, OnDestroy, OnChanges {\n isMenuOpen = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n this.isMenuOpen = !this.isMenuOpen;\n }\n}\n","<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"isMenuOpen = false\"\n ></lib-nav-modal>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-mobile',\n standalone: true,\n imports: [CommonModule, NavModalComponent, HeaderScrollDirective, LinkTypeDirective, UiIconComponent],\n templateUrl: './header-mobile.component.html',\n styleUrl: './header-mobile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderMobileComponent implements OnInit, OnChanges, OnDestroy {\n isMenuOpen = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n this.isMenuOpen = !this.isMenuOpen;\n }\n}\n","<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if (isMenuOpen && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n (close)=\"isMenuOpen = false\"\n ></lib-nav-modal>\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lluc_llull-ui-lib-headers.mjs","names":[],"sources":["../../../projects/ui-lib/headers/header-clear/header-clear.component.ts","../../../projects/ui-lib/headers/header-clear/header-clear.component.html","../../../projects/ui-lib/headers/header-mobile/header-mobile.component.ts","../../../projects/ui-lib/headers/header-mobile/header-mobile.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-clear',\n standalone: true,\n imports: [CommonModule, NavModalComponent, LinkTypeDirective, UiIconComponent, HeaderScrollDirective],\n templateUrl: './header-clear.component.html',\n styleUrl: './header-clear.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderClearComponent implements OnInit, OnDestroy, OnChanges {\n isMenuOpen = false;\n isMenuClosing = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n if (this.isMenuOpen) {\n this.closeMenu();\n return;\n }\n\n this.isMenuClosing = false;\n this.isMenuOpen = true;\n }\n\n closeMenu(): void {\n if (!this.isMenuOpen && !this.isMenuClosing) return;\n\n this.isMenuClosing = true;\n this.isMenuOpen = false;\n }\n\n finishMenuClose(event: TransitionEvent): void {\n if (!this.isMenuClosing || event.propertyName !== 'visibility') return;\n if (!(event.target instanceof HTMLElement) || !event.target.classList.contains('modal-content')) return;\n\n this.isMenuClosing = false;\n }\n}\n","<header class=\"header-clear main-grid col-span-full sm:col-span-12 sm:col-start-1\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo col-span-full sm:col-span-4 sm:col-start-1\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n <span>LLUC LLULL</span>\n </div>\n </a>\n\n <div class=\"header-actions col-span-full sm:col-span-6 sm:col-start-7\">\n <!-- Idioma -->\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n\n <!-- Icono de tema -->\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'sun' : 'moon'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n\n <!-- Icono de menú -->\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</header>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { HeaderScrollDirective, LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport {\n UiLibButtonI,\n UiLibImageI,\n UiLibNavItemsI,\n UiLibSocialItemsI,\n} from '@lluc_llull/ui-lib/interfaces';\nimport { Theme, ThemeService } from '@lluc_llull/ui-lib/theme';\nimport { Subscription } from 'rxjs';\nimport { mapNavModal } from '@lluc_llull/ui-lib/mapper';\nimport { NavModalComponent } from '@lluc_llull/ui-lib/modals';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-header-mobile',\n standalone: true,\n imports: [CommonModule, NavModalComponent, HeaderScrollDirective, LinkTypeDirective, UiIconComponent],\n templateUrl: './header-mobile.component.html',\n styleUrl: './header-mobile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderMobileComponent implements OnInit, OnChanges, OnDestroy {\n isMenuOpen = false;\n isMenuClosing = false;\n currentTheme: Theme = 'light';\n private themeSubscription?: Subscription;\n\n @Input() logo?: UiLibImageI;\n @Input() logoDark?: UiLibImageI;\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() homeLink?: UiLibButtonI;\n @Input() navigation: any;\n @Input() lang: string = 'es';\n\n @Output() langModal = new EventEmitter<void>();\n @Output() theme = new EventEmitter<void>();\n\n constructor(private themeService: ThemeService) {}\n\n ngOnInit(): void {\n this.themeSubscription = this.themeService.currentTheme$.subscribe((theme) => {\n this.currentTheme = theme;\n });\n }\n\n ngOnChanges() {\n this.navItems = mapNavModal(this.navigation, this.lang);\n }\n\n ngOnDestroy(): void {\n this.themeSubscription?.unsubscribe();\n }\n\n openLanguagesModal(): void {\n this.langModal.emit();\n }\n\n toggleTheme(): void {\n this.themeService.toggleTheme();\n this.theme.emit();\n }\n\n toggleMenu(): void {\n if (this.isMenuOpen) {\n this.closeMenu();\n return;\n }\n\n this.isMenuClosing = false;\n this.isMenuOpen = true;\n }\n\n closeMenu(): void {\n if (!this.isMenuOpen && !this.isMenuClosing) return;\n\n this.isMenuClosing = true;\n this.isMenuOpen = false;\n }\n\n finishMenuClose(event: TransitionEvent): void {\n if (!this.isMenuClosing || event.propertyName !== 'visibility') return;\n if (!(event.target instanceof HTMLElement) || !event.target.classList.contains('modal-content')) return;\n\n this.isMenuClosing = false;\n }\n}\n","<header class=\"header-mobile\" headerScroll [scrollThreshold]=\"60\">\n <a [href]=\"homeLink?.url\" [linkType]=\"homeLink?.linkType\">\n <div class=\"header-logo\">\n <!-- Logo -->\n <img\n [src]=\"currentTheme === 'dark' ? logoDark?.url : logo?.url\"\n [alt]=\"currentTheme === 'dark' ? logoDark?.alt : logo?.alt\"\n />\n </div>\n </a>\n</header>\n\n<div class=\"header-actions\">\n <!-- Idioma -->\n <div class=\"left\">\n <button class=\"btn btn-header\" (click)=\"openLanguagesModal()\">\n <span class=\"lang\">{{ lang }}</span>\n </button>\n </div>\n\n <!-- Icono de tema -->\n <div class=\"center\">\n <button class=\"btn btn-header\" aria-label=\"Toggle theme\" (click)=\"toggleTheme()\">\n <ui-icon\n [name]=\"currentTheme === 'dark' ? 'moon' : 'sun'\"\n [size]=\"17\"\n [color]=\"'var(--color-primary)'\"\n ></ui-icon>\n </button>\n </div>\n\n <!-- Icono de menú -->\n <div class=\"right\">\n <button class=\"btn btn-header\" aria-label=\"Open nav\" (click)=\"toggleMenu()\">\n <span>☰</span>\n </button>\n </div>\n</div>\n\n@if ((isMenuOpen || isMenuClosing) && navItems && navItems.length > 0) {\n <lib-nav-modal\n [navItems]=\"navItems\"\n [socialItems]=\"socialItems\"\n [closing]=\"isMenuClosing\"\n (close)=\"closeMenu()\"\n (transitionend)=\"finishMenuClose($event)\"\n ></lib-nav-modal>\n}\n"],"mappings":"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"}
|
|
@@ -1,38 +1,25 @@
|
|
|
1
1
|
import { CommonModule } from "@angular/common";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
-
import { ChangeDetectionStrategy, Component, EventEmitter,
|
|
4
|
-
import * as i1 from "@angular/material/dialog";
|
|
5
|
-
import { MAT_DIALOG_DATA } from "@angular/material/dialog";
|
|
6
|
-
import { mapLangModal } from "@lluc_llull/ui-lib/mapper";
|
|
3
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core";
|
|
7
4
|
import { LinkTypeDirective } from "@lluc_llull/ui-lib/directives";
|
|
8
5
|
import { UiIconComponent } from "@lluc_llull/ui-lib/shared";
|
|
9
6
|
var LangModalComponent = class LangModalComponent {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
this.data = data;
|
|
15
|
-
this.dialogRef = dialogRef;
|
|
16
|
-
this.langs = mapLangModal(data.langs, data.currentLang);
|
|
17
|
-
}
|
|
7
|
+
langs = [];
|
|
8
|
+
closing = false;
|
|
9
|
+
close = new EventEmitter();
|
|
10
|
+
select = new EventEmitter();
|
|
18
11
|
selectLang(lang) {
|
|
19
|
-
this.
|
|
12
|
+
this.select.emit(lang);
|
|
20
13
|
}
|
|
21
14
|
closeModal() {
|
|
22
|
-
this.
|
|
15
|
+
this.close.emit();
|
|
23
16
|
}
|
|
24
17
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
25
18
|
minVersion: "12.0.0",
|
|
26
19
|
version: "22.2.4",
|
|
27
20
|
ngImport: i0,
|
|
28
21
|
type: LangModalComponent,
|
|
29
|
-
deps: [
|
|
30
|
-
token: MAT_DIALOG_DATA,
|
|
31
|
-
optional: true
|
|
32
|
-
}, {
|
|
33
|
-
token: i1.MatDialogRef,
|
|
34
|
-
optional: true
|
|
35
|
-
}],
|
|
22
|
+
deps: [],
|
|
36
23
|
target: i0.ɵɵFactoryTarget.Component
|
|
37
24
|
});
|
|
38
25
|
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
@@ -41,9 +28,18 @@ var LangModalComponent = class LangModalComponent {
|
|
|
41
28
|
type: LangModalComponent,
|
|
42
29
|
isStandalone: true,
|
|
43
30
|
selector: "lib-lang-modal",
|
|
31
|
+
inputs: {
|
|
32
|
+
langs: "langs",
|
|
33
|
+
closing: "closing"
|
|
34
|
+
},
|
|
35
|
+
outputs: {
|
|
36
|
+
close: "close",
|
|
37
|
+
select: "select"
|
|
38
|
+
},
|
|
39
|
+
host: { properties: { "class.is-closing": "closing" } },
|
|
44
40
|
ngImport: i0,
|
|
45
|
-
template: "<
|
|
46
|
-
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:
|
|
41
|
+
template: "<button\n (click)=\"closeModal()\"\n class=\"close-btn\"\n [class.is-closing]=\"closing\"\n type=\"button\"\n aria-label=\"Close modal\"\n>\n ✕\n</button>\n<div class=\"modal-content\" [class.is-closing]=\"closing\">\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",
|
|
42
|
+
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:transparent;isolation:isolate;z-index:1000;display:flex;align-items:center;justify-content:center}:host:before{content:\"\";position:absolute;inset:0;z-index:0;background:var(--modal-bg);opacity:1;transform:scaleY(1);transform-origin:top center;transition:transform .36s cubic-bezier(.22,1,.36,1),opacity .36s cubic-bezier(.22,1,.36,1)}@starting-style{:host:before{opacity:0;transform:scaleY(0)}}:host.is-closing:before{transform-origin:top center;opacity:0;transform:scaleY(0);transition-delay:.42s}.modal-content{position:relative;z-index:1;opacity:1;transform:translateY(0) scale(1);transform-origin:center;transition:opacity .26s cubic-bezier(.22,1,.36,1) .18s}@starting-style{.modal-content{opacity:0}}.modal-content.is-closing{opacity:0;visibility:hidden;transition:opacity .26s cubic-bezier(.22,1,.36,1) .34s,visibility 1ms linear 779ms}.close-btn.is-closing{opacity:0;pointer-events:none}@media(prefers-reduced-motion:reduce){.modal-content,.modal-content.is-closing{transform:none;transition-duration:1ms}:host:before,:host.is-closing:before{opacity:0;transform:scaleY(0);transition-delay:0ms;transition-duration:1ms}}.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;transition:opacity .18s cubic-bezier(.22,1,.36,1)}ol{padding:0;margin:0;text-align:center;width:100%;max-width:450px;list-style:none;counter-reset:item}ol>li{opacity:1;transform:translateY(0);transition:opacity .42s cubic-bezier(.22,1,.36,1) .36s,transform .42s cubic-bezier(.22,1,.36,1) .36s}@starting-style{ol>li{opacity:0;transform:translateY(16px)}}@media(prefers-reduced-motion:reduce){ol>li{transform:none;transition-duration:1ms;transition-delay:0ms}}li{cursor:pointer;text-align:start;text-transform:uppercase;counter-increment:item}li:before{content:counter(item,decimal-leading-zero) \". \"}.modal-item{font-size:3.5rem}@media(max-width:768px){.modal-item{font-size:3rem}}\n"],
|
|
47
43
|
dependencies: [{
|
|
48
44
|
kind: "ngmodule",
|
|
49
45
|
type: CommonModule
|
|
@@ -62,25 +58,23 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
62
58
|
selector: "lib-lang-modal",
|
|
63
59
|
standalone: true,
|
|
64
60
|
imports: [CommonModule],
|
|
61
|
+
host: { "[class.is-closing]": "closing" },
|
|
65
62
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
66
|
-
template: "<
|
|
67
|
-
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:
|
|
63
|
+
template: "<button\n (click)=\"closeModal()\"\n class=\"close-btn\"\n [class.is-closing]=\"closing\"\n type=\"button\"\n aria-label=\"Close modal\"\n>\n ✕\n</button>\n<div class=\"modal-content\" [class.is-closing]=\"closing\">\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",
|
|
64
|
+
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:transparent;isolation:isolate;z-index:1000;display:flex;align-items:center;justify-content:center}:host:before{content:\"\";position:absolute;inset:0;z-index:0;background:var(--modal-bg);opacity:1;transform:scaleY(1);transform-origin:top center;transition:transform .36s cubic-bezier(.22,1,.36,1),opacity .36s cubic-bezier(.22,1,.36,1)}@starting-style{:host:before{opacity:0;transform:scaleY(0)}}:host.is-closing:before{transform-origin:top center;opacity:0;transform:scaleY(0);transition-delay:.42s}.modal-content{position:relative;z-index:1;opacity:1;transform:translateY(0) scale(1);transform-origin:center;transition:opacity .26s cubic-bezier(.22,1,.36,1) .18s}@starting-style{.modal-content{opacity:0}}.modal-content.is-closing{opacity:0;visibility:hidden;transition:opacity .26s cubic-bezier(.22,1,.36,1) .34s,visibility 1ms linear 779ms}.close-btn.is-closing{opacity:0;pointer-events:none}@media(prefers-reduced-motion:reduce){.modal-content,.modal-content.is-closing{transform:none;transition-duration:1ms}:host:before,:host.is-closing:before{opacity:0;transform:scaleY(0);transition-delay:0ms;transition-duration:1ms}}.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;transition:opacity .18s cubic-bezier(.22,1,.36,1)}ol{padding:0;margin:0;text-align:center;width:100%;max-width:450px;list-style:none;counter-reset:item}ol>li{opacity:1;transform:translateY(0);transition:opacity .42s cubic-bezier(.22,1,.36,1) .36s,transform .42s cubic-bezier(.22,1,.36,1) .36s}@starting-style{ol>li{opacity:0;transform:translateY(16px)}}@media(prefers-reduced-motion:reduce){ol>li{transform:none;transition-duration:1ms;transition-delay:0ms}}li{cursor:pointer;text-align:start;text-transform:uppercase;counter-increment:item}li:before{content:counter(item,decimal-leading-zero) \". \"}.modal-item{font-size:3.5rem}@media(max-width:768px){.modal-item{font-size:3rem}}\n"]
|
|
68
65
|
}]
|
|
69
66
|
}],
|
|
70
|
-
|
|
71
|
-
type:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}, {
|
|
77
|
-
type: i1.MatDialogRef,
|
|
78
|
-
decorators: [{ type: Optional }]
|
|
79
|
-
}]
|
|
67
|
+
propDecorators: {
|
|
68
|
+
langs: [{ type: Input }],
|
|
69
|
+
closing: [{ type: Input }],
|
|
70
|
+
close: [{ type: Output }],
|
|
71
|
+
select: [{ type: Output }]
|
|
72
|
+
}
|
|
80
73
|
});
|
|
81
74
|
var NavModalComponent = class NavModalComponent {
|
|
82
75
|
navItems;
|
|
83
76
|
socialItems;
|
|
77
|
+
closing = false;
|
|
84
78
|
close = new EventEmitter();
|
|
85
79
|
closeModal() {
|
|
86
80
|
this.close.emit();
|
|
@@ -101,12 +95,14 @@ var NavModalComponent = class NavModalComponent {
|
|
|
101
95
|
selector: "lib-nav-modal",
|
|
102
96
|
inputs: {
|
|
103
97
|
navItems: "navItems",
|
|
104
|
-
socialItems: "socialItems"
|
|
98
|
+
socialItems: "socialItems",
|
|
99
|
+
closing: "closing"
|
|
105
100
|
},
|
|
106
101
|
outputs: { close: "close" },
|
|
102
|
+
host: { properties: { "class.is-closing": "closing" } },
|
|
107
103
|
ngImport: i0,
|
|
108
|
-
template: "<
|
|
109
|
-
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:
|
|
104
|
+
template: "<button (click)=\"closeModal()\" class=\"close-btn\" [class.is-closing]=\"closing\" type=\"button\" aria-label=\"Close menu\">✕</button>\n<div class=\"modal-content\" [class.is-closing]=\"closing\">\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=\"btn-group\">\n @for (social of socialItems; track social.label) {\n <a class=\"btn btn-link\" [href]=\"social.url\" [linkType]=\"social.linkType\">\n <ui-icon [name]=\"social.icon!\" [size]=\"17\" [color]=\"'var(--color-primary)'\"></ui-icon>\n {{ social.label }}\n </a>\n }\n </div>\n }\n</div>\n",
|
|
105
|
+
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:transparent;isolation:isolate;z-index:1000;display:flex;align-items:center;justify-content:center}:host:before{content:\"\";position:absolute;inset:0;z-index:0;background:var(--modal-bg);opacity:1;transform:scaleY(1);transform-origin:top center;transition:transform .36s cubic-bezier(.22,1,.36,1),opacity .36s cubic-bezier(.22,1,.36,1)}@starting-style{:host:before{opacity:0;transform:scaleY(0)}}:host.is-closing:before{transform-origin:top center;opacity:0;transform:scaleY(0);transition-delay:.66s}.modal-content{position:relative;z-index:1;opacity:1;transform:translateY(0) scale(1);transform-origin:center;transition:opacity .26s cubic-bezier(.22,1,.36,1) .18s}@starting-style{.modal-content{opacity:0}}.modal-content.is-closing{opacity:0;visibility:hidden;transition:opacity .26s cubic-bezier(.22,1,.36,1) .58s,visibility 1ms linear 1019ms}.modal-content.is-closing ol>a{opacity:0;transform:translateY(16px);transition-delay:.24s;transition-duration:.42s}.modal-content.is-closing .btn-group{opacity:0;transform:translateY(12px);transition-delay:0ms;transition-duration:.22s}@media(prefers-reduced-motion:reduce){.modal-content,.modal-content.is-closing,ol>a,.btn-group{transform:none;transition-duration:1ms;transition-delay:0ms}:host:before,:host.is-closing:before{opacity:0;transform:scaleY(0);transition-delay:0ms;transition-duration:1ms}}.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;transition:opacity .18s cubic-bezier(.22,1,.36,1)}.close-btn.is-closing{opacity:0;pointer-events:none;transition-duration:.22s}ol{padding:0;margin:0;text-align:center;width:100%;max-width:450px;list-style:none;counter-reset:item}ol>a{display:block;opacity:1;transform:translateY(0);transition:opacity .42s cubic-bezier(.22,1,.36,1) .36s,transform .42s cubic-bezier(.22,1,.36,1) .36s}@starting-style{ol>a{opacity:0;transform:translateY(16px)}}.btn-group{margin-top:0;opacity:1;transform:translateY(0);transition:opacity .22s cubic-bezier(.22,1,.36,1) .8s,transform .22s cubic-bezier(.22,1,.36,1) .8s}@starting-style{.btn-group{opacity:0;transform:translateY(12px)}}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) \". \"}.btn-link{text-transform:none}@media(max-width:768px){.modal-item{font-size:2.5rem}}\n"],
|
|
110
106
|
dependencies: [
|
|
111
107
|
{
|
|
112
108
|
kind: "ngmodule",
|
|
@@ -148,14 +144,16 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
148
144
|
LinkTypeDirective,
|
|
149
145
|
UiIconComponent
|
|
150
146
|
],
|
|
147
|
+
host: { "[class.is-closing]": "closing" },
|
|
151
148
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
152
|
-
template: "<
|
|
153
|
-
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:
|
|
149
|
+
template: "<button (click)=\"closeModal()\" class=\"close-btn\" [class.is-closing]=\"closing\" type=\"button\" aria-label=\"Close menu\">✕</button>\n<div class=\"modal-content\" [class.is-closing]=\"closing\">\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=\"btn-group\">\n @for (social of socialItems; track social.label) {\n <a class=\"btn btn-link\" [href]=\"social.url\" [linkType]=\"social.linkType\">\n <ui-icon [name]=\"social.icon!\" [size]=\"17\" [color]=\"'var(--color-primary)'\"></ui-icon>\n {{ social.label }}\n </a>\n }\n </div>\n }\n</div>\n",
|
|
150
|
+
styles: [":host{position:fixed;inset:0;width:100vw;height:100vh;background:transparent;isolation:isolate;z-index:1000;display:flex;align-items:center;justify-content:center}:host:before{content:\"\";position:absolute;inset:0;z-index:0;background:var(--modal-bg);opacity:1;transform:scaleY(1);transform-origin:top center;transition:transform .36s cubic-bezier(.22,1,.36,1),opacity .36s cubic-bezier(.22,1,.36,1)}@starting-style{:host:before{opacity:0;transform:scaleY(0)}}:host.is-closing:before{transform-origin:top center;opacity:0;transform:scaleY(0);transition-delay:.66s}.modal-content{position:relative;z-index:1;opacity:1;transform:translateY(0) scale(1);transform-origin:center;transition:opacity .26s cubic-bezier(.22,1,.36,1) .18s}@starting-style{.modal-content{opacity:0}}.modal-content.is-closing{opacity:0;visibility:hidden;transition:opacity .26s cubic-bezier(.22,1,.36,1) .58s,visibility 1ms linear 1019ms}.modal-content.is-closing ol>a{opacity:0;transform:translateY(16px);transition-delay:.24s;transition-duration:.42s}.modal-content.is-closing .btn-group{opacity:0;transform:translateY(12px);transition-delay:0ms;transition-duration:.22s}@media(prefers-reduced-motion:reduce){.modal-content,.modal-content.is-closing,ol>a,.btn-group{transform:none;transition-duration:1ms;transition-delay:0ms}:host:before,:host.is-closing:before{opacity:0;transform:scaleY(0);transition-delay:0ms;transition-duration:1ms}}.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;transition:opacity .18s cubic-bezier(.22,1,.36,1)}.close-btn.is-closing{opacity:0;pointer-events:none;transition-duration:.22s}ol{padding:0;margin:0;text-align:center;width:100%;max-width:450px;list-style:none;counter-reset:item}ol>a{display:block;opacity:1;transform:translateY(0);transition:opacity .42s cubic-bezier(.22,1,.36,1) .36s,transform .42s cubic-bezier(.22,1,.36,1) .36s}@starting-style{ol>a{opacity:0;transform:translateY(16px)}}.btn-group{margin-top:0;opacity:1;transform:translateY(0);transition:opacity .22s cubic-bezier(.22,1,.36,1) .8s,transform .22s cubic-bezier(.22,1,.36,1) .8s}@starting-style{.btn-group{opacity:0;transform:translateY(12px)}}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) \". \"}.btn-link{text-transform:none}@media(max-width:768px){.modal-item{font-size:2.5rem}}\n"]
|
|
154
151
|
}]
|
|
155
152
|
}],
|
|
156
153
|
propDecorators: {
|
|
157
154
|
navItems: [{ type: Input }],
|
|
158
155
|
socialItems: [{ type: Input }],
|
|
156
|
+
closing: [{ type: Input }],
|
|
159
157
|
close: [{ type: Output }]
|
|
160
158
|
}
|
|
161
159
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lluc_llull-ui-lib-modals.mjs","names":[],"sources":["../../../projects/ui-lib/modals/lang-modal/lang-modal.component.ts","../../../projects/ui-lib/modals/lang-modal/lang-modal.component.html","../../../projects/ui-lib/modals/nav-modal/nav-modal.component.ts","../../../projects/ui-lib/modals/nav-modal/nav-modal.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component,
|
|
1
|
+
{"version":3,"file":"lluc_llull-ui-lib-modals.mjs","names":[],"sources":["../../../projects/ui-lib/modals/lang-modal/lang-modal.component.ts","../../../projects/ui-lib/modals/lang-modal/lang-modal.component.html","../../../projects/ui-lib/modals/nav-modal/nav-modal.component.ts","../../../projects/ui-lib/modals/nav-modal/nav-modal.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UiLibLangItemI } from '@lluc_llull/ui-lib/interfaces';\n\n@Component({\n selector: 'lib-lang-modal',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './lang-modal.component.html',\n styleUrl: './lang-modal.component.scss',\n host: {\n '[class.is-closing]': 'closing',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LangModalComponent {\n @Input() langs: UiLibLangItemI[] = [];\n @Input() closing = false;\n\n @Output() close = new EventEmitter<void>();\n @Output() select = new EventEmitter<UiLibLangItemI>();\n\n selectLang(lang: UiLibLangItemI) {\n this.select.emit(lang);\n }\n\n closeModal() {\n this.close.emit();\n }\n}\n","<button\n (click)=\"closeModal()\"\n class=\"close-btn\"\n [class.is-closing]=\"closing\"\n type=\"button\"\n aria-label=\"Close modal\"\n>\n ✕\n</button>\n<div class=\"modal-content\" [class.is-closing]=\"closing\">\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","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { LinkTypeDirective } from '@lluc_llull/ui-lib/directives';\nimport { UiLibNavItemsI, UiLibSocialItemsI } from '@lluc_llull/ui-lib/interfaces';\nimport { UiIconComponent } from '@lluc_llull/ui-lib/shared';\n\n@Component({\n selector: 'lib-nav-modal',\n standalone: true,\n imports: [CommonModule, LinkTypeDirective, UiIconComponent],\n templateUrl: './nav-modal.component.html',\n styleUrl: './nav-modal.component.scss',\n host: {\n '[class.is-closing]': 'closing',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NavModalComponent {\n @Input() navItems?: UiLibNavItemsI[];\n @Input() socialItems?: UiLibSocialItemsI[];\n @Input() closing = false;\n\n @Output() close = new EventEmitter<void>();\n\n closeModal() {\n this.close.emit();\n }\n}\n","<button (click)=\"closeModal()\" class=\"close-btn\" [class.is-closing]=\"closing\" type=\"button\" aria-label=\"Close menu\">✕</button>\n<div class=\"modal-content\" [class.is-closing]=\"closing\">\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=\"btn-group\">\n @for (social of socialItems; track social.label) {\n <a class=\"btn btn-link\" [href]=\"social.url\" [linkType]=\"social.linkType\">\n <ui-icon [name]=\"social.icon!\" [size]=\"17\" [color]=\"'var(--color-primary)'\"></ui-icon>\n {{ social.label }}\n </a>\n }\n </div>\n }\n</div>\n"],"mappings":";;;;;AAeA,IAAa,qBAAb,MAAa,mBAAkB;CAClB,QAA0B,CAAA;CAC1B,UAAU;CAET,QAAQ,IAAI,aAAY;CACxB,SAAS,IAAI,aAAY;CAEnC,WAAW,MAAoB;EAC3B,KAAK,OAAO,KAAK,IAAI;CACzB;CAEA,aAAU;EACN,KAAK,MAAM,KAAI;CACnB;CAbS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;GAAA,SAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,QAAA;EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,oBAAA,UAAA,EAAA;EAAA,UAAA;EAAA,UCf/B;EAoBA,QAAA,CAAA,u/DAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDbc;EAAY,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAQb,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAX9B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,YACd;GAAI,SACP,CAAC,YAAY;GAAC,MAGjB,EACF,sBAAsB,UACzB;GAAA,iBACgB,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,u/DAAA;EAAA,CAAA;;;E,UAG9C,MAAA,M;E,YACA,MAAA,M;E,UAEA,MAAA,O;E,WACA,MAAA,O;;;AEHL,IAAa,oBAAb,MAAa,kBAAiB;CACjB;CACA;CACA,UAAU;CAET,QAAQ,IAAI,aAAY;CAElC,aAAU;EACN,KAAK,MAAM,KAAI;CACnB;CATS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,UAAA;GAAA,aAAA;GAAA,SAAA;EAAA;EAAA,SAAA,EAAA,OAAA,QAAA;EAAA,MAAA,EAAA,YAAA,EAAA,oBAAA,UAAA,EAAA;EAAA,UAAA;EAAA,UCjB9B;EA0BA,QAAA,CAAA,o9EAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDjBc;GAAY;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA,CAAA,YAAA,MAAA;IAAA,SAAA,CAAA,eAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAe,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAQjD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAX7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,YACb;GAAI,SACP;IAAC;IAAc;IAAmB;GAAe;GAAC,MAGrD,EACF,sBAAsB,UACzB;GAAA,iBACgB,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,o9EAAA;EAAA,CAAA;;;E,aAG9C,MAAA,M;E,gBACA,MAAA,M;E,YACA,MAAA,M;E,UAEA,MAAA,O"}
|
|
@@ -3,7 +3,7 @@ import * as i0 from "@angular/core";
|
|
|
3
3
|
import { Component, HostBinding, Inject, Input, Optional } from "@angular/core";
|
|
4
4
|
import * as simpleIcons from "simple-icons";
|
|
5
5
|
import * as i1$1 from "lucide-angular";
|
|
6
|
-
import { LucideAngularModule } from "lucide-angular";
|
|
6
|
+
import { ArrowLeft, ArrowRight, Home, LUCIDE_ICONS, LucideAngularModule, LucideIconProvider, Moon, MoveRight, Sun } from "lucide-angular";
|
|
7
7
|
import * as i1 from "@cloudinary/ng";
|
|
8
8
|
import { CloudinaryModule, lazyload, responsive } from "@cloudinary/ng";
|
|
9
9
|
import { CloudinaryImage } from "@cloudinary/url-gen";
|
|
@@ -53,6 +53,18 @@ var UiIconComponent = class UiIconComponent {
|
|
|
53
53
|
size: "size",
|
|
54
54
|
color: "color"
|
|
55
55
|
},
|
|
56
|
+
providers: [{
|
|
57
|
+
provide: LUCIDE_ICONS,
|
|
58
|
+
multi: true,
|
|
59
|
+
useValue: new LucideIconProvider({
|
|
60
|
+
ArrowLeft,
|
|
61
|
+
ArrowRight,
|
|
62
|
+
Home,
|
|
63
|
+
Moon,
|
|
64
|
+
MoveRight,
|
|
65
|
+
Sun
|
|
66
|
+
})
|
|
67
|
+
}],
|
|
56
68
|
usesOnChanges: true,
|
|
57
69
|
ngImport: i0,
|
|
58
70
|
template: "@if (isBrandIcon) {\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} @else {\n <lucide-icon\n class=\"ui-icon ui-icon--lucide\"\n [name]=\"name\"\n [size]=\"size\"\n [color]=\"color\"\n ></lucide-icon>\n}\n",
|
|
@@ -94,6 +106,18 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
94
106
|
selector: "ui-icon",
|
|
95
107
|
standalone: true,
|
|
96
108
|
imports: [CommonModule, LucideAngularModule],
|
|
109
|
+
providers: [{
|
|
110
|
+
provide: LUCIDE_ICONS,
|
|
111
|
+
multi: true,
|
|
112
|
+
useValue: new LucideIconProvider({
|
|
113
|
+
ArrowLeft,
|
|
114
|
+
ArrowRight,
|
|
115
|
+
Home,
|
|
116
|
+
Moon,
|
|
117
|
+
MoveRight,
|
|
118
|
+
Sun
|
|
119
|
+
})
|
|
120
|
+
}],
|
|
97
121
|
template: "@if (isBrandIcon) {\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} @else {\n <lucide-icon\n class=\"ui-icon ui-icon--lucide\"\n [name]=\"name\"\n [size]=\"size\"\n [color]=\"color\"\n ></lucide-icon>\n}\n",
|
|
98
122
|
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"]
|
|
99
123
|
}]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lluc_llull-ui-lib-shared.mjs","names":["i1","qAuto"],"sources":["../../../projects/ui-lib/shared/ui-icon/ui-icon.component.ts","../../../projects/ui-lib/shared/ui-icon/ui-icon.component.html","../../../projects/ui-lib/shared/ui-icon/ui-icon.mock.ts","../../../projects/ui-lib/shared/ui-image/ui-image.component.ts","../../../projects/ui-lib/shared/ui-image/ui-image.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, Input, OnChanges } from '@angular/core';\nimport type { SimpleIcon } from 'simple-icons';\nimport * as simpleIcons from 'simple-icons';\nimport {
|
|
1
|
+
{"version":3,"file":"lluc_llull-ui-lib-shared.mjs","names":["i1","qAuto"],"sources":["../../../projects/ui-lib/shared/ui-icon/ui-icon.component.ts","../../../projects/ui-lib/shared/ui-icon/ui-icon.component.html","../../../projects/ui-lib/shared/ui-icon/ui-icon.mock.ts","../../../projects/ui-lib/shared/ui-image/ui-image.component.ts","../../../projects/ui-lib/shared/ui-image/ui-image.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, Input, OnChanges } from '@angular/core';\nimport type { SimpleIcon } from 'simple-icons';\nimport * as simpleIcons from 'simple-icons';\nimport {\n ArrowLeft,\n ArrowRight,\n Home,\n LucideAngularModule,\n LucideIconProvider,\n LUCIDE_ICONS,\n Moon,\n MoveRight,\n Sun,\n} from 'lucide-angular';\n\n@Component({\n selector: 'ui-icon',\n standalone: true,\n imports: [\n CommonModule,\n LucideAngularModule,\n ],\n providers: [\n {\n provide: LUCIDE_ICONS,\n multi: true,\n useValue: new LucideIconProvider({ ArrowLeft, ArrowRight, Home, Moon, MoveRight, Sun }),\n },\n ],\n templateUrl: './ui-icon.component.html',\n styleUrls: ['./ui-icon.component.scss'],\n})\nexport class UiIconComponent implements OnChanges {\n @Input() name!: string;\n @Input() size = 24;\n @Input() color = 'currentColor';\n\n private icon?: SimpleIcon | null;\n\n ngOnChanges() {\n this.resolveBrandIcon();\n }\n\n get isBrandIcon(): boolean {\n return !!this.icon;\n }\n\n get brandIcon(): SimpleIcon | null {\n return this.icon ?? null;\n }\n\n private resolveBrandIcon(): void {\n if (!this.name) {\n this.icon = null;\n return;\n }\n\n const key =\n 'si' + this.name.replace(/[^a-z0-9]/gi, '').replace(/^\\w/, (c) => c.toUpperCase());\n\n this.icon = (simpleIcons as any)[key] ?? null;\n }\n}\n","@if (isBrandIcon) {\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} @else {\n <lucide-icon\n class=\"ui-icon ui-icon--lucide\"\n [name]=\"name\"\n [size]=\"size\"\n [color]=\"color\"\n ></lucide-icon>\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'ui-icon',\n standalone: true,\n template: '',\n})\nexport class MockUiIconComponent {\n @Input() name!: string;\n @Input() size = 24;\n @Input() color = 'currentColor';\n}","import { CommonModule } from '@angular/common';\nimport { Component, HostBinding, Inject, Input, OnChanges, OnInit, Optional } from '@angular/core';\nimport { CloudinaryModule, lazyload, responsive } from '@cloudinary/ng';\nimport { CloudinaryImage } from '@cloudinary/url-gen';\nimport { format, quality } from '@cloudinary/url-gen/actions/delivery';\nimport { limitFit } from '@cloudinary/url-gen/actions/resize';\nimport { auto } from '@cloudinary/url-gen/qualifiers/format';\nimport { auto as qAuto } from '@cloudinary/url-gen/qualifiers/quality';\nimport { CLOUDINARY_CLOUD_NAME } from '@lluc_llull/ui-lib/mapper';\n\n@Component({\n selector: 'ui-image',\n standalone: true,\n imports: [CommonModule, CloudinaryModule],\n templateUrl: './ui-image.component.html',\n styleUrl: './ui-image.component.scss',\n})\nexport class UiImageComponent implements OnChanges, OnInit {\n @Input({ required: true }) publicId!: string;\n @Input() cloudName?: string;\n @Input() transformations?: any;\n @Input() eager: boolean = false;\n @Input() width?: number | null;\n @Input() height?: number | null;\n\n img!: CloudinaryImage;\n plugins: any[] = [];\n\n constructor(@Optional() @Inject(CLOUDINARY_CLOUD_NAME) private globalCloudName?: string) {}\n\n ngOnInit(): void {\n this.initImage();\n }\n\n ngOnChanges(): void {\n this.initImage();\n }\n\n @HostBinding('style.--ui-image-ratio')\n get aspectRatioStyle(): string | null {\n if (this.width && this.height) {\n return `${this.width} / ${this.height}`;\n }\n return null;\n }\n\n private initImage(): void {\n const activeCloudName = this.cloudName || this.globalCloudName;\n\n if (this.publicId && activeCloudName) {\n this.img = new CloudinaryImage(this.publicId, { cloudName: activeCloudName })\n .delivery(format(auto()))\n .delivery(quality(qAuto()))\n .resize(limitFit().width(1920));\n\n this.plugins = [responsive({ steps: 200 })];\n\n if (!this.eager) {\n this.plugins.push(lazyload());\n }\n } else if (!activeCloudName) {\n console.warn(\n '[UiImageComponent]: No cloudName provided. Please provide it via @Input() or the CLOUDINARY_CLOUD_NAME InjectionToken.',\n );\n }\n }\n}\n","@if (img) {\n @if (eager) {\n <img [src]=\"img.toURL()\" fetchpriority=\"high\" loading=\"eager\" alt=\"\"\n [attr.width]=\"width ?? null\" [attr.height]=\"height ?? null\" />\n } @else {\n <advanced-image [cldImg]=\"img\" [plugins]=\"plugins\"></advanced-image>\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAiCA,IAAa,kBAAb,MAAa,gBAAe;CACf;CACA,OAAO;CACP,QAAQ;CAET;CAER,cAAW;EACP,KAAK,iBAAgB;CACzB;CAEA,IAAI,cAAW;EACX,OAAO,CAAC,CAAC,KAAK;CAClB;CAEA,IAAI,YAAS;EACT,OAAO,KAAK,QAAQ;CACxB;CAEQ,mBAAgB;EACpB,IAAI,CAAC,KAAK,MAAM;GACZ,KAAK,OAAO;GACZ;EACJ;EAEA,MAAM,MACF,OAAO,KAAK,KAAK,QAAQ,eAAe,EAAE,CAAC,CAAC,QAAQ,QAAQ,MAAM,EAAE,YAAW,CAAE;EAErF,KAAK,OAAQ,YAAoB,QAAQ;CAC7C;CA7BS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAf,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAe,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;GAAA,MAAA;GAAA,OAAA;EAAA;EAAA,WAVb,CACP;GACI,SAAS;GACT,OAAO;GACP,UAAU,IAAI,mBAAmB;IAAE;IAAW;IAAY;IAAM;IAAM;IAAW;GAAG,CAAE;EACzF,CACJ;EAAA,eAAA;EAAA,UAAA;EAAA,UC7BL;EAmBA,QAAA,CAAA,oUAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDCQ;GAAY;GAAA;IAAA,MAAA;IAAA,MACZ;GAAmB;GAAA;IAAA,MAAA;IAAA,MAAAA,KAAA;IAAA,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAYd,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAe,YAAA,CAAA;EAjB3B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAS,YACP;GAAI,SACP,CACL,cACA,mBACH;GAAA,WACU,CACP;IACI,SAAS;IACT,OAAO;IACP,UAAU,IAAI,mBAAmB;KAAE;KAAW;KAAY;KAAM;KAAM;KAAW;IAAG,CAAE;GACzF,CACJ;GAAA,UAAA;GAAA,QAAA,CAAA,oUAAA;EAAA,CAAA;;;E,SAKA,MAAA,M;E,SACA,MAAA,M;E,UACA,MAAA,M;;;AE7BL,IAAa,sBAAb,MAAa,oBAAmB;CACnB;CACA,OAAO;CACP,QAAQ;CAHR,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;GAAA,MAAA;GAAA,OAAA;EAAA;EAAA,UAAA;EAAA,UAFlB;EAAE,UAAA;CAAA,CAAA;;AAEH,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAL/B,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,YAAY;GACZ,UAAU;EACb,CAAA;;;E,SAEI,MAAA,M;E,SACA,MAAA,M;E,UACA,MAAA,M;;;ACOL,IAAa,mBAAb,MAAa,iBAAgB;CAWsC;CAVpC;CAClB;CACA;CACA,QAAiB;CACjB;CACA;CAET;CACA,UAAiB,CAAA;CAEjB,YAA+D,iBAAwB;EAAxB,KAAA,kBAAA;CAA2B;CAE1F,WAAQ;EACJ,KAAK,UAAS;CAClB;CAEA,cAAW;EACP,KAAK,UAAS;CAClB;CAEA,IACI,mBAAgB;EAChB,IAAI,KAAK,SAAS,KAAK,QACnB,OAAO,GAAG,KAAK,MAAK,KAAM,KAAK;EAEnC,OAAO;CACX;CAEQ,YAAS;EACb,MAAM,kBAAkB,KAAK,aAAa,KAAK;EAE/C,IAAI,KAAK,YAAY,iBAAiB;GAClC,KAAK,MAAM,IAAI,gBAAgB,KAAK,UAAU,EAAE,WAAW,gBAAe,CAAE,CAAC,CACxE,SAAS,OAAO,KAAI,CAAE,CAAC,CAAC,CACxB,SAAS,QAAQC,OAAK,CAAE,CAAC,CAAC,CAC1B,OAAO,SAAQ,CAAE,CAAC,MAAM,IAAI,CAAC;GAElC,KAAK,UAAU,CAAC,WAAW,EAAE,OAAO,IAAG,CAAE,CAAC;GAE1C,IAAI,CAAC,KAAK,OACN,KAAK,QAAQ,KAAK,SAAQ,CAAE;EAEpC,OAAO,IAAI,CAAC,iBACR,QAAQ,KACJ,wHAAwH;CAGpI;CAhDS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;GAAA,OAWO;GAAqB,UAAA;EAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAX5C,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,UAAA;GAAA,WAAA;GAAA,iBAAA;GAAA,OAAA;GAAA,OAAA;GAAA,QAAA;EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,0BAAA,wBAAA,EAAA;EAAA,eAAA;EAAA,UAAA;EAAA,UCjB7B;EAQA,QAAA,CAAA,+TAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDKc;GAAY;GAAA;IAAA,MAAA;IAAA,MAAE;GAAgB;GAAA;IAAA,MAAA;IAAA,MAAA,GAAA;IAAA,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAI/B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAP5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,YACR;GAAI,SACP,CAAC,cAAc,gBAAgB;GAAC,UAAA;GAAA,QAAA,CAAA,+TAAA;EAAA,CAAA;;;;E,eAe5B,MAAA,S;GAAY,MAAA;GAAO,MAAA,CAAA,qBAAqB;;;;;GAVpD,MAAA;GAAM,MAAA,CAAA,EAAE,UAAU,KAAI,CAAE;;E,cACxB,MAAA,M;E,oBACA,MAAA,M;E,UACA,MAAA,M;E,UACA,MAAA,M;E,WACA,MAAA,M;;GAeA,MAAA;GAAY,MAAA,CAAA,wBAAwB"}
|
package/package.json
CHANGED
package/src/lib/styles/main.css
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
border-radius: 6px;
|
|
4
4
|
font-weight: 600;
|
|
5
5
|
cursor: pointer;
|
|
6
|
-
transition:
|
|
6
|
+
transition: background-color 0.2s ease, color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
|
|
7
7
|
border: none;
|
|
8
8
|
display: inline-flex;
|
|
9
9
|
align-items: center;
|
|
@@ -131,6 +131,21 @@ body {
|
|
|
131
131
|
background-color: var(--content-bg);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
/* Shared motion primitives for Angular Material dialogs. */
|
|
135
|
+
.cdk-overlay-backdrop {
|
|
136
|
+
opacity: 0;
|
|
137
|
+
transition: opacity 220ms cubic-bezier(0.22, 1, 0.36, 1);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.cdk-overlay-backdrop.cdk-overlay-backdrop-showing {
|
|
141
|
+
opacity: 1;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@media (prefers-reduced-motion: reduce) {
|
|
145
|
+
.cdk-overlay-backdrop {
|
|
146
|
+
transition-duration: 1ms;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
134
149
|
a {
|
|
135
150
|
text-decoration: none;
|
|
136
151
|
}
|
package/styles/main.css
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
border-radius: 6px;
|
|
4
4
|
font-weight: 600;
|
|
5
5
|
cursor: pointer;
|
|
6
|
-
transition:
|
|
6
|
+
transition: background-color 0.2s ease, color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
|
|
7
7
|
border: none;
|
|
8
8
|
display: inline-flex;
|
|
9
9
|
align-items: center;
|
|
@@ -131,6 +131,21 @@ body {
|
|
|
131
131
|
background-color: var(--content-bg);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
/* Shared motion primitives for Angular Material dialogs. */
|
|
135
|
+
.cdk-overlay-backdrop {
|
|
136
|
+
opacity: 0;
|
|
137
|
+
transition: opacity 220ms cubic-bezier(0.22, 1, 0.36, 1);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.cdk-overlay-backdrop.cdk-overlay-backdrop-showing {
|
|
141
|
+
opacity: 1;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@media (prefers-reduced-motion: reduce) {
|
|
145
|
+
.cdk-overlay-backdrop {
|
|
146
|
+
transition-duration: 1ms;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
134
149
|
a {
|
|
135
150
|
text-decoration: none;
|
|
136
151
|
}
|
|
@@ -5,6 +5,7 @@ import { Theme, ThemeService } from "@lluc_llull/ui-lib/theme";
|
|
|
5
5
|
export declare class HeaderClearComponent implements OnInit, OnDestroy, OnChanges {
|
|
6
6
|
private themeService;
|
|
7
7
|
isMenuOpen: boolean;
|
|
8
|
+
isMenuClosing: boolean;
|
|
8
9
|
currentTheme: Theme;
|
|
9
10
|
private themeSubscription?;
|
|
10
11
|
logo?: UiLibImageI;
|
|
@@ -23,6 +24,8 @@ export declare class HeaderClearComponent implements OnInit, OnDestroy, OnChange
|
|
|
23
24
|
openLanguagesModal(): void;
|
|
24
25
|
toggleTheme(): void;
|
|
25
26
|
toggleMenu(): void;
|
|
27
|
+
closeMenu(): void;
|
|
28
|
+
finishMenuClose(event: TransitionEvent): void;
|
|
26
29
|
static ɵfac: i0.ɵɵFactoryDeclaration<HeaderClearComponent, never>;
|
|
27
30
|
static ɵcmp: i0.ɵɵComponentDeclaration<HeaderClearComponent, "lib-header-clear", never, {
|
|
28
31
|
"logo": {
|