@fundamental-ngx/core 0.60.0-rc.8 → 0.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, input, booleanAttribute, Optional, ChangeDetectionStrategy, ViewEncapsulation, Component, inject, ChangeDetectorRef, ContentChildren, Directive, DestroyRef, signal, ElementRef, computed, NgZone, isDevMode, ContentChild, ViewChild, Input, ComponentRef, EmbeddedViewRef, Type, TemplateRef, HostListener, HostBinding, PLATFORM_ID, Injector, Inject, NgModule } from '@angular/core';
2
+ import { InjectionToken, Injectable, computed, signal, input, booleanAttribute, Optional, ChangeDetectionStrategy, ViewEncapsulation, Component, contentChildren, inject, Injector, effect, Directive, DestroyRef, ElementRef, afterNextRender, isDevMode, ContentChild, ViewChild, Input, ComponentRef, EmbeddedViewRef, Type, TemplateRef, HostListener, HostBinding, PLATFORM_ID, Inject, NgModule } from '@angular/core';
3
3
  import * as i3$2 from '@angular/cdk/portal';
4
4
  import { PortalModule, CdkPortalOutlet, ComponentPortal } from '@angular/cdk/portal';
5
5
  import { AsyncPipe, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';
@@ -8,11 +8,10 @@ import { DynamicPortalComponent, TemplateDirective, FocusTrapService, RtlService
8
8
  import { BusyIndicatorComponent } from '@fundamental-ngx/core/busy-indicator';
9
9
  import * as i3 from '@fundamental-ngx/core/scrollbar';
10
10
  import { ScrollbarDirective } from '@fundamental-ngx/core/scrollbar';
11
- import { Subject, BehaviorSubject, Subscription, fromEvent, asyncScheduler, of } from 'rxjs';
11
+ import { Subject, BehaviorSubject } from 'rxjs';
12
12
  import { IconComponent } from '@fundamental-ngx/core/icon';
13
- import { FD_BUTTON_BAR_COMPONENT, BarComponent, BarRightDirective, BarLeftDirective, BarElementDirective, ButtonBarComponent, BarMiddleDirective } from '@fundamental-ngx/core/bar';
13
+ import { FD_BUTTON_BAR_COMPONENT, ButtonBarComponent, BarComponent, BarRightDirective, BarLeftDirective, BarElementDirective, BarMiddleDirective } from '@fundamental-ngx/core/bar';
14
14
  import { ContentDensityDirective, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';
15
- import { startWith, filter, debounceTime, observeOn, take } from 'rxjs/operators';
16
15
  import { DEFAULT_TITLE_SIZE, TitleComponent } from '@fundamental-ngx/core/title';
17
16
  import * as i2 from '@angular/cdk/overlay';
18
17
  import { CdkScrollable, OverlayConfig, OverlayContainer } from '@angular/cdk/overlay';
@@ -23,6 +22,7 @@ import { A11yModule } from '@angular/cdk/a11y';
23
22
  import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
24
23
  import { ESCAPE } from '@angular/cdk/keycodes';
25
24
  import { Router, NavigationStart } from '@angular/router';
25
+ import { filter } from 'rxjs/operators';
26
26
  import { trigger, state, style, transition, animate } from '@angular/animations';
27
27
 
28
28
  const FD_DIALOG_BODY_COMPONENT = new InjectionToken('FdDialogBodyComponent');
@@ -30,32 +30,73 @@ const FD_DIALOG_FOCUS_TRAP_ERROR = new InjectionToken('FdDialogFocusTrapError');
30
30
 
31
31
  class DialogConfigBase {
32
32
  constructor() {
33
- /** Aria Modal for the dialog component element */
33
+ /**
34
+ * Aria Modal for the dialog component element.
35
+ * @default false
36
+ */
34
37
  this.ariaModal = false;
35
- /** Whether the dialog should have a backdrop. */
38
+ /**
39
+ * Whether the dialog should have a backdrop (overlay).
40
+ * The backdrop appears behind the dialog and typically dims the background content.
41
+ * @default true
42
+ */
36
43
  this.hasBackdrop = true;
37
- /** Whether clicking on the backdrop should close the dialog. Only works if hasBackdrop is true. */
44
+ /**
45
+ * Whether clicking on the backdrop should close the dialog.
46
+ * Only works if hasBackdrop is true.
47
+ * @default false
48
+ */
38
49
  this.backdropClickCloseable = false;
39
- /** Whether the escape key should close the dialog. */
50
+ /**
51
+ * Whether the escape key should close the dialog.
52
+ * When true, pressing ESC will dismiss the dialog.
53
+ * @default true
54
+ */
40
55
  this.escKeyCloseable = true;
41
- /** Whether the dialog should be focus trapped. */
56
+ /**
57
+ * Whether the dialog should be focus trapped.
58
+ * When true, keyboard focus is constrained within the dialog for accessibility.
59
+ * Users cannot tab to elements outside the dialog while it's open.
60
+ * @default true
61
+ */
42
62
  this.focusTrapped = true;
43
- /** The container that the dialog is appended to. By default, it is appended to the body. */
63
+ /**
64
+ * The container that the dialog is appended to.
65
+ * Can be a specific HTMLElement or 'body' for document body.
66
+ * @default 'body'
67
+ */
44
68
  this.container = 'body';
45
- /** Whether the dialog should have vertical padding. */
69
+ /**
70
+ * Whether the dialog should have vertical padding (top and bottom).
71
+ * @default true
72
+ */
46
73
  this.verticalPadding = true;
47
- /** Whether the dialog should have horizontal padding. */
74
+ /**
75
+ * Whether the dialog should have horizontal padding (left and right).
76
+ * @default true
77
+ */
48
78
  this.horizontalPadding = true;
49
- /** Whether to completely disable dialog body paddings. */
79
+ /**
80
+ * Whether to completely disable all dialog body paddings.
81
+ * When true, overrides verticalPadding and horizontalPadding settings.
82
+ * @default false
83
+ */
50
84
  this.disablePaddings = false;
51
- /** Whether the dialog should have responsive horizontal padding changing with Dialogs window width.
52
- * max-width: 599px - .fd-dialog__content--s
53
- * min-width: 600px and max-width: 1023px - .fd-dialog__content--m
54
- * min-width: 1024px and max-width: 1439px - .fd-dialog__content--l
55
- * min-width: 1440px - .fd-dialog__content--xl
56
- * */
85
+ /**
86
+ * Whether the dialog should have responsive horizontal padding that changes with dialog width.
87
+ * Padding classes are applied based on dialog width breakpoints:
88
+ * - max-width: 599px .fd-dialog__content--s
89
+ * - min-width: 600px and max-width: 1023px → .fd-dialog__content--m
90
+ * - min-width: 1024px and max-width: 1439px → .fd-dialog__content--l
91
+ * - min-width: 1440px → .fd-dialog__content--xl
92
+ * @default false
93
+ */
57
94
  this.responsivePadding = false;
58
- /** Whether to close the dialog on router navigation start. */
95
+ /**
96
+ * Whether to close the dialog when Angular router navigation starts.
97
+ * Useful to automatically clean up dialogs when user navigates away.
98
+ * @default true
99
+ */
59
100
  this.closeOnNavigation = true;
60
101
  }
61
102
  }
@@ -72,44 +113,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
72
113
  type: Injectable
73
114
  }] });
74
115
 
116
+ /**
117
+ * Enumeration of reasons why a dialog was dismissed.
118
+ * Used to identify the cause of dialog closure without explicit user action.
119
+ */
75
120
  var FD_DIALOG_DISMISS_REASON;
76
121
  (function (FD_DIALOG_DISMISS_REASON) {
122
+ /** Dialog dismissed by pressing the Escape key */
77
123
  FD_DIALOG_DISMISS_REASON["ESCAPE"] = "escape";
124
+ /** Dialog dismissed by clicking on the backdrop/overlay */
78
125
  FD_DIALOG_DISMISS_REASON["BACKDROP"] = "backdrop";
126
+ /** Dialog dismissed due to router navigation */
79
127
  FD_DIALOG_DISMISS_REASON["NAVIGATION_CHANGE"] = "navigation change";
128
+ /** Dialog dismissed because the service was destroyed */
129
+ FD_DIALOG_DISMISS_REASON["SERVICE_DESTROYED"] = "service destroyed";
80
130
  })(FD_DIALOG_DISMISS_REASON || (FD_DIALOG_DISMISS_REASON = {}));
