diff --git a/frontend/src/components/ui/Modal.tsx b/frontend/src/components/ui/Modal.tsx index 973cf59..97034b5 100644 --- a/frontend/src/components/ui/Modal.tsx +++ b/frontend/src/components/ui/Modal.tsx @@ -12,11 +12,10 @@ interface ModalProps { 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", +const maxWidthBySize: Record = { + sm: "480px", + md: "672px", + lg: "896px", }; export default function Modal({ @@ -34,10 +33,9 @@ export default function Modal({ ); useEffect(() => { - if (isOpen) { - document.addEventListener("keydown", handleKeyDown); - document.body.style.overflow = "hidden"; - } + if (!isOpen) return; + document.addEventListener("keydown", handleKeyDown); + document.body.style.overflow = "hidden"; return () => { document.removeEventListener("keydown", handleKeyDown); document.body.style.overflow = ""; @@ -46,49 +44,52 @@ export default function Modal({ 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. + // Overlay React maîtrisé (pas le JS DSFR) : fond assombri visible, fermeture + // au clic extérieur / Échap / bouton. Look DSFR via les classes fr-modal__*. return ( - -
-
-
-
-
- -
-
- {title &&

{title}

} - {children} -
-
-
+
e.stopPropagation()} + style={{ + width: "100%", + maxWidth: maxWidthBySize[size], + background: "var(--background-default-grey, #fff)", + borderRadius: "0.25rem", + boxShadow: "0 8px 24px rgba(0, 0, 0, 0.32)", + padding: "1.5rem", + }} + > +
+ +
+
+ {title &&

{title}

} + {children}
-
+ ); }