opencode.go

  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}