1package theme
2
3import (
4 "github.com/charmbracelet/lipgloss/v2"
5)
6
7// OneDarkTheme implements the Theme interface with Atom's One Dark colors.
8// It provides both dark and light variants.
9type OneDarkTheme struct {
10 BaseTheme
11}
12
13// NewOneDarkTheme creates a new instance of the One Dark theme.
14func NewOneDarkTheme() *OneDarkTheme {
15 // One Dark color palette
16 // Dark mode colors from Atom One Dark
17 darkBackground := "#282c34"
18 darkCurrentLine := "#2c313c"
19 darkSelection := "#3e4451"
20 darkForeground := "#abb2bf"
21 darkComment := "#5c6370"
22 darkRed := "#e06c75"
23 darkOrange := "#d19a66"
24 darkYellow := "#e5c07b"
25 darkGreen := "#98c379"
26 darkCyan := "#56b6c2"
27 darkBlue := "#61afef"
28 darkPurple := "#c678dd"
29 darkBorder := "#3b4048"
30
31 theme := &OneDarkTheme{}
32
33 // Base colors
34 theme.PrimaryColor = lipgloss.Color(darkBlue)
35 theme.SecondaryColor = lipgloss.Color(darkPurple)
36 theme.AccentColor = lipgloss.Color(darkOrange)
37
38 // Status colors
39 theme.ErrorColor = lipgloss.Color(darkRed)
40 theme.WarningColor = lipgloss.Color(darkOrange)
41 theme.SuccessColor = lipgloss.Color(darkGreen)
42 theme.InfoColor = lipgloss.Color(darkBlue)
43
44 // Text colors
45 theme.TextColor = lipgloss.Color(darkForeground)
46 theme.TextMutedColor = lipgloss.Color(darkComment)
47 theme.TextEmphasizedColor = lipgloss.Color(darkYellow)
48
49 // Background colors
50 theme.BackgroundColor = lipgloss.Color(darkBackground)
51 theme.BackgroundSecondaryColor = lipgloss.Color(darkCurrentLine)
52 theme.BackgroundDarkerColor = lipgloss.Color("#21252b") // Slightly darker than background
53
54 // Border colors
55 theme.BorderNormalColor = lipgloss.Color(darkBorder)
56 theme.BorderFocusedColor = lipgloss.Color(darkBlue)
57 theme.BorderDimColor = lipgloss.Color(darkSelection)
58
59 // Diff view colors
60 theme.DiffAddedColor = lipgloss.Color("#478247")
61 theme.DiffRemovedColor = lipgloss.Color("#7C4444")
62 theme.DiffContextColor = lipgloss.Color("#a0a0a0")
63 theme.DiffHunkHeaderColor = lipgloss.Color("#a0a0a0")
64 theme.DiffHighlightAddedColor = lipgloss.Color("#DAFADA")
65 theme.DiffHighlightRemovedColor = lipgloss.Color("#FADADD")
66 theme.DiffAddedBgColor = lipgloss.Color("#303A30")
67 theme.DiffRemovedBgColor = lipgloss.Color("#3A3030")
68 theme.DiffContextBgColor = lipgloss.Color(darkBackground)
69 theme.DiffLineNumberColor = lipgloss.Color("#888888")
70 theme.DiffAddedLineNumberBgColor = lipgloss.Color("#293229")
71 theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#332929")
72
73 // Markdown colors
74 theme.MarkdownTextColor = lipgloss.Color(darkForeground)
75 theme.MarkdownHeadingColor = lipgloss.Color(darkPurple)
76 theme.MarkdownLinkColor = lipgloss.Color(darkBlue)
77 theme.MarkdownLinkTextColor = lipgloss.Color(darkCyan)
78 theme.MarkdownCodeColor = lipgloss.Color(darkGreen)
79 theme.MarkdownBlockQuoteColor = lipgloss.Color(darkYellow)
80 theme.MarkdownEmphColor = lipgloss.Color(darkYellow)
81 theme.MarkdownStrongColor = lipgloss.Color(darkOrange)
82 theme.MarkdownHorizontalRuleColor = lipgloss.Color(darkComment)
83 theme.MarkdownListItemColor = lipgloss.Color(darkBlue)
84 theme.MarkdownListEnumerationColor = lipgloss.Color(darkCyan)
85 theme.MarkdownImageColor = lipgloss.Color(darkBlue)
86 theme.MarkdownImageTextColor = lipgloss.Color(darkCyan)
87 theme.MarkdownCodeBlockColor = lipgloss.Color(darkForeground)
88
89 // Syntax highlighting colors
90 theme.SyntaxCommentColor = lipgloss.Color(darkComment)
91 theme.SyntaxKeywordColor = lipgloss.Color(darkPurple)
92 theme.SyntaxFunctionColor = lipgloss.Color(darkBlue)
93 theme.SyntaxVariableColor = lipgloss.Color(darkRed)
94 theme.SyntaxStringColor = lipgloss.Color(darkGreen)
95 theme.SyntaxNumberColor = lipgloss.Color(darkOrange)
96 theme.SyntaxTypeColor = lipgloss.Color(darkYellow)
97 theme.SyntaxOperatorColor = lipgloss.Color(darkCyan)
98 theme.SyntaxPunctuationColor = lipgloss.Color(darkForeground)
99
100 return theme
101}
102
103// NewOneLightTheme creates a new instance of the One Light theme.
104func NewOneLightTheme() *OneDarkTheme {
105 // Light mode colors from Atom One Light
106 lightBackground := "#fafafa"
107 lightCurrentLine := "#f0f0f0"
108 lightSelection := "#e5e5e6"
109 lightForeground := "#383a42"
110 lightComment := "#a0a1a7"
111 lightRed := "#e45649"
112 lightOrange := "#da8548"
113 lightYellow := "#c18401"
114 lightGreen := "#50a14f"
115 lightCyan := "#0184bc"
116 lightBlue := "#4078f2"
117 lightPurple := "#a626a4"
118 lightBorder := "#d3d3d3"
119
120 theme := &OneDarkTheme{}
121
122 // Base colors
123 theme.PrimaryColor = lipgloss.Color(lightBlue)
124 theme.SecondaryColor = lipgloss.Color(lightPurple)
125 theme.AccentColor = lipgloss.Color(lightOrange)
126
127 // Status colors
128 theme.ErrorColor = lipgloss.Color(lightRed)
129 theme.WarningColor = lipgloss.Color(lightOrange)
130 theme.SuccessColor = lipgloss.Color(lightGreen)
131 theme.InfoColor = lipgloss.Color(lightBlue)
132
133 // Text colors
134 theme.TextColor = lipgloss.Color(lightForeground)
135 theme.TextMutedColor = lipgloss.Color(lightComment)
136 theme.TextEmphasizedColor = lipgloss.Color(lightYellow)
137
138 // Background colors
139 theme.BackgroundColor = lipgloss.Color(lightBackground)
140 theme.BackgroundSecondaryColor = lipgloss.Color(lightCurrentLine)
141 theme.BackgroundDarkerColor = lipgloss.Color("#ffffff") // Slightly lighter than background
142
143 // Border colors
144 theme.BorderNormalColor = lipgloss.Color(lightBorder)
145 theme.BorderFocusedColor = lipgloss.Color(lightBlue)
146 theme.BorderDimColor = lipgloss.Color(lightSelection)
147
148 // Diff view colors
149 theme.DiffAddedColor = lipgloss.Color("#2E7D32")
150 theme.DiffRemovedColor = lipgloss.Color("#C62828")
151 theme.DiffContextColor = lipgloss.Color("#757575")
152 theme.DiffHunkHeaderColor = lipgloss.Color("#757575")
153 theme.DiffHighlightAddedColor = lipgloss.Color("#A5D6A7")
154 theme.DiffHighlightRemovedColor = lipgloss.Color("#EF9A9A")
155 theme.DiffAddedBgColor = lipgloss.Color("#E8F5E9")
156 theme.DiffRemovedBgColor = lipgloss.Color("#FFEBEE")
157 theme.DiffContextBgColor = lipgloss.Color(lightBackground)
158 theme.DiffLineNumberColor = lipgloss.Color("#9E9E9E")
159 theme.DiffAddedLineNumberBgColor = lipgloss.Color("#C8E6C9")
160 theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#FFCDD2")
161
162 // Markdown colors
163 theme.MarkdownTextColor = lipgloss.Color(lightForeground)
164 theme.MarkdownHeadingColor = lipgloss.Color(lightPurple)
165 theme.MarkdownLinkColor = lipgloss.Color(lightBlue)
166 theme.MarkdownLinkTextColor = lipgloss.Color(lightCyan)
167 theme.MarkdownCodeColor = lipgloss.Color(lightGreen)
168 theme.MarkdownBlockQuoteColor = lipgloss.Color(lightYellow)
169 theme.MarkdownEmphColor = lipgloss.Color(lightYellow)
170 theme.MarkdownStrongColor = lipgloss.Color(lightOrange)
171 theme.MarkdownHorizontalRuleColor = lipgloss.Color(lightComment)
172 theme.MarkdownListItemColor = lipgloss.Color(lightBlue)
173 theme.MarkdownListEnumerationColor = lipgloss.Color(lightCyan)
174 theme.MarkdownImageColor = lipgloss.Color(lightBlue)
175 theme.MarkdownImageTextColor = lipgloss.Color(lightCyan)
176 theme.MarkdownCodeBlockColor = lipgloss.Color(lightForeground)
177
178 // Syntax highlighting colors
179 theme.SyntaxCommentColor = lipgloss.Color(lightComment)
180 theme.SyntaxKeywordColor = lipgloss.Color(lightPurple)
181 theme.SyntaxFunctionColor = lipgloss.Color(lightBlue)
182 theme.SyntaxVariableColor = lipgloss.Color(lightRed)
183 theme.SyntaxStringColor = lipgloss.Color(lightGreen)
184 theme.SyntaxNumberColor = lipgloss.Color(lightOrange)
185 theme.SyntaxTypeColor = lipgloss.Color(lightYellow)
186 theme.SyntaxOperatorColor = lipgloss.Color(lightCyan)
187 theme.SyntaxPunctuationColor = lipgloss.Color(lightForeground)
188
189 return theme
190}
191
192func init() {
193 // Register the One Dark and One Light themes with the theme manager
194 RegisterTheme("onedark", NewOneDarkTheme())
195 RegisterTheme("onelight", NewOneLightTheme())
196}