81
131
  class DialogRefBase {
82
132
  /** @hidden */
83
133
  constructor() {
84
- /** @hidden */
134
+ /**
135
+ * Computed signal indicating whether the dialog has been loaded and initialized.
136
+ * Returns true once the dialog view has finished loading.
137
+ */
138
+ this.isLoaded = computed(() => this.status() !== 'pending', ...(ngDevMode ? [{ debugName: "isLoaded" }] : []));
139
+ /**
140
+ * Computed signal indicating whether the dialog has been closed or dismissed.
141
+ * Returns true if status is 'closed' or 'dismissed'.
142
+ */
143
+ this.isClosed = computed(() => {
144
+ const status = this.status();
145
+ return status === 'closed' || status === 'dismissed';
146
+ }, ...(ngDevMode ? [{ debugName: "isClosed" }] : []));
147
+ /**
148
+ * Computed signal indicating whether the dialog is currently open and active.
149
+ * Returns true if dialog is loaded but not yet closed/dismissed.
150
+ */
151
+ this.isOpen = computed(() => this.isLoaded() && !this.isClosed(), ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
152
+ /**
153
+ * @hidden
154
+ * Subject that signals the end of dialog lifecycle.
155
+ * Completes when dialog is closed or dismissed.
156
+ * Used by dialog container components to track lifecycle.
157
+ */
85
158
  this._endClose$ = new Subject();
86
- /** @hidden */
87
- this._afterClosed = new Subject();
88
- /** @hidden */
89
- this._afterLoaded = new Subject();
90
- this.afterClosed = this._afterClosed.asObservable();
91
- this.afterLoaded = this._afterLoaded.asObservable();
159
+ /**
160
+ * @hidden
161
+ * Internal subject for backward-compatible afterClosed observable.
162
+ */
163
+ this.afterClosedSubject = new Subject();
164
+ /**
165
+ * @hidden
166
+ * Internal subject for backward-compatible afterLoaded observable.
167
+ */
168
+ this.afterLoadedSubject = new Subject();
169
+ /** @hidden Internal signal tracking dialog lifecycle status */
170
+ this._statusSignal = signal('pending', ...(ngDevMode ? [{ debugName: "_statusSignal" }] : []));
171
+ /** @hidden Internal signal storing the result of dialog closure */
172
+ this._closeResultSignal = signal(null, ...(ngDevMode ? [{ debugName: "_closeResultSignal" }] : []));
173
+ // Initialize readonly signals from private signals
174
+ this.status = this._statusSignal.asReadonly();
175
+ this.closeResult = this._closeResultSignal.asReadonly();
176
+ // Initialize observables from protected subjects
177
+ this.afterClosed = this.afterClosedSubject.asObservable();
178
+ this.afterLoaded = this.afterLoadedSubject.asObservable();
92
179
  }
93
180
  /**
94
- * Closes the dialog and emits the result to the afterClosed observable.
95
- * @param result Value passed back to the observable as a result.
181
+ * Closes the dialog normally and returns a result value.
182
+ * Updates signal state and emits to observables for backward compatibility.
183
+ * @param result - Optional result value to return to the caller
96
184
  */
97
185
  close(result) {
186
+ // Update signal state
187
+ this._statusSignal.set('closed');
188
+ this._closeResultSignal.set({
189
+ status: 'closed',
190
+ value: result
191
+ });
192
+ // Maintain backward compatibility with RxJS API
98
193
  this._endClose$.next();
99
194
  this._endClose$.complete();
100
- this._afterClosed.next(result);
101
- this._afterClosed.complete();
195
+ this.afterClosedSubject.next(result);
196
+ this.afterClosedSubject.complete();
102
197
  }
103
198
  /**
104
- * Dismisses the dialog and passes the argument to the afterClosed observable as an error.
105
- * @param reason Value passed back to the observable as an error.
199
+ * Dismisses the dialog without a result, typically due to user cancellation.
200
+ * Updates signal state and emits error to observables for backward compatibility.
201
+ * @param reason - Optional reason for dismissal (ESC key, backdrop click, etc.)
106
202
  */
107
203
  dismiss(reason) {
108
- this._afterClosed.error(reason);
204
+ // Update signal state
205
+ this._statusSignal.set('dismissed');
206
+ this._closeResultSignal.set({
207
+ status: 'dismissed',
208
+ reason
209
+ });
210
+ // Maintain backward compatibility with RxJS API
211
+ this._endClose$.next();
212
+ this._endClose$.complete();
213
+ this.afterClosedSubject.error(reason);
109
214
  }
110
- /** Function that is called after the view of modal is initialised. */
215
+ /**
216
+ * Marks the dialog as loaded and initialized.
217
+ * Called internally after the dialog view has been created and rendered.
218
+ * Updates signal state and emits to observables for backward compatibility.
219
+ * @internal
220
+ */
111
221
  loaded() {
112
- this._afterLoaded.next(true);
222
+ // Update signal state
223
+ this._statusSignal.set('loaded');
224
+ // Maintain backward compatibility with RxJS API
225
+ this.afterLoadedSubject.next(true);
113
226
  }
114
227
  }
115
228
 
@@ -190,7 +303,7 @@ class DialogBodyComponent {
190
303
  this.disablePaddings = input(false, { ...(ngDevMode ? { debugName: "disablePaddings" } : {}), transform: booleanAttribute });
191
304
  }
192
305
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogBodyComponent, deps: [{ token: i0.ElementRef }, { token: DialogConfig, optional: true }, { token: DialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
193
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: DialogBodyComponent, isStandalone: true, selector: "fd-dialog-body", inputs: { disablePaddings: { classPropertyName: "disablePaddings", publicName: "disablePaddings", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.fd-dialog__body": "true", "class.fd-settings__dialog-body": "dialogConfig.settings", "class.fd-dialog__body--no-vertical-padding": "!dialogConfig.verticalPadding", "class.fd-dialog__body--no-horizontal-padding": "!dialogConfig.horizontalPadding", "style.min-height": "dialogConfig.bodyMinHeight", "style.padding": "dialogConfig.disablePaddings || disablePaddings() || dialogConfig.settings ? 0 : \"1rem\"" } }, providers: [
306
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: DialogBodyComponent, isStandalone: true, selector: "fd-dialog-body", inputs: { disablePaddings: { classPropertyName: "disablePaddings", publicName: "disablePaddings", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.fd-dialog__body": "true", "class.fd-settings__dialog-body": "dialogConfig.settings", "class.fd-dialog__body--no-vertical-padding": "!dialogConfig.verticalPadding", "class.fd-dialog__body--no-horizontal-padding": "!dialogConfig.horizontalPadding && !dialogConfig.responsivePadding", "style.min-height": "dialogConfig.bodyMinHeight", "style.padding": "dialogConfig.disablePaddings || disablePaddings() || dialogConfig.settings ? 0 : dialogConfig.responsivePadding ? null : \"1rem\"" } }, providers: [
194
307
  {
195
308
  provide: FD_DIALOG_BODY_COMPONENT,
196
309
  useExisting: DialogBodyComponent
@@ -203,9 +316,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
203
316
  '[class.fd-dialog__body]': 'true',
204
317
  '[class.fd-settings__dialog-body]': 'dialogConfig.settings',
205
318
  '[class.fd-dialog__body--no-vertical-padding]': '!dialogConfig.verticalPadding',
206
- '[class.fd-dialog__body--no-horizontal-padding]': '!dialogConfig.horizontalPadding',
319
+ '[class.fd-dialog__body--no-horizontal-padding]': '!dialogConfig.horizontalPadding && !dialogConfig.responsivePadding',
207
320
  '[style.min-height]': 'dialogConfig.bodyMinHeight',
208
- '[style.padding]': 'dialogConfig.disablePaddings || disablePaddings() || dialogConfig.settings ? 0 : "1rem"'
321
+ '[style.padding]': 'dialogConfig.disablePaddings || disablePaddings() || dialogConfig.settings ? 0 : dialogConfig.responsivePadding ? null : "1rem"'
209
322
  }, providers: [
210
323
  {
211
324
  provide: FD_DIALOG_BODY_COMPONENT,
@@ -258,51 +371,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
258
371
 
259
372
  class DialogFooterBase {
260
373
  constructor() {
374
+ /**
375
+ * @hidden
376
+ * Signal-based query for custom footer templates.
377
+ * Templates are identified by their fdkTemplate name attribute.
378
+ */
379
+ this.customTemplates = contentChildren(TemplateDirective, ...(ngDevMode ? [{ debugName: "customTemplates" }] : []));
380
+ /**
381
+ * @hidden
382
+ * Signal-based query for button bar components.
383
+ */
384
+ this.buttons = contentChildren(FD_BUTTON_BAR_COMPONENT, { ...(ngDevMode ? { debugName: "buttons" } : {}), read: ButtonBarComponent });
385
+ /**
386
+ * @hidden
387
+ * Signal containing the custom footer template, if provided.
388
+ * Returns the TemplateRef when a template with name='footer' is projected.
389
+ * This template uses the predefined Bar layout.
390
+ */
391
+ this.footerTemplate = computed(() => this.customTemplates().find((t) => t.name === 'footer')?.templateRef, ...(ngDevMode ? [{ debugName: "footerTemplate" }] : []));
392
+ /**
393
+ * @hidden
394
+ * Signal containing the custom footer template without predefined Bar, if provided.
395
+ * Returns the TemplateRef when a template with name='customFooter' is projected.
396
+ * This template gives full control to the user without any predefined layout.
397
+ */
398
+ this.customFooterTemplate = computed(() => this.customTemplates().find((t) => t.name === 'customFooter')?.templateRef, ...(ngDevMode ? [{ debugName: "customFooterTemplate" }] : []));
261
399
  /** @hidden */
262
- this._cdr = inject(ChangeDetectorRef);
400
+ this.injector = inject(Injector);
263
401
  }
264
- /** @hidden */
265
- ngAfterContentInit() {
266
- this._assignCustomTemplates();
267
- }
268
- /** @hidden */
402
+ /**
403
+ * @hidden
404
+ * Sets up an effect to add a CSS class to button elements when buttons change.
405
+ * Must be called within an injection context or will use runInInjectionContext.
406
+ * @param className - The CSS class name to add to each button element
407
+ */
269
408
  _listenForButtonChanges(className) {
270
- const addClassToButton = (buttonBar) => {
271
- const button = buttonBar.buttonComponent();
272
- if (button) {
273
- const buttonElement = button.elementRef.nativeElement;
274
- if (!buttonElement.classList.contains(className)) {
275
- buttonElement.classList.add(className);
409
+ effect(() => {
410
+ const buttonBars = this.buttons();
411
+ buttonBars.forEach((buttonBar) => {
412
+ const button = buttonBar.buttonComponent();
413
+ if (button) {
414
+ const buttonElement = button.elementRef.nativeElement;
415
+ if (!buttonElement.classList.contains(className)) {
416
+ buttonElement.classList.add(className);
417
+ }
276
418
  }
277
- }
278
- };
279
- this.buttons.changes.pipe(startWith(1)).subscribe(() => {
280
- this.buttons.forEach((buttonBar) => {
281
- addClassToButton(buttonBar);
282
419
  });
283
- });
284
- }
285
- /** @hidden Assign custom templates */
286
- _assignCustomTemplates() {
287
- const footerTemplate = this.customTemplates.find((template) => template.name === 'footer');
288
- this.footerTemplate = footerTemplate ? footerTemplate.templateRef : undefined;
289
- // Custom template that doesn't use predefined Bar. The user has to set everything
290
- const customFooterTemplate = this.customTemplates.find((template) => template.name === 'customFooter');
291
- this.customFooterTemplate = customFooterTemplate ? customFooterTemplate.templateRef : undefined;
292
- this._cdr.detectChanges();
420
+ }, { injector: this.injector });
293
421
  }
294
422
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogFooterBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
295
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: DialogFooterBase, isStandalone: true, queries: [{ propertyName: "customTemplates", predicate: TemplateDirective }, { propertyName: "buttons", predicate: FD_BUTTON_BAR_COMPONENT }], ngImport: i0 }); }
423
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: DialogFooterBase, isStandalone: true, queries: [{ propertyName: "customTemplates", predicate: TemplateDirective, isSignal: true }, { propertyName: "buttons", predicate: FD_BUTTON_BAR_COMPONENT, read: ButtonBarComponent, isSignal: true }], ngImport: i0 }); }
296
424
  }
297
425
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogFooterBase, decorators: [{
298
426
  type: Directive
299
- }], propDecorators: { customTemplates: [{
300
- type: ContentChildren,
301
- args: [TemplateDirective]
302
- }], buttons: [{
303
- type: ContentChildren,
304
- args: [FD_BUTTON_BAR_COMPONENT]
305
- }] } });
427
+ }], propDecorators: { customTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TemplateDirective), { isSignal: true }] }], buttons: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FD_BUTTON_BAR_COMPONENT), { ...{ read: ButtonBarComponent }, isSignal: true }] }] } });
306
428
 
307
429
  const DialogButtonClass = 'fd-dialog__decisive-button';
308
430
  /**
@@ -324,51 +446,45 @@ class DialogFooterComponent extends DialogFooterBase {
324
446
  this.dialogConfig = inject(DialogConfig, { optional: true }) || {};
325
447
  }
326
448
  /** @hidden */
327
- ngAfterContentInit() {
328
- super.ngAfterContentInit();
329
- }
330
- /** @hidden */
331
449
  ngAfterViewInit() {
332
450
  this._listenForButtonChanges(DialogButtonClass);
333
451
  }
334
452
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogFooterComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
335
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: DialogFooterComponent, isStandalone: true, selector: "fd-dialog-footer", usesInheritance: true, ngImport: i0, template: "<footer>\n @if (customFooterTemplate) {\n <ng-template [ngTemplateOutlet]=\"customFooterTemplate\"></ng-template>\n } @else {\n <div fd-bar class=\"fd-dialog__footer\" barDesign=\"footer\" [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\">\n <ng-template [ngTemplateOutlet]=\"footerTemplate ? footerTemplate : defaultTemplate\"></ng-template>\n\n <ng-template #defaultTemplate>\n <div fd-bar-right>\n <ng-content></ng-content>\n </div>\n </ng-template>\n </div>\n }\n</footer>\n", dependencies: [{ kind: "component", type: BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "clear", "size", "role"] }, { kind: "directive", type: BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
453
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: DialogFooterComponent, isStandalone: true, selector: "fd-dialog-footer", usesInheritance: true, ngImport: i0, template: "<footer>\n @if (customFooterTemplate()) {\n <ng-template [ngTemplateOutlet]=\"customFooterTemplate()\"></ng-template>\n } @else {\n <div fd-bar class=\"fd-dialog__footer\" barDesign=\"footer\" [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\">\n <ng-template [ngTemplateOutlet]=\"footerTemplate() ? footerTemplate() : defaultTemplate\"></ng-template>\n\n <ng-template #defaultTemplate>\n <div fd-bar-right>\n <ng-content></ng-content>\n </div>\n </ng-template>\n </div>\n }\n</footer>\n", dependencies: [{ kind: "component", type: BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "clear", "size", "role"] }, { kind: "directive", type: BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
336
454
  }
337
455
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogFooterComponent, decorators: [{
338
456
  type: Component,
339
- args: [{ selector: 'fd-dialog-footer', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [BarComponent, BarRightDirective, ContentDensityDirective, NgTemplateOutlet], template: "<footer>\n @if (customFooterTemplate) {\n <ng-template [ngTemplateOutlet]=\"customFooterTemplate\"></ng-template>\n } @else {\n <div fd-bar class=\"fd-dialog__footer\" barDesign=\"footer\" [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\">\n <ng-template [ngTemplateOutlet]=\"footerTemplate ? footerTemplate : defaultTemplate\"></ng-template>\n\n <ng-template #defaultTemplate>\n <div fd-bar-right>\n <ng-content></ng-content>\n </div>\n </ng-template>\n </div>\n }\n</footer>\n" }]
457
+ args: [{ selector: 'fd-dialog-footer', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [BarComponent, BarRightDirective, ContentDensityDirective, NgTemplateOutlet], template: "<footer>\n @if (customFooterTemplate()) {\n <ng-template [ngTemplateOutlet]=\"customFooterTemplate()\"></ng-template>\n } @else {\n <div fd-bar class=\"fd-dialog__footer\" barDesign=\"footer\" [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\">\n <ng-template [ngTemplateOutlet]=\"footerTemplate() ? footerTemplate() : defaultTemplate\"></ng-template>\n\n <ng-template #defaultTemplate>\n <div fd-bar-right>\n <ng-content></ng-content>\n </div>\n </ng-template>\n </div>\n }\n</footer>\n" }]
340
458
  }] });
341
459
 
