import React, { useRef, useState, useCallback } from 'react'; interface HeaderProps { title: string; onEdit: () => void; onDelete: () => void; } export function Header({ title, onEdit, onDelete }: HeaderProps) { return (
{title}
); } export function EmptyState() { return (
No data
); } interface CardShellProps extends HeaderProps { empty: boolean; children: React.ReactNode; /** Ref to the div where the uPlot legend will be mounted */ legendContainerRef?: React.RefObject; } export function CardShell({ title, onEdit, onDelete, empty, children, legendContainerRef }: CardShellProps) { const containerRef = useRef(null); const [legendHeight, setLegendHeight] = useState(null); const dragRef = useRef<{ startY: number; startH: number } | null>(null); const handleMouseDown = useCallback((e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); const el = legendContainerRef?.current; if (!el) return; dragRef.current = { startY: e.clientY, startH: el.offsetHeight }; function onMove(ev: MouseEvent) { if (!dragRef.current) return; const delta = dragRef.current.startY - ev.clientY; const containerH = containerRef.current?.offsetHeight ?? 400; const newH = Math.max(32, Math.min(containerH - 64, dragRef.current.startH + delta)); setLegendHeight(newH); } function onUp() { dragRef.current = null; document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp); } document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp); }, [legendContainerRef]); return (
{empty ? ( ) : ( <>
{children}
{legendContainerRef && <>
} )}
); }