diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx index ec0614729c92..cb9b244c965d 100644 --- a/packages/app/src/components/settings-general.tsx +++ b/packages/app/src/components/settings-general.tsx @@ -366,6 +366,44 @@ export const SettingsGeneral: Component = () => { /> + + +
+ settings.appearance.setFontSize(Number(e.currentTarget.value) || 14)} + class="flex-1 accent-color-accent h-1.5 cursor-pointer" + style={{ "transition": "all 200ms ease-out" }} + /> + {settings.appearance.fontSize()}px +
+
+ + +
+ 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"),