@scania-nl/tegel-angular-extensions 0.0.6 → 0.0.8

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.
@@ -0,0 +1,156 @@
1
+ import { Injectable, inject, signal } from '@angular/core';
2
+ import { MODAL_CONFIG } from './schema/modal.config';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Central registry and lifecycle manager for modal instances.
6
+ *
7
+ * This service creates modals, tracks their state, and coordinates
8
+ * open/close/remove behavior across the application.
9
+ */
10
+ export class ModalService {
11
+ /** Default modal configuration injected via `MODAL_CONFIG`. */
12
+ config = inject(MODAL_CONFIG);
13
+ /** Incrementing counter for modal id generation. */
14
+ id = 0;
15
+ /** Internal store of modals keyed by id. */
16
+ _modals = signal(new Map());
17
+ /** Read-only signal of all registered modals. */
18
+ modals = this._modals.asReadonly();
19
+ /**
20
+ * Creates a new modal instance and registers it.
21
+ * @param options Modal options used to initialize the instance.
22
+ * @returns A ModalRef for controlling the instance.
23
+ */
24
+ create(options = {}) {
25
+ // Create a new id and build the initial modal state.
26
+ const id = `modal-${++this.id}`;
27
+ const modal = this.buildModal(id, undefined, options);
28
+ // Persist to the internal store.
29
+ this.upsertModal(modal);
30
+ return {
31
+ id,
32
+ open: this.open.bind(this, id),
33
+ close: this.close.bind(this, id),
34
+ remove: this.remove.bind(this, id),
35
+ };
36
+ }
37
+ /**
38
+ * Opens a modal by id.
39
+ * @param id Modal id.
40
+ */
41
+ open(id) {
42
+ // Set open state to true if needed.
43
+ this.updateModalState(id, true);
44
+ }
45
+ /**
46
+ * Closes a modal by id.
47
+ * @param id Modal id.
48
+ */
49
+ close(id) {
50
+ const existing = this.getModal(id);
51
+ if (!existing?.isOpen)
52
+ return;
53
+ // Set open state to false and notify callbacks.
54
+ this.updateModalState(id, false);
55
+ existing.onClosed?.();
56
+ console.log('Modal closed:', id);
57
+ // Optionally remove the modal after closing.
58
+ if (existing.removeOnClose) {
59
+ this.remove(id);
60
+ }
61
+ }
62
+ /**
63
+ * Removes a modal from the registry and DOM.
64
+ * Closes the modal first if it is open.
65
+ * @param id Modal id.
66
+ */
67
+ remove(id) {
68
+ const existing = this.getModal(id);
69
+ if (!existing)
70
+ return;
71
+ // Remove from the internal store.
72
+ this._modals.update((modals) => {
73
+ const next = new Map(modals);
74
+ next.delete(id);
75
+ return next;
76
+ });
77
+ // Fire callbacks for cleanup.
78
+ if (existing.isOpen) {
79
+ existing.onClosed?.();
80
+ }
81
+ existing.onRemoved?.();
82
+ console.log('Modal removed:', id);
83
+ }
84
+ /**
85
+ * Closes all open modals.
86
+ */
87
+ closeAll() {
88
+ // Use service close to ensure removeOnClose behavior is honored.
89
+ this.modals().forEach((modal) => this.close(modal.id));
90
+ }
91
+ /**
92
+ * Removes all modals from the registry.
93
+ */
94
+ removeAll() {
95
+ // Use service remove to ensure callbacks are fired.
96
+ this.modals().forEach((modal) => this.remove(modal.id));
97
+ }
98
+ /**
99
+ * Looks up a modal by id.
100
+ * @param id Modal id.
101
+ */
102
+ getModal(id) {
103
+ return this._modals().get(id);
104
+ }
105
+ /**
106
+ * Updates the open/closed state of a modal if it exists.
107
+ * @param id Modal id.
108
+ * @param isOpen Desired open state.
109
+ */
110
+ updateModalState(id, isOpen) {
111
+ const existing = this.getModal(id);
112
+ if (!existing || existing.isOpen === isOpen)
113
+ return;
114
+ // Rebuild the modal with the new open state.
115
+ const updated = this.buildModal(id, existing, {}, isOpen);
116
+ this.upsertModal(updated);
117
+ }
118
+ /**
119
+ * Inserts or replaces a modal in the internal store.
120
+ * @param modal Modal to upsert.
121
+ */
122
+ upsertModal(modal) {
123
+ this._modals.update((modals) => new Map(modals).set(modal.id, modal));
124
+ }
125
+ /**
126
+ * Builds a modal instance by merging defaults, existing state, and options.
127
+ * @param id Modal id.
128
+ * @param existing Existing modal state (if any).
129
+ * @param options New options to apply.
130
+ * @param isOpen Optional override for open state.
131
+ */
132
+ buildModal(id, existing, options, isOpen) {
133
+ // Resolve initial open state from the override, options, existing state, or config.
134
+ const resolvedIsOpen = isOpen ??
135
+ options.startOpen ??
136
+ existing?.startOpen ??
137
+ this.config.startOpen;
138
+ // Merge config defaults, existing values, and new options.
139
+ return {
140
+ ...this.config,
141
+ ...existing,
142
+ ...options,
143
+ id,
144
+ isOpen: resolvedIsOpen,
145
+ };
146
+ }
147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
148
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, providedIn: 'root' });
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, decorators: [{
151
+ type: Injectable,
152
+ args: [{
153
+ providedIn: 'root',
154
+ }]
155
+ }] });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLHVCQUF1QixDQUFDOztBQUdsRTs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLCtEQUErRDtJQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFjLFlBQVksQ0FBQyxDQUFDO0lBRTVELG9EQUFvRDtJQUM1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsNENBQTRDO0lBQzNCLE9BQU8sR0FBRyxNQUFNLENBQXFCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVqRSxpREFBaUQ7SUFDeEMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFNUM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBSSxVQUEyQixFQUFFO1FBQ3JDLHFEQUFxRDtRQUNyRCxNQUFNLEVBQUUsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QixPQUFPO1lBQ0wsRUFBRTtZQUNGLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FB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Q0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFdBQVcsQ0FBQyxLQUFZO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxVQUFVLENBQ2hCLEVBQVUsRUFDVixRQUEyQixFQUMzQixPQUFxQixFQUNyQixNQUFnQjtRQUVoQixvRkFBb0Y7UUFDcEYsTUFBTSxjQUFjLEdBQ2xCLE1BQU07WUFDTixPQUFPLENBQUMsU0FBUztZQUNqQixRQUFRLEVBQUUsU0FBUztZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUV4QiwyREFBMkQ7UUFDM0QsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDZCxHQUFHLFFBQVE7WUFDWCxHQUFHLE9BQU87WUFDVixFQUFFO1lBQ0YsTUFBTSxFQUFFLGNBQWM7U0FDdkIsQ0FBQztJQUNKLENBQUM7d0dBOUpVLFlBQVk7NEdBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi9zY2hlbWEvbW9kYWwtcmVmJztcbmltcG9ydCB7IE1PREFMX0NPTkZJRywgTW9kYWxDb25maWcgfSBmcm9tICcuL3NjaGVtYS9tb2RhbC5jb25maWcnO1xuaW1wb3J0IHsgTW9kYWwsIE1vZGFsT3B0aW9ucyB9IGZyb20gJy4vc2NoZW1hL21vZGFsLm1vZGVsJztcblxuLyoqXG4gKiBDZW50cmFsIHJlZ2lzdHJ5IGFuZCBsaWZlY3ljbGUgbWFuYWdlciBmb3IgbW9kYWwgaW5zdGFuY2VzLlxuICpcbiAqIFRoaXMgc2VydmljZSBjcmVhdGVzIG1vZGFscywgdHJhY2tzIHRoZWlyIHN0YXRlLCBhbmQgY29vcmRpbmF0ZXNcbiAqIG9wZW4vY2xvc2UvcmVtb3ZlIGJlaGF2aW9yIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2Uge1xuICAvKiogRGVmYXVsdCBtb2RhbCBjb25maWd1cmF0aW9uIGluamVjdGVkIHZpYSBgTU9EQUxfQ09ORklHYC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3Q8TW9kYWxDb25maWc+KE1PREFMX0NPTkZJRyk7XG5cbiAgLyoqIEluY3JlbWVudGluZyBjb3VudGVyIGZvciBtb2RhbCBpZCBnZW5lcmF0aW9uLiAqL1xuICBwcml2YXRlIGlkID0gMDtcbiAgLyoqIEludGVybmFsIHN0b3JlIG9mIG1vZGFscyBrZXllZCBieSBpZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kYWxzID0gc2lnbmFsPE1hcDxzdHJpbmcsIE1vZGFsPj4obmV3IE1hcCgpKTtcblxuICAvKiogUmVhZC1vbmx5IHNpZ25hbCBvZiBhbGwgcmVnaXN0ZXJlZCBtb2RhbHMuICovXG4gIHJlYWRvbmx5IG1vZGFscyA9IHRoaXMuX21vZGFscy5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbW9kYWwgaW5zdGFuY2UgYW5kIHJlZ2lzdGVycyBpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgTW9kYWwgb3B0aW9ucyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIE1vZGFsUmVmIGZvciBjb250cm9sbGluZyB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBjcmVhdGU8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBNb2RhbFJlZiB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGlkIGFuZCBidWlsZCB0aGUgaW5pdGlhbCBtb2RhbCBzdGF0ZS5cbiAgICBjb25zdCBpZCA9IGBtb2RhbC0keysrdGhpcy5pZH1gO1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5idWlsZE1vZGFsKGlkLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIC8vIFBlcnNpc3QgdG8gdGhlIGludGVybmFsIHN0b3JlLlxuICAgIHRoaXMudXBzZXJ0TW9kYWwobW9kYWwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgb3BlbjogdGhpcy5vcGVuLmJpbmQodGhpcywgaWQpLFxuICAgICAgY2xvc2U6IHRoaXMuY2xvc2UuYmluZCh0aGlzLCBpZCksXG4gICAgICByZW1vdmU6IHRoaXMucmVtb3ZlLmJpbmQodGhpcywgaWQpLFxuICAgIH0gc2F0aXNmaWVzIE1vZGFsUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgbW9kYWwgYnkgaWQuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICovXG4gIG9wZW4oaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFNldCBvcGVuIHN0YXRlIHRvIHRydWUgaWYgbmVlZGVkLlxuICAgIHRoaXMudXBkYXRlTW9kYWxTdGF0ZShpZCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGEgbW9kYWwgYnkgaWQuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICovXG4gIGNsb3NlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0TW9kYWwoaWQpO1xuICAgIGlmICghZXhpc3Rpbmc/LmlzT3BlbikgcmV0dXJuO1xuXG4gICAgLy8gU2V0IG9wZW4gc3RhdGUgdG8gZmFsc2UgYW5kIG5vdGlmeSBjYWxsYmFja3MuXG4gICAgdGhpcy51cGRhdGVNb2RhbFN0YXRlKGlkLCBmYWxzZSk7XG4gICAgZXhpc3Rpbmcub25DbG9zZWQ/LigpO1xuICAgIGNvbnNvbGUubG9nKCdNb2RhbCBjbG9zZWQ6JywgaWQpO1xuXG4gICAgLy8gT3B0aW9uYWxseSByZW1vdmUgdGhlIG1vZGFsIGFmdGVyIGNsb3NpbmcuXG4gICAgaWYgKGV4aXN0aW5nLnJlbW92ZU9uQ2xvc2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlKGlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG1vZGFsIGZyb20gdGhlIHJlZ2lzdHJ5IGFuZCBET00uXG4gICAqIENsb3NlcyB0aGUgbW9kYWwgZmlyc3QgaWYgaXQgaXMgb3Blbi5cbiAgICogQHBhcmFtIGlkIE1vZGFsIGlkLlxuICAgKi9cbiAgcmVtb3ZlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0TW9kYWwoaWQpO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBmcm9tIHRoZSBpbnRlcm5hbCBzdG9yZS5cbiAgICB0aGlzLl9tb2RhbHMudXBkYXRlKChtb2RhbHMpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKG1vZGFscyk7XG4gICAgICBuZXh0LmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcblxuICAgIC8vIEZpcmUgY2FsbGJhY2tzIGZvciBjbGVhbnVwLlxuICAgIGlmIChleGlzdGluZy5pc09wZW4pIHtcbiAgICAgIGV4aXN0aW5nLm9uQ2xvc2VkPy4oKTtcbiAgICB9XG4gICAgZXhpc3Rpbmcub25SZW1vdmVkPy4oKTtcbiAgICBjb25zb2xlLmxvZygnTW9kYWwgcmVtb3ZlZDonLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBvcGVuIG1vZGFscy5cbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIC8vIFVzZSBzZXJ2aWNlIGNsb3NlIHRvIGVuc3VyZSByZW1vdmVPbkNsb3NlIGJlaGF2aW9yIGlzIGhvbm9yZWQuXG4gICAgdGhpcy5tb2RhbHMoKS5mb3JFYWNoKChtb2RhbCkgPT4gdGhpcy5jbG9zZShtb2RhbC5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG1vZGFscyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICovXG4gIHJlbW92ZUFsbCgpOiB2b2lkIHtcbiAgICAvLyBVc2Ugc2VydmljZSByZW1vdmUgdG8gZW5zdXJlIGNhbGxiYWNrcyBhcmUgZmlyZWQuXG4gICAgdGhpcy5tb2RhbHMoKS5mb3JFYWNoKChtb2RhbCkgPT4gdGhpcy5yZW1vdmUobW9kYWwuaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyB1cCBhIG1vZGFsIGJ5IGlkLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQuXG4gICAqL1xuICBwcml2YXRlIGdldE1vZGFsKGlkOiBzdHJpbmcpOiBNb2RhbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGFscygpLmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgb3Blbi9jbG9zZWQgc3RhdGUgb2YgYSBtb2RhbCBpZiBpdCBleGlzdHMuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICogQHBhcmFtIGlzT3BlbiBEZXNpcmVkIG9wZW4gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU1vZGFsU3RhdGUoaWQ6IHN0cmluZywgaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldE1vZGFsKGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLmlzT3BlbiA9PT0gaXNPcGVuKSByZXR1cm47XG5cbiAgICAvLyBSZWJ1aWxkIHRoZSBtb2RhbCB3aXRoIHRoZSBuZXcgb3BlbiBzdGF0ZS5cbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5idWlsZE1vZGFsKGlkLCBleGlzdGluZywge30sIGlzT3Blbik7XG4gICAgdGhpcy51cHNlcnRNb2RhbCh1cGRhdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIG9yIHJlcGxhY2VzIGEgbW9kYWwgaW4gdGhlIGludGVybmFsIHN0b3JlLlxuICAgKiBAcGFyYW0gbW9kYWwgTW9kYWwgdG8gdXBzZXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSB1cHNlcnRNb2RhbChtb2RhbDogTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbHMudXBkYXRlKChtb2RhbHMpID0+IG5ldyBNYXAobW9kYWxzKS5zZXQobW9kYWwuaWQsIG1vZGFsKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgbW9kYWwgaW5zdGFuY2UgYnkgbWVyZ2luZyBkZWZhdWx0cywgZXhpc3Rpbmcgc3RhdGUsIGFuZCBvcHRpb25zLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQuXG4gICAqIEBwYXJhbSBleGlzdGluZyBFeGlzdGluZyBtb2RhbCBzdGF0ZSAoaWYgYW55KS5cbiAgICogQHBhcmFtIG9wdGlvbnMgTmV3IG9wdGlvbnMgdG8gYXBwbHkuXG4gICAqIEBwYXJhbSBpc09wZW4gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIG9wZW4gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTW9kYWwoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBleGlzdGluZzogTW9kYWwgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogTW9kYWxPcHRpb25zLFxuICAgIGlzT3Blbj86IGJvb2xlYW4sXG4gICk6IE1vZGFsIHtcbiAgICAvLyBSZXNvbHZlIGluaXRpYWwgb3BlbiBzdGF0ZSBmcm9tIHRoZSBvdmVycmlkZSwgb3B0aW9ucywgZXhpc3Rpbmcgc3RhdGUsIG9yIGNvbmZpZy5cbiAgICBjb25zdCByZXNvbHZlZElzT3BlbiA9XG4gICAgICBpc09wZW4gPz9cbiAgICAgIG9wdGlvbnMuc3RhcnRPcGVuID8/XG4gICAgICBleGlzdGluZz8uc3RhcnRPcGVuID8/XG4gICAgICB0aGlzLmNvbmZpZy5zdGFydE9wZW47XG5cbiAgICAvLyBNZXJnZSBjb25maWcgZGVmYXVsdHMsIGV4aXN0aW5nIHZhbHVlcywgYW5kIG5ldyBvcHRpb25zLlxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGlkLFxuICAgICAgaXNPcGVuOiByZXNvbHZlZElzT3BlbixcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ import { makeEnvironmentProviders, provideAppInitializer, } from '@angular/core';
2
+ import { bootstrapGlobalComponent } from '../utils/bootstrap-global-component';
3
+ import { ModalHostComponent } from './components/modal-host/modal-host.component';
4
+ import { DEFAULT_MODAL_CONFIG, MODAL_CONFIG, } from './schema/modal.config';
5
+ /**
6
+ * Provides modal configuration defaults and bootstraps the global modal host.
7
+ *
8
+ * @param config Optional config overrides applied on top of defaults.
9
+ * @returns EnvironmentProviders to register in application providers.
10
+ */
11
+ export function provideModal(config = {}) {
12
+ return makeEnvironmentProviders([
13
+ {
14
+ provide: MODAL_CONFIG,
15
+ useFactory: () => ({
16
+ ...DEFAULT_MODAL_CONFIG,
17
+ ...(config ?? {}),
18
+ }),
19
+ },
20
+ provideAppInitializer(() => {
21
+ bootstrapGlobalComponent(ModalHostComponent, { reuseIfExists: true });
22
+ }),
23
+ ]);
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1tb2RhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvcHJvdmlkZS1tb2RhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksR0FFYixNQUFNLHVCQUF1QixDQUFDO0FBRS9COzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsU0FBK0IsRUFBRTtJQUVqQyxPQUFPLHdCQUF3QixDQUFDO1FBQzlCO1lBQ0UsT0FBTyxFQUFFLFlBQVk7WUFDckIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ2pCLEdBQUcsb0JBQW9CO2dCQUN2QixHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQzthQUNsQixDQUFDO1NBQ0g7UUFDRCxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDekIsd0JBQXdCLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUM7S0FDSCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGJvb3RzdHJhcEdsb2JhbENvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL2Jvb3RzdHJhcC1nbG9iYWwtY29tcG9uZW50JztcbmltcG9ydCB7IE1vZGFsSG9zdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb2RhbC1ob3N0L21vZGFsLWhvc3QuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIERFRkFVTFRfTU9EQUxfQ09ORklHLFxuICBNT0RBTF9DT05GSUcsXG4gIE1vZGFsQ29uZmlnLFxufSBmcm9tICcuL3NjaGVtYS9tb2RhbC5jb25maWcnO1xuXG4vKipcbiAqIFByb3ZpZGVzIG1vZGFsIGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMgYW5kIGJvb3RzdHJhcHMgdGhlIGdsb2JhbCBtb2RhbCBob3N0LlxuICpcbiAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlnIG92ZXJyaWRlcyBhcHBsaWVkIG9uIHRvcCBvZiBkZWZhdWx0cy5cbiAqIEByZXR1cm5zIEVudmlyb25tZW50UHJvdmlkZXJzIHRvIHJlZ2lzdGVyIGluIGFwcGxpY2F0aW9uIHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVNb2RhbChcbiAgY29uZmlnOiBQYXJ0aWFsPE1vZGFsQ29uZmlnPiA9IHt9LFxuKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBNT0RBTF9DT05GSUcsXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiAoe1xuICAgICAgICAuLi5ERUZBVUxUX01PREFMX0NPTkZJRyxcbiAgICAgICAgLi4uKGNvbmZpZyA/PyB7fSksXG4gICAgICB9KSxcbiAgICB9LFxuICAgIHByb3ZpZGVBcHBJbml0aWFsaXplcigoKSA9PiB7XG4gICAgICBib290c3RyYXBHbG9iYWxDb21wb25lbnQoTW9kYWxIb3N0Q29tcG9uZW50LCB7IHJldXNlSWZFeGlzdHM6IHRydWUgfSk7XG4gICAgfSksXG4gIF0pO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9tb2RhbC9zY2hlbWEvbW9kYWwtcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE1vZGFsUmVmIHtcbiAgLyoqIFVuaXF1ZSBpZCBmb3IgdGhlIG1vZGFsIGluc3RhbmNlLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogT3BlbnMgdGhlIG1vZGFsIGluc3RhbmNlLiAqL1xuICBvcGVuOiAoKSA9PiB2b2lkO1xuICAvKiogQ2xvc2VzIHRoZSBtb2RhbCBpbnN0YW5jZS4gKi9cbiAgY2xvc2U6ICgpID0+IHZvaWQ7XG4gIC8qKiBSZW1vdmVzIHRoZSBtb2RhbCBpbnN0YW5jZSBmcm9tIHRoZSBET00uICovXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /** Injection token for modal configuration defaults. */
3
+ export const MODAL_CONFIG = new InjectionToken('ModalConfig');
4
+ /** Default modal configuration. */
5
+ export const DEFAULT_MODAL_CONFIG = {
6
+ size: 'md',
7
+ actionsPosition: 'static',
8
+ prevent: false,
9
+ closable: true,
10
+ alertDialog: 'dialog',
11
+ lazy: false,
12
+ startOpen: true,
13
+ removeOnClose: true,
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9tb2RhbC9zY2hlbWEvbW9kYWwuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUE4Qi9DLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQWMsYUFBYSxDQUFDLENBQUM7QUFFM0UsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUEwQjtJQUN6RCxJQUFJLEVBQUUsSUFBSTtJQUNWLGVBQWUsRUFBRSxRQUFRO0lBQ3pCLE9BQU8sRUFBRSxLQUFLO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxXQUFXLEVBQUUsUUFBUTtJQUNyQixJQUFJLEVBQUUsS0FBSztJQUNYLFNBQVMsRUFBRSxJQUFJO0lBQ2YsYUFBYSxFQUFFLElBQUk7Q0FDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBNb2RhbEFjdGlvbnNQb3NpdGlvbixcbiAgTW9kYWxBbGVydERpYWxvZ1JvbGUsXG4gIE1vZGFsU2l6ZSxcbn0gZnJvbSAnLi9tb2RhbC50eXBlcyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiB1c2VkIGJ5IHRoZSBtb2RhbCBzZXJ2aWNlIHdoZW4gY3JlYXRpbmcgbW9kYWxzLlxuICogSW5kaXZpZHVhbCBtb2RhbCBvcHRpb25zIGNhbiBvdmVycmlkZSBhbnkgb2YgdGhlc2UgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGFsQ29uZmlnIHtcbiAgLyoqIFNpemUgb2YgdGhlIG1vZGFsIGRpYWxvZy4gKi9cbiAgc2l6ZTogTW9kYWxTaXplO1xuICAvKiogUG9zaXRpb25pbmcgYmVoYXZpb3IgZm9yIHRoZSBhY3Rpb25zIGFyZWEuICovXG4gIGFjdGlvbnNQb3NpdGlvbjogTW9kYWxBY3Rpb25zUG9zaXRpb247XG4gIC8qKiBQcmV2ZW50IGNsb3Npbmcgd2hlbiBjbGlja2luZyB0aGUgb3ZlcmxheS4gKi9cbiAgcHJldmVudDogYm9vbGVhbjtcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgY2xvc2UgW1hdIGJ1dHRvbi4gKi9cbiAgY2xvc2FibGU6IGJvb2xlYW47XG4gIC8qKiBBUklBIHJvbGUgZm9yIHRoZSBtb2RhbCBlbGVtZW50LiAqL1xuICBhbGVydERpYWxvZzogTW9kYWxBbGVydERpYWxvZ1JvbGU7XG4gIC8qKiBJZiB0cnVlLCBjb250ZW50IGlzIG9ubHkgcmVuZGVyZWQgd2hpbGUgb3Blbi4gKi9cbiAgbGF6eTogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBtb2RhbCBzdGFydHMgb3BlbiAqL1xuICBzdGFydE9wZW46IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgbW9kYWwgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBET00gb24gY2xvc2UgKi9cbiAgcmVtb3ZlT25DbG9zZTogYm9vbGVhbjtcbn1cblxuLyoqIEluamVjdGlvbiB0b2tlbiBmb3IgbW9kYWwgY29uZmlndXJhdGlvbiBkZWZhdWx0cy4gKi9cbmV4cG9ydCBjb25zdCBNT0RBTF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48TW9kYWxDb25maWc+KCdNb2RhbENvbmZpZycpO1xuXG4vKiogRGVmYXVsdCBtb2RhbCBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9EQUxfQ09ORklHOiBSZXF1aXJlZDxNb2RhbENvbmZpZz4gPSB7XG4gIHNpemU6ICdtZCcsXG4gIGFjdGlvbnNQb3NpdGlvbjogJ3N0YXRpYycsXG4gIHByZXZlbnQ6IGZhbHNlLFxuICBjbG9zYWJsZTogdHJ1ZSxcbiAgYWxlcnREaWFsb2c6ICdkaWFsb2cnLFxuICBsYXp5OiBmYWxzZSxcbiAgc3RhcnRPcGVuOiB0cnVlLFxuICByZW1vdmVPbkNsb3NlOiB0cnVlLFxufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL21vZGFsL3NjaGVtYS9tb2RhbC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudElucHV0cyxcbiAgQ29tcG9uZW50T3V0cHV0cyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvYW5ndWxhci1jb21wb25lbnQtaW8nO1xuaW1wb3J0IHsgTW9kYWxDb25maWcgfSBmcm9tICcuL21vZGFsLmNvbmZpZyc7XG5pbXBvcnQgeyBNb2RhbEJ1dHRvbiB9IGZyb20gJy4vbW9kYWwudHlwZXMnO1xuXG4vKiogQ29tcG9uZW50LWJhc2VkIG1vZGFsIGJvZHkgd2l0aCB0eXBlZCBpbnB1dHMvb3V0cHV0cy4gKi9cbmV4cG9ydCB0eXBlIE1vZGFsQ29tcG9uZW50Qm9keTxUID0gdW5rbm93bj4gPSB7XG4gIGNvbXBvbmVudDogVHlwZTxUPjtcbiAgaW5wdXRzOiBDb21wb25lbnRJbnB1dHM8VD47XG4gIG91dHB1dHM/OiBDb21wb25lbnRPdXRwdXRzPFQ+O1xufTtcblxuLyoqIFVuaW9uIG9mIHN1cHBvcnRlZCBtb2RhbCBib2R5IHR5cGVzLiAqL1xuZXhwb3J0IHR5cGUgTW9kYWxCb2R5PFQgPSB1bmtub3duPiA9XG4gIHwgc3RyaW5nXG4gIHwgVGVtcGxhdGVSZWY8dW5rbm93bj5cbiAgfCBNb2RhbENvbXBvbmVudEJvZHk8VD47XG5cbi8qKiBQdWJsaWMgb3B0aW9ucyB1c2VkIHdoZW4gY3JlYXRpbmcgYSBtb2RhbC4gKi9cbmV4cG9ydCB0eXBlIE1vZGFsT3B0aW9uczxUID0gdW5rbm93bj4gPSBQYXJ0aWFsPE1vZGFsQ29uZmlnPiAmIHtcbiAgc2VsZWN0b3I/OiBzdHJpbmc7XG4gIHJlZmVyZW5jZUVsPzogSFRNTEVsZW1lbnQ7XG4gIGhlYWRlcj86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICBib2R5PzogTW9kYWxCb2R5PFQ+O1xuICBidXR0b25zPzogTW9kYWxCdXR0b25bXTtcbiAgLyoqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIG1vZGFsIGlzIGNsb3NlZCAodXNlciBvciBwcm9ncmFtbWF0aWMpLiAqL1xuICBvbkNsb3NlZD86ICgpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBtb2RhbCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4gKi9cbiAgb25SZW1vdmVkPzogKCkgPT4gdm9pZDtcbn07XG5cbi8qKiBSdW50aW1lIG1vZGFsIHN0YXRlIHN0b3JlZCBieSB0aGUgc2VydmljZS4gKi9cbmV4cG9ydCB0eXBlIE1vZGFsID0gUmVxdWlyZWQ8TW9kYWxDb25maWc+ICZcbiAgT21pdDxNb2RhbE9wdGlvbnM8dW5rbm93bj4sIGtleW9mIE1vZGFsQ29uZmlnPiAmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGlzT3BlbjogYm9vbGVhbjtcbiAgfTtcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ /** Pure domain/UI types for modal components. */
2
+ export {};
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL21vZGFsL3NjaGVtYS9tb2RhbC50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpREFBaUQiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUHVyZSBkb21haW4vVUkgdHlwZXMgZm9yIG1vZGFsIGNvbXBvbmVudHMuICovXG5cbi8qKiBTdXBwb3J0ZWQgbW9kYWwgc2l6ZXMuICovXG5leHBvcnQgdHlwZSBNb2RhbFNpemUgPSAnbGcnIHwgJ21kJyB8ICdzbScgfCAneHMnO1xuLyoqIFBvc2l0aW9uaW5nIGJlaGF2aW9yIGZvciB0aGUgYWN0aW9ucyBzbG90LiAqL1xuZXhwb3J0IHR5cGUgTW9kYWxBY3Rpb25zUG9zaXRpb24gPSAnc3RpY2t5JyB8ICdzdGF0aWMnO1xuLyoqIEFSSUEgcm9sZSB1c2VkIGJ5IHRoZSBtb2RhbCBmb3IgYWNjZXNzaWJpbGl0eS4gKi9cbmV4cG9ydCB0eXBlIE1vZGFsQWxlcnREaWFsb2dSb2xlID0gJ2RpYWxvZycgfCAnYWxlcnRkaWFsb2cnO1xuXG4vKiogRGVzY3JpcHRvciBmb3IgYSBidXR0b24gcmVuZGVyZWQgaW4gdGhlIG1vZGFsIGFjdGlvbnMgYXJlYS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxCdXR0b24ge1xuICAvKiogQnV0dG9uIGxhYmVsIHRleHQuICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIFZpc3VhbCB2YXJpYW50IGZvciB0aGUgYnV0dG9uLiAqL1xuICB2YXJpYW50PzogJ3ByaW1hcnknIHwgJ3NlY29uZGFyeScgfCAnc3VjY2VzcycgfCAnZGFuZ2VyJztcbiAgLyoqIFNpemUgb2YgdGhlIGJ1dHRvbi4gKi9cbiAgc2l6ZT86ICd4cycgfCAnc20nIHwgJ21kJyB8ICdsZyc7XG4gIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gaXMgZGlzYWJsZWQuICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGNsaWNraW5nIHRyaWdnZXJzIG1vZGFsIGRpc21pc3NhbC4gKi9cbiAgZGlzbWlzcz86IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBjbGljayBoYW5kbGVyIChzeW5jIG9yIGFzeW5jKS4gKi9cbiAgb25DbGljaz86ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuIl19
@@ -2,6 +2,12 @@ import { makeEnvironmentProviders, provideAppInitializer, } from '@angular/core'
2
2
  import { bootstrapGlobalComponent } from '../utils/bootstrap-global-component';
3
3
  import { ToastComponent } from './toast.component';
4
4
  import { DEFAULT_TOAST_CONFIG, TOAST_CONFIG, } from './toast.config';
5
+ /**
6
+ * Provides toast configuration defaults and bootstraps the global toast host.
7
+ *
8
+ * @param config Optional config overrides applied on top of defaults.
9
+ * @returns EnvironmentProviders to register in application providers.
10
+ */
5
11
  export function provideToast(config = {}) {
6
12
  return makeEnvironmentProviders([
7
13
  {
@@ -16,4 +22,4 @@ export function provideToast(config = {}) {
16
22
  }),
17
23
  ]);
18
24
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS10b2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvcHJvdmlkZS10b2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEdBRWIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLFVBQVUsWUFBWSxDQUMxQixTQUErQixFQUFFO0lBRWpDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsWUFBWTtZQUNyQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakIsR0FBRyxvQkFBb0I7Z0JBQ3ZCLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO2FBQ2xCLENBQUM7U0FDSDtRQUNELHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUN6Qix3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUM7S0FDSCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGJvb3RzdHJhcEdsb2JhbENvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL2Jvb3RzdHJhcC1nbG9iYWwtY29tcG9uZW50JztcbmltcG9ydCB7IFRvYXN0Q29tcG9uZW50IH0gZnJvbSAnLi90b2FzdC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UT0FTVF9DT05GSUcsXG4gIFRPQVNUX0NPTkZJRyxcbiAgVG9hc3RDb25maWcsXG59IGZyb20gJy4vdG9hc3QuY29uZmlnJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVUb2FzdChcbiAgY29uZmlnOiBQYXJ0aWFsPFRvYXN0Q29uZmlnPiA9IHt9XG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRPQVNUX0NPTkZJRyxcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+ICh7XG4gICAgICAgIC4uLkRFRkFVTFRfVE9BU1RfQ09ORklHLFxuICAgICAgICAuLi4oY29uZmlnID8/IHt9KSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+IHtcbiAgICAgIGJvb3RzdHJhcEdsb2JhbENvbXBvbmVudChUb2FzdENvbXBvbmVudCwgeyByZXVzZUlmRXhpc3RzOiB0cnVlIH0pO1xuICAgIH0pLFxuICBdKTtcbn1cbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS10b2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvcHJvdmlkZS10b2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEdBRWIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4Qjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLFNBQStCLEVBQUU7SUFFakMsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QjtZQUNFLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQixHQUFHLG9CQUFvQjtnQkFDdkIsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7YUFDbEIsQ0FBQztTQUNIO1FBQ0QscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQ3pCLHdCQUF3QixDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQztLQUNILENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxuICBwcm92aWRlQXBwSW5pdGlhbGl6ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYm9vdHN0cmFwR2xvYmFsQ29tcG9uZW50IH0gZnJvbSAnLi4vdXRpbHMvYm9vdHN0cmFwLWdsb2JhbC1jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9hc3RDb21wb25lbnQgfSBmcm9tICcuL3RvYXN0LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBERUZBVUxUX1RPQVNUX0NPTkZJRyxcbiAgVE9BU1RfQ09ORklHLFxuICBUb2FzdENvbmZpZyxcbn0gZnJvbSAnLi90b2FzdC5jb25maWcnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHRvYXN0IGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMgYW5kIGJvb3RzdHJhcHMgdGhlIGdsb2JhbCB0b2FzdCBob3N0LlxuICpcbiAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlnIG92ZXJyaWRlcyBhcHBsaWVkIG9uIHRvcCBvZiBkZWZhdWx0cy5cbiAqIEByZXR1cm5zIEVudmlyb25tZW50UHJvdmlkZXJzIHRvIHJlZ2lzdGVyIGluIGFwcGxpY2F0aW9uIHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVUb2FzdChcbiAgY29uZmlnOiBQYXJ0aWFsPFRvYXN0Q29uZmlnPiA9IHt9LFxuKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBUT0FTVF9DT05GSUcsXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiAoe1xuICAgICAgICAuLi5ERUZBVUxUX1RPQVNUX0NPTkZJRyxcbiAgICAgICAgLi4uKGNvbmZpZyA/PyB7fSksXG4gICAgICB9KSxcbiAgICB9LFxuICAgIHByb3ZpZGVBcHBJbml0aWFsaXplcigoKSA9PiB7XG4gICAgICBib290c3RyYXBHbG9iYWxDb21wb25lbnQoVG9hc3RDb21wb25lbnQsIHsgcmV1c2VJZkV4aXN0czogdHJ1ZSB9KTtcbiAgICB9KSxcbiAgXSk7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1jb21wb25lbnQtaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL3V0aWxzL2FuZ3VsYXItY29tcG9uZW50LWlvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnB1dFNpZ25hbCwgT3V0cHV0RW1pdHRlclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKiArLS0tLS0tLS0rICovXG4vKiB8IElOUFVUUyB8ICovXG4vKiArLS0tLS0tLS0rICovXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGlubmVyIHZhbHVlIHR5cGUgZnJvbSBhbiBJbnB1dFNpZ25hbC5cbiAqIEV4YW1wbGU6IElucHV0U2lnbmFsPHN0cmluZz4gLT4gc3RyaW5nXG4gKi9cbnR5cGUgRXh0cmFjdElucHV0VmFsdWU8VD4gPSBUIGV4dGVuZHMgSW5wdXRTaWduYWw8aW5mZXIgVj4gPyBWIDogbmV2ZXI7XG5cbi8qKlxuICogR2V0cyBhbGwgcHJvcGVydHkga2V5cyB0aGF0IGFyZSByZXF1aXJlZCBpbnB1dCBzaWduYWxzIChgaW5wdXQucmVxdWlyZWQ8VD4oKWApLlxuICogVGhlc2UgYXJlIElucHV0U2lnbmFscyB3aGVyZSBgdW5kZWZpbmVkYCBpcyBOT1QgcGFydCBvZiB0aGUgdmFsdWUgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVxdWlyZWRJbnB1dEtleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgSW5wdXRTaWduYWw8aW5mZXIgVj5cbiAgICA/IHVuZGVmaW5lZCBleHRlbmRzIFZcbiAgICAgID8gbmV2ZXJcbiAgICAgIDogS1xuICAgIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vKipcbiAqIEdldHMgYWxsIHByb3BlcnR5IGtleXMgdGhhdCBhcmUgb3B0aW9uYWwgaW5wdXQgc2lnbmFscyAoYGlucHV0PFQgfCB1bmRlZmluZWQ+KClgKS5cbiAqIFRoZXNlIGFyZSBJbnB1dFNpZ25hbHMgd2hlcmUgYHVuZGVmaW5lZGAgSVMgcGFydCBvZiB0aGUgdmFsdWUgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uYWxJbnB1dEtleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgSW5wdXRTaWduYWw8aW5mZXIgVj5cbiAgICA/IHVuZGVmaW5lZCBleHRlbmRzIFZcbiAgICAgID8gS1xuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlIHJlcHJlc2VudGluZyB0aGUgaW5wdXQgdmFsdWVzIGZvciBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAqIC0gUmVxdWlyZWQgaW5wdXRzIChgaW5wdXQucmVxdWlyZWQ8VD4oKWApIGJlY29tZSByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gKiAtIE9wdGlvbmFsIGlucHV0cyAoYGlucHV0PFQgfCB1bmRlZmluZWQ+KClgKSBiZWNvbWUgb3B0aW9uYWwgcHJvcGVydGllc1xuICogLSBOb24taW5wdXQgcHJvcGVydGllcyBhcmUgZXhjbHVkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgTXlDb21wb25lbnQge1xuICogICBuYW1lID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuICogICBhZ2UgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG4gKiB9XG4gKlxuICogdHlwZSBJbnB1dHMgPSBDb21wb25lbnRJbnB1dHM8TXlDb21wb25lbnQ+O1xuICogLy8geyBuYW1lOiBzdHJpbmc7IGFnZT86IG51bWJlciB8IHVuZGVmaW5lZCB9XG4gKi9cbmV4cG9ydCB0eXBlIENvbXBvbmVudElucHV0czxUPiA9IHtcbiAgW0sgaW4gUmVxdWlyZWRJbnB1dEtleXM8VD5dOiBFeHRyYWN0SW5wdXRWYWx1ZTxUW0tdPjtcbn0gJiB7XG4gIFtLIGluIE9wdGlvbmFsSW5wdXRLZXlzPFQ+XT86IEV4dHJhY3RJbnB1dFZhbHVlPFRbS10+O1xufTtcblxuLyogKy0tLS0tLS0tLSsgKi9cbi8qIHwgT1VUUFVUUyB8ICovXG4vKiArLS0tLS0tLS0tKyAqL1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBpbm5lciB2YWx1ZSB0eXBlIGZyb20gYW4gT3V0cHV0RW1pdHRlclJlZi5cbiAqIEV4YW1wbGU6IE91dHB1dEVtaXR0ZXJSZWY8c3RyaW5nPiAtPiBzdHJpbmdcbiAqL1xudHlwZSBFeHRyYWN0T3V0cHV0VmFsdWU8VD4gPSBUIGV4dGVuZHMgT3V0cHV0RW1pdHRlclJlZjxpbmZlciBWPiA/IFYgOiBuZXZlcjtcblxuLyoqXG4gKiBHZXRzIGFsbCBwcm9wZXJ0eSBrZXlzIHRoYXQgYXJlIG91dHB1dCBzaWduYWxzIChgb3V0cHV0PFQ+KClgKS5cbiAqL1xudHlwZSBPdXRwdXRLZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIE91dHB1dEVtaXR0ZXJSZWY8dW5rbm93bj4gPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlIHJlcHJlc2VudGluZyB0aGUgb3V0cHV0IGV2ZW50IGhhbmRsZXJzIGZvciBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAqIENvbnZlcnRzIG91dHB1dCBzaWduYWxzIGludG8gY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXQgcmVjZWl2ZSB0aGUgZW1pdHRlZCB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgTXlDb21wb25lbnQge1xuICogICBjbG9zZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAqICAgdmFsdWVDaGFuZ2VkID0gb3V0cHV0PHN0cmluZz4oKTtcbiAqICAgbm90QW5PdXRwdXQgPSAncmVndWxhciBwcm9wZXJ0eSc7XG4gKiB9XG4gKlxuICogdHlwZSBPdXRwdXRzID0gQ29tcG9uZW50T3V0cHV0czxNeUNvbXBvbmVudD47XG4gKiAvLyB7IGNsb3NlZD86ICgpID0+IHZvaWQ7IHZhbHVlQ2hhbmdlZD86ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkIH1cbiAqL1xuZXhwb3J0IHR5cGUgQ29tcG9uZW50T3V0cHV0czxUPiA9IHtcbiAgW0sgaW4gT3V0cHV0S2V5czxUPl0/OiAodmFsdWU6IEV4dHJhY3RPdXRwdXRWYWx1ZTxUW0tdPikgPT4gdm9pZDtcbn07XG4iXX0=
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, EnvironmentProviders } from '@angular/core';
2
+ import { InjectionToken, EnvironmentProviders, InputSignal, OutputEmitterRef, TemplateRef, Type } from '@angular/core';
3
3
  import z$1, { z } from 'zod';
4
4
  import { zx } from '@traversable/zod';
5
5
  import { Subject } from 'rxjs';
@@ -47,6 +47,12 @@ interface ToastConfig {
47
47
  declare const TOAST_CONFIG: InjectionToken<ToastConfig>;
48
48
  declare const DEFAULT_TOAST_CONFIG: Required<ToastConfig>;
49
49
 
50
+ /**
51
+ * Provides toast configuration defaults and bootstraps the global toast host.
52
+ *
53
+ * @param config Optional config overrides applied on top of defaults.
54
+ * @returns EnvironmentProviders to register in application providers.
55
+ */
50
56
  declare function provideToast(config?: Partial<ToastConfig>): EnvironmentProviders;
51
57
 
52
58
  /**
@@ -236,6 +242,242 @@ declare class ToastService {
236
242
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ToastService>;
237
243
  }
238
244
 
245
+ interface ModalRef {
246
+ /** Unique id for the modal instance. */
247
+ id: string;
248
+ /** Opens the modal instance. */
249
+ open: () => void;
250
+ /** Closes the modal instance. */
251
+ close: () => void;
252
+ /** Removes the modal instance from the DOM. */
253
+ remove: () => void;
254
+ }
255
+
256
+ /**
257
+ * Extracts the inner value type from an InputSignal.
258
+ * Example: InputSignal<string> -> string
259
+ */
260
+ type ExtractInputValue<T> = T extends InputSignal<infer V> ? V : never;
261
+ /**
262
+ * Gets all property keys that are required input signals (`input.required<T>()`).
263
+ * These are InputSignals where `undefined` is NOT part of the value type.
264
+ */
265
+ type RequiredInputKeys<T> = {
266
+ [K in keyof T]: T[K] extends InputSignal<infer V> ? undefined extends V ? never : K : never;
267
+ }[keyof T];
268
+ /**
269
+ * Gets all property keys that are optional input signals (`input<T | undefined>()`).
270
+ * These are InputSignals where `undefined` IS part of the value type.
271
+ */
272
+ type OptionalInputKeys<T> = {
273
+ [K in keyof T]: T[K] extends InputSignal<infer V> ? undefined extends V ? K : never : never;
274
+ }[keyof T];
275
+ /**
276
+ * Creates a type representing the input values for an Angular component.
277
+ * - Required inputs (`input.required<T>()`) become required properties
278
+ * - Optional inputs (`input<T | undefined>()`) become optional properties
279
+ * - Non-input properties are excluded
280
+ *
281
+ * @example
282
+ * class MyComponent {
283
+ * name = input.required<string>();
284
+ * age = input<number | undefined>();
285
+ * }
286
+ *
287
+ * type Inputs = ComponentInputs<MyComponent>;
288
+ * // { name: string; age?: number | undefined }
289
+ */
290
+ type ComponentInputs<T> = {
291
+ [K in RequiredInputKeys<T>]: ExtractInputValue<T[K]>;
292
+ } & {
293
+ [K in OptionalInputKeys<T>]?: ExtractInputValue<T[K]>;
294
+ };
295
+ /**
296
+ * Extracts the inner value type from an OutputEmitterRef.
297
+ * Example: OutputEmitterRef<string> -> string
298
+ */
299
+ type ExtractOutputValue<T> = T extends OutputEmitterRef<infer V> ? V : never;
300
+ /**
301
+ * Gets all property keys that are output signals (`output<T>()`).
302
+ */
303
+ type OutputKeys<T> = {
304
+ [K in keyof T]: T[K] extends OutputEmitterRef<unknown> ? K : never;
305
+ }[keyof T];
306
+ /**
307
+ * Creates a type representing the output event handlers for an Angular component.
308
+ * Converts output signals into callback functions that receive the emitted value.
309
+ *
310
+ * @example
311
+ * class MyComponent {
312
+ * closed = output<void>();
313
+ * valueChanged = output<string>();
314
+ * notAnOutput = 'regular property';
315
+ * }
316
+ *
317
+ * type Outputs = ComponentOutputs<MyComponent>;
318
+ * // { closed?: () => void; valueChanged?: (value: string) => void }
319
+ */
320
+ type ComponentOutputs<T> = {
321
+ [K in OutputKeys<T>]?: (value: ExtractOutputValue<T[K]>) => void;
322
+ };
323
+
324
+ /** Pure domain/UI types for modal components. */
325
+ /** Supported modal sizes. */
326
+ type ModalSize = 'lg' | 'md' | 'sm' | 'xs';
327
+ /** Positioning behavior for the actions slot. */
328
+ type ModalActionsPosition = 'sticky' | 'static';
329
+ /** ARIA role used by the modal for accessibility. */
330
+ type ModalAlertDialogRole = 'dialog' | 'alertdialog';
331
+ /** Descriptor for a button rendered in the modal actions area. */
332
+ interface ModalButton {
333
+ /** Button label text. */
334
+ text: string;
335
+ /** Visual variant for the button. */
336
+ variant?: 'primary' | 'secondary' | 'success' | 'danger';
337
+ /** Size of the button. */
338
+ size?: 'xs' | 'sm' | 'md' | 'lg';
339
+ /** Whether the button is disabled. */
340
+ disabled?: boolean;
341
+ /** If true, clicking triggers modal dismissal. */
342
+ dismiss?: boolean;
343
+ /** Optional click handler (sync or async). */
344
+ onClick?: () => void | Promise<void>;
345
+ }
346
+
347
+ /**
348
+ * Configuration used by the modal service when creating modals.
349
+ * Individual modal options can override any of these values.
350
+ */
351
+ interface ModalConfig {
352
+ /** Size of the modal dialog. */
353
+ size: ModalSize;
354
+ /** Positioning behavior for the actions area. */
355
+ actionsPosition: ModalActionsPosition;
356
+ /** Prevent closing when clicking the overlay. */
357
+ prevent: boolean;
358
+ /** Show or hide the close [X] button. */
359
+ closable: boolean;
360
+ /** ARIA role for the modal element. */
361
+ alertDialog: ModalAlertDialogRole;
362
+ /** If true, content is only rendered while open. */
363
+ lazy: boolean;
364
+ /** Whether a modal starts open */
365
+ startOpen: boolean;
366
+ /** Whether a modal should be removed from DOM on close */
367
+ removeOnClose: boolean;
368
+ }
369
+ /** Injection token for modal configuration defaults. */
370
+ declare const MODAL_CONFIG: InjectionToken<ModalConfig>;
371
+ /** Default modal configuration. */
372
+ declare const DEFAULT_MODAL_CONFIG: Required<ModalConfig>;
373
+
374
+ /** Component-based modal body with typed inputs/outputs. */
375
+ type ModalComponentBody<T = unknown> = {
376
+ component: Type<T>;
377
+ inputs: ComponentInputs<T>;
378
+ outputs?: ComponentOutputs<T>;
379
+ };
380
+ /** Union of supported modal body types. */
381
+ type ModalBody<T = unknown> = string | TemplateRef<unknown> | ModalComponentBody<T>;
382
+ /** Public options used when creating a modal. */
383
+ type ModalOptions<T = unknown> = Partial<ModalConfig> & {
384
+ selector?: string;
385
+ referenceEl?: HTMLElement;
386
+ header?: string | TemplateRef<unknown>;
387
+ body?: ModalBody<T>;
388
+ buttons?: ModalButton[];
389
+ /** Callback fired when the modal is closed (user or programmatic). */
390
+ onClosed?: () => void;
391
+ /** Callback fired when the modal is removed from the DOM. */
392
+ onRemoved?: () => void;
393
+ };
394
+ /** Runtime modal state stored by the service. */
395
+ type Modal = Required<ModalConfig> & Omit<ModalOptions<unknown>, keyof ModalConfig> & {
396
+ id: string;
397
+ isOpen: boolean;
398
+ };
399
+
400
+ /**
401
+ * Central registry and lifecycle manager for modal instances.
402
+ *
403
+ * This service creates modals, tracks their state, and coordinates
404
+ * open/close/remove behavior across the application.
405
+ */
406
+ declare class ModalService {
407
+ /** Default modal configuration injected via `MODAL_CONFIG`. */
408
+ private readonly config;
409
+ /** Incrementing counter for modal id generation. */
410
+ private id;
411
+ /** Internal store of modals keyed by id. */
412
+ private readonly _modals;
413
+ /** Read-only signal of all registered modals. */
414
+ readonly modals: _angular_core.Signal<Map<string, Modal>>;
415
+ /**
416
+ * Creates a new modal instance and registers it.
417
+ * @param options Modal options used to initialize the instance.
418
+ * @returns A ModalRef for controlling the instance.
419
+ */
420
+ create<T>(options?: ModalOptions<T>): ModalRef;
421
+ /**
422
+ * Opens a modal by id.
423
+ * @param id Modal id.
424
+ */
425
+ open(id: string): void;
426
+ /**
427
+ * Closes a modal by id.
428
+ * @param id Modal id.
429
+ */
430
+ close(id: string): void;
431
+ /**
432
+ * Removes a modal from the registry and DOM.
433
+ * Closes the modal first if it is open.
434
+ * @param id Modal id.
435
+ */
436
+ remove(id: string): void;
437
+ /**
438
+ * Closes all open modals.
439
+ */
440
+ closeAll(): void;
441
+ /**
442
+ * Removes all modals from the registry.
443
+ */
444
+ removeAll(): void;
445
+ /**
446
+ * Looks up a modal by id.
447
+ * @param id Modal id.
448
+ */
449
+ private getModal;
450
+ /**
451
+ * Updates the open/closed state of a modal if it exists.
452
+ * @param id Modal id.
453
+ * @param isOpen Desired open state.
454
+ */
455
+ private updateModalState;
456
+ /**
457
+ * Inserts or replaces a modal in the internal store.
458
+ * @param modal Modal to upsert.
459
+ */
460
+ private upsertModal;
461
+ /**
462
+ * Builds a modal instance by merging defaults, existing state, and options.
463
+ * @param id Modal id.
464
+ * @param existing Existing modal state (if any).
465
+ * @param options New options to apply.
466
+ * @param isOpen Optional override for open state.
467
+ */
468
+ private buildModal;
469
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalService, never>;
470
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ModalService>;
471
+ }
472
+
473
+ /**
474
+ * Provides modal configuration defaults and bootstraps the global modal host.
475
+ *
476
+ * @param config Optional config overrides applied on top of defaults.
477
+ * @returns EnvironmentProviders to register in application providers.
478
+ */
479
+ declare function provideModal(config?: Partial<ModalConfig>): EnvironmentProviders;
480
+
239
481
  /**
240
482
  * Extracts the **output type** (validated runtime shape)
241
483
  * from a Zod object schema — e.g. `z.output<typeof MySchema>`.
@@ -464,6 +706,56 @@ type ProvideStaticConfigOptions<T> = {
464
706
  */
465
707
  declare function provideStaticConfig<T>(env: T | undefined, options: ProvideStaticConfigOptions<T>): EnvironmentProviders;
466
708
 
709
+ /**
710
+ * Directive that listens for rapid key sequences ending in a terminator key
711
+ * (default: Enter) and emits the collected characters as a barcode string.
712
+ *
713
+ * @example
714
+ * <ng-container
715
+ * taeBarcodeScanner
716
+ * (barcodeScanned)="handleScan($event)"
717
+ * [inputWindowMs]="100"
718
+ * terminatorKey="Enter"
719
+ * />
720
+ */
721
+ declare class BarcodeScannerDirective {
722
+ /**
723
+ * Angular zone used to run key handling outside of change detection.
724
+ */
725
+ private readonly _ngZone;
726
+ /**
727
+ * Document reference for attaching global keydown event listeners.
728
+ */
729
+ private readonly _document;
730
+ /**
731
+ * Maximum time window in milliseconds between consecutive keypresses.
732
+ * Sequences exceeding this duration are discarded.
733
+ *
734
+ * @default 100
735
+ */
736
+ readonly inputWindowMs: _angular_core.InputSignal<number>;
737
+ /**
738
+ * Key that terminates and completes a barcode sequence.
739
+ *
740
+ * @default "Enter"
741
+ */
742
+ readonly terminatorKey: _angular_core.InputSignal<string>;
743
+ /**
744
+ * Emits the complete barcode string captured from the scanner.
745
+ * * @remarks
746
+ * This output is required by the directive selector.
747
+ */
748
+ readonly barcodeScanned: _angular_core.OutputEmitterRef<string>;
749
+ /**
750
+ * Sets up the global keydown listener and barcode detection pipeline.
751
+ * The pipeline runs outside Angular's zone and only re-enters when a barcode
752
+ * is emitted, to avoid triggering change detection on every keypress.
753
+ */
754
+ constructor();
755
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BarcodeScannerDirective, never>;
756
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BarcodeScannerDirective, "[taeBarcodeScanner]", never, { "inputWindowMs": { "alias": "inputWindowMs"; "required": false; "isSignal": true; }; "terminatorKey": { "alias": "terminatorKey"; "required": false; "isSignal": true; }; }, { "barcodeScanned": "barcodeScanned"; }, never, never, true, never>;
757
+ }
758
+
467
759
  /**
468
760
  * Directive that triggers a hard page refresh when the host element is clicked
469
761
  * a specified number of times within a configurable time window.
@@ -527,7 +819,7 @@ declare class TaeFooterComponent {
527
819
  *
528
820
  * @default 'normal'
529
821
  */
530
- readonly variant: _angular_core.InputSignal<"normal" | "small">;
822
+ readonly variant: _angular_core.InputSignal<"small" | "normal">;
531
823
  /**
532
824
  * Optional application version string to display in the footer.
533
825
  *
@@ -543,5 +835,5 @@ declare class TaeFooterComponent {
543
835
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TaeFooterComponent, "tae-footer", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "version": { "alias": "version"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
544
836
  }
545
837
 
546
- export { DEFAULT_TOAST_CONFIG, HardRefreshDirective, TOAST_CONFIG, TaeFooterComponent, ToastService, createEnvKit, parseEnvFile, provideRuntimeConfig, provideStaticConfig, provideToast };
547
- export type { Toast, ToastConfig, ToastOptions };
838
+ export { BarcodeScannerDirective, DEFAULT_MODAL_CONFIG, DEFAULT_TOAST_CONFIG, HardRefreshDirective, MODAL_CONFIG, ModalService, TOAST_CONFIG, TaeFooterComponent, ToastService, createEnvKit, parseEnvFile, provideModal, provideRuntimeConfig, provideStaticConfig, provideToast };
839
+ export type { Modal, ModalActionsPosition, ModalAlertDialogRole, ModalButton, ModalConfig, ModalOptions, ModalRef, ModalSize, Toast, ToastConfig, ToastOptions };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scania-nl/tegel-angular-extensions",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"