diff --git a/README.md b/README.md index fd87161..6275395 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -# 🖌️ Sumi-e -- A minimalist theme for Neovim +# 🔴 Dieter - A minimalist theme for Neovim + +Less but better. diff --git a/colors/dieter.lua b/colors/dieter.lua new file mode 100644 index 0000000..38e858c --- /dev/null +++ b/colors/dieter.lua @@ -0,0 +1,2 @@ +package.loaded["dieter"] = nil +require("dieter") diff --git a/colors/sumi-e.lua b/colors/sumi-e.lua deleted file mode 100644 index 09d10a2..0000000 --- a/colors/sumi-e.lua +++ /dev/null @@ -1,2 +0,0 @@ -package.loaded["sumi-e"] = nil -require("sumi-e") diff --git a/lua/dieter/hsl.lua b/lua/dieter/hsl.lua new file mode 100644 index 0000000..1d1b287 --- /dev/null +++ b/lua/dieter/hsl.lua @@ -0,0 +1,71 @@ +-- https://github.com/EmmanuelOga/columns/blob/master/utils/color.lua + +local M = {} + +--- Converts an HSL color value to RGB. Conversion formula +--- adapted from http://en.wikipedia.org/wiki/HSL_color_space. +--- Assumes h, s, and l are contained in the set [0, 1] and +--- returns r, g, and b in the set [0, 255]. +--- +--- @param h number The hue +--- @param s number The saturation +--- @param l number The lightness +--- @return number, number, number # The RGB representation +function M.hslToRgb(h, s, l) + --- @type number, number, number + local r, g, b + + if s == 0 then + r, g, b = l, l, l -- achromatic + else + --- @param p number + --- @param q number + --- @param t number + local function hue2rgb(p, q, t) + if t < 0 then + t = t + 1 + end + if t > 1 then + t = t - 1 + end + if t < 1 / 6 then + return p + (q - p) * 6 * t + end + if t < 1 / 2 then + return q + end + if t < 2 / 3 then + return p + (q - p) * (2 / 3 - t) * 6 + end + return p + end + + --- @type number + local q + if l < 0.5 then + q = l * (1 + s) + else + q = l + s - l * s + end + local p = 2 * l - q + + r = hue2rgb(p, q, h + 1 / 3) + g = hue2rgb(p, q, h) + b = hue2rgb(p, q, h - 1 / 3) + end + + return r * 255, g * 255, b * 255 +end + +--- Converts an HSL color value to RGB in Hex representation. +--- @param h number The hue +--- @param s number The saturation +--- @param l number The lightness +--- @return string # The hex representation +function M.hslToHex(h, s, l) + local r, g, b = M.hslToRgb(h / 360, s / 100, l / 100) + + return string.format("#%02x%02x%02x", r, g, b) +end + +return M diff --git a/lua/dieter/init.lua b/lua/dieter/init.lua new file mode 100644 index 0000000..e1939d1 --- /dev/null +++ b/lua/dieter/init.lua @@ -0,0 +1,161 @@ +local hsl = require("dieter.hsl").hslToHex + +local colors = { + light = { + background = hsl(240, 100, 100), + foreground = hsl(0, 0, 13), + + string = hsl(96, 50, 33), + comment = hsl(230, 66, 40), + comment_error = hsl(2, 85, 40), + + diagnostic_error = hsl(347, 80, 45), + diagnostic_warning = hsl(30, 100, 50), + diagnostic_info = hsl(145, 80, 30), + diagnostic_hint = hsl(145, 80, 30), + + popup_error_bg = hsl(0, 90, 99), + popup_warning_bg = hsl(27, 90, 99), + popup_info_bg = hsl(112, 90, 99), + popup_hint_bg = hsl(112, 90, 99), + + add = hsl(84, 50, 80), + add_quarter = hsl(84, 80, 95), + change = hsl(41, 80, 80), + change_quarter = hsl(224, 100, 85), + delete = hsl(350, 100, 40), + delete_quarter = hsl(350, 100, 85), + + dialog_bg = hsl(224, 5, 92), + selection = hsl(270, 75, 92), + highlight_subtle = hsl(0, 0, 94), + highlight_intense = hsl(42, 100, 30), + dimmed = hsl(0, 0, 80), + dimmed_subtle = hsl(0, 0, 20), + }, + + dark = { + background = hsl(216, 28, 7), + foreground = hsl(0, 0, 80), + dimmed = hsl(0, 0, 25), + dimmed_subtle = hsl(0, 0, 50), + highlight_subtle = hsl(0, 0, 6), + highlight_intense = hsl(58, 100, 60), + + string = hsl(96, 50, 70), + comment = hsl(220, 50, 60), + comment_error = hsl(2, 85, 50), + + diagnostic_error = hsl(353, 100, 45), + diagnostic_warning = hsl(30, 100, 50), + diagnostic_info = hsl(176, 80, 60), + diagnostic_hint = hsl(176, 80, 60), + + popup_error_bg = hsl(0, 95, 7), + popup_warning_bg = hsl(27, 95, 7), + popup_info_bg = hsl(112, 95, 7), + popup_hint_bg = hsl(112, 95, 7), + + add = hsl(100, 100, 12), + add_quarter = hsl(84, 80, 15), + change = hsl(41, 100, 15), + change_quarter = hsl(224, 100, 15), + delete = hsl(350, 100, 40), + delete_quarter = hsl(350, 100, 15), + + dialog_bg = hsl(216, 25, 20), + + selection = hsl(270, 50, 33), + }, +} + +local c = colors[vim.o.background] + +local theme = { + Normal = { fg = c.foreground, bg = c.background }, + + Constant = { link = "NormalNC" }, + Delimiter = { link = "NormalNC" }, + Identifier = { link = "NormalNC" }, + Keyword = { fg = c.foreground, bold = true }, + Operator = { link = "NormalNC" }, + Special = { link = "NormalNC" }, + Type = { link = "NormalNC" }, + + String = { fg = c.string }, + + Comment = { fg = c.comment, italic = true, bold = true }, + CommentError = { fg = c.comment_error, italic = true, bold = true }, + ["@comment.note"] = { link = "Comment" }, + ["@comment.todo"] = { link = "CommentError" }, + ["@comment.error"] = { link = "CommentError" }, + ["@comment.warning"] = { link = "CommentError" }, + + DiffAdd = { fg = c.add, bg = c.add_quarter }, + GitSignsAdd = { fg = c.add, bg = c.background }, + GitSignsAddNr = { link = "DiffAdd" }, + DiffChange = { fg = c.change, bg = c.change_quarter }, + GitSignsChange = { fg = c.change, bg = c.background }, + GitSignsChangeNr = { link = "DiffChange" }, + DiffDelete = { fg = c.delete, bg = c.delete_quarter }, + GitSignsDelete = { fg = c.delete, bg = c.background }, + GitSignsDeleteNr = { link = "DiffDelete" }, + + -- Treesitter + ["@function"] = { link = "NormalNC" }, + ["@special"] = { link = "NormalNC" }, + ["@variable"] = { link = "NormalNC" }, + ["@lsp.type.variable"] = { fg = c.dimmed_subtle }, + + -- UI Elements + CursorLine = { bg = c.highlight_subtle }, + + DiagnosticError = { fg = c.diagnostic_error, italic = true }, + DiagnosticFloatingError = { fg = c.diagnostic_error, bg = c.popup_error_bg }, + DiagnosticFloatingWarn = { fg = c.diagnostic_warning, bg = c.popup_warning_bg }, + DiagnosticFloatingInfo = { fg = c.diagnostic_info, bg = c.popup_info_bg }, + DiagnosticFloatingHint = { fg = c.diagnostic_hint, bg = c.popup_hint_bg }, + DiagnosticUnderlineError = { fg = c.diagnostic_error, undercurl = true }, + DiagnosticUnderlineWarn = { fg = c.diagnostic_warn, undercurl = true }, + DiagnosticUnderlineInfo = { fg = c.diagnostic_info, undercurl = true }, + DiagnosticUnderlinehint = { fg = c.diagnostic_hint, undercurl = true }, + + DiagnosticSignError = { fg = c.diagnostic_error }, + DiagnosticSignHint = { fg = c.diagnostic_hint }, + DiagnosticSignInfo = { fg = c.diagnostic_info }, + DiagnosticSignWarn = { fg = c.diagnostic_warning }, + LineNr = { fg = c.dimmed, italic = true }, + IndentLine = { fg = c.background }, + IndentLineCurrent = { fg = c.dimmed }, + TreesitterContext = { reverse = true }, + TreesitterContextLineNumber = { bg = c.dimmed, reverse = true, italic = true }, + InclineNormal = { bg = c.background }, + InclineNormalNC = { bg = c.background }, + + WinSeparator = { bg = c.dialog_bg }, + NormalFloat = { bg = c.dialog_bg }, + Title = { fg = c.foreground, bold = true }, + + NoiceMini = { fg = c.foreground, italic = true }, + + TelescopeNormal = { fg = c.foreground, bg = c.background }, + TelescopeBorder = { bold = true }, + TelescopeSelection = { bg = c.selection }, + TelescopeResultsNormal = { fg = c.foreground, bold = true }, + TelescopeResultsComment = { fg = c.dimmed_subtle, italic = true, bold = false }, + + Visual = { bg = c.selection }, + LspReferenceText = { fg = c.highlight_intense, undercurl = true }, +} + +vim.cmd("hi clear") + +if vim.fn.exists("syntax_on") == 1 then + vim.cmd("syntax reset") +end + +for group, hl in pairs(theme) do + vim.api.nvim_set_hl(0, group, hl) +end + +vim.g.colors_name = "dieter" diff --git a/lua/sumi-e/init.lua b/lua/sumi-e/init.lua deleted file mode 100644 index 0b26bca..0000000 --- a/lua/sumi-e/init.lua +++ /dev/null @@ -1,70 +0,0 @@ -local colors = { - light = { - foreground = "#202020", - intense = "#000000", - primary = "#ff0000", - secondary = "#00ff00", - diagnostic_error = "#ff0038", - diagnostic_warning = "#ff7700", - diagnostic_info = "#47eae0", - diagnostic_hint = "#47eae0", - diff_add = "#00ff77", - diff_change = "#47eae0", - diff_delete = "#ff0038", - highlight_subtle = "#f0f0f0", - dimmed = "#cccccc", - }, - - dark = { - foreground = "#b2b2b2", - intense = "#e7e7e7", - primary = "#00ff00", - secondary = "#555555", - diagnostic_error = "#ff0038", - diagnostic_warning = "#ff7700", - diagnostic_info = "#47eae0", - diagnostic_hint = "#47eae0", - diff_add = "#00ff77", - diff_change = "#47eae0", - diff_delete = "#ff0038", - dimmed = "#666666", - highlight_subtle = "#101010", - }, -} - -local c = colors[vim.o.background] - -local theme = { - Constant = { fg = c.foreground }, - Delimiter = { fg = c.foreground }, - Identifier = { fg = c.foreground }, - Normal = { fg = c.foreground }, - Keyword = { fg = c.foreground, bold = true }, - Operator = { fg = c.foreground }, - Special = { fg = c.foreground }, - String = { fg = c.foreground }, - Type = { fg = c.foreground }, - ["@function"] = { fg = c.foreground }, - ["@special"] = { fg = c.foreground }, - ["@variable"] = { fg = c.foreground }, - - -- UI Elements - CursorLine = { bg = c.highlight_subtle }, - LineNr = { fg = c.dimmed, italic = true }, - IndentLine = { fg = "#ffffff" }, - IndentLineCurrent = { fg = c.dimmed }, - TreesitterContext = { reverse = true }, - TreesitterContextLineNumber = { bg = c.dimmed, reverse = true, italic = true }, -} - -vim.cmd("hi clear") - -if vim.fn.exists("syntax_on") == 1 then - vim.cmd("syntax reset") -end - -for group, hl in pairs(theme) do - vim.api.nvim_set_hl(0, group, hl) -end - -vim.g.colors_name = "sumi-e"