39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import React, { memo } from 'react';
|
|
import './Modal.css';
|
|
|
|
interface ModalProps {
|
|
isOpen: boolean;
|
|
onClose: () => void;
|
|
title?: string;
|
|
children: React.ReactNode;
|
|
}
|
|
|
|
function Modal({ isOpen, onClose, title, children }: ModalProps) {
|
|
if (!isOpen) {
|
|
return null;
|
|
}
|
|
return (
|
|
<div className="modal-overlay modal-fadein">
|
|
<div className="modal-container modal-popin">
|
|
<button className="close-button modal-close" onClick={onClose} aria-label="Fermer">
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
<path d="M6 6L18 18M18 6L6 18" stroke="#fff" strokeWidth="2.4" strokeLinecap="round" filter="url(#shadow)" />
|
|
<defs>
|
|
<filter id="shadow" x="-2" y="-2" width="28" height="28" filterUnits="userSpaceOnUse">
|
|
<feDropShadow dx="0" dy="0" stdDeviation="1.2" floodColor="#23242a" />
|
|
</filter>
|
|
</defs>
|
|
</svg>
|
|
</button>
|
|
{title && <div className="modal-header modal-header"><h2>{title}</h2></div>}
|
|
<div className="modal-body modal-body">
|
|
{children}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
Modal.displayName = 'Modal';
|
|
export default memo(Modal);
|