From 3bffb762210ac935aa79c319654d81fe20e9b558 Mon Sep 17 00:00:00 2001 From: alpha Date: Mon, 12 Oct 2026 12:10:40 -0500 Subject: [PATCH 01/10] Add hideTaskbarWhileRunning setting and UI Refs #141 Co-Authored-By: Claude Sonnet 5.5 --- src/main/store/config.store.ts | 6 +++ .../custom/settings/hide-taskbar-field.tsx | 22 ++++++++ src/renderer/components/custom/titlebar.tsx | 52 +++++++++++-------- src/renderer/hooks/use-hide-taskbar.ts | 21 ++++++++ src/renderer/i18n/locales/en.ts | 8 ++- src/renderer/i18n/locales/ru.ts | 8 ++- src/renderer/pages/configuration/index.tsx | 2 + src/renderer/types/config.ts | 3 ++ 8 files changed, 97 insertions(+), 25 deletions(-) create mode 100644 src/renderer/components/custom/settings/hide-taskbar-field.tsx create mode 100644 src/renderer/hooks/use-hide-taskbar.ts diff --git a/src/main/store/config.store.ts b/src/main/store/config.store.ts index c5741139..d65b4e08 100644 --- a/src/main/store/config.store.ts +++ b/src/main/store/config.store.ts @@ -45,6 +45,10 @@ export interface RuntimeConfig { // mock interview: also generate what the live assistant would have suggested for each // question. On by default - see the note on the default value below. mockLiveHintsEnabled: boolean; + + // Hide the taskbar/Dock icon, pin on top and drop minimize while a live interview runs. + // Off by default: the window is a normal window unless stealth mode is on. + hideTaskbarWhileRunning: boolean; } // Default runtime configuration @@ -86,6 +90,7 @@ const DEFAULT_RUNTIME_CONFIG: RuntimeConfig = { // the only answer they are ever offered - and the session bar still turns it off for the run // where composing unaided is the point. mockLiveHintsEnabled: true, + hideTaskbarWhileRunning: false, }; // interviewConf (full name, profile, context) used to be cached under `runtime`, but it's now @@ -307,6 +312,7 @@ export const configStore = new ConfigStore(); ?.mockLiveSuggestionsEnabled; migration.mockLiveHintsEnabled = typeof legacy === 'boolean' ? legacy : true; } + if (raw?.hideTaskbarWhileRunning === undefined) migration.hideTaskbarWhileRunning = false; // perform migration only if there are values to set if (Object.keys(migration).length > 0) { configStore.updateConfig(migration); diff --git a/src/renderer/components/custom/settings/hide-taskbar-field.tsx b/src/renderer/components/custom/settings/hide-taskbar-field.tsx new file mode 100644 index 00000000..53f94b8b --- /dev/null +++ b/src/renderer/components/custom/settings/hide-taskbar-field.tsx @@ -0,0 +1,22 @@ +import { Checkbox } from '@/components/ui/checkbox'; +import { useHideTaskbar } from '@/hooks/use-hide-taskbar'; +import { useT } from '@/i18n'; + +export function HideTaskbarField() { + const t = useT(); + const { enabled, setEnabled } = useHideTaskbar(); + + return ( + + ); +} diff --git a/src/renderer/components/custom/titlebar.tsx b/src/renderer/components/custom/titlebar.tsx index 8b09f099..9a6f13e3 100644 --- a/src/renderer/components/custom/titlebar.tsx +++ b/src/renderer/components/custom/titlebar.tsx @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useAppState } from '@/hooks/use-app-state'; import { useCommandPaletteStore } from '@/hooks/use-command-palette'; +import { useHideTaskbar } from '@/hooks/use-hide-taskbar'; import { useInterviewLock } from '@/hooks/use-interview-lock'; import useIsStealthMode from '@/hooks/use-is-stealth-mode'; import { useT } from '@/i18n'; @@ -57,6 +58,9 @@ export default function Titlebar() { // surface is the same one. const { locked } = useInterviewLock(); + // No taskbar icon to restore from, and main refuses minimize in this mode too. + const { enabled: minimizeBlocked } = useHideTaskbar(); + if (isStealth) return null; return ( @@ -121,30 +125,32 @@ export default function Titlebar() { {!isMac && ( <> - - - - - -

{t.titlebar.minimize}

-
-
+ + + + + + +

{t.titlebar.minimize}

+
+ + )}