@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.
@@ -1,23 +1,23 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, ChangeDetectionStrategy, ViewChild, Injector, TemplateRef, Injectable, Directive, Optional, Input, HostBinding, NgModule } from '@angular/core';
3
- import * as i2 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import * as i3 from '@angular/cdk/portal';
6
- import { BasePortalOutlet, CdkPortalOutlet, TemplatePortal, ComponentPortal, PortalModule } from '@angular/cdk/portal';
7
- import * as i2$1 from '@angular/router';
8
- import { NavigationEnd } from '@angular/router';
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, combineLatest, Subject, fromEvent, timer, pipe, merge } from 'rxjs';
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(popoverRef, _el, _zone, _renderer) {
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: [{ token: FsPopoverRef }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
220
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsPopoverWrapperComponent, 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 <ng-container *ngIf=\"content\">\n {{content}}\n </ng-container>\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<div class=\"loading-spinner\"\n #spinner\n *ngIf=\"popoverRef.loading && !(popoverRef.componentVisible$ | async)\">\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", 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:hidden}.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: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
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
- }, 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 <ng-container *ngIf=\"content\">\n {{content}}\n </ng-container>\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<div class=\"loading-spinner\"\n #spinner\n *ngIf=\"popoverRef.loading && !(popoverRef.componentVisible$ | async)\">\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", 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:hidden}.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"] }]
227
- }], ctorParameters: () => [{ type: FsPopoverRef }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }], propDecorators: { _portalOutlet: [{
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
- let overlayX = 'center';
237
- let overlayY = 'center';
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
- function createOverlayRef(el, overlay, position) {
291
- const config = {
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: false
295
- };
296
- const overlayConfig = new OverlayConfig(config);
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: [{ token: i0.Injector }, { token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Injectable });
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
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Overlay }] });
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
- constructor(_elRef, _popoverService, _ngZone, _router) {
406
- this._elRef = _elRef;
407
- this._popoverService = _popoverService;
408
- this._ngZone = _ngZone;
409
- this._router = _router;
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.trigger === 'click') {
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._closePopover();
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
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverDirective, deps: [{ token: i0.ElementRef }, { token: FsPopoverService }, { token: i0.NgZone }, { token: i2$1.Router, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
537
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: FsPopoverDirective, selector: "[fsPopover]", inputs: { text: "text", template: "template", data: "data", leaveDelay: "leaveDelay", showDelay: "showDelay", maxWidth: "maxWidth", wrapperClass: "wrapperClass", autoShow: "autoShow", autoClose: "autoClose", loadingDiameter: "loadingDiameter", loading: "loading", indication: "indication", position: "position", theme: "theme", size: "size", trigger: "trigger", enabled: "enabled" }, host: { properties: { "class.indication": "this.indication", "class.fs-popover-enabled": "this.enabled" }, classAttribute: "fs-popover" }, usesOnChanges: true, ngImport: i0 });
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: () => [{ type: i0.ElementRef }, { type: FsPopoverService }, { type: i0.NgZone }, { type: i2$1.Router, decorators: [{
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: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
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, declarations: [FsPopoverComponent,
605
- FsPopoverWrapperComponent,
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, imports: [CommonModule,
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: [