From 8bcbfd63960120efa3cb770f8e07de1bb57e93b0 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:21:00 -0600 Subject: [PATCH] wip(app): settings --- packages/app/src/app.tsx | 43 +++--- .../app/src/components/dialog-settings.tsx | 87 ++++++++++++ .../app/src/components/settings-agents.tsx | 12 ++ .../app/src/components/settings-commands.tsx | 12 ++ .../app/src/components/settings-general.tsx | 134 ++++++++++++++++++ .../app/src/components/settings-keybinds.tsx | 12 ++ packages/app/src/components/settings-mcp.tsx | 12 ++ .../app/src/components/settings-models.tsx | 12 ++ .../src/components/settings-permissions.tsx | 12 ++ .../app/src/components/settings-providers.tsx | 12 ++ packages/app/src/context/settings.tsx | 103 ++++++++++++++ packages/app/src/pages/layout.tsx | 5 + packages/ui/src/components/dialog.css | 16 ++- packages/ui/src/components/dialog.tsx | 4 +- packages/ui/src/components/tabs.css | 124 +++++++++++++--- packages/ui/src/components/tabs.tsx | 9 +- 16 files changed, 564 insertions(+), 45 deletions(-) create mode 100644 packages/app/src/components/dialog-settings.tsx create mode 100644 packages/app/src/components/settings-agents.tsx create mode 100644 packages/app/src/components/settings-commands.tsx create mode 100644 packages/app/src/components/settings-general.tsx create mode 100644 packages/app/src/components/settings-keybinds.tsx create mode 100644 packages/app/src/components/settings-mcp.tsx create mode 100644 packages/app/src/components/settings-models.tsx create mode 100644 packages/app/src/components/settings-permissions.tsx create mode 100644 packages/app/src/components/settings-providers.tsx create mode 100644 packages/app/src/context/settings.tsx diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index d03d10d0e..33a5556ef 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -14,6 +14,7 @@ import { PermissionProvider } from "@/context/permission" import { LayoutProvider } from "@/context/layout" import { GlobalSDKProvider } from "@/context/global-sdk" import { ServerProvider, useServer } from "@/context/server" +import { SettingsProvider } from "@/context/settings" import { TerminalProvider } from "@/context/terminal" import { PromptProvider } from "@/context/prompt" import { FileProvider } from "@/context/file" @@ -82,15 +83,17 @@ export function AppInterface(props: { defaultUrl?: string }) { ( - - - - - {props.children} - - - - + + + + + + {props.children} + + + + + )} > } /> ( - - - - }> - - - - - + component={(p) => ( + + + + + }> + + + + + + )} /> diff --git a/packages/app/src/components/dialog-settings.tsx b/packages/app/src/components/dialog-settings.tsx new file mode 100644 index 000000000..872cc4c80 --- /dev/null +++ b/packages/app/src/components/dialog-settings.tsx @@ -0,0 +1,87 @@ +import { Component, createSignal } from "solid-js" +import { Dialog } from "@opencode-ai/ui/dialog" +import { Tabs } from "@opencode-ai/ui/tabs" +import { Icon } from "@opencode-ai/ui/icon" +import { TextField } from "@opencode-ai/ui/text-field" +import { SettingsGeneral } from "./settings-general" +import { SettingsKeybinds } from "./settings-keybinds" +import { SettingsPermissions } from "./settings-permissions" +import { SettingsProviders } from "./settings-providers" +import { SettingsModels } from "./settings-models" +import { SettingsAgents } from "./settings-agents" +import { SettingsCommands } from "./settings-commands" +import { SettingsMcp } from "./settings-mcp" + +export const DialogSettings: Component = () => { + const [search, setSearch] = createSignal("") + + return ( + + + + + Desktop + + + General + + + + Shortcuts + + Server + + + Permissions + + + + Providers + + + + Models + + + + Agents + + + + Commands + + + + MCP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/packages/app/src/components/settings-agents.tsx b/packages/app/src/components/settings-agents.tsx new file mode 100644 index 000000000..892be152b --- /dev/null +++ b/packages/app/src/components/settings-agents.tsx @@ -0,0 +1,12 @@ +import { Component } from "solid-js" + +export const SettingsAgents: Component = () => { + return ( +
+
+

Agents

+

Agent settings will be configurable here.

+
+
+ ) +} diff --git a/packages/app/src/components/settings-commands.tsx b/packages/app/src/components/settings-commands.tsx new file mode 100644 index 000000000..e98c0eeb0 --- /dev/null +++ b/packages/app/src/components/settings-commands.tsx @@ -0,0 +1,12 @@ +import { Component } from "solid-js" + +export const SettingsCommands: Component = () => { + return ( +
+
+

Commands

+

Command settings will be configurable here.

+
+
+ ) +} diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx new file mode 100644 index 000000000..e9965b0fa --- /dev/null +++ b/packages/app/src/components/settings-general.tsx @@ -0,0 +1,134 @@ +import { Component, createMemo, type JSX } from "solid-js" +import { Select } from "@opencode-ai/ui/select" +import { Switch } from "@opencode-ai/ui/switch" +import { useTheme, type ColorScheme } from "@opencode-ai/ui/theme" +import { useSettings } from "@/context/settings" + +export const SettingsGeneral: Component = () => { + const theme = useTheme() + const settings = useSettings() + + const themeOptions = createMemo(() => + Object.entries(theme.themes()).map(([id, def]) => ({ id, name: def.name ?? id })), + ) + + const colorSchemeOptions: { value: ColorScheme; label: string }[] = [ + { value: "system", label: "System setting" }, + { value: "light", label: "Light" }, + { value: "dark", label: "Dark" }, + ] + + const fontOptions = [ + { value: "ibm-plex-mono", label: "IBM Plex Mono" }, + { value: "fira-code", label: "Fira Code" }, + { value: "jetbrains-mono", label: "JetBrains Mono" }, + { value: "source-code-pro", label: "Source Code Pro" }, + ] + + return ( +
+
+ {/* Header */} +

General

+ + {/* Appearance Section */} +
+

Appearance

+ + + o.id === theme.themeId())} + value={(o) => o.id} + label={(o) => o.name} + onSelect={(option) => option && theme.setTheme(option.id)} + variant="secondary" + size="small" + /> + + + +