342
460
  class DialogHeaderBase {
343
461
  constructor() {
344
- /** @hidden */
345
- this._changeDetectorRef = inject(ChangeDetectorRef);
346
- }
347
- /** @hidden */
348
- ngAfterContentInit() {
349
- this._assignCustomTemplates();
350
- }
351
- /** @hidden Assign custom templates */
352
- _assignCustomTemplates() {
353
- this.customTemplates.forEach((template) => {
354
- switch (template.name) {
355
- case 'header':
356
- this.headerTemplate = template.templateRef;
357
- break;
358
- case 'subheader':
359
- this.subHeaderTemplate = template.templateRef;
360
- break;
361
- }
362
- });
363
- this._changeDetectorRef.markForCheck();
462
+ /**
463
+ * @hidden
464
+ * Signal-based query for custom header/subheader templates.
465
+ * Templates are identified by their fdkTemplate name attribute.
466
+ */
467
+ this.customTemplates = contentChildren(TemplateDirective, ...(ngDevMode ? [{ debugName: "customTemplates" }] : []));
468
+ /**
469
+ * @hidden
470
+ * Signal containing the custom header template, if provided.
471
+ * Returns the TemplateRef when a template with name='header' is projected.
472
+ */
473
+ this.headerTemplate = computed(() => this.customTemplates().find((t) => t.name === 'header')?.templateRef, ...(ngDevMode ? [{ debugName: "headerTemplate" }] : []));
474
+ /**
475
+ * @hidden
476
+ * Signal containing the custom subheader template, if provided.
477
+ * Returns the TemplateRef when a template with name='subheader' is projected.
478
+ */
479
+ this.subHeaderTemplate = computed(() => this.customTemplates().find((t) => t.name === 'subheader')?.templateRef, ...(ngDevMode ? [{ debugName: "subHeaderTemplate" }] : []));
364
480
  }
365
481
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogHeaderBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
366
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: DialogHeaderBase, isStandalone: true, providers: [
482
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: DialogHeaderBase, isStandalone: true, providers: [
367
483
  {
368
484
  provide: DEFAULT_TITLE_SIZE,
369
485
  useValue: 5
370
486
  }
371
- ], queries: [{ propertyName: "customTemplates", predicate: TemplateDirective }], ngImport: i0 }); }
487
+ ], queries: [{ propertyName: "customTemplates", predicate: TemplateDirective, isSignal: true }], ngImport: i0 }); }
372
488
  }
373
489
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogHeaderBase, decorators: [{
374
490
  type: Directive,
@@ -380,10 +496,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
380
496
  }
381
497
  ]
382
498
  }]
383
- }], propDecorators: { customTemplates: [{
384
- type: ContentChildren,
385
- args: [TemplateDirective]
386
- }] } });
499
+ }], propDecorators: { customTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TemplateDirective), { isSignal: true }] }] } });
387
500
 
388
501
  /**
389
502
  * Applies fundamental layout and styling to the contents of a dialog header.
@@ -407,7 +520,7 @@ class DialogHeaderComponent extends DialogHeaderBase {
407
520
  provide: DEFAULT_TITLE_SIZE,
408
521
  useValue: 5
409
522
  }
410
- ], usesInheritance: true, ngImport: i0, template: "<header>\n <div\n fd-bar\n role=\"group\"\n class=\"fd-dialog__header\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n [barDesign]=\"subHeaderTemplate ? 'header-with-subheader' : 'header'\"\n >\n <ng-template [ngTemplateOutlet]=\"headerTemplate ? headerTemplate : defaultTemplate\"></ng-template>\n <ng-template #defaultTemplate>\n <div fd-bar-left>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-content select=\"[fd-title]\"></ng-content>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n @if (!dialogConfig.mobile) {\n <ng-content select=\"[fd-dialog-full-screen-toggler-button]\"></ng-content>\n }\n <ng-content select=\"[fd-dialog-close-button]\"></ng-content>\n </fd-bar-element>\n </div>\n </ng-template>\n </div>\n @if (subHeaderTemplate) {\n <div\n fd-bar\n class=\"fd-dialog__subheader\"\n barDesign=\"subheader\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n >\n <ng-template [ngTemplateOutlet]=\"subHeaderTemplate\"></ng-template>\n </div>\n }\n</header>\n", dependencies: [{ kind: "component", type: BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "clear", "size", "role"] }, { kind: "directive", type: BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth"] }, { kind: "directive", type: ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
523
+ ], usesInheritance: true, ngImport: i0, template: "<header>\n <div\n fd-bar\n role=\"group\"\n class=\"fd-dialog__header\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n [barDesign]=\"subHeaderTemplate() ? 'header-with-subheader' : 'header'\"\n >\n <ng-template [ngTemplateOutlet]=\"headerTemplate() ? headerTemplate() : defaultTemplate\"></ng-template>\n <ng-template #defaultTemplate>\n <div fd-bar-left>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-content select=\"[fd-title]\"></ng-content>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n @if (!dialogConfig.mobile) {\n <ng-content select=\"[fd-dialog-full-screen-toggler-button]\"></ng-content>\n }\n <ng-content select=\"[fd-dialog-close-button]\"></ng-content>\n </fd-bar-element>\n </div>\n </ng-template>\n </div>\n @if (subHeaderTemplate()) {\n <div\n fd-bar\n class=\"fd-dialog__subheader\"\n barDesign=\"subheader\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n >\n <ng-template [ngTemplateOutlet]=\"subHeaderTemplate()\"></ng-template>\n </div>\n }\n</header>\n", dependencies: [{ kind: "component", type: BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "clear", "size", "role"] }, { kind: "directive", type: BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth"] }, { kind: "directive", type: ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
411
524
  }
412
525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogHeaderComponent, decorators: [{
413
526
  type: Component,
@@ -423,46 +536,82 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
423
536
  BarElementDirective,
424
537
  ContentDensityDirective,
425
538
  NgTemplateOutlet
426
- ], template: "<header>\n <div\n fd-bar\n role=\"group\"\n class=\"fd-dialog__header\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n [barDesign]=\"subHeaderTemplate ? 'header-with-subheader' : 'header'\"\n >\n <ng-template [ngTemplateOutlet]=\"headerTemplate ? headerTemplate : defaultTemplate\"></ng-template>\n <ng-template #defaultTemplate>\n <div fd-bar-left>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-content select=\"[fd-title]\"></ng-content>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n @if (!dialogConfig.mobile) {\n <ng-content select=\"[fd-dialog-full-screen-toggler-button]\"></ng-content>\n }\n <ng-content select=\"[fd-dialog-close-button]\"></ng-content>\n </fd-bar-element>\n </div>\n </ng-template>\n </div>\n @if (subHeaderTemplate) {\n <div\n fd-bar\n class=\"fd-dialog__subheader\"\n barDesign=\"subheader\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n >\n <ng-template [ngTemplateOutlet]=\"subHeaderTemplate\"></ng-template>\n </div>\n }\n</header>\n" }]
539
+ ], template: "<header>\n <div\n fd-bar\n role=\"group\"\n class=\"fd-dialog__header\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n [barDesign]=\"subHeaderTemplate() ? 'header-with-subheader' : 'header'\"\n >\n <ng-template [ngTemplateOutlet]=\"headerTemplate() ? headerTemplate() : defaultTemplate\"></ng-template>\n <ng-template #defaultTemplate>\n <div fd-bar-left>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-content select=\"[fd-title]\"></ng-content>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n @if (!dialogConfig.mobile) {\n <ng-content select=\"[fd-dialog-full-screen-toggler-button]\"></ng-content>\n }\n <ng-content select=\"[fd-dialog-close-button]\"></ng-content>\n </fd-bar-element>\n </div>\n </ng-template>\n </div>\n @if (subHeaderTemplate()) {\n <div\n fd-bar\n class=\"fd-dialog__subheader\"\n barDesign=\"subheader\"\n [fdContentDensity]=\"dialogConfig.contentDensity ?? ''\"\n >\n <ng-template [ngTemplateOutlet]=\"subHeaderTemplate()\"></ng-template>\n </div>\n }\n</header>\n" }]
427
540
  }] });
428
541
 
429
542
  /** Service used to dynamically generate a dialog. */
430
543
  class DialogBaseService {
544
+ /** @hidden */
431
545
  constructor() {
432
- /** @hidden Collection of existing dialog references */
433
- this._dialogs = [];
546
+ /** @hidden mutable dialogs signal */
547
+ this.dialogsSignal = signal([], ...(ngDevMode ? [{ debugName: "dialogsSignal" }] : []));
548
+ /**
549
+ * Readonly signal containing all currently open dialog component references.
550
+ * Use this to observe the list of active dialogs.
551
+ */
552
+ this.dialogs = this.dialogsSignal.asReadonly();
553
+ /**
554
+ * Computed signal indicating whether any dialogs are currently open.
555
+ * Useful for conditional logic based on dialog presence.
556
+ */
557
+ this.hasOpenDialogs = computed(() => this.dialogs().length > 0, ...(ngDevMode ? [{ debugName: "hasOpenDialogs" }] : []));
558
+ /** Computed: count of open dialogs */
559
+ this.openDialogCount = computed(() => this.dialogs().length, ...(ngDevMode ? [{ debugName: "openDialogCount" }] : []));
434
560
  /** @hidden */
435
561
  this._destroyRef = inject(DestroyRef);
436
- }
437
- /**
438
- * Status of the dialog service.
439
- * Returns true if there are open dialogs, false otherwise.
440
- */
441
- hasOpenDialogs() {
442
- return this._dialogs && this._dialogs.length > 0;
562
+ // Auto-cleanup all dialogs when service is destroyed
563
+ this._destroyRef.onDestroy(() => {
564
+ this.dismissAll(FD_DIALOG_DISMISS_REASON.SERVICE_DESTROYED);
565
+ });
443
566
  }
444
567
  /** Dismisses all currently open dialogs. */
445
568
  dismissAll(reason) {
446
- this._dialogs.forEach((item) => {
447
- item.instance.ref.dismiss(reason);
448
- item.destroy();
569
+ const dialogs = [...this.dialogsSignal()];
570
+ dialogs.forEach((item) => {
571
+ try {
572
+ item.instance.ref?.dismiss(reason);
573
+ }
574
+ catch (e) {
575
+ console.error('Error dismissing dialog:', e);
576
+ }
577
+ try {
578
+ item.destroy();
579
+ }
580
+ catch (e) {
581
+ console.error('Error destroying dialog:', e);
582
+ }
449
583
  });
450
- this._dialogs = [];
584
+ this.dialogsSignal.set([]);
451
585
  }
452
- /** @hidden Extends configuration using default values*/
586
+ /** @hidden Extends configuration using default values */
453
587
  _applyDefaultConfig(config, defaultConfig) {
454
588
  return { ...defaultConfig, ...config };
455
589
  }
590
+ /** @hidden Register a dialog and setup auto-cleanup */
591
+ _registerDialog(dialog) {
592
+ this.dialogsSignal.update((dialogs) => [...dialogs, dialog]);
593
+ // Auto-remove when dialog closes
594
+ dialog.instance.ref.afterClosed.pipe(takeUntilDestroyed(this._destroyRef)).subscribe({
595
+ next: () => this._destroyDialog(dialog),
596
+ error: () => this._destroyDialog(dialog)
597
+ });
598
+ }
456
599
  /** @hidden Destroy existing dialog */
457
600
  _destroyDialog(dialog) {
458
- this._dialogs = this._dialogs.filter((d) => d !== dialog);
601
+ this.dialogsSignal.update((dialogs) => dialogs.filter((d) => d !== dialog));
602
+ try {
603
+ dialog.destroy();
604
+ }
605
+ catch (e) {
606
+ console.error('Error destroying dialog:', e);
607
+ }
459
608
  }
460
609
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogBaseService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
461
610
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogBaseService }); }
462
611
  }
463
612
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogBaseService, decorators: [{
464
613
  type: Injectable
465
- }] });
614
+ }], ctorParameters: () => [] });
466
615
 
