import React, { forwardRef, useState } from 'react'; import { clsx } from 'clsx'; export interface AlertProps extends React.HTMLAttributes { variant?: 'success' | 'warning' | 'error' | 'info' | 'neutral'; title?: string; dismissible?: boolean; onDismiss?: () => void; icon?: React.ReactNode; actions?: React.ReactNode; children: React.ReactNode; } const Alert = forwardRef( ({ variant = 'info', title, dismissible = false, onDismiss, icon, actions, children, className, ...props }, ref) => { const [isVisible, setIsVisible] = useState(true); const handleDismiss = () => { setIsVisible(false); onDismiss?.(); }; if (!isVisible) {return null;} // Default icons for each variant const defaultIcons = { success: ( ), warning: ( ), error: ( ), info: ( ), neutral: ( ), }; const alertStyles = clsx( // Base styles 'relative p-lg rounded-lg border backdrop-blur-md', 'transition-all duration-200 ease-in-out', // Variant styles { 'bg-success-bg text-success-text border-success-border': variant === 'success', 'bg-warning-bg text-warning-text border-warning-border': variant === 'warning', 'bg-error-bg text-error-text border-error-border': variant === 'error', 'bg-info-bg text-info-text border-info-border': variant === 'info', 'bg-glass-bg text-text-primary border-glass-border': variant === 'neutral', }, className ); const iconColor = { success: 'text-success-accent', warning: 'text-warning-accent', error: 'text-error-accent', info: 'text-info-accent', neutral: 'text-text-muted', }; const displayIcon = icon ?? defaultIcons[variant]; return (
{displayIcon && (
{displayIcon}
)}
{title && (

{title}

)}
{children}
{actions && (
{actions}
)}
{dismissible && (
)}
); } ); Alert.displayName = 'Alert'; export { Alert };