'use client'; import { useState, useRef, useEffect, ReactNode } from 'react'; type Props = { leftPane: ReactNode; rightPane: ReactNode; }; export default function ResizablePanes({ leftPane, rightPane }: Props) { const [leftWidth, setLeftWidth] = useState(70); // default 70% const [isDragging, setIsDragging] = useState(false); const containerRef = useRef(null); const minLeftWidth = 40; // left panel min width 40% const minRightWidth = 15; // right panel min width 15% const handleMouseDown = () => { setIsDragging(true); }; useEffect(() => { const handleMouseMove = (e: MouseEvent) => { if (!isDragging || !containerRef.current) return; const containerRect = containerRef.current.getBoundingClientRect(); const newLeftWidth = ((e.clientX - containerRect.left) / containerRect.width) * 100; // Clamp the width between min and max const maxLeftWidth = 100 - minRightWidth; const clampedWidth = Math.max(minLeftWidth, Math.min(maxLeftWidth, newLeftWidth)); setLeftWidth(clampedWidth); }; const handleMouseUp = () => { setIsDragging(false); }; if (isDragging) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); } return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); return (
{leftPane}
{rightPane}
); }