diff options
| author | adamdottv <[email protected]> | 2025-04-29 08:24:46 -0500 |
|---|---|---|
| committer | adamdottv <[email protected]> | 2025-04-30 07:46:35 -0500 |
| commit | 1ae3f1830b5ba9a97b78f0d14910cc08341abe4a (patch) | |
| tree | cdf85f3cfdad2ac24431d539a51bb58eb0ccebb3 /internal | |
| parent | 1e958b62ad0c71331e8a45f7d19ad736ffa52d1c (diff) | |
| download | opencode-1ae3f1830b5ba9a97b78f0d14910cc08341abe4a.tar.gz opencode-1ae3f1830b5ba9a97b78f0d14910cc08341abe4a.zip | |
feat: dracula theme
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/tui/theme/dracula.go | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/internal/tui/theme/dracula.go b/internal/tui/theme/dracula.go new file mode 100644 index 000000000..e625206ae --- /dev/null +++ b/internal/tui/theme/dracula.go @@ -0,0 +1,274 @@ +package theme + +import ( + "github.com/charmbracelet/lipgloss" +) + +// DraculaTheme implements the Theme interface with Dracula colors. +// It provides both dark and light variants, though Dracula is primarily a dark theme. +type DraculaTheme struct { + BaseTheme +} + +// NewDraculaTheme creates a new instance of the Dracula theme. +func NewDraculaTheme() *DraculaTheme { + // Dracula color palette + // Official colors from https://draculatheme.com/ + darkBackground := "#282a36" + darkCurrentLine := "#44475a" + darkSelection := "#44475a" + darkForeground := "#f8f8f2" + darkComment := "#6272a4" + darkCyan := "#8be9fd" + darkGreen := "#50fa7b" + darkOrange := "#ffb86c" + darkPink := "#ff79c6" + darkPurple := "#bd93f9" + darkRed := "#ff5555" + darkYellow := "#f1fa8c" + darkBorder := "#44475a" + + // Light mode approximation (Dracula is primarily a dark theme) + lightBackground := "#f8f8f2" + lightCurrentLine := "#e6e6e6" + lightSelection := "#d8d8d8" + lightForeground := "#282a36" + lightComment := "#6272a4" + lightCyan := "#0097a7" + lightGreen := "#388e3c" + lightOrange := "#f57c00" + lightPink := "#d81b60" + lightPurple := "#7e57c2" + lightRed := "#e53935" + lightYellow := "#fbc02d" + lightBorder := "#d8d8d8" + + theme := &DraculaTheme{} + + // Base colors + theme.PrimaryColor = lipgloss.AdaptiveColor{ + Dark: darkPurple, + Light: lightPurple, + } + theme.SecondaryColor = lipgloss.AdaptiveColor{ + Dark: darkPink, + Light: lightPink, + } + theme.AccentColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + + // Status colors + theme.ErrorColor = lipgloss.AdaptiveColor{ + Dark: darkRed, + Light: lightRed, + } + theme.WarningColor = lipgloss.AdaptiveColor{ + Dark: darkOrange, + Light: lightOrange, + } + theme.SuccessColor = lipgloss.AdaptiveColor{ + Dark: darkGreen, + Light: lightGreen, + } + theme.InfoColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + + // Text colors + theme.TextColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + theme.TextMutedColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.TextEmphasizedColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + + // Background colors + theme.BackgroundColor = lipgloss.AdaptiveColor{ + Dark: darkBackground, + Light: lightBackground, + } + theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{ + Dark: darkCurrentLine, + Light: lightCurrentLine, + } + theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{ + Dark: "#21222c", // Slightly darker than background + Light: "#ffffff", // Slightly lighter than background + } + + // Border colors + theme.BorderNormalColor = lipgloss.AdaptiveColor{ + Dark: darkBorder, + Light: lightBorder, + } + theme.BorderFocusedColor = lipgloss.AdaptiveColor{ + Dark: darkPurple, + Light: lightPurple, + } + theme.BorderDimColor = lipgloss.AdaptiveColor{ + Dark: darkSelection, + Light: lightSelection, + } + + // Diff view colors + theme.DiffAddedColor = lipgloss.AdaptiveColor{ + Dark: darkGreen, + Light: lightGreen, + } + theme.DiffRemovedColor = lipgloss.AdaptiveColor{ + Dark: darkRed, + Light: lightRed, + } + theme.DiffContextColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{ + Dark: darkPurple, + Light: lightPurple, + } + theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{ + Dark: "#50fa7b", + Light: "#a5d6a7", + } + theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{ + Dark: "#ff5555", + Light: "#ef9a9a", + } + theme.DiffAddedBgColor = lipgloss.AdaptiveColor{ + Dark: "#2c3b2c", + Light: "#e8f5e9", + } + theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{ + Dark: "#3b2c2c", + Light: "#ffebee", + } + theme.DiffContextBgColor = lipgloss.AdaptiveColor{ + Dark: darkBackground, + Light: lightBackground, + } + theme.DiffLineNumberColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{ + Dark: "#253025", + Light: "#c8e6c9", + } + theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{ + Dark: "#302525", + Light: "#ffcdd2", + } + + // Markdown colors + theme.MarkdownTextColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{ + Dark: darkPink, + Light: lightPink, + } + theme.MarkdownLinkColor = lipgloss.AdaptiveColor{ + Dark: darkPurple, + Light: lightPurple, + } + theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.MarkdownCodeColor = lipgloss.AdaptiveColor{ + Dark: darkGreen, + Light: lightGreen, + } + theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + theme.MarkdownEmphColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + theme.MarkdownStrongColor = lipgloss.AdaptiveColor{ + Dark: darkOrange, + Light: lightOrange, + } + theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.MarkdownListItemColor = lipgloss.AdaptiveColor{ + Dark: darkPurple, + Light: lightPurple, + } + theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.MarkdownImageColor = lipgloss.AdaptiveColor{ + Dark: darkPurple, + Light: lightPurple, + } + theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + + // Syntax highlighting colors + theme.SyntaxCommentColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{ + Dark: darkPink, + Light: lightPink, + } + theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{ + Dark: darkGreen, + Light: lightGreen, + } + theme.SyntaxVariableColor = lipgloss.AdaptiveColor{ + Dark: darkOrange, + Light: lightOrange, + } + theme.SyntaxStringColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + theme.SyntaxNumberColor = lipgloss.AdaptiveColor{ + Dark: darkPurple, + Light: lightPurple, + } + theme.SyntaxTypeColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{ + Dark: darkPink, + Light: lightPink, + } + theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + + return theme +} + +func init() { + // Register the Dracula theme with the theme manager + RegisterTheme("dracula", NewDraculaTheme()) +}
\ No newline at end of file |
