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 = '';
}