quang 20.4.6 → 20.5.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.
Files changed (40) hide show
  1. package/auth/index.d.ts +4 -5
  2. package/fesm2022/quang-auth.mjs +20 -20
  3. package/fesm2022/quang-auth.mjs.map +1 -1
  4. package/fesm2022/quang-components-autocomplete.mjs +4 -4
  5. package/fesm2022/quang-components-autocomplete.mjs.map +1 -1
  6. package/fesm2022/quang-components-checkbox.mjs +4 -4
  7. package/fesm2022/quang-components-checkbox.mjs.map +1 -1
  8. package/fesm2022/quang-components-date.mjs +5 -5
  9. package/fesm2022/quang-components-date.mjs.map +1 -1
  10. package/fesm2022/quang-components-input.mjs +4 -4
  11. package/fesm2022/quang-components-input.mjs.map +1 -1
  12. package/fesm2022/quang-components-paginator.mjs +14 -14
  13. package/fesm2022/quang-components-paginator.mjs.map +1 -1
  14. package/fesm2022/quang-components-select.mjs +4 -4
  15. package/fesm2022/quang-components-select.mjs.map +1 -1
  16. package/fesm2022/quang-components-shared.mjs +8 -8
  17. package/fesm2022/quang-components-shared.mjs.map +1 -1
  18. package/fesm2022/quang-components-table.mjs +4 -4
  19. package/fesm2022/quang-components-table.mjs.map +1 -1
  20. package/fesm2022/quang-components-wysiwyg.mjs +4 -4
  21. package/fesm2022/quang-components-wysiwyg.mjs.map +1 -1
  22. package/fesm2022/quang-device.mjs +3 -3
  23. package/fesm2022/quang-device.mjs.map +1 -1
  24. package/fesm2022/quang-loader.mjs +7 -7
  25. package/fesm2022/quang-loader.mjs.map +1 -1
  26. package/fesm2022/quang-overlay-modal.mjs +90 -12
  27. package/fesm2022/quang-overlay-modal.mjs.map +1 -1
  28. package/fesm2022/quang-overlay-popover.mjs +8 -8
  29. package/fesm2022/quang-overlay-popover.mjs.map +1 -1
  30. package/fesm2022/quang-overlay-shared.mjs +11 -11
  31. package/fesm2022/quang-overlay-shared.mjs.map +1 -1
  32. package/fesm2022/quang-overlay-toast.mjs +7 -7
  33. package/fesm2022/quang-overlay-toast.mjs.map +1 -1
  34. package/fesm2022/quang-overlay-tooltip.mjs +8 -8
  35. package/fesm2022/quang-overlay-tooltip.mjs.map +1 -1
  36. package/fesm2022/quang-translation.mjs +6 -6
  37. package/fesm2022/quang-translation.mjs.map +1 -1
  38. package/overlay/modal/index.d.ts +39 -5
  39. package/overlay/toast/index.d.ts +2 -3
  40. package/package.json +12 -12
@@ -4,7 +4,7 @@ import * as i2 from '@angular/cdk/portal';
4
4
  import { PortalModule, CdkPortal } from '@angular/cdk/portal';
5
5
  import { NgStyle } from '@angular/common';
6
6
  import * as i0 from '@angular/core';
7
- import { output, input, computed, inject, DestroyRef, ViewChild, ChangeDetectionStrategy, Component, EnvironmentInjector, ApplicationRef, signal, createComponent, Injectable } from '@angular/core';
7
+ import { output, input, computed, inject, DestroyRef, ViewChild, ChangeDetectionStrategy, Component, InjectionToken, EnvironmentInjector, ApplicationRef, signal, Injector, createComponent, Injectable } from '@angular/core';
8
8
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
9
  import { Subject } from 'rxjs';
10
10
 
@@ -100,16 +100,43 @@ class QuangModalComponent {
100
100
  this.overlayRef?.detach();
101
101
  this.overlayRef?.dispose();
102
102
  }
103
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangModalComponent, deps: [{ token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Component }); }
104
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.3", type: QuangModalComponent, isStandalone: true, selector: "quang-modal", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: true, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, containerClass: { classPropertyName: "containerClass", publicName: "containerClass", isSignal: true, isRequired: false, transformFunction: null }, animationMode: { classPropertyName: "animationMode", publicName: "animationMode", isSignal: true, isRequired: false, transformFunction: null }, backgroundColor: { classPropertyName: "backgroundColor", publicName: "backgroundColor", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { backdropClick: "backdropClick" }, viewQueries: [{ propertyName: "portal", first: true, predicate: CdkPortal, descendants: true }], ngImport: i0, template: "<ng-template cdkPortal>\n <div\n [ngStyle]=\"{\n '--quang-modal-panel-width': width(),\n '--quang-modal-panel-height': height(),\n '--quang-modal-panel-background': backgroundColor(),\n '--quang-modal-panel-padding': padding(),\n }\"\n class=\"dialog {{ containerClass() }} {{ animationClassEnter() }}\"\n >\n <div class=\"dialog__header\">\n <ng-content select=\"[header]\"></ng-content>\n </div>\n <div class=\"dialog__body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"dialog__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: [".dialog{background-color:var(--quang-modal-panel-background, var(--bs-body-bg, initial));position:relative;display:flex;flex-direction:column;width:var(--quang-modal-panel-width);height:var(--quang-modal-panel-height);padding:var(--quang-modal-panel-padding)}.dialog__header{display:flex;flex-direction:column;width:100%}.dialog__body{flex:1;overflow:auto}.dialog__footer{display:flex;justify-content:flex-end}::ng-deep .cdk-global-scrollblock{overflow-y:auto}@keyframes left-to-right_enter{0%{transform:translate(-100%)}to{transform:translate(0)}}.left-to-right-enter-active{animation:left-to-right_enter .5s ease-in-out forwards}@keyframes right-to-left_enter{0%{transform:translate(100%)}to{transform:translate(0)}}.right-to-left-enter-active{animation:right-to-left_enter .5s ease-in-out forwards}@keyframes top-to-bottom_enter{0%{transform:translateY(-100%)}to{transform:translateY(0)}}.top-to-bottom-enter-active{animation:top-to-bottom_enter .5s ease-in-out forwards}@keyframes bottom-to-top_enter{0%{transform:translateY(100%)}to{transform:translateY(0)}}.top-to-bottom-enter-active{animation:bottom-to-top_enter .5s ease-in-out forwards}@keyframes fade_enter{0%{opacity:0}to{opacity:1}}.fade-enter-active{animation:fade_enter .5s ease-in-out forwards}\n"], dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i2.CdkPortal, selector: "[cdkPortal]", exportAs: ["cdkPortal"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
103
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangModalComponent, deps: [{ token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Component }); }
104
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.10", type: QuangModalComponent, isStandalone: true, selector: "quang-modal", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: true, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, containerClass: { classPropertyName: "containerClass", publicName: "containerClass", isSignal: true, isRequired: false, transformFunction: null }, animationMode: { classPropertyName: "animationMode", publicName: "animationMode", isSignal: true, isRequired: false, transformFunction: null }, backgroundColor: { classPropertyName: "backgroundColor", publicName: "backgroundColor", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { backdropClick: "backdropClick" }, viewQueries: [{ propertyName: "portal", first: true, predicate: CdkPortal, descendants: true }], ngImport: i0, template: "<ng-template cdkPortal>\n <div\n [ngStyle]=\"{\n '--quang-modal-panel-width': width(),\n '--quang-modal-panel-height': height(),\n '--quang-modal-panel-background': backgroundColor(),\n '--quang-modal-panel-padding': padding(),\n }\"\n class=\"dialog {{ containerClass() }} {{ animationClassEnter() }}\"\n >\n <div class=\"dialog__header\">\n <ng-content select=\"[header]\"></ng-content>\n </div>\n <div class=\"dialog__body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"dialog__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: [".dialog{background-color:var(--quang-modal-panel-background, var(--bs-body-bg, initial));position:relative;display:flex;flex-direction:column;width:var(--quang-modal-panel-width);height:var(--quang-modal-panel-height);padding:var(--quang-modal-panel-padding)}.dialog__header{display:flex;flex-direction:column;width:100%}.dialog__body{flex:1;overflow:auto}.dialog__footer{display:flex;justify-content:flex-end}::ng-deep .cdk-global-scrollblock{overflow-y:auto}@keyframes left-to-right_enter{0%{transform:translate(-100%)}to{transform:translate(0)}}.left-to-right-enter-active{animation:left-to-right_enter .5s ease-in-out forwards}@keyframes right-to-left_enter{0%{transform:translate(100%)}to{transform:translate(0)}}.right-to-left-enter-active{animation:right-to-left_enter .5s ease-in-out forwards}@keyframes top-to-bottom_enter{0%{transform:translateY(-100%)}to{transform:translateY(0)}}.top-to-bottom-enter-active{animation:top-to-bottom_enter .5s ease-in-out forwards}@keyframes bottom-to-top_enter{0%{transform:translateY(100%)}to{transform:translateY(0)}}.top-to-bottom-enter-active{animation:bottom-to-top_enter .5s ease-in-out forwards}@keyframes fade_enter{0%{opacity:0}to{opacity:1}}.fade-enter-active{animation:fade_enter .5s ease-in-out forwards}\n"], dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i2.CdkPortal, selector: "[cdkPortal]", exportAs: ["cdkPortal"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
105
105
  }
