diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..283165a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{yaml,yml}] +indent_size = 2 +indent_style = space diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..cd69062 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,54 @@ +name: Bug Report +description: File a bug/issue +title: "bug: " +labels: [bug] +body: + - type: markdown + attributes: + value: | + **Before** reporting an issue, make sure to read the [documentation](https://github.com/rose-pine/neovim) and search [existing issues](https://github.com/rose-pine/neovim/issues). Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/rose-pine/neovim/discussions) and will be closed. + - type: input + attributes: + label: "Neovim version (nvim -v)" + placeholder: "0.8.0 commit db1b0ee3b30f" + validations: + required: true + - type: input + attributes: + label: "Terminal / multiplexer" + placeholder: "Kitty / tmux" + validations: + required: true + - type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. Please include screenshots if possible and any related errors you see in Neovim. + validations: + required: true + - type: textarea + attributes: + label: Repro + description: Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua` + value: | + vim.o.packpath = "/tmp/nvim/site" + + local plugins = { + rose_pine = "https://github.com/rose-pine/neovim", + -- ADD OTHER PLUGINS _NECESSARY_ TO REPRODUCE THE ISSUE + } + + for name, url in pairs(plugins) do + local install_path = "/tmp/nvim/site/pack/test/start/" .. name + if vim.fn.isdirectory(install_path) == 0 then + vim.fn.system({ "git", "clone", "--depth=1", url, install_path }) + end + end + + require("rose-pine").setup({ + -- ADD ROSÉ PINE CONFIG THAT IS _NECESSARY_ TO REPRODUCE THE ISSUE + }) + + vim.cmd("colorscheme rose-pine") + render: Lua + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..bd9d3f6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,17 @@ +name: Feature Request +description: Suggest a new feature +title: "feature: " +labels: [enhancement] +body: + - type: textarea + validations: + required: true + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + - type: textarea + validations: + required: false + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. diff --git a/.stylua.toml b/.stylua.toml deleted file mode 100644 index 48e35ae..0000000 --- a/.stylua.toml +++ /dev/null @@ -1,6 +0,0 @@ -column_width = 100 -indent_type = "Tabs" -indent_width = 3 -line_endings = "Unix" -quote_style = "AutoPreferSingle" - diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..bd583ba --- /dev/null +++ b/changelog.md @@ -0,0 +1,82 @@ +# Changelog + +## v2.0.0-next.1 + +### What's new + +- Add proper support for `StatusLineTerm` & `StatusLineTermNC`, controlled via `enable.terminal` +- Add background glow to diagnostic virtual text +- Add `extend_background_behind_borders` +- Add `styles.bold` and alternatively styling when disabled +- Add `before_highlight` hook to allow changing palette values and behaviours +- Increase contrast of search, visual selections, and more + +### Features + +**extend_background_behind_borders** + +Extend float backgrounds behind borders. Results vary depending on your border characters. + +```lua +{ + extend_background_behind_borders = true +} +``` + +**styles.transparency** + +Enable a unique experience focused around transparent terminals, avoiding large backgrounds and differentiating selections with foreground colours when possible. + +```lua +{ + styles = { + transparency = true + } +} +``` + +**before_highlight** + +```lua +{ + before_highlight = function(group, highlight, palette) + -- Disable all undercurls + if highlight.undercurl then + highlight.undercurl = false + end + + -- Change palette colour + if highlight.fg == palette.pine then + highlight.fg = palette.foam + end + end, +} +``` + +### Breaking changes + +> [!WARNING] +> Removed or renamed options should continue to work via internal migrations but backwards compatibility is not tested and may break at any time. + +```diff +- dim_nc_background = true, ++ dim_inactive_windows = true, + +- disable_background = true, +- disable_float_background = true, ++ styles.transparency = true + +- disable_italics = true, ++ styles.italic = false, + +- groups = { +- background = "...", +- comment = "...", +- punctuation = "...", +- }, ++ highlight_groups = { ++ Normal = { bg = "..." }, ++ Comment = { fg = "..." }, ++ ["@punctuation"] = { fg = "..." }, ++ } +``` diff --git a/colors/rose-pine-dawn.lua b/colors/rose-pine-dawn.lua new file mode 100644 index 0000000..a95b327 --- /dev/null +++ b/colors/rose-pine-dawn.lua @@ -0,0 +1,2 @@ +package.loaded["rose-pine.palette"] = nil +require("rose-pine").colorscheme("dawn") diff --git a/colors/rose-pine-main.lua b/colors/rose-pine-main.lua new file mode 100644 index 0000000..15729c9 --- /dev/null +++ b/colors/rose-pine-main.lua @@ -0,0 +1,2 @@ +package.loaded["rose-pine.palette"] = nil +require("rose-pine").colorscheme("main") diff --git a/colors/rose-pine-moon.lua b/colors/rose-pine-moon.lua new file mode 100644 index 0000000..34b58c0 --- /dev/null +++ b/colors/rose-pine-moon.lua @@ -0,0 +1,2 @@ +package.loaded["rose-pine.palette"] = nil +require("rose-pine").colorscheme("moon") diff --git a/colors/rose-pine.lua b/colors/rose-pine.lua new file mode 100644 index 0000000..f705290 --- /dev/null +++ b/colors/rose-pine.lua @@ -0,0 +1,2 @@ +package.loaded["rose-pine.palette"] = nil +require("rose-pine").colorscheme() diff --git a/colors/rose-pine.vim b/colors/rose-pine.vim deleted file mode 100644 index af1ddba..0000000 --- a/colors/rose-pine.vim +++ /dev/null @@ -1,6 +0,0 @@ -lua package.loaded['rose-pine'] = nil -lua package.loaded['rose-pine.config'] = nil -lua package.loaded['rose-pine.palette'] = nil -lua package.loaded['rose-pine.theme'] = nil - -lua require('rose-pine').colorscheme() diff --git a/license b/license new file mode 100644 index 0000000..590df78 --- /dev/null +++ b/license @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Rosé Pine + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lua/lualine/themes/rose-pine-alt.lua b/lua/lualine/themes/rose-pine-alt.lua index 1e1ee36..287144f 100644 --- a/lua/lualine/themes/rose-pine-alt.lua +++ b/lua/lualine/themes/rose-pine-alt.lua @@ -1,26 +1,32 @@ -local p = require('rose-pine.palette') +local p = require("rose-pine.palette") +local config = require("rose-pine.config") + +local bg_base = p.base +if config.options.styles.transparency then + bg_base = "NONE" +end return { normal = { - a = { bg = p.surface, fg = p.rose, gui = 'bold' }, + a = { bg = p.surface, fg = p.rose, gui = "bold" }, b = { bg = p.surface, fg = p.text }, - c = { bg = p.surface, fg = p.subtle, gui = 'italic' }, + c = { bg = p.surface, fg = p.subtle, gui = "italic" }, }, insert = { - a = { bg = p.surface, fg = p.foam, gui = 'bold' }, + a = { bg = p.surface, fg = p.foam, gui = "bold" }, }, visual = { - a = { bg = p.surface, fg = p.iris, gui = 'bold' }, + a = { bg = p.surface, fg = p.iris, gui = "bold" }, }, replace = { - a = { bg = p.surface, fg = p.pine, gui = 'bold' }, + a = { bg = p.surface, fg = p.pine, gui = "bold" }, }, command = { - a = { bg = p.surface, fg = p.love, gui = 'bold' }, + a = { bg = p.surface, fg = p.love, gui = "bold" }, }, inactive = { - a = { bg = p.base, fg = p.subtle, gui = 'bold' }, - b = { bg = p.base, fg = p.subtle }, - c = { bg = p.base, fg = p.subtle, gui = 'italic' }, + a = { bg = bg_base, fg = p.subtle, gui = "bold" }, + b = { bg = bg_base, fg = p.subtle }, + c = { bg = bg_base, fg = p.subtle, gui = "italic" }, }, } diff --git a/lua/lualine/themes/rose-pine.lua b/lua/lualine/themes/rose-pine.lua index dde3075..e409130 100644 --- a/lua/lualine/themes/rose-pine.lua +++ b/lua/lualine/themes/rose-pine.lua @@ -1,34 +1,40 @@ -local p = require('rose-pine.palette') +local p = require("rose-pine.palette") +local config = require("rose-pine.config") + +local bg_base = p.surface +if config.options.styles.transparency then + bg_base = "NONE" +end return { normal = { - a = { bg = p.rose, fg = p.base, gui = 'bold' }, + a = { bg = p.rose, fg = p.base, gui = "bold" }, b = { bg = p.overlay, fg = p.rose }, - c = { bg = p.base, fg = p.text }, + c = { bg = bg_base, fg = p.text }, }, insert = { - a = { bg = p.foam, fg = p.base, gui = 'bold' }, + a = { bg = p.foam, fg = p.base, gui = "bold" }, b = { bg = p.overlay, fg = p.foam }, - c = { bg = p.base, fg = p.text }, + c = { bg = bg_base, fg = p.text }, }, visual = { - a = { bg = p.iris, fg = p.base, gui = 'bold' }, + a = { bg = p.iris, fg = p.base, gui = "bold" }, b = { bg = p.overlay, fg = p.iris }, - c = { bg = p.base, fg = p.text }, + c = { bg = bg_base, fg = p.text }, }, replace = { - a = { bg = p.pine, fg = p.base, gui = 'bold' }, + a = { bg = p.pine, fg = p.base, gui = "bold" }, b = { bg = p.overlay, fg = p.pine }, - c = { bg = p.base, fg = p.text }, + c = { bg = bg_base, fg = p.text }, }, command = { - a = { bg = p.love, fg = p.base, gui = 'bold' }, + a = { bg = p.love, fg = p.base, gui = "bold" }, b = { bg = p.overlay, fg = p.love }, - c = { bg = p.base, fg = p.text }, + c = { bg = bg_base, fg = p.text }, }, inactive = { - a = { bg = p.base, fg = p.muted, gui = 'bold' }, - b = { bg = p.base, fg = p.muted }, - c = { bg = p.base, fg = p.muted }, + a = { bg = bg_base, fg = p.muted, gui = "bold" }, + b = { bg = bg_base, fg = p.muted }, + c = { bg = bg_base, fg = p.muted }, }, } diff --git a/lua/rose-pine.lua b/lua/rose-pine.lua new file mode 100644 index 0000000..f10ffcd --- /dev/null +++ b/lua/rose-pine.lua @@ -0,0 +1,1242 @@ +local M = {} +local config = require("rose-pine.config") + +local function set_highlights() + local utilities = require("rose-pine.utilities") + local palette = require("rose-pine.palette") + local styles = config.options.styles + + local groups = {} + for group, color in pairs(config.options.groups) do + groups[group] = utilities.parse_color(color) + end + + local function make_border(fg) + fg = fg or groups.border + return { + fg = fg, + bg = (config.options.extend_background_behind_borders and not styles.transparency) and palette.surface + or "NONE", + } + end + + local highlights = {} + local legacy_highlights = { + ["@attribute.diff"] = { fg = palette.gold }, + ["@boolean"] = { link = "Boolean" }, + ["@class"] = { fg = palette.foam }, + ["@conditional"] = { link = "Conditional" }, + ["@field"] = { fg = palette.foam }, + ["@include"] = { link = "Include" }, + ["@interface"] = { fg = palette.foam }, + ["@macro"] = { link = "Macro" }, + ["@method"] = { fg = palette.rose }, + ["@namespace"] = { link = "Include" }, + ["@number"] = { link = "Number" }, + ["@parameter"] = { fg = palette.iris, italic = styles.italic }, + ["@preproc"] = { link = "PreProc" }, + ["@punctuation"] = { fg = palette.subtle }, + ["@punctuation.bracket"] = { link = "@punctuation" }, + ["@punctuation.delimiter"] = { link = "@punctuation" }, + ["@punctuation.special"] = { link = "@punctuation" }, + ["@regexp"] = { link = "String" }, + ["@repeat"] = { link = "Repeat" }, + ["@storageclass"] = { link = "StorageClass" }, + ["@symbol"] = { link = "Identifier" }, + ["@text"] = { fg = palette.text }, + ["@text.danger"] = { fg = groups.error }, + ["@text.diff.add"] = { fg = groups.git_add, bg = groups.git_add, blend = 20 }, + ["@text.diff.delete"] = { fg = groups.git_delete, bg = groups.git_delete, blend = 20 }, + ["@text.emphasis"] = { italic = styles.italic }, + ["@text.environment"] = { link = "Macro" }, + ["@text.environment.name"] = { link = "Type" }, + ["@text.math"] = { link = "Special" }, + ["@text.note"] = { link = "SpecialComment" }, + ["@text.strike"] = { strikethrough = true }, + ["@text.strong"] = { bold = styles.bold }, + ["@text.title"] = { link = "Title" }, + ["@text.title.1.markdown"] = { link = "markdownH1" }, + ["@text.title.1.marker.markdown"] = { link = "markdownH1Delimiter" }, + ["@text.title.2.markdown"] = { link = "markdownH2" }, + ["@text.title.2.marker.markdown"] = { link = "markdownH2Delimiter" }, + ["@text.title.3.markdown"] = { link = "markdownH3" }, + ["@text.title.3.marker.markdown"] = { link = "markdownH3Delimiter" }, + ["@text.title.4.markdown"] = { link = "markdownH4" }, + ["@text.title.4.marker.markdown"] = { link = "markdownH4Delimiter" }, + ["@text.title.5.markdown"] = { link = "markdownH5" }, + ["@text.title.5.marker.markdown"] = { link = "markdownH5Delimiter" }, + ["@text.title.6.markdown"] = { link = "markdownH6" }, + ["@text.title.6.marker.markdown"] = { link = "markdownH6Delimiter" }, + ["@text.underline"] = { underline = true }, + ["@text.uri"] = { fg = groups.link }, + ["@text.warning"] = { fg = groups.warn }, + ["@todo"] = { link = "Todo" }, + + -- lukas-reineke/indent-blankline.nvim + IndentBlanklineChar = { fg = palette.muted, nocombine = true }, + IndentBlanklineSpaceChar = { fg = palette.muted, nocombine = true }, + IndentBlanklineSpaceCharBlankline = { fg = palette.muted, nocombine = true }, + } + local default_highlights = { + ColorColumn = { bg = palette.surface }, + Conceal = { bg = "NONE" }, + CurSearch = { fg = palette.base, bg = palette.gold }, + Cursor = { fg = palette.text, bg = palette.highlight_high }, + CursorColumn = { bg = palette.overlay }, + -- CursorIM = {}, + CursorLine = { bg = palette.overlay }, + CursorLineNr = { fg = palette.text, bold = styles.bold }, + -- DarkenedPanel = { }, + -- DarkenedStatusline = {}, + DiffAdd = { bg = groups.git_add, blend = 20 }, + DiffChange = { bg = groups.git_change, blend = 20 }, + DiffDelete = { bg = groups.git_delete, blend = 20 }, + DiffText = { bg = groups.git_text, blend = 40 }, + diffAdded = { link = "DiffAdd" }, + diffChanged = { link = "DiffChange" }, + diffRemoved = { link = "DiffDelete" }, + Directory = { fg = palette.foam, bold = styles.bold }, + -- EndOfBuffer = {}, + ErrorMsg = { fg = groups.error, bold = styles.bold }, + FloatBorder = make_border(), + FloatTitle = { fg = palette.foam, bg = groups.panel, bold = styles.bold }, + FoldColumn = { fg = palette.muted }, + Folded = { fg = palette.text, bg = groups.panel }, + IncSearch = { link = "CurSearch" }, + LineNr = { fg = palette.muted }, + MatchParen = { fg = palette.pine, bg = palette.pine, blend = 25 }, + ModeMsg = { fg = palette.subtle }, + MoreMsg = { fg = palette.iris }, + NonText = { fg = palette.muted }, + Normal = { fg = palette.text, bg = palette.base }, + NormalFloat = { bg = groups.panel }, + NormalNC = { fg = palette.text, bg = config.options.dim_inactive_windows and palette._nc or palette.base }, + NvimInternalError = { link = "ErrorMsg" }, + Pmenu = { fg = palette.subtle, bg = groups.panel }, + PmenuExtra = { fg = palette.muted, bg = groups.panel }, + PmenuExtraSel = { fg = palette.subtle, bg = palette.overlay }, + PmenuKind = { fg = palette.foam, bg = groups.panel }, + PmenuKindSel = { fg = palette.subtle, bg = palette.overlay }, + PmenuSbar = { bg = groups.panel }, + PmenuSel = { fg = palette.text, bg = palette.overlay }, + PmenuThumb = { bg = palette.muted }, + Question = { fg = palette.gold }, + QuickFixLine = { fg = palette.foam }, + -- RedrawDebugNormal = {}, + RedrawDebugClear = { fg = palette.base, bg = palette.gold }, + RedrawDebugComposed = { fg = palette.base, bg = palette.pine }, + RedrawDebugRecompose = { fg = palette.base, bg = palette.love }, + Search = { fg = palette.text, bg = palette.gold, blend = 20 }, + SignColumn = { fg = palette.text, bg = "NONE" }, + SpecialKey = { fg = palette.foam }, + SpellBad = { sp = palette.subtle, undercurl = true }, + SpellCap = { sp = palette.subtle, undercurl = true }, + SpellLocal = { sp = palette.subtle, undercurl = true }, + SpellRare = { sp = palette.subtle, undercurl = true }, + StatusLine = { fg = palette.subtle, bg = groups.panel }, + StatusLineNC = { fg = palette.muted, bg = groups.panel, blend = 60 }, + StatusLineTerm = { fg = palette.base, bg = palette.pine }, + StatusLineTermNC = { fg = palette.base, bg = palette.pine, blend = 60 }, + Substitute = { link = "IncSearch" }, + TabLine = { fg = palette.subtle, bg = groups.panel }, + TabLineFill = { bg = groups.panel }, + TabLineSel = { fg = palette.text, bg = palette.overlay, bold = styles.bold }, + Title = { fg = palette.foam, bold = styles.bold }, + VertSplit = { fg = groups.border }, + Visual = { bg = palette.iris, blend = 15 }, + -- VisualNOS = {}, + WarningMsg = { fg = groups.warn, bold = styles.bold }, + -- Whitespace = {}, + WildMenu = { link = "IncSearch" }, + WinBar = { fg = palette.subtle, bg = groups.panel }, + WinBarNC = { fg = palette.muted, bg = groups.panel, blend = 60 }, + WinSeparator = { fg = groups.border }, + + DiagnosticError = { fg = groups.error }, + DiagnosticHint = { fg = groups.hint }, + DiagnosticInfo = { fg = groups.info }, + DiagnosticOk = { fg = groups.ok }, + DiagnosticWarn = { fg = groups.warn }, + DiagnosticDefaultError = { link = "DiagnosticError" }, + DiagnosticDefaultHint = { link = "DiagnosticHint" }, + DiagnosticDefaultInfo = { link = "DiagnosticInfo" }, + DiagnosticDefaultOk = { link = "DiagnosticOk" }, + DiagnosticDefaultWarn = { link = "DiagnosticWarn" }, + DiagnosticFloatingError = { link = "DiagnosticError" }, + DiagnosticFloatingHint = { link = "DiagnosticHint" }, + DiagnosticFloatingInfo = { link = "DiagnosticInfo" }, + DiagnosticFloatingOk = { link = "DiagnosticOk" }, + DiagnosticFloatingWarn = { link = "DiagnosticWarn" }, + DiagnosticSignError = { link = "DiagnosticError" }, + DiagnosticSignHint = { link = "DiagnosticHint" }, + DiagnosticSignInfo = { link = "DiagnosticInfo" }, + DiagnosticSignOk = { link = "DiagnosticOk" }, + DiagnosticSignWarn = { link = "DiagnosticWarn" }, + DiagnosticUnderlineError = { sp = groups.error, undercurl = true }, + DiagnosticUnderlineHint = { sp = groups.hint, undercurl = true }, + DiagnosticUnderlineInfo = { sp = groups.info, undercurl = true }, + DiagnosticUnderlineOk = { sp = groups.ok, undercurl = true }, + DiagnosticUnderlineWarn = { sp = groups.warn, undercurl = true }, + DiagnosticVirtualTextError = { fg = groups.error, bg = groups.error, blend = 10 }, + DiagnosticVirtualTextHint = { fg = groups.hint, bg = groups.hint, blend = 10 }, + DiagnosticVirtualTextInfo = { fg = groups.info, bg = groups.info, blend = 10 }, + DiagnosticVirtualTextOk = { fg = groups.ok, bg = groups.ok, blend = 10 }, + DiagnosticVirtualTextWarn = { fg = groups.warn, bg = groups.warn, blend = 10 }, + + Boolean = { fg = palette.rose }, + Character = { fg = palette.gold }, + Comment = { fg = palette.subtle, italic = styles.italic }, + Conditional = { fg = palette.pine }, + Constant = { fg = palette.gold }, + Debug = { fg = palette.rose }, + Define = { fg = palette.iris }, + Delimiter = { fg = palette.subtle }, + Error = { fg = palette.love }, + Exception = { fg = palette.pine }, + Float = { fg = palette.gold }, + Function = { fg = palette.rose }, + Identifier = { fg = palette.text }, + Include = { fg = palette.pine }, + Keyword = { fg = palette.pine }, + Label = { fg = palette.foam }, + LspCodeLens = { fg = palette.subtle }, + LspCodeLensSeparator = { fg = palette.muted }, + LspInlayHint = { fg = palette.muted, bg = palette.muted, blend = 10 }, + LspReferenceRead = { bg = palette.highlight_med }, + LspReferenceText = { bg = palette.highlight_med }, + LspReferenceWrite = { bg = palette.highlight_med }, + Macro = { fg = palette.iris }, + Number = { fg = palette.gold }, + Operator = { fg = palette.subtle }, + PreCondit = { fg = palette.iris }, + PreProc = { link = "PreCondit" }, + Repeat = { fg = palette.pine }, + Special = { fg = palette.foam }, + SpecialChar = { link = "Special" }, + SpecialComment = { fg = palette.iris }, + Statement = { fg = palette.pine, bold = styles.bold }, + StorageClass = { fg = palette.foam }, + String = { fg = palette.gold }, + Structure = { fg = palette.foam }, + Tag = { fg = palette.foam }, + Todo = { fg = palette.rose, bg = palette.rose, blend = 20 }, + Type = { fg = palette.foam }, + TypeDef = { link = "Type" }, + Underlined = { fg = palette.iris, underline = true }, + + healthError = { fg = groups.error }, + healthSuccess = { fg = groups.info }, + healthWarning = { fg = groups.warn }, + + htmlArg = { fg = palette.iris }, + htmlBold = { bold = styles.bold }, + htmlEndTag = { fg = palette.subtle }, + htmlH1 = { link = "markdownH1" }, + htmlH2 = { link = "markdownH2" }, + htmlH3 = { link = "markdownH3" }, + htmlH4 = { link = "markdownH4" }, + htmlH5 = { link = "markdownH5" }, + htmlItalic = { italic = styles.italic }, + htmlLink = { link = "markdownUrl" }, + htmlTag = { fg = palette.subtle }, + htmlTagN = { fg = palette.text }, + htmlTagName = { fg = palette.foam }, + + markdownDelimiter = { fg = palette.subtle }, + markdownH1 = { fg = groups.h1, bold = styles.bold }, + markdownH1Delimiter = { link = "markdownH1" }, + markdownH2 = { fg = groups.h2, bold = styles.bold }, + markdownH2Delimiter = { link = "markdownH2" }, + markdownH3 = { fg = groups.h3, bold = styles.bold }, + markdownH3Delimiter = { link = "markdownH3" }, + markdownH4 = { fg = groups.h4, bold = styles.bold }, + markdownH4Delimiter = { link = "markdownH4" }, + markdownH5 = { fg = groups.h5, bold = styles.bold }, + markdownH5Delimiter = { link = "markdownH5" }, + markdownH6 = { fg = groups.h6, bold = styles.bold }, + markdownH6Delimiter = { link = "markdownH6" }, + markdownLinkText = { link = "markdownUrl" }, + markdownUrl = { fg = groups.link, sp = groups.link, underline = true }, + + mkdCode = { fg = palette.foam, italic = styles.italic }, + mkdCodeDelimiter = { fg = palette.rose }, + mkdCodeEnd = { fg = palette.foam }, + mkdCodeStart = { fg = palette.foam }, + mkdFootnotes = { fg = palette.foam }, + mkdID = { fg = palette.foam, underline = true }, + mkdInlineURL = { link = "markdownUrl" }, + mkdLink = { link = "markdownUrl" }, + mkdLinkDef = { link = "markdownUrl" }, + mkdListItemLine = { fg = palette.text }, + mkdRule = { fg = palette.subtle }, + mkdURL = { link = "markdownUrl" }, + + --- Treesitter + --- |:help treesitter-highlight-groups| + ["@variable"] = { fg = palette.text, italic = styles.italic }, + ["@variable.builtin"] = { fg = palette.love, italic = styles.italic, bold = styles.bold }, + ["@variable.parameter"] = { fg = palette.iris, italic = styles.italic }, + ["@variable.parameter.builtin"] = { fg = palette.iris, italic = styles.italic, bold = styles.bold }, + ["@variable.member"] = { fg = palette.foam }, + + ["@constant"] = { fg = palette.gold }, + ["@constant.builtin"] = { fg = palette.gold, bold = styles.bold }, + ["@constant.macro"] = { fg = palette.gold }, + + ["@module"] = { fg = palette.text }, + ["@module.builtin"] = { fg = palette.text, bold = styles.bold }, + ["@label"] = { link = "Label" }, + + ["@string"] = { link = "String" }, + -- ["@string.documentation"] = {}, + ["@string.regexp"] = { fg = palette.iris }, + ["@string.escape"] = { fg = palette.pine }, + ["@string.special"] = { link = "String" }, + ["@string.special.symbol"] = { link = "Identifier" }, + ["@string.special.url"] = { fg = groups.link }, + -- ["@string.special.path"] = {}, + + ["@character"] = { link = "Character" }, + ["@character.special"] = { link = "Character" }, + + ["@boolean"] = { link = "Boolean" }, + ["@number"] = { link = "Number" }, + ["@number.float"] = { link = "Number" }, + ["@float"] = { link = "Number" }, + + ["@type"] = { fg = palette.foam }, + ["@type.builtin"] = { fg = palette.foam, bold = styles.bold }, + -- ["@type.definition"] = {}, + + ["@attribute"] = { fg = palette.iris }, + ["@attribute.builtin"] = { fg = palette.iris, bold = styles.bold }, + ["@property"] = { fg = palette.foam, italic = styles.italic }, + + ["@function"] = { fg = palette.rose }, + ["@function.builtin"] = { fg = palette.rose, bold = styles.bold }, + -- ["@function.call"] = {}, + ["@function.macro"] = { link = "Function" }, + + ["@function.method"] = { fg = palette.rose }, + ["@function.method.call"] = { fg = palette.iris }, + + ["@constructor"] = { fg = palette.foam }, + ["@operator"] = { link = "Operator" }, + + ["@keyword"] = { link = "Keyword" }, + -- ["@keyword.coroutine"] = {}, + -- ["@keyword.function"] = {}, + ["@keyword.operator"] = { fg = palette.subtle }, + ["@keyword.import"] = { fg = palette.pine }, + ["@keyword.storage"] = { fg = palette.foam }, + ["@keyword.repeat"] = { fg = palette.pine }, + ["@keyword.return"] = { fg = palette.pine }, + ["@keyword.debug"] = { fg = palette.rose }, + ["@keyword.exception"] = { fg = palette.pine }, + + ["@keyword.conditional"] = { fg = palette.pine }, + ["@keyword.conditional.ternary"] = { fg = palette.pine }, + + ["@keyword.directive"] = { fg = palette.iris }, + ["@keyword.directive.define"] = { fg = palette.iris }, + + --- Punctuation + ["@punctuation.delimiter"] = { fg = palette.subtle }, + ["@punctuation.bracket"] = { fg = palette.subtle }, + ["@punctuation.special"] = { fg = palette.subtle }, + + --- Comments + ["@comment"] = { link = "Comment" }, + -- ["@comment.documentation"] = {}, + + ["@comment.error"] = { fg = groups.error }, + ["@comment.warning"] = { fg = groups.warn }, + ["@comment.todo"] = { fg = groups.todo, bg = groups.todo, blend = 15 }, + ["@comment.hint"] = { fg = groups.hint, bg = groups.hint, blend = 15 }, + ["@comment.info"] = { fg = groups.info, bg = groups.info, blend = 15 }, + ["@comment.note"] = { fg = groups.note, bg = groups.note, blend = 15 }, + + --- Markup + ["@markup.strong"] = { bold = styles.bold }, + ["@markup.italic"] = { italic = styles.italic }, + ["@markup.strikethrough"] = { strikethrough = true }, + ["@markup.underline"] = { underline = true }, + + ["@markup.heading"] = { fg = palette.foam, bold = styles.bold }, + + ["@markup.quote"] = { fg = palette.text }, + ["@markup.math"] = { link = "Special" }, + ["@markup.environment"] = { link = "Macro" }, + ["@markup.environment.name"] = { link = "@type" }, + + -- ["@markup.link"] = {}, + ["@markup.link.markdown_inline"] = { fg = palette.subtle }, + ["@markup.link.label.markdown_inline"] = { fg = palette.foam }, + ["@markup.link.url"] = { fg = groups.link }, + + -- ["@markup.raw"] = { bg = palette.surface }, + -- ["@markup.raw.block"] = { bg = palette.surface }, + ["@markup.raw.delimiter.markdown"] = { fg = palette.subtle }, + + ["@markup.list"] = { fg = palette.pine }, + ["@markup.list.checked"] = { fg = palette.foam, bg = palette.foam, blend = 10 }, + ["@markup.list.unchecked"] = { fg = palette.text }, + + -- Markdown headings + ["@markup.heading.1.markdown"] = { link = "markdownH1" }, + ["@markup.heading.2.markdown"] = { link = "markdownH2" }, + ["@markup.heading.3.markdown"] = { link = "markdownH3" }, + ["@markup.heading.4.markdown"] = { link = "markdownH4" }, + ["@markup.heading.5.markdown"] = { link = "markdownH5" }, + ["@markup.heading.6.markdown"] = { link = "markdownH6" }, + ["@markup.heading.1.marker.markdown"] = { link = "markdownH1Delimiter" }, + ["@markup.heading.2.marker.markdown"] = { link = "markdownH2Delimiter" }, + ["@markup.heading.3.marker.markdown"] = { link = "markdownH3Delimiter" }, + ["@markup.heading.4.marker.markdown"] = { link = "markdownH4Delimiter" }, + ["@markup.heading.5.marker.markdown"] = { link = "markdownH5Delimiter" }, + ["@markup.heading.6.marker.markdown"] = { link = "markdownH6Delimiter" }, + + ["@diff.plus"] = { fg = groups.git_add, bg = groups.git_add, blend = 20 }, + ["@diff.minus"] = { fg = groups.git_delete, bg = groups.git_delete, blend = 20 }, + ["@diff.delta"] = { bg = groups.git_change, blend = 20 }, + + ["@tag"] = { link = "Tag" }, + ["@tag.attribute"] = { fg = palette.iris }, + ["@tag.delimiter"] = { fg = palette.subtle }, + + --- Non-highlighting captures + -- ["@none"] = {}, + ["@conceal"] = { link = "Conceal" }, + ["@conceal.markdown"] = { fg = palette.subtle }, + + -- ["@spell"] = {}, + -- ["@nospell"] = {}, + + --- Semantic + ["@lsp.type.comment"] = {}, + ["@lsp.type.comment.c"] = { link = "@comment" }, + ["@lsp.type.comment.cpp"] = { link = "@comment" }, + ["@lsp.type.enum"] = { link = "@type" }, + ["@lsp.type.interface"] = { link = "@interface" }, + ["@lsp.type.keyword"] = { link = "@keyword" }, + ["@lsp.type.namespace"] = { link = "@namespace" }, + ["@lsp.type.namespace.python"] = { link = "@variable" }, + ["@lsp.type.parameter"] = { link = "@parameter" }, + ["@lsp.type.property"] = { link = "@property" }, + ["@lsp.type.variable"] = {}, -- defer to treesitter for regular variables + ["@lsp.type.variable.svelte"] = { link = "@variable" }, + ["@lsp.typemod.function.defaultLibrary"] = { link = "@function.builtin" }, + ["@lsp.typemod.operator.injected"] = { link = "@operator" }, + ["@lsp.typemod.string.injected"] = { link = "@string" }, + ["@lsp.typemod.variable.constant"] = { link = "@constant" }, + ["@lsp.typemod.variable.defaultLibrary"] = { link = "@variable.builtin" }, + ["@lsp.typemod.variable.injected"] = { link = "@variable" }, + + --- Plugins + -- romgrk/barbar.nvim + BufferCurrent = { fg = palette.text, bg = palette.overlay }, + BufferCurrentIndex = { fg = palette.text, bg = palette.overlay }, + BufferCurrentMod = { fg = palette.foam, bg = palette.overlay }, + BufferCurrentSign = { fg = palette.subtle, bg = palette.overlay }, + BufferCurrentTarget = { fg = palette.gold, bg = palette.overlay }, + BufferInactive = { fg = palette.subtle }, + BufferInactiveIndex = { fg = palette.subtle }, + BufferInactiveMod = { fg = palette.foam }, + BufferInactiveSign = { fg = palette.muted }, + BufferInactiveTarget = { fg = palette.gold }, + BufferTabpageFill = { fg = "NONE", bg = "NONE" }, + BufferVisible = { fg = palette.subtle }, + BufferVisibleIndex = { fg = palette.subtle }, + BufferVisibleMod = { fg = palette.foam }, + BufferVisibleSign = { fg = palette.muted }, + BufferVisibleTarget = { fg = palette.gold }, + + -- lewis6991/gitsigns.nvim + GitSignsAdd = { fg = groups.git_add, bg = "NONE" }, + GitSignsChange = { fg = groups.git_change, bg = "NONE" }, + GitSignsDelete = { fg = groups.git_delete, bg = "NONE" }, + SignAdd = { fg = groups.git_add, bg = "NONE" }, + SignChange = { fg = groups.git_change, bg = "NONE" }, + SignDelete = { fg = groups.git_delete, bg = "NONE" }, + + -- mvllow/modes.nvim + ModesCopy = { bg = palette.gold }, + ModesDelete = { bg = palette.love }, + ModesFormat = { bg = palette.rose }, + ModesInsert = { bg = palette.foam }, + ModesReplace = { bg = palette.pine }, + ModesVisual = { bg = palette.iris }, + + -- kyazdani42/nvim-tree.lua + NvimTreeEmptyFolderName = { fg = palette.muted }, + NvimTreeFileDeleted = { fg = groups.git_delete }, + NvimTreeFileDirty = { fg = groups.git_dirty }, + NvimTreeFileMerge = { fg = groups.git_merge }, + NvimTreeFileNew = { fg = palette.foam }, + NvimTreeFileRenamed = { fg = groups.git_rename }, + NvimTreeFileStaged = { fg = groups.git_stage }, + NvimTreeFolderIcon = { fg = palette.subtle }, + NvimTreeFolderName = { fg = palette.foam }, + NvimTreeGitDeleted = { fg = groups.git_delete }, + NvimTreeGitDirty = { fg = groups.git_dirty }, + NvimTreeGitIgnored = { fg = groups.git_ignore }, + NvimTreeGitMerge = { fg = groups.git_merge }, + NvimTreeGitNew = { fg = groups.git_add }, + NvimTreeGitRenamed = { fg = groups.git_rename }, + NvimTreeGitStaged = { fg = groups.git_stage }, + NvimTreeImageFile = { fg = palette.text }, + NvimTreeNormal = { link = "Normal" }, + NvimTreeOpenedFile = { fg = palette.text, bg = palette.overlay }, + NvimTreeOpenedFolderName = { link = "NvimTreeFolderName" }, + NvimTreeRootFolder = { fg = palette.foam, bold = styles.bold }, + NvimTreeSpecialFile = { link = "NvimTreeNormal" }, + NvimTreeWindowPicker = { link = "StatusLineTerm" }, + + -- nvim-neotest/neotest + NeotestAdapterName = { fg = palette.iris }, + NeotestBorder = { fg = palette.highlight_med }, + NeotestDir = { fg = palette.foam }, + NeotestExpandMarker = { fg = palette.highlight_med }, + NeotestFailed = { fg = palette.love }, + NeotestFile = { fg = palette.text }, + NeotestFocused = { fg = palette.gold, bg = palette.highlight_med }, + NeotestIndent = { fg = palette.highlight_med }, + NeotestMarked = { fg = palette.rose, bold = styles.bold }, + NeotestNamespace = { fg = palette.gold }, + NeotestPassed = { fg = palette.pine }, + NeotestRunning = { fg = palette.gold }, + NeotestWinSelect = { fg = palette.muted }, + NeotestSkipped = { fg = palette.subtle }, + NeotestTarget = { fg = palette.love }, + NeotestTest = { fg = palette.gold }, + NeotestUnknown = { fg = palette.subtle }, + NeotestWatching = { fg = palette.iris }, + + -- nvim-neo-tree/neo-tree.nvim + NeoTreeGitAdded = { fg = groups.git_add }, + NeoTreeGitConflict = { fg = groups.git_merge }, + NeoTreeGitDeleted = { fg = groups.git_delete }, + NeoTreeGitIgnored = { fg = groups.git_ignore }, + NeoTreeGitModified = { fg = groups.git_dirty }, + NeoTreeGitRenamed = { fg = groups.git_rename }, + NeoTreeGitUntracked = { fg = groups.git_untracked }, + NeoTreeTabActive = { fg = palette.text, bg = palette.overlay }, + NeoTreeTabInactive = { fg = palette.subtle }, + NeoTreeTabSeparatorActive = { link = "WinSeparator" }, + NeoTreeTabSeparatorInactive = { link = "WinSeparator" }, + NeoTreeTitleBar = { link = "StatusLineTerm" }, + + -- folke/flash.nvim + FlashLabel = { fg = palette.base, bg = palette.love }, + + -- folke/which-key.nvim + WhichKey = { fg = palette.iris }, + WhichKeyBorder = make_border(), + WhichKeyDesc = { fg = palette.gold }, + WhichKeyFloat = { bg = groups.panel }, + WhichKeyGroup = { fg = palette.foam }, + WhichKeyIcon = { fg = palette.pine }, + WhichKeyIconAzure = { fg = palette.pine }, + WhichKeyIconBlue = { fg = palette.pine }, + WhichKeyIconCyan = { fg = palette.foam }, + WhichKeyIconGreen = { fg = palette.leaf }, + WhichKeyIconGrey = { fg = palette.subtle }, + WhichKeyIconOrange = { fg = palette.rose }, + WhichKeyIconPurple = { fg = palette.iris }, + WhichKeyIconRed = { fg = palette.love }, + WhichKeyIconYellow = { fg = palette.gold }, + WhichKeyNormal = { link = "NormalFloat" }, + WhichKeySeparator = { fg = palette.subtle }, + WhichKeyTitle = { link = "FloatTitle" }, + WhichKeyValue = { fg = palette.rose }, + + -- lukas-reineke/indent-blankline.nvim + IblIndent = { fg = palette.overlay }, + IblScope = { fg = palette.foam }, + IblWhitespace = { fg = palette.overlay }, + + -- hrsh7th/nvim-cmp + CmpItemAbbr = { fg = palette.subtle }, + CmpItemAbbrDeprecated = { fg = palette.subtle, strikethrough = true }, + CmpItemAbbrMatch = { fg = palette.text, bold = styles.bold }, + CmpItemAbbrMatchFuzzy = { fg = palette.text, bold = styles.bold }, + CmpItemKind = { fg = palette.subtle }, + CmpItemKindClass = { link = "StorageClass" }, + CmpItemKindFunction = { link = "Function" }, + CmpItemKindInterface = { link = "Type" }, + CmpItemKindMethod = { link = "PreProc" }, + CmpItemKindSnippet = { link = "String" }, + CmpItemKindVariable = { link = "Identifier" }, + + -- NeogitOrg/neogit + -- https://github.com/NeogitOrg/neogit/blob/master/lua/neogit/lib/hl.lua#L109-L198 + NeogitChangeAdded = { fg = groups.git_add, bold = styles.bold, italic = styles.italic }, + NeogitChangeBothModified = { fg = groups.git_change, bold = styles.bold, italic = styles.italic }, + NeogitChangeCopied = { fg = groups.git_untracked, bold = styles.bold, italic = styles.italic }, + NeogitChangeDeleted = { fg = groups.git_delete, bold = styles.bold, italic = styles.italic }, + NeogitChangeModified = { fg = groups.git_change, bold = styles.bold, italic = styles.italic }, + NeogitChangeNewFile = { fg = groups.git_stage, bold = styles.bold, italic = styles.italic }, + NeogitChangeRenamed = { fg = groups.git_rename, bold = styles.bold, italic = styles.italic }, + NeogitChangeUpdated = { fg = groups.git_change, bold = styles.bold, italic = styles.italic }, + NeogitDiffAddHighlight = { link = "DiffAdd" }, + NeogitDiffContextHighlight = { bg = palette.surface }, + NeogitDiffDeleteHighlight = { link = "DiffDelete" }, + NeogitFilePath = { fg = palette.foam, italic = styles.italic }, + NeogitHunkHeader = { bg = groups.panel }, + NeogitHunkHeaderHighlight = { bg = groups.panel }, + + -- vimwiki/vimwiki + VimwikiHR = { fg = palette.subtle }, + VimwikiHeader1 = { link = "markdownH1" }, + VimwikiHeader2 = { link = "markdownH2" }, + VimwikiHeader3 = { link = "markdownH3" }, + VimwikiHeader4 = { link = "markdownH4" }, + VimwikiHeader5 = { link = "markdownH5" }, + VimwikiHeader6 = { link = "markdownH6" }, + VimwikiHeaderChar = { fg = palette.subtle }, + VimwikiLink = { link = "markdownUrl" }, + VimwikiList = { fg = palette.iris }, + VimwikiNoExistsLink = { fg = palette.love }, + + -- nvim-neorg/neorg + NeorgHeading1Prefix = { link = "markdownH1Delimiter" }, + NeorgHeading1Title = { link = "markdownH1" }, + NeorgHeading2Prefix = { link = "markdownH2Delimiter" }, + NeorgHeading2Title = { link = "markdownH2" }, + NeorgHeading3Prefix = { link = "markdownH3Delimiter" }, + NeorgHeading3Title = { link = "markdownH3" }, + NeorgHeading4Prefix = { link = "markdownH4Delimiter" }, + NeorgHeading4Title = { link = "markdownH4" }, + NeorgHeading5Prefix = { link = "markdownH5Delimiter" }, + NeorgHeading5Title = { link = "markdownH5" }, + NeorgHeading6Prefix = { link = "markdownH6Delimiter" }, + NeorgHeading6Title = { link = "markdownH6" }, + NeorgMarkerTitle = { fg = palette.foam, bold = styles.bold }, + + -- tami5/lspsaga.nvim (fork of glepnir/lspsaga.nvim) + DefinitionCount = { fg = palette.rose }, + DefinitionIcon = { fg = palette.rose }, + DefinitionPreviewTitle = { fg = palette.rose, bold = styles.bold }, + LspFloatWinBorder = make_border(), + LspFloatWinNormal = { bg = groups.panel }, + LspSagaAutoPreview = { fg = palette.subtle }, + LspSagaCodeActionBorder = make_border(palette.rose), + LspSagaCodeActionContent = { fg = palette.foam }, + LspSagaCodeActionTitle = { fg = palette.gold, bold = styles.bold }, + LspSagaCodeActionTruncateLine = { link = "LspSagaCodeActionBorder" }, + LspSagaDefPreviewBorder = make_border(), + LspSagaDiagnosticBorder = make_border(palette.gold), + LspSagaDiagnosticHeader = { fg = palette.foam, bold = styles.bold }, + LspSagaDiagnosticTruncateLine = { link = "LspSagaDiagnosticBorder" }, + LspSagaDocTruncateLine = { link = "LspSagaHoverBorder" }, + LspSagaFinderSelection = { fg = palette.gold }, + LspSagaHoverBorder = { link = "LspFloatWinBorder" }, + LspSagaLspFinderBorder = { link = "LspFloatWinBorder" }, + LspSagaRenameBorder = make_border(palette.pine), + LspSagaRenamePromptPrefix = { fg = palette.love }, + LspSagaShTruncateLine = { link = "LspSagaSignatureHelpBorder" }, + LspSagaSignatureHelpBorder = make_border(palette.foam), + ReferencesCount = { fg = palette.rose }, + ReferencesIcon = { fg = palette.rose }, + SagaShadow = { bg = palette.overlay }, + TargetWord = { fg = palette.iris }, + + -- ray-x/lsp_signature.nvim + LspSignatureActiveParameter = { bg = palette.overlay }, + + -- rlane/pounce.nvim + PounceAccept = { fg = palette.love, bg = palette.love, blend = 20 }, + PounceAcceptBest = { fg = palette.gold, bg = palette.gold, blend = 20 }, + PounceGap = { link = "Search" }, + PounceMatch = { link = "Search" }, + + -- ggandor/leap.nvim + LeapLabelPrimary = { link = "IncSearch" }, + LeapLabelSecondary = { link = "StatusLineTerm" }, + LeapMatch = { link = "MatchParen" }, + + -- phaazon/hop.nvim + -- smoka7/hop.nvim + HopNextKey = { fg = palette.love, bg = palette.love, blend = 20 }, + HopNextKey1 = { fg = palette.foam, bg = palette.foam, blend = 20 }, + HopNextKey2 = { fg = palette.pine, bg = palette.pine, blend = 20 }, + HopUnmatched = { fg = palette.muted }, + + -- nvim-telescope/telescope.nvim + TelescopeBorder = make_border(), + TelescopeMatching = { fg = palette.rose }, + TelescopeNormal = { link = "NormalFloat" }, + TelescopePromptNormal = { link = "TelescopeNormal" }, + TelescopePromptPrefix = { fg = palette.subtle }, + TelescopeSelection = { fg = palette.text, bg = palette.overlay }, + TelescopeSelectionCaret = { fg = palette.rose, bg = palette.overlay }, + TelescopeTitle = { fg = palette.foam, bold = styles.bold }, + + -- ibhagwan/fzf-lua + FzfLuaBorder = make_border(), + FzfLuaBufFlagAlt = { fg = palette.subtle }, + FzfLuaBufFlagCur = { fg = palette.subtle }, + FzfLuaCursorLine = { fg = palette.text, bg = palette.overlay }, + FzfLuaFilePart = { fg = palette.text }, + FzfLuaHeaderBind = { fg = palette.rose }, + FzfLuaHeaderText = { fg = palette.love }, + FzfLuaNormal = { link = "NormalFloat" }, + FzfLuaTitle = { link = "FloatTitle" }, + + -- rcarriga/nvim-notify + NotifyBackground = { link = "NormalFloat" }, + NotifyDEBUGBody = { link = "NormalFloat" }, + NotifyDEBUGBorder = make_border(), + NotifyDEBUGIcon = { link = "NotifyDEBUGTitle" }, + NotifyDEBUGTitle = { fg = palette.muted }, + NotifyERRORBody = { link = "NormalFloat" }, + NotifyERRORBorder = make_border(groups.error), + NotifyERRORIcon = { link = "NotifyERRORTitle" }, + NotifyERRORTitle = { fg = groups.error }, + NotifyINFOBody = { link = "NormalFloat" }, + NotifyINFOBorder = make_border(groups.info), + NotifyINFOIcon = { link = "NotifyINFOTitle" }, + NotifyINFOTitle = { fg = groups.info }, + NotifyTRACEBody = { link = "NormalFloat" }, + NotifyTRACEBorder = make_border(palette.iris), + NotifyTRACEIcon = { link = "NotifyTRACETitle" }, + NotifyTRACETitle = { fg = palette.iris }, + NotifyWARNBody = { link = "NormalFloat" }, + NotifyWARNBorder = make_border(groups.warn), + NotifyWARNIcon = { link = "NotifyWARNTitle" }, + NotifyWARNTitle = { fg = groups.warn }, + + -- rcarriga/nvim-dap-ui + DapUIBreakpointsCurrentLine = { fg = palette.gold, bold = styles.bold }, + DapUIBreakpointsDisabledLine = { fg = palette.muted }, + DapUIBreakpointsInfo = { link = "DapUIThread" }, + DapUIBreakpointsLine = { link = "DapUIBreakpointsPath" }, + DapUIBreakpointsPath = { fg = palette.foam }, + DapUIDecoration = { link = "DapUIBreakpointsPath" }, + DapUIFloatBorder = make_border(), + DapUIFrameName = { fg = palette.text }, + DapUILineNumber = { link = "DapUIBreakpointsPath" }, + DapUIModifiedValue = { fg = palette.foam, bold = styles.bold }, + DapUIScope = { link = "DapUIBreakpointsPath" }, + DapUISource = { fg = palette.iris }, + DapUIStoppedThread = { link = "DapUIBreakpointsPath" }, + DapUIThread = { fg = palette.gold }, + DapUIValue = { fg = palette.text }, + DapUIVariable = { fg = palette.text }, + DapUIType = { fg = palette.iris }, + DapUIWatchesEmpty = { fg = palette.love }, + DapUIWatchesError = { link = "DapUIWatchesEmpty" }, + DapUIWatchesValue = { link = "DapUIThread" }, + + -- glepnir/dashboard-nvim + DashboardCenter = { fg = palette.gold }, + DashboardFooter = { fg = palette.iris }, + DashboardHeader = { fg = palette.pine }, + DashboardShortcut = { fg = palette.love }, + + -- SmiteshP/nvim-navic + NavicIconsArray = { fg = palette.gold }, + NavicIconsBoolean = { fg = palette.rose }, + NavicIconsClass = { fg = palette.foam }, + NavicIconsConstant = { fg = palette.gold }, + NavicIconsConstructor = { fg = palette.gold }, + NavicIconsEnum = { fg = palette.gold }, + NavicIconsEnumMember = { fg = palette.foam }, + NavicIconsEvent = { fg = palette.gold }, + NavicIconsField = { fg = palette.foam }, + NavicIconsFile = { fg = palette.muted }, + NavicIconsFunction = { fg = palette.pine }, + NavicIconsInterface = { fg = palette.foam }, + NavicIconsKey = { fg = palette.iris }, + NavicIconsKeyword = { fg = palette.pine }, + NavicIconsMethod = { fg = palette.iris }, + NavicIconsModule = { fg = palette.rose }, + NavicIconsNamespace = { fg = palette.muted }, + NavicIconsNull = { fg = palette.love }, + NavicIconsNumber = { fg = palette.gold }, + NavicIconsObject = { fg = palette.gold }, + NavicIconsOperator = { fg = palette.subtle }, + NavicIconsPackage = { fg = palette.muted }, + NavicIconsProperty = { fg = palette.foam }, + NavicIconsString = { fg = palette.gold }, + NavicIconsStruct = { fg = palette.foam }, + NavicIconsTypeParameter = { fg = palette.foam }, + NavicIconsVariable = { fg = palette.text }, + NavicSeparator = { fg = palette.subtle }, + NavicText = { fg = palette.subtle }, + + -- folke/noice.nvim + NoiceCursor = { fg = palette.highlight_high, bg = palette.text }, + + -- folke/trouble.nvim + TroubleText = { fg = palette.subtle }, + TroubleCount = { fg = palette.iris, bg = palette.surface }, + TroubleNormal = { fg = palette.text, bg = groups.panel }, + + -- echasnovski/mini.nvim + MiniAnimateCursor = { reverse = true, nocombine = true }, + MiniAnimateNormalFloat = { link = "NormalFloat" }, + + MiniClueBorder = { link = "FloatBorder" }, + MiniClueDescGroup = { link = "DiagnosticFloatingWarn" }, + MiniClueDescSingle = { link = "NormalFloat" }, + MiniClueNextKey = { link = "DiagnosticFloatingHint" }, + MiniClueNextKeyWithPostkeys = { link = "DiagnosticFloatingError" }, + MiniClueSeparator = { link = "DiagnosticFloatingInfo" }, + MiniClueTitle = { bg = groups.panel, bold = styles.bold }, + + MiniCompletionActiveParameter = { underline = true }, + + MiniCursorword = { underline = true }, + MiniCursorwordCurrent = { underline = true }, + + MiniDepsChangeAdded = { fg = groups.git_add }, + MiniDepsChangeRemoved = { fg = groups.git_delete }, + MiniDepsHint = { link = "DiagnosticHint" }, + MiniDepsInfo = { link = "DiagnosticInfo" }, + MiniDepsMsgBreaking = { link = "DiagnosticWarn" }, + MiniDepsPlaceholder = { link = "Comment" }, + MiniDepsTitle = { link = "Title" }, + MiniDepsTitleError = { link = "DiffDelete" }, + MiniDepsTitleSame = { link = "DiffText" }, + MiniDepsTitleUpdate = { link = "DiffAdd" }, + + MiniDiffOverAdd = { fg = groups.git_add, bg = groups.git_add, blend = 20 }, + MiniDiffOverChange = { fg = groups.git_change, bg = groups.git_change, blend = 20 }, + MiniDiffOverContext = { bg = palette.surface }, + MiniDiffOverDelete = { fg = groups.git_delete, bg = groups.git_delete, blend = 20 }, + MiniDiffSignAdd = { fg = groups.git_add }, + MiniDiffSignChange = { fg = groups.git_change }, + MiniDiffSignDelete = { fg = groups.git_delete }, + + MiniFilesBorder = { link = "FloatBorder" }, + MiniFilesBorderModified = { link = "DiagnosticFloatingWarn" }, + MiniFilesCursorLine = { link = "CursorLine" }, + MiniFilesDirectory = { link = "Directory" }, + MiniFilesFile = { fg = palette.text }, + MiniFilesNormal = { link = "NormalFloat" }, + MiniFilesTitle = { link = "FloatTitle" }, + MiniFilesTitleFocused = { fg = palette.rose, bg = groups.panel, bold = styles.bold }, + + MiniHipatternsFixme = { fg = palette.base, bg = groups.error, bold = styles.bold }, + MiniHipatternsHack = { fg = palette.base, bg = groups.warn, bold = styles.bold }, + MiniHipatternsNote = { fg = palette.base, bg = groups.info, bold = styles.bold }, + MiniHipatternsTodo = { fg = palette.base, bg = groups.hint, bold = styles.bold }, + + MiniIconsAzure = { fg = palette.foam }, + MiniIconsBlue = { fg = palette.pine }, + MiniIconsCyan = { fg = palette.foam }, + MiniIconsGreen = { fg = palette.leaf }, + MiniIconsGrey = { fg = palette.subtle }, + MiniIconsOrange = { fg = palette.rose }, + MiniIconsPurple = { fg = palette.iris }, + MiniIconsRed = { fg = palette.love }, + MiniIconsYellow = { fg = palette.gold }, + + MiniIndentscopeSymbol = { fg = palette.muted }, + MiniIndentscopeSymbolOff = { fg = palette.gold }, + + MiniJump = { sp = palette.gold, undercurl = true }, + + MiniJump2dDim = { fg = palette.subtle }, + MiniJump2dSpot = { fg = palette.gold, bold = styles.bold, nocombine = true }, + MiniJump2dSpotAhead = { fg = palette.foam, bg = palette.surface, nocombine = true }, + MiniJump2dSpotUnique = { fg = palette.rose, bold = styles.bold, nocombine = true }, + + MiniMapNormal = { link = "NormalFloat" }, + MiniMapSymbolCount = { link = "Special" }, + MiniMapSymbolLine = { link = "Title" }, + MiniMapSymbolView = { link = "Delimiter" }, + + MiniNotifyBorder = { link = "FloatBorder" }, + MiniNotifyNormal = { link = "NormalFloat" }, + MiniNotifyTitle = { link = "FloatTitle" }, + + MiniOperatorsExchangeFrom = { link = "IncSearch" }, + + MiniPickBorder = { link = "FloatBorder" }, + MiniPickBorderBusy = { link = "DiagnosticFloatingWarn" }, + MiniPickBorderText = { bg = groups.panel }, + MiniPickIconDirectory = { link = "Directory" }, + MiniPickIconFile = { link = "MiniPickNormal" }, + MiniPickHeader = { link = "DiagnosticFloatingHint" }, + MiniPickMatchCurrent = { link = "CursorLine" }, + MiniPickMatchMarked = { link = "Visual" }, + MiniPickMatchRanges = { fg = palette.foam }, + MiniPickNormal = { link = "NormalFloat" }, + MiniPickPreviewLine = { link = "CursorLine" }, + MiniPickPreviewRegion = { link = "IncSearch" }, + MiniPickPrompt = { bg = groups.panel, bold = styles.bold }, + + MiniStarterCurrent = { nocombine = true }, + MiniStarterFooter = { fg = palette.subtle }, + MiniStarterHeader = { link = "Title" }, + MiniStarterInactive = { link = "Comment" }, + MiniStarterItem = { link = "Normal" }, + MiniStarterItemBullet = { link = "Delimiter" }, + MiniStarterItemPrefix = { link = "WarningMsg" }, + MiniStarterSection = { fg = palette.rose }, + MiniStarterQuery = { link = "MoreMsg" }, + + MiniStatuslineDevinfo = { fg = palette.subtle, bg = palette.overlay }, + MiniStatuslineFileinfo = { link = "MiniStatuslineDevinfo" }, + MiniStatuslineFilename = { fg = palette.muted, bg = palette.surface }, + MiniStatuslineInactive = { link = "MiniStatuslineFilename" }, + MiniStatuslineModeCommand = { fg = palette.base, bg = palette.love, bold = styles.bold }, + MiniStatuslineModeInsert = { fg = palette.base, bg = palette.foam, bold = styles.bold }, + MiniStatuslineModeNormal = { fg = palette.base, bg = palette.rose, bold = styles.bold }, + MiniStatuslineModeOther = { fg = palette.base, bg = palette.rose, bold = styles.bold }, + MiniStatuslineModeReplace = { fg = palette.base, bg = palette.pine, bold = styles.bold }, + MiniStatuslineModeVisual = { fg = palette.base, bg = palette.iris, bold = styles.bold }, + + MiniSurround = { link = "IncSearch" }, + + MiniTablineCurrent = { fg = palette.text, bg = palette.overlay, bold = styles.bold }, + MiniTablineFill = { link = "TabLineFill" }, + MiniTablineHidden = { fg = palette.subtle, bg = groups.panel }, + MiniTablineModifiedCurrent = { fg = palette.overlay, bg = palette.text, bold = styles.bold }, + MiniTablineModifiedHidden = { fg = groups.panel, bg = palette.subtle }, + MiniTablineModifiedVisible = { fg = groups.panel, bg = palette.text }, + MiniTablineTabpagesection = { link = "Search" }, + MiniTablineVisible = { fg = palette.text, bg = groups.panel }, + + MiniTestEmphasis = { bold = styles.bold }, + MiniTestFail = { fg = palette.love, bold = styles.bold }, + MiniTestPass = { fg = palette.foam, bold = styles.bold }, + + MiniTrailspace = { bg = palette.love }, + + -- goolord/alpha-nvim + AlphaButtons = { fg = palette.foam }, + AlphaFooter = { fg = palette.gold }, + AlphaHeader = { fg = palette.pine }, + AlphaShortcut = { fg = palette.rose }, + + -- github/copilot.vim + CopilotSuggestion = { fg = palette.muted, italic = styles.italic }, + + -- nvim-treesitter/nvim-treesitter-context + TreesitterContext = { bg = palette.overlay }, + TreesitterContextLineNumber = { fg = palette.rose, bg = palette.overlay }, + + -- RRethy/vim-illuminate + IlluminatedWordRead = { link = "LspReferenceRead" }, + IlluminatedWordText = { link = "LspReferenceText" }, + IlluminatedWordWrite = { link = "LspReferenceWrite" }, + + -- HiPhish/rainbow-delimiters.nvim + RainbowDelimiterBlue = { fg = palette.pine }, + RainbowDelimiterCyan = { fg = palette.foam }, + RainbowDelimiterGreen = { fg = palette.leaf }, + RainbowDelimiterOrange = { fg = palette.rose }, + RainbowDelimiterRed = { fg = palette.love }, + RainbowDelimiterViolet = { fg = palette.iris }, + RainbowDelimiterYellow = { fg = palette.gold }, + + -- MeanderingProgrammer/render-markdown.nvim + RenderMarkdownBullet = { fg = palette.rose }, + RenderMarkdownChecked = { fg = palette.foam }, + RenderMarkdownCode = { bg = palette.overlay }, + RenderMarkdownCodeInline = { fg = palette.text, bg = palette.overlay }, + RenderMarkdownDash = { fg = palette.muted }, + RenderMarkdownH1Bg = { bg = groups.h1, blend = 20 }, + RenderMarkdownH2Bg = { bg = groups.h2, blend = 20 }, + RenderMarkdownH3Bg = { bg = groups.h3, blend = 20 }, + RenderMarkdownH4Bg = { bg = groups.h4, blend = 20 }, + RenderMarkdownH5Bg = { bg = groups.h5, blend = 20 }, + RenderMarkdownH6Bg = { bg = groups.h6, blend = 20 }, + RenderMarkdownQuote = { fg = palette.subtle }, + RenderMarkdownTableFill = { link = "Conceal" }, + RenderMarkdownTableHead = { fg = palette.subtle }, + RenderMarkdownTableRow = { fg = palette.subtle }, + RenderMarkdownUnchecked = { fg = palette.subtle }, + + -- MagicDuck/grug-far.nvim + GrugFarHelpHeader = { fg = palette.pine }, + GrugFarHelpHeaderKey = { fg = palette.gold }, + GrugFarHelpWinActionKey = { fg = palette.gold }, + GrugFarHelpWinActionPrefix = { fg = palette.foam }, + GrugFarHelpWinActionText = { fg = palette.pine }, + GrugFarHelpWinHeader = { link = "FloatTitle" }, + GrugFarInputLabel = { fg = palette.foam }, + GrugFarInputPlaceholder = { link = "Comment" }, + GrugFarResultsActionMessage = { fg = palette.foam }, + GrugFarResultsChangeIndicator = { fg = groups.git_change }, + GrugFarResultsRemoveIndicator = { fg = groups.git_delete }, + GrugFarResultsAddIndicator = { fg = groups.git_add }, + GrugFarResultsHeader = { fg = palette.pine }, + GrugFarResultsLineNo = { fg = palette.iris }, + GrugFarResultsLineColumn = { link = "GrugFarResultsLineNo" }, + GrugFarResultsMatch = { link = "CurSearch" }, + GrugFarResultsPath = { fg = palette.foam }, + GrugFarResultsStats = { fg = palette.iris }, + + -- yetone/avante.nvim + AvanteTitle = { fg = palette.highlight_high, bg = palette.rose }, + AvanteReversedTitle = { fg = palette.rose }, + AvanteSubtitle = { fg = palette.highlight_med, bg = palette.foam }, + AvanteReversedSubtitle = { fg = palette.foam }, + AvanteThirdTitle = { fg = palette.highlight_med, bg = palette.iris }, + AvanteReversedThirdTitle = { fg = palette.iris }, + AvantePromptInput = { fg = palette.text, bg = groups.panel }, + AvantePromptInputBorder = { fg = groups.border }, + + -- Saghen/blink.cmp + BlinkCmpDoc = { bg = palette.highlight_low }, + BlinkCmpDocSeparator = { bg = palette.highlight_low }, + BlinkCmpDocBorder = { fg = palette.highlight_high }, + BlinkCmpGhostText = { fg = palette.muted }, + + BlinkCmpLabel = { fg = palette.muted }, + BlinkCmpLabelDeprecated = { fg = palette.muted, strikethrough = true }, + BlinkCmpLabelMatch = { fg = palette.text, bold = styles.bold }, + + BlinkCmpDefault = { fg = palette.highlight_med }, + BlinkCmpKindText = { fg = palette.pine }, + BlinkCmpKindMethod = { fg = palette.foam }, + BlinkCmpKindFunction = { fg = palette.foam }, + BlinkCmpKindConstructor = { fg = palette.foam }, + BlinkCmpKindField = { fg = palette.pine }, + BlinkCmpKindVariable = { fg = palette.rose }, + BlinkCmpKindClass = { fg = palette.gold }, + BlinkCmpKindInterface = { fg = palette.gold }, + BlinkCmpKindModule = { fg = palette.foam }, + BlinkCmpKindProperty = { fg = palette.foam }, + BlinkCmpKindUnit = { fg = palette.pine }, + BlinkCmpKindValue = { fg = palette.love }, + BlinkCmpKindKeyword = { fg = palette.iris }, + BlinkCmpKindSnippet = { fg = palette.rose }, + BlinkCmpKindColor = { fg = palette.love }, + BlinkCmpKindFile = { fg = palette.foam }, + BlinkCmpKindReference = { fg = palette.love }, + BlinkCmpKindFolder = { fg = palette.foam }, + BlinkCmpKindEnum = { fg = palette.foam }, + BlinkCmpKindEnumMember = { fg = palette.foam }, + BlinkCmpKindConstant = { fg = palette.gold }, + BlinkCmpKindStruct = { fg = palette.foam }, + BlinkCmpKindEvent = { fg = palette.foam }, + BlinkCmpKindOperator = { fg = palette.foam }, + BlinkCmpKindTypeParameter = { fg = palette.iris }, + BlinkCmpKindCodeium = { fg = palette.foam }, + BlinkCmpKindCopilot = { fg = palette.foam }, + BlinkCmpKindSupermaven = { fg = palette.foam }, + BlinkCmpKindTabNine = { fg = palette.foam }, + + -- folke/snacks.nvim + SnacksIndent = { fg = palette.overlay }, + SnacksIndentChunk = { fg = palette.overlay }, + SnacksIndentBlank = { fg = palette.overlay }, + SnacksIndentScope = { fg = palette.foam }, + + SnacksPickerMatch = { fg = palette.rose, bold = styles.bold }, + + -- justinmk/vim-sneak + Sneak = { fg = palette.base, bg = palette.love }, + SneakCurrent = { link = "StatusLineTerm" }, + SneakScope = { link = "IncSearch" }, + + -- sindrets/diffview.nvim + DiffviewPrimary = { fg = palette.pine }, + DiffviewSecondary = { fg = palette.foam }, + DiffviewNormal = { fg = palette.text, bg = palette.surface }, + DiffviewWinSeparator = { fg = palette.text, bg = palette.surface }, + + DiffviewFilePanelTitle = { fg = palette.foam, bold = styles.bold }, + DiffviewFilePanelCounter = { fg = palette.rose }, + DiffviewFilePanelRootPath = { fg = palette.foam, bold = styles.bold }, + DiffviewFilePanelFileName = { fg = palette.text }, + DiffviewFilePanelSelected = { fg = palette.gold }, + DiffviewFilePanelPath = { link = "Comment" }, + + DiffviewFilePanelInsertions = { fg = groups.git_add }, + DiffviewFilePanelDeletions = { fg = groups.git_delete }, + DiffviewFilePanelConflicts = { fg = groups.git_merge }, + DiffviewFolderName = { fg = palette.foam, bold = styles.bold }, + DiffviewFolderSign = { fg = palette.subtle }, + DiffviewHash = { fg = palette.rose }, + DiffviewReference = { fg = palette.foam, bold = styles.bold }, + DiffviewReflogSelector = { fg = palette.rose }, + DiffviewStatusAdded = { fg = groups.git_add }, + DiffviewStatusUntracked = { fg = groups.untracked }, + DiffviewStatusModified = { fg = groups.git_change }, + DiffviewStatusRenamed = { fg = groups.git_rename }, + DiffviewStatusCopied = { fg = groups.untracked }, + DiffviewStatusTypeChange = { fg = groups.git_change }, + DiffviewStatusUnmerged = { fg = groups.git_change }, + DiffviewStatusUnknown = { fg = groups.git_delete }, + DiffviewStatusDeleted = { fg = groups.git_delete }, + DiffviewStatusBroken = { fg = groups.git_delete }, + DiffviewStatusIgnored = { fg = groups.git_ignore }, + } + local transparency_highlights = { + DiagnosticVirtualTextError = { fg = groups.error }, + DiagnosticVirtualTextHint = { fg = groups.hint }, + DiagnosticVirtualTextInfo = { fg = groups.info }, + DiagnosticVirtualTextOk = { fg = groups.ok }, + DiagnosticVirtualTextWarn = { fg = groups.warn }, + + FloatBorder = { fg = palette.muted, bg = "NONE" }, + FloatTitle = { fg = palette.foam, bg = "NONE", bold = styles.bold }, + Folded = { fg = palette.text, bg = "NONE" }, + NormalFloat = { bg = "NONE" }, + Normal = { fg = palette.text, bg = "NONE" }, + NormalNC = { fg = palette.text, bg = config.options.dim_inactive_windows and palette._nc or "NONE" }, + Pmenu = { fg = palette.subtle, bg = "NONE" }, + PmenuKind = { fg = palette.foam, bg = "NONE" }, + SignColumn = { fg = palette.text, bg = "NONE" }, + StatusLine = { fg = palette.subtle, bg = "NONE" }, + StatusLineNC = { fg = palette.muted, bg = "NONE" }, + TabLine = { bg = "NONE", fg = palette.subtle }, + TabLineFill = { bg = "NONE" }, + TabLineSel = { fg = palette.text, bg = "NONE", bold = styles.bold }, + + -- ["@markup.raw"] = { bg = "none" }, + ["@markup.raw.markdown_inline"] = { fg = palette.gold }, + -- ["@markup.raw.block"] = { bg = "none" }, + + TelescopeNormal = { fg = palette.subtle, bg = "NONE" }, + TelescopePromptNormal = { fg = palette.text, bg = "NONE" }, + TelescopeSelection = { fg = palette.text, bg = "NONE", bold = styles.bold }, + TelescopeSelectionCaret = { fg = palette.rose }, + + TroubleNormal = { bg = "NONE" }, + + WhichKeyFloat = { bg = "NONE" }, + WhichKeyNormal = { bg = "NONE" }, + + IblIndent = { fg = palette.overlay, bg = "NONE" }, + IblScope = { fg = palette.foam, bg = "NONE" }, + IblWhitespace = { fg = palette.overlay, bg = "NONE" }, + + TreesitterContext = { bg = "NONE" }, + TreesitterContextLineNumber = { fg = palette.rose, bg = "NONE" }, + + MiniFilesTitleFocused = { fg = palette.rose, bg = "NONE", bold = styles.bold }, + + MiniPickPrompt = { bg = "NONE", bold = styles.bold }, + MiniPickBorderText = { bg = "NONE" }, + } + + if config.options.enable.legacy_highlights then + for group, highlight in pairs(legacy_highlights) do + highlights[group] = highlight + end + end + for group, highlight in pairs(default_highlights) do + highlights[group] = highlight + end + if styles.transparency then + for group, highlight in pairs(transparency_highlights) do + highlights[group] = highlight + end + end + + -- Reconcile highlights with config + if config.options.highlight_groups ~= nil and next(config.options.highlight_groups) ~= nil then + for group, highlight in pairs(config.options.highlight_groups) do + local existing = highlights[group] or {} + -- Traverse link due to + -- "If link is used in combination with other attributes; only the link will take effect" + -- see: https://neovim.io/doc/user/api.html#nvim_set_hl() + while existing.link ~= nil do + existing = highlights[existing.link] or {} + end + local parsed = vim.tbl_extend("force", {}, highlight) + + if highlight.fg ~= nil then + parsed.fg = utilities.parse_color(highlight.fg) or highlight.fg + end + if highlight.bg ~= nil then + parsed.bg = utilities.parse_color(highlight.bg) or highlight.bg + end + if highlight.sp ~= nil then + parsed.sp = utilities.parse_color(highlight.sp) or highlight.sp + end + + if (highlight.inherit == nil or highlight.inherit) and existing ~= nil then + parsed.inherit = nil + highlights[group] = vim.tbl_extend("force", existing, parsed) + else + parsed.inherit = nil + highlights[group] = parsed + end + end + end + + for group, highlight in pairs(highlights) do + if config.options.before_highlight ~= nil then + config.options.before_highlight(group, highlight, palette) + end + + if highlight.blend ~= nil and (highlight.blend >= 0 and highlight.blend <= 100) and highlight.bg ~= nil then + highlight.bg = utilities.blend(highlight.bg, highlight.blend_on or palette.base, highlight.blend / 100) + end + + highlight.blend = nil + highlight.blend_on = nil + + if highlight._nvim_blend ~= nil then + highlight.blend = highlight._nvim_blend + end + + vim.api.nvim_set_hl(0, group, highlight) + end + + --- Terminal + if config.options.enable.terminal then + vim.g.terminal_color_0 = palette.overlay -- black + vim.g.terminal_color_8 = palette.subtle -- bright black + vim.g.terminal_color_1 = palette.love -- red + vim.g.terminal_color_9 = palette.love -- bright red + vim.g.terminal_color_2 = palette.pine -- green + vim.g.terminal_color_10 = palette.pine -- bright green + vim.g.terminal_color_3 = palette.gold -- yellow + vim.g.terminal_color_11 = palette.gold -- bright yellow + vim.g.terminal_color_4 = palette.foam -- blue + vim.g.terminal_color_12 = palette.foam -- bright blue + vim.g.terminal_color_5 = palette.iris -- magenta + vim.g.terminal_color_13 = palette.iris -- bright magenta + vim.g.terminal_color_6 = palette.rose -- cyan + vim.g.terminal_color_14 = palette.rose -- bright cyan + vim.g.terminal_color_7 = palette.text -- white + vim.g.terminal_color_15 = palette.text -- bright white + + -- Support StatusLineTerm & StatusLineTermNC from vim + vim.cmd([[ + augroup rose-pine + autocmd! + autocmd TermOpen * if &buftype=='terminal' + \|setlocal winhighlight=StatusLine:StatusLineTerm,StatusLineNC:StatusLineTermNC + \|else|setlocal winhighlight=|endif + autocmd ColorSchemePre * autocmd! rose-pine + augroup END + ]]) + end +end + +---@param variant Variant | nil +function M.colorscheme(variant) + config.extend_options({ variant = variant }) + + vim.opt.termguicolors = true + if vim.g.colors_name then + vim.cmd("hi clear") + vim.cmd("syntax reset") + end + vim.g.colors_name = "rose-pine" + + if variant == "dawn" then + vim.o.background = "light" + elseif variant == "main" or variant == "moon" then + vim.o.background = "dark" + end + + set_highlights() +end + +---@param options Options +function M.setup(options) + config.extend_options(options or {}) +end + +return M diff --git a/lua/rose-pine/bufferline/init.lua b/lua/rose-pine/bufferline/init.lua deleted file mode 100644 index 3ae77b4..0000000 --- a/lua/rose-pine/bufferline/init.lua +++ /dev/null @@ -1,23 +0,0 @@ -local p = require('rose-pine.palette') - --- TODO: Someone who uses bufferline.nvim is free to PR with this addition --- `:h bufferline-highlights` --- --- The intended use would be (or any better solution): --- --- ``` --- local highlights = require('rose-pine.bufferline') --- require('bufferline').setup({ --- highlights = highlights --- }) --- ``` -return { - fill = { - guifg = p.text, - guibg = p.base, - }, - background = { - guifg = p.text, - guibg = p.base, - }, -} diff --git a/lua/rose-pine/config.lua b/lua/rose-pine/config.lua index 6b3ac12..bbc9967 100644 --- a/lua/rose-pine/config.lua +++ b/lua/rose-pine/config.lua @@ -1,74 +1,176 @@ -local palette = require('rose-pine.palette') +---@alias Variant "main" | "moon" | "dawn" +---@alias Palette { base: string, surface: string, overlay: string, muted: string, subtle: string, text: string, love: string, gold: string, rose: string, pine: string, foam: string, iris: string } +---@alias PaletteColor "base" | "surface" | "overlay" | "muted" | "subtle" | "text" | "love" | "gold" | "rose" | "pine" | "foam" | "iris" | "highlight_low" | "highlight_med" | "highlight_high" +---@alias Highlight { link: string, inherit: boolean } | { fg: string, bg: string, sp: string, bold: boolean, italic: boolean, undercurl: boolean, underline: boolean, underdouble: boolean, underdotted: boolean, underdashed: boolean, strikethrough: boolean, inherit: boolean } -local function opt(key, default) - key = 'rose_pine_' .. key +local config = {} - if vim.g[key] == nil then - return default - end +---@class Options +config.options = { + ---Set the desired variant: "auto" will follow the vim background, + ---defaulting to `dark_variant` or "main" for dark and "dawn" for light. + ---@type "auto" | Variant + variant = "auto", - if vim.g[key] == 0 or vim.g[key] == false then - return false - end + ---Set the desired dark variant when `options.variant` is set to "auto". + ---@type Variant + dark_variant = "main", - return vim.g[key] -end + ---Differentiate between active and inactive windows and panels. + dim_inactive_windows = false, -local config = { - variant = opt('variant', 'main'), + ---Extend background behind borders. Appearance differs based on which + ---border characters you are using. + extend_background_behind_borders = true, - bold_vertical_split_line = opt('bold_vertical_split_line', false), - disable_italics = opt('disable_italics', false), - disable_background = opt('disable_background', false), - disable_float_background = opt('disable_float_background', false), - inactive_background = opt('inactive_background', false), - - colors = { - border = palette.highlight_med, - comment = palette.muted, - link = palette.iris, - punctuation = palette.subtle, - - error = palette.love, - hint = palette.iris, - info = palette.foam, - warn = palette.gold, - - git_add = palette.foam, - git_change = palette.rose, - git_delete = palette.love, - git_dirty = palette.rose, - git_ignore = palette.muted, - git_merge = palette.iris, - git_rename = palette.pine, - git_stage = palette.iris, - git_text = palette.rose, - - ---@type string|table - headings = { - h1 = palette.iris, - h2 = palette.foam, - h3 = palette.rose, - h4 = palette.gold, - h5 = palette.pine, - h6 = palette.foam, - }, + enable = { + legacy_highlights = true, + migrations = true, + terminal = true, }, + + styles = { + bold = true, + italic = true, + transparency = false, + }, + + ---@type table> + palette = {}, + + ---@type table + groups = { + border = "muted", + link = "iris", + panel = "surface", + + error = "love", + hint = "iris", + info = "foam", + ok = "leaf", + warn = "gold", + note = "pine", + todo = "rose", + + git_add = "foam", + git_change = "rose", + git_delete = "love", + git_dirty = "rose", + git_ignore = "muted", + git_merge = "iris", + git_rename = "pine", + git_stage = "iris", + git_text = "rose", + git_untracked = "subtle", + + ---@type string | PaletteColor + h1 = "iris", + h2 = "foam", + h3 = "rose", + h4 = "gold", + h5 = "pine", + h6 = "leaf", + + ---@deprecated Replaced by `options.highlight_groups["Normal"]` + -- background = "base", + ---@deprecated Replaced by `options.highlight_groups["Comment"]` + -- comment = "subtle", + ---@deprecated Replaced by `options.highlight_groups["@punctuation"]` + -- punctuation = "muted", + ---@deprecated Expects a table with values h1...h6 + -- headings = "text", + }, + + ---@type table + highlight_groups = {}, + + ---Called before each highlight group, before setting the highlight. + ---@param group string + ---@param highlight Highlight + ---@param palette Palette + ---@diagnostic disable-next-line: unused-local + before_highlight = function(group, highlight, palette) end, + + ---@deprecated Replaced by `options.dim_inactive_windows` + -- dim_nc_background = false, + ---@deprecated Replaced by `options.enable.transparency` + -- disable_background = false, + ---@deprecated Replaced by `options.highlight_groups["NormalFloat"]` + -- disable_float_background = false, + ---@deprecated Replaced by `options.styles.italic` + -- disable_italics = false, + ---@deprecated Replaced by `options.highlight_groups` + -- bold_vert_split = false } -local colors = vim.g.rose_pine_colors or {} +local function migrate(options) + if options.bold_vert_split then + local border = options.groups.border or "muted" + options.highlight_groups["VertSplit"] = { fg = border, bg = border } + options.highlight_groups["WinSeparator"] = { fg = border, bg = border } + end -if type(colors.headings) == 'string' then - colors.headings = { - h1 = colors.headings, - h2 = colors.headings, - h3 = colors.headings, - h4 = colors.headings, - h5 = colors.headings, - h6 = colors.headings, - } + if options.disable_background then + options.highlight_groups["Normal"] = { bg = "NONE" } + end + + if options.disable_float_background then + options.highlight_groups["NormalFloat"] = { bg = "NONE" } + end + + options.dim_inactive_windows = options.dim_nc_background or options.dim_inactive_windows + + if options.groups.background ~= nil then + options.highlight_groups["Normal"] = { bg = options.groups.background } + end + + if options.groups.comment ~= nil then + options.highlight_groups["Comment"] = { fg = options.groups.comment } + end + + if options.groups.punctuation ~= nil then + options.highlight_groups["@punctuation"] = { fg = options.groups.punctuation } + end + + options.styles.transparency = (options.disable_background and options.disable_float_background) + or options.styles.transparency + + -- These never actually existed, but may be set intuitively by the user + -- because of `disable_italics` existing. + options.styles.bold = not (options.disable_bold or options.disable_bolds) and options.styles.bold or false + + -- Similar to bold options, `disable_italic` never existed but could be a + -- common typo of the actual `disable_italics`. + options.styles.italic = not (options.disable_italic or options.disable_italics) and options.styles.italic or false + + -- Set h1 through h6 to the same color if only one is specified + if type(options.groups.headings) == "string" then + options.groups.h1 = options.groups.headings + options.groups.h2 = options.groups.headings + options.groups.h3 = options.groups.headings + options.groups.h4 = options.groups.headings + options.groups.h5 = options.groups.headings + options.groups.h6 = options.groups.headings + elseif options.groups.headings == "table" then + options.groups.h1 = options.groups.headings.h1 or options.groups.h1 + options.groups.h2 = options.groups.headings.h2 or options.groups.h2 + options.groups.h3 = options.groups.headings.h3 or options.groups.h3 + options.groups.h4 = options.groups.headings.h4 or options.groups.h4 + options.groups.h5 = options.groups.headings.h5 or options.groups.h5 + options.groups.h6 = options.groups.headings.h6 or options.groups.h6 + end + options.groups.headings = nil + + return options end -config.colors = vim.tbl_deep_extend('force', config.colors, colors) +---@param options Options | nil +function config.extend_options(options) + config.options = vim.tbl_deep_extend("force", config.options, options or {}) + + if config.options.enable.migrations then + config.options = migrate(config.options) + end +end return config diff --git a/lua/rose-pine/galaxyline/theme.lua b/lua/rose-pine/galaxyline/theme.lua deleted file mode 100644 index 5142949..0000000 --- a/lua/rose-pine/galaxyline/theme.lua +++ /dev/null @@ -1,19 +0,0 @@ -local present, galaxyline_colors = pcall(require, 'galaxyline.themes.colors') -if not present then - return -end - -local palette = require('rose-pine.palette') - -galaxyline_colors['rose-pine'] = { - bg = palette.overlay, - fg = palette.text, - fg_alt = palette.subtle, - blue = palette.foam, - cyan = palette.foam, - green = palette.muted, - magenta = palette.iris, - orange = palette.rose, - red = palette.love, - yellow = palette.gold, -} diff --git a/lua/rose-pine/init.lua b/lua/rose-pine/init.lua deleted file mode 100644 index f872457..0000000 --- a/lua/rose-pine/init.lua +++ /dev/null @@ -1,63 +0,0 @@ -local M = {} - -function M.colorscheme() - if vim.g.colors_name then - vim.cmd('hi clear') - end - - vim.opt.termguicolors = true - vim.g.colors_name = 'rose-pine' - - -- Match terminal theme if no variant is set - if vim.g.rose_pine_variant == nil and vim.o.background == 'light' then - vim.g.rose_pine_variant = 'dawn' - elseif vim.g.rose_pine_variant == 'dawn' then - vim.o.background = 'light' - end - - ---@param group string - ---@param color table - local function highlight(group, color) - local style = color.style and 'gui=' .. color.style or 'gui=NONE' - local fg = color.fg and 'guifg=' .. color.fg or 'guifg=NONE' - local bg = color.bg and 'guibg=' .. color.bg or 'guibg=NONE' - local sp = color.sp and 'guisp=' .. color.sp or '' - - local hl = 'highlight ' .. group .. ' ' .. style .. ' ' .. fg .. ' ' .. bg .. ' ' .. sp - - vim.cmd(hl) - if color.link then - vim.cmd('highlight! link ' .. group .. ' ' .. color.link) - end - end - - for group, colors in pairs(require('rose-pine.theme')) do - highlight(group, colors) - end - - require('rose-pine.galaxyline.theme') -end - -function M.set(variant) - vim.g.rose_pine_variant = variant - vim.cmd('colorscheme rose-pine') -end - -function M.toggle(variants) - variants = variants or { 'main', 'moon', 'dawn' } - - local index = {} - for k, v in pairs(variants) do - index[v] = k - end - - if vim.g.rose_pine_current_variant == nil then - vim.g.rose_pine_current_variant = index[vim.g.rose_pine_variant] or 0 - end - - vim.g.rose_pine_current_variant = (vim.g.rose_pine_current_variant % #variants) + 1 - - M.set(variants[vim.g.rose_pine_current_variant]) -end - -return M diff --git a/lua/rose-pine/palette.lua b/lua/rose-pine/palette.lua index 1b27e8b..cfefd65 100644 --- a/lua/rose-pine/palette.lua +++ b/lua/rose-pine/palette.lua @@ -1,68 +1,78 @@ +local options = require("rose-pine.config").options local variants = { main = { - base = '#191724', - surface = '#1f1d2e', - overlay = '#26233a', - muted = '#6e6a86', - subtle = '#908caa', - text = '#e0def4', - love = '#eb6f92', - gold = '#f6c177', - rose = '#ebbcba', - pine = '#31748f', - foam = '#9ccfd8', - iris = '#c4a7e7', - highlight_low = '#21202e', - highlight_med = '#403d52', - highlight_high = '#524f67', - opacity = 0.1, + _nc = "#16141f", + base = "#191724", + surface = "#1f1d2e", + overlay = "#26233a", + muted = "#6e6a86", + subtle = "#908caa", + text = "#e0def4", + love = "#eb6f92", + gold = "#f6c177", + rose = "#ebbcba", + pine = "#31748f", + foam = "#9ccfd8", + iris = "#c4a7e7", + leaf = "#95b1ac", + highlight_low = "#21202e", + highlight_med = "#403d52", + highlight_high = "#524f67", + none = "NONE", }, moon = { - base = '#232136', - surface = '#2a273f', - overlay = '#393552', - muted = '#6e6a86', - subtle = '#908caa', - text = '#e0def4', - love = '#eb6f92', - gold = '#f6c177', - rose = '#ea9a97', - pine = '#3e8fb0', - foam = '#9ccfd8', - iris = '#c4a7e7', - highlight_low = '#2a283e', - highlight_med = '#44415a', - highlight_high = '#56526e', - opacity = 0.1, + _nc = "#1f1d30", + base = "#232136", + surface = "#2a273f", + overlay = "#393552", + muted = "#6e6a86", + subtle = "#908caa", + text = "#e0def4", + love = "#eb6f92", + gold = "#f6c177", + rose = "#ea9a97", + pine = "#3e8fb0", + foam = "#9ccfd8", + iris = "#c4a7e7", + leaf = "#95b1ac", + highlight_low = "#2a283e", + highlight_med = "#44415a", + highlight_high = "#56526e", + none = "NONE", }, dawn = { - base = '#faf4ed', - surface = '#fffaf3', - overlay = '#f2e9e1', - muted = '#9893a5', - subtle = '#797593', - text = '#575279', - love = '#b4637a', - gold = '#ea9d34', - rose = '#d7827e', - pine = '#286983', - foam = '#56949f', - iris = '#907aa9', - highlight_low = '#f4ede8', - highlight_med = '#dfdad9', - highlight_high = '#cecacd', - opacity = 0.05, + _nc = "#f8f0e7", + base = "#faf4ed", + surface = "#fffaf3", + overlay = "#f2e9e1", + muted = "#9893a5", + subtle = "#797593", + text = "#464261", + love = "#b4637a", + gold = "#ea9d34", + rose = "#d7827e", + pine = "#286983", + foam = "#56949f", + iris = "#907aa9", + leaf = "#6d8f89", + highlight_low = "#f4ede8", + highlight_med = "#dfdad9", + highlight_high = "#cecacd", + none = "NONE", }, } -local palette = variants.main - -if string.match(vim.g.rose_pine_variant or '', 'moon') then - palette = variants.moon -elseif string.match(vim.g.rose_pine_variant or '', 'dawn') then - palette = variants.dawn +if options.palette ~= nil and next(options.palette) then + -- handle variant specific overrides + for variant_name, override_palette in pairs(options.palette) do + if variants[variant_name] then + variants[variant_name] = vim.tbl_extend("force", variants[variant_name], override_palette or {}) + end + end end -vim.tbl_deep_extend('force', palette, { none = 'NONE' }) +if variants[options.variant] ~= nil then + return variants[options.variant] +end -return palette +return vim.o.background == "light" and variants.dawn or variants[options.dark_variant or "main"] diff --git a/lua/rose-pine/plugins/bufferline.lua b/lua/rose-pine/plugins/bufferline.lua new file mode 100644 index 0000000..7a96026 --- /dev/null +++ b/lua/rose-pine/plugins/bufferline.lua @@ -0,0 +1,223 @@ +--- Rosé Pine for bufferline +--- https://github.com/akinsho/bufferline.nvim +--- +--- @usage +--- local highlights = require("rose-pine.plugins.bufferline") +--- require("bufferline").setup({ highlights = highlights }) + +local p = require("rose-pine.palette") + +return { + -- fill = { + -- fg = "", + -- bg = "", + -- }, + -- background = { + -- fg = "", + -- bg = "", + -- }, + -- tab = { + -- fg = "", + -- bg = "", + -- }, + tab_selected = { + fg = p.text, + bg = p.overlay, + }, + -- tab_close = { + -- fg = "", + -- bg = "", + -- }, + -- close_button = { + -- fg = "", + -- bg = "", + -- }, + -- close_button_visible = { + -- fg = "", + -- bg = "", + -- }, + -- close_button_selected = { + -- fg = "", + -- bg = "", + -- }, + buffer_visible = { + fg = p.subtle, + bg = p.base, + }, + buffer_selected = { + fg = p.text, + bg = p.surface, + bold = true, + italic = true, + }, + -- diagnostic = { + -- fg = "", + -- bg = "", + -- }, + -- diagnostic_visible = { + -- fg = "", + -- bg = "", + -- }, + -- diagnostic_selected = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- }, + -- info = { + -- fg = "", + -- sp = "", + -- bg = "", + -- }, + -- info_visible = { + -- fg = "", + -- bg = "", + -- }, + -- info_selected = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- sp = "", + -- }, + -- info_diagnostic = { + -- fg = "", + -- sp = "", + -- bg = "", + -- }, + -- info_diagnostic_visible = { + -- fg = "", + -- bg = "", + -- }, + -- info_diagnostic_selected = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- sp = "", + -- }, + -- warning = { + -- fg = "", + -- sp = "", + -- bg = "", + -- }, + -- warning_visible = { + -- fg = "", + -- bg = "", + -- }, + -- warning_selected = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- sp = "", + -- }, + -- warning_diagnostic = { + -- fg = "", + -- sp = "", + -- bg = "", + -- }, + -- warning_diagnostic_visible = { + -- fg = "", + -- bg = "", + -- }, + -- warning_diagnostic_selected = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- sp = warning_diagnostic_fg, + -- }, + -- error = { + -- fg = "", + -- bg = "", + -- sp = "", + -- }, + -- error_visible = { + -- fg = "", + -- bg = "", + -- }, + -- error_selected = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- sp = "", + -- }, + -- error_diagnostic = { + -- fg = "", + -- bg = "", + -- sp = "", + -- }, + -- error_diagnostic_visible = { + -- fg = "", + -- bg = "", + -- }, + -- error_diagnostic_selected = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- sp = "", + -- }, + -- modified = { + -- fg = "", + -- bg = "", + -- }, + -- modified_visible = { + -- fg = "", + -- bg = "", + -- }, + -- modified_selected = { + -- fg = "", + -- bg = "", + -- }, + -- duplicate_selected = { + -- fg = "", + -- italic = true, + -- bg = "", + -- }, + -- duplicate_visible = { + -- fg = "", + -- italic = true, + -- bg = "", + -- }, + -- duplicate = { + -- fg = "", + -- italic = true, + -- bg = "", + -- }, + -- separator_selected = { + -- fg = "", + -- bg = "", + -- }, + -- separator_visible = { + -- fg = "", + -- bg = "", + -- }, + -- separator = { + -- fg = "", + -- bg = "", + -- }, + -- indicator_selected = { + -- fg = "", + -- bg = "", + -- }, + -- pick_selected = { + -- fg = "", + -- bg = "", + -- italic = true, + -- }, + -- pick_visible = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- }, + -- pick = { + -- fg = "", + -- bg = "", + -- bold = true, + -- italic = true, + -- }, +} diff --git a/lua/rose-pine/plugins/galaxyline.lua b/lua/rose-pine/plugins/galaxyline.lua new file mode 100644 index 0000000..05d9b28 --- /dev/null +++ b/lua/rose-pine/plugins/galaxyline.lua @@ -0,0 +1,20 @@ +--- Rosé Pine for galaxyline fork +--- https://github.com/NTBBloodbath/galaxyline.nvim +--- +--- @usage +--- local highlights = require("rose-pine.plugins.galaxyline") + +local p = require("rose-pine.palette") + +return { + bg = p.surface, + fg = p.text, + fg_alt = p.subtle, + yellow = p.gold, + cyan = p.rose, + green = p.pine, + orange = p.muted, + magenta = p.iris, + blue = p.foam, + red = p.love, +} diff --git a/lua/rose-pine/plugins/markid.lua b/lua/rose-pine/plugins/markid.lua new file mode 100644 index 0000000..3d6d8f9 --- /dev/null +++ b/lua/rose-pine/plugins/markid.lua @@ -0,0 +1,10 @@ +--- Rosé Pine for markid +--- https://github.com/David-Kunz/markid +--- +--- @usage +--- local highlights = require("rose-pine.plugins.markid") +--- require("nvim-treesitter.configs").setup({ markid = { enable = true, colors = highlights } }) + +local p = require("rose-pine.palette") + +return { p.foam, p.rose, p.iris } diff --git a/lua/rose-pine/plugins/obsidian.lua b/lua/rose-pine/plugins/obsidian.lua new file mode 100644 index 0000000..43cc3b3 --- /dev/null +++ b/lua/rose-pine/plugins/obsidian.lua @@ -0,0 +1,14 @@ +--- Rosé Pine for Obsidian(epwalsh) +--- https://github.com/epwalsh/obsidian.nvim +--- +--- @usage +--- local highlights = require("rose-pine.plugins.obsidian") +--- require("obsidian").setup({ ui = {hl_groups = highlights} }) + +local p = require("rose-pine.palette") + +return { + ObsidianBullet = { fg = p.muted }, + ObsidianRefText = { underline = true, fg = p.iris }, + ObsidianDone = { bold = true, fg = p.foam } +} diff --git a/lua/rose-pine/plugins/toggleterm.lua b/lua/rose-pine/plugins/toggleterm.lua new file mode 100644 index 0000000..7f808eb --- /dev/null +++ b/lua/rose-pine/plugins/toggleterm.lua @@ -0,0 +1,15 @@ +--- Rosé Pine for toggleterm +--- https://github.com/akinsho/toggleterm.nvim +--- +--- @usage +--- local highlights = require("rose-pine.plugins.toggleterm") +--- require("toggleterm").setup({ highlights = highlights }) + +return { + Normal = { link = "Normal" }, + NormalFloat = { link = "Normal" }, + FloatBorder = { link = "FloatBorder" }, + SignColumn = { link = "SignColumn" }, + StatusLine = { link = "StatusLine" }, + StatusLineNC = { link = "StatusLineNC" }, +} diff --git a/lua/rose-pine/theme.lua b/lua/rose-pine/theme.lua deleted file mode 100644 index 0c9e423..0000000 --- a/lua/rose-pine/theme.lua +++ /dev/null @@ -1,460 +0,0 @@ -local palette = require('rose-pine.palette') -local config = require('rose-pine.config') -local util = require('rose-pine.util') - -local group = config.colors - -local maybe_italic = 'italic' -if config.disable_italics == true then - maybe_italic = nil -end - -local background = palette.base -if config.disable_background then - background = palette.none -end - -local float_background = palette.surface -if config.disable_float_background then - float_background = palette.none -end - -local inactive_background = palette.none -if config.inactive_background then - inactive_background = util.blend('#000000', palette.base, palette.opacity) -end - -local vert_split_background = palette.none -if config.bold_vertical_split_line then - vert_split_background = palette.overlay -end - -local theme = { - ColorColumn = { bg = palette.highlight_high }, - Conceal = { bg = palette.none }, - -- Cursor = {}, - CursorColumn = { bg = palette.overlay }, - -- CursorIM = {}, - CursorLine = { bg = palette.overlay }, - CursorLineNr = { fg = palette.text }, - DarkenedPanel = { bg = palette.surface }, - DarkenedStatusline = { bg = palette.surface }, - DiffAdd = { bg = util.blend(group.git_add, palette.base, 0.5) }, - DiffChange = { bg = palette.overlay }, - DiffDelete = { bg = util.blend(group.git_delete, palette.base, 0.5) }, - DiffText = { bg = util.blend(group.git_text, palette.base, 0.5) }, - diffAdded = { link = 'DiffAdd' }, - diffChanged = { link = 'DiffChange' }, - diffRemoved = { link = 'DiffDelete' }, - Directory = { fg = palette.foam, bg = palette.none }, - -- EndOfBuffer = {}, - ErrorMsg = { fg = palette.love, style = 'bold' }, - FloatBorder = { fg = group.border }, - FoldColumn = { fg = palette.muted }, - Folded = { fg = palette.text, bg = palette.surface }, - IncSearch = { fg = palette.base, bg = palette.rose }, - LineNr = { fg = palette.muted }, - MatchParen = { fg = palette.text, bg = palette.highlight_med }, - ModeMsg = { fg = palette.subtle }, - MoreMsg = { fg = palette.iris }, - NonText = { fg = palette.muted }, - Normal = { fg = palette.text, bg = background }, - NormalFloat = { fg = palette.text, bg = float_background }, - NormalNC = { fg = palette.text, bg = inactive_background }, - NvimInternalError = { fg = '#ffffff', bg = palette.love }, - Pmenu = { fg = palette.subtle, bg = float_background }, - PmenuSbar = { bg = palette.highlight_low }, - PmenuSel = { fg = palette.text, bg = palette.overlay }, - PmenuThumb = { bg = palette.highlight_med }, - Question = { fg = palette.gold }, - -- QuickFixLine = {}, - -- RedrawDebugNormal = {} - RedrawDebugClear = { fg = '#ffffff', bg = palette.gold }, - RedrawDebugComposed = { fg = '#ffffff', bg = palette.pine }, - RedrawDebugRecompose = { fg = '#ffffff', bg = palette.love }, - Search = { bg = palette.highlight_med }, - SpecialKey = { fg = palette.foam }, - SpellBad = { sp = palette.love, style = 'undercurl' }, - SpellCap = { sp = palette.subtle, style = 'undercurl' }, - SpellLocal = { sp = palette.subtle, style = 'undercurl' }, - SpellRare = { sp = palette.subtle, style = 'undercurl' }, - SignColumn = { fg = palette.text, bg = background }, - StatusLine = { fg = palette.subtle, bg = palette.surface }, - StatusLineNC = { fg = palette.muted, bg = palette.base }, - StatusLineTerm = { link = 'StatusLine' }, - StatusLineTermNC = { link = 'StatusLineNC' }, - TabLine = { fg = palette.subtle, bg = palette.surface }, - TabLineFill = { bg = palette.surface }, - TabLineSel = { fg = palette.text, bg = palette.overlay }, - Title = { fg = palette.text }, - VertSplit = { fg = palette.overlay, bg = vert_split_background }, - Visual = { bg = palette.highlight_med }, - -- VisualNOS = {}, - WarningMsg = { fg = palette.gold }, - -- Whitespace = {}, - -- WildMenu = {}, - - Boolean = { fg = palette.rose }, - Character = { fg = palette.gold }, - Comment = { fg = group.comment, style = maybe_italic }, - Conditional = { fg = palette.pine }, - Constant = { fg = palette.gold }, - Debug = { fg = palette.rose }, - Define = { fg = palette.iris }, - Delimiter = { fg = palette.subtle }, - Error = { fg = palette.love }, - Exception = { fg = palette.pine }, - Float = { fg = palette.gold }, - Function = { fg = palette.rose }, - Identifier = { fg = palette.rose }, - -- Ignore = {}, - Include = { fg = palette.iris }, - Keyword = { fg = palette.pine }, - Label = { fg = palette.foam }, - Macro = { fg = palette.iris }, - Number = { fg = palette.gold }, - Operator = { fg = palette.subtle }, - PreCondit = { fg = palette.iris }, - PreProc = { fg = palette.iris }, - Repeat = { fg = palette.pine }, - Special = { fg = palette.rose }, - SpecialChar = { fg = palette.rose }, - SpecialComment = { fg = palette.iris }, - Statement = { fg = palette.pine }, - StorageClass = { fg = palette.foam }, - String = { fg = palette.gold }, - Structure = { fg = palette.foam }, - Tag = { fg = palette.rose }, - Todo = { fg = palette.iris }, - Type = { fg = palette.foam }, - Typedef = { fg = palette.foam }, - Underlined = { style = 'underline' }, - - htmlArg = { fg = palette.iris }, - htmlBold = { style = 'bold' }, - htmlEndTag = { fg = palette.subtle }, - htmlH1 = { fg = group.headings.h1, style = 'bold' }, - htmlH2 = { fg = group.headings.h2, style = 'bold' }, - htmlH3 = { fg = group.headings.h3, style = 'bold' }, - htmlH4 = { fg = group.headings.h4, style = 'bold' }, - htmlH5 = { fg = group.headings.h5, style = 'bold' }, - htmlItalic = { style = maybe_italic }, - htmlLink = { fg = group.link }, - htmlTag = { fg = palette.subtle }, - htmlTagN = { fg = palette.text }, - htmlTagName = { fg = palette.foam }, - - markdownDelimiter = { fg = palette.subtle }, - markdownH1 = { fg = group.headings.h1, style = 'bold' }, - markdownH1Delimiter = { link = 'markdownH1' }, - markdownH2 = { fg = group.headings.h2, style = 'bold' }, - markdownH2Delimiter = { link = 'markdownH2' }, - markdownH3 = { fg = group.headings.h3, style = 'bold' }, - markdownH3Delimiter = { link = 'markdownH3' }, - markdownH4 = { fg = group.headings.h4, style = 'bold' }, - markdownH4Delimiter = { link = 'markdownH4' }, - markdownH5 = { fg = group.headings.h5, style = 'bold' }, - markdownH5Delimiter = { link = 'markdownH5' }, - markdownH6 = { fg = group.headings.h6, style = 'bold' }, - markdownH6Delimiter = { link = 'markdownH6' }, - markdownLinkText = { fg = group.link, style = 'underline' }, - markdownUrl = { link = 'markdownLinkText' }, - - mkdCode = { fg = palette.foam, style = maybe_italic }, - mkdCodeDelimiter = { fg = palette.rose }, - mkdCodeEnd = { fg = palette.foam }, - mkdCodeStart = { fg = palette.foam }, - mkdFootnotes = { fg = palette.foam }, - mkdID = { fg = palette.foam, style = 'underline' }, - mkdInlineURL = { fg = group.link, style = 'underline' }, - mkdLink = { link = 'mkdInlineURL' }, - mkdLinkDef = { link = 'mkdInlineURL' }, - mkdListItemLine = { fg = palette.text }, - mkdRule = { fg = palette.subtle }, - mkdURL = { link = 'mkdInlineURL' }, - - DiagnosticError = { fg = group.error }, - DiagnosticHint = { fg = group.hint }, - DiagnosticInfo = { fg = group.info }, - DiagnosticWarn = { fg = group.warn }, - DiagnosticDefaultError = { fg = group.error }, - DiagnosticDefaultHint = { fg = group.hint }, - DiagnosticDefaultInfo = { fg = group.info }, - DiagnosticDefaultWarn = { fg = group.warn }, - DiagnosticFloatingError = { fg = group.error }, - DiagnosticFloatingHint = { fg = group.hint }, - DiagnosticFloatingInfo = { fg = group.info }, - DiagnosticFloatingWarn = { fg = group.warn }, - DiagnosticSignError = { fg = group.error }, - DiagnosticSignHint = { fg = group.hint }, - DiagnosticSignInfo = { fg = group.info }, - DiagnosticSignWarn = { fg = group.warn }, - DiagnosticUnderlineError = { sp = group.error, style = 'undercurl' }, - DiagnosticUnderlineHint = { sp = group.hint, style = 'undercurl' }, - DiagnosticUnderlineInfo = { sp = group.info, style = 'undercurl' }, - DiagnosticUnderlineWarn = { sp = group.warn, style = 'undercurl' }, - DiagnosticVirtualTextError = { fg = group.error }, - DiagnosticVirtualTextHint = { fg = group.hint }, - DiagnosticVirtualTextInfo = { fg = group.info }, - DiagnosticVirtualTextWarn = { fg = group.warn }, - - LspReferenceText = { fg = palette.rose, bg = palette.highlight_med }, - LspReferenceRead = { fg = palette.rose, bg = palette.highlight_med }, - LspReferenceWrite = { fg = palette.rose, bg = palette.highlight_med }, - - -- TODO: Deprecate in favour of 0.6.0 groups - LspDiagnosticsSignWarning = { link = 'DiagnosticSignWarn' }, - LspDiagnosticsDefaultWarning = { link = 'DiagnosticDefaultWarn' }, - LspDiagnosticsFloatingWarning = { link = 'DiagnosticFloatingWarn' }, - LspDiagnosticsVirtualTextWarning = { link = 'DiagnosticVirtualTextWarn' }, - LspDiagnosticsUnderlineWarning = { link = 'DiagnosticUnderlineWarn' }, - LspDiagnosticsSignHint = { link = 'DiagnosticSignHint' }, - LspDiagnosticsDefaultHint = { link = 'DiagnosticDefaultHint' }, - LspDiagnosticsVirtualTextHint = { link = 'DiagnosticFloatingHint' }, - LspDiagnosticsFloatingHint = { link = 'DiagnosticVirtualTextHint' }, - LspDiagnosticsUnderlineHint = { link = 'DiagnosticUnderlineHint' }, - LspDiagnosticsSignError = { link = 'DiagnosticSignError' }, - LspDiagnosticsDefaultError = { link = 'DiagnosticDefaultError' }, - LspDiagnosticsFloatingError = { link = 'DiagnosticFloatingError' }, - LspDiagnosticsVirtualTextError = { link = 'DiagnosticVirtualTextError' }, - LspDiagnosticsUnderlineError = { link = 'DiagnosticUnderlineError' }, - LspDiagnosticsSignInformation = { link = 'DiagnosticSignInfo' }, - LspDiagnosticsDefaultInformation = { link = 'DiagnosticDefaultInfo' }, - LspDiagnosticsFloatingInformation = { link = 'DiagnosticFloatingInfo' }, - LspDiagnosticsVirtualTextInformation = { link = 'DiagnosticVirtualTextInfo' }, - LspDiagnosticsUnderlineInformation = { link = 'DiagnosticUnderlineInfo' }, - - -- TSAttribute = {}, - TSBoolean = { link = 'Boolean' }, - TSCharacter = { link = 'Character' }, - TSComment = { link = 'Comment' }, - TSConditional = { link = 'Conditional' }, - TSConstBuiltin = { fg = palette.love }, - -- TSConstMacro = {}, - TSConstant = { fg = palette.foam }, - TSConstructor = { fg = palette.foam }, - -- TSEmphasis = {}, - -- TSError = {}, - -- TSException = {}, - TSField = { fg = palette.foam }, - -- TSFloat = {}, - TSFuncBuiltin = { fg = palette.love }, - -- TSFuncMacro = {}, - TSFunction = { fg = palette.rose }, - TSInclude = { fg = palette.pine }, - TSKeyword = { fg = palette.pine }, - -- TSKeywordFunction = {}, - TSKeywordOperator = { fg = palette.subtle }, - TSLabel = { fg = palette.foam }, - -- TSLiteral = {}, - -- TSMethod = {}, - -- TSNamespace = {}, - -- TSNone = {}, - TSNumber = { link = 'Number' }, - TSOperator = { fg = palette.subtle }, - TSParameter = { fg = palette.iris, style = maybe_italic }, - -- TSParameterReference = {}, - TSProperty = { fg = palette.iris, style = maybe_italic }, - TSPunctBracket = { fg = group.punctuation }, - TSPunctDelimiter = { fg = group.punctuation }, - TSPunctSpecial = { fg = group.punctuation }, - -- TSRepeat = {}, - -- TSStrike = {}, - TSString = { link = 'String' }, - TSStringEscape = { fg = palette.pine }, - -- TSStringRegex = {}, - TSStringSpecial = { link = 'TSString' }, - -- TSSymbol = {}, - TSTag = { fg = palette.foam }, - TSTagDelimiter = { fg = palette.subtle }, - TSText = { fg = palette.text }, - TSTitle = { fg = group.headings.h1, style = 'bold' }, - TSType = { link = 'Type' }, - -- TSTypeBuiltin = {}, - TSURI = { fg = group.link }, - -- TSUnderline = {}, - TSVariable = { fg = palette.text, style = maybe_italic }, - TSVariableBuiltin = { fg = palette.love }, - - -- romgrk/barbar.nvim - BufferCurrent = { fg = palette.text, bg = palette.overlay }, - BufferCurrentIndex = { fg = palette.text, bg = palette.overlay }, - BufferCurrentMod = { fg = palette.foam, bg = palette.overlay }, - BufferCurrentSign = { fg = palette.subtle, bg = palette.overlay }, - BufferCurrentTarget = { fg = palette.gold, bg = palette.overlay }, - BufferInactive = { fg = palette.subtle }, - BufferInactiveIndex = { fg = palette.subtle }, - BufferInactiveMod = { fg = palette.foam }, - BufferInactiveSign = { fg = palette.muted }, - BufferInactiveTarget = { fg = palette.gold }, - BufferTabpageFill = { fg = palette.base, bg = palette.base }, - BufferVisible = { fg = palette.subtle }, - BufferVisibleIndex = { fg = palette.subtle }, - BufferVisibleMod = { fg = palette.foam }, - BufferVisibleSign = { fg = palette.muted }, - BufferVisibleTarget = { fg = palette.gold }, - - -- lewis6991/gitsigns.nvim - GitSignsAdd = { fg = group.git_add }, - GitSignsChange = { fg = group.git_change }, - GitSignsDelete = { fg = group.git_delete }, - SignAdd = { link = 'GitSignsAdd' }, - SignChange = { link = 'GitSignsChange' }, - SignDelete = { link = 'GitSignsDelete' }, - - -- mvllow/modes.nvim - ModesCopy = { bg = palette.gold }, - ModesDelete = { bg = palette.love }, - ModesInsert = { bg = palette.foam }, - ModesVisual = { bg = palette.iris }, - - -- kyazdani42/nvim-tree.lua - NvimTreeEmptyFolderName = { fg = palette.muted }, - NvimTreeFileDeleted = { fg = palette.love }, - NvimTreeFileDirty = { fg = palette.rose }, - NvimTreeFileMerge = { fg = palette.iris }, - NvimTreeFileNew = { fg = palette.foam }, - NvimTreeFileRenamed = { fg = palette.pine }, - NvimTreeFileStaged = { fg = palette.iris }, - NvimTreeFolderIcon = { fg = palette.subtle }, - NvimTreeFolderName = { fg = palette.foam }, - NvimTreeGitDeleted = { fg = group.git_delete }, - NvimTreeGitDirty = { fg = group.git_dirty }, - NvimTreeGitIgnored = { fg = group.git_ignore }, - NvimTreeGitMerge = { fg = group.git_merge }, - NvimTreeGitNew = { fg = group.git_add }, - NvimTreeGitRenamed = { fg = group.git_rename }, - NvimTreeGitStaged = { fg = group.git_stage }, - NvimTreeImageFile = { fg = palette.text }, - NvimTreeNormal = { fg = palette.text }, - NvimTreeOpenedFile = { fg = palette.text, bg = palette.highlight_med }, - NvimTreeOpenedFolderName = { fg = palette.foam }, - NvimTreeRootFolder = { fg = palette.iris }, - NvimTreeSpecialFile = { link = 'NvimTreeNormal' }, - NvimTreeWindowPicker = { fg = palette.base, bg = palette.iris }, - - -- folke/which-key.nvim - WhichKey = { fg = palette.iris }, - WhichKeyGroup = { fg = palette.foam }, - WhichKeySeparator = { fg = palette.subtle }, - WhichKeyDesc = { fg = palette.gold }, - WhichKeyFloat = { bg = palette.surface }, - WhichKeyValue = { fg = palette.rose }, - - -- luka-reineke/indent-blankline.nvim - IndentBlanklineChar = { fg = palette.muted }, - - -- hrsh7th/nvim-cmp - CmpItemAbbr = { fg = palette.subtle }, - CmpItemAbbrDeprecated = { fg = palette.subtle, style = 'strikethrough' }, - CmpItemAbbrMatch = { fg = palette.text, style = 'bold' }, - CmpItemAbbrMatchFuzzy = { fg = palette.text, style = 'bold' }, - CmpItemKind = { fg = palette.iris }, - CmpItemKindClass = { fg = palette.gold }, - CmpItemKindFunction = { fg = palette.iris }, - CmpItemKindInterface = { fg = palette.gold }, - CmpItemKindMethod = { fg = palette.iris }, - CmpItemKindSnippet = { fg = palette.iris }, - CmpItemKindVariable = { fg = palette.foam }, - - -- TimUntersberger/neogit - NeogitDiffAddHighlight = { fg = palette.foam, bg = palette.highlight_med }, - NeogitDiffContextHighlight = { bg = palette.highlight_low }, - NeogitDiffDeleteHighlight = { fg = palette.love, bg = palette.highlight_med }, - NeogitHunkHeader = { bg = palette.highlight_low }, - NeogitHunkHeaderHighlight = { bg = palette.highlight_low }, - - -- vimwiki/vimwiki - VimwikiHR = { fg = palette.subtle }, - VimwikiHeader1 = { fg = group.headings.h1, style = 'bold' }, - VimwikiHeader2 = { fg = group.headings.h2, style = 'bold' }, - VimwikiHeader3 = { fg = group.headings.h3, style = 'bold' }, - VimwikiHeader4 = { fg = group.headings.h4, style = 'bold' }, - VimwikiHeader5 = { fg = group.headings.h5, style = 'bold' }, - VimwikiHeader6 = { fg = group.headings.h6, style = 'bold' }, - VimwikiHeaderChar = { fg = palette.pine }, - VimwikiLink = { fg = group.link, style = 'underline' }, - VimwikiList = { fg = palette.iris }, - VimwikiNoExistsLink = { fg = palette.love }, - - -- nvim-neorg/neorg - NeorgHeading1Prefix = { fg = group.headings.h1, style = 'bold' }, - NeorgHeading1Title = { link = 'NeorgHeading1Prefix' }, - NeorgHeading2Prefix = { fg = group.headings.h2, style = 'bold' }, - NeorgHeading2Title = { link = 'NeorgHeading2Prefix' }, - NeorgHeading3Prefix = { fg = group.headings.h3, style = 'bold' }, - NeorgHeading3Title = { link = 'NeorgHeading3Prefix' }, - NeorgHeading4Prefix = { fg = group.headings.h4, style = 'bold' }, - NeorgHeading4Title = { link = 'NeorgHeading4Prefix' }, - NeorgHeading5Prefix = { fg = group.headings.h5, style = 'bold' }, - NeorgHeading5Title = { link = 'NeorgHeading5Prefix' }, - NeorgHeading6Prefix = { fg = group.headings.h6, style = 'bold' }, - NeorgHeading6Title = { link = 'NeorgHeading6Prefix' }, - NeorgMarkerTitle = { fg = palette.text, style = 'bold' }, - - -- tami5/lspsaga.nvim (fork of glepnir/lspsaga.nvim) - DefinitionCount = { fg = palette.rose }, - DefinitionIcon = { fg = palette.rose }, - DefintionPreviewTitle = { fg = palette.rose, style = 'bold' }, - LspFloatWinBorder = { fg = group.border }, - LspFloatWinNormal = { bg = palette.base }, - LspSagaAutoPreview = { fg = palette.subtle }, - LspSagaCodeActionBorder = { fg = group.border }, - LspSagaCodeActionContent = { fg = palette.foam }, - LspSagaCodeActionTitle = { fg = palette.gold, style = 'bold' }, - LspSagaCodeActionTruncateLine = { link = 'LspSagaCodeActionBorder' }, - LspSagaDefPreviewBorder = { fg = group.border }, - LspSagaDiagnosticBorder = { fg = group.border }, - LspSagaDiagnosticHeader = { fg = palette.gold, style = 'bold' }, - LspSagaDiagnosticTruncateLine = { link = 'LspSagaDiagnosticBorder' }, - LspSagaDocTruncateLine = { link = 'LspSagaHoverBorder' }, - LspSagaFinderSelection = { fg = palette.gold }, - LspSagaHoverBorder = { fg = group.border }, - LspSagaLspFinderBorder = { fg = group.border }, - LspSagaRenameBorder = { fg = palette.pine }, - LspSagaRenamePromptPrefix = { fg = palette.love }, - LspSagaShTruncateLine = { link = 'LspSagaSignatureHelpBorder' }, - LspSagaSignatureHelpBorder = { fg = palette.pine }, - ReferencesCount = { fg = palette.rose }, - ReferencesIcon = { fg = palette.rose }, - SagaShadow = { bg = palette.overlay }, - TargetWord = { fg = palette.iris }, - - -- ray-x/lsp_signature.nvim - LspSignatureActiveParameter = { bg = palette.overlay }, - - -- rlane/pounce.nvim - PounceAccept = { fg = palette.love, bg = palette.highlight_high }, - PounceAcceptBest = { fg = palette.base, bg = palette.gold }, - PounceGap = { link = 'Search' }, - PounceMatch = { link = 'Search' }, - - -- nvim-telescope/telescope.nvim - TelescopeBorder = { fg = group.border }, - TelescopeMatching = { fg = palette.rose }, - TelescopeNormal = { fg = palette.subtle }, - TelescopePromptNormal = { fg = palette.text }, - TelescopePromptPrefix = { fg = palette.subtle }, - TelescopeSelection = { fg = palette.text, bg = palette.overlay }, - TelescopeSelectionCaret = { fg = palette.rose, bg = palette.overlay }, - TelescopeTitle = { fg = palette.subtle }, -} - -vim.g.terminal_color_0 = palette.overlay -- black -vim.g.terminal_color_8 = palette.subtle -- bright black -vim.g.terminal_color_1 = palette.love -- red -vim.g.terminal_color_9 = palette.love -- bright red -vim.g.terminal_color_2 = palette.pine -- green -vim.g.terminal_color_10 = palette.pine -- bright green -vim.g.terminal_color_3 = palette.gold -- yellow -vim.g.terminal_color_11 = palette.gold -- bright yellow -vim.g.terminal_color_4 = palette.foam -- blue -vim.g.terminal_color_12 = palette.foam -- bright blue -vim.g.terminal_color_5 = palette.iris -- magenta -vim.g.terminal_color_13 = palette.iris -- bright magenta -vim.g.terminal_color_6 = palette.rose -- cyan -vim.g.terminal_color_14 = palette.rose -- bright cyan -vim.g.terminal_color_7 = palette.text -- white -vim.g.terminal_color_15 = palette.text -- bright white - -return theme diff --git a/lua/rose-pine/util.lua b/lua/rose-pine/util.lua deleted file mode 100644 index 67b5e08..0000000 --- a/lua/rose-pine/util.lua +++ /dev/null @@ -1,32 +0,0 @@ -local util = {} - -local function get_byte(value, offset) - return bit.band(bit.rshift(value, offset), 0xFF) -end - -local function get_color(color) - color = vim.api.nvim_get_color_by_name(color) - - if color == -1 then - color = vim.opt.background:get() == 'dark' and 000 or 255255255 - end - - return { get_byte(color, 16), get_byte(color, 8), get_byte(color, 0) } -end - ----@param fg string foreground color ----@param bg string background color ----@param alpha number number between 0 (background) and 1 (foreground) -function util.blend(fg, bg, alpha) - bg = get_color(bg) - fg = get_color(fg) - - local function blend_channel(i) - local ret = (alpha * fg[i] + ((1 - alpha) * bg[i])) - return math.floor(math.min(math.max(0, ret), 255) + 0.5) - end - - return string.format('#%02X%02X%02X', blend_channel(1), blend_channel(2), blend_channel(3)) -end - -return util diff --git a/lua/rose-pine/utilities.lua b/lua/rose-pine/utilities.lua new file mode 100644 index 0000000..32a8575 --- /dev/null +++ b/lua/rose-pine/utilities.lua @@ -0,0 +1,65 @@ +local utilities = {} + +---@param color string +local function color_to_rgb(color) + local function byte(value, offset) + return bit.band(bit.rshift(value, offset), 0xFF) + end + + local new_color = vim.api.nvim_get_color_by_name(color) + if new_color == -1 then + new_color = vim.opt.background:get() == "dark" and 000 or 255255255 + end + + return { byte(new_color, 16), byte(new_color, 8), byte(new_color, 0) } +end + +local color_cache = {} + +---@param color string Palette key or hex value +function utilities.parse_color(color) + if color_cache[color] then + return color_cache[color] + end + + if color == nil then + print("Invalid color: " .. color) + return nil + end + + color = color:lower() + + if not color:find("#") and color ~= "NONE" then + color = require("rose-pine.palette")[color] or vim.api.nvim_get_color_by_name(color) + end + + color_cache[color] = color + return color +end + +local blend_cache = {} + +---@param fg string Foreground color +---@param bg string Background color +---@param alpha number Between 0 (background) and 1 (foreground) +function utilities.blend(fg, bg, alpha) + local cache_key = fg .. bg .. alpha + if blend_cache[cache_key] then + return blend_cache[cache_key] + end + + local fg_rgb = color_to_rgb(fg) + local bg_rgb = color_to_rgb(bg) + + local function blend_channel(i) + local ret = (alpha * fg_rgb[i] + ((1 - alpha) * bg_rgb[i])) + return math.floor(math.min(math.max(0, ret), 255) + 0.5) + end + + local result = string.format("#%02X%02X%02X", blend_channel(1), blend_channel(2), blend_channel(3)) + + blend_cache[cache_key] = result + return result +end + +return utilities diff --git a/readme.md b/readme.md index bd14ad4..6ef48bc 100644 --- a/readme.md +++ b/readme.md @@ -11,144 +11,151 @@

-## Usage +## Getting started + +Install `rose-pine/neovim` using your favourite package manager: + +### [pam.nvim](https://github.com/mvllow/pam.nvim) ```lua -use({ - 'rose-pine/neovim', - as = 'rose-pine', - -- tag = '...', - config = function() - vim.cmd('colorscheme rose-pine') - end -}) +{ source = "rose-pine/neovim", as = "rose-pine" } ``` -## Plugins +### [lazy.nvim](https://lazy.folke.io/installation) -> PR's are more than welcome if your favourite plugin is missing - -- [neovim diagnostics](https://neovim.io/doc/user/lsp.html) -- [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) -- [barbar.nvim](https://github.com/romgrk/barbar.nvim) -- [gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) -- [mode.nvim](https://github.com/mvllow/modes.nvim) -- [nvim-tree.lua](https://github.com/kyazdani42/nvim-tree.lua) -- [which-key.nvim](https://github.com/folke/which-key.nvim) -- [indent-blankline.nvim](https://github.com/lukas-reineke/indent-blankline.nvim) -- [neogit](https://github.com/TimUntersberger/neogit) -- [neorg](https://github.com/nvim-neorg/neorg) -- [lspsaga.nvim](https://github.com/tami5/lspsaga.nvim) -- [pounce.nvim](https://github.com/rlane/pounce.nvim) -- [telescope.nvim](https://github.com/nvim-telescope/telescope.nvim) -- [lualine.nvim](https://github.com/nvim-lualine/lualine.nvim) +**Structured Setup** ```lua -use({ - 'nvim-lualine/lualine.nvim', - -- Fix mismatch palette between variants - event = 'ColorScheme', +-- lua/plugins/rose-pine.lua +return { + "rose-pine/neovim", + name = "rose-pine", config = function() - require('lualine').setup({ - options = { - ---@usage 'rose-pine' | 'rose-pine-alt' - theme = 'rose-pine' - } - }) + vim.cmd("colorscheme rose-pine") end -}) +} ``` -- [galaxyline.nvim fork](https://github.com/NTBBloodbath/galaxyline.nvim) +**Single file** ```lua -local colors = require("galaxyline.themes.colors")["rose-pine"] +{ "rose-pine/neovim", name = "rose-pine" } ``` ## Gallery **Rosé Pine** -![Rosé Pine with Neovim](assets/rose-pine.png) +![Rosé Pine with Neovim](https://user-images.githubusercontent.com/1973/163921570-0f577baf-3199-4f09-9779-a7eb9238151a.png) **Rosé Pine Moon** -![Rosé Pine Moon with Neovim](assets/rose-pine-moon.png) +![Rosé Pine Moon with Neovim](https://user-images.githubusercontent.com/1973/163921620-d3acd0d2-d227-4d28-a5e8-97ff22e56c6d.png) **Rosé Pine Dawn** -![Rosé Pine Dawn with Neovim](assets/rose-pine-dawn.png) +![Rosé Pine Dawn with Neovim](https://user-images.githubusercontent.com/1973/163921656-644a2db3-c55c-4e89-9bdd-39cdd7a2681b.png) ## Options -> Options should be set **before** colorscheme +> [!IMPORTANT] +> Configure options _before_ setting colorscheme. + +Rosé Pine has three variants: main, moon, and dawn. By default, `vim.o.background` is followed, using dawn when light and `dark_variant` when dark. + +Colour values accept named colours from the [Rosé Pine palette](https://rosepinetheme.com/palette/ingredients/), e.g. "foam", or valid hex, e.g. "#fa8072". ```lua --- set theme variant, matching terminal theme if unset --- @usage 'main' | 'moon' | 'dawn' -vim.g.rose_pine_variant = '' +require("rose-pine").setup({ + variant = "auto", -- auto, main, moon, or dawn + dark_variant = "main", -- main, moon, or dawn + dim_inactive_windows = false, + extend_background_behind_borders = true, -vim.g.rose_pine_bold_vertical_split_line = false -vim.g.rose_pine_disable_background = false -vim.g.rose_pine_disable_float_background = false -vim.g.rose_pine_disable_italics = false -vim.g.rose_pine_inactive_background = false + enable = { + terminal = true, + legacy_highlights = true, -- Improve compatibility for previous versions of Neovim + migrations = true, -- Handle deprecated options automatically + }, -local palette = require('rose-pine.palette') -vim.g.rose_pine_colors = { - border = palette.highlight_med, - comment = palette.muted, - link = palette.iris, - punctuation = palette.subtle, + styles = { + bold = true, + italic = true, + transparency = false, + }, - error = palette.love, - hint = palette.iris, - info = palette.foam, - warn = palette.gold, + groups = { + border = "muted", + link = "iris", + panel = "surface", - git_add = palette.foam, - git_change = palette.rose, - git_delete = palette.love, - git_dirty = palette.rose, - git_ignore = palette.muted, - git_merge = palette.iris, - git_rename = palette.pine, - git_stage = palette.iris, - git_text = palette.rose, + error = "love", + hint = "iris", + info = "foam", + note = "pine", + todo = "rose", + warn = "gold", - -- or set all headings to one colour: `headings = palette.text` - headings = { - h1 = palette.iris, - h2 = palette.foam, - h3 = palette.rose, - h4 = palette.gold, - h5 = palette.pine, - h6 = palette.foam, - }, -} + git_add = "foam", + git_change = "rose", + git_delete = "love", + git_dirty = "rose", + git_ignore = "muted", + git_merge = "iris", + git_rename = "pine", + git_stage = "iris", + git_text = "rose", + git_untracked = "subtle", --- Set colorscheme after options -vim.cmd('colorscheme rose-pine') + h1 = "iris", + h2 = "foam", + h3 = "rose", + h4 = "gold", + h5 = "pine", + h6 = "foam", + }, + + palette = { + -- Override the builtin palette per variant + -- moon = { + -- base = '#18191a', + -- overlay = '#363738', + -- }, + }, + + -- NOTE: Highlight groups are extended (merged) by default. Disable this + -- per group via `inherit = false` + highlight_groups = { + -- Comment = { fg = "foam" }, + -- StatusLine = { fg = "love", bg = "love", blend = 15 }, + -- VertSplit = { fg = "muted", bg = "muted" }, + -- Visual = { fg = "base", bg = "text", inherit = false }, + }, + + before_highlight = function(group, highlight, palette) + -- Disable all undercurls + -- if highlight.undercurl then + -- highlight.undercurl = false + -- end + -- + -- Change palette colour + -- if highlight.fg == palette.pine then + -- highlight.fg = palette.foam + -- end + end, +}) + +vim.cmd("colorscheme rose-pine") +-- vim.cmd("colorscheme rose-pine-main") +-- vim.cmd("colorscheme rose-pine-moon") +-- vim.cmd("colorscheme rose-pine-dawn") ``` -## Suggested keymaps - -```lua --- toggle between all variants -vim.keymap.set('n', 'tt', require('rose-pine').toggle) - --- or toggle between some variants -vim.keymap.set('n', 'tt', function() return require('rose-pine').toggle({'moon', 'dawn'}) end) - --- set variant -vim.keymap.set('n', 't1', function() return require('rose-pine').set('main') end) -vim.keymap.set('n', 't2', function() return require('rose-pine').set('moon') end) -vim.keymap.set('n', 't3', function() return require('rose-pine').set('dawn') end) -``` +> [!NOTE] +> Visit the [wiki](https://github.com/rose-pine/neovim/wiki) for [plugin configurations](https://github.com/rose-pine/neovim/wiki/Plugin-configurations) and [recipes](https://github.com/rose-pine/neovim/wiki/Recipes). ## Contributing -We welcome and appreciate any help in creating a lovely experience for all. +We welcome and appreciate contributions of any kind. Create an issue or start a discussion for any proposed changes. Pull requests are encouraged for supporting additional plugins or [treesitter improvements](https://github.com/nvim-treesitter/nvim-treesitter/blob/master/CONTRIBUTING.md#highlights). -- [Get highlight groups under cursor](https://github.com/nvim-treesitter/playground#show-treesitter-and-syntax-highlight-groups-under-the-cursor) -- [Adding new highlight groups](https://github.com/rose-pine/neovim/issues/6#issuecomment-962466323) +Feel free to update the [wiki](https://github.com/rose-pine/neovim/wiki/) with any [recipes](https://github.com/rose-pine/neovim/wiki/Recipes).