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 // TODO: change these colors to be what we want
66 theme.DiffHighlightAddedColor = lipgloss.Color("#256125")
67 theme.DiffHighlightRemovedColor = lipgloss.Color("#612726")
68 theme.DiffAddedBgColor = lipgloss.Color("#303A30")
69 theme.DiffRemovedBgColor = lipgloss.Color("#3A3030")
70 theme.DiffContextBgColor = lipgloss.Color(darkBackground)
71 theme.DiffLineNumberColor = lipgloss.Color("#888888")
72 theme.DiffAddedLineNumberBgColor = lipgloss.Color("#293229")
73 theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#332929")
74
75 // Markdown colors
76 theme.MarkdownTextColor = lipgloss.Color(darkForeground)
77 theme.MarkdownHeadingColor = lipgloss.Color(darkSecondary)
78 theme.MarkdownLinkColor = lipgloss.Color(darkPrimary)
79 theme.MarkdownLinkTextColor = lipgloss.Color(darkCyan)
80 theme.MarkdownCodeColor = lipgloss.Color(darkGreen)
81 theme.MarkdownBlockQuoteColor = lipgloss.Color(darkYellow)
82 theme.MarkdownEmphColor = lipgloss.Color(darkYellow)
83 theme.MarkdownStrongColor = lipgloss.Color(darkAccent)
84 theme.MarkdownHorizontalRuleColor = lipgloss.Color(darkComment)
85 theme.MarkdownListItemColor = lipgloss.Color(darkPrimary)
86 theme.MarkdownListEnumerationColor = lipgloss.Color(darkCyan)
87 theme.MarkdownImageColor = lipgloss.Color(darkPrimary)
88 theme.MarkdownImageTextColor = lipgloss.Color(darkCyan)
89 theme.MarkdownCodeBlockColor = lipgloss.Color(darkForeground)
90
91 // Syntax highlighting colors
92 theme.SyntaxCommentColor = lipgloss.Color(darkComment)
93 theme.SyntaxKeywordColor = lipgloss.Color(darkSecondary)
94 theme.SyntaxFunctionColor = lipgloss.Color(darkPrimary)
95 theme.SyntaxVariableColor = lipgloss.Color(darkRed)
96 theme.SyntaxStringColor = lipgloss.Color(darkGreen)
97 theme.SyntaxNumberColor = lipgloss.Color(darkAccent)
98 theme.SyntaxTypeColor = lipgloss.Color(darkYellow)
99 theme.SyntaxOperatorColor = lipgloss.Color(darkCyan)
100 theme.SyntaxPunctuationColor = lipgloss.Color(darkForeground)
101
102 return theme
103}
104
105// NewOpenCodeLightTheme creates a new instance of the OpenCode Light theme.
106func NewOpenCodeLightTheme() *OpenCodeTheme {
107 // Light mode colors
108 lightBackground := "#f8f8f8"
109 lightCurrentLine := "#f0f0f0"
110 lightSelection := "#e5e5e6"
111 lightForeground := "#2a2a2a"
112 lightComment := "#8a8a8a"
113 lightPrimary := "#3b7dd8" // Primary blue
114 lightSecondary := "#7b5bb6" // Secondary purple
115 lightAccent := "#d68c27" // Accent orange/gold
116 lightRed := "#d1383d" // Error red
117 lightOrange := "#d68c27" // Warning orange
118 lightGreen := "#3d9a57" // Success green
119 lightCyan := "#318795" // Info cyan
120 lightYellow := "#b0851f" // Emphasized text
121 lightBorder := "#d3d3d3" // Border color
122
123 theme := &OpenCodeTheme{}
124
125 // Base colors
126 theme.PrimaryColor = lipgloss.Color(lightPrimary)
127 theme.SecondaryColor = lipgloss.Color(lightSecondary)
128 theme.AccentColor = lipgloss.Color(lightAccent)
129
130 // Status colors
131 theme.ErrorColor = lipgloss.Color(lightRed)
132 theme.WarningColor = lipgloss.Color(lightOrange)
133 theme.SuccessColor = lipgloss.Color(lightGreen)
134 theme.InfoColor = lipgloss.Color(lightCyan)
135
136 // Text colors
137 theme.TextColor = lipgloss.Color(lightForeground)
138 theme.TextMutedColor = lipgloss.Color(lightComment)
139 theme.TextEmphasizedColor = lipgloss.Color(lightYellow)
140
141 // Background colors
142 theme.BackgroundColor = lipgloss.Color(lightBackground)
143 theme.BackgroundSecondaryColor = lipgloss.Color(lightCurrentLine)
144 theme.BackgroundDarkerColor = lipgloss.Color("#ffffff") // Slightly lighter than background
145
146 // Border colors
147 theme.BorderNormalColor = lipgloss.Color(lightBorder)
148 theme.BorderFocusedColor = lipgloss.Color(lightPrimary)
149 theme.BorderDimColor = lipgloss.Color(lightSelection)
150
151 // Diff view colors
152 theme.DiffAddedColor = lipgloss.Color("#2E7D32")
153 theme.DiffRemovedColor = lipgloss.Color("#C62828")
154 theme.DiffContextColor = lipgloss.Color("#757575")
155 theme.DiffHunkHeaderColor = lipgloss.Color("#757575")
156 theme.DiffHighlightAddedColor = lipgloss.Color("#A5D6A7")
157 theme.DiffHighlightRemovedColor = lipgloss.Color("#EF9A9A")
158 theme.DiffAddedBgColor = lipgloss.Color("#E8F5E9")
159 theme.DiffRemovedBgColor = lipgloss.Color("#FFEBEE")
160 theme.DiffContextBgColor = lipgloss.Color(lightBackground)
161 theme.DiffLineNumberColor = lipgloss.Color("#9E9E9E")
162 theme.DiffAddedLineNumberBgColor = lipgloss.Color("#C8E6C9")
163 theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#FFCDD2")
164
165 // Markdown colors
166 theme.MarkdownTextColor = lipgloss.Color(lightForeground)
167 theme.MarkdownHeadingColor = lipgloss.Color(lightSecondary)
168 theme.MarkdownLinkColor = lipgloss.Color(lightPrimary)
169 theme.MarkdownLinkTextColor = lipgloss.Color(lightCyan)
170 theme.MarkdownCodeColor = lipgloss.Color(lightGreen)
171 theme.MarkdownBlockQuoteColor = lipgloss.Color(lightYellow)
172 theme.MarkdownEmphColor = lipgloss.Color(lightYellow)
173 theme.MarkdownStrongColor = lipgloss.Color(lightAccent)
174 theme.MarkdownHorizontalRuleColor = lipgloss.Color(lightComment)
175 theme.MarkdownListItemColor = lipgloss.Color(lightPrimary)
176 theme.MarkdownListEnumerationColor = lipgloss.Color(lightCyan)
177 theme.MarkdownImageColor = lipgloss.Color(lightPrimary)
178 theme.MarkdownImageTextColor = lipgloss.Color(lightCyan)
179 theme.MarkdownCodeBlockColor = lipgloss.Color(lightForeground)
180
181 // Syntax highlighting colors
182 theme.SyntaxCommentColor = lipgloss.Color(lightComment)
183 theme.SyntaxKeywordColor = lipgloss.Color(lightSecondary)
184 theme.SyntaxFunctionColor = lipgloss.Color(lightPrimary)
185 theme.SyntaxVariableColor = lipgloss.Color(lightRed)
186 theme.SyntaxStringColor = lipgloss.Color(lightGreen)
187 theme.SyntaxNumberColor = lipgloss.Color(lightAccent)
188 theme.SyntaxTypeColor = lipgloss.Color(lightYellow)
189 theme.SyntaxOperatorColor = lipgloss.Color(lightCyan)
190 theme.SyntaxPunctuationColor = lipgloss.Color(lightForeground)
191
192 return theme
193}
194
195func init() {
196 // Register the OpenCode themes with the theme manager
197 RegisterTheme("opencode-dark", NewOpenCodeDarkTheme())
198 RegisterTheme("opencode-light", NewOpenCodeLightTheme())
199}