summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoradamdottv <[email protected]>2025-06-26 14:54:32 -0500
committeradamdottv <[email protected]>2025-06-26 14:54:32 -0500
commit1b8cd796d661ecb748910c3d960ecaedd7c202a3 (patch)
tree5114d3647e95cdb8ba99bcd3d776f437b40368bd
parent35fba793d057c23a856ebac6329ed4dcb6abe937 (diff)
downloadopencode-1b8cd796d661ecb748910c3d960ecaedd7c202a3.tar.gz
opencode-1b8cd796d661ecb748910c3d960ecaedd7c202a3.zip
feat(tui): more themes
-rw-r--r--packages/tui/internal/theme/loader_test.go30
-rw-r--r--packages/tui/internal/theme/themes/dracula.json219
-rw-r--r--packages/tui/internal/theme/themes/github.json233
-rw-r--r--packages/tui/internal/theme/themes/material.json235
-rw-r--r--packages/tui/internal/theme/themes/monokai.json221
-rw-r--r--packages/tui/internal/theme/themes/solarized.json223
6 files changed, 1149 insertions, 12 deletions
diff --git a/packages/tui/internal/theme/loader_test.go b/packages/tui/internal/theme/loader_test.go
index 1039ab3f1..37546789b 100644
--- a/packages/tui/internal/theme/loader_test.go
+++ b/packages/tui/internal/theme/loader_test.go
@@ -21,7 +21,7 @@ func TestLoadThemesFromJSON(t *testing.T) {
}
// Check for expected themes
- expectedThemes := []string{"tokyonight", "opencode", "everforest", "ayu", "example"}
+ expectedThemes := []string{"tokyonight", "opencode", "everforest", "ayu"}
for _, expected := range expectedThemes {
found := slices.Contains(themes, expected)
if !found {
@@ -43,22 +43,28 @@ func TestLoadThemesFromJSON(t *testing.T) {
}
func TestColorReferenceResolution(t *testing.T) {
- // Test the example theme which uses references
- example := GetTheme("example")
- if example == nil {
- t.Fatal("Failed to get example theme")
+ // Load themes first
+ err := LoadThemesFromJSON()
+ if err != nil {
+ t.Fatalf("Failed to load themes: %v", err)
+ }
+
+ // Test a theme that uses references (e.g., solarized uses color definitions)
+ solarized := GetTheme("solarized")
+ if solarized == nil {
+ t.Fatal("Failed to get solarized theme")
}
- // Check that brandBlue reference was resolved
- primary := example.Primary()
+ // Check that color references were resolved
+ primary := solarized.Primary()
if primary.Dark == nil || primary.Light == nil {
- t.Error("Primary color (brandBlue reference) not resolved")
+ t.Error("Primary color reference not resolved")
}
- // Check that nested reference (borderActive -> primary -> brandBlue) works
- borderActive := example.BorderActive()
- if borderActive.Dark == nil || borderActive.Light == nil {
- t.Error("BorderActive color (nested reference) not resolved")
+ // Check that all colors are properly resolved
+ text := solarized.Text()
+ if text.Dark == nil || text.Light == nil {
+ t.Error("Text color reference not resolved")
}
}
diff --git a/packages/tui/internal/theme/themes/dracula.json b/packages/tui/internal/theme/themes/dracula.json
new file mode 100644
index 000000000..d57692fbb
--- /dev/null
+++ b/packages/tui/internal/theme/themes/dracula.json
@@ -0,0 +1,219 @@
+{
+ "$schema": "https://opencode.ai/theme.json",
+ "defs": {
+ "background": "#282a36",
+ "currentLine": "#44475a",
+ "selection": "#44475a",
+ "foreground": "#f8f8f2",
+ "comment": "#6272a4",
+ "cyan": "#8be9fd",
+ "green": "#50fa7b",
+ "orange": "#ffb86c",
+ "pink": "#ff79c6",
+ "purple": "#bd93f9",
+ "red": "#ff5555",
+ "yellow": "#f1fa8c"
+ },
+ "theme": {
+ "primary": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "secondary": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "accent": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "error": {
+ "dark": "red",
+ "light": "red"
+ },
+ "warning": {
+ "dark": "yellow",
+ "light": "yellow"
+ },
+ "success": {
+ "dark": "green",
+ "light": "green"
+ },
+ "info": {
+ "dark": "orange",
+ "light": "orange"
+ },
+ "text": {
+ "dark": "foreground",
+ "light": "#282a36"
+ },
+ "textMuted": {
+ "dark": "comment",
+ "light": "#6272a4"
+ },
+ "background": {
+ "dark": "#282a36",
+ "light": "#f8f8f2"
+ },
+ "backgroundPanel": {
+ "dark": "#21222c",
+ "light": "#e8e8e2"
+ },
+ "backgroundElement": {
+ "dark": "currentLine",
+ "light": "#d8d8d2"
+ },
+ "border": {
+ "dark": "currentLine",
+ "light": "#c8c8c2"
+ },
+ "borderActive": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "borderSubtle": {
+ "dark": "#191a21",
+ "light": "#e0e0e0"
+ },
+ "diffAdded": {
+ "dark": "green",
+ "light": "green"
+ },
+ "diffRemoved": {
+ "dark": "red",
+ "light": "red"
+ },
+ "diffContext": {
+ "dark": "comment",
+ "light": "#6272a4"
+ },
+ "diffHunkHeader": {
+ "dark": "comment",
+ "light": "#6272a4"
+ },
+ "diffHighlightAdded": {
+ "dark": "green",
+ "light": "green"
+ },
+ "diffHighlightRemoved": {
+ "dark": "red",
+ "light": "red"
+ },
+ "diffAddedBg": {
+ "dark": "#1a3a1a",
+ "light": "#e0ffe0"
+ },
+ "diffRemovedBg": {
+ "dark": "#3a1a1a",
+ "light": "#ffe0e0"
+ },
+ "diffContextBg": {
+ "dark": "#21222c",
+ "light": "#e8e8e2"
+ },
+ "diffLineNumber": {
+ "dark": "currentLine",
+ "light": "#c8c8c2"
+ },
+ "diffAddedLineNumberBg": {
+ "dark": "#1a3a1a",
+ "light": "#e0ffe0"
+ },
+ "diffRemovedLineNumberBg": {
+ "dark": "#3a1a1a",
+ "light": "#ffe0e0"
+ },
+ "markdownText": {
+ "dark": "foreground",
+ "light": "#282a36"
+ },
+ "markdownHeading": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "markdownLink": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "markdownLinkText": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "markdownCode": {
+ "dark": "green",
+ "light": "green"
+ },
+ "markdownBlockQuote": {
+ "dark": "comment",
+ "light": "#6272a4"
+ },
+ "markdownEmph": {
+ "dark": "yellow",
+ "light": "yellow"
+ },
+ "markdownStrong": {
+ "dark": "orange",
+ "light": "orange"
+ },
+ "markdownHorizontalRule": {
+ "dark": "comment",
+ "light": "#6272a4"
+ },
+ "markdownListItem": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "markdownListEnumeration": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "markdownImage": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "markdownImageText": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "markdownCodeBlock": {
+ "dark": "foreground",
+ "light": "#282a36"
+ },
+ "syntaxComment": {
+ "dark": "comment",
+ "light": "#6272a4"
+ },
+ "syntaxKeyword": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "syntaxFunction": {
+ "dark": "green",
+ "light": "green"
+ },
+ "syntaxVariable": {
+ "dark": "foreground",
+ "light": "#282a36"
+ },
+ "syntaxString": {
+ "dark": "yellow",
+ "light": "yellow"
+ },
+ "syntaxNumber": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "syntaxType": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "syntaxOperator": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "syntaxPunctuation": {
+ "dark": "foreground",
+ "light": "#282a36"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/tui/internal/theme/themes/github.json b/packages/tui/internal/theme/themes/github.json
new file mode 100644
index 000000000..b27080101
--- /dev/null
+++ b/packages/tui/internal/theme/themes/github.json
@@ -0,0 +1,233 @@
+{
+ "$schema": "https://opencode.ai/theme.json",
+ "defs": {
+ "darkBg": "#0d1117",
+ "darkBgAlt": "#010409",
+ "darkBgPanel": "#161b22",
+ "darkFg": "#c9d1d9",
+ "darkFgMuted": "#8b949e",
+ "darkBlue": "#58a6ff",
+ "darkGreen": "#3fb950",
+ "darkRed": "#f85149",
+ "darkOrange": "#d29922",
+ "darkPurple": "#bc8cff",
+ "darkPink": "#ff7b72",
+ "darkYellow": "#e3b341",
+ "darkCyan": "#39c5cf",
+ "lightBg": "#ffffff",
+ "lightBgAlt": "#f6f8fa",
+ "lightBgPanel": "#f0f3f6",
+ "lightFg": "#24292f",
+ "lightFgMuted": "#57606a",
+ "lightBlue": "#0969da",
+ "lightGreen": "#1a7f37",
+ "lightRed": "#cf222e",
+ "lightOrange": "#bc4c00",
+ "lightPurple": "#8250df",
+ "lightPink": "#bf3989",
+ "lightYellow": "#9a6700",
+ "lightCyan": "#1b7c83"
+ },
+ "theme": {
+ "primary": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "secondary": {
+ "dark": "darkPurple",
+ "light": "lightPurple"
+ },
+ "accent": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "error": {
+ "dark": "darkRed",
+ "light": "lightRed"
+ },
+ "warning": {
+ "dark": "darkYellow",
+ "light": "lightYellow"
+ },
+ "success": {
+ "dark": "darkGreen",
+ "light": "lightGreen"
+ },
+ "info": {
+ "dark": "darkOrange",
+ "light": "lightOrange"
+ },
+ "text": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ },
+ "textMuted": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "background": {
+ "dark": "darkBg",
+ "light": "lightBg"
+ },
+ "backgroundPanel": {
+ "dark": "darkBgAlt",
+ "light": "lightBgAlt"
+ },
+ "backgroundElement": {
+ "dark": "darkBgPanel",
+ "light": "lightBgPanel"
+ },
+ "border": {
+ "dark": "#30363d",
+ "light": "#d0d7de"
+ },
+ "borderActive": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "borderSubtle": {
+ "dark": "#21262d",
+ "light": "#d8dee4"
+ },
+ "diffAdded": {
+ "dark": "darkGreen",
+ "light": "lightGreen"
+ },
+ "diffRemoved": {
+ "dark": "darkRed",
+ "light": "lightRed"
+ },
+ "diffContext": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "diffHunkHeader": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "diffHighlightAdded": {
+ "dark": "#3fb950",
+ "light": "#1a7f37"
+ },
+ "diffHighlightRemoved": {
+ "dark": "#f85149",
+ "light": "#cf222e"
+ },
+ "diffAddedBg": {
+ "dark": "#033a16",
+ "light": "#dafbe1"
+ },
+ "diffRemovedBg": {
+ "dark": "#67060c",
+ "light": "#ffebe9"
+ },
+ "diffContextBg": {
+ "dark": "darkBgAlt",
+ "light": "lightBgAlt"
+ },
+ "diffLineNumber": {
+ "dark": "#484f58",
+ "light": "#afb8c1"
+ },
+ "diffAddedLineNumberBg": {
+ "dark": "#033a16",
+ "light": "#dafbe1"
+ },
+ "diffRemovedLineNumberBg": {
+ "dark": "#67060c",
+ "light": "#ffebe9"
+ },
+ "markdownText": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ },
+ "markdownHeading": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "markdownLink": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "markdownLinkText": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "markdownCode": {
+ "dark": "darkPink",
+ "light": "lightPink"
+ },
+ "markdownBlockQuote": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "markdownEmph": {
+ "dark": "darkYellow",
+ "light": "lightYellow"
+ },
+ "markdownStrong": {
+ "dark": "darkOrange",
+ "light": "lightOrange"
+ },
+ "markdownHorizontalRule": {
+ "dark": "#30363d",
+ "light": "#d0d7de"
+ },
+ "markdownListItem": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "markdownListEnumeration": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "markdownImage": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "markdownImageText": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "markdownCodeBlock": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ },
+ "syntaxComment": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "syntaxKeyword": {
+ "dark": "darkPink",
+ "light": "lightRed"
+ },
+ "syntaxFunction": {
+ "dark": "darkPurple",
+ "light": "lightPurple"
+ },
+ "syntaxVariable": {
+ "dark": "darkOrange",
+ "light": "lightOrange"
+ },
+ "syntaxString": {
+ "dark": "darkCyan",
+ "light": "lightBlue"
+ },
+ "syntaxNumber": {
+ "dark": "darkBlue",
+ "light": "lightCyan"
+ },
+ "syntaxType": {
+ "dark": "darkOrange",
+ "light": "lightOrange"
+ },
+ "syntaxOperator": {
+ "dark": "darkPink",
+ "light": "lightRed"
+ },
+ "syntaxPunctuation": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/tui/internal/theme/themes/material.json b/packages/tui/internal/theme/themes/material.json
new file mode 100644
index 000000000..bdb10a7f1
--- /dev/null
+++ b/packages/tui/internal/theme/themes/material.json
@@ -0,0 +1,235 @@
+{
+ "$schema": "https://opencode.ai/theme.json",
+ "defs": {
+ "darkBg": "#263238",
+ "darkBgAlt": "#1e272c",
+ "darkBgPanel": "#37474f",
+ "darkFg": "#eeffff",
+ "darkFgMuted": "#546e7a",
+ "darkRed": "#f07178",
+ "darkPink": "#f78c6c",
+ "darkOrange": "#ffcb6b",
+ "darkYellow": "#ffcb6b",
+ "darkGreen": "#c3e88d",
+ "darkCyan": "#89ddff",
+ "darkBlue": "#82aaff",
+ "darkPurple": "#c792ea",
+ "darkViolet": "#bb80b3",
+ "lightBg": "#fafafa",
+ "lightBgAlt": "#f5f5f5",
+ "lightBgPanel": "#e7e7e8",
+ "lightFg": "#263238",
+ "lightFgMuted": "#90a4ae",
+ "lightRed": "#e53935",
+ "lightPink": "#ec407a",
+ "lightOrange": "#f4511e",
+ "lightYellow": "#ffb300",
+ "lightGreen": "#91b859",
+ "lightCyan": "#39adb5",
+ "lightBlue": "#6182b8",
+ "lightPurple": "#7c4dff",
+ "lightViolet": "#945eb8"
+ },
+ "theme": {
+ "primary": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "secondary": {
+ "dark": "darkPurple",
+ "light": "lightPurple"
+ },
+ "accent": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "error": {
+ "dark": "darkRed",
+ "light": "lightRed"
+ },
+ "warning": {
+ "dark": "darkYellow",
+ "light": "lightYellow"
+ },
+ "success": {
+ "dark": "darkGreen",
+ "light": "lightGreen"
+ },
+ "info": {
+ "dark": "darkOrange",
+ "light": "lightOrange"
+ },
+ "text": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ },
+ "textMuted": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "background": {
+ "dark": "darkBg",
+ "light": "lightBg"
+ },
+ "backgroundPanel": {
+ "dark": "darkBgAlt",
+ "light": "lightBgAlt"
+ },
+ "backgroundElement": {
+ "dark": "darkBgPanel",
+ "light": "lightBgPanel"
+ },
+ "border": {
+ "dark": "#37474f",
+ "light": "#e0e0e0"
+ },
+ "borderActive": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "borderSubtle": {
+ "dark": "#1e272c",
+ "light": "#eeeeee"
+ },
+ "diffAdded": {
+ "dark": "darkGreen",
+ "light": "lightGreen"
+ },
+ "diffRemoved": {
+ "dark": "darkRed",
+ "light": "lightRed"
+ },
+ "diffContext": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "diffHunkHeader": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "diffHighlightAdded": {
+ "dark": "darkGreen",
+ "light": "lightGreen"
+ },
+ "diffHighlightRemoved": {
+ "dark": "darkRed",
+ "light": "lightRed"
+ },
+ "diffAddedBg": {
+ "dark": "#2e3c2b",
+ "light": "#e8f5e9"
+ },
+ "diffRemovedBg": {
+ "dark": "#3c2b2b",
+ "light": "#ffebee"
+ },
+ "diffContextBg": {
+ "dark": "darkBgAlt",
+ "light": "lightBgAlt"
+ },
+ "diffLineNumber": {
+ "dark": "#37474f",
+ "light": "#cfd8dc"
+ },
+ "diffAddedLineNumberBg": {
+ "dark": "#2e3c2b",
+ "light": "#e8f5e9"
+ },
+ "diffRemovedLineNumberBg": {
+ "dark": "#3c2b2b",
+ "light": "#ffebee"
+ },
+ "markdownText": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ },
+ "markdownHeading": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "markdownLink": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "markdownLinkText": {
+ "dark": "darkPurple",
+ "light": "lightPurple"
+ },
+ "markdownCode": {
+ "dark": "darkGreen",
+ "light": "lightGreen"
+ },
+ "markdownBlockQuote": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "markdownEmph": {
+ "dark": "darkYellow",
+ "light": "lightYellow"
+ },
+ "markdownStrong": {
+ "dark": "darkOrange",
+ "light": "lightOrange"
+ },
+ "markdownHorizontalRule": {
+ "dark": "#37474f",
+ "light": "#e0e0e0"
+ },
+ "markdownListItem": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "markdownListEnumeration": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "markdownImage": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "markdownImageText": {
+ "dark": "darkPurple",
+ "light": "lightPurple"
+ },
+ "markdownCodeBlock": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ },
+ "syntaxComment": {
+ "dark": "darkFgMuted",
+ "light": "lightFgMuted"
+ },
+ "syntaxKeyword": {
+ "dark": "darkPurple",
+ "light": "lightPurple"
+ },
+ "syntaxFunction": {
+ "dark": "darkBlue",
+ "light": "lightBlue"
+ },
+ "syntaxVariable": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ },
+ "syntaxString": {
+ "dark": "darkGreen",
+ "light": "lightGreen"
+ },
+ "syntaxNumber": {
+ "dark": "darkOrange",
+ "light": "lightOrange"
+ },
+ "syntaxType": {
+ "dark": "darkYellow",
+ "light": "lightYellow"
+ },
+ "syntaxOperator": {
+ "dark": "darkCyan",
+ "light": "lightCyan"
+ },
+ "syntaxPunctuation": {
+ "dark": "darkFg",
+ "light": "lightFg"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/tui/internal/theme/themes/monokai.json b/packages/tui/internal/theme/themes/monokai.json
new file mode 100644
index 000000000..39a5385e9
--- /dev/null
+++ b/packages/tui/internal/theme/themes/monokai.json
@@ -0,0 +1,221 @@
+{
+ "$schema": "https://opencode.ai/theme.json",
+ "defs": {
+ "background": "#272822",
+ "backgroundAlt": "#1e1f1c",
+ "backgroundPanel": "#3e3d32",
+ "foreground": "#f8f8f2",
+ "comment": "#75715e",
+ "red": "#f92672",
+ "orange": "#fd971f",
+ "lightOrange": "#e69f66",
+ "yellow": "#e6db74",
+ "green": "#a6e22e",
+ "cyan": "#66d9ef",
+ "blue": "#66d9ef",
+ "purple": "#ae81ff",
+ "pink": "#f92672"
+ },
+ "theme": {
+ "primary": {
+ "dark": "cyan",
+ "light": "blue"
+ },
+ "secondary": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "accent": {
+ "dark": "green",
+ "light": "green"
+ },
+ "error": {
+ "dark": "red",
+ "light": "red"
+ },
+ "warning": {
+ "dark": "yellow",
+ "light": "orange"
+ },
+ "success": {
+ "dark": "green",
+ "light": "green"
+ },
+ "info": {
+ "dark": "orange",
+ "light": "orange"
+ },
+ "text": {
+ "dark": "foreground",
+ "light": "#272822"
+ },
+ "textMuted": {
+ "dark": "comment",
+ "light": "#75715e"
+ },
+ "background": {
+ "dark": "#272822",
+ "light": "#fafafa"
+ },
+ "backgroundPanel": {
+ "dark": "#1e1f1c",
+ "light": "#f0f0f0"
+ },
+ "backgroundElement": {
+ "dark": "#3e3d32",
+ "light": "#e0e0e0"
+ },
+ "border": {
+ "dark": "#3e3d32",
+ "light": "#d0d0d0"
+ },
+ "borderActive": {
+ "dark": "cyan",
+ "light": "blue"
+ },
+ "borderSubtle": {
+ "dark": "#1e1f1c",
+ "light": "#e8e8e8"
+ },
+ "diffAdded": {
+ "dark": "green",
+ "light": "green"
+ },
+ "diffRemoved": {
+ "dark": "red",
+ "light": "red"
+ },
+ "diffContext": {
+ "dark": "comment",
+ "light": "#75715e"
+ },
+ "diffHunkHeader": {
+ "dark": "comment",
+ "light": "#75715e"
+ },
+ "diffHighlightAdded": {
+ "dark": "green",
+ "light": "green"
+ },
+ "diffHighlightRemoved": {
+ "dark": "red",
+ "light": "red"
+ },
+ "diffAddedBg": {
+ "dark": "#1a3a1a",
+ "light": "#e0ffe0"
+ },
+ "diffRemovedBg": {
+ "dark": "#3a1a1a",
+ "light": "#ffe0e0"
+ },
+ "diffContextBg": {
+ "dark": "#1e1f1c",
+ "light": "#f0f0f0"
+ },
+ "diffLineNumber": {
+ "dark": "#3e3d32",
+ "light": "#d0d0d0"
+ },
+ "diffAddedLineNumberBg": {
+ "dark": "#1a3a1a",
+ "light": "#e0ffe0"
+ },
+ "diffRemovedLineNumberBg": {
+ "dark": "#3a1a1a",
+ "light": "#ffe0e0"
+ },
+ "markdownText": {
+ "dark": "foreground",
+ "light": "#272822"
+ },
+ "markdownHeading": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "markdownLink": {
+ "dark": "cyan",
+ "light": "blue"
+ },
+ "markdownLinkText": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "markdownCode": {
+ "dark": "green",
+ "light": "green"
+ },
+ "markdownBlockQuote": {
+ "dark": "comment",
+ "light": "#75715e"
+ },
+ "markdownEmph": {
+ "dark": "yellow",
+ "light": "orange"
+ },
+ "markdownStrong": {
+ "dark": "orange",
+ "light": "orange"
+ },
+ "markdownHorizontalRule": {
+ "dark": "comment",
+ "light": "#75715e"
+ },
+ "markdownListItem": {
+ "dark": "cyan",
+ "light": "blue"
+ },
+ "markdownListEnumeration": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "markdownImage": {
+ "dark": "cyan",
+ "light": "blue"
+ },
+ "markdownImageText": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "markdownCodeBlock": {
+ "dark": "foreground",
+ "light": "#272822"
+ },
+ "syntaxComment": {
+ "dark": "comment",
+ "light": "#75715e"
+ },
+ "syntaxKeyword": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "syntaxFunction": {
+ "dark": "green",
+ "light": "green"
+ },
+ "syntaxVariable": {
+ "dark": "foreground",
+ "light": "#272822"
+ },
+ "syntaxString": {
+ "dark": "yellow",
+ "light": "orange"
+ },
+ "syntaxNumber": {
+ "dark": "purple",
+ "light": "purple"
+ },
+ "syntaxType": {
+ "dark": "cyan",
+ "light": "blue"
+ },
+ "syntaxOperator": {
+ "dark": "pink",
+ "light": "pink"
+ },
+ "syntaxPunctuation": {
+ "dark": "foreground",
+ "light": "#272822"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/tui/internal/theme/themes/solarized.json b/packages/tui/internal/theme/themes/solarized.json
new file mode 100644
index 000000000..2a8a3698c
--- /dev/null
+++ b/packages/tui/internal/theme/themes/solarized.json
@@ -0,0 +1,223 @@
+{
+ "$schema": "https://opencode.ai/theme.json",
+ "defs": {
+ "base03": "#002b36",
+ "base02": "#073642",
+ "base01": "#586e75",
+ "base00": "#657b83",
+ "base0": "#839496",
+ "base1": "#93a1a1",
+ "base2": "#eee8d5",
+ "base3": "#fdf6e3",
+ "yellow": "#b58900",
+ "orange": "#cb4b16",
+ "red": "#dc322f",
+ "magenta": "#d33682",
+ "violet": "#6c71c4",
+ "blue": "#268bd2",
+ "cyan": "#2aa198",
+ "green": "#859900"
+ },
+ "theme": {
+ "primary": {
+ "dark": "blue",
+ "light": "blue"
+ },
+ "secondary": {
+ "dark": "violet",
+ "light": "violet"
+ },
+ "accent": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "error": {
+ "dark": "red",
+ "light": "red"
+ },
+ "warning": {
+ "dark": "yellow",
+ "light": "yellow"
+ },
+ "success": {
+ "dark": "green",
+ "light": "green"
+ },
+ "info": {
+ "dark": "orange",
+ "light": "orange"
+ },
+ "text": {
+ "dark": "base0",
+ "light": "base00"
+ },
+ "textMuted": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "background": {
+ "dark": "base03",
+ "light": "base3"
+ },
+ "backgroundPanel": {
+ "dark": "base02",
+ "light": "base2"
+ },
+ "backgroundElement": {
+ "dark": "#073642",
+ "light": "#eee8d5"
+ },
+ "border": {
+ "dark": "base02",
+ "light": "base2"
+ },
+ "borderActive": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "borderSubtle": {
+ "dark": "#073642",
+ "light": "#eee8d5"
+ },
+ "diffAdded": {
+ "dark": "green",
+ "light": "green"
+ },
+ "diffRemoved": {
+ "dark": "red",
+ "light": "red"
+ },
+ "diffContext": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "diffHunkHeader": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "diffHighlightAdded": {
+ "dark": "green",
+ "light": "green"
+ },
+ "diffHighlightRemoved": {
+ "dark": "red",
+ "light": "red"
+ },
+ "diffAddedBg": {
+ "dark": "#073642",
+ "light": "#eee8d5"
+ },
+ "diffRemovedBg": {
+ "dark": "#073642",
+ "light": "#eee8d5"
+ },
+ "diffContextBg": {
+ "dark": "base02",
+ "light": "base2"
+ },
+ "diffLineNumber": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "diffAddedLineNumberBg": {
+ "dark": "#073642",
+ "light": "#eee8d5"
+ },
+ "diffRemovedLineNumberBg": {
+ "dark": "#073642",
+ "light": "#eee8d5"
+ },
+ "markdownText": {
+ "dark": "base0",
+ "light": "base00"
+ },
+ "markdownHeading": {
+ "dark": "blue",
+ "light": "blue"
+ },
+ "markdownLink": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "markdownLinkText": {
+ "dark": "violet",
+ "light": "violet"
+ },
+ "markdownCode": {
+ "dark": "green",
+ "light": "green"
+ },
+ "markdownBlockQuote": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "markdownEmph": {
+ "dark": "yellow",
+ "light": "yellow"
+ },
+ "markdownStrong": {
+ "dark": "orange",
+ "light": "orange"
+ },
+ "markdownHorizontalRule": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "markdownListItem": {
+ "dark": "blue",
+ "light": "blue"
+ },
+ "markdownListEnumeration": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "markdownImage": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "markdownImageText": {
+ "dark": "violet",
+ "light": "violet"
+ },
+ "markdownCodeBlock": {
+ "dark": "base0",
+ "light": "base00"
+ },
+ "syntaxComment": {
+ "dark": "base01",
+ "light": "base1"
+ },
+ "syntaxKeyword": {
+ "dark": "green",
+ "light": "green"
+ },
+ "syntaxFunction": {
+ "dark": "blue",
+ "light": "blue"
+ },
+ "syntaxVariable": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "syntaxString": {
+ "dark": "cyan",
+ "light": "cyan"
+ },
+ "syntaxNumber": {
+ "dark": "magenta",
+ "light": "magenta"
+ },
+ "syntaxType": {
+ "dark": "yellow",
+ "light": "yellow"
+ },
+ "syntaxOperator": {
+ "dark": "green",
+ "light": "green"
+ },
+ "syntaxPunctuation": {
+ "dark": "base0",
+ "light": "base00"
+ }
+ }
+} \ No newline at end of file