@acontplus/ng-components 2.1.13 → 2.1.15

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 { input, booleanAttribute, output, ViewEncapsulation, Component, inject, viewChild, ViewContainerRef, ChangeDetectionStrategy, effect, Injectable, computed, PLATFORM_ID, signal, Input, TemplateRef, Pipe, Directive, ViewChild, KeyValueDiffers, ChangeDetectorRef, InjectionToken, ANIMATION_MODULE_TYPE, HostListener, ContentChildren, model, forwardRef, EventEmitter, ApplicationRef, Injector, DOCUMENT, ElementRef, NgZone, ContentChild, Output, Renderer2, createComponent, EnvironmentInjector } from '@angular/core';
2
+ import { input, booleanAttribute, output, ViewEncapsulation, Component, Injectable, inject, viewChild, ViewContainerRef, ChangeDetectionStrategy, effect, computed, PLATFORM_ID, signal, Input, TemplateRef, Pipe, Directive, ViewChild, KeyValueDiffers, ChangeDetectorRef, InjectionToken, ANIMATION_MODULE_TYPE, HostListener, ContentChildren, model, forwardRef, EventEmitter, ApplicationRef, Injector, DOCUMENT, ElementRef, NgZone, ContentChild, Output, Renderer2, createComponent, EnvironmentInjector } from '@angular/core';
3
3
  import * as i1 from '@angular/material/card';
4
4
  import { MatCardModule } from '@angular/material/card';
5
5
  import * as i2 from '@angular/material/button';
@@ -341,6 +341,175 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
341
341
  ], encapsulation: ViewEncapsulation.None, template: "@switch (matStyle()) { @case ('text') {\n<button\n matButton\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @case ('elevated') {\n<button\n matButton=\"elevated\"\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @case ('outlined') {\n<button\n matButton=\"outlined\"\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @case ('tonal') {\n<button\n matButton=\"tonal\"\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @case ('icon') {\n<button\n matIconButton\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @case ('fab') {\n<button\n matFab\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @case ('mini-fab') {\n<button\n matMiniFab\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @case ('extended-fab') {\n<button\n matFab\n extended\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} @default {\n<button\n matButton=\"filled\"\n [ngClass]=\"getButtonClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n [title]=\"getTitle()\"\n [attr.aria-label]=\"ariaLabel() || getTitle()\"\n [attr.name]=\"name()\"\n [attr.id]=\"id()\"\n [attr.form]=\"form()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.data-testid]=\"testId()\"\n (click)=\"handleClick.emit($event)\"\n>\n <ng-container [ngTemplateOutlet]=\"buttonContent\" />\n</button>\n} }\n\n<ng-template #buttonContent>\n @if (getIcon()) {\n <mat-icon>{{ getIcon() }}</mat-icon>\n } @if (getDisplayText()) { {{ getDisplayText() }} }\n\n <ng-content />\n</ng-template>\n", styles: [":root{--acp-secondary: #e0e0e0;--acp-secondary-on: #000000;--acp-success: #4caf50;--acp-success-on: #ffffff;--acp-danger: #ba1a1a;--acp-danger-on: #ffffff;--acp-warning: #ff9800;--acp-warning-on: #000000;--acp-info: #2196f3;--acp-info-on: #ffffff;--acp-dark: #212121;--acp-dark-on: #ffffff}.dark-theme{--acp-secondary: #424242;--acp-secondary-on: #ffffff;--acp-success: #81c784;--acp-success-on: #1b5e20;--acp-danger: #ef5350;--acp-danger-on: #b71c1c;--acp-warning: #ffb74d;--acp-warning-on: #e65100;--acp-info: #64b5f6;--acp-info-on: #0d47a1;--acp-dark: #616161;--acp-dark-on: #ffffff}acp-button{display:inline-block}.mat-mdc-button .mdc-button__label,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-outlined-button .mdc-button__label,button[matbutton=tonal] .mdc-button__label,.mat-mdc-fab.mdc-fab--extended .mdc-button__label{display:flex;align-items:center;gap:8px}.mat-mdc-button.mat-btn-secondary,.mat-mdc-unelevated-button.mat-btn-secondary{background-color:var(--acp-secondary)!important;color:var(--acp-secondary-on)!important}.mat-mdc-button.mat-btn-secondary:hover,.mat-mdc-unelevated-button.mat-btn-secondary:hover{background-color:color-mix(in srgb,var(--acp-secondary) 80%,black)!important}.mat-mdc-button.mat-btn-success,.mat-mdc-unelevated-button.mat-btn-success{background-color:var(--acp-success)!important;color:var(--acp-success-on)!important}.mat-mdc-button.mat-btn-danger,.mat-mdc-unelevated-button.mat-btn-danger{background-color:var(--acp-danger)!important;color:var(--acp-danger-on)!important}.mat-mdc-button.mat-btn-warning,.mat-mdc-unelevated-button.mat-btn-warning{background-color:var(--acp-warning)!important;color:var(--acp-warning-on)!important}.mat-mdc-button.mat-btn-info,.mat-mdc-unelevated-button.mat-btn-info{background-color:var(--acp-info)!important;color:var(--acp-info-on)!important}.mat-mdc-button.mat-btn-dark,.mat-mdc-unelevated-button.mat-btn-dark{background-color:var(--acp-dark)!important;color:var(--acp-dark-on)!important}button[matbutton=tonal].mat-btn-success{background-color:color-mix(in srgb,var(--acp-success) 12%,transparent)!important;color:var(--acp-success)!important}button[matbutton=tonal].mat-btn-danger{background-color:color-mix(in srgb,var(--acp-danger) 12%,transparent)!important;color:var(--acp-danger)!important}button[matbutton=tonal].mat-btn-warning{background-color:color-mix(in srgb,var(--acp-warning) 12%,transparent)!important;color:var(--acp-warning)!important}button[matbutton=tonal].mat-btn-info{background-color:color-mix(in srgb,var(--acp-info) 12%,transparent)!important;color:var(--acp-info)!important}button[matbutton=tonal].mat-btn-dark{background-color:color-mix(in srgb,var(--acp-dark) 12%,transparent)!important;color:var(--acp-dark)!important}.mat-mdc-button:not(.mat-mdc-unelevated-button):not(.mat-mdc-raised-button):not(.mat-mdc-outlined-button).mat-btn-secondary{color:var(--mat-sys-on-surface)!important}.mat-mdc-button:not(.mat-mdc-unelevated-button):not(.mat-mdc-raised-button):not(.mat-mdc-outlined-button).mat-btn-success{color:var(--acp-success)!important}.mat-mdc-button:not(.mat-mdc-unelevated-button):not(.mat-mdc-raised-button):not(.mat-mdc-outlined-button).mat-btn-danger{color:var(--acp-danger)!important}.mat-mdc-button:not(.mat-mdc-unelevated-button):not(.mat-mdc-raised-button):not(.mat-mdc-outlined-button).mat-btn-warning{color:var(--acp-warning)!important}.mat-mdc-button:not(.mat-mdc-unelevated-button):not(.mat-mdc-raised-button):not(.mat-mdc-outlined-button).mat-btn-info{color:var(--acp-info)!important}.mat-mdc-button:not(.mat-mdc-unelevated-button):not(.mat-mdc-raised-button):not(.mat-mdc-outlined-button).mat-btn-dark{color:var(--acp-dark)!important}.mat-mdc-raised-button.mat-btn-secondary{background-color:var(--mat-sys-surface-container-low)!important;color:var(--mat-sys-on-surface)!important}.mat-mdc-raised-button.mat-btn-success{background-color:var(--mat-sys-surface-container-low)!important;color:var(--acp-success)!important}.mat-mdc-raised-button.mat-btn-success:hover{background-color:color-mix(in srgb,var(--acp-success) 12%,transparent)!important}.mat-mdc-raised-button.mat-btn-danger{background-color:var(--mat-sys-surface-container-low)!important;color:var(--acp-danger)!important}.mat-mdc-raised-button.mat-btn-danger:hover{background-color:color-mix(in srgb,var(--acp-danger) 12%,transparent)!important}.mat-mdc-raised-button.mat-btn-warning{background-color:var(--mat-sys-surface-container-low)!important;color:var(--acp-warning)!important}.mat-mdc-raised-button.mat-btn-warning:hover{background-color:color-mix(in srgb,var(--acp-warning) 12%,transparent)!important}.mat-mdc-raised-button.mat-btn-info{background-color:var(--mat-sys-surface-container-low)!important;color:var(--acp-info)!important}.mat-mdc-raised-button.mat-btn-info:hover{background-color:color-mix(in srgb,var(--acp-info) 12%,transparent)!important}.mat-mdc-raised-button.mat-btn-dark{background-color:var(--mat-sys-surface-container-low)!important;color:var(--acp-dark)!important}.mat-mdc-raised-button.mat-btn-dark:hover{background-color:color-mix(in srgb,var(--acp-dark) 12%,transparent)!important}.mat-mdc-outlined-button.mat-btn-secondary{border-color:var(--mat-sys-outline)!important;color:var(--mat-sys-on-surface)!important}.mat-mdc-outlined-button.mat-btn-success{border-color:var(--acp-success)!important;color:var(--acp-success)!important}.mat-mdc-outlined-button.mat-btn-danger{border-color:var(--acp-danger)!important;color:var(--acp-danger)!important}.mat-mdc-outlined-button.mat-btn-warning{border-color:var(--acp-warning)!important;color:var(--acp-warning)!important}.mat-mdc-outlined-button.mat-btn-info{border-color:var(--acp-info)!important;color:var(--acp-info)!important}.mat-mdc-outlined-button.mat-btn-dark{border-color:var(--acp-dark)!important;color:var(--acp-dark)!important}.mat-mdc-fab.mat-btn-secondary,.mat-mdc-mini-fab.mat-btn-secondary{background-color:var(--acp-secondary)!important;color:var(--acp-secondary-on)!important}.mat-mdc-fab.mat-btn-success,.mat-mdc-mini-fab.mat-btn-success{background-color:var(--acp-success)!important;color:var(--acp-success-on)!important}.mat-mdc-fab.mat-btn-danger,.mat-mdc-mini-fab.mat-btn-danger{background-color:var(--acp-danger)!important;color:var(--acp-danger-on)!important}.mat-mdc-fab.mat-btn-warning,.mat-mdc-mini-fab.mat-btn-warning{background-color:var(--acp-warning)!important;color:var(--acp-warning-on)!important}.mat-mdc-fab.mat-btn-info,.mat-mdc-mini-fab.mat-btn-info{background-color:var(--acp-info)!important;color:var(--acp-info-on)!important}.mat-mdc-fab.mat-btn-dark,.mat-mdc-mini-fab.mat-btn-dark{background-color:var(--acp-dark)!important;color:var(--acp-dark-on)!important}.mat-mdc-icon-button.mat-btn-secondary{color:var(--mat-sys-on-surface)!important}.mat-mdc-icon-button.mat-btn-success{color:var(--acp-success)!important}.mat-mdc-icon-button.mat-btn-danger{color:var(--acp-danger)!important}.mat-mdc-icon-button.mat-btn-warning{color:var(--acp-warning)!important}.mat-mdc-icon-button.mat-btn-info{color:var(--acp-info)!important}.mat-mdc-icon-button.mat-btn-dark{color:var(--acp-dark)!important}\n"] }]