106
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangModalComponent, decorators: [{
106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangModalComponent, decorators: [{
107
107
  type: Component,
108
108
  args: [{ selector: 'quang-modal', imports: [PortalModule, NgStyle], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template cdkPortal>\n <div\n [ngStyle]=\"{\n '--quang-modal-panel-width': width(),\n '--quang-modal-panel-height': height(),\n '--quang-modal-panel-background': backgroundColor(),\n '--quang-modal-panel-padding': padding(),\n }\"\n class=\"dialog {{ containerClass() }} {{ animationClassEnter() }}\"\n >\n <div class=\"dialog__header\">\n <ng-content select=\"[header]\"></ng-content>\n </div>\n <div class=\"dialog__body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"dialog__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: [".dialog{background-color:var(--quang-modal-panel-background, var(--bs-body-bg, initial));position:relative;display:flex;flex-direction:column;width:var(--quang-modal-panel-width);height:var(--quang-modal-panel-height);padding:var(--quang-modal-panel-padding)}.dialog__header{display:flex;flex-direction:column;width:100%}.dialog__body{flex:1;overflow:auto}.dialog__footer{display:flex;justify-content:flex-end}::ng-deep .cdk-global-scrollblock{overflow-y:auto}@keyframes left-to-right_enter{0%{transform:translate(-100%)}to{transform:translate(0)}}.left-to-right-enter-active{animation:left-to-right_enter .5s ease-in-out forwards}@keyframes right-to-left_enter{0%{transform:translate(100%)}to{transform:translate(0)}}.right-to-left-enter-active{animation:right-to-left_enter .5s ease-in-out forwards}@keyframes top-to-bottom_enter{0%{transform:translateY(-100%)}to{transform:translateY(0)}}.top-to-bottom-enter-active{animation:top-to-bottom_enter .5s ease-in-out forwards}@keyframes bottom-to-top_enter{0%{transform:translateY(100%)}to{transform:translateY(0)}}.top-to-bottom-enter-active{animation:bottom-to-top_enter .5s ease-in-out forwards}@keyframes fade_enter{0%{opacity:0}to{opacity:1}}.fade-enter-active{animation:fade_enter .5s ease-in-out forwards}\n"] }]
109
109
  }], ctorParameters: () => [{ type: i1.Overlay }], propDecorators: { portal: [{
110
110
  type: ViewChild,
111
111
  args: [CdkPortal]
112
- }] } });
112
+ }], backdropClick: [{ type: i0.Output, args: ["backdropClick"] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: true }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], containerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "containerClass", required: false }] }], animationMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "animationMode", required: false }] }], backgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundColor", required: false }] }], showBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBackdrop", required: false }] }] } });
113
+
114
+ /**
115
+ * Injection token for the modal ID
116
+ */
117
+ const MODAL_ID = new InjectionToken('MODAL_ID');
118
+ /**
119
+ * Helper class to manage modal closure from within the modal component
120
+ */
121
+ class ModalRef {
122
+ constructor() {
123
+ this.modalService = inject(QuangModalService);
124
+ this.modalId = inject(MODAL_ID);
125
+ }
126
+ /**
127
+ * Close the modal with optional data
128
+ * @param data Optional data to pass when closing the modal (e.g., which button was clicked)
129
+ */
130
+ close(data) {
131
+ this.modalService.close(this.modalId, data);
132
+ }
133
+ /**
134
+ * Get the current modal ID
135
+ */
136
+ getId() {
137
+ return this.modalId;
138
+ }
139
+ }
113
140
 
114
141
  class QuangModalService {
115
142
  constructor() {
@@ -127,8 +154,19 @@ class QuangModalService {
127
154
  }
128
155
  showModal(component, options, componentInputs) {
129
156
  const id = this.generateId();
130
- // Create the content component instance first
157
+ // Create a Subject for this modal's close event
158
+ const closeSubject = new Subject();
159
+ // Create an injector that provides the modal ID and ModalRef
160
+ const modalInjector = Injector.create({
161
+ providers: [
162
+ { provide: MODAL_ID, useValue: id },
163
+ { provide: ModalRef, useClass: ModalRef },
164
+ ],
165
+ parent: this.environmentInjector,
166
+ });
167
+ // Create the content component instance first with the modal injector
131
168
  const contentRef = createComponent(component, {
169
+ elementInjector: modalInjector,
132
170
  environmentInjector: this.environmentInjector,
133
171
  });
134
172
  // Set component inputs if provided
@@ -164,7 +202,7 @@ class QuangModalService {
164
202
  modalRef.setInput('showBackdrop', options.showBackdrop);
165
203
  // Subscribe to backdrop click to close modal
166
204
  modalRef.instance.backdropClick.subscribe(() => {
167
- this.hideModal(id);
205
+ this.close(id);
168
206
  });
169
207
  // Attach components to the application
170
208
  this.appRef.attachView(contentRef.hostView);
@@ -176,10 +214,34 @@ class QuangModalService {
176
214
  id,
177
215
  modalRef,
178
216
  contentRef,
217
+ closeSubject,
179
218
  };
180
219
  this.modalInstances.update((instances) => [...instances, modalInstance]);
181
- return id;
220
+ return { id, closeCallback: closeSubject.asObservable() };
221
+ }
222
+ /**
223
+ * Closes a modal by its ID and emits optional data.
224
+ * @param id The ID of the modal to close.
225
+ * @param data Optional data to emit on close.
226
+ */
227
+ close(id, data) {
228
+ const instances = this.modalInstances();
229
+ const instance = instances.find((inst) => inst.id === id);
230
+ if (instance) {
231
+ // Emit the data through the subject before destroying
232
+ instance.closeSubject.next(data);
233
+ instance.closeSubject.complete();
234
+ // Remove the modal
235
+ this.hideModal(id);
236
+ }
237
+ else {
238
+ console.warn('[QuangModalService] Modal not found:', id);
239
+ }
182
240
  }
241
+ /**
242
+ * Hides a modal by its ID.
243
+ * @param id The ID of the modal to hide. If not provided, hides the last opened modal.
244
+ */
183
245
  hideModal(id) {
184
246
  if (id) {
185
247
  // Find and remove modal by id
@@ -187,22 +249,38 @@ class QuangModalService {
187
249
  const index = instances.findIndex((instance) => instance.id === id);
188
250
  if (index !== -1) {
189
251
  const modalToClose = instances[index];
252
+ // Complete the subject if not already completed
253
+ if (!modalToClose.closeSubject.closed) {
254
+ modalToClose.closeSubject.next(undefined);
255
+ modalToClose.closeSubject.complete();
256
+ }
190
257
  this.destroyModalInstance(modalToClose);
191
258
  this.modalInstances.update((instances) => instances.filter((_, i) => i !== index));
192
259
  // Emit modal closed event
193
260
  this.modalClosedSubject.next(id);
194
261
  }
262
+ else {
263
+ console.warn('[QuangModalService] Modal not found in instances:', id);
264
+ }
195
265
  }
196
266
  else {
197
267
  // Remove last modal (LIFO - Last In First Out)
198
268
  const instances = this.modalInstances();
199
269
  const lastModal = instances[instances.length - 1];
200
270
  if (lastModal) {
271
+ // Complete the subject if not already completed
272
+ if (!lastModal.closeSubject.closed) {
273
+ lastModal.closeSubject.next(undefined);
274
+ lastModal.closeSubject.complete();
275
+ }
201
276
  this.destroyModalInstance(lastModal);
202
277
  this.modalInstances.update((instances) => instances.slice(0, -1));
203
278
  // Emit modal closed event
204
279
  this.modalClosedSubject.next(lastModal.id);
205
280
  }
281
+ else {
282
+ console.warn('[QuangModalService] No modals to hide');
283
+ }
206
284
  }
207
285
  }
208
286
  destroyModalInstance(instance) {
@@ -223,10 +301,10 @@ class QuangModalService {
223
301
  this.idCounter.update((count) => count + 1);
224
302
  return `modal-${this.idCounter()}-${Date.now()}`;
225
303
  }
226
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
227
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangModalService, providedIn: 'root' }); }
304
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
305
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangModalService, providedIn: 'root' }); }
228
306
  }
