dracula.go

  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}