diff options
| -rw-r--r-- | internal/theme/theme.go | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/internal/theme/theme.go b/internal/theme/theme.go index cddcaa4..10d6828 100644 --- a/internal/theme/theme.go +++ b/internal/theme/theme.go @@ -11,9 +11,9 @@ import ( // OpenCodeTheme represents an OpenCode-compatible theme JSON structure type OpenCodeTheme struct { - Schema string `json:"$schema"` - Defs map[string]string `json:"defs"` - Theme map[string]OpenCodeThemeMode `json:"theme"` + Schema string `json:"$schema"` + Defs map[string]string `json:"defs"` + Theme map[string]json.RawMessage `json:"theme"` // Can be string or object } // OpenCodeThemeMode represents dark/light mode values for a theme property @@ -66,14 +66,28 @@ func LoadTheme(themeURL string) (*ResolvedTheme, error) { Light: make(map[string]string), } - for key, mode := range ocTheme.Theme { - // Resolve dark mode color - darkColor := resolveColor(mode.Dark, ocTheme.Defs) - resolved.Dark[key] = darkColor + for key, rawValue := range ocTheme.Theme { + // Try to parse as object first (light/dark mode) + var mode OpenCodeThemeMode + if err := json.Unmarshal(rawValue, &mode); err == nil && (mode.Dark != "" || mode.Light != "") { + // It's an object with dark/light properties + darkColor := resolveColor(mode.Dark, ocTheme.Defs) + resolved.Dark[key] = darkColor - // Resolve light mode color - lightColor := resolveColor(mode.Light, ocTheme.Defs) - resolved.Light[key] = lightColor + lightColor := resolveColor(mode.Light, ocTheme.Defs) + resolved.Light[key] = lightColor + } else { + // It's a simple string (dark-only theme) + var colorRef string + if err := json.Unmarshal(rawValue, &colorRef); err != nil { + continue // Skip invalid values + } + + // Use the same color for both light and dark + color := resolveColor(colorRef, ocTheme.Defs) + resolved.Dark[key] = color + resolved.Light[key] = color + } } return resolved, nil |