229
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangModalService, decorators: [{
307
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangModalService, decorators: [{
230
308
  type: Injectable,
231
309
  args: [{
232
310
  providedIn: 'root',
@@ -237,5 +315,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
237
315
  * Generated bundle index. Do not edit.
238
316
  */
239
317
 
240
- export { QuangModalComponent, QuangModalService };
318
+ export { MODAL_ID, ModalRef, QuangModalComponent, QuangModalService };
241
319
  //# sourceMappingURL=quang-overlay-modal.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"quang-overlay-modal.mjs","sources":["../../../projects/quang/overlay/modal/modal.component.ts","../../../projects/quang/overlay/modal/modal.component.html","../../../projects/quang/overlay/modal/modal.service.ts","../../../projects/quang/overlay/modal/quang-overlay-modal.ts"],"sourcesContent":["import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay'\nimport { CdkPortal, PortalModule } from '@angular/cdk/portal'\nimport { NgStyle } from '@angular/common'\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnDestroy,\n ViewChild,\n computed,\n inject,\n input,\n output,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { ModalAnimationMode } from './models/ModalAnimationMode'\n\n@Component({\n selector: 'quang-modal',\n imports: [PortalModule, NgStyle],\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Modal component that leverages Angular CDK's Overlay and Portal modules to create modals with flexible positioning and configurations.\n *\n * @usageNotes\n * The component can be shown by using its selector `quang-modal` with a boolean binded to the Angular directive `*ngIf`.\n *\n * Its structure is divided in 3 `ng-content` to set the header, body and footer.\n * Every section has its own selector and can be used to render custom content in a simple way.\n *\n * `header` section is placed on top, `footer` section is placed on bottom.\n *\n * @example\n * <quang-modal\n * (backdropClick)=\"closeModal()\"\n * *ngIf=\"showModal\"\n * position=\"right\"\n * >\n * <ng-container header>\n * <h2>Modal header</h2>\n * </ng-container>\n * <ng-container body>\n * <h3>Modal body</h3>\n * </ng-container>\n * <ng-container footer>\n * <h3>Modal footer</h3>\n * </ng-container>\n * </quang-modal>\n */\nexport class QuangModalComponent implements AfterViewInit, OnDestroy {\n @ViewChild(CdkPortal) public readonly portal?: CdkPortal\n\n backdropClick = output<void>()\n\n position = input.required<'right' | 'left' | 'center'>()\n\n height = input<string>('80vh')\n\n width = input<string>('80vw')\n\n padding = input<string>('0 1rem')\n\n containerClass = input<string>('')\n\n animationMode = input<ModalAnimationMode>()\n\n backgroundColor = input<string>()\n\n showBackdrop = input<boolean>(true)\n\n positionStrategy = computed(() => {\n switch (this.position()) {\n case 'right':\n return this.overlay.position().global().right().top()\n case 'left':\n return this.overlay.position().global().left().top()\n case 'center':\n default:\n return this.overlay.position().global().centerHorizontally().centerVertically()\n }\n })\n\n animationClassEnter = computed(() => {\n switch (this.animationMode()) {\n case 'SLIDE_FROM_LEFT_TO_RIGHT':\n return 'left-to-right-enter-active'\n case 'SLIDE_FROM_RIGHT_TO_LEFT':\n return 'right-to-left-enter-active'\n case 'SLIDE_TOP_TO_BOTTOM':\n return 'top-to-bottom-enter-active'\n case 'SLIDE_BOTTOM_TO_TOP':\n return 'top-to-bottom-enter-active'\n case 'FADE':\n return 'fade-enter-active'\n default:\n return ''\n }\n })\n\n private readonly destroyRef = inject(DestroyRef)\n\n private overlayConfig?: OverlayConfig\n\n private overlayRef?: OverlayRef\n\n constructor(private readonly overlay: Overlay) {}\n\n ngAfterViewInit(): void {\n this.overlayConfig = new OverlayConfig({\n hasBackdrop: true,\n positionStrategy: this.positionStrategy(),\n scrollStrategy: this.overlay.scrollStrategies.block(),\n backdropClass: this.showBackdrop() ? undefined : '',\n })\n this.overlayRef = this.overlay.create(this.overlayConfig)\n this.overlayRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.backdropClick.emit()\n })\n this.overlayRef?.attach(this.portal)\n }\n\n ngOnDestroy(): void {\n this.closeModal()\n }\n\n closeModal(): void {\n this.overlayRef?.detach()\n this.overlayRef?.dispose()\n }\n}\n","<ng-template cdkPortal>\n <div\n [ngStyle]=\"{\n '--quang-modal-panel-width': width(),\n '--quang-modal-panel-height': height(),\n '--quang-modal-panel-background': backgroundColor(),\n '--quang-modal-panel-padding': padding(),\n }\"\n class=\"dialog {{ containerClass() }} {{ animationClassEnter() }}\"\n >\n <div class=\"dialog__header\">\n <ng-content select=\"[header]\"></ng-content>\n </div>\n <div class=\"dialog__body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"dialog__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n</ng-template>\n","import {\n ApplicationRef,\n EnvironmentInjector,\n Injectable,\n Type,\n computed,\n createComponent,\n inject,\n signal,\n} from '@angular/core'\n\nimport { Subject } from 'rxjs'\n\nimport { QuangModalComponent } from './modal.component'\n\nimport { ModalInstance } from './models/ModalInstance'\nimport { ModalOptions } from './models/ModalOptions'\n\n@Injectable({\n providedIn: 'root',\n})\nexport class QuangModalService {\n private readonly environmentInjector = inject(EnvironmentInjector)\n private readonly appRef = inject(ApplicationRef)\n\n private modalInstances = signal<ModalInstance[]>([])\n private idCounter = signal(0)\n\n // Computed properties for easier access\n public modalCount = computed(() => this.modalInstances().length)\n public hasOpenModals = computed(() => this.modalInstances().length > 0)\n public modalIds = computed(() => this.modalInstances().map((instance) => instance.id))\n\n // Subject to emit when modals are closed\n private modalClosedSubject = new Subject<string>()\n public modalClosed$ = this.modalClosedSubject.asObservable()\n\n showModal<T = unknown>(component: Type<T>, options: ModalOptions, componentInputs?: Record<string, unknown>): string {\n const id = this.generateId()\n\n // Create the content component instance first\n const contentRef = createComponent(component, {\n environmentInjector: this.environmentInjector,\n })\n\n // Set component inputs if provided\n if (componentInputs) {\n Object.entries(componentInputs).forEach(([key, value]) => {\n contentRef.setInput(key, value)\n })\n }\n\n // Create the modal component instance with content projected in body slot\n const modalRef = createComponent(QuangModalComponent, {\n environmentInjector: this.environmentInjector,\n projectableNodes: [\n [], // header slot (empty)\n [contentRef.location.nativeElement], // body slot (content component)\n [], // footer slot (empty)\n ],\n })\n\n // Set modal inputs from options\n modalRef.setInput('position', options.position)\n if (options.height !== undefined) modalRef.setInput('height', options.height)\n if (options.width !== undefined) modalRef.setInput('width', options.width)\n if (options.padding !== undefined) modalRef.setInput('padding', options.padding)\n if (options.containerClass !== undefined) modalRef.setInput('containerClass', options.containerClass)\n if (options.animationMode !== undefined) modalRef.setInput('animationMode', options.animationMode)\n if (options.backgroundColor !== undefined) modalRef.setInput('backgroundColor', options.backgroundColor)\n if (options.showBackdrop !== undefined) modalRef.setInput('showBackdrop', options.showBackdrop)\n\n // Subscribe to backdrop click to close modal\n modalRef.instance.backdropClick.subscribe(() => {\n this.hideModal(id)\n })\n\n // Attach components to the application\n this.appRef.attachView(contentRef.hostView)\n this.appRef.attachView(modalRef.hostView)\n\n // Add modal to DOM\n document.body.appendChild(modalRef.location.nativeElement)\n\n // Store modal instance\n const modalInstance: ModalInstance = {\n id,\n modalRef,\n contentRef,\n }\n this.modalInstances.update((instances) => [...instances, modalInstance])\n\n return id\n }\n\n hideModal(id?: string): void {\n if (id) {\n // Find and remove modal by id\n const instances = this.modalInstances()\n const index = instances.findIndex((instance: ModalInstance) => instance.id === id)\n if (index !== -1) {\n const modalToClose = instances[index]\n this.destroyModalInstance(modalToClose)\n this.modalInstances.update((instances) => instances.filter((_, i) => i !== index))\n // Emit modal closed event\n this.modalClosedSubject.next(id)\n }\n } else {\n // Remove last modal (LIFO - Last In First Out)\n const instances = this.modalInstances()\n const lastModal = instances[instances.length - 1]\n if (lastModal) {\n this.destroyModalInstance(lastModal)\n this.modalInstances.update((instances) => instances.slice(0, -1))\n // Emit modal closed event\n this.modalClosedSubject.next(lastModal.id)\n }\n }\n }\n\n private destroyModalInstance(instance: ModalInstance): void {\n // Close the modal component (triggers overlay cleanup)\n instance.modalRef.instance.closeModal()\n\n // Detach from application\n this.appRef.detachView(instance.contentRef.hostView)\n this.appRef.detachView(instance.modalRef.hostView)\n\n // Remove from DOM if still attached\n if (instance.modalRef.location.nativeElement.parentNode) {\n instance.modalRef.location.nativeElement.parentNode.removeChild(instance.modalRef.location.nativeElement)\n }\n\n // Destroy component references\n instance.contentRef.destroy()\n instance.modalRef.destroy()\n }\n\n private generateId(): string {\n this.idCounter.update((count) => count + 1)\n return `modal-${this.idCounter()}-${Date.now()}`\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quang-overlay-modal.mjs","sources":["../../../projects/quang/overlay/modal/modal.component.ts","../../../projects/quang/overlay/modal/modal.component.html","../../../projects/quang/overlay/modal/modal-ref.ts","../../../projects/quang/overlay/modal/modal.service.ts","../../../projects/quang/overlay/modal/quang-overlay-modal.ts"],"sourcesContent":["import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay'\nimport { CdkPortal, PortalModule } from '@angular/cdk/portal'\nimport { NgStyle } from '@angular/common'\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnDestroy,\n ViewChild,\n computed,\n inject,\n input,\n output,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { ModalAnimationMode } from './models/ModalAnimationMode'\n\n@Component({\n selector: 'quang-modal',\n imports: [PortalModule, NgStyle],\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Modal component that leverages Angular CDK's Overlay and Portal modules to create modals with flexible positioning and configurations.\n *\n * @usageNotes\n * The component can be shown by using its selector `quang-modal` with a boolean binded to the Angular directive `*ngIf`.\n *\n * Its structure is divided in 3 `ng-content` to set the header, body and footer.\n * Every section has its own selector and can be used to render custom content in a simple way.\n *\n * `header` section is placed on top, `footer` section is placed on bottom.\n *\n * @example\n * <quang-modal\n * (backdropClick)=\"closeModal()\"\n * *ngIf=\"showModal\"\n * position=\"right\"\n * >\n * <ng-container header>\n * <h2>Modal header</h2>\n * </ng-container>\n * <ng-container body>\n * <h3>Modal body</h3>\n * </ng-container>\n * <ng-container footer>\n * <h3>Modal footer</h3>\n * </ng-container>\n * </quang-modal>\n */\nexport class QuangModalComponent implements AfterViewInit, OnDestroy {\n @ViewChild(CdkPortal) public readonly portal?: CdkPortal\n\n backdropClick = output<void>()\n\n position = input.required<'right' | 'left' | 'center'>()\n\n height = input<string>('80vh')\n\n width = input<string>('80vw')\n\n padding = input<string>('0 1rem')\n\n containerClass = input<string>('')\n\n animationMode = input<ModalAnimationMode>()\n\n backgroundColor = input<string>()\n\n showBackdrop = input<boolean>(true)\n\n positionStrategy = computed(() => {\n switch (this.position()) {\n case 'right':\n return this.overlay.position().global().right().top()\n case 'left':\n return this.overlay.position().global().left().top()\n case 'center':\n default:\n return this.overlay.position().global().centerHorizontally().centerVertically()\n }\n })\n\n animationClassEnter = computed(() => {\n switch (this.animationMode()) {\n case 'SLIDE_FROM_LEFT_TO_RIGHT':\n return 'left-to-right-enter-active'\n case 'SLIDE_FROM_RIGHT_TO_LEFT':\n return 'right-to-left-enter-active'\n case 'SLIDE_TOP_TO_BOTTOM':\n return 'top-to-bottom-enter-active'\n case 'SLIDE_BOTTOM_TO_TOP':\n return 'top-to-bottom-enter-active'\n case 'FADE':\n return 'fade-enter-active'\n default:\n return ''\n }\n })\n\n private readonly destroyRef = inject(DestroyRef)\n\n private overlayConfig?: OverlayConfig\n\n private overlayRef?: OverlayRef\n\n constructor(private readonly overlay: Overlay) {}\n\n ngAfterViewInit(): void {\n this.overlayConfig = new OverlayConfig({\n hasBackdrop: true,\n positionStrategy: this.positionStrategy(),\n scrollStrategy: this.overlay.scrollStrategies.block(),\n backdropClass: this.showBackdrop() ? undefined : '',\n })\n this.overlayRef = this.overlay.create(this.overlayConfig)\n this.overlayRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.backdropClick.emit()\n })\n this.overlayRef?.attach(this.portal)\n }\n\n ngOnDestroy(): void {\n this.closeModal()\n }\n\n closeModal(): void {\n this.overlayRef?.detach()\n this.overlayRef?.dispose()\n }\n}\n","<ng-template cdkPortal>\n <div\n [ngStyle]=\"{\n '--quang-modal-panel-width': width(),\n '--quang-modal-panel-height': height(),\n '--quang-modal-panel-background': backgroundColor(),\n '--quang-modal-panel-padding': padding(),\n }\"\n class=\"dialog {{ containerClass() }} {{ animationClassEnter() }}\"\n >\n <div class=\"dialog__header\">\n <ng-content select=\"[header]\"></ng-content>\n </div>\n <div class=\"dialog__body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"dialog__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n</ng-template>\n","import { InjectionToken, inject } from '@angular/core'\n\nimport { QuangModalService } from './modal.service'\n\n/**\n * Injection token for the modal ID\n */\nexport const MODAL_ID = new InjectionToken<string>('MODAL_ID')\n\n/**\n * Helper class to manage modal closure from within the modal component\n */\nexport class ModalRef {\n private readonly modalService = inject(QuangModalService)\n private readonly modalId = inject(MODAL_ID)\n\n /**\n * Close the modal with optional data\n * @param data Optional data to pass when closing the modal (e.g., which button was clicked)\n */\n close(data?: object): void {\n this.modalService.close(this.modalId, data)\n }\n\n /**\n * Get the current modal ID\n */\n getId(): string {\n return this.modalId\n }\n}\n","import {\n ApplicationRef,\n EnvironmentInjector,\n Injectable,\n Injector,\n Type,\n computed,\n createComponent,\n inject,\n signal,\n} from '@angular/core'\n\nimport { Observable, Subject } from 'rxjs'\n\nimport { QuangModalComponent } from './modal.component'\n\nimport { ModalOptions } from './models'\nimport { ModalInstance } from './models/ModalInstance'\n\nimport { MODAL_ID, ModalRef } from './modal-ref'\n\n@Injectable({\n providedIn: 'root',\n})\nexport class QuangModalService {\n private readonly environmentInjector = inject(EnvironmentInjector)\n private readonly appRef = inject(ApplicationRef)\n\n private modalInstances = signal<ModalInstance[]>([])\n private idCounter = signal(0)\n\n // Computed properties for easier access\n public modalCount = computed(() => this.modalInstances().length)\n public hasOpenModals = computed(() => this.modalInstances().length > 0)\n public modalIds = computed(() => this.modalInstances().map((instance) => instance.id))\n\n // Subject to emit when modals are closed\n private modalClosedSubject = new Subject<string>()\n public modalClosed$ = this.modalClosedSubject.asObservable()\n\n showModal<T = unknown>(\n component: Type<T>,\n options: ModalOptions,\n componentInputs?: Record<string, unknown>\n ): { id: string; closeCallback: Observable<object | undefined> } {\n const id = this.generateId()\n\n // Create a Subject for this modal's close event\n const closeSubject = new Subject<object | undefined>()\n\n // Create an injector that provides the modal ID and ModalRef\n const modalInjector = Injector.create({\n providers: [\n { provide: MODAL_ID, useValue: id },\n { provide: ModalRef, useClass: ModalRef },\n ],\n parent: this.environmentInjector,\n })\n\n // Create the content component instance first with the modal injector\n const contentRef = createComponent(component, {\n elementInjector: modalInjector,\n environmentInjector: this.environmentInjector,\n })\n\n // Set component inputs if provided\n if (componentInputs) {\n Object.entries(componentInputs).forEach(([key, value]) => {\n contentRef.setInput(key, value)\n })\n }\n\n // Create the modal component instance with content projected in body slot\n const modalRef = createComponent(QuangModalComponent, {\n environmentInjector: this.environmentInjector,\n projectableNodes: [\n [], // header slot (empty)\n [contentRef.location.nativeElement], // body slot (content component)\n [], // footer slot (empty)\n ],\n })\n\n // Set modal inputs from options\n modalRef.setInput('position', options.position)\n if (options.height !== undefined) modalRef.setInput('height', options.height)\n if (options.width !== undefined) modalRef.setInput('width', options.width)\n if (options.padding !== undefined) modalRef.setInput('padding', options.padding)\n if (options.containerClass !== undefined) modalRef.setInput('containerClass', options.containerClass)\n if (options.animationMode !== undefined) modalRef.setInput('animationMode', options.animationMode)\n if (options.backgroundColor !== undefined) modalRef.setInput('backgroundColor', options.backgroundColor)\n if (options.showBackdrop !== undefined) modalRef.setInput('showBackdrop', options.showBackdrop)\n\n // Subscribe to backdrop click to close modal\n modalRef.instance.backdropClick.subscribe(() => {\n this.close(id)\n })\n\n // Attach components to the application\n this.appRef.attachView(contentRef.hostView)\n this.appRef.attachView(modalRef.hostView)\n\n // Add modal to DOM\n document.body.appendChild(modalRef.location.nativeElement)\n\n // Store modal instance\n const modalInstance: ModalInstance = {\n id,\n modalRef,\n contentRef,\n closeSubject,\n }\n this.modalInstances.update((instances) => [...instances, modalInstance])\n return { id, closeCallback: closeSubject.asObservable() }\n }\n\n /**\n * Closes a modal by its ID and emits optional data.\n * @param id The ID of the modal to close.\n * @param data Optional data to emit on close.\n */\n close(id: string, data?: object): void {\n const instances = this.modalInstances()\n const instance = instances.find((inst) => inst.id === id)\n\n if (instance) {\n // Emit the data through the subject before destroying\n instance.closeSubject.next(data)\n instance.closeSubject.complete()\n\n // Remove the modal\n this.hideModal(id)\n } else {\n console.warn('[QuangModalService] Modal not found:', id)\n }\n }\n\n /**\n * Hides a modal by its ID.\n * @param id The ID of the modal to hide. If not provided, hides the last opened modal.\n */\n hideModal(id?: string): void {\n if (id) {\n // Find and remove modal by id\n const instances = this.modalInstances()\n const index = instances.findIndex((instance: ModalInstance) => instance.id === id)\n if (index !== -1) {\n const modalToClose = instances[index]\n // Complete the subject if not already completed\n if (!modalToClose.closeSubject.closed) {\n modalToClose.closeSubject.next(undefined)\n modalToClose.closeSubject.complete()\n }\n this.destroyModalInstance(modalToClose)\n this.modalInstances.update((instances) => instances.filter((_, i) => i !== index))\n // Emit modal closed event\n this.modalClosedSubject.next(id)\n } else {\n console.warn('[QuangModalService] Modal not found in instances:', id)\n }\n } else {\n // Remove last modal (LIFO - Last In First Out)\n const instances = this.modalInstances()\n const lastModal = instances[instances.length - 1]\n if (lastModal) {\n // Complete the subject if not already completed\n if (!lastModal.closeSubject.closed) {\n lastModal.closeSubject.next(undefined)\n lastModal.closeSubject.complete()\n }\n this.destroyModalInstance(lastModal)\n this.modalInstances.update((instances) => instances.slice(0, -1))\n // Emit modal closed event\n this.modalClosedSubject.next(lastModal.id)\n } else {\n console.warn('[QuangModalService] No modals to hide')\n }\n }\n }\n\n private destroyModalInstance(instance: ModalInstance): void {\n // Close the modal component (triggers overlay cleanup)\n instance.modalRef.instance.closeModal()\n\n // Detach from application\n this.appRef.detachView(instance.contentRef.hostView)\n this.appRef.detachView(instance.modalRef.hostView)\n\n // Remove from DOM if still attached\n if (instance.modalRef.location.nativeElement.parentNode) {\n instance.modalRef.location.nativeElement.parentNode.removeChild(instance.modalRef.location.nativeElement)\n }\n\n // Destroy component references\n instance.contentRef.destroy()\n instance.modalRef.destroy()\n }\n\n private generateId(): string {\n this.idCounter.update((count) => count + 1)\n return `modal-${this.idCounter()}-${Date.now()}`\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -38,13 +38,13 @@ class QuangPopoverComponent {
38
38
  }
39
39
  });
40
40
  }
41
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: QuangPopoverComponent, isStandalone: true, selector: "quang-popover", inputs: { overlayContent: { classPropertyName: "overlayContent", publicName: "overlayContent", isSignal: true, isRequired: false, transformFunction: null }, payload: { classPropertyName: "payload", publicName: "payload", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (overlayContent()) {\n <div\n [ngClass]=\"getPopoverPosition()\"\n class=\"popover-container\"\n >\n <ng-container\n [ngTemplateOutlet]=\"overlayContent()\"\n [ngTemplateOutletContext]=\"{\n $implicit: payload(),\n }\"\n ></ng-container>\n </div>\n}\n", styles: [":host{--bs-popover-border-width: 1px;--bs-popover-arrow-width: .5rem;--bs-popover-arrow-border: var(--bs-border-color, #000);--box-shadow-bg: rgba(0, 0, 0, .16)}.popover-container{box-shadow:var(--box-shadow-bg);background:var(--bs-body-bg, #fff);border:var(--bs-popover-border-width) solid var(--bs-border-color, #000);position:relative;padding:1rem;pointer-events:all}.popover-container.center-bottom:after,.popover-container.center-bottom:before{bottom:100%;left:50%;transform:translate(-50%)}.popover-container.start-bottom:after,.popover-container.start-bottom:before{bottom:100%;left:85%;transform:translate(-50%)}.popover-container.end-bottom:after,.popover-container.end-bottom:before{bottom:100%;left:15%;transform:translate(-50%)}.popover-container.center-top:after,.popover-container.center-top:before{top:100%;left:50%;transform:translate(-50%) rotate(180deg)}.popover-container.start-top:after,.popover-container.start-top:before{top:100%;left:85%;transform:translate(-50%) rotate(180deg)}.popover-container.end-top:after,.popover-container.end-top:before{top:100%;left:15%;transform:translate(-50%) rotate(180deg)}.popover-container.end-center:after,.popover-container.end-center:before{right:100%;top:50%;transform:translateY(-50%) rotate(270deg)}.popover-container.start-center:after,.popover-container.start-center:before{left:100%;top:50%;transform:translateY(-50%) rotate(90deg)}.popover-container:after,.popover-container:before{content:\"\";display:block;position:absolute;width:0;height:0;border-style:solid}.popover-container:after{border-color:transparent transparent var(--bs-body-bg, #fff) transparent;border-width:var(--bs-popover-arrow-width)}.popover-container:before{border-color:transparent transparent var(--bs-border-color, #000) transparent;border-width:calc(var(--bs-popover-arrow-width) + 1px)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.10", type: QuangPopoverComponent, isStandalone: true, selector: "quang-popover", inputs: { overlayContent: { classPropertyName: "overlayContent", publicName: "overlayContent", isSignal: true, isRequired: false, transformFunction: null }, payload: { classPropertyName: "payload", publicName: "payload", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (overlayContent()) {\n <div\n [ngClass]=\"getPopoverPosition()\"\n class=\"popover-container\"\n >\n <ng-container\n [ngTemplateOutlet]=\"overlayContent()\"\n [ngTemplateOutletContext]=\"{\n $implicit: payload(),\n }\"\n ></ng-container>\n </div>\n}\n", styles: [":host{--bs-popover-border-width: 1px;--bs-popover-arrow-width: .5rem;--bs-popover-arrow-border: var(--bs-border-color, #000);--box-shadow-bg: rgba(0, 0, 0, .16)}.popover-container{box-shadow:var(--box-shadow-bg);background:var(--bs-body-bg, #fff);border:var(--bs-popover-border-width) solid var(--bs-border-color, #000);position:relative;padding:1rem;pointer-events:all}.popover-container.center-bottom:after,.popover-container.center-bottom:before{bottom:100%;left:50%;transform:translate(-50%)}.popover-container.start-bottom:after,.popover-container.start-bottom:before{bottom:100%;left:85%;transform:translate(-50%)}.popover-container.end-bottom:after,.popover-container.end-bottom:before{bottom:100%;left:15%;transform:translate(-50%)}.popover-container.center-top:after,.popover-container.center-top:before{top:100%;left:50%;transform:translate(-50%) rotate(180deg)}.popover-container.start-top:after,.popover-container.start-top:before{top:100%;left:85%;transform:translate(-50%) rotate(180deg)}.popover-container.end-top:after,.popover-container.end-top:before{top:100%;left:15%;transform:translate(-50%) rotate(180deg)}.popover-container.end-center:after,.popover-container.end-center:before{right:100%;top:50%;transform:translateY(-50%) rotate(270deg)}.popover-container.start-center:after,.popover-container.start-center:before{left:100%;top:50%;transform:translateY(-50%) rotate(90deg)}.popover-container:after,.popover-container:before{content:\"\";display:block;position:absolute;width:0;height:0;border-style:solid}.popover-container:after{border-color:transparent transparent var(--bs-body-bg, #fff) transparent;border-width:var(--bs-popover-arrow-width)}.popover-container:before{border-color:transparent transparent var(--bs-border-color, #000) transparent;border-width:calc(var(--bs-popover-arrow-width) + 1px)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
43
43
  }
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangPopoverComponent, decorators: [{
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangPopoverComponent, decorators: [{
45
45
  type: Component,
46
46
  args: [{ selector: 'quang-popover', imports: [NgTemplateOutlet, NgClass], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (overlayContent()) {\n <div\n [ngClass]=\"getPopoverPosition()\"\n class=\"popover-container\"\n >\n <ng-container\n [ngTemplateOutlet]=\"overlayContent()\"\n [ngTemplateOutletContext]=\"{\n $implicit: payload(),\n }\"\n ></ng-container>\n </div>\n}\n", styles: [":host{--bs-popover-border-width: 1px;--bs-popover-arrow-width: .5rem;--bs-popover-arrow-border: var(--bs-border-color, #000);--box-shadow-bg: rgba(0, 0, 0, .16)}.popover-container{box-shadow:var(--box-shadow-bg);background:var(--bs-body-bg, #fff);border:var(--bs-popover-border-width) solid var(--bs-border-color, #000);position:relative;padding:1rem;pointer-events:all}.popover-container.center-bottom:after,.popover-container.center-bottom:before{bottom:100%;left:50%;transform:translate(-50%)}.popover-container.start-bottom:after,.popover-container.start-bottom:before{bottom:100%;left:85%;transform:translate(-50%)}.popover-container.end-bottom:after,.popover-container.end-bottom:before{bottom:100%;left:15%;transform:translate(-50%)}.popover-container.center-top:after,.popover-container.center-top:before{top:100%;left:50%;transform:translate(-50%) rotate(180deg)}.popover-container.start-top:after,.popover-container.start-top:before{top:100%;left:85%;transform:translate(-50%) rotate(180deg)}.popover-container.end-top:after,.popover-container.end-top:before{top:100%;left:15%;transform:translate(-50%) rotate(180deg)}.popover-container.end-center:after,.popover-container.end-center:before{right:100%;top:50%;transform:translateY(-50%) rotate(270deg)}.popover-container.start-center:after,.popover-container.start-center:before{left:100%;top:50%;transform:translateY(-50%) rotate(90deg)}.popover-container:after,.popover-container:before{content:\"\";display:block;position:absolute;width:0;height:0;border-style:solid}.popover-container:after{border-color:transparent transparent var(--bs-body-bg, #fff) transparent;border-width:var(--bs-popover-arrow-width)}.popover-container:before{border-color:transparent transparent var(--bs-border-color, #000) transparent;border-width:calc(var(--bs-popover-arrow-width) + 1px)}\n"] }]
47
- }] });
47
+ }], propDecorators: { overlayContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayContent", required: false }] }], payload: [{ type: i0.Input, args: [{ isSignal: true, alias: "payload", required: false }] }] } });
48
48
 
49
49
  class QuangPopoverDirective extends QuangBaseOverlayDirective {
50
50
  constructor() {
@@ -52,15 +52,15 @@ class QuangPopoverDirective extends QuangBaseOverlayDirective {
52
52
  this.targetComponentType = signal(QuangPopoverComponent, ...(ngDevMode ? [{ debugName: "targetComponentType" }] : []));
53
53
  this.content = input.required(...(ngDevMode ? [{ debugName: "content", alias: 'quangPopover' }] : [{ alias: 'quangPopover' }]));
54
54
  }
55
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangPopoverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
56
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.3", type: QuangPopoverDirective, isStandalone: true, selector: "[quangPopover]", inputs: { content: { classPropertyName: "content", publicName: "quangPopover", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0 }); }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangPopoverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
56
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.10", type: QuangPopoverDirective, isStandalone: true, selector: "[quangPopover]", inputs: { content: { classPropertyName: "content", publicName: "quangPopover", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0 }); }
57
57
  }
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangPopoverDirective, decorators: [{
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangPopoverDirective, decorators: [{
59
59
  type: Directive,
60
60
  args: [{
61
61
  selector: '[quangPopover]',
62
62
  }]
63
- }] });
63
+ }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "quangPopover", required: true }] }] } });
64
64
 
65
65
  /**
66
66
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"quang-overlay-popover.mjs","sources":["../../../projects/quang/overlay/popover/popover.component.ts","../../../projects/quang/overlay/popover/popover.component.html","../../../projects/quang/overlay/popover/popover.directive.ts","../../../projects/quang/overlay/popover/quang-overlay-popover.ts"],"sourcesContent":["import { ConnectionPositionPair } from '@angular/cdk/overlay'\nimport { NgClass, NgTemplateOutlet } from '@angular/common'\nimport { ChangeDetectionStrategy, Component, TemplateRef, input, signal } from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { QuangBaseOverlayComponent } from 'quang/overlay/shared'\n\n@Component({\n selector: 'quang-popover',\n imports: [NgTemplateOutlet, NgClass],\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Popover component that can render custom content, passed from the outside as a `TemplateRef`\n * @example\n * <button\n [quangPopover]=\"popoverTest\"\n [scrollCloseThreshold]=\"undefined\"\n class=\"btn popover-test-button\"\n overlayPosition=\"top\"\n showMethod=\"click\"\n >\n {{ 'buttons.popover' | transloco }}\n <span>CLICK</span>\n </button>\n <ng-template #popoverTest> <span>test works!</span> <button type=\"button\">click!</button> </ng-template>\n */\nexport class QuangPopoverComponent implements QuangBaseOverlayComponent {\n overlayContent = input<TemplateRef<any> | null>(null)\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n\n payload = input<any>()\n\n getPopoverPosition = signal<string>('')\n\n onChangePositionPair$ = toObservable(this.positionPair)\n .pipe(takeUntilDestroyed())\n .subscribe((positionPair) => {\n const originX = positionPair?.originX\n const originY = positionPair?.originY\n if (originX && originY) {\n this.getPopoverPosition.set(`${originX}-${originY}`)\n } else {\n this.getPopoverPosition.set('')\n }\n })\n}\n","@if (overlayContent()) {\n <div\n [ngClass]=\"getPopoverPosition()\"\n class=\"popover-container\"\n >\n <ng-container\n [ngTemplateOutlet]=\"overlayContent()\"\n [ngTemplateOutletContext]=\"{\n $implicit: payload(),\n }\"\n ></ng-container>\n </div>\n}\n","import { ComponentType } from '@angular/cdk/portal'\nimport { Directive, TemplateRef, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayDirective } from 'quang/overlay/shared'\n\nimport { QuangPopoverComponent } from './popover.component'\n\n@Directive({\n selector: '[quangPopover]',\n})\nexport class QuangPopoverDirective extends QuangBaseOverlayDirective<QuangPopoverComponent> {\n override targetComponentType = signal<ComponentType<QuangPopoverComponent> | undefined>(QuangPopoverComponent)\n\n override content = input.required<TemplateRef<any> | null>({ alias: 'quangPopover' })\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAcA;;;;;;;;;;;;;;AAcG;MACU,qBAAqB,CAAA;AAtBlC,IAAA,WAAA,GAAA;AAuBE,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAA0B,IAAI,0DAAC;AAErD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgC,IAAI,wDAAC;QAE1D,IAAA,CAAA,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;AAEtB,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAS,EAAE,8DAAC;AAEvC,QAAA,IAAA,CAAA,qBAAqB,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY;aACnD,IAAI,CAAC,kBAAkB,EAAE;AACzB,aAAA,SAAS,CAAC,CAAC,YAAY,KAAI;AAC1B,YAAA,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO;AACrC,YAAA,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO;AACrC,YAAA,IAAI,OAAO,IAAI,OAAO,EAAE;gBACtB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAC;YACtD;iBAAO;AACL,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;AACL,IAAA;8GApBY,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BlC,sSAaA,EAAA,MAAA,EAAA,CAAA,0yDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJY,gBAAgB,oJAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAoBxB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAtBjC,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sSAAA,EAAA,MAAA,EAAA,CAAA,0yDAAA,CAAA,EAAA;;;AEF3C,MAAO,qBAAsB,SAAQ,yBAAgD,CAAA;AAH3F,IAAA,WAAA,GAAA;;AAIW,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAmD,qBAAqB,+DAAC;AAErG,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,0CAA4B,KAAK,EAAE,cAAc,EAAA,CAAA,GAAA,CAAvB,EAAE,KAAK,EAAE,cAAc,EAAE,GAAC;AACtF,IAAA;8GAJY,qBAAqB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA;;;ACTD;;AAEG;;;;"}
1
+ {"version":3,"file":"quang-overlay-popover.mjs","sources":["../../../projects/quang/overlay/popover/popover.component.ts","../../../projects/quang/overlay/popover/popover.component.html","../../../projects/quang/overlay/popover/popover.directive.ts","../../../projects/quang/overlay/popover/quang-overlay-popover.ts"],"sourcesContent":["import { ConnectionPositionPair } from '@angular/cdk/overlay'\nimport { NgClass, NgTemplateOutlet } from '@angular/common'\nimport { ChangeDetectionStrategy, Component, TemplateRef, input, signal } from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { QuangBaseOverlayComponent } from 'quang/overlay/shared'\n\n@Component({\n selector: 'quang-popover',\n imports: [NgTemplateOutlet, NgClass],\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Popover component that can render custom content, passed from the outside as a `TemplateRef`\n * @example\n * <button\n [quangPopover]=\"popoverTest\"\n [scrollCloseThreshold]=\"undefined\"\n class=\"btn popover-test-button\"\n overlayPosition=\"top\"\n showMethod=\"click\"\n >\n {{ 'buttons.popover' | transloco }}\n <span>CLICK</span>\n </button>\n <ng-template #popoverTest> <span>test works!</span> <button type=\"button\">click!</button> </ng-template>\n */\nexport class QuangPopoverComponent implements QuangBaseOverlayComponent {\n overlayContent = input<TemplateRef<any> | null>(null)\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n\n payload = input<any>()\n\n getPopoverPosition = signal<string>('')\n\n onChangePositionPair$ = toObservable(this.positionPair)\n .pipe(takeUntilDestroyed())\n .subscribe((positionPair) => {\n const originX = positionPair?.originX\n const originY = positionPair?.originY\n if (originX && originY) {\n this.getPopoverPosition.set(`${originX}-${originY}`)\n } else {\n this.getPopoverPosition.set('')\n }\n })\n}\n","@if (overlayContent()) {\n <div\n [ngClass]=\"getPopoverPosition()\"\n class=\"popover-container\"\n >\n <ng-container\n [ngTemplateOutlet]=\"overlayContent()\"\n [ngTemplateOutletContext]=\"{\n $implicit: payload(),\n }\"\n ></ng-container>\n </div>\n}\n","import { ComponentType } from '@angular/cdk/portal'\nimport { Directive, TemplateRef, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayDirective } from 'quang/overlay/shared'\n\nimport { QuangPopoverComponent } from './popover.component'\n\n@Directive({\n selector: '[quangPopover]',\n})\nexport class QuangPopoverDirective extends QuangBaseOverlayDirective<QuangPopoverComponent> {\n override targetComponentType = signal<ComponentType<QuangPopoverComponent> | undefined>(QuangPopoverComponent)\n\n override content = input.required<TemplateRef<any> | null>({ alias: 'quangPopover' })\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -14,16 +14,16 @@ class QuangBaseOverlayComponent {
14
14
  this.payload = input(...(ngDevMode ? [undefined, { debugName: "payload" }] : []));
15
15
  this.positionPair = signal(null, ...(ngDevMode ? [{ debugName: "positionPair" }] : []));
16
16
  }
17
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangBaseOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.3", type: QuangBaseOverlayComponent, isStandalone: true, selector: "quang-base-overlay-component", inputs: { overlayContent: { classPropertyName: "overlayContent", publicName: "overlayContent", isSignal: true, isRequired: true, transformFunction: null }, payload: { classPropertyName: "payload", publicName: "payload", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: ``, isInline: true }); }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangBaseOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.10", type: QuangBaseOverlayComponent, isStandalone: true, selector: "quang-base-overlay-component", inputs: { overlayContent: { classPropertyName: "overlayContent", publicName: "overlayContent", isSignal: true, isRequired: true, transformFunction: null }, payload: { classPropertyName: "payload", publicName: "payload", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: ``, isInline: true }); }
19
19
  }
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangBaseOverlayComponent, decorators: [{
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangBaseOverlayComponent, decorators: [{
21
21
  type: Component,
22
22
  args: [{
23
23
  selector: 'quang-base-overlay-component',
24
24
  template: ``,
25
25
  }]
26
- }] });
26
+ }], propDecorators: { overlayContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayContent", required: true }] }], payload: [{ type: i0.Input, args: [{ isSignal: true, alias: "payload", required: false }] }] } });
27
27
 
28
28
  class QuangBaseOverlayDirective {
29
29
  constructor() {
@@ -198,12 +198,12 @@ class QuangBaseOverlayDirective {
198
198
  ngOnDestroy() {
199
199
  this.detachOverlay();
200
200
  }
201
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangBaseOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
202
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.3", type: QuangBaseOverlayDirective, isStandalone: true, inputs: { scrollCloseThreshold: { classPropertyName: "scrollCloseThreshold", publicName: "scrollCloseThreshold", isSignal: true, isRequired: false, transformFunction: null }, showMethod: { classPropertyName: "showMethod", publicName: "showMethod", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, quangOverlayPayload: { classPropertyName: "quangOverlayPayload", publicName: "quangOverlayPayload", isSignal: true, isRequired: false, transformFunction: null }, overlayPosition: { classPropertyName: "overlayPosition", publicName: "overlayPosition", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()", "mouseenter": "onHover()", "mouseleave": "onLeave()" } }, ngImport: i0 }); }
201
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangBaseOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
202
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.10", type: QuangBaseOverlayDirective, isStandalone: true, inputs: { scrollCloseThreshold: { classPropertyName: "scrollCloseThreshold", publicName: "scrollCloseThreshold", isSignal: true, isRequired: false, transformFunction: null }, showMethod: { classPropertyName: "showMethod", publicName: "showMethod", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, quangOverlayPayload: { classPropertyName: "quangOverlayPayload", publicName: "quangOverlayPayload", isSignal: true, isRequired: false, transformFunction: null }, overlayPosition: { classPropertyName: "overlayPosition", publicName: "overlayPosition", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()", "mouseenter": "onHover()", "mouseleave": "onLeave()" } }, ngImport: i0 }); }
203
203
  }
