kanso.nvim/lua/kanso/themes.lua
2025-12-30 12:35:07 +01:00

541 lines
21 KiB
Lua

--TODO:
--PreProc needs its own color
--parameter and field should be different
---@class SyntaxElements
---@field string ColorSpec
---@field variable ColorSpec
---@field number ColorSpec
---@field constant ColorSpec
---@field identifier ColorSpec
---@field parameter ColorSpec
---@field fun ColorSpec
---@field statement ColorSpec
---@field keyword ColorSpec
---@field operator ColorSpec
---@field preproc ColorSpec
---@field type ColorSpec
---@field regex ColorSpec
---@field deprecated ColorSpec
---@field comment ColorSpec
---@field punct ColorSpec
---@field special1 ColorSpec
---@field special2 ColorSpec
---@field special3 ColorSpec
---@class DiagnosticsElements
---@field error ColorSpec
---@field ok ColorSpec
---@field warning ColorSpec
---@field info ColorSpec
---@field hint ColorSpec
--
---@class DiffElements
---@field add ColorSpec
---@field delete ColorSpec
---@field change ColorSpec
---@field text ColorSpec
---@class VCSElements
---@field added ColorSpec
---@field removed ColorSpec
---@field changed ColorSpec
---@field untracked ColorSpec
---@class UiElements
---@field none ColorSpec
---@field fg ColorSpec Default foreground
---@field fg_dim ColorSpec Dimmed foreground
---@field fg_reverse ColorSpec
---@field bg_dim ColorSpec Dimmed background
---@field bg_m3 ColorSpec
---@field bg_m2 ColorSpec
---@field bg_m1 ColorSpec
---@field bg ColorSpec Default background
---@field bg_p1 ColorSpec Lighter background ColorColumn, Folded, Gutter
---@field bg_p2 ColorSpec Lighter background Cursor{Line,Column}, TabLineSel (Selected Items)
---@field bg_gutter ColorSpec {Sign,Fold}Column, LineNr
---@field special ColorSpec SpecialKey
---@field indent_line ColorSpec IndentLine
---@field active_indent_line ColorSpec IndentLine
---@field nontext ColorSpec LineNr, NonText
---@field whitespace ColorSpec Whitespace
---@field bg_search ColorSpec
---@field bg_visual ColorSpec
---@field cursor_line_nr_foreground ColorSpec
---@field cursor_line_nr_active_foreground ColorSpec
---@field cursor_bg ColorSpec
---@field cursor_fg ColorSpec
---@field pmenu MenuElements
---@field float FloatElements
---@class FloatElements
---@field fg ColorSpec
---@field bg ColorSpec
---@field fg_border ColorSpec
---@field bg_border ColorSpec
---@class MenuElements
---@field bg ColorSpec
---@field fg ColorSpec
---@field fg_sel ColorSpec
---@field bg_sel ColorSpec
---@field bg_sbar ColorSpec
---@field bg_thumb ColorSpec
---@class ThemeColors
---@field syn SyntaxElements
---@field diag DiagnosticsElements
---@field vcs VCSElements
---@field diff DiffElements
---@field ui UiElements
---@field term ColorSpec[]
return {
---@param palette PaletteColors
---@param foreground? "default"|"saturated"
---@return ThemeColors
zen = function(palette, foreground)
return {
ui = {
none = "NONE",
fg = palette.fg,
fg_dim = palette.gray2,
fg_reverse = palette.altBlue1,
bg_dim = palette.zenBg1,
bg_m3 = palette.zenBg0,
bg_m2 = palette.zenBg0,
bg_m1 = palette.zenBg0,
bg = palette.zenBg0,
bg_p1 = palette.zenBg1,
bg_p2 = palette.zenBg2,
special = palette.gray5,
indent_line = palette.inkBg2,
active_indent_line = palette.inkBg3,
whitespace = palette.inkBg3,
nontext = palette.gray5,
bg_visual = palette.inkBg3,
bg_search = palette.altBlue2,
cursor_line_nr_foreground = palette.gray5,
cursor_line_nr_active_foreground = palette.fg2,
cursor_bg = palette.fg2,
cursor_fg = palette.zenBg0,
pmenu = {
fg = palette.fg2,
fg_sel = "NONE",
bg = palette.zenBg0,
bg_sel = palette.inkBg3,
bg_thumb = palette.inkBg3,
bg_sbar = palette.zenBg0,
},
float = {
fg = palette.gray2,
bg = palette.zenBg0,
fg_border = palette.zenBg2,
bg_border = palette.zenBg0,
},
},
syn = {
string = foreground == "saturated" and palette.green3Saturated or palette.green3,
variable = "NONE",
number = foreground == "saturated" and palette.pinkSaturated or palette.pink,
constant = foreground == "saturated" and palette.orangeSaturated or palette.orange,
identifier = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
parameter = palette.gray3,
fun = foreground == "saturated" and palette.blue3Saturated or palette.blue3,
statement = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
keyword = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
operator = palette.gray3,
preproc = palette.gray3,
type = foreground == "saturated" and palette.aquaSaturated or palette.aqua,
regex = foreground == "saturated" and palette.red3Saturated or palette.red3,
deprecated = palette.gray,
punct = palette.gray3,
comment = palette.gray4,
special1 = foreground == "saturated" and palette.yellow3Saturated or palette.yellow3,
special2 = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
special3 = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
},
diag = {
error = palette.red,
ok = palette.green,
warning = palette.yellow,
info = palette.blue2,
hint = palette.green4,
},
diff = {
add = palette.diffGreen,
delete = palette.diffRed,
change = palette.diffBlue,
text = palette.diffYellow,
},
vcs = {
added = palette.gitGreen,
removed = palette.gitRed,
changed = palette.gitYellow,
untracked = palette.gray4,
},
term = {
palette.zenBg0, -- black
palette.red3, -- red
palette.green3, -- green
palette.yellow3, -- yellow
palette.blue3, -- blue
palette.pink, -- magenta
palette.fg, -- cyan
palette.gray2, -- white
palette.gray3, -- bright black
palette.red2, -- bright red
palette.green2, -- bright green
palette.yellow2, -- bright yellow
palette.blue, -- bright blue
palette.violet, -- bright magenta
palette.green5, -- bright cyan
palette.fg, -- bright white
palette.orange, -- extended color 1
palette.orange2, -- extended color 2
},
}
end,
---@param palette PaletteColors
---@param foreground? "default"|"saturated"
---@return ThemeColors
ink = function(palette, foreground)
return {
ui = {
none = "NONE",
fg = palette.fg,
fg_dim = palette.gray2,
fg_reverse = palette.altBlue1,
bg_dim = palette.inkBg1,
bg_m3 = palette.inkBg0,
bg_m2 = palette.inkBg0,
bg_m1 = palette.inkBg0,
bg = palette.inkBg0,
bg_p1 = palette.inkBg1,
bg_p2 = palette.inkBg2,
special = palette.gray5,
indent_line = palette.inkBg2,
active_indent_line = palette.inkBg3,
whitespace = palette.inkBg4,
nontext = palette.gray5,
bg_visual = palette.inkBg3,
bg_search = palette.altBlue2,
cursor_line_nr_foreground = palette.gray5,
cursor_line_nr_active_foreground = palette.fg2,
cursor_bg = palette.fg2,
cursor_fg = palette.inkBg0,
pmenu = {
fg = palette.fg2,
fg_sel = "NONE",
bg = palette.inkBg0,
bg_sel = palette.inkBg3,
bg_thumb = palette.inkBg3,
bg_sbar = palette.inkBg0,
},
float = {
fg = palette.gray2,
bg = palette.inkBg0,
fg_border = palette.inkBg2,
bg_border = palette.inkBg0,
},
},
syn = {
string = foreground == "saturated" and palette.green3Saturated or palette.green3,
variable = "NONE",
number = foreground == "saturated" and palette.pinkSaturated or palette.pink,
constant = foreground == "saturated" and palette.orangeSaturated or palette.orange,
identifier = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
parameter = palette.gray3,
fun = foreground == "saturated" and palette.blue3Saturated or palette.blue3,
statement = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
keyword = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
operator = palette.gray3,
preproc = palette.gray3,
type = foreground == "saturated" and palette.aquaSaturated or palette.aqua,
regex = foreground == "saturated" and palette.red3Saturated or palette.red3,
deprecated = palette.gray,
punct = palette.gray3,
comment = palette.gray4,
special1 = foreground == "saturated" and palette.yellow3Saturated or palette.yellow3,
special2 = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
special3 = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
},
diag = {
error = palette.red,
ok = palette.green,
warning = palette.yellow,
info = palette.blue2,
hint = palette.green4,
},
diff = {
add = palette.diffGreen,
delete = palette.diffRed,
change = palette.diffBlue,
text = palette.diffYellow,
},
vcs = {
added = palette.gitGreen,
removed = palette.gitRed,
changed = palette.gitYellow,
untracked = palette.gray4,
},
term = {
palette.inkBg0, -- black
palette.red3, -- red
palette.green3, -- green
palette.yellow3, -- yellow
palette.blue3, -- blue
palette.pink, -- magenta
palette.fg, -- cyan
palette.gray2, -- white
palette.gray3, -- bright black
palette.red2, -- bright red
palette.green2, -- bright green
palette.yellow2, -- bright yellow
palette.blue, -- bright blue
palette.violet, -- bright magenta
palette.green5, -- bright cyan
palette.fg, -- bright white
palette.orange, -- extended color 1
palette.orange2, -- extended color 2
},
}
end,
---@param palette PaletteColors
---@param foreground? "default"|"saturated"
---@return ThemeColors
pearl = function(palette, foreground)
return {
ui = {
none = "NONE",
fg = palette.pearlBlack0,
fg_dim = palette.pearlBlack1,
fg_reverse = palette.pearlGray,
bg_dim = palette.pearlWhite1,
bg_m3 = palette.pearlWhite0,
bg_m2 = palette.pearlWhite0,
bg_m1 = palette.pearlWhite0,
bg = palette.pearlWhite0,
bg_p1 = palette.pearlWhite1,
bg_p2 = palette.pearlWhite1,
nontext = palette.pearlViolet1,
whitespace = palette.pearlWhite3,
special = palette.pearlViolet2,
indent_line = palette.pearlWhite2,
active_indent_line = palette.pearlWhite2,
bg_visual = palette.pearlWhite2,
bg_search = palette.pearlBlue2,
cursor_line_nr_foreground = palette.pearlGray4,
cursor_line_nr_active_foreground = palette.inkBg2,
cursor_bg = palette.pearlBlack0,
cursor_fg = palette.pearlWhite0,
pmenu = {
fg = palette.pearlBlack2,
fg_sel = "NONE", -- This is important to make highlights pass-through
bg = palette.pearlWhite0,
bg_sel = palette.pearlWhite2,
bg_thumb = palette.pearlWhite2,
bg_sbar = palette.pearlWhite0,
},
float = {
fg = palette.pearlBlack2,
bg = palette.pearlWhite0,
fg_border = palette.pearlWhite2,
bg_border = palette.pearlWhite0,
},
},
syn = {
string = foreground == "saturated" and palette.pearlGreenSaturated or palette.pearlGreen,
variable = "NONE",
number = foreground == "saturated" and palette.pearlPinkSaturated or palette.pearlPink,
constant = foreground == "saturated" and palette.pearlOrangeSaturated or palette.pearlOrange,
identifier = foreground == "saturated" and palette.pearlViolet4Saturated or palette.pearlViolet4,
parameter = foreground == "saturated" and palette.pearlBlue5Saturated or palette.pearlBlue5,
fun = foreground == "saturated" and palette.pearlBlue4Saturated or palette.pearlBlue4,
statement = foreground == "saturated" and palette.pearlViolet4Saturated or palette.pearlViolet4,
keyword = foreground == "saturated" and palette.pearlViolet4Saturated or palette.pearlViolet4,
operator = palette.pearlGray3,
preproc = palette.pearlGray2,
type = foreground == "saturated" and palette.pearlAquaSaturated or palette.pearlAqua,
regex = foreground == "saturated" and palette.pearlYellow2Saturated or palette.pearlYellow2,
deprecated = palette.pearlGray3,
comment = palette.pearlGray3,
punct = palette.pearlGray3,
special1 = foreground == "saturated" and palette.pearlYellow2Saturated or palette.pearlYellow2,
special2 = foreground == "saturated" and palette.pearlViolet4Saturated or palette.pearlViolet4,
special3 = foreground == "saturated" and palette.pearlViolet4Saturated or palette.pearlViolet4,
},
vcs = {
added = palette.pearlGreen2,
removed = palette.pearlRed2,
changed = palette.pearlYellow3,
untracked = palette.pearlGray4,
},
diff = {
add = palette.pearlGreen3,
delete = palette.pearlRed4,
change = palette.pearlCyan,
text = palette.pearlYellow4,
},
diag = {
error = palette.pearlRed3,
ok = palette.pearlGreen,
warning = palette.pearlOrange2,
info = palette.pearlTeal3,
hint = palette.pearlAqua2,
},
term = {
palette.inkBg2, -- black
palette.pearlRed, -- red
palette.pearlGreen, -- green
palette.pearlYellow, -- yellow
palette.pearlBlue4, -- blue
palette.pearlPink, -- magenta
palette.pearlAqua, -- cyan
palette.pearlBlack0, -- white
palette.pearlGray3, -- bright black
palette.pearlRed2, -- bright red
palette.pearlGreen2, -- bright green
palette.pearlYellow2, -- bright yellow
palette.pearlTeal2, -- bright blue
palette.pearlViolet4, -- bright magenta
palette.pearlAqua2, -- bright cyan
palette.pearlBlack2, -- bright white
palette.pearlOrange2, -- extended color 1
palette.pearlRed3, -- extended color 2
},
}
end,
---@param palette PaletteColors
---@param foreground? "default"|"saturated"
---@return ThemeColors
mist = function(palette, foreground)
return {
ui = {
none = "NONE",
fg = palette.fg,
fg_dim = palette.gray2,
fg_reverse = palette.altBlue1,
bg_dim = palette.mistBg1,
bg_m3 = palette.mistBg0,
bg_m2 = palette.mistBg0,
bg_m1 = palette.mistBg0,
bg = palette.mistBg0,
bg_p1 = palette.mistBg2,
bg_p2 = palette.mistBg2,
special = palette.gray5,
indent_line = palette.mistBg2,
active_indent_line = palette.mistBg3,
whitespace = palette.mistBg3,
nontext = palette.gray5,
bg_visual = palette.mistBg2,
bg_search = palette.altBlue2,
cursor_line_nr_foreground = palette.gray4,
cursor_line_nr_active_foreground = palette.fg2,
cursor_bg = palette.fg2,
cursor_fg = palette.mistBg0,
pmenu = {
fg = palette.fg2,
fg_sel = "NONE",
bg = palette.mistBg0,
bg_sel = palette.mistBg2,
bg_thumb = palette.mistBg2,
bg_sbar = palette.mistBg0,
},
float = {
fg = palette.gray2,
bg = palette.mistBg0,
fg_border = palette.mistBg2,
bg_border = palette.mistBg0,
},
},
syn = {
string = foreground == "saturated" and palette.green3Saturated or palette.green3,
variable = "NONE",
number = foreground == "saturated" and palette.pinkSaturated or palette.pink,
constant = foreground == "saturated" and palette.orangeSaturated or palette.orange,
identifier = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
parameter = palette.gray3,
fun = foreground == "saturated" and palette.blue3Saturated or palette.blue3,
statement = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
keyword = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
operator = palette.gray3,
preproc = palette.gray3,
type = foreground == "saturated" and palette.aquaSaturated or palette.aqua,
regex = foreground == "saturated" and palette.red3Saturated or palette.red3,
deprecated = palette.gray,
punct = palette.gray3,
comment = palette.gray4,
special1 = foreground == "saturated" and palette.yellow3Saturated or palette.yellow3,
special2 = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
special3 = foreground == "saturated" and palette.violet2Saturated or palette.violet2,
},
diag = {
error = palette.red,
ok = palette.green,
warning = palette.yellow,
info = palette.blue2,
hint = palette.green4,
},
diff = {
add = palette.diffGreen,
delete = palette.diffRed,
change = palette.diffBlue,
text = palette.diffYellow,
},
vcs = {
added = palette.gitGreen,
removed = palette.gitRed,
changed = palette.gitYellow,
untracked = palette.gray4,
},
term = {
palette.mistBg0, -- black
palette.red3, -- red
palette.green3, -- green
palette.yellow3, -- yellow
palette.blue3, -- blue
palette.pink, -- magenta
palette.fg, -- cyan
palette.gray2, -- white
palette.gray3, -- bright black
palette.red2, -- bright red
palette.green2, -- bright green
palette.yellow2, -- bright yellow
palette.blue, -- bright blue
palette.violet, -- bright magenta
palette.green5, -- bright cyan
palette.fg, -- bright white
palette.orange, -- extended color 1
palette.orange2, -- extended color 2
},
}
end,
}