midnight.nvim/lua/midnight/palette.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('#7aa2f7', '#121212', 0.4) -- blue
diff_add = '#0c2f1e',
diff_delete = '#291f27',
diff_change = '#3a4a6d',
}
---@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 = '#a9b7e5',
}
---@return Palette
function M.get_palette()
if vim.o.background == 'light' then
return M.daylight
else
return M.midnight
end
end
return M