@zambon-dev/ui 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +173 -0
- package/fesm2022/zambon-dev-ui-framework.mjs +65 -13
- package/fesm2022/zambon-dev-ui-framework.mjs.map +1 -1
- package/fesm2022/zambon-dev-ui-library.mjs +250 -34
- package/fesm2022/zambon-dev-ui-library.mjs.map +1 -1
- package/fesm2022/zambon-dev-ui-shared.mjs +304 -51
- package/fesm2022/zambon-dev-ui-shared.mjs.map +1 -1
- package/fesm2022/zambon-dev-ui.mjs +3 -0
- package/i18n/shared/login/en.json +2 -0
- package/i18n/shared/login/pt.json +2 -0
- package/i18n/shared/top-bar/en.json +3 -0
- package/i18n/shared/top-bar/pt.json +3 -0
- package/package.json +1 -1
- package/styles/common.scss +0 -1
- package/styles/components/card.scss +9 -3
- package/styles/components/dropdown-static.scss +15 -17
- package/styles/components/input-group.scss +7 -3
- package/styles/components/input.scss +38 -17
- package/styles/components/label.scss +4 -1
- package/styles/theme.css +232 -0
- package/styles/variables.scss +79 -53
- package/types/zambon-dev-ui-framework.d.ts +15 -4
- package/types/zambon-dev-ui-library.d.ts +83 -1
- package/types/zambon-dev-ui-shared.d.ts +68 -1
- package/types/zambon-dev-ui.d.ts +4 -1
- package/styles/components/button.scss +0 -101
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { ChangeDetectionStrategy, Component, DOCUMENT, HostListener, Injectable, InjectionToken, Input, NgModule, Pipe, ViewChild, computed, inject, input, model, output, signal, viewChild } from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, DOCUMENT, HostListener, Injectable, InjectionToken, Input, NgModule, Pipe, ViewChild, computed, effect, inject, input, model, output, signal, viewChild } from "@angular/core";
|
|
3
3
|
import * as i1$1 from "@angular/router";
|
|
4
4
|
import { ActivatedRoute, Router, RouterModule } from "@angular/router";
|
|
5
5
|
import { APP_CONFIG, AuthService, ButtonComponent, ButtonFiltersComponent, ButtonRefreshComponent, ChildList, DefaultTabViewComponent, FRAMEWORK_VIEW_TYPE, FrameworkViewType, ModalBase, Tab, TabService, TabViewBase, TabsComponent } from "@zambon-dev/ui/framework";
|
|
6
|
-
import { CatalogSelectComponent, DataGridComponent, DataGridDataset, DataProviderService, FormGroupComponent, FormInputGroupComponent, ModalComponent, RibbonGroupComponent, SidebarComponent, SidebarMenuOpenMode, SidebarService, toSidebarMenuOpenMode } from "@zambon-dev/ui/library";
|
|
6
|
+
import { ButtonComponent as ButtonComponent$1, CatalogSelectComponent, DataGridComponent, DataGridDataset, DataProviderService, FormGroupComponent, FormInputGroupComponent, ModalComponent, RibbonGroupComponent, SidebarComponent, SidebarMenuOpenMode, SidebarService, toSidebarMenuOpenMode } from "@zambon-dev/ui/library";
|
|
7
7
|
import { TranslateLoader, TranslatePipe, TranslateService, provideTranslateService } from "@ngx-translate/core";
|
|
8
8
|
import { BehaviorSubject, Subject, catchError, finalize, interval, map, mergeMap, of, shareReplay, switchMap, take, takeUntil, tap } from "rxjs";
|
|
9
9
|
import { HttpBackend, HttpClient } from "@angular/common/http";
|
|
@@ -16,6 +16,10 @@ import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angu
|
|
|
16
16
|
import { DomSanitizer } from "@angular/platform-browser";
|
|
17
17
|
import { MultiTranslateHttpLoader } from "ngx-translate-multi-http-loader";
|
|
18
18
|
var LoginLayoutComponent = class LoginLayoutComponent {
|
|
19
|
+
config = inject(APP_CONFIG);
|
|
20
|
+
get backgroundUrl() {
|
|
21
|
+
return this.config.loginBackgroundUrl;
|
|
22
|
+
}
|
|
19
23
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
20
24
|
minVersion: "12.0.0",
|
|
21
25
|
version: "22.2.0",
|
|
@@ -25,14 +29,14 @@ var LoginLayoutComponent = class LoginLayoutComponent {
|
|
|
25
29
|
target: i0.ɵɵFactoryTarget.Component
|
|
26
30
|
});
|
|
27
31
|
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
28
|
-
minVersion: "
|
|
32
|
+
minVersion: "17.0.0",
|
|
29
33
|
version: "22.2.0",
|
|
30
34
|
type: LoginLayoutComponent,
|
|
31
35
|
isStandalone: true,
|
|
32
36
|
selector: "shared-login-layout",
|
|
33
37
|
ngImport: i0,
|
|
34
|
-
template: "<div class=\"background\"></div>\n\n<div class=\"container\">\n <router-outlet></router-outlet>\n</div>\n",
|
|
35
|
-
styles: ["
|
|
38
|
+
template: "@if (backgroundUrl) {\n <div class=\"background\" [style.background-image]=\"'url(' + backgroundUrl + ')'\"></div>\n}\n\n<div class=\"container\">\n <router-outlet></router-outlet>\n\n <!-- Projected content renders beside the outlet, so the layout can host a sign-in screen that is\n not reached through the router. Without it, a child placed inside this element was silently\n dropped -- which is what the Storybook story had been doing. -->\n <ng-content></ng-content>\n</div>\n",
|
|
39
|
+
styles: [":host{position:relative;display:block;height:100vh;overflow-y:auto;background:var(--app-backdrop)}.background{position:fixed;inset:0;z-index:-10;background-size:cover;background-position:center;background-repeat:no-repeat}.container{display:flex;min-height:100%;align-items:center;justify-content:center;padding:calc(var(--spacing, .25rem) * 6)}router-outlet{display:none}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
36
40
|
dependencies: [{
|
|
37
41
|
kind: "ngmodule",
|
|
38
42
|
type: RouterModule
|
|
@@ -63,8 +67,8 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
63
67
|
selector: "shared-login-layout",
|
|
64
68
|
imports: [RouterModule],
|
|
65
69
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
66
|
-
template: "<div class=\"background\"></div>\n\n<div class=\"container\">\n <router-outlet></router-outlet>\n</div>\n",
|
|
67
|
-
styles: ["
|
|
70
|
+
template: "@if (backgroundUrl) {\n <div class=\"background\" [style.background-image]=\"'url(' + backgroundUrl + ')'\"></div>\n}\n\n<div class=\"container\">\n <router-outlet></router-outlet>\n\n <!-- Projected content renders beside the outlet, so the layout can host a sign-in screen that is\n not reached through the router. Without it, a child placed inside this element was silently\n dropped -- which is what the Storybook story had been doing. -->\n <ng-content></ng-content>\n</div>\n",
|
|
71
|
+
styles: [":host{position:relative;display:block;height:100vh;overflow-y:auto;background:var(--app-backdrop)}.background{position:fixed;inset:0;z-index:-10;background-size:cover;background-position:center;background-repeat:no-repeat}.container{display:flex;min-height:100%;align-items:center;justify-content:center;padding:calc(var(--spacing, .25rem) * 6)}router-outlet{display:none}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
68
72
|
}]
|
|
69
73
|
}]
|
|
70
74
|
});
|
|
@@ -443,7 +447,7 @@ var BrandComponent = class BrandComponent {
|
|
|
443
447
|
selector: "shared-brand",
|
|
444
448
|
ngImport: i0,
|
|
445
449
|
template: "<div class=\"brand\">\n @if (logoUrl) {\n <img class=\"brand-logo\" [src]=\"logoUrl\" [alt]=\"appName\" />\n }\n\n <div class=\"brand-text\">\n <span class=\"brand-app\">{{ appName }}</span>\n @if (companyName) {\n <span class=\"brand-company\">{{ companyName }}</span>\n }\n </div>\n</div>\n",
|
|
446
|
-
styles: ["@layer properties;.brand{display:flex;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.brand .brand-app{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.brand .brand-company{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-
|
|
450
|
+
styles: ["@layer properties;.brand{display:flex;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.brand .brand-app{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.brand .brand-company{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-caption);color:var(--color-content-secondary)}.brand .brand-logo{height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);flex-shrink:0;object-fit:contain}.brand .brand-text{display:flex;min-width:0px;flex-direction:column;--tw-leading: var(--leading-tight, 1.25);line-height:var(--leading-tight, 1.25)}@media(max-width:767px){.brand .brand-text{display:none}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-leading: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
447
451
|
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
448
452
|
});
|
|
449
453
|
};
|
|
@@ -458,7 +462,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
458
462
|
selector: "shared-brand",
|
|
459
463
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
460
464
|
template: "<div class=\"brand\">\n @if (logoUrl) {\n <img class=\"brand-logo\" [src]=\"logoUrl\" [alt]=\"appName\" />\n }\n\n <div class=\"brand-text\">\n <span class=\"brand-app\">{{ appName }}</span>\n @if (companyName) {\n <span class=\"brand-company\">{{ companyName }}</span>\n }\n </div>\n</div>\n",
|
|
461
|
-
styles: ["@layer properties;.brand{display:flex;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.brand .brand-app{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.brand .brand-company{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-
|
|
465
|
+
styles: ["@layer properties;.brand{display:flex;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.brand .brand-app{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.brand .brand-company{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-caption);color:var(--color-content-secondary)}.brand .brand-logo{height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);flex-shrink:0;object-fit:contain}.brand .brand-text{display:flex;min-width:0px;flex-direction:column;--tw-leading: var(--leading-tight, 1.25);line-height:var(--leading-tight, 1.25)}@media(max-width:767px){.brand .brand-text{display:none}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-leading: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
462
466
|
}]
|
|
463
467
|
}]
|
|
464
468
|
});
|
|
@@ -493,7 +497,7 @@ var EnvironmentBadgeComponent = class EnvironmentBadgeComponent {
|
|
|
493
497
|
selector: "shared-environment-badge",
|
|
494
498
|
ngImport: i0,
|
|
495
499
|
template: "@if (isVisible) {\n <span class=\"env-badge {{ badgeClass }}\">\n <span class=\"env-dot\"></span>\n <span class=\"env-label\">{{ environment }}</span>\n </span>\n}\n",
|
|
496
|
-
styles: ["@layer properties;.env-badge{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:.325rem
|
|
500
|
+
styles: ["@layer properties;.env-badge{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:.325rem;--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);text-transform:uppercase;--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-inset: inset;font-size:var(--text-body);font-weight:var(--font-weight-emphasis);background-color:var(--env-hue);color:var(--env-hue);--tw-ring-color: var(--env-hue)}@supports (color: color-mix(in lab,red,red)){.env-badge{background-color:color-mix(in srgb,var(--env-hue) 18%,transparent)}}@supports (color: color-mix(in lab,red,red)){.env-badge{color:color-mix(in srgb,var(--env-hue) 70%,var(--color-content-primary))}}@supports (color: color-mix(in lab,red,red)){.env-badge{--tw-ring-color: color-mix(in srgb, var(--env-hue) 35%, transparent)}}.env-badge .env-dot{height:calc(var(--spacing, .25rem) * 1.5);width:calc(var(--spacing, .25rem) * 1.5);flex-shrink:0;border-radius:calc(infinity * 1px);background-color:var(--env-hue)}.env-badge.env-dev{--env-hue: var(--color-blue-500)}.env-badge.env-neutral{--env-hue: var(--color-stone-500)}.env-badge.env-qa{--env-hue: var(--color-amber-500)}.env-badge.env-stg{--env-hue: var(--color-violet-500)}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
497
501
|
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
498
502
|
});
|
|
499
503
|
};
|
|
@@ -508,7 +512,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
508
512
|
selector: "shared-environment-badge",
|
|
509
513
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
510
514
|
template: "@if (isVisible) {\n <span class=\"env-badge {{ badgeClass }}\">\n <span class=\"env-dot\"></span>\n <span class=\"env-label\">{{ environment }}</span>\n </span>\n}\n",
|
|
511
|
-
styles: ["@layer properties;.env-badge{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:.325rem
|
|
515
|
+
styles: ["@layer properties;.env-badge{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:.325rem;--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);text-transform:uppercase;--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-inset: inset;font-size:var(--text-body);font-weight:var(--font-weight-emphasis);background-color:var(--env-hue);color:var(--env-hue);--tw-ring-color: var(--env-hue)}@supports (color: color-mix(in lab,red,red)){.env-badge{background-color:color-mix(in srgb,var(--env-hue) 18%,transparent)}}@supports (color: color-mix(in lab,red,red)){.env-badge{color:color-mix(in srgb,var(--env-hue) 70%,var(--color-content-primary))}}@supports (color: color-mix(in lab,red,red)){.env-badge{--tw-ring-color: color-mix(in srgb, var(--env-hue) 35%, transparent)}}.env-badge .env-dot{height:calc(var(--spacing, .25rem) * 1.5);width:calc(var(--spacing, .25rem) * 1.5);flex-shrink:0;border-radius:calc(infinity * 1px);background-color:var(--env-hue)}.env-badge.env-dev{--env-hue: var(--color-blue-500)}.env-badge.env-neutral{--env-hue: var(--color-stone-500)}.env-badge.env-qa{--env-hue: var(--color-amber-500)}.env-badge.env-stg{--env-hue: var(--color-violet-500)}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
512
516
|
}]
|
|
513
517
|
}]
|
|
514
518
|
});
|
|
@@ -572,17 +576,35 @@ var NotificationsComponent = class NotificationsComponent {
|
|
|
572
576
|
isSignal: true
|
|
573
577
|
}],
|
|
574
578
|
ngImport: i0,
|
|
575
|
-
template: "@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <button\n class=\"
|
|
576
|
-
styles: ["@layer properties;.notifications{position:relative}.notifications .notifications-badge{position:absolute;top:
|
|
577
|
-
dependencies: [
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
579
|
+
template: "@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <lib-button\n class=\"notifications-toggle\"\n intent=\"ghost\"\n icon=\"fa-solid fa-bell\"\n [ariaLabel]=\"'TopBar-Notifications-Title' | translate\"\n (click)=\"onDropdownClick()\"\n ></lib-button>\n\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n\n @if (showDropdown()) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button\n type=\"button\"\n class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\"\n (click)=\"onNotificationClick(item)\"\n >\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n",
|
|
580
|
+
styles: ["@layer properties;.notifications{position:relative}.notifications .notifications-badge{pointer-events:none;position:absolute;top:var(--spacing, .25rem);right:var(--spacing, .25rem);height:calc(var(--spacing, .25rem) * 4);min-width:calc(var(--spacing, .25rem) * 4);border-radius:calc(infinity * 1px);padding-inline:var(--spacing, .25rem);display:flex;align-items:center;justify-content:center;font-size:10px;--tw-leading: 1;line-height:1;--tw-font-weight: var(--font-weight-bold, 700);font-weight:var(--font-weight-bold, 700);background-color:var(--color-danger);color:var(--color-content-on-accent)}.notifications .notifications-empty{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 6);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:var(--color-content-secondary)}.notifications .notifications-header{display:flex;align-items:center;justify-content:space-between;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);border-color:var(--color-line);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.notifications .notifications-list{max-height:calc(var(--spacing, .25rem) * 80);overflow-y:auto}.notifications .notifications-list .notifications-item{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-line)}.notifications .notifications-list .notifications-item:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0px}.notifications .notifications-list .notifications-item.unread{background-color:var(--state-selected)}.notifications .notifications-list .notifications-item .notifications-item-body{display:flex;min-width:0px;flex:1;flex-direction:column}.notifications .notifications-list .notifications-item .notifications-item-btn{display:flex;width:100%;cursor:pointer;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 2.5);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);text-align:left}.notifications .notifications-list .notifications-item .notifications-item-btn:hover{background-color:var(--state-hover)}.notifications .notifications-list .notifications-item .notifications-item-cta{margin-top:var(--spacing, .25rem);flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:var(--color-content-subtle)}.notifications .notifications-list .notifications-item .notifications-item-description{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:var(--color-content-secondary)}.notifications .notifications-list .notifications-item .notifications-item-icon{margin-top:calc(var(--spacing, .25rem) * .5);display:flex;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));background-color:var(--color-surface-inset);color:var(--color-content-secondary)}.notifications .notifications-list .notifications-item .notifications-item-title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:var(--color-content-primary)}.notifications .notifications-mark-all{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:var(--color-accent)}.notifications .notifications-mark-all:hover{color:var(--color-accent-strong)}.notifications .notifications-panel{position:absolute;top:100%;right:0;z-index:50;margin-top:var(--spacing, .25rem);width:calc(var(--spacing, .25rem) * 80);max-width:90vw;border-style:var(--tw-border-style);border-width:1px;border-radius:var(--radius-control);border-color:var(--color-line);background-color:var(--color-surface-solid);box-shadow:var(--shadow-overlay)}.notifications .notifications-toggle{position:relative}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
581
|
+
dependencies: [
|
|
582
|
+
{
|
|
583
|
+
kind: "component",
|
|
584
|
+
type: ButtonComponent$1,
|
|
585
|
+
selector: "lib-button",
|
|
586
|
+
inputs: [
|
|
587
|
+
"intent",
|
|
588
|
+
"type",
|
|
589
|
+
"disabled",
|
|
590
|
+
"loading",
|
|
591
|
+
"success",
|
|
592
|
+
"error",
|
|
593
|
+
"icon",
|
|
594
|
+
"ariaLabel"
|
|
595
|
+
]
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
kind: "pipe",
|
|
599
|
+
type: AsyncPipe,
|
|
600
|
+
name: "async"
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
kind: "pipe",
|
|
604
|
+
type: TranslatePipe,
|
|
605
|
+
name: "translate"
|
|
606
|
+
}
|
|
607
|
+
]
|
|
586
608
|
});
|
|
587
609
|
};
|
|
588
610
|
i0.ɵɵngDeclareClassMetadata({
|
|
@@ -594,9 +616,13 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
594
616
|
type: Component,
|
|
595
617
|
args: [{
|
|
596
618
|
selector: "shared-notifications",
|
|
597
|
-
imports: [
|
|
598
|
-
|
|
599
|
-
|
|
619
|
+
imports: [
|
|
620
|
+
AsyncPipe,
|
|
621
|
+
ButtonComponent$1,
|
|
622
|
+
TranslatePipe
|
|
623
|
+
],
|
|
624
|
+
template: "@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <lib-button\n class=\"notifications-toggle\"\n intent=\"ghost\"\n icon=\"fa-solid fa-bell\"\n [ariaLabel]=\"'TopBar-Notifications-Title' | translate\"\n (click)=\"onDropdownClick()\"\n ></lib-button>\n\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n\n @if (showDropdown()) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button\n type=\"button\"\n class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\"\n (click)=\"onNotificationClick(item)\"\n >\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n",
|
|
625
|
+
styles: ["@layer properties;.notifications{position:relative}.notifications .notifications-badge{pointer-events:none;position:absolute;top:var(--spacing, .25rem);right:var(--spacing, .25rem);height:calc(var(--spacing, .25rem) * 4);min-width:calc(var(--spacing, .25rem) * 4);border-radius:calc(infinity * 1px);padding-inline:var(--spacing, .25rem);display:flex;align-items:center;justify-content:center;font-size:10px;--tw-leading: 1;line-height:1;--tw-font-weight: var(--font-weight-bold, 700);font-weight:var(--font-weight-bold, 700);background-color:var(--color-danger);color:var(--color-content-on-accent)}.notifications .notifications-empty{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 6);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:var(--color-content-secondary)}.notifications .notifications-header{display:flex;align-items:center;justify-content:space-between;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);border-color:var(--color-line);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.notifications .notifications-list{max-height:calc(var(--spacing, .25rem) * 80);overflow-y:auto}.notifications .notifications-list .notifications-item{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-line)}.notifications .notifications-list .notifications-item:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0px}.notifications .notifications-list .notifications-item.unread{background-color:var(--state-selected)}.notifications .notifications-list .notifications-item .notifications-item-body{display:flex;min-width:0px;flex:1;flex-direction:column}.notifications .notifications-list .notifications-item .notifications-item-btn{display:flex;width:100%;cursor:pointer;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 2.5);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);text-align:left}.notifications .notifications-list .notifications-item .notifications-item-btn:hover{background-color:var(--state-hover)}.notifications .notifications-list .notifications-item .notifications-item-cta{margin-top:var(--spacing, .25rem);flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:var(--color-content-subtle)}.notifications .notifications-list .notifications-item .notifications-item-description{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:var(--color-content-secondary)}.notifications .notifications-list .notifications-item .notifications-item-icon{margin-top:calc(var(--spacing, .25rem) * .5);display:flex;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));background-color:var(--color-surface-inset);color:var(--color-content-secondary)}.notifications .notifications-list .notifications-item .notifications-item-title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:var(--color-content-primary)}.notifications .notifications-mark-all{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:var(--color-accent)}.notifications .notifications-mark-all:hover{color:var(--color-accent-strong)}.notifications .notifications-panel{position:absolute;top:100%;right:0;z-index:50;margin-top:var(--spacing, .25rem);width:calc(var(--spacing, .25rem) * 80);max-width:90vw;border-style:var(--tw-border-style);border-width:1px;border-radius:var(--radius-control);border-color:var(--color-line);background-color:var(--color-surface-solid);box-shadow:var(--shadow-overlay)}.notifications .notifications-toggle{position:relative}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
600
626
|
}]
|
|
601
627
|
}],
|
|
602
628
|
propDecorators: {
|
|
@@ -678,9 +704,23 @@ var LanguageSelectorComponent = class LanguageSelectorComponent {
|
|
|
678
704
|
isSignal: true
|
|
679
705
|
}],
|
|
680
706
|
ngImport: i0,
|
|
681
|
-
template: "<div #dropdown class=\"dropdown right\" [class.show]=\"showDropdown()\">\n <button\n
|
|
682
|
-
styles: ["@layer properties;.dropdown
|
|
707
|
+
template: "<div #dropdown class=\"dropdown right\" [class.show]=\"showDropdown()\">\n <lib-button\n intent=\"ghost\"\n [class.lang-flag-toggle]=\"showFlag()\"\n [ariaLabel]=\"showFlag() ? (title() | translate) : undefined\"\n (click)=\"onDropdownClick()\"\n >\n @if (showFlag()) {\n <span class=\"flag flag-{{ selectedLanguage }}\"></span>\n } @else {\n {{ title() | translate }}\n }\n </lib-button>\n\n <ul>\n @for (lang of languages; track lang) {\n <li>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n [class.selected]=\"lang === selectedLanguage\"\n (click)=\"onSelectLanguage(lang)\"\n >\n <span class=\"flag flag-{{ lang }}\"></span>\n <span class=\"dropdown-label\">{{ 'Language-' + lang | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</div>\n",
|
|
708
|
+
styles: ["@layer properties;.dropdown lib-button{width:100%}.dropdown .flag{display:inline-block;height:calc(var(--spacing, .25rem) * 4);width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;border-radius:var(--radius-xs, .125rem);background-size:cover;background-position:center;--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: var(--color-line)}.dropdown .flag.flag-en{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 76 40\"%3E%3Crect width=\"76\" height=\"40\" fill=\"%23b22234\"/%3E%3Cg fill=\"%23fff\"%3E%3Crect y=\"3\" width=\"76\" height=\"3\"/%3E%3Crect y=\"9\" width=\"76\" height=\"3\"/%3E%3Crect y=\"15\" width=\"76\" height=\"3\"/%3E%3Crect y=\"22\" width=\"76\" height=\"3\"/%3E%3Crect y=\"28\" width=\"76\" height=\"3\"/%3E%3Crect y=\"34\" width=\"76\" height=\"3\"/%3E%3C/g%3E%3Crect width=\"30\" height=\"22\" fill=\"%233c3b6e\"/%3E%3C/svg%3E')}.dropdown .flag.flag-pt{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 70 49\"%3E%3Crect width=\"70\" height=\"49\" fill=\"%23009c3b\"/%3E%3Cpath d=\"M35 6L64 24.5L35 43L6 24.5Z\" fill=\"%23ffdf00\"/%3E%3Ccircle cx=\"35\" cy=\"24.5\" r=\"9.8\" fill=\"%23002776\"/%3E%3C/svg%3E')}.dropdown .lang-flag-toggle{display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);align-items:center;justify-content:center}.dropdown .lang-flag-toggle ::ng-deep .lib-button{height:100%;width:100%;padding-inline:0px}.dropdown .lang-flag-toggle .flag{height:calc(var(--spacing, .25rem) * 3.5);width:calc(var(--spacing, .25rem) * 5)}.dropdown ul{z-index:50;margin-top:var(--spacing, .25rem);min-width:11rem;padding:var(--spacing, .25rem);border-style:var(--tw-border-style);border-width:1px;--tw-backdrop-blur: ;-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);border-radius:var(--radius-control);border-color:var(--color-line);background-color:var(--color-surface-solid);box-shadow:var(--shadow-overlay)}.dropdown ul .dropdown-item{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-sm, .25rem);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);-webkit-user-select:none;user-select:none;text-align:left;font-size:var(--text-body);color:var(--color-content-primary)}.dropdown ul .dropdown-item:hover,.dropdown ul .dropdown-item:focus-visible{--tw-outline-style: none;outline-style:none;background-color:var(--state-hover)}@media(forced-colors:active){.dropdown ul .dropdown-item:hover,.dropdown ul .dropdown-item:focus-visible{outline:2px solid transparent;outline-offset:2px}}.dropdown ul .dropdown-item:active{background-color:var(--state-pressed)}.dropdown ul .dropdown-item.selected{background-color:var(--state-selected);color:var(--color-accent-strong);font-weight:var(--font-weight-emphasis)}.dropdown ul .dropdown-item.selected:hover{background-color:var(--state-selected)}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-backdrop-blur{syntax: \"*\"; inherits: false;}@property --tw-backdrop-brightness{syntax: \"*\"; inherits: false;}@property --tw-backdrop-contrast{syntax: \"*\"; inherits: false;}@property --tw-backdrop-grayscale{syntax: \"*\"; inherits: false;}@property --tw-backdrop-hue-rotate{syntax: \"*\"; inherits: false;}@property --tw-backdrop-invert{syntax: \"*\"; inherits: false;}@property --tw-backdrop-opacity{syntax: \"*\"; inherits: false;}@property --tw-backdrop-saturate{syntax: \"*\"; inherits: false;}@property --tw-backdrop-sepia{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-border-style: solid;--tw-backdrop-blur: initial;--tw-backdrop-brightness: initial;--tw-backdrop-contrast: initial;--tw-backdrop-grayscale: initial;--tw-backdrop-hue-rotate: initial;--tw-backdrop-invert: initial;--tw-backdrop-opacity: initial;--tw-backdrop-saturate: initial;--tw-backdrop-sepia: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
683
709
|
dependencies: [{
|
|
710
|
+
kind: "component",
|
|
711
|
+
type: ButtonComponent$1,
|
|
712
|
+
selector: "lib-button",
|
|
713
|
+
inputs: [
|
|
714
|
+
"intent",
|
|
715
|
+
"type",
|
|
716
|
+
"disabled",
|
|
717
|
+
"loading",
|
|
718
|
+
"success",
|
|
719
|
+
"error",
|
|
720
|
+
"icon",
|
|
721
|
+
"ariaLabel"
|
|
722
|
+
]
|
|
723
|
+
}, {
|
|
684
724
|
kind: "pipe",
|
|
685
725
|
type: TranslatePipe,
|
|
686
726
|
name: "translate"
|
|
@@ -696,9 +736,9 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
696
736
|
type: Component,
|
|
697
737
|
args: [{
|
|
698
738
|
selector: "shared-language-selector",
|
|
699
|
-
imports: [TranslatePipe],
|
|
700
|
-
template: "<div #dropdown class=\"dropdown right\" [class.show]=\"showDropdown()\">\n <button\n
|
|
701
|
-
styles: ["@layer properties;.dropdown
|
|
739
|
+
imports: [ButtonComponent$1, TranslatePipe],
|
|
740
|
+
template: "<div #dropdown class=\"dropdown right\" [class.show]=\"showDropdown()\">\n <lib-button\n intent=\"ghost\"\n [class.lang-flag-toggle]=\"showFlag()\"\n [ariaLabel]=\"showFlag() ? (title() | translate) : undefined\"\n (click)=\"onDropdownClick()\"\n >\n @if (showFlag()) {\n <span class=\"flag flag-{{ selectedLanguage }}\"></span>\n } @else {\n {{ title() | translate }}\n }\n </lib-button>\n\n <ul>\n @for (lang of languages; track lang) {\n <li>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n [class.selected]=\"lang === selectedLanguage\"\n (click)=\"onSelectLanguage(lang)\"\n >\n <span class=\"flag flag-{{ lang }}\"></span>\n <span class=\"dropdown-label\">{{ 'Language-' + lang | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</div>\n",
|
|
741
|
+
styles: ["@layer properties;.dropdown lib-button{width:100%}.dropdown .flag{display:inline-block;height:calc(var(--spacing, .25rem) * 4);width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;border-radius:var(--radius-xs, .125rem);background-size:cover;background-position:center;--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: var(--color-line)}.dropdown .flag.flag-en{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 76 40\"%3E%3Crect width=\"76\" height=\"40\" fill=\"%23b22234\"/%3E%3Cg fill=\"%23fff\"%3E%3Crect y=\"3\" width=\"76\" height=\"3\"/%3E%3Crect y=\"9\" width=\"76\" height=\"3\"/%3E%3Crect y=\"15\" width=\"76\" height=\"3\"/%3E%3Crect y=\"22\" width=\"76\" height=\"3\"/%3E%3Crect y=\"28\" width=\"76\" height=\"3\"/%3E%3Crect y=\"34\" width=\"76\" height=\"3\"/%3E%3C/g%3E%3Crect width=\"30\" height=\"22\" fill=\"%233c3b6e\"/%3E%3C/svg%3E')}.dropdown .flag.flag-pt{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 70 49\"%3E%3Crect width=\"70\" height=\"49\" fill=\"%23009c3b\"/%3E%3Cpath d=\"M35 6L64 24.5L35 43L6 24.5Z\" fill=\"%23ffdf00\"/%3E%3Ccircle cx=\"35\" cy=\"24.5\" r=\"9.8\" fill=\"%23002776\"/%3E%3C/svg%3E')}.dropdown .lang-flag-toggle{display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);align-items:center;justify-content:center}.dropdown .lang-flag-toggle ::ng-deep .lib-button{height:100%;width:100%;padding-inline:0px}.dropdown .lang-flag-toggle .flag{height:calc(var(--spacing, .25rem) * 3.5);width:calc(var(--spacing, .25rem) * 5)}.dropdown ul{z-index:50;margin-top:var(--spacing, .25rem);min-width:11rem;padding:var(--spacing, .25rem);border-style:var(--tw-border-style);border-width:1px;--tw-backdrop-blur: ;-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);border-radius:var(--radius-control);border-color:var(--color-line);background-color:var(--color-surface-solid);box-shadow:var(--shadow-overlay)}.dropdown ul .dropdown-item{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-sm, .25rem);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);-webkit-user-select:none;user-select:none;text-align:left;font-size:var(--text-body);color:var(--color-content-primary)}.dropdown ul .dropdown-item:hover,.dropdown ul .dropdown-item:focus-visible{--tw-outline-style: none;outline-style:none;background-color:var(--state-hover)}@media(forced-colors:active){.dropdown ul .dropdown-item:hover,.dropdown ul .dropdown-item:focus-visible{outline:2px solid transparent;outline-offset:2px}}.dropdown ul .dropdown-item:active{background-color:var(--state-pressed)}.dropdown ul .dropdown-item.selected{background-color:var(--state-selected);color:var(--color-accent-strong);font-weight:var(--font-weight-emphasis)}.dropdown ul .dropdown-item.selected:hover{background-color:var(--state-selected)}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-backdrop-blur{syntax: \"*\"; inherits: false;}@property --tw-backdrop-brightness{syntax: \"*\"; inherits: false;}@property --tw-backdrop-contrast{syntax: \"*\"; inherits: false;}@property --tw-backdrop-grayscale{syntax: \"*\"; inherits: false;}@property --tw-backdrop-hue-rotate{syntax: \"*\"; inherits: false;}@property --tw-backdrop-invert{syntax: \"*\"; inherits: false;}@property --tw-backdrop-opacity{syntax: \"*\"; inherits: false;}@property --tw-backdrop-saturate{syntax: \"*\"; inherits: false;}@property --tw-backdrop-sepia{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-border-style: solid;--tw-backdrop-blur: initial;--tw-backdrop-brightness: initial;--tw-backdrop-contrast: initial;--tw-backdrop-grayscale: initial;--tw-backdrop-hue-rotate: initial;--tw-backdrop-invert: initial;--tw-backdrop-opacity: initial;--tw-backdrop-saturate: initial;--tw-backdrop-sepia: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
702
742
|
}]
|
|
703
743
|
}],
|
|
704
744
|
propDecorators: {
|
|
@@ -728,6 +768,154 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
728
768
|
}]
|
|
729
769
|
}
|
|
730
770
|
});
|
|
771
|
+
const THEME_STORAGE_KEY = "zambon-theme";
|
|
772
|
+
const THEME_ATTRIBUTE = "data-theme";
|
|
773
|
+
const SYSTEM_DARK_QUERY = "(prefers-color-scheme: dark)";
|
|
774
|
+
var ThemeService = class ThemeService {
|
|
775
|
+
document = inject(DOCUMENT);
|
|
776
|
+
preferenceState = signal(this.readStoredPreference(), ...ngDevMode ? [{ debugName: "preferenceState" }] : /* istanbul ignore next */ []);
|
|
777
|
+
systemPrefersDark = signal(this.readSystemPrefersDark(), ...ngDevMode ? [{ debugName: "systemPrefersDark" }] : /* istanbul ignore next */ []);
|
|
778
|
+
preference = this.preferenceState.asReadonly();
|
|
779
|
+
resolved = computed(() => {
|
|
780
|
+
const preference = this.preferenceState();
|
|
781
|
+
if (preference !== "system") return preference;
|
|
782
|
+
return this.systemPrefersDark() ? "dark" : "light";
|
|
783
|
+
}, ...ngDevMode ? [{ debugName: "resolved" }] : /* istanbul ignore next */ []);
|
|
784
|
+
constructor() {
|
|
785
|
+
this.watchSystemPreference();
|
|
786
|
+
effect(() => {
|
|
787
|
+
this.document.documentElement.setAttribute(THEME_ATTRIBUTE, this.resolved());
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
setPreference(preference) {
|
|
791
|
+
this.preferenceState.set(preference);
|
|
792
|
+
try {
|
|
793
|
+
this.document.defaultView?.localStorage.setItem(THEME_STORAGE_KEY, preference);
|
|
794
|
+
} catch {}
|
|
795
|
+
}
|
|
796
|
+
cyclePreference() {
|
|
797
|
+
const order = [
|
|
798
|
+
"light",
|
|
799
|
+
"dark",
|
|
800
|
+
"system"
|
|
801
|
+
];
|
|
802
|
+
const next = order[(order.indexOf(this.preferenceState()) + 1) % order.length];
|
|
803
|
+
this.setPreference(next);
|
|
804
|
+
}
|
|
805
|
+
readStoredPreference() {
|
|
806
|
+
try {
|
|
807
|
+
const stored = this.document.defaultView?.localStorage.getItem(THEME_STORAGE_KEY);
|
|
808
|
+
if (stored === "light" || stored === "dark" || stored === "system") return stored;
|
|
809
|
+
} catch {}
|
|
810
|
+
const existing = this.document.documentElement.getAttribute(THEME_ATTRIBUTE);
|
|
811
|
+
return existing === "dark" || existing === "light" ? existing : "light";
|
|
812
|
+
}
|
|
813
|
+
readSystemPrefersDark() {
|
|
814
|
+
return this.document.defaultView?.matchMedia?.(SYSTEM_DARK_QUERY).matches ?? false;
|
|
815
|
+
}
|
|
816
|
+
watchSystemPreference() {
|
|
817
|
+
(this.document.defaultView?.matchMedia?.(SYSTEM_DARK_QUERY))?.addEventListener("change", (event) => this.systemPrefersDark.set(event.matches));
|
|
818
|
+
}
|
|
819
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
820
|
+
minVersion: "12.0.0",
|
|
821
|
+
version: "22.2.0",
|
|
822
|
+
ngImport: i0,
|
|
823
|
+
type: ThemeService,
|
|
824
|
+
deps: [],
|
|
825
|
+
target: i0.ɵɵFactoryTarget.Injectable
|
|
826
|
+
});
|
|
827
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
828
|
+
minVersion: "12.0.0",
|
|
829
|
+
version: "22.2.0",
|
|
830
|
+
ngImport: i0,
|
|
831
|
+
type: ThemeService,
|
|
832
|
+
providedIn: "root"
|
|
833
|
+
});
|
|
834
|
+
};
|
|
835
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
836
|
+
minVersion: "12.0.0",
|
|
837
|
+
version: "22.2.0",
|
|
838
|
+
ngImport: i0,
|
|
839
|
+
type: ThemeService,
|
|
840
|
+
decorators: [{
|
|
841
|
+
type: Injectable,
|
|
842
|
+
args: [{ providedIn: "root" }]
|
|
843
|
+
}],
|
|
844
|
+
ctorParameters: () => []
|
|
845
|
+
});
|
|
846
|
+
var ThemeSwitchComponent = class ThemeSwitchComponent {
|
|
847
|
+
theme = inject(ThemeService);
|
|
848
|
+
preference = this.theme.preference;
|
|
849
|
+
icon = computed(() => {
|
|
850
|
+
return {
|
|
851
|
+
light: "fa-solid fa-sun",
|
|
852
|
+
dark: "fa-solid fa-moon",
|
|
853
|
+
system: "fa-solid fa-circle-half-stroke"
|
|
854
|
+
}[this.preference()];
|
|
855
|
+
}, ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
|
|
856
|
+
label = computed(() => {
|
|
857
|
+
return {
|
|
858
|
+
light: "TopBar-Theme-Light",
|
|
859
|
+
dark: "TopBar-Theme-Dark",
|
|
860
|
+
system: "TopBar-Theme-System"
|
|
861
|
+
}[this.preference()];
|
|
862
|
+
}, ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
|
|
863
|
+
onClick() {
|
|
864
|
+
this.theme.cyclePreference();
|
|
865
|
+
}
|
|
866
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
867
|
+
minVersion: "12.0.0",
|
|
868
|
+
version: "22.2.0",
|
|
869
|
+
ngImport: i0,
|
|
870
|
+
type: ThemeSwitchComponent,
|
|
871
|
+
deps: [],
|
|
872
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
873
|
+
});
|
|
874
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
875
|
+
minVersion: "14.0.0",
|
|
876
|
+
version: "22.2.0",
|
|
877
|
+
type: ThemeSwitchComponent,
|
|
878
|
+
isStandalone: true,
|
|
879
|
+
selector: "shared-theme-switch",
|
|
880
|
+
ngImport: i0,
|
|
881
|
+
template: "<lib-button\n intent=\"ghost\"\n [icon]=\"icon()\"\n [ariaLabel]=\"label() | translate\"\n [title]=\"label() | translate\"\n (click)=\"onClick()\"\n></lib-button>\n",
|
|
882
|
+
dependencies: [{
|
|
883
|
+
kind: "component",
|
|
884
|
+
type: ButtonComponent$1,
|
|
885
|
+
selector: "lib-button",
|
|
886
|
+
inputs: [
|
|
887
|
+
"intent",
|
|
888
|
+
"type",
|
|
889
|
+
"disabled",
|
|
890
|
+
"loading",
|
|
891
|
+
"success",
|
|
892
|
+
"error",
|
|
893
|
+
"icon",
|
|
894
|
+
"ariaLabel"
|
|
895
|
+
]
|
|
896
|
+
}, {
|
|
897
|
+
kind: "pipe",
|
|
898
|
+
type: TranslatePipe,
|
|
899
|
+
name: "translate"
|
|
900
|
+
}],
|
|
901
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
902
|
+
});
|
|
903
|
+
};
|
|
904
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
905
|
+
minVersion: "12.0.0",
|
|
906
|
+
version: "22.2.0",
|
|
907
|
+
ngImport: i0,
|
|
908
|
+
type: ThemeSwitchComponent,
|
|
909
|
+
decorators: [{
|
|
910
|
+
type: Component,
|
|
911
|
+
args: [{
|
|
912
|
+
selector: "shared-theme-switch",
|
|
913
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
914
|
+
imports: [ButtonComponent$1, TranslatePipe],
|
|
915
|
+
template: "<lib-button\n intent=\"ghost\"\n [icon]=\"icon()\"\n [ariaLabel]=\"label() | translate\"\n [title]=\"label() | translate\"\n (click)=\"onClick()\"\n></lib-button>\n"
|
|
916
|
+
}]
|
|
917
|
+
}]
|
|
918
|
+
});
|
|
731
919
|
var UserProfileComponent = class UserProfileComponent {
|
|
732
920
|
authenticationService = inject(AuthenticationService);
|
|
733
921
|
user = signal(null, ...ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []);
|
|
@@ -764,7 +952,7 @@ var UserProfileComponent = class UserProfileComponent {
|
|
|
764
952
|
selector: "shared-user-profile",
|
|
765
953
|
ngImport: i0,
|
|
766
954
|
template: "<div class=\"user-profile\">\n <div class=\"user-text\">\n <span class=\"user-name\">{{ name }}</span>\n @if (position) {\n <span class=\"user-position\">{{ position }}</span>\n }\n </div>\n\n <div class=\"user-avatar\">\n @if (pictureUrl) {\n <img class=\"user-avatar-img\" [src]=\"pictureUrl\" [alt]=\"name\" />\n } @else {\n <span class=\"user-avatar-initials\">{{ initials }}</span>\n }\n </div>\n</div>\n",
|
|
767
|
-
styles: ["@layer properties;@media(max-width:767px){:host{display:none}}.user-profile{display:flex;height:calc(var(--spacing, .25rem) * 9);min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2);
|
|
955
|
+
styles: ["@layer properties;@media(max-width:767px){:host{display:none}}.user-profile{display:flex;height:calc(var(--spacing, .25rem) * 9);min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 2);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));-webkit-user-select:none;user-select:none;border-radius:var(--radius-control);background-color:var(--state-hover)}.user-profile:hover{background-color:var(--state-pressed)}.user-profile .user-avatar{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);flex-shrink:0;align-items:center;justify-content:center;overflow:hidden;border-radius:calc(infinity * 1px);background-color:var(--color-accent);color:var(--color-content-on-accent)}.user-profile .user-avatar-img{height:100%;width:100%;object-fit:cover}.user-profile .user-avatar-initials{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);text-transform:uppercase}.user-profile .user-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);font-size:var(--text-body);font-weight:var(--font-weight-ui);color:var(--color-content-primary)}.user-profile .user-position{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);font-size:var(--text-caption);color:var(--color-content-secondary)}.user-profile .user-text{display:flex;min-width:0px;flex-direction:column;text-align:right}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-leading: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
768
956
|
});
|
|
769
957
|
};
|
|
770
958
|
i0.ɵɵngDeclareClassMetadata({
|
|
@@ -777,7 +965,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
777
965
|
args: [{
|
|
778
966
|
selector: "shared-user-profile",
|
|
779
967
|
template: "<div class=\"user-profile\">\n <div class=\"user-text\">\n <span class=\"user-name\">{{ name }}</span>\n @if (position) {\n <span class=\"user-position\">{{ position }}</span>\n }\n </div>\n\n <div class=\"user-avatar\">\n @if (pictureUrl) {\n <img class=\"user-avatar-img\" [src]=\"pictureUrl\" [alt]=\"name\" />\n } @else {\n <span class=\"user-avatar-initials\">{{ initials }}</span>\n }\n </div>\n</div>\n",
|
|
780
|
-
styles: ["@layer properties;@media(max-width:767px){:host{display:none}}.user-profile{display:flex;height:calc(var(--spacing, .25rem) * 9);min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2);
|
|
968
|
+
styles: ["@layer properties;@media(max-width:767px){:host{display:none}}.user-profile{display:flex;height:calc(var(--spacing, .25rem) * 9);min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 2);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));-webkit-user-select:none;user-select:none;border-radius:var(--radius-control);background-color:var(--state-hover)}.user-profile:hover{background-color:var(--state-pressed)}.user-profile .user-avatar{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);flex-shrink:0;align-items:center;justify-content:center;overflow:hidden;border-radius:calc(infinity * 1px);background-color:var(--color-accent);color:var(--color-content-on-accent)}.user-profile .user-avatar-img{height:100%;width:100%;object-fit:cover}.user-profile .user-avatar-initials{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);text-transform:uppercase}.user-profile .user-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);font-size:var(--text-body);font-weight:var(--font-weight-ui);color:var(--color-content-primary)}.user-profile .user-position{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);font-size:var(--text-caption);color:var(--color-content-secondary)}.user-profile .user-text{display:flex;min-width:0px;flex-direction:column;text-align:right}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-leading: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
781
969
|
}]
|
|
782
970
|
}]
|
|
783
971
|
});
|
|
@@ -802,14 +990,29 @@ var TopBarComponent = class TopBarComponent {
|
|
|
802
990
|
selector: "shared-top-bar",
|
|
803
991
|
outputs: { logout: "logout" },
|
|
804
992
|
ngImport: i0,
|
|
805
|
-
template: "<div class=\"top-bar\">\n <div class=\"top-bar-section top-bar-start\">\n <shared-brand></shared-brand>\n <shared-environment-badge></shared-environment-badge>\n </div>\n\n <div class=\"top-bar-section top-bar-end\">\n <shared-notifications></shared-notifications>\n
|
|
806
|
-
styles: [".top-bar{display:flex;width:100%;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3)}.top-bar .top-bar-
|
|
993
|
+
template: "<div class=\"top-bar\">\n <div class=\"top-bar-section top-bar-start\">\n <shared-brand></shared-brand>\n <shared-environment-badge></shared-environment-badge>\n </div>\n\n <div class=\"top-bar-section top-bar-end\">\n <div class=\"top-bar-actions\">\n <shared-notifications></shared-notifications>\n <shared-language-selector [showFlag]=\"true\"></shared-language-selector>\n <shared-theme-switch></shared-theme-switch>\n </div>\n\n <div class=\"top-bar-identity\">\n <shared-user-profile></shared-user-profile>\n\n <lib-button\n class=\"top-bar-logout\"\n intent=\"ghost\"\n icon=\"fa-solid fa-arrow-right-from-bracket\"\n [ariaLabel]=\"'Main-Logout' | translate\"\n (click)=\"onLogoutClick()\"\n ></lib-button>\n </div>\n </div>\n</div>\n",
|
|
994
|
+
styles: [".top-bar{display:flex;width:100%;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3)}.top-bar .top-bar-actions,.top-bar .top-bar-identity{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}.top-bar .top-bar-section{display:flex;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}.top-bar .top-bar-start{min-width:0px}.top-bar .top-bar-end{flex-shrink:0}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
807
995
|
dependencies: [
|
|
808
996
|
{
|
|
809
997
|
kind: "component",
|
|
810
998
|
type: BrandComponent,
|
|
811
999
|
selector: "shared-brand"
|
|
812
1000
|
},
|
|
1001
|
+
{
|
|
1002
|
+
kind: "component",
|
|
1003
|
+
type: ButtonComponent$1,
|
|
1004
|
+
selector: "lib-button",
|
|
1005
|
+
inputs: [
|
|
1006
|
+
"intent",
|
|
1007
|
+
"type",
|
|
1008
|
+
"disabled",
|
|
1009
|
+
"loading",
|
|
1010
|
+
"success",
|
|
1011
|
+
"error",
|
|
1012
|
+
"icon",
|
|
1013
|
+
"ariaLabel"
|
|
1014
|
+
]
|
|
1015
|
+
},
|
|
813
1016
|
{
|
|
814
1017
|
kind: "component",
|
|
815
1018
|
type: EnvironmentBadgeComponent,
|
|
@@ -826,6 +1029,11 @@ var TopBarComponent = class TopBarComponent {
|
|
|
826
1029
|
type: NotificationsComponent,
|
|
827
1030
|
selector: "shared-notifications"
|
|
828
1031
|
},
|
|
1032
|
+
{
|
|
1033
|
+
kind: "component",
|
|
1034
|
+
type: ThemeSwitchComponent,
|
|
1035
|
+
selector: "shared-theme-switch"
|
|
1036
|
+
},
|
|
829
1037
|
{
|
|
830
1038
|
kind: "component",
|
|
831
1039
|
type: UserProfileComponent,
|
|
@@ -850,14 +1058,16 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
850
1058
|
selector: "shared-top-bar",
|
|
851
1059
|
imports: [
|
|
852
1060
|
BrandComponent,
|
|
1061
|
+
ButtonComponent$1,
|
|
853
1062
|
EnvironmentBadgeComponent,
|
|
854
1063
|
LanguageSelectorComponent,
|
|
855
1064
|
NotificationsComponent,
|
|
1065
|
+
ThemeSwitchComponent,
|
|
856
1066
|
TranslatePipe,
|
|
857
1067
|
UserProfileComponent
|
|
858
1068
|
],
|
|
859
|
-
template: "<div class=\"top-bar\">\n <div class=\"top-bar-section top-bar-start\">\n <shared-brand></shared-brand>\n <shared-environment-badge></shared-environment-badge>\n </div>\n\n <div class=\"top-bar-section top-bar-end\">\n <shared-notifications></shared-notifications>\n
|
|
860
|
-
styles: [".top-bar{display:flex;width:100%;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3)}.top-bar .top-bar-
|
|
1069
|
+
template: "<div class=\"top-bar\">\n <div class=\"top-bar-section top-bar-start\">\n <shared-brand></shared-brand>\n <shared-environment-badge></shared-environment-badge>\n </div>\n\n <div class=\"top-bar-section top-bar-end\">\n <div class=\"top-bar-actions\">\n <shared-notifications></shared-notifications>\n <shared-language-selector [showFlag]=\"true\"></shared-language-selector>\n <shared-theme-switch></shared-theme-switch>\n </div>\n\n <div class=\"top-bar-identity\">\n <shared-user-profile></shared-user-profile>\n\n <lib-button\n class=\"top-bar-logout\"\n intent=\"ghost\"\n icon=\"fa-solid fa-arrow-right-from-bracket\"\n [ariaLabel]=\"'Main-Logout' | translate\"\n (click)=\"onLogoutClick()\"\n ></lib-button>\n </div>\n </div>\n</div>\n",
|
|
1070
|
+
styles: [".top-bar{display:flex;width:100%;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3)}.top-bar .top-bar-actions,.top-bar .top-bar-identity{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}.top-bar .top-bar-section{display:flex;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}.top-bar .top-bar-start{min-width:0px}.top-bar .top-bar-end{flex-shrink:0}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
861
1071
|
}]
|
|
862
1072
|
}],
|
|
863
1073
|
propDecorators: { logout: [{
|
|
@@ -944,9 +1154,24 @@ var MainLayoutComponent = class MainLayoutComponent {
|
|
|
944
1154
|
isSignal: true
|
|
945
1155
|
}],
|
|
946
1156
|
ngImport: i0,
|
|
947
|
-
template: "<div class=\"main-container\">\n <div class=\"sidebar-region\">\n <lib-sidebar>\n @if (appVersion) {\n <span>v{{ appVersion }}</span>\n }\n </lib-sidebar>\n </div>\n\n <shared-top-bar class=\"toolbar\" (logout)=\"onLogoutClick()\"></shared-top-bar>\n\n <div class=\"content\">\n <framework-tabs>\n <router-outlet></router-outlet>\n </framework-tabs>\n </div>\n</div>\n\n<lib-modal #logoutModal position=\"top\" size=\"xl\" [closeButtonText]=\"'Main-Logout-Modal-Message-Cancel' | translate\">\n <div body>\n <h5>{{ 'Main-Logout-Modal-Message' | translate }}</h5>\n </div>\n <div footer>\n <button
|
|
948
|
-
styles: ["@charset \"UTF-8\";@layer properties;.main-container{display:grid;height:100vh;max-height:100vh;width:100vw;max-width:100%;background:var(--app-backdrop);grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);grid-template-areas:\"toolbar toolbar\" \"sidebar content\"}.main-container .sidebar-region{padding:calc(var(--spacing, .25rem) * 3);grid-area:sidebar}.main-container .toolbar{display:flex;justify-content:space-between;
|
|
1157
|
+
template: "<div class=\"main-container\">\n <div class=\"sidebar-region\">\n <lib-sidebar>\n @if (appVersion) {\n <span>v{{ appVersion }}</span>\n }\n </lib-sidebar>\n </div>\n\n <shared-top-bar class=\"toolbar\" (logout)=\"onLogoutClick()\"></shared-top-bar>\n\n <div class=\"content\">\n <framework-tabs>\n <router-outlet></router-outlet>\n </framework-tabs>\n </div>\n</div>\n\n<lib-modal #logoutModal position=\"top\" size=\"xl\" [closeButtonText]=\"'Main-Logout-Modal-Message-Cancel' | translate\">\n <div body>\n <h5>{{ 'Main-Logout-Modal-Message' | translate }}</h5>\n </div>\n <div footer>\n <lib-button intent=\"danger\" (click)=\"onLogoutConfirm()\">\n {{ 'Main-Logout-Modal-Message-Confirm' | translate }}\n </lib-button>\n </div>\n</lib-modal>\n",
|
|
1158
|
+
styles: ["@charset \"UTF-8\";@layer properties;.main-container{display:grid;height:100vh;max-height:100vh;width:100vw;max-width:100%;background:var(--app-backdrop);grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);grid-template-areas:\"toolbar toolbar\" \"sidebar content\"}.main-container .sidebar-region{padding:calc(var(--spacing, .25rem) * 3);grid-area:sidebar}.main-container .toolbar{position:relative;z-index:30;display:flex;justify-content:space-between;padding:calc(var(--spacing, .25rem) * 2);box-shadow:var(--shadow-overlay);grid-area:toolbar}.main-container .toolbar:before{pointer-events:none;position:absolute;inset:0;z-index:-1;--tw-content: \"\";content:var(--tw-content);background-color:var(--color-surface-glass-strong);backdrop-filter:blur(var(--blur-glass));-webkit-backdrop-filter:blur(var(--blur-glass))}.main-container .content{padding-inline:calc(var(--spacing, .25rem) * 3);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 2);grid-area:content}.main-container framework-tabs{height:100%}lib-modal h5{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}@property --tw-content{syntax: \"*\"; inherits: false; initial-value: \"\";}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-content: \"\";--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
949
1159
|
dependencies: [
|
|
1160
|
+
{
|
|
1161
|
+
kind: "component",
|
|
1162
|
+
type: ButtonComponent$1,
|
|
1163
|
+
selector: "lib-button",
|
|
1164
|
+
inputs: [
|
|
1165
|
+
"intent",
|
|
1166
|
+
"type",
|
|
1167
|
+
"disabled",
|
|
1168
|
+
"loading",
|
|
1169
|
+
"success",
|
|
1170
|
+
"error",
|
|
1171
|
+
"icon",
|
|
1172
|
+
"ariaLabel"
|
|
1173
|
+
]
|
|
1174
|
+
},
|
|
950
1175
|
{
|
|
951
1176
|
kind: "component",
|
|
952
1177
|
type: ModalComponent,
|
|
@@ -1016,6 +1241,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1016
1241
|
args: [{
|
|
1017
1242
|
selector: "shared-main-layout",
|
|
1018
1243
|
imports: [
|
|
1244
|
+
ButtonComponent$1,
|
|
1019
1245
|
ModalComponent,
|
|
1020
1246
|
RouterModule,
|
|
1021
1247
|
SidebarComponent,
|
|
@@ -1023,8 +1249,8 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1023
1249
|
TopBarComponent,
|
|
1024
1250
|
TranslatePipe
|
|
1025
1251
|
],
|
|
1026
|
-
template: "<div class=\"main-container\">\n <div class=\"sidebar-region\">\n <lib-sidebar>\n @if (appVersion) {\n <span>v{{ appVersion }}</span>\n }\n </lib-sidebar>\n </div>\n\n <shared-top-bar class=\"toolbar\" (logout)=\"onLogoutClick()\"></shared-top-bar>\n\n <div class=\"content\">\n <framework-tabs>\n <router-outlet></router-outlet>\n </framework-tabs>\n </div>\n</div>\n\n<lib-modal #logoutModal position=\"top\" size=\"xl\" [closeButtonText]=\"'Main-Logout-Modal-Message-Cancel' | translate\">\n <div body>\n <h5>{{ 'Main-Logout-Modal-Message' | translate }}</h5>\n </div>\n <div footer>\n <button
|
|
1027
|
-
styles: ["@charset \"UTF-8\";@layer properties;.main-container{display:grid;height:100vh;max-height:100vh;width:100vw;max-width:100%;background:var(--app-backdrop);grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);grid-template-areas:\"toolbar toolbar\" \"sidebar content\"}.main-container .sidebar-region{padding:calc(var(--spacing, .25rem) * 3);grid-area:sidebar}.main-container .toolbar{display:flex;justify-content:space-between;
|
|
1252
|
+
template: "<div class=\"main-container\">\n <div class=\"sidebar-region\">\n <lib-sidebar>\n @if (appVersion) {\n <span>v{{ appVersion }}</span>\n }\n </lib-sidebar>\n </div>\n\n <shared-top-bar class=\"toolbar\" (logout)=\"onLogoutClick()\"></shared-top-bar>\n\n <div class=\"content\">\n <framework-tabs>\n <router-outlet></router-outlet>\n </framework-tabs>\n </div>\n</div>\n\n<lib-modal #logoutModal position=\"top\" size=\"xl\" [closeButtonText]=\"'Main-Logout-Modal-Message-Cancel' | translate\">\n <div body>\n <h5>{{ 'Main-Logout-Modal-Message' | translate }}</h5>\n </div>\n <div footer>\n <lib-button intent=\"danger\" (click)=\"onLogoutConfirm()\">\n {{ 'Main-Logout-Modal-Message-Confirm' | translate }}\n </lib-button>\n </div>\n</lib-modal>\n",
|
|
1253
|
+
styles: ["@charset \"UTF-8\";@layer properties;.main-container{display:grid;height:100vh;max-height:100vh;width:100vw;max-width:100%;background:var(--app-backdrop);grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);grid-template-areas:\"toolbar toolbar\" \"sidebar content\"}.main-container .sidebar-region{padding:calc(var(--spacing, .25rem) * 3);grid-area:sidebar}.main-container .toolbar{position:relative;z-index:30;display:flex;justify-content:space-between;padding:calc(var(--spacing, .25rem) * 2);box-shadow:var(--shadow-overlay);grid-area:toolbar}.main-container .toolbar:before{pointer-events:none;position:absolute;inset:0;z-index:-1;--tw-content: \"\";content:var(--tw-content);background-color:var(--color-surface-glass-strong);backdrop-filter:blur(var(--blur-glass));-webkit-backdrop-filter:blur(var(--blur-glass))}.main-container .content{padding-inline:calc(var(--spacing, .25rem) * 3);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 2);grid-area:content}.main-container framework-tabs{height:100%}lib-modal h5{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}@property --tw-content{syntax: \"*\"; inherits: false; initial-value: \"\";}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-content: \"\";--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
1028
1254
|
}]
|
|
1029
1255
|
}],
|
|
1030
1256
|
propDecorators: { logoutModal: [{
|
|
@@ -1041,8 +1267,15 @@ var LoginComponent = class LoginComponent {
|
|
|
1041
1267
|
success: false
|
|
1042
1268
|
}, ...ngDevMode ? [{ debugName: "formState" }] : /* istanbul ignore next */ []);
|
|
1043
1269
|
authenticationService = inject(AuthenticationService);
|
|
1270
|
+
config = inject(APP_CONFIG);
|
|
1044
1271
|
formBuilder = inject(FormBuilder);
|
|
1045
1272
|
router = inject(Router);
|
|
1273
|
+
get companyName() {
|
|
1274
|
+
return this.config.companyName;
|
|
1275
|
+
}
|
|
1276
|
+
get logoUrl() {
|
|
1277
|
+
return this.config.loginLogoUrl ?? this.config.logoUrl;
|
|
1278
|
+
}
|
|
1046
1279
|
ngOnInit() {
|
|
1047
1280
|
this.form = this.formBuilder.group({
|
|
1048
1281
|
password: ["", Validators.required],
|
|
@@ -1088,6 +1321,10 @@ var LoginComponent = class LoginComponent {
|
|
|
1088
1321
|
});
|
|
1089
1322
|
}
|
|
1090
1323
|
}
|
|
1324
|
+
isInvalid(field) {
|
|
1325
|
+
const control = this.form.get(field);
|
|
1326
|
+
return !!control && control.touched && control.invalid;
|
|
1327
|
+
}
|
|
1091
1328
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
1092
1329
|
minVersion: "12.0.0",
|
|
1093
1330
|
version: "22.2.0",
|
|
@@ -1110,9 +1347,24 @@ var LoginComponent = class LoginComponent {
|
|
|
1110
1347
|
isSignal: true
|
|
1111
1348
|
}],
|
|
1112
1349
|
ngImport: i0,
|
|
1113
|
-
template: "<div class=\"
|
|
1114
|
-
styles: ["@layer properties;:host{display:
|
|
1350
|
+
template: "<div class=\"login-card\">\n @if (logoUrl) {\n <img class=\"login-logo\" [src]=\"logoUrl\" alt=\"\" />\n }\n\n <h1 class=\"login-title\">{{ 'Login-Title' | translate }}</h1>\n @if (companyName) {\n <p class=\"login-subtitle\">{{ companyName }}</p>\n }\n\n <form class=\"login-form\" [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\" novalidate>\n @if (formState().error) {\n <p class=\"login-error\" role=\"alert\">\n @if (formState().error === 'invalid') {\n {{ 'Login-Errors-Invalid' | translate }}\n } @else {\n {{ 'Login-Errors-InternalServerError' | translate }}\n }\n </p>\n }\n\n <div class=\"login-field\">\n <label class=\"login-label\" for=\"username\">{{ 'Login-Username' | translate }}</label>\n <div class=\"login-control\" [class.invalid]=\"isInvalid('username')\">\n <i class=\"fa-solid fa-user fa-fw\" aria-hidden=\"true\"></i>\n <input\n #username\n id=\"username\"\n type=\"text\"\n formControlName=\"username\"\n autocomplete=\"username\"\n [attr.aria-invalid]=\"isInvalid('username') ? 'true' : null\"\n [placeholder]=\"'Login-Username' | translate\"\n />\n </div>\n @if (isInvalid('username')) {\n <span class=\"login-validation\">{{ 'Login-Username-Required' | translate }}</span>\n }\n </div>\n\n <div class=\"login-field\">\n <label class=\"login-label\" for=\"password\">{{ 'Login-Password' | translate }}</label>\n <div class=\"login-control\" [class.invalid]=\"isInvalid('password')\">\n <i class=\"fa-solid fa-key fa-fw\" aria-hidden=\"true\"></i>\n <input\n id=\"password\"\n type=\"password\"\n formControlName=\"password\"\n autocomplete=\"current-password\"\n [attr.aria-invalid]=\"isInvalid('password') ? 'true' : null\"\n [placeholder]=\"'Login-Password' | translate\"\n />\n </div>\n @if (isInvalid('password')) {\n <span class=\"login-validation\">{{ 'Login-Password-Required' | translate }}</span>\n }\n </div>\n\n <div class=\"login-options\">\n <label class=\"login-remember\">\n <input id=\"rememberMe\" type=\"checkbox\" class=\"form-input\" formControlName=\"rememberMe\" />\n <span>{{ 'Login-RememberMe' | translate }}</span>\n </label>\n\n <shared-language-selector title=\"Login-SelectLanguage\"></shared-language-selector>\n </div>\n\n <lib-button\n class=\"login-submit\"\n type=\"submit\"\n intent=\"primary\"\n icon=\"fa-solid fa-right-to-bracket\"\n [loading]=\"formState().loading\"\n [success]=\"formState().success\"\n >\n {{ 'Login-SignIn' | translate }}\n </lib-button>\n </form>\n</div>\n\n<footer class=\"login-footer\">\n <span [innerHTML]=\"'Login-Copyright' | translate\"></span>\n <span>{{ 'Login-DesignBy' | translate }}</span>\n</footer>\n",
|
|
1351
|
+
styles: ["@layer properties;:host{display:flex;width:100%;max-width:var(--container-md, 28rem);flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}.login-card{width:100%;padding-inline:calc(var(--spacing, .25rem) * 6);padding-block:calc(var(--spacing, .25rem) * 8);text-align:center;background-color:var(--color-surface-glass-strong);border-radius:var(--radius-surface);backdrop-filter:blur(var(--blur-glass));-webkit-backdrop-filter:blur(var(--blur-glass));box-shadow:var(--shadow-float)}.login-logo{margin-inline:auto;margin-bottom:calc(var(--spacing, .25rem) * 5);max-height:calc(var(--spacing, .25rem) * 20);width:auto;object-fit:contain}.login-title{font-size:var(--text-display);font-weight:var(--font-weight-strong);color:var(--color-content-primary)}.login-subtitle{margin-top:var(--spacing, .25rem);font-size:var(--text-body);color:var(--color-content-secondary)}.login-form{margin-top:calc(var(--spacing, .25rem) * 6);display:grid;gap:calc(var(--spacing, .25rem) * 4);text-align:left}.login-error{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);text-align:center;border-radius:var(--radius-field);font-size:var(--text-body);font-weight:var(--font-weight-emphasis);color:var(--color-content-on-accent);background-color:var(--color-danger)}.login-field{display:grid;gap:var(--spacing, .25rem)}.login-label{font-size:var(--text-caption);font-weight:var(--font-weight-emphasis);color:var(--color-content-secondary)}.login-control{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-style:var(--tw-border-style);border-width:1px;padding-inline:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-field);border-color:var(--color-line-strong);background-color:var(--color-surface-solid);transition-property:border-color,box-shadow;transition-duration:var(--duration-instant);transition-timing-function:var(--ease-standard)}.login-control>i{color:var(--color-content-subtle)}.login-control input{width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding-block:calc(var(--spacing, .25rem) * 2);--tw-outline-style: none;outline-style:none;color:var(--color-content-primary);font-size:var(--text-body)}@media(forced-colors:active){.login-control input{outline:2px solid transparent;outline-offset:2px}}.login-control:focus-within{border-color:var(--color-focus-ring);box-shadow:0 0 0 var(--focus-ring-width) var(--color-focus-ring)}.login-control.invalid{border-color:var(--color-danger)}.login-control.invalid:focus-within{box-shadow:0 0 0 var(--focus-ring-width) var(--color-danger)}.login-validation{font-size:var(--text-caption);color:var(--color-danger)}.login-options{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3)}.login-remember{display:flex;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 2);-webkit-user-select:none;user-select:none;font-size:var(--text-body);color:var(--color-content-secondary)}.login-submit{width:100%}.login-submit ::ng-deep .lib-button{width:100%}.login-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;column-gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 2);text-align:center;font-size:var(--text-caption);color:var(--color-content-secondary)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
1115
1352
|
dependencies: [
|
|
1353
|
+
{
|
|
1354
|
+
kind: "component",
|
|
1355
|
+
type: ButtonComponent$1,
|
|
1356
|
+
selector: "lib-button",
|
|
1357
|
+
inputs: [
|
|
1358
|
+
"intent",
|
|
1359
|
+
"type",
|
|
1360
|
+
"disabled",
|
|
1361
|
+
"loading",
|
|
1362
|
+
"success",
|
|
1363
|
+
"error",
|
|
1364
|
+
"icon",
|
|
1365
|
+
"ariaLabel"
|
|
1366
|
+
]
|
|
1367
|
+
},
|
|
1116
1368
|
{
|
|
1117
1369
|
kind: "component",
|
|
1118
1370
|
type: LanguageSelectorComponent,
|
|
@@ -1189,13 +1441,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1189
1441
|
args: [{
|
|
1190
1442
|
selector: "shared-login",
|
|
1191
1443
|
imports: [
|
|
1444
|
+
ButtonComponent$1,
|
|
1192
1445
|
LanguageSelectorComponent,
|
|
1193
1446
|
ReactiveFormsModule,
|
|
1194
1447
|
RouterModule,
|
|
1195
1448
|
TranslatePipe
|
|
1196
1449
|
],
|
|
1197
|
-
template: "<div class=\"
|
|
1198
|
-
styles: ["@layer properties;:host{display:
|
|
1450
|
+
template: "<div class=\"login-card\">\n @if (logoUrl) {\n <img class=\"login-logo\" [src]=\"logoUrl\" alt=\"\" />\n }\n\n <h1 class=\"login-title\">{{ 'Login-Title' | translate }}</h1>\n @if (companyName) {\n <p class=\"login-subtitle\">{{ companyName }}</p>\n }\n\n <form class=\"login-form\" [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\" novalidate>\n @if (formState().error) {\n <p class=\"login-error\" role=\"alert\">\n @if (formState().error === 'invalid') {\n {{ 'Login-Errors-Invalid' | translate }}\n } @else {\n {{ 'Login-Errors-InternalServerError' | translate }}\n }\n </p>\n }\n\n <div class=\"login-field\">\n <label class=\"login-label\" for=\"username\">{{ 'Login-Username' | translate }}</label>\n <div class=\"login-control\" [class.invalid]=\"isInvalid('username')\">\n <i class=\"fa-solid fa-user fa-fw\" aria-hidden=\"true\"></i>\n <input\n #username\n id=\"username\"\n type=\"text\"\n formControlName=\"username\"\n autocomplete=\"username\"\n [attr.aria-invalid]=\"isInvalid('username') ? 'true' : null\"\n [placeholder]=\"'Login-Username' | translate\"\n />\n </div>\n @if (isInvalid('username')) {\n <span class=\"login-validation\">{{ 'Login-Username-Required' | translate }}</span>\n }\n </div>\n\n <div class=\"login-field\">\n <label class=\"login-label\" for=\"password\">{{ 'Login-Password' | translate }}</label>\n <div class=\"login-control\" [class.invalid]=\"isInvalid('password')\">\n <i class=\"fa-solid fa-key fa-fw\" aria-hidden=\"true\"></i>\n <input\n id=\"password\"\n type=\"password\"\n formControlName=\"password\"\n autocomplete=\"current-password\"\n [attr.aria-invalid]=\"isInvalid('password') ? 'true' : null\"\n [placeholder]=\"'Login-Password' | translate\"\n />\n </div>\n @if (isInvalid('password')) {\n <span class=\"login-validation\">{{ 'Login-Password-Required' | translate }}</span>\n }\n </div>\n\n <div class=\"login-options\">\n <label class=\"login-remember\">\n <input id=\"rememberMe\" type=\"checkbox\" class=\"form-input\" formControlName=\"rememberMe\" />\n <span>{{ 'Login-RememberMe' | translate }}</span>\n </label>\n\n <shared-language-selector title=\"Login-SelectLanguage\"></shared-language-selector>\n </div>\n\n <lib-button\n class=\"login-submit\"\n type=\"submit\"\n intent=\"primary\"\n icon=\"fa-solid fa-right-to-bracket\"\n [loading]=\"formState().loading\"\n [success]=\"formState().success\"\n >\n {{ 'Login-SignIn' | translate }}\n </lib-button>\n </form>\n</div>\n\n<footer class=\"login-footer\">\n <span [innerHTML]=\"'Login-Copyright' | translate\"></span>\n <span>{{ 'Login-DesignBy' | translate }}</span>\n</footer>\n",
|
|
1451
|
+
styles: ["@layer properties;:host{display:flex;width:100%;max-width:var(--container-md, 28rem);flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}.login-card{width:100%;padding-inline:calc(var(--spacing, .25rem) * 6);padding-block:calc(var(--spacing, .25rem) * 8);text-align:center;background-color:var(--color-surface-glass-strong);border-radius:var(--radius-surface);backdrop-filter:blur(var(--blur-glass));-webkit-backdrop-filter:blur(var(--blur-glass));box-shadow:var(--shadow-float)}.login-logo{margin-inline:auto;margin-bottom:calc(var(--spacing, .25rem) * 5);max-height:calc(var(--spacing, .25rem) * 20);width:auto;object-fit:contain}.login-title{font-size:var(--text-display);font-weight:var(--font-weight-strong);color:var(--color-content-primary)}.login-subtitle{margin-top:var(--spacing, .25rem);font-size:var(--text-body);color:var(--color-content-secondary)}.login-form{margin-top:calc(var(--spacing, .25rem) * 6);display:grid;gap:calc(var(--spacing, .25rem) * 4);text-align:left}.login-error{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);text-align:center;border-radius:var(--radius-field);font-size:var(--text-body);font-weight:var(--font-weight-emphasis);color:var(--color-content-on-accent);background-color:var(--color-danger)}.login-field{display:grid;gap:var(--spacing, .25rem)}.login-label{font-size:var(--text-caption);font-weight:var(--font-weight-emphasis);color:var(--color-content-secondary)}.login-control{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-style:var(--tw-border-style);border-width:1px;padding-inline:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-field);border-color:var(--color-line-strong);background-color:var(--color-surface-solid);transition-property:border-color,box-shadow;transition-duration:var(--duration-instant);transition-timing-function:var(--ease-standard)}.login-control>i{color:var(--color-content-subtle)}.login-control input{width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding-block:calc(var(--spacing, .25rem) * 2);--tw-outline-style: none;outline-style:none;color:var(--color-content-primary);font-size:var(--text-body)}@media(forced-colors:active){.login-control input{outline:2px solid transparent;outline-offset:2px}}.login-control:focus-within{border-color:var(--color-focus-ring);box-shadow:0 0 0 var(--focus-ring-width) var(--color-focus-ring)}.login-control.invalid{border-color:var(--color-danger)}.login-control.invalid:focus-within{box-shadow:0 0 0 var(--focus-ring-width) var(--color-danger)}.login-validation{font-size:var(--text-caption);color:var(--color-danger)}.login-options{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3)}.login-remember{display:flex;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 2);-webkit-user-select:none;user-select:none;font-size:var(--text-body);color:var(--color-content-secondary)}.login-submit{width:100%}.login-submit ::ng-deep .lib-button{width:100%}.login-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;column-gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 2);text-align:center;font-size:var(--text-caption);color:var(--color-content-secondary)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
1199
1452
|
}]
|
|
1200
1453
|
}],
|
|
1201
1454
|
propDecorators: { username: [{
|
|
@@ -1606,7 +1859,7 @@ var ExternalContentComponent = class ExternalContentComponent extends TabViewBas
|
|
|
1606
1859
|
usesInheritance: true,
|
|
1607
1860
|
ngImport: i0,
|
|
1608
1861
|
template: "<!-- Published to DefaultTabViewComponent through TabViewService, so the actions sit in the\n application's ribbon like every other screen's. -->\n<ng-template #ribbon>\n <lib-ribbon-group [label]=\"'RibbonGroup-Page' | translate\">\n <!-- Same icon and label as framework-button-refresh, so reloading a report reads as the\n same action as refreshing a grid. `loading` is what spins it while the frame loads. -->\n <framework-button\n icon=\"fa-sync-alt\"\n label=\"Button-Refresh\"\n [disabled]=\"!resolvedUrl() || isInsecure()\"\n [loading]=\"isFrameLoading()\"\n (action)=\"onReload()\"\n >\n </framework-button>\n\n <framework-button\n icon=\"fa-arrow-up-right-from-square\"\n label=\"ExternalContent-OpenInNewTab\"\n [disabled]=\"!resolvedUrl()\"\n (action)=\"onOpenInNewTab()\"\n >\n </framework-button>\n </lib-ribbon-group>\n</ng-template>\n\n@if (isUnavailable()) {\n <div class=\"external-content-message\">\n <i class=\"fa-solid fa-link-slash\"></i>\n <span class=\"external-content-message-title\">{{ 'ExternalContent-Unavailable-Title' | translate }}</span>\n <span>{{ 'ExternalContent-Unavailable-Message' | translate }}</span>\n </div>\n} @else if (isInsecure()) {\n <div class=\"external-content-message\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span class=\"external-content-message-title\">{{ 'ExternalContent-Insecure-Title' | translate }}</span>\n <span>{{ 'ExternalContent-Insecure-Message' | translate }}</span>\n </div>\n} @else if (isBlocked()) {\n <div class=\"external-content-message\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span class=\"external-content-message-title\">{{ 'ExternalContent-Blocked-Title' | translate }}</span>\n <span>{{ 'ExternalContent-Blocked-Message' | translate }}</span>\n </div>\n} @else {\n @if (isSlow()) {\n <div class=\"external-content-hint\">{{ 'ExternalContent-SlowHint' | translate }}</div>\n }\n @if (frameUrl() || isFrameLoading()) {\n <!--\n The container stays mounted across a reload, which briefly clears frameUrl, so the panel\n does not flicker out and back. What goes away is the frame itself, on purpose.\n\n sandbox and referrerpolicy are STATIC attributes on purpose. Angular rejects `sandbox`\n as a binding on an <iframe> outright (NG0910) — it may only be a static attribute — and\n the whole element then fails to render.\n\n The token list is fixed for every destination, and deliberately not configurable per\n menu item:\n - allow-same-origin keeps the frame in the destination's own origin so its cookies and\n storage work; without it an SSO'd report will not render. It grants no access to ours,\n provided the destination is cross-origin -- never point an embedded item at this\n application's own origin, use an internal route for that.\n - allow-top-navigation is absent on purpose: a framed site must not be able to navigate\n the whole application away.\n - allow-popups-to-escape-sandbox keeps print and download popups usable.\n -->\n <div class=\"external-content-frame-container\">\n @if (isFrameLoading()) {\n <div class=\"external-content-loading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n\n <span>{{ 'Loading' | translate }}</span>\n </div>\n }\n @if (frameUrl()) {\n <iframe\n class=\"external-content-frame\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n [src]=\"frameUrl()\"\n [attr.title]=\"label() | translate\"\n (load)=\"onFrameLoad()\"\n >\n </iframe>\n }\n </div>\n }\n}\n",
|
|
1609
|
-
styles: ["@layer properties;:host{display:flex;flex-grow:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);overflow:hidden;min-height:0}.external-content-hint{flex:none;border-
|
|
1862
|
+
styles: ["@layer properties;:host{display:flex;flex-grow:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);overflow:hidden;min-height:0}.external-content-hint{flex:none;border-style:var(--tw-border-style);border-width:1px;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-field);font-size:var(--text-body);background-color:color-mix(in srgb,oklch(68.1% .162 75.834) 18%,transparent);color:color-mix(in srgb,oklch(68.1% .162 75.834) 70%,oklch(21% .034 264.665));border-color:color-mix(in srgb,oklch(68.1% .162 75.834) 35%,transparent)}@supports (color: color-mix(in lab,red,red)){.external-content-hint{background-color:color-mix(in srgb,var(--color-warning) 18%,transparent)}}@supports (color: color-mix(in lab,red,red)){.external-content-hint{color:color-mix(in srgb,var(--color-warning) 70%,var(--color-content-primary))}}@supports (color: color-mix(in lab,red,red)){.external-content-hint{border-color:color-mix(in srgb,var(--color-warning) 35%,transparent)}}.external-content-frame-container{border-style:var(--tw-border-style);border-width:1px;border-radius:var(--radius-nested);background-color:var(--color-surface-solid);border-color:var(--color-line);position:relative;display:flex;flex-grow:1;overflow:hidden;min-height:0}.external-content-loading{position:absolute;inset:0;z-index:10;display:flex;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2);background-color:var(--color-surface-solid);color:var(--color-content-secondary)}.external-content-loading svg{height:calc(var(--spacing, .25rem) * 6);min-height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);min-width:calc(var(--spacing, .25rem) * 6);animation:var(--animate-spin, spin 1s linear infinite)}.external-content-frame{width:100%;flex-grow:1;border-style:var(--tw-border-style);border-width:0px;min-height:0}.external-content-message{border-style:var(--tw-border-style);border-width:1px;border-radius:var(--radius-nested);background-color:var(--color-surface-solid);border-color:var(--color-line);display:flex;flex-grow:1;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 6);text-align:center}.external-content-message i{font-size:var(--text-4xl, 2.25rem);line-height:var(--tw-leading, var(--text-4xl--line-height, calc(2.5 / 2.25)));opacity:40%}.external-content-message .external-content-message-title{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@keyframes spin{to{transform:rotate(360deg)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
1610
1863
|
dependencies: [
|
|
1611
1864
|
{
|
|
1612
1865
|
kind: "component",
|
|
@@ -1648,7 +1901,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1648
1901
|
TranslatePipe
|
|
1649
1902
|
],
|
|
1650
1903
|
template: "<!-- Published to DefaultTabViewComponent through TabViewService, so the actions sit in the\n application's ribbon like every other screen's. -->\n<ng-template #ribbon>\n <lib-ribbon-group [label]=\"'RibbonGroup-Page' | translate\">\n <!-- Same icon and label as framework-button-refresh, so reloading a report reads as the\n same action as refreshing a grid. `loading` is what spins it while the frame loads. -->\n <framework-button\n icon=\"fa-sync-alt\"\n label=\"Button-Refresh\"\n [disabled]=\"!resolvedUrl() || isInsecure()\"\n [loading]=\"isFrameLoading()\"\n (action)=\"onReload()\"\n >\n </framework-button>\n\n <framework-button\n icon=\"fa-arrow-up-right-from-square\"\n label=\"ExternalContent-OpenInNewTab\"\n [disabled]=\"!resolvedUrl()\"\n (action)=\"onOpenInNewTab()\"\n >\n </framework-button>\n </lib-ribbon-group>\n</ng-template>\n\n@if (isUnavailable()) {\n <div class=\"external-content-message\">\n <i class=\"fa-solid fa-link-slash\"></i>\n <span class=\"external-content-message-title\">{{ 'ExternalContent-Unavailable-Title' | translate }}</span>\n <span>{{ 'ExternalContent-Unavailable-Message' | translate }}</span>\n </div>\n} @else if (isInsecure()) {\n <div class=\"external-content-message\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span class=\"external-content-message-title\">{{ 'ExternalContent-Insecure-Title' | translate }}</span>\n <span>{{ 'ExternalContent-Insecure-Message' | translate }}</span>\n </div>\n} @else if (isBlocked()) {\n <div class=\"external-content-message\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span class=\"external-content-message-title\">{{ 'ExternalContent-Blocked-Title' | translate }}</span>\n <span>{{ 'ExternalContent-Blocked-Message' | translate }}</span>\n </div>\n} @else {\n @if (isSlow()) {\n <div class=\"external-content-hint\">{{ 'ExternalContent-SlowHint' | translate }}</div>\n }\n @if (frameUrl() || isFrameLoading()) {\n <!--\n The container stays mounted across a reload, which briefly clears frameUrl, so the panel\n does not flicker out and back. What goes away is the frame itself, on purpose.\n\n sandbox and referrerpolicy are STATIC attributes on purpose. Angular rejects `sandbox`\n as a binding on an <iframe> outright (NG0910) — it may only be a static attribute — and\n the whole element then fails to render.\n\n The token list is fixed for every destination, and deliberately not configurable per\n menu item:\n - allow-same-origin keeps the frame in the destination's own origin so its cookies and\n storage work; without it an SSO'd report will not render. It grants no access to ours,\n provided the destination is cross-origin -- never point an embedded item at this\n application's own origin, use an internal route for that.\n - allow-top-navigation is absent on purpose: a framed site must not be able to navigate\n the whole application away.\n - allow-popups-to-escape-sandbox keeps print and download popups usable.\n -->\n <div class=\"external-content-frame-container\">\n @if (isFrameLoading()) {\n <div class=\"external-content-loading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n\n <span>{{ 'Loading' | translate }}</span>\n </div>\n }\n @if (frameUrl()) {\n <iframe\n class=\"external-content-frame\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n [src]=\"frameUrl()\"\n [attr.title]=\"label() | translate\"\n (load)=\"onFrameLoad()\"\n >\n </iframe>\n }\n </div>\n }\n}\n",
|
|
1651
|
-
styles: ["@layer properties;:host{display:flex;flex-grow:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);overflow:hidden;min-height:0}.external-content-hint{flex:none;border-
|
|
1904
|
+
styles: ["@layer properties;:host{display:flex;flex-grow:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);overflow:hidden;min-height:0}.external-content-hint{flex:none;border-style:var(--tw-border-style);border-width:1px;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-field);font-size:var(--text-body);background-color:color-mix(in srgb,oklch(68.1% .162 75.834) 18%,transparent);color:color-mix(in srgb,oklch(68.1% .162 75.834) 70%,oklch(21% .034 264.665));border-color:color-mix(in srgb,oklch(68.1% .162 75.834) 35%,transparent)}@supports (color: color-mix(in lab,red,red)){.external-content-hint{background-color:color-mix(in srgb,var(--color-warning) 18%,transparent)}}@supports (color: color-mix(in lab,red,red)){.external-content-hint{color:color-mix(in srgb,var(--color-warning) 70%,var(--color-content-primary))}}@supports (color: color-mix(in lab,red,red)){.external-content-hint{border-color:color-mix(in srgb,var(--color-warning) 35%,transparent)}}.external-content-frame-container{border-style:var(--tw-border-style);border-width:1px;border-radius:var(--radius-nested);background-color:var(--color-surface-solid);border-color:var(--color-line);position:relative;display:flex;flex-grow:1;overflow:hidden;min-height:0}.external-content-loading{position:absolute;inset:0;z-index:10;display:flex;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2);background-color:var(--color-surface-solid);color:var(--color-content-secondary)}.external-content-loading svg{height:calc(var(--spacing, .25rem) * 6);min-height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);min-width:calc(var(--spacing, .25rem) * 6);animation:var(--animate-spin, spin 1s linear infinite)}.external-content-frame{width:100%;flex-grow:1;border-style:var(--tw-border-style);border-width:0px;min-height:0}.external-content-message{border-style:var(--tw-border-style);border-width:1px;border-radius:var(--radius-nested);background-color:var(--color-surface-solid);border-color:var(--color-line);display:flex;flex-grow:1;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 6);text-align:center}.external-content-message i{font-size:var(--text-4xl, 2.25rem);line-height:var(--tw-leading, var(--text-4xl--line-height, calc(2.5 / 2.25)));opacity:40%}.external-content-message .external-content-message-title{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@keyframes spin{to{transform:rotate(360deg)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
1652
1905
|
}]
|
|
1653
1906
|
}],
|
|
1654
1907
|
ctorParameters: () => []
|
|
@@ -1856,7 +2109,7 @@ var OperationsHistoryChildListComponent = class OperationsHistoryChildListCompon
|
|
|
1856
2109
|
usesInheritance: true,
|
|
1857
2110
|
ngImport: i0,
|
|
1858
2111
|
template: "<lib-data-grid [lazyLoadRows]=\"true\"> </lib-data-grid>\n\n<ng-template #operationTemplate let-rowData=\"rowData\">\n <div\n class=\"operation-content\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"openModal()\"\n (keydown.enter)=\"openModal()\"\n (keydown.space)=\"openModal(); $event.preventDefault()\"\n >\n <span\n class=\"operation\"\n [class.added]=\"rowData.operationType === 'Added'\"\n [class.deleted]=\"rowData.operationType === 'Deleted'\"\n [class.modified]=\"rowData.operationType === 'Modified'\"\n [class.unchanged]=\"rowData.operationType === 'Unchanged'\"\n >\n {{ rowData.operationType }}\n </span>\n {{ rowData.entityName }}\n </div>\n</ng-template>\n\n<shared-operations-history-modal [newValues]=\"selectedNewValues()\" [oldValues]=\"selectedOldValues()\">\n</shared-operations-history-modal>\n",
|
|
1859
|
-
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.operation-content{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}.operation-content .operation{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.operation-content .operation.added{color:var(--color-
|
|
2112
|
+
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.operation-content{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}.operation-content .operation{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.operation-content .operation.added{color:var(--color-success)}.operation-content .operation.deleted{color:var(--color-danger)}.operation-content .operation.modified{color:var(--color-info)}.operation-content .operation.unchanged{color:var(--color-content-secondary)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
1860
2113
|
dependencies: [{
|
|
1861
2114
|
kind: "component",
|
|
1862
2115
|
type: DataGridComponent,
|
|
@@ -1889,7 +2142,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1889
2142
|
useClass: OperationsHistoryDataset
|
|
1890
2143
|
}],
|
|
1891
2144
|
template: "<lib-data-grid [lazyLoadRows]=\"true\"> </lib-data-grid>\n\n<ng-template #operationTemplate let-rowData=\"rowData\">\n <div\n class=\"operation-content\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"openModal()\"\n (keydown.enter)=\"openModal()\"\n (keydown.space)=\"openModal(); $event.preventDefault()\"\n >\n <span\n class=\"operation\"\n [class.added]=\"rowData.operationType === 'Added'\"\n [class.deleted]=\"rowData.operationType === 'Deleted'\"\n [class.modified]=\"rowData.operationType === 'Modified'\"\n [class.unchanged]=\"rowData.operationType === 'Unchanged'\"\n >\n {{ rowData.operationType }}\n </span>\n {{ rowData.entityName }}\n </div>\n</ng-template>\n\n<shared-operations-history-modal [newValues]=\"selectedNewValues()\" [oldValues]=\"selectedOldValues()\">\n</shared-operations-history-modal>\n",
|
|
1892
|
-
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.operation-content{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}.operation-content .operation{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.operation-content .operation.added{color:var(--color-
|
|
2145
|
+
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.operation-content{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}.operation-content .operation{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.operation-content .operation.added{color:var(--color-success)}.operation-content .operation.deleted{color:var(--color-danger)}.operation-content .operation.modified{color:var(--color-info)}.operation-content .operation.unchanged{color:var(--color-content-secondary)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
1893
2146
|
}]
|
|
1894
2147
|
}],
|
|
1895
2148
|
propDecorators: {
|
|
@@ -2059,7 +2312,7 @@ var ServicesHistoryChildListComponent = class ServicesHistoryChildListComponent
|
|
|
2059
2312
|
usesInheritance: true,
|
|
2060
2313
|
ngImport: i0,
|
|
2061
2314
|
template: "<lib-data-grid [lazyLoadRows]=\"true\"> </lib-data-grid>\n\n<ng-template #serviceTemplate let-rowData=\"rowData\">\n <div class=\"service-content\">\n <div class=\"icon\">\n <i class=\"fa-solid fa-circle fa-lg\"></i>\n </div>\n <div class=\"information\">\n <div class=\"service-name\">\n {{ rowData.name }}\n </div>\n <div class=\"details\">\n <span class=\"datetime\"\n ><i class=\"fa-solid fa-clock\"></i>\n {{ rowData.changedOn | utcDate | date: ('Format-DateTime' | translate) }}</span\n >\n <span class=\"user\"><i class=\"fa-solid fa-user\"></i> {{ rowData.changedByName }}</span>\n </div>\n </div>\n </div>\n</ng-template>\n",
|
|
2062
|
-
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.service-content{display:flex;flex-grow:1;overflow:hidden;padding-inline:calc(var(--spacing, .25rem) * 3)}.service-content .icon{position:relative;margin-right:calc(var(--spacing, .25rem) * 3);display:flex;align-items:center;color:var(--color-
|
|
2315
|
+
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.service-content{display:flex;flex-grow:1;overflow:hidden;padding-inline:calc(var(--spacing, .25rem) * 3)}.service-content .icon{position:relative;margin-right:calc(var(--spacing, .25rem) * 3);display:flex;align-items:center;color:var(--color-accent)}.service-content .icon:before,.service-content .icon:after{position:absolute;left:50%;margin-left:calc(var(--spacing, .25rem) * -1);height:50%;width:calc(var(--spacing, .25rem) * 2);--tw-content: \"\";content:var(--tw-content);background-color:var(--color-line)}.service-content .icon:before{top:0}.service-content .icon:after{top:50%}.service-content .icon i{z-index:1}.service-content .information{display:flex;flex-grow:1;flex-direction:column;overflow:hidden;padding-block:var(--spacing, .25rem)}.service-content .information .service-name{--tw-font-weight: var(--font-weight-bold, 700);font-weight:var(--font-weight-bold, 700)}.service-content .information .details{display:flex;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}.service-content .information .details i{color:var(--color-content-subtle)}.service-content .information .details .datetime{margin-right:calc(var(--spacing, .25rem) * 3)}.service-content .information .details .user{overflow:hidden;text-overflow:ellipsis}@property --tw-content{syntax: \"*\"; inherits: false; initial-value: \"\";}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-content: \"\";--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
|
|
2063
2316
|
dependencies: [
|
|
2064
2317
|
{
|
|
2065
2318
|
kind: "component",
|
|
@@ -2105,7 +2358,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
2105
2358
|
TranslatePipe
|
|
2106
2359
|
],
|
|
2107
2360
|
template: "<lib-data-grid [lazyLoadRows]=\"true\"> </lib-data-grid>\n\n<ng-template #serviceTemplate let-rowData=\"rowData\">\n <div class=\"service-content\">\n <div class=\"icon\">\n <i class=\"fa-solid fa-circle fa-lg\"></i>\n </div>\n <div class=\"information\">\n <div class=\"service-name\">\n {{ rowData.name }}\n </div>\n <div class=\"details\">\n <span class=\"datetime\"\n ><i class=\"fa-solid fa-clock\"></i>\n {{ rowData.changedOn | utcDate | date: ('Format-DateTime' | translate) }}</span\n >\n <span class=\"user\"><i class=\"fa-solid fa-user\"></i> {{ rowData.changedByName }}</span>\n </div>\n </div>\n </div>\n</ng-template>\n",
|
|
2108
|
-
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.service-content{display:flex;flex-grow:1;overflow:hidden;padding-inline:calc(var(--spacing, .25rem) * 3)}.service-content .icon{position:relative;margin-right:calc(var(--spacing, .25rem) * 3);display:flex;align-items:center;color:var(--color-
|
|
2361
|
+
styles: ["@layer properties;:host{width:100%;max-width:100%;min-width:100%}lib-data-grid{height:100%}lib-data-grid ::ng-deep .body lib-data-grid-row{padding:0!important}.service-content{display:flex;flex-grow:1;overflow:hidden;padding-inline:calc(var(--spacing, .25rem) * 3)}.service-content .icon{position:relative;margin-right:calc(var(--spacing, .25rem) * 3);display:flex;align-items:center;color:var(--color-accent)}.service-content .icon:before,.service-content .icon:after{position:absolute;left:50%;margin-left:calc(var(--spacing, .25rem) * -1);height:50%;width:calc(var(--spacing, .25rem) * 2);--tw-content: \"\";content:var(--tw-content);background-color:var(--color-line)}.service-content .icon:before{top:0}.service-content .icon:after{top:50%}.service-content .icon i{z-index:1}.service-content .information{display:flex;flex-grow:1;flex-direction:column;overflow:hidden;padding-block:var(--spacing, .25rem)}.service-content .information .service-name{--tw-font-weight: var(--font-weight-bold, 700);font-weight:var(--font-weight-bold, 700)}.service-content .information .details{display:flex;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}.service-content .information .details i{color:var(--color-content-subtle)}.service-content .information .details .datetime{margin-right:calc(var(--spacing, .25rem) * 3)}.service-content .information .details .user{overflow:hidden;text-overflow:ellipsis}@property --tw-content{syntax: \"*\"; inherits: false; initial-value: \"\";}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-content: \"\";--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
2109
2362
|
}]
|
|
2110
2363
|
}],
|
|
2111
2364
|
propDecorators: {
|
|
@@ -2512,6 +2765,6 @@ function provideZambonSharedTranslateService(config = {}) {
|
|
|
2512
2765
|
loader: provideZambonSharedTranslateLoader(config.appResources)
|
|
2513
2766
|
});
|
|
2514
2767
|
}
|
|
2515
|
-
export { AuthGuard, AuthInterceptor, AuthenticationService, BrandComponent, BypassHtmlSanitizerPipe, EXTERNAL_CONTENT_CONFIGS, EXTERNAL_CONTENT_ROUTE_PATH, EnumLabelPipe, EnvironmentBadgeComponent, ExternalContentComponent, ExternalContentConfigs, ExternalContentService, ExternalUrlResolverService, FiltersBase, LoginLayoutComponent, MainLayoutComponent, NotificationsComponent, NotificationsService, OperationsHistoryChildListComponent, OperationsHistoryDataset, OperationsHistoryModalComponent, OperationsHistoryService, ServicesHistoryChildListComponent, ServicesHistoryDataset, ServicesHistoryFilterComponent, ServicesHistoryService, ServicesHistoryViewComponent, SharedAuthModule, TopBarComponent, UserProfileComponent, UtcDatePipe, ZAMBON_SHARED_I18N_ASSET, ZAMBON_SHARED_I18N_ASSET_PATH, ZAMBON_SHARED_I18N_RESOURCES, createZambonSharedTranslateLoader, externalContentRoutes, provideZambonSharedTranslateLoader, provideZambonSharedTranslateService };
|
|
2768
|
+
export { AuthGuard, AuthInterceptor, AuthenticationService, BrandComponent, BypassHtmlSanitizerPipe, EXTERNAL_CONTENT_CONFIGS, EXTERNAL_CONTENT_ROUTE_PATH, EnumLabelPipe, EnvironmentBadgeComponent, ExternalContentComponent, ExternalContentConfigs, ExternalContentService, ExternalUrlResolverService, FiltersBase, LoginLayoutComponent, MainLayoutComponent, NotificationsComponent, NotificationsService, OperationsHistoryChildListComponent, OperationsHistoryDataset, OperationsHistoryModalComponent, OperationsHistoryService, ServicesHistoryChildListComponent, ServicesHistoryDataset, ServicesHistoryFilterComponent, ServicesHistoryService, ServicesHistoryViewComponent, SharedAuthModule, THEME_STORAGE_KEY, ThemeService, ThemeSwitchComponent, TopBarComponent, UserProfileComponent, UtcDatePipe, ZAMBON_SHARED_I18N_ASSET, ZAMBON_SHARED_I18N_ASSET_PATH, ZAMBON_SHARED_I18N_RESOURCES, createZambonSharedTranslateLoader, externalContentRoutes, provideZambonSharedTranslateLoader, provideZambonSharedTranslateService };
|
|
2516
2769
|
|
|
2517
2770
|
//# sourceMappingURL=zambon-dev-ui-shared.mjs.map
|