import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { IconDefinition } from '@fortawesome/free-solid-svg-icons'; import { faCheckCircle, faExclamationTriangle, faExclamationCircle, faInfoCircle, faTimes } from '@fortawesome/free-solid-svg-icons'; type AlertSize = 'sm' | 'md' | 'lg'; type AlertVariant = 'primary' | 'success' | 'warning' | 'danger' | 'info'; @Component({ selector: 'ui-alert', standalone: true, imports: [CommonModule, FontAwesomeModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
@if (showIcon && alertIcon) { }
@if (title) {

{{ title }}

}
@if (actions && actions.length > 0) {
}
@if (dismissible) { }
`, styleUrl: './alert.component.scss' }) export class AlertComponent { @Input() size: AlertSize = 'md'; @Input() variant: AlertVariant = 'primary'; @Input() title?: string; @Input() boldTitle = false; @Input() showIcon = true; @Input() dismissible = false; @Input() dismissLabel = 'Dismiss alert'; @Input() role = 'alert'; @Input() ariaLive: 'polite' | 'assertive' | 'off' = 'polite'; @Input() actions: any[] = []; @Output() dismissed = new EventEmitter(); // Icons readonly faCheckCircle = faCheckCircle; readonly faExclamationTriangle = faExclamationTriangle; readonly faExclamationCircle = faExclamationCircle; readonly faInfoCircle = faInfoCircle; readonly faTimes = faTimes; // Generate unique ID for accessibility readonly alertId = Math.random().toString(36).substr(2, 9); get alertIcon(): IconDefinition | null { if (!this.showIcon) return null; switch (this.variant) { case 'success': return this.faCheckCircle; case 'warning': return this.faExclamationTriangle; case 'danger': return this.faExclamationCircle; case 'info': return this.faInfoCircle; case 'primary': default: return this.faInfoCircle; } } handleDismiss(): void { this.dismissed.emit(); } handleDismissKeydown(event: KeyboardEvent): void { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); this.handleDismiss(); } } }