+
+ settings.appearance.setMaxWidth(Number(e.currentTarget.value) || 0)}
+ class="flex-1 accent-color-accent h-1.5 cursor-pointer"
+ style={{ "transition": "all 200ms ease-out" }}
+ />
+ {settings.appearance.maxWidth() === 0 ? "auto" : `${settings.appearance.maxWidth()}%`}
+
+
)
diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx
index ae7768f71a87..97dbf3b8240f 100644
--- a/packages/app/src/context/settings.tsx
+++ b/packages/app/src/context/settings.tsx
@@ -32,6 +32,7 @@ export interface Settings {
}
appearance: {
fontSize: number
+ maxWidth: number
mono: string
sans: string
}
@@ -98,6 +99,7 @@ const defaultSettings: Settings = {
},
appearance: {
fontSize: 14,
+ maxWidth: 0,
mono: "",
sans: "",
},
@@ -187,6 +189,10 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
setFontSize(value: number) {
setStore("appearance", "fontSize", value)
},
+ maxWidth: withFallback(() => store.appearance?.maxWidth, defaultSettings.appearance.maxWidth),
+ setMaxWidth(value: number) {
+ setStore("appearance", "maxWidth", Math.max(0, Math.min(100, value)))
+ },
font: withFallback(() => store.appearance?.mono, defaultSettings.appearance.mono),
setFont(value: string) {
setStore("appearance", "mono", value.trim() ? value : "")
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 917de35b1f20..739d73a60699 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -401,7 +401,7 @@ export default function Page() {
if (desktopReviewOpen()) return `${layout.session.width()}px`
return `calc(100% - ${layout.fileTree.width()}px)`
})
- const centered = createMemo(() => isDesktop() && !desktopReviewOpen())
+ const centered = createMemo(() => isDesktop() && !desktopReviewOpen() && settings.appearance.maxWidth() === 0)
function normalizeTab(tab: string) {
if (!tab.startsWith("file://")) return tab
diff --git a/packages/app/src/pages/session/use-session-commands.tsx b/packages/app/src/pages/session/use-session-commands.tsx
index 1a1c290f6d25..c9830ebad076 100644
--- a/packages/app/src/pages/session/use-session-commands.tsx
+++ b/packages/app/src/pages/session/use-session-commands.tsx
@@ -9,6 +9,7 @@ import { useLocal } from "@/context/local"
import { usePermission } from "@/context/permission"
import { usePrompt } from "@/context/prompt"
import { useSDK } from "@/context/sdk"
+import { useSettings } from "@/context/settings"
import { useSync } from "@/context/sync"
import { useTerminal } from "@/context/terminal"
import { showToast } from "@opencode-ai/ui/toast"
@@ -44,6 +45,7 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
const sync = useSync()
const terminal = useTerminal()
const layout = useLayout()
+ const settings = useSettings()
const navigate = useNavigate()
const { params, tabs, view } = useSessionLayout()
@@ -313,6 +315,15 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
keybind: "mod+\\",
onSelect: () => layout.fileTree.toggle(),
}),
+ viewCommand({
+ id: "wide.toggle",
+ title: "Toggle Wide Mode",
+ keybind: "mod+shift+w",
+ onSelect: () => {
+ const cur = settings.appearance.maxWidth()
+ settings.appearance.setMaxWidth(cur === 0 ? 100 : 0)
+ },
+ }),
viewCommand({
id: "input.focus",
title: language.t("command.input.focus"),