@yuuvis/client-shell 2.0.0-beta.0 → 2.0.0-beta.3

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.
Files changed (41) hide show
  1. package/fesm2022/yuuvis-client-shell-dashboard.component-DWdP5HSx.mjs +14 -0
  2. package/fesm2022/yuuvis-client-shell-dashboard.component-DWdP5HSx.mjs.map +1 -0
  3. package/fesm2022/yuuvis-client-shell-settings.component-R-GCMuxK.mjs +84 -0
  4. package/fesm2022/yuuvis-client-shell-settings.component-R-GCMuxK.mjs.map +1 -0
  5. package/fesm2022/yuuvis-client-shell-web-share-target.component-BQiQkEd_.mjs +21 -0
  6. package/fesm2022/yuuvis-client-shell-web-share-target.component-BQiQkEd_.mjs.map +1 -0
  7. package/fesm2022/yuuvis-client-shell.mjs +144 -143
  8. package/fesm2022/yuuvis-client-shell.mjs.map +1 -1
  9. package/lib/actions/manage-flavors/manage-flavors.component.d.ts +1 -0
  10. package/lib/assets/i18n/de.json +3 -3
  11. package/lib/assets/i18n/en.json +3 -3
  12. package/lib/client-shell.component.d.ts +4 -2
  13. package/lib/components/sidebar-nav/sidebar-nav.component.d.ts +8 -0
  14. package/lib/pages/dashboard/dashboard.component.d.ts +1 -1
  15. package/lib/pages/notifications/notifications.component.d.ts +0 -2
  16. package/lib/pages/settings/settings.component.d.ts +1 -0
  17. package/package.json +7 -18
  18. package/esm2022/index.mjs +0 -6
  19. package/esm2022/lib/actions/manage-flavors/manage-flavors.action.mjs +0 -39
  20. package/esm2022/lib/actions/manage-flavors/manage-flavors.component.mjs +0 -69
  21. package/esm2022/lib/client-shell.component.mjs +0 -191
  22. package/esm2022/lib/components/app-logo/app-logo.component.mjs +0 -18
  23. package/esm2022/lib/directives/inert.directive.mjs +0 -26
  24. package/esm2022/lib/lib.routes.mjs +0 -15
  25. package/esm2022/lib/pages/dashboard/dashboard.component.mjs +0 -11
  26. package/esm2022/lib/pages/notifications/notifications.component.mjs +0 -82
  27. package/esm2022/lib/pages/settings/settings.component.mjs +0 -71
  28. package/esm2022/lib/pages/web-share-target/web-share-target.component.mjs +0 -18
  29. package/esm2022/widget-dashboard/index.mjs +0 -3
  30. package/esm2022/widget-dashboard/lib/widget-dashboard.component.mjs +0 -46
  31. package/esm2022/widget-dashboard/lib/widget-dashboard.config.mjs +0 -3
  32. package/esm2022/widget-dashboard/lib/widget-dashboard.module.mjs +0 -49
  33. package/esm2022/widget-dashboard/yuuvis-client-shell-widget-dashboard.mjs +0 -5
  34. package/esm2022/yuuvis-client-shell.mjs +0 -5
  35. package/fesm2022/yuuvis-client-shell-widget-dashboard.mjs +0 -98
  36. package/fesm2022/yuuvis-client-shell-widget-dashboard.mjs.map +0 -1
  37. package/widget-dashboard/README.md +0 -19
  38. package/widget-dashboard/index.d.ts +0 -2
  39. package/widget-dashboard/lib/widget-dashboard.component.d.ts +0 -16
  40. package/widget-dashboard/lib/widget-dashboard.config.d.ts +0 -7
  41. package/widget-dashboard/lib/widget-dashboard.module.d.ts +0 -13
