ng-primitives 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dialog/dialog/dialog-ref.d.ts +6 -1
- package/dialog/dialog/dialog.d.ts +2 -1
- package/dialog/dialog-overlay/dialog-overlay.d.ts +2 -1
- package/fesm2022/ng-primitives-dialog.mjs +27 -6
- package/fesm2022/ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/ng-primitives-internal.mjs +100 -10
- package/fesm2022/ng-primitives-internal.mjs.map +1 -1
- package/fesm2022/ng-primitives-listbox.mjs +1 -1
- package/fesm2022/ng-primitives-listbox.mjs.map +1 -1
- package/fesm2022/ng-primitives-menu.mjs +223 -50
- package/fesm2022/ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-popover.mjs +137 -53
- package/fesm2022/ng-primitives-popover.mjs.map +1 -1
- package/fesm2022/ng-primitives-roving-focus.mjs +11 -4
- package/fesm2022/ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/ng-primitives-state.mjs.map +1 -1
- package/internal/exit-animation/exit-animation.d.ts +37 -0
- package/internal/index.d.ts +1 -0
- package/menu/index.d.ts +2 -0
- package/menu/menu/menu-token.d.ts +18 -0
- package/menu/menu/menu.d.ts +20 -2
- package/menu/menu-item/menu-item.d.ts +18 -13
- package/menu/menu-trigger/menu-trigger.d.ts +9 -14
- package/menu/submenu-trigger/submenu-trigger.d.ts +40 -0
- package/package.json +13 -13
- package/popover/index.d.ts +4 -2
- package/popover/popover/popover.d.ts +18 -5
- package/popover/popover-trigger/popover-trigger-state.d.ts +17 -0
- package/popover/popover-trigger/popover-trigger-token.d.ts +2 -5
- package/popover/popover-trigger/popover-trigger.d.ts +27 -8
- package/roving-focus/index.d.ts +2 -2
- package/roving-focus/roving-focus-group/roving-focus-group-token.d.ts +8 -1
- package/schematics/ng-generate/schema.d.ts +3 -1
- package/schematics/ng-generate/schema.json +2 -0
- package/schematics/ng-generate/templates/separator/separator.__fileSuffix@dasherize__.ts.template +17 -0
- package/schematics/ng-generate/templates/textarea/textarea.__fileSuffix@dasherize__.ts.template +34 -0
- package/state/index.d.ts +41 -1
- package/state/state.d.ts +0 -41
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { FocusOrigin } from '@angular/cdk/a11y';
|
|
9
9
|
import { OverlayRef } from '@angular/cdk/overlay';
|
|
10
|
+
import { Injector } from '@angular/core';
|
|
10
11
|
import { Observable, Subject } from 'rxjs';
|
|
11
12
|
import { NgpDialogConfig } from '../config/dialog-config';
|
|
12
13
|
/**
|
|
@@ -29,13 +30,17 @@ export declare class NgpDialogRef<T = unknown> {
|
|
|
29
30
|
readonly id: string;
|
|
30
31
|
/** Subscription to external detachments of the dialog. */
|
|
31
32
|
private detachSubscription;
|
|
33
|
+
/** @internal Store the injector */
|
|
34
|
+
injector: Injector | undefined;
|
|
35
|
+
/** Whether the dialog is closing. */
|
|
36
|
+
private closing;
|
|
32
37
|
constructor(overlayRef: OverlayRef, config: NgpDialogConfig<T>);
|
|
33
38
|
/**
|
|
34
39
|
* Close the dialog.
|
|
35
40
|
* @param result Optional result to return to the dialog opener.
|
|
36
41
|
* @param options Additional options to customize the closing behavior.
|
|
37
42
|
*/
|
|
38
|
-
close(focusOrigin?: FocusOrigin): void
|
|
43
|
+
close(focusOrigin?: FocusOrigin): Promise<void>;
|
|
39
44
|
/** Updates the position of the dialog based on the current position strategy. */
|
|
40
45
|
updatePosition(): this;
|
|
41
46
|
}
|
|
@@ -9,6 +9,7 @@ import { BooleanInput } from '@angular/cdk/coercion';
|
|
|
9
9
|
import { OnDestroy } from '@angular/core';
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
11
|
import * as i1 from "ng-primitives/focus-trap";
|
|
12
|
+
import * as i2 from "ng-primitives/internal";
|
|
12
13
|
export declare class NgpDialog<T = unknown> implements OnDestroy {
|
|
13
14
|
private readonly config;
|
|
14
15
|
/** Access the dialog ref */
|
|
@@ -37,5 +38,5 @@ export declare class NgpDialog<T = unknown> implements OnDestroy {
|
|
|
37
38
|
/** @internal remove a describedby id */
|
|
38
39
|
removeDescribedBy(id: string): void;
|
|
39
40
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgpDialog<any>, never>;
|
|
40
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgpDialog<any>, "[ngpDialog]", ["ngpDialog"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "role": { "alias": "ngpDialogRole"; "required": false; "isSignal": true; }; "modal": { "alias": "ngpDialogModal"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.NgpFocusTrap; inputs: {}; outputs: {}; }]>;
|
|
41
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgpDialog<any>, "[ngpDialog]", ["ngpDialog"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "role": { "alias": "ngpDialogRole"; "required": false; "isSignal": true; }; "modal": { "alias": "ngpDialogModal"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.NgpFocusTrap; inputs: {}; outputs: {}; }, { directive: typeof i2.NgpExitAnimation; inputs: {}; outputs: {}; }]>;
|
|
41
42
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "ng-primitives/internal";
|
|
2
3
|
export declare class NgpDialogOverlay {
|
|
3
4
|
/** Access the dialog ref. */
|
|
4
5
|
private readonly dialogRef;
|
|
5
6
|
protected close(): void;
|
|
6
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgpDialogOverlay, never>;
|
|
7
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgpDialogOverlay, "[ngpDialogOverlay]", ["ngpDialogOverlay"], {}, {}, never, never, true,
|
|
8
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgpDialogOverlay, "[ngpDialogOverlay]", ["ngpDialogOverlay"], {}, {}, never, never, true, [{ directive: typeof i1.NgpExitAnimation; inputs: {}; outputs: {}; }]>;
|
|
8
9
|
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, input, Directive, HostListener, isDevMode, TemplateRef, Injector, Injectable, ApplicationRef, ElementRef, ViewContainerRef, booleanAttribute, signal } from '@angular/core';
|
|
3
3
|
import { uniqueId, onChange } from 'ng-primitives/utils';
|
|
4
|
+
import * as i1 from 'ng-primitives/internal';
|
|
5
|
+
import { NgpExitAnimationManager, NgpExitAnimation } from 'ng-primitives/internal';
|
|
4
6
|
import { hasModifierKey } from '@angular/cdk/keycodes';
|
|
5
7
|
import { Subject, defer } from 'rxjs';
|
|
6
8
|
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
7
9
|
import { Overlay, OverlayContainer, OverlayConfig } from '@angular/cdk/overlay';
|
|
8
10
|
import { TemplatePortal, ComponentPortal } from '@angular/cdk/portal';
|
|
9
11
|
import { startWith } from 'rxjs/operators';
|
|
10
|
-
import * as i1 from 'ng-primitives/focus-trap';
|
|
12
|
+
import * as i1$1 from 'ng-primitives/focus-trap';
|
|
11
13
|
import { NgpFocusTrap } from 'ng-primitives/focus-trap';
|
|
12
14
|
|
|
13
15
|
const defaultDialogConfig = {
|
|
@@ -116,6 +118,8 @@ class NgpDialogRef {
|
|
|
116
118
|
this.config = config;
|
|
117
119
|
/** Emits when the dialog has been closed. */
|
|
118
120
|
this.closed = new Subject();
|
|
121
|
+
/** Whether the dialog is closing. */
|
|
122
|
+
this.closing = false;
|
|
119
123
|
this.data = config.data;
|
|
120
124
|
this.keydownEvents = overlayRef.keydownEvents();
|
|
121
125
|
this.outsidePointerEvents = overlayRef.outsidePointerEvents();
|
|
@@ -133,7 +137,18 @@ class NgpDialogRef {
|
|
|
133
137
|
* @param result Optional result to return to the dialog opener.
|
|
134
138
|
* @param options Additional options to customize the closing behavior.
|
|
135
139
|
*/
|
|
136
|
-
close(focusOrigin) {
|
|
140
|
+
async close(focusOrigin) {
|
|
141
|
+
// If the dialog is already closed, do nothing.
|
|
142
|
+
if (this.closing) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.closing = true;
|
|
146
|
+
const exitAnimationManager = this.injector?.get(NgpExitAnimationManager, undefined, {
|
|
147
|
+
optional: true,
|
|
148
|
+
});
|
|
149
|
+
if (exitAnimationManager) {
|
|
150
|
+
await exitAnimationManager.exit();
|
|
151
|
+
}
|
|
137
152
|
this.overlayRef.dispose();
|
|
138
153
|
this.detachSubscription.unsubscribe();
|
|
139
154
|
this.closed.next(focusOrigin ?? null);
|
|
@@ -180,7 +195,7 @@ class NgpDialogOverlay {
|
|
|
180
195
|
this.dialogRef.close();
|
|
181
196
|
}
|
|
182
197
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpDialogOverlay, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
183
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.7", type: NgpDialogOverlay, isStandalone: true, selector: "[ngpDialogOverlay]", host: { listeners: { "click": "close()" } }, providers: [{ provide: NgpDialogOverlayToken, useExisting: NgpDialogOverlay }], exportAs: ["ngpDialogOverlay"], ngImport: i0 }); }
|
|
198
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.7", type: NgpDialogOverlay, isStandalone: true, selector: "[ngpDialogOverlay]", host: { listeners: { "click": "close()" } }, providers: [{ provide: NgpDialogOverlayToken, useExisting: NgpDialogOverlay }], exportAs: ["ngpDialogOverlay"], hostDirectives: [{ directive: i1.NgpExitAnimation }], ngImport: i0 }); }
|
|
184
199
|
}
|
|
185
200
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpDialogOverlay, decorators: [{
|
|
186
201
|
type: Directive,
|
|
@@ -188,6 +203,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImpor
|
|
|
188
203
|
selector: '[ngpDialogOverlay]',
|
|
189
204
|
exportAs: 'ngpDialogOverlay',
|
|
190
205
|
providers: [{ provide: NgpDialogOverlayToken, useExisting: NgpDialogOverlay }],
|
|
206
|
+
hostDirectives: [NgpExitAnimation],
|
|
191
207
|
}]
|
|
192
208
|
}], propDecorators: { close: [{
|
|
193
209
|
type: HostListener,
|
|
@@ -308,6 +324,8 @@ class NgpDialogManager {
|
|
|
308
324
|
const overlayRef = this.overlay.create(overlayConfig);
|
|
309
325
|
const dialogRef = new NgpDialogRef(overlayRef, config);
|
|
310
326
|
const injector = this.createInjector(config, dialogRef, undefined);
|
|
327
|
+
// store the injector in the dialog ref - this is so we can access the exit animation manager
|
|
328
|
+
dialogRef.injector = injector;
|
|
311
329
|
const context = {
|
|
312
330
|
$implicit: dialogRef,
|
|
313
331
|
close: dialogRef.close.bind(dialogRef),
|
|
@@ -374,7 +392,10 @@ class NgpDialogManager {
|
|
|
374
392
|
*/
|
|
375
393
|
createInjector(config, dialogRef, fallbackInjector) {
|
|
376
394
|
const userInjector = config.injector || config.viewContainerRef?.injector;
|
|
377
|
-
const providers = [
|
|
395
|
+
const providers = [
|
|
396
|
+
{ provide: NgpDialogRef, useValue: dialogRef },
|
|
397
|
+
{ provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager },
|
|
398
|
+
];
|
|
378
399
|
return Injector.create({ parent: userInjector || fallbackInjector, providers });
|
|
379
400
|
}
|
|
380
401
|
/**
|
|
@@ -568,7 +589,7 @@ class NgpDialog {
|
|
|
568
589
|
this.describedBy.update(ids => ids.filter(i => i !== id));
|
|
569
590
|
}
|
|
570
591
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpDialog, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
571
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.0.7", type: NgpDialog, isStandalone: true, selector: "[ngpDialog]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "ngpDialogRole", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "ngpDialogModal", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "onClick($event)" }, properties: { "id": "id()", "attr.role": "role()", "attr.aria-modal": "modal()", "attr.aria-labelledby": "labelledBy().join(\" \")", "attr.aria-describedby": "describedBy().join(\" \")" } }, providers: [{ provide: NgpDialogToken, useExisting: NgpDialog }], exportAs: ["ngpDialog"], hostDirectives: [{ directive: i1.NgpFocusTrap }], ngImport: i0 }); }
|
|
592
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.0.7", type: NgpDialog, isStandalone: true, selector: "[ngpDialog]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "ngpDialogRole", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "ngpDialogModal", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "onClick($event)" }, properties: { "id": "id()", "attr.role": "role()", "attr.aria-modal": "modal()", "attr.aria-labelledby": "labelledBy().join(\" \")", "attr.aria-describedby": "describedBy().join(\" \")" } }, providers: [{ provide: NgpDialogToken, useExisting: NgpDialog }], exportAs: ["ngpDialog"], hostDirectives: [{ directive: i1$1.NgpFocusTrap }, { directive: i1.NgpExitAnimation }], ngImport: i0 }); }
|
|
572
593
|
}
|
|
573
594
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpDialog, decorators: [{
|
|
574
595
|
type: Directive,
|
|
@@ -576,7 +597,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImpor
|
|
|
576
597
|
selector: '[ngpDialog]',
|
|
577
598
|
exportAs: 'ngpDialog',
|
|
578
599
|
providers: [{ provide: NgpDialogToken, useExisting: NgpDialog }],
|
|
579
|
-
hostDirectives: [NgpFocusTrap],
|
|
600
|
+
hostDirectives: [NgpFocusTrap, NgpExitAnimation],
|
|
580
601
|
host: {
|
|
581
602
|
tabindex: '-1',
|
|
582
603
|
'[id]': 'id()',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-dialog.mjs","sources":["../../../../packages/ng-primitives/dialog/src/config/dialog-config.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-description/dialog-description-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-description/dialog-description.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-ref.ts","../../../../packages/ng-primitives/dialog/src/dialog-overlay/dialog-overlay-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-overlay/dialog-overlay.ts","../../../../packages/ng-primitives/dialog/src/dialog-title/dialog-title-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-title/dialog-title.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.service.ts","../../../../packages/ng-primitives/dialog/src/dialog-trigger/dialog-trigger-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-trigger/dialog-trigger.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.ts","../../../../packages/ng-primitives/dialog/src/index.ts","../../../../packages/ng-primitives/dialog/src/ng-primitives-dialog.ts"],"sourcesContent":["/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ScrollStrategy } from '@angular/cdk/overlay';\nimport { InjectionToken, Injector, Provider, ViewContainerRef, inject } from '@angular/core';\n\n/** Valid ARIA roles for a dialog. */\nexport type NgpDialogRole = 'dialog' | 'alertdialog';\n\nexport interface NgpDialogConfig<T = any> {\n /** The view container to attach the dialog to. */\n viewContainerRef?: ViewContainerRef;\n\n /** The injector to use for the dialog. Defaults to the view container's injector.*/\n injector?: Injector;\n\n /** ID for the dialog. If omitted, a unique one will be generated. */\n id?: string;\n\n /** The role of the dialog. */\n role?: NgpDialogRole;\n\n /** Whether this is a modal dialog. Used to set the `aria-modal` attribute. */\n modal?: boolean;\n\n /** Scroll strategy to be used for the dialog. This determines how the dialog responds to scrolling underneath the panel element. */\n scrollStrategy?: ScrollStrategy;\n\n /**\n * Whether the dialog should close when the user navigates backwards or forwards through browser\n * history.\n */\n closeOnNavigation?: boolean;\n\n data?: T;\n}\n\nexport const defaultDialogConfig: NgpDialogConfig = {\n role: 'dialog',\n modal: true,\n closeOnNavigation: true,\n};\n\nexport const NgpDialogConfigToken = new InjectionToken<NgpDialogConfig>('NgpDialogConfigToken');\n\n/**\n * Provide the default Dialog configuration\n * @param config The Dialog configuration\n * @returns The provider\n */\nexport function provideDialogConfig(config: Partial<NgpDialogConfig>): Provider[] {\n return [\n {\n provide: NgpDialogConfigToken,\n useValue: { ...defaultDialogConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Dialog configuration\n * @returns The global Dialog configuration\n */\nexport function injectDialogConfig(): NgpDialogConfig {\n return inject(NgpDialogConfigToken, { optional: true }) ?? defaultDialogConfig;\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialog } from './dialog';\n\nexport const NgpDialogToken = new InjectionToken<NgpDialog>('NgpDialogToken');\n\n/**\n * Inject the Dialog directive instance\n */\nexport function injectDialog(): NgpDialog {\n return inject(NgpDialogToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogDescription } from './dialog-description';\n\nexport const NgpDialogDescriptionToken = new InjectionToken<NgpDialogDescription>(\n 'NgpDialogDescriptionToken',\n);\n\n/**\n * Inject the DialogDescription directive instance\n */\nexport function injectDialogDescription(): NgpDialogDescription {\n return inject(NgpDialogDescriptionToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialog } from '../dialog/dialog-token';\nimport { NgpDialogDescriptionToken } from './dialog-description-token';\n\n@Directive({\n selector: '[ngpDialogDescription]',\n exportAs: 'ngpDialogDescription',\n providers: [{ provide: NgpDialogDescriptionToken, useExisting: NgpDialogDescription }],\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogDescription implements OnDestroy {\n /** Access the dialog */\n private readonly dialog = injectDialog();\n\n /** The id of the descriptions. */\n readonly id = input<string>(uniqueId('ngp-dialog-description'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog.removeDescribedBy(prevId);\n }\n\n if (id) {\n this.dialog.setDescribedBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog.removeDescribedBy(this.id());\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusOrigin } from '@angular/cdk/a11y';\nimport { hasModifierKey } from '@angular/cdk/keycodes';\nimport { OverlayRef } from '@angular/cdk/overlay';\nimport { inject } from '@angular/core';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { NgpDialogConfig } from '../config/dialog-config';\n\n/**\n * Reference to a dialog opened via the Dialog service.\n */\nexport class NgpDialogRef<T = unknown> {\n /** Whether the user is allowed to close the dialog. */\n disableClose: boolean | undefined;\n\n /** Emits when the dialog has been closed. */\n readonly closed = new Subject<FocusOrigin | null>();\n\n /** Emits when on keyboard events within the dialog. */\n readonly keydownEvents: Observable<KeyboardEvent>;\n\n /** Emits on pointer events that happen outside of the dialog. */\n readonly outsidePointerEvents: Observable<MouseEvent>;\n\n /** Data passed from the dialog opener. */\n readonly data?: T;\n\n /** Unique ID for the dialog. */\n readonly id: string;\n\n /** Subscription to external detachments of the dialog. */\n private detachSubscription: Subscription;\n\n constructor(\n readonly overlayRef: OverlayRef,\n readonly config: NgpDialogConfig<T>,\n ) {\n this.data = config.data;\n this.keydownEvents = overlayRef.keydownEvents();\n this.outsidePointerEvents = overlayRef.outsidePointerEvents();\n this.id = config.id!; // By the time the dialog is created we are guaranteed to have an ID.\n\n this.keydownEvents.subscribe(event => {\n if (event.key === 'Escape' && !this.disableClose && !hasModifierKey(event)) {\n event.preventDefault();\n this.close('keyboard');\n }\n });\n\n this.detachSubscription = overlayRef.detachments().subscribe(() => this.close());\n }\n\n /**\n * Close the dialog.\n * @param result Optional result to return to the dialog opener.\n * @param options Additional options to customize the closing behavior.\n */\n close(focusOrigin?: FocusOrigin): void {\n this.overlayRef.dispose();\n this.detachSubscription.unsubscribe();\n this.closed.next(focusOrigin ?? null);\n this.closed.complete();\n }\n\n /** Updates the position of the dialog based on the current position strategy. */\n updatePosition(): this {\n this.overlayRef.updatePosition();\n return this;\n }\n}\n\nexport function injectDialogRef<T = unknown>(): NgpDialogRef<T> {\n return inject<NgpDialogRef<T>>(NgpDialogRef);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogOverlay } from './dialog-overlay';\n\nexport const NgpDialogOverlayToken = new InjectionToken<NgpDialogOverlay>('NgpDialogOverlayToken');\n\n/**\n * Inject the DialogOverlay directive instance\n */\nexport function injectDialogOverlay(): NgpDialogOverlay {\n return inject(NgpDialogOverlayToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Directive, HostListener } from '@angular/core';\nimport { injectDialogRef } from '../dialog/dialog-ref';\nimport { NgpDialogOverlayToken } from './dialog-overlay-token';\n\n@Directive({\n selector: '[ngpDialogOverlay]',\n exportAs: 'ngpDialogOverlay',\n providers: [{ provide: NgpDialogOverlayToken, useExisting: NgpDialogOverlay }],\n})\nexport class NgpDialogOverlay {\n /** Access the dialog ref. */\n private readonly dialogRef = injectDialogRef();\n\n @HostListener('click')\n protected close(): void {\n this.dialogRef.close();\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogTitle } from './dialog-title';\n\nexport const NgpDialogTitleToken = new InjectionToken<NgpDialogTitle>('NgpDialogTitleToken');\n\n/**\n * Inject the DialogTitle directive instance\n */\nexport function injectDialogTitle(): NgpDialogTitle {\n return inject(NgpDialogTitleToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialog } from '../dialog/dialog-token';\nimport { NgpDialogTitleToken } from './dialog-title-token';\n\n@Directive({\n selector: '[ngpDialogTitle]',\n exportAs: 'ngpDialogTitle',\n providers: [{ provide: NgpDialogTitleToken, useExisting: NgpDialogTitle }],\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogTitle implements OnDestroy {\n /** Access the dialog. */\n private readonly dialog = injectDialog();\n\n /** The id of the title. */\n readonly id = input<string>(uniqueId('ngp-dialog-title'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog.removeLabelledBy(prevId);\n }\n\n if (id) {\n this.dialog.setLabelledBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog.removeLabelledBy(this.id());\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Overlay, OverlayConfig, OverlayContainer, ScrollStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType, TemplatePortal } from '@angular/cdk/portal';\nimport {\n Injectable,\n Injector,\n OnDestroy,\n StaticProvider,\n TemplateRef,\n inject,\n isDevMode,\n} from '@angular/core';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { Observable, Subject, defer } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport { NgpDialogConfig, injectDialogConfig } from '../config/dialog-config';\nimport { NgpDialogRef } from './dialog-ref';\n\n/**\n * This is based on the Angular CDK Dialog service.\n * https://github.com/angular/components/blob/main/src/cdk/dialog/dialog.ts\n */\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgpDialogManager implements OnDestroy {\n private readonly overlay = inject(Overlay);\n private readonly defaultOptions = injectDialogConfig();\n private readonly parentDialogManager = inject(NgpDialogManager, {\n optional: true,\n skipSelf: true,\n });\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly scrollStrategy: ScrollStrategy =\n this.defaultOptions.scrollStrategy ?? this.overlay.scrollStrategies.block();\n\n private openDialogsAtThisLevel: NgpDialogRef[] = [];\n private readonly afterAllClosedAtThisLevel = new Subject<void>();\n private readonly afterOpenedAtThisLevel = new Subject<NgpDialogRef>();\n private ariaHiddenElements = new Map<Element, string | null>();\n\n /** Keeps track of the currently-open dialogs. */\n get openDialogs(): readonly NgpDialogRef[] {\n return this.parentDialogManager\n ? this.parentDialogManager.openDialogs\n : this.openDialogsAtThisLevel;\n }\n\n /** Stream that emits when a dialog has been opened. */\n get afterOpened(): Subject<NgpDialogRef> {\n return this.parentDialogManager\n ? this.parentDialogManager.afterOpened\n : this.afterOpenedAtThisLevel;\n }\n\n /**\n * Stream that emits when all open dialog have finished closing.\n * Will emit on subscribe if there are no open dialogs to begin with.\n */\n readonly afterAllClosed: Observable<void> = defer(() =>\n this.openDialogs.length\n ? this.getAfterAllClosed()\n : this.getAfterAllClosed().pipe(startWith(undefined)),\n );\n\n /**\n * Opens a modal dialog containing the given template.\n */\n open(\n templateRefOrComponentType: TemplateRef<NgpDialogContext> | ComponentType<any>,\n config?: NgpDialogConfig,\n ): NgpDialogRef {\n const defaults = this.defaultOptions;\n config = { ...defaults, ...config };\n config.id = config.id ?? uniqueId('ngp-dialog');\n\n if (config.id && this.getDialogById(config.id) && isDevMode()) {\n throw Error(`Dialog with id \"${config.id}\" exists already. The dialog id must be unique.`);\n }\n\n const overlayConfig = this.getOverlayConfig(config);\n const overlayRef = this.overlay.create(overlayConfig);\n const dialogRef = new NgpDialogRef(overlayRef, config);\n const injector = this.createInjector(config, dialogRef, undefined);\n const context: NgpDialogContext = {\n $implicit: dialogRef,\n close: dialogRef.close.bind(dialogRef),\n };\n\n if (templateRefOrComponentType instanceof TemplateRef) {\n overlayRef.attach(\n new TemplatePortal(templateRefOrComponentType, config.viewContainerRef!, context, injector),\n );\n } else {\n overlayRef.attach(\n new ComponentPortal(templateRefOrComponentType, config.viewContainerRef!, injector),\n );\n }\n\n // If this is the first dialog that we're opening, hide all the non-overlay content.\n if (!this.openDialogs.length) {\n this.hideNonDialogContentFromAssistiveTechnology();\n }\n\n (this.openDialogs as NgpDialogRef[]).push(dialogRef);\n dialogRef.closed.subscribe(() => this.removeOpenDialog(dialogRef, true));\n this.afterOpened.next(dialogRef);\n\n return dialogRef;\n }\n\n /**\n * Closes all of the currently-open dialogs.\n */\n closeAll(): void {\n reverseForEach(this.openDialogs, dialog => dialog.close());\n }\n\n /**\n * Finds an open dialog by its id.\n * @param id ID to use when looking up the dialog.\n */\n getDialogById(id: string): NgpDialogRef | undefined {\n return this.openDialogs.find(dialog => dialog.id === id);\n }\n\n ngOnDestroy(): void {\n // Make one pass over all the dialogs that need to be untracked, but should not be closed. We\n // want to stop tracking the open dialog even if it hasn't been closed, because the tracking\n // determines when `aria-hidden` is removed from elements outside the dialog.\n reverseForEach(this.openDialogsAtThisLevel, dialog => {\n // Check for `false` specifically since we want `undefined` to be interpreted as `true`.\n this.removeOpenDialog(dialog, false);\n });\n\n // Make a second pass and close the remaining dialogs. We do this second pass in order to\n // correctly dispatch the `afterAllClosed` event in case we have a mixed array of dialogs\n // that should be closed and dialogs that should not.\n reverseForEach(this.openDialogsAtThisLevel, dialog => dialog.close());\n\n this.afterAllClosedAtThisLevel.complete();\n this.afterOpenedAtThisLevel.complete();\n this.openDialogsAtThisLevel = [];\n }\n\n /**\n * Creates an overlay config from a dialog config.\n */\n private getOverlayConfig(config: NgpDialogConfig): OverlayConfig {\n const state = new OverlayConfig({\n positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\n scrollStrategy: config.scrollStrategy || this.scrollStrategy,\n hasBackdrop: false,\n disposeOnNavigation: config.closeOnNavigation,\n });\n\n return state;\n }\n\n /**\n * Creates a custom injector to be used inside the dialog. This allows a component loaded inside\n * of a dialog to close itself and, optionally, to return a value.\n */\n private createInjector(\n config: NgpDialogConfig,\n dialogRef: NgpDialogRef,\n fallbackInjector: Injector | undefined,\n ): Injector {\n const userInjector = config.injector || config.viewContainerRef?.injector;\n const providers: StaticProvider[] = [{ provide: NgpDialogRef, useValue: dialogRef }];\n\n return Injector.create({ parent: userInjector || fallbackInjector, providers });\n }\n\n /**\n * Removes a dialog from the array of open dialogs.\n */\n private removeOpenDialog(dialogRef: NgpDialogRef, emitEvent: boolean) {\n const index = this.openDialogs.indexOf(dialogRef);\n\n if (index > -1) {\n (this.openDialogs as NgpDialogRef[]).splice(index, 1);\n\n // If all the dialogs were closed, remove/restore the `aria-hidden`\n // to a the siblings and emit to the `afterAllClosed` stream.\n if (!this.openDialogs.length) {\n this.ariaHiddenElements.forEach((previousValue, element) => {\n if (previousValue) {\n element.setAttribute('aria-hidden', previousValue);\n } else {\n element.removeAttribute('aria-hidden');\n }\n });\n\n this.ariaHiddenElements.clear();\n\n if (emitEvent) {\n this.getAfterAllClosed().next();\n }\n }\n }\n }\n\n /** Hides all of the content that isn't an overlay from assistive technology. */\n private hideNonDialogContentFromAssistiveTechnology() {\n const overlayContainer = this.overlayContainer.getContainerElement();\n\n // Ensure that the overlay container is attached to the DOM.\n if (overlayContainer.parentElement) {\n const siblings = overlayContainer.parentElement.children;\n\n for (let i = siblings.length - 1; i > -1; i--) {\n const sibling = siblings[i];\n\n if (\n sibling !== overlayContainer &&\n sibling.nodeName !== 'SCRIPT' &&\n sibling.nodeName !== 'STYLE' &&\n !sibling.hasAttribute('aria-live')\n ) {\n this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));\n sibling.setAttribute('aria-hidden', 'true');\n }\n }\n }\n }\n\n private getAfterAllClosed(): Subject<void> {\n const parent = this.parentDialogManager;\n return parent ? parent.getAfterAllClosed() : this.afterAllClosedAtThisLevel;\n }\n}\n\n/**\n * Executes a callback against all elements in an array while iterating in reverse.\n * Useful if the array is being modified as it is being iterated.\n */\nfunction reverseForEach<T>(items: T[] | readonly T[], callback: (current: T) => void) {\n let i = items.length;\n\n while (i--) {\n callback(items[i]);\n }\n}\n\nexport interface NgpDialogContext {\n $implicit: NgpDialogRef;\n close: () => void;\n}\n\nexport function injectDialogManager(): NgpDialogManager {\n return inject(NgpDialogManager);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogTrigger } from './dialog-trigger';\n\nexport const NgpDialogTriggerToken = new InjectionToken<NgpDialogTrigger>('NgpDialogTriggerToken');\n\n/**\n * Inject the DialogTrigger directive instance\n */\nexport function injectDialogTrigger(): NgpDialogTrigger {\n return inject(NgpDialogTriggerToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport {\n ApplicationRef,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgpDialogRef } from '../dialog/dialog-ref';\nimport { NgpDialogContext, NgpDialogManager } from '../dialog/dialog.service';\nimport { NgpDialogTriggerToken } from './dialog-trigger-token';\n\n@Directive({\n selector: '[ngpDialogTrigger]',\n exportAs: 'ngpDialogTrigger',\n providers: [{ provide: NgpDialogTriggerToken, useExisting: NgpDialogTrigger }],\n})\nexport class NgpDialogTrigger {\n /** Access the dialog manager. */\n private readonly dialogManager = inject(NgpDialogManager);\n\n /** Access the application ref. */\n private readonly applicationRef = inject(ApplicationRef);\n\n /** Access the focus monitor. */\n private readonly focusMonitor = inject(FocusMonitor);\n\n /** Access the element ref. */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The template to launch. */\n readonly template = input.required<TemplateRef<NgpDialogContext>>({\n alias: 'ngpDialogTrigger',\n });\n\n /**\n * Store the dialog ref.\n * @internal\n */\n private dialogRef: NgpDialogRef | null = null;\n\n @HostListener('click')\n protected launch(): void {\n // this is not ideal, but there is a case where a dialog trigger is within an overlay (e.g. menu),\n // which may be removed before the dialog is closed. This is not desired, so we need to access a view container ref\n // that is not within the overlay. To solve this we use the view container ref of the root component.\n // Could this have any unintended side effects? For example, the dialog would not be closed during route changes?\n const viewContainerRef = this.applicationRef.components[0].injector.get(ViewContainerRef);\n\n this.dialogRef = this.dialogManager.open(this.template(), {\n viewContainerRef,\n });\n\n this.dialogRef.closed.subscribe(focusOrigin => {\n this.dialogRef = null;\n // Focus the trigger element after the dialog closes.\n this.focusMonitor.focusVia(this.elementRef.nativeElement, focusOrigin);\n });\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input, OnDestroy, signal } from '@angular/core';\nimport { NgpFocusTrap } from 'ng-primitives/focus-trap';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectDialogConfig } from '../config/dialog-config';\nimport { injectDialogRef } from './dialog-ref';\nimport { NgpDialogToken } from './dialog-token';\n\n@Directive({\n selector: '[ngpDialog]',\n exportAs: 'ngpDialog',\n providers: [{ provide: NgpDialogToken, useExisting: NgpDialog }],\n hostDirectives: [NgpFocusTrap],\n host: {\n tabindex: '-1',\n '[id]': 'id()',\n '[attr.role]': 'role()',\n '[attr.aria-modal]': 'modal()',\n '[attr.aria-labelledby]': 'labelledBy().join(\" \")',\n '[attr.aria-describedby]': 'describedBy().join(\" \")',\n },\n})\nexport class NgpDialog<T = unknown> implements OnDestroy {\n private readonly config = injectDialogConfig();\n\n /** Access the dialog ref */\n private readonly dialogRef = injectDialogRef<T>();\n\n /** The id of the dialog */\n readonly id = input<string>(uniqueId('ngp-dialog'));\n\n /** The dialog role. */\n readonly role = input(this.config.role, {\n alias: 'ngpDialogRole',\n });\n\n /** Whether the dialog is a modal. */\n readonly modal = input<boolean, BooleanInput>(this.config.modal ?? false, {\n alias: 'ngpDialogModal',\n transform: booleanAttribute,\n });\n\n /** The labelledby ids */\n protected readonly labelledBy = signal<string[]>([]);\n\n /** The describedby ids */\n protected readonly describedBy = signal<string[]>([]);\n\n ngOnDestroy(): void {\n this.close();\n }\n\n /** Close the dialog. */\n close(): void {\n this.dialogRef.close();\n }\n\n /** Stop click events from propagating to the overlay */\n @HostListener('click', ['$event'])\n protected onClick(event: Event): void {\n event.stopPropagation();\n }\n\n /** @internal register a labelledby id */\n setLabelledBy(id: string): void {\n this.labelledBy.update(ids => [...ids, id]);\n }\n\n /** @internal register a describedby id */\n setDescribedBy(id: string): void {\n this.describedBy.update(ids => [...ids, id]);\n }\n\n /** @internal remove a labelledby id */\n removeLabelledBy(id: string): void {\n this.labelledBy.update(ids => ids.filter(i => i !== id));\n }\n\n /** @internal remove a describedby id */\n removeDescribedBy(id: string): void {\n this.describedBy.update(ids => ids.filter(i => i !== id));\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport { NgpDialogConfig, provideDialogConfig } from './config/dialog-config';\nexport { NgpDialogDescription } from './dialog-description/dialog-description';\nexport {\n NgpDialogDescriptionToken,\n injectDialogDescription,\n} from './dialog-description/dialog-description-token';\nexport { NgpDialogOverlay } from './dialog-overlay/dialog-overlay';\nexport { NgpDialogOverlayToken, injectDialogOverlay } from './dialog-overlay/dialog-overlay-token';\nexport { NgpDialogTitle } from './dialog-title/dialog-title';\nexport { NgpDialogTitleToken, injectDialogTitle } from './dialog-title/dialog-title-token';\nexport { NgpDialogTrigger } from './dialog-trigger/dialog-trigger';\nexport { NgpDialogTriggerToken, injectDialogTrigger } from './dialog-trigger/dialog-trigger-token';\nexport { injectDialogRef, NgpDialogRef } from './dialog/dialog-ref';\nexport { NgpDialog } from './dialog/dialog';\nexport { NgpDialogManager } from './dialog/dialog.service';\nexport { NgpDialogToken, injectDialog } from './dialog/dialog-token';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-dialog.mjs","sources":["../../../../packages/ng-primitives/dialog/src/config/dialog-config.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-description/dialog-description-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-description/dialog-description.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-ref.ts","../../../../packages/ng-primitives/dialog/src/dialog-overlay/dialog-overlay-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-overlay/dialog-overlay.ts","../../../../packages/ng-primitives/dialog/src/dialog-title/dialog-title-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-title/dialog-title.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.service.ts","../../../../packages/ng-primitives/dialog/src/dialog-trigger/dialog-trigger-token.ts","../../../../packages/ng-primitives/dialog/src/dialog-trigger/dialog-trigger.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.ts","../../../../packages/ng-primitives/dialog/src/index.ts","../../../../packages/ng-primitives/dialog/src/ng-primitives-dialog.ts"],"sourcesContent":["/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ScrollStrategy } from '@angular/cdk/overlay';\nimport { InjectionToken, Injector, Provider, ViewContainerRef, inject } from '@angular/core';\n\n/** Valid ARIA roles for a dialog. */\nexport type NgpDialogRole = 'dialog' | 'alertdialog';\n\nexport interface NgpDialogConfig<T = any> {\n /** The view container to attach the dialog to. */\n viewContainerRef?: ViewContainerRef;\n\n /** The injector to use for the dialog. Defaults to the view container's injector.*/\n injector?: Injector;\n\n /** ID for the dialog. If omitted, a unique one will be generated. */\n id?: string;\n\n /** The role of the dialog. */\n role?: NgpDialogRole;\n\n /** Whether this is a modal dialog. Used to set the `aria-modal` attribute. */\n modal?: boolean;\n\n /** Scroll strategy to be used for the dialog. This determines how the dialog responds to scrolling underneath the panel element. */\n scrollStrategy?: ScrollStrategy;\n\n /**\n * Whether the dialog should close when the user navigates backwards or forwards through browser\n * history.\n */\n closeOnNavigation?: boolean;\n\n data?: T;\n}\n\nexport const defaultDialogConfig: NgpDialogConfig = {\n role: 'dialog',\n modal: true,\n closeOnNavigation: true,\n};\n\nexport const NgpDialogConfigToken = new InjectionToken<NgpDialogConfig>('NgpDialogConfigToken');\n\n/**\n * Provide the default Dialog configuration\n * @param config The Dialog configuration\n * @returns The provider\n */\nexport function provideDialogConfig(config: Partial<NgpDialogConfig>): Provider[] {\n return [\n {\n provide: NgpDialogConfigToken,\n useValue: { ...defaultDialogConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Dialog configuration\n * @returns The global Dialog configuration\n */\nexport function injectDialogConfig(): NgpDialogConfig {\n return inject(NgpDialogConfigToken, { optional: true }) ?? defaultDialogConfig;\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialog } from './dialog';\n\nexport const NgpDialogToken = new InjectionToken<NgpDialog>('NgpDialogToken');\n\n/**\n * Inject the Dialog directive instance\n */\nexport function injectDialog(): NgpDialog {\n return inject(NgpDialogToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogDescription } from './dialog-description';\n\nexport const NgpDialogDescriptionToken = new InjectionToken<NgpDialogDescription>(\n 'NgpDialogDescriptionToken',\n);\n\n/**\n * Inject the DialogDescription directive instance\n */\nexport function injectDialogDescription(): NgpDialogDescription {\n return inject(NgpDialogDescriptionToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialog } from '../dialog/dialog-token';\nimport { NgpDialogDescriptionToken } from './dialog-description-token';\n\n@Directive({\n selector: '[ngpDialogDescription]',\n exportAs: 'ngpDialogDescription',\n providers: [{ provide: NgpDialogDescriptionToken, useExisting: NgpDialogDescription }],\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogDescription implements OnDestroy {\n /** Access the dialog */\n private readonly dialog = injectDialog();\n\n /** The id of the descriptions. */\n readonly id = input<string>(uniqueId('ngp-dialog-description'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog.removeDescribedBy(prevId);\n }\n\n if (id) {\n this.dialog.setDescribedBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog.removeDescribedBy(this.id());\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusOrigin } from '@angular/cdk/a11y';\nimport { hasModifierKey } from '@angular/cdk/keycodes';\nimport { OverlayRef } from '@angular/cdk/overlay';\nimport { inject, Injector } from '@angular/core';\nimport { NgpExitAnimationManager } from 'ng-primitives/internal';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { NgpDialogConfig } from '../config/dialog-config';\n\n/**\n * Reference to a dialog opened via the Dialog service.\n */\nexport class NgpDialogRef<T = unknown> {\n /** Whether the user is allowed to close the dialog. */\n disableClose: boolean | undefined;\n\n /** Emits when the dialog has been closed. */\n readonly closed = new Subject<FocusOrigin | null>();\n\n /** Emits when on keyboard events within the dialog. */\n readonly keydownEvents: Observable<KeyboardEvent>;\n\n /** Emits on pointer events that happen outside of the dialog. */\n readonly outsidePointerEvents: Observable<MouseEvent>;\n\n /** Data passed from the dialog opener. */\n readonly data?: T;\n\n /** Unique ID for the dialog. */\n readonly id: string;\n\n /** Subscription to external detachments of the dialog. */\n private detachSubscription: Subscription;\n\n /** @internal Store the injector */\n injector: Injector | undefined;\n\n /** Whether the dialog is closing. */\n private closing = false;\n\n constructor(\n readonly overlayRef: OverlayRef,\n readonly config: NgpDialogConfig<T>,\n ) {\n this.data = config.data;\n this.keydownEvents = overlayRef.keydownEvents();\n this.outsidePointerEvents = overlayRef.outsidePointerEvents();\n this.id = config.id!; // By the time the dialog is created we are guaranteed to have an ID.\n\n this.keydownEvents.subscribe(event => {\n if (event.key === 'Escape' && !this.disableClose && !hasModifierKey(event)) {\n event.preventDefault();\n this.close('keyboard');\n }\n });\n\n this.detachSubscription = overlayRef.detachments().subscribe(() => this.close());\n }\n\n /**\n * Close the dialog.\n * @param result Optional result to return to the dialog opener.\n * @param options Additional options to customize the closing behavior.\n */\n async close(focusOrigin?: FocusOrigin): Promise<void> {\n // If the dialog is already closed, do nothing.\n if (this.closing) {\n return;\n }\n\n this.closing = true;\n\n const exitAnimationManager = this.injector?.get(NgpExitAnimationManager, undefined, {\n optional: true,\n });\n if (exitAnimationManager) {\n await exitAnimationManager.exit();\n }\n\n this.overlayRef.dispose();\n this.detachSubscription.unsubscribe();\n this.closed.next(focusOrigin ?? null);\n this.closed.complete();\n }\n\n /** Updates the position of the dialog based on the current position strategy. */\n updatePosition(): this {\n this.overlayRef.updatePosition();\n return this;\n }\n}\n\nexport function injectDialogRef<T = unknown>(): NgpDialogRef<T> {\n return inject<NgpDialogRef<T>>(NgpDialogRef);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogOverlay } from './dialog-overlay';\n\nexport const NgpDialogOverlayToken = new InjectionToken<NgpDialogOverlay>('NgpDialogOverlayToken');\n\n/**\n * Inject the DialogOverlay directive instance\n */\nexport function injectDialogOverlay(): NgpDialogOverlay {\n return inject(NgpDialogOverlayToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Directive, HostListener } from '@angular/core';\nimport { NgpExitAnimation } from 'ng-primitives/internal';\nimport { injectDialogRef } from '../dialog/dialog-ref';\nimport { NgpDialogOverlayToken } from './dialog-overlay-token';\n\n@Directive({\n selector: '[ngpDialogOverlay]',\n exportAs: 'ngpDialogOverlay',\n providers: [{ provide: NgpDialogOverlayToken, useExisting: NgpDialogOverlay }],\n hostDirectives: [NgpExitAnimation],\n})\nexport class NgpDialogOverlay {\n /** Access the dialog ref. */\n private readonly dialogRef = injectDialogRef();\n\n @HostListener('click')\n protected close(): void {\n this.dialogRef.close();\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogTitle } from './dialog-title';\n\nexport const NgpDialogTitleToken = new InjectionToken<NgpDialogTitle>('NgpDialogTitleToken');\n\n/**\n * Inject the DialogTitle directive instance\n */\nexport function injectDialogTitle(): NgpDialogTitle {\n return inject(NgpDialogTitleToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialog } from '../dialog/dialog-token';\nimport { NgpDialogTitleToken } from './dialog-title-token';\n\n@Directive({\n selector: '[ngpDialogTitle]',\n exportAs: 'ngpDialogTitle',\n providers: [{ provide: NgpDialogTitleToken, useExisting: NgpDialogTitle }],\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogTitle implements OnDestroy {\n /** Access the dialog. */\n private readonly dialog = injectDialog();\n\n /** The id of the title. */\n readonly id = input<string>(uniqueId('ngp-dialog-title'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog.removeLabelledBy(prevId);\n }\n\n if (id) {\n this.dialog.setLabelledBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog.removeLabelledBy(this.id());\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Overlay, OverlayConfig, OverlayContainer, ScrollStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType, TemplatePortal } from '@angular/cdk/portal';\nimport {\n Injectable,\n Injector,\n OnDestroy,\n StaticProvider,\n TemplateRef,\n inject,\n isDevMode,\n} from '@angular/core';\nimport { NgpExitAnimationManager } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { Observable, Subject, defer } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport { NgpDialogConfig, injectDialogConfig } from '../config/dialog-config';\nimport { NgpDialogRef } from './dialog-ref';\n\n/**\n * This is based on the Angular CDK Dialog service.\n * https://github.com/angular/components/blob/main/src/cdk/dialog/dialog.ts\n */\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgpDialogManager implements OnDestroy {\n private readonly overlay = inject(Overlay);\n private readonly defaultOptions = injectDialogConfig();\n private readonly parentDialogManager = inject(NgpDialogManager, {\n optional: true,\n skipSelf: true,\n });\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly scrollStrategy: ScrollStrategy =\n this.defaultOptions.scrollStrategy ?? this.overlay.scrollStrategies.block();\n\n private openDialogsAtThisLevel: NgpDialogRef[] = [];\n private readonly afterAllClosedAtThisLevel = new Subject<void>();\n private readonly afterOpenedAtThisLevel = new Subject<NgpDialogRef>();\n private ariaHiddenElements = new Map<Element, string | null>();\n\n /** Keeps track of the currently-open dialogs. */\n get openDialogs(): readonly NgpDialogRef[] {\n return this.parentDialogManager\n ? this.parentDialogManager.openDialogs\n : this.openDialogsAtThisLevel;\n }\n\n /** Stream that emits when a dialog has been opened. */\n get afterOpened(): Subject<NgpDialogRef> {\n return this.parentDialogManager\n ? this.parentDialogManager.afterOpened\n : this.afterOpenedAtThisLevel;\n }\n\n /**\n * Stream that emits when all open dialog have finished closing.\n * Will emit on subscribe if there are no open dialogs to begin with.\n */\n readonly afterAllClosed: Observable<void> = defer(() =>\n this.openDialogs.length\n ? this.getAfterAllClosed()\n : this.getAfterAllClosed().pipe(startWith(undefined)),\n );\n\n /**\n * Opens a modal dialog containing the given template.\n */\n open(\n templateRefOrComponentType: TemplateRef<NgpDialogContext> | ComponentType<any>,\n config?: NgpDialogConfig,\n ): NgpDialogRef {\n const defaults = this.defaultOptions;\n config = { ...defaults, ...config };\n config.id = config.id ?? uniqueId('ngp-dialog');\n\n if (config.id && this.getDialogById(config.id) && isDevMode()) {\n throw Error(`Dialog with id \"${config.id}\" exists already. The dialog id must be unique.`);\n }\n\n const overlayConfig = this.getOverlayConfig(config);\n const overlayRef = this.overlay.create(overlayConfig);\n const dialogRef = new NgpDialogRef(overlayRef, config);\n const injector = this.createInjector(config, dialogRef, undefined);\n\n // store the injector in the dialog ref - this is so we can access the exit animation manager\n dialogRef.injector = injector;\n\n const context: NgpDialogContext = {\n $implicit: dialogRef,\n close: dialogRef.close.bind(dialogRef),\n };\n\n if (templateRefOrComponentType instanceof TemplateRef) {\n overlayRef.attach(\n new TemplatePortal(templateRefOrComponentType, config.viewContainerRef!, context, injector),\n );\n } else {\n overlayRef.attach(\n new ComponentPortal(templateRefOrComponentType, config.viewContainerRef!, injector),\n );\n }\n\n // If this is the first dialog that we're opening, hide all the non-overlay content.\n if (!this.openDialogs.length) {\n this.hideNonDialogContentFromAssistiveTechnology();\n }\n\n (this.openDialogs as NgpDialogRef[]).push(dialogRef);\n dialogRef.closed.subscribe(() => this.removeOpenDialog(dialogRef, true));\n this.afterOpened.next(dialogRef);\n\n return dialogRef;\n }\n\n /**\n * Closes all of the currently-open dialogs.\n */\n closeAll(): void {\n reverseForEach(this.openDialogs, dialog => dialog.close());\n }\n\n /**\n * Finds an open dialog by its id.\n * @param id ID to use when looking up the dialog.\n */\n getDialogById(id: string): NgpDialogRef | undefined {\n return this.openDialogs.find(dialog => dialog.id === id);\n }\n\n ngOnDestroy(): void {\n // Make one pass over all the dialogs that need to be untracked, but should not be closed. We\n // want to stop tracking the open dialog even if it hasn't been closed, because the tracking\n // determines when `aria-hidden` is removed from elements outside the dialog.\n reverseForEach(this.openDialogsAtThisLevel, dialog => {\n // Check for `false` specifically since we want `undefined` to be interpreted as `true`.\n this.removeOpenDialog(dialog, false);\n });\n\n // Make a second pass and close the remaining dialogs. We do this second pass in order to\n // correctly dispatch the `afterAllClosed` event in case we have a mixed array of dialogs\n // that should be closed and dialogs that should not.\n reverseForEach(this.openDialogsAtThisLevel, dialog => dialog.close());\n\n this.afterAllClosedAtThisLevel.complete();\n this.afterOpenedAtThisLevel.complete();\n this.openDialogsAtThisLevel = [];\n }\n\n /**\n * Creates an overlay config from a dialog config.\n */\n private getOverlayConfig(config: NgpDialogConfig): OverlayConfig {\n const state = new OverlayConfig({\n positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\n scrollStrategy: config.scrollStrategy || this.scrollStrategy,\n hasBackdrop: false,\n disposeOnNavigation: config.closeOnNavigation,\n });\n\n return state;\n }\n\n /**\n * Creates a custom injector to be used inside the dialog. This allows a component loaded inside\n * of a dialog to close itself and, optionally, to return a value.\n */\n private createInjector(\n config: NgpDialogConfig,\n dialogRef: NgpDialogRef,\n fallbackInjector: Injector | undefined,\n ): Injector {\n const userInjector = config.injector || config.viewContainerRef?.injector;\n const providers: StaticProvider[] = [\n { provide: NgpDialogRef, useValue: dialogRef },\n { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager },\n ];\n\n return Injector.create({ parent: userInjector || fallbackInjector, providers });\n }\n\n /**\n * Removes a dialog from the array of open dialogs.\n */\n private removeOpenDialog(dialogRef: NgpDialogRef, emitEvent: boolean) {\n const index = this.openDialogs.indexOf(dialogRef);\n\n if (index > -1) {\n (this.openDialogs as NgpDialogRef[]).splice(index, 1);\n\n // If all the dialogs were closed, remove/restore the `aria-hidden`\n // to a the siblings and emit to the `afterAllClosed` stream.\n if (!this.openDialogs.length) {\n this.ariaHiddenElements.forEach((previousValue, element) => {\n if (previousValue) {\n element.setAttribute('aria-hidden', previousValue);\n } else {\n element.removeAttribute('aria-hidden');\n }\n });\n\n this.ariaHiddenElements.clear();\n\n if (emitEvent) {\n this.getAfterAllClosed().next();\n }\n }\n }\n }\n\n /** Hides all of the content that isn't an overlay from assistive technology. */\n private hideNonDialogContentFromAssistiveTechnology() {\n const overlayContainer = this.overlayContainer.getContainerElement();\n\n // Ensure that the overlay container is attached to the DOM.\n if (overlayContainer.parentElement) {\n const siblings = overlayContainer.parentElement.children;\n\n for (let i = siblings.length - 1; i > -1; i--) {\n const sibling = siblings[i];\n\n if (\n sibling !== overlayContainer &&\n sibling.nodeName !== 'SCRIPT' &&\n sibling.nodeName !== 'STYLE' &&\n !sibling.hasAttribute('aria-live')\n ) {\n this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));\n sibling.setAttribute('aria-hidden', 'true');\n }\n }\n }\n }\n\n private getAfterAllClosed(): Subject<void> {\n const parent = this.parentDialogManager;\n return parent ? parent.getAfterAllClosed() : this.afterAllClosedAtThisLevel;\n }\n}\n\n/**\n * Executes a callback against all elements in an array while iterating in reverse.\n * Useful if the array is being modified as it is being iterated.\n */\nfunction reverseForEach<T>(items: T[] | readonly T[], callback: (current: T) => void) {\n let i = items.length;\n\n while (i--) {\n callback(items[i]);\n }\n}\n\nexport interface NgpDialogContext {\n $implicit: NgpDialogRef;\n close: () => void;\n}\n\nexport function injectDialogManager(): NgpDialogManager {\n return inject(NgpDialogManager);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { InjectionToken, inject } from '@angular/core';\nimport type { NgpDialogTrigger } from './dialog-trigger';\n\nexport const NgpDialogTriggerToken = new InjectionToken<NgpDialogTrigger>('NgpDialogTriggerToken');\n\n/**\n * Inject the DialogTrigger directive instance\n */\nexport function injectDialogTrigger(): NgpDialogTrigger {\n return inject(NgpDialogTriggerToken);\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport {\n ApplicationRef,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgpDialogRef } from '../dialog/dialog-ref';\nimport { NgpDialogContext, NgpDialogManager } from '../dialog/dialog.service';\nimport { NgpDialogTriggerToken } from './dialog-trigger-token';\n\n@Directive({\n selector: '[ngpDialogTrigger]',\n exportAs: 'ngpDialogTrigger',\n providers: [{ provide: NgpDialogTriggerToken, useExisting: NgpDialogTrigger }],\n})\nexport class NgpDialogTrigger {\n /** Access the dialog manager. */\n private readonly dialogManager = inject(NgpDialogManager);\n\n /** Access the application ref. */\n private readonly applicationRef = inject(ApplicationRef);\n\n /** Access the focus monitor. */\n private readonly focusMonitor = inject(FocusMonitor);\n\n /** Access the element ref. */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The template to launch. */\n readonly template = input.required<TemplateRef<NgpDialogContext>>({\n alias: 'ngpDialogTrigger',\n });\n\n /**\n * Store the dialog ref.\n * @internal\n */\n private dialogRef: NgpDialogRef | null = null;\n\n @HostListener('click')\n protected launch(): void {\n // this is not ideal, but there is a case where a dialog trigger is within an overlay (e.g. menu),\n // which may be removed before the dialog is closed. This is not desired, so we need to access a view container ref\n // that is not within the overlay. To solve this we use the view container ref of the root component.\n // Could this have any unintended side effects? For example, the dialog would not be closed during route changes?\n const viewContainerRef = this.applicationRef.components[0].injector.get(ViewContainerRef);\n\n this.dialogRef = this.dialogManager.open(this.template(), {\n viewContainerRef,\n });\n\n this.dialogRef.closed.subscribe(focusOrigin => {\n this.dialogRef = null;\n // Focus the trigger element after the dialog closes.\n this.focusMonitor.focusVia(this.elementRef.nativeElement, focusOrigin);\n });\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input, OnDestroy, signal } from '@angular/core';\nimport { NgpFocusTrap } from 'ng-primitives/focus-trap';\nimport { NgpExitAnimation } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectDialogConfig } from '../config/dialog-config';\nimport { injectDialogRef } from './dialog-ref';\nimport { NgpDialogToken } from './dialog-token';\n\n@Directive({\n selector: '[ngpDialog]',\n exportAs: 'ngpDialog',\n providers: [{ provide: NgpDialogToken, useExisting: NgpDialog }],\n hostDirectives: [NgpFocusTrap, NgpExitAnimation],\n host: {\n tabindex: '-1',\n '[id]': 'id()',\n '[attr.role]': 'role()',\n '[attr.aria-modal]': 'modal()',\n '[attr.aria-labelledby]': 'labelledBy().join(\" \")',\n '[attr.aria-describedby]': 'describedBy().join(\" \")',\n },\n})\nexport class NgpDialog<T = unknown> implements OnDestroy {\n private readonly config = injectDialogConfig();\n\n /** Access the dialog ref */\n private readonly dialogRef = injectDialogRef<T>();\n\n /** The id of the dialog */\n readonly id = input<string>(uniqueId('ngp-dialog'));\n\n /** The dialog role. */\n readonly role = input(this.config.role, {\n alias: 'ngpDialogRole',\n });\n\n /** Whether the dialog is a modal. */\n readonly modal = input<boolean, BooleanInput>(this.config.modal ?? false, {\n alias: 'ngpDialogModal',\n transform: booleanAttribute,\n });\n\n /** The labelledby ids */\n protected readonly labelledBy = signal<string[]>([]);\n\n /** The describedby ids */\n protected readonly describedBy = signal<string[]>([]);\n\n ngOnDestroy(): void {\n this.close();\n }\n\n /** Close the dialog. */\n close(): void {\n this.dialogRef.close();\n }\n\n /** Stop click events from propagating to the overlay */\n @HostListener('click', ['$event'])\n protected onClick(event: Event): void {\n event.stopPropagation();\n }\n\n /** @internal register a labelledby id */\n setLabelledBy(id: string): void {\n this.labelledBy.update(ids => [...ids, id]);\n }\n\n /** @internal register a describedby id */\n setDescribedBy(id: string): void {\n this.describedBy.update(ids => [...ids, id]);\n }\n\n /** @internal remove a labelledby id */\n removeLabelledBy(id: string): void {\n this.labelledBy.update(ids => ids.filter(i => i !== id));\n }\n\n /** @internal remove a describedby id */\n removeDescribedBy(id: string): void {\n this.describedBy.update(ids => ids.filter(i => i !== id));\n }\n}\n","/**\n * Copyright © 2024 Angular Primitives.\n * https://github.com/ng-primitives/ng-primitives\n *\n * This source code is licensed under the Apache 2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport { NgpDialogConfig, provideDialogConfig } from './config/dialog-config';\nexport { NgpDialogDescription } from './dialog-description/dialog-description';\nexport {\n NgpDialogDescriptionToken,\n injectDialogDescription,\n} from './dialog-description/dialog-description-token';\nexport { NgpDialogOverlay } from './dialog-overlay/dialog-overlay';\nexport { NgpDialogOverlayToken, injectDialogOverlay } from './dialog-overlay/dialog-overlay-token';\nexport { NgpDialogTitle } from './dialog-title/dialog-title';\nexport { NgpDialogTitleToken, injectDialogTitle } from './dialog-title/dialog-title-token';\nexport { NgpDialogTrigger } from './dialog-trigger/dialog-trigger';\nexport { NgpDialogTriggerToken, injectDialogTrigger } from './dialog-trigger/dialog-trigger-token';\nexport { injectDialogRef, NgpDialogRef } from './dialog/dialog-ref';\nexport { NgpDialog } from './dialog/dialog';\nexport { NgpDialogManager } from './dialog/dialog.service';\nexport { NgpDialogToken, injectDialog } from './dialog/dialog-token';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, computed, signal, ElementRef,
|
|
2
|
+
import { InjectionToken, inject, computed, signal, ElementRef, ChangeDetectorRef, Directive, Injectable, effect, PLATFORM_ID, untracked } from '@angular/core';
|
|
3
3
|
import { injectDisposables, onBooleanChange } from 'ng-primitives/utils';
|
|
4
4
|
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
5
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
@@ -24,6 +24,104 @@ function injectDisabled(disabled = signal(false)) {
|
|
|
24
24
|
return computed(() => provider?.disabled() || disabled());
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* A simple utility function to inject an element reference with less boilerplate.
|
|
29
|
+
* @returns The element reference.
|
|
30
|
+
*/
|
|
31
|
+
function injectElementRef() {
|
|
32
|
+
return inject(ElementRef);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Copyright © 2024 Angular Primitives.
|
|
37
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
38
|
+
*
|
|
39
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
40
|
+
* LICENSE file in the root directory of this source tree.
|
|
41
|
+
*/
|
|
42
|
+
class NgpExitAnimation {
|
|
43
|
+
constructor() {
|
|
44
|
+
/** The animation manager. */
|
|
45
|
+
this.animationManager = inject(NgpExitAnimationManager);
|
|
46
|
+
/** The element to animate. */
|
|
47
|
+
this.element = injectElementRef();
|
|
48
|
+
/** Access the change detector. */
|
|
49
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
50
|
+
/** The animation state */
|
|
51
|
+
this.state = signal('enter');
|
|
52
|
+
this.animationManager.add(this);
|
|
53
|
+
}
|
|
54
|
+
ngOnDestroy() {
|
|
55
|
+
this.animationManager.remove(this);
|
|
56
|
+
}
|
|
57
|
+
/** Mark the element as exiting. */
|
|
58
|
+
exit() {
|
|
59
|
+
this.state.set('exit');
|
|
60
|
+
this.changeDetector.detectChanges();
|
|
61
|
+
return new Promise(resolve => {
|
|
62
|
+
// check if there are any exit animations or transitions
|
|
63
|
+
const computedStyle = window.getComputedStyle(this.element.nativeElement);
|
|
64
|
+
const hasTransition = parseFloat(computedStyle.transitionDuration) > 0;
|
|
65
|
+
const hasAnimation = parseFloat(computedStyle.animationDuration) > 0;
|
|
66
|
+
if (!hasTransition && !hasAnimation) {
|
|
67
|
+
resolve();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// wait for the exit animation to finish
|
|
71
|
+
const done = (event) => {
|
|
72
|
+
// check if the event is for this element
|
|
73
|
+
if (event.target !== this.element.nativeElement) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.element.nativeElement.removeEventListener('transitionend', done);
|
|
77
|
+
this.element.nativeElement.removeEventListener('animationend', done);
|
|
78
|
+
resolve();
|
|
79
|
+
};
|
|
80
|
+
this.element.nativeElement.addEventListener('transitionend', done);
|
|
81
|
+
this.element.nativeElement.addEventListener('animationend', done);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpExitAnimation, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
85
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.7", type: NgpExitAnimation, isStandalone: true, selector: "[ngpExitAnimation]", host: { properties: { "attr.data-closing": "state() === \"exit\" ? \"\" : null" } }, exportAs: ["ngpExitAnimation"], ngImport: i0 }); }
|
|
86
|
+
}
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpExitAnimation, decorators: [{
|
|
88
|
+
type: Directive,
|
|
89
|
+
args: [{
|
|
90
|
+
selector: '[ngpExitAnimation]',
|
|
91
|
+
exportAs: 'ngpExitAnimation',
|
|
92
|
+
host: {
|
|
93
|
+
'[attr.data-closing]': 'state() === "exit" ? "" : null',
|
|
94
|
+
},
|
|
95
|
+
}]
|
|
96
|
+
}], ctorParameters: () => [] });
|
|
97
|
+
class NgpExitAnimationManager {
|
|
98
|
+
constructor() {
|
|
99
|
+
/** Store the instances of the exit animation directive. */
|
|
100
|
+
this.instances = [];
|
|
101
|
+
}
|
|
102
|
+
/** Add an instance to the manager. */
|
|
103
|
+
add(instance) {
|
|
104
|
+
this.instances.push(instance);
|
|
105
|
+
}
|
|
106
|
+
/** Remove an instance from the manager. */
|
|
107
|
+
remove(instance) {
|
|
108
|
+
const index = this.instances.indexOf(instance);
|
|
109
|
+
if (index !== -1) {
|
|
110
|
+
this.instances.splice(index, 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Exit all instances. */
|
|
114
|
+
exit() {
|
|
115
|
+
const promises = this.instances.map(instance => instance.exit());
|
|
116
|
+
return Promise.all(promises);
|
|
117
|
+
}
|
|
118
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpExitAnimationManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
119
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpExitAnimationManager }); }
|
|
120
|
+
}
|
|
121
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: NgpExitAnimationManager, decorators: [{
|
|
122
|
+
type: Injectable
|
|
123
|
+
}] });
|
|
124
|
+
|
|
27
125
|
/**
|
|
28
126
|
* Copyright © 2024 Angular Primitives.
|
|
29
127
|
* https://github.com/ng-primitives/ng-primitives
|
|
@@ -588,14 +686,6 @@ function injectStyleInjector() {
|
|
|
588
686
|
return inject(StyleInjector);
|
|
589
687
|
}
|
|
590
688
|
|
|
591
|
-
/**
|
|
592
|
-
* A simple utility function to inject an element reference with less boilerplate.
|
|
593
|
-
* @returns The element reference.
|
|
594
|
-
*/
|
|
595
|
-
function injectElementRef() {
|
|
596
|
-
return inject(ElementRef);
|
|
597
|
-
}
|
|
598
|
-
|
|
599
689
|
function getScrollableAncestor(element) {
|
|
600
690
|
let parent = element.parentElement;
|
|
601
691
|
while (parent) {
|
|
@@ -639,5 +729,5 @@ function scrollIntoViewIfNeeded(element) {
|
|
|
639
729
|
* Generated bundle index. Do not edit.
|
|
640
730
|
*/
|
|
641
731
|
|
|
642
|
-
export { NgpDisabledToken, NgpOrientationToken, StyleInjector, explicitEffect, injectDisabled, injectElementRef, injectOrientation, injectStyleInjector, onDomRemoval, provideOrientation, scrollIntoViewIfNeeded, setupFocus, setupFocusVisible, setupHover, setupInteractions, setupPress };
|
|
732
|
+
export { NgpDisabledToken, NgpExitAnimation, NgpExitAnimationManager, NgpOrientationToken, StyleInjector, explicitEffect, injectDisabled, injectElementRef, injectOrientation, injectStyleInjector, onDomRemoval, provideOrientation, scrollIntoViewIfNeeded, setupFocus, setupFocusVisible, setupHover, setupInteractions, setupPress };
|
|
643
733
|
//# sourceMappingURL=ng-primitives-internal.mjs.map
|