diff --git a/.stylua.toml b/.stylua.toml
deleted file mode 100644
index 9d5f2474..00000000
--- a/.stylua.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-column_width = 80
-indent_type = "Tabs"
-line_endings = "Unix"
-quote_style = "AutoPreferSingle"
diff --git a/changelog.md b/changelog.md
new file mode 100644
index 00000000..bd583ba1
--- /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
index 3ce16803..a95b327d 100644
--- a/colors/rose-pine-dawn.lua
+++ b/colors/rose-pine-dawn.lua
@@ -1,2 +1,2 @@
-package.loaded['rose-pine.palette'] = nil
-require('rose-pine').colorscheme('dawn')
+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
index e09c69de..15729c96 100644
--- a/colors/rose-pine-main.lua
+++ b/colors/rose-pine-main.lua
@@ -1,2 +1,2 @@
-package.loaded['rose-pine.palette'] = nil
-require('rose-pine').colorscheme('main')
+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
index 7196100f..34b58c0e 100644
--- a/colors/rose-pine-moon.lua
+++ b/colors/rose-pine-moon.lua
@@ -1,2 +1,2 @@
-package.loaded['rose-pine.palette'] = nil
-require('rose-pine').colorscheme('moon')
+package.loaded["rose-pine.palette"] = nil
+require("rose-pine").colorscheme("moon")
diff --git a/colors/rose-pine.lua b/colors/rose-pine.lua
index 71f155fb..f7052907 100644
--- a/colors/rose-pine.lua
+++ b/colors/rose-pine.lua
@@ -1,2 +1,2 @@
-package.loaded['rose-pine.palette'] = nil
-require('rose-pine').colorscheme()
+package.loaded["rose-pine.palette"] = nil
+require("rose-pine").colorscheme()
diff --git a/lua/lualine/themes/rose-pine-alt.lua b/lua/lualine/themes/rose-pine-alt.lua
deleted file mode 100644
index 1e1ee362..00000000
--- a/lua/lualine/themes/rose-pine-alt.lua
+++ /dev/null
@@ -1,26 +0,0 @@
-local p = require('rose-pine.palette')
-
-return {
- normal = {
- 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' },
- },
- insert = {
- a = { bg = p.surface, fg = p.foam, gui = 'bold' },
- },
- visual = {
- a = { bg = p.surface, fg = p.iris, gui = 'bold' },
- },
- replace = {
- a = { bg = p.surface, fg = p.pine, gui = 'bold' },
- },
- command = {
- 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' },
- },
-}
diff --git a/lua/lualine/themes/rose-pine.lua b/lua/lualine/themes/rose-pine.lua
deleted file mode 100644
index dde30751..00000000
--- a/lua/lualine/themes/rose-pine.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local p = require('rose-pine.palette')
-
-return {
- normal = {
- a = { bg = p.rose, fg = p.base, gui = 'bold' },
- b = { bg = p.overlay, fg = p.rose },
- c = { bg = p.base, fg = p.text },
- },
- insert = {
- a = { bg = p.foam, fg = p.base, gui = 'bold' },
- b = { bg = p.overlay, fg = p.foam },
- c = { bg = p.base, fg = p.text },
- },
- visual = {
- a = { bg = p.iris, fg = p.base, gui = 'bold' },
- b = { bg = p.overlay, fg = p.iris },
- c = { bg = p.base, fg = p.text },
- },
- replace = {
- a = { bg = p.pine, fg = p.base, gui = 'bold' },
- b = { bg = p.overlay, fg = p.pine },
- c = { bg = p.base, fg = p.text },
- },
- command = {
- a = { bg = p.love, fg = p.base, gui = 'bold' },
- b = { bg = p.overlay, fg = p.love },
- c = { bg = p.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 },
- },
-}
diff --git a/lua/rose-pine.lua b/lua/rose-pine.lua
deleted file mode 100644
index b3cf3ea9..00000000
--- a/lua/rose-pine.lua
+++ /dev/null
@@ -1,22 +0,0 @@
-local config = require('rose-pine.config')
-local M = {}
-
----@param variant Variant|nil
-function M.colorscheme(variant)
- config.extend({ 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'
-
- require('rose-pine.theme')._load(config.options)
-end
-
-function M.setup(options)
- config.extend(options)
-end
-
-return M
diff --git a/lua/rose-pine/config.lua b/lua/rose-pine/config.lua
deleted file mode 100644
index 58674d76..00000000
--- a/lua/rose-pine/config.lua
+++ /dev/null
@@ -1,68 +0,0 @@
----@alias Variant "main" | "moon" | "dawn"
----@alias Color { fg: string, bg: string, sp: string, bold: boolean, italic: boolean, undercurl: boolean, underline: boolean, underdouble: boolean, underdotted: boolean, underdashed: boolean, strikethrough: boolean }
-
-local M = {}
-
----@class Options
-M.options = {
- ---Set the desired variant: "auto" will follow the vim background,
- ---defaulting to "main" for dark and "dawn" for light. To change the dark
- ---variant, use `options.dark_variant = "moon"`.
- ---@type "auto" | Variant
- variant = 'auto',
-
- ---Set the desired dark variant: applies when `options.variant` is set to
- ---"auto" to match `vim.o.background`.
- ---@type Variant
- dark_variant = 'main',
-
- bold_vert_split = false,
-
- dim_nc_background = false,
-
- disable_background = false,
- disable_float_background = false,
- disable_italics = false,
-
- groups = {
- background = 'base',
- background_nc = 'nc',
- panel = 'surface',
- panel_nc = 'base',
- border = 'highlight_med',
- comment = 'muted',
- link = 'iris',
- punctuation = 'muted',
- error = 'love',
- hint = 'iris',
- info = 'foam',
- warn = 'gold',
- 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',
- headings = {
- h1 = 'iris',
- h2 = 'foam',
- h3 = 'rose',
- h4 = 'gold',
- h5 = 'pine',
- h6 = 'foam',
- },
- },
-
- ---@type table
- highlight_groups = {},
-}
-
----@param options Options|nil
-function M.extend(options)
- M.options = vim.tbl_deep_extend('force', M.options, options or {})
-end
-
-return M
diff --git a/lua/rose-pine/palette.lua b/lua/rose-pine/palette.lua
deleted file mode 100644
index 66d6438b..00000000
--- a/lua/rose-pine/palette.lua
+++ /dev/null
@@ -1,74 +0,0 @@
-local options = require('rose-pine.config').options
-
-local variants = {
- main = {
- ---@deprecated for backwards compatibility
- _experimental_nc = '#16141f',
- 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',
- highlight_low = '#21202e',
- highlight_med = '#403d52',
- highlight_high = '#524f67',
- none = 'NONE',
- },
- moon = {
- ---@deprecated for backwards compatibility
- _experimental_nc = '#1f1d30',
- 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',
- highlight_low = '#2a283e',
- highlight_med = '#44415a',
- highlight_high = '#56526e',
- none = 'NONE',
- },
- dawn = {
- ---@deprecated for backwards compatibility
- _experimental_nc = '#f8f0e7',
- nc = '#f8f0e7',
- 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',
- none = 'NONE',
- },
-}
-
-if variants[options.variant] ~= nil then
- return variants[options.variant]
-end
-
-return vim.o.background == 'light' and variants.dawn
- or variants[options.dark_variant or 'main']
diff --git a/lua/rose-pine/plugins/toggleterm.lua b/lua/rose-pine/plugins/toggleterm.lua
deleted file mode 100644
index 38924f9d..00000000
--- a/lua/rose-pine/plugins/toggleterm.lua
+++ /dev/null
@@ -1,15 +0,0 @@
---- 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 c702531a..00000000
--- a/lua/rose-pine/theme.lua
+++ /dev/null
@@ -1,620 +0,0 @@
-local M = {}
-
----@param options Options
-function M._load(options)
- local h = require('rose-pine.util').highlight
- local p = require('rose-pine.palette')
-
- local groups = options.groups or {}
- local maybe = {
- base = (options.disable_background and p.none) or groups.background,
- surface = (options.disable_float_background and p.none) or groups.panel,
- italic = not options.disable_italics,
- }
- maybe.bold_vert_split = (options.bold_vert_split and groups.border)
- or p.none
- maybe.dim_nc_background = (
- options.dim_nc_background and groups.background_nc
- ) or maybe.base
-
- local float_background = options.dim_nc_background
- and (options.disable_float_background and groups.panel_nc or groups.panel)
- or maybe.surface
-
- M.defaults = {
- ['ColorColumn'] = { bg = p.overlay },
- ['Conceal'] = { bg = p.none },
- ['CurSearch'] = { link = 'IncSearch' },
- ['Cursor'] = { fg = p.text, bg = p.highlight_high },
- ['CursorColumn'] = { bg = p.highlight_low },
- -- CursorIM = {},
- ['CursorLine'] = { bg = p.highlight_low },
- ['CursorLineNr'] = { fg = p.text },
- ['DarkenedPanel'] = { bg = maybe.surface },
- ['DarkenedStatusline'] = { bg = maybe.surface },
- ['DiffAdd'] = { bg = groups.git_add, blend = 20 },
-
- ['DiffChange'] = { bg = p.overlay },
- ['DiffDelete'] = { bg = groups.git_delete, blend = 20 },
- ['DiffText'] = { bg = groups.git_text, blend = 20 },
- ['diffAdded'] = { link = 'DiffAdd' },
- ['diffChanged'] = { link = 'DiffChange' },
- ['diffRemoved'] = { link = 'DiffDelete' },
- ['Directory'] = { fg = p.foam, bg = p.none },
- -- EndOfBuffer = {},
- ['ErrorMsg'] = { fg = p.love, bold = true },
- ['FloatBorder'] = { fg = groups.border, bg = maybe.surface },
- ['FloatTitle'] = { fg = p.muted },
- ['FoldColumn'] = { fg = p.muted },
- ['Folded'] = { fg = p.text, bg = maybe.surface },
- ['IncSearch'] = { fg = groups.background, bg = p.rose },
- ['LineNr'] = { fg = p.muted },
- ['MatchParen'] = { fg = p.text, bg = p.highlight_med },
- ['ModeMsg'] = { fg = p.subtle },
- ['MoreMsg'] = { fg = p.iris },
- ['NonText'] = { fg = p.muted },
- ['Normal'] = { fg = p.text, bg = maybe.base },
- ['NormalFloat'] = { fg = p.text, bg = maybe.surface },
- ['NormalNC'] = { fg = p.text, bg = maybe.dim_nc_background },
- ['NvimInternalError'] = { fg = '#ffffff', bg = p.love },
- ['Pmenu'] = { fg = p.subtle, bg = maybe.surface },
- ['PmenuSbar'] = { bg = p.highlight_low },
- ['PmenuSel'] = { fg = p.text, bg = p.overlay },
- ['PmenuThumb'] = { bg = p.highlight_med },
- ['Question'] = { fg = p.gold },
- -- QuickFixLine = {},
- -- RedrawDebugNormal = {}
- ['RedrawDebugClear'] = { fg = '#ffffff', bg = p.gold },
- ['RedrawDebugComposed'] = { fg = '#ffffff', bg = p.pine },
- ['RedrawDebugRecompose'] = { fg = '#ffffff', bg = p.love },
- ['Search'] = { bg = p.highlight_med },
- ['SpecialKey'] = { fg = p.foam },
- ['SpellBad'] = { sp = p.subtle, undercurl = true },
- ['SpellCap'] = { sp = p.subtle, undercurl = true },
- ['SpellLocal'] = { sp = p.subtle, undercurl = true },
- ['SpellRare'] = { sp = p.subtle, undercurl = true },
- ['SignColumn'] = {
- fg = p.text,
- bg = (options.dim_nc_background and p.none) or maybe.base,
- },
- ['Substitute'] = { fg = p.base, bg = p.love },
- ['StatusLine'] = { fg = p.subtle, bg = groups.panel },
- ['StatusLineNC'] = { fg = p.muted, bg = groups.panel_nc },
- ['StatusLineTerm'] = { link = 'StatusLine' },
- ['StatusLineTermNC'] = { link = 'StatusLineNC' },
- ['TabLine'] = { fg = p.subtle, bg = groups.panel },
- ['TabLineFill'] = { bg = groups.panel },
- ['TabLineSel'] = { fg = p.text, bg = p.overlay },
- ['Title'] = { fg = p.text },
- ['VertSplit'] = { fg = groups.border, bg = maybe.bold_vert_split },
- ['Visual'] = { bg = p.highlight_med },
- -- VisualNOS = {},
- ['WarningMsg'] = { fg = p.gold },
- -- Whitespace = {},
- ['WildMenu'] = { link = 'IncSearch' },
-
- ['Boolean'] = { fg = p.rose },
- ['Character'] = { fg = p.gold },
- ['Comment'] = { fg = groups.comment, italic = maybe.italic },
- ['Conditional'] = { fg = p.pine },
- ['Constant'] = { fg = p.gold },
- ['Debug'] = { fg = p.rose },
- ['Define'] = { fg = p.iris },
- ['Delimiter'] = { fg = p.subtle },
- ['Error'] = { fg = p.love },
- ['Exception'] = { fg = p.pine },
- ['Float'] = { fg = p.gold },
- ['Function'] = { fg = p.rose },
- ['Identifier'] = { fg = p.rose },
- -- Ignore = {},
- ['Include'] = { fg = p.pine },
- ['Keyword'] = { fg = p.pine },
- ['Label'] = { fg = p.foam },
- ['Macro'] = { fg = p.iris },
- ['Number'] = { fg = p.gold },
- ['Operator'] = { fg = p.subtle },
- ['PreCondit'] = { fg = p.iris },
- ['PreProc'] = { fg = p.iris },
- ['Repeat'] = { fg = p.pine },
- ['Special'] = { fg = p.rose },
- ['SpecialChar'] = { fg = p.rose },
- ['SpecialComment'] = { fg = p.iris },
- ['Statement'] = { fg = p.pine },
- ['StorageClass'] = { fg = p.foam },
- ['String'] = { fg = p.gold },
- ['Structure'] = { fg = p.foam },
- ['Tag'] = { fg = p.foam },
- ['Todo'] = { fg = p.iris },
- ['Type'] = { fg = p.foam },
- ['Typedef'] = { link = 'Type' },
- ['Underlined'] = { underline = true },
-
- ['htmlArg'] = { fg = p.iris },
- ['htmlBold'] = { bold = true },
- ['htmlEndTag'] = { fg = p.subtle },
- ['htmlH1'] = { fg = groups.headings.h1, bold = true },
- ['htmlH2'] = { fg = groups.headings.h2, bold = true },
- ['htmlH3'] = { fg = groups.headings.h3, bold = true },
- ['htmlH4'] = { fg = groups.headings.h4, bold = true },
- ['htmlH5'] = { fg = groups.headings.h5, bold = true },
- ['htmlItalic'] = { italic = maybe.italic },
- ['htmlLink'] = { fg = groups.link },
- ['htmlTag'] = { fg = p.subtle },
- ['htmlTagN'] = { fg = p.text },
- ['htmlTagName'] = { fg = p.foam },
-
- ['markdownDelimiter'] = { fg = p.subtle },
- ['markdownH1'] = { fg = groups.headings.h1, bold = true },
- ['markdownH1Delimiter'] = { link = 'markdownH1' },
- ['markdownH2'] = { fg = groups.headings.h2, bold = true },
- ['markdownH2Delimiter'] = { link = 'markdownH2' },
- ['markdownH3'] = { fg = groups.headings.h3, bold = true },
- ['markdownH3Delimiter'] = { link = 'markdownH3' },
- ['markdownH4'] = { fg = groups.headings.h4, bold = true },
- ['markdownH4Delimiter'] = { link = 'markdownH4' },
- ['markdownH5'] = { fg = groups.headings.h5, bold = true },
- ['markdownH5Delimiter'] = { link = 'markdownH5' },
- ['markdownH6'] = { fg = groups.headings.h6, bold = true },
- ['markdownH6Delimiter'] = { link = 'markdownH6' },
- ['markdownLinkText'] = { fg = groups.link, sp = groups.link, underline = true },
- ['markdownUrl'] = { link = 'markdownLinkText' },
-
- ['mkdCode'] = { fg = p.foam, italic = maybe.italic },
- ['mkdCodeDelimiter'] = { fg = p.rose },
- ['mkdCodeEnd'] = { fg = p.foam },
- ['mkdCodeStart'] = { fg = p.foam },
- ['mkdFootnotes'] = { fg = p.foam },
- ['mkdID'] = { fg = p.foam, underline = true },
- ['mkdInlineURL'] = { fg = groups.link, underline = true },
- ['mkdLink'] = { link = 'mkdInlineURL' },
- ['mkdLinkDef'] = { link = 'mkdInlineURL' },
- ['mkdListItemLine'] = { fg = p.text },
- ['mkdRule'] = { fg = p.subtle },
- ['mkdURL'] = { link = 'mkdInlineURL' },
-
- ['DiagnosticError'] = { fg = groups.error },
- ['DiagnosticHint'] = { fg = groups.hint },
- ['DiagnosticInfo'] = { fg = groups.info },
- ['DiagnosticWarn'] = { fg = groups.warn },
- ['DiagnosticDefaultError'] = { fg = groups.error },
- ['DiagnosticDefaultHint'] = { fg = groups.hint },
- ['DiagnosticDefaultInfo'] = { fg = groups.info },
- ['DiagnosticDefaultWarn'] = { fg = groups.warn },
- ['DiagnosticFloatingError'] = { fg = groups.error },
- ['DiagnosticFloatingHint'] = { fg = groups.hint },
- ['DiagnosticFloatingInfo'] = { fg = groups.info },
- ['DiagnosticFloatingWarn'] = { fg = groups.warn },
- ['DiagnosticSignError'] = { fg = groups.error },
- ['DiagnosticSignHint'] = { fg = groups.hint },
- ['DiagnosticSignInfo'] = { fg = groups.info },
- ['DiagnosticSignWarn'] = { fg = groups.warn },
- ['DiagnosticStatusLineError'] = { fg = groups.error, bg = groups.panel },
- ['DiagnosticStatusLineHint'] = { fg = groups.hint, bg = groups.panel },
- ['DiagnosticStatusLineInfo'] = { fg = groups.info, bg = groups.panel },
- ['DiagnosticStatusLineWarn'] = { fg = groups.warn, bg = groups.panel },
- ['DiagnosticUnderlineError'] = { sp = groups.error, undercurl = true },
- ['DiagnosticUnderlineHint'] = { sp = groups.hint, undercurl = true },
- ['DiagnosticUnderlineInfo'] = { sp = groups.info, undercurl = true },
- ['DiagnosticUnderlineWarn'] = { sp = groups.warn, undercurl = true },
- ['DiagnosticVirtualTextError'] = { fg = groups.error },
- ['DiagnosticVirtualTextHint'] = { fg = groups.hint },
- ['DiagnosticVirtualTextInfo'] = { fg = groups.info },
- ['DiagnosticVirtualTextWarn'] = { fg = groups.warn },
-
- -- healthcheck
- ['healthError'] = { fg = groups.error },
- ['healthSuccess'] = { fg = groups.info },
- ['healthWarning'] = { fg = groups.warn },
-
- -- Treesitter
- ['@boolean'] = { link = 'Boolean' },
- ['@character'] = { link = 'Character' },
- ['@character.special'] = { link = '@character' },
- ['@class'] = { fg = p.foam },
- ['@comment'] = { link = 'Comment' },
- ['@conditional'] = { link = 'Conditional' },
- ['@constant'] = { link = 'Constant' },
- ['@constant.builtin'] = { fg = p.love },
- ['@constant.macro'] = { link = '@constant' },
- ['@constructor'] = { fg = p.foam },
- ['@field'] = { fg = p.foam },
- ['@function'] = { link = 'Function' },
- ['@function.builtin'] = { fg = p.love },
- ['@function.macro'] = { link = '@function' },
- ['@include'] = { link = 'Include' },
- ['@interface'] = { fg = p.foam },
- ['@keyword'] = { link = 'Keyword' },
- ['@keyword.operator'] = { fg = p.subtle },
- ['@label'] = { link = 'Label' },
- ['@macro'] = { link = 'Macro' },
- ['@method'] = { fg = p.rose },
- ['@number'] = { link = 'Number' },
- ['@operator'] = { link = 'Operator' },
- ['@parameter'] = { fg = p.iris, italic = maybe.italic },
- ['@preproc'] = { link = 'PreProc' },
- ['@property'] = { fg = p.foam, italic = maybe.italic },
- ['@punctuation'] = { fg = groups.punctuation },
- ['@punctuation.bracket'] = { link = '@punctuation' },
- ['@punctuation.delimiter'] = { link = '@punctuation' },
- ['@punctuation.special'] = { link = '@punctuation' },
- ['@regexp'] = { link = 'String' },
- ['@repeat'] = { link = 'Repeat' },
- ['@storageclass'] = { link = 'StorageClass' },
- ['@string'] = { link = 'String' },
- ['@string.escape'] = { fg = p.pine },
- ['@string.special'] = { link = '@string' },
- ['@symbol'] = { link = 'Identifier' },
- ['@tag'] = { link = 'Tag' },
- ['@tag.attribute'] = { fg = p.iris },
- ['@tag.delimiter'] = { fg = p.subtle },
- ['@text'] = { fg = p.text },
- ['@text.strong'] = { bold = true },
- ['@text.emphasis'] = { italic = true },
- ['@text.underline'] = { underline = true },
- ['@text.strike'] = { strikethrough = true },
- ['@text.math'] = { link = 'Special' },
- ['@text.environment'] = { link = 'Macro' },
- ['@text.environment.name'] = { link = 'Type' },
- ['@text.title'] = { link = 'Title' },
- ['@text.uri'] = { fg = groups.link },
- ['@text.note'] = { link = 'SpecialComment' },
- ['@text.warning'] = { fg = groups.warn },
- ['@text.danger'] = { fg = groups.error },
- ['@todo'] = { link = 'Todo' },
- ['@type'] = { link = 'Type' },
- ['@variable'] = { fg = p.text, italic = maybe.italic },
- ['@variable.builtin'] = { fg = p.love },
- ['@namespace'] = { link = '@include' },
-
- -- LSP Semantic Token Groups
- ['@lsp.type.comment'] = {},
- ['@lsp.type.enum'] = { link = '@type' },
- ['@lsp.type.keyword'] = { link = '@keyword' },
- ['@lsp.type.interface'] = { link = '@interface' },
- ['@lsp.type.namespace'] = { link = '@namespace' },
- ['@lsp.type.parameter'] = { link = '@parameter' },
- ['@lsp.type.property'] = { link = '@property' },
- ['@lsp.type.variable'] = {}, -- use treesitter styles for regular variables
- ['@lsp.typemod.function.defaultLibrary'] = { link = 'Special' },
- ['@lsp.typemod.variable.defaultLibrary'] = { link = '@variable.builtin' },
-
- -- LSP Injected Groups
- ['@lsp.typemod.operator.injected'] = { link = '@operator' },
- ['@lsp.typemod.string.injected'] = { link = '@string' },
- ['@lsp.typemod.variable.injected'] = { link = '@variable' },
-
- -- nvim-treesitter Markdown Headings
- ['@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' },
-
- -- vim.lsp.buf.document_highlight()
- ['LspReferenceText'] = { bg = p.highlight_med },
- ['LspReferenceRead'] = { bg = p.highlight_med },
- ['LspReferenceWrite'] = { bg = p.highlight_med },
-
- -- lsp-highlight-codelens
- ['LspCodeLens'] = { fg = p.subtle }, -- virtual text of code len
- ['LspCodeLensSeparator'] = { fg = p.highlight_high }, -- separator between two or more code len
-
- -- romgrk/barbar.nvim
- ['BufferCurrent'] = { fg = p.text, bg = p.overlay },
- ['BufferCurrentIndex'] = { fg = p.text, bg = p.overlay },
- ['BufferCurrentMod'] = { fg = p.foam, bg = p.overlay },
- ['BufferCurrentSign'] = { fg = p.subtle, bg = p.overlay },
- ['BufferCurrentTarget'] = { fg = p.gold, bg = p.overlay },
- ['BufferInactive'] = { fg = p.subtle },
- ['BufferInactiveIndex'] = { fg = p.subtle },
- ['BufferInactiveMod'] = { fg = p.foam },
- ['BufferInactiveSign'] = { fg = p.muted },
- ['BufferInactiveTarget'] = { fg = p.gold },
- ['BufferTabpageFill'] = { fg = groups.background, bg = groups.background },
- ['BufferVisible'] = { fg = p.subtle },
- ['BufferVisibleIndex'] = { fg = p.subtle },
- ['BufferVisibleMod'] = { fg = p.foam },
- ['BufferVisibleSign'] = { fg = p.muted },
- ['BufferVisibleTarget'] = { fg = p.gold },
-
- -- lewis6991/gitsigns.nvim
- ['GitSignsAdd'] = { fg = groups.git_add, bg = groups.background },
- ['GitSignsChange'] = { fg = groups.git_change, bg = groups.background },
- ['GitSignsDelete'] = { fg = groups.git_delete, bg = groups.background },
- ['SignAdd'] = { link = 'GitSignsAdd' },
- ['SignChange'] = { link = 'GitSignsChange' },
- ['SignDelete'] = { link = 'GitSignsDelete' },
-
- -- mvllow/modes.nvim
- ['ModesCopy'] = { bg = p.gold },
- ['ModesDelete'] = { bg = p.love },
- ['ModesInsert'] = { bg = p.foam },
- ['ModesVisual'] = { bg = p.iris },
-
- -- kyazdani42/nvim-tree.lua
- ['NvimTreeEmptyFolderName'] = { fg = p.muted },
- ['NvimTreeFileDeleted'] = { fg = p.love },
- ['NvimTreeFileDirty'] = { fg = p.rose },
- ['NvimTreeFileMerge'] = { fg = p.iris },
- ['NvimTreeFileNew'] = { fg = p.foam },
- ['NvimTreeFileRenamed'] = { fg = p.pine },
- ['NvimTreeFileStaged'] = { fg = p.iris },
- ['NvimTreeFolderIcon'] = { fg = p.subtle },
- ['NvimTreeFolderName'] = { fg = p.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 = p.text },
- ['NvimTreeNormal'] = { fg = p.text },
- ['NvimTreeOpenedFile'] = { fg = p.text, bg = p.highlight_med },
- ['NvimTreeOpenedFolderName'] = { link = 'NvimTreeFolderName' },
- ['NvimTreeRootFolder'] = { fg = p.iris },
- ['NvimTreeSpecialFile'] = { link = 'NvimTreeNormal' },
- ['NvimTreeWindowPicker'] = { fg = p.love, bg = p.love, blend = 10 },
-
- -- nvim-neo-tree/neo-tree.nvim
- ['NeoTreeTitleBar'] = { fg = p.surface, bg = p.pine },
- ['NeoTreeGitAdded'] = { fg = p.foam },
- ['NeoTreeGitModified'] = { fg = p.rose },
- ['NeoTreeGitDeleted'] = { fg = p.love },
- ['NeoTreeGitRenamed'] = { fg = p.pine },
- ['NeoTreeGitIgnored'] = { fg = p.muted },
- ['NeoTreeGitUntracked'] = { fg = p.gold },
- ['NeoTreeGitConflict'] = { fg = p.iris },
-
- -- folke/which-key.nvim
- ['WhichKey'] = { fg = p.iris },
- ['WhichKeyGroup'] = { fg = p.foam },
- ['WhichKeySeparator'] = { fg = p.subtle },
- ['WhichKeyDesc'] = { fg = p.gold },
- ['WhichKeyFloat'] = { bg = maybe.surface },
- ['WhichKeyValue'] = { fg = p.rose },
-
- -- luka-reineke/indent-blankline.nvim
- ['IndentBlanklineChar'] = { fg = p.muted, nocombine = true },
- ['IndentBlanklineSpaceChar'] = { fg = p.muted, nocombine = true },
- ['IndentBlanklineSpaceCharBlankline'] = { fg = p.muted, nocombine = true },
-
- -- hrsh7th/nvim-cmp
- ['CmpItemAbbr'] = { fg = p.subtle },
- ['CmpItemAbbrDeprecated'] = { fg = p.subtle, strikethrough = true },
- ['CmpItemAbbrMatch'] = { fg = p.text, bold = true },
- ['CmpItemAbbrMatchFuzzy'] = { fg = p.text, bold = true },
- ['CmpItemKind'] = { fg = p.subtle },
- ['CmpItemKindClass'] = { fg = p.pine },
- ['CmpItemKindFunction'] = { fg = p.rose },
- ['CmpItemKindInterface'] = { fg = p.foam },
- ['CmpItemKindMethod'] = { fg = p.iris },
- ['CmpItemKindSnippet'] = { fg = p.gold },
- ['CmpItemKindVariable'] = { fg = p.text },
-
- -- TimUntersberger/neogit
- ['NeogitDiffAddHighlight'] = { fg = p.foam, bg = p.highlight_med },
- ['NeogitDiffContextHighlight'] = { bg = p.highlight_low },
- ['NeogitDiffDeleteHighlight'] = { fg = p.love, bg = p.highlight_med },
- ['NeogitHunkHeader'] = { bg = p.highlight_low },
- ['NeogitHunkHeaderHighlight'] = { bg = p.highlight_low },
-
- -- vimwiki/vimwiki
- ['VimwikiHR'] = { fg = p.subtle },
- ['VimwikiHeader1'] = { fg = groups.headings.h1, bold = true },
- ['VimwikiHeader2'] = { fg = groups.headings.h2, bold = true },
- ['VimwikiHeader3'] = { fg = groups.headings.h3, bold = true },
- ['VimwikiHeader4'] = { fg = groups.headings.h4, bold = true },
- ['VimwikiHeader5'] = { fg = groups.headings.h5, bold = true },
- ['VimwikiHeader6'] = { fg = groups.headings.h6, bold = true },
- ['VimwikiHeaderChar'] = { fg = p.pine },
- ['VimwikiLink'] = { fg = groups.link, underline = true },
- ['VimwikiList'] = { fg = p.iris },
- ['VimwikiNoExistsLink'] = { fg = p.love },
-
- -- nvim-neorg/neorg
- ['NeorgHeading1Prefix'] = { fg = groups.headings.h1, bold = true },
- ['NeorgHeading1Title'] = { link = 'NeorgHeading1Prefix' },
- ['NeorgHeading2Prefix'] = { fg = groups.headings.h2, bold = true },
- ['NeorgHeading2Title'] = { link = 'NeorgHeading2Prefix' },
- ['NeorgHeading3Prefix'] = { fg = groups.headings.h3, bold = true },
- ['NeorgHeading3Title'] = { link = 'NeorgHeading3Prefix' },
- ['NeorgHeading4Prefix'] = { fg = groups.headings.h4, bold = true },
- ['NeorgHeading4Title'] = { link = 'NeorgHeading4Prefix' },
- ['NeorgHeading5Prefix'] = { fg = groups.headings.h5, bold = true },
- ['NeorgHeading5Title'] = { link = 'NeorgHeading5Prefix' },
- ['NeorgHeading6Prefix'] = { fg = groups.headings.h6, bold = true },
- ['NeorgHeading6Title'] = { link = 'NeorgHeading6Prefix' },
- ['NeorgMarkerTitle'] = { fg = p.text, bold = true },
-
- -- tami5/lspsaga.nvim (fork of glepnir/lspsaga.nvim)
- ['DefinitionCount'] = { fg = p.rose },
- ['DefinitionIcon'] = { fg = p.rose },
- ['DefintionPreviewTitle'] = { fg = p.rose, bold = true },
- ['LspFloatWinBorder'] = { fg = groups.border },
- ['LspFloatWinNormal'] = { bg = maybe.surface },
- ['LspSagaAutoPreview'] = { fg = p.subtle },
- ['LspSagaCodeActionBorder'] = { fg = groups.border },
- ['LspSagaCodeActionContent'] = { fg = p.foam },
- ['LspSagaCodeActionTitle'] = { fg = p.gold, bold = true },
- ['LspSagaCodeActionTruncateLine'] = { link = 'LspSagaCodeActionBorder' },
- ['LspSagaDefPreviewBorder'] = { fg = groups.border },
- ['LspSagaDiagnosticBorder'] = { fg = groups.border },
- ['LspSagaDiagnosticHeader'] = { fg = p.gold, bold = true },
- ['LspSagaDiagnosticTruncateLine'] = { link = 'LspSagaDiagnosticBorder' },
- ['LspSagaDocTruncateLine'] = { link = 'LspSagaHoverBorder' },
- ['LspSagaFinderSelection'] = { fg = p.gold },
- ['LspSagaHoverBorder'] = { fg = groups.border },
- ['LspSagaLspFinderBorder'] = { fg = groups.border },
- ['LspSagaRenameBorder'] = { fg = p.pine },
- ['LspSagaRenamePromptPrefix'] = { fg = p.love },
- ['LspSagaShTruncateLine'] = { link = 'LspSagaSignatureHelpBorder' },
- ['LspSagaSignatureHelpBorder'] = { fg = p.pine },
- ['ReferencesCount'] = { fg = p.rose },
- ['ReferencesIcon'] = { fg = p.rose },
- ['SagaShadow'] = { bg = p.overlay },
- ['TargetWord'] = { fg = p.iris },
-
- -- ray-x/lsp_signature.nvim
- ['LspSignatureActiveParameter'] = { bg = p.overlay },
-
- -- rlane/pounce.nvim
- ['PounceAccept'] = { fg = p.love, bg = p.highlight_high },
- ['PounceAcceptBest'] = { fg = p.base, bg = p.gold },
- ['PounceGap'] = { link = 'Search' },
- ['PounceMatch'] = { link = 'Search' },
-
- -- ggandor/leap.nvim
- ['LeapMatch'] = { link = 'MatchParen' },
- ['LeapLabelPrimary'] = { link = 'IncSearch' },
- ['LeapLabelSecondary'] = { fg = p.base, bg = p.pine },
-
- -- phaazon/hop.nvim
- ['HopNextKey'] = { fg = p.love },
- ['HopNextKey1'] = { fg = p.foam },
- ['HopNextKey2'] = { fg = p.pine },
- ['HopUnmatched'] = { fg = p.highlight_high },
-
- -- nvim-telescope/telescope.nvim
- ['TelescopeBorder'] = { fg = groups.border, bg = float_background },
- ['TelescopeMatching'] = { fg = p.rose },
- ['TelescopeNormal'] = { fg = p.subtle, bg = float_background },
- ['TelescopePromptNormal'] = { fg = p.text, bg = float_background },
- ['TelescopePromptPrefix'] = { fg = p.subtle },
- ['TelescopeSelection'] = { fg = p.text, bg = p.overlay },
- ['TelescopeSelectionCaret'] = { fg = p.rose, bg = p.overlay },
- ['TelescopeTitle'] = { fg = p.subtle },
-
- -- rcarriga/nvim-notify
- ['NotifyINFOBorder'] = { fg = p.foam },
- ['NotifyINFOTitle'] = { link = 'NotifyINFOBorder' },
- ['NotifyINFOIcon'] = { link = 'NotifyINFOBorder' },
- ['NotifyWARNBorder'] = { fg = p.gold },
- ['NotifyWARNTitle'] = { link = 'NotifyWARNBorder' },
- ['NotifyWARNIcon'] = { link = 'NotifyWARNBorder' },
- ['NotifyDEBUGBorder'] = { fg = p.muted },
- ['NotifyDEBUGTitle'] = { link = 'NotifyDEBUGBorder' },
- ['NotifyDEBUGIcon'] = { link = 'NotifyDEBUGBorder' },
- ['NotifyTRACEBorder'] = { fg = p.iris },
- ['NotifyTRACETitle'] = { link = 'NotifyTRACEBorder' },
- ['NotifyTRACEIcon'] = { link = 'NotifyTRACEBorder' },
- ['NotifyERRORBorder'] = { fg = p.love },
- ['NotifyERRORTitle'] = { link = 'NotifyERRORBorder' },
- ['NotifyERRORIcon'] = { link = 'NotifyERRORBorder' },
-
- -- rcarriga/nvim-dap-ui
- ['DapUIVariable'] = { link = 'Normal' },
- ['DapUIValue'] = { link = 'Normal' },
- ['DapUIFrameName'] = { link = 'Normal' },
- ['DapUIThread'] = { fg = p.gold },
- ['DapUIWatchesValue'] = { link = 'DapUIThread' },
- ['DapUIBreakpointsInfo'] = { link = 'DapUIThread' },
- ['DapUIBreakpointsCurrentLine'] = { fg = p.gold, bold = true },
- ['DapUIWatchesEmpty'] = { fg = p.love },
- ['DapUIWatchesError'] = { link = 'DapUIWatchesEmpty' },
- ['DapUIBreakpointsDisabledLine'] = { fg = p.muted },
- ['DapUISource'] = { fg = p.iris },
- ['DapUIBreakpointsPath'] = { fg = p.foam },
- ['DapUIScope'] = { link = 'DapUIBreakpointsPath' },
- ['DapUILineNumber'] = { link = 'DapUIBreakpointsPath' },
- ['DapUIBreakpointsLine'] = { link = 'DapUIBreakpointsPath' },
- ['DapUIFloatBorder'] = { link = 'DapUIBreakpointsPath' },
- ['DapUIStoppedThread'] = { link = 'DapUIBreakpointsPath' },
- ['DapUIDecoration'] = { link = 'DapUIBreakpointsPath' },
- ['DapUIModifiedValue'] = { fg = p.foam, bold = true },
-
- -- glepnir/dashboard-nvim
- ['DashboardShortcut'] = { fg = p.love },
- ['DashboardHeader'] = { fg = p.pine },
- ['DashboardCenter'] = { fg = p.gold },
- ['DashboardFooter'] = { fg = p.iris },
-
- -- SmiteshP/nvim-navic
- ['NavicIconsFile'] = { fg = p.base },
- ['NavicIconsModule'] = { fg = p.rose },
- ['NavicIconsNamespace'] = { fg = p.base },
- ['NavicIconsPackage'] = { fg = p.base },
- ['NavicIconsClass'] = { fg = p.foam },
- ['NavicIconsMethod'] = { fg = p.iris },
- ['NavicIconsProperty'] = { fg = p.foam },
- ['NavicIconsField'] = { fg = p.foam },
- ['NavicIconsConstructor'] = { fg = p.gold },
- ['NavicIconsEnum'] = { fg = p.gold },
- ['NavicIconsInterface'] = { fg = p.foam },
- ['NavicIconsFunction'] = { fg = p.pine },
- ['NavicIconsVariable'] = { fg = p.text },
- ['NavicIconsConstant'] = { fg = p.gold },
- ['NavicIconsString'] = { fg = p.gold },
- ['NavicIconsNumber'] = { fg = p.gold },
- ['NavicIconsBoolean'] = { fg = p.rose },
- ['NavicIconsArray'] = { fg = p.gold },
- ['NavicIconsObject'] = { fg = p.gold },
- ['NavicIconsKey'] = { fg = p.iris },
- ['NavicIconsKeyword'] = { fg = p.pine },
- ['NavicIconsNull'] = { fg = p.love },
- ['NavicIconsEnumMember'] = { fg = p.foam },
- ['NavicIconsStruct'] = { fg = p.foam },
- ['NavicIconsEvent'] = { fg = p.gold },
- ['NavicIconsOperator'] = { fg = p.subtle },
- ['NavicIconsTypeParameter'] = { fg = p.foam },
- ['NavicText'] = { fg = p.subtle },
- ['NavicSeparator'] = { fg = p.subtle },
-
- -- folke/noice.nvim
- ['NoiceCursor'] = { fg = p.highlight_high, bg = p.text },
-
- -- echasnovski/mini.indentscope
- ['MiniIndentscopeSymbol'] = { fg = p.highlight_med },
- ['MiniIndentscopeSymbolOff'] = { fg = p.highlight_med },
-
- -- goolord/alpha-nvim
- ['AlphaHeader'] = { fg = p.pine },
- ['AlphaButtons'] = { fg = p.foam },
- ['AlphaShortcut'] = { fg = p.rose },
- ['AlphaFooter'] = { fg = p.gold },
- }
-
- vim.g.terminal_color_0 = p.overlay -- black
- vim.g.terminal_color_8 = p.subtle -- bright black
- vim.g.terminal_color_1 = p.love -- red
- vim.g.terminal_color_9 = p.love -- bright red
- vim.g.terminal_color_2 = p.pine -- green
- vim.g.terminal_color_10 = p.pine -- bright green
- vim.g.terminal_color_3 = p.gold -- yellow
- vim.g.terminal_color_11 = p.gold -- bright yellow
- vim.g.terminal_color_4 = p.foam -- blue
- vim.g.terminal_color_12 = p.foam -- bright blue
- vim.g.terminal_color_5 = p.iris -- magenta
- vim.g.terminal_color_13 = p.iris -- bright magenta
- vim.g.terminal_color_6 = p.rose -- cyan
- vim.g.terminal_color_14 = p.rose -- bright cyan
- vim.g.terminal_color_7 = p.text -- white
- vim.g.terminal_color_15 = p.text -- bright white
-
- -- Set users highlight_group customisations.
- for group, opts in pairs(options.highlight_groups) do
- local default_opts = M.defaults[group]
-
- if (opts.inherit == nil or opts.inherit) and default_opts ~= nil then -- On merge.
- opts.inherit = nil -- Don't add this key to the highlight_group after merge.
- M.defaults[group] = vim.tbl_extend('force', default_opts, opts)
- else -- On overwrite.
- opts.inherit = nil -- Don't add this key to the highlight_group.
- M.defaults[group] = opts
- end
- end
-
- -- Set highlights.
- for group, color in pairs(M.defaults) do
- h(group, color)
- end
-end
-
-return M
diff --git a/lua/rose-pine/util.lua b/lua/rose-pine/util.lua
deleted file mode 100644
index f8b84f93..00000000
--- a/lua/rose-pine/util.lua
+++ /dev/null
@@ -1,71 +0,0 @@
-local util = {}
-
-local function byte(value, offset)
- return bit.band(bit.rshift(value, offset), 0xFF)
-end
-
-local function rgb(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 { byte(color, 16), byte(color, 8), byte(color, 0) }
-end
-
-local function parse_color(color)
- if color == nil then
- return print('invalid color')
- 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
-
- return color
-end
-
----@param fg string foreground color
----@param bg string background color
----@param alpha number number between 0 (background) and 1 (foreground)
-util.blend = function(fg, bg, alpha)
- local fg_rgb = rgb(parse_color(fg))
- local bg_rgb = rgb(parse_color(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
-
- return string.format(
- '#%02X%02X%02X',
- blend_channel(1),
- blend_channel(2),
- blend_channel(3)
- )
-end
-
----@param group string
----@param color table
-util.highlight = function(group, color)
- local fg = color.fg and parse_color(color.fg) or 'none'
- local bg = color.bg and parse_color(color.bg) or 'none'
- local sp = color.sp and parse_color(color.sp) or ''
-
- if
- color.blend ~= nil
- and (color.blend >= 0 or color.blend <= 100)
- and bg ~= nil
- then
- bg = util.blend(bg, parse_color('base') or '', color.blend / 100)
- end
-
- color = vim.tbl_extend('force', color, { fg = fg, bg = bg, sp = sp })
- vim.api.nvim_set_hl(0, group, color)
-end
-
-return util
diff --git a/readme.md b/readme.md
index ed6d466d..89fe461a 100644
--- a/readme.md
+++ b/readme.md
@@ -11,30 +11,20 @@
-## Install
+## Getting started
-**[Paq](https://github.com/savq/paq-nvim)**
+Install `rose-pine/neovim` using your favourite plugin manager:
-```lua
-require('paq')({
- { 'rose-pine/neovim', as = 'rose-pine' }
-})
-```
-
-**[lazy.nvim](https://github.com/folke/lazy.nvim)**
+**paq-nvim**
```lua
-require("lazy").setup({
- { 'rose-pine/neovim', name = 'rose-pine' }
-})
+{ 'rose-pine/neovim', as = 'rose-pine' }
```
-**[packer.nvim](https://github.com/wbthomason/packer.nvim)**
+**lazy.nvim**
```lua
-require('packer').startup(function(use)
- use({ 'rose-pine/neovim', as = 'rose-pine' })
-end)
+{ 'rose-pine/neovim', name = 'rose-pine' }
```
## Gallery
@@ -53,75 +43,85 @@ end)
## Options
-> [!NOTE]
-> 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.
-Variant respects `vim.o.background`, 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
require('rose-pine').setup({
- --- @usage 'auto'|'main'|'moon'|'dawn'
- variant = 'auto',
- --- @usage 'main'|'moon'|'dawn'
- dark_variant = 'main',
- bold_vert_split = false,
- dim_nc_background = false,
- disable_background = false,
- disable_float_background = false,
- disable_italics = false,
-
- --- @usage string hex value or named color from rosepinetheme.com/palette
- groups = {
- background = 'base',
- background_nc = '_experimental_nc',
- panel = 'surface',
- panel_nc = 'base',
- border = 'highlight_med',
- comment = 'muted',
- link = 'iris',
- punctuation = 'subtle',
-
- error = 'love',
- hint = 'iris',
- info = 'foam',
- warn = 'gold',
-
- headings = {
- h1 = 'iris',
- h2 = 'foam',
- h3 = 'rose',
- h4 = 'gold',
- h5 = 'pine',
- h6 = 'foam',
- }
- -- or set all headings at once
- -- headings = 'subtle'
- },
-
- -- Change specific vim highlight groups
- -- https://github.com/rose-pine/neovim/wiki/Recipes
- highlight_groups = {
- ColorColumn = { bg = 'rose' },
-
- -- Blend colours against the "base" background
- CursorLine = { bg = 'foam', blend = 10 },
- StatusLine = { fg = 'love', bg = 'love', blend = 10 },
-
- -- By default each group adds to the existing config.
- -- If you only want to set what is written in this config exactly,
- -- you can set the inherit option:
- Search = { bg = 'gold', inherit = false },
- }
+ variant = "auto", -- auto, main, moon, or dawn
+ dark_variant = "main", -- main, moon, or dawn
+ dim_inactive_windows = false,
+ extend_background_behind_borders = false,
+
+ styles = {
+ bold = true,
+ italic = true,
+ transparency = false,
+ },
+
+ groups = {
+ border = "muted",
+ link = "iris",
+ panel = "surface",
+
+ error = "love",
+ hint = "iris",
+ info = "foam",
+ warn = "gold",
+
+ 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",
+
+ headings = {
+ h1 = "iris",
+ h2 = "foam",
+ h3 = "rose",
+ h4 = "gold",
+ h5 = "pine",
+ h6 = "foam",
+ },
+ -- Alternatively, set all headings at once.
+ -- headings = "subtle",
+ },
+
+ highlight_groups = {
+ -- Comment = { fg = "foam" }
+ -- VertSplit = { fg = "muted", bg = "muted" }
+ },
+
+ 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,
})
--- Set colorscheme after options
vim.cmd('colorscheme rose-pine')
+-- vim.cmd('colorscheme rose-pine-main')
+-- vim.cmd('colorscheme rose-pine-moon')
+-- vim.cmd('colorscheme rose-pine-dawn')
```
## 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.
-- Get highlight groups under cursor via `:Inspect` in Neovim 0.9 or [nvim-treesitter/playground](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)
-- [Palette reference by name](https://rosepinetheme.com/palette)
+Feel free to update the [wiki](https://github.com/rose-pine/neovim/wiki/) with any [recipes](https://github.com/rose-pine/neovim/wiki/Recipes).
diff --git a/rose-pine.lua b/rose-pine.lua
new file mode 100644
index 00000000..9857a5bb
--- /dev/null
+++ b/rose-pine.lua
@@ -0,0 +1,659 @@
+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 = config.options.groups
+
+ local function make_border(fg)
+ fg = fg or groups.border
+ return { fg = fg, bg = config.options.extend_background_behind_borders and palette.surface or "NONE" }
+ end
+
+ local function make_title(fg)
+ fg = fg or palette.foam
+ return { fg = styles.bold and palette.text or fg, bold = styles.bold }
+ end
+
+ local 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 = 20 },
+ diffAdded = { link = "DiffAdd" },
+ diffChanged = { link = "DiffChange" },
+ diffRemoved = { link = "DiffDelete" },
+ Directory = make_title(),
+ -- EndOfBuffer = {},
+ ErrorMsg = { fg = groups.error, bold = styles.bold },
+ FloatBorder = make_border(),
+ FloatTitle = { link = "Directory" },
+ 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.title, bg = palette.overlay },
+ PmenuThumb = { bg = palette.muted },
+ Question = { fg = palette.gold },
+ -- QuickFixLink = {},
+ -- 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.base, bg = palette.text },
+ 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 = { link = "StatusLine" },
+ TabLineFill = { bg = groups.panel },
+ TabLineSel = { fg = palette.text, bg = palette.overlay },
+ Title = make_title(),
+ VertSplit = make_border(),
+ Visual = { fg = palette.base, bg = palette.pine },
+ -- VisualNOS = {},
+ WarningMsg = { fg = groups.warn, bold = styles.bold },
+ -- Whitespace = {},
+ WildMenu = { link = "IncSearch" },
+ WinSeparator = { link = "VertSplit" },
+
+ DiagnosticError = { fg = groups.error },
+ DiagnosticHint = { fg = groups.hint },
+ DiagnosticInfo = { fg = groups.info },
+ DiagnosticWarn = { fg = groups.warn },
+ DiagnosticDefaultError = { link = "DiagnosticError" },
+ DiagnosticDefaultHint = { link = "DiagnosticHint" },
+ DiagnosticDefaultInfo = { link = "DiagnosticInfo" },
+ DiagnosticDefaultWarn = { link = "DiagnosticWarn" },
+ DiagnosticFloatingError = { link = "DiagnosticError" },
+ DiagnosticFloatingHint = { link = "DiagnosticHint" },
+ DiagnosticFloatingInfo = { link = "DiagnosticInfo" },
+ DiagnosticFloatingWarn = { link = "DiagnosticWarn" },
+ DiagnosticSignError = { link = "DiagnosticError" },
+ DiagnosticSignHint = { link = "DiagnosticHint" },
+ DiagnosticSignInfo = { link = "DiagnosticInfo" },
+ DiagnosticSignWarn = { link = "DiagnosticWarn" },
+ DiagnosticUnderlineError = { sp = groups.error, undercurl = true },
+ DiagnosticUnderlineHint = { sp = groups.hint, undercurl = true },
+ DiagnosticUnderlineInfo = { sp = groups.info, 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 },
+ 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 },
+ PreConduit = { fg = palette.iris },
+ PreProc = { link = "PreConduit" },
+ 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.iris, bg = palette.iris, 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.headings.h1, bold = styles.bold },
+ markdownH1Delimiter = { link = "markdownH1" },
+ markdownH2 = { fg = groups.headings.h2, bold = styles.bold },
+ markdownH2Delimiter = { link = "markdownH2" },
+ markdownH3 = { fg = groups.headings.h3, bold = styles.bold },
+ markdownH3Delimiter = { link = "markdownH3" },
+ markdownH4 = { fg = groups.headings.h4, bold = styles.bold },
+ markdownH4Delimiter = { link = "markdownH4" },
+ markdownH5 = { fg = groups.headings.h5, bold = styles.bold },
+ markdownH5Delimiter = { link = "markdownH5" },
+ markdownH6 = { fg = groups.headings.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" },
+
+ ["@attribute.diff"] = { fg = palette.gold },
+ ["@boolean"] = { link = "Boolean" },
+ ["@character"] = { link = "Character" },
+ ["@character.special"] = { link = "Character" },
+ ["@class"] = { fg = palette.foam },
+ ["@comment"] = { link = "Comment" },
+ ["@conditional"] = { link = "Conditional" },
+ ["@constant"] = { link = "Constant" },
+ ["@constant.builtin"] = { fg = palette.love },
+ ["@constant.macro"] = { link = "Constant" },
+ ["@constructor"] = { fg = palette.foam },
+ ["@field"] = { fg = palette.foam },
+ ["@function"] = { link = "Function" },
+ ["@function.builtin"] = { fg = palette.love },
+ ["@function.macro"] = { link = "Function" },
+ ["@include"] = { link = "Include" },
+ ["@interface"] = { fg = palette.foam },
+ ["@keyword"] = { link = "Keyword" },
+ ["@keyword.operator"] = { fg = palette.subtle },
+ ["@label"] = { link = "Label" },
+ ["@lsp.type.comment"] = {},
+ ["@lsp.type.enum"] = { link = "Type" },
+ ["@lsp.type.interface"] = { link = "@interface" },
+ ["@lsp.type.keyword"] = { link = "Keyword" },
+ ["@lsp.type.namespace"] = { link = "@namespace" },
+ ["@lsp.type.parameter"] = { link = "@parameter" },
+ ["@lsp.type.property"] = { link = "@property" },
+ ["@lsp.type.variable"] = {},
+ ["@lsp.typemod.function.defaultLibrary"] = { link = "Special" },
+ ["@lsp.typemod.operator.injected"] = { link = "Operator" },
+ ["@lsp.typemod.string.injected"] = { link = "String" },
+ ["@lsp.typemod.variable.defaultLibrary"] = { link = "@variable.builtin" },
+ ["@lsp.typemod.variable.injected"] = { link = "@variable" },
+ ["@macro"] = { link = "Macro" },
+ ["@method"] = { fg = palette.rose },
+ ["@namespace"] = { link = "Include" },
+ ["@number"] = { link = "Number" },
+ ["@operator"] = { link = "Operator" },
+ ["@parameter"] = { fg = palette.iris, italic = styles.italic },
+ ["@preproc"] = { link = "PreProc" },
+ ["@property"] = { fg = palette.foam, italic = styles.italic },
+ ["@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" },
+ ["@string"] = { link = "String" },
+ ["@string.escape"] = { fg = palette.pine },
+ ["@string.special"] = { link = "String" },
+ ["@symbol"] = { link = "Identifier" },
+ ["@tag"] = { link = "Tag" },
+ ["@tag.attribute"] = { fg = palette.iris },
+ ["@tag.delimiter"] = { fg = palette.subtle },
+ ["@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" },
+ ["@type"] = { link = "Type" },
+ ["@variable"] = { fg = palette.text, italic = styles.italic },
+ ["@variable.builtin"] = { 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 = "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 = { link = "SignAdd" },
+ GitSignsChange = { link = "SignChange" },
+ GitSignsDelete = { link = "SignDelete" },
+ 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 },
+ ModesInsert = { bg = palette.foam },
+ 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 = make_title(),
+ NvimTreeSpecialFile = { link = "NvimTreeNormal" },
+ NvimTreeWindowPicker = { link = "StatusLineTerm" },
+
+ -- 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 },
+ NeoTreeTitleBar = { link = "StatusLineTerm" },
+
+ -- folke/which-key.nvim
+ WhichKey = { fg = palette.iris },
+ WhichKeyDesc = { fg = palette.gold },
+ WhichKeyFloat = { bg = groups.panel },
+ WhichKeyGroup = { fg = palette.foam },
+ WhichKeySeparator = { fg = palette.subtle },
+ WhichKeyValue = { fg = palette.rose },
+
+ -- luka-reineke/indent-blankline.nvim
+ IndentBlanklineChar = { fg = palette.muted, nocombine = true },
+ IndentBlanklineSpaceChar = { fg = palette.muted, nocombine = true },
+ IndentBlanklineSpaceCharBlankline = { fg = palette.muted, nocombine = true },
+
+ -- 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" },
+
+ -- TimUntersberger/neogit
+ NeogitDiffAddHighlight = { link = "DiffAdd" },
+ NeogitDiffContextHighlight = { bg = palette.surface },
+ NeogitDiffDeleteHighlight = { link = "DiffDelete" },
+ 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 = make_title(),
+
+ -- tami5/lspsaga.nvim (fork of glepnir/lspsaga.nvim)
+ DefinitionCount = { fg = palette.rose },
+ DefinitionIcon = { fg = palette.rose },
+ DefintionPreviewTitle = { 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 = make_title(),
+ 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 = { bg = groups.panel },
+ TelescopePromptNormal = { link = "TelescopeNormal" },
+ TelescopePromptPrefix = { fg = palette.subtle },
+ TelescopeSelection = { fg = palette.text, bg = palette.overlay },
+ TelescopeSelectionCaret = { fg = palette.rose, bg = palette.overlay },
+ TelescopeTitle = make_title(),
+
+ -- rcarriga/nvim-notify
+ NotifyDEBUGBorder = make_border(),
+ NotifyDEBUGIcon = { link = "NotifyDEBUGTitle" },
+ NotifyDEBUGTitle = { fg = palette.muted },
+ NotifyERRORBorder = make_border(groups.error),
+ NotifyERRORIcon = { link = "NotifyERRORTitle" },
+ NotifyERRORTitle = { fg = groups.error },
+ NotifyINFOBorder = make_border(groups.info),
+ NotifyINFOIcon = { link = "NotifyINFOTitle" },
+ NotifyINFOTitle = { fg = groups.info },
+ NotifyTRACEBorder = make_border(palette.iris),
+ NotifyTRACEIcon = { link = "NotifyTRACETitle" },
+ NotifyTRACETitle = { fg = palette.iris },
+ 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 },
+ 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 },
+
+ -- echasnovski/mini.indentscope
+ MiniIndentscopeSymbol = { fg = palette.muted },
+ MiniIndentscopeSymbolOff = { fg = palette.muted },
+
+ -- 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 },
+ }
+
+ local transparency_highlights = {
+ DiagnosticVirtualTextError = { fg = groups.error },
+ DiagnosticVirtualTextHint = { fg = groups.hint },
+ DiagnosticVirtualTextInfo = { fg = groups.info },
+ DiagnosticVirtualTextWarn = { fg = groups.warn },
+
+ FloatBorder = { fg = palette.muted, bg = "NONE" },
+ Folded = { fg = palette.text, bg = "NONE" },
+ NormalFloat = { 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" },
+ TabLineFill = { bg = "NONE" },
+ TabLineSel = { fg = palette.text, bg = "NONE", bold = styles.bold },
+
+ TelescopeNormal = { fg = palette.text, bg = "NONE" },
+ TelescopePromptNormal = { fg = palette.text, bg = "NONE" },
+ TelescopeSelection = { fg = palette.text, bg = "NONE", bold = styles.bold },
+ TelescopeSelectionCaret = { fg = palette.rose, bg = "NONE" },
+
+ WhichKeyFloat = { bg = "NONE" },
+ }
+
+ if styles.transparency then
+ for group, highlight in pairs(transparency_highlights) do
+ highlights[group] = highlight
+ end
+ end
+
+ for group, options in pairs(config.options.highlight_groups) do
+ highlights[group] = vim.tbl_extend("force", highlights[group] or {}, options)
+ end
+
+ for group, highlight in pairs(highlights) do
+ config.options.before_highlight(group, highlight, palette)
+ utilities.highlight(group, highlight)
+ end
+
+ 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([[
+ autocmd TermOpen * if &buftype=='terminal'
+ \|setlocal winhighlight=StatusLine:StatusLineTerm,StatusLineNC:StatusLineTermNC
+ \|else|setlocal winhighlight=|endif
+ ]])
+ 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"
+
+ set_highlights()
+end
+
+---@param options Options
+function M.setup(options)
+ config.extend_options(options or {})
+end
+
+return M
diff --git a/rose-pine/config.lua b/rose-pine/config.lua
new file mode 100644
index 00000000..74e7e383
--- /dev/null
+++ b/rose-pine/config.lua
@@ -0,0 +1,153 @@
+---@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 { fg: string, bg: string, sp: string, bold: boolean, italic: boolean, undercurl: boolean, underline: boolean, underdouble: boolean, underdotted: boolean, underdashed: boolean, strikethrough: boolean }
+
+local config = {}
+
+---@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",
+
+ ---Set the desired dark variant when `options.variant` is set to "auto".
+ ---@type Variant
+ dark_variant = "main",
+
+ ---Differentiate between active and inactive windows and panels.
+ dim_inactive_windows = false,
+
+ ---Extend background behind borders. Appearance differs based on which
+ ---border characters you are using.
+ extend_background_behind_borders = false,
+
+ enable = {
+ terminal = true,
+ migrations = true,
+ },
+
+ styles = {
+ bold = true,
+ italic = true,
+ transparency = false,
+ },
+
+ ---@type table
+ groups = {
+ border = "muted",
+ link = "iris",
+ panel = "surface",
+
+ error = "love",
+ hint = "iris",
+ info = "foam",
+ warn = "gold",
+
+ 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 | table
+ headings = {
+ h1 = "iris",
+ h2 = "foam",
+ h3 = "rose",
+ h4 = "gold",
+ h5 = "pine",
+ h6 = "foam",
+ },
+
+ ---@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",
+ },
+
+ ---@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.enable.transparency`
+ -- disable_float_background = false,
+ ---@deprecated Replaced by `options.styles.italic`
+ -- disable_italics = false,
+ ---@deprecated Replaced by `options.highlight_groups`
+ -- bold_vert_split = false
+}
+
+local function migrate(options)
+ if options.bold_vert_split then
+ options.highlight_groups["VertSplit"] = { fg = "muted", bg = "muted" }
+ 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 or 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 = (options.disable_bold or options.disable_bolds) and false or options.styles.bold
+
+ -- Similar to bold options, `disable_italic` never existed but could be a
+ -- common typo of the actual `disable_italics`.
+ options.styles.italic = (options.disable_italic or options.disable_italics) and false or options.styles.italic
+
+ -- Set h1 through h6 to the same color if only one is specified
+ if type(options.groups.headings) == "string" then
+ options.groups.headings = {
+ h1 = options.groups.headings,
+ h2 = options.groups.headings,
+ h3 = options.groups.headings,
+ h4 = options.groups.headings,
+ h5 = options.groups.headings,
+ h6 = options.groups.headings,
+ }
+ end
+
+ return options
+end
+
+---@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/rose-pine/palette.lua b/rose-pine/palette.lua
new file mode 100644
index 00000000..6b49f680
--- /dev/null
+++ b/rose-pine/palette.lua
@@ -0,0 +1,63 @@
+local options = require("rose-pine.config").options
+local variants = {
+ main = {
+ _nc = "#16141f",
+ base = "#191724",
+ surface = "#1f1d2e",
+ overlay = "#26233a",
+ muted = "#6e6a86",
+ subtle = "#908caa",
+ text = "#e0def4",
+ love = "#eb6f92",
+ gold = "#f6c177",
+ rose = "#ebbcba",
+ pine = "#3e8fb0",
+ foam = "#9ccfd8",
+ iris = "#c4a7e7",
+ highlight_low = "#21202e",
+ highlight_med = "#403d52",
+ highlight_high = "#524f67",
+ },
+ moon = {
+ _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",
+ highlight_low = "#2a283e",
+ highlight_med = "#44415a",
+ highlight_high = "#56526e",
+ },
+ dawn = {
+ _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",
+ highlight_low = "#f4ede8",
+ highlight_med = "#dfdad9",
+ highlight_high = "#cecacd",
+ },
+}
+
+if variants[options.variant] ~= nil then
+ return variants[options.variant]
+end
+
+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/rose-pine/plugins/bufferline.lua
similarity index 99%
rename from lua/rose-pine/plugins/bufferline.lua
rename to rose-pine/plugins/bufferline.lua
index 1a5eaac6..9f85ccde 100644
--- a/lua/rose-pine/plugins/bufferline.lua
+++ b/rose-pine/plugins/bufferline.lua
@@ -5,7 +5,7 @@
--- local highlights = require('rose-pine.plugins.bufferline')
--- require('bufferline').setup({ highlights = highlights })
-local p = require('rose-pine.palette')
+local p = require("rose-pine.palette")
return {
-- fill = {
diff --git a/lua/rose-pine/plugins/galaxyline.lua b/rose-pine/plugins/galaxyline.lua
similarity index 89%
rename from lua/rose-pine/plugins/galaxyline.lua
rename to rose-pine/plugins/galaxyline.lua
index 348559a5..f2c01ab7 100644
--- a/lua/rose-pine/plugins/galaxyline.lua
+++ b/rose-pine/plugins/galaxyline.lua
@@ -4,7 +4,7 @@
--- @usage
--- local highlights = require('rose-pine.plugins.galaxyline')
-local p = require('rose-pine.palette')
+local p = require("rose-pine.palette")
return {
bg = p.surface,
diff --git a/lua/rose-pine/plugins/markid.lua b/rose-pine/plugins/markid.lua
similarity index 87%
rename from lua/rose-pine/plugins/markid.lua
rename to rose-pine/plugins/markid.lua
index 9279adbc..2a7b273b 100644
--- a/lua/rose-pine/plugins/markid.lua
+++ b/rose-pine/plugins/markid.lua
@@ -5,6 +5,6 @@
--- local highlights = require('rose-pine.plugins.markid')
--- require("nvim-treesitter.configs").setup({ markid = { enable = true, colors = highlights } })
-local p = require('rose-pine.palette')
+local p = require("rose-pine.palette")
return { p.foam, p.rose, p.iris }
diff --git a/rose-pine/plugins/toggleterm.lua b/rose-pine/plugins/toggleterm.lua
new file mode 100644
index 00000000..87b0abc8
--- /dev/null
+++ b/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/rose-pine/utilities.lua b/rose-pine/utilities.lua
new file mode 100644
index 00000000..e4c72cc5
--- /dev/null
+++ b/rose-pine/utilities.lua
@@ -0,0 +1,66 @@
+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
+
+---@param color string Palette key or hex value
+local function parse_color(color)
+ if color == nil then
+ return print("Invalid color")
+ 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
+
+ return color
+end
+
+---@param fg string Foreground color
+---@param bg string Background color
+---@param alpha number Between 0 (background) and 1 (foreground)
+local function blend(fg, bg, alpha)
+ 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
+
+ return string.format("#%02X%02X%02X", blend_channel(1), blend_channel(2), blend_channel(3))
+end
+
+---@param group string
+---@param highlight table
+function utilities.highlight(group, highlight, blend_on)
+ local fg = highlight.fg and parse_color(highlight.fg) or "NONE"
+ local bg = highlight.bg and parse_color(highlight.bg) or "NONE"
+ local sp = highlight.sp and parse_color(highlight.sp) or "NONE"
+
+ if highlight.blend ~= nil and (highlight.blend >= 0 and highlight.blend <= 100) and bg ~= nil then
+ bg = blend(bg, blend_on or require("rose-pine.palette").base, highlight.blend / 100)
+ end
+
+ highlight.fg = fg
+ highlight.bg = bg
+ highlight.sp = sp
+ -- highlight = vim.tbl_extend("force", highlight, { fg = fg, bg = bg, sp = sp })
+
+ vim.api.nvim_set_hl(0, group, highlight)
+end
+
+return utilities