import { Component, Input, Output, EventEmitter, HostListener, ChangeDetectionStrategy, inject, } from '@angular/core'; import { CommonModule } from '@angular/common'; @Component({ selector: 'mayvio-modal', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
`, }) export class ModalComponent { @Input() isOpen = false; @Input() size: 'sm' | 'md' | 'lg' | 'full' = 'md'; @Input() className = ''; @Input() closeOnOutsideClick = true; @Input() closeOnEscape = true; @Output() onClose = new EventEmitter(); @HostListener('document:keydown.escape') handleEscape() { if (this.isOpen && this.closeOnEscape) { this.onClose.emit(); } } onOverlayClick() { if (this.closeOnOutsideClick) { this.onClose.emit(); } } } @Component({ selector: 'mayvio-modal-header', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
`, }) export class ModalHeaderComponent { @Input() showCloseButton = true; @Input() className = ''; // Inject parent ModalComponent to trigger its close emitter private parentModal = inject(ModalComponent, { optional: true }); closeModal() { if (this.parentModal) { this.parentModal.onClose.emit(); } } } @Component({ selector: 'mayvio-modal-body', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
`, }) export class ModalBodyComponent { @Input() className = ''; } @Component({ selector: 'mayvio-modal-footer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: ` `, }) export class ModalFooterComponent { @Input() className = ''; }