maxmx03.solarized.nvim/lua/solarized/color.lua
Max Miliano 5b304a17ae feat: Solarized theme restructuring
The "Solarized Neo" theme, which included both light and dark variants,
has been dropped. The light variant of "Neo" is now the "Solarized
Light" theme. The original "Solarized" by Ethan Schoonover, which also
had light and dark versions, is now solely represented as the "Solarized
Dark" theme.
2024-08-23 19:46:38 -03:00

87 lines
2.5 KiB
Lua

---@class solarized.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