204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: QuangBaseOverlayDirective, decorators: [{
204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangBaseOverlayDirective, decorators: [{
205
205
  type: Directive
206
- }], propDecorators: { onClick: [{
206
+ }], propDecorators: { scrollCloseThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollCloseThreshold", required: false }] }], showMethod: [{ type: i0.Input, args: [{ isSignal: true, alias: "showMethod", required: false }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: true }] }], quangOverlayPayload: [{ type: i0.Input, args: [{ isSignal: true, alias: "quangOverlayPayload", required: false }] }], overlayPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayPosition", required: false }] }], onClick: [{
207
207
  type: HostListener,
208
208
  args: ['click']
209
209
  }], onHover: [{
@@ -340,10 +340,10 @@ class CustomViewportRuler {
340
340
  ? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }
341
341
  : { width: 0, height: 0 };
342
342
  }
343
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: CustomViewportRuler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
344
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: CustomViewportRuler, providedIn: 'root' }); }
343
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: CustomViewportRuler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
344
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: CustomViewportRuler, providedIn: 'root' }); }
345
345
  }
346
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: CustomViewportRuler, decorators: [{
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: CustomViewportRuler, decorators: [{
347
347
  type: Injectable,
348
348
  args: [{ providedIn: 'root' }]
349
349
  }], ctorParameters: () => [] });
