import React, { useEffect, useState } from "react"; import { createPortal } from "react-dom"; import { X } from "lucide-react"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; interface CustomSheetProps { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode; className?: string; side?: "right" | "left"; title?: string; description?: string; } export const CustomSheet: React.FC = ({ open, onOpenChange, children, className, side = "right", title, description }) => { const [isRendered, setIsRendered] = useState(false); const [isVisible, setIsVisible] = useState(false); useEffect(() => { if (open) { setIsRendered(true); // Small delay to allow render before transition setTimeout(() => setIsVisible(true), 10); // Prevent body scroll document.body.style.overflow = 'hidden'; } else { setIsVisible(false); // Wait for transition to finish before unmounting setTimeout(() => setIsRendered(false), 300); // Restore body scroll document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [open]); if (!isRendered) return null; return createPortal(
{/* Backdrop */}
onOpenChange(false)} /> {/* Sheet Content */}
{/* Header */}
{title &&

{title}

} {description &&

{description}

}
{/* Body */}
{children}
, document.body ); };