From 5a80e3809f0241018f91a69f01e66b311f434098 Mon Sep 17 00:00:00 2001 From: Seth Etter Date: Thu, 12 Feb 2026 06:06:58 -0600 Subject: [PATCH] Extension shortcut toggles sidebar instead of just open --- extension/src/entrypoints/background.ts | 29 ++++++++++++++++---- extension/src/entrypoints/sidepanel/main.tsx | 4 +++ extension/wxt.config.ts | 4 +-- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/extension/src/entrypoints/background.ts b/extension/src/entrypoints/background.ts index 3f2a59e..76f22db 100644 --- a/extension/src/entrypoints/background.ts +++ b/extension/src/entrypoints/background.ts @@ -340,20 +340,37 @@ export default defineBackground(() => { } } + let sidePanelOpen = false; + + browser.runtime.onConnect.addListener((port) => { + if (port.name === 'sidepanel') { + sidePanelOpen = true; + port.onDisconnect.addListener(() => { + sidePanelOpen = false; + }); + } + }); + browser.commands?.onCommand.addListener((command) => { - if (command === 'open-sidebar') { + if (command === 'toggle-sidebar') { const browserAny = browser as any; if (browserAny.sidePanel) { chrome.windows.getCurrent((win) => { if (win?.id) { - browserAny.sidePanel.open({ windowId: win.id }).catch((err: Error) => { - console.error('Could not open side panel:', err); - }); + if (sidePanelOpen && typeof browserAny.sidePanel.close === 'function') { + browserAny.sidePanel.close({ windowId: win.id }).catch((err: Error) => { + console.error('Could not close side panel:', err); + }); + } else { + browserAny.sidePanel.open({ windowId: win.id }).catch((err: Error) => { + console.error('Could not open side panel:', err); + }); + } } }); } else if (browserAny.sidebarAction) { - browserAny.sidebarAction.open().catch((err: Error) => { - console.warn('Could not open Firefox sidebar:', err); + browserAny.sidebarAction.toggle().catch((err: Error) => { + console.warn('Could not toggle Firefox sidebar:', err); }); } return; diff --git a/extension/src/entrypoints/sidepanel/main.tsx b/extension/src/entrypoints/sidepanel/main.tsx index b2f0cb5..80a9581 100644 --- a/extension/src/entrypoints/sidepanel/main.tsx +++ b/extension/src/entrypoints/sidepanel/main.tsx @@ -1,8 +1,12 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; +import { browser } from 'wxt/browser'; import App from '@/components/sidepanel/App'; import '@/assets/styles.css'; +// Connect a port so the background script can track open/closed state +browser.runtime.connect({ name: 'sidepanel' }); + ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/extension/wxt.config.ts b/extension/wxt.config.ts index 7dc1b81..28b0fe3 100644 --- a/extension/wxt.config.ts +++ b/extension/wxt.config.ts @@ -40,12 +40,12 @@ export default defineConfig({ 128: '/icons/icon-128.png', }, commands: { - 'open-sidebar': { + 'toggle-sidebar': { suggested_key: { default: 'Alt+M', mac: 'Alt+M', }, - description: 'Open Margin sidebar', + description: 'Toggle Margin sidebar', }, 'annotate-selection': { suggested_key: {