@@ -1 +1 @@
1
- {"version":3,"file":"quang-overlay-shared.mjs","sources":["../../../projects/quang/overlay/shared/quang-base-overlay.component.ts","../../../projects/quang/overlay/shared/quang-base-overlay.directive.ts","../../../projects/quang/overlay/shared/CustomViewportRuler.ts","../../../projects/quang/overlay/shared/quang-overlay-shared.ts"],"sourcesContent":["import { ConnectionPositionPair } from '@angular/cdk/overlay'\nimport { Component, input, signal } from '@angular/core'\n\n@Component({\n selector: 'quang-base-overlay-component',\n\n template: ``,\n})\nexport abstract class QuangBaseOverlayComponent {\n overlayContent = input.required<any>()\n\n payload = input<any>()\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n}\n","import {\n ConnectedOverlayPositionChange,\n ConnectedPosition,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayPositionBuilder,\n OverlayRef,\n} from '@angular/cdk/overlay'\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal'\nimport {\n ComponentRef,\n DestroyRef,\n Directive,\n ElementRef,\n HostListener,\n OnDestroy,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QuangBaseOverlayComponent } from './quang-base-overlay.component'\n\n@Directive()\nexport abstract class QuangBaseOverlayDirective<T extends QuangBaseOverlayComponent> implements OnDestroy {\n targetComponentType = signal<ComponentType<T> | undefined>(undefined)\n\n /**\n * The amount of pixels needed for the popover to automatically disappear. If undefined the popover will not disappear on scroll\n * Default: 100\n * @default 100\n */\n scrollCloseThreshold = input<number | undefined>(100)\n\n showMethod = input<'click' | 'hover'>('click')\n\n content = input.required<any>()\n\n quangOverlayPayload = input<any>()\n\n closeOnClickOutside = true\n\n overlayPosition = input<\n 'top' | 'top-left' | 'top-right' | 'bottom' | 'bottom-left' | 'bottom-right' | 'left' | 'right'\n >('top')\n\n destroyRef = inject(DestroyRef)\n\n private top = signal<ConnectedPosition>({\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8,\n })\n\n private topLeft = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n offsetX: 40,\n })\n\n private topRight = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n offsetX: 40,\n })\n\n private bottom = signal<ConnectedPosition>({\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8,\n })\n\n private bottomLeft = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n offsetX: 40,\n })\n\n private bottomRight = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n offsetX: 40,\n })\n\n private left = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -8,\n })\n\n private right = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 8,\n })\n\n tooltipPosition = computed((): ConnectedPosition[] => {\n switch (this.overlayPosition()) {\n case 'top':\n return [this.top(), this.bottom()]\n case 'top-left':\n return [this.topLeft(), this.bottomLeft()]\n case 'top-right':\n return [this.topRight(), this.bottomRight()]\n case 'bottom':\n return [this.bottom(), this.top()]\n case 'bottom-left':\n return [this.bottomLeft(), this.topLeft()]\n case 'bottom-right':\n return [this.bottomRight(), this.topRight()]\n case 'left':\n return [this.left(), this.right()]\n case 'right':\n return [this.right(), this.left()]\n default:\n return [this.top(), this.bottom()]\n }\n })\n\n private overlayRef = signal<OverlayRef | null>(null)\n\n private readonly overlay = signal(inject(Overlay))\n\n private readonly overlayPositionBuilder = signal(inject(OverlayPositionBuilder))\n\n private readonly elementRef = signal(inject(ElementRef))\n\n private positionStrategy = signal<FlexibleConnectedPositionStrategy | undefined>(undefined)\n\n private componentOverlayRef = signal<ComponentRef<T> | null>(null)\n\n @HostListener('click') onClick(): void {\n if (this.showMethod() === 'click') this.showHideOverlay()\n }\n\n @HostListener('mouseenter') onHover(): void {\n if (this.showMethod() === 'hover') this.showHideOverlay()\n }\n\n @HostListener('mouseleave') onLeave(): void {\n if (this.showMethod() === 'hover') this.detachOverlay()\n }\n\n attachOverlay(): void {\n const targetComponentType = this.targetComponentType()\n if (!targetComponentType) {\n return\n }\n this.positionStrategy.set(\n this.overlayPositionBuilder().flexibleConnectedTo(this.elementRef()).withPositions(this.tooltipPosition())\n )\n\n this.overlayRef.set(\n this.overlay().create({\n positionStrategy: this.positionStrategy(),\n scrollStrategy: this.scrollCloseThreshold()\n ? this.overlay().scrollStrategies.close({ threshold: this.scrollCloseThreshold() })\n : this.overlay().scrollStrategies.noop(),\n hasBackdrop: this.showMethod() === 'click',\n backdropClass: '',\n })\n )\n\n const componentPortal = new ComponentPortal(targetComponentType)\n const createdOverlay = this.overlayRef()\n if (createdOverlay) {\n this.componentOverlayRef.set(createdOverlay.attach(componentPortal))\n const componentOverlayRefInstance = this.componentOverlayRef()?.instance\n if (componentOverlayRefInstance) {\n componentOverlayRefInstance.overlayContent = this.content\n componentOverlayRefInstance.payload = this.quangOverlayPayload\n }\n }\n this.positionStrategy()\n ?.positionChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((position) => {\n const positionRef: ConnectedOverlayPositionChange = position as ConnectedOverlayPositionChange\n const componentOverlayRefInstance = this.componentOverlayRef()?.instance\n if (componentOverlayRefInstance) {\n componentOverlayRefInstance.positionPair.set(positionRef.connectionPair)\n }\n })\n this.overlayRef()\n ?.backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.closeOnClickOutside) {\n this.detachOverlay()\n }\n })\n }\n\n detachOverlay(): void {\n this.overlayRef()?.detach()\n this.overlayRef()?.dispose()\n }\n\n showHideOverlay(): void {\n if (this.overlayRef()?.hasAttached()) {\n this.detachOverlay()\n } else {\n this.attachOverlay()\n }\n }\n\n ngOnDestroy(): void {\n this.detachOverlay()\n }\n}\n","import { Platform } from '@angular/cdk/platform'\nimport { DEFAULT_RESIZE_TIME, ViewportScrollPosition } from '@angular/cdk/scrolling'\nimport { DOCUMENT } from '@angular/common'\nimport { Injectable, NgZone, OnDestroy, inject } from '@angular/core'\n\nimport { Observable, Subject, auditTime } from 'rxjs'\n\n/**\n * Class cloe of [ViewportRuler](https://github.com/angular/components/blob/master/src/cdk/scrolling/viewport-ruler.ts)\n * To fix the wrong reported size of the viewport on mobile devices with hidden url bars\n * Issues references:\n * https://github.com/angular/components/issues/18890\n * https://github.com/angular/components/issues/27739\n *\n * To use this component provide it instead of `ViewportRuler`\n *\n * @example\n * providers: [\n * {\n * provide: ViewportRuler,\n * useClass: CustomViewportRuler\n * }\n * ]\n */\n@Injectable({ providedIn: 'root' })\nexport class CustomViewportRuler implements OnDestroy {\n /** Used to reference correct document/window */\n // protected _document: Document\n /** Cached viewport dimensions. */\n private _viewportSize: { width: number; height: number } | null = null\n /** Stream of viewport change events. */\n private readonly _change = new Subject<Event>()\n\n private readonly _platform = inject(Platform)\n private readonly ngZone = inject(NgZone)\n private readonly _document = inject(DOCUMENT, { optional: true }) || document\n\n constructor() {\n this.ngZone.runOutsideAngular(() => {\n if (this._platform.isBrowser) {\n const window = this._getWindow()\n\n // Note that bind the events ourselves, rather than going through something like RxJS's\n // `fromEvent` so that we can ensure that they're bound outside of the NgZone.\n window.addEventListener('resize', this._changeListener)\n window.addEventListener('orientationchange', this._changeListener)\n }\n\n // Clear the cached position so that the viewport is re-measured next time it is required.\n // We don't need to keep track of the subscription, because it is completed on destroy.\n this.change().subscribe(() => (this._viewportSize = null))\n })\n }\n\n ngOnDestroy() {\n if (this._platform.isBrowser) {\n const window = this._getWindow()\n window.removeEventListener('resize', this._changeListener)\n window.removeEventListener('orientationchange', this._changeListener)\n }\n\n this._change.complete()\n }\n\n /** Returns the viewport's width and height. */\n getViewportSize(): Readonly<{ width: number; height: number }> {\n if (!this._viewportSize) {\n this._updateViewportSize()\n }\n\n const output = { width: this._viewportSize!.width, height: this._viewportSize!.height }\n\n // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n if (!this._platform.isBrowser) {\n this._viewportSize = null!\n }\n\n return output\n }\n\n /** Gets a DOMRect for the viewport's bounds. */\n getViewportRect() {\n // Use the document element's bounding rect rather than the window scroll properties\n // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n // can disagree when the page is pinch-zoomed (on devices that support touch).\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n // We use the documentElement instead of the body because, by default (without a css reset)\n // browsers typically give the document body an 8px margin, which is not included in\n // getBoundingClientRect().\n const scrollPosition = this.getViewportScrollPosition()\n const { width, height } = this.getViewportSize()\n\n return {\n top: scrollPosition.top,\n left: scrollPosition.left,\n bottom: scrollPosition.top + height,\n right: scrollPosition.left + width,\n height,\n width,\n }\n }\n\n /** Gets the (top, left) scroll position of the viewport. */\n getViewportScrollPosition(): ViewportScrollPosition {\n // While we can get a reference to the fake document\n // during SSR, it doesn't have getBoundingClientRect.\n if (!this._platform.isBrowser) {\n return { top: 0, left: 0 }\n }\n\n // The top-left-corner of the viewport is determined by the scroll position of the document\n // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n // `document.documentElement` works consistently, where the `top` and `left` values will\n // equal negative the scroll position.\n const document = this._document\n const window = this._getWindow()\n const documentElement = document.documentElement!\n const documentRect = documentElement.getBoundingClientRect()\n\n const top = -documentRect.top || document.body.scrollTop || window.scrollY || documentElement.scrollTop || 0\n\n const left = -documentRect.left || document.body.scrollLeft || window.scrollX || documentElement.scrollLeft || 0\n\n return { top, left }\n }\n\n /**\n * Returns a stream that emits whenever the size of the viewport changes.\n * This stream emits outside of the Angular zone.\n * @param throttleTime Time in milliseconds to throttle the stream.\n */\n change(throttleTime: number = DEFAULT_RESIZE_TIME): Observable<Event> {\n return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change\n }\n\n /** Event listener that will be used to handle the viewport change events. */\n private _changeListener = (event: Event) => {\n this._change.next(event)\n }\n\n /** Use defaultView of injected document if available or fallback to global window reference */\n private _getWindow(): Window {\n return this._document.defaultView || window\n }\n\n /** Updates the cached viewport size. */\n private _updateViewportSize() {\n this._viewportSize = this._platform.isBrowser\n ? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }\n : { width: 0, height: 0 }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quang-overlay-shared.mjs","sources":["../../../projects/quang/overlay/shared/quang-base-overlay.component.ts","../../../projects/quang/overlay/shared/quang-base-overlay.directive.ts","../../../projects/quang/overlay/shared/CustomViewportRuler.ts","../../../projects/quang/overlay/shared/quang-overlay-shared.ts"],"sourcesContent":["import { ConnectionPositionPair } from '@angular/cdk/overlay'\nimport { Component, input, signal } from '@angular/core'\n\n@Component({\n selector: 'quang-base-overlay-component',\n\n template: ``,\n})\nexport abstract class QuangBaseOverlayComponent {\n overlayContent = input.required<any>()\n\n payload = input<any>()\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n}\n","import {\n ConnectedOverlayPositionChange,\n ConnectedPosition,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayPositionBuilder,\n OverlayRef,\n} from '@angular/cdk/overlay'\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal'\nimport {\n ComponentRef,\n DestroyRef,\n Directive,\n ElementRef,\n HostListener,\n OnDestroy,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QuangBaseOverlayComponent } from './quang-base-overlay.component'\n\n@Directive()\nexport abstract class QuangBaseOverlayDirective<T extends QuangBaseOverlayComponent> implements OnDestroy {\n targetComponentType = signal<ComponentType<T> | undefined>(undefined)\n\n /**\n * The amount of pixels needed for the popover to automatically disappear. If undefined the popover will not disappear on scroll\n * Default: 100\n * @default 100\n */\n scrollCloseThreshold = input<number | undefined>(100)\n\n showMethod = input<'click' | 'hover'>('click')\n\n content = input.required<any>()\n\n quangOverlayPayload = input<any>()\n\n closeOnClickOutside = true\n\n overlayPosition = input<\n 'top' | 'top-left' | 'top-right' | 'bottom' | 'bottom-left' | 'bottom-right' | 'left' | 'right'\n >('top')\n\n destroyRef = inject(DestroyRef)\n\n private top = signal<ConnectedPosition>({\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8,\n })\n\n private topLeft = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n offsetX: 40,\n })\n\n private topRight = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n offsetX: 40,\n })\n\n private bottom = signal<ConnectedPosition>({\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8,\n })\n\n private bottomLeft = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n offsetX: 40,\n })\n\n private bottomRight = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n offsetX: 40,\n })\n\n private left = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -8,\n })\n\n private right = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 8,\n })\n\n tooltipPosition = computed((): ConnectedPosition[] => {\n switch (this.overlayPosition()) {\n case 'top':\n return [this.top(), this.bottom()]\n case 'top-left':\n return [this.topLeft(), this.bottomLeft()]\n case 'top-right':\n return [this.topRight(), this.bottomRight()]\n case 'bottom':\n return [this.bottom(), this.top()]\n case 'bottom-left':\n return [this.bottomLeft(), this.topLeft()]\n case 'bottom-right':\n return [this.bottomRight(), this.topRight()]\n case 'left':\n return [this.left(), this.right()]\n case 'right':\n return [this.right(), this.left()]\n default:\n return [this.top(), this.bottom()]\n }\n })\n\n private overlayRef = signal<OverlayRef | null>(null)\n\n private readonly overlay = signal(inject(Overlay))\n\n private readonly overlayPositionBuilder = signal(inject(OverlayPositionBuilder))\n\n private readonly elementRef = signal(inject(ElementRef))\n\n private positionStrategy = signal<FlexibleConnectedPositionStrategy | undefined>(undefined)\n\n private componentOverlayRef = signal<ComponentRef<T> | null>(null)\n\n @HostListener('click') onClick(): void {\n if (this.showMethod() === 'click') this.showHideOverlay()\n }\n\n @HostListener('mouseenter') onHover(): void {\n if (this.showMethod() === 'hover') this.showHideOverlay()\n }\n\n @HostListener('mouseleave') onLeave(): void {\n if (this.showMethod() === 'hover') this.detachOverlay()\n }\n\n attachOverlay(): void {\n const targetComponentType = this.targetComponentType()\n if (!targetComponentType) {\n return\n }\n this.positionStrategy.set(\n this.overlayPositionBuilder().flexibleConnectedTo(this.elementRef()).withPositions(this.tooltipPosition())\n )\n\n this.overlayRef.set(\n this.overlay().create({\n positionStrategy: this.positionStrategy(),\n scrollStrategy: this.scrollCloseThreshold()\n ? this.overlay().scrollStrategies.close({ threshold: this.scrollCloseThreshold() })\n : this.overlay().scrollStrategies.noop(),\n hasBackdrop: this.showMethod() === 'click',\n backdropClass: '',\n })\n )\n\n const componentPortal = new ComponentPortal(targetComponentType)\n const createdOverlay = this.overlayRef()\n if (createdOverlay) {\n this.componentOverlayRef.set(createdOverlay.attach(componentPortal))\n const componentOverlayRefInstance = this.componentOverlayRef()?.instance\n if (componentOverlayRefInstance) {\n componentOverlayRefInstance.overlayContent = this.content\n componentOverlayRefInstance.payload = this.quangOverlayPayload\n }\n }\n this.positionStrategy()\n ?.positionChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((position) => {\n const positionRef: ConnectedOverlayPositionChange = position as ConnectedOverlayPositionChange\n const componentOverlayRefInstance = this.componentOverlayRef()?.instance\n if (componentOverlayRefInstance) {\n componentOverlayRefInstance.positionPair.set(positionRef.connectionPair)\n }\n })\n this.overlayRef()\n ?.backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.closeOnClickOutside) {\n this.detachOverlay()\n }\n })\n }\n\n detachOverlay(): void {\n this.overlayRef()?.detach()\n this.overlayRef()?.dispose()\n }\n\n showHideOverlay(): void {\n if (this.overlayRef()?.hasAttached()) {\n this.detachOverlay()\n } else {\n this.attachOverlay()\n }\n }\n\n ngOnDestroy(): void {\n this.detachOverlay()\n }\n}\n","import { Platform } from '@angular/cdk/platform'\nimport { DEFAULT_RESIZE_TIME, ViewportScrollPosition } from '@angular/cdk/scrolling'\nimport { DOCUMENT } from '@angular/common'\nimport { Injectable, NgZone, OnDestroy, inject } from '@angular/core'\n\nimport { Observable, Subject, auditTime } from 'rxjs'\n\n/**\n * Class cloe of [ViewportRuler](https://github.com/angular/components/blob/master/src/cdk/scrolling/viewport-ruler.ts)\n * To fix the wrong reported size of the viewport on mobile devices with hidden url bars\n * Issues references:\n * https://github.com/angular/components/issues/18890\n * https://github.com/angular/components/issues/27739\n *\n * To use this component provide it instead of `ViewportRuler`\n *\n * @example\n * providers: [\n * {\n * provide: ViewportRuler,\n * useClass: CustomViewportRuler\n * }\n * ]\n */\n@Injectable({ providedIn: 'root' })\nexport class CustomViewportRuler implements OnDestroy {\n /** Used to reference correct document/window */\n // protected _document: Document\n /** Cached viewport dimensions. */\n private _viewportSize: { width: number; height: number } | null = null\n /** Stream of viewport change events. */\n private readonly _change = new Subject<Event>()\n\n private readonly _platform = inject(Platform)\n private readonly ngZone = inject(NgZone)\n private readonly _document = inject(DOCUMENT, { optional: true }) || document\n\n constructor() {\n this.ngZone.runOutsideAngular(() => {\n if (this._platform.isBrowser) {\n const window = this._getWindow()\n\n // Note that bind the events ourselves, rather than going through something like RxJS's\n // `fromEvent` so that we can ensure that they're bound outside of the NgZone.\n window.addEventListener('resize', this._changeListener)\n window.addEventListener('orientationchange', this._changeListener)\n }\n\n // Clear the cached position so that the viewport is re-measured next time it is required.\n // We don't need to keep track of the subscription, because it is completed on destroy.\n this.change().subscribe(() => (this._viewportSize = null))\n })\n }\n\n ngOnDestroy() {\n if (this._platform.isBrowser) {\n const window = this._getWindow()\n window.removeEventListener('resize', this._changeListener)\n window.removeEventListener('orientationchange', this._changeListener)\n }\n\n this._change.complete()\n }\n\n /** Returns the viewport's width and height. */\n getViewportSize(): Readonly<{ width: number; height: number }> {\n if (!this._viewportSize) {\n this._updateViewportSize()\n }\n\n const output = { width: this._viewportSize!.width, height: this._viewportSize!.height }\n\n // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n if (!this._platform.isBrowser) {\n this._viewportSize = null!\n }\n\n return output\n }\n\n /** Gets a DOMRect for the viewport's bounds. */\n getViewportRect() {\n // Use the document element's bounding rect rather than the window scroll properties\n // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n // can disagree when the page is pinch-zoomed (on devices that support touch).\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n // We use the documentElement instead of the body because, by default (without a css reset)\n // browsers typically give the document body an 8px margin, which is not included in\n // getBoundingClientRect().\n const scrollPosition = this.getViewportScrollPosition()\n const { width, height } = this.getViewportSize()\n\n return {\n top: scrollPosition.top,\n left: scrollPosition.left,\n bottom: scrollPosition.top + height,\n right: scrollPosition.left + width,\n height,\n width,\n }\n }\n\n /** Gets the (top, left) scroll position of the viewport. */\n getViewportScrollPosition(): ViewportScrollPosition {\n // While we can get a reference to the fake document\n // during SSR, it doesn't have getBoundingClientRect.\n if (!this._platform.isBrowser) {\n return { top: 0, left: 0 }\n }\n\n // The top-left-corner of the viewport is determined by the scroll position of the document\n // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n // `document.documentElement` works consistently, where the `top` and `left` values will\n // equal negative the scroll position.\n const document = this._document\n const window = this._getWindow()\n const documentElement = document.documentElement!\n const documentRect = documentElement.getBoundingClientRect()\n\n const top = -documentRect.top || document.body.scrollTop || window.scrollY || documentElement.scrollTop || 0\n\n const left = -documentRect.left || document.body.scrollLeft || window.scrollX || documentElement.scrollLeft || 0\n\n return { top, left }\n }\n\n /**\n * Returns a stream that emits whenever the size of the viewport changes.\n * This stream emits outside of the Angular zone.\n * @param throttleTime Time in milliseconds to throttle the stream.\n */\n change(throttleTime: number = DEFAULT_RESIZE_TIME): Observable<Event> {\n return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change\n }\n\n /** Event listener that will be used to handle the viewport change events. */\n private _changeListener = (event: Event) => {\n this._change.next(event)\n }\n\n /** Use defaultView of injected document if available or fallback to global window reference */\n private _getWindow(): Window {\n return this._document.defaultView || window\n }\n\n /** Updates the cached viewport size. */\n private _updateViewportSize() {\n this._viewportSize = this._platform.isBrowser\n ? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }\n : { width: 0, height: 0 }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}