@ngutil/layout 0.0.3-dev.1 → 0.0.3-dev.11

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 (49) hide show
  1. package/docking/docking-content.component.d.ts +5 -0
  2. package/docking/docking-layout.component.d.ts +22 -0
  3. package/docking/docking-panel.component.d.ts +40 -0
  4. package/docking/index.d.ts +13 -0
  5. package/esm2022/docking/docking-content.component.mjs +11 -0
  6. package/esm2022/docking/docking-layout.component.mjs +140 -0
  7. package/esm2022/docking/docking-panel.component.mjs +179 -0
  8. package/esm2022/docking/index.mjs +20 -0
  9. package/esm2022/index.mjs +5 -0
  10. package/esm2022/l9/index.mjs +3 -0
  11. package/esm2022/l9/range.mjs +109 -0
  12. package/esm2022/l9/state.mjs +29 -0
  13. package/esm2022/ngutil-layout.mjs +5 -0
  14. package/esm2022/services/slots.service.mjs +240 -0
  15. package/esm2022/util/dimension-watcher.mjs +85 -0
  16. package/esm2022/util/dimension.mjs +2 -0
  17. package/esm2022/util/index.mjs +3 -0
  18. package/esm2022/util/media-watcher.mjs +29 -0
  19. package/esm2022/util/rect.mjs +2 -0
  20. package/fesm2022/ngutil-layout.mjs +822 -0
  21. package/fesm2022/ngutil-layout.mjs.map +1 -0
  22. package/index.d.ts +4 -0
  23. package/l9/index.d.ts +2 -0
  24. package/l9/range.d.ts +28 -0
  25. package/l9/state.d.ts +14 -0
  26. package/package.json +18 -5
  27. package/services/slots.service.d.ts +69 -0
  28. package/util/dimension-watcher.d.ts +4 -0
  29. package/util/dimension.d.ts +5 -0
  30. package/util/index.d.ts +4 -0
  31. package/util/media-watcher.d.ts +5 -0
  32. package/util/rect.d.ts +5 -0
  33. package/.eslintrc.json +0 -25
  34. package/.storybook/main.ts +0 -16
  35. package/.storybook/preview.ts +0 -0
  36. package/.storybook/tsconfig.json +0 -16
  37. package/jest.config.ts +0 -22
  38. package/ng-package.json +0 -7
  39. package/project.json +0 -73
  40. package/src/index.ts +0 -1
  41. package/src/lib/layout/layout.component.scss +0 -0
  42. package/src/lib/layout/layout.component.spec.ts +0 -22
  43. package/src/lib/layout/layout.component.stories.ts +0 -24
  44. package/src/lib/layout/layout.component.ts +0 -11
  45. package/src/test-setup.ts +0 -9
  46. package/tsconfig.json +0 -32
  47. package/tsconfig.lib.json +0 -19
  48. package/tsconfig.lib.prod.json +0 -9
  49. package/tsconfig.spec.json +0 -11
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class DockingContentComponent {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<DockingContentComponent, never>;
4
+ static ɵcmp: i0.ɵɵComponentDeclaration<DockingContentComponent, "nu-docking-content", ["nuDockingContent"], {}, {}, never, ["*"], true, never>;
5
+ }
@@ -0,0 +1,22 @@
1
+ import { AfterViewInit, OnChanges, QueryList, SimpleChanges } from "@angular/core";
2
+ import { Observable } from "rxjs";
3
+ import { Destructible } from "@ngutil/common";
4
+ import { DockingContentComponent } from "./docking-content.component";
5
+ import { DockingPanelComponent } from "./docking-panel.component";
6
+ import * as i0 from "@angular/core";
7
+ type DockingVerticalPosition = "top" | "middle" | "bottom";
8
+ type DockingHorizontalPositon = "left" | "center" | "right";
9
+ type DockingPosition = `${DockingVerticalPosition}:${DockingHorizontalPositon}`;
10
+ export type DockingRange = DockingVerticalPosition | DockingHorizontalPositon | DockingPosition | `${DockingPosition}-${DockingPosition}`;
11
+ export declare class DockingLayoutComponent extends Destructible implements AfterViewInit, OnChanges {
12
+ #private;
13
+ contentOnly: boolean;
14
+ contentComponent?: DockingContentComponent;
15
+ dockingPanels: QueryList<DockingPanelComponent>;
16
+ readonly panels: Observable<Array<DockingPanelComponent>>;
17
+ ngAfterViewInit(): void;
18
+ ngOnChanges(changes: SimpleChanges): void;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<DockingLayoutComponent, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<DockingLayoutComponent, "nu-docking", never, { "contentOnly": { "alias": "contentOnly"; "required": false; }; }, {}, ["contentComponent", "dockingPanels"], ["nu-docking-panel", "*", "nu-docking-content"], true, never>;
21
+ }
22
+ export {};
@@ -0,0 +1,40 @@
1
+ import { ElementRef } from "@angular/core";
2
+ import { BehaviorSubject, Observable } from "rxjs";
3
+ import { BooleanInput, Destructible, NumberWithUnit, NumberWithUnitInput } from "@ngutil/common";
4
+ import { L9Range, L9RangeName } from "../l9/range";
5
+ import * as i0 from "@angular/core";
6
+ export type DockingPanelState = "full" | "mini" | "hidden";
7
+ export type DockingPanelMode = "over" | "push" | "rigid";
8
+ export declare class DockingPanelComponent extends Destructible {
9
+ #private;
10
+ readonly el: ElementRef<any>;
11
+ set positionInput(val: L9Range | L9RangeName);
12
+ readonly position: BehaviorSubject<L9Range>;
13
+ set stateInput(val: DockingPanelState);
14
+ readonly state: BehaviorSubject<DockingPanelState>;
15
+ set modeInput(val: DockingPanelMode);
16
+ readonly mode: BehaviorSubject<DockingPanelMode>;
17
+ set fullSizeInput(val: NumberWithUnitInput);
18
+ set miniSizeInput(val: NumberWithUnitInput);
19
+ set minimizable(val: BooleanInput);
20
+ get minimizable(): boolean;
21
+ readonly fullSize: Observable<NumberWithUnit>;
22
+ readonly miniSize: Observable<NumberWithUnit>;
23
+ readonly changes: Observable<{
24
+ position: L9Range;
25
+ state: DockingPanelState;
26
+ mode: DockingPanelMode;
27
+ fullSize: NumberWithUnit;
28
+ miniSize: NumberWithUnit;
29
+ contentSize: import("../util").Dimension;
30
+ }>;
31
+ constructor();
32
+ open(): void;
33
+ close(): void;
34
+ minimize(): void;
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<DockingPanelComponent, never>;
36
+ static ɵcmp: i0.ɵɵComponentDeclaration<DockingPanelComponent, "nu-docking-panel", ["nuDockingPanel"], { "positionInput": { "alias": "position"; "required": false; }; "stateInput": { "alias": "state"; "required": false; }; "modeInput": { "alias": "mode"; "required": false; }; "fullSizeInput": { "alias": "fullSize"; "required": false; }; "miniSizeInput": { "alias": "miniSize"; "required": false; }; "minimizable": { "alias": "minimizable"; "required": false; }; }, { "state": "stateChanges"; }, never, ["*"], true, never>;
37
+ }
38
+ type ChangesObservable = typeof DockingPanelComponent.prototype.changes;
39
+ export type DockingPanelChanges = ChangesObservable extends Observable<infer T> ? T : never;
40
+ export {};
@@ -0,0 +1,13 @@
1
+ import { DockingContentComponent } from "./docking-content.component";
2
+ import { DockingLayoutComponent } from "./docking-layout.component";
3
+ import { DockingPanelComponent } from "./docking-panel.component";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./docking-layout.component";
6
+ import * as i2 from "./docking-panel.component";
7
+ import * as i3 from "./docking-content.component";
8
+ export { DockingLayoutComponent, DockingPanelComponent, DockingContentComponent };
9
+ export declare class NuDockingLayout {
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<NuDockingLayout, never>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NuDockingLayout, never, [typeof i1.DockingLayoutComponent, typeof i2.DockingPanelComponent, typeof i3.DockingContentComponent], [typeof i1.DockingLayoutComponent, typeof i2.DockingPanelComponent, typeof i3.DockingContentComponent]>;
12
+ static ɵinj: i0.ɵɵInjectorDeclaration<NuDockingLayout>;
13
+ }
@@ -0,0 +1,11 @@
1
+ import { Component } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class DockingContentComponent {
4
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DockingContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: DockingContentComponent, isStandalone: true, selector: "nu-docking-content", exportAs: ["nuDockingContent"], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [":host{display:flex;flex-flow:column nowrap;align-items:stretch;box-sizing:border-box;flex:1;overflow:auto}\n"] }); }
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DockingContentComponent, decorators: [{
8
+ type: Component,
9
+ args: [{ standalone: true, selector: "nu-docking-content", exportAs: "nuDockingContent", template: `<ng-content></ng-content>`, styles: [":host{display:flex;flex-flow:column nowrap;align-items:stretch;box-sizing:border-box;flex:1;overflow:auto}\n"] }]
10
+ }] });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2luZy1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xheW91dC9zcmMvZG9ja2luZy9kb2NraW5nLWNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7O0FBU3pDLE1BQU0sT0FBTyx1QkFBdUI7OEdBQXZCLHVCQUF1QjtrR0FBdkIsdUJBQXVCLDhHQUZ0QiwyQkFBMkI7OzJGQUU1Qix1QkFBdUI7a0JBUG5DLFNBQVM7aUNBQ00sSUFBSSxZQUNOLG9CQUFvQixZQUNwQixrQkFBa0IsWUFFbEIsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiBcIm51LWRvY2tpbmctY29udGVudFwiLFxuICAgIGV4cG9ydEFzOiBcIm51RG9ja2luZ0NvbnRlbnRcIixcbiAgICBzdHlsZVVybDogXCIuL2RvY2tpbmctY29udGVudC5jb21wb25lbnQuc2Nzc1wiLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgRG9ja2luZ0NvbnRlbnRDb21wb25lbnQge31cbiJdfQ==
@@ -0,0 +1,140 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, inject, Input, QueryList } from "@angular/core";
2
+ import { combineLatest, map, shareReplay, startWith, Subject, switchMap } from "rxjs";
3
+ import { Destructible, FastDOM } from "@ngutil/common";
4
+ import { DockingContentComponent } from "./docking-content.component";
5
+ import { DockingPanelComponent } from "./docking-panel.component";
6
+ import * as i0 from "@angular/core";
7
+ const RIGID_ZINDEX = 20;
8
+ const OVER_ZINDEX = RIGID_ZINDEX * 2;
9
+ export class DockingLayoutComponent extends Destructible {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.#el = inject((ElementRef));
13
+ this.contentOnly = false;
14
+ this.#reflow = new Subject();
15
+ }
16
+ #el;
17
+ #reflow;
18
+ ngAfterViewInit() {
19
+ // eslint-disable-next-line prettier/prettier
20
+ this.panels = this.dockingPanels.changes.pipe(startWith(null), map(() => this.dockingPanels.toArray()), shareReplay(1));
21
+ this.d
22
+ .sub(combineLatest({ panels: this.panels, reflow: this.#reflow.pipe(startWith(null)) }))
23
+ .pipe(switchMap(({ panels }) => combineLatest(panels.map(panel => panel.changes.pipe(map(changes => {
24
+ return { panel, changes };
25
+ }))))))
26
+ .subscribe(this.#layout.bind(this));
27
+ }
28
+ ngOnChanges(changes) {
29
+ if ("contentOnly" in changes || "positionMode" in changes) {
30
+ this.#reflow.next();
31
+ }
32
+ }
33
+ #layout(entries) {
34
+ let paddingTop = 0;
35
+ let paddingRight = 0;
36
+ let paddingBottom = 0;
37
+ let paddingLeft = 0;
38
+ let rigidZIndex = RIGID_ZINDEX;
39
+ let overZIndex = OVER_ZINDEX;
40
+ if (this.contentOnly) {
41
+ // TODO:...
42
+ }
43
+ else {
44
+ for (const entry of entries) {
45
+ const panelState = entry.changes;
46
+ const panelSize = panelState.state === "full"
47
+ ? panelState.fullSize.value
48
+ : panelState.state === "mini"
49
+ ? panelState.miniSize.value
50
+ : 0;
51
+ const isHorizontal = panelState.position.orient === "horizontal";
52
+ const isRigid = panelState.mode === "rigid";
53
+ let panelTop = null;
54
+ let panelRight = null;
55
+ let panelBottom = null;
56
+ let panelLeft = null;
57
+ if (isHorizontal) {
58
+ panelLeft = 0;
59
+ panelRight = 0;
60
+ if (panelState.position.cells[0].v === "top") {
61
+ if (isRigid) {
62
+ paddingTop = Math.max(paddingTop, panelSize);
63
+ }
64
+ panelTop = 0;
65
+ }
66
+ else if (panelState.position.cells[0].v === "bottom") {
67
+ if (isRigid) {
68
+ paddingBottom = Math.max(paddingBottom, panelSize);
69
+ }
70
+ panelBottom = 0;
71
+ }
72
+ }
73
+ else {
74
+ panelTop = 0;
75
+ panelBottom = 0;
76
+ if (panelState.position.cells[0].h === "left") {
77
+ if (isRigid) {
78
+ paddingLeft = Math.max(paddingLeft, panelSize);
79
+ }
80
+ panelLeft = 0;
81
+ }
82
+ else if (panelState.position.cells[0].h === "right") {
83
+ if (isRigid) {
84
+ paddingRight = Math.max(paddingRight, panelSize);
85
+ }
86
+ panelRight = 0;
87
+ }
88
+ }
89
+ FastDOM.setStyle(entry.panel.el.nativeElement, {
90
+ "z-index": `${isRigid ? rigidZIndex++ : overZIndex++}`,
91
+ "--docking-panel-t": panelTop != null ? `${panelTop}px` : null,
92
+ "--docking-panel-r": panelRight != null ? `${panelRight}px` : null,
93
+ "--docking-panel-b": panelBottom != null ? `${panelBottom}px` : null,
94
+ "--docking-panel-l": panelLeft != null ? `${panelLeft}px` : null
95
+ });
96
+ }
97
+ FastDOM.setStyle(this.#el.nativeElement, {
98
+ "--docking-layout-top": `${paddingTop}px`,
99
+ "--docking-layout-right": `${paddingRight}px`,
100
+ "--docking-layout-bottom": `${paddingBottom}px`,
101
+ "--docking-layout-left": `${paddingLeft}px`
102
+ });
103
+ }
104
+ }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DockingLayoutComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: DockingLayoutComponent, isStandalone: true, selector: "nu-docking", inputs: { contentOnly: "contentOnly" }, queries: [{ propertyName: "contentComponent", first: true, predicate: DockingContentComponent, descendants: true }, { propertyName: "dockingPanels", predicate: DockingPanelComponent }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
107
+ <ng-content select="nu-docking-panel"></ng-content>
108
+
109
+ @if (!contentComponent) {
110
+ <nu-docking-content>
111
+ <ng-content></ng-content>
112
+ </nu-docking-content>
113
+ } @else {
114
+ <ng-content select="nu-docking-content"></ng-content>
115
+ }
116
+ `, isInline: true, styles: [":host{---docking-layout-top: var(--docking-layout-top, 0px);---docking-layout-right: var(--docking-layout-right, 0px);---docking-layout-bottom: var(--docking-layout-bottom, 0px);---docking-layout-left: var(--docking-layout-left, 0px);---docking-layout-anim-duration: var(--docking-layout-anim-duration, .2s);---docking-layout-anim-ease: var(--docking-layout-anim-ease, ease-out);display:flex;flex-flow:column nowrap;align-items:stretch;position:relative;overflow:hidden;box-sizing:border-box;z-index:0;padding:var(---docking-layout-top) var(---docking-layout-right) var(---docking-layout-bottom) var(---docking-layout-left);transition:padding var(---docking-layout-anim-duration) var(---docking-layout-anim-ease)}\n"], dependencies: [{ kind: "component", type: DockingContentComponent, selector: "nu-docking-content", exportAs: ["nuDockingContent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
117
+ }
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DockingLayoutComponent, decorators: [{
119
+ type: Component,
120
+ args: [{ selector: "nu-docking", standalone: true, imports: [DockingContentComponent], template: `
121
+ <ng-content select="nu-docking-panel"></ng-content>
122
+
123
+ @if (!contentComponent) {
124
+ <nu-docking-content>
125
+ <ng-content></ng-content>
126
+ </nu-docking-content>
127
+ } @else {
128
+ <ng-content select="nu-docking-content"></ng-content>
129
+ }
130
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{---docking-layout-top: var(--docking-layout-top, 0px);---docking-layout-right: var(--docking-layout-right, 0px);---docking-layout-bottom: var(--docking-layout-bottom, 0px);---docking-layout-left: var(--docking-layout-left, 0px);---docking-layout-anim-duration: var(--docking-layout-anim-duration, .2s);---docking-layout-anim-ease: var(--docking-layout-anim-ease, ease-out);display:flex;flex-flow:column nowrap;align-items:stretch;position:relative;overflow:hidden;box-sizing:border-box;z-index:0;padding:var(---docking-layout-top) var(---docking-layout-right) var(---docking-layout-bottom) var(---docking-layout-left);transition:padding var(---docking-layout-anim-duration) var(---docking-layout-anim-ease)}\n"] }]
131
+ }], propDecorators: { contentOnly: [{
132
+ type: Input
133
+ }], contentComponent: [{
134
+ type: ContentChild,
135
+ args: [DockingContentComponent]
136
+ }], dockingPanels: [{
137
+ type: ContentChildren,
138
+ args: [DockingPanelComponent]
139
+ }] } });
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2luZy1sYXlvdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbGF5b3V0L3NyYy9kb2NraW5nL2RvY2tpbmctbGF5b3V0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLFNBQVMsRUFFWixNQUFNLGVBQWUsQ0FBQTtBQUV0QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFakcsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUNyRSxPQUFPLEVBQTRCLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7O0FBVzNGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQTtBQUN2QixNQUFNLFdBQVcsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFBO0FBc0JwQyxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsWUFBWTtJQWxCeEQ7O1FBbUJhLFFBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUF1QixDQUFBLENBQUMsQ0FBQTtRQUVyQyxnQkFBVyxHQUFHLEtBQUssQ0FBQTtRQVE1QixZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtLQThHaEM7SUF4SFksR0FBRyxDQUFrQztJQVU5QyxPQUFPLENBQXNCO0lBRTdCLGVBQWU7UUFDWCw2Q0FBNkM7UUFDNUMsSUFBNkQsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNuRyxTQUFTLENBQUMsSUFBSSxD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QUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgU3ViamVjdCwgc3dpdGNoTWFwIH0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBEZXN0cnVjdGlibGUsIEZhc3RET00gfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG5pbXBvcnQgeyBEb2NraW5nQ29udGVudENvbXBvbmVudCB9IGZyb20gXCIuL2RvY2tpbmctY29udGVudC5jb21wb25lbnRcIlxuaW1wb3J0IHsgdHlwZSBEb2NraW5nUGFuZWxDaGFuZ2VzLCBEb2NraW5nUGFuZWxDb21wb25lbnQgfSBmcm9tIFwiLi9kb2NraW5nLXBhbmVsLmNvbXBvbmVudFwiXG5cbnR5cGUgRG9ja2luZ1ZlcnRpY2FsUG9zaXRpb24gPSBcInRvcFwiIHwgXCJtaWRkbGVcIiB8IFwiYm90dG9tXCJcbnR5cGUgRG9ja2luZ0hvcml6b250YWxQb3NpdG9uID0gXCJsZWZ0XCIgfCBcImNlbnRlclwiIHwgXCJyaWdodFwiXG50eXBlIERvY2tpbmdQb3NpdGlvbiA9IGAke0RvY2tpbmdWZXJ0aWNhbFBvc2l0aW9ufToke0RvY2tpbmdIb3Jpem9udGFsUG9zaXRvbn1gXG5leHBvcnQgdHlwZSBEb2NraW5nUmFuZ2UgPVxuICAgIHwgRG9ja2luZ1ZlcnRpY2FsUG9zaXRpb25cbiAgICB8IERvY2tpbmdIb3Jpem9udGFsUG9zaXRvblxuICAgIHwgRG9ja2luZ1Bvc2l0aW9uXG4gICAgfCBgJHtEb2NraW5nUG9zaXRpb259LSR7RG9ja2luZ1Bvc2l0aW9ufWBcblxuY29uc3QgUklHSURfWklOREVYID0gMjBcbmNvbnN0IE9WRVJfWklOREVYID0gUklHSURfWklOREVYICogMlxuXG50eXBlIFBhbmVsc0NoYW5nZXMgPSBBcnJheTx7IHBhbmVsOiBEb2NraW5nUGFuZWxDb21wb25lbnQ7IGNoYW5nZXM6IERvY2tpbmdQYW5lbENoYW5nZXMgfT5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnUtZG9ja2luZ1wiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0RvY2tpbmdDb250ZW50Q29tcG9uZW50XSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJudS1kb2NraW5nLXBhbmVsXCI+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIEBpZiAoIWNvbnRlbnRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIDxudS1kb2NraW5nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9udS1kb2NraW5nLWNvbnRlbnQ+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibnUtZG9ja2luZy1jb250ZW50XCI+PC9uZy1jb250ZW50PlxuICAgICAgICB9XG4gICAgYCxcbiAgICBzdHlsZVVybDogXCIuL2RvY2tpbmctbGF5b3V0LmNvbXBvbmVudC5zY3NzXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRG9ja2luZ0xheW91dENvbXBvbmVudCBleHRlbmRzIERlc3RydWN0aWJsZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gICAgcmVhZG9ubHkgI2VsID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KVxuXG4gICAgQElucHV0KCkgY29udGVudE9ubHkgPSBmYWxzZVxuXG4gICAgQENvbnRlbnRDaGlsZChEb2NraW5nQ29udGVudENvbXBvbmVudCkgY29udGVudENvbXBvbmVudD86IERvY2tpbmdDb250ZW50Q29tcG9uZW50XG4gICAgQENvbnRlbnRDaGlsZHJlbihEb2NraW5nUGFuZWxDb21wb25lbnQpIGRvY2tpbmdQYW5lbHMhOiBRdWVyeUxpc3Q8RG9ja2luZ1BhbmVsQ29tcG9uZW50PlxuXG4gICAgLy8gcmVhZG9ubHkgcGFuZWxzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYW5lbFJlZltdPihbXSlcbiAgICByZWFkb25seSBwYW5lbHMhOiBPYnNlcnZhYmxlPEFycmF5PERvY2tpbmdQYW5lbENvbXBvbmVudD4+XG5cbiAgICAjcmVmbG93ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJldHRpZXIvcHJldHRpZXJcbiAgICAgICAgKHRoaXMgYXMgeyBwYW5lbHM6IE9ic2VydmFibGU8QXJyYXk8RG9ja2luZ1BhbmVsQ29tcG9uZW50Pj4gfSkucGFuZWxzID0gdGhpcy5kb2NraW5nUGFuZWxzLmNoYW5nZXMucGlwZShcbiAgICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLmRvY2tpbmdQYW5lbHMudG9BcnJheSgpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmRcbiAgICAgICAgICAgIC5zdWIoY29tYmluZUxhdGVzdCh7IHBhbmVsczogdGhpcy5wYW5lbHMsIHJlZmxvdzogdGhpcy4jcmVmbG93LnBpcGUoc3RhcnRXaXRoKG51bGwpKSB9KSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoeyBwYW5lbHMgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgY29tYmluZUxhdGVzdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVscy5tYXAocGFuZWwgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5jaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChjaGFuZ2VzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhbmVsLCBjaGFuZ2VzIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuI2xheW91dC5iaW5kKHRoaXMpKVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKFwiY29udGVudE9ubHlcIiBpbiBjaGFuZ2VzIHx8IFwicG9zaXRpb25Nb2RlXCIgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy4jcmVmbG93Lm5leHQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgI2xheW91dChlbnRyaWVzOiBQYW5lbHNDaGFuZ2VzKSB7XG4gICAgICAgIGxldCBwYWRkaW5nVG9wID0gMFxuICAgICAgICBsZXQgcGFkZGluZ1JpZ2h0ID0gMFxuICAgICAgICBsZXQgcGFkZGluZ0JvdHRvbSA9IDBcbiAgICAgICAgbGV0IHBhZGRpbmdMZWZ0ID0gMFxuICAgICAgICBsZXQgcmlnaWRaSW5kZXggPSBSSUdJRF9aSU5ERVhcbiAgICAgICAgbGV0IG92ZXJaSW5kZXggPSBPVkVSX1pJTkRFWFxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRPbmx5KSB7XG4gICAgICAgICAgICAvLyBUT0RPOi4uLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxTdGF0ZSA9IGVudHJ5LmNoYW5nZXNcbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbFNpemUgPVxuICAgICAgICAgICAgICAgICAgICBwYW5lbFN0YXRlLnN0YXRlID09PSBcImZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwYW5lbFN0YXRlLmZ1bGxTaXplLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhbmVsU3RhdGUuc3RhdGUgPT09IFwibWluaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gcGFuZWxTdGF0ZS5taW5pU2l6ZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IDBcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHBhbmVsU3RhdGUucG9zaXRpb24ub3JpZW50ID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmlnaWQgPSBwYW5lbFN0YXRlLm1vZGUgPT09IFwicmlnaWRcIlxuXG4gICAgICAgICAgICAgICAgbGV0IHBhbmVsVG9wID0gbnVsbFxuICAgICAgICAgICAgICAgIGxldCBwYW5lbFJpZ2h0ID0gbnVsbFxuICAgICAgICAgICAgICAgIGxldCBwYW5lbEJvdHRvbSA9IG51bGxcbiAgICAgICAgICAgICAgICBsZXQgcGFuZWxMZWZ0ID0gbnVsbFxuXG4gICAgICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExlZnQgPSAwXG4gICAgICAgICAgICAgICAgICAgIHBhbmVsUmlnaHQgPSAwXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYW5lbFN0YXRlLnBvc2l0aW9uLmNlbGxzWzBdLnYgPT09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JpZ2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1RvcCA9IE1hdGgubWF4KHBhZGRpbmdUb3AsIHBhbmVsU2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsVG9wID0gMFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhbmVsU3RhdGUucG9zaXRpb24uY2VsbHNbMF0udiA9PT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmlnaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tID0gTWF0aC5tYXgocGFkZGluZ0JvdHRvbSwgcGFuZWxTaXplKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxCb3R0b20gPSAwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbFRvcCA9IDBcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxCb3R0b20gPSAwXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhbmVsU3RhdGUucG9zaXRpb24uY2VsbHNbMF0uaCA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JpZ2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQgPSBNYXRoLm1heChwYWRkaW5nTGVmdCwgcGFuZWxTaXplKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxMZWZ0ID0gMFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhbmVsU3RhdGUucG9zaXRpb24uY2VsbHNbMF0uaCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSaWdpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodCA9IE1hdGgubWF4KHBhZGRpbmdSaWdodCwgcGFuZWxTaXplKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxSaWdodCA9IDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEZhc3RET00uc2V0U3R5bGUoZW50cnkucGFuZWwuZWwubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogYCR7aXNSaWdpZCA/IHJpZ2lkWkluZGV4KysgOiBvdmVyWkluZGV4Kyt9YCxcbiAgICAgICAgICAgICAgICAgICAgXCItLWRvY2tpbmctcGFuZWwtdFwiOiBwYW5lbFRvcCAhPSBudWxsID8gYCR7cGFuZWxUb3B9cHhgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgXCItLWRvY2tpbmctcGFuZWwtclwiOiBwYW5lbFJpZ2h0ICE9IG51bGwgPyBgJHtwYW5lbFJpZ2h0fXB4YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIFwiLS1kb2NraW5nLXBhbmVsLWJcIjogcGFuZWxCb3R0b20gIT0gbnVsbCA/IGAke3BhbmVsQm90dG9tfXB4YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIFwiLS1kb2NraW5nLXBhbmVsLWxcIjogcGFuZWxMZWZ0ICE9IG51bGwgPyBgJHtwYW5lbExlZnR9cHhgIDogbnVsbFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEZhc3RET00uc2V0U3R5bGUodGhpcy4jZWwubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgICAgICAgIFwiLS1kb2NraW5nLWxheW91dC10b3BcIjogYCR7cGFkZGluZ1RvcH1weGAsXG4gICAgICAgICAgICAgICAgXCItLWRvY2tpbmctbGF5b3V0LXJpZ2h0XCI6IGAke3BhZGRpbmdSaWdodH1weGAsXG4gICAgICAgICAgICAgICAgXCItLWRvY2tpbmctbGF5b3V0LWJvdHRvbVwiOiBgJHtwYWRkaW5nQm90dG9tfXB4YCxcbiAgICAgICAgICAgICAgICBcIi0tZG9ja2luZy1sYXlvdXQtbGVmdFwiOiBgJHtwYWRkaW5nTGVmdH1weGBcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,179 @@
1
+ import { Component, ElementRef, inject, Input, Output } from "@angular/core";
2
+ import { BehaviorSubject, combineLatest, map, of, shareReplay, switchMap } from "rxjs";
3
+ import { coerceBoolAttr, Destructible, FastDOM, NumberWithUnit } from "@ngutil/common";
4
+ import { L9Range } from "../l9/range";
5
+ import { watchDimension } from "../util";
6
+ import * as i0 from "@angular/core";
7
+ const DEFAULT_POSITION = L9Range.coerce("left");
8
+ const HIDDEN_SIZE = new NumberWithUnit(0, "px");
9
+ const AUTO_SIZE = NumberWithUnit.coerce("auto");
10
+ export class DockingPanelComponent extends Destructible {
11
+ set positionInput(val) {
12
+ const coerced = L9Range.coerce(val);
13
+ if (coerced.orient === "rect") {
14
+ throw new Error(`Invalid position value: ${val}`);
15
+ }
16
+ if (!this.position.value.isEq(coerced)) {
17
+ this.position.next(coerced);
18
+ }
19
+ }
20
+ set stateInput(val) {
21
+ if (this.state.value !== val) {
22
+ this.state.next(val);
23
+ }
24
+ }
25
+ set modeInput(val) {
26
+ if (this.mode.value !== val) {
27
+ this.mode.next(val);
28
+ }
29
+ }
30
+ set fullSizeInput(val) {
31
+ const coerced = NumberWithUnit.coerce(val, "px");
32
+ if (this.#fullSize.value !== coerced) {
33
+ this.#fullSize.next(coerced);
34
+ }
35
+ }
36
+ #fullSize;
37
+ set miniSizeInput(val) {
38
+ const coerced = NumberWithUnit.coerce(val, "px");
39
+ if (this.#miniSize.value !== coerced) {
40
+ this.#miniSize.next(coerced);
41
+ }
42
+ }
43
+ #miniSize;
44
+ set minimizable(val) {
45
+ this.#minimizable = coerceBoolAttr(val);
46
+ this.#minimizableAuto = false;
47
+ }
48
+ get minimizable() {
49
+ return this.#minimizable;
50
+ }
51
+ #minimizable;
52
+ #minimizableAuto;
53
+ #contentSize;
54
+ #autoSize;
55
+ constructor() {
56
+ super();
57
+ this.el = inject((ElementRef));
58
+ this.position = new BehaviorSubject(DEFAULT_POSITION);
59
+ this.state = new BehaviorSubject("full");
60
+ this.mode = new BehaviorSubject("rigid");
61
+ this.#fullSize = new BehaviorSubject(AUTO_SIZE);
62
+ this.#miniSize = new BehaviorSubject(HIDDEN_SIZE);
63
+ this.#minimizable = false;
64
+ this.#minimizableAuto = true;
65
+ this.#contentSize = watchDimension(this.el.nativeElement, "scroll-box").pipe(shareReplay(1));
66
+ this.#autoSize = combineLatest({
67
+ dim: this.#contentSize,
68
+ pos: this.position
69
+ }).pipe(map(({ dim, pos }) => {
70
+ if (pos.orient === "horizontal") {
71
+ return dim.height;
72
+ }
73
+ else {
74
+ return dim.width;
75
+ }
76
+ }), shareReplay(1));
77
+ this.fullSize = this.#fullSize.pipe(switchMap(size => {
78
+ if (size.unit === "auto") {
79
+ return this.#autoSize;
80
+ }
81
+ else {
82
+ return of(size);
83
+ }
84
+ }), shareReplay(1));
85
+ this.miniSize = this.#miniSize.pipe(switchMap(size => {
86
+ if (size.unit === "auto") {
87
+ return this.#autoSize;
88
+ }
89
+ else {
90
+ return of(size);
91
+ }
92
+ }), shareReplay(1));
93
+ this.changes = combineLatest({
94
+ position: this.position,
95
+ state: this.state,
96
+ mode: this.mode,
97
+ fullSize: this.fullSize,
98
+ miniSize: this.miniSize,
99
+ contentSize: this.#contentSize
100
+ });
101
+ this.d.sub(this.changes).subscribe(changes => {
102
+ if (this.#minimizableAuto) {
103
+ this.#minimizable = this.#miniSize.value.value !== 0;
104
+ }
105
+ FastDOM.setAttributes(this.el.nativeElement, {
106
+ state: changes.state,
107
+ orient: changes.position.orient,
108
+ mode: changes.mode,
109
+ side: changes.position.orient === "horizontal" ? changes.position.cells[0].v : changes.position.cells[0].h
110
+ });
111
+ const isHorizontal = changes.position.orient === "horizontal";
112
+ let w = null;
113
+ let h = null;
114
+ // TODO: when change state from mini -> hidden, currently wrong behavior
115
+ // the good behavior is to not gain fullSize ang go to hidden
116
+ if (changes.state === "mini") {
117
+ if (isHorizontal) {
118
+ h = changes.miniSize.unit === "auto" ? changes.contentSize.height : changes.miniSize;
119
+ }
120
+ else {
121
+ w = changes.miniSize.unit === "auto" ? changes.contentSize.width : changes.miniSize;
122
+ }
123
+ }
124
+ else {
125
+ if (isHorizontal) {
126
+ h = changes.fullSize.unit === "auto" ? changes.contentSize.height : changes.fullSize;
127
+ }
128
+ else {
129
+ w = changes.fullSize.unit === "auto" ? changes.contentSize.width : changes.fullSize;
130
+ }
131
+ }
132
+ FastDOM.setStyle(this.el.nativeElement, {
133
+ "--docking-panel-w": w != null ? `${w}` : null,
134
+ "--docking-panel-h": h != null ? `${h}` : null,
135
+ "--docking-panel-content-w": changes.contentSize.width,
136
+ "--docking-panel-content-h": changes.contentSize.height
137
+ }, () => FastDOM.setAttributes(this.el.nativeElement, { animate: "" }));
138
+ });
139
+ }
140
+ open() {
141
+ this.state.next("full");
142
+ }
143
+ close() {
144
+ this.state.next("hidden");
145
+ }
146
+ minimize() {
147
+ if (this.minimizable) {
148
+ this.state.next("mini");
149
+ }
150
+ }
151
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DockingPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
152
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: DockingPanelComponent, isStandalone: true, selector: "nu-docking-panel", inputs: { positionInput: ["position", "positionInput"], stateInput: ["state", "stateInput"], modeInput: ["mode", "modeInput"], fullSizeInput: ["fullSize", "fullSizeInput"], miniSizeInput: ["miniSize", "miniSizeInput"], minimizable: "minimizable" }, outputs: { state: "stateChanges" }, exportAs: ["nuDockingPanel"], usesInheritance: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [":host{---docking-panel-t: var(--docking-panel-t, auto);---docking-panel-r: var(--docking-panel-r, auto);---docking-panel-b: var(--docking-panel-b, auto);---docking-panel-l: var(--docking-panel-l, auto);---docking-panel-w: var(--docking-panel-w, auto);---docking-panel-h: var(--docking-panel-h, auto);---docking-panel-content-w: var(--docking-panel-content-w, var(---docking-panel-w));---docking-panel-content-h: var(--docking-panel-content-h, var(---docking-panel-h));display:flex;flex-flow:column nowrap;align-items:stretch;position:absolute;box-sizing:border-box;top:var(---docking-panel-t);right:var(---docking-panel-r);bottom:var(---docking-panel-b);left:var(---docking-panel-l);width:var(---docking-panel-w);height:var(---docking-panel-h)}:host[animate]{transition:transform var(---docking-layout-anim-duration) var(---docking-layout-anim-ease),width var(---docking-layout-anim-duration) var(---docking-layout-anim-ease),height var(---docking-layout-anim-duration) var(---docking-layout-anim-ease)}:host[side=top],:host[side=left]{---docking-panel-t-hide: -100%;---docking-panel-t-visible: 0%}:host[side=bottom],:host[side=right]{---docking-panel-t-hide: 100%;---docking-panel-t-visible: 0%}:host[state=hidden][orient=horizontal]{transform:translateY(var(---docking-panel-t-hide))}:host[state=hidden][orient=vertical]{transform:translate(var(---docking-panel-t-hide))}:host:not([state=hidden])[orient=horizontal]{transform:translateY(var(---docking-panel-t-visible))}:host:not([state=hidden])[orient=vertical]{transform:translate(var(---docking-panel-t-visible))}\n"] }); }
153
+ }
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DockingPanelComponent, decorators: [{
155
+ type: Component,
156
+ args: [{ standalone: true, selector: "nu-docking-panel", exportAs: "nuDockingPanel", template: `<ng-content></ng-content>`, styles: [":host{---docking-panel-t: var(--docking-panel-t, auto);---docking-panel-r: var(--docking-panel-r, auto);---docking-panel-b: var(--docking-panel-b, auto);---docking-panel-l: var(--docking-panel-l, auto);---docking-panel-w: var(--docking-panel-w, auto);---docking-panel-h: var(--docking-panel-h, auto);---docking-panel-content-w: var(--docking-panel-content-w, var(---docking-panel-w));---docking-panel-content-h: var(--docking-panel-content-h, var(---docking-panel-h));display:flex;flex-flow:column nowrap;align-items:stretch;position:absolute;box-sizing:border-box;top:var(---docking-panel-t);right:var(---docking-panel-r);bottom:var(---docking-panel-b);left:var(---docking-panel-l);width:var(---docking-panel-w);height:var(---docking-panel-h)}:host[animate]{transition:transform var(---docking-layout-anim-duration) var(---docking-layout-anim-ease),width var(---docking-layout-anim-duration) var(---docking-layout-anim-ease),height var(---docking-layout-anim-duration) var(---docking-layout-anim-ease)}:host[side=top],:host[side=left]{---docking-panel-t-hide: -100%;---docking-panel-t-visible: 0%}:host[side=bottom],:host[side=right]{---docking-panel-t-hide: 100%;---docking-panel-t-visible: 0%}:host[state=hidden][orient=horizontal]{transform:translateY(var(---docking-panel-t-hide))}:host[state=hidden][orient=vertical]{transform:translate(var(---docking-panel-t-hide))}:host:not([state=hidden])[orient=horizontal]{transform:translateY(var(---docking-panel-t-visible))}:host:not([state=hidden])[orient=vertical]{transform:translate(var(---docking-panel-t-visible))}\n"] }]
157
+ }], ctorParameters: () => [], propDecorators: { positionInput: [{
158
+ type: Input,
159
+ args: ["position"]
160
+ }], stateInput: [{
161
+ type: Input,
162
+ args: ["state"]
163
+ }], state: [{
164
+ type: Output,
165
+ args: ["stateChanges"]
166
+ }], modeInput: [{
167
+ type: Input,
168
+ args: ["mode"]
169
+ }], fullSizeInput: [{
170
+ type: Input,
171
+ args: ["fullSize"]
172
+ }], miniSizeInput: [{
173
+ type: Input,
174
+ args: ["miniSize"]
175
+ }], minimizable: [{
176
+ type: Input,
177
+ args: ["minimizable"]
178
+ }] } });
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2luZy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYXlvdXQvc3JjL2RvY2tpbmcvZG9ja2luZy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRWxHLE9BQU8sRUFFSCxjQUFjLEVBQ2QsWUFBWSxFQUNaLE9BQU8sRUFDUCxjQUFjLEVBRWpCLE1BQU0sZ0JBQWdCLENBQUE7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBZSxNQUFNLGFBQWEsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFBOztBQUt4QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDL0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQy9DLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFTL0MsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFlBQVk7SUFHbkQsSUFDSSxhQUFhLENBQUMsR0FBMEI7UUFDeEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUNyRCxDQUFD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VyxDQUFDLE1BQU07YUFDMUQsRUFDRCxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQ3RFLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxJQUFJO1FBQ0EsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0IsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzNCLENBQUM7SUFDTCxDQUFDOzhHQTFLUSxxQkFBcUI7a0dBQXJCLHFCQUFxQiw4WkFGcEIsMkJBQTJCOzsyRkFFNUIscUJBQXFCO2tCQVBqQyxTQUFTO2lDQUNNLElBQUksWUFDTixrQkFBa0IsWUFDbEIsZ0JBQWdCLFlBRWhCLDJCQUEyQjt3REFNakMsYUFBYTtzQkFEaEIsS0FBSzt1QkFBQyxVQUFVO2dCQWNiLFVBQVU7c0JBRGIsS0FBSzt1QkFBQyxPQUFPO2dCQU9MLEtBQUs7c0JBRGIsTUFBTTt1QkFBQyxjQUFjO2dCQUlsQixTQUFTO3NCQURaLEtBQUs7dUJBQUMsTUFBTTtnQkFTVCxhQUFhO3NCQURoQixLQUFLO3VCQUFDLFVBQVU7Z0JBVWIsYUFBYTtzQkFEaEIsS0FBSzt1QkFBQyxVQUFVO2dCQVViLFdBQVc7c0JBRGQsS0FBSzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCB9IGZyb20gXCJyeGpzXCJcblxuaW1wb3J0IHtcbiAgICBCb29sZWFuSW5wdXQsXG4gICAgY29lcmNlQm9vbEF0dHIsXG4gICAgRGVzdHJ1Y3RpYmxlLFxuICAgIEZhc3RET00sXG4gICAgTnVtYmVyV2l0aFVuaXQsXG4gICAgTnVtYmVyV2l0aFVuaXRJbnB1dFxufSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG5pbXBvcnQgeyBMOVJhbmdlLCBMOVJhbmdlTmFtZSB9IGZyb20gXCIuLi9sOS9yYW5nZVwiXG5pbXBvcnQgeyB3YXRjaERpbWVuc2lvbiB9IGZyb20gXCIuLi91dGlsXCJcblxuZXhwb3J0IHR5cGUgRG9ja2luZ1BhbmVsU3RhdGUgPSBcImZ1bGxcIiB8IFwibWluaVwiIHwgXCJoaWRkZW5cIlxuZXhwb3J0IHR5cGUgRG9ja2luZ1BhbmVsTW9kZSA9IFwib3ZlclwiIHwgXCJwdXNoXCIgfCBcInJpZ2lkXCJcblxuY29uc3QgREVGQVVMVF9QT1NJVElPTiA9IEw5UmFuZ2UuY29lcmNlKFwibGVmdFwiKVxuY29uc3QgSElEREVOX1NJWkUgPSBuZXcgTnVtYmVyV2l0aFVuaXQoMCwgXCJweFwiKVxuY29uc3QgQVVUT19TSVpFID0gTnVtYmVyV2l0aFVuaXQuY29lcmNlKFwiYXV0b1wiKVxuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiBcIm51LWRvY2tpbmctcGFuZWxcIixcbiAgICBleHBvcnRBczogXCJudURvY2tpbmdQYW5lbFwiLFxuICAgIHN0eWxlVXJsOiBcIi4vZG9ja2luZy1wYW5lbC5jb21wb25lbnQuc2Nzc1wiLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgRG9ja2luZ1BhbmVsQ29tcG9uZW50IGV4dGVuZHMgRGVzdHJ1Y3RpYmxlIHtcbiAgICByZWFkb25seSBlbCA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50PilcblxuICAgIEBJbnB1dChcInBvc2l0aW9uXCIpXG4gICAgc2V0IHBvc2l0aW9uSW5wdXQodmFsOiBMOVJhbmdlIHwgTDlSYW5nZU5hbWUpIHtcbiAgICAgICAgY29uc3QgY29lcmNlZCA9IEw5UmFuZ2UuY29lcmNlKHZhbClcbiAgICAgICAgaWYgKGNvZXJjZWQub3JpZW50ID09PSBcInJlY3RcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvc2l0aW9uIHZhbHVlOiAke3ZhbH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnBvc2l0aW9uLnZhbHVlLmlzRXEoY29lcmNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ubmV4dChjb2VyY2VkKVxuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWRvbmx5IHBvc2l0aW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMOVJhbmdlPihERUZBVUxUX1BPU0lUSU9OKVxuXG4gICAgQElucHV0KFwic3RhdGVcIilcbiAgICBzZXQgc3RhdGVJbnB1dCh2YWw6IERvY2tpbmdQYW5lbFN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlICE9PSB2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubmV4dCh2YWwpXG4gICAgICAgIH1cbiAgICB9XG4gICAgQE91dHB1dChcInN0YXRlQ2hhbmdlc1wiKVxuICAgIHJlYWRvbmx5IHN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEb2NraW5nUGFuZWxTdGF0ZT4oXCJmdWxsXCIpXG5cbiAgICBASW5wdXQoXCJtb2RlXCIpXG4gICAgc2V0IG1vZGVJbnB1dCh2YWw6IERvY2tpbmdQYW5lbE1vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZS52YWx1ZSAhPT0gdmFsKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGUubmV4dCh2YWwpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZG9ubHkgbW9kZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RG9ja2luZ1BhbmVsTW9kZT4oXCJyaWdpZFwiKVxuXG4gICAgQElucHV0KFwiZnVsbFNpemVcIilcbiAgICBzZXQgZnVsbFNpemVJbnB1dCh2YWw6IE51bWJlcldpdGhVbml0SW5wdXQpIHtcbiAgICAgICAgY29uc3QgY29lcmNlZCA9IE51bWJlcldpdGhVbml0LmNvZXJjZSh2YWwsIFwicHhcIilcbiAgICAgICAgaWYgKHRoaXMuI2Z1bGxTaXplLnZhbHVlICE9PSBjb2VyY2VkKSB7XG4gICAgICAgICAgICB0aGlzLiNmdWxsU2l6ZS5uZXh0KGNvZXJjZWQpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZG9ubHkgI2Z1bGxTaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOdW1iZXJXaXRoVW5pdD4oQVVUT19TSVpFKVxuXG4gICAgQElucHV0KFwibWluaVNpemVcIilcbiAgICBzZXQgbWluaVNpemVJbnB1dCh2YWw6IE51bWJlcldpdGhVbml0SW5wdXQpIHtcbiAgICAgICAgY29uc3QgY29lcmNlZCA9IE51bWJlcldpdGhVbml0LmNvZXJjZSh2YWwsIFwicHhcIilcbiAgICAgICAgaWYgKHRoaXMuI21pbmlTaXplLnZhbHVlICE9PSBjb2VyY2VkKSB7XG4gICAgICAgICAgICB0aGlzLiNtaW5pU2l6ZS5uZXh0KGNvZXJjZWQpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZG9ubHkgI21pbmlTaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOdW1iZXJXaXRoVW5pdD4oSElEREVOX1NJWkUpXG5cbiAgICBASW5wdXQoXCJtaW5pbWl6YWJsZVwiKVxuICAgIHNldCBtaW5pbWl6YWJsZSh2YWw6IEJvb2xlYW5JbnB1dCkge1xuICAgICAgICB0aGlzLiNtaW5pbWl6YWJsZSA9IGNvZXJjZUJvb2xBdHRyKHZhbClcbiAgICAgICAgdGhpcy4jbWluaW1pemFibGVBdXRvID0gZmFsc2VcbiAgICB9XG4gICAgZ2V0IG1pbmltaXphYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWluaW1pemFibGVcbiAgICB9XG4gICAgI21pbmltaXphYmxlOiBib29sZWFuID0gZmFsc2VcbiAgICAjbWluaW1pemFibGVBdXRvOiBib29sZWFuID0gdHJ1ZVxuXG4gICAgcmVhZG9ubHkgI2NvbnRlbnRTaXplID0gd2F0Y2hEaW1lbnNpb24odGhpcy5lbC5uYXRpdmVFbGVtZW50LCBcInNjcm9sbC1ib3hcIikucGlwZShzaGFyZVJlcGxheSgxKSlcblxuICAgIHJlYWRvbmx5ICNhdXRvU2l6ZSA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICBkaW06IHRoaXMuI2NvbnRlbnRTaXplLFxuICAgICAgICBwb3M6IHRoaXMucG9zaXRpb25cbiAgICB9KS5waXBlKFxuICAgICAgICBtYXAoKHsgZGltLCBwb3MgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBvcy5vcmllbnQgPT09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpbS5oZWlnaHRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpbS53aWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApXG5cbiAgICByZWFkb25seSBmdWxsU2l6ZSA9IHRoaXMuI2Z1bGxTaXplLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChzaXplID0+IHtcbiAgICAgICAgICAgIGlmIChzaXplLnVuaXQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2F1dG9TaXplXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihzaXplKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApXG5cbiAgICByZWFkb25seSBtaW5pU2l6ZSA9IHRoaXMuI21pbmlTaXplLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChzaXplID0+IHtcbiAgICAgICAgICAgIGlmIChzaXplLnVuaXQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2F1dG9TaXplXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihzaXplKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApXG5cbiAgICByZWFkb25seSBjaGFuZ2VzID0gY29tYmluZUxhdGVzdCh7XG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLFxuICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgICBmdWxsU2l6ZTogdGhpcy5mdWxsU2l6ZSxcbiAgICAgICAgbWluaVNpemU6IHRoaXMubWluaVNpemUsXG4gICAgICAgIGNvbnRlbnRTaXplOiB0aGlzLiNjb250ZW50U2l6ZVxuICAgIH0pXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKVxuXG4gICAgICAgIHRoaXMuZC5zdWIodGhpcy5jaGFuZ2VzKS5zdWJzY3JpYmUoY2hhbmdlcyA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy4jbWluaW1pemFibGVBdXRvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jbWluaW1pemFibGUgPSB0aGlzLiNtaW5pU2l6ZS52YWx1ZS52YWx1ZSAhPT0gMFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBGYXN0RE9NLnNldEF0dHJpYnV0ZXModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgc3RhdGU6IGNoYW5nZXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgb3JpZW50OiBjaGFuZ2VzLnBvc2l0aW9uLm9yaWVudCxcbiAgICAgICAgICAgICAgICBtb2RlOiBjaGFuZ2VzLm1vZGUsXG4gICAgICAgICAgICAgICAgc2lkZTpcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wb3NpdGlvbi5vcmllbnQgPT09IFwiaG9yaXpvbnRhbFwiID8gY2hhbmdlcy5wb3NpdGlvbi5jZWxsc1swXS52IDogY2hhbmdlcy5wb3NpdGlvbi5jZWxsc1swXS5oXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBjaGFuZ2VzLnBvc2l0aW9uLm9yaWVudCA9PT0gXCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgIGxldCB3ID0gbnVsbFxuICAgICAgICAgICAgbGV0IGggPSBudWxsXG5cbiAgICAgICAgICAgIC8vIFRPRE86IHdoZW4gY2hhbmdlIHN0YXRlIGZyb20gbWluaSAtPiBoaWRkZW4sIGN1cnJlbnRseSB3cm9uZyBiZWhhdmlvclxuICAgICAgICAgICAgLy8gdGhlIGdvb2QgYmVoYXZpb3IgaXMgdG8gbm90IGdhaW4gZnVsbFNpemUgYW5nIGdvIHRvIGhpZGRlblxuICAgICAgICAgICAgaWYgKGNoYW5nZXMuc3RhdGUgPT09IFwibWluaVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgICAgICBoID0gY2hhbmdlcy5taW5pU2l6ZS51bml0ID09PSBcImF1dG9cIiA/IGNoYW5nZXMuY29udGVudFNpemUuaGVpZ2h0IDogY2hhbmdlcy5taW5pU2l6ZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHcgPSBjaGFuZ2VzLm1pbmlTaXplLnVuaXQgPT09IFwiYXV0b1wiID8gY2hhbmdlcy5jb250ZW50U2l6ZS53aWR0aCA6IGNoYW5nZXMubWluaVNpemVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaCA9IGNoYW5nZXMuZnVsbFNpemUudW5pdCA9PT0gXCJhdXRvXCIgPyBjaGFuZ2VzLmNvbnRlbnRTaXplLmhlaWdodCA6IGNoYW5nZXMuZnVsbFNpemVcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3ID0gY2hhbmdlcy5mdWxsU2l6ZS51bml0ID09PSBcImF1dG9cIiA/IGNoYW5nZXMuY29udGVudFNpemUud2lkdGggOiBjaGFuZ2VzLmZ1bGxTaXplXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBGYXN0RE9NLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiLS1kb2NraW5nLXBhbmVsLXdcIjogdyAhPSBudWxsID8gYCR7d31gIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgXCItLWRvY2tpbmctcGFuZWwtaFwiOiBoICE9IG51bGwgPyBgJHtofWAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBcIi0tZG9ja2luZy1wYW5lbC1jb250ZW50LXdcIjogY2hhbmdlcy5jb250ZW50U2l6ZS53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgXCItLWRvY2tpbmctcGFuZWwtY29udGVudC1oXCI6IGNoYW5nZXMuY29udGVudFNpemUuaGVpZ2h0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoKSA9PiBGYXN0RE9NLnNldEF0dHJpYnV0ZXModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB7IGFuaW1hdGU6IFwiXCIgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLnN0YXRlLm5leHQoXCJmdWxsXCIpXG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUubmV4dChcImhpZGRlblwiKVxuICAgIH1cblxuICAgIG1pbmltaXplKCkge1xuICAgICAgICBpZiAodGhpcy5taW5pbWl6YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5uZXh0KFwibWluaVwiKVxuICAgICAgICB9XG4gICAgfVxufVxuXG50eXBlIENoYW5nZXNPYnNlcnZhYmxlID0gdHlwZW9mIERvY2tpbmdQYW5lbENvbXBvbmVudC5wcm90b3R5cGUuY2hhbmdlc1xuZXhwb3J0IHR5cGUgRG9ja2luZ1BhbmVsQ2hhbmdlcyA9IENoYW5nZXNPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZTxpbmZlciBUPiA/IFQgOiBuZXZlclxuIl19
@@ -0,0 +1,20 @@
1
+ import { NgModule } from "@angular/core";
2
+ import { DockingContentComponent } from "./docking-content.component";
3
+ import { DockingLayoutComponent } from "./docking-layout.component";
4
+ import { DockingPanelComponent } from "./docking-panel.component";
5
+ import * as i0 from "@angular/core";
6
+ export { DockingLayoutComponent, DockingPanelComponent, DockingContentComponent };
7
+ const members = [DockingLayoutComponent, DockingPanelComponent, DockingContentComponent];
8
+ export class NuDockingLayout {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NuDockingLayout, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.1.3", ngImport: i0, type: NuDockingLayout, imports: [DockingLayoutComponent, DockingPanelComponent, DockingContentComponent], exports: [DockingLayoutComponent, DockingPanelComponent, DockingContentComponent] }); }
11
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NuDockingLayout }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NuDockingLayout, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: members,
17
+ exports: members
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYXlvdXQvc3JjL2RvY2tpbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUV4QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTs7QUFFakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLHVCQUF1QixFQUFFLENBQUE7QUFFakYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFBO0FBTXhGLE1BQU0sT0FBTyxlQUFlOzhHQUFmLGVBQWU7K0dBQWYsZUFBZSxZQU5YLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLHVCQUF1QixhQUF0RSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSx1QkFBdUI7K0dBTTFFLGVBQWU7OzJGQUFmLGVBQWU7a0JBSjNCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE9BQU8sRUFBRSxPQUFPO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBEb2NraW5nQ29udGVudENvbXBvbmVudCB9IGZyb20gXCIuL2RvY2tpbmctY29udGVudC5jb21wb25lbnRcIlxuaW1wb3J0IHsgRG9ja2luZ0xheW91dENvbXBvbmVudCB9IGZyb20gXCIuL2RvY2tpbmctbGF5b3V0LmNvbXBvbmVudFwiXG5pbXBvcnQgeyBEb2NraW5nUGFuZWxDb21wb25lbnQgfSBmcm9tIFwiLi9kb2NraW5nLXBhbmVsLmNvbXBvbmVudFwiXG5cbmV4cG9ydCB7IERvY2tpbmdMYXlvdXRDb21wb25lbnQsIERvY2tpbmdQYW5lbENvbXBvbmVudCwgRG9ja2luZ0NvbnRlbnRDb21wb25lbnQgfVxuXG5jb25zdCBtZW1iZXJzID0gW0RvY2tpbmdMYXlvdXRDb21wb25lbnQsIERvY2tpbmdQYW5lbENvbXBvbmVudCwgRG9ja2luZ0NvbnRlbnRDb21wb25lbnRdXG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogbWVtYmVycyxcbiAgICBleHBvcnRzOiBtZW1iZXJzXG59KVxuZXhwb3J0IGNsYXNzIE51RG9ja2luZ0xheW91dCB7fVxuIl19
@@ -0,0 +1,5 @@
1
+ export * from "./util";
2
+ export * from "./l9";
3
+ export * from "./docking";
4
+ export * from "./services/slots.service";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9sYXlvdXQvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsUUFBUSxDQUFBO0FBQ3RCLGNBQWMsTUFBTSxDQUFBO0FBQ3BCLGNBQWMsV0FBVyxDQUFBO0FBQ3pCLGNBQWMsMEJBQTBCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi91dGlsXCJcbmV4cG9ydCAqIGZyb20gXCIuL2w5XCJcbmV4cG9ydCAqIGZyb20gXCIuL2RvY2tpbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2VydmljZXMvc2xvdHMuc2VydmljZVwiXG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from "./range";
2
+ export * from "./state";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYXlvdXQvc3JjL2w5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsU0FBUyxDQUFBO0FBQ3ZCLGNBQWMsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vcmFuZ2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3RhdGVcIlxuIl19