import type { DesktopNativeKey } from "./i18n/desktop-native" export type DesktopMenuPlatform = "macos" | "windows" export type DesktopMenuAction = | "app.checkForUpdates" | "app.relaunch" | "edit.undo" | "edit.redo" | "edit.cut" | "edit.copy" | "edit.paste" | "edit.delete" | "edit.selectAll" | "view.reload" | "view.toggleDevTools" | "view.resetZoom" | "view.zoomIn" | "view.zoomOut" | "view.toggleFullscreen" | "window.new" | "window.close" | "window.minimize" | "window.toggleMaximize" export type DesktopMenuRole = | "about" | "close" | "copy" | "cut" | "hide" | "hideOthers" | "paste" | "quit" | "redo" | "reload" | "resetZoom" | "selectAll" | "toggleDevTools" | "togglefullscreen" | "undo" | "unhide" | "windowMenu" | "zoomIn" | "zoomOut" export type DesktopMenuItem = { type: "item" labelKey?: DesktopNativeKey command?: string action?: DesktopMenuAction role?: DesktopMenuRole href?: string accelerator?: Partial> enabled?: "updater" platforms?: DesktopMenuPlatform[] } export type DesktopMenuSeparator = { type: "separator" platforms?: DesktopMenuPlatform[] } export type DesktopMenuEntry = DesktopMenuItem | DesktopMenuSeparator export type DesktopMenu = { id: string labelKey: DesktopNativeKey role?: DesktopMenuRole items?: DesktopMenuEntry[] platforms?: DesktopMenuPlatform[] } export const DESKTOP_MENU: DesktopMenu[] = [ { id: "app", labelKey: "desktop.menu.app", platforms: ["macos"], items: [ { type: "item", role: "about" }, { type: "item", labelKey: "desktop.menu.checkForUpdates", action: "app.checkForUpdates", enabled: "updater", }, { type: "item", labelKey: "desktop.menu.settings", command: "settings.open", accelerator: { macos: "Cmd+," } }, { type: "item", labelKey: "desktop.menu.reloadWebview", action: "view.reload" }, { type: "item", labelKey: "desktop.menu.restart", action: "app.relaunch" }, { type: "item", labelKey: "desktop.menu.exportLogs", command: "logs.export" }, { type: "separator" }, { type: "item", role: "hide" }, { type: "item", role: "hideOthers" }, { type: "item", role: "unhide" }, { type: "separator" }, { type: "item", role: "quit" }, ], }, { id: "file", labelKey: "desktop.menu.file", items: [ { type: "item", labelKey: "desktop.menu.newSession", command: "session.new", accelerator: { macos: "Shift+Cmd+S" }, }, { type: "item", labelKey: "desktop.menu.openProject", command: "project.open", accelerator: { macos: "Cmd+O" }, }, { type: "item", labelKey: "desktop.menu.settings", command: "settings.open", accelerator: { windows: "Ctrl+," }, platforms: ["windows"], }, { type: "item", labelKey: "desktop.menu.newWindow", action: "window.new", accelerator: { macos: "Cmd+Shift+N", windows: "Ctrl+Shift+N" }, }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.closeWindow", action: "window.close", role: "close" }, ], }, { id: "edit", labelKey: "desktop.menu.edit", items: [ { type: "item", labelKey: "desktop.menu.undo", action: "edit.undo", role: "undo", accelerator: { windows: "Ctrl+Z" }, }, { type: "item", labelKey: "desktop.menu.redo", action: "edit.redo", role: "redo", accelerator: { windows: "Ctrl+Y" }, }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.cut", action: "edit.cut", role: "cut", accelerator: { windows: "Ctrl+X" }, }, { type: "item", labelKey: "desktop.menu.copy", action: "edit.copy", role: "copy", accelerator: { windows: "Ctrl+C" }, }, { type: "item", labelKey: "desktop.menu.paste", action: "edit.paste", role: "paste", accelerator: { windows: "Ctrl+V" }, }, { type: "item", labelKey: "desktop.menu.delete", action: "edit.delete" }, { type: "item", labelKey: "desktop.menu.selectAll", action: "edit.selectAll", role: "selectAll", accelerator: { windows: "Ctrl+A" }, }, ], }, { id: "view", labelKey: "desktop.menu.view", items: [ { type: "item", labelKey: "desktop.menu.toggleSidebar", command: "sidebar.toggle" }, { type: "item", labelKey: "desktop.menu.toggleTerminal", command: "terminal.toggle", accelerator: { macos: "Ctrl+`" }, }, { type: "item", labelKey: "desktop.menu.toggleFileTree", command: "fileTree.toggle" }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.reload", action: "view.reload", role: "reload" }, { type: "item", labelKey: "desktop.menu.toggleDeveloperTools", action: "view.toggleDevTools", role: "toggleDevTools", }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.actualSize", action: "view.resetZoom", role: "resetZoom", accelerator: { windows: "Ctrl+0" }, }, { type: "item", labelKey: "desktop.menu.zoomIn", action: "view.zoomIn", role: "zoomIn", accelerator: { windows: "Ctrl++" }, }, { type: "item", labelKey: "desktop.menu.zoomOut", action: "view.zoomOut", role: "zoomOut", accelerator: { windows: "Ctrl+-" }, }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.toggleFullScreen", action: "view.toggleFullscreen", role: "togglefullscreen", }, ], }, { id: "go", labelKey: "desktop.menu.go", items: [ { type: "item", labelKey: "desktop.menu.back", command: "common.goBack", accelerator: { macos: "Cmd+[" } }, { type: "item", labelKey: "desktop.menu.forward", command: "common.goForward", accelerator: { macos: "Cmd+]" } }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.previousSession", command: "session.previous", accelerator: { macos: "Option+Up" }, }, { type: "item", labelKey: "desktop.menu.nextSession", command: "session.next", accelerator: { macos: "Option+Down" }, }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.previousProject", command: "project.previous", accelerator: { macos: "Cmd+Option+Up" }, }, { type: "item", labelKey: "desktop.menu.nextProject", command: "project.next", accelerator: { macos: "Cmd+Option+Down" }, }, ], }, { id: "window", labelKey: "desktop.menu.window", role: "windowMenu", items: [ { type: "item", labelKey: "desktop.menu.minimize", action: "window.minimize" }, { type: "item", labelKey: "desktop.menu.maximize", action: "window.toggleMaximize" }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.closeWindow", action: "window.close" }, ], }, { id: "help", labelKey: "desktop.menu.help", items: [ { type: "item", labelKey: "desktop.menu.documentation", href: "https://opencode.ai/docs" }, { type: "item", labelKey: "desktop.menu.supportForum", href: "https://discord.com/invite/opencode" }, { type: "item", labelKey: "desktop.menu.exportLogs", command: "logs.export" }, { type: "separator" }, { type: "item", labelKey: "desktop.menu.shareFeedback", href: "https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml", }, { type: "item", labelKey: "desktop.menu.reportBug", href: "https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml", }, ], }, ] export function desktopMenuVisible(item: { platforms?: DesktopMenuPlatform[] }, platform: DesktopMenuPlatform) { return !item.platforms || item.platforms.includes(platform) }