From 8658c6458e15711f336ebeeca900052e469de344 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Wed, 24 Dec 2025 02:49:05 -0500 Subject: [PATCH 1/6] feat: Add persistent sidebar overlay toggle in command palette Instead of a config file option, allow toggling sidebar overlay behavior directly from the command palette. The state persists to kv.json. Changes: - Add sidebarOverlayEnabled signal persisted to kv.json (defaults to true) - Add sidebarOverlay toggle command in System category - Add optional sidebar_overlay_toggle keybind config (default: none) This provides instant toggling without requiring restart/reload. --- .../src/cli/cmd/tui/routes/session/index.tsx | 20 ++++++++++++++++++- packages/opencode/src/config/config.ts | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index c685d8c66cc..cb5394286ee 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -128,6 +128,7 @@ export function Session() { const [showDetails, setShowDetails] = createSignal(kv.get("tool_details_visibility", true)) const [showScrollbar, setShowScrollbar] = createSignal(kv.get("scrollbar_visible", false)) const [userMessageMarkdown, setUserMessageMarkdown] = createSignal(kv.get("user_message_markdown", true)) + const [sidebarOverlayEnabled, setSidebarOverlayEnabled] = createSignal(kv.get("sidebar_overlay", true)) const [diffWrapMode, setDiffWrapMode] = createSignal<"word" | "none">("word") const wide = createMemo(() => dimensions().width > 120) @@ -138,7 +139,10 @@ export function Session() { if (sidebar() === "auto" && wide()) return true return false }) - const sidebarOverlay = createMemo(() => sidebarVisible() && !wide()) + const sidebarOverlay = createMemo(() => { + if (!sidebarOverlayEnabled()) return false + return sidebarVisible() && !wide() + }) const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() && !sidebarOverlay() ? 42 : 0) - 4) const scrollAcceleration = createMemo(() => { @@ -489,6 +493,20 @@ export function Session() { dialog.clear() }, }, + { + title: sidebarOverlayEnabled() ? "Disable sidebar overlay" : "Enable sidebar overlay", + value: "sidebar_overlay", + keybind: "sidebar_overlay_toggle", + category: "System", + onSelect: (dialog) => { + setSidebarOverlayEnabled((prev) => { + const next = !prev + kv.set("sidebar_overlay", next) + return next + }) + dialog.clear() + }, + }, { title: usernameVisible() ? "Hide username" : "Show username", value: "session.username_visible.toggle", diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index ba9d1973025..c9fd55821ed 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -469,6 +469,7 @@ export namespace Config { .default("h") .describe("Toggle code block concealment in messages"), tool_details: z.string().optional().default("none").describe("Toggle tool details visibility"), + sidebar_overlay_toggle: z.string().optional().default("none").describe("Toggle sidebar overlay mode"), model_list: z.string().optional().default("m").describe("List available models"), model_cycle_recent: z.string().optional().default("f2").describe("Next recently used model"), model_cycle_recent_reverse: z.string().optional().default("shift+f2").describe("Previous recently used model"), From fcefdddee38f704613ea78b2212eb45573b9ac14 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Fri, 16 Jan 2026 02:03:31 -0500 Subject: [PATCH 2/6] fix: make sidebar overlay toggle functional The sidebarOverlay() memo was computed but never used in rendering. Changed the Switch/Match conditions from wide() to sidebarOverlay() so the toggle command actually controls overlay behavior. --- packages/opencode/src/cli/cmd/tui/routes/session/index.tsx | 4 ++-- packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 109c58c5adb..0cb42182553 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -1086,10 +1086,10 @@ export function Session() { - + - + sync.session.get(props.sessionID)!) @@ -77,7 +77,7 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) { paddingBottom={1} paddingLeft={2} paddingRight={2} - position={props.overlay ? "absolute" : "relative"} + position="relative" > From 8c4daef7b058f2600e930f511be692d1033ab885 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Fri, 16 Jan 2026 02:26:55 -0500 Subject: [PATCH 3/6] fix: remove redundant kv.set call from sidebar overlay toggle The explicit kv.set() inside the setter callback was causing a nested setStore that interfered with SolidJS reactive tracking. This made the toggle appear to work (value persisted) but the UI wouldn't update. --- packages/opencode/src/cli/cmd/tui/routes/session/index.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 0cb42182553..44f6098e2dc 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -494,11 +494,7 @@ export function Session() { keybind: "sidebar_overlay_toggle", category: "System", onSelect: (dialog) => { - setSidebarOverlayEnabled((prev) => { - const next = !prev - kv.set("sidebar_overlay", next) - return next - }) + setSidebarOverlayEnabled((prev) => !prev) dialog.clear() }, }, From 1c48fe12499e3056c6edc627e9d6ab67616bd627 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Mon, 26 Jan 2026 00:16:17 -0500 Subject: [PATCH 4/6] fix: unslop --- .../src/cli/cmd/tui/routes/session/index.tsx | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index f0ceb21b4e7..450a3c2aee4 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -519,20 +519,6 @@ export function Session() { dialog.clear() }, }, - { - title: usernameVisible() ? "Hide username" : "Show username", - value: "session.username_visible.toggle", - keybind: "username_toggle", - category: "Session", - onSelect: (dialog) => { - setUsernameVisible((prev) => { - const next = !prev - kv.set("username_visible", next) - return next - }) - dialog.clear() - }, - }, { title: "Toggle code concealment", value: "session.toggle.conceal", From 5f89774da66861d7c65260076bebd9f5ba718d90 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Mon, 26 Jan 2026 01:06:51 -0500 Subject: [PATCH 5/6] fix(app): make sidebar overlay command available before sending messages --- packages/opencode/src/cli/cmd/tui/app.tsx | 10 ++++++++++ .../opencode/src/cli/cmd/tui/routes/session/index.tsx | 10 ---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 4b177e292cf..7081c69e94b 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -570,6 +570,16 @@ function App() { dialog.clear() }, }, + { + title: kv.get("sidebar_overlay", true) ? "Disable sidebar overlay" : "Enable sidebar overlay", + value: "sidebar_overlay", + keybind: "sidebar_overlay_toggle", + category: "System", + onSelect: (dialog) => { + kv.set("sidebar_overlay", !kv.get("sidebar_overlay", true)) + dialog.clear() + }, + }, ]) createEffect(() => { diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 450a3c2aee4..75210a39664 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -509,16 +509,6 @@ export function Session() { dialog.clear() }, }, - { - title: sidebarOverlayEnabled() ? "Disable sidebar overlay" : "Enable sidebar overlay", - value: "sidebar_overlay", - keybind: "sidebar_overlay_toggle", - category: "System", - onSelect: (dialog) => { - setSidebarOverlayEnabled((prev) => !prev) - dialog.clear() - }, - }, { title: "Toggle code concealment", value: "session.toggle.conceal", From 7105a86ea2b1ac057695b5cdc32f24f5bab31d45 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Tue, 27 Jan 2026 08:05:05 -0500 Subject: [PATCH 6/6] Merge dev into feat/persistant-sidebar-overlay-behaviour --- packages/opencode/src/cli/cmd/tui/app.tsx | 30 ----------------------- 1 file changed, 30 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 1965dc2d8ed..db7e473fd0b 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -549,7 +549,6 @@ function App() { { title: kv.get("sidebar_overlay", true) ? "Disable sidebar overlay" : "Enable sidebar overlay", value: "sidebar_overlay", - keybind: "sidebar_overlay_toggle", category: "System", onSelect: (dialog) => { kv.set("sidebar_overlay", !kv.get("sidebar_overlay", true)) @@ -575,35 +574,6 @@ function App() { dialog.clear() }, }, - }, - { -<<<<<<< HEAD - title: kv.get("sidebar_overlay", true) ? "Disable sidebar overlay" : "Enable sidebar overlay", - value: "sidebar_overlay", - keybind: "sidebar_overlay_toggle", - category: "System", - onSelect: (dialog) => { - kv.set("sidebar_overlay", !kv.get("sidebar_overlay", true)) -======= - title: kv.get("animations_enabled", true) ? "Disable animations" : "Enable animations", - value: "app.toggle.animations", - category: "System", - onSelect: (dialog) => { - kv.set("animations_enabled", !kv.get("animations_enabled", true)) - dialog.clear() - }, - }, - { - title: kv.get("diff_wrap_mode", "word") === "word" ? "Disable diff wrapping" : "Enable diff wrapping", - value: "app.toggle.diffwrap", - category: "System", - onSelect: (dialog) => { - const current = kv.get("diff_wrap_mode", "word") - kv.set("diff_wrap_mode", current === "word" ? "none" : "word") ->>>>>>> dev - dialog.clear() - }, - }, ]) createEffect(() => {