summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context/settings.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-01-06 16:03:39 -0600
committerAdam <[email protected]>2026-01-20 07:33:44 -0600
commitde3641e8ebfd6d6d0262289136e970b1ddea54b2 (patch)
treeb351a43a08e24c57bec5ddcdc2e851853759a761 /packages/app/src/context/settings.tsx
parent8bcbfd63960120efa3cb770f8e07de1bb57e93b0 (diff)
downloadopencode-de3641e8ebfd6d6d0262289136e970b1ddea54b2.tar.gz
opencode-de3641e8ebfd6d6d0262289136e970b1ddea54b2.zip
wip(app): settings
Diffstat (limited to 'packages/app/src/context/settings.tsx')
-rw-r--r--packages/app/src/context/settings.tsx60
1 files changed, 56 insertions, 4 deletions
diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx
index 6aca57ae2..4160d1b70 100644
--- a/packages/app/src/context/settings.tsx
+++ b/packages/app/src/context/settings.tsx
@@ -1,5 +1,5 @@
import { createStore } from "solid-js/store"
-import { createMemo } from "solid-js"
+import { createEffect, createMemo } from "solid-js"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { persisted } from "@/utils/persist"
@@ -9,6 +9,12 @@ export interface NotificationSettings {
errors: boolean
}
+export interface SoundSettings {
+ agent: string
+ permissions: string
+ errors: string
+}
+
export interface Settings {
general: {
autoSave: boolean
@@ -22,6 +28,7 @@ export interface Settings {
autoApprove: boolean
}
notifications: NotificationSettings
+ sounds: SoundSettings
}
const defaultSettings: Settings = {
@@ -37,16 +44,47 @@ const defaultSettings: Settings = {
autoApprove: false,
},
notifications: {
- agent: false,
- permissions: false,
+ agent: true,
+ permissions: true,
errors: false,
},
+ sounds: {
+ agent: "staplebops-01",
+ permissions: "staplebops-02",
+ errors: "nope-03",
+ },
+}
+
+const monoFallback =
+ 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace'
+
+const monoFonts: Record<string, string> = {
+ "ibm-plex-mono": `"IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "cascadia-code": `"Cascadia Code Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "fira-code": `"Fira Code Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ hack: `"Hack Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ inconsolata: `"Inconsolata Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "intel-one-mono": `"Intel One Mono Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "jetbrains-mono": `"JetBrains Mono Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "meslo-lgs": `"Meslo LGS Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "roboto-mono": `"Roboto Mono Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "source-code-pro": `"Source Code Pro Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+ "ubuntu-mono": `"Ubuntu Mono Nerd Font", "IBM Plex Mono", "IBM Plex Mono Fallback", ${monoFallback}`,
+}
+
+export function monoFontFamily(font: string | undefined) {
+ return monoFonts[font ?? defaultSettings.appearance.font] ?? monoFonts[defaultSettings.appearance.font]
}
export const { use: useSettings, provider: SettingsProvider } = createSimpleContext({
name: "Settings",
init: () => {
- const [store, setStore, _, ready] = persisted("settings.v1", createStore<Settings>(defaultSettings))
+ const [store, setStore, _, ready] = persisted("settings.v3", createStore<Settings>(defaultSettings))
+
+ createEffect(() => {
+ if (typeof document === "undefined") return
+ document.documentElement.style.setProperty("--font-family-mono", monoFontFamily(store.appearance?.font))
+ })
return {
ready,
@@ -98,6 +136,20 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
setStore("notifications", "errors", value)
},
},
+ sounds: {
+ agent: createMemo(() => store.sounds?.agent ?? defaultSettings.sounds.agent),
+ setAgent(value: string) {
+ setStore("sounds", "agent", value)
+ },
+ permissions: createMemo(() => store.sounds?.permissions ?? defaultSettings.sounds.permissions),
+ setPermissions(value: string) {
+ setStore("sounds", "permissions", value)
+ },
+ errors: createMemo(() => store.sounds?.errors ?? defaultSettings.sounds.errors),
+ setErrors(value: string) {
+ setStore("sounds", "errors", value)
+ },
+ },
}
},
})