342
342
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], matStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "matStyle", required: false }] }], customClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "customClass", required: false }] }], reportFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "reportFormat", required: false }] }], extended: [{ type: i0.Input, args: [{ isSignal: true, alias: "extended", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], testId: [{ type: i0.Input, args: [{ isSignal: true, alias: "testId", required: false }] }], handleClick: [{ type: i0.Output, args: ["handleClick"] }] } });
343
343
 
344
+ /**
345
+ * Servicio centralizado para manejar z-index de todos los diálogos
346
+ * Asegura que los diálogos siempre aparezcan en el orden correcto
347
+ * Los AlertDialogs siempre tienen prioridad sobre otros diálogos
348
+ */
349
+ class DialogZIndexService {
350
+ // Rangos de z-index por tipo de diálogo
351
+ static Z_INDEX_RANGES = {
352
+ normal: { base: 1000, current: 1000 }, // Diálogos normales: 1000-1999
353
+ alert: { base: 2000, current: 2000 }, // AlertDialogs: 2000-2999 (siempre encima)
354
+ toast: { base: 3000, current: 3000 }, // Toasts: 3000-3999 (máxima prioridad)
355
+ };
356
+ static Z_INDEX_INCREMENT = 10;
357
+ /**
358
+ * Obtiene el siguiente z-index disponible para un tipo específico de diálogo
359
+ * @param type Tipo de diálogo (normal, alert, toast)
360
+ * @returns El próximo z-index a usar
361
+ */
362
+ getNextZIndex(type = 'normal') {
363
+ const range = DialogZIndexService.Z_INDEX_RANGES[type];
364
+ range.current += DialogZIndexService.Z_INDEX_INCREMENT;
365
+ return range.current;
366
+ }
367
+ /**
368
+ * Obtiene el z-index actual más alto para un tipo específico
369
+ * @param type Tipo de diálogo
370
+ * @returns El z-index más alto actualmente en uso para ese tipo
371
+ */
372
+ getCurrentZIndex(type = 'normal') {
373
+ return DialogZIndexService.Z_INDEX_RANGES[type].current;
374
+ }
375
+ /**
376
+ * Obtiene el z-index más alto de todos los tipos
377
+ * @returns El z-index más alto de todos los diálogos
378
+ */
379
+ getHighestZIndex() {
380
+ return Math.max(...Object.values(DialogZIndexService.Z_INDEX_RANGES).map(range => range.current));
381
+ }
382
+ /**
383
+ * Resetea el contador de z-index (útil para testing)
384
+ * @param type Tipo específico a resetear, o undefined para resetear todos
385
+ */
386
+ reset(type) {
387
+ if (type) {
388
+ const range = DialogZIndexService.Z_INDEX_RANGES[type];
389
+ range.current = range.base;
390
+ }
391
+ else {
392
+ // Resetear todos los tipos
393
+ Object.entries(DialogZIndexService.Z_INDEX_RANGES).forEach(([_, range]) => {
394
+ range.current = range.base;
395
+ });
396
+ }
397
+ }
398
+ /**
399
+ * Aplica z-index a un diálogo específico
400
+ * @param dialogRef Referencia al diálogo
401
+ * @param type Tipo de diálogo (determina el rango de z-index)
402
+ * @param zIndex Z-index específico a aplicar (opcional)
403
+ */
404
+ applyZIndex(dialogRef, type = 'normal', zIndex) {
405
+ const targetZIndex = zIndex || this.getNextZIndex(type);
406
+ setTimeout(() => {
407
+ const overlayRef = dialogRef._overlayRef;
408
+ if (overlayRef) {
409
+ const pane = overlayRef.overlayElement;
410
+ const backdrop = overlayRef.backdropElement;
411
+ if (pane) {
412
+ pane.style.zIndex = (targetZIndex + 2).toString();
413
+ // Agregar atributo data para debugging
414
+ pane.setAttribute('data-dialog-type', type);
415
+ pane.setAttribute('data-z-index', targetZIndex.toString());
416
+ // Para toasts, agregar clase especial para styling
417
+ if (type === 'toast') {
418
+ pane.classList.add('toast-overlay');
419
+ // Los toasts no deben bloquear interacciones
420
+ pane.style.pointerEvents = 'none';
421
+ // Pero el contenido del toast sí debe ser clickeable
422
+ const dialogContainer = pane.querySelector('.mat-mdc-dialog-container, .mat-dialog-container');
423
+ if (dialogContainer) {
424
+ dialogContainer.style.pointerEvents = 'auto';
425
+ }
426
+ }
427
+ }
428
+ // Los toasts no tienen backdrop, pero si existe, configurarlo
429
+ if (backdrop && type !== 'toast') {
430
+ backdrop.style.zIndex = (targetZIndex + 1).toString();
431
+ }
432
+ }
433
+ }, 0);
434
+ }
435
+ /**
436
+ * Trae un diálogo al frente (usado por drag functionality)
437
+ * @param element Elemento del diálogo a traer al frente
438
+ * @param type Tipo de diálogo
439
+ */
440
+ bringToFront(element, type = 'normal') {
441
+ const pane = element.closest('.cdk-overlay-pane');
442
+ if (pane) {
443
+ const newZIndex = this.getNextZIndex(type);
444
+ pane.style.zIndex = (newZIndex + 2).toString();
445
+ pane.setAttribute('data-z-index', newZIndex.toString());
446
+ // También actualizar el backdrop si existe
447
+ const backdrop = pane.parentElement?.querySelector('.cdk-overlay-backdrop');
448
+ if (backdrop) {
449
+ backdrop.style.zIndex = (newZIndex + 1).toString();
450
+ }
451
+ }
452
+ }
453
+ /**
454
+ * Fuerza un diálogo a estar siempre encima de todos los demás
455
+ * Útil para alertas críticas que deben tener máxima prioridad
456
+ * @param dialogRef Referencia al diálogo
457
+ */
458
+ forceToTop(dialogRef) {
459
+ const highestZIndex = this.getHighestZIndex();
460
+ const topZIndex = highestZIndex + DialogZIndexService.Z_INDEX_INCREMENT;
461
+ setTimeout(() => {
462
+ const overlayRef = dialogRef._overlayRef;
463
+ if (overlayRef) {
464
+ const pane = overlayRef.overlayElement;
465
+ const backdrop = overlayRef.backdropElement;
466
+ if (pane) {
467
+ pane.style.zIndex = (topZIndex + 2).toString();
468
+ pane.setAttribute('data-z-index', topZIndex.toString());
469
+ pane.setAttribute('data-forced-top', 'true');
470
+ }
471
+ if (backdrop) {
472
+ backdrop.style.zIndex = (topZIndex + 1).toString();
473
+ }
474
+ }
475
+ }, 0);
476
+ }
477
+ /**
478
+ * Obtiene todos los toasts activos
479
+ * @returns Array de elementos de toast activos
480
+ */
481
+ getActiveToasts() {
482
+ return Array.from(document.querySelectorAll('.cdk-overlay-pane[data-dialog-type="toast"]'));
483
+ }
484
+ /**
485
+ * Cierra todos los toasts activos
486
+ */
487
+ closeAllToasts() {
488
+ const toasts = this.getActiveToasts();
489
+ toasts.forEach(toast => {
490
+ const closeButton = toast.querySelector('[mat-dialog-close], .toast-close-button');
491
+ if (closeButton) {
492
+ closeButton.click();
493
+ }
494
+ });
495
+ }
496
+ /**
497
+ * Obtiene el número de toasts activos
498
+ * @returns Número de toasts actualmente visibles
499
+ */
500
+ getActiveToastCount() {
501
+ return this.getActiveToasts().length;
502
+ }
503
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DialogZIndexService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
504
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DialogZIndexService, providedIn: 'root' });
505
+ }
506
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DialogZIndexService, decorators: [{
507
+ type: Injectable,
508
+ args: [{
509
+ providedIn: 'root',
510
+ }]
511
+ }] });
512
+
344
513
  /**
345
514
  * A wrapper component for Angular Material dialogs that provides a consistent look and feel,
346
515
  * including a draggable header and the ability to dynamically create components inside the dialog.
@@ -350,21 +519,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
350
519
  class DialogWrapper {
351
520
  dialogRef = inject(MatDialogRef);
352
521
  config = inject(MAT_DIALOG_DATA);
522
+ zIndexService = inject(DialogZIndexService);
353
523
  /**
354
524
  * A template reference that acts as an anchor for dynamic content.
355
525
  * This is where the component specified in the config will be rendered.
356
526
  */
