137 lines
3.4 KiB
Lua
137 lines
3.4 KiB
Lua
local M = {}
|
|
|
|
---@param hex string
|
|
---@param bg_hex string
|
|
---@param alpha number
|
|
---@return string
|
|
function M.blend(hex, bg_hex, alpha)
|
|
local function parse(h)
|
|
h = h:gsub('#', '')
|
|
return tonumber(h:sub(1, 2), 16), tonumber(h:sub(3, 4), 16), tonumber(h:sub(5, 6), 16)
|
|
end
|
|
local r, g, b = parse(hex)
|
|
local bg_r, bg_g, bg_b = parse(bg_hex)
|
|
local blend_r = math.floor(r * alpha + bg_r * (1 - alpha))
|
|
local blend_g = math.floor(g * alpha + bg_g * (1 - alpha))
|
|
local blend_b = math.floor(b * alpha + bg_b * (1 - alpha))
|
|
return string.format('#%02x%02x%02x', blend_r, blend_g, blend_b)
|
|
end
|
|
|
|
---@class Palette
|
|
---@field foreground string
|
|
---@field red string
|
|
---@field green string
|
|
---@field yellow string
|
|
---@field blue string
|
|
---@field magenta string
|
|
---@field cyan string
|
|
---@field orange? string
|
|
---@field background string
|
|
---@field bright_black string
|
|
---@field bright_red string
|
|
---@field bright_green string
|
|
---@field bright_yellow string
|
|
---@field bright_blue string
|
|
---@field bright_magenta string
|
|
---@field bright_cyan string
|
|
---@field bright_white string
|
|
---@field light_black string
|
|
---@field grey string
|
|
---@field med_grey? string
|
|
---@field dark_grey? string
|
|
---@field light_grey? string
|
|
---@field light_red? string
|
|
---@field light_green? string
|
|
---@field light_yellow? string
|
|
---@field light_blue? string
|
|
---@field light_magenta? string
|
|
---@field light_cyan? string
|
|
---@field light_white? string
|
|
---@field medium_emphasis? string
|
|
---@field diff_add? string
|
|
---@field diff_delete? string
|
|
---@field diff_change? string
|
|
|
|
---@type Palette
|
|
M.midnight = {
|
|
foreground = '#121212',
|
|
red = '#ff6b6b',
|
|
green = '#98c379',
|
|
yellow = '#e5c07b',
|
|
blue = '#7aa2f7',
|
|
magenta = '#c678dd',
|
|
cyan = '#56b6c2',
|
|
orange = '#e5a56b',
|
|
background = '#e0e0e0',
|
|
|
|
bright_black = '#666666',
|
|
bright_red = '#f48771',
|
|
bright_green = '#b5e890',
|
|
bright_yellow = '#f0d197',
|
|
bright_blue = '#9db8f7',
|
|
bright_magenta = '#e298ff',
|
|
bright_cyan = '#7dd6e0',
|
|
bright_white = '#ffffff',
|
|
|
|
light_black = '#666666',
|
|
grey = '#3d3d3d',
|
|
med_grey = '#2d2d2d',
|
|
dark_grey = '#222222',
|
|
|
|
medium_emphasis = '#999999',
|
|
|
|
-- Diff backgrounds: base color blended at 40% with visual bg (#121212)
|
|
-- Generated via: M.blend(base_color, '#121212', 0.4)
|
|
-- diff_add = M.blend('#98c379', '#121212', 0.4) -- green
|
|
-- diff_delete = M.blend('#ff6b6b', '#121212', 0.4) -- red
|
|
-- diff_change = M.blend('#e5c07b', '#121212', 0.4) -- yellow
|
|
diff_add = '#0c2f1e',
|
|
diff_delete = '#291f27',
|
|
diff_change = '#66583c',
|
|
}
|
|
|
|
---@type Palette
|
|
M.daylight = {
|
|
foreground = '#f5f5f5',
|
|
red = '#c7254e',
|
|
green = '#2d7f3e',
|
|
yellow = '#996800',
|
|
blue = '#3b5bdb',
|
|
magenta = '#ae3ec9',
|
|
cyan = '#1098ad',
|
|
orange = '#d9730d',
|
|
background = '#1a1a1a',
|
|
|
|
bright_black = '#999999',
|
|
bright_red = '#e03e52',
|
|
bright_green = '#37b24d',
|
|
bright_yellow = '#f59f00',
|
|
bright_blue = '#4c6ef5',
|
|
bright_magenta = '#da77f2',
|
|
bright_cyan = '#15aabf',
|
|
bright_white = '#000000',
|
|
|
|
light_black = '#6b6b6b',
|
|
grey = '#d0d0d0',
|
|
med_grey = '#e8e8e8',
|
|
dark_grey = '#ebebeb',
|
|
|
|
medium_emphasis = '#666666',
|
|
|
|
-- Diff backgrounds: base color blended at 40% with visual bg (#f5f5f5)
|
|
-- Generated via: M.blend(base_color, '#f5f5f5', 0.4)
|
|
diff_add = '#a5c5ab',
|
|
diff_delete = '#e2a1b2',
|
|
diff_change = '#d0bc93',
|
|
}
|
|
|
|
---@return Palette
|
|
function M.get_palette()
|
|
if vim.o.background == 'light' then
|
|
return M.daylight
|
|
else
|
|
return M.midnight
|
|
end
|
|
end
|
|
|
|
return M
|