diff --git a/src/main/AryxAppService.ts b/src/main/AryxAppService.ts index ab85de8..5f90f74 100644 --- a/src/main/AryxAppService.ts +++ b/src/main/AryxAppService.ts @@ -836,6 +836,10 @@ export class AryxAppService extends EventEmitter { return this.workspace?.settings.quickPrompt ?? createDefaultQuickPromptSettings(); } + getCurrentTheme(): AppearanceTheme { + return this.workspace?.settings.theme ?? 'dark'; + } + async setQuickPromptSettings(patch: Partial): Promise { const workspace = await this.loadWorkspace(); const current = workspace.settings.quickPrompt ?? createDefaultQuickPromptSettings(); diff --git a/src/main/index.ts b/src/main/index.ts index 6307b0b..c71d1ac 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -83,7 +83,7 @@ async function bootstrap(): Promise { const hotkeySettings = workspace.settings.quickPrompt ?? createDefaultQuickPromptSettings(); globalHotkeyService.register(hotkeySettings, () => { const win = ensureQuickPromptWindow(); - if (win) void toggleQuickPromptWindow(win); + if (win) void toggleQuickPromptWindow(win, appService!.getCurrentTheme()); }); // Re-register hotkey when settings change diff --git a/src/main/windows/createQuickPromptWindow.ts b/src/main/windows/createQuickPromptWindow.ts index 51a4ec0..18efd83 100644 --- a/src/main/windows/createQuickPromptWindow.ts +++ b/src/main/windows/createQuickPromptWindow.ts @@ -57,7 +57,7 @@ export function createQuickPromptWindow(): BrowserWindowType { return window; } -export async function toggleQuickPromptWindow(window: BrowserWindowType): Promise { +export async function toggleQuickPromptWindow(window: BrowserWindowType, theme?: string): Promise { if (window.isVisible()) { window.webContents.send('quick-prompt:hide'); window.hide(); @@ -73,14 +73,14 @@ export async function toggleQuickPromptWindow(window: BrowserWindowType): Promis } centerOnActiveDisplay(window); - window.webContents.send('quick-prompt:show'); + window.webContents.send('quick-prompt:show', theme ?? 'dark'); window.show(); window.focus(); } -export function showQuickPromptWindow(window: BrowserWindowType): void { +export function showQuickPromptWindow(window: BrowserWindowType, theme?: string): void { centerOnActiveDisplay(window); - window.webContents.send('quick-prompt:show'); + window.webContents.send('quick-prompt:show', theme ?? 'dark'); window.show(); window.focus(); } diff --git a/src/preload/quickprompt.ts b/src/preload/quickprompt.ts index 6a596c5..b2bdc58 100644 --- a/src/preload/quickprompt.ts +++ b/src/preload/quickprompt.ts @@ -36,7 +36,7 @@ const api: QuickPromptElectronApi = { return () => ipcRenderer.off(ch.sessionEvent, handler); }, onShow: (listener) => { - const handler = () => listener(); + const handler = (_event: Electron.IpcRendererEvent, theme: string) => listener(theme); ipcRenderer.on(ch.show, handler); return () => ipcRenderer.off(ch.show, handler); }, diff --git a/src/renderer/components/quick-prompt/QuickPromptApp.tsx b/src/renderer/components/quick-prompt/QuickPromptApp.tsx index 722cb9e..88897de 100644 --- a/src/renderer/components/quick-prompt/QuickPromptApp.tsx +++ b/src/renderer/components/quick-prompt/QuickPromptApp.tsx @@ -46,7 +46,13 @@ export function QuickPromptApp() { // Subscribe to show/hide events from main process useEffect(() => { - const offShow = api.onShow(() => { + const offShow = api.onShow((theme: string) => { + // Apply theme to document root so CSS variables match the main app + const effective = theme === 'system' + ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') + : theme; + document.documentElement.dataset.theme = effective; + setVisible(true); resetState(); }); diff --git a/src/shared/contracts/ipc.ts b/src/shared/contracts/ipc.ts index 8dc173d..45a4880 100644 --- a/src/shared/contracts/ipc.ts +++ b/src/shared/contracts/ipc.ts @@ -419,6 +419,6 @@ export interface QuickPromptElectronApi { getCapabilities(): Promise; setSettings(settings: Partial): Promise; onSessionEvent(listener: (event: SessionEventRecord) => void): () => void; - onShow(listener: () => void): () => void; + onShow(listener: (theme: string) => void): () => void; onHide(listener: () => void): () => void; }