@@ -1,191 +0,0 @@
1
- import { AsyncPipe, NgIf } from '@angular/common';
2
- import { Component, HostListener, effect, inject, input, signal } from '@angular/core';
3
- import { toSignal } from '@angular/core/rxjs-interop';
4
- import { NavigationEnd, Router, RouterModule } from '@angular/router';
5
- import { SwPush } from '@angular/service-worker';
6
- import { AuthService, DeviceService, TranslateModule, TranslateService, UserRoles, UserService, Utils } from '@yuuvis/client-core';
7
- import { MetadataDefaultTemplatesComponent } from '@yuuvis/client-framework/metadata-form';
8
- import { CommandPaletteService, ShellNotificationsService, ShellService } from '@yuuvis/client-shell-core';
9
- import { YvcIconModule } from '@yuuvis/components/icon';
10
- import { of } from 'rxjs';
11
- import { catchError, filter, map, switchMap, tap } from 'rxjs/operators';
12
- import { clientShellRoutes } from './lib.routes';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@yuuvis/client-core";
15
- import * as i2 from "@angular/router";
16
- import * as i3 from "@yuuvis/components/icon";
17
- export class ClientShellComponent {
18
- #shell;
19
- #device;
20
- #swPush;
21
- onFocusChange(event) {
22
- // console.log('focused: ', document.activeElement);
23
- }
24
- onDragOver(event) {
25
- event.stopPropagation();
26
- event.preventDefault();
27
- this.showUploadOverlay = !!this._dragContainsFiles(event);
28
- }
29
- #appsEffect;
30
- #shellConfigEffect;
31
- constructor() {
32
- this.router = inject(Router);
33
- this.auth = inject(AuthService);
34
- this.userService = inject(UserService);
35
- this.#shell = inject(ShellService);
36
- this.shellNotifications = inject(ShellNotificationsService);
37
- this.translate = inject(TranslateService);
38
- this.commandPalette = inject(CommandPaletteService);
39
- this.#device = inject(DeviceService);
40
- this.#swPush = inject(SwPush);
41
- this.APP_LOGOUT_EVENT_KEY = 'yuv.app.event.logout';
42
- this._levels = {
43
- info: 0,
44
- success: 1,
45
- warning: 2,
46
- alert: 3
47
- };
48
- this.showUploadOverlay = false;
49
- this.busy$ = this.#shell.isBusy$;
50
- this.showNotifications = signal(false);
51
- this.newNotifications = toSignal(this.shellNotifications.shellNotifications$.pipe(tap((n) => this.showNotifications.set(n.length > 0)), map((notifications) => {
52
- let maxLevel = 'info';
53
- const count = notifications.filter((n) => !n.seen).length;
54
- notifications.forEach((n) => (maxLevel = n.level && this._levels[n.level] > this._levels[maxLevel] ? n.level : maxLevel));
55
- return count > 0 ? { maxLevel, count } : undefined;
56
- })));
57
- this.apps = input.required();
58
- this.#appsEffect = effect(() => this.#shell.setAppBaseRoutes(this.apps()));
59
- this.checkedForInitialRoute = false;
60
- this.enableTenantSwitch = false;
61
- this.config = input();
62
- this.#shellConfigEffect = effect(() => {
63
- const cfg = this.config();
64
- if (cfg) {
65
- this.#shell.setShellConfig(cfg);
66
- }
67
- }, {
68
- allowSignalWrites: true
69
- });
70
- this.shellConfig = this.#shell.shellConfig;
71
- this.translate.onLangChange.subscribe(() => this._setCommands(true));
72
- // this.router.events.pipe(
73
- // // filter(e => e instanceof NavigationStart)
74
- // ).subscribe((e) => {
75
- // console.log(e);
76
- // });
77
- this.router.events
78
- .pipe(filter((e) => e instanceof NavigationEnd), map((e) => e))
79
- .subscribe((e) => this._processRouterNavigationEnd(e));
80
- this.#device.init();
81
- this.userService.user$.subscribe((user) => {
82
- if (user) {
83
- this.checkedForInitialRoute = !(!this.user || this.user.id !== user.id);
84
- this.enableTenantSwitch = user.authorities.includes(UserRoles.MULTI_TENANT);
85
- }
86
- this.user = user;
87
- });
88
- window.addEventListener('storage', (evt) => {
89
- if (evt.key === this.APP_LOGOUT_EVENT_KEY) {
90
- this.appLogout(true);
91
- }
92
- });
93
- }
94
- openNotifications() {
95
- this.router.navigate([{}]);
96
- }
97
- // getNotifications(id: string) {
98
- // return this.shellNotifications.getNotifications(id);
99
- // }
100
- _dragContainsFiles(event) {
101
- // do not allow to drop files/images from iframes
102
- if (event.relatedTarget?.tagName.toLowerCase() === 'iframe')
103
- return 0;
104
- return event.dataTransfer ? Array.from(event.dataTransfer.items || []).filter((i) => i.kind === 'file' && i.type).length : 0;
105
- }
106
- _setCommands(update) {
107
- const commands = this.apps().map((a, i) => ({
108
- id: `nav.app.${i}`,
109
- label: this.translate.instant('yuv.shell.cmd.app.open', { title: a.title }),
110
- callback: () => this.router.navigate([a.path])
111
- }));
112
- commands.push({
113
- id: `nav.shell.settings`,
114
- label: this.translate.instant('yuv.shell.cmd.open.settings'),
115
- callback: () => this.router.navigate(['settings'])
116
- });
117
- commands.push({
118
- id: `nav.shell.logout`,
119
- label: this.translate.instant('yuv.shell.cmd.logout'),
120
- callback: () => this.appLogout()
121
- });
122
- if (update)
123
- this.commandPalette.updateCommands(commands);
124
- else
125
- this.commandPalette.registerCommands(commands);
126
- }
127
- requestSubscription() {
128
- if (!this.#swPush.isEnabled) {
129
- console.log('Notification is not enabled.');
130
- return;
131
- }
132
- this.#swPush.messages
133
- .pipe(tap((msg) => console.log({ msg })), catchError((error) => {
134
- console.log({ error });
135
- return of(null);
136
- }))
137
- .subscribe();
138
- }
139
- appLogout(triggeredFromOtherTab) {
140
- if (!triggeredFromOtherTab) {
141
- // send storage event to logout all other open tabs
142
- window.localStorage.setItem(this.APP_LOGOUT_EVENT_KEY, `${Date.now()}`);
143
- }
144
- this.userService.logout('');
145
- }
146
- _processRouterNavigationEnd(e) {
147
- if (!this.checkedForInitialRoute) {
148
- this.checkedForInitialRoute = true;
149
- // redirect to the page the user logged out from the last time
150
- // but only if current route is not a deep link
151
- const ignoreRoutes = ['', 'dashboard', 'index.html'].map((s) => `${Utils.getBaseHref()}${s}`.replace('//', '/'));
152
- const currentRoute = this.routeWithBaseHref(this.router.routerState.snapshot.url);
153
- if (this.userService.getCurrentUser() && !ignoreRoutes.includes(currentRoute)) {
154
- // get persisted routes to decide where to redirect the logged in user to
155
- this.auth
156
- .getInitialRequestUri()
157
- .pipe(switchMap((res) => this.auth.resetInitialRequestUri().pipe(map((_) => res))))
158
- .subscribe((res) => {
159
- const loginRes = res && !ignoreRoutes.includes(res.uri) ? res : null;
160
- if (loginRes)
161
- this.router.navigateByUrl(loginRes.uri);
162
- });
163
- }
164
- }
165
- }
166
- routeWithBaseHref(r) {
167
- return `${Utils.getBaseHref()}${r}`.replace('//', '/');
168
- }
169
- ngOnInit() {
170
- this.#shell._init();
171
- clientShellRoutes.forEach((route) => {
172
- this.router.config.push(route);
173
- });
174
- this.router.resetConfig(this.router.config);
175
- this._setCommands();
176
- this.requestSubscription();
177
- }
178
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ClientShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
179
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ClientShellComponent, isStandalone: true, selector: "yuv-client-shell", inputs: { apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:focusin": "onFocusChange($event)", "dragover": "onDragOver($event)" } }, ngImport: i0, template: "<yuv-metadata-default-templates></yuv-metadata-default-templates>\n<!-- <yuv-focus-indicator /> -->\n\n<!-- gloabl busy indicator -->\n@if (busy$ | async) {\n <div class=\"yuv-loader-linear\"></div>\n}\n<nav class=\"apps\" [inert]=\"asideOutlet.isActivated\" [attr.aria-label]=\"'yuv.shell.naviagtion.aria.label' | translate\">\n <div class=\"app-icon\">\n <button routerLink=\"/\" routerLinkActive=\"active\" [attr.aria-label]=\"'yuv.shell.logo.aria.label' | translate\">\n <yvc-icon [svg]=\"shellConfig().icons!.appIcon!\"></yvc-icon>\n </button>\n </div>\n <ul class=\"apps\">\n @for (a of apps(); track a.path) {\n <li>\n <button routerLinkActive=\"active\" [routerLink]=\"a.path\" title=\"{{ a.title }}\">\n <yvc-icon [svg]=\"a.icon\" title=\"{{ a.title }}\" *ngIf=\"a.icon\"></yvc-icon>\n <!-- @if (getNotifications(a.id)) {\n <div [ngClass]=\"'badge ' + getNotifications(a.id).maxLevel\">{{ getNotifications(a.id).count }}</div>\n } -->\n </button>\n </li>\n }\n </ul>\n\n <section class=\"actions\">\n @if (showNotifications()) {\n <button [routerLink]=\"[{ outlets: { aside: 'notifications' } }]\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.notifications.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.notifications!\"></yvc-icon>\n @if (newNotifications(); as note) {\n <div class=\"badge {{ note.maxLevel }}\">{{ note.count }}</div>\n }\n </button>\n }\n <button [routerLink]=\"['/settings']\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.settings.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.settings!\"></yvc-icon>\n </button>\n <button (click)=\"appLogout()\" title=\"{{ 'yuv.shell.cmd.logout' | translate }}\"><yvc-icon [svg]=\"shellConfig().icons!.logout!\"></yvc-icon></button>\n </section>\n</nav>\n<main id=\"main-shell_content\" aria-label=\"main shell content\" [inert]=\"asideOutlet.isActivated\">\n <router-outlet></router-outlet>\n</main>\n\n<!-- outlet for aside modals like notifications -->\n<div class=\"asideOutlet\" [hidden]=\"!asideOutlet.isActivated\">\n <router-outlet name=\"aside\" #asideOutlet=\"outlet\"></router-outlet>\n</div>\n\n<div id=\"fi\" inert></div>\n", styles: [":host{--client-shell-background-color: var(--main-background);--client-shell-bar-background-color: var(--panel-background);--client-shell-bar-icon-size: 24px;--client-shell-bar-button-padding: calc(var(--app-pane-padding) * .75);--client-shell-bar-width: calc(var(--client-shell-bar-icon-size) + var(--client-shell-bar-button-padding) * 2 + 1px);position:absolute;inset:0;overflow:hidden;display:flex;background-color:var(--client-shell-background-color)}:host .yuv-loader-linear{position:absolute}:host nav{background-color:var(--client-shell-bar-background-color);height:100%;overflow-y:auto;border-inline-end:1px solid var(--panel-divider-color);flex:0 0 auto;display:var(--nav-display, grid);grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"appIcon\" \"apps\" \"actions\"}:host nav button{padding:var(--client-shell-bar-button-padding);border-radius:0;border:0}:host nav button yvc-icon{--icon-size: var(--client-shell-bar-icon-size)}:host nav button.active{color:var(--color-accent)}:host nav .app-icon{grid-area:appIcon}:host nav ul.apps{grid-area:apps;list-style:none;margin:0;padding:0;overflow-y:auto}:host nav ul.apps button{position:relative}:host nav ul.apps button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav ul.apps button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav ul.apps button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav ul.apps button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host nav ul.apps li a{display:block;padding:var(--app-pane-padding)}:host nav section.actions{grid-area:actions}:host nav section.actions button{position:relative}:host nav section.actions button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav section.actions button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav section.actions button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav section.actions button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host main{flex:1;color:var(--text-color-body)}:host .asideOutlet{position:absolute;inset:0;padding-inline-start:var(--client-shell-bar-width)}:host-context([data-screen-size=s][data-screen-orientation=portrait]){flex-flow:column-reverse}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav{height:auto;grid-template-rows:1fr;grid-template-columns:auto 1fr auto;grid-template-areas:\"appIcon apps actions\";border:0;border-block-start:1px solid var(--panel-divider-color)}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav .app-icon{display:none}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav ul.apps,:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav section.actions{display:flex}:host-context([data-screen-size=s][data-screen-orientation=portrait]) main{overflow:hidden}:host-context([data-screen-size=s][data-screen-orientation=portrait]) .asideOutlet{padding-inline-start:0}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i3.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "component", type: MetadataDefaultTemplatesComponent, selector: "yuv-metadata-default-templates" }] }); }
180
- }
181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ClientShellComponent, decorators: [{
182
- type: Component,
183
- args: [{ selector: 'yuv-client-shell', standalone: true, imports: [NgIf, AsyncPipe, TranslateModule, RouterModule, YvcIconModule, MetadataDefaultTemplatesComponent], template: "<yuv-metadata-default-templates></yuv-metadata-default-templates>\n<!-- <yuv-focus-indicator /> -->\n\n<!-- gloabl busy indicator -->\n@if (busy$ | async) {\n <div class=\"yuv-loader-linear\"></div>\n}\n<nav class=\"apps\" [inert]=\"asideOutlet.isActivated\" [attr.aria-label]=\"'yuv.shell.naviagtion.aria.label' | translate\">\n <div class=\"app-icon\">\n <button routerLink=\"/\" routerLinkActive=\"active\" [attr.aria-label]=\"'yuv.shell.logo.aria.label' | translate\">\n <yvc-icon [svg]=\"shellConfig().icons!.appIcon!\"></yvc-icon>\n </button>\n </div>\n <ul class=\"apps\">\n @for (a of apps(); track a.path) {\n <li>\n <button routerLinkActive=\"active\" [routerLink]=\"a.path\" title=\"{{ a.title }}\">\n <yvc-icon [svg]=\"a.icon\" title=\"{{ a.title }}\" *ngIf=\"a.icon\"></yvc-icon>\n <!-- @if (getNotifications(a.id)) {\n <div [ngClass]=\"'badge ' + getNotifications(a.id).maxLevel\">{{ getNotifications(a.id).count }}</div>\n } -->\n </button>\n </li>\n }\n </ul>\n\n <section class=\"actions\">\n @if (showNotifications()) {\n <button [routerLink]=\"[{ outlets: { aside: 'notifications' } }]\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.notifications.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.notifications!\"></yvc-icon>\n @if (newNotifications(); as note) {\n <div class=\"badge {{ note.maxLevel }}\">{{ note.count }}</div>\n }\n </button>\n }\n <button [routerLink]=\"['/settings']\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.settings.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.settings!\"></yvc-icon>\n </button>\n <button (click)=\"appLogout()\" title=\"{{ 'yuv.shell.cmd.logout' | translate }}\"><yvc-icon [svg]=\"shellConfig().icons!.logout!\"></yvc-icon></button>\n </section>\n</nav>\n<main id=\"main-shell_content\" aria-label=\"main shell content\" [inert]=\"asideOutlet.isActivated\">\n <router-outlet></router-outlet>\n</main>\n\n<!-- outlet for aside modals like notifications -->\n<div class=\"asideOutlet\" [hidden]=\"!asideOutlet.isActivated\">\n <router-outlet name=\"aside\" #asideOutlet=\"outlet\"></router-outlet>\n</div>\n\n<div id=\"fi\" inert></div>\n", styles: [":host{--client-shell-background-color: var(--main-background);--client-shell-bar-background-color: var(--panel-background);--client-shell-bar-icon-size: 24px;--client-shell-bar-button-padding: calc(var(--app-pane-padding) * .75);--client-shell-bar-width: calc(var(--client-shell-bar-icon-size) + var(--client-shell-bar-button-padding) * 2 + 1px);position:absolute;inset:0;overflow:hidden;display:flex;background-color:var(--client-shell-background-color)}:host .yuv-loader-linear{position:absolute}:host nav{background-color:var(--client-shell-bar-background-color);height:100%;overflow-y:auto;border-inline-end:1px solid var(--panel-divider-color);flex:0 0 auto;display:var(--nav-display, grid);grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"appIcon\" \"apps\" \"actions\"}:host nav button{padding:var(--client-shell-bar-button-padding);border-radius:0;border:0}:host nav button yvc-icon{--icon-size: var(--client-shell-bar-icon-size)}:host nav button.active{color:var(--color-accent)}:host nav .app-icon{grid-area:appIcon}:host nav ul.apps{grid-area:apps;list-style:none;margin:0;padding:0;overflow-y:auto}:host nav ul.apps button{position:relative}:host nav ul.apps button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav ul.apps button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav ul.apps button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav ul.apps button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host nav ul.apps li a{display:block;padding:var(--app-pane-padding)}:host nav section.actions{grid-area:actions}:host nav section.actions button{position:relative}:host nav section.actions button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav section.actions button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav section.actions button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav section.actions button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host main{flex:1;color:var(--text-color-body)}:host .asideOutlet{position:absolute;inset:0;padding-inline-start:var(--client-shell-bar-width)}:host-context([data-screen-size=s][data-screen-orientation=portrait]){flex-flow:column-reverse}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav{height:auto;grid-template-rows:1fr;grid-template-columns:auto 1fr auto;grid-template-areas:\"appIcon apps actions\";border:0;border-block-start:1px solid var(--panel-divider-color)}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav .app-icon{display:none}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav ul.apps,:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav section.actions{display:flex}:host-context([data-screen-size=s][data-screen-orientation=portrait]) main{overflow:hidden}:host-context([data-screen-size=s][data-screen-orientation=portrait]) .asideOutlet{padding-inline-start:0}\n"] }]
184
- }], ctorParameters: () => [], propDecorators: { onFocusChange: [{
185
- type: HostListener,
186
- args: ['document:focusin', ['$event']]
187
- }], onDragOver: [{
188
- type: HostListener,
189
- args: ['dragover', ['$event']]
190
- }] } });
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNoZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMvbGliL2NsaWVudC1zaGVsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9jbGllbnQtc2hlbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBa0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFTLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDNUksT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUlMLHFCQUFxQixFQUVyQix5QkFBeUIsRUFDekIsWUFBWSxFQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7O0FBU2pELE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsTUFBTSxDQUF3QjtJQUlyQixPQUFPLENBQXlCO0lBQ2hDLE9BQU8sQ0FBa0I7SUFtQ2xDLGFBQWEsQ0FBQyxLQUFpQjtRQUM3QixvREFBb0Q7SUFDdEQsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFnQjtRQUN6QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFHRCxXQUFXLENBQTJEO0lBTXRFLGtCQUFrQixDQVVoQjtJQUdGO1FBM0VRLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxXQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RCLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3ZELGNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyQyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlDLFlBQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQix5QkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztRQUU5QyxZQUFPLEdBQTJDO1lBQ3hELElBQUksRUFBRSxDQUFDO1lBQ1AsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQztZQUNWLEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUVGLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixVQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFHNUIsc0JBQWlCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzNDLHFCQUFnQixHQU1aLFFBQVEsQ0FDVixJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUM5QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNwRCxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUNwQixJQUFJLFFBQVEsR0FBMkIsTUFBTSxDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUMxRCxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDMUgsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQztRQWVGLFNBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFTLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXRFLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUMvQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFFM0IsV0FBTSxHQUFHLEtBQUssRUFBcUIsQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxNQUFNLENBQ3pCLEdBQUcsRUFBRTtZQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDLEVBQ0Q7WUFDRSxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQ0YsQ0FBQztRQUNGLGdCQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFHcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRSwyQkFBMkI7UUFDM0IsaURBQWlEO1FBQ2pELHVCQUF1QjtRQUN2QixvQkFBb0I7UUFDcEIsTUFBTTtRQUVOLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTthQUNmLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxhQUFhLENBQUMsRUFDekMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFrQixDQUFDLENBQy9CO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUF5QixFQUFFLEVBQUU7WUFDN0QsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUUsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pDLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMseURBQXlEO0lBQ3pELElBQUk7SUFFSSxrQkFBa0IsQ0FBQyxLQUFnQjtRQUN6QyxpREFBaUQ7UUFDakQsSUFBSyxLQUFLLENBQUMsYUFBeUIsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25GLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvSCxDQUFDO0lBRU8sWUFBWSxDQUFDLE1BQWdCO1FBQ25DLE1BQU0sUUFBUSxHQUE0QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7WUFDbEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFlLEVBQUUsQ0FBQztZQUNyRixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0MsQ0FBQyxDQUFDLENBQUM7UUFDSixRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osRUFBRSxFQUFFLG9CQUFvQjtZQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUM7WUFDNUQsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbkQsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNaLEVBQUUsRUFBRSxrQkFBa0I7WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ3JELFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUVILElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztZQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzVDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2FBQ2xCLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQ2xDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsQ0FBQyxxQkFBK0I7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0IsbURBQW1EO1lBQ25ELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxDQUFnQjtRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyw4REFBOEQ7WUFDOUQsK0NBQStDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWxGLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDOUUseUVBQXlFO2dCQUN6RSxJQUFJLENBQUMsSUFBSTtxQkFDTixvQkFBb0IsRUFBRTtxQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEYsU0FBUyxDQUFDLENBQUMsR0FBdUMsRUFBRSxFQUFFO29CQUNyRCxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ3JFLElBQUksUUFBUTt3QkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsQ0FBUztRQUNqQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7K0dBek1VLG9CQUFvQjttR0FBcEIsb0JBQW9CLCthQzVCakMsNHZFQW1EQSx5b0hEM0JZLElBQUksd0ZBQUUsU0FBUyw2Q0FBRSxlQUFlLDJGQUFFLFlBQVksMHBCQUFFLGFBQWEsK0hBQUUsaUNBQWlDOzs0RkFJL0Ysb0JBQW9CO2tCQVBoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGlDQUFpQyxDQUFDO3dEQWdEM0csYUFBYTtzQkFEWixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU01QyxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQsIFNpZ25hbCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGUsIFJvdXRlciwgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN3UHVzaCB9IGZyb20gJ0Bhbmd1bGFyL3NlcnZpY2Utd29ya2VyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBEZXZpY2VTZXJ2aWNlLCBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UsIFVzZXJSb2xlcywgVXNlclNlcnZpY2UsIFV0aWxzLCBZdXZVc2VyIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBNZXRhZGF0YURlZmF1bHRUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvbWV0YWRhdGEtZm9ybSc7XG5pbXBvcnQge1xuICBBcHAsXG4gIENsaWVudFNoZWxsQ29uZmlnLFxuICBDb21tYW5kUGFsZXR0ZUNvbW1hbmQsXG4gIENvbW1hbmRQYWxldHRlU2VydmljZSxcbiAgU2hlbGxOb3RpZmljYXRpb25MZXZlbCxcbiAgU2hlbGxOb3RpZmljYXRpb25zU2VydmljZSxcbiAgU2hlbGxTZXJ2aWNlXG59IGZyb20gJ0B5dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUnO1xuaW1wb3J0IHsgWXZjSWNvbk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjbGllbnRTaGVsbFJvdXRlcyB9IGZyb20gJy4vbGliLnJvdXRlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3l1di1jbGllbnQtc2hlbGwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdJZiwgQXN5bmNQaXBlLCBUcmFuc2xhdGVNb2R1bGUsIFJvdXRlck1vZHVsZSwgWXZjSWNvbk1vZHVsZSwgTWV0YWRhdGFEZWZhdWx0VGVtcGxhdGVzQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NsaWVudC1zaGVsbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsaWVudC1zaGVsbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENsaWVudFNoZWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB1c2VyU2VydmljZSA9IGluamVjdChVc2VyU2VydmljZSk7XG4gICNzaGVsbCA9IGluamVjdChTaGVsbFNlcnZpY2UpO1xuICBwcml2YXRlIHNoZWxsTm90aWZpY2F0aW9ucyA9IGluamVjdChTaGVsbE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgY29tbWFuZFBhbGV0dGUgPSBpbmplY3QoQ29tbWFuZFBhbGV0dGVTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2RldmljZSA9IGluamVjdChEZXZpY2VTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3N3UHVzaCA9IGluamVjdChTd1B1c2gpO1xuXG4gIHByaXZhdGUgQVBQX0xPR09VVF9FVkVOVF9LRVkgPSAneXV2LmFwcC5ldmVudC5sb2dvdXQnO1xuXG4gIHByaXZhdGUgX2xldmVsczogUmVjb3JkPFNoZWxsTm90aWZpY2F0aW9uTGV2ZWwsIG51bWJlcj4gPSB7XG4gICAgaW5mbzogMCxcbiAgICBzdWNjZXNzOiAxLFxuICAgIHdhcm5pbmc6IDIsXG4gICAgYWxlcnQ6IDNcbiAgfTtcblxuICBzaG93VXBsb2FkT3ZlcmxheSA9IGZhbHNlO1xuICBidXN5JCA9IHRoaXMuI3NoZWxsLmlzQnVzeSQ7XG4gIGNvbnRleHQ/OiBzdHJpbmc7XG5cbiAgc2hvd05vdGlmaWNhdGlvbnMgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBuZXdOb3RpZmljYXRpb25zOiBTaWduYWw8XG4gICAgfCB7XG4gICAgICAgIGNvdW50OiBudW1iZXI7XG4gICAgICAgIG1heExldmVsOiBTaGVsbE5vdGlmaWNhdGlvbkxldmVsO1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkXG4gID4gPSB0b1NpZ25hbChcbiAgICB0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5zaGVsbE5vdGlmaWNhdGlvbnMkLnBpcGUoXG4gICAgICB0YXAoKG4pID0+IHRoaXMuc2hvd05vdGlmaWNhdGlvbnMuc2V0KG4ubGVuZ3RoID4gMCkpLFxuICAgICAgbWFwKChub3RpZmljYXRpb25zKSA9PiB7XG4gICAgICAgIGxldCBtYXhMZXZlbDogU2hlbGxOb3RpZmljYXRpb25MZXZlbCA9ICdpbmZvJztcbiAgICAgICAgY29uc3QgY291bnQgPSBub3RpZmljYXRpb25zLmZpbHRlcigobikgPT4gIW4uc2VlbikubGVuZ3RoO1xuICAgICAgICBub3RpZmljYXRpb25zLmZvckVhY2goKG4pID0+IChtYXhMZXZlbCA9IG4ubGV2ZWwgJiYgdGhpcy5fbGV2ZWxzW24ubGV2ZWxdID4gdGhpcy5fbGV2ZWxzW21heExldmVsXSA/IG4ubGV2ZWwgOiBtYXhMZXZlbCkpO1xuICAgICAgICByZXR1cm4gY291bnQgPiAwID8geyBtYXhMZXZlbCwgY291bnQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmZvY3VzaW4nLCBbJyRldmVudCddKVxuICBvbkZvY3VzQ2hhbmdlKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2ZvY3VzZWQ6ICcsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5zaG93VXBsb2FkT3ZlcmxheSA9ICEhdGhpcy5fZHJhZ0NvbnRhaW5zRmlsZXMoZXZlbnQpO1xuICB9XG5cbiAgYXBwcyA9IGlucHV0LnJlcXVpcmVkPEFwcFtdPigpO1xuICAjYXBwc0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB0aGlzLiNzaGVsbC5zZXRBcHBCYXNlUm91dGVzKHRoaXMuYXBwcygpKSk7XG4gIHVzZXI/OiBZdXZVc2VyO1xuICBjaGVja2VkRm9ySW5pdGlhbFJvdXRlID0gZmFsc2U7XG4gIGVuYWJsZVRlbmFudFN3aXRjaCA9IGZhbHNlO1xuXG4gIGNvbmZpZyA9IGlucHV0PENsaWVudFNoZWxsQ29uZmlnPigpO1xuICAjc2hlbGxDb25maWdFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcoKTtcbiAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgdGhpcy4jc2hlbGwuc2V0U2hlbGxDb25maWcoY2ZnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlXG4gICAgfVxuICApO1xuICBzaGVsbENvbmZpZyA9IHRoaXMuI3NoZWxsLnNoZWxsQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fc2V0Q29tbWFuZHModHJ1ZSkpO1xuICAgIC8vIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxuICAgIC8vICAgLy8gZmlsdGVyKGUgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydClcbiAgICAvLyApLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgIC8vICAgY29uc29sZS5sb2coZSk7XG4gICAgLy8gfSk7XG5cbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGUpID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgbWFwKChlKSA9PiBlIGFzIE5hdmlnYXRpb25FbmQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlOiBOYXZpZ2F0aW9uRW5kKSA9PiB0aGlzLl9wcm9jZXNzUm91dGVyTmF2aWdhdGlvbkVuZChlKSk7XG5cbiAgICB0aGlzLiNkZXZpY2UuaW5pdCgpO1xuXG4gICAgdGhpcy51c2VyU2VydmljZS51c2VyJC5zdWJzY3JpYmUoKHVzZXI6IFl1dlVzZXIgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZEZvckluaXRpYWxSb3V0ZSA9ICEoIXRoaXMudXNlciB8fCB0aGlzLnVzZXIuaWQgIT09IHVzZXIuaWQpO1xuICAgICAgICB0aGlzLmVuYWJsZVRlbmFudFN3aXRjaCA9IHVzZXIuYXV0aG9yaXRpZXMuaW5jbHVkZXMoVXNlclJvbGVzLk1VTFRJX1RFTkFOVCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgIH0pO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCAoZXZ0KSA9PiB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gdGhpcy5BUFBfTE9HT1VUX0VWRU5UX0tFWSkge1xuICAgICAgICB0aGlzLmFwcExvZ291dCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5Ob3RpZmljYXRpb25zKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt7fV0pO1xuICB9XG5cbiAgLy8gZ2V0Tm90aWZpY2F0aW9ucyhpZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuc2hlbGxOb3RpZmljYXRpb25zLmdldE5vdGlmaWNhdGlvbnMoaWQpO1xuICAvLyB9XG5cbiAgcHJpdmF0ZSBfZHJhZ0NvbnRhaW5zRmlsZXMoZXZlbnQ6IERyYWdFdmVudCk6IG51bWJlciB7XG4gICAgLy8gZG8gbm90IGFsbG93IHRvIGRyb3AgZmlsZXMvaW1hZ2VzIGZyb20gaWZyYW1lc1xuICAgIGlmICgoZXZlbnQucmVsYXRlZFRhcmdldCBhcyBFbGVtZW50KT8udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWZyYW1lJykgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGV2ZW50LmRhdGFUcmFuc2ZlciA/IEFycmF5LmZyb20oZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zIHx8IFtdKS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gJ2ZpbGUnICYmIGkudHlwZSkubGVuZ3RoIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldENvbW1hbmRzKHVwZGF0ZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb21tYW5kczogQ29tbWFuZFBhbGV0dGVDb21tYW5kW10gPSB0aGlzLmFwcHMoKS5tYXAoKGE6IEFwcCwgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgaWQ6IGBuYXYuYXBwLiR7aX1gLFxuICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5zaGVsbC5jbWQuYXBwLm9wZW4nLCB7IHRpdGxlOiBhLnRpdGxlIGFzIHN0cmluZyB9KSxcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYS5wYXRoXSlcbiAgICB9KSk7XG4gICAgY29tbWFuZHMucHVzaCh7XG4gICAgICBpZDogYG5hdi5zaGVsbC5zZXR0aW5nc2AsXG4gICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LnNoZWxsLmNtZC5vcGVuLnNldHRpbmdzJyksXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydzZXR0aW5ncyddKVxuICAgIH0pO1xuICAgIGNvbW1hbmRzLnB1c2goe1xuICAgICAgaWQ6IGBuYXYuc2hlbGwubG9nb3V0YCxcbiAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2hlbGwuY21kLmxvZ291dCcpLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMuYXBwTG9nb3V0KClcbiAgICB9KTtcblxuICAgIGlmICh1cGRhdGUpIHRoaXMuY29tbWFuZFBhbGV0dGUudXBkYXRlQ29tbWFuZHMoY29tbWFuZHMpO1xuICAgIGVsc2UgdGhpcy5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlckNvbW1hbmRzKGNvbW1hbmRzKTtcbiAgfVxuXG4gIHJlcXVlc3RTdWJzY3JpcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLiNzd1B1c2guaXNFbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnTm90aWZpY2F0aW9uIGlzIG5vdCBlbmFibGVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuI3N3UHVzaC5tZXNzYWdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgobXNnKSA9PiBjb25zb2xlLmxvZyh7IG1zZyB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhcHBMb2dvdXQodHJpZ2dlcmVkRnJvbU90aGVyVGFiPzogYm9vbGVhbikge1xuICAgIGlmICghdHJpZ2dlcmVkRnJvbU90aGVyVGFiKSB7XG4gICAgICAvLyBzZW5kIHN0b3JhZ2UgZXZlbnQgdG8gbG9nb3V0IGFsbCBvdGhlciBvcGVuIHRhYnNcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkFQUF9MT0dPVVRfRVZFTlRfS0VZLCBgJHtEYXRlLm5vdygpfWApO1xuICAgIH1cbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmxvZ291dCgnJyk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzUm91dGVyTmF2aWdhdGlvbkVuZChlOiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrZWRGb3JJbml0aWFsUm91dGUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZEZvckluaXRpYWxSb3V0ZSA9IHRydWU7XG4gICAgICAvLyByZWRpcmVjdCB0byB0aGUgcGFnZSB0aGUgdXNlciBsb2dnZWQgb3V0IGZyb20gdGhlIGxhc3QgdGltZVxuICAgICAgLy8gYnV0IG9ubHkgaWYgY3VycmVudCByb3V0ZSBpcyBub3QgYSBkZWVwIGxpbmtcbiAgICAgIGNvbnN0IGlnbm9yZVJvdXRlcyA9IFsnJywgJ2Rhc2hib2FyZCcsICdpbmRleC5odG1sJ10ubWFwKChzKSA9PiBgJHtVdGlscy5nZXRCYXNlSHJlZigpfSR7c31gLnJlcGxhY2UoJy8vJywgJy8nKSk7XG4gICAgICBjb25zdCBjdXJyZW50Um91dGUgPSB0aGlzLnJvdXRlV2l0aEJhc2VIcmVmKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCk7XG5cbiAgICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCkgJiYgIWlnbm9yZVJvdXRlcy5pbmNsdWRlcyhjdXJyZW50Um91dGUpKSB7XG4gICAgICAgIC8vIGdldCBwZXJzaXN0ZWQgcm91dGVzIHRvIGRlY2lkZSB3aGVyZSB0byByZWRpcmVjdCB0aGUgbG9nZ2VkIGluIHVzZXIgdG9cbiAgICAgICAgdGhpcy5hdXRoXG4gICAgICAgICAgLmdldEluaXRpYWxSZXF1ZXN0VXJpKClcbiAgICAgICAgICAucGlwZShzd2l0Y2hNYXAoKHJlcykgPT4gdGhpcy5hdXRoLnJlc2V0SW5pdGlhbFJlcXVlc3RVcmkoKS5waXBlKG1hcCgoXykgPT4gcmVzKSkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlczogeyB1cmk6IHN0cmluZzsgdGltZXN0YW1wOiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9naW5SZXMgPSByZXMgJiYgIWlnbm9yZVJvdXRlcy5pbmNsdWRlcyhyZXMudXJpKSA/IHJlcyA6IG51bGw7XG4gICAgICAgICAgICBpZiAobG9naW5SZXMpIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobG9naW5SZXMudXJpKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJvdXRlV2l0aEJhc2VIcmVmKHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1V0aWxzLmdldEJhc2VIcmVmKCl9JHtyfWAucmVwbGFjZSgnLy8nLCAnLycpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jc2hlbGwuX2luaXQoKTtcbiAgICBjbGllbnRTaGVsbFJvdXRlcy5mb3JFYWNoKChyb3V0ZTogUm91dGUpID0+IHtcbiAgICAgIHRoaXMucm91dGVyLmNvbmZpZy5wdXNoKHJvdXRlKTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlci5yZXNldENvbmZpZyh0aGlzLnJvdXRlci5jb25maWcpO1xuICAgIHRoaXMuX3NldENvbW1hbmRzKCk7XG4gICAgdGhpcy5yZXF1ZXN0U3Vic2NyaXB0aW9uKCk7XG4gIH1cbn1cbiIsIjx5dXYtbWV0YWRhdGEtZGVmYXVsdC10ZW1wbGF0ZXM+PC95dXYtbWV0YWRhdGEtZGVmYXVsdC10ZW1wbGF0ZXM+XG48IS0tIDx5dXYtZm9jdXMtaW5kaWNhdG9yIC8+IC0tPlxuXG48IS0tIGdsb2FibCBidXN5IGluZGljYXRvciAtLT5cbkBpZiAoYnVzeSQgfCBhc3luYykge1xuICA8ZGl2IGNsYXNzPVwieXV2LWxvYWRlci1saW5lYXJcIj48L2Rpdj5cbn1cbjxuYXYgY2xhc3M9XCJhcHBzXCIgW2luZXJ0XT1cImFzaWRlT3V0bGV0LmlzQWN0aXZhdGVkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCIneXV2LnNoZWxsLm5hdmlhZ3Rpb24uYXJpYS5sYWJlbCcgfCB0cmFuc2xhdGVcIj5cbiAgPGRpdiBjbGFzcz1cImFwcC1pY29uXCI+XG4gICAgPGJ1dHRvbiByb3V0ZXJMaW5rPVwiL1wiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIid5dXYuc2hlbGwubG9nby5hcmlhLmxhYmVsJyB8IHRyYW5zbGF0ZVwiPlxuICAgICAgPHl2Yy1pY29uIFtzdmddPVwic2hlbGxDb25maWcoKS5pY29ucyEuYXBwSWNvbiFcIj48L3l2Yy1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPHVsIGNsYXNzPVwiYXBwc1wiPlxuICAgIEBmb3IgKGEgb2YgYXBwcygpOyB0cmFjayBhLnBhdGgpIHtcbiAgICAgIDxsaT5cbiAgICAgICAgPGJ1dHRvbiByb3V0ZXJMaW5rQWN0aXZlPVwiYWN0aXZlXCIgW3JvdXRlckxpbmtdPVwiYS5wYXRoXCIgdGl0bGU9XCJ7eyBhLnRpdGxlIH19XCI+XG4gICAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwiYS5pY29uXCIgdGl0bGU9XCJ7eyBhLnRpdGxlIH19XCIgKm5nSWY9XCJhLmljb25cIj48L3l2Yy1pY29uPlxuICAgICAgICAgIDwhLS0gQGlmIChnZXROb3RpZmljYXRpb25zKGEuaWQpKSB7XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIidiYWRnZSAnICsgZ2V0Tm90aWZpY2F0aW9ucyhhLmlkKS5tYXhMZXZlbFwiPnt7IGdldE5vdGlmaWNhdGlvbnMoYS5pZCkuY291bnQgfX08L2Rpdj5cbiAgICAgICAgICB9IC0tPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgfVxuICA8L3VsPlxuXG4gIDxzZWN0aW9uIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgIEBpZiAoc2hvd05vdGlmaWNhdGlvbnMoKSkge1xuICAgICAgPGJ1dHRvbiBbcm91dGVyTGlua109XCJbeyBvdXRsZXRzOiB7IGFzaWRlOiAnbm90aWZpY2F0aW9ucycgfSB9XVwiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIiB0aXRsZT1cInt7ICd5dXYuc2hlbGwubm90aWZpY2F0aW9ucy50aXRsZScgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwic2hlbGxDb25maWcoKS5pY29ucyEubm90aWZpY2F0aW9ucyFcIj48L3l2Yy1pY29uPlxuICAgICAgICBAaWYgKG5ld05vdGlmaWNhdGlvbnMoKTsgYXMgbm90ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSB7eyBub3RlLm1heExldmVsIH19XCI+e3sgbm90ZS5jb3VudCB9fTwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgPGJ1dHRvbiBbcm91dGVyTGlua109XCJbJy9zZXR0aW5ncyddXCIgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiIHRpdGxlPVwie3sgJ3l1di5zaGVsbC5zZXR0aW5ncy50aXRsZScgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgIDx5dmMtaWNvbiBbc3ZnXT1cInNoZWxsQ29uZmlnKCkuaWNvbnMhLnNldHRpbmdzIVwiPjwveXZjLWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiYXBwTG9nb3V0KClcIiB0aXRsZT1cInt7ICd5dXYuc2hlbGwuY21kLmxvZ291dCcgfCB0cmFuc2xhdGUgfX1cIj48eXZjLWljb24gW3N2Z109XCJzaGVsbENvbmZpZygpLmljb25zIS5sb2dvdXQhXCI+PC95dmMtaWNvbj48L2J1dHRvbj5cbiAgPC9zZWN0aW9uPlxuPC9uYXY+XG48bWFpbiBpZD1cIm1haW4tc2hlbGxfY29udGVudFwiIGFyaWEtbGFiZWw9XCJtYWluIHNoZWxsIGNvbnRlbnRcIiBbaW5lcnRdPVwiYXNpZGVPdXRsZXQuaXNBY3RpdmF0ZWRcIj5cbiAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuPC9tYWluPlxuXG48IS0tIG91dGxldCBmb3IgYXNpZGUgbW9kYWxzIGxpa2Ugbm90aWZpY2F0aW9ucyAtLT5cbjxkaXYgY2xhc3M9XCJhc2lkZU91dGxldFwiIFtoaWRkZW5dPVwiIWFzaWRlT3V0bGV0LmlzQWN0aXZhdGVkXCI+XG4gIDxyb3V0ZXItb3V0bGV0IG5hbWU9XCJhc2lkZVwiICNhc2lkZU91dGxldD1cIm91dGxldFwiPjwvcm91dGVyLW91dGxldD5cbjwvZGl2PlxuXG48ZGl2IGlkPVwiZmlcIiBpbmVydD48L2Rpdj5cbiJdfQ==
@@ -1,18 +0,0 @@
1
- import { Component, input } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { YvcIconModule } from '@yuuvis/components/icon';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@yuuvis/components/icon";
6
- export class AppLogoComponent {
7
- constructor() {
8
- this.icon = input();
9
- this.label = input.required();
10
- }
11
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppLogoComponent, isStandalone: true, selector: "yuv-app-logo", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@let ico = icon();\n@if(ico){\n<yvc-icon [svg]=\"ico\"></yvc-icon>\n}<span class=\"label\">{{label()}}</span>", styles: [":host{--band-color: var(--text-color-body);--band-height: var(--client-shell-bar-icon-size);--band-icon-size: 32px;--text-color: var(--main-background);--icon-color: var(--text-color);--icon-background-color: transparent;display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 1) 0 calc(var(--app-pane-padding) / 2);height:calc(var(--client-shell-bar-icon-size));font-size:var(--font-caption);line-height:1em;cursor:pointer;background-color:var(--band-color);color:var(--text-color)}:host yvc-icon{--icon-size: var(--band-icon-size);grid-column:2;grid-row:1;border-radius:4px;margin-inline-end:calc(var(--app-pane-padding) / 2);opacity:.5;color:var(--icon-color);background-color:var(--icon-background-color)}:host .label{line-height:1em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i1.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }] }); }
13
- }
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppLogoComponent, decorators: [{
15
- type: Component,
16
- args: [{ selector: 'yuv-app-logo', standalone: true, imports: [CommonModule, YvcIconModule], template: "@let ico = icon();\n@if(ico){\n<yvc-icon [svg]=\"ico\"></yvc-icon>\n}<span class=\"label\">{{label()}}</span>", styles: [":host{--band-color: var(--text-color-body);--band-height: var(--client-shell-bar-icon-size);--band-icon-size: 32px;--text-color: var(--main-background);--icon-color: var(--text-color);--icon-background-color: transparent;display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 1) 0 calc(var(--app-pane-padding) / 2);height:calc(var(--client-shell-bar-icon-size));font-size:var(--font-caption);line-height:1em;cursor:pointer;background-color:var(--band-color);color:var(--text-color)}:host yvc-icon{--icon-size: var(--band-icon-size);grid-column:2;grid-row:1;border-radius:4px;margin-inline-end:calc(var(--app-pane-padding) / 2);opacity:.5;color:var(--icon-color);background-color:var(--icon-background-color)}:host .label{line-height:1em}\n"] }]
17
- }] });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWxvZ28uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvY29tcG9uZW50cy9hcHAtbG9nby9hcHAtbG9nby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9jb21wb25lbnRzL2FwcC1sb2dvL2FwcC1sb2dvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQVN4RCxNQUFNLE9BQU8sZ0JBQWdCO0lBUDdCO1FBUUUsU0FBSSxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQ3ZCLFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7S0FDbEM7K0dBSFksZ0JBQWdCO21HQUFoQixnQkFBZ0IsZ1VDWDdCLCtHQUd1Qyw4eUJESTNCLFlBQVksOEJBQUUsYUFBYTs7NEZBSTFCLGdCQUFnQjtrQkFQNUIsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBZdmNJY29uTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2ljb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dXYtYXBwLWxvZ28nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBZdmNJY29uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC1sb2dvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2FwcC1sb2dvLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBBcHBMb2dvQ29tcG9uZW50IHtcbiAgaWNvbiA9IGlucHV0PHN0cmluZz4oKTtcbiAgbGFiZWwgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG59XG4iLCJAbGV0IGljbyA9IGljb24oKTtcbkBpZihpY28pe1xuPHl2Yy1pY29uIFtzdmddPVwiaWNvXCI+PC95dmMtaWNvbj5cbn08c3BhbiBjbGFzcz1cImxhYmVsXCI+e3tsYWJlbCgpfX08L3NwYW4+Il19
@@ -1,26 +0,0 @@
1
- import { Directive, ElementRef, effect, inject, input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class InertDirective {
4
- constructor() {
5
- this.elRef = inject(ElementRef);
6
- this.inert = input(false);
7
- effect(() => {
8
- const el = this.elRef.nativeElement;
9
- if (this.inert())
10
- el.setAttribute('inert', 'true');
11
- else
12
- el.removeAttribute('inert');
13
- });
14
- }
15
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InertDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
16
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: InertDirective, isStandalone: true, selector: "[inert]", inputs: { inert: { classPropertyName: "inert", publicName: "inert", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
17
- }
18
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InertDirective, decorators: [{
19
- type: Directive,
20
- args: [{
21
- // eslint-disable-next-line @angular-eslint/directive-selector
22
- selector: '[inert]',
23
- standalone: true
24
- }]
25
- }], ctorParameters: () => [] });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5lcnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvZGlyZWN0aXZlcy9pbmVydC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTzdFLE1BQU0sT0FBTyxjQUFjO0lBS3pCO1FBSlEsVUFBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuQyxVQUFLLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRzVCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLEVBQUUsR0FBZ0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUE0QixDQUFDO1lBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQzs7Z0JBQzlDLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQVhVLGNBQWM7bUdBQWQsY0FBYzs7NEZBQWQsY0FBYztrQkFMMUIsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSxTQUFTO29CQUNuQixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbaW5lcnRdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJbmVydERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgZWxSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgaW5lcnQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICh0aGlzLmluZXJ0KCkpIGVsLnNldEF0dHJpYnV0ZSgnaW5lcnQnLCAndHJ1ZScpO1xuICAgICAgZWxzZSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2luZXJ0Jyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,15 +0,0 @@
1
- import { DashboardPageComponent } from './pages/dashboard/dashboard.component';
2
- import { SettingsPageComponent } from './pages/settings/settings.component';
3
- import { NotificationsPageComponent } from './pages/notifications/notifications.component';
4
- import { WebShareTargetPageComponent } from './pages/web-share-target/web-share-target.component';
5
- export const clientShellRoutes = [
6
- { path: 'dashboard', component: DashboardPageComponent },
7
- { path: 'notifications', component: NotificationsPageComponent, outlet: 'aside' },
8
- { path: 'settings', component: SettingsPageComponent },
9
- { path: 'web-share-target', component: WebShareTargetPageComponent },
10
- // default route
11
- { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
12
- // redirecting route
13
- { path: '**', redirectTo: '/' }
14
- ];
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLnJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMvbGliL2xpYi5yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFFbEcsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVk7SUFDeEMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRTtJQUN4RCxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDakYsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRTtJQUN0RCxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsMkJBQTJCLEVBQUU7SUFDcEUsZ0JBQWdCO0lBQ2hCLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7SUFDekQsb0JBQW9CO0lBQ3BCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFO0NBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEYXNoYm9hcmRQYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9wYWdlcy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZXR0aW5nc1BhZ2VDb21wb25lbnQgfSBmcm9tICcuL3BhZ2VzL3NldHRpbmdzL3NldHRpbmdzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zUGFnZUNvbXBvbmVudCB9IGZyb20gJy4vcGFnZXMvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXZWJTaGFyZVRhcmdldFBhZ2VDb21wb25lbnQgfSBmcm9tICcuL3BhZ2VzL3dlYi1zaGFyZS10YXJnZXQvd2ViLXNoYXJlLXRhcmdldC5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgY2xpZW50U2hlbGxSb3V0ZXM6IFJvdXRlW10gPSBbXG4gIHsgcGF0aDogJ2Rhc2hib2FyZCcsIGNvbXBvbmVudDogRGFzaGJvYXJkUGFnZUNvbXBvbmVudCB9LFxuICB7IHBhdGg6ICdub3RpZmljYXRpb25zJywgY29tcG9uZW50OiBOb3RpZmljYXRpb25zUGFnZUNvbXBvbmVudCwgb3V0bGV0OiAnYXNpZGUnIH0sXG4gIHsgcGF0aDogJ3NldHRpbmdzJywgY29tcG9uZW50OiBTZXR0aW5nc1BhZ2VDb21wb25lbnQgfSxcbiAgeyBwYXRoOiAnd2ViLXNoYXJlLXRhcmdldCcsIGNvbXBvbmVudDogV2ViU2hhcmVUYXJnZXRQYWdlQ29tcG9uZW50IH0sXG4gIC8vIGRlZmF1bHQgcm91dGVcbiAgeyBwYXRoOiAnJywgcmVkaXJlY3RUbzogJy9kYXNoYm9hcmQnLCBwYXRoTWF0Y2g6ICdmdWxsJyB9LFxuICAvLyByZWRpcmVjdGluZyByb3V0ZVxuICB7IHBhdGg6ICcqKicsIHJlZGlyZWN0VG86ICcvJyB9XG5dO1xuIl19
@@ -1,11 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DashboardPageComponent {
4
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DashboardPageComponent, selector: "yuv-dashboard", ngImport: i0, template: "yuuvis Momentum\n", styles: [":host{display:grid;align-items:center;justify-content:center;height:100%;overflow:hidden;color:var(--text-color-hint);font-size:var(--font-display)}\n"] }); }
6
- }
7
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardPageComponent, decorators: [{
8
- type: Component,
9
- args: [{ selector: 'yuv-dashboard', template: "yuuvis Momentum\n", styles: [":host{display:grid;align-items:center;justify-content:center;height:100%;overflow:hidden;color:var(--text-color-hint);font-size:var(--font-display)}\n"] }]
10
- }] });
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMvbGliL3BhZ2VzL2Rhc2hib2FyZC9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8xQyxNQUFNLE9BQU8sc0JBQXNCOytHQUF0QixzQkFBc0I7bUdBQXRCLHNCQUFzQixxRENQbkMsbUJBQ0E7OzRGRE1hLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3l1di1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkUGFnZUNvbXBvbmVudCB7fVxuIiwieXV1dmlzIE1vbWVudHVtXG4iXX0=
@@ -1,82 +0,0 @@
1
- import { CdkTrapFocus } from '@angular/cdk/a11y';
2
- import { CommonModule } from '@angular/common';
3
- import { Component, ElementRef, HostListener, effect, inject } from '@angular/core';
4
- import { toSignal } from '@angular/core/rxjs-interop';
5
- import { Router } from '@angular/router';
6
- import { LocaleDatePipe, TranslateModule, Utils } from '@yuuvis/client-core';
7
- import { LightDismissDirective } from '@yuuvis/client-framework/common';
8
- import { YUV_ICONS } from '@yuuvis/client-framework/icons';
9
- import { ListComponent, ListItemDirective } from '@yuuvis/client-framework/list';
10
- import { ShellNotificationsService } from '@yuuvis/client-shell-core';
11
- import { ICONS, YvcIconModule } from '@yuuvis/components/icon';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/common";
14
- import * as i2 from "@yuuvis/components/icon";
15
- import * as i3 from "@yuuvis/client-core";
16
- export class NotificationsPageComponent {
17
- constructor() {
18
- this.router = inject(Router);
19
- this.shellNotifications = inject(ShellNotificationsService);
20
- this.elRef = inject(ElementRef);
21
- this._focusedIndex = -1;
22
- this._notificationIDs = [];
23
- this.notifications = toSignal(this.shellNotifications.shellNotifications$);
24
- this.notificationsIdEffect = effect(() => (this._notificationIDs = (this.notifications() || []).map((n) => n.id)));
25
- this.icons = {
26
- close: ICONS.clear,
27
- trash: YUV_ICONS.trash,
28
- note: YUV_ICONS.notification
29
- };
30
- }
31
- onKeydown(event) {
32
- switch (event.code) {
33
- case 'Delete': {
34
- if (this._focusedIndex >= 0)
35
- this.remove(this._notificationIDs[this._focusedIndex]);
36
- break;
37
- }
38
- }
39
- }
40
- async itemSelected(idx) {
41
- const n = this.shellNotifications.getNotificationById(this._notificationIDs[idx[0]]);
42
- if (n?.targetRoute) {
43
- await this.close();
44
- this.router.navigateByUrl(n.targetRoute, { replaceUrl: true });
45
- if (n.removeOnTargetRouteNavigated)
46
- this.remove(n.id);
47
- }
48
- }
49
- itemFocused(index) {
50
- this._focusedIndex = index;
51
- }
52
- remove(id) {
53
- if (id)
54
- this.shellNotifications.remove(id);
55
- }
56
- removeAll() {
57
- this.shellNotifications.removeAll();
58
- }
59
- close() {
60
- return this.router.navigate([{ outlets: { aside: null } }], {
61
- replaceUrl: true
62
- });
63
- }
64
- ngOnInit() {
65
- this.shellNotifications.markAllAsSeen();
66
- setTimeout(() => {
67
- const fc = Utils.getFocusableChildren(this.elRef.nativeElement);
68
- if (fc.length)
69
- fc[0].focus();
70
- });
71
- }
72
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NotificationsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
73
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: NotificationsPageComponent, isStandalone: true, selector: "yuv-notifications", host: { listeners: { "keydown": "onKeydown($event)" } }, ngImport: i0, template: "<div class=\"notifications\" (yuvLightDismiss)=\"close()\" cdkTrapFocus>\n <h2>{{ 'yuv.shell.notifications.title' | translate }}</h2>\n\n @if (notifications()?.length) {\n <yuv-list (itemSelect)=\"itemSelected($event)\" (itemFocus)=\"itemFocused($event)\">\n @for (n of notifications(); track n.id) {\n <div class=\"note {{ n.level }}\" [ngClass]=\"{ withRoute: n.targetRoute }\" yuvListItem>\n <div class=\"icon\"><yvc-icon [svg]=\"n.icon || icons.note\"></yvc-icon></div>\n <div class=\"received\">{{ n.timestamp | localeDate }}</div>\n <div class=\"title\">{{ n.title }}</div>\n <div class=\"description\">{{ n.description }}</div>\n <div class=\"meta\"></div>\n\n <div class=\"actions\">\n <button (click)=\"remove(n.id)\">\n <yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n </div>\n }\n </yuv-list>\n\n <div class=\"actions\">\n <button [hidden]=\"!notifications()?.length\" class=\"icon secondary\" (click)=\"removeAll()\">\n {{ 'yuv.shell.notifications.button.remove.all' | translate }}<yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ 'yuv.shell.notifications.empty' | translate }}</p>\n </div>\n }\n\n <button class=\"icon close\" (click)=\"close()\">\n <yvc-icon [svg]=\"icons.close\"></yvc-icon>\n </button>\n</div>\n", styles: [":host{height:100%;display:flex}:host .notifications{background-color:var(--panel-background-lightgrey);border-inline-end:1px solid var(--panel-divider-color);height:100%;overflow:hidden;box-sizing:border-box;padding:var(--app-pane-padding);display:grid;grid-template-rows:auto auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"title close\" \"actions actions\" \"list list\";gap:var(--app-pane-padding);max-width:30vw;min-width:300px;box-shadow:8px 0 8px #0000001a;animation:dialogAppear .2s ease-in-out}:host .notifications h2{color:var(--text-color-caption);grid-area:title;margin:0;padding:0;align-self:center;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .notifications .actions{grid-area:actions;display:flex;justify-content:end;--icon-size: 18px}:host .notifications .actions button{border-radius:.4em}:host .notifications .close{grid-area:close;--icon-size: 18px}:host .notifications yuv-list,:host .notifications .empty{grid-area:list}:host .notifications .empty{display:grid;align-items:center;justify-content:center;color:var(--text-color-caption)}:host .notifications .note{--level-color: transparent;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:auto 1fr auto;grid-template-areas:\"icon received actions\" \"icon title title\" \"icon description description\" \"icon meta meta\";row-gap:calc(var(--app-pane-padding) / 4);column-gap:calc(var(--app-pane-padding) / 2);align-items:center;padding:calc(var(--app-pane-padding) / 2);padding-inline-start:var(--app-pane-padding);margin-block-end:calc(var(--app-pane-padding) / 2);background-color:var(--panel-background);outline:1px solid var(--panel-divider-color);outline-offset:-1px;position:relative;cursor:default}:host .notifications .note.withRoute{cursor:pointer}:host .notifications .note:before{content:\"\";width:4px;position:absolute;left:2px;top:2px;bottom:2px;border-radius:2px;background-color:var(--level-color)}:host .notifications .note.alert{--level-color: var(--color-error)}:host .notifications .note.warning{--level-color: var(--color-warning)}:host .notifications .note.success{--level-color: var(--color-success)}:host .notifications .note:hover,:host .notifications .note[aria-current=true]{background-color:var(--item-focus-background-color)}:host .notifications .note:hover button,:host .notifications .note[aria-current=true] button{opacity:1}:host .notifications .note .icon{grid-area:icon;color:var(--text-color-caption)}:host .notifications .note .title{overflow:hidden;text-overflow:ellipsis;font-weight:700;grid-area:title;color:var(--text-color-body)}:host .notifications .note .description{grid-area:description;overflow:hidden;text-overflow:ellipsis}:host .notifications .note .meta{grid-area:meta}:host .notifications .note .received{grid-area:received;color:var(--text-color-caption)}:host .notifications .note button{grid-area:actions;padding:0;opacity:0}:host .notifications .note button yvc-icon{width:18px;height:18px}@keyframes dialogAppear{0%{opacity:0;transform:translate(calc(var(--app-pane-padding) * -1))}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: LightDismissDirective, selector: "[yuvLightDismiss]", outputs: ["yuvLightDismiss"] }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i2.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ListComponent, selector: "yuv-list", inputs: ["multiselect", "selfHandleSelection", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "directive", type: ListItemDirective, selector: "[yuvListItem]", inputs: ["disabled", "active", "selected"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
74
- }
75
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NotificationsPageComponent, decorators: [{
76
- type: Component,
77
- args: [{ selector: 'yuv-notifications', standalone: true, imports: [CommonModule, LightDismissDirective, LocaleDatePipe, YvcIconModule, CdkTrapFocus, ListComponent, ListItemDirective, TranslateModule], template: "<div class=\"notifications\" (yuvLightDismiss)=\"close()\" cdkTrapFocus>\n <h2>{{ 'yuv.shell.notifications.title' | translate }}</h2>\n\n @if (notifications()?.length) {\n <yuv-list (itemSelect)=\"itemSelected($event)\" (itemFocus)=\"itemFocused($event)\">\n @for (n of notifications(); track n.id) {\n <div class=\"note {{ n.level }}\" [ngClass]=\"{ withRoute: n.targetRoute }\" yuvListItem>\n <div class=\"icon\"><yvc-icon [svg]=\"n.icon || icons.note\"></yvc-icon></div>\n <div class=\"received\">{{ n.timestamp | localeDate }}</div>\n <div class=\"title\">{{ n.title }}</div>\n <div class=\"description\">{{ n.description }}</div>\n <div class=\"meta\"></div>\n\n <div class=\"actions\">\n <button (click)=\"remove(n.id)\">\n <yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n </div>\n }\n </yuv-list>\n\n <div class=\"actions\">\n <button [hidden]=\"!notifications()?.length\" class=\"icon secondary\" (click)=\"removeAll()\">\n {{ 'yuv.shell.notifications.button.remove.all' | translate }}<yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ 'yuv.shell.notifications.empty' | translate }}</p>\n </div>\n }\n\n <button class=\"icon close\" (click)=\"close()\">\n <yvc-icon [svg]=\"icons.close\"></yvc-icon>\n </button>\n</div>\n", styles: [":host{height:100%;display:flex}:host .notifications{background-color:var(--panel-background-lightgrey);border-inline-end:1px solid var(--panel-divider-color);height:100%;overflow:hidden;box-sizing:border-box;padding:var(--app-pane-padding);display:grid;grid-template-rows:auto auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"title close\" \"actions actions\" \"list list\";gap:var(--app-pane-padding);max-width:30vw;min-width:300px;box-shadow:8px 0 8px #0000001a;animation:dialogAppear .2s ease-in-out}:host .notifications h2{color:var(--text-color-caption);grid-area:title;margin:0;padding:0;align-self:center;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .notifications .actions{grid-area:actions;display:flex;justify-content:end;--icon-size: 18px}:host .notifications .actions button{border-radius:.4em}:host .notifications .close{grid-area:close;--icon-size: 18px}:host .notifications yuv-list,:host .notifications .empty{grid-area:list}:host .notifications .empty{display:grid;align-items:center;justify-content:center;color:var(--text-color-caption)}:host .notifications .note{--level-color: transparent;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:auto 1fr auto;grid-template-areas:\"icon received actions\" \"icon title title\" \"icon description description\" \"icon meta meta\";row-gap:calc(var(--app-pane-padding) / 4);column-gap:calc(var(--app-pane-padding) / 2);align-items:center;padding:calc(var(--app-pane-padding) / 2);padding-inline-start:var(--app-pane-padding);margin-block-end:calc(var(--app-pane-padding) / 2);background-color:var(--panel-background);outline:1px solid var(--panel-divider-color);outline-offset:-1px;position:relative;cursor:default}:host .notifications .note.withRoute{cursor:pointer}:host .notifications .note:before{content:\"\";width:4px;position:absolute;left:2px;top:2px;bottom:2px;border-radius:2px;background-color:var(--level-color)}:host .notifications .note.alert{--level-color: var(--color-error)}:host .notifications .note.warning{--level-color: var(--color-warning)}:host .notifications .note.success{--level-color: var(--color-success)}:host .notifications .note:hover,:host .notifications .note[aria-current=true]{background-color:var(--item-focus-background-color)}:host .notifications .note:hover button,:host .notifications .note[aria-current=true] button{opacity:1}:host .notifications .note .icon{grid-area:icon;color:var(--text-color-caption)}:host .notifications .note .title{overflow:hidden;text-overflow:ellipsis;font-weight:700;grid-area:title;color:var(--text-color-body)}:host .notifications .note .description{grid-area:description;overflow:hidden;text-overflow:ellipsis}:host .notifications .note .meta{grid-area:meta}:host .notifications .note .received{grid-area:received;color:var(--text-color-caption)}:host .notifications .note button{grid-area:actions;padding:0;opacity:0}:host .notifications .note button yvc-icon{width:18px;height:18px}@keyframes dialogAppear{0%{opacity:0;transform:translate(calc(var(--app-pane-padding) * -1))}to{opacity:1;transform:translate(0)}}\n"] }]
78
- }], propDecorators: { onKeydown: [{
79
- type: HostListener,
80
- args: ['keydown', ['$event']]
81
- }] } });
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9wYWdlcy9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBUy9ELE1BQU0sT0FBTywwQkFBMEI7SUFQ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Q0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFEVSwwQkFBMEI7bUdBQTFCLDBCQUEwQixzSUNuQnZDLHM4Q0FxQ0EsbW5HRHRCWSxZQUFZLDZIQUFFLHFCQUFxQix1RkFBRSxjQUFjLGtEQUFFLGFBQWEsK0hBQUUsWUFBWSw0SUFBRSxhQUFhLCtKQUFFLGlCQUFpQixxR0FBRSxlQUFlOzs0RkFJbEksMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQzs4QkFvQnpHLFNBQVM7c0JBQTdDLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVHJhcEZvY3VzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPbkluaXQsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhbGVEYXRlUGlwZSwgVHJhbnNsYXRlTW9kdWxlLCBVdGlscyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgTGlnaHREaXNtaXNzRGlyZWN0aXZlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL2NvbW1vbic7XG5pbXBvcnQgeyBZVVZfSUNPTlMgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvaWNvbnMnO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvbGlzdCc7XG5pbXBvcnQgeyBTaGVsbE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtc2hlbGwtY29yZSc7XG5pbXBvcnQgeyBJQ09OUywgWXZjSWNvbk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LW5vdGlmaWNhdGlvbnMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBMaWdodERpc21pc3NEaXJlY3RpdmUsIExvY2FsZURhdGVQaXBlLCBZdmNJY29uTW9kdWxlLCBDZGtUcmFwRm9jdXMsIExpc3RDb21wb25lbnQsIExpc3RJdGVtRGlyZWN0aXZlLCBUcmFuc2xhdGVNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgc2hlbGxOb3RpZmljYXRpb25zID0gaW5qZWN0KFNoZWxsTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIGVsUmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIHByaXZhdGUgX2ZvY3VzZWRJbmRleCA9IC0xO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25JRHM6IHN0cmluZ1tdID0gW107XG4gIG5vdGlmaWNhdGlvbnMgPSB0b1NpZ25hbCh0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5zaGVsbE5vdGlmaWNhdGlvbnMkKTtcbiAgbm90aWZpY2F0aW9uc0lkRWZmZWN0ID0gZWZmZWN0KCgpID0+ICh0aGlzLl9ub3RpZmljYXRpb25JRHMgPSAodGhpcy5ub3RpZmljYXRpb25zKCkgfHwgW10pLm1hcCgobikgPT4gbi5pZCkpKTtcblxuICBpY29ucyA9IHtcbiAgICBjbG9zZTogSUNPTlMuY2xlYXIsXG4gICAgdHJhc2g6IFlVVl9JQ09OUy50cmFzaCxcbiAgICBub3RlOiBZVVZfSUNPTlMubm90aWZpY2F0aW9uXG4gIH07XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRGVsZXRlJzoge1xuICAgICAgICBpZiAodGhpcy5fZm9jdXNlZEluZGV4ID49IDApIHRoaXMucmVtb3ZlKHRoaXMuX25vdGlmaWNhdGlvbklEc1t0aGlzLl9mb2N1c2VkSW5kZXhdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXRlbVNlbGVjdGVkKGlkeDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBuID0gdGhpcy5zaGVsbE5vdGlmaWNhdGlvbnMuZ2V0Tm90aWZpY2F0aW9uQnlJZCh0aGlzLl9ub3RpZmljYXRpb25JRHNbaWR4WzBdXSk7XG4gICAgaWYgKG4/LnRhcmdldFJvdXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKG4udGFyZ2V0Um91dGUsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgIGlmIChuLnJlbW92ZU9uVGFyZ2V0Um91dGVOYXZpZ2F0ZWQpIHRoaXMucmVtb3ZlKG4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIGl0ZW1Gb2N1c2VkKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9mb2N1c2VkSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHJlbW92ZShpZDogc3RyaW5nKSB7XG4gICAgaWYgKGlkKSB0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5yZW1vdmUoaWQpO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMuc2hlbGxOb3RpZmljYXRpb25zLnJlbW92ZUFsbCgpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFt7IG91dGxldHM6IHsgYXNpZGU6IG51bGwgfSB9XSwge1xuICAgICAgcmVwbGFjZVVybDogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zaGVsbE5vdGlmaWNhdGlvbnMubWFya0FsbEFzU2VlbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZmM6IEhUTUxFbGVtZW50W10gPSBVdGlscy5nZXRGb2N1c2FibGVDaGlsZHJlbih0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICBpZiAoZmMubGVuZ3RoKSBmY1swXS5mb2N1cygpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uc1wiICh5dXZMaWdodERpc21pc3MpPVwiY2xvc2UoKVwiIGNka1RyYXBGb2N1cz5cbiAgPGgyPnt7ICd5dXYuc2hlbGwubm90aWZpY2F0aW9ucy50aXRsZScgfCB0cmFuc2xhdGUgfX08L2gyPlxuXG4gIEBpZiAobm90aWZpY2F0aW9ucygpPy5sZW5ndGgpIHtcbiAgICA8eXV2LWxpc3QgKGl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdGVkKCRldmVudClcIiAoaXRlbUZvY3VzKT1cIml0ZW1Gb2N1c2VkKCRldmVudClcIj5cbiAgICAgIEBmb3IgKG4gb2Ygbm90aWZpY2F0aW9ucygpOyB0cmFjayBuLmlkKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RlIHt7IG4ubGV2ZWwgfX1cIiBbbmdDbGFzc109XCJ7IHdpdGhSb3V0ZTogbi50YXJnZXRSb3V0ZSB9XCIgeXV2TGlzdEl0ZW0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj48eXZjLWljb24gW3N2Z109XCJuLmljb24gfHwgaWNvbnMubm90ZVwiPjwveXZjLWljb24+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlY2VpdmVkXCI+e3sgbi50aW1lc3RhbXAgfCBsb2NhbGVEYXRlIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgbi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7IG4uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0YVwiPjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZShuLmlkKVwiPlxuICAgICAgICAgICAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy50cmFzaFwiPjwveXZjLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC95dXYtbGlzdD5cblxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uIFtoaWRkZW5dPVwiIW5vdGlmaWNhdGlvbnMoKT8ubGVuZ3RoXCIgY2xhc3M9XCJpY29uIHNlY29uZGFyeVwiIChjbGljayk9XCJyZW1vdmVBbGwoKVwiPlxuICAgICAgICB7eyAneXV2LnNoZWxsLm5vdGlmaWNhdGlvbnMuYnV0dG9uLnJlbW92ZS5hbGwnIHwgdHJhbnNsYXRlIH19PHl2Yy1pY29uIFtzdmddPVwiaWNvbnMudHJhc2hcIj48L3l2Yy1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH0gQGVsc2Uge1xuICAgIDxkaXYgY2xhc3M9XCJlbXB0eVwiPlxuICAgICAgPHA+e3sgJ3l1di5zaGVsbC5ub3RpZmljYXRpb25zLmVtcHR5JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxidXR0b24gY2xhc3M9XCJpY29uIGNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy5jbG9zZVwiPjwveXZjLWljb24+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
@@ -1,71 +0,0 @@
1
- import { Component, inject, signal } from '@angular/core';
2
- import { toSignal } from '@angular/core/rxjs-interop';
3
- import { ConfigService, TranslateModule, TranslateService, UserService } from '@yuuvis/client-core';
4
- import { CommonModule, DOCUMENT } from '@angular/common';
5
- import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
6
- import { ShellService } from '@yuuvis/client-shell-core';
7
- import { map } from 'rxjs';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common";
10
- import * as i2 from "@yuuvis/client-core";
11
- export class SettingsPageComponent {
12
- constructor() {
13
- this.userService = inject(UserService);
14
- this.config = inject(ConfigService);
15
- this.translate = inject(TranslateService);
16
- this.shell = inject(ShellService);
17
- this.document = inject(DOCUMENT);
18
- this.#fb = inject(FormBuilder);
19
- this.clientLocales = signal([]);
20
- this.clientVersion = signal(undefined);
21
- this.user = toSignal(this.userService.user$);
22
- this.appSettingForms$ = this.shell.appSettings$.pipe(map((settings) => settings.map((e) => {
23
- const x = {};
24
- const fcn = e.properties.map((p) => ({
25
- label: this.translate.instant(p.label) || p.label,
26
- name: p.name,
27
- type: p.type
28
- }));
29
- e.properties.forEach((p) => {
30
- x[p.name] = [p.value];
31
- });
32
- return {
33
- appID: e.appID,
34
- label: e.label,
35
- formControls: fcn,
36
- form: this.#fb.group(x)
37
- };
38
- })));
39
- }
40
- #fb;
41
- saveAppSettings(appID, form) {
42
- this.userService
43
- .saveUserSettings({
44
- clientAppSettings: {
45
- [appID]: form.value
46
- }
47
- })
48
- .subscribe({
49
- next: () => {
50
- form.markAsPristine();
51
- },
52
- error: (err) => {
53
- console.error('Error saving app settings', err);
54
- }
55
- });
56
- }
57
- changeClientLocale(iso) {
58
- this.userService.changeClientLocale(iso);
59
- }
60
- ngOnInit() {
61
- this.clientVersion.set(this.document.body.getAttribute('data-version') ?? 'dev');
62
- this.clientLocales.set(this.config.getClientLocales());
63
- }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SettingsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SettingsPageComponent, isStandalone: true, selector: "yuv-settings", ngImport: i0, template: "<header>\n <h1>{{ 'yuv.shell.settings.title' | translate }}</h1>\n <h4>{{ 'yuc.shell.settings.client.version' | translate }}: {{ clientVersion() }}</h4>\n</header>\n\n\n<main>@if (user()) {\n <section class=\"user\">\n <!-- <yuv-user-avatar class=\"background\" [user]=\"user()\"></yuv-user-avatar> -->\n <div class=\"user\">\n <div class=\"meta uname\">{{ user()!.username }}</div>\n <h2>{{ user()!.title }}</h2>\n <div class=\"meta uemail\">{{ user()!.email }}</div>\n <div class=\"meta utenant\">{{ 'yuv.shell.settings.tenant' | translate }}: {{ user()!.tenant }}</div>\n </div>\n </section>\n}\n <!-- language -->\n <section yuvOfflineDisabled>\n <div class=\"label\" translate>yuv.shell.settings.language</div>\n <div class=\"value buttons\">\n @for (locale of clientLocales(); track locale.iso) {\n <button class=\"toggle secondary\" (click)=\"changeClientLocale(locale.iso)\" [ngClass]=\"{ active: translate.currentLang === locale.iso }\">\n {{ locale.label }}\n </button>\n }\n </div>\n </section>\n\n <!-- app settings -->\n <!-- TODO: activate one feature is refined -->\n <!-- @for (c of appSettingForms$ | async; track $index) {\n <section>\n {{ c.label }}\n <form [formGroup]=\"c.form\" (ngSubmit)=\"saveAppSettings(c.appID, c.form)\">\n @for (n of c.formControls; track $index) {\n <label\n >{{ n.label }}\n\n @switch (n.type) {\n @case ('string') {\n <input type=\"text\" [formControlName]=\"n.name\" />\n }\n @case ('number') {\n <input type=\"number\" [formControlName]=\"n.name\" />\n }\n }\n </label>\n }\n <button [ngClass]=\"{ hideen: c.form.untouched }\" [disabled]=\"c.form.invalid\">Save</button>\n </form>\n </section>\n } -->\n</main>\n", styles: [":host{display:grid;grid-template-columns:1fr auto;grid-template-rows:auto 1fr;grid-template-areas:\"header\" \"settings\";height:100%;overflow:hidden;overflow-y:auto}:host header{grid-area:header;padding:calc(var(--app-pane-padding) * 2)}:host header h1,:host header h4{margin:0}:host header h1{font-size:var(--font-display);font-weight:400}:host header h4{font-size:var(--font-cation);font-weight:400;font-style:italic;color:var(--text-color-caption)}:host main{grid-area:settings;padding:var(--app-pane-padding);overflow-y:auto}:host main section{display:flex;flex-flow:column;padding:var(--app-pane-padding)}:host main section .label{margin-block-end:1em}:host main section .value{display:flex;flex-flow:row wrap;gap:calc(var(--app-pane-padding) / 4)}:host main section.user h2{margin:0 0 1rem;font-weight:400}:host button.active{background-color:var(--color-accent);color:var(--color-accent-tone);pointer-events:none}:host button.color.clear{padding:2px 8px}:host button.color.accent.active{outline:2px solid #fff;outline-offset:-2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
66
- }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SettingsPageComponent, decorators: [{
68
- type: Component,
69
- args: [{ selector: 'yuv-settings', standalone: true, imports: [CommonModule, TranslateModule, ReactiveFormsModule], template: "<header>\n <h1>{{ 'yuv.shell.settings.title' | translate }}</h1>\n <h4>{{ 'yuc.shell.settings.client.version' | translate }}: {{ clientVersion() }}</h4>\n</header>\n\n\n<main>@if (user()) {\n <section class=\"user\">\n <!-- <yuv-user-avatar class=\"background\" [user]=\"user()\"></yuv-user-avatar> -->\n <div class=\"user\">\n <div class=\"meta uname\">{{ user()!.username }}</div>\n <h2>{{ user()!.title }}</h2>\n <div class=\"meta uemail\">{{ user()!.email }}</div>\n <div class=\"meta utenant\">{{ 'yuv.shell.settings.tenant' | translate }}: {{ user()!.tenant }}</div>\n </div>\n </section>\n}\n <!-- language -->\n <section yuvOfflineDisabled>\n <div class=\"label\" translate>yuv.shell.settings.language</div>\n <div class=\"value buttons\">\n @for (locale of clientLocales(); track locale.iso) {\n <button class=\"toggle secondary\" (click)=\"changeClientLocale(locale.iso)\" [ngClass]=\"{ active: translate.currentLang === locale.iso }\">\n {{ locale.label }}\n </button>\n }\n </div>\n </section>\n\n <!-- app settings -->\n <!-- TODO: activate one feature is refined -->\n <!-- @for (c of appSettingForms$ | async; track $index) {\n <section>\n {{ c.label }}\n <form [formGroup]=\"c.form\" (ngSubmit)=\"saveAppSettings(c.appID, c.form)\">\n @for (n of c.formControls; track $index) {\n <label\n >{{ n.label }}\n\n @switch (n.type) {\n @case ('string') {\n <input type=\"text\" [formControlName]=\"n.name\" />\n }\n @case ('number') {\n <input type=\"number\" [formControlName]=\"n.name\" />\n }\n }\n </label>\n }\n <button [ngClass]=\"{ hideen: c.form.untouched }\" [disabled]=\"c.form.invalid\">Save</button>\n </form>\n </section>\n } -->\n</main>\n", styles: [":host{display:grid;grid-template-columns:1fr auto;grid-template-rows:auto 1fr;grid-template-areas:\"header\" \"settings\";height:100%;overflow:hidden;overflow-y:auto}:host header{grid-area:header;padding:calc(var(--app-pane-padding) * 2)}:host header h1,:host header h4{margin:0}:host header h1{font-size:var(--font-display);font-weight:400}:host header h4{font-size:var(--font-cation);font-weight:400;font-style:italic;color:var(--text-color-caption)}:host main{grid-area:settings;padding:var(--app-pane-padding);overflow-y:auto}:host main section{display:flex;flex-flow:column;padding:var(--app-pane-padding)}:host main section .label{margin-block-end:1em}:host main section .value{display:flex;flex-flow:row wrap;gap:calc(var(--app-pane-padding) / 4)}:host main section.user h2{margin:0 0 1rem;font-weight:400}:host button.active{background-color:var(--color-accent);color:var(--color-accent-tone);pointer-events:none}:host button.color.clear{padding:2px 8px}:host button.color.accent.active{outline:2px solid #fff;outline-offset:-2px}\n"] }]
70
- }] });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUErQixNQUFNLHFCQUFxQixDQUFDO0FBRWpJLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBNkMsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEcsT0FBTyxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7OztBQVN2QyxNQUFNLE9BQU8scUJBQXFCO0lBUGxDO1FBUVUsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QixhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFD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IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQsIFNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UsIFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSwgVXNlclNlcnZpY2UsIFl1dkNvbmZpZ0xhbmd1YWdlcywgWXV2VXNlciB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTaGVsbEFwcFNldHRpbmdQcm9wZXJ0eSwgU2hlbGxBcHBTZXR0aW5ncywgU2hlbGxTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtc2hlbGwtY29yZSc7XG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LXNldHRpbmdzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1BhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoQ29uZmlnU2VydmljZSk7XG4gIHB1YmxpYyB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgc2hlbGwgPSBpbmplY3QoU2hlbGxTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gICNmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG5cbiAgY2xpZW50TG9jYWxlcyA9IHNpZ25hbDxZdXZDb25maWdMYW5ndWFnZXNbXT4oW10pO1xuICBjbGllbnRWZXJzaW9uID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgdXNlcjogU2lnbmFsPFl1dlVzZXIgfCB1bmRlZmluZWQ+ID0gdG9TaWduYWwodGhpcy51c2VyU2VydmljZS51c2VyJCk7XG4gIGFwcFNldHRpbmdGb3JtcyQ6IE9ic2VydmFibGU8XG4gICAge1xuICAgICAgYXBwSUQ6IHN0cmluZztcbiAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICBmb3JtQ29udHJvbHM6IFNoZWxsQXBwU2V0dGluZ1Byb3BlcnR5W107XG4gICAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgfVtdXG4gID4gPSB0aGlzLnNoZWxsLmFwcFNldHRpbmdzJC5waXBlKFxuICAgIG1hcCgoc2V0dGluZ3M6IFNoZWxsQXBwU2V0dGluZ3NbXSkgPT5cbiAgICAgIHNldHRpbmdzLm1hcCgoZSkgPT4ge1xuICAgICAgICBjb25zdCB4OiBhbnkgPSB7fTtcbiAgICAgICAgY29uc3QgZmNuOiBTaGVsbEFwcFNldHRpbmdQcm9wZXJ0eVtdID0gZS5wcm9wZXJ0aWVzLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChwLmxhYmVsKSB8fCBwLmxhYmVsLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICB0eXBlOiBwLnR5cGVcbiAgICAgICAgfSkpO1xuICAgICAgICBlLnByb3BlcnRpZXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgIHhbcC5uYW1lXSA9IFtwLnZhbHVlXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwSUQ6IGUuYXBwSUQsXG4gICAgICAgICAgbGFiZWw6IGUubGFiZWwsXG4gICAgICAgICAgZm9ybUNvbnRyb2xzOiBmY24sXG4gICAgICAgICAgZm9ybTogdGhpcy4jZmIuZ3JvdXAoeClcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIHNhdmVBcHBTZXR0aW5ncyhhcHBJRDogc3RyaW5nLCBmb3JtOiBGb3JtR3JvdXApIHtcbiAgICB0aGlzLnVzZXJTZXJ2aWNlXG4gICAgICAuc2F2ZVVzZXJTZXR0aW5ncyh7XG4gICAgICAgIGNsaWVudEFwcFNldHRpbmdzOiB7XG4gICAgICAgICAgW2FwcElEXTogZm9ybS52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBmb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2F2aW5nIGFwcCBzZXR0aW5ncycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgY2hhbmdlQ2xpZW50TG9jYWxlKGlzbzogc3RyaW5nKSB7XG4gICAgdGhpcy51c2VyU2VydmljZS5jaGFuZ2VDbGllbnRMb2NhbGUoaXNvKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xpZW50VmVyc2lvbi5zZXQodGhpcy5kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS12ZXJzaW9uJykgPz8gJ2RldicpO1xuICAgIHRoaXMuY2xpZW50TG9jYWxlcy5zZXQodGhpcy5jb25maWcuZ2V0Q2xpZW50TG9jYWxlcygpKTtcbiAgfVxufVxuIiwiPGhlYWRlcj5cbiAgPGgxPnt7ICd5dXYuc2hlbGwuc2V0dGluZ3MudGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgPGg0Pnt7ICd5dWMuc2hlbGwuc2V0dGluZ3MuY2xpZW50LnZlcnNpb24nIHwgdHJhbnNsYXRlIH19OiB7eyBjbGllbnRWZXJzaW9uKCkgfX08L2g0PlxuPC9oZWFkZXI+XG5cblxuPG1haW4+QGlmICh1c2VyKCkpIHtcbiAgPHNlY3Rpb24gY2xhc3M9XCJ1c2VyXCI+XG4gICAgPCEtLSA8eXV2LXVzZXItYXZhdGFyIGNsYXNzPVwiYmFja2dyb3VuZFwiIFt1c2VyXT1cInVzZXIoKVwiPjwveXV2LXVzZXItYXZhdGFyPiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidXNlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1ldGEgdW5hbWVcIj57eyB1c2VyKCkhLnVzZXJuYW1lIH19PC9kaXY+XG4gICAgICA8aDI+e3sgdXNlcigpIS50aXRsZSB9fTwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWV0YSB1ZW1haWxcIj57eyB1c2VyKCkhLmVtYWlsIH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWV0YSB1dGVuYW50XCI+e3sgJ3l1di5zaGVsbC5zZXR0aW5ncy50ZW5hbnQnIHwgdHJhbnNsYXRlIH19OiB7eyB1c2VyKCkhLnRlbmFudCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG59XG4gIDwhLS0gbGFuZ3VhZ2UgLS0+XG4gIDxzZWN0aW9uIHl1dk9mZmxpbmVEaXNhYmxlZD5cbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIiB0cmFuc2xhdGU+eXV2LnNoZWxsLnNldHRpbmdzLmxhbmd1YWdlPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInZhbHVlIGJ1dHRvbnNcIj5cbiAgICAgIEBmb3IgKGxvY2FsZSBvZiBjbGllbnRMb2NhbGVzKCk7IHRyYWNrIGxvY2FsZS5pc28pIHtcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRvZ2dsZSBzZWNvbmRhcnlcIiAoY2xpY2spPVwiY2hhbmdlQ2xpZW50TG9jYWxlKGxvY2FsZS5pc28pXCIgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHRyYW5zbGF0ZS5jdXJyZW50TGFuZyA9PT0gbG9jYWxlLmlzbyB9XCI+XG4gICAgICAgICAge3sgbG9jYWxlLmxhYmVsIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG5cbiAgPCEtLSBhcHAgc2V0dGluZ3MgLS0+XG4gIDwhLS0gVE9ETzogYWN0aXZhdGUgb25lIGZlYXR1cmUgaXMgcmVmaW5lZCAtLT5cbiAgPCEtLSBAZm9yIChjIG9mIGFwcFNldHRpbmdGb3JtcyQgfCBhc3luYzsgdHJhY2sgJGluZGV4KSB7XG4gICAgPHNlY3Rpb24+XG4gICAgICB7eyBjLmxhYmVsIH19XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImMuZm9ybVwiIChuZ1N1Ym1pdCk9XCJzYXZlQXBwU2V0dGluZ3MoYy5hcHBJRCwgYy5mb3JtKVwiPlxuICAgICAgICBAZm9yIChuIG9mIGMuZm9ybUNvbnRyb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgID57eyBuLmxhYmVsIH19XG5cbiAgICAgICAgICAgIEBzd2l0Y2ggKG4udHlwZSkge1xuICAgICAgICAgICAgICBAY2FzZSAoJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIm4ubmFtZVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGNhc2UgKCdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIm4ubmFtZVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICB9XG4gICAgICAgIDxidXR0b24gW25nQ2xhc3NdPVwieyBoaWRlZW46IGMuZm9ybS51bnRvdWNoZWQgfVwiIFtkaXNhYmxlZF09XCJjLmZvcm0uaW52YWxpZFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L3NlY3Rpb24+XG4gIH0gLS0+XG48L21haW4+XG4iXX0=