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	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}