'use client'; import React, { useCallback, useState } from 'react'; import { useReactFlow } from '@xyflow/react'; import { ZoomIn, ZoomOut, Maximize2, Map, LayoutGrid, } from 'lucide-react'; interface ToolbarButtonProps { icon: React.ReactNode; label: string; onClick: () => void; active?: boolean; } function ToolbarButton({ icon, label, onClick, active }: ToolbarButtonProps) { return ( ); } export function CanvasToolbar() { const { zoomIn, zoomOut, fitView } = useReactFlow(); const [minimapVisible, setMinimapVisible] = useState(true); const handleZoomIn = useCallback(() => zoomIn({ duration: 200 }), [zoomIn]); const handleZoomOut = useCallback(() => zoomOut({ duration: 200 }), [zoomOut]); const handleFitView = useCallback(() => fitView({ duration: 300, padding: 0.2 }), [fitView]); const handleToggleMinimap = useCallback(() => { setMinimapVisible((prev) => !prev); // Toggle minimap visibility via CSS since ReactFlow MiniMap doesn't have a built-in toggle const minimap = document.querySelector('.react-flow__minimap') as HTMLElement; if (minimap) { minimap.style.display = minimapVisible ? 'none' : 'block'; } }, [minimapVisible]); const handleAutoLayout = useCallback(() => { // Auto-layout: redistribute nodes in a grid pattern // This dispatches to the store which handles repositioning const event = new CustomEvent('canvas:auto-layout'); window.dispatchEvent(event); }, []); return (
} label="Zoom In" onClick={handleZoomIn} /> } label="Zoom Out" onClick={handleZoomOut} />
} label="Fit View" onClick={handleFitView} /> } label="Toggle MiniMap" onClick={handleToggleMinimap} active={minimapVisible} />
} label="Auto Layout" onClick={handleAutoLayout} />
); }