@firestitch/popover 18.0.1 → 18.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/class/popover-ref.d.ts +13 -4
- package/app/components/popover/popover.component.d.ts +1 -1
- package/app/components/popover-wrapper/popover-wrapper.component.d.ts +4 -3
- package/app/directives/popover.directive.d.ts +57 -11
- package/app/fs-popover.module.d.ts +2 -5
- package/app/helpers/create-overlay-ref.d.ts +6 -2
- package/app/helpers/has-overlay-above.d.ts +10 -0
- package/app/interfaces/popover-config.interface.d.ts +1 -0
- package/app/services/popover.service.d.ts +1 -3
- package/esm2022/app/class/popover-ref.mjs +16 -2
- package/esm2022/app/components/popover/popover.component.mjs +5 -5
- package/esm2022/app/components/popover-wrapper/popover-wrapper.component.mjs +20 -18
- package/esm2022/app/directives/popover.directive.mjs +172 -23
- package/esm2022/app/fs-popover.module.mjs +4 -15
- package/esm2022/app/helpers/create-overlay-ref.mjs +11 -6
- package/esm2022/app/helpers/create-position-strategy.mjs +49 -45
- package/esm2022/app/helpers/has-overlay-above.mjs +24 -0
- package/esm2022/app/interfaces/popover-config.interface.mjs +1 -1
- package/esm2022/app/services/popover.service.mjs +6 -11
- package/esm2022/public_api.mjs +1 -1
- package/fesm2022/firestitch-popover.mjs +312 -134
- package/fesm2022/firestitch-popover.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Component, ChangeDetectionStrategy, ViewChild, Injector, TemplateRef, Injectable,
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
2
|
+
import { inject, ElementRef, NgZone, Renderer2, Component, ChangeDetectionStrategy, ViewChild, Injector, TemplateRef, Injectable, input, booleanAttribute, output, Directive, Input, HostBinding, NgModule } from '@angular/core';
|
|
3
|
+
import { NgClass, AsyncPipe, DOCUMENT } from '@angular/common';
|
|
4
|
+
import { Router, NavigationEnd } from '@angular/router';
|
|
5
|
+
import { ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';
|
|
6
|
+
import { hasModifierKey } from '@angular/cdk/keycodes';
|
|
7
|
+
import { OverlayConfig, Overlay } from '@angular/cdk/overlay';
|
|
8
|
+
import { BasePortalOutlet, CdkPortalOutlet, TemplatePortal, ComponentPortal } from '@angular/cdk/portal';
|
|
9
9
|
import { guid } from '@firestitch/common';
|
|
10
|
-
import { BehaviorSubject,
|
|
11
|
-
import { map, filter, takeUntil, debounceTime, delay, tap, switchMap, mapTo, startWith, distinctUntilChanged, withLatestFrom, finalize } from 'rxjs/operators';
|
|
12
|
-
import * as i1 from '@angular/cdk/overlay';
|
|
13
|
-
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
10
|
+
import { BehaviorSubject, Subject, combineLatest, fromEvent, timer, pipe, merge } from 'rxjs';
|
|
11
|
+
import { map, filter, takeUntil, debounceTime, delay, tap, switchMap, mapTo, startWith, distinctUntilChanged, withLatestFrom, finalize, take } from 'rxjs/operators';
|
|
14
12
|
|
|
15
13
|
class FsPopoverRef {
|
|
16
14
|
overlayRef;
|
|
17
15
|
_autoShow$ = new BehaviorSubject(true);
|
|
18
16
|
_autoClose$ = new BehaviorSubject(true);
|
|
19
17
|
_componentLoading$ = new BehaviorSubject(true);
|
|
18
|
+
_closed$ = new Subject();
|
|
20
19
|
_maxWidth;
|
|
20
|
+
_maxHeight;
|
|
21
21
|
_wrapperClass;
|
|
22
22
|
_loadingDiameter;
|
|
23
23
|
_loading;
|
|
@@ -76,6 +76,16 @@ class FsPopoverRef {
|
|
|
76
76
|
get maxWidth() {
|
|
77
77
|
return this._maxWidth;
|
|
78
78
|
}
|
|
79
|
+
get maxHeight() {
|
|
80
|
+
return this._maxHeight;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Emits after each close(). A panel listens to it, so content that calls
|
|
84
|
+
* `popover.close()` closes the panel the same way Escape or an outside click does.
|
|
85
|
+
*/
|
|
86
|
+
get closed$() {
|
|
87
|
+
return this._closed$.asObservable();
|
|
88
|
+
}
|
|
79
89
|
show() {
|
|
80
90
|
setTimeout(() => {
|
|
81
91
|
this._componentLoading$.next(false);
|
|
@@ -87,6 +97,7 @@ class FsPopoverRef {
|
|
|
87
97
|
close() {
|
|
88
98
|
this.overlayRef.detach();
|
|
89
99
|
this._componentLoading$.next(true);
|
|
100
|
+
this._closed$.next();
|
|
90
101
|
}
|
|
91
102
|
updatePosition() {
|
|
92
103
|
this.overlayRef.updatePosition();
|
|
@@ -94,6 +105,7 @@ class FsPopoverRef {
|
|
|
94
105
|
_init(config) {
|
|
95
106
|
this._wrapperClass = config.wrapperClass;
|
|
96
107
|
this._maxWidth = config.maxWidth;
|
|
108
|
+
this._maxHeight = config.maxHeight;
|
|
97
109
|
this._loading = config.loading;
|
|
98
110
|
this._loadingDiameter = config.loadingDiameter;
|
|
99
111
|
this._size = config.size;
|
|
@@ -103,23 +115,11 @@ class FsPopoverRef {
|
|
|
103
115
|
}
|
|
104
116
|
}
|
|
105
117
|
|
|
106
|
-
var Position;
|
|
107
|
-
(function (Position) {
|
|
108
|
-
Position["North"] = "north";
|
|
109
|
-
Position["South"] = "south";
|
|
110
|
-
Position["East"] = "east";
|
|
111
|
-
Position["West"] = "west";
|
|
112
|
-
})(Position || (Position = {}));
|
|
113
|
-
|
|
114
|
-
function pointInRect(x1, y1, x2, y2, px, py) {
|
|
115
|
-
return (px > x1 && px < x2) && (py > y1 && py < y2);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
118
|
class FsPopoverWrapperComponent extends BasePortalOutlet {
|
|
119
|
-
popoverRef;
|
|
120
|
-
_el;
|
|
121
|
-
_zone;
|
|
122
|
-
_renderer;
|
|
119
|
+
popoverRef = inject(FsPopoverRef);
|
|
120
|
+
_el = inject(ElementRef);
|
|
121
|
+
_zone = inject(NgZone);
|
|
122
|
+
_renderer = inject(Renderer2);
|
|
123
123
|
_portalOutlet;
|
|
124
124
|
spinner;
|
|
125
125
|
content;
|
|
@@ -127,19 +127,19 @@ class FsPopoverWrapperComponent extends BasePortalOutlet {
|
|
|
127
127
|
_contentChangesObserver;
|
|
128
128
|
_updatePosition = new Subject();
|
|
129
129
|
_destroy$ = new Subject();
|
|
130
|
-
constructor(
|
|
130
|
+
constructor() {
|
|
131
131
|
super();
|
|
132
|
-
this.popoverRef = popoverRef;
|
|
133
|
-
this._el = _el;
|
|
134
|
-
this._zone = _zone;
|
|
135
|
-
this._renderer = _renderer;
|
|
136
132
|
this._updateClass();
|
|
137
133
|
this.wrapperClass = this.popoverRef.wrapperClass;
|
|
138
134
|
this.maxWidth = this.popoverRef.maxWidth;
|
|
135
|
+
this.maxHeight = this.popoverRef.maxHeight;
|
|
139
136
|
}
|
|
140
137
|
set maxWidth(value) {
|
|
141
138
|
this._el.nativeElement.style.maxWidth = value ? `${value}px` : void 0;
|
|
142
139
|
}
|
|
140
|
+
set maxHeight(value) {
|
|
141
|
+
this._el.nativeElement.style.setProperty('--fs-popover-max-height', value ? `${value}px` : null);
|
|
142
|
+
}
|
|
143
143
|
set wrapperClass(value) {
|
|
144
144
|
this._wrapperClass = value;
|
|
145
145
|
this._updateClass();
|
|
@@ -216,15 +216,19 @@ class FsPopoverWrapperComponent extends BasePortalOutlet {
|
|
|
216
216
|
this.popoverRef.updatePosition();
|
|
217
217
|
});
|
|
218
218
|
}
|
|
219
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverWrapperComponent, deps: [
|
|
220
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
219
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
220
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsPopoverWrapperComponent, isStandalone: true, selector: "fs-popover-wrapper", host: { classAttribute: "fs-popover-wrapper" }, viewQueries: [{ propertyName: "_portalOutlet", first: true, predicate: CdkPortalOutlet, descendants: true, static: true }, { propertyName: "spinner", first: true, predicate: ["spinner"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"wrapper\" [ngClass]=\"{\n 'theme-dark' : popoverRef.theme === 'dark',\n 'size-tiny': popoverRef.size === 'tiny',\n 'size-small': popoverRef.size === 'small',\n 'hidden': !(popoverRef.componentVisible$ | async)\n }\">\n <div class=\"mat-elevation-z4 popover-content\">\n @if (content) {\n {{content}}\n }\n\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"fs-popover-arrow light\"></div>\n <div class=\"fs-popover-arrow dark\"></div>\n</div>\n\n@if (popoverRef.loading && !(popoverRef.componentVisible$ | async)) {\n <div class=\"loading-spinner\"\n #spinner\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" [attr.width]=\"popoverRef.loadingDiameter\" [attr.height]=\"popoverRef.loadingDiameter\" viewBox=\"0 0 42 42\" stroke=\"grey\">\n <g fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(1 1)\" stroke-width=\"3\">\n <circle stroke-opacity=\".5\" cx=\"18\" cy=\"18\" r=\"18\"/>\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 18 18\" to=\"360 18 18\" dur=\"1s\" repeatCount=\"indefinite\"/>\n </path>\n </g>\n </g>\n </svg>\n </div>\n}\n", styles: [".wrapper{padding:6px;animation:fadeIn ease .2s}.wrapper.hidden{display:none}.wrapper .popover-content{background:#fff;border-radius:4px;padding:8px;color:#1b1b1b;box-sizing:border-box;overflow:auto;max-height:var(--fs-popover-max-height, calc(100vh - 100px) )}.wrapper.theme-dark .popover-content{background-color:#707070;color:#fff}.wrapper.size-small .popover-content{font-size:80%}.wrapper.size-tiny .popover-content{font-size:70%}.wrapper .fs-popover-arrow{width:0;height:0;font-size:0;line-height:0;position:absolute;z-index:200;z-index:1}.wrapper .fs-popover-arrow.dark{z-index:0}::ng-deep .fs-popover-top .fs-popover-arrow,::ng-deep .fs-popover-bottom .fs-popover-arrow{border-left:10px solid transparent;border-right:10px solid transparent}::ng-deep .fs-popover-left .fs-popover-arrow,::ng-deep .fs-popover-right .fs-popover-arrow{border-top:10px solid transparent;border-bottom:10px solid transparent}::ng-deep .fs-popover-top .fs-popover-arrow{bottom:-3px;left:calc(50% - 10px);border-top:10px solid #fff}::ng-deep .fs-popover-top .fs-popover-arrow.dark{border-top-color:#dfdfdf40;bottom:-4px}::ng-deep .fs-popover-bottom .fs-popover-arrow{top:-3px;left:calc(50% - 10px);border-bottom:10px solid #fff}::ng-deep .fs-popover-bottom .fs-popover-arrow.dark{border-bottom-color:#dfdfdf40;top:-4px}::ng-deep .fs-popover-left .fs-popover-arrow{left:-3px;top:calc(50% - 10px);border-right:10px solid #fff}::ng-deep .fs-popover-left .fs-popover-arrow.dark{border-right-color:#dfdfdf40;left:-4px}::ng-deep .fs-popover-right .fs-popover-arrow{right:-3px;top:calc(50% - 10px);border-left:10px solid #fff}::ng-deep .fs-popover-right .fs-popover-arrow.dark{border-left-color:#dfdfdf40;right:-4px}::ng-deep .fs-popover-bottom .wrapper.theme-dark .fs-popover-arrow{border-bottom-color:#707070}::ng-deep .fs-popover-left .wrapper.theme-dark .fs-popover-arrow{border-right-color:#707070}::ng-deep .fs-popover-right .wrapper.theme-dark .fs-popover-arrow{border-left-color:#707070}::ng-deep .fs-popover-top .wrapper.theme-dark .fs-popover-arrow{border-top-color:#707070}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
221
221
|
}
|
|
222
222
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverWrapperComponent, decorators: [{
|
|
223
223
|
type: Component,
|
|
224
224
|
args: [{ selector: 'fs-popover-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
225
225
|
'class': 'fs-popover-wrapper',
|
|
226
|
-
},
|
|
227
|
-
|
|
226
|
+
}, standalone: true, imports: [
|
|
227
|
+
NgClass,
|
|
228
|
+
CdkPortalOutlet,
|
|
229
|
+
AsyncPipe,
|
|
230
|
+
], template: "<div class=\"wrapper\" [ngClass]=\"{\n 'theme-dark' : popoverRef.theme === 'dark',\n 'size-tiny': popoverRef.size === 'tiny',\n 'size-small': popoverRef.size === 'small',\n 'hidden': !(popoverRef.componentVisible$ | async)\n }\">\n <div class=\"mat-elevation-z4 popover-content\">\n @if (content) {\n {{content}}\n }\n\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"fs-popover-arrow light\"></div>\n <div class=\"fs-popover-arrow dark\"></div>\n</div>\n\n@if (popoverRef.loading && !(popoverRef.componentVisible$ | async)) {\n <div class=\"loading-spinner\"\n #spinner\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" [attr.width]=\"popoverRef.loadingDiameter\" [attr.height]=\"popoverRef.loadingDiameter\" viewBox=\"0 0 42 42\" stroke=\"grey\">\n <g fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(1 1)\" stroke-width=\"3\">\n <circle stroke-opacity=\".5\" cx=\"18\" cy=\"18\" r=\"18\"/>\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 18 18\" to=\"360 18 18\" dur=\"1s\" repeatCount=\"indefinite\"/>\n </path>\n </g>\n </g>\n </svg>\n </div>\n}\n", styles: [".wrapper{padding:6px;animation:fadeIn ease .2s}.wrapper.hidden{display:none}.wrapper .popover-content{background:#fff;border-radius:4px;padding:8px;color:#1b1b1b;box-sizing:border-box;overflow:auto;max-height:var(--fs-popover-max-height, calc(100vh - 100px) )}.wrapper.theme-dark .popover-content{background-color:#707070;color:#fff}.wrapper.size-small .popover-content{font-size:80%}.wrapper.size-tiny .popover-content{font-size:70%}.wrapper .fs-popover-arrow{width:0;height:0;font-size:0;line-height:0;position:absolute;z-index:200;z-index:1}.wrapper .fs-popover-arrow.dark{z-index:0}::ng-deep .fs-popover-top .fs-popover-arrow,::ng-deep .fs-popover-bottom .fs-popover-arrow{border-left:10px solid transparent;border-right:10px solid transparent}::ng-deep .fs-popover-left .fs-popover-arrow,::ng-deep .fs-popover-right .fs-popover-arrow{border-top:10px solid transparent;border-bottom:10px solid transparent}::ng-deep .fs-popover-top .fs-popover-arrow{bottom:-3px;left:calc(50% - 10px);border-top:10px solid #fff}::ng-deep .fs-popover-top .fs-popover-arrow.dark{border-top-color:#dfdfdf40;bottom:-4px}::ng-deep .fs-popover-bottom .fs-popover-arrow{top:-3px;left:calc(50% - 10px);border-bottom:10px solid #fff}::ng-deep .fs-popover-bottom .fs-popover-arrow.dark{border-bottom-color:#dfdfdf40;top:-4px}::ng-deep .fs-popover-left .fs-popover-arrow{left:-3px;top:calc(50% - 10px);border-right:10px solid #fff}::ng-deep .fs-popover-left .fs-popover-arrow.dark{border-right-color:#dfdfdf40;left:-4px}::ng-deep .fs-popover-right .fs-popover-arrow{right:-3px;top:calc(50% - 10px);border-left:10px solid #fff}::ng-deep .fs-popover-right .fs-popover-arrow.dark{border-left-color:#dfdfdf40;right:-4px}::ng-deep .fs-popover-bottom .wrapper.theme-dark .fs-popover-arrow{border-bottom-color:#707070}::ng-deep .fs-popover-left .wrapper.theme-dark .fs-popover-arrow{border-right-color:#707070}::ng-deep .fs-popover-right .wrapper.theme-dark .fs-popover-arrow{border-left-color:#707070}::ng-deep .fs-popover-top .wrapper.theme-dark .fs-popover-arrow{border-top-color:#707070}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"] }]
|
|
231
|
+
}], ctorParameters: () => [], propDecorators: { _portalOutlet: [{
|
|
228
232
|
type: ViewChild,
|
|
229
233
|
args: [CdkPortalOutlet, { static: true }]
|
|
230
234
|
}], spinner: [{
|
|
@@ -232,94 +236,135 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
232
236
|
args: ['spinner']
|
|
233
237
|
}] } });
|
|
234
238
|
|
|
239
|
+
var Position;
|
|
240
|
+
(function (Position) {
|
|
241
|
+
Position["North"] = "north";
|
|
242
|
+
Position["South"] = "south";
|
|
243
|
+
Position["East"] = "east";
|
|
244
|
+
Position["West"] = "west";
|
|
245
|
+
})(Position || (Position = {}));
|
|
246
|
+
|
|
247
|
+
function createInjector(popoverRef, parentInjector) {
|
|
248
|
+
const providers = [
|
|
249
|
+
{ provide: FsPopoverRef, useValue: popoverRef },
|
|
250
|
+
];
|
|
251
|
+
return Injector.create({
|
|
252
|
+
providers,
|
|
253
|
+
parent: parentInjector,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const POSITIONS = {
|
|
258
|
+
[Position.North]: {
|
|
259
|
+
originX: 'center',
|
|
260
|
+
originY: 'top',
|
|
261
|
+
overlayX: 'center',
|
|
262
|
+
overlayY: 'bottom',
|
|
263
|
+
offsetX: 0,
|
|
264
|
+
offsetY: -8,
|
|
265
|
+
panelClass: ['fs-popover-top'],
|
|
266
|
+
},
|
|
267
|
+
[Position.South]: {
|
|
268
|
+
originX: 'center',
|
|
269
|
+
originY: 'bottom',
|
|
270
|
+
overlayX: 'center',
|
|
271
|
+
overlayY: 'top',
|
|
272
|
+
offsetX: 0,
|
|
273
|
+
offsetY: 8,
|
|
274
|
+
panelClass: ['fs-popover-bottom'],
|
|
275
|
+
},
|
|
276
|
+
[Position.East]: {
|
|
277
|
+
originX: 'end',
|
|
278
|
+
originY: 'center',
|
|
279
|
+
overlayX: 'start',
|
|
280
|
+
overlayY: 'center',
|
|
281
|
+
offsetX: 8,
|
|
282
|
+
offsetY: 0,
|
|
283
|
+
panelClass: ['fs-popover-left'],
|
|
284
|
+
},
|
|
285
|
+
[Position.West]: {
|
|
286
|
+
originX: 'start',
|
|
287
|
+
originY: 'center',
|
|
288
|
+
overlayX: 'end',
|
|
289
|
+
overlayY: 'center',
|
|
290
|
+
offsetX: -8,
|
|
291
|
+
offsetY: 0,
|
|
292
|
+
panelClass: ['fs-popover-right'],
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
const FALLBACKS = {
|
|
296
|
+
[Position.South]: Position.North,
|
|
297
|
+
[Position.North]: Position.South,
|
|
298
|
+
[Position.East]: Position.West,
|
|
299
|
+
[Position.West]: Position.East,
|
|
300
|
+
};
|
|
235
301
|
function createPopupPositionStrategy(el, overlay, position) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
let originX = 'center';
|
|
239
|
-
let originY = 'center';
|
|
240
|
-
let offsetX = 0;
|
|
241
|
-
let offsetY = 0;
|
|
242
|
-
let panelClass = [];
|
|
243
|
-
switch (position) {
|
|
244
|
-
case Position.North:
|
|
245
|
-
originY = 'top';
|
|
246
|
-
overlayY = 'bottom';
|
|
247
|
-
panelClass = ['fs-popover-top'];
|
|
248
|
-
offsetY = -8;
|
|
249
|
-
break;
|
|
250
|
-
case Position.South:
|
|
251
|
-
originY = 'bottom';
|
|
252
|
-
overlayY = 'top';
|
|
253
|
-
panelClass = ['fs-popover-bottom'];
|
|
254
|
-
offsetY = 8;
|
|
255
|
-
break;
|
|
256
|
-
case Position.East:
|
|
257
|
-
overlayX = 'start';
|
|
258
|
-
originX = 'end';
|
|
259
|
-
panelClass = ['fs-popover-left'];
|
|
260
|
-
offsetX = 8;
|
|
261
|
-
break;
|
|
262
|
-
case Position.West:
|
|
263
|
-
overlayX = 'end';
|
|
264
|
-
originX = 'start';
|
|
265
|
-
panelClass = ['fs-popover-right'];
|
|
266
|
-
offsetX = -8;
|
|
267
|
-
break;
|
|
268
|
-
}
|
|
302
|
+
const primary = POSITIONS[position];
|
|
303
|
+
const fallback = POSITIONS[FALLBACKS[position]];
|
|
269
304
|
return createBasePopupPositionStrategy(el, overlay)
|
|
270
|
-
.withPositions([
|
|
271
|
-
{
|
|
272
|
-
originX: originX,
|
|
273
|
-
originY: originY,
|
|
274
|
-
overlayX: overlayX,
|
|
275
|
-
overlayY: overlayY,
|
|
276
|
-
offsetX: offsetX,
|
|
277
|
-
offsetY: offsetY,
|
|
278
|
-
panelClass: panelClass,
|
|
279
|
-
}
|
|
280
|
-
]);
|
|
305
|
+
.withPositions([primary, fallback]);
|
|
281
306
|
}
|
|
282
307
|
function createBasePopupPositionStrategy(el, overlay) {
|
|
283
308
|
return overlay.position()
|
|
284
309
|
.flexibleConnectedTo(el)
|
|
285
310
|
.withGrowAfterOpen(true)
|
|
311
|
+
.withPush(true)
|
|
286
312
|
.withFlexibleDimensions(false)
|
|
287
313
|
.withViewportMargin(4);
|
|
288
314
|
}
|
|
289
315
|
|
|
290
|
-
|
|
291
|
-
|
|
316
|
+
/**
|
|
317
|
+
* Hover and click popovers have no backdrop. A panel gets a transparent backdrop, so a click
|
|
318
|
+
* anywhere outside it closes it, and the `fs-popover-panel` class on its pane.
|
|
319
|
+
*/
|
|
320
|
+
function createOverlayRef(el, overlay, position, panel = false) {
|
|
321
|
+
const overlayConfig = new OverlayConfig({
|
|
292
322
|
positionStrategy: createPopupPositionStrategy(el, overlay, position),
|
|
293
323
|
scrollStrategy: overlay.scrollStrategies.reposition(),
|
|
294
|
-
hasBackdrop:
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
return overlay.create(overlayConfig);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
function createInjector(popoverRef, parentInjector) {
|
|
301
|
-
const providers = [
|
|
302
|
-
{ provide: FsPopoverRef, useValue: popoverRef },
|
|
303
|
-
];
|
|
304
|
-
return Injector.create({
|
|
305
|
-
providers,
|
|
306
|
-
parent: parentInjector,
|
|
324
|
+
hasBackdrop: panel,
|
|
325
|
+
backdropClass: panel ? 'cdk-overlay-transparent-backdrop' : undefined,
|
|
326
|
+
panelClass: panel ? 'fs-popover-panel' : undefined,
|
|
307
327
|
});
|
|
328
|
+
return overlay.create(overlayConfig);
|
|
308
329
|
}
|
|
309
330
|
|
|
310
331
|
function createTempatePortal(template, popoverRef, data) {
|
|
311
332
|
return new TemplatePortal(template, void 0, { data: data, popover: popoverRef });
|
|
312
333
|
}
|
|
313
334
|
|
|
335
|
+
/**
|
|
336
|
+
* True when an overlay with a backdrop was attached after this one and still shows content:
|
|
337
|
+
* a calendar, a select, a menu or a dialog opened from inside it. Overlays without a backdrop
|
|
338
|
+
* (tooltips, toasts, hover popovers) don't count.
|
|
339
|
+
*
|
|
340
|
+
* CDK inserts each backdrop right before its overlay's host, and later overlays after earlier
|
|
341
|
+
* ones, so everything after this overlay's host was attached later.
|
|
342
|
+
*/
|
|
343
|
+
function hasOverlayAbove(overlayRef) {
|
|
344
|
+
let element = overlayRef.hostElement?.nextElementSibling;
|
|
345
|
+
while (element) {
|
|
346
|
+
if (isShowingBackdropOverlay(element)) {
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
element = element.nextElementSibling;
|
|
350
|
+
}
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
function isShowingBackdropOverlay(host) {
|
|
354
|
+
const pane = host.querySelector(':scope > .cdk-overlay-pane');
|
|
355
|
+
return !!pane?.childElementCount
|
|
356
|
+
&& !!host.previousElementSibling?.classList.contains('cdk-overlay-backdrop');
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function pointInRect(x1, y1, x2, y2, px, py) {
|
|
360
|
+
return (px > x1 && px < x2) && (py > y1 && py < y2);
|
|
361
|
+
}
|
|
362
|
+
|
|
314
363
|
class FsPopoverService {
|
|
315
|
-
_injector;
|
|
316
|
-
_overlay;
|
|
364
|
+
_injector = inject(Injector);
|
|
365
|
+
_overlay = inject(Overlay);
|
|
317
366
|
_activeElement;
|
|
318
367
|
_activeElementGUID;
|
|
319
|
-
constructor(_injector, _overlay) {
|
|
320
|
-
this._injector = _injector;
|
|
321
|
-
this._overlay = _overlay;
|
|
322
|
-
}
|
|
323
368
|
get hasActivePopover() {
|
|
324
369
|
return !!this._activeElement;
|
|
325
370
|
}
|
|
@@ -360,7 +405,7 @@ class FsPopoverService {
|
|
|
360
405
|
const containerPortal = new ComponentPortal(component, void 0, createInjector(popoverRef, this._injector));
|
|
361
406
|
return overlayRef.attach(containerPortal);
|
|
362
407
|
}
|
|
363
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverService, deps: [
|
|
408
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
364
409
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverService, providedIn: 'root' });
|
|
365
410
|
}
|
|
366
411
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverService, decorators: [{
|
|
@@ -368,20 +413,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
368
413
|
args: [{
|
|
369
414
|
providedIn: 'root',
|
|
370
415
|
}]
|
|
371
|
-
}]
|
|
416
|
+
}] });
|
|
372
417
|
|
|
373
418
|
class FsPopoverDirective {
|
|
374
|
-
_elRef;
|
|
375
|
-
_popoverService;
|
|
376
|
-
_ngZone;
|
|
377
|
-
_router;
|
|
378
|
-
_guid = guid('xxxxxxx');
|
|
379
419
|
text;
|
|
380
420
|
template;
|
|
381
421
|
data;
|
|
382
422
|
leaveDelay = 100;
|
|
383
423
|
showDelay = 0;
|
|
384
424
|
maxWidth = 250;
|
|
425
|
+
maxHeight;
|
|
385
426
|
wrapperClass;
|
|
386
427
|
autoShow = true;
|
|
387
428
|
autoClose = true;
|
|
@@ -393,6 +434,17 @@ class FsPopoverDirective {
|
|
|
393
434
|
size = 'normal';
|
|
394
435
|
trigger = 'mouseover';
|
|
395
436
|
enabled = true;
|
|
437
|
+
/**
|
|
438
|
+
* Panel mode: a host click or open() opens it; it stays open until close(), an outside
|
|
439
|
+
* click, Escape (only when no later overlay with a backdrop sits above it) or `popover.close()`
|
|
440
|
+
* from the content. Focus is trapped inside and returns on close to the element that had it
|
|
441
|
+
* when the panel opened. `trigger`, `showDelay`, `leaveDelay` and `autoClose` don't apply.
|
|
442
|
+
*/
|
|
443
|
+
panel = input(false, { transform: booleanAttribute });
|
|
444
|
+
/**
|
|
445
|
+
* Emits each time the panel closes.
|
|
446
|
+
*/
|
|
447
|
+
closed = output();
|
|
396
448
|
_initialized = false;
|
|
397
449
|
_popoverRef;
|
|
398
450
|
_wrapperElement;
|
|
@@ -402,11 +454,21 @@ class FsPopoverDirective {
|
|
|
402
454
|
_mouseLeave$;
|
|
403
455
|
_popoverClosed$ = new Subject();
|
|
404
456
|
_destroy$ = new Subject();
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
457
|
+
_elRef = inject(ElementRef);
|
|
458
|
+
_popoverService = inject(FsPopoverService);
|
|
459
|
+
_ngZone = inject(NgZone);
|
|
460
|
+
_router = inject(Router, { optional: true });
|
|
461
|
+
_guid = guid('xxxxxxx');
|
|
462
|
+
_overlay = inject(Overlay);
|
|
463
|
+
_injector = inject(Injector);
|
|
464
|
+
_focusTrapFactory = inject(ConfigurableFocusTrapFactory);
|
|
465
|
+
_document = inject(DOCUMENT);
|
|
466
|
+
_panelOverlayRef;
|
|
467
|
+
_panelFocusTrap;
|
|
468
|
+
_panelOpener;
|
|
469
|
+
_panelTopmostKeydown;
|
|
470
|
+
_panelClosed$ = new Subject();
|
|
471
|
+
constructor() {
|
|
410
472
|
this._mouseEnter$ = fromEvent(this._elRef.nativeElement, 'mouseenter');
|
|
411
473
|
this._mouseMove$ = fromEvent(document, 'mousemove', { passive: true });
|
|
412
474
|
this._mouseLeave$ = fromEvent(this._elRef.nativeElement, 'mouseleave');
|
|
@@ -430,9 +492,33 @@ class FsPopoverDirective {
|
|
|
430
492
|
}
|
|
431
493
|
}
|
|
432
494
|
ngOnDestroy() {
|
|
495
|
+
if (this._panelOverlayRef) {
|
|
496
|
+
this._finishPanel(false);
|
|
497
|
+
}
|
|
433
498
|
this._popoverClosed$.next(null);
|
|
434
499
|
this._destroy$.next(null);
|
|
435
500
|
}
|
|
501
|
+
/**
|
|
502
|
+
* Opens the panel on this element. Panel mode only.
|
|
503
|
+
*/
|
|
504
|
+
open() {
|
|
505
|
+
if (!this.panel() || !this.enabled || !this._initialized || this._panelOverlayRef) {
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
this._ngZone.run(() => this._openPanel());
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Closes the panel, or in hover and click modes the open popover.
|
|
512
|
+
*/
|
|
513
|
+
close() {
|
|
514
|
+
if (!this.panel()) {
|
|
515
|
+
this._closePopover();
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
if (this._panelOverlayRef) {
|
|
519
|
+
this._ngZone.run(() => this._popoverRef.close());
|
|
520
|
+
}
|
|
521
|
+
}
|
|
436
522
|
_closePopover() {
|
|
437
523
|
this._popoverClosed$.next(null);
|
|
438
524
|
this._ngZone.run(() => {
|
|
@@ -448,6 +534,7 @@ class FsPopoverDirective {
|
|
|
448
534
|
}
|
|
449
535
|
this._popoverRef = new FsPopoverRef({
|
|
450
536
|
maxWidth: this.maxWidth,
|
|
537
|
+
maxHeight: this.maxHeight,
|
|
451
538
|
wrapperClass: this.wrapperClass,
|
|
452
539
|
autoShow: this.autoShow,
|
|
453
540
|
autoClose: this.autoClose,
|
|
@@ -457,7 +544,10 @@ class FsPopoverDirective {
|
|
|
457
544
|
theme: this.theme,
|
|
458
545
|
});
|
|
459
546
|
this._ngZone.runOutsideAngular(() => {
|
|
460
|
-
if (this.
|
|
547
|
+
if (this.panel()) {
|
|
548
|
+
this._listenPanelHostClick();
|
|
549
|
+
}
|
|
550
|
+
else if (this.trigger === 'click') {
|
|
461
551
|
this._listenMouseHostClick();
|
|
462
552
|
}
|
|
463
553
|
else {
|
|
@@ -474,7 +564,7 @@ class FsPopoverDirective {
|
|
|
474
564
|
}), pipe(takeUntil(this._destroy$
|
|
475
565
|
.pipe(delay(200)))))
|
|
476
566
|
.subscribe(() => {
|
|
477
|
-
this.
|
|
567
|
+
this.close();
|
|
478
568
|
});
|
|
479
569
|
}
|
|
480
570
|
_listenMouseHostClick() {
|
|
@@ -533,20 +623,114 @@ class FsPopoverDirective {
|
|
|
533
623
|
const pointInPopoverRect = pointInRect(popoverBounds.x, popoverBounds.y, popoverBounds.x + popoverBounds.width, popoverBounds.y + popoverBounds.height, event.x, event.y);
|
|
534
624
|
return !pointInHostRect && !pointInPopoverRect;
|
|
535
625
|
}
|
|
536
|
-
|
|
537
|
-
|
|
626
|
+
_listenPanelHostClick() {
|
|
627
|
+
fromEvent(this._elRef.nativeElement, 'click')
|
|
628
|
+
.pipe(filter(() => this.enabled), tap((event) => {
|
|
629
|
+
event.stopPropagation();
|
|
630
|
+
this.open();
|
|
631
|
+
}), takeUntil(this._destroy$))
|
|
632
|
+
.subscribe();
|
|
633
|
+
}
|
|
634
|
+
_openPanel() {
|
|
635
|
+
this._panelOpener = this._document.activeElement;
|
|
636
|
+
this._panelOverlayRef = createOverlayRef(this._elRef, this._overlay, this.position, true);
|
|
637
|
+
this._popoverRef.overlayRef = this._panelOverlayRef;
|
|
638
|
+
const wrapperElement = this._attachPanelContent(this._panelOverlayRef);
|
|
639
|
+
this._trapPanelFocus(wrapperElement);
|
|
640
|
+
this._listenPanelClose(this._panelOverlayRef);
|
|
641
|
+
this._listenPanelEscape(this._panelOverlayRef);
|
|
642
|
+
}
|
|
643
|
+
_attachPanelContent(overlayRef) {
|
|
644
|
+
const wrapperRef = overlayRef.attach(new ComponentPortal(FsPopoverWrapperComponent, null, createInjector(this._popoverRef, this._injector)));
|
|
645
|
+
if (this.template) {
|
|
646
|
+
wrapperRef.instance
|
|
647
|
+
.attachTemplatePortal(createTempatePortal(this.template, this._popoverRef, this.data));
|
|
648
|
+
}
|
|
649
|
+
else {
|
|
650
|
+
wrapperRef.instance.setTextualContent(this.text);
|
|
651
|
+
}
|
|
652
|
+
return wrapperRef.location.nativeElement;
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* The configurable trap also pulls focus back when it lands outside the panel, for
|
|
656
|
+
* example on the first Tab after a calendar inside closed and took the focused element
|
|
657
|
+
* with it. Focus inside other overlays (a select, a calendar) is left alone.
|
|
658
|
+
*/
|
|
659
|
+
_trapPanelFocus(wrapperElement) {
|
|
660
|
+
this._panelFocusTrap = this._focusTrapFactory.create(wrapperElement);
|
|
661
|
+
this._panelFocusTrap.focusInitialElementWhenReady()
|
|
662
|
+
.then((focused) => {
|
|
663
|
+
// Nothing inside takes focus (text only): the panel itself becomes the one
|
|
664
|
+
// tab stop, so the opener behind the backdrop doesn't keep focus.
|
|
665
|
+
if (!focused && wrapperElement.isConnected) {
|
|
666
|
+
wrapperElement.setAttribute('tabindex', '0');
|
|
667
|
+
wrapperElement.style.outline = 'none';
|
|
668
|
+
wrapperElement.focus();
|
|
669
|
+
}
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
_listenPanelClose(overlayRef) {
|
|
673
|
+
overlayRef.backdropClick()
|
|
674
|
+
.pipe(tap(() => this.close()), takeUntil(this._panelClosed$))
|
|
675
|
+
.subscribe();
|
|
676
|
+
// Every close (close(), the backdrop, Escape, or `popover.close()` from the
|
|
677
|
+
// content) goes through FsPopoverRef.close(), which detaches and then emits.
|
|
678
|
+
this._popoverRef.closed$
|
|
679
|
+
.pipe(take(1), tap(() => this._finishPanel(true)), takeUntil(this._panelClosed$))
|
|
680
|
+
.subscribe();
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Escape closes the panel only when no later overlay with a backdrop sits above it, so
|
|
684
|
+
* Escape in a calendar, select or menu opened from the panel closes only that. The check
|
|
685
|
+
* runs in the capture phase, before any handler inside closes its own overlay; fs-datepicker,
|
|
686
|
+
* for one, closes its calendar from the input's keydown and from a document listener.
|
|
687
|
+
*/
|
|
688
|
+
_listenPanelEscape(overlayRef) {
|
|
689
|
+
this._ngZone.runOutsideAngular(() => {
|
|
690
|
+
fromEvent(this._document, 'keydown', { capture: true })
|
|
691
|
+
.pipe(tap((event) => {
|
|
692
|
+
this._panelTopmostKeydown = hasOverlayAbove(overlayRef) ? null : event;
|
|
693
|
+
}), takeUntil(this._panelClosed$))
|
|
694
|
+
.subscribe();
|
|
695
|
+
});
|
|
696
|
+
overlayRef.keydownEvents()
|
|
697
|
+
.pipe(filter((event) => event.key === 'Escape' && !hasModifierKey(event)), filter((event) => event === this._panelTopmostKeydown), tap(() => this.close()), takeUntil(this._panelClosed$))
|
|
698
|
+
.subscribe();
|
|
699
|
+
}
|
|
700
|
+
_finishPanel(emit) {
|
|
701
|
+
const overlayRef = this._panelOverlayRef;
|
|
702
|
+
this._panelOverlayRef = null;
|
|
703
|
+
this._panelTopmostKeydown = null;
|
|
704
|
+
this._panelClosed$.next();
|
|
705
|
+
this._panelFocusTrap?.destroy();
|
|
706
|
+
this._panelFocusTrap = null;
|
|
707
|
+
overlayRef.dispose();
|
|
708
|
+
this._restorePanelFocus();
|
|
709
|
+
if (emit) {
|
|
710
|
+
this.closed.emit();
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
_restorePanelFocus() {
|
|
714
|
+
const opener = this._panelOpener;
|
|
715
|
+
this._panelOpener = null;
|
|
716
|
+
if (opener?.isConnected && typeof opener.focus === 'function') {
|
|
717
|
+
opener.focus();
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
721
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.7", type: FsPopoverDirective, isStandalone: true, selector: "[fsPopover]", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: false, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: false, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, leaveDelay: { classPropertyName: "leaveDelay", publicName: "leaveDelay", isSignal: false, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "showDelay", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: false, isRequired: false, transformFunction: null }, wrapperClass: { classPropertyName: "wrapperClass", publicName: "wrapperClass", isSignal: false, isRequired: false, transformFunction: null }, autoShow: { classPropertyName: "autoShow", publicName: "autoShow", isSignal: false, isRequired: false, transformFunction: null }, autoClose: { classPropertyName: "autoClose", publicName: "autoClose", isSignal: false, isRequired: false, transformFunction: null }, loadingDiameter: { classPropertyName: "loadingDiameter", publicName: "loadingDiameter", isSignal: false, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: false, isRequired: false, transformFunction: null }, indication: { classPropertyName: "indication", publicName: "indication", isSignal: false, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: false, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: false, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: false, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: false, isRequired: false, transformFunction: null }, panel: { classPropertyName: "panel", publicName: "panel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { properties: { "class.indication": "this.indication", "class.fs-popover-enabled": "this.enabled" }, classAttribute: "fs-popover" }, exportAs: ["fsPopover"], usesOnChanges: true, ngImport: i0 });
|
|
538
722
|
}
|
|
539
723
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverDirective, decorators: [{
|
|
540
724
|
type: Directive,
|
|
541
725
|
args: [{
|
|
542
726
|
selector: '[fsPopover]',
|
|
727
|
+
exportAs: 'fsPopover',
|
|
543
728
|
host: {
|
|
544
729
|
'class': 'fs-popover',
|
|
545
730
|
},
|
|
731
|
+
standalone: true,
|
|
546
732
|
}]
|
|
547
|
-
}], ctorParameters: () => [
|
|
548
|
-
type: Optional
|
|
549
|
-
}] }], propDecorators: { text: [{
|
|
733
|
+
}], ctorParameters: () => [], propDecorators: { text: [{
|
|
550
734
|
type: Input
|
|
551
735
|
}], template: [{
|
|
552
736
|
type: Input
|
|
@@ -558,6 +742,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
558
742
|
type: Input
|
|
559
743
|
}], maxWidth: [{
|
|
560
744
|
type: Input
|
|
745
|
+
}], maxHeight: [{
|
|
746
|
+
type: Input
|
|
561
747
|
}], wrapperClass: [{
|
|
562
748
|
type: Input
|
|
563
749
|
}], autoShow: [{
|
|
@@ -590,35 +776,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
590
776
|
|
|
591
777
|
class FsPopoverComponent extends FsPopoverDirective {
|
|
592
778
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
593
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsPopoverComponent, selector: "fs-popover", host: { classAttribute: "fs-popover-component" }, usesInheritance: true, ngImport: i0, template: "<span [ngClass]=\"{'popover-container': enabled}\">\n <ng-content></ng-content>\n</span>\n", dependencies: [{ kind: "directive", type:
|
|
779
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsPopoverComponent, isStandalone: true, selector: "fs-popover", host: { classAttribute: "fs-popover-component" }, exportAs: ["fsPopover"], usesInheritance: true, ngImport: i0, template: "<span [ngClass]=\"{'popover-container': enabled}\">\n <ng-content></ng-content>\n</span>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
594
780
|
}
|
|
595
781
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverComponent, decorators: [{
|
|
596
782
|
type: Component,
|
|
597
|
-
args: [{ selector: 'fs-popover', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
783
|
+
args: [{ selector: 'fs-popover', exportAs: 'fsPopover', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
598
784
|
'class': 'fs-popover-component',
|
|
599
|
-
}, template: "<span [ngClass]=\"{'popover-container': enabled}\">\n <ng-content></ng-content>\n</span>\n" }]
|
|
785
|
+
}, standalone: true, imports: [NgClass], template: "<span [ngClass]=\"{'popover-container': enabled}\">\n <ng-content></ng-content>\n</span>\n" }]
|
|
600
786
|
}] });
|
|
601
787
|
|
|
602
788
|
class FsPopoverModule {
|
|
603
789
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
604
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule,
|
|
605
|
-
|
|
606
|
-
FsPopoverDirective], imports: [CommonModule,
|
|
607
|
-
PortalModule], exports: [FsPopoverComponent,
|
|
790
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, imports: [FsPopoverComponent,
|
|
791
|
+
FsPopoverDirective], exports: [FsPopoverComponent,
|
|
608
792
|
FsPopoverDirective] });
|
|
609
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule
|
|
610
|
-
PortalModule] });
|
|
793
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule });
|
|
611
794
|
}
|
|
612
795
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, decorators: [{
|
|
613
796
|
type: NgModule,
|
|
614
797
|
args: [{
|
|
615
798
|
imports: [
|
|
616
|
-
CommonModule,
|
|
617
|
-
PortalModule,
|
|
618
|
-
],
|
|
619
|
-
declarations: [
|
|
620
799
|
FsPopoverComponent,
|
|
621
|
-
FsPopoverWrapperComponent,
|
|
622
800
|
FsPopoverDirective,
|
|
623
801
|
],
|
|
624
802
|
exports: [
|