mirror of
https://github.com/antonmedv/fx
synced 2024-11-07 09:20:28 +00:00
186 lines
4.9 KiB
Go
186 lines
4.9 KiB
Go
|
package theme
|
||
|
|
||
|
import (
|
||
|
"github.com/charmbracelet/lipgloss"
|
||
|
"github.com/mazznoer/colorgrad"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type Theme struct {
|
||
|
Cursor Color
|
||
|
Syntax Color
|
||
|
Preview Color
|
||
|
StatusBar Color
|
||
|
Search Color
|
||
|
Key func(i, len int) Color
|
||
|
String Color
|
||
|
Null Color
|
||
|
Boolean Color
|
||
|
Number Color
|
||
|
}
|
||
|
type Color func(s string) string
|
||
|
|
||
|
var (
|
||
|
defaultCursor = lipgloss.NewStyle().Reverse(true).Render
|
||
|
defaultPreview = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("8")).Render
|
||
|
defaultStatusBar = lipgloss.NewStyle().Background(lipgloss.Color("7")).Foreground(lipgloss.Color("0")).Render
|
||
|
defaultSearch = lipgloss.NewStyle().Background(lipgloss.Color("11")).Foreground(lipgloss.Color("16")).Render
|
||
|
defaultNull = fg("8")
|
||
|
)
|
||
|
|
||
|
var Themes = map[string]Theme{
|
||
|
"0": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: noColor,
|
||
|
StatusBar: noColor,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return noColor },
|
||
|
String: noColor,
|
||
|
Null: noColor,
|
||
|
Boolean: noColor,
|
||
|
Number: noColor,
|
||
|
},
|
||
|
"1": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return boldFg("4") },
|
||
|
String: boldFg("2"),
|
||
|
Null: defaultNull,
|
||
|
Boolean: boldFg("3"),
|
||
|
Number: boldFg("6"),
|
||
|
},
|
||
|
"2": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return fg("#00F5D4") },
|
||
|
String: fg("#00BBF9"),
|
||
|
Null: defaultNull,
|
||
|
Boolean: fg("#F15BB5"),
|
||
|
Number: fg("#9B5DE5"),
|
||
|
},
|
||
|
"3": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return fg("#faf0ca") },
|
||
|
String: fg("#f4d35e"),
|
||
|
Null: defaultNull,
|
||
|
Boolean: fg("#ee964b"),
|
||
|
Number: fg("#ee964b"),
|
||
|
},
|
||
|
"4": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return fg("#4D96FF") },
|
||
|
String: fg("#6BCB77"),
|
||
|
Null: defaultNull,
|
||
|
Boolean: fg("#FF6B6B"),
|
||
|
Number: fg("#FFD93D"),
|
||
|
},
|
||
|
"5": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return boldFg("42") },
|
||
|
String: boldFg("213"),
|
||
|
Null: defaultNull,
|
||
|
Boolean: boldFg("201"),
|
||
|
Number: boldFg("201"),
|
||
|
},
|
||
|
"6": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return gradient("rgb(125,110,221)", "rgb(90%,45%,97%)", "hsl(229,79%,85%)") },
|
||
|
String: fg("195"),
|
||
|
Null: defaultNull,
|
||
|
Boolean: fg("195"),
|
||
|
Number: fg("195"),
|
||
|
},
|
||
|
"7": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: func(_, _ int) Color { return gradient("rgb(123,216,96)", "rgb(255,255,255)") },
|
||
|
String: noColor,
|
||
|
Null: defaultNull,
|
||
|
Boolean: noColor,
|
||
|
Number: noColor,
|
||
|
},
|
||
|
"8": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: gradientKeys("#ff0000", "#ff8700", "#ffd300", "#deff0a", "#a1ff0a", "#0aff99", "#0aefff", "#147df5", "#580aff", "#be0aff"),
|
||
|
String: noColor,
|
||
|
Null: defaultNull,
|
||
|
Boolean: noColor,
|
||
|
Number: noColor,
|
||
|
},
|
||
|
"9": {
|
||
|
Cursor: defaultCursor,
|
||
|
Syntax: noColor,
|
||
|
Preview: defaultPreview,
|
||
|
StatusBar: defaultStatusBar,
|
||
|
Search: defaultSearch,
|
||
|
Key: gradientKeys("rgb(34,126,34)", "rgb(168,251,60)"),
|
||
|
String: gradient("rgb(34,126,34)", "rgb(168,251,60)"),
|
||
|
Null: defaultNull,
|
||
|
Boolean: noColor,
|
||
|
Number: noColor,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
func noColor(s string) string {
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
func fg(color string) Color {
|
||
|
return lipgloss.NewStyle().Foreground(lipgloss.Color(color)).Render
|
||
|
}
|
||
|
|
||
|
func boldFg(color string) Color {
|
||
|
return lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color(color)).Render
|
||
|
}
|
||
|
|
||
|
func gradient(colors ...string) Color {
|
||
|
grad, _ := colorgrad.NewGradient().HtmlColors(colors...).Build()
|
||
|
return func(s string) string {
|
||
|
runes := []rune(s)
|
||
|
colors := grad.ColorfulColors(uint(len(runes)))
|
||
|
var out strings.Builder
|
||
|
for i, r := range runes {
|
||
|
style := lipgloss.NewStyle().Foreground(lipgloss.Color(colors[i].Hex()))
|
||
|
out.WriteString(style.Render(string(r)))
|
||
|
}
|
||
|
return out.String()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func gradientKeys(colors ...string) func(i, len int) Color {
|
||
|
grad, _ := colorgrad.NewGradient().HtmlColors(colors...).Build()
|
||
|
return func(i, len int) Color {
|
||
|
return lipgloss.NewStyle().Foreground(lipgloss.Color(grad.At(float64(i) / float64(len)).Hex())).Render
|
||
|
}
|
||
|
}
|