@yuuvis/client-components 3.0.0-beta.21.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/README.md +3 -0
- package/autocomplete/README.md +3 -0
- package/common/README.md +3 -0
- package/datepicker/README.md +3 -0
- package/fesm2022/yuuvis-client-components-autocomplete.mjs +236 -0
- package/fesm2022/yuuvis-client-components-autocomplete.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-common.mjs +1724 -0
- package/fesm2022/yuuvis-client-components-common.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-datepicker.mjs +456 -0
- package/fesm2022/yuuvis-client-components-datepicker.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-list.mjs +666 -0
- package/fesm2022/yuuvis-client-components-list.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-master-details.mjs +136 -0
- package/fesm2022/yuuvis-client-components-master-details.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-overflow-hidden.mjs +109 -0
- package/fesm2022/yuuvis-client-components-overflow-hidden.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-overflow-menu.mjs +171 -0
- package/fesm2022/yuuvis-client-components-overflow-menu.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-popout.mjs +240 -0
- package/fesm2022/yuuvis-client-components-popout.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-split-view.mjs +317 -0
- package/fesm2022/yuuvis-client-components-split-view.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components-widget-grid.mjs +933 -0
- package/fesm2022/yuuvis-client-components-widget-grid.mjs.map +1 -0
- package/fesm2022/yuuvis-client-components.mjs +18 -0
- package/fesm2022/yuuvis-client-components.mjs.map +1 -0
- package/lib/assets/i18n/de.json +56 -0
- package/lib/assets/i18n/en.json +56 -0
- package/list/README.md +3 -0
- package/master-details/README.md +3 -0
- package/overflow-hidden/README.md +3 -0
- package/overflow-menu/README.md +3 -0
- package/package.json +67 -0
- package/popout/README.md +3 -0
- package/split-view/README.md +3 -0
- package/types/yuuvis-client-components-autocomplete.d.ts +89 -0
- package/types/yuuvis-client-components-common.d.ts +536 -0
- package/types/yuuvis-client-components-datepicker.d.ts +94 -0
- package/types/yuuvis-client-components-list.d.ts +380 -0
- package/types/yuuvis-client-components-master-details.d.ts +69 -0
- package/types/yuuvis-client-components-overflow-hidden.d.ts +72 -0
- package/types/yuuvis-client-components-overflow-menu.d.ts +89 -0
- package/types/yuuvis-client-components-popout.d.ts +106 -0
- package/types/yuuvis-client-components-split-view.d.ts +197 -0
- package/types/yuuvis-client-components-widget-grid.d.ts +299 -0
- package/types/yuuvis-client-components.d.ts +8 -0
- package/widget-grid/README.md +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yuuvis-client-components-overflow-menu.mjs","sources":["../../../../../libs/yuuvis/client-components/overflow-menu/src/lib/overflow-menu.component.ts","../../../../../libs/yuuvis/client-components/overflow-menu/src/lib/overflow-menu.component.html","../../../../../libs/yuuvis/client-components/overflow-menu/src/lib/overflow-menu.module.ts","../../../../../libs/yuuvis/client-components/overflow-menu/src/yuuvis-client-components-overflow-menu.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n signal\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { OverflowMenuItem } from './overflow-menu.interface';\n\ntype __MenuItem = OverflowMenuItem & { overflow: boolean };\ninterface MenuGroup {\n id: string;\n items: __MenuItem[];\n}\n\n/**\n * A responsive toolbar component that automatically moves items that no longer\n * fit into the available horizontal (or vertical) space into an overflow menu.\n *\n * Items are rendered as icon buttons with a tooltip. When items overflow, they\n * collapse into a `MatMenu` triggered by the overflow icon button. Items that\n * share the same `group` value on {@link OverflowMenuItem} are rendered in\n * labeled sections both in the toolbar and in the overflow menu.\n *\n * @example\n * ```html\n * <yuv-overflow-menu\n * [menuItems]=\"actions\"\n * [groupLabels]=\"{ edit: 'Edit', view: 'View' }\"\n * />\n * ```\n *\n * @selector `yuv-overflow-menu`\n */\n@Component({\n selector: 'yuv-overflow-menu',\n imports: [CommonModule, MatButtonModule, MatMenuModule, MatIconModule, MatTooltipModule],\n templateUrl: './overflow-menu.component.html',\n styleUrl: './overflow-menu.component.scss',\n host: {\n '[class.vertical]': 'vertical()'\n }\n})\nexport class OverflowMenuComponent implements AfterViewInit, OnDestroy {\n #elRef = inject(ElementRef);\n\n /**\n * Material icon ligature used for the overflow trigger button.\n * Defaults to `'more_horiz'` (three horizontal dots).\n */\n overflowIcon = input<string>('more_horiz');\n\n /**\n * Optional display labels for item groups shown in the overflow menu.\n * The key must match the `group` property of the corresponding\n * {@link OverflowMenuItem} entries.\n *\n * @example\n * ```ts\n * { edit: 'Edit actions', view: 'View options' }\n * ```\n */\n groupLabels = input<Record<string, string>>();\n\n /**\n * The list of items to render in the toolbar.\n * Items are displayed as icon buttons and overflow into a `MatMenu`\n * when they no longer fit the available space.\n */\n menuItems = input<OverflowMenuItem[]>([]);\n #menuItemsEffect = effect(() => {\n this.#observe(this.menuItems());\n });\n\n /**\n * When `true` the toolbar is laid out vertically and tooltips appear\n * to the right of each button instead of below.\n * The host element receives the CSS class `vertical` to allow style overrides.\n * Defaults to `false`.\n */\n vertical = input<boolean>(false);\n\n __menuGroups = computed<MenuGroup[]>(() => this.#groupItems(this.__menuItems()));\n\n private __menuItems = computed<__MenuItem[]>(() => {\n return this.menuItems().map((i) => ({ ...i, overflow: false }));\n });\n\n overflowGroups = signal<MenuGroup[]>([]);\n\n #itemObserver: {\n observer: IntersectionObserver | undefined;\n observedElements: Element[];\n } = {\n observer: undefined,\n observedElements: []\n };\n\n activeStyles = {};\n\n #initObservers() {\n // observe tab navigation elements to show navigation controls (arrow buttons) once\n // the first or the last tab is not visible anymore\n this.#itemObserver.observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((e, i) => {\n const id = e.target.getAttribute('data-item-id');\n const _i: __MenuItem | undefined = this.__menuItems().find((mi) => id === mi.id);\n if (_i) _i.overflow = !e.isIntersecting;\n const overflowTrigger = (this.#elRef.nativeElement as HTMLElement).querySelector('button.overflow-trigger');\n\n if (overflowTrigger) {\n !this.__menuItems().find((i) => i.overflow)\n ? overflowTrigger.setAttribute('inert', 'true')\n : overflowTrigger.removeAttribute('inert');\n }\n const intersecting = !e.isIntersecting;\n if (intersecting) e.target.setAttribute('inert', 'true');\n else e.target.removeAttribute('inert');\n });\n\n this.overflowGroups.set(this.#groupItems(this.__menuItems().filter((i) => i.overflow)));\n },\n {\n threshold: 1,\n root: this.#elRef.nativeElement.querySelector('.overflow-wrapper')\n }\n );\n }\n\n #observe(items: OverflowMenuItem[]) {\n setTimeout(() => {\n if (this.#itemObserver.observer) {\n // cleanup existing observed elements\n this.#itemObserver.observedElements.forEach((e) => this.#itemObserver.observer!.unobserve(e));\n this.#itemObserver.observedElements = [];\n\n if (items.length > 0) {\n this.#itemObserver.observedElements = this.#elRef.nativeElement.querySelectorAll('.menu-item');\n this.#itemObserver.observedElements.forEach((e) => this.#itemObserver.observer!.observe(e));\n }\n }\n });\n }\n\n #groupItems(items: OverflowMenuItem[]): MenuGroup[] {\n const g = this.#groupBy(items, 'group');\n return Object.keys(g).map((id) => ({\n id,\n items: g[id]\n }));\n }\n\n #groupBy(arr: any[], key: string): Record<string, any> {\n return arr.reduce((rv, x) => {\n (rv[x[key]] = rv[x[key]] || []).push(x);\n return rv;\n }, {});\n }\n\n ngAfterViewInit(): void {\n this.#initObservers();\n // get active styles\n const style = window.getComputedStyle(this.#elRef.nativeElement);\n this.activeStyles = {\n 'background-color': style.getPropertyValue('--menu-active-background'),\n color: style.getPropertyValue('--menu-on-active')\n };\n }\n\n ngOnDestroy(): void {\n if (this.#itemObserver.observer) this.#itemObserver.observer.disconnect();\n }\n}\n","<div class=\"overflow-wrapper\">\n @for (group of __menuGroups(); track group.id) {\n <section>\n @for (item of group.items; track item.id) {\n <button\n mat-icon-button\n class=\"menu-item\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"{ active: item.active }\"\n [matTooltip]=\"item.label\"\n [matTooltipPosition]=\"vertical() ? 'after' : 'below'\"\n [attr.data-item-id]=\"item.id\"\n (click)=\"item.callback(item)\"\n >\n @if (item.svgIcon) {\n <mat-icon [svgIcon]=\"item.svgIcon\"></mat-icon>\n } @else {\n <mat-icon>{{ item.icon }}</mat-icon>\n }\n </button>\n }\n </section>\n }\n</div>\n\n<button class=\"overflow-trigger\" inert=\"true\" mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>{{ overflowIcon() }}</mat-icon>\n</button>\n<mat-menu #menu=\"matMenu\">\n @let gl = groupLabels();\n @for (g of overflowGroups(); track g.id) {\n @if (gl && gl[g.id]) {\n <div class=\"group\">{{ gl[g.id] }}</div>\n }\n @for (item of g.items; track item.id) {\n <div class=\"menu-item\" mat-menu-item [disabled]=\"item.disabled\" [ngStyle]=\"item.active ? activeStyles : {}\" (click)=\"item.callback(item)\">\n @if (item.svgIcon) {\n <mat-icon [svgIcon]=\"item.svgIcon\"></mat-icon>\n } @else {\n <mat-icon>{{ item.icon }}</mat-icon>\n }\n <span> {{ item.label }} </span>\n </div>\n }\n }\n</mat-menu>\n","import { NgModule } from '@angular/core';\nimport { OverflowMenuComponent } from './overflow-menu.component';\n\n@NgModule({\n imports: [OverflowMenuComponent],\n exports: [OverflowMenuComponent]\n})\nexport class YuvOverflowMenuModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, input, computed, Component, Renderer2, ChangeDetectorRef, viewChild, output, signal, ChangeDetectionStrategy, NgModule } from '@angular/core';
|
|
3
|
+
import { FullscreenDirective } from '@yuuvis/material/panes';
|
|
4
|
+
export { FullscreenDirective } from '@yuuvis/material/panes';
|
|
5
|
+
import { YmtIconButtonDirective } from '@yuuvis/material';
|
|
6
|
+
import * as i1 from '@angular/material/icon';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
import * as i2 from '@angular/material/tooltip';
|
|
9
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
10
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
11
|
+
import * as i1$1 from '@angular/common';
|
|
12
|
+
import { CommonModule } from '@angular/common';
|
|
13
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
14
|
+
|
|
15
|
+
class PopoutTriggerComponent {
|
|
16
|
+
translate = inject(TranslateService);
|
|
17
|
+
config = input(...(ngDevMode ? [undefined, { debugName: "config" }] : /* istanbul ignore next */ []));
|
|
18
|
+
popout = input(...(ngDevMode ? [undefined, { debugName: "popout" }] : /* istanbul ignore next */ []));
|
|
19
|
+
icon = computed(() => {
|
|
20
|
+
const poppedOut = this.popout()?.poppedOut();
|
|
21
|
+
return poppedOut ? (this.config()?.popinIcon || 'open_in_new_down') : (this.config()?.popoutIcon || 'open_in_new');
|
|
22
|
+
}, ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
23
|
+
tooltip = computed(() => {
|
|
24
|
+
const poppedOut = this.popout()?.poppedOut();
|
|
25
|
+
return poppedOut ? (this.config()?.popinTooltip || this.translate.instant('yuv.popout.popin.tooltip')) : (this.config()?.popoutTooltip || this.translate.instant('yuv.popout.popout.tooltip'));
|
|
26
|
+
}, ...(ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []));
|
|
27
|
+
trigger(e) {
|
|
28
|
+
this.popout()?.pop(e);
|
|
29
|
+
}
|
|
30
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PopoutTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
31
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: PopoutTriggerComponent, isStandalone: true, selector: "yuv-popout-trigger", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, popout: { classPropertyName: "popout", publicName: "popout", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<button ymtIconButton [matTooltip]=\"tooltip()\" (click)=\"trigger($event)\">\n <mat-icon>{{ icon() }}</mat-icon>\n</button>", styles: [""], dependencies: [{ kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
32
|
+
}
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PopoutTriggerComponent, decorators: [{
|
|
34
|
+
type: Component,
|
|
35
|
+
args: [{ selector: 'yuv-popout-trigger', imports: [YmtIconButtonDirective, MatIconModule, MatTooltipModule], template: "<button ymtIconButton [matTooltip]=\"tooltip()\" (click)=\"trigger($event)\">\n <mat-icon>{{ icon() }}</mat-icon>\n</button>" }]
|
|
36
|
+
}], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], popout: [{ type: i0.Input, args: [{ isSignal: true, alias: "popout", required: false }] }] } });
|
|
37
|
+
|
|
38
|
+
var PopoutTriggerPosition;
|
|
39
|
+
(function (PopoutTriggerPosition) {
|
|
40
|
+
PopoutTriggerPosition["TOP_LEFT"] = "tl";
|
|
41
|
+
PopoutTriggerPosition["TOP_RIGHT"] = "tr";
|
|
42
|
+
PopoutTriggerPosition["BOTTOM_LEFT"] = "bl";
|
|
43
|
+
PopoutTriggerPosition["BOTTOM_RIGHT"] = "br";
|
|
44
|
+
PopoutTriggerPosition["NONE"] = "none";
|
|
45
|
+
})(PopoutTriggerPosition || (PopoutTriggerPosition = {}));
|
|
46
|
+
|
|
47
|
+
// based upon: https://github.com/GIimmer/angular-opinionated-popout-window
|
|
48
|
+
/**
|
|
49
|
+
* Component that enables the wrapped content to be 'popped out' as new window.
|
|
50
|
+
* It will place a button (icon) to trigger popout on top of the wrapped content. You
|
|
51
|
+
* can place this trigger element setting the 'triggerPosition' input.
|
|
52
|
+
*
|
|
53
|
+
* Providing a 'popoutWindowConfig' will also enable you to influence the appearance of
|
|
54
|
+
* the spawned window.
|
|
55
|
+
*
|
|
56
|
+
*/
|
|
57
|
+
class PopoutComponent {
|
|
58
|
+
#renderer2 = inject(Renderer2);
|
|
59
|
+
#cd = inject(ChangeDetectorRef);
|
|
60
|
+
beforeunloadHandler() {
|
|
61
|
+
this._close();
|
|
62
|
+
}
|
|
63
|
+
innerWrapper = viewChild.required('innerWrapper');
|
|
64
|
+
popoutWrapper = viewChild.required('popoutWrapper');
|
|
65
|
+
/**
|
|
66
|
+
* Where the popout trigger should be located on the component
|
|
67
|
+
*/
|
|
68
|
+
triggerPosition = input(PopoutTriggerPosition.TOP_RIGHT, ...(ngDevMode ? [{ debugName: "triggerPosition" }] : /* istanbul ignore next */ []));
|
|
69
|
+
/**
|
|
70
|
+
* Icon to be redered inside the trigger
|
|
71
|
+
*/
|
|
72
|
+
triggerIcon = input('open_in_new', ...(ngDevMode ? [{ debugName: "triggerIcon" }] : /* istanbul ignore next */ []));
|
|
73
|
+
/**
|
|
74
|
+
* Tooltip text for the trigger button
|
|
75
|
+
*/
|
|
76
|
+
triggerTooltip = input(...(ngDevMode ? [undefined, { debugName: "triggerTooltip" }] : /* istanbul ignore next */ []));
|
|
77
|
+
/**
|
|
78
|
+
* configuration of the popped out window
|
|
79
|
+
*/
|
|
80
|
+
popoutWindowConfig = input(...(ngDevMode ? [undefined, { debugName: "popoutWindowConfig" }] : /* istanbul ignore next */ []));
|
|
81
|
+
/**
|
|
82
|
+
* Whether or not to disable the undock feature
|
|
83
|
+
*/
|
|
84
|
+
disabled = input(...(ngDevMode ? [undefined, { debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
85
|
+
/**
|
|
86
|
+
* Emitted when the child component is popped out
|
|
87
|
+
*/
|
|
88
|
+
popOut = output();
|
|
89
|
+
/**
|
|
90
|
+
* Emitted when the child component is popped in again
|
|
91
|
+
*/
|
|
92
|
+
popIn = output();
|
|
93
|
+
#popoutWindow = signal(null, ...(ngDevMode ? [{ debugName: "#popoutWindow" }] : /* istanbul ignore next */ []));
|
|
94
|
+
#observer;
|
|
95
|
+
poppedOut = computed(() => !!this.#popoutWindow(), ...(ngDevMode ? [{ debugName: "poppedOut" }] : /* istanbul ignore next */ []));
|
|
96
|
+
get isPoppedOut() {
|
|
97
|
+
return this.poppedOut();
|
|
98
|
+
}
|
|
99
|
+
pop(e) {
|
|
100
|
+
if (this.isPoppedOut)
|
|
101
|
+
this._popIn();
|
|
102
|
+
else
|
|
103
|
+
this._popOut(e);
|
|
104
|
+
}
|
|
105
|
+
_popIn() {
|
|
106
|
+
this.#renderer2.appendChild(this.popoutWrapper().nativeElement, this.innerWrapper().nativeElement);
|
|
107
|
+
this._close();
|
|
108
|
+
this.#cd.detectChanges();
|
|
109
|
+
}
|
|
110
|
+
_popOut(event) {
|
|
111
|
+
if (!this.#popoutWindow()) {
|
|
112
|
+
this.#popoutWindow.set(this._createPopoutWindow(event));
|
|
113
|
+
const pw = this.#popoutWindow();
|
|
114
|
+
if (!pw) {
|
|
115
|
+
// The window wasn't allowed to open
|
|
116
|
+
// This is likely caused by built-in popup blockers.
|
|
117
|
+
alert('Could not open new window. This is likely caused by built-in popup blockers.');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this._cloneStylesToPopoutWindow();
|
|
121
|
+
this._observeFutureStyleChanges();
|
|
122
|
+
this.#renderer2.appendChild(pw.document.body, this.innerWrapper().nativeElement);
|
|
123
|
+
pw.addEventListener('unload', () => this._popIn());
|
|
124
|
+
this.#cd.detectChanges();
|
|
125
|
+
this.popOut.emit(true);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
this.#popoutWindow().focus();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
_createPopoutWindow(mouseEvent) {
|
|
132
|
+
const elmRect = this.innerWrapper().nativeElement.getBoundingClientRect();
|
|
133
|
+
const [winLeft, winTop] = this._getWindowPositioning(elmRect, mouseEvent);
|
|
134
|
+
const pwc = this.popoutWindowConfig();
|
|
135
|
+
const winWidth = pwc?.size?.width ? pwc.size.width : elmRect.width;
|
|
136
|
+
const winHeight = pwc?.size?.height ? pwc.size.height : elmRect.height + 1;
|
|
137
|
+
const win = window.open('', `popoutWindow${Date.now()}`, ` popup,
|
|
138
|
+
width=${winWidth},
|
|
139
|
+
height=${winHeight},
|
|
140
|
+
left=${winLeft},
|
|
141
|
+
top=${winTop}`);
|
|
142
|
+
if (win) {
|
|
143
|
+
win.document.title = this.popoutWindowConfig()?.title || window.document.title;
|
|
144
|
+
win.document.body.style.margin = '0';
|
|
145
|
+
}
|
|
146
|
+
return win;
|
|
147
|
+
}
|
|
148
|
+
_getWindowPositioning(elmRect, mouseEvent) {
|
|
149
|
+
let winTop, winLeft;
|
|
150
|
+
const pwc = this.popoutWindowConfig()?.position;
|
|
151
|
+
if (pwc) {
|
|
152
|
+
winTop = pwc.blockStart || winTop;
|
|
153
|
+
winLeft = pwc.inlineStart || winLeft;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const navHeight = window.outerHeight - window.innerHeight;
|
|
157
|
+
const navWidth = (window.outerWidth - window.innerWidth) / 2;
|
|
158
|
+
winTop = window.screenY + navHeight + elmRect.top - 60;
|
|
159
|
+
winLeft = window.screenX + navWidth + elmRect.left;
|
|
160
|
+
// Position window titleBar under mouse
|
|
161
|
+
if (mouseEvent) {
|
|
162
|
+
winTop = mouseEvent.clientY + navHeight - 7;
|
|
163
|
+
winLeft += 120;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return [winLeft, winTop];
|
|
167
|
+
}
|
|
168
|
+
_close() {
|
|
169
|
+
if (this.#popoutWindow()) {
|
|
170
|
+
this.#popoutWindow().close();
|
|
171
|
+
this.#popoutWindow.set(null);
|
|
172
|
+
this.popIn.emit(true);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
_cloneStylesToPopoutWindow() {
|
|
176
|
+
if (window.navigator.userAgent.indexOf('Firefox') === -1) {
|
|
177
|
+
document.fonts.forEach((node) => {
|
|
178
|
+
this.#popoutWindow().document.fonts.add(node);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
document.head.querySelectorAll('link[rel="stylesheet"]').forEach((node) => {
|
|
182
|
+
this.#popoutWindow().document.head.insertAdjacentHTML('beforeend', `<link rel="stylesheet" type="${node.type}" href="${node.href}">`);
|
|
183
|
+
});
|
|
184
|
+
document.head.querySelectorAll('style').forEach((node) => {
|
|
185
|
+
this.#popoutWindow().document.head.appendChild(node.cloneNode(true));
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
_observeFutureStyleChanges() {
|
|
189
|
+
const headEle = document.querySelector('head');
|
|
190
|
+
const win = this.#popoutWindow();
|
|
191
|
+
this.#observer?.disconnect();
|
|
192
|
+
this.#observer = new MutationObserver((mutations) => {
|
|
193
|
+
mutations.forEach((mutation) => {
|
|
194
|
+
mutation.addedNodes.forEach((node) => {
|
|
195
|
+
if (win && node.nodeName === 'STYLE') {
|
|
196
|
+
win.document.head.appendChild(node.cloneNode(true));
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
this.#observer.observe(headEle, { childList: true });
|
|
202
|
+
}
|
|
203
|
+
ngOnDestroy() {
|
|
204
|
+
this.#observer?.disconnect();
|
|
205
|
+
this._close();
|
|
206
|
+
}
|
|
207
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PopoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
208
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PopoutComponent, isStandalone: true, selector: "yuv-popout", inputs: { triggerPosition: { classPropertyName: "triggerPosition", publicName: "triggerPosition", isSignal: true, isRequired: false, transformFunction: null }, triggerIcon: { classPropertyName: "triggerIcon", publicName: "triggerIcon", isSignal: true, isRequired: false, transformFunction: null }, triggerTooltip: { classPropertyName: "triggerTooltip", publicName: "triggerTooltip", isSignal: true, isRequired: false, transformFunction: null }, popoutWindowConfig: { classPropertyName: "popoutWindowConfig", publicName: "popoutWindowConfig", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { popOut: "popOut", popIn: "popIn" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler()" } }, viewQueries: [{ propertyName: "innerWrapper", first: true, predicate: ["innerWrapper"], descendants: true, isSignal: true }, { propertyName: "popoutWrapper", first: true, predicate: ["popoutWrapper"], descendants: true, isSignal: true }], exportAs: ["yuvPopout"], ngImport: i0, template: "<div #popoutWrapper class=\"popoutWrapper\" [ngClass]=\"{ disabled: disabled() }\" [attr.data-pos]=\"triggerPosition()\">\n @if (triggerPosition() !== 'none') {\n <button ymtIconButton icon-button-size=\"small\" type=\"button\" class=\"trigger\" (click)=\"pop($event)\" [matTooltip]=\"triggerTooltip()\" [ngClass]=\"{ poppedOut: isPoppedOut }\">\n <mat-icon>{{ triggerIcon() }}</mat-icon>\n </button>\n }\n <div #innerWrapper class=\"innerWrapper\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host{display:block;height:100%}div.popoutWrapper{--trigger-z-index: 1;--trigger-margin-block: var(--ymt-spacing-xs);--trigger-margin-inline: var(--ymt-spacing-xs);--trigger-color: var(--ymt-on-inverse-surface);--trigger-background-color: var(--ymt-inverse-surface);display:flex;height:100%;position:relative;min-height:calc(var(--trigger-size) + var(--trigger-margin-block))}div.popoutWrapper[data-pos=tr]>button.trigger{inset-block-end:unset;inset-block-start:var(--trigger-margin-block);inset-inline-start:unset;inset-inline-end:var(--trigger-margin-inline)}div.popoutWrapper[data-pos=tl]>button.trigger{inset-block-end:unset;inset-block-start:var(--trigger-margin-block);inset-inline-end:unset;inset-inline-start:var(--trigger-margin-inline)}div.popoutWrapper[data-pos=bl]>button.trigger{inset-block-start:unset;inset-block-end:var(--trigger-margin-block);inset-inline-end:unset;inset-inline-start:var(--trigger-margin-inline)}div.popoutWrapper[data-pos=br]>button.trigger{inset-block-start:unset;inset-block-end:var(--trigger-margin-block);inset-inline-start:unset;inset-inline-end:var(--trigger-margin-inline)}div.popoutWrapper.disabled>button.trigger{display:none;pointer-events:none}div.popoutWrapper>button.trigger{background-color:var(--trigger-background-color);color:var(--trigger-color);position:absolute;z-index:var(--trigger-z-index)}div.popoutWrapper>button.trigger.poppedOut{transform:rotate(180deg)}div.popoutWrapper div.innerWrapper{flex:1;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
209
|
+
}
|
|
210
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PopoutComponent, decorators: [{
|
|
211
|
+
type: Component,
|
|
212
|
+
args: [{ selector: 'yuv-popout', exportAs: 'yuvPopout', imports: [CommonModule, MatButtonModule, MatIconModule, YmtIconButtonDirective, MatTooltipModule], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
213
|
+
'(window:beforeunload)': 'beforeunloadHandler()'
|
|
214
|
+
// "[attr.data-pos]": "triggerPosition()"
|
|
215
|
+
}, template: "<div #popoutWrapper class=\"popoutWrapper\" [ngClass]=\"{ disabled: disabled() }\" [attr.data-pos]=\"triggerPosition()\">\n @if (triggerPosition() !== 'none') {\n <button ymtIconButton icon-button-size=\"small\" type=\"button\" class=\"trigger\" (click)=\"pop($event)\" [matTooltip]=\"triggerTooltip()\" [ngClass]=\"{ poppedOut: isPoppedOut }\">\n <mat-icon>{{ triggerIcon() }}</mat-icon>\n </button>\n }\n <div #innerWrapper class=\"innerWrapper\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host{display:block;height:100%}div.popoutWrapper{--trigger-z-index: 1;--trigger-margin-block: var(--ymt-spacing-xs);--trigger-margin-inline: var(--ymt-spacing-xs);--trigger-color: var(--ymt-on-inverse-surface);--trigger-background-color: var(--ymt-inverse-surface);display:flex;height:100%;position:relative;min-height:calc(var(--trigger-size) + var(--trigger-margin-block))}div.popoutWrapper[data-pos=tr]>button.trigger{inset-block-end:unset;inset-block-start:var(--trigger-margin-block);inset-inline-start:unset;inset-inline-end:var(--trigger-margin-inline)}div.popoutWrapper[data-pos=tl]>button.trigger{inset-block-end:unset;inset-block-start:var(--trigger-margin-block);inset-inline-end:unset;inset-inline-start:var(--trigger-margin-inline)}div.popoutWrapper[data-pos=bl]>button.trigger{inset-block-start:unset;inset-block-end:var(--trigger-margin-block);inset-inline-end:unset;inset-inline-start:var(--trigger-margin-inline)}div.popoutWrapper[data-pos=br]>button.trigger{inset-block-start:unset;inset-block-end:var(--trigger-margin-block);inset-inline-start:unset;inset-inline-end:var(--trigger-margin-inline)}div.popoutWrapper.disabled>button.trigger{display:none;pointer-events:none}div.popoutWrapper>button.trigger{background-color:var(--trigger-background-color);color:var(--trigger-color);position:absolute;z-index:var(--trigger-z-index)}div.popoutWrapper>button.trigger.poppedOut{transform:rotate(180deg)}div.popoutWrapper div.innerWrapper{flex:1;overflow:auto}\n"] }]
|
|
216
|
+
}], propDecorators: { innerWrapper: [{ type: i0.ViewChild, args: ['innerWrapper', { isSignal: true }] }], popoutWrapper: [{ type: i0.ViewChild, args: ['popoutWrapper', { isSignal: true }] }], triggerPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerPosition", required: false }] }], triggerIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerIcon", required: false }] }], triggerTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerTooltip", required: false }] }], popoutWindowConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "popoutWindowConfig", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], popOut: [{ type: i0.Output, args: ["popOut"] }], popIn: [{ type: i0.Output, args: ["popIn"] }] } });
|
|
217
|
+
|
|
218
|
+
class YuvPopoutModule {
|
|
219
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: YuvPopoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
220
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: YuvPopoutModule, imports: [PopoutComponent, PopoutTriggerComponent, FullscreenDirective], exports: [PopoutComponent, PopoutTriggerComponent, FullscreenDirective] });
|
|
221
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: YuvPopoutModule, imports: [PopoutComponent, PopoutTriggerComponent] });
|
|
222
|
+
}
|
|
223
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: YuvPopoutModule, decorators: [{
|
|
224
|
+
type: NgModule,
|
|
225
|
+
args: [{
|
|
226
|
+
imports: [PopoutComponent, PopoutTriggerComponent, FullscreenDirective],
|
|
227
|
+
exports: [PopoutComponent, PopoutTriggerComponent, FullscreenDirective]
|
|
228
|
+
}]
|
|
229
|
+
}] });
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* @deprecated Import `FullscreenDirective` from `@yuuvis/material/panes` instead.
|
|
233
|
+
*/
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Generated bundle index. Do not edit.
|
|
237
|
+
*/
|
|
238
|
+
|
|
239
|
+
export { PopoutComponent, PopoutTriggerComponent, PopoutTriggerPosition, YuvPopoutModule };
|
|
240
|
+
//# sourceMappingURL=yuuvis-client-components-popout.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yuuvis-client-components-popout.mjs","sources":["../../../../../libs/yuuvis/client-components/popout/src/lib/popout-trigger/popout-trigger.component.ts","../../../../../libs/yuuvis/client-components/popout/src/lib/popout-trigger/popout-trigger.component.html","../../../../../libs/yuuvis/client-components/popout/src/lib/popout.interface.ts","../../../../../libs/yuuvis/client-components/popout/src/lib/popout.component.ts","../../../../../libs/yuuvis/client-components/popout/src/lib/popout.component.html","../../../../../libs/yuuvis/client-components/popout/src/lib/popout.module.ts","../../../../../libs/yuuvis/client-components/popout/src/lib/fullscreen.directive.ts","../../../../../libs/yuuvis/client-components/popout/src/yuuvis-client-components-popout.ts"],"sourcesContent":["import { Component, computed, inject, input } from '@angular/core';\n\nimport { PopoutComponent } from '../popout.component';\nimport { PopoutTriggerConfig } from '../popout.interface';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslateService } from '@ngx-translate/core';\n\n\n\n@Component({\n selector: 'yuv-popout-trigger',\n imports: [YmtIconButtonDirective, MatIconModule, MatTooltipModule],\n templateUrl: './popout-trigger.component.html',\n styleUrl: './popout-trigger.component.scss'\n})\nexport class PopoutTriggerComponent {\n private translate = inject(TranslateService);\n\n config = input<PopoutTriggerConfig>();\n popout = input<PopoutComponent>()\n\n icon = computed(() => {\n const poppedOut = this.popout()?.poppedOut();\n return poppedOut ? (this.config()?.popinIcon || 'open_in_new_down') : (\n this.config()?.popoutIcon || 'open_in_new');\n });\n tooltip = computed(() => {\n const poppedOut = this.popout()?.poppedOut();\n return poppedOut ? (this.config()?.popinTooltip || this.translate.instant('yuv.popout.popin.tooltip')) : (\n this.config()?.popoutTooltip || this.translate.instant('yuv.popout.popout.tooltip'));\n });\n\n trigger(e: MouseEvent) {\n this.popout()?.pop(e);\n }\n}\n","<button ymtIconButton [matTooltip]=\"tooltip()\" (click)=\"trigger($event)\">\n <mat-icon>{{ icon() }}</mat-icon>\n</button>","export enum PopoutTriggerPosition {\n TOP_LEFT = 'tl',\n TOP_RIGHT = 'tr',\n BOTTOM_LEFT = 'bl',\n BOTTOM_RIGHT = 'br',\n NONE = 'none'\n}\n\n\nexport interface PopoutTriggerConfig {\n popoutIcon?: string;\n popinIcon?: string;\n popoutTooltip?: string;\n popinTooltip?: string;\n}\n\nexport interface PopoutWindowConfig {\n // title of the window opened by popout\n title?: string;\n position?: {\n // 'top' position in px\n blockStart?: number;\n // 'left' position in px\n inlineStart?: number;\n };\n // set the size of the poped out window\n // If no size is set the window will resize to\n // the size of the rendered content (if measurable)\n size?: {\n // width in px\n width?: number;\n // height in px\n height?: number;\n };\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n Renderer2,\n signal,\n viewChild\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { PopoutTriggerPosition, PopoutWindowConfig } from './popout.interface';\n\n// based upon: https://github.com/GIimmer/angular-opinionated-popout-window\n\n/**\n * Component that enables the wrapped content to be 'popped out' as new window.\n * It will place a button (icon) to trigger popout on top of the wrapped content. You\n * can place this trigger element setting the 'triggerPosition' input.\n *\n * Providing a 'popoutWindowConfig' will also enable you to influence the appearance of\n * the spawned window.\n *\n */\n@Component({\n selector: 'yuv-popout',\n exportAs: 'yuvPopout',\n imports: [CommonModule, MatButtonModule, MatIconModule, YmtIconButtonDirective, MatTooltipModule],\n templateUrl: './popout.component.html',\n styleUrl: './popout.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:beforeunload)': 'beforeunloadHandler()'\n // \"[attr.data-pos]\": \"triggerPosition()\"\n }\n})\nexport class PopoutComponent implements OnDestroy {\n #renderer2 = inject(Renderer2);\n #cd = inject(ChangeDetectorRef);\n\n beforeunloadHandler(): void {\n this._close();\n }\n\n innerWrapper = viewChild.required<ElementRef>('innerWrapper');\n popoutWrapper = viewChild.required<ElementRef>('popoutWrapper');\n\n /**\n * Where the popout trigger should be located on the component\n */\n triggerPosition = input<PopoutTriggerPosition>(PopoutTriggerPosition.TOP_RIGHT);\n /**\n * Icon to be redered inside the trigger\n */\n triggerIcon = input<string>('open_in_new');\n /**\n * Tooltip text for the trigger button\n */\n triggerTooltip = input<string>();\n\n /**\n * configuration of the popped out window\n */\n popoutWindowConfig = input<PopoutWindowConfig>();\n /**\n * Whether or not to disable the undock feature\n */\n disabled = input<boolean>();\n\n /**\n * Emitted when the child component is popped out\n */\n popOut = output<boolean>();\n /**\n * Emitted when the child component is popped in again\n */\n popIn = output<boolean>();\n\n #popoutWindow = signal<Window | null>(null);\n #observer?: MutationObserver;\n\n poppedOut = computed(() => !!this.#popoutWindow());\n\n get isPoppedOut() {\n return this.poppedOut();\n }\n\n pop(e: MouseEvent) {\n if (this.isPoppedOut) this._popIn();\n else this._popOut(e);\n }\n\n private _popIn(): void {\n this.#renderer2.appendChild(this.popoutWrapper().nativeElement, this.innerWrapper().nativeElement);\n this._close();\n this.#cd.detectChanges();\n }\n\n private _popOut(event?: MouseEvent): void {\n if (!this.#popoutWindow()) {\n this.#popoutWindow.set(this._createPopoutWindow(event));\n\n const pw = this.#popoutWindow();\n if (!pw) {\n // The window wasn't allowed to open\n // This is likely caused by built-in popup blockers.\n alert('Could not open new window. This is likely caused by built-in popup blockers.');\n return;\n }\n this._cloneStylesToPopoutWindow();\n this._observeFutureStyleChanges();\n\n this.#renderer2.appendChild(pw.document.body, this.innerWrapper().nativeElement);\n pw.addEventListener('unload', () => this._popIn());\n this.#cd.detectChanges();\n this.popOut.emit(true);\n } else {\n this.#popoutWindow()!.focus();\n }\n }\n\n private _createPopoutWindow(mouseEvent?: MouseEvent): Window | null {\n const elmRect = this.innerWrapper().nativeElement.getBoundingClientRect();\n const [winLeft, winTop] = this._getWindowPositioning(elmRect, mouseEvent);\n const pwc = this.popoutWindowConfig();\n const winWidth = pwc?.size?.width ? pwc.size.width : elmRect.width;\n const winHeight = pwc?.size?.height ? pwc.size.height : elmRect.height + 1;\n\n const win = window.open(\n '',\n `popoutWindow${Date.now()}`,\n ` popup,\n width=${winWidth},\n height=${winHeight},\n left=${winLeft},\n top=${winTop}`\n );\n if (win) {\n win.document.title = this.popoutWindowConfig()?.title || window.document.title;\n win.document.body.style.margin = '0';\n }\n return win;\n }\n\n private _getWindowPositioning(elmRect: DOMRect, mouseEvent?: MouseEvent) {\n let winTop, winLeft;\n\n const pwc = this.popoutWindowConfig()?.position;\n if (pwc) {\n winTop = pwc.blockStart || winTop;\n winLeft = pwc.inlineStart || winLeft;\n } else {\n const navHeight = window.outerHeight - window.innerHeight;\n const navWidth = (window.outerWidth - window.innerWidth) / 2;\n\n winTop = window.screenY + navHeight + elmRect.top - 60;\n winLeft = window.screenX + navWidth + elmRect.left;\n\n // Position window titleBar under mouse\n if (mouseEvent) {\n winTop = mouseEvent.clientY + navHeight - 7;\n winLeft += 120;\n }\n }\n return [winLeft, winTop];\n }\n\n private _close(): void {\n if (this.#popoutWindow()) {\n this.#popoutWindow()!.close();\n this.#popoutWindow.set(null);\n this.popIn.emit(true);\n }\n }\n\n private _cloneStylesToPopoutWindow() {\n if (window.navigator.userAgent.indexOf('Firefox') === -1) {\n document.fonts.forEach((node) => {\n (this.#popoutWindow()!.document as any).fonts.add(node);\n });\n }\n document.head.querySelectorAll('link[rel=\"stylesheet\"]').forEach((node) => {\n this.#popoutWindow()!.document.head.insertAdjacentHTML(\n 'beforeend',\n `<link rel=\"stylesheet\" type=\"${(node as HTMLLinkElement).type}\" href=\"${(node as HTMLLinkElement).href}\">`\n );\n });\n document.head.querySelectorAll('style').forEach((node) => {\n this.#popoutWindow()!.document.head.appendChild(node.cloneNode(true));\n });\n }\n\n private _observeFutureStyleChanges() {\n const headEle = document.querySelector('head');\n const win = this.#popoutWindow();\n this.#observer?.disconnect();\n this.#observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (win && node.nodeName === 'STYLE') {\n win.document.head.appendChild(node.cloneNode(true));\n }\n });\n });\n });\n this.#observer.observe(headEle!, { childList: true });\n }\n\n ngOnDestroy(): void {\n this.#observer?.disconnect();\n this._close();\n }\n}\n","<div #popoutWrapper class=\"popoutWrapper\" [ngClass]=\"{ disabled: disabled() }\" [attr.data-pos]=\"triggerPosition()\">\n @if (triggerPosition() !== 'none') {\n <button ymtIconButton icon-button-size=\"small\" type=\"button\" class=\"trigger\" (click)=\"pop($event)\" [matTooltip]=\"triggerTooltip()\" [ngClass]=\"{ poppedOut: isPoppedOut }\">\n <mat-icon>{{ triggerIcon() }}</mat-icon>\n </button>\n }\n <div #innerWrapper class=\"innerWrapper\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { FullscreenDirective } from '@yuuvis/material/panes';\nimport { PopoutTriggerComponent } from './popout-trigger/popout-trigger.component';\nimport { PopoutComponent } from './popout.component';\n\n@NgModule({\n imports: [PopoutComponent, PopoutTriggerComponent, FullscreenDirective],\n exports: [PopoutComponent, PopoutTriggerComponent, FullscreenDirective]\n})\nexport class YuvPopoutModule {}\n","/**\n * @deprecated Import `FullscreenDirective` from `@yuuvis/material/panes` instead.\n */\nexport { FullscreenDirective } from '@yuuvis/material/panes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":"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"}
|