1package theme
2
3import (
4 "github.com/charmbracelet/lipgloss/v2"
5)
6
7// OpenCodeTheme implements the Theme interface with OpenCode brand colors.
8// It provides both dark and light variants.
9type OpenCodeTheme struct {
10 BaseTheme
11}
12
13// NewOpenCodeDarkTheme creates a new instance of the OpenCode Dark theme.
14func NewOpenCodeDarkTheme() *OpenCodeTheme {
15 // OpenCode color palette
16 // Dark mode colors
17 darkBackground := "#212121"
18 darkCurrentLine := "#252525"
19 darkSelection := "#303030"
20 darkForeground := "#e0e0e0"
21 darkComment := "#6a6a6a"
22 darkPrimary := "#fab283" // Primary orange/gold
23 darkSecondary := "#5c9cf5" // Secondary blue
24 darkAccent := "#9d7cd8" // Accent purple
25 darkRed := "#e06c75" // Error red
26 darkOrange := "#f5a742" // Warning orange
27 darkGreen := "#7fd88f" // Success green
28 darkCyan := "#56b6c2" // Info cyan
29 darkYellow := "#e5c07b" // Emphasized text
30 darkBorder := "#4b4c5c" // Border color
31
32 theme := &OpenCodeTheme{}
33
34 // Base colors
35 theme.PrimaryColor = lipgloss.Color(darkPrimary)
36 theme.SecondaryColor = lipgloss.Color(darkSecondary)
37 theme.AccentColor = lipgloss.Color(darkAccent)
38
39 // Status colors
40 theme.ErrorColor = lipgloss.Color(darkRed)
41 theme.WarningColor = lipgloss.Color(darkOrange)
42 theme.SuccessColor = lipgloss.Color(darkGreen)
43 theme.InfoColor = lipgloss.Color(darkCyan)
44
45 // Text colors
46 theme.TextColor = lipgloss.Color(darkForeground)
47 theme.TextMutedColor = lipgloss.Color(darkComment)
48 theme.TextEmphasizedColor = lipgloss.Color(darkYellow)
49
50 // Background colors
51 theme.BackgroundColor = lipgloss.Color(darkBackground)
52 theme.BackgroundSecondaryColor = lipgloss.Color(darkCurrentLine)
53 theme.BackgroundDarkerColor = lipgloss.Color("#121212") // Slightly darker than background
54
55 // Border colors
56 theme.BorderNormalColor = lipgloss.Color(darkBorder)
57 theme.BorderFocusedColor = lipgloss.Color(darkPrimary)
58 theme.BorderDimColor = lipgloss.Color(darkSelection)
59
60 // Diff view colors
61 theme.DiffAddedColor = lipgloss.Color("#478247")
62 theme.DiffRemovedColor = lipgloss.Color("#7C4444")
63 theme.DiffContextColor = lipgloss.Color("#a0a0a0")
64 theme.DiffHunkHeaderColor = lipgloss.Color("#a0a0a0")
65 theme.DiffHighlightAddedColor = lipgloss.Color("#DAFADA")
66 theme.DiffHighlightRemovedColor = lipgloss.Color("#FADADD")
67 theme.DiffAddedBgColor = lipgloss.Color("#303A30")
68 theme.DiffRemovedBgColor = lipgloss.Color("#3A3030")
69 theme.DiffContextBgColor = lipgloss.Color(darkBackground)
70 theme.DiffLineNumberColor = lipgloss.Color("#888888")
71 theme.DiffAddedLineNumberBgColor = lipgloss.Color("#293229")
72 theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#332929")
73
74 // Markdown colors
75 theme.MarkdownTextColor = lipgloss.Color(darkForeground)
76 theme.MarkdownHeadingColor = lipgloss.Color(darkSecondary)
77 theme.MarkdownLinkColor = lipgloss.Color(darkPrimary)
78 theme.MarkdownLinkTextColor = lipgloss.Color(darkCyan)
79 theme.MarkdownCodeColor = lipgloss.Color(darkGreen)
80 theme.MarkdownBlockQuoteColor = lipgloss.Color(darkYellow)
81 theme.MarkdownEmphColor = lipgloss.Color(darkYellow)
82 theme.MarkdownStrongColor = lipgloss.Color(darkAccent)
83 theme.MarkdownHorizontalRuleColor = lipgloss.Color(darkComment)
84 theme.MarkdownListItemColor = lipgloss.Color(darkPrimary)
85 theme.MarkdownListEnumerationColor = lipgloss.Color(darkCyan)
86 theme.MarkdownImageColor = lipgloss.Color(darkPrimary)
87 theme.MarkdownImageTextColor = lipgloss.Color(darkCyan)
88 theme.MarkdownCodeBlockColor = lipgloss.Color(darkForeground)
89
90 // Syntax highlighting colors
91 theme.SyntaxCommentColor = lipgloss.Color(darkComment)
92 theme.SyntaxKeywordColor = lipgloss.Color(darkSecondary)
93 theme.SyntaxFunctionColor = lipgloss.Color(darkPrimary)
94 theme.SyntaxVariableColor = lipgloss.Color(darkRed)
95 theme.SyntaxStringColor = lipgloss.Color(darkGreen)
96 theme.SyntaxNumberColor = lipgloss.Color(darkAccent)
97 theme.SyntaxTypeColor = lipgloss.Color(darkYellow)
98 theme.SyntaxOperatorColor = lipgloss.Color(darkCyan)
99 theme.SyntaxPunctuationColor = lipgloss.Color(darkForeground)
100
101 return theme
102}
103
104// NewOpenCodeLightTheme creates a new instance of the OpenCode Light theme.
105func NewOpenCodeLightTheme() *OpenCodeTheme {
106 // Light mode colors
107 lightBackground := "#f8f8f8"
108 lightCurrentLine := "#f0f0f0"
109 lightSelection := "#e5e5e6"
110 lightForeground := "#2a2a2a"
111 lightComment := "#8a8a8a"
112 lightPrimary := "#3b7dd8" // Primary blue
113 lightSecondary := "#7b5bb6" // Secondary purple
114 lightAccent := "#d68c27" // Accent orange/gold
115 lightRed := "#d1383d" // Error red
116 lightOrange := "#d68c27" // Warning orange
117 lightGreen := "#3d9a57" // Success green
118 lightCyan := "#318795" // Info cyan
119 lightYellow := "#b0851f" // Emphasized text
120 lightBorder := "#d3d3d3" // Border color
121
122 theme := &OpenCodeTheme{}
123
124 // Base colors
125 theme.PrimaryColor = lipgloss.Color(lightPrimary)
126 theme.SecondaryColor = lipgloss.Color(lightSecondary)
127 theme.AccentColor = lipgloss.Color(lightAccent)
128
129 // Status colors
130 theme.ErrorColor = lipgloss.Color(lightRed)
131 theme.WarningColor = lipgloss.Color(lightOrange)
132 theme.SuccessColor = lipgloss.Color(lightGreen)
133 theme.InfoColor = lipgloss.Color(lightCyan)
134
135 // Text colors
136 theme.TextColor = lipgloss.Color(lightForeground)
137 theme.TextMutedColor = lipgloss.Color(lightComment)
138 theme.TextEmphasizedColor = lipgloss.Color(lightYellow)
139
140 // Background colors
141 theme.BackgroundColor = lipgloss.Color(lightBackground)
142 theme.BackgroundSecondaryColor = lipgloss.Color(lightCurrentLine)
143 theme.BackgroundDarkerColor = lipgloss.Color("#ffffff") // Slightly lighter than background
144
145 // Border colors
146 theme.BorderNormalColor = lipgloss.Color(lightBorder)
147 theme.BorderFocusedColor = lipgloss.Color(lightPrimary)
148 theme.BorderDimColor = lipgloss.Color(lightSelection)
149
150 // Diff view colors
151 theme.DiffAddedColor = lipgloss.Color("#2E7D32")
152 theme.DiffRemovedColor = lipgloss.Color("#C62828")
153 theme.DiffContextColor = lipgloss.Color("#757575")
154 theme.DiffHunkHeaderColor = lipgloss.Color("#757575")
155 theme.DiffHighlightAddedColor = lipgloss.Color("#A5D6A7")
156 theme.DiffHighlightRemovedColor = lipgloss.Color("#EF9A9A")
157 theme.DiffAddedBgColor = lipgloss.Color("#E8F5E9")
158 theme.DiffRemovedBgColor = lipgloss.Color("#FFEBEE")
159 theme.DiffContextBgColor = lipgloss.Color(lightBackground)
160 theme.DiffLineNumberColor = lipgloss.Color("#9E9E9E")
161 theme.DiffAddedLineNumberBgColor = lipgloss.Color("#C8E6C9")
162 theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#FFCDD2")
163
164 // Markdown colors
165 theme.MarkdownTextColor = lipgloss.Color(lightForeground)
166 theme.MarkdownHeadingColor = lipgloss.Color(lightSecondary)
167 theme.MarkdownLinkColor = lipgloss.Color(lightPrimary)
168 theme.MarkdownLinkTextColor = lipgloss.Color(lightCyan)
169 theme.MarkdownCodeColor = lipgloss.Color(lightGreen)
170 theme.MarkdownBlockQuoteColor = lipgloss.Color(lightYellow)
171 theme.MarkdownEmphColor = lipgloss.Color(lightYellow)
172 theme.MarkdownStrongColor = lipgloss.Color(lightAccent)
173 theme.MarkdownHorizontalRuleColor = lipgloss.Color(lightComment)
174 theme.MarkdownListItemColor = lipgloss.Color(lightPrimary)
175 theme.MarkdownListEnumerationColor = lipgloss.Color(lightCyan)
176 theme.MarkdownImageColor = lipgloss.Color(lightPrimary)
177 theme.MarkdownImageTextColor = lipgloss.Color(lightCyan)
178 theme.MarkdownCodeBlockColor = lipgloss.Color(lightForeground)
179
180 // Syntax highlighting colors
181 theme.SyntaxCommentColor = lipgloss.Color(lightComment)
182 theme.SyntaxKeywordColor = lipgloss.Color(lightSecondary)
183 theme.SyntaxFunctionColor = lipgloss.Color(lightPrimary)
184 theme.SyntaxVariableColor = lipgloss.Color(lightRed)
185 theme.SyntaxStringColor = lipgloss.Color(lightGreen)
186 theme.SyntaxNumberColor = lipgloss.Color(lightAccent)
187 theme.SyntaxTypeColor = lipgloss.Color(lightYellow)
188 theme.SyntaxOperatorColor = lipgloss.Color(lightCyan)
189 theme.SyntaxPunctuationColor = lipgloss.Color(lightForeground)
190
191 return theme
192}
193
194func init() {
195 // Register the OpenCode themes with the theme manager
196 RegisterTheme("opencode-dark", NewOpenCodeDarkTheme())
197 RegisterTheme("opencode-light", NewOpenCodeLightTheme())
198}