1package theme
2
3import (
4 "github.com/charmbracelet/lipgloss/v2"
5)
6
7// DraculaTheme implements the Theme interface with Dracula colors.
8// It provides both dark and light variants, though Dracula is primarily a dark theme.
9type DraculaTheme struct {
10 BaseTheme
11}
12
13// NewDraculaTheme creates a new instance of the Dracula theme.
14func NewDraculaTheme() *DraculaTheme {
15 // Dracula color palette
16 // Official colors from https://draculatheme.com/
17 darkBackground := "#282a36"
18 darkCurrentLine := "#44475a"
19 darkSelection := "#44475a"
20 darkForeground := "#f8f8f2"
21 darkComment := "#6272a4"
22 darkCyan := "#8be9fd"
23 darkGreen := "#50fa7b"
24 darkOrange := "#ffb86c"
25 darkPink := "#ff79c6"
26 darkPurple := "#bd93f9"
27 darkRed := "#ff5555"
28 darkYellow := "#f1fa8c"
29 darkBorder := "#44475a"
30
31 theme := &DraculaTheme{}
32
33 // Base colors
34 theme.PrimaryColor = lipgloss.Color(darkPurple)
35 theme.SecondaryColor = lipgloss.Color(darkPink)
36 theme.AccentColor = lipgloss.Color(darkCyan)
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(darkCyan)
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("#21222c") // Slightly darker than background
53
54 // Border colors
55 theme.BorderNormalColor = lipgloss.Color(darkBorder)
56 theme.BorderFocusedColor = lipgloss.Color(darkPurple)
57 theme.BorderDimColor = lipgloss.Color(darkSelection)
58
59 // Diff view colors
60 theme.DiffAddedColor = lipgloss.Color(darkGreen)
61 theme.DiffRemovedColor = lipgloss.Color(darkRed)
62 theme.DiffContextColor = lipgloss.Color(darkComment)
63 theme.DiffHunkHeaderColor = lipgloss.Color(darkPurple)
64 theme.DiffHighlightAddedColor = lipgloss.Color("#50fa7b")
65 theme.DiffHighlightRemovedColor = lipgloss.Color("#ff5555")
66 theme.DiffAddedBgColor = lipgloss.Color("#2c3b2c")
67 theme.DiffRemovedBgColor = lipgloss.Color("#3b2c2c")
68 theme.DiffContextBgColor = lipgloss.Color(darkBackground)
69 theme.DiffLineNumberColor = lipgloss.Color(darkComment)
70 theme.DiffAddedLineNumberBgColor = lipgloss.Color("#253025")
71 theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#302525")
72
73 // Markdown colors
74 theme.MarkdownTextColor = lipgloss.Color(darkForeground)
75 theme.MarkdownHeadingColor = lipgloss.Color(darkPink)
76 theme.MarkdownLinkColor = lipgloss.Color(darkPurple)
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(darkPurple)
84 theme.MarkdownListEnumerationColor = lipgloss.Color(darkCyan)
85 theme.MarkdownImageColor = lipgloss.Color(darkPurple)
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(darkPink)
92 theme.SyntaxFunctionColor = lipgloss.Color(darkGreen)
93 theme.SyntaxVariableColor = lipgloss.Color(darkOrange)
94 theme.SyntaxStringColor = lipgloss.Color(darkYellow)
95 theme.SyntaxNumberColor = lipgloss.Color(darkPurple)
96 theme.SyntaxTypeColor = lipgloss.Color(darkCyan)
97 theme.SyntaxOperatorColor = lipgloss.Color(darkPink)
98 theme.SyntaxPunctuationColor = lipgloss.Color(darkForeground)
99
100 return theme
101}
102
103func init() {
104 // Register the Dracula theme with the theme manager
105 RegisterTheme("dracula", NewDraculaTheme())
106}