import { useTranslation } from 'react-i18next'; import { useEditor } from './context/EditorContext'; import { useUndoRedo } from './context/UndoRedoContext'; import type { EditorToolType, AlignmentDirection } from './types'; import styles from './editor-toolbar.module.css'; interface EditorToolbarProps { readonly onSave: () => void; readonly isSaving: boolean; readonly isDirty?: boolean; readonly isAutoSaving?: boolean; readonly onExport?: () => void; readonly onImport?: () => void; } interface ToolDef { readonly type: EditorToolType; readonly labelKey: string; readonly shortcut: string; readonly icon: string; } const TOOLS: readonly ToolDef[] = [ { type: 'select', labelKey: 'toolbar.select', shortcut: 'V', icon: '\u25B3' }, { type: 'door', labelKey: 'toolbar.door', shortcut: 'D', icon: '\u25A1' }, { type: 'window', labelKey: 'toolbar.window', shortcut: 'W', icon: '\u2550' }, { type: 'electrical', labelKey: 'toolbar.electrical', shortcut: 'E', icon: '\u26A1' }, { type: 'furniture', labelKey: 'toolbar.furniture', shortcut: 'F', icon: '\u{1FA91}' }, { type: 'measure', labelKey: 'toolbar.measure', shortcut: 'M', icon: '\u{1F4CF}' }, { type: 'annotate', labelKey: 'toolbar.annotate', shortcut: 'T', icon: '\u{1D5A0}' }, ]; interface AlignDef { readonly alignment: AlignmentDirection; readonly label: string; readonly titleKey: string; readonly icon: string; } const ALIGNMENT_BUTTONS: readonly AlignDef[] = [ { alignment: 'left', label: 'L', titleKey: 'toolbar.alignLeft', icon: '\u2590' }, { alignment: 'center-h', label: 'CH', titleKey: 'toolbar.alignCenterH', icon: '\u2503' }, { alignment: 'right', label: 'R', titleKey: 'toolbar.alignRight', icon: '\u258C' }, { alignment: 'top', label: 'T', titleKey: 'toolbar.alignTop', icon: '\u2580' }, { alignment: 'center-v', label: 'CV', titleKey: 'toolbar.alignCenterV', icon: '\u2501' }, { alignment: 'bottom', label: 'B', titleKey: 'toolbar.alignBottom', icon: '\u2584' }, { alignment: 'distribute-h', label: 'DH', titleKey: 'toolbar.distributeH', icon: '\u2506' }, { alignment: 'distribute-v', label: 'DV', titleKey: 'toolbar.distributeV', icon: '\u2504' }, ]; export function EditorToolbar({ onSave, isSaving, onExport, onImport }: EditorToolbarProps) { const { t } = useTranslation(); const { state, setTool, setZoom, dispatch } = useEditor(); const { undo, redo, canUndo, canRedo } = useUndoRedo(); const { activeTool, zoom, gridVisible, snapEnabled, layerVisibility, globalFurnitureOpacity } = state; const zoomPercent = Math.round((zoom / 100) * 100); return (
{/* Tool buttons */}
{TOOLS.map((tool) => { const label = t(tool.labelKey); return ( ); })}
{/* Undo / Redo */}
{/* Zoom controls */}
{zoomPercent}%
{/* Grid + Snap toggles */}
{/* Layer visibility toggles */}
{/* Alignment tools — visible when 2+ items selected */} {state.selectedIds.size >= 2 && ( <>
{ALIGNMENT_BUTTONS.map((btn) => ( ))}
)} {/* Spacer */}
{/* Import + Export + Save buttons */}
{onImport && ( )} {onExport && ( )}
); }