mirror of
https://github.com/maxmx03/dracula.nvim.git
synced 2026-09-10 07:26:19 -04:00
87 lines
2.5 KiB
Lua
87 lines
2.5 KiB
Lua
---@class dracula.color
|
|
---@field hex_to_rgb fun(hex: string): number, number, number
|
|
---@field rgb_to_hex fun(red: number, green: number, blue: number): string
|
|
---@field darken fun(hex: string, percentage: number): string
|
|
---@field lighten fun(hex: string, percentage: number): string
|
|
---@field shade fun(hex: string, i: number): string
|
|
---@field tint fun(hex: string, i: number): string
|
|
---@field blend fun(fg: string, bg: string, alpha: number): string
|
|
local M = {}
|
|
|
|
function M.hex_to_rgb(hex)
|
|
local red = tonumber(hex:sub(2, 3), 16)
|
|
local green = tonumber(hex:sub(4, 5), 16)
|
|
local blue = tonumber(hex:sub(6, 7), 16)
|
|
return red, green, blue
|
|
end
|
|
|
|
function M.rgb_to_hex(red, green, blue)
|
|
return string.format('#%02x%02x%02x', red, green, blue)
|
|
end
|
|
|
|
function M.darken(hex, percentage)
|
|
local red, green, blue = M.hex_to_rgb(hex)
|
|
local i = 1
|
|
local result = {
|
|
red = red * (1 - (percentage / 100) * i),
|
|
green = green * (1 - (percentage / 100) * i),
|
|
blue = blue * (1 - (percentage / 100) * i),
|
|
}
|
|
return M.rgb_to_hex(result.red, result.green, result.blue)
|
|
end
|
|
|
|
function M.lighten(color, percentage)
|
|
local red, green, blue = M.hex_to_rgb(color)
|
|
local i = 1
|
|
local result = {
|
|
red = red + (255 - red) * i * (percentage / 100),
|
|
green = green + (255 - green) * i * (percentage / 100),
|
|
blue = blue + (255 - blue) * i * (percentage / 100),
|
|
}
|
|
return M.rgb_to_hex(result.red, result.green, result.blue)
|
|
end
|
|
|
|
function M.shade(hex, i)
|
|
local red, green, blue = M.hex_to_rgb(hex)
|
|
local result = {
|
|
red = red * (1 - 0.1 * i),
|
|
green = green * (1 - 0.1 * i),
|
|
blue = blue * (1 - 0.1 * i),
|
|
}
|
|
return M.rgb_to_hex(result.red, result.green, result.blue)
|
|
end
|
|
|
|
function M.tint(hex, i)
|
|
local red, green, blue = M.hex_to_rgb(hex)
|
|
local result = {
|
|
red = red + (255 - red) * i * 0.1,
|
|
green = green + (255 - green) * i * 0.1,
|
|
blue = blue + (255 - blue) * i * 0.1,
|
|
}
|
|
return M.rgb_to_hex(result.red, result.green, result.blue)
|
|
end
|
|
|
|
---@param fg number
|
|
---@param bg number
|
|
---@param alpha number
|
|
---@return number
|
|
local function blend_channel(fg, bg, alpha)
|
|
local ret = alpha * fg + ((1 - alpha) * bg)
|
|
local min = math.min
|
|
local max = math.max
|
|
local floor = math.floor
|
|
return floor(min(max(0, ret), 255) + 0.5)
|
|
end
|
|
|
|
function M.blend(fg, bg, alpha)
|
|
local red_bg, green_bg, blue_bg = M.hex_to_rgb(bg)
|
|
local red_fg, green_fg, blue_fg = M.hex_to_rgb(fg)
|
|
return M.rgb_to_hex(
|
|
blend_channel(red_fg, red_bg, alpha),
|
|
blend_channel(green_fg, green_bg, alpha),
|
|
blend_channel(blue_fg, blue_bg, alpha)
|
|
)
|
|
end
|
|
|
|
return M
|