@tolle_/tolle-ui 18.2.30 → 18.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/alert-dialog-dynamic.component.mjs +8 -3
- package/esm2022/lib/alert-dialog.component.mjs +39 -6
- package/esm2022/lib/alert-dialog.service.mjs +38 -6
- package/esm2022/lib/bar-list.component.mjs +95 -0
- package/esm2022/lib/category-bar.component.mjs +130 -0
- package/esm2022/lib/chart-spark.component.mjs +120 -0
- package/esm2022/lib/chart.component.mjs +131 -45
- package/esm2022/lib/chart.service.mjs +33 -8
- package/esm2022/lib/context-menu.service.mjs +11 -7
- package/esm2022/lib/modal-ref.mjs +36 -7
- package/esm2022/lib/modal.component.mjs +42 -28
- package/esm2022/lib/modal.mjs +2 -29
- package/esm2022/lib/modal.service.mjs +26 -4
- package/esm2022/lib/progress-circle.component.mjs +138 -0
- package/esm2022/lib/resizable-panel.component.mjs +5 -5
- package/esm2022/lib/segment.component.mjs +3 -3
- package/esm2022/lib/tracker.component.mjs +84 -0
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/tolle-ui.mjs +900 -139
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog-dynamic.component.d.ts +5 -0
- package/lib/alert-dialog.component.d.ts +13 -0
- package/lib/bar-list.component.d.ts +39 -0
- package/lib/category-bar.component.d.ts +49 -0
- package/lib/chart-spark.component.d.ts +49 -0
- package/lib/chart.component.d.ts +68 -9
- package/lib/chart.service.d.ts +25 -5
- package/lib/modal-ref.d.ts +6 -1
- package/lib/modal.component.d.ts +7 -4
- package/lib/modal.d.ts +9 -3
- package/lib/progress-circle.component.d.ts +35 -0
- package/lib/tracker.component.d.ts +39 -0
- package/package.json +3 -2
- package/preset.js +7 -1
- package/public-api.d.ts +5 -0
- package/registry/docs-content.json +330 -2
- package/registry/llms-full.txt +98 -2
- package/registry/llms.txt +5 -0
- package/registry/manifest.json +380 -3
- package/registry/r/alert-dialog-dynamic.json +1 -1
- package/registry/r/alert-dialog.json +1 -1
- package/registry/r/bar-list.json +21 -0
- package/registry/r/category-bar.json +21 -0
- package/registry/r/chart-pie.json +1 -1
- package/registry/r/chart-spark.json +30 -0
- package/registry/r/chart.json +2 -2
- package/registry/r/context-menu-trigger.json +1 -1
- package/registry/r/context-menu.json +1 -1
- package/registry/r/modal.json +3 -3
- package/registry/r/progress-circle.json +21 -0
- package/registry/r/resizable-panel.json +1 -1
- package/registry/r/segment.json +1 -1
- package/registry/r/tracker.json +25 -0
- package/registry/registry.json +112 -0
- package/theme.css +15 -3
|
@@ -6,6 +6,11 @@ import * as i0 from "@angular/core";
|
|
|
6
6
|
export class AlertDialogDynamicComponent {
|
|
7
7
|
config;
|
|
8
8
|
dialogRef;
|
|
9
|
+
/**
|
|
10
|
+
* Set by `AlertDialogService` once the dialog's result is ready, so the
|
|
11
|
+
* content panel plays its exit animation before the overlay is torn down.
|
|
12
|
+
*/
|
|
13
|
+
closing = false;
|
|
9
14
|
onOpenChange(open) {
|
|
10
15
|
if (!open) {
|
|
11
16
|
this.close(false);
|
|
@@ -16,7 +21,7 @@ export class AlertDialogDynamicComponent {
|
|
|
16
21
|
}
|
|
17
22
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertDialogDynamicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18
23
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AlertDialogDynamicComponent, isStandalone: true, selector: "tolle-alert-dialog-dynamic", ngImport: i0, template: `
|
|
19
|
-
<tolle-alert-dialog [open]="
|
|
24
|
+
<tolle-alert-dialog [open]="!closing" (openChange)="onOpenChange($event)">
|
|
20
25
|
<tolle-alert-dialog-content [size]="config.size || 'lg'">
|
|
21
26
|
<tolle-alert-dialog-header>
|
|
22
27
|
<tolle-alert-dialog-title>{{ config.title }}</tolle-alert-dialog-title>
|
|
@@ -52,7 +57,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
52
57
|
AlertDialogActionComponent,
|
|
53
58
|
ButtonComponent
|
|
54
59
|
], template: `
|
|
55
|
-
<tolle-alert-dialog [open]="
|
|
60
|
+
<tolle-alert-dialog [open]="!closing" (openChange)="onOpenChange($event)">
|
|
56
61
|
<tolle-alert-dialog-content [size]="config.size || 'lg'">
|
|
57
62
|
<tolle-alert-dialog-header>
|
|
58
63
|
<tolle-alert-dialog-title>{{ config.title }}</tolle-alert-dialog-title>
|
|
@@ -74,4 +79,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
74
79
|
</tolle-alert-dialog>
|
|
75
80
|
`, styles: [":host{display:block}\n"] }]
|
|
76
81
|
}] });
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLWR5bmFtaWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9hbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzNCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQTBDckQsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxNQUFNLENBQXFCO0lBQzNCLFNBQVMsQ0FBa0I7SUFFM0I7OztPQUdHO0lBQ0gsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixZQUFZLENBQUMsSUFBYTtRQUN4QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQWU7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQzt3R0FsQlUsMkJBQTJCOzRGQUEzQiwyQkFBMkIsc0ZBdkI1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJULCtGQWhDQyxZQUFZLCtCQUNaLG9CQUFvQiwwR0FDcEIsMkJBQTJCLGtHQUMzQiwwQkFBMEIseUZBQzFCLHlCQUF5Qix3RkFDekIsK0JBQStCLDhGQUMvQiwwQkFBMEIseUZBQzFCLDBCQUEwQiw4RkFDMUIsMEJBQTBCLDhGQUMxQixlQUFlOzs0RkF5Qk4sMkJBQTJCO2tCQXZDdkMsU0FBUzsrQkFDRSw0QkFBNEIsY0FFMUIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQiwyQkFBMkI7d0JBQzNCLDBCQUEwQjt3QkFDMUIseUJBQXlCO3dCQUN6QiwrQkFBK0I7d0JBQy9CLDBCQUEwQjt3QkFDMUIsMEJBQTBCO3dCQUMxQiwwQkFBMEI7d0JBQzFCLGVBQWU7cUJBQ2hCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFsZXJ0RGlhbG9nQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0NvbnRlbnRDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ1RpdGxlQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dDYW5jZWxDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nQWN0aW9uQ29tcG9uZW50XG59IGZyb20gJy4vYWxlcnQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxlcnREaWFsb2dDb25maWcsIEFsZXJ0RGlhbG9nUmVmIH0gZnJvbSAnLi9hbGVydC1kaWFsb2cudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctZHluYW1pYycsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQWxlcnREaWFsb2dDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dDb250ZW50Q29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nVGl0bGVDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0NhbmNlbENvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0FjdGlvbkNvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8dG9sbGUtYWxlcnQtZGlhbG9nIFtvcGVuXT1cIiFjbG9zaW5nXCIgKG9wZW5DaGFuZ2UpPVwib25PcGVuQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1jb250ZW50IFtzaXplXT1cImNvbmZpZy5zaXplIHx8ICdsZydcIj5cbiAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcj5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctdGl0bGU+e3sgY29uZmlnLnRpdGxlIH19PC90b2xsZS1hbGVydC1kaWFsb2ctdGl0bGU+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uPlxuICAgICAgICAgICAgICB7eyBjb25maWcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uPlxuICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcj5cbiAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWZvb3Rlcj5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctY2FuY2VsIChjbGljayk9XCJjbG9zZShmYWxzZSlcIj5cbiAgICAgICAgICAgICAgPHRvbGxlLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZVwiPnt7IGNvbmZpZy5jYW5jZWxUZXh0IHx8ICdDYW5jZWwnIH19PC90b2xsZS1idXR0b24+XG4gICAgICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1jYW5jZWw+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWFjdGlvbiAoY2xpY2spPVwiY2xvc2UodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgPHRvbGxlLWJ1dHRvbiBbdmFyaWFudF09XCJjb25maWcudmFyaWFudCA9PT0gJ2Rlc3RydWN0aXZlJyA/ICdkZXN0cnVjdGl2ZScgOiAnZGVmYXVsdCdcIj5cbiAgICAgICAgICAgICAgICB7eyBjb25maWcuYWN0aW9uVGV4dCB8fCAnQ29udGludWUnIH19XG4gICAgICAgICAgICAgIDwvdG9sbGUtYnV0dG9uPlxuICAgICAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctYWN0aW9uPlxuICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWZvb3Rlcj5cbiAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctY29udGVudD5cbiAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZz5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0R5bmFtaWNDb21wb25lbnQge1xuICBjb25maWchOiBBbGVydERpYWxvZ0NvbmZpZztcbiAgZGlhbG9nUmVmITogQWxlcnREaWFsb2dSZWY7XG5cbiAgLyoqXG4gICAqIFNldCBieSBgQWxlcnREaWFsb2dTZXJ2aWNlYCBvbmNlIHRoZSBkaWFsb2cncyByZXN1bHQgaXMgcmVhZHksIHNvIHRoZVxuICAgKiBjb250ZW50IHBhbmVsIHBsYXlzIGl0cyBleGl0IGFuaW1hdGlvbiBiZWZvcmUgdGhlIG92ZXJsYXkgaXMgdG9ybiBkb3duLlxuICAgKi9cbiAgY2xvc2luZyA9IGZhbHNlO1xuXG4gIG9uT3BlbkNoYW5nZShvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShyZXN1bHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyZXN1bHQpO1xuICB9XG59XG4iXX0=
|
|
@@ -7,6 +7,14 @@ import { cn } from './utils/cn';
|
|
|
7
7
|
import { BehaviorSubject } from 'rxjs';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "@angular/cdk/a11y";
|
|
10
|
+
/**
|
|
11
|
+
* Safety net if the exit animation's `animationend` never fires — reduced
|
|
12
|
+
* motion, no matching keyframe, or a panel that never rendered — so an
|
|
13
|
+
* alert dialog can never get stuck open forever. Also used by
|
|
14
|
+
* `alert-dialog.service.ts` and `alert-dialog-dynamic.component.ts`, which
|
|
15
|
+
* animate the same content component through a different overlay wiring.
|
|
16
|
+
*/
|
|
17
|
+
export const CLOSE_FALLBACK_MS = 300;
|
|
10
18
|
class AlertDialogInternalService {
|
|
11
19
|
openSubject = new BehaviorSubject(false);
|
|
12
20
|
open$ = this.openSubject.asObservable();
|
|
@@ -101,14 +109,39 @@ export class AlertDialogPortalComponent {
|
|
|
101
109
|
});
|
|
102
110
|
const portal = new TemplatePortal(this.portalContent, this.viewContainerRef);
|
|
103
111
|
this.overlayRef.attach(portal);
|
|
112
|
+
// The backdrop element only exists once attached — setting this any
|
|
113
|
+
// earlier would silently no-op.
|
|
114
|
+
this.overlayRef.backdropElement?.setAttribute('data-state', 'open');
|
|
104
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Tears the overlay down once its exit animation finishes (or after
|
|
118
|
+
* `CLOSE_FALLBACK_MS`, whichever comes first) instead of instantly, so
|
|
119
|
+
* `data-[state=closed]:animate-out` actually gets a chance to play.
|
|
120
|
+
*/
|
|
105
121
|
hide() {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
122
|
+
const ref = this.overlayRef;
|
|
123
|
+
if (!ref)
|
|
124
|
+
return;
|
|
125
|
+
ref.backdropElement?.setAttribute('data-state', 'closed');
|
|
126
|
+
let finished = false;
|
|
127
|
+
const finish = () => {
|
|
128
|
+
if (finished)
|
|
129
|
+
return;
|
|
130
|
+
finished = true;
|
|
131
|
+
ref.detach();
|
|
132
|
+
ref.dispose();
|
|
133
|
+
if (this.overlayRef === ref)
|
|
134
|
+
this.overlayRef = undefined;
|
|
110
135
|
// Restore focus to the trigger.
|
|
111
136
|
this.previouslyFocused?.focus?.();
|
|
137
|
+
};
|
|
138
|
+
const panel = ref.overlayElement.querySelector('[data-state]');
|
|
139
|
+
if (panel) {
|
|
140
|
+
panel.addEventListener('animationend', finish, { once: true });
|
|
141
|
+
setTimeout(finish, CLOSE_FALLBACK_MS);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
finish();
|
|
112
145
|
}
|
|
113
146
|
}
|
|
114
147
|
ngOnDestroy() {
|
|
@@ -146,7 +179,7 @@ export class AlertDialogContentComponent {
|
|
|
146
179
|
});
|
|
147
180
|
}
|
|
148
181
|
get computedClass() {
|
|
149
|
-
return cn("fixed left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%] z-50 grid w-full gap-4 border border-input bg-background p-6 shadow-lg data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] rounded-lg", {
|
|
182
|
+
return cn("fixed left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%] z-50 grid w-full gap-4 border border-input bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] rounded-lg", {
|
|
150
183
|
'max-w-xs': this.size === 'xs',
|
|
151
184
|
'max-w-sm': this.size === 'sm',
|
|
152
185
|
'max-w-md': this.size === 'md',
|
|
@@ -296,4 +329,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
296
329
|
type: HostListener,
|
|
297
330
|
args: ['click', ['$event']]
|
|
298
331
|
}] } });
|
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYWxlcnQtZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxnQkFBZ0IsRUFBcUIsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoTSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQUd2QyxNQUNNLDBCQUEwQjtJQUNwQixXQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDMUQsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFeEMsT0FBTyxDQUFDLEtBQWM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFD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MEJBQTBCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwRiw2RUFBNkU7SUFDbkUsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFHckQsV0FBVyxDQUFDLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQzt3R0FWUSwwQkFBMEI7NEZBQTFCLDBCQUEwQixtTEFGekIsMkJBQTJCLCtGQUQzQixZQUFZOzs0RkFHYiwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0ksMkJBQTJCLGNBRXpCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJCQUEyQjs4QkFNM0IsU0FBUztzQkFBbEIsTUFBTTtnQkFHUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0YWJsZSwgaW5qZWN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgQ29udGVudENoaWxkLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsLCBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGVydERpYWxvZ1NpemUgfSBmcm9tICcuL2FsZXJ0LWRpYWxvZy50eXBlcyc7XG5cbkBJbmplY3RhYmxlKClcbmNsYXNzIEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlIHtcbiAgICBwcml2YXRlIG9wZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgb3BlbiQgPSB0aGlzLm9wZW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgc2V0T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm9wZW5TdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIGdldE9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5TdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKCkge1xuICAgICAgICB0aGlzLnNldE9wZW4oIXRoaXMuZ2V0T3BlbigpKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHByb3ZpZGVyczogW0FsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBzZXQgb3Blbih2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih2YWwpO1xuICAgIH1cbiAgICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KHZhbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctdHJpZ2dlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhjbGljayknOiAnb25PcGVuKCknXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1RyaWdnZXJDb21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih0cnVlKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLXBvcnRhbCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjcG9ydGFsQ29udGVudD5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nUG9ydGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3BvcnRhbENvbnRlbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3J0YWxDb250ZW50ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSk7XG4gICAgcHJpdmF0ZSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgICBwcml2YXRlIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICAgIC8qKiBFbGVtZW50IGZvY3VzZWQgYmVmb3JlIHRoZSBkaWFsb2cgb3BlbmVkLCByZXN0b3JlZCBvbiBjbG9zZS4gKi9cbiAgICBwcml2YXRlIHByZXZpb3VzbHlGb2N1c2VkPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLm9wZW4kLnN1YnNjcmliZShvcGVuID0+IHtcbiAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3coKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHJldHVybjtcblxuICAgICAgICAvLyBSZW1lbWJlciB0aGUgdHJpZ2dlciBzbyBmb2N1cyBjYW4gYmUgcmVzdG9yZWQgb24gY2xvc2UuXG4gICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IFsnY2RrLW92ZXJsYXktYmFja2Ryb3AnLCAnYmctYmxhY2svODAnLCAnYmFja2Ryb3AtYmx1ci1zbScsICdkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluJywgJ2RhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQnLCAnZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wJywgJ2RhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCddLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuY2VudGVyVmVydGljYWxseSgpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuXG4gICAgICAgIC8vIEFsZXJ0LWRpYWxvZyBzZW1hbnRpY3M6IGJhY2tkcm9wIGNsaWNrcyBtdXN0IE5PVCBkaXNtaXNzLlxuICAgICAgICAvLyBFc2NhcGUgc3RpbGwgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLnNldE9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5wb3J0YWxDb250ZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlKCkge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSBmb2N1cyB0byB0aGUgdHJpZ2dlci5cbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWQ/LmZvY3VzPy4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWNvbnRlbnQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQTExeU1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCIgW2F0dHIuZGF0YS1zdGF0ZV09XCJpc09wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgICAgIHJvbGU9XCJhbGVydGRpYWxvZ1wiXG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlQ21wPy5pZCB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJkZXNjcmlwdGlvbkNtcD8uaWQgfHwgbnVsbFwiXG4gICAgICAgIGNka1RyYXBGb2N1cyBjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZT48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3NdJzogJ1wiY29udGVudHNcIidcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29udGVudENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIHNpemU6IEFsZXJ0RGlhbG9nU2l6ZSA9ICdsZyc7XG5cbiAgICAvKiogUHJvamVjdGVkIHRpdGxlL2Rlc2NyaXB0aW9uIHVzZWQgdG8gYnVpbGQgdGhlIGRpYWxvZydzIGFjY2Vzc2libGUgbmFtZS4gKi9cbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudCkpIHRpdGxlQ21wPzogQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudDtcbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCkpIGRlc2NyaXB0aW9uQ21wPzogQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudDtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcbiAgICBpc09wZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGNuKFxuICAgICAgICAgICAgXCJmaXhlZCBsZWZ0LVs1MCVdIHRvcC1bNTAlXSB0cmFuc2xhdGUteC1bLTUwJV0gdHJhbnNsYXRlLXktWy01MCVdIHotNTAgZ3JpZCB3LWZ1bGwgZ2FwLTQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHAtNiBzaGFkb3ctbGcgZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1jbG9zZWRdOnNsaWRlLW91dC10by1sZWZ0LTEvMiBkYXRhLVtzdGF0ZT1jbG9zZWRdOnNsaWRlLW91dC10by10b3AtWzQ4JV0gcm91bmRlZC1sZ1wiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdtYXgtdy14cyc6IHRoaXMuc2l6ZSA9PT0gJ3hzJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctc20nOiB0aGlzLnNpemUgPT09ICdzbScsXG4gICAgICAgICAgICAgICAgJ21heC13LW1kJzogdGhpcy5zaXplID09PSAnbWQnLFxuICAgICAgICAgICAgICAgICdtYXgtdy1sZyc6IHRoaXMuc2l6ZSA9PT0gJ2xnJyxcbiAgICAgICAgICAgICAgICAnbWF4LXcteGwnOiB0aGlzLnNpemUgPT09ICd4bCcsXG4gICAgICAgICAgICAgICAgJ21heC13LTJ4bCc6IHRoaXMuc2l6ZSA9PT0gJzJ4bCcsXG4gICAgICAgICAgICAgICAgJ21heC13LWZ1bGwnOiB0aGlzLnNpemUgPT09ICdmdWxsJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctZml0JzogdGhpcy5zaXplID09PSAnZml0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RvbGxlLWFsZXJ0LWRpYWxvZy1oZWFkZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgICBob3N0OiB7ICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnIH1cbn0pXG5leHBvcnQgY2xhc3MgQWxlcnREaWFsb2dIZWFkZXJDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHsgcmV0dXJuIGNuKFwiZmxleCBmbGV4LWNvbCBzcGFjZS15LTIgdGV4dC1jZW50ZXIgc206dGV4dC1sZWZ0XCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWZvb3RlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHsgJ1tjbGFzc10nOiAnY29tcHV0ZWRDbGFzcycgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIGdldCBjb21wdXRlZENsYXNzKCkgeyByZXR1cm4gY24oXCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHNwYWNlLXgtMlwiLCB0aGlzLmNsYXNzKTsgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RvbGxlLWFsZXJ0LWRpYWxvZy10aXRsZScsXG4gICAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gICAgaG9zdDogeyAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzJywgJ1thdHRyLmlkXSc6ICdpZCcgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1RpdGxlQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gICAgLyoqIFN0YWJsZSBpZCByZWZlcmVuY2VkIGJ5IHRoZSBkaWFsb2cncyBgYXJpYS1sYWJlbGxlZGJ5YC4gKi9cbiAgICByZWFkb25seSBpZCA9IGB0b2xsZS1hbGVydC1kaWFsb2ctdGl0bGUtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHsgcmV0dXJuIGNuKFwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtZm9yZWdyb3VuZFwiLCB0aGlzLmNsYXNzKTsgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RvbGxlLWFsZXJ0LWRpYWxvZy1kZXNjcmlwdGlvbicsXG4gICAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gICAgaG9zdDogeyAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzJywgJ1thdHRyLmlkXSc6ICdpZCcgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gICAgLyoqIFN0YWJsZSBpZCByZWZlcmVuY2VkIGJ5IHRoZSBkaWFsb2cncyBgYXJpYS1kZXNjcmliZWRieWAuICovXG4gICAgcmVhZG9ubHkgaWQgPSBgdG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XG4gICAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7IHJldHVybiBjbihcInRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWFjdGlvbicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQWN0aW9uQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIC8qKiBGaXJlcyBiZWZvcmUgdGhlIGRpYWxvZyBjbG9zZXMsIHNvIGNvbnN1bWVycyBjYW4gcnVuIHRoZSBjb25maXJtZWQgYWN0aW9uLiAqL1xuICAgIEBPdXRwdXQoKSBjb25maXJtZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5jb25maXJtZWQuZW1pdChldmVudCk7XG4gICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlPy5zZXRPcGVuKGZhbHNlKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWNhbmNlbCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ2FuY2VsQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIC8qKiBGaXJlcyBiZWZvcmUgdGhlIGRpYWxvZyBjbG9zZXMsIHNvIGNvbnN1bWVycyBjYW4gcmVhY3QgdG8gYSBkaXNtaXNzYWwuICovXG4gICAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2U/LnNldE9wZW4oZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYWxlcnQtZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxnQkFBZ0IsRUFBcUIsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoTSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQUd2Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFFckMsTUFDTSwwQkFBMEI7SUFDcEIsV0FBVyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzFELEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXhDLE9BQU8sQ0FBQyxLQUFjO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxN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R0FWUSwwQkFBMEI7NEZBQTFCLDBCQUEwQixtTEFGekIsMkJBQTJCLCtGQUQzQixZQUFZOzs0RkFHYiwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0ksMkJBQTJCLGNBRXpCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJCQUEyQjs4QkFNM0IsU0FBUztzQkFBbEIsTUFBTTtnQkFHUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0YWJsZSwgaW5qZWN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgQ29udGVudENoaWxkLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsLCBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGVydERpYWxvZ1NpemUgfSBmcm9tICcuL2FsZXJ0LWRpYWxvZy50eXBlcyc7XG5cbi8qKlxuICogU2FmZXR5IG5ldCBpZiB0aGUgZXhpdCBhbmltYXRpb24ncyBgYW5pbWF0aW9uZW5kYCBuZXZlciBmaXJlcyDigJQgcmVkdWNlZFxuICogbW90aW9uLCBubyBtYXRjaGluZyBrZXlmcmFtZSwgb3IgYSBwYW5lbCB0aGF0IG5ldmVyIHJlbmRlcmVkIOKAlCBzbyBhblxuICogYWxlcnQgZGlhbG9nIGNhbiBuZXZlciBnZXQgc3R1Y2sgb3BlbiBmb3JldmVyLiBBbHNvIHVzZWQgYnlcbiAqIGBhbGVydC1kaWFsb2cuc2VydmljZS50c2AgYW5kIGBhbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQudHNgLCB3aGljaFxuICogYW5pbWF0ZSB0aGUgc2FtZSBjb250ZW50IGNvbXBvbmVudCB0aHJvdWdoIGEgZGlmZmVyZW50IG92ZXJsYXkgd2lyaW5nLlxuICovXG5leHBvcnQgY29uc3QgQ0xPU0VfRkFMTEJBQ0tfTVMgPSAzMDA7XG5cbkBJbmplY3RhYmxlKClcbmNsYXNzIEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlIHtcbiAgICBwcml2YXRlIG9wZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgb3BlbiQgPSB0aGlzLm9wZW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgc2V0T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm9wZW5TdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIGdldE9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5TdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKCkge1xuICAgICAgICB0aGlzLnNldE9wZW4oIXRoaXMuZ2V0T3BlbigpKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHByb3ZpZGVyczogW0FsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBzZXQgb3Blbih2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih2YWwpO1xuICAgIH1cbiAgICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KHZhbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctdHJpZ2dlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhjbGljayknOiAnb25PcGVuKCknXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1RyaWdnZXJDb21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih0cnVlKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLXBvcnRhbCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjcG9ydGFsQ29udGVudD5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nUG9ydGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3BvcnRhbENvbnRlbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3J0YWxDb250ZW50ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSk7XG4gICAgcHJpdmF0ZSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgICBwcml2YXRlIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICAgIC8qKiBFbGVtZW50IGZvY3VzZWQgYmVmb3JlIHRoZSBkaWFsb2cgb3BlbmVkLCByZXN0b3JlZCBvbiBjbG9zZS4gKi9cbiAgICBwcml2YXRlIHByZXZpb3VzbHlGb2N1c2VkPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLm9wZW4kLnN1YnNjcmliZShvcGVuID0+IHtcbiAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3coKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHJldHVybjtcblxuICAgICAgICAvLyBSZW1lbWJlciB0aGUgdHJpZ2dlciBzbyBmb2N1cyBjYW4gYmUgcmVzdG9yZWQgb24gY2xvc2UuXG4gICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IFsnY2RrLW92ZXJsYXktYmFja2Ryb3AnLCAnYmctYmxhY2svODAnLCAnYmFja2Ryb3AtYmx1ci1zbScsICdkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluJywgJ2RhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQnLCAnZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wJywgJ2RhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCddLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuY2VudGVyVmVydGljYWxseSgpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuXG4gICAgICAgIC8vIEFsZXJ0LWRpYWxvZyBzZW1hbnRpY3M6IGJhY2tkcm9wIGNsaWNrcyBtdXN0IE5PVCBkaXNtaXNzLlxuICAgICAgICAvLyBFc2NhcGUgc3RpbGwgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLnNldE9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5wb3J0YWxDb250ZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG5cbiAgICAgICAgLy8gVGhlIGJhY2tkcm9wIGVsZW1lbnQgb25seSBleGlzdHMgb25jZSBhdHRhY2hlZCDigJQgc2V0dGluZyB0aGlzIGFueVxuICAgICAgICAvLyBlYXJsaWVyIHdvdWxkIHNpbGVudGx5IG5vLW9wLlxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnb3BlbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlYXJzIHRoZSBvdmVybGF5IGRvd24gb25jZSBpdHMgZXhpdCBhbmltYXRpb24gZmluaXNoZXMgKG9yIGFmdGVyXG4gICAgICogYENMT1NFX0ZBTExCQUNLX01TYCwgd2hpY2hldmVyIGNvbWVzIGZpcnN0KSBpbnN0ZWFkIG9mIGluc3RhbnRseSwgc29cbiAgICAgKiBgZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dGAgYWN0dWFsbHkgZ2V0cyBhIGNoYW5jZSB0byBwbGF5LlxuICAgICAqL1xuICAgIHByaXZhdGUgaGlkZSgpIHtcbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5vdmVybGF5UmVmO1xuICAgICAgICBpZiAoIXJlZikgcmV0dXJuO1xuXG4gICAgICAgIHJlZi5iYWNrZHJvcEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScsICdjbG9zZWQnKTtcblxuICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICByZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICByZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZiA9PT0gcmVmKSB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBSZXN0b3JlIGZvY3VzIHRvIHRoZSB0cmlnZ2VyLlxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c2x5Rm9jdXNlZD8uZm9jdXM/LigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gcmVmLm92ZXJsYXlFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1zdGF0ZV0nKTtcbiAgICAgICAgaWYgKHBhbmVsKSB7XG4gICAgICAgICAgICBwYW5lbC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCBmaW5pc2gsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZmluaXNoLCBDTE9TRV9GQUxMQkFDS19NUyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWNvbnRlbnQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQTExeU1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCIgW2F0dHIuZGF0YS1zdGF0ZV09XCJpc09wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgICAgIHJvbGU9XCJhbGVydGRpYWxvZ1wiXG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlQ21wPy5pZCB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJkZXNjcmlwdGlvbkNtcD8uaWQgfHwgbnVsbFwiXG4gICAgICAgIGNka1RyYXBGb2N1cyBjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZT48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3NdJzogJ1wiY29udGVudHNcIidcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29udGVudENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIHNpemU6IEFsZXJ0RGlhbG9nU2l6ZSA9ICdsZyc7XG5cbiAgICAvKiogUHJvamVjdGVkIHRpdGxlL2Rlc2NyaXB0aW9uIHVzZWQgdG8gYnVpbGQgdGhlIGRpYWxvZydzIGFjY2Vzc2libGUgbmFtZS4gKi9cbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudCkpIHRpdGxlQ21wPzogQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudDtcbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCkpIGRlc2NyaXB0aW9uQ21wPzogQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudDtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcbiAgICBpc09wZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGNuKFxuICAgICAgICAgICAgXCJmaXhlZCBsZWZ0LVs1MCVdIHRvcC1bNTAlXSB0cmFuc2xhdGUteC1bLTUwJV0gdHJhbnNsYXRlLXktWy01MCVdIHotNTAgZ3JpZCB3LWZ1bGwgZ2FwLTQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHAtNiBzaGFkb3ctbGcgZHVyYXRpb24tMjAwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1sZWZ0LTEvMiBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLXRvcC1bNDglXSBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWxlZnQtMS8yIGRhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLXRvcC1bNDglXSByb3VuZGVkLWxnXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgJ21heC13LXhzJzogdGhpcy5zaXplID09PSAneHMnLFxuICAgICAgICAgICAgICAgICdtYXgtdy1zbSc6IHRoaXMuc2l6ZSA9PT0gJ3NtJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctbWQnOiB0aGlzLnNpemUgPT09ICdtZCcsXG4gICAgICAgICAgICAgICAgJ21heC13LWxnJzogdGhpcy5zaXplID09PSAnbGcnLFxuICAgICAgICAgICAgICAgICdtYXgtdy14bCc6IHRoaXMuc2l6ZSA9PT0gJ3hsJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctMnhsJzogdGhpcy5zaXplID09PSAnMnhsJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctZnVsbCc6IHRoaXMuc2l6ZSA9PT0gJ2Z1bGwnLFxuICAgICAgICAgICAgICAgICdtYXgtdy1maXQnOiB0aGlzLnNpemUgPT09ICdmaXQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHsgJ1tjbGFzc10nOiAnY29tcHV0ZWRDbGFzcycgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0hlYWRlckNvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIGdldCBjb21wdXRlZENsYXNzKCkgeyByZXR1cm4gY24oXCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMiB0ZXh0LWNlbnRlciBzbTp0ZXh0LWxlZnRcIiwgdGhpcy5jbGFzcyk7IH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctZm9vdGVyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gICAgaG9zdDogeyAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzJyB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nRm9vdGVyQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gICAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7IHJldHVybiBjbihcImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgc3BhY2UteC0yXCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLXRpdGxlJyxcbiAgICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgICBob3N0OiB7ICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnLCAnW2F0dHIuaWRdJzogJ2lkJyB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nVGl0bGVDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcbiAgICAvKiogU3RhYmxlIGlkIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWxvZydzIGBhcmlhLWxhYmVsbGVkYnlgLiAqL1xuICAgIHJlYWRvbmx5IGlkID0gYHRvbGxlLWFsZXJ0LWRpYWxvZy10aXRsZS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xuICAgIGdldCBjb21wdXRlZENsYXNzKCkgeyByZXR1cm4gY24oXCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC1mb3JlZ3JvdW5kXCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uJyxcbiAgICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgICBob3N0OiB7ICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnLCAnW2F0dHIuaWRdJzogJ2lkJyB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nRGVzY3JpcHRpb25Db21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcbiAgICAvKiogU3RhYmxlIGlkIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWxvZydzIGBhcmlhLWRlc2NyaWJlZGJ5YC4gKi9cbiAgICByZWFkb25seSBpZCA9IGB0b2xsZS1hbGVydC1kaWFsb2ctZGVzY3JpcHRpb24tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHsgcmV0dXJuIGNuKFwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIiwgdGhpcy5jbGFzcyk7IH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctYWN0aW9uJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnREaWFsb2dBY3Rpb25Db21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqIEZpcmVzIGJlZm9yZSB0aGUgZGlhbG9nIGNsb3Nlcywgc28gY29uc3VtZXJzIGNhbiBydW4gdGhlIGNvbmZpcm1lZCBhY3Rpb24uICovXG4gICAgQE91dHB1dCgpIGNvbmZpcm1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmNvbmZpcm1lZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2U/LnNldE9wZW4oZmFsc2UpO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctY2FuY2VsJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnREaWFsb2dDYW5jZWxDb21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqIEZpcmVzIGJlZm9yZSB0aGUgZGlhbG9nIGNsb3Nlcywgc28gY29uc3VtZXJzIGNhbiByZWFjdCB0byBhIGRpc21pc3NhbC4gKi9cbiAgICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZT8uc2V0T3BlbihmYWxzZSk7XG4gICAgfVxufVxuIl19
|
|
@@ -3,6 +3,7 @@ import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
|
|
|
3
3
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
4
|
import { AlertDialogRef } from './alert-dialog.types';
|
|
5
5
|
import { AlertDialogDynamicComponent } from './alert-dialog-dynamic.component';
|
|
6
|
+
import { CLOSE_FALLBACK_MS } from './alert-dialog.component';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export class AlertDialogService {
|
|
8
9
|
overlay = inject(Overlay);
|
|
@@ -12,7 +13,15 @@ export class AlertDialogService {
|
|
|
12
13
|
const previouslyFocused = document.activeElement;
|
|
13
14
|
const overlayConfig = new OverlayConfig({
|
|
14
15
|
hasBackdrop: true,
|
|
15
|
-
backdropClass: [
|
|
16
|
+
backdropClass: [
|
|
17
|
+
'cdk-overlay-backdrop',
|
|
18
|
+
'bg-black/80',
|
|
19
|
+
'backdrop-blur-sm',
|
|
20
|
+
'data-[state=open]:animate-in',
|
|
21
|
+
'data-[state=open]:fade-in-0',
|
|
22
|
+
'data-[state=closed]:animate-out',
|
|
23
|
+
'data-[state=closed]:fade-out-0',
|
|
24
|
+
],
|
|
16
25
|
positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),
|
|
17
26
|
scrollStrategy: this.overlay.scrollStrategies.block()
|
|
18
27
|
});
|
|
@@ -20,13 +29,36 @@ export class AlertDialogService {
|
|
|
20
29
|
const dialogRef = new AlertDialogRef();
|
|
21
30
|
const portal = new ComponentPortal(AlertDialogDynamicComponent, null, this.injector);
|
|
22
31
|
const componentRef = overlayRef.attach(portal);
|
|
32
|
+
// The backdrop element only exists once attached — setting this any
|
|
33
|
+
// earlier would silently no-op.
|
|
34
|
+
overlayRef.backdropElement?.setAttribute('data-state', 'open');
|
|
23
35
|
componentRef.instance.config = config;
|
|
24
36
|
componentRef.instance.dialogRef = dialogRef;
|
|
37
|
+
// The result (`afterClosed$`) is ready immediately, but disposing the
|
|
38
|
+
// overlay waits for the content panel's exit animation to finish (or
|
|
39
|
+
// a fallback timeout), so `data-[state=closed]:animate-out` gets a
|
|
40
|
+
// chance to play instead of being torn down mid-frame.
|
|
25
41
|
dialogRef.afterClosed$.subscribe(() => {
|
|
26
|
-
overlayRef.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
42
|
+
overlayRef.backdropElement?.setAttribute('data-state', 'closed');
|
|
43
|
+
componentRef.instance.closing = true;
|
|
44
|
+
let finished = false;
|
|
45
|
+
const finish = () => {
|
|
46
|
+
if (finished)
|
|
47
|
+
return;
|
|
48
|
+
finished = true;
|
|
49
|
+
overlayRef.detach();
|
|
50
|
+
overlayRef.dispose();
|
|
51
|
+
// Restore focus to the trigger.
|
|
52
|
+
previouslyFocused?.focus?.();
|
|
53
|
+
};
|
|
54
|
+
const panel = overlayRef.overlayElement.querySelector('[data-state]');
|
|
55
|
+
if (panel) {
|
|
56
|
+
panel.addEventListener('animationend', finish, { once: true });
|
|
57
|
+
setTimeout(finish, CLOSE_FALLBACK_MS);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
finish();
|
|
61
|
+
}
|
|
30
62
|
});
|
|
31
63
|
// Alert-dialog semantics: backdrop clicks must NOT dismiss.
|
|
32
64
|
// Escape still closes the dialog.
|
|
@@ -47,4 +79,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
47
79
|
providedIn: 'root'
|
|
48
80
|
}]
|
|
49
81
|
}] });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL2FsZXJ0LWRpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQXFCLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQUs3RCxNQUFNLE9BQU8sa0JBQWtCO0lBQ25CLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVwQyxJQUFJLENBQUMsTUFBeUI7UUFDMUIsMERBQTBEO1FBQzFELE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLGFBQW1DLENBQUM7UUFFdkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDcEMsV0FBVyxFQUFFLElBQUk7WUFDakIsYUFBYSxFQUFFO2dCQUNYLHNCQUFzQjtnQkFDdEIsYUFBYTtnQkFDYixrQkFBa0I7Z0JBQ2xCLDhCQUE4QjtnQkFDOUIsNkJBQTZCO2dCQUM3QixpQ0FBaUM7Z0JBQ2pDLGdDQUFnQzthQUNuQztZQUNELGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxRixjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7U0FDeEQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUV2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0Msb0VBQW9FO1FBQ3BFLGdDQUFnQztRQUNoQyxVQUFVLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFL0QsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUU1QyxzRUFBc0U7UUFDdEUscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSx1REFBdUQ7UUFDdkQsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNqRSxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFFckMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDaEIsSUFBSSxRQUFRO29CQUFFLE9BQU87Z0JBQ3JCLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixnQ0FBZ0M7Z0JBQ2hDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDakMsQ0FBQyxDQUFDO1lBRUYsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQWMsY0FBYyxDQUFDLENBQUM7WUFDbkYsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixLQUFLLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRCxVQUFVLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDMUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sRUFBRSxDQUFDO1lBQ2IsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsNERBQTREO1FBQzVELGtDQUFrQztRQUNsQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFO1lBQzFELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7d0dBekVRLGtCQUFrQjs0R0FBbEIsa0JBQWtCLGNBRmYsTUFBTTs7NEZBRVQsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nQ29uZmlnLCBBbGVydERpYWxvZ1JlZiB9IGZyb20gJy4vYWxlcnQtZGlhbG9nLnR5cGVzJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nRHluYW1pY0NvbXBvbmVudCB9IGZyb20gJy4vYWxlcnQtZGlhbG9nLWR5bmFtaWMuY29tcG9uZW50JztcbmltcG9ydCB7IENMT1NFX0ZBTExCQUNLX01TIH0gZnJvbSAnLi9hbGVydC1kaWFsb2cuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1NlcnZpY2Uge1xuICAgIHByaXZhdGUgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgICBwcml2YXRlIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAgIG9wZW4oY29uZmlnOiBBbGVydERpYWxvZ0NvbmZpZyk6IEFsZXJ0RGlhbG9nUmVmIHtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIHRyaWdnZXIgc28gZm9jdXMgY2FuIGJlIHJlc3RvcmVkIG9uIGNsb3NlLlxuICAgICAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IFtcbiAgICAgICAgICAgICAgICAnY2RrLW92ZXJsYXktYmFja2Ryb3AnLFxuICAgICAgICAgICAgICAgICdiZy1ibGFjay84MCcsXG4gICAgICAgICAgICAgICAgJ2JhY2tkcm9wLWJsdXItc20nLFxuICAgICAgICAgICAgICAgICdkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluJyxcbiAgICAgICAgICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wJyxcbiAgICAgICAgICAgICAgICAnZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCcsXG4gICAgICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuY2VudGVyVmVydGljYWxseSgpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IG5ldyBBbGVydERpYWxvZ1JlZigpO1xuXG4gICAgICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoQWxlcnREaWFsb2dEeW5hbWljQ29tcG9uZW50LCBudWxsLCB0aGlzLmluamVjdG9yKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gb3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcblxuICAgICAgICAvLyBUaGUgYmFja2Ryb3AgZWxlbWVudCBvbmx5IGV4aXN0cyBvbmNlIGF0dGFjaGVkIOKAlCBzZXR0aW5nIHRoaXMgYW55XG4gICAgICAgIC8vIGVhcmxpZXIgd291bGQgc2lsZW50bHkgbm8tb3AuXG4gICAgICAgIG92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnb3BlbicpO1xuXG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBjb25maWc7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kaWFsb2dSZWYgPSBkaWFsb2dSZWY7XG5cbiAgICAgICAgLy8gVGhlIHJlc3VsdCAoYGFmdGVyQ2xvc2VkJGApIGlzIHJlYWR5IGltbWVkaWF0ZWx5LCBidXQgZGlzcG9zaW5nIHRoZVxuICAgICAgICAvLyBvdmVybGF5IHdhaXRzIGZvciB0aGUgY29udGVudCBwYW5lbCdzIGV4aXQgYW5pbWF0aW9uIHRvIGZpbmlzaCAob3JcbiAgICAgICAgLy8gYSBmYWxsYmFjayB0aW1lb3V0KSwgc28gYGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXRgIGdldHMgYVxuICAgICAgICAvLyBjaGFuY2UgdG8gcGxheSBpbnN0ZWFkIG9mIGJlaW5nIHRvcm4gZG93biBtaWQtZnJhbWUuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIG92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnY2xvc2VkJyk7XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY2xvc2luZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIHRyaWdnZXIuXG4gICAgICAgICAgICAgICAgcHJldmlvdXNseUZvY3VzZWQ/LmZvY3VzPy4oKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtc3RhdGVdJyk7XG4gICAgICAgICAgICBpZiAocGFuZWwpIHtcbiAgICAgICAgICAgICAgICBwYW5lbC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCBmaW5pc2gsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZpbmlzaCwgQ0xPU0VfRkFMTEJBQ0tfTVMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWxlcnQtZGlhbG9nIHNlbWFudGljczogYmFja2Ryb3AgY2xpY2tzIG11c3QgTk9UIGRpc21pc3MuXG4gICAgICAgIC8vIEVzY2FwZSBzdGlsbCBjbG9zZXMgdGhlIGRpYWxvZy5cbiAgICAgICAgb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGRpYWxvZ1JlZi5jbG9zZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { cn } from './utils/cn';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
/**
|
|
7
|
+
* A ranked list of horizontal bars — label left, value right, bar width
|
|
8
|
+
* scaled to each row's share of the list's largest value. Unlike a chart
|
|
9
|
+
* series or a category bar's segments, every bar is the same accent: rank is
|
|
10
|
+
* carried by length, not by a categorical palette.
|
|
11
|
+
* @new
|
|
12
|
+
*/
|
|
13
|
+
export class BarListComponent {
|
|
14
|
+
/**
|
|
15
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
16
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
17
|
+
* rendering the class it was born with.
|
|
18
|
+
*/
|
|
19
|
+
ngOnChanges() {
|
|
20
|
+
this.cdr.markForCheck();
|
|
21
|
+
}
|
|
22
|
+
/** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
|
|
23
|
+
trackByIndex = (index) => index;
|
|
24
|
+
/** Rows to rank, in the order they should be drawn. @default [] */
|
|
25
|
+
data = [];
|
|
26
|
+
/** Row key holding each row's label. @default 'label' */
|
|
27
|
+
labelKey = 'label';
|
|
28
|
+
/** Row key holding each row's numeric value. @default 'value' */
|
|
29
|
+
valueKey = 'value';
|
|
30
|
+
/** Extra Tailwind classes merged onto the list via `cn()` (last-wins). */
|
|
31
|
+
class = '';
|
|
32
|
+
cdr = inject(ChangeDetectorRef);
|
|
33
|
+
get rows() {
|
|
34
|
+
const rows = this.data ?? [];
|
|
35
|
+
const values = rows.map((row) => {
|
|
36
|
+
const num = Number(row?.[this.valueKey]);
|
|
37
|
+
return Number.isFinite(num) ? num : 0;
|
|
38
|
+
});
|
|
39
|
+
const max = values.reduce((m, v) => Math.max(m, v), 0);
|
|
40
|
+
return rows.map((row, i) => {
|
|
41
|
+
const raw = row?.[this.labelKey];
|
|
42
|
+
const value = values[i];
|
|
43
|
+
return {
|
|
44
|
+
label: raw == null ? '' : String(raw),
|
|
45
|
+
value,
|
|
46
|
+
percent: max > 0 ? Math.max(0, Math.min(100, (value / max) * 100)) : 0,
|
|
47
|
+
formattedValue: value.toLocaleString('en-US'),
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
get computedClass() {
|
|
52
|
+
return cn('flex w-full flex-col gap-1', this.class);
|
|
53
|
+
}
|
|
54
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BarListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
55
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BarListComponent, isStandalone: true, selector: "tolle-bar-list", inputs: { data: "data", labelKey: "labelKey", valueKey: "valueKey", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
56
|
+
<div [class]="computedClass">
|
|
57
|
+
<div
|
|
58
|
+
*ngFor="let row of rows; trackBy: trackByIndex"
|
|
59
|
+
class="relative flex items-center overflow-hidden rounded-sm"
|
|
60
|
+
>
|
|
61
|
+
<div class="absolute inset-y-0 left-0 rounded-sm bg-primary/15" [style.width.%]="row.percent"></div>
|
|
62
|
+
<span class="relative z-10 truncate px-2 py-1.5 text-sm text-foreground">{{ row.label }}</span>
|
|
63
|
+
<span class="relative z-10 ml-auto shrink-0 px-2 py-1.5 text-sm font-medium tabular-nums text-foreground">
|
|
64
|
+
{{ row.formattedValue }}
|
|
65
|
+
</span>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
69
|
+
}
|
|
70
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BarListComponent, decorators: [{
|
|
71
|
+
type: Component,
|
|
72
|
+
args: [{ selector: 'tolle-bar-list', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
73
|
+
<div [class]="computedClass">
|
|
74
|
+
<div
|
|
75
|
+
*ngFor="let row of rows; trackBy: trackByIndex"
|
|
76
|
+
class="relative flex items-center overflow-hidden rounded-sm"
|
|
77
|
+
>
|
|
78
|
+
<div class="absolute inset-y-0 left-0 rounded-sm bg-primary/15" [style.width.%]="row.percent"></div>
|
|
79
|
+
<span class="relative z-10 truncate px-2 py-1.5 text-sm text-foreground">{{ row.label }}</span>
|
|
80
|
+
<span class="relative z-10 ml-auto shrink-0 px-2 py-1.5 text-sm font-medium tabular-nums text-foreground">
|
|
81
|
+
{{ row.formattedValue }}
|
|
82
|
+
</span>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
`, styles: [":host{display:block}\n"] }]
|
|
86
|
+
}], propDecorators: { data: [{
|
|
87
|
+
type: Input
|
|
88
|
+
}], labelKey: [{
|
|
89
|
+
type: Input
|
|
90
|
+
}], valueKey: [{
|
|
91
|
+
type: Input
|
|
92
|
+
}], class: [{
|
|
93
|
+
type: Input
|
|
94
|
+
}] } });
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9iYXItbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFVaEM7Ozs7OztHQU1HO0FBc0JILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0I7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrRkFBa0Y7SUFDbEYsWUFBWSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFFaEQsbUVBQW1FO0lBQzFELElBQUksR0FBMEIsRUFBRSxDQUFDO0lBQzFDLHlEQUF5RDtJQUNoRCxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLGlFQUFpRTtJQUN4RCxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLDBFQUEwRTtJQUNqRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRUgsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpELElBQUksSUFBSTtRQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixPQUFPO2dCQUNMLEtBQUssRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ3JDLEtBQUs7Z0JBQ0wsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQzthQUM5QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7d0dBOUNVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLHFMQWZqQjs7Ozs7Ozs7Ozs7OztHQWFULCtGQWZTLFlBQVk7OzRGQWlCWCxnQkFBZ0I7a0JBckI1QixTQUFTOytCQUNFLGdCQUFnQixjQUVkLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7O0dBYVQ7OEJBZ0JRLElBQUk7c0JBQVosS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbi8qKiBPbmUgcmVzb2x2ZWQgcm93OiBpdHMgbGFiZWwsIGl0cyB2YWx1ZSwgYW5kIGl0cyBzaGFyZSBvZiB0aGUgbGlzdCdzIGxhcmdlc3QgdmFsdWUuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhckxpc3RSb3cge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBwZXJjZW50OiBudW1iZXI7XG4gIGZvcm1hdHRlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByYW5rZWQgbGlzdCBvZiBob3Jpem9udGFsIGJhcnMg4oCUIGxhYmVsIGxlZnQsIHZhbHVlIHJpZ2h0LCBiYXIgd2lkdGhcbiAqIHNjYWxlZCB0byBlYWNoIHJvdydzIHNoYXJlIG9mIHRoZSBsaXN0J3MgbGFyZ2VzdCB2YWx1ZS4gVW5saWtlIGEgY2hhcnRcbiAqIHNlcmllcyBvciBhIGNhdGVnb3J5IGJhcidzIHNlZ21lbnRzLCBldmVyeSBiYXIgaXMgdGhlIHNhbWUgYWNjZW50OiByYW5rIGlzXG4gKiBjYXJyaWVkIGJ5IGxlbmd0aCwgbm90IGJ5IGEgY2F0ZWdvcmljYWwgcGFsZXR0ZS5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYmFyLWxpc3QnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtc21cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCByb3VuZGVkLXNtIGJnLXByaW1hcnkvMTVcIiBbc3R5bGUud2lkdGguJV09XCJyb3cucGVyY2VudFwiPjwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlbGF0aXZlIHotMTAgdHJ1bmNhdGUgcHgtMiBweS0xLjUgdGV4dC1zbSB0ZXh0LWZvcmVncm91bmRcIj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVsYXRpdmUgei0xMCBtbC1hdXRvIHNocmluay0wIHB4LTIgcHktMS41IHRleHQtc20gZm9udC1tZWRpdW0gdGFidWxhci1udW1zIHRleHQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgIHt7IHJvdy5mb3JtYXR0ZWRWYWx1ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQmFyTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogSWRlbnRpdHkgZm9yIGAqbmdGb3JgLCBzbyBhIHJlZHJhdyBwYXRjaGVzIG5vZGVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uICovXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIC8qKiBSb3dzIHRvIHJhbmssIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSBkcmF3bi4gQGRlZmF1bHQgW10gKi9cbiAgQElucHV0KCkgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdID0gW107XG4gIC8qKiBSb3cga2V5IGhvbGRpbmcgZWFjaCByb3cncyBsYWJlbC4gQGRlZmF1bHQgJ2xhYmVsJyAqL1xuICBASW5wdXQoKSBsYWJlbEtleSA9ICdsYWJlbCc7XG4gIC8qKiBSb3cga2V5IGhvbGRpbmcgZWFjaCByb3cncyBudW1lcmljIHZhbHVlLiBAZGVmYXVsdCAndmFsdWUnICovXG4gIEBJbnB1dCgpIHZhbHVlS2V5ID0gJ3ZhbHVlJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGxpc3QgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgZ2V0IHJvd3MoKTogQmFyTGlzdFJvd1tdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhID8/IFtdO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG51bSA9IE51bWJlcihyb3c/Llt0aGlzLnZhbHVlS2V5XSk7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bSkgPyBudW0gOiAwO1xuICAgIH0pO1xuICAgIGNvbnN0IG1heCA9IHZhbHVlcy5yZWR1Y2UoKG0sIHYpID0+IE1hdGgubWF4KG0sIHYpLCAwKTtcblxuICAgIHJldHVybiByb3dzLm1hcCgocm93LCBpKSA9PiB7XG4gICAgICBjb25zdCByYXcgPSByb3c/Llt0aGlzLmxhYmVsS2V5XTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHJhdyA9PSBudWxsID8gJycgOiBTdHJpbmcocmF3KSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHBlcmNlbnQ6IG1heCA+IDAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsICh2YWx1ZSAvIG1heCkgKiAxMDApKSA6IDAsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiB2YWx1ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oJ2ZsZXggdy1mdWxsIGZsZXgtY29sIGdhcC0xJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { cn } from './utils/cn';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
/**
|
|
7
|
+
* A single bar split into proportional, labelled ranges — for showing where
|
|
8
|
+
* one value falls against a scale made of categories (a credit score inside
|
|
9
|
+
* "Poor / Fair / Good / Excellent", latency inside "Fast / OK / Slow").
|
|
10
|
+
*
|
|
11
|
+
* Segments take the chart palette by position, since a category bar has no
|
|
12
|
+
* stable per-render identity to key colour off the way a chart series does —
|
|
13
|
+
* pass `colors` to override.
|
|
14
|
+
* @new
|
|
15
|
+
*/
|
|
16
|
+
export class CategoryBarComponent {
|
|
17
|
+
/**
|
|
18
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
19
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
20
|
+
* rendering the class it was born with.
|
|
21
|
+
*/
|
|
22
|
+
ngOnChanges() {
|
|
23
|
+
this.cdr.markForCheck();
|
|
24
|
+
}
|
|
25
|
+
/** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
|
|
26
|
+
trackByIndex = (index) => index;
|
|
27
|
+
/** Width of each segment. Values that are not finite and greater than zero are dropped. @default [] */
|
|
28
|
+
values = [];
|
|
29
|
+
/** Name for each segment, used in the accessible summary and as a title tooltip. @default [] */
|
|
30
|
+
labels = [];
|
|
31
|
+
/** Paint for each segment, by index. Falls back to the chart palette --chart-1 through --chart-5. @default [] */
|
|
32
|
+
colors = [];
|
|
33
|
+
/** Position of the pointer, 0-100 on the same scale the segments sum to. Omit to draw no pointer. @default null */
|
|
34
|
+
markerValue = null;
|
|
35
|
+
/** Accessible name, prefixed onto the sr-only summary of segments and marker. @default '' */
|
|
36
|
+
ariaLabel = '';
|
|
37
|
+
/** Extra Tailwind classes merged onto the bar via `cn()` (last-wins). */
|
|
38
|
+
class = '';
|
|
39
|
+
cdr = inject(ChangeDetectorRef);
|
|
40
|
+
get total() {
|
|
41
|
+
return this.values.reduce((sum, v) => (Number.isFinite(v) && v > 0 ? sum + v : sum), 0);
|
|
42
|
+
}
|
|
43
|
+
get segments() {
|
|
44
|
+
const total = this.total;
|
|
45
|
+
if (total <= 0)
|
|
46
|
+
return [];
|
|
47
|
+
return this.values
|
|
48
|
+
.map((value, i) => ({ value, i }))
|
|
49
|
+
.filter(({ value }) => Number.isFinite(value) && value > 0)
|
|
50
|
+
.map(({ value, i }) => ({
|
|
51
|
+
label: this.labels[i] ?? '',
|
|
52
|
+
value,
|
|
53
|
+
percent: (value / total) * 100,
|
|
54
|
+
color: this.colors[i] || 'rgb(var(--chart-' + ((i % 5) + 1) + '))',
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
get clampedMarker() {
|
|
58
|
+
if (this.markerValue == null || !Number.isFinite(this.markerValue))
|
|
59
|
+
return null;
|
|
60
|
+
return Math.min(100, Math.max(0, this.markerValue));
|
|
61
|
+
}
|
|
62
|
+
get summary() {
|
|
63
|
+
const parts = this.segments.map((s) => (s.label ? s.label + ': ' : '') + s.percent.toFixed(0) + '%');
|
|
64
|
+
const marker = this.clampedMarker !== null ? ', current position ' + this.clampedMarker.toFixed(0) + '%' : '';
|
|
65
|
+
const prefix = this.ariaLabel ? this.ariaLabel + '. ' : '';
|
|
66
|
+
return prefix + parts.join(', ') + marker;
|
|
67
|
+
}
|
|
68
|
+
get computedClass() {
|
|
69
|
+
return cn('w-full', this.class);
|
|
70
|
+
}
|
|
71
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CategoryBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
72
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CategoryBarComponent, isStandalone: true, selector: "tolle-category-bar", inputs: { values: "values", labels: "labels", colors: "colors", markerValue: "markerValue", ariaLabel: "ariaLabel", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
73
|
+
<div [class]="computedClass">
|
|
74
|
+
<div class="relative flex w-full gap-0.5">
|
|
75
|
+
<div
|
|
76
|
+
*ngFor="let segment of segments; let i = index; trackBy: trackByIndex"
|
|
77
|
+
class="h-2 first:rounded-l-full last:rounded-r-full"
|
|
78
|
+
[style.width.%]="segment.percent"
|
|
79
|
+
[style.background]="segment.color"
|
|
80
|
+
[attr.title]="segment.label || null"
|
|
81
|
+
></div>
|
|
82
|
+
|
|
83
|
+
<span
|
|
84
|
+
*ngIf="clampedMarker !== null"
|
|
85
|
+
class="absolute top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-background bg-foreground shadow"
|
|
86
|
+
[style.left.%]="clampedMarker"
|
|
87
|
+
></span>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<p class="sr-only">{{ summary }}</p>
|
|
91
|
+
</div>
|
|
92
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
93
|
+
}
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CategoryBarComponent, decorators: [{
|
|
95
|
+
type: Component,
|
|
96
|
+
args: [{ selector: 'tolle-category-bar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
97
|
+
<div [class]="computedClass">
|
|
98
|
+
<div class="relative flex w-full gap-0.5">
|
|
99
|
+
<div
|
|
100
|
+
*ngFor="let segment of segments; let i = index; trackBy: trackByIndex"
|
|
101
|
+
class="h-2 first:rounded-l-full last:rounded-r-full"
|
|
102
|
+
[style.width.%]="segment.percent"
|
|
103
|
+
[style.background]="segment.color"
|
|
104
|
+
[attr.title]="segment.label || null"
|
|
105
|
+
></div>
|
|
106
|
+
|
|
107
|
+
<span
|
|
108
|
+
*ngIf="clampedMarker !== null"
|
|
109
|
+
class="absolute top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-background bg-foreground shadow"
|
|
110
|
+
[style.left.%]="clampedMarker"
|
|
111
|
+
></span>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<p class="sr-only">{{ summary }}</p>
|
|
115
|
+
</div>
|
|
116
|
+
`, styles: [":host{display:block}\n"] }]
|
|
117
|
+
}], propDecorators: { values: [{
|
|
118
|
+
type: Input
|
|
119
|
+
}], labels: [{
|
|
120
|
+
type: Input
|
|
121
|
+
}], colors: [{
|
|
122
|
+
type: Input
|
|
123
|
+
}], markerValue: [{
|
|
124
|
+
type: Input
|
|
125
|
+
}], ariaLabel: [{
|
|
126
|
+
type: Input
|
|
127
|
+
}], class: [{
|
|
128
|
+
type: Input
|
|
129
|
+
}] } });
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvY2F0ZWdvcnktYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQVVoQzs7Ozs7Ozs7O0dBU0c7QUE2QkgsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQjs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztJQUVoRCx1R0FBdUc7SUFDOUYsTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUMvQixnR0FBZ0c7SUFDdkYsTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUMvQixpSEFBaUg7SUFDeEcsTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUMvQixtSEFBbUg7SUFDMUcsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFDM0MsNkZBQTZGO0lBQ3BGLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIseUVBQXlFO0lBQ2hFLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFSCxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQsSUFBWSxLQUFLO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEs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bUJBQ04sdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQlQ7OEJBZ0JRLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuLyoqIE9uZSByZXNvbHZlZCBzZWdtZW50OiBpdHMgc2hhcmUgb2YgdGhlIGJhcidzIHdpZHRoLCBpdHMgcGFpbnQsIGFuZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5QmFyU2VnbWVudCB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHBlcmNlbnQ6IG51bWJlcjtcbiAgY29sb3I6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBiYXIgc3BsaXQgaW50byBwcm9wb3J0aW9uYWwsIGxhYmVsbGVkIHJhbmdlcyDigJQgZm9yIHNob3dpbmcgd2hlcmVcbiAqIG9uZSB2YWx1ZSBmYWxscyBhZ2FpbnN0IGEgc2NhbGUgbWFkZSBvZiBjYXRlZ29yaWVzIChhIGNyZWRpdCBzY29yZSBpbnNpZGVcbiAqIFwiUG9vciAvIEZhaXIgLyBHb29kIC8gRXhjZWxsZW50XCIsIGxhdGVuY3kgaW5zaWRlIFwiRmFzdCAvIE9LIC8gU2xvd1wiKS5cbiAqXG4gKiBTZWdtZW50cyB0YWtlIHRoZSBjaGFydCBwYWxldHRlIGJ5IHBvc2l0aW9uLCBzaW5jZSBhIGNhdGVnb3J5IGJhciBoYXMgbm9cbiAqIHN0YWJsZSBwZXItcmVuZGVyIGlkZW50aXR5IHRvIGtleSBjb2xvdXIgb2ZmIHRoZSB3YXkgYSBjaGFydCBzZXJpZXMgZG9lcyDigJRcbiAqIHBhc3MgYGNvbG9yc2AgdG8gb3ZlcnJpZGUuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNhdGVnb3J5LWJhcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgZ2FwLTAuNVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nRm9yPVwibGV0IHNlZ21lbnQgb2Ygc2VnbWVudHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJoLTIgZmlyc3Q6cm91bmRlZC1sLWZ1bGwgbGFzdDpyb3VuZGVkLXItZnVsbFwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwic2VnbWVudC5wZXJjZW50XCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzZWdtZW50LmNvbG9yXCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJzZWdtZW50LmxhYmVsIHx8IG51bGxcIlxuICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdJZj1cImNsYW1wZWRNYXJrZXIgIT09IG51bGxcIlxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTEvMiBoLTMgdy0zIC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTEvMiByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWJhY2tncm91bmQgYmctZm9yZWdyb3VuZCBzaGFkb3dcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwiY2xhbXBlZE1hcmtlclwiXG4gICAgICAgID48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHAgY2xhc3M9XCJzci1vbmx5XCI+e3sgc3VtbWFyeSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcnlCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIElkZW50aXR5IGZvciBgKm5nRm9yYCwgc28gYSByZWRyYXcgcGF0Y2hlcyBub2RlcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLiAqL1xuICB0cmFja0J5SW5kZXggPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICAvKiogV2lkdGggb2YgZWFjaCBzZWdtZW50LiBWYWx1ZXMgdGhhdCBhcmUgbm90IGZpbml0ZSBhbmQgZ3JlYXRlciB0aGFuIHplcm8gYXJlIGRyb3BwZWQuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgLyoqIE5hbWUgZm9yIGVhY2ggc2VnbWVudCwgdXNlZCBpbiB0aGUgYWNjZXNzaWJsZSBzdW1tYXJ5IGFuZCBhcyBhIHRpdGxlIHRvb2x0aXAuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIGxhYmVsczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIFBhaW50IGZvciBlYWNoIHNlZ21lbnQsIGJ5IGluZGV4LiBGYWxscyBiYWNrIHRvIHRoZSBjaGFydCBwYWxldHRlIC0tY2hhcnQtMSB0aHJvdWdoIC0tY2hhcnQtNS4gQGRlZmF1bHQgW10gKi9cbiAgQElucHV0KCkgY29sb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogUG9zaXRpb24gb2YgdGhlIHBvaW50ZXIsIDAtMTAwIG9uIHRoZSBzYW1lIHNjYWxlIHRoZSBzZWdtZW50cyBzdW0gdG8uIE9taXQgdG8gZHJhdyBubyBwb2ludGVyLiBAZGVmYXVsdCBudWxsICovXG4gIEBJbnB1dCgpIG1hcmtlclZhbHVlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFjY2Vzc2libGUgbmFtZSwgcHJlZml4ZWQgb250byB0aGUgc3Itb25seSBzdW1tYXJ5IG9mIHNlZ21lbnRzIGFuZCBtYXJrZXIuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbCA9ICcnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgYmFyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIHByaXZhdGUgZ2V0IHRvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLnJlZHVjZSgoc3VtLCB2KSA9PiAoTnVtYmVyLmlzRmluaXRlKHYpICYmIHYgPiAwID8gc3VtICsgdiA6IHN1bSksIDApO1xuICB9XG5cbiAgZ2V0IHNlZ21lbnRzKCk6IENhdGVnb3J5QmFyU2VnbWVudFtdIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWw7XG4gICAgaWYgKHRvdGFsIDw9IDApIHJldHVybiBbXTtcblxuICAgIHJldHVybiB0aGlzLnZhbHVlc1xuICAgICAgLm1hcCgodmFsdWUsIGkpID0+ICh7IHZhbHVlLCBpIH0pKVxuICAgICAgLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMClcbiAgICAgIC5tYXAoKHsgdmFsdWUsIGkgfSkgPT4gKHtcbiAgICAgICAgbGFiZWw6IHRoaXMubGFiZWxzW2ldID8/ICcnLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcGVyY2VudDogKHZhbHVlIC8gdG90YWwpICogMTAwLFxuICAgICAgICBjb2xvcjogdGhpcy5jb2xvcnNbaV0gfHwgJ3JnYih2YXIoLS1jaGFydC0nICsgKChpICUgNSkgKyAxKSArICcpKScsXG4gICAgICB9KSk7XG4gIH1cblxuICBnZXQgY2xhbXBlZE1hcmtlcigpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodGhpcy5tYXJrZXJWYWx1ZSA9PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUodGhpcy5tYXJrZXJWYWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIHRoaXMubWFya2VyVmFsdWUpKTtcbiAgfVxuXG4gIGdldCBzdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnNlZ21lbnRzLm1hcCgocykgPT4gKHMubGFiZWwgPyBzLmxhYmVsICsgJzogJyA6ICcnKSArIHMucGVyY2VudC50b0ZpeGVkKDApICsgJyUnKTtcbiAgICBjb25zdCBtYXJrZXIgPSB0aGlzLmNsYW1wZWRNYXJrZXIgIT09IG51bGwgPyAnLCBjdXJyZW50IHBvc2l0aW9uICcgKyB0aGlzLmNsYW1wZWRNYXJrZXIudG9GaXhlZCgwKSArICclJyA6ICcnO1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuYXJpYUxhYmVsID8gdGhpcy5hcmlhTGFiZWwgKyAnLiAnIDogJyc7XG4gICAgcmV0dXJuIHByZWZpeCArIHBhcnRzLmpvaW4oJywgJykgKyBtYXJrZXI7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oJ3ctZnVsbCcsIHRoaXMuY2xhc3MpO1xuICB9XG59XG4iXX0=
|