import * as React from 'react'; import { AlertCircle, CheckCircle, Info, AlertTriangle, X } from 'lucide-react'; import { cn } from '@/lib/utils'; /** * AlertProps - Propriétés du composant Alert * * @interface AlertProps * @extends React.HTMLAttributes */ export interface AlertProps extends React.HTMLAttributes { /** * Variant de l'alerte - Type et couleur selon le contexte * * - `info`: Information générale (cyan) * - `success`: Succès ou confirmation (lime) * - `warning`: Avertissement (gold) * - `error`: Erreur ou danger (red) * - `default`: Alias pour `info` (compatibilité) * - `destructive`: Alias pour `error` (compatibilité) * * @default 'default' */ variant?: | 'info' | 'success' | 'warning' | 'error' | 'default' | 'destructive'; /** * Titre de l'alerte affiché en gras * * @example * ```tsx * * Opération réussie * * ``` */ title?: string; /** * Fonction appelée lors du clic sur le bouton de fermeture * Si fournie, un bouton de fermeture (X) est affiché * * @example * ```tsx * setShowAlert(false)}> * Message d'information * * ``` */ onClose?: () => void; } /** * Alert - Composant d'alerte avec design system Kodo * * Composant d'alerte pour afficher des messages d'information, de succès, d'avertissement ou d'erreur. * Inclut automatiquement une icône selon le variant et supporte un titre et un bouton de fermeture. * * @example * ```tsx * // Alerte d'information * * Ceci est un message d'information * * * // Alerte de succès * * Opération réussie avec succès * * * // Alerte avec fermeture * setShow(false)}> * Attention: Cette action est irréversible * * ``` * * @example * ```tsx * // Utilisation avec sous-composants * * Erreur * * Une erreur s'est produite lors du traitement * * * ``` * * @component * @param {AlertProps} props - Propriétés du composant * @returns {JSX.Element} Élément div stylisé comme une alerte avec role="alert" */ const Alert = React.forwardRef( ( { variant = 'default', title, onClose, className, children, ...props }, ref, ) => { // Map shadcn variants to Kodo variants const variantMap: Record = { destructive: 'error', default: 'info', }; const actualVariant = variantMap[variant] || variant; const styles = { info: 'bg-muted/10 border-border/30 text-kodo-steel', success: 'bg-success/10 border-success/30 text-success', warning: 'bg-warning/10 border-warning/30 text-warning', error: 'bg-destructive/10 border-destructive/30 text-destructive', }; const icons = { info: , success: , warning: , error: , }; const alertVariant = actualVariant as keyof typeof styles; return (
{icons[alertVariant] || icons.info}
{title &&
{title}
}
{children}
{onClose && ( )}
); }, ); Alert.displayName = 'Alert'; const AlertTitle = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => (
)); AlertTitle.displayName = 'AlertTitle'; const AlertDescription = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => (
)); AlertDescription.displayName = 'AlertDescription'; export { Alert, AlertTitle, AlertDescription };