/** * Menubar for the canvas page: Project (Import/Export), Edit (Undo/Redo), View (Fit View, Theme). */ import React, { useEffect } from 'react' import { Link } from 'react-router-dom' import { Menubar, MenubarContent, MenubarItem, MenubarMenu, MenubarSeparator, MenubarTrigger, MenubarSub, MenubarSubTrigger, MenubarSubContent, MenubarCheckboxItem, } from '@/components/ui/menubar' import { Kbd, KbdGroup } from '@/components/ui/kbd' import { useTheme } from '@/lib/themeContext' import { ArrowLeft, Download, FolderOpen, Moon, Redo2, Sun, Undo2 } from 'lucide-react' export type CanvasMenubarProps = { onImport: () => void onExport: () => void undo: () => void redo: () => void canUndo: boolean canRedo: boolean onFitView?: () => void } const UNDO_KEYS = { key: 'z', shiftKey: false } const REDO_KEYS = { key: 'z', shiftKey: true } function matchKey(ev: KeyboardEvent, want: { key: string; shiftKey: boolean }) { const mod = ev.ctrlKey || ev.metaKey return ev.key.toLowerCase() === want.key && !!mod && !!ev.shiftKey === want.shiftKey } export function CanvasMenubar({ onImport, onExport, undo, redo, canUndo, canRedo, onFitView, }: CanvasMenubarProps) { const { theme, setTheme } = useTheme() useEffect(() => { const onKeyDown = (ev: KeyboardEvent) => { if (matchKey(ev, UNDO_KEYS)) { if (canUndo) { ev.preventDefault() ev.stopPropagation() undo() } return } if (matchKey(ev, REDO_KEYS)) { if (canRedo) { ev.preventDefault() ev.stopPropagation() redo() } } } window.addEventListener('keydown', onKeyDown, true) return () => window.removeEventListener('keydown', onKeyDown, true) }, [undo, redo, canUndo, canRedo]) return ( Project Import… Export… Edit Undo ⌘ + Z Redo ⌘ + ⇧ + Z View {onFitView && ( Fit View ⌘0 )} {onFitView && } Theme setTheme('light')} className="gap-2" > Light setTheme('dark')} className="gap-2" > Dark ) }