# app-menu Specification ## Purpose Browser-mode menu bar (`src/components/AppMenu.vue`) with File, Edit, View, Object, Text, and Arrange menus. Uses reka-ui Menubar components. Only visible when `!IS_TAURI` (Tauri provides native menus). ## Requirements ### Requirement: App menu bar for browser mode The system SHALL display a menu bar in browser mode (`!IS_TAURI`) with File, Edit, View, Object, Text, and Arrange menus. #### Scenario: Menu visibility in browser - **WHEN** app runs in browser (not Tauri desktop) - **THEN** system displays menu bar at top of window #### Scenario: Menu hidden in Tauri - **WHEN** app runs in Tauri desktop mode - **THEN** system hides menu bar (Tauri provides native menus) ### Requirement: File menu The system SHALL provide File menu with Open, Save, Save As, and Export actions. #### Scenario: Open file - **WHEN** user clicks File → Open… or presses ⌘O (Ctrl+O on Windows/Linux) - **THEN** system opens file picker dialog #### Scenario: Save file - **WHEN** user clicks File → Save or presses ⌘S - **THEN** system saves current document #### Scenario: Save As - **WHEN** user clicks File → Save as… or presses ⌘⇧S - **THEN** system opens save dialog for new filename #### Scenario: Export selection - **WHEN** user clicks File → Export selection… or presses ⌘⇧E with selection - **THEN** system exports selected nodes as PNG #### Scenario: Export disabled when no selection - **WHEN** user has no selection - **THEN** system disables "Export selection…" menu item ### Requirement: Edit menu The system SHALL provide Edit menu with undo, redo, clipboard, and selection actions. #### Scenario: Undo - **WHEN** user clicks Edit → Undo or presses ⌘Z - **THEN** system reverts last action #### Scenario: Redo - **WHEN** user clicks Edit → Redo or presses ⌘⇧Z - **THEN** system reapplies undone action #### Scenario: Copy/Paste - **WHEN** user clicks Edit → Copy (⌘C) or Paste (⌘V) - **THEN** system performs clipboard operation #### Scenario: Duplicate - **WHEN** user clicks Edit → Duplicate or presses ⌘D - **THEN** system duplicates selected nodes #### Scenario: Delete - **WHEN** user clicks Edit → Delete or presses ⌫ - **THEN** system removes selected nodes #### Scenario: Select all - **WHEN** user clicks Edit → Select all or presses ⌘A - **THEN** system selects all nodes on current page ### Requirement: View menu The system SHALL provide View menu with zoom and ruler controls. #### Scenario: Zoom to fit - **WHEN** user clicks View → Zoom to fit or presses ⇧1 - **THEN** system fits all content in viewport #### Scenario: Zoom in - **WHEN** user clicks View → Zoom in or presses ⌘= - **THEN** system zooms in toward center #### Scenario: Zoom out - **WHEN** user clicks View → Zoom out or presses ⌘- - **THEN** system zooms out from center #### Scenario: Toggle rulers - **WHEN** user clicks View → Rulers or presses ⇧R - **THEN** system shows/hides canvas rulers ### Requirement: Object menu The system SHALL provide Object menu with grouping, framing, and component actions. #### Scenario: Group selection - **WHEN** user clicks Object → Group or presses ⌘G - **THEN** system creates GROUP containing selected nodes #### Scenario: Ungroup - **WHEN** user clicks Object → Ungroup or presses ⌘⇧G with grouped selection - **THEN** system dissolves group and reparents children #### Scenario: Frame selection - **WHEN** user clicks Object → Frame selection or presses ⌘⌥F - **THEN** system wraps selected nodes in FRAME #### Scenario: Create component - **WHEN** user clicks Object → Create component or presses ⌘⌥K - **THEN** system converts selection to COMPONENT #### Scenario: Create component set - **WHEN** user clicks Object → Create component set with multiple components selected - **THEN** system creates COMPONENT_SET containing components ### Requirement: Text menu The system SHALL provide Text menu with font size and style controls. #### Scenario: Font size adjustment - **WHEN** user clicks Text → Increase font size (⌘⇧>) or Decrease (⌘⇧<) - **THEN** system adjusts font size of selected text by 2px #### Scenario: Bold toggle - **WHEN** user clicks Text → Bold or presses ⌘B - **THEN** system toggles bold weight for selected text #### Scenario: Italic toggle - **WHEN** user clicks Text → Italic or presses ⌘I - **THEN** system toggles italic style for selected text #### Scenario: Underline toggle - **WHEN** user clicks Text → Underline or presses ⌘U - **THEN** system toggles underline decoration for selected text #### Scenario: Strikethrough toggle - **WHEN** user clicks Text → Strikethrough or presses S button - **THEN** system toggles strikethrough decoration for selected text #### Scenario: Text alignment submenu - **WHEN** user clicks Text → Align → Left/Center/Right - **THEN** system aligns selected text horizontally ### Requirement: Arrange menu The system SHALL provide Arrange menu with z-order controls. #### Scenario: Bring to front - **WHEN** user clicks Arrange → Bring to front or presses ] - **THEN** system moves selected node to top of parent's children #### Scenario: Send to back - **WHEN** user clicks Arrange → Send to back or presses [ - **THEN** system moves selected node to bottom of parent's children #### Scenario: Bring forward - **WHEN** user clicks Arrange → Bring forward - **THEN** system moves selected node up one position #### Scenario: Send backward - **WHEN** user clicks Arrange → Send backward - **THEN** system moves selected node down one position ### Requirement: Keyboard shortcut display The system SHALL display keyboard shortcuts next to menu items. #### Scenario: Platform-specific modifier - **WHEN** app runs on Mac - **THEN** system displays ⌘ for Command key #### Scenario: Windows/Linux modifiers - **WHEN** app runs on Windows or Linux - **THEN** system displays Ctrl+ for Control key ### Requirement: reka-ui integration The system SHALL use reka-ui Menubar components for menu implementation. #### Scenario: Menu structure - **WHEN** component renders - **THEN** system uses MenubarRoot, MenubarMenu, MenubarTrigger, MenubarContent, MenubarItem #### Scenario: Submenus - **WHEN** menu has nested items (e.g., Text → Align) - **THEN** system uses MenubarSub, MenubarSubTrigger, MenubarSubContent #### Scenario: Separators - **WHEN** menu defines separator: true - **THEN** system renders MenubarSeparator divider ### Requirement: Action binding The system SHALL bind menu actions to editor store methods. #### Scenario: Calling store actions - **WHEN** user selects menu item - **THEN** system invokes corresponding method on useEditorStore (e.g., `store.saveFigFile()`, `store.duplicateSelected()`) ### Requirement: Dynamic disabled state The system SHALL disable menu items based on current editor state. #### Scenario: Export requires selection - **WHEN** no nodes are selected - **THEN** system disables "Export selection…" item #### Scenario: Text menu requires text selection - **WHEN** selected node is not TEXT - **THEN** system may disable text formatting items (if implemented)