467
616
  class DialogFullScreenTogglerButtonComponent {
468
617
  constructor() {
@@ -529,21 +678,26 @@ function coerceMetricValue(value) {
529
678
  return typeof value === 'number' ? `${value}px` : value;
530
679
  }
531
680
  class DialogBase {
681
+ /** @hidden */
532
682
  constructor() {
533
683
  /** @hidden */
534
684
  this._focusTrapService = inject(FocusTrapService);
535
685
  /** @hidden */
536
- this._changeDetectorRef = inject(ChangeDetectorRef);
537
- /** @hidden */
538
686
  this.elementRef = inject(ElementRef);
539
687
  /** @hidden */
540
688
  this._router = inject(Router);
541
689
  /** @hidden */
542
690
  this._rtlService = inject(RtlService, { optional: true });
543
691
  /** @hidden */
544
- this.dir = computed(() => ((this._rtlService?.rtl() ?? false) ? 'rtl' : 'ltr'), ...(ngDevMode ? [{ debugName: "dir" }] : []));
692
+ this._injector = inject(Injector);
545
693
  /** @hidden */
546
- this._subscriptions = new Subscription();
694
+ this._destroyRef = inject(DestroyRef);
695
+ /** @hidden RTL direction computed from service */
696
+ this.dir = computed(() => ((this._rtlService?.rtl() ?? false) ? 'rtl' : 'ltr'), ...(ngDevMode ? [{ debugName: "dir" }] : []));
697
+ /** @hidden Dialog padding sizes - signal for reactive updates */
698
+ this.dialogPaddingSize = signal(undefined, ...(ngDevMode ? [{ debugName: "dialogPaddingSize" }] : []));
699
+ /** @hidden Dialog width - tracked via ResizeObserver */
700
+ this._dialogWidth = signal(0, ...(ngDevMode ? [{ debugName: "_dialogWidth" }] : []));
547
701
  /**
548
702
  * @hidden
549
703
  * Used to mute errors of focus trap during unit tests (jsdom incompatibility).
@@ -551,8 +705,22 @@ class DialogBase {
551
705
  this._focusTrapError = inject(FD_DIALOG_FOCUS_TRAP_ERROR, {
552
706
  optional: true
553
707
  });
554
- /** @hidden */
555
- this._zone = inject(NgZone);
708
+ // Setup navigation listener (doesn't require view)
709
+ this._listenAndCloseOnNavigation();
710
+ // Reactive effect: automatically update padding size when dialog width changes
711
+ effect(() => {
712
+ const width = this._dialogWidth();
713
+ if (this._config.responsivePadding && width > 0) {
714
+ this.dialogPaddingSize.set(dialogWidthToSize(width));
715
+ }
716
+ });
717
+ // Setup view-dependent initialization after render
718
+ afterNextRender(() => {
719
+ this.setupFocusTrap();
720
+ this.applyStyles();
721
+ this.setupResizeObserver();
722
+ this._ref.loaded();
723
+ }, { injector: this._injector });
556
724
  }
557
725
  /** @hidden Listen and close dialog on Escape key */
558
726
  closeDialogEsc(event) {
@@ -567,95 +735,91 @@ class DialogBase {
567
735
  }
568
736
  }
569
737
  /** @hidden */
570
- ngOnInit() {
571
- this._listenAndCloseOnNavigation();
572
- }
573
- /** @hidden */
574
- ngAfterViewInit() {
575
- this._trapFocus();
576
- this._setPosition();
577
- this._setWidthHeight();
578
- this._listenOnWindowResize();
579
- this.adjustResponsivePadding();
580
- this._ref.loaded();
581
- }
582
- /** @hidden */
583
738
  ngOnDestroy() {
584
739
  this._deactivateFocusTrap();
585
- this._subscriptions.unsubscribe();
740
+ this._resizeObserver?.disconnect();
586
741
  }
587
- /** @hidden Determine dialog padding size based on dialogs window width */
742
+ /**
743
+ * @deprecated Use reactive ResizeObserver instead. This method is kept for backward compatibility
744
+ * but is no longer needed as padding updates happen automatically via signals.
745
+ * @hidden Determine dialog padding size based on dialogs window width
746
+ */
588
747
  adjustResponsivePadding() {
589
- if (this._config.responsivePadding) {
590
- const dialogWidth = this.dialogWindow.nativeElement.getBoundingClientRect().width;
591
- this.dialogPaddingSize = dialogWidthToSize(dialogWidth);
592
- this._changeDetectorRef.detectChanges();
593
- }
594
- }
595
- /** @hidden Listen on NavigationStart event and dismiss the dialog */
596
- _listenAndCloseOnNavigation() {
597
- if (this._router) {
598
- this._subscriptions.add(this._router.events
599
- .pipe(filter((event) => event instanceof NavigationStart && !!this._config.closeOnNavigation))
600
- .subscribe(() => this._ref.dismiss(FD_DIALOG_DISMISS_REASON.NAVIGATION_CHANGE)));
748
+ if (this._config.responsivePadding && this.dialogWindow) {
749
+ const width = this.dialogWindow.nativeElement.getBoundingClientRect().width;
750
+ this._dialogWidth.set(width); // Let the effect handle the rest
601
751
  }
602
752
  }
603
- /** @hidden Trap focus inside dialog window */
604
- _trapFocus() {
605
- if (this._config.focusTrapped) {
606
- this._subscriptions.add(this._onMicrotaskEmpty().subscribe(() => {
607
- try {
608
- this._focusTrapId = this._focusTrapService.createFocusTrap(this.dialogWindow.nativeElement, {
609
- clickOutsideDeactivates: this._config.backdropClickCloseable && this._config.hasBackdrop,
610
- escapeDeactivates: false,
611
- fallbackFocus: this.dialogWindow.nativeElement,
612
- allowOutsideClick: () => true
613
- });
614
- }
615
- catch (e) {
616
- isDevMode() && this._focusTrapError !== true && console.error(e);
617
- }
618
- }));
753
+ /** @hidden Setup focus trap - called from constructor via afterNextRender */
754
+ setupFocusTrap() {
755
+ if (this._config.focusTrapped && this.dialogWindow) {
756
+ try {
757
+ this._focusTrapId = this._focusTrapService.createFocusTrap(this.dialogWindow.nativeElement, {
758
+ clickOutsideDeactivates: this._config.backdropClickCloseable && this._config.hasBackdrop,
759
+ escapeDeactivates: false,
760
+ fallbackFocus: this.dialogWindow.nativeElement,
761
+ allowOutsideClick: () => true
762
+ });
763
+ }
764
+ catch (e) {
765
+ isDevMode() && this._focusTrapError !== true && console.error(e);
766
+ }
619
767
  }
620
768
  }
621
- /** @hidden */
622
- _deactivateFocusTrap() {
623
- this._focusTrapService.deactivateFocusTrap(this._focusTrapId);
624
- }
625
- /** @hidden Set dialog window position */
626
- _setPosition() {
627
- if (this._config.position) {
628
- this.dialogWindow.nativeElement.style.top = coerceMetricValue(this._config.position.top);
629
- this.dialogWindow.nativeElement.style.bottom = coerceMetricValue(this._config.position.bottom);
630
- this.dialogWindow.nativeElement.style.left = coerceMetricValue(this._config.position.left);
631
- this.dialogWindow.nativeElement.style.right = coerceMetricValue(this._config.position.right);
769
+ /**
770
+ * @hidden
771
+ * Apply all style configurations to dialog element (position and dimensions).
772
+ * Combines position and size styling in one method for better organization.
773
+ */
774
+ applyStyles() {
775
+ const el = this.dialogWindow.nativeElement;
776
+ const { position, width, height, minWidth, minHeight, maxWidth, maxHeight } = this._config;
777
+ // Apply position styles
778
+ if (position) {
779
+ el.style.top = coerceMetricValue(position.top);
780
+ el.style.bottom = coerceMetricValue(position.bottom);
781
+ el.style.left = coerceMetricValue(position.left);
782
+ el.style.right = coerceMetricValue(position.right);
632
783
  }
633
784
  else {
634
- this.dialogWindow.nativeElement.style.position = 'relative';
785
+ el.style.position = 'relative';
635
786
  }
787
+ // Apply dimension styles
788
+ el.style.width = coerceMetricValue(width);
789
+ el.style.height = coerceMetricValue(height);
790
+ el.style.minWidth = coerceMetricValue(minWidth);
791
+ el.style.minHeight = coerceMetricValue(minHeight);
792
+ el.style.maxWidth = coerceMetricValue(maxWidth);
793
+ el.style.maxHeight = coerceMetricValue(maxHeight);
636
794
  }
637
- /** @hidden Set dialog window width and height */
638
- _setWidthHeight() {
639
- this.dialogWindow.nativeElement.style.width = coerceMetricValue(this._config.width);
640
- this.dialogWindow.nativeElement.style.height = coerceMetricValue(this._config.height);
641
- this.dialogWindow.nativeElement.style.minWidth = coerceMetricValue(this._config.minWidth);
642
- this.dialogWindow.nativeElement.style.minHeight = coerceMetricValue(this._config.minHeight);
643
- this.dialogWindow.nativeElement.style.maxWidth = coerceMetricValue(this._config.maxWidth);
644
- this.dialogWindow.nativeElement.style.maxHeight = coerceMetricValue(this._config.maxHeight);
645
- }
646
- /** @hidden Listen on window resize and adjust padding */
647
- _listenOnWindowResize() {
795
+ /**
796
+ * @hidden
797
+ * Sets up ResizeObserver to track dialog element size changes.
798
+ */
799
+ setupResizeObserver() {
648
800
  if (this._config.responsivePadding) {
649
- this._subscriptions.add(fromEvent(window, 'resize')
650
- .pipe(debounceTime(100))
651
- .subscribe(() => this.adjustResponsivePadding()));
801
+ this._resizeObserver = new ResizeObserver((entries) => {
802
+ if (entries.length > 0) {
803
+ const width = entries[0].contentRect.width;
804
+ this._dialogWidth.set(width);
805
+ }
806
+ });
807
+ this._resizeObserver.observe(this.dialogWindow.nativeElement);
652
808
  }
653
809
  }
654
- /** @hidden */
655
- _onMicrotaskEmpty() {
656
- return this._zone.hasPendingMicrotasks
657
- ? this._zone.onMicrotaskEmpty.pipe(observeOn(asyncScheduler), take(1))
658
- : of(null);
810
+ /** @hidden Listen on NavigationStart event and dismiss the dialog */
811
+ _listenAndCloseOnNavigation() {
812
+ if (this._router) {
813
+ this._router.events
814
+ .pipe(filter((event) => event instanceof NavigationStart && !!this._config.closeOnNavigation), takeUntilDestroyed(this._destroyRef))
815
+ .subscribe(() => this._ref.dismiss(FD_DIALOG_DISMISS_REASON.NAVIGATION_CHANGE));
816
+ }
817
+ }
818
+ /** @hidden Deactivate focus trap on destroy */
819
+ _deactivateFocusTrap() {
820
+ if (this._focusTrapId) {
821
+ this._focusTrapService.deactivateFocusTrap(this._focusTrapId);
822
+ }
659
823
  }
660
824
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
661
825
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: DialogBase, isStandalone: true, host: { listeners: { "keydown": "closeDialogEsc($event)", "mousedown": "closeDialog($event.target)" }, properties: { "attr.dir": "dir()" } }, ngImport: i0 }); }
@@ -669,7 +833,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
669
833
  '(mousedown)': 'closeDialog($event.target)'
670
834
  }
671
835
  }]
672
- }] });
836
+ }], ctorParameters: () => [] });
673
837
 
674
838
  let titleUniqueId = 1;
675
839
  class DialogTitleDirective {
@@ -793,7 +957,6 @@ class DialogComponent extends DialogBase {
793
957
  }
794
958
  /** @hidden */
795
959
  ngOnInit() {
796
- super.ngOnInit();
797
960
  this._listenOnHidden();
798
961
  this.buildComponentCssClass();
799
962
  }
@@ -803,7 +966,6 @@ class DialogComponent extends DialogBase {
803
966
  }
804
967
  /** @hidden */
805
968
  ngAfterViewInit() {
806
- super.ngAfterViewInit();
807
969
  this._listenOnHidden();
808
970
  this._listenOnFullScreen();
809
971
  }
@@ -816,11 +978,10 @@ class DialogComponent extends DialogBase {
816
978
  }
817
979
  /** @hidden */
818
980
  _listenOnFullScreen() {
819
- this._subscriptions.add(this._ref.fullScreen.subscribe((isFullScreen) => {
981
+ this._ref.fullScreen.pipe(takeUntilDestroyed(this._destroyRef)).subscribe((isFullScreen) => {
820
982
  this._fullScreen = isFullScreen;
821
- this._changeDetectorRef.detectChanges();
822
983
  this.adjustResponsivePadding();
823
- }));
984
+ });
824
985
  }
825
986
  /** @hidden Listen on Dialog visibility */
826
987
  _listenOnHidden() {
@@ -843,7 +1004,7 @@ class DialogComponent extends DialogBase {
843
1004
  });
844
1005
  }
845
1006
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DialogComponent, deps: [{ token: DialogConfig, optional: true }, { token: DialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
846
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: DialogComponent, isStandalone: true, selector: "fd-dialog", inputs: { class: "class", embeddedDialogRef: ["dialogRef", "embeddedDialogRef"], embeddedDialogConfig: ["dialogConfig", "embeddedDialogConfig"] }, host: { attributes: { "tabindex": "-1" } }, providers: [contentDensityObserverProviders({ alwaysAddModifiers: true })], queries: [{ propertyName: "dialogHeaderConfig", first: true, predicate: DialogHeaderComponent, descendants: true }, { propertyName: "dialogBodyConfig", first: true, predicate: DialogBodyComponent, descendants: true }, { propertyName: "dialogFooterConfig", first: true, predicate: DialogFooterComponent, descendants: true }, { propertyName: "dialogTitle", first: true, predicate: DialogTitleDirective, descendants: true }], viewQueries: [{ propertyName: "dialogWindow", first: true, predicate: ["dialogWindow"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n #dialogWindow\n role=\"dialog\"\n tabindex=\"-1\"\n aria-modal=\"true\"\n fdkResize\n cdkTrapFocus\n cdkDrag\n cdkDragBoundary=\".fd-dialog\"\n fd-scrollbar\n [fdkResizeBoundary]=\"elementRef.nativeElement\"\n class=\"fd-dialog__content\"\n [class]=\"dialogConfig.dialogPanelClass\"\n [class.cdk-drag]=\"dialogConfig.draggable\"\n [class.fd-dialog__content--s]=\"dialogPaddingSize === 'sm'\"\n [class.fd-dialog__content--m]=\"dialogPaddingSize === 'md'\"\n [class.fd-dialog__content--l]=\"dialogPaddingSize === 'lg'\"\n [class.fd-dialog__content--xl]=\"dialogPaddingSize === 'xl'\"\n [class.fd-dialog__content--mobile]=\"dialogConfig.mobile || _fullScreen\"\n [class.fd-dialog__content--no-mobile-stretch]=\"dialogConfig.mobileOuterSpacing\"\n [class.fd-dialog__content--draggable-grab]=\"dialogConfig.draggable && !isDragged\"\n [class.fd-dialog__content--draggable-grabbing]=\"dialogConfig.draggable && isDragged\"\n [class.fd-dialog__content-full-screen]=\"_fullScreen\"\n [class.fd-settings__dialog-content]=\"dialogConfig.settings\"\n [cdkDragDisabled]=\"!dialogConfig.draggable\"\n [fdkResizeDisabled]=\"!dialogConfig.resizable\"\n [attr.id]=\"dialogConfig.id\"\n [attr.aria-label]=\"dialogConfig.ariaLabel\"\n [attr.aria-labelledby]=\"dialogConfig.ariaLabelledBy\"\n [attr.aria-describedby]=\"dialogConfig.ariaDescribedBy\"\n (cdkDragStarted)=\"isDragged = true\"\n (cdkDragEnded)=\"isDragged = false\"\n (onResizeEnd)=\"adjustResponsivePadding()\"\n>\n @if (dialogConfig.resizable && !_fullScreen && !dialogConfig.mobile) {\n <span fdkResizeHandle class=\"fd-dialog__resize-handle\" role=\"presentation\" aria-hidden=\"true\"></span>\n }\n <div cdkDragHandle [cdkDragHandleDisabled]=\"!dialogConfig.draggable\">\n <ng-content select=\"fd-dialog-header\"></ng-content>\n </div>\n <ng-content select=\"fd-dialog-body\"></ng-content>\n <ng-content select=\"fd-dialog-footer\"></ng-content>\n</div>\n", styles: ["@charset \"UTF-8\";.fd-dialog{position:fixed;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog,.fd-dialog:before{height:100%;left:0;top:0;width:100%}.fd-dialog:before{background-color:var(--sapBlockLayer_Background);content:\"\";opacity:var(--sapBlockLayer_Opacity);position:absolute}.fd-dialog__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-shadow:var(--sapContent_Shadow3);box-shadow:var(--sapContent_Shadow3);-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 6%);max-width:calc(100vw - 10%);min-height:7.5rem;min-width:20rem;outline:none;position:absolute}.fd-dialog__body{overflow:auto;-webkit-box-flex:1;-ms-flex-positive:1;background-color:var(--sapGroup_ContentBackground);flex-grow:1}.fd-dialog__footer.fd-bar,.fd-dialog__header.fd-bar,.fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem;-ms-flex-negative:0;flex-shrink:0}.fd-dialog__content--mobile{border-radius:0;height:100vh;max-height:100vh;max-width:100vw;width:100vw}.fd-dialog{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:none;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog:after,.fd-dialog:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog--active{display:-webkit-box;display:-ms-flexbox;display:flex}.fd-dialog__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog__content:after,.fd-dialog__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__content--def .fd-dialog__body,.fd-dialog__content--def .fd-dialog__footer.fd-bar,.fd-dialog__content--def .fd-dialog__header.fd-bar,.fd-dialog__content--def .fd-dialog__subheader.fd-bar,.fd-dialog__content--s .fd-dialog__body,.fd-dialog__content--s .fd-dialog__footer.fd-bar,.fd-dialog__content--s .fd-dialog__header.fd-bar,.fd-dialog__content--s .fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem}.fd-dialog__content--l .fd-dialog__body,.fd-dialog__content--l .fd-dialog__footer.fd-bar,.fd-dialog__content--l .fd-dialog__header.fd-bar,.fd-dialog__content--l .fd-dialog__subheader.fd-bar,.fd-dialog__content--m .fd-dialog__body,.fd-dialog__content--m .fd-dialog__footer.fd-bar,.fd-dialog__content--m .fd-dialog__header.fd-bar,.fd-dialog__content--m .fd-dialog__subheader.fd-bar{padding-inline:2rem 2rem}.fd-dialog__content--xl .fd-dialog__body,.fd-dialog__content--xl .fd-dialog__footer.fd-bar,.fd-dialog__content--xl .fd-dialog__header.fd-bar,.fd-dialog__content--xl .fd-dialog__subheader.fd-bar{padding-inline:3rem 3rem}.fd-dialog__content--mobile .fd-dialog__body,.fd-dialog__content--mobile .fd-dialog__footer,.fd-dialog__content--mobile .fd-dialog__header,.fd-dialog__content--mobile .fd-menu__item:first-child,.fd-dialog__content--mobile .fd-menu__item:first-child .fd-menu__link:after,.fd-dialog__content--mobile .fd-menu__item:last-child,.fd-dialog__content--mobile .fd-menu__item:last-child .fd-menu__link:after{border-radius:0}.fd-dialog__content--no-mobile-stretch{border-radius:var(--sapElement_BorderCornerRadius);max-height:calc(100vh - 6%);max-width:calc(100vw - 10%)}.fd-dialog__content--draggable-grab.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grab:hover .fd-dialog__header{cursor:move;cursor:-webkit-grab;cursor:grab}.fd-dialog__content--draggable-grabbing.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grabbing:hover .fd-dialog__header{cursor:move;cursor:-webkit-grabbing;cursor:grabbing}.fd-dialog__header.fd-bar{border-top-left-radius:var(--sapElement_BorderCornerRadius);border-top-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar{border-bottom-left-radius:var(--sapElement_BorderCornerRadius);border-bottom-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar .fd-dialog__decisive-button,.fd-dialog__header.fd-bar .fd-dialog__decisive-button{min-width:4rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog__body{border:0;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-block:1rem 1rem;padding-inline:0;position:relative}.fd-dialog__body:after,.fd-dialog__body:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__body--no-vertical-padding{padding-block:0}.fd-dialog__body--no-horizontal-padding{padding-inline:0}.fd-dialog__body:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__body:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__loader{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1.5rem;padding-block:0;padding-inline:0;text-align:center;-webkit-margin-after:.5rem;margin-block-end:.5rem}.fd-dialog__loader:after,.fd-dialog__loader:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;right:-.5rem;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.5rem;cursor:se-resize;font-size:1rem;justify-content:flex-start;line-height:1rem;overflow:hidden;position:absolute;z-index:2}.fd-dialog__resize-handle:after,.fd-dialog__resize-handle:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle[dir=rtl],[dir=rtl] .fd-dialog__resize-handle{cursor:sw-resize;left:-.5rem;right:auto;-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.fd-dialog__resize-handle:after{color:var(--sapButton_Lite_TextColor);content:\"\\e24f\";font-family:SAP-icons;height:1rem;min-width:1rem;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:1rem}.fd-dialog--no-backdrop:not(.fd-dialog--targeted){left:50%;position:fixed;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:1000}.fd-settings .fd-settings__dialog-content{height:var(--fdSettings_Dialog_Content_Height,42.5rem);max-height:var(--fdSettings_Dialog_Content_Max_Height,42.5rem);max-width:var(--fdSettings_Dialog_Content_Max_Width,60rem);min-height:var(--fdSettings_Dialog_Content_Min_Height,42.5rem);min-width:var(--fdSettings_Dialog_Content_Min_Width,60rem)}.fd-settings .fd-settings__dialog-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;padding-block:0;padding-inline:0}.fd-settings .fd-settings__list:is(:first-child){overflow-y:auto}.fd-settings .fd-settings__list a:after{content:var(--fdSettings_List_Nav_Indicator_Content,none)}.fd-settings .fd-settings__list--footer{border-top:.0625rem solid var(--sapList_BorderColor)}.fd-settings .fd-settings__tab-bar{height:100%;overflow-y:hidden}.fd-settings .fd-settings__header{-webkit-margin-before:var(--fdSettings_Header_Margin_Top,1rem);margin-block-start:var(--fdSettings_Header_Margin_Top,1rem)}.fd-settings__list-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;max-width:var(--fdSettings_List_Area_Width,20rem);min-width:var(--fdSettings_List_Area_Width,20rem);width:var(--fdSettings_List_Area_Width,20rem);-webkit-border-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor));border-inline-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor))}.fd-settings__list-area:after,.fd-settings__list-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__list-container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;height:100%;justify-content:space-between;overflow:hidden;position:relative}.fd-settings__list-container:after,.fd-settings__list-container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.fd-settings__detail-area:after,.fd-settings__detail-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area:has(.fd-settings__tab-bar) .fd-settings__header{--fdBar_Shadow:none}.fd-settings__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:100%;line-height:normal;margin-block:0;margin-inline:0;overflow-y:auto;padding-block:0;padding-block:1rem;padding-inline:0;padding-inline:1rem;width:100%}.fd-settings__content:after,.fd-settings__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__content--no-padding{padding-block:0;padding-inline:0}.fd-settings__content--no-background{background:transparent}.fd-settings__container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;height:100%;width:100%}.fd-settings__container:after,.fd-settings__container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings:has(.fd-settings__container--sm){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:100%;--fdSettings_Dialog_Content_Min_Height:100%;--fdSettings_Dialog_Content_Max_Width:100%;--fdSettings_Dialog_Content_Max_Height:100%;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-content{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-body{border-radius:0}.fd-settings:has(.fd-settings__container--md){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:80%;--fdSettings_Dialog_Content_Min_Height:88%;--fdSettings_Dialog_Content_Max_Width:40rem;--fdSettings_Dialog_Content_Max_Height:42.5rem;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--lg),.fd-settings:has(.fd-settings__container--xl){--fdSettings_List_Area_Width:20rem;--fdSettings_Header_Margin_Top:1rem;--fdSettings_List_Nav_Indicator_Content:none;--fdSettings_Dialog_Content_Min_Width:60rem;--fdSettings_Dialog_Content_Min_Height:42.5rem;--fdSettings_Dialog_Content_Max_Width:60rem;--fdSettings_Dialog_Content_Max_Height:42.5rem}.fd-dialog{z-index:999}.fd-dialog__resize-handle{z-index:1001}.fd-dialog__content-full-screen{position:relative!important;inset:0!important;width:100%!important;height:100%!important;min-width:100%!important;max-width:100%!important;min-height:100%!important;max-height:100%!important;transform:none!important}.fd-dialog__content.fd-dialog__content--mobile{height:100%;max-height:100%;max-width:100%;width:100%;position:fixed!important}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__header.fd-bar{border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__footer.fd-bar{border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__footer{overflow:hidden}.fd-dialog__content:has(.fd-dialog__resize-handle){overflow:visible!important}.fd-dialog__body.fd-settings__dialog-body section{width:100%}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup){padding:0!important}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup) section{height:100%;overflow:hidden}\n/*! Bundled license information:\n\nfundamental-styles/dist/settings.css:\n (*!\n * Fundamental Library Styles v0.40.1\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *)\n*/\n"], dependencies: [{ kind: "directive", type: ResizeDirective, selector: "[fdkResize]", inputs: ["fdkResizeBoundary", "fdkResizeDisabled", "fdkResizeClass", "fdkResizeHandleLocation", "fdkResizeResizeHandleRef"], outputs: ["onResizeStart", "onResizeEnd"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i3$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: ScrollbarDirective, selector: "[fdScrollbar], [fd-scrollbar]", inputs: ["noHorizontalScroll", "noVerticalScroll", "alwaysVisible"] }, { kind: "directive", type: ResizeHandleDirective, selector: "[fdkResizeHandle]" }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1007
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: DialogComponent, isStandalone: true, selector: "fd-dialog", inputs: { class: "class", embeddedDialogRef: ["dialogRef", "embeddedDialogRef"], embeddedDialogConfig: ["dialogConfig", "embeddedDialogConfig"] }, host: { attributes: { "tabindex": "-1" } }, providers: [contentDensityObserverProviders({ alwaysAddModifiers: true })], queries: [{ propertyName: "dialogHeaderConfig", first: true, predicate: DialogHeaderComponent, descendants: true }, { propertyName: "dialogBodyConfig", first: true, predicate: DialogBodyComponent, descendants: true }, { propertyName: "dialogFooterConfig", first: true, predicate: DialogFooterComponent, descendants: true }, { propertyName: "dialogTitle", first: true, predicate: DialogTitleDirective, descendants: true }], viewQueries: [{ propertyName: "dialogWindow", first: true, predicate: ["dialogWindow"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n #dialogWindow\n role=\"dialog\"\n tabindex=\"-1\"\n aria-modal=\"true\"\n fdkResize\n cdkTrapFocus\n cdkDrag\n cdkDragBoundary=\".fd-dialog\"\n fd-scrollbar\n [fdkResizeBoundary]=\"elementRef.nativeElement\"\n class=\"fd-dialog__content\"\n [class]=\"dialogConfig.dialogPanelClass\"\n [class.cdk-drag]=\"dialogConfig.draggable\"\n [class.fd-dialog__content--s]=\"dialogPaddingSize() === 'sm'\"\n [class.fd-dialog__content--m]=\"dialogPaddingSize() === 'md'\"\n [class.fd-dialog__content--l]=\"dialogPaddingSize() === 'lg'\"\n [class.fd-dialog__content--xl]=\"dialogPaddingSize() === 'xl'\"\n [class.fd-dialog__content--mobile]=\"dialogConfig.mobile || _fullScreen\"\n [class.fd-dialog__content--no-mobile-stretch]=\"dialogConfig.mobileOuterSpacing\"\n [class.fd-dialog__content--draggable-grab]=\"dialogConfig.draggable && !isDragged\"\n [class.fd-dialog__content--draggable-grabbing]=\"dialogConfig.draggable && isDragged\"\n [class.fd-dialog__content-full-screen]=\"_fullScreen\"\n [class.fd-settings__dialog-content]=\"dialogConfig.settings\"\n [cdkDragDisabled]=\"!dialogConfig.draggable\"\n [fdkResizeDisabled]=\"!dialogConfig.resizable\"\n [attr.id]=\"dialogConfig.id\"\n [attr.aria-label]=\"dialogConfig.ariaLabel\"\n [attr.aria-labelledby]=\"dialogConfig.ariaLabelledBy\"\n [attr.aria-describedby]=\"dialogConfig.ariaDescribedBy\"\n (cdkDragStarted)=\"isDragged = true\"\n (cdkDragEnded)=\"isDragged = false\"\n (onResizeEnd)=\"adjustResponsivePadding()\"\n>\n @if (dialogConfig.resizable && !_fullScreen && !dialogConfig.mobile) {\n <span fdkResizeHandle class=\"fd-dialog__resize-handle\" role=\"presentation\" aria-hidden=\"true\"></span>\n }\n <div cdkDragHandle [cdkDragHandleDisabled]=\"!dialogConfig.draggable\">\n <ng-content select=\"fd-dialog-header\"></ng-content>\n </div>\n <ng-content select=\"fd-dialog-body\"></ng-content>\n <ng-content select=\"fd-dialog-footer\"></ng-content>\n</div>\n", styles: ["@charset \"UTF-8\";.fd-dialog{position:fixed;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog,.fd-dialog:before{height:100%;left:0;top:0;width:100%}.fd-dialog:before{background-color:var(--sapBlockLayer_Background);content:\"\";opacity:var(--sapBlockLayer_Opacity);position:absolute}.fd-dialog__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-shadow:var(--sapContent_Shadow3);box-shadow:var(--sapContent_Shadow3);-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 6%);max-width:calc(100vw - 10%);min-height:7.5rem;min-width:20rem;outline:none;position:absolute}.fd-dialog__body{overflow:auto;-webkit-box-flex:1;-ms-flex-positive:1;background-color:var(--sapGroup_ContentBackground);flex-grow:1}.fd-dialog__footer.fd-bar,.fd-dialog__header.fd-bar,.fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem;-ms-flex-negative:0;flex-shrink:0}.fd-dialog__content--mobile{border-radius:0;height:100vh;max-height:100vh;max-width:100vw;width:100vw}.fd-dialog{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:none;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog:after,.fd-dialog:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog--active{display:-webkit-box;display:-ms-flexbox;display:flex}.fd-dialog__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog__content:after,.fd-dialog__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__content--def .fd-dialog__body,.fd-dialog__content--def .fd-dialog__footer.fd-bar,.fd-dialog__content--def .fd-dialog__header.fd-bar,.fd-dialog__content--def .fd-dialog__subheader.fd-bar,.fd-dialog__content--s .fd-dialog__body,.fd-dialog__content--s .fd-dialog__footer.fd-bar,.fd-dialog__content--s .fd-dialog__header.fd-bar,.fd-dialog__content--s .fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem}.fd-dialog__content--l .fd-dialog__body,.fd-dialog__content--l .fd-dialog__footer.fd-bar,.fd-dialog__content--l .fd-dialog__header.fd-bar,.fd-dialog__content--l .fd-dialog__subheader.fd-bar,.fd-dialog__content--m .fd-dialog__body,.fd-dialog__content--m .fd-dialog__footer.fd-bar,.fd-dialog__content--m .fd-dialog__header.fd-bar,.fd-dialog__content--m .fd-dialog__subheader.fd-bar{padding-inline:2rem 2rem}.fd-dialog__content--xl .fd-dialog__body,.fd-dialog__content--xl .fd-dialog__footer.fd-bar,.fd-dialog__content--xl .fd-dialog__header.fd-bar,.fd-dialog__content--xl .fd-dialog__subheader.fd-bar{padding-inline:3rem 3rem}.fd-dialog__content--mobile .fd-dialog__body,.fd-dialog__content--mobile .fd-dialog__footer,.fd-dialog__content--mobile .fd-dialog__header,.fd-dialog__content--mobile .fd-menu__item:first-child,.fd-dialog__content--mobile .fd-menu__item:first-child .fd-menu__link:after,.fd-dialog__content--mobile .fd-menu__item:last-child,.fd-dialog__content--mobile .fd-menu__item:last-child .fd-menu__link:after{border-radius:0}.fd-dialog__content--no-mobile-stretch{border-radius:var(--sapElement_BorderCornerRadius);max-height:calc(100vh - 6%);max-width:calc(100vw - 10%)}.fd-dialog__content--draggable-grab.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grab:hover .fd-dialog__header{cursor:move;cursor:-webkit-grab;cursor:grab}.fd-dialog__content--draggable-grabbing.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grabbing:hover .fd-dialog__header{cursor:move;cursor:-webkit-grabbing;cursor:grabbing}.fd-dialog__header.fd-bar{border-top-left-radius:var(--sapElement_BorderCornerRadius);border-top-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar{border-bottom-left-radius:var(--sapElement_BorderCornerRadius);border-bottom-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar .fd-dialog__decisive-button,.fd-dialog__header.fd-bar .fd-dialog__decisive-button{min-width:4rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog__body{border:0;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-block:1rem 1rem;padding-inline:0;position:relative}.fd-dialog__body:after,.fd-dialog__body:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__body--no-vertical-padding{padding-block:0}.fd-dialog__body--no-horizontal-padding{padding-inline:0}.fd-dialog__body:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__body:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__loader{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1.5rem;padding-block:0;padding-inline:0;text-align:center;-webkit-margin-after:.5rem;margin-block-end:.5rem}.fd-dialog__loader:after,.fd-dialog__loader:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;right:-.5rem;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.5rem;cursor:se-resize;font-size:1rem;justify-content:flex-start;line-height:1rem;overflow:hidden;position:absolute;z-index:2}.fd-dialog__resize-handle:after,.fd-dialog__resize-handle:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle[dir=rtl],[dir=rtl] .fd-dialog__resize-handle{cursor:sw-resize;left:-.5rem;right:auto;-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.fd-dialog__resize-handle:after{color:var(--sapButton_Lite_TextColor);content:\"\\e24f\";font-family:SAP-icons;height:1rem;min-width:1rem;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:1rem}.fd-dialog--no-backdrop:not(.fd-dialog--targeted){left:50%;position:fixed;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:1000}.fd-settings .fd-settings__dialog-content{height:var(--fdSettings_Dialog_Content_Height,42.5rem);max-height:var(--fdSettings_Dialog_Content_Max_Height,42.5rem);max-width:var(--fdSettings_Dialog_Content_Max_Width,60rem);min-height:var(--fdSettings_Dialog_Content_Min_Height,42.5rem);min-width:var(--fdSettings_Dialog_Content_Min_Width,60rem)}.fd-settings .fd-settings__dialog-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;padding-block:0;padding-inline:0}.fd-settings .fd-settings__list:is(:first-child){overflow-y:auto}.fd-settings .fd-settings__list a:after{content:var(--fdSettings_List_Nav_Indicator_Content,none)}.fd-settings .fd-settings__list--footer{border-top:.0625rem solid var(--sapList_BorderColor)}.fd-settings .fd-settings__tab-bar{height:100%;overflow-y:hidden}.fd-settings .fd-settings__header{-webkit-margin-before:var(--fdSettings_Header_Margin_Top,1rem);margin-block-start:var(--fdSettings_Header_Margin_Top,1rem)}.fd-settings__list-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;max-width:var(--fdSettings_List_Area_Width,20rem);min-width:var(--fdSettings_List_Area_Width,20rem);width:var(--fdSettings_List_Area_Width,20rem);-webkit-border-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor));border-inline-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor))}.fd-settings__list-area:after,.fd-settings__list-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__list-container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;height:100%;justify-content:space-between;overflow:hidden;position:relative}.fd-settings__list-container:after,.fd-settings__list-container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.fd-settings__detail-area:after,.fd-settings__detail-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area:has(.fd-settings__tab-bar) .fd-settings__header{--fdBar_Shadow:none}.fd-settings__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:100%;line-height:normal;margin-block:0;margin-inline:0;overflow-y:auto;padding-block:0;padding-block:1rem;padding-inline:0;padding-inline:1rem;width:100%}.fd-settings__content:after,.fd-settings__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__content--no-padding{padding-block:0;padding-inline:0}.fd-settings__content--no-background{background:transparent}.fd-settings__container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;height:100%;width:100%}.fd-settings__container:after,.fd-settings__container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings:has(.fd-settings__container--sm){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:100%;--fdSettings_Dialog_Content_Min_Height:100%;--fdSettings_Dialog_Content_Max_Width:100%;--fdSettings_Dialog_Content_Max_Height:100%;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-content{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-body{border-radius:0}.fd-settings:has(.fd-settings__container--md){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:80%;--fdSettings_Dialog_Content_Min_Height:88%;--fdSettings_Dialog_Content_Max_Width:40rem;--fdSettings_Dialog_Content_Max_Height:42.5rem;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--lg),.fd-settings:has(.fd-settings__container--xl){--fdSettings_List_Area_Width:20rem;--fdSettings_Header_Margin_Top:1rem;--fdSettings_List_Nav_Indicator_Content:none;--fdSettings_Dialog_Content_Min_Width:60rem;--fdSettings_Dialog_Content_Min_Height:42.5rem;--fdSettings_Dialog_Content_Max_Width:60rem;--fdSettings_Dialog_Content_Max_Height:42.5rem}.fd-dialog{z-index:999}.fd-dialog__resize-handle{z-index:1001}.fd-dialog__content-full-screen{position:relative!important;inset:0!important;width:100%!important;height:100%!important;min-width:100%!important;max-width:100%!important;min-height:100%!important;max-height:100%!important;transform:none!important}.fd-dialog__content.fd-dialog__content--mobile{height:100%;max-height:100%;max-width:100%;width:100%;position:fixed!important}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__header.fd-bar{border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__footer.fd-bar{border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__footer{overflow:hidden}.fd-dialog__content:has(.fd-dialog__resize-handle){overflow:visible!important}.fd-dialog__body.fd-settings__dialog-body section{width:100%}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup){padding:0!important}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup) section{height:100%;overflow:hidden}\n/*! Bundled license information:\n\nfundamental-styles/dist/settings.css:\n (*!\n * Fundamental Library Styles v0.40.1\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *)\n*/\n"], dependencies: [{ kind: "directive", type: ResizeDirective, selector: "[fdkResize]", inputs: ["fdkResizeBoundary", "fdkResizeDisabled", "fdkResizeClass", "fdkResizeHandleLocation", "fdkResizeResizeHandleRef"], outputs: ["onResizeStart", "onResizeEnd"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i3$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: ScrollbarDirective, selector: "[fdScrollbar], [fd-scrollbar]", inputs: ["noHorizontalScroll", "noVerticalScroll", "alwaysVisible"] }, { kind: "directive", type: ResizeHandleDirective, selector: "[fdkResizeHandle]" }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
847
1008
  }
848
1009
  __decorate([
849
1010
  applyCssClass,
@@ -863,7 +1024,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
863
1024
  ScrollbarDirective,
864
1025
  ResizeHandleDirective,
865
1026
  CdkDragHandle
866
- ], template: "<div\n #dialogWindow\n role=\"dialog\"\n tabindex=\"-1\"\n aria-modal=\"true\"\n fdkResize\n cdkTrapFocus\n cdkDrag\n cdkDragBoundary=\".fd-dialog\"\n fd-scrollbar\n [fdkResizeBoundary]=\"elementRef.nativeElement\"\n class=\"fd-dialog__content\"\n [class]=\"dialogConfig.dialogPanelClass\"\n [class.cdk-drag]=\"dialogConfig.draggable\"\n [class.fd-dialog__content--s]=\"dialogPaddingSize === 'sm'\"\n [class.fd-dialog__content--m]=\"dialogPaddingSize === 'md'\"\n [class.fd-dialog__content--l]=\"dialogPaddingSize === 'lg'\"\n [class.fd-dialog__content--xl]=\"dialogPaddingSize === 'xl'\"\n [class.fd-dialog__content--mobile]=\"dialogConfig.mobile || _fullScreen\"\n [class.fd-dialog__content--no-mobile-stretch]=\"dialogConfig.mobileOuterSpacing\"\n [class.fd-dialog__content--draggable-grab]=\"dialogConfig.draggable && !isDragged\"\n [class.fd-dialog__content--draggable-grabbing]=\"dialogConfig.draggable && isDragged\"\n [class.fd-dialog__content-full-screen]=\"_fullScreen\"\n [class.fd-settings__dialog-content]=\"dialogConfig.settings\"\n [cdkDragDisabled]=\"!dialogConfig.draggable\"\n [fdkResizeDisabled]=\"!dialogConfig.resizable\"\n [attr.id]=\"dialogConfig.id\"\n [attr.aria-label]=\"dialogConfig.ariaLabel\"\n [attr.aria-labelledby]=\"dialogConfig.ariaLabelledBy\"\n [attr.aria-describedby]=\"dialogConfig.ariaDescribedBy\"\n (cdkDragStarted)=\"isDragged = true\"\n (cdkDragEnded)=\"isDragged = false\"\n (onResizeEnd)=\"adjustResponsivePadding()\"\n>\n @if (dialogConfig.resizable && !_fullScreen && !dialogConfig.mobile) {\n <span fdkResizeHandle class=\"fd-dialog__resize-handle\" role=\"presentation\" aria-hidden=\"true\"></span>\n }\n <div cdkDragHandle [cdkDragHandleDisabled]=\"!dialogConfig.draggable\">\n <ng-content select=\"fd-dialog-header\"></ng-content>\n </div>\n <ng-content select=\"fd-dialog-body\"></ng-content>\n <ng-content select=\"fd-dialog-footer\"></ng-content>\n</div>\n", styles: ["@charset \"UTF-8\";.fd-dialog{position:fixed;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog,.fd-dialog:before{height:100%;left:0;top:0;width:100%}.fd-dialog:before{background-color:var(--sapBlockLayer_Background);content:\"\";opacity:var(--sapBlockLayer_Opacity);position:absolute}.fd-dialog__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-shadow:var(--sapContent_Shadow3);box-shadow:var(--sapContent_Shadow3);-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 6%);max-width:calc(100vw - 10%);min-height:7.5rem;min-width:20rem;outline:none;position:absolute}.fd-dialog__body{overflow:auto;-webkit-box-flex:1;-ms-flex-positive:1;background-color:var(--sapGroup_ContentBackground);flex-grow:1}.fd-dialog__footer.fd-bar,.fd-dialog__header.fd-bar,.fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem;-ms-flex-negative:0;flex-shrink:0}.fd-dialog__content--mobile{border-radius:0;height:100vh;max-height:100vh;max-width:100vw;width:100vw}.fd-dialog{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:none;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog:after,.fd-dialog:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog--active{display:-webkit-box;display:-ms-flexbox;display:flex}.fd-dialog__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog__content:after,.fd-dialog__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__content--def .fd-dialog__body,.fd-dialog__content--def .fd-dialog__footer.fd-bar,.fd-dialog__content--def .fd-dialog__header.fd-bar,.fd-dialog__content--def .fd-dialog__subheader.fd-bar,.fd-dialog__content--s .fd-dialog__body,.fd-dialog__content--s .fd-dialog__footer.fd-bar,.fd-dialog__content--s .fd-dialog__header.fd-bar,.fd-dialog__content--s .fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem}.fd-dialog__content--l .fd-dialog__body,.fd-dialog__content--l .fd-dialog__footer.fd-bar,.fd-dialog__content--l .fd-dialog__header.fd-bar,.fd-dialog__content--l .fd-dialog__subheader.fd-bar,.fd-dialog__content--m .fd-dialog__body,.fd-dialog__content--m .fd-dialog__footer.fd-bar,.fd-dialog__content--m .fd-dialog__header.fd-bar,.fd-dialog__content--m .fd-dialog__subheader.fd-bar{padding-inline:2rem 2rem}.fd-dialog__content--xl .fd-dialog__body,.fd-dialog__content--xl .fd-dialog__footer.fd-bar,.fd-dialog__content--xl .fd-dialog__header.fd-bar,.fd-dialog__content--xl .fd-dialog__subheader.fd-bar{padding-inline:3rem 3rem}.fd-dialog__content--mobile .fd-dialog__body,.fd-dialog__content--mobile .fd-dialog__footer,.fd-dialog__content--mobile .fd-dialog__header,.fd-dialog__content--mobile .fd-menu__item:first-child,.fd-dialog__content--mobile .fd-menu__item:first-child .fd-menu__link:after,.fd-dialog__content--mobile .fd-menu__item:last-child,.fd-dialog__content--mobile .fd-menu__item:last-child .fd-menu__link:after{border-radius:0}.fd-dialog__content--no-mobile-stretch{border-radius:var(--sapElement_BorderCornerRadius);max-height:calc(100vh - 6%);max-width:calc(100vw - 10%)}.fd-dialog__content--draggable-grab.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grab:hover .fd-dialog__header{cursor:move;cursor:-webkit-grab;cursor:grab}.fd-dialog__content--draggable-grabbing.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grabbing:hover .fd-dialog__header{cursor:move;cursor:-webkit-grabbing;cursor:grabbing}.fd-dialog__header.fd-bar{border-top-left-radius:var(--sapElement_BorderCornerRadius);border-top-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar{border-bottom-left-radius:var(--sapElement_BorderCornerRadius);border-bottom-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar .fd-dialog__decisive-button,.fd-dialog__header.fd-bar .fd-dialog__decisive-button{min-width:4rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog__body{border:0;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-block:1rem 1rem;padding-inline:0;position:relative}.fd-dialog__body:after,.fd-dialog__body:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__body--no-vertical-padding{padding-block:0}.fd-dialog__body--no-horizontal-padding{padding-inline:0}.fd-dialog__body:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__body:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__loader{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1.5rem;padding-block:0;padding-inline:0;text-align:center;-webkit-margin-after:.5rem;margin-block-end:.5rem}.fd-dialog__loader:after,.fd-dialog__loader:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;right:-.5rem;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.5rem;cursor:se-resize;font-size:1rem;justify-content:flex-start;line-height:1rem;overflow:hidden;position:absolute;z-index:2}.fd-dialog__resize-handle:after,.fd-dialog__resize-handle:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle[dir=rtl],[dir=rtl] .fd-dialog__resize-handle{cursor:sw-resize;left:-.5rem;right:auto;-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.fd-dialog__resize-handle:after{color:var(--sapButton_Lite_TextColor);content:\"\\e24f\";font-family:SAP-icons;height:1rem;min-width:1rem;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:1rem}.fd-dialog--no-backdrop:not(.fd-dialog--targeted){left:50%;position:fixed;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:1000}.fd-settings .fd-settings__dialog-content{height:var(--fdSettings_Dialog_Content_Height,42.5rem);max-height:var(--fdSettings_Dialog_Content_Max_Height,42.5rem);max-width:var(--fdSettings_Dialog_Content_Max_Width,60rem);min-height:var(--fdSettings_Dialog_Content_Min_Height,42.5rem);min-width:var(--fdSettings_Dialog_Content_Min_Width,60rem)}.fd-settings .fd-settings__dialog-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;padding-block:0;padding-inline:0}.fd-settings .fd-settings__list:is(:first-child){overflow-y:auto}.fd-settings .fd-settings__list a:after{content:var(--fdSettings_List_Nav_Indicator_Content,none)}.fd-settings .fd-settings__list--footer{border-top:.0625rem solid var(--sapList_BorderColor)}.fd-settings .fd-settings__tab-bar{height:100%;overflow-y:hidden}.fd-settings .fd-settings__header{-webkit-margin-before:var(--fdSettings_Header_Margin_Top,1rem);margin-block-start:var(--fdSettings_Header_Margin_Top,1rem)}.fd-settings__list-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;max-width:var(--fdSettings_List_Area_Width,20rem);min-width:var(--fdSettings_List_Area_Width,20rem);width:var(--fdSettings_List_Area_Width,20rem);-webkit-border-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor));border-inline-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor))}.fd-settings__list-area:after,.fd-settings__list-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__list-container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;height:100%;justify-content:space-between;overflow:hidden;position:relative}.fd-settings__list-container:after,.fd-settings__list-container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.fd-settings__detail-area:after,.fd-settings__detail-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area:has(.fd-settings__tab-bar) .fd-settings__header{--fdBar_Shadow:none}.fd-settings__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:100%;line-height:normal;margin-block:0;margin-inline:0;overflow-y:auto;padding-block:0;padding-block:1rem;padding-inline:0;padding-inline:1rem;width:100%}.fd-settings__content:after,.fd-settings__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__content--no-padding{padding-block:0;padding-inline:0}.fd-settings__content--no-background{background:transparent}.fd-settings__container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;height:100%;width:100%}.fd-settings__container:after,.fd-settings__container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings:has(.fd-settings__container--sm){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:100%;--fdSettings_Dialog_Content_Min_Height:100%;--fdSettings_Dialog_Content_Max_Width:100%;--fdSettings_Dialog_Content_Max_Height:100%;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-content{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-body{border-radius:0}.fd-settings:has(.fd-settings__container--md){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:80%;--fdSettings_Dialog_Content_Min_Height:88%;--fdSettings_Dialog_Content_Max_Width:40rem;--fdSettings_Dialog_Content_Max_Height:42.5rem;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--lg),.fd-settings:has(.fd-settings__container--xl){--fdSettings_List_Area_Width:20rem;--fdSettings_Header_Margin_Top:1rem;--fdSettings_List_Nav_Indicator_Content:none;--fdSettings_Dialog_Content_Min_Width:60rem;--fdSettings_Dialog_Content_Min_Height:42.5rem;--fdSettings_Dialog_Content_Max_Width:60rem;--fdSettings_Dialog_Content_Max_Height:42.5rem}.fd-dialog{z-index:999}.fd-dialog__resize-handle{z-index:1001}.fd-dialog__content-full-screen{position:relative!important;inset:0!important;width:100%!important;height:100%!important;min-width:100%!important;max-width:100%!important;min-height:100%!important;max-height:100%!important;transform:none!important}.fd-dialog__content.fd-dialog__content--mobile{height:100%;max-height:100%;max-width:100%;width:100%;position:fixed!important}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__header.fd-bar{border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__footer.fd-bar{border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__footer{overflow:hidden}.fd-dialog__content:has(.fd-dialog__resize-handle){overflow:visible!important}.fd-dialog__body.fd-settings__dialog-body section{width:100%}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup){padding:0!important}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup) section{height:100%;overflow:hidden}\n/*! Bundled license information:\n\nfundamental-styles/dist/settings.css:\n (*!\n * Fundamental Library Styles v0.40.1\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *)\n*/\n"] }]
1027
+ ], template: "<div\n #dialogWindow\n role=\"dialog\"\n tabindex=\"-1\"\n aria-modal=\"true\"\n fdkResize\n cdkTrapFocus\n cdkDrag\n cdkDragBoundary=\".fd-dialog\"\n fd-scrollbar\n [fdkResizeBoundary]=\"elementRef.nativeElement\"\n class=\"fd-dialog__content\"\n [class]=\"dialogConfig.dialogPanelClass\"\n [class.cdk-drag]=\"dialogConfig.draggable\"\n [class.fd-dialog__content--s]=\"dialogPaddingSize() === 'sm'\"\n [class.fd-dialog__content--m]=\"dialogPaddingSize() === 'md'\"\n [class.fd-dialog__content--l]=\"dialogPaddingSize() === 'lg'\"\n [class.fd-dialog__content--xl]=\"dialogPaddingSize() === 'xl'\"\n [class.fd-dialog__content--mobile]=\"dialogConfig.mobile || _fullScreen\"\n [class.fd-dialog__content--no-mobile-stretch]=\"dialogConfig.mobileOuterSpacing\"\n [class.fd-dialog__content--draggable-grab]=\"dialogConfig.draggable && !isDragged\"\n [class.fd-dialog__content--draggable-grabbing]=\"dialogConfig.draggable && isDragged\"\n [class.fd-dialog__content-full-screen]=\"_fullScreen\"\n [class.fd-settings__dialog-content]=\"dialogConfig.settings\"\n [cdkDragDisabled]=\"!dialogConfig.draggable\"\n [fdkResizeDisabled]=\"!dialogConfig.resizable\"\n [attr.id]=\"dialogConfig.id\"\n [attr.aria-label]=\"dialogConfig.ariaLabel\"\n [attr.aria-labelledby]=\"dialogConfig.ariaLabelledBy\"\n [attr.aria-describedby]=\"dialogConfig.ariaDescribedBy\"\n (cdkDragStarted)=\"isDragged = true\"\n (cdkDragEnded)=\"isDragged = false\"\n (onResizeEnd)=\"adjustResponsivePadding()\"\n>\n @if (dialogConfig.resizable && !_fullScreen && !dialogConfig.mobile) {\n <span fdkResizeHandle class=\"fd-dialog__resize-handle\" role=\"presentation\" aria-hidden=\"true\"></span>\n }\n <div cdkDragHandle [cdkDragHandleDisabled]=\"!dialogConfig.draggable\">\n <ng-content select=\"fd-dialog-header\"></ng-content>\n </div>\n <ng-content select=\"fd-dialog-body\"></ng-content>\n <ng-content select=\"fd-dialog-footer\"></ng-content>\n</div>\n", styles: ["@charset \"UTF-8\";.fd-dialog{position:fixed;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog,.fd-dialog:before{height:100%;left:0;top:0;width:100%}.fd-dialog:before{background-color:var(--sapBlockLayer_Background);content:\"\";opacity:var(--sapBlockLayer_Opacity);position:absolute}.fd-dialog__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-shadow:var(--sapContent_Shadow3);box-shadow:var(--sapContent_Shadow3);-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 6%);max-width:calc(100vw - 10%);min-height:7.5rem;min-width:20rem;outline:none;position:absolute}.fd-dialog__body{overflow:auto;-webkit-box-flex:1;-ms-flex-positive:1;background-color:var(--sapGroup_ContentBackground);flex-grow:1}.fd-dialog__footer.fd-bar,.fd-dialog__header.fd-bar,.fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem;-ms-flex-negative:0;flex-shrink:0}.fd-dialog__content--mobile{border-radius:0;height:100vh;max-height:100vh;max-width:100vw;width:100vw}.fd-dialog{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:none;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog:after,.fd-dialog:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog--active{display:-webkit-box;display:-ms-flexbox;display:flex}.fd-dialog__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0}.fd-dialog__content:after,.fd-dialog__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__content--def .fd-dialog__body,.fd-dialog__content--def .fd-dialog__footer.fd-bar,.fd-dialog__content--def .fd-dialog__header.fd-bar,.fd-dialog__content--def .fd-dialog__subheader.fd-bar,.fd-dialog__content--s .fd-dialog__body,.fd-dialog__content--s .fd-dialog__footer.fd-bar,.fd-dialog__content--s .fd-dialog__header.fd-bar,.fd-dialog__content--s .fd-dialog__subheader.fd-bar{padding-inline:1rem 1rem}.fd-dialog__content--l .fd-dialog__body,.fd-dialog__content--l .fd-dialog__footer.fd-bar,.fd-dialog__content--l .fd-dialog__header.fd-bar,.fd-dialog__content--l .fd-dialog__subheader.fd-bar,.fd-dialog__content--m .fd-dialog__body,.fd-dialog__content--m .fd-dialog__footer.fd-bar,.fd-dialog__content--m .fd-dialog__header.fd-bar,.fd-dialog__content--m .fd-dialog__subheader.fd-bar{padding-inline:2rem 2rem}.fd-dialog__content--xl .fd-dialog__body,.fd-dialog__content--xl .fd-dialog__footer.fd-bar,.fd-dialog__content--xl .fd-dialog__header.fd-bar,.fd-dialog__content--xl .fd-dialog__subheader.fd-bar{padding-inline:3rem 3rem}.fd-dialog__content--mobile .fd-dialog__body,.fd-dialog__content--mobile .fd-dialog__footer,.fd-dialog__content--mobile .fd-dialog__header,.fd-dialog__content--mobile .fd-menu__item:first-child,.fd-dialog__content--mobile .fd-menu__item:first-child .fd-menu__link:after,.fd-dialog__content--mobile .fd-menu__item:last-child,.fd-dialog__content--mobile .fd-menu__item:last-child .fd-menu__link:after{border-radius:0}.fd-dialog__content--no-mobile-stretch{border-radius:var(--sapElement_BorderCornerRadius);max-height:calc(100vh - 6%);max-width:calc(100vw - 10%)}.fd-dialog__content--draggable-grab.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grab:hover .fd-dialog__header{cursor:move;cursor:-webkit-grab;cursor:grab}.fd-dialog__content--draggable-grabbing.is-hover .fd-dialog__header,.fd-dialog__content--draggable-grabbing:hover .fd-dialog__header{cursor:move;cursor:-webkit-grabbing;cursor:grabbing}.fd-dialog__header.fd-bar{border-top-left-radius:var(--sapElement_BorderCornerRadius);border-top-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar{border-bottom-left-radius:var(--sapElement_BorderCornerRadius);border-bottom-right-radius:var(--sapElement_BorderCornerRadius)}.fd-dialog__footer.fd-bar .fd-dialog__decisive-button,.fd-dialog__header.fd-bar .fd-dialog__decisive-button{min-width:4rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fd-dialog__body{border:0;border-radius:var(--sapElement_BorderCornerRadius);-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-block:1rem 1rem;padding-inline:0;position:relative}.fd-dialog__body:after,.fd-dialog__body:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__body--no-vertical-padding{padding-block:0}.fd-dialog__body--no-horizontal-padding{padding-inline:0}.fd-dialog__body:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__body:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__loader{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;margin-top:1.5rem;padding-block:0;padding-inline:0;text-align:center;-webkit-margin-after:.5rem;margin-block-end:.5rem}.fd-dialog__loader:after,.fd-dialog__loader:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.5rem;line-height:normal;margin-block:0;margin-inline:0;min-width:1.5rem;padding-block:0;padding-inline:0;right:-.5rem;width:1.5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;bottom:-.5rem;cursor:se-resize;font-size:1rem;justify-content:flex-start;line-height:1rem;overflow:hidden;position:absolute;z-index:2}.fd-dialog__resize-handle:after,.fd-dialog__resize-handle:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-dialog__resize-handle[dir=rtl],[dir=rtl] .fd-dialog__resize-handle{cursor:sw-resize;left:-.5rem;right:auto;-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.fd-dialog__resize-handle:after{color:var(--sapButton_Lite_TextColor);content:\"\\e24f\";font-family:SAP-icons;height:1rem;min-width:1rem;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none;width:1rem}.fd-dialog--no-backdrop:not(.fd-dialog--targeted){left:50%;position:fixed;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:1000}.fd-settings .fd-settings__dialog-content{height:var(--fdSettings_Dialog_Content_Height,42.5rem);max-height:var(--fdSettings_Dialog_Content_Max_Height,42.5rem);max-width:var(--fdSettings_Dialog_Content_Max_Width,60rem);min-height:var(--fdSettings_Dialog_Content_Min_Height,42.5rem);min-width:var(--fdSettings_Dialog_Content_Min_Width,60rem)}.fd-settings .fd-settings__dialog-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;padding-block:0;padding-inline:0}.fd-settings .fd-settings__list:is(:first-child){overflow-y:auto}.fd-settings .fd-settings__list a:after{content:var(--fdSettings_List_Nav_Indicator_Content,none)}.fd-settings .fd-settings__list--footer{border-top:.0625rem solid var(--sapList_BorderColor)}.fd-settings .fd-settings__tab-bar{height:100%;overflow-y:hidden}.fd-settings .fd-settings__header{-webkit-margin-before:var(--fdSettings_Header_Margin_Top,1rem);margin-block-start:var(--fdSettings_Header_Margin_Top,1rem)}.fd-settings__list-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;max-width:var(--fdSettings_List_Area_Width,20rem);min-width:var(--fdSettings_List_Area_Width,20rem);width:var(--fdSettings_List_Area_Width,20rem);-webkit-border-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor));border-inline-end:var(--fdSettings_List_Area_Border,.0625rem solid var(--sapList_BorderColor))}.fd-settings__list-area:after,.fd-settings__list-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__list-container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;height:100%;justify-content:space-between;overflow:hidden;position:relative}.fd-settings__list-container:after,.fd-settings__list-container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.fd-settings__detail-area:after,.fd-settings__detail-area:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__detail-area:has(.fd-settings__tab-bar) .fd-settings__header{--fdBar_Shadow:none}.fd-settings__content{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:100%;line-height:normal;margin-block:0;margin-inline:0;overflow-y:auto;padding-block:0;padding-block:1rem;padding-inline:0;padding-inline:1rem;width:100%}.fd-settings__content:after,.fd-settings__content:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings__content--no-padding{padding-block:0;padding-inline:0}.fd-settings__content--no-background{background:transparent}.fd-settings__container{border:0;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--sapTextColor);display:-webkit-box;display:-ms-flexbox;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:normal;margin-block:0;margin-inline:0;padding-block:0;padding-inline:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;height:100%;width:100%}.fd-settings__container:after,.fd-settings__container:before{-webkit-box-sizing:inherit;box-sizing:inherit;font-size:inherit}.fd-settings:has(.fd-settings__container--sm){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:100%;--fdSettings_Dialog_Content_Min_Height:100%;--fdSettings_Dialog_Content_Max_Width:100%;--fdSettings_Dialog_Content_Max_Height:100%;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-content{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.fd-settings:has(.fd-settings__container--sm) .fd-settings__dialog-body{border-radius:0}.fd-settings:has(.fd-settings__container--md){--fdSettings_List_Area_Width:100%;--fdSettings_Header_Margin_Top:0;--fdSettings_List_Nav_Indicator_Content:\"\\e1ed\";--fdSettings_Dialog_Content_Min_Width:80%;--fdSettings_Dialog_Content_Min_Height:88%;--fdSettings_Dialog_Content_Max_Width:40rem;--fdSettings_Dialog_Content_Max_Height:42.5rem;--fdSettings_List_Area_Border:none}.fd-settings:has(.fd-settings__container--lg),.fd-settings:has(.fd-settings__container--xl){--fdSettings_List_Area_Width:20rem;--fdSettings_Header_Margin_Top:1rem;--fdSettings_List_Nav_Indicator_Content:none;--fdSettings_Dialog_Content_Min_Width:60rem;--fdSettings_Dialog_Content_Min_Height:42.5rem;--fdSettings_Dialog_Content_Max_Width:60rem;--fdSettings_Dialog_Content_Max_Height:42.5rem}.fd-dialog{z-index:999}.fd-dialog__resize-handle{z-index:1001}.fd-dialog__content-full-screen{position:relative!important;inset:0!important;width:100%!important;height:100%!important;min-width:100%!important;max-width:100%!important;min-height:100%!important;max-height:100%!important;transform:none!important}.fd-dialog__content.fd-dialog__content--mobile{height:100%;max-height:100%;max-width:100%;width:100%;position:fixed!important}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__header.fd-bar{border-top-left-radius:0;border-top-right-radius:0}.fd-dialog__content.fd-dialog__content--mobile .fd-dialog__footer.fd-bar{border-bottom-left-radius:0;border-bottom-right-radius:0}.fd-dialog__footer{overflow:hidden}.fd-dialog__content:has(.fd-dialog__resize-handle){overflow:visible!important}.fd-dialog__body.fd-settings__dialog-body section{width:100%}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup){padding:0!important}.fd-dialog__body:has(.fd-navigation.fd-navigation--popup) section{height:100%;overflow:hidden}\n/*! Bundled license information:\n\nfundamental-styles/dist/settings.css:\n (*!\n * Fundamental Library Styles v0.40.1\n * Copyright (c) 2025 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *)\n*/\n"] }]
867
1028
  }], ctorParameters: () => [{ type: DialogConfig, decorators: [{
868
1029
  type: Optional
869
1030
  }] }, { type: DialogRef, decorators: [{
@@ -1150,11 +1311,11 @@ class DialogService extends DialogBaseService {
1150
1311
  const componentRef = overlayRef.attach(portal);
1151
1312
  componentRef.instance.childContent = content;
1152
1313
  componentRef.instance.dialogConfig = dialogConfig;
1153
- this._dialogs.push(componentRef);
1314
+ // Register dialog for tracking (replaces manual push)
1315
+ this._registerDialog(componentRef);
1154
1316
  this.htmlElement && (this.htmlElement.style.overflow = 'hidden');
1155
1317
  dialogRef._endClose$.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {
1156
1318
  this._destroyDialog(componentRef);
1157
- componentRef.destroy();
1158
1319
  overlayRef.dispose();
1159
1320
  this.htmlElement && (this.htmlElement.style.overflow = '');
1160
1321
  if (dialogConfig?.focusTrapped && previouslyFocusedElement) {
@@ -1321,9 +1482,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
1321
1482
  }]
1322
1483
  }] });
1323
1484
 
1485
+ /**
1486
+ * Base class for dialog content configuration.
1487
+ * Defines common properties for dialog titles, content, buttons, and accessibility attributes.
1488
+ */
1324
1489
  class DialogContentBase {
1325
1490
  constructor() {
1326
- /** Dialog Title Heading Level. Default is 1 */
1491
+ /**
1492
+ * Semantic heading level for the dialog title.
1493
+ * Determines which HTML heading tag (h1-h6) to use for proper document outline.
1494
+ * @default 1
1495
+ * @example 2 // renders as <h2>
1496
+ */
1327
1497
  this.titleHeadingLevel = 1;
1328
1498
  }
1329
1499
  }