"use client"; import React, { useEffect, useCallback } from "react"; type ModalSize = "sm" | "md" | "lg"; interface ModalProps { isOpen: boolean; onClose: () => void; title?: string; children: React.ReactNode; size?: ModalSize; } // Largeur de la colonne DSFR selon la taille demandée. const sizeColClasses: Record = { sm: "fr-col-12 fr-col-md-4", md: "fr-col-12 fr-col-md-6", lg: "fr-col-12 fr-col-md-8", }; export default function Modal({ isOpen, onClose, title, children, size = "md", }: ModalProps) { const handleKeyDown = useCallback( (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }, [onClose] ); useEffect(() => { if (isOpen) { document.addEventListener("keydown", handleKeyDown); document.body.style.overflow = "hidden"; } return () => { document.removeEventListener("keydown", handleKeyDown); document.body.style.overflow = ""; }; }, [isOpen, handleKeyDown]); if (!isOpen) return null; // L'ouverture/fermeture est pilotée par React (isOpen/onClose), on applique // donc la structure et les classes visuelles DSFR sans le JS d'ouverture DSFR. return (
{title &&

{title}

} {children}
); }