357
- contentHost = viewChild.required('contentHost', { read: ViewContainerRef });
527
+ contentHost = viewChild.required('contentHost', {
528
+ read: ViewContainerRef,
529
+ });
358
530
  /**
359
531
  * A reference to the header element for the z-index focus logic.
360
532
  * Used to bring the dialog to the front when clicked.
361
533
  */
362
534
  header = viewChild('dialogHeader', ...(ngDevMode ? [{ debugName: "header" }] : []));
363
- /**
364
- * Static counter to track the highest z-index for multiple dialogs.
365
- * Ensures that the most recently clicked dialog appears on top.
366
- */
367
- static lastZIndex = 1000;
368
535
  /**
369
536
  * Timeout ID for debouncing z-index updates to prevent excessive DOM manipulations.
370
537
  */
@@ -410,22 +577,14 @@ class DialogWrapper {
410
577
  }
411
578
  /**
412
579
  * Brings the dialog to the front by adjusting its z-index.
413
- * Uses requestAnimationFrame to debounce updates and prevent excessive DOM manipulations.
580
+ * Uses the centralized DialogZIndexService for consistent z-index management.
414
581
  * Called when the dialog header is clicked.
415
582
  */
416
583
  bringToFront() {
417
- // Clear any pending update
418
- if (this.bringToFrontTimeoutId !== null) {
419
- cancelAnimationFrame(this.bringToFrontTimeoutId);
584
+ const headerElement = this.header()?.nativeElement;
585
+ if (headerElement) {
586
+ this.zIndexService.bringToFront(headerElement);
420
587
  }
421
- // Schedule the z-index update for the next animation frame
422
- this.bringToFrontTimeoutId = requestAnimationFrame(() => {
423
- const pane = this.header()?.nativeElement.closest('.cdk-overlay-pane');
424
- if (pane) {
425
- pane.style.zIndex = (++DialogWrapper.lastZIndex).toString();
426
- }
427
- this.bringToFrontTimeoutId = null;
428
- });
429
588
  }
430
589
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DialogWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component });
431
590
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DialogWrapper, isStandalone: true, selector: "acp-dialog-wrapper", viewQueries: [{ propertyName: "contentHost", first: true, predicate: ["contentHost"], descendants: true, read: ViewContainerRef, isSignal: true }, { propertyName: "header", first: true, predicate: ["dialogHeader"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (!config.hideHeader) {\n<div\n class=\"acp-dialog-header\"\n cdkDrag\n cdkDragRootElement=\".cdk-overlay-pane\"\n cdkDragHandle\n #dialogHeader\n (mousedown)=\"bringToFront()\"\n>\n <h6 mat-dialog-title class=\"acp-dialog-title\">\n @if (config.icon) {\n <mat-icon class=\"acp-dialog-title-icon\" aria-hidden=\"true\">{{ config.icon }}</mat-icon>\n }\n <span>{{ config.title }}</span>\n @if (config.showCloseButton !== false) {\n <acp-button\n [customClass]=\"'acp-dialog-close-btn'\"\n matStyle=\"icon\"\n icon=\"close\"\n (handleClick)=\"onClose()\"\n ariaLabel=\"Close Dialog\"\n />\n }\n </h6>\n</div>\n}\n\n<ng-template #contentHost />\n", styles: [".acp-dialog-header{cursor:move;border-bottom:1px solid var(--mat-sys-outline-variant, #dee2e6);color:var(--mat-sys-on-surface, #212529);position:relative}h6[mat-dialog-title].acp-dialog-title{display:flex;align-items:center;font-size:1.2rem;font-weight:500;margin:0;width:100%;padding-right:48px}.acp-dialog-title-icon{margin-right:12px;vertical-align:middle}h6[mat-dialog-title].acp-dialog-title span{flex-grow:1}mat-dialog-content{padding:24px}.acp-dialog-close-btn{position:absolute;top:8px;right:16px}\n"], dependencies: [{ 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: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i2$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: Button, selector: "acp-button", inputs: ["variant", "text", "icon", "disabled", "type", "matStyle", "customClass", "reportFormat", "extended", "title", "ariaLabel", "name", "id", "form", "tabIndex", "testId"], outputs: ["handleClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
@@ -433,7 +592,9 @@ class DialogWrapper {
433
592
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DialogWrapper, decorators: [{
434
593
  type: Component,
435
594
  args: [{ selector: 'acp-dialog-wrapper', standalone: true, imports: [CdkDrag, CdkDragHandle, MatDialogModule, MatIconModule, Button], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if (!config.hideHeader) {\n<div\n class=\"acp-dialog-header\"\n cdkDrag\n cdkDragRootElement=\".cdk-overlay-pane\"\n cdkDragHandle\n #dialogHeader\n (mousedown)=\"bringToFront()\"\n>\n <h6 mat-dialog-title class=\"acp-dialog-title\">\n @if (config.icon) {\n <mat-icon class=\"acp-dialog-title-icon\" aria-hidden=\"true\">{{ config.icon }}</mat-icon>\n }\n <span>{{ config.title }}</span>\n @if (config.showCloseButton !== false) {\n <acp-button\n [customClass]=\"'acp-dialog-close-btn'\"\n matStyle=\"icon\"\n icon=\"close\"\n (handleClick)=\"onClose()\"\n ariaLabel=\"Close Dialog\"\n />\n }\n </h6>\n</div>\n}\n\n<ng-template #contentHost />\n", styles: [".acp-dialog-header{cursor:move;border-bottom:1px solid var(--mat-sys-outline-variant, #dee2e6);color:var(--mat-sys-on-surface, #212529);position:relative}h6[mat-dialog-title].acp-dialog-title{display:flex;align-items:center;font-size:1.2rem;font-weight:500;margin:0;width:100%;padding-right:48px}.acp-dialog-title-icon{margin-right:12px;vertical-align:middle}h6[mat-dialog-title].acp-dialog-title span{flex-grow:1}mat-dialog-content{padding:24px}.acp-dialog-close-btn{position:absolute;top:8px;right:16px}\n"] }]
436
- }], ctorParameters: () => [], propDecorators: { contentHost: [{ type: i0.ViewChild, args: ['contentHost', { ...{ read: ViewContainerRef }, isSignal: true }] }], header: [{ type: i0.ViewChild, args: ['dialogHeader', { isSignal: true }] }] } });
595
+ }], ctorParameters: () => [], propDecorators: { contentHost: [{ type: i0.ViewChild, args: ['contentHost', { ...{
596
+ read: ViewContainerRef,
597
+ }, isSignal: true }] }], header: [{ type: i0.ViewChild, args: ['dialogHeader', { isSignal: true }] }] } });
437
598
 
438
599
  class DynamicSelect {
439
600
  // Basic inputs
@@ -998,6 +1159,7 @@ class AdvancedDialogService {
998
1159
  dialog = inject(MatDialog);
999
1160
  overlay = inject(Overlay);
1000
1161
  breakpointObserver = inject(BreakpointObserver);
1162
+ zIndexService = inject(DialogZIndexService);
1001
1163
  // An observable that emits true if the viewport matches mobile dimensions.
1002
1164
  isMobile$ = this.breakpointObserver
1003
1165
  .observe([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape])
@@ -1011,7 +1173,10 @@ class AdvancedDialogService {
1011
1173
  */
1012
1174
  async open(component, config = {}) {
1013
1175
  const dialogConfig = await this.buildDialogConfig(config);
1014
- return this.dialog.open(component, dialogConfig);
1176
+ const dialogRef = this.dialog.open(component, dialogConfig);
1177
+ // Aplicar z-index centralizado
1178
+ this.zIndexService.applyZIndex(dialogRef);
1179
+ return dialogRef;
1015
1180
  }
1016
1181
  /**
1017
1182
  * A powerful helper to open a component inside our standard, branded "wrapper".
@@ -1027,7 +1192,10 @@ class AdvancedDialogService {
1027
1192
  data: wrapperConfig,
1028
1193
  };
1029
1194
  const dialogConfig = await this.buildDialogConfig(configWithWrapperData);
1030
- return this.dialog.open(DialogWrapper, dialogConfig);
1195
+ const dialogRef = this.dialog.open(DialogWrapper, dialogConfig);
1196
+ // Aplicar z-index centralizado
1197
+ this.zIndexService.applyZIndex(dialogRef);
1198
+ return dialogRef;
1031
1199
  }
1032
1200
  /**
1033
1201
  * Helper to open a dialog and only get an observable of the result.
@@ -1624,6 +1792,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
1624
1792
 
1625
1793
  class AlertDialogService {
1626
1794
  dialog = inject(MatDialog);
1795
+ zIndexService = inject(DialogZIndexService);
1627
1796
  defaultOptions = {
1628
1797
  width: '400px',
1629
1798
  showConfirmButton: true,
@@ -1642,6 +1811,9 @@ class AlertDialogService {
1642
1811
  scrollbarPadding: true,
1643
1812
  position: 'center',
1644
1813
  draggable: false,
1814
+ allowMultiple: false, // Por defecto no permitir múltiples alerts
1815
+ forceToTop: true, // Por defecto los alerts siempre van encima
1816
+ dialogType: 'alert', // Por defecto usar el tipo alert (z-index alto)
1645
1817
  // Nuevas opciones por defecto
1646
1818
  layout: 'modern',
1647
1819
  iconPosition: 'left',
@@ -1689,6 +1861,9 @@ class AlertDialogService {
1689
1861
  scrollbarPadding: true,
1690
1862
  position: 'center',
1691
1863
  draggable: false,
1864
+ allowMultiple: false,
1865
+ forceToTop: true,
1866
+ dialogType: 'alert',
1692
1867
  };
1693
1868
  }
1694
1869
  /**
@@ -1696,6 +1871,10 @@ class AlertDialogService {
1696
1871
  */
1697
1872
  fire(options) {
1698
1873
  const mergedOptions = { ...this.defaultOptions, ...options };
1874
+ // Si allowMultiple es false (por defecto), cerrar todos los diálogos existentes
1875
+ if (!mergedOptions.allowMultiple) {
1876
+ this.closeAll();
1877
+ }
1699
1878
  // Configuración especial para modo toast
1700
1879
  if (mergedOptions.toastMode) {
1701
1880
  mergedOptions.width = mergedOptions.width || '350px';
@@ -1705,15 +1884,18 @@ class AlertDialogService {
1705
1884
  mergedOptions.position = this.getToastPosition(mergedOptions.toastPosition || 'top-right');
1706
1885
  mergedOptions.disableClose = false;
1707
1886
  mergedOptions.animation = mergedOptions.animation || 'slide';
1708
- }
1887
+ mergedOptions.dialogType = 'toast'; // Los toasts usan el z-index más alto
1888
+ // Configuración específica para toasts no-intrusivos
1889
+ mergedOptions.closeOnBackdropClick = false; // No hay backdrop en toasts
1890
+ mergedOptions.allowEscapeKey = false; // ESC no debe cerrar toasts
1891
+ mergedOptions.allowMultiple = true; // Permitir múltiples toasts
1892
+ }
1893
+ // Determinar el tipo de diálogo para z-index
1894
+ const dialogType = mergedOptions.dialogType || (mergedOptions.toastMode ? 'toast' : 'alert');
1709
1895
  // Calcular posición del diálogo
1710
1896
  const position = mergedOptions.toastMode
1711
1897
  ? this.getToastDialogPosition(mergedOptions.toastPosition || 'top-right')
1712
1898
  : this.getDialogPosition(mergedOptions.position || 'center');
1713
- // Calcular z-index dinámico basado en diálogos abiertos
1714
- const openDialogs = this.dialog.openDialogs.length;
1715
- const baseZIndex = 1000;
1716
- const zIndex = baseZIndex + openDialogs * 10;
1717
1899
  const dialogRef = this.dialog.open(AlertDialog, {
1718
1900
  width: mergedOptions.width,
1719
1901
  minWidth: mergedOptions.minWidth,
@@ -1727,22 +1909,17 @@ class AlertDialogService {
1727
1909
  closeOnNavigation: true,
1728
1910
  autoFocus: mergedOptions.focusConfirm !== false,
1729
1911
  restoreFocus: true,
1730
- hasBackdrop: !mergedOptions.toastMode,
1912
+ hasBackdrop: !mergedOptions.toastMode, // Los toasts NO tienen backdrop
1731
1913
  });
1732
- // Aplicar z-index dinámico después de abrir
1733
- setTimeout(() => {
1734
- const overlayRef = dialogRef._overlayRef;
1735
- if (overlayRef) {
1736
- const pane = overlayRef.overlayElement;
1737
- const backdrop = overlayRef.backdropElement;
1738
- if (pane) {
1739
- pane.style.zIndex = (zIndex + 2).toString();
1740
- }
1741
- if (backdrop) {
1742
- backdrop.style.zIndex = (zIndex + 1).toString();
1743
- }
1744
- }
1745
- }, 0);
1914
+ // Aplicar z-index dinámico usando el servicio centralizado
1915
+ if (mergedOptions.forceToTop) {
1916
+ // Si se requiere forzar al tope, usar forceToTop
1917
+ this.zIndexService.forceToTop(dialogRef);
1918
+ }
1919
+ else {
1920
+ // Usar el tipo de diálogo apropiado para z-index
1921
+ this.zIndexService.applyZIndex(dialogRef, dialogType);
1922
+ }
1746
1923
  // Callbacks de ciclo de vida
1747
1924
  if (mergedOptions.willOpen) {
1748
1925
  mergedOptions.willOpen();
@@ -1876,25 +2053,62 @@ class AlertDialogService {
1876
2053
  });
1877
2054
  }
1878
2055
  /**
1879
- * Toast notification (auto-cierre, posición personalizada)
2056
+ * Toast notification (auto-cierre, posición personalizada, no-intrusivo)
1880
2057
  */
1881
2058
  toast(options) {
1882
2059
  const opts = typeof options === 'string' ? { message: options } : options;
1883
2060
  return this.fire({
1884
2061
  timer: 3000,
1885
- timerProgressBar: true,
1886
2062
  showConfirmButton: false,
1887
- position: 'top-end',
2063
+ position: 'bottom-start',
1888
2064
  width: '350px',
2065
+ toastMode: true,
2066
+ dialogType: 'toast',
2067
+ forceToTop: false, // Los toasts usan su propio rango de z-index
2068
+ allowMultiple: true, // Permitir múltiples toasts
2069
+ disableClose: true, // No se puede cerrar manualmente (solo por timer)
2070
+ closeOnBackdropClick: false, // No hay backdrop
2071
+ allowEscapeKey: false, // ESC no cierra toasts
2072
+ allowEnterKey: false, // ENTER no cierra toasts
2073
+ autoClose: true,
2074
+ progressBar: true,
1889
2075
  ...opts,
1890
2076
  });
1891
2077
  }
2078
+ /**
2079
+ * Alerta crítica que siempre aparece encima de todo
2080
+ */
2081
+ critical(options) {
2082
+ const opts = typeof options === 'string'
2083
+ ? { message: options, title: '¡Atención!' }
2084
+ : { title: '¡Atención!', ...options };
2085
+ return this.fire({
2086
+ ...opts,
2087
+ type: 'error',
2088
+ forceToTop: true,
2089
+ disableClose: true,
2090
+ closeOnBackdropClick: false,
2091
+ allowEscapeKey: false,
2092
+ });
2093
+ }
1892
2094
  /**
1893
2095
  * Cerrar todos los diálogos abiertos
1894
2096
  */
1895
2097
  closeAll() {
1896
2098
  this.dialog.closeAll();
1897
2099
  }
2100
+ /**
2101
+ * Cerrar solo los toasts activos (mantener otros diálogos abiertos)
2102
+ */
2103
+ closeAllToasts() {
2104
+ this.zIndexService.closeAllToasts();
2105
+ }
2106
+ /**
2107
+ * Obtener el número de toasts activos
2108
+ */
2109
+ getActiveToastCount() {
2110
+ return this.zIndexService.getActiveToastCount();
2111
+ }
1898
2112
  getDialogPosition(position) {
1899
2113
  const positions = {
1900
2114
  top: { top: '20px' },
@@ -5732,9 +5946,6 @@ class AlertDialog {
5732
5946
  container;
5733
5947
  componentRef = null;
5734
5948
  timerInterval;
5735
- // CDK Drag properties
5736
- static lastZIndex = 1000;
5737
- bringToFrontTimeoutId = null;
5738
5949
  inputValue = '';
5739
5950
  validationError = null;
5740
5951
  timerProgress = 100;
@@ -5746,6 +5957,7 @@ class AlertDialog {
5746
5957
  renderer = inject(Renderer2);
5747
5958
  elementRef = inject(ElementRef);
5748
5959
  cdr = inject(ChangeDetectorRef);
5960
+ zIndexService = inject(DialogZIndexService);
5749
5961
  constructor() {
5750
5962
  this.sanitizedHtml = this.sanitizer.bypassSecurityTrustHtml(this.data.html || '');
5751
5963
  }
@@ -5756,14 +5968,6 @@ class AlertDialog {
5756
5968
  if (this.componentRef) {
5757
5969
  this.componentRef.destroy();
5758
5970
  }
5759
- // Limpiar timeout de CDK Drag
5760
- if (this.bringToFrontTimeoutId !== null) {
5761
- cancelAnimationFrame(this.bringToFrontTimeoutId);
5762
- this.bringToFrontTimeoutId = null;
5763
- }
5764
- }
5765
- ngAfterViewInit() {
5766
- // CDK Drag se maneja automáticamente a través del template
5767
5971
  }
5768
5972
  // Start the timer for auto-closing the dialog
5769
5973
  startTimer() {
@@ -6056,22 +6260,11 @@ class AlertDialog {
6056
6260
  // ===== CDK DRAG FUNCTIONALITY =====
6057
6261
  /**
6058
6262
  * Brings the dialog to the front by adjusting its z-index.
6059
- * Uses requestAnimationFrame to debounce updates and prevent excessive DOM manipulations.
6263
+ * Uses the centralized DialogZIndexService for consistent z-index management.
6060
6264
  * Called when the dialog header is clicked.
6061
6265
  */
6062
6266
  bringToFront() {
6063
- // Clear any pending update
6064
- if (this.bringToFrontTimeoutId !== null) {
6065
- cancelAnimationFrame(this.bringToFrontTimeoutId);
6066
- }
6067
- // Schedule the z-index update for the next animation frame
6068
- this.bringToFrontTimeoutId = requestAnimationFrame(() => {
6069
- const pane = this.elementRef.nativeElement.closest('.cdk-overlay-pane');
6070
- if (pane) {
6071
- pane.style.zIndex = (++AlertDialog.lastZIndex).toString();
6072
- }
6073
- this.bringToFrontTimeoutId = null;
6074
- });
6267
+ this.zIndexService.bringToFront(this.elementRef.nativeElement);
6075
6268
  }
6076
6269
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AlertDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
6077
6270
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AlertDialog, isStandalone: true, selector: "acp-alert-dialog", viewQueries: [{ propertyName: "inputField", first: true, predicate: ["inputField"], descendants: true }, { propertyName: "dialogTitle", first: true, predicate: ["dialogTitle"], descendants: true }, { propertyName: "container", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div\n class=\"alert-dialog\"\n [class.modern-layout]=\"data.layout === 'modern'\"\n [class.toast-layout]=\"data.layout === 'toast' || data.toastMode\"\n [class.icon-left]=\"data.iconPosition === 'left'\"\n [class.icon-center]=\"data.iconPosition === 'center'\"\n [class.icon-top]=\"data.iconPosition === 'top'\"\n [class.content-left]=\"data.contentAlignment === 'left'\"\n [class.content-center]=\"data.contentAlignment === 'center'\"\n [class.content-right]=\"data.contentAlignment === 'right'\"\n [attr.aria-label]=\"data.ariaLabel\"\n [attr.aria-describedby]=\"data.ariaDescribedBy\"\n>\n <!-- Timer Progress Bar -->\n @if (data.timer && (data.timerProgressBar || data.progressBar || data.toastMode)) {\n <mat-progress-bar\n mode=\"determinate\"\n [value]=\"timerProgress\"\n class=\"timer-progress\"\n [class.toast-progress]=\"data.toastMode\"\n >\n </mat-progress-bar>\n }\n\n <!-- Alert Header -->\n @if (data.draggable) {\n <div\n class=\"acp-alert-header\"\n cdkDrag\n cdkDragRootElement=\".cdk-overlay-pane\"\n cdkDragHandle\n (mousedown)=\"bringToFront()\"\n >\n <!-- Icon -->\n @if (data.type || data.icon) {\n <div class=\"alert-dialog-icon\" [ngClass]=\"'icon-' + (data.type || 'custom')\">\n <mat-icon class=\"icon-large\" [style.color]=\"data.iconColor\"> {{ getIconName() }} </mat-icon>\n </div>\n }\n\n <!-- Toast Content (solo para modo toast) -->\n @if (data.toastMode || data.layout === 'toast') {\n <!-- Title y Message en l\u00EDnea para toast -->\n <div class=\"toast-content\">\n @if (data.title) {\n <span class=\"toast-title\" #dialogTitle>{{ data.title }}</span>\n } @if (data.message) {\n <span class=\"toast-message\">{{ data.message }}</span>\n }\n </div>\n }\n\n <!-- Close Button -->\n @if (data.showCloseButton) {\n <button\n mat-icon-button\n class=\"close-button\"\n [class.top-right]=\"data.closeButtonPosition === 'top-right'\"\n [class.top-left]=\"data.closeButtonPosition === 'top-left'\"\n (click)=\"onClose()\"\n aria-label=\"Cerrar\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n } @else {\n <div class=\"acp-alert-header\">\n <!-- Icon -->\n @if (data.type || data.icon) {\n <div class=\"alert-dialog-icon\" [ngClass]=\"'icon-' + (data.type || 'custom')\">\n <mat-icon class=\"icon-large\" [style.color]=\"data.iconColor\"> {{ getIconName() }} </mat-icon>\n </div>\n }\n\n <!-- Toast Content (solo para modo toast) -->\n @if (data.toastMode || data.layout === 'toast') {\n <!-- Title y Message en l\u00EDnea para toast -->\n <div class=\"toast-content\">\n @if (data.title) {\n <span class=\"toast-title\" #dialogTitle>{{ data.title }}</span>\n } @if (data.message) {\n <span class=\"toast-message\">{{ data.message }}</span>\n }\n </div>\n }\n\n <!-- Close Button -->\n @if (data.showCloseButton) {\n <button\n mat-icon-button\n class=\"close-button\"\n [class.top-right]=\"data.closeButtonPosition === 'top-right'\"\n [class.top-left]=\"data.closeButtonPosition === 'top-left'\"\n (click)=\"onClose()\"\n aria-label=\"Cerrar\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n }\n\n <!-- Content (solo para modo normal, no toast) -->\n @if (!(data.toastMode || data.layout === 'toast')) {\n <mat-dialog-content class=\"alert-dialog-content\">\n <!-- Title -->\n @if (data.title) {\n <h2 class=\"alert-dialog-title\" #dialogTitle>{{ data.title }}</h2>\n }\n <!-- Image -->\n @if (data.imageUrl) {\n <div class=\"alert-dialog-image\">\n <img\n [src]=\"data.imageUrl\"\n [alt]=\"data.imageAlt || 'Alert image'\"\n [style.width]=\"data.imageWidth || 'auto'\"\n [style.height]=\"data.imageHeight || 'auto'\"\n [style.max-width]=\"data.imageWidth || '100%'\"\n />\n </div>\n }\n\n <!-- Dynamic Component -->\n @if (data.component) {\n <div #dynamicComponentContainer></div>\n } @if (data.html) {\n <div [innerHTML]=\"sanitizedHtml\"></div>\n } @else if (data.message) {\n <p class=\"alert-message\">{{ data.message }}</p>\n }\n\n <!-- Input Field -->\n @if (data.input) {\n <mat-form-field appearance=\"outline\" class=\"alert-input-field\">\n @if (data.inputLabel) {\n <mat-label>{{ data.inputLabel }}</mat-label>\n } @if (data.input === 'textarea') {\n <textarea\n matInput\n #inputField\n [(ngModel)]=\"inputValue\"\n [placeholder]=\"data.inputPlaceholder || ''\"\n [type]=\"data.input\"\n rows=\"4\"\n (keyup.enter)=\"onInputEnter()\"\n [attr.aria-invalid]=\"!!validationError\"\n >\n </textarea>\n } @else {\n <input\n matInput\n #inputField\n [(ngModel)]=\"inputValue\"\n [placeholder]=\"data.inputPlaceholder || ''\"\n [type]=\"data.input\"\n (keyup.enter)=\"onInputEnter()\"\n [attr.aria-invalid]=\"!!validationError\"\n />\n } @if (validationError) {\n <mat-error>{{ validationError }}</mat-error>\n }\n </mat-form-field>\n }\n </mat-dialog-content>\n }\n\n <!-- Actions (solo para modo normal, no toast) -->\n @if (!(data.toastMode || data.layout === 'toast') && (data.showConfirmButton !== false ||\n data.showCancelButton || data.showDenyButton)) {\n <mat-dialog-actions\n class=\"alert-dialog-actions\"\n [class.reverse-buttons]=\"data.reverseButtons\"\n [class.vertical-buttons]=\"data.verticalButtons\"\n [align]=\"getActionsAlignment()\"\n >\n @if (data.showDenyButton) {\n <acp-button\n type=\"button\"\n [matStyle]=\"getButtonStyle('deny')\"\n [variant]=\"getButtonVariant('deny')\"\n [icon]=\"getButtonIcon('deny')\"\n (handleClick)=\"onDeny()\"\n [text]=\"data.denyText || 'No'\"\n [disabled]=\"data.disableDenyButton?? false\"\n [class.spinning]=\"data.processing && data.processingButton === 'deny'\"\n [class.full-width]=\"data.fullWidthButtons\"\n />\n } @if (data.showCancelButton) {\n <acp-button\n type=\"button\"\n [matStyle]=\"getButtonStyle('cancel')\"\n [variant]=\"getButtonVariant('cancel')\"\n [icon]=\"getButtonIcon('cancel')\"\n (handleClick)=\"onCancel()\"\n [text]=\"data.cancelText || 'Cancel'\"\n [disabled]=\"data.disableCancelButton??false\"\n [class.spinning]=\"data.processing && data.processingButton === 'cancel'\"\n [class.full-width]=\"data.fullWidthButtons\"\n />\n } @if (data.showConfirmButton !== false) {\n <acp-button\n type=\"button\"\n [matStyle]=\"getButtonStyle('confirm')\"\n [variant]=\"getButtonVariant('confirm')\"\n [icon]=\"getButtonIcon('confirm')\"\n (handleClick)=\"onConfirm()\"\n [text]=\"data.confirmText || 'OK'\"\n [disabled]=\"data.disableConfirmButton?? false\"\n [class.spinning]=\"data.processing && data.processingButton === 'confirm'\"\n [class.full-width]=\"data.fullWidthButtons\"\n [autofocus]=\"data.focusConfirm\"\n />\n }\n </mat-dialog-actions>\n }\n\n <!-- Footer -->\n @if (data.footer || data.footerHtml) {\n <div class=\"alert-dialog-footer\">\n @if (data.footerHtml) {\n <div [innerHTML]=\"sanitizedFooter\"></div>\n } @else { {{ data.footer }} }\n </div>\n }\n</div>\n", styles: [".alert-dialog{position:relative;overflow:hidden;padding:0;display:flex;flex-direction:column;border-radius:16px}.acp-alert-header{display:flex;align-items:flex-start;justify-content:space-between;padding:24px 24px 0;position:relative}.acp-alert-header .alert-dialog-icon{margin:4px 0 0;flex-shrink:0}.alert-dialog-title{margin:0 0 12px;font-size:20px;font-weight:600;line-height:1.2;color:#1a1a1a;text-align:left}.alert-dialog-content{text-align:left}.alert-dialog-content .alert-message{margin:0;font-size:16px;line-height:1.4;color:#666}.alert-dialog-actions{margin:24px;padding:0;gap:12px}.close-button{position:relative;z-index:10;width:40px;height:40px;margin:0;background-color:#0000000d;border-radius:50%}.close-button mat-icon{font-size:20px;width:20px;height:20px;color:#0009}.close-button:hover{background-color:#0000001a}.alert-dialog.modern-layout .acp-alert-header{padding:24px 24px 0}.alert-dialog.modern-layout .acp-alert-header .alert-dialog-icon{margin-right:16px}.alert-dialog.modern-layout .acp-alert-header .alert-dialog-icon .icon-large{font-size:48px;width:48px;height:48px}.alert-dialog.toast-layout{border-radius:8px}.alert-dialog.toast-layout .acp-alert-header{padding:16px;align-items:center;gap:12px}.alert-dialog.toast-layout .acp-alert-header .alert-dialog-icon{margin:0;flex-shrink:0}.alert-dialog.toast-layout .acp-alert-header .alert-dialog-icon .icon-large{font-size:24px;width:24px;height:24px}.alert-dialog.toast-layout .acp-alert-header .toast-content{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.alert-dialog.toast-layout .acp-alert-header .toast-content .toast-title{font-size:14px;font-weight:600;line-height:1.2;color:#1a1a1a;margin:0}.alert-dialog.toast-layout .acp-alert-header .toast-content .toast-message{font-size:13px;line-height:1.3;color:#666;margin:0}.alert-dialog.toast-layout .acp-alert-header .close-button{margin:0;flex-shrink:0}.alert-dialog.toast-layout .alert-dialog-content,.alert-dialog.toast-layout .alert-dialog-actions{display:none}.alert-dialog.icon-center .acp-alert-header{flex-direction:column;text-align:center;align-items:center;padding:24px 24px 16px}.alert-dialog.icon-center .acp-alert-header .alert-dialog-icon{margin:0 0 16px}.alert-dialog.icon-center .acp-alert-header .close-button{position:absolute;top:16px;right:16px}.alert-dialog.icon-center .alert-dialog-title,.alert-dialog.icon-center .alert-dialog-content{text-align:center}.alert-dialog.icon-top .acp-alert-header{flex-direction:column;align-items:flex-start;padding:24px 24px 16px}.alert-dialog.icon-top .acp-alert-header .alert-dialog-icon{margin:0 0 16px}.alert-dialog.icon-top .acp-alert-header .close-button{position:absolute;top:16px;right:16px}.alert-dialog.content-left .alert-dialog-title,.alert-dialog.content-left .alert-dialog-content{text-align:left}.alert-dialog.content-center .acp-alert-header{justify-content:center}.alert-dialog.content-center .alert-dialog-title,.alert-dialog.content-center .alert-dialog-content{text-align:center}.alert-dialog.content-right .alert-dialog-title,.alert-dialog.content-right .alert-dialog-content{text-align:right}.timer-progress{position:absolute;top:0;left:0;right:0;height:4px;z-index:5;border-radius:0}.timer-progress.toast-progress{height:3px;border-radius:0}:host ::ng-deep .timer-progress .mdc-linear-progress__bar{transition:transform 50ms linear}:host ::ng-deep .timer-progress .mdc-linear-progress__buffer{background-color:#0000001a}.icon-success mat-icon{color:#10b981}.icon-error mat-icon{color:#ef4444}.icon-warning mat-icon{color:#f59e0b}.icon-info mat-icon{color:#3b82f6}.icon-question mat-icon{color:#8b5cf6}.icon-delete mat-icon{color:#ef4444}.alert-dialog-image{margin:1rem auto;display:flex;justify-content:center;align-items:center}.alert-dialog-image img{max-width:100%;border-radius:8px}.alert-input-field{width:100%;margin-top:1rem}.confirm-button,.cancel-button,.deny-button{min-width:100px}.cancel-button{color:#333}.alert-dialog-footer{margin:0 24px 24px;padding-top:1rem;border-top:1px solid #e0e0e0;font-size:.875rem;color:#666}.acp-alert-header[cdkDrag]{cursor:move;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.acp-alert-header[cdkDrag]:hover{background-color:#00000005}.cdk-drag-dragging{user-select:none!important;-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important}:host ::ng-deep .animation-fade .mat-mdc-dialog-container{animation:fadeIn .3s ease-out}:host ::ng-deep .animation-slide .mat-mdc-dialog-container{animation:slideIn .3s ease-out}:host ::ng-deep .animation-bounce .mat-mdc-dialog-container{animation:bounceIn .5s ease-out}:host ::ng-deep .animation-zoom .mat-mdc-dialog-container{animation:zoomIn .3s ease-out}:host ::ng-deep .toast-mode .mat-mdc-dialog-container{border-radius:8px;box-shadow:0 4px 12px #00000026;max-width:400px;animation:slideInRight .3s ease-out}:host ::ng-deep .layout-toast .mat-mdc-dialog-container{border-radius:8px;box-shadow:0 4px 12px #00000026;max-width:400px}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideIn{0%{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes slideInRight{0%{transform:translate(100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes bounceIn{0%{transform:scale(.3);opacity:0}50%{transform:scale(1.05)}70%{transform:scale(.9)}to{transform:scale(1);opacity:1}}@keyframes zoomIn{0%{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i2$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i6.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i7.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: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: Button, selector: "acp-button", inputs: ["variant", "text", "icon", "disabled", "type", "matStyle", "customClass", "reportFormat", "extended", "title", "ariaLabel", "name", "id", "form", "tabIndex", "testId"], outputs: ["handleClick"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
@@ -6238,5 +6431,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
6238
6431
  * Generated bundle index. Do not edit.
6239
6432
  */
6240
6433
 
6241
- export { ACP_DRAWER_DATA, ACP_DRAWER_DEFAULT_OPTIONS, ACP_POPOVER_CONTENT, ACP_POPOVER_DEFAULT_OPTIONS, ACP_POPOVER_SCROLL_STRATEGY, AUTOCOMPLETE_WRAPPER_CUSTOMER_CONFIG, AUTOCOMPLETE_WRAPPER_DEFAULT_CONFIG, AUTOCOMPLETE_WRAPPER_LOCAL_CONFIG, AUTOCOMPLETE_WRAPPER_PAGINATED_CONFIG, AUTOCOMPLETE_WRAPPER_PRODUCT_CONFIG, AUTOCOMPLETE_WRAPPER_SIMPLE_CONFIG, AcpDrawer, AcpDrawerConfig, AcpDrawerContainer, AcpDrawerRef, AcpPopover, AcpPopoverContent, AcpPopoverTarget, AcpPopoverTrigger, AdvancedDialogService, AlertDialog, AlertDialogService, AutocompleteWrapperService, Button, DATA_GRID_DEFAULT_OPTIONS, DataGrid, DateRangePicker, DialogWrapper, DynamicCard, DynamicSelect, GetTotalPipe, IconRegistryService, InputChip, KeyboardNavigationService, OverlayService, Pagination, ReusableAutocompleteComponent, Spinner, StatusDisplayPipe, SvgIcon, TabulatorTable, ThemeSwitcher, ThemeToggle, ToUpperCase, UserIcon, _AcpPopoverContentBase, createAutocompleteWrapperConfig, throwAcpPopoverInvalidPositionEnd, throwAcpPopoverInvalidPositionStart, throwAcpPopoverMissingError };
6434
+ export { ACP_DRAWER_DATA, ACP_DRAWER_DEFAULT_OPTIONS, ACP_POPOVER_CONTENT, ACP_POPOVER_DEFAULT_OPTIONS, ACP_POPOVER_SCROLL_STRATEGY, AUTOCOMPLETE_WRAPPER_CUSTOMER_CONFIG, AUTOCOMPLETE_WRAPPER_DEFAULT_CONFIG, AUTOCOMPLETE_WRAPPER_LOCAL_CONFIG, AUTOCOMPLETE_WRAPPER_PAGINATED_CONFIG, AUTOCOMPLETE_WRAPPER_PRODUCT_CONFIG, AUTOCOMPLETE_WRAPPER_SIMPLE_CONFIG, AcpDrawer, AcpDrawerConfig, AcpDrawerContainer, AcpDrawerRef, AcpPopover, AcpPopoverContent, AcpPopoverTarget, AcpPopoverTrigger, AdvancedDialogService, AlertDialog, AlertDialogService, AutocompleteWrapperService, Button, DATA_GRID_DEFAULT_OPTIONS, DataGrid, DateRangePicker, DialogWrapper, DialogZIndexService, DynamicCard, DynamicSelect, GetTotalPipe, IconRegistryService, InputChip, KeyboardNavigationService, OverlayService, Pagination, ReusableAutocompleteComponent, Spinner, StatusDisplayPipe, SvgIcon, TabulatorTable, ThemeSwitcher, ThemeToggle, ToUpperCase, UserIcon, _AcpPopoverContentBase, createAutocompleteWrapperConfig, throwAcpPopoverInvalidPositionEnd, throwAcpPopoverInvalidPositionStart, throwAcpPopoverMissingError };
6242
6435
  //# sourceMappingURL=acontplus-ng-components.mjs.map