├── .editorconfig ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.yml │ └── feature_request.yml ├── colors ├── flexoki-dawn.lua ├── flexoki-moon.lua └── flexoki.lua ├── license ├── lua ├── flexoki.lua ├── flexoki │ ├── config.lua │ ├── palette.lua │ ├── plugins │ │ ├── bufferline.lua │ │ ├── galaxyline.lua │ │ ├── markid.lua │ │ ├── obsidian.lua │ │ └── toggleterm.lua │ └── utilities.lua └── lualine │ └── themes │ ├── flexoki-alt.lua │ └── flexoki.lua └── readme.md /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = tab 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [*.{yaml,yml}] 11 | indent_size = 2 12 | indent_style = space 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: File a bug/issue 3 | title: "bug: " 4 | labels: [bug] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | **Before** reporting an issue, make sure to read the [documentation](https://github.com/nuvic/flexoki-nvim) and search [existing issues](https://github.com/nuvic/flexoki-nvim/issues). Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/nuvic/flexoki-nvim/discussions) and will be closed. 10 | - type: input 11 | attributes: 12 | label: "Neovim version (nvim -v)" 13 | placeholder: "0.10.2 commit 8b98642" 14 | validations: 15 | required: true 16 | - type: input 17 | attributes: 18 | label: "Terminal / multiplexer" 19 | placeholder: "ghostty / tmux" 20 | validations: 21 | required: true 22 | - type: textarea 23 | attributes: 24 | label: Describe the bug 25 | description: A clear and concise description of what the bug is. Please include screenshots if possible and any related errors you see in Neovim. 26 | validations: 27 | required: true 28 | - type: textarea 29 | attributes: 30 | label: Repro 31 | description: Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua` 32 | value: | 33 | vim.o.packpath = "/tmp/nvim/site" 34 | 35 | local plugins = { 36 | flexoki = "https://github.com/nuvic/flexoki-nvim", 37 | -- ADD OTHER PLUGINS _NECESSARY_ TO REPRODUCE THE ISSUE 38 | } 39 | 40 | for name, url in pairs(plugins) do 41 | local install_path = "/tmp/nvim/site/pack/test/start/" .. name 42 | if vim.fn.isdirectory(install_path) == 0 then 43 | vim.fn.system({ "git", "clone", "--depth=1", url, install_path }) 44 | end 45 | end 46 | 47 | require("flexoki-nvim").setup({ 48 | -- ADD CONFIG THAT IS _NECESSARY_ TO REPRODUCE THE ISSUE 49 | }) 50 | 51 | vim.cmd("colorscheme flexoki-nvim") 52 | render: Lua 53 | validations: 54 | required: false 55 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Suggest a new feature 3 | title: "feature: " 4 | labels: [enhancement] 5 | body: 6 | - type: textarea 7 | validations: 8 | required: true 9 | attributes: 10 | label: Describe the solution you'd like 11 | description: A clear and concise description of what you want to happen. 12 | - type: textarea 13 | validations: 14 | required: false 15 | attributes: 16 | label: Additional context 17 | description: Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /colors/flexoki-dawn.lua: -------------------------------------------------------------------------------- 1 | package.loaded["flexoki.palette"] = nil 2 | require("flexoki").colorscheme("dawn") 3 | -------------------------------------------------------------------------------- /colors/flexoki-moon.lua: -------------------------------------------------------------------------------- 1 | package.loaded["flexoki.palette"] = nil 2 | require("flexoki").colorscheme("moon") 3 | -------------------------------------------------------------------------------- /colors/flexoki.lua: -------------------------------------------------------------------------------- 1 | package.loaded["flexoki.palette"] = nil 2 | require("flexoki").colorscheme() 3 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 flexok-nvim 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lua/flexoki.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | local config = require("flexoki.config") 3 | 4 | local function set_highlights() 5 | local utilities = require("flexoki.utilities") 6 | local palette = require("flexoki.palette") 7 | local styles = config.options.styles 8 | 9 | local groups = {} 10 | for group, color in pairs(config.options.groups) do 11 | groups[group] = utilities.parse_color(color) 12 | end 13 | 14 | local function make_border(fg) 15 | fg = fg or groups.border 16 | return { 17 | fg = fg, 18 | bg = (config.options.extend_background_behind_borders and not styles.transparency) and palette.surface 19 | or "NONE", 20 | } 21 | end 22 | 23 | local highlights = {} 24 | local legacy_highlights = { 25 | ["@attribute.diff"] = { fg = palette.orange_two }, 26 | ["@boolean"] = { link = "Boolean" }, 27 | ["@class"] = { fg = palette.cyan_two }, 28 | ["@conditional"] = { link = "Conditional" }, 29 | ["@field"] = { fg = palette.cyan_two }, 30 | ["@include"] = { link = "Include" }, 31 | ["@interface"] = { fg = palette.cyan_two }, 32 | ["@macro"] = { link = "Macro" }, 33 | ["@method"] = { fg = palette.magenta_two }, 34 | ["@namespace"] = { link = "Include" }, 35 | ["@number"] = { link = "Number" }, 36 | ["@parameter"] = { fg = palette.purple_two, italic = styles.italic }, 37 | ["@preproc"] = { link = "PreProc" }, 38 | ["@punctuation"] = { fg = palette.subtle }, 39 | ["@punctuation.bracket"] = { link = "@punctuation" }, 40 | ["@punctuation.delimiter"] = { link = "@punctuation" }, 41 | ["@punctuation.special"] = { link = "@punctuation" }, 42 | ["@regexp"] = { link = "String" }, 43 | ["@repeat"] = { link = "Repeat" }, 44 | ["@storageclass"] = { link = "StorageClass" }, 45 | ["@symbol"] = { link = "Identifier" }, 46 | ["@text"] = { fg = palette.text }, 47 | ["@text.danger"] = { fg = groups.error }, 48 | ["@text.diff.add"] = { fg = groups.git_add, bg = groups.git_add, blend = 20 }, 49 | ["@text.diff.delete"] = { fg = groups.git_delete, bg = groups.git_delete, blend = 20 }, 50 | ["@text.emphasis"] = { italic = styles.italic }, 51 | ["@text.environment"] = { link = "Macro" }, 52 | ["@text.environment.name"] = { link = "Type" }, 53 | ["@text.math"] = { link = "Special" }, 54 | ["@text.note"] = { link = "SpecialComment" }, 55 | ["@text.strike"] = { strikethrough = true }, 56 | ["@text.strong"] = { bold = styles.bold }, 57 | ["@text.title"] = { link = "Title" }, 58 | ["@text.title.1.markdown"] = { link = "markdownH1" }, 59 | ["@text.title.1.marker.markdown"] = { link = "markdownH1Delimiter" }, 60 | ["@text.title.2.markdown"] = { link = "markdownH2" }, 61 | ["@text.title.2.marker.markdown"] = { link = "markdownH2Delimiter" }, 62 | ["@text.title.3.markdown"] = { link = "markdownH3" }, 63 | ["@text.title.3.marker.markdown"] = { link = "markdownH3Delimiter" }, 64 | ["@text.title.4.markdown"] = { link = "markdownH4" }, 65 | ["@text.title.4.marker.markdown"] = { link = "markdownH4Delimiter" }, 66 | ["@text.title.5.markdown"] = { link = "markdownH5" }, 67 | ["@text.title.5.marker.markdown"] = { link = "markdownH5Delimiter" }, 68 | ["@text.title.6.markdown"] = { link = "markdownH6" }, 69 | ["@text.title.6.marker.markdown"] = { link = "markdownH6Delimiter" }, 70 | ["@text.underline"] = { underline = true }, 71 | ["@text.uri"] = { fg = groups.link }, 72 | ["@text.warning"] = { fg = groups.warn }, 73 | ["@todo"] = { link = "Todo" }, 74 | 75 | -- lukas-reineke/indent-blankline.nvim 76 | IndentBlanklineChar = { fg = palette.muted, nocombine = true }, 77 | IndentBlanklineSpaceChar = { fg = palette.muted, nocombine = true }, 78 | IndentBlanklineSpaceCharBlankline = { fg = palette.muted, nocombine = true }, 79 | } 80 | local default_highlights = { 81 | ColorColumn = { bg = palette.surface }, 82 | Conceal = { bg = "NONE" }, 83 | CurSearch = { fg = palette.base, bg = palette.yellow_one }, 84 | Cursor = { fg = palette.text, bg = palette.highlight_high }, 85 | CursorColumn = { bg = palette.overlay }, 86 | -- CursorIM = {}, 87 | CursorLine = { bg = palette.overlay }, 88 | CursorLineNr = { fg = palette.text, bold = styles.bold }, 89 | -- DarkenedPanel = { }, 90 | -- DarkenedStatusline = {}, 91 | DiffAdd = { bg = groups.git_add, blend = 20 }, 92 | DiffChange = { bg = groups.git_change, blend = 20 }, 93 | DiffDelete = { bg = groups.git_delete, blend = 20 }, 94 | DiffText = { bg = groups.git_text, blend = 20 }, 95 | diffAdded = { link = "DiffAdd" }, 96 | diffChanged = { link = "DiffChange" }, 97 | diffRemoved = { link = "DiffDelete" }, 98 | Directory = { fg = palette.cyan_two, bold = styles.bold }, 99 | -- EndOfBuffer = {}, 100 | ErrorMsg = { fg = groups.error, bold = styles.bold }, 101 | FloatBorder = make_border(), 102 | FloatTitle = { fg = palette.cyan_two, bg = groups.panel, bold = styles.bold }, 103 | FoldColumn = { fg = palette.muted }, 104 | Folded = { fg = palette.text, bg = palette.overlay, italic = styles.italic }, 105 | IncSearch = { link = "CurSearch" }, 106 | LineNr = { fg = palette.muted }, 107 | MatchParen = { fg = palette.blue_two, bg = palette.blue_one, blend = 20 }, 108 | ModeMsg = { fg = palette.subtle }, 109 | MoreMsg = { fg = palette.purple_two }, 110 | NonText = { fg = palette.muted }, 111 | Normal = { fg = palette.text, bg = palette.base }, 112 | NormalFloat = { bg = groups.panel }, 113 | NormalNC = { fg = palette.text, bg = config.options.dim_inactive_windows and palette._nc or palette.base }, 114 | NvimInternalError = { link = "ErrorMsg" }, 115 | Pmenu = { fg = palette.subtle, bg = groups.panel }, 116 | PmenuExtra = { fg = palette.muted, bg = groups.panel }, 117 | PmenuExtraSel = { fg = palette.subtle, bg = palette.overlay }, 118 | PmenuKind = { fg = palette.cyan_two, bg = groups.panel }, 119 | PmenuKindSel = { fg = palette.subtle, bg = palette.overlay }, 120 | PmenuSbar = { bg = groups.panel }, 121 | PmenuSel = { fg = palette.text, bg = palette.overlay }, 122 | PmenuThumb = { bg = palette.muted }, 123 | Question = { fg = palette.orange_two }, 124 | -- QuickFixLink = {}, 125 | -- RedrawDebugNormal = {}, 126 | RedrawDebugClear = { fg = palette.base, bg = palette.orange_two }, 127 | RedrawDebugComposed = { fg = palette.base, bg = palette.blue_two }, 128 | RedrawDebugRecompose = { fg = palette.base, bg = palette.red_two }, 129 | Search = { fg = palette.text, bg = palette.yellow_one, blend = 20 }, 130 | SignColumn = { fg = palette.text, bg = "NONE" }, 131 | SpecialKey = { fg = palette.cyan_two }, 132 | SpellBad = { sp = palette.subtle, undercurl = true }, 133 | SpellCap = { sp = palette.subtle, undercurl = true }, 134 | SpellLocal = { sp = palette.subtle, undercurl = true }, 135 | SpellRare = { sp = palette.subtle, undercurl = true }, 136 | StatusLine = { fg = palette.subtle, bg = groups.panel }, 137 | StatusLineNC = { fg = palette.muted, bg = groups.panel, blend = 60 }, 138 | StatusLineTerm = { fg = palette.base, bg = palette.blue_two }, 139 | StatusLineTermNC = { fg = palette.base, bg = palette.blue_two, blend = 60 }, 140 | Substitute = { link = "IncSearch" }, 141 | TabLine = { fg = palette.subtle, bg = palette.overlay }, 142 | TabLineFill = { bg = "NONE" }, 143 | TabLineSel = { fg = palette.text, bg = palette.highlight_low, bold = styles.bold }, 144 | Title = { fg = palette.cyan_two, bold = styles.bold }, 145 | VertSplit = { fg = groups.border }, 146 | Visual = { bg = palette.highlight_med }, 147 | -- VisualNOS = {}, 148 | WarningMsg = { fg = groups.warn, bold = styles.bold }, 149 | -- Whitespace = {}, 150 | WildMenu = { link = "IncSearch" }, 151 | WinBar = { fg = palette.subtle, bg = groups.panel }, 152 | WinBarNC = { fg = palette.muted, bg = groups.panel, blend = 60 }, 153 | WinSeparator = { fg = groups.border }, 154 | 155 | DiagnosticError = { fg = groups.error }, 156 | DiagnosticHint = { fg = groups.hint }, 157 | DiagnosticInfo = { fg = groups.info }, 158 | DiagnosticOk = { fg = groups.ok }, 159 | DiagnosticWarn = { fg = groups.warn }, 160 | DiagnosticDefaultError = { link = "DiagnosticError" }, 161 | DiagnosticDefaultHint = { link = "DiagnosticHint" }, 162 | DiagnosticDefaultInfo = { link = "DiagnosticInfo" }, 163 | DiagnosticDefaultOk = { link = "DiagnosticOk" }, 164 | DiagnosticDefaultWarn = { link = "DiagnosticWarn" }, 165 | DiagnosticFloatingError = { link = "DiagnosticError" }, 166 | DiagnosticFloatingHint = { link = "DiagnosticHint" }, 167 | DiagnosticFloatingInfo = { link = "DiagnosticInfo" }, 168 | DiagnosticFloatingOk = { link = "DiagnosticOk" }, 169 | DiagnosticFloatingWarn = { link = "DiagnosticWarn" }, 170 | DiagnosticSignError = { link = "DiagnosticError" }, 171 | DiagnosticSignHint = { link = "DiagnosticHint" }, 172 | DiagnosticSignInfo = { link = "DiagnosticInfo" }, 173 | DiagnosticSignOk = { link = "DiagnosticOk" }, 174 | DiagnosticSignWarn = { link = "DiagnosticWarn" }, 175 | DiagnosticUnderlineError = { sp = groups.error, undercurl = true }, 176 | DiagnosticUnderlineHint = { sp = groups.hint, undercurl = true }, 177 | DiagnosticUnderlineInfo = { sp = groups.info, undercurl = true }, 178 | DiagnosticUnderlineOk = { sp = groups.ok, undercurl = true }, 179 | DiagnosticUnderlineWarn = { sp = groups.warn, undercurl = true }, 180 | DiagnosticVirtualTextError = { fg = groups.error, bg = groups.error, blend = 10 }, 181 | DiagnosticVirtualTextHint = { fg = groups.hint, bg = groups.hint, blend = 10 }, 182 | DiagnosticVirtualTextInfo = { fg = groups.info, bg = groups.info, blend = 10 }, 183 | DiagnosticVirtualTextOk = { fg = groups.ok, bg = groups.ok, blend = 10 }, 184 | DiagnosticVirtualTextWarn = { fg = groups.warn, bg = groups.warn, blend = 10 }, 185 | 186 | Boolean = { fg = palette.magenta_two }, 187 | Character = { fg = palette.orange_two }, 188 | Comment = { fg = palette.subtle, italic = styles.italic }, 189 | Conditional = { fg = palette.blue_two }, 190 | Constant = { fg = palette.yellow_two }, 191 | Debug = { fg = palette.magenta_two }, 192 | Define = { fg = palette.purple_two }, 193 | Delimiter = { fg = palette.subtle }, 194 | Error = { fg = palette.red_two }, 195 | Exception = { fg = palette.blue_two }, 196 | Float = { fg = palette.orange_two }, 197 | Function = { fg = palette.orange_two }, 198 | Identifier = { fg = palette.text }, 199 | Include = { fg = palette.blue_two }, 200 | Keyword = { fg = palette.green_two }, 201 | Label = { fg = palette.cyan_two }, 202 | LspCodeLens = { fg = palette.subtle }, 203 | LspCodeLensSeparator = { fg = palette.muted }, 204 | LspInlayHint = { fg = palette.muted, bg = palette.muted, blend = 10 }, 205 | LspReferenceRead = { bg = palette.highlight_low }, 206 | LspReferenceText = { bg = palette.highlight_low }, 207 | LspReferenceWrite = { bg = palette.highlight_low }, 208 | Macro = { fg = palette.purple_two }, 209 | Number = { fg = palette.purple_two }, 210 | Operator = { fg = palette.subtle }, 211 | PreCondit = { fg = palette.purple_two }, 212 | PreProc = { link = "PreCondit" }, 213 | Repeat = { fg = palette.blue_two }, 214 | Special = { fg = palette.cyan_two }, 215 | SpecialChar = { link = "Special" }, 216 | SpecialComment = { fg = palette.purple_two }, 217 | Statement = { fg = palette.blue_two, bold = styles.bold }, 218 | StorageClass = { fg = palette.cyan_two }, 219 | String = { fg = palette.cyan_two }, 220 | Structure = { fg = palette.cyan_two }, 221 | Tag = { fg = palette.cyan_two }, 222 | Todo = { link = "@comment.todo" }, 223 | Type = { fg = palette.cyan_two }, 224 | TypeDef = { link = "Type" }, 225 | Underlined = { fg = palette.purple_two, underline = true }, 226 | 227 | healthError = { fg = groups.error }, 228 | healthSuccess = { fg = groups.info }, 229 | healthWarning = { fg = groups.warn }, 230 | 231 | htmlArg = { fg = palette.purple_two }, 232 | htmlBold = { bold = styles.bold }, 233 | htmlEndTag = { fg = palette.subtle }, 234 | htmlH1 = { link = "markdownH1" }, 235 | htmlH2 = { link = "markdownH2" }, 236 | htmlH3 = { link = "markdownH3" }, 237 | htmlH4 = { link = "markdownH4" }, 238 | htmlH5 = { link = "markdownH5" }, 239 | htmlItalic = { italic = styles.italic }, 240 | htmlLink = { link = "markdownUrl" }, 241 | htmlTag = { fg = palette.subtle }, 242 | htmlTagN = { fg = palette.text }, 243 | htmlTagName = { fg = palette.cyan_two }, 244 | 245 | markdownDelimiter = { fg = palette.subtle }, 246 | markdownH1 = { fg = groups.h1, bold = styles.bold }, 247 | markdownH1Delimiter = { link = "markdownH1" }, 248 | markdownH2 = { fg = groups.h2, bold = styles.bold }, 249 | markdownH2Delimiter = { link = "markdownH2" }, 250 | markdownH3 = { fg = groups.h3, bold = styles.bold }, 251 | markdownH3Delimiter = { link = "markdownH3" }, 252 | markdownH4 = { fg = groups.h4, bold = styles.bold }, 253 | markdownH4Delimiter = { link = "markdownH4" }, 254 | markdownH5 = { fg = groups.h5, bold = styles.bold }, 255 | markdownH5Delimiter = { link = "markdownH5" }, 256 | markdownH6 = { fg = groups.h6, bold = styles.bold }, 257 | markdownH6Delimiter = { link = "markdownH6" }, 258 | markdownLinkText = { link = "markdownUrl" }, 259 | markdownUrl = { fg = groups.link, sp = groups.link, underline = true }, 260 | 261 | mkdCode = { fg = palette.cyan_two, italic = styles.italic }, 262 | mkdCodeDelimiter = { fg = palette.magenta_two }, 263 | mkdCodeEnd = { fg = palette.cyan_two }, 264 | mkdCodeStart = { fg = palette.cyan_two }, 265 | mkdFootnotes = { fg = palette.cyan_two }, 266 | mkdID = { fg = palette.cyan_two, underline = true }, 267 | mkdInlineURL = { link = "markdownUrl" }, 268 | mkdLink = { link = "markdownUrl" }, 269 | mkdLinkDef = { link = "markdownUrl" }, 270 | mkdListItemLine = { fg = palette.text }, 271 | mkdRule = { fg = palette.subtle }, 272 | mkdURL = { link = "markdownUrl" }, 273 | 274 | --- Identifiers 275 | ["@variable"] = { fg = palette.text, italic = styles.italic }, 276 | ["@variable.builtin"] = { fg = palette.red_two }, 277 | ["@variable.parameter"] = { fg = palette.purple_two, italic = styles.italic }, 278 | ["@variable.member"] = { fg = palette.blue_two }, 279 | 280 | ["@constant"] = { fg = palette.orange_two }, 281 | ["@constant.builtin"] = { fg = palette.orange_two, bold = styles.bold }, 282 | ["@constant.macro"] = { fg = palette.orange_two }, 283 | 284 | ["@module"] = { fg = palette.text }, 285 | ["@module.builtin"] = { fg = palette.text, bold = styles.bold }, 286 | ["@label"] = { link = "Label" }, 287 | 288 | --- Literals 289 | ["@string"] = { link = "String" }, 290 | -- ["@string.documentation"] = {}, 291 | ["@string.regexp"] = { fg = palette.purple_two }, 292 | ["@string.escape"] = { fg = palette.blue_two }, 293 | ["@string.special"] = { link = "String" }, 294 | ["@string.special.symbol"] = { link = "Identifier" }, 295 | ["@string.special.url"] = { fg = groups.link }, 296 | -- ["@string.special.path"] = {}, 297 | 298 | ["@character"] = { link = "Character" }, 299 | ["@character.special"] = { link = "Character" }, 300 | 301 | ["@boolean"] = { link = "Boolean" }, 302 | ["@number"] = { link = "Number" }, 303 | ["@number.float"] = { link = "Number" }, 304 | ["@float"] = { link = "Number" }, 305 | 306 | --- Types 307 | ["@type"] = { fg = palette.cyan_two }, 308 | ["@type.builtin"] = { fg = palette.cyan_two, bold = styles.bold }, 309 | -- ["@type.definition"] = {}, 310 | -- ["@type.qualifier"] = {}, 311 | 312 | -- ["@attribute"] = {}, 313 | ["@property"] = { fg = palette.blue_two, italic = styles.italic }, 314 | 315 | --- Functions 316 | ["@function"] = { fg = palette.orange_two }, 317 | ["@function.builtin"] = { fg = palette.orange_two }, 318 | -- ["@function.call"] = {}, 319 | ["@function.macro"] = { link = "Function" }, 320 | ["@function.method"] = { fg = palette.orange_two }, 321 | ["@function.method.call"] = { fg = palette.orange_two }, 322 | 323 | ["@constructor"] = { fg = palette.cyan_two }, 324 | ["@operator"] = { link = "Operator" }, 325 | 326 | --- Keywords 327 | ["@keyword"] = { link = "Keyword" }, 328 | -- ["@keyword.coroutine"] = {}, 329 | -- ["@keyword.function"] = {}, 330 | ["@keyword.operator"] = { fg = palette.subtle }, 331 | ["@keyword.import"] = { fg = palette.red_two }, 332 | ["@keyword.storage"] = { fg = palette.cyan_two }, 333 | ["@keyword.repeat"] = { fg = palette.green_two }, 334 | ["@keyword.return"] = { fg = palette.green_two }, 335 | ["@keyword.debug"] = { fg = palette.magenta_two }, 336 | ["@keyword.exception"] = { fg = palette.green_two }, 337 | ["@keyword.conditional"] = { fg = palette.green_two }, 338 | ["@keyword.conditional.ternary"] = { fg = palette.green_two }, 339 | ["@keyword.directive"] = { fg = palette.purple_two }, 340 | ["@keyword.directive.define"] = { fg = palette.purple_two }, 341 | 342 | --- Punctuation 343 | ["@punctuation.delimiter"] = { fg = palette.subtle }, 344 | ["@punctuation.bracket"] = { fg = palette.subtle }, 345 | ["@punctuation.special"] = { fg = palette.subtle }, 346 | 347 | --- Comments 348 | ["@comment"] = { link = "Comment" }, 349 | -- ["@comment.documentation"] = {}, 350 | 351 | ["@comment.error"] = { fg = groups.error }, 352 | ["@comment.warning"] = { fg = groups.warn }, 353 | ["@comment.todo"] = { fg = groups.todo, bg = groups.todo, blend = 20 }, 354 | ["@comment.hint"] = { fg = groups.hint, bg = groups.hint, blend = 20 }, 355 | ["@comment.info"] = { fg = groups.info, bg = groups.info, blend = 20 }, 356 | ["@comment.note"] = { fg = groups.note, bg = groups.note, blend = 20 }, 357 | 358 | --- Markup 359 | ["@markup.strong"] = { bold = styles.bold }, 360 | ["@markup.italic"] = { italic = styles.italic }, 361 | ["@markup.strikethrough"] = { strikethrough = true }, 362 | ["@markup.underline"] = { underline = true }, 363 | 364 | ["@markup.heading"] = { fg = palette.cyan_two, bold = styles.bold }, 365 | 366 | ["@markup.quote"] = { fg = palette.text }, 367 | ["@markup.math"] = { link = "Special" }, 368 | ["@markup.environment"] = { link = "Macro" }, 369 | ["@markup.environment.name"] = { link = "@type" }, 370 | 371 | -- ["@markup.link"] = {}, 372 | ["@markup.link.markdown_inline"] = { fg = palette.subtle }, 373 | ["@markup.link.label.markdown_inline"] = { fg = palette.cyan_two }, 374 | ["@markup.link.url"] = { fg = groups.link }, 375 | 376 | -- ["@markup.raw"] = { bg = palette.surface }, 377 | -- ["@markup.raw.block"] = { bg = palette.surface }, 378 | ["@markup.raw.delimiter.markdown"] = { fg = palette.subtle }, 379 | 380 | ["@markup.list"] = { fg = palette.blue_two }, 381 | ["@markup.list.checked"] = { fg = palette.cyan_two, bg = palette.cyan_two, blend = 10 }, 382 | ["@markup.list.unchecked"] = { fg = palette.text }, 383 | 384 | -- Markdown headings 385 | ["@markup.heading.1.markdown"] = { link = "markdownH1" }, 386 | ["@markup.heading.2.markdown"] = { link = "markdownH2" }, 387 | ["@markup.heading.3.markdown"] = { link = "markdownH3" }, 388 | ["@markup.heading.4.markdown"] = { link = "markdownH4" }, 389 | ["@markup.heading.5.markdown"] = { link = "markdownH5" }, 390 | ["@markup.heading.6.markdown"] = { link = "markdownH6" }, 391 | ["@markup.heading.1.marker.markdown"] = { link = "markdownH1Delimiter" }, 392 | ["@markup.heading.2.marker.markdown"] = { link = "markdownH2Delimiter" }, 393 | ["@markup.heading.3.marker.markdown"] = { link = "markdownH3Delimiter" }, 394 | ["@markup.heading.4.marker.markdown"] = { link = "markdownH4Delimiter" }, 395 | ["@markup.heading.5.marker.markdown"] = { link = "markdownH5Delimiter" }, 396 | ["@markup.heading.6.marker.markdown"] = { link = "markdownH6Delimiter" }, 397 | 398 | ["@diff.plus"] = { fg = groups.git_add, bg = groups.git_add, blend = 20 }, 399 | ["@diff.minus"] = { fg = groups.git_delete, bg = groups.git_delete, blend = 20 }, 400 | ["@diff.delta"] = { bg = groups.git_change, blend = 20 }, 401 | 402 | ["@tag"] = { link = "Tag" }, 403 | ["@tag.attribute"] = { fg = palette.purple_two }, 404 | ["@tag.delimiter"] = { fg = palette.subtle }, 405 | 406 | --- Non-highlighting captures 407 | -- ["@none"] = {}, 408 | ["@conceal"] = { link = "Conceal" }, 409 | ["@conceal.markdown"] = { fg = palette.subtle }, 410 | 411 | -- ["@spell"] = {}, 412 | -- ["@nospell"] = {}, 413 | 414 | --- Semantic 415 | ["@lsp.type.comment"] = {}, 416 | ["@lsp.type.comment.c"] = { link = "@comment" }, 417 | ["@lsp.type.comment.cpp"] = { link = "@comment" }, 418 | ["@lsp.type.enum"] = { link = "@type" }, 419 | ["@lsp.type.interface"] = { link = "@interface" }, 420 | ["@lsp.type.keyword"] = { link = "@keyword" }, 421 | ["@lsp.type.namespace"] = { link = "@namespace" }, 422 | ["@lsp.type.namespace.python"] = { link = "@variable" }, 423 | ["@lsp.type.parameter"] = { link = "@parameter" }, 424 | ["@lsp.type.property"] = { link = "@property" }, 425 | ["@lsp.type.variable"] = {}, -- defer to treesitter for regular variables 426 | ["@lsp.type.variable.svelte"] = { link = "@variable" }, 427 | ["@lsp.typemod.function.defaultLibrary"] = { link = "@function.builtin" }, 428 | ["@lsp.typemod.operator.injected"] = { link = "@operator" }, 429 | ["@lsp.typemod.string.injected"] = { link = "@string" }, 430 | ["@lsp.typemod.variable.constant"] = { link = "@constant" }, 431 | ["@lsp.typemod.variable.defaultLibrary"] = { link = "@variable.builtin" }, 432 | ["@lsp.typemod.variable.injected"] = { link = "@variable" }, 433 | 434 | --- Plugins 435 | -- romgrk/barbar.nvim 436 | BufferCurrent = { fg = palette.text, bg = palette.overlay }, 437 | BufferCurrentIndex = { fg = palette.text, bg = palette.overlay }, 438 | BufferCurrentMod = { fg = palette.cyan_two, bg = palette.overlay }, 439 | BufferCurrentSign = { fg = palette.subtle, bg = palette.overlay }, 440 | BufferCurrentTarget = { fg = palette.orange_two, bg = palette.overlay }, 441 | BufferInactive = { fg = palette.subtle }, 442 | BufferInactiveIndex = { fg = palette.subtle }, 443 | BufferInactiveMod = { fg = palette.cyan_two }, 444 | BufferInactiveSign = { fg = palette.muted }, 445 | BufferInactiveTarget = { fg = palette.orange_two }, 446 | BufferTabpageFill = { fg = "NONE", bg = "NONE" }, 447 | BufferVisible = { fg = palette.subtle }, 448 | BufferVisibleIndex = { fg = palette.subtle }, 449 | BufferVisibleMod = { fg = palette.cyan_two }, 450 | BufferVisibleSign = { fg = palette.muted }, 451 | BufferVisibleTarget = { fg = palette.orange_two }, 452 | 453 | -- lewis6991/gitsigns.nvim 454 | GitSignsAdd = { link = "SignAdd" }, 455 | GitSignsChange = { link = "SignChange" }, 456 | GitSignsDelete = { link = "SignDelete" }, 457 | GitSignsAddInline = { fg = palette.green_two }, 458 | GitSignsChangeInline = { fg = palette.yellow_two }, 459 | GitSignsDeleteInline = { fg = palette.red_two }, 460 | SignAdd = { fg = groups.git_add, bg = "NONE" }, 461 | SignChange = { fg = groups.git_change, bg = "NONE" }, 462 | SignDelete = { fg = groups.git_delete, bg = "NONE" }, 463 | 464 | -- mvllow/modes.nvim 465 | ModesCopy = { bg = palette.orange_two }, 466 | ModesDelete = { bg = palette.red_two }, 467 | ModesInsert = { bg = palette.cyan_two }, 468 | ModesReplace = { bg = palette.blue_two }, 469 | ModesVisual = { bg = palette.purple_two }, 470 | 471 | -- kyazdani42/nvim-tree.lua 472 | NvimTreeEmptyFolderName = { fg = palette.muted }, 473 | NvimTreeFileDeleted = { fg = groups.git_delete }, 474 | NvimTreeFileDirty = { fg = groups.git_dirty }, 475 | NvimTreeFileMerge = { fg = groups.git_merge }, 476 | NvimTreeFileNew = { fg = palette.cyan_two }, 477 | NvimTreeFileRenamed = { fg = groups.git_rename }, 478 | NvimTreeFileStaged = { fg = groups.git_stage }, 479 | NvimTreeFolderIcon = { fg = palette.subtle }, 480 | NvimTreeFolderName = { fg = palette.cyan_two }, 481 | NvimTreeGitDeleted = { fg = groups.git_delete }, 482 | NvimTreeGitDirty = { fg = groups.git_dirty }, 483 | NvimTreeGitIgnored = { fg = groups.git_ignore }, 484 | NvimTreeGitMerge = { fg = groups.git_merge }, 485 | NvimTreeGitNew = { fg = groups.git_add }, 486 | NvimTreeGitRenamed = { fg = groups.git_rename }, 487 | NvimTreeGitStaged = { fg = groups.git_stage }, 488 | NvimTreeImageFile = { fg = palette.text }, 489 | NvimTreeNormal = { link = "Normal" }, 490 | NvimTreeOpenedFile = { fg = palette.text, bg = palette.overlay }, 491 | NvimTreeOpenedFolderName = { link = "NvimTreeFolderName" }, 492 | NvimTreeRootFolder = { fg = palette.cyan_two, bold = styles.bold }, 493 | NvimTreeSpecialFile = { link = "NvimTreeNormal" }, 494 | NvimTreeWindowPicker = { link = "StatusLineTerm" }, 495 | 496 | -- nvim-neotest/neotest 497 | NeotestAdapterName = { fg = palette.purple_two }, 498 | NeotestBorder = { fg = palette.highlight_med }, 499 | NeotestDir = { fg = palette.cyan_two }, 500 | NeotestExpandMarker = { fg = palette.highlight_med }, 501 | NeotestFailed = { fg = palette.red_two }, 502 | NeotestFile = { fg = palette.text }, 503 | NeotestFocused = { fg = palette.orange_two, bg = palette.highlight_med }, 504 | NeotestIndent = { fg = palette.highlight_med }, 505 | NeotestMarked = { fg = palette.magenta_two, bold = styles.bold }, 506 | NeotestNamespace = { fg = palette.orange_two }, 507 | NeotestPassed = { fg = palette.blue_two }, 508 | NeotestRunning = { fg = palette.orange_two }, 509 | NeotestWinSelect = { fg = palette.muted }, 510 | NeotestSkipped = { fg = palette.subtle }, 511 | NeotestTarget = { fg = palette.red_two }, 512 | NeotestTest = { fg = palette.orange_two }, 513 | NeotestUnknown = { fg = palette.subtle }, 514 | NeotestWatching = { fg = palette.purple_two }, 515 | 516 | -- nvim-neo-tree/neo-tree.nvim 517 | NeoTreeGitAdded = { fg = groups.git_add }, 518 | NeoTreeGitConflict = { fg = groups.git_merge }, 519 | NeoTreeGitDeleted = { fg = groups.git_delete }, 520 | NeoTreeGitIgnored = { fg = groups.git_ignore }, 521 | NeoTreeGitModified = { fg = groups.git_dirty }, 522 | NeoTreeGitRenamed = { fg = groups.git_rename }, 523 | NeoTreeGitUntracked = { fg = groups.git_untracked }, 524 | NeoTreeTabActive = { fg = palette.text, bg = palette.overlay }, 525 | NeoTreeTabInactive = { fg = palette.subtle }, 526 | NeoTreeTabSeparatorActive = { link = "WinSeparator" }, 527 | NeoTreeTabSeparatorInactive = { link = "WinSeparator" }, 528 | NeoTreeTitleBar = { link = "StatusLineTerm" }, 529 | 530 | -- folke/flash.nvim 531 | FlashLabel = { fg = palette.base, bg = palette.red_two }, 532 | 533 | -- folke/which-key.nvim 534 | WhichKey = { fg = palette.purple_two }, 535 | WhichKeyBorder = make_border(), 536 | WhichKeyDesc = { fg = palette.orange_two }, 537 | WhichKeyFloat = { bg = groups.panel }, 538 | WhichKeyGroup = { fg = palette.cyan_two }, 539 | WhichKeyIcon = { fg = palette.blue_two }, 540 | WhichKeyIconAzure = { fg = palette.blue_two }, 541 | WhichKeyIconBlue = { fg = palette.blue_two }, 542 | WhichKeyIconCyan = { fg = palette.cyan_two }, 543 | WhichKeyIconGreen = { fg = palette.green_two }, 544 | WhichKeyIconGrey = { fg = palette.subtle }, 545 | WhichKeyIconOrange = { fg = palette.magenta_two }, 546 | WhichKeyIconPurple = { fg = palette.purple_two }, 547 | WhichKeyIconRed = { fg = palette.red_two }, 548 | WhichKeyIconYellow = { fg = palette.orange_two }, 549 | WhichKeyNormal = { link = "NormalFloat" }, 550 | WhichKeySeparator = { fg = palette.subtle }, 551 | WhichKeyTitle = { link = "FloatTitle" }, 552 | WhichKeyValue = { fg = palette.magenta_two }, 553 | 554 | -- lukas-reineke/indent-blankline.nvim 555 | IblIndent = { fg = palette.overlay }, 556 | IblScope = { fg = palette.cyan_two }, 557 | IblWhitespace = { fg = palette.overlay }, 558 | 559 | -- hrsh7th/nvim-cmp 560 | CmpItemAbbr = { fg = palette.subtle }, 561 | CmpItemAbbrDeprecated = { fg = palette.subtle, strikethrough = true }, 562 | CmpItemAbbrMatch = { fg = palette.text, bold = styles.bold }, 563 | CmpItemAbbrMatchFuzzy = { fg = palette.text, bold = styles.bold }, 564 | CmpItemKind = { fg = palette.subtle }, 565 | CmpItemKindClass = { link = "StorageClass" }, 566 | CmpItemKindFunction = { link = "Function" }, 567 | CmpItemKindInterface = { link = "Type" }, 568 | CmpItemKindMethod = { link = "PreProc" }, 569 | CmpItemKindSnippet = { link = "String" }, 570 | CmpItemKindVariable = { link = "Identifier" }, 571 | 572 | -- NeogitOrg/neogit 573 | -- https://github.com/NeogitOrg/neogit/blob/master/lua/neogit/lib/hl.lua#L109-L198 574 | NeogitChangeAdded = { fg = groups.git_add, bold = styles.bold, italic = styles.italic }, 575 | NeogitChangeBothModified = { fg = groups.git_change, bold = styles.bold, italic = styles.italic }, 576 | NeogitChangeCopied = { fg = groups.git_untracked, bold = styles.bold, italic = styles.italic }, 577 | NeogitChangeDeleted = { fg = groups.git_delete, bold = styles.bold, italic = styles.italic }, 578 | NeogitChangeModified = { fg = groups.git_change, bold = styles.bold, italic = styles.italic }, 579 | NeogitChangeNewFile = { fg = groups.git_stage, bold = styles.bold, italic = styles.italic }, 580 | NeogitChangeRenamed = { fg = groups.git_rename, bold = styles.bold, italic = styles.italic }, 581 | NeogitChangeUpdated = { fg = groups.git_change, bold = styles.bold, italic = styles.italic }, 582 | NeogitDiffAddHighlight = { link = "DiffAdd" }, 583 | NeogitDiffContextHighlight = { bg = palette.surface }, 584 | NeogitDiffDeleteHighlight = { link = "DiffDelete" }, 585 | NeogitFilePath = { fg = palette.cyan_two, italic = styles.italic }, 586 | NeogitHunkHeader = { bg = groups.panel }, 587 | NeogitHunkHeaderHighlight = { bg = groups.panel }, 588 | 589 | -- vimwiki/vimwiki 590 | VimwikiHR = { fg = palette.subtle }, 591 | VimwikiHeader1 = { link = "markdownH1" }, 592 | VimwikiHeader2 = { link = "markdownH2" }, 593 | VimwikiHeader3 = { link = "markdownH3" }, 594 | VimwikiHeader4 = { link = "markdownH4" }, 595 | VimwikiHeader5 = { link = "markdownH5" }, 596 | VimwikiHeader6 = { link = "markdownH6" }, 597 | VimwikiHeaderChar = { fg = palette.subtle }, 598 | VimwikiLink = { link = "markdownUrl" }, 599 | VimwikiList = { fg = palette.purple_two }, 600 | VimwikiNoExistsLink = { fg = palette.red_two }, 601 | 602 | -- nvim-neorg/neorg 603 | NeorgHeading1Prefix = { link = "markdownH1Delimiter" }, 604 | NeorgHeading1Title = { link = "markdownH1" }, 605 | NeorgHeading2Prefix = { link = "markdownH2Delimiter" }, 606 | NeorgHeading2Title = { link = "markdownH2" }, 607 | NeorgHeading3Prefix = { link = "markdownH3Delimiter" }, 608 | NeorgHeading3Title = { link = "markdownH3" }, 609 | NeorgHeading4Prefix = { link = "markdownH4Delimiter" }, 610 | NeorgHeading4Title = { link = "markdownH4" }, 611 | NeorgHeading5Prefix = { link = "markdownH5Delimiter" }, 612 | NeorgHeading5Title = { link = "markdownH5" }, 613 | NeorgHeading6Prefix = { link = "markdownH6Delimiter" }, 614 | NeorgHeading6Title = { link = "markdownH6" }, 615 | NeorgMarkerTitle = { fg = palette.cyan_two, bold = styles.bold }, 616 | 617 | -- tami5/lspsaga.nvim (fork of glepnir/lspsaga.nvim) 618 | DefinitionCount = { fg = palette.magenta_two }, 619 | DefinitionIcon = { fg = palette.magenta_two }, 620 | DefinitionPreviewTitle = { fg = palette.magenta_two, bold = styles.bold }, 621 | LspFloatWinBorder = make_border(), 622 | LspFloatWinNormal = { bg = groups.panel }, 623 | LspSagaAutoPreview = { fg = palette.subtle }, 624 | LspSagaCodeActionBorder = make_border(palette.magenta_two), 625 | LspSagaCodeActionContent = { fg = palette.cyan_two }, 626 | LspSagaCodeActionTitle = { fg = palette.orange_two, bold = styles.bold }, 627 | LspSagaCodeActionTruncateLine = { link = "LspSagaCodeActionBorder" }, 628 | LspSagaDefPreviewBorder = make_border(), 629 | LspSagaDiagnosticBorder = make_border(palette.orange_two), 630 | LspSagaDiagnosticHeader = { fg = palette.cyan_two, bold = styles.bold }, 631 | LspSagaDiagnosticTruncateLine = { link = "LspSagaDiagnosticBorder" }, 632 | LspSagaDocTruncateLine = { link = "LspSagaHoverBorder" }, 633 | LspSagaFinderSelection = { fg = palette.orange_two }, 634 | LspSagaHoverBorder = { link = "LspFloatWinBorder" }, 635 | LspSagaLspFinderBorder = { link = "LspFloatWinBorder" }, 636 | LspSagaRenameBorder = make_border(palette.blue_two), 637 | LspSagaRenamePromptPrefix = { fg = palette.red_two }, 638 | LspSagaShTruncateLine = { link = "LspSagaSignatureHelpBorder" }, 639 | LspSagaSignatureHelpBorder = make_border(palette.cyan_two), 640 | ReferencesCount = { fg = palette.magenta_two }, 641 | ReferencesIcon = { fg = palette.magenta_two }, 642 | SagaShadow = { bg = palette.overlay }, 643 | TargetWord = { fg = palette.purple_two }, 644 | 645 | -- ray-x/lsp_signature.nvim 646 | LspSignatureActiveParameter = { bg = palette.overlay }, 647 | 648 | -- rlane/pounce.nvim 649 | PounceAccept = { fg = palette.red_two, bg = palette.red_two, blend = 20 }, 650 | PounceAcceptBest = { fg = palette.orange_two, bg = palette.orange_two, blend = 20 }, 651 | PounceGap = { link = "Search" }, 652 | PounceMatch = { link = "Search" }, 653 | 654 | -- ggandor/leap.nvim 655 | LeapLabelPrimary = { link = "IncSearch" }, 656 | LeapLabelSecondary = { link = "StatusLineTerm" }, 657 | LeapMatch = { link = "MatchParen" }, 658 | 659 | -- phaazon/hop.nvim 660 | -- smoka7/hop.nvim 661 | HopNextKey = { fg = palette.red_two, bg = palette.red_two, blend = 20 }, 662 | HopNextKey1 = { fg = palette.cyan_two, bg = palette.cyan_two, blend = 20 }, 663 | HopNextKey2 = { fg = palette.blue_two, bg = palette.blue_two, blend = 20 }, 664 | HopUnmatched = { fg = palette.muted }, 665 | 666 | -- nvim-telescope/telescope.nvim 667 | TelescopeBorder = make_border(), 668 | TelescopeMatching = { fg = palette.magenta_two }, 669 | TelescopeNormal = { link = "NormalFloat" }, 670 | TelescopePromptNormal = { link = "TelescopeNormal" }, 671 | TelescopePromptPrefix = { fg = palette.subtle }, 672 | TelescopeSelection = { fg = palette.text, bg = palette.overlay }, 673 | TelescopeSelectionCaret = { fg = palette.magenta_two, bg = palette.overlay }, 674 | TelescopeTitle = { fg = palette.cyan_two, bold = styles.bold }, 675 | 676 | -- ibhagwan/fzf-lua 677 | FzfLuaBorder = make_border(), 678 | FzfLuaBufFlagAlt = { fg = palette.subtle }, 679 | FzfLuaBufFlagCur = { fg = palette.subtle }, 680 | FzfLuaCursorLine = { fg = palette.text, bg = palette.overlay }, 681 | FzfLuaFilePart = { fg = palette.text }, 682 | FzfLuaHeaderBind = { fg = palette.magenta_two }, 683 | FzfLuaHeaderText = { fg = palette.red_two }, 684 | FzfLuaNormal = { link = "NormalFloat" }, 685 | FzfLuaTitle = { link = "FloatTitle" }, 686 | 687 | -- rcarriga/nvim-notify 688 | NotifyDEBUGBorder = make_border(), 689 | NotifyDEBUGIcon = { link = "NotifyDEBUGTitle" }, 690 | NotifyDEBUGTitle = { fg = palette.muted }, 691 | NotifyERRORBorder = make_border(groups.error), 692 | NotifyERRORIcon = { link = "NotifyERRORTitle" }, 693 | NotifyERRORTitle = { fg = groups.error }, 694 | NotifyINFOBorder = make_border(groups.info), 695 | NotifyINFOIcon = { link = "NotifyINFOTitle" }, 696 | NotifyINFOTitle = { fg = groups.info }, 697 | NotifyTRACEBorder = make_border(palette.purple_two), 698 | NotifyTRACEIcon = { link = "NotifyTRACETitle" }, 699 | NotifyTRACETitle = { fg = palette.purple_two }, 700 | NotifyWARNBorder = make_border(groups.warn), 701 | NotifyWARNIcon = { link = "NotifyWARNTitle" }, 702 | NotifyWARNTitle = { fg = groups.warn }, 703 | NotifyBackground = { bg = palette.surface }, 704 | -- rcarriga/nvim-dap-ui 705 | DapUIBreakpointsCurrentLine = { fg = palette.orange_two, bold = styles.bold }, 706 | DapUIBreakpointsDisabledLine = { fg = palette.muted }, 707 | DapUIBreakpointsInfo = { link = "DapUIThread" }, 708 | DapUIBreakpointsLine = { link = "DapUIBreakpointsPath" }, 709 | DapUIBreakpointsPath = { fg = palette.cyan_two }, 710 | DapUIDecoration = { link = "DapUIBreakpointsPath" }, 711 | DapUIFloatBorder = make_border(), 712 | DapUIFrameName = { fg = palette.text }, 713 | DapUILineNumber = { link = "DapUIBreakpointsPath" }, 714 | DapUIModifiedValue = { fg = palette.cyan_two, bold = styles.bold }, 715 | DapUIScope = { link = "DapUIBreakpointsPath" }, 716 | DapUISource = { fg = palette.purple_two }, 717 | DapUIStoppedThread = { link = "DapUIBreakpointsPath" }, 718 | DapUIThread = { fg = palette.orange_two }, 719 | DapUIValue = { fg = palette.text }, 720 | DapUIVariable = { fg = palette.text }, 721 | DapUIWatchesEmpty = { fg = palette.red_two }, 722 | DapUIWatchesError = { link = "DapUIWatchesEmpty" }, 723 | DapUIWatchesValue = { link = "DapUIThread" }, 724 | 725 | -- glepnir/dashboard-nvim 726 | DashboardCenter = { fg = palette.orange_two }, 727 | DashboardFooter = { fg = palette.purple_two }, 728 | DashboardHeader = { fg = palette.blue_two }, 729 | DashboardShortcut = { fg = palette.red_two }, 730 | 731 | -- SmiteshP/nvim-navic 732 | NavicIconsArray = { fg = palette.orange_two }, 733 | NavicIconsBoolean = { fg = palette.magenta_two }, 734 | NavicIconsClass = { fg = palette.cyan_two }, 735 | NavicIconsConstant = { fg = palette.orange_two }, 736 | NavicIconsConstructor = { fg = palette.orange_two }, 737 | NavicIconsEnum = { fg = palette.orange_two }, 738 | NavicIconsEnumMember = { fg = palette.cyan_two }, 739 | NavicIconsEvent = { fg = palette.orange_two }, 740 | NavicIconsField = { fg = palette.cyan_two }, 741 | NavicIconsFile = { fg = palette.muted }, 742 | NavicIconsFunction = { fg = palette.blue_two }, 743 | NavicIconsInterface = { fg = palette.cyan_two }, 744 | NavicIconsKey = { fg = palette.purple_two }, 745 | NavicIconsKeyword = { fg = palette.blue_two }, 746 | NavicIconsMethod = { fg = palette.purple_two }, 747 | NavicIconsModule = { fg = palette.magenta_two }, 748 | NavicIconsNamespace = { fg = palette.muted }, 749 | NavicIconsNull = { fg = palette.red_two }, 750 | NavicIconsNumber = { fg = palette.orange_two }, 751 | NavicIconsObject = { fg = palette.orange_two }, 752 | NavicIconsOperator = { fg = palette.subtle }, 753 | NavicIconsPackage = { fg = palette.muted }, 754 | NavicIconsProperty = { fg = palette.cyan_two }, 755 | NavicIconsString = { fg = palette.orange_two }, 756 | NavicIconsStruct = { fg = palette.cyan_two }, 757 | NavicIconsTypeParameter = { fg = palette.cyan_two }, 758 | NavicIconsVariable = { fg = palette.text }, 759 | NavicSeparator = { fg = palette.subtle }, 760 | NavicText = { fg = palette.subtle }, 761 | 762 | -- folke/noice.nvim 763 | NoiceCursor = { fg = palette.highlight_high, bg = palette.text }, 764 | 765 | -- folke/trouble.nvim 766 | TroubleText = { fg = palette.subtle }, 767 | TroubleCount = { fg = palette.purple_two, bg = palette.surface }, 768 | TroubleNormal = { fg = palette.text, bg = groups.panel }, 769 | 770 | -- echasnovski/mini.nvim 771 | MiniAnimateCursor = { reverse = true, nocombine = true }, 772 | MiniAnimateNormalFloat = { link = "NormalFloat" }, 773 | 774 | MiniClueBorder = { link = "FloatBorder" }, 775 | MiniClueDescGroup = { link = "DiagnosticFloatingWarn" }, 776 | MiniClueDescSingle = { link = "NormalFloat" }, 777 | MiniClueNextKey = { link = "DiagnosticFloatingHint" }, 778 | MiniClueNextKeyWithPostkeys = { link = "DiagnosticFloatingError" }, 779 | MiniClueSeparator = { link = "DiagnosticFloatingInfo" }, 780 | MiniClueTitle = { bg = groups.panel, bold = styles.bold }, 781 | 782 | MiniCompletionActiveParameter = { underline = true }, 783 | 784 | MiniCursorword = { underline = true }, 785 | MiniCursorwordCurrent = { underline = true }, 786 | 787 | MiniDepsChangeAdded = { fg = groups.git_add }, 788 | MiniDepsChangeRemoved = { fg = groups.git_delete }, 789 | MiniDepsHint = { link = "DiagnosticHint" }, 790 | MiniDepsInfo = { link = "DiagnosticInfo" }, 791 | MiniDepsMsgBreaking = { link = "DiagnosticWarn" }, 792 | MiniDepsPlaceholder = { link = "Comment" }, 793 | MiniDepsTitle = { link = "Title" }, 794 | MiniDepsTitleError = { link = "DiffDelete" }, 795 | MiniDepsTitleSame = { link = "DiffText" }, 796 | MiniDepsTitleUpdate = { link = "DiffAdd" }, 797 | 798 | MiniDiffOverAdd = { fg = groups.git_add, bg = groups.git_add, blend = 20 }, 799 | MiniDiffOverChange = { fg = groups.git_change, bg = groups.git_change, blend = 20 }, 800 | MiniDiffOverContext = { bg = palette.surface }, 801 | MiniDiffOverDelete = { fg = groups.git_delete, bg = groups.git_delete, blend = 20 }, 802 | MiniDiffSignAdd = { fg = groups.git_add }, 803 | MiniDiffSignChange = { fg = groups.git_change }, 804 | MiniDiffSignDelete = { fg = groups.git_delete }, 805 | 806 | MiniFilesBorder = { link = "FloatBorder" }, 807 | MiniFilesBorderModified = { link = "DiagnosticFloatingWarn" }, 808 | MiniFilesCursorLine = { link = "CursorLine" }, 809 | MiniFilesDirectory = { link = "Directory" }, 810 | MiniFilesFile = { fg = palette.text }, 811 | MiniFilesNormal = { link = "NormalFloat" }, 812 | MiniFilesTitle = { link = "FloatTitle" }, 813 | MiniFilesTitleFocused = { fg = palette.magenta_two, bg = groups.panel, bold = styles.bold }, 814 | 815 | MiniHipatternsFixme = { fg = palette.base, bg = groups.error, bold = styles.bold }, 816 | MiniHipatternsHack = { fg = palette.base, bg = groups.warn, bold = styles.bold }, 817 | MiniHipatternsNote = { fg = palette.base, bg = groups.info, bold = styles.bold }, 818 | MiniHipatternsTodo = { fg = palette.base, bg = groups.hint, bold = styles.bold }, 819 | 820 | MiniIconsAzure = { fg = palette.cyan_two }, 821 | MiniIconsBlue = { fg = palette.blue_two }, 822 | MiniIconsCyan = { fg = palette.cyan_two }, 823 | MiniIconsGreen = { fg = palette.green_two }, 824 | MiniIconsGrey = { fg = palette.subtle }, 825 | MiniIconsOrange = { fg = palette.magenta_two }, 826 | MiniIconsPurple = { fg = palette.purple_two }, 827 | MiniIconsRed = { fg = palette.red_two }, 828 | MiniIconsYellow = { fg = palette.orange_two }, 829 | 830 | MiniIndentscopeSymbol = { fg = palette.muted }, 831 | MiniIndentscopeSymbolOff = { fg = palette.orange_two }, 832 | 833 | MiniJump = { sp = palette.orange_two, undercurl = true }, 834 | 835 | MiniJump2dDim = { fg = palette.subtle }, 836 | MiniJump2dSpot = { fg = palette.orange_two, bold = styles.bold, nocombine = true }, 837 | MiniJump2dSpotAhead = { fg = palette.cyan_two, bg = palette.surface, nocombine = true }, 838 | MiniJump2dSpotUnique = { fg = palette.magenta_two, bold = styles.bold, nocombine = true }, 839 | 840 | MiniMapNormal = { link = "NormalFloat" }, 841 | MiniMapSymbolCount = { link = "Special" }, 842 | MiniMapSymbolLine = { link = "Title" }, 843 | MiniMapSymbolView = { link = "Delimiter" }, 844 | 845 | MiniNotifyBorder = { link = "FloatBorder" }, 846 | MiniNotifyNormal = { link = "NormalFloat" }, 847 | MiniNotifyTitle = { link = "FloatTitle" }, 848 | 849 | MiniOperatorsExchangeFrom = { link = "IncSearch" }, 850 | 851 | MiniPickBorder = { link = "FloatBorder" }, 852 | MiniPickBorderBusy = { link = "DiagnosticFloatingWarn" }, 853 | MiniPickBorderText = { bg = groups.panel }, 854 | MiniPickIconDirectory = { link = "Directory" }, 855 | MiniPickIconFile = { link = "MiniPickNormal" }, 856 | MiniPickHeader = { link = "DiagnosticFloatingHint" }, 857 | MiniPickMatchCurrent = { link = "CursorLine" }, 858 | MiniPickMatchMarked = { link = "Visual" }, 859 | MiniPickMatchRanges = { fg = palette.cyan_two }, 860 | MiniPickNormal = { link = "NormalFloat" }, 861 | MiniPickPreviewLine = { link = "CursorLine" }, 862 | MiniPickPreviewRegion = { link = "IncSearch" }, 863 | MiniPickPrompt = { bg = groups.panel, bold = styles.bold }, 864 | 865 | MiniStarterCurrent = { nocombine = true }, 866 | MiniStarterFooter = { fg = palette.subtle }, 867 | MiniStarterHeader = { link = "Title" }, 868 | MiniStarterInactive = { link = "Comment" }, 869 | MiniStarterItem = { link = "Normal" }, 870 | MiniStarterItemBullet = { link = "Delimiter" }, 871 | MiniStarterItemPrefix = { link = "WarningMsg" }, 872 | MiniStarterSection = { fg = palette.magenta_two }, 873 | MiniStarterQuery = { link = "MoreMsg" }, 874 | 875 | MiniStatuslineDevinfo = { fg = palette.subtle, bg = palette.overlay }, 876 | MiniStatuslineFileinfo = { link = "MiniStatuslineDevinfo" }, 877 | MiniStatuslineFilename = { fg = palette.muted, bg = palette.surface }, 878 | MiniStatuslineInactive = { link = "MiniStatuslineFilename" }, 879 | MiniStatuslineModeCommand = { fg = palette.base, bg = palette.red_two, bold = styles.bold }, 880 | MiniStatuslineModeInsert = { fg = palette.base, bg = palette.cyan_two, bold = styles.bold }, 881 | MiniStatuslineModeNormal = { fg = palette.base, bg = palette.magenta_two, bold = styles.bold }, 882 | MiniStatuslineModeOther = { fg = palette.base, bg = palette.magenta_two, bold = styles.bold }, 883 | MiniStatuslineModeReplace = { fg = palette.base, bg = palette.blue_two, bold = styles.bold }, 884 | MiniStatuslineModeVisual = { fg = palette.base, bg = palette.purple_two, bold = styles.bold }, 885 | 886 | MiniSurround = { link = "IncSearch" }, 887 | 888 | MiniTablineCurrent = { fg = palette.text, bg = palette.overlay, bold = styles.bold }, 889 | MiniTablineFill = { link = "TabLineFill" }, 890 | MiniTablineHidden = { fg = palette.subtle, bg = groups.panel }, 891 | MiniTablineModifiedCurrent = { fg = palette.overlay, bg = palette.text, bold = styles.bold }, 892 | MiniTablineModifiedHidden = { fg = groups.panel, bg = palette.subtle }, 893 | MiniTablineModifiedVisible = { fg = groups.panel, bg = palette.text }, 894 | MiniTablineTabpagesection = { link = "Search" }, 895 | MiniTablineVisible = { fg = palette.text, bg = groups.panel }, 896 | 897 | MiniTestEmphasis = { bold = styles.bold }, 898 | MiniTestFail = { fg = palette.red_two, bold = styles.bold }, 899 | MiniTestPass = { fg = palette.cyan_two, bold = styles.bold }, 900 | 901 | MiniTrailspace = { bg = palette.red_two }, 902 | 903 | -- goolord/alpha-nvim 904 | AlphaButtons = { fg = palette.cyan_two }, 905 | AlphaFooter = { fg = palette.orange_two }, 906 | AlphaHeader = { fg = palette.blue_two }, 907 | AlphaShortcut = { fg = palette.magenta_two }, 908 | 909 | -- github/copilot.vim 910 | CopilotSuggestion = { fg = palette.muted, italic = styles.italic }, 911 | 912 | -- nvim-treesitter/nvim-treesitter-context 913 | TreesitterContext = { bg = palette.overlay }, 914 | TreesitterContextLineNumber = { fg = palette.magenta_two, bg = palette.overlay }, 915 | 916 | -- RRethy/vim-illuminate 917 | IlluminatedWordRead = { bg = palette.overlay }, 918 | IlluminatedWordText = { bg = palette.overlay }, 919 | IlluminatedWordWrite = { bg = palette.overlay }, 920 | 921 | -- HiPhish/rainbow-delimiters.nvim 922 | RainbowDelimiterBlue = { fg = palette.blue_two }, 923 | RainbowDelimiterCyan = { fg = palette.cyan_two }, 924 | RainbowDelimiterGreen = { fg = palette.green_two }, 925 | RainbowDelimiterOrange = { fg = palette.magenta_two }, 926 | RainbowDelimiterRed = { fg = palette.red_two }, 927 | RainbowDelimiterViolet = { fg = palette.purple_two }, 928 | RainbowDelimiterYellow = { fg = palette.orange_two }, 929 | 930 | -- MeanderingProgrammer/render-markdown.nvim 931 | RenderMarkdownBullet = { fg = palette.magenta_two }, 932 | RenderMarkdownChecked = { fg = palette.cyan_two }, 933 | RenderMarkdownCode = { bg = palette.overlay }, 934 | RenderMarkdownCodeInline = { fg = palette.text, bg = palette.overlay }, 935 | RenderMarkdownDash = { fg = palette.muted }, 936 | RenderMarkdownH1Bg = { bg = groups.h1, blend = 20 }, 937 | RenderMarkdownH2Bg = { bg = groups.h2, blend = 20 }, 938 | RenderMarkdownH3Bg = { bg = groups.h3, blend = 20 }, 939 | RenderMarkdownH4Bg = { bg = groups.h4, blend = 20 }, 940 | RenderMarkdownH5Bg = { bg = groups.h5, blend = 20 }, 941 | RenderMarkdownH6Bg = { bg = groups.h6, blend = 20 }, 942 | RenderMarkdownQuote = { fg = palette.subtle }, 943 | RenderMarkdownTableFill = { link = "Conceal" }, 944 | RenderMarkdownTableHead = { fg = palette.subtle }, 945 | RenderMarkdownTableRow = { fg = palette.subtle }, 946 | RenderMarkdownUnchecked = { fg = palette.subtle }, 947 | 948 | -- MagicDuck/grug-far.nvim 949 | GrugFarHelpHeader = { fg = palette.blue_two }, 950 | GrugFarHelpHeaderKey = { fg = palette.orange_two }, 951 | GrugFarHelpWinActionKey = { fg = palette.orange_two }, 952 | GrugFarHelpWinActionPrefix = { fg = palette.cyan_two }, 953 | GrugFarHelpWinActionText = { fg = palette.blue_two }, 954 | GrugFarHelpWinHeader = { link = "FloatTitle" }, 955 | GrugFarInputLabel = { fg = palette.cyan_two }, 956 | GrugFarInputPlaceholder = { link = "Comment" }, 957 | GrugFarResultsActionMessage = { fg = palette.cyan_two }, 958 | GrugFarResultsChangeIndicator = { fg = groups.git_change }, 959 | GrugFarResultsHeader = { fg = palette.blue_two }, 960 | GrugFarResultsLineNo = { fg = palette.purple_two }, 961 | GrugFarResultsLineColumn = { link = "GrugFarResultsLineNo" }, 962 | GrugFarResultsMatch = { link = "CurSearch" }, 963 | GrugFarResultsPath = { fg = palette.cyan_two }, 964 | GrugFarResultsStats = { fg = palette.purple_two }, 965 | 966 | -- yetone/avante.nvim 967 | AvanteTitle = { fg = palette.highlight_high, bg = palette.magenta_two }, 968 | AvanteReversedTitle = { fg = palette.magenta_two }, 969 | AvanteSubtitle = { fg = palette.highlight_med, bg = palette.cyan_two }, 970 | AvanteReversedSubtitle = { fg = palette.cyan_two }, 971 | AvanteThirdTitle = { fg = palette.highlight_med, bg = palette.purple_two }, 972 | AvanteReversedThirdTitle = { fg = palette.purple_two }, 973 | 974 | -- folke/todo-comments.nvim 975 | TodoBgTODO = { link = "@comment.todo" }, 976 | TodoBgWARN = { fg = groups.warn, bg = groups.warn, blend = 20 }, 977 | TodoBgHACK = { link = "@comment.warn" }, 978 | TodoBgFIX = { fg = groups.error, bg = groups.error, blend = 20 }, 979 | TodoBgNOTE = { link = "@comment.note" }, 980 | TodoBgPERF = { link = "@comment.info" }, 981 | TodoBgTEST = { link = "@comment.info" }, 982 | TodoFgTODO = { fg = groups.todo }, 983 | TodoFgWARN = { fg = groups.warn }, 984 | TodoFgHACK = { link = "TodoFgWARN" }, 985 | TodoFgFIX = { fg = groups.error }, 986 | TodoFgNOTE = { fg = groups.note }, 987 | TodoFgPERF = { fg = groups.info }, 988 | TodoFgTEST = { link = "TodoFgPERF" }, 989 | TodoSignTODO = { fg = groups.todo }, 990 | TodoSignWARN = { fg = groups.warn }, 991 | TodoSignHACK = { link = "TodoSignWARN" }, 992 | TodoSignFIX = { fg = groups.error }, 993 | TodoSignNOTE = { fg = groups.note }, 994 | TodoSignPERF = { fg = groups.info }, 995 | TodoSignTEST = { link = "TodoSignPERF" }, 996 | 997 | InclineNormal = { bg = palette.overlay }, 998 | InclineNormalNC = { bg = palette.overlay }, 999 | 1000 | -- sindrets/diffview.nvim 1001 | DiffViewDiffAdd = { bg = palette.green_zero }, 1002 | } 1003 | local transparency_highlights = { 1004 | DiagnosticVirtualTextError = { fg = groups.error }, 1005 | DiagnosticVirtualTextHint = { fg = groups.hint }, 1006 | DiagnosticVirtualTextInfo = { fg = groups.info }, 1007 | DiagnosticVirtualTextOk = { fg = groups.ok }, 1008 | DiagnosticVirtualTextWarn = { fg = groups.warn }, 1009 | 1010 | FloatBorder = { fg = palette.muted, bg = "NONE" }, 1011 | FloatTitle = { fg = palette.cyan_two, bg = "NONE", bold = styles.bold }, 1012 | Folded = { fg = palette.text, bg = "NONE", italic = styles.italic }, 1013 | NormalFloat = { bg = "NONE" }, 1014 | Normal = { fg = palette.text, bg = "NONE" }, 1015 | NormalNC = { fg = palette.text, bg = config.options.dim_inactive_windows and palette._nc or "NONE" }, 1016 | Pmenu = { fg = palette.subtle, bg = "NONE" }, 1017 | PmenuKind = { fg = palette.cyan_two, bg = "NONE" }, 1018 | SignColumn = { fg = palette.text, bg = "NONE" }, 1019 | StatusLine = { fg = palette.subtle, bg = "NONE" }, 1020 | StatusLineNC = { fg = palette.muted, bg = "NONE" }, 1021 | TabLine = { bg = "NONE", fg = palette.subtle }, 1022 | TabLineFill = { bg = "NONE" }, 1023 | TabLineSel = { fg = palette.text, bg = "NONE", bold = styles.bold }, 1024 | 1025 | -- ["@markup.raw"] = { bg = "none" }, 1026 | ["@markup.raw.markdown_inline"] = { fg = palette.orange_two }, 1027 | -- ["@markup.raw.block"] = { bg = "none" }, 1028 | 1029 | TelescopeNormal = { fg = palette.subtle, bg = "NONE" }, 1030 | TelescopePromptNormal = { fg = palette.text, bg = "NONE" }, 1031 | TelescopeSelection = { fg = palette.text, bg = "NONE", bold = styles.bold }, 1032 | TelescopeSelectionCaret = { fg = palette.magenta_two }, 1033 | 1034 | TroubleNormal = { bg = "NONE" }, 1035 | 1036 | WhichKeyFloat = { bg = "NONE" }, 1037 | WhichKeyNormal = { bg = "NONE" }, 1038 | 1039 | IblIndent = { fg = palette.overlay, bg = "NONE" }, 1040 | IblScope = { fg = palette.cyan_two, bg = "NONE" }, 1041 | IblWhitespace = { fg = palette.overlay, bg = "NONE" }, 1042 | 1043 | TreesitterContext = { bg = "NONE" }, 1044 | TreesitterContextLineNumber = { fg = palette.magenta_two, bg = "NONE" }, 1045 | 1046 | MiniFilesTitleFocused = { fg = palette.magenta_two, bg = "NONE", bold = styles.bold }, 1047 | 1048 | MiniPickPrompt = { bg = "NONE", bold = styles.bold }, 1049 | MiniPickBorderText = { bg = "NONE" }, 1050 | } 1051 | 1052 | if config.options.enable.legacy_highlights then 1053 | for group, highlight in pairs(legacy_highlights) do 1054 | highlights[group] = highlight 1055 | end 1056 | end 1057 | for group, highlight in pairs(default_highlights) do 1058 | highlights[group] = highlight 1059 | end 1060 | if styles.transparency then 1061 | for group, highlight in pairs(transparency_highlights) do 1062 | highlights[group] = highlight 1063 | end 1064 | end 1065 | 1066 | -- Reconcile highlights with config 1067 | if config.options.highlight_groups ~= nil and next(config.options.highlight_groups) ~= nil then 1068 | for group, highlight in pairs(config.options.highlight_groups) do 1069 | local existing = highlights[group] or {} 1070 | -- Traverse link due to 1071 | -- "If link is used in combination with other attributes; only the link will take effect" 1072 | -- see: https://neovim.io/doc/user/api.html#nvim_set_hl() 1073 | while existing.link ~= nil do 1074 | existing = highlights[existing.link] or {} 1075 | end 1076 | local parsed = vim.tbl_extend("force", {}, highlight) 1077 | 1078 | if highlight.fg ~= nil then 1079 | parsed.fg = utilities.parse_color(highlight.fg) or highlight.fg 1080 | end 1081 | if highlight.bg ~= nil then 1082 | parsed.bg = utilities.parse_color(highlight.bg) or highlight.bg 1083 | end 1084 | if highlight.sp ~= nil then 1085 | parsed.sp = utilities.parse_color(highlight.sp) or highlight.sp 1086 | end 1087 | 1088 | if (highlight.inherit == nil or highlight.inherit) and existing ~= nil then 1089 | parsed.inherit = nil 1090 | highlights[group] = vim.tbl_extend("force", existing, parsed) 1091 | else 1092 | parsed.inherit = nil 1093 | highlights[group] = parsed 1094 | end 1095 | end 1096 | end 1097 | 1098 | for group, highlight in pairs(highlights) do 1099 | if config.options.before_highlight ~= nil then 1100 | config.options.before_highlight(group, highlight, palette) 1101 | end 1102 | if highlight.blend ~= nil and (highlight.blend >= 0 and highlight.blend <= 100) and highlight.bg ~= nil then 1103 | highlight.bg = utilities.blend(highlight.bg, highlight.blend_on or palette.base, highlight.blend / 100) 1104 | end 1105 | vim.api.nvim_set_hl(0, group, highlight) 1106 | end 1107 | 1108 | --- Terminal 1109 | if config.options.enable.terminal then 1110 | vim.g.terminal_color_0 = palette.overlay -- black 1111 | vim.g.terminal_color_8 = palette.subtle -- bright black 1112 | vim.g.terminal_color_1 = palette.red_two -- red 1113 | vim.g.terminal_color_9 = palette.red_two -- bright red 1114 | vim.g.terminal_color_2 = palette.blue_two -- green 1115 | vim.g.terminal_color_10 = palette.blue_two -- bright green 1116 | vim.g.terminal_color_3 = palette.orange_two -- yellow_two 1117 | vim.g.terminal_color_11 = palette.orange_two -- bright yellow_two 1118 | vim.g.terminal_color_4 = palette.cyan_two -- blue 1119 | vim.g.terminal_color_12 = palette.cyan_two -- bright blue 1120 | vim.g.terminal_color_5 = palette.purple_two -- magenta 1121 | vim.g.terminal_color_13 = palette.purple_two -- bright magenta 1122 | vim.g.terminal_color_6 = palette.magenta_two -- cyan 1123 | vim.g.terminal_color_14 = palette.magenta_two -- bright cyan 1124 | vim.g.terminal_color_7 = palette.text -- white 1125 | vim.g.terminal_color_15 = palette.text -- bright white 1126 | 1127 | -- Support StatusLineTerm & StatusLineTermNC from vim 1128 | vim.cmd([[ 1129 | augroup flexoki 1130 | autocmd! 1131 | autocmd TermOpen * if &buftype=='terminal' 1132 | \|setlocal winhighlight=StatusLine:StatusLineTerm,StatusLineNC:StatusLineTermNC 1133 | \|else|setlocal winhighlight=|endif 1134 | autocmd ColorSchemePre * autocmd! flexoki 1135 | augroup END 1136 | ]]) 1137 | end 1138 | end 1139 | 1140 | ---@param variant Variant | nil 1141 | function M.colorscheme(variant) 1142 | config.extend_options({ variant = variant }) 1143 | 1144 | vim.opt.termguicolors = true 1145 | if vim.g.colors_name then 1146 | vim.cmd("hi clear") 1147 | vim.cmd("syntax reset") 1148 | end 1149 | vim.g.colors_name = "flexoki" 1150 | 1151 | set_highlights() 1152 | end 1153 | 1154 | ---@param options Options 1155 | function M.setup(options) 1156 | config.extend_options(options or {}) 1157 | end 1158 | 1159 | return M 1160 | -------------------------------------------------------------------------------- /lua/flexoki/config.lua: -------------------------------------------------------------------------------- 1 | ---@alias Variant "moon" | "dawn" 2 | ---@alias Palette { base: string, surface: string, overlay: string, muted: string, subtle: string, text: string, red_two: string, orange_two: string, magenta_two: string, blue_two: string, cyan_two: string, purple_two: string } 3 | ---@alias PaletteColor "base" | "surface" | "overlay" | "muted" | "subtle" | "text" | "red_two" | "orange_two" | "magenta_two" | "blue_two" | "cyan_two" | "purple_two" | "highlight_low" | "highlight_med" | "highlight_high" 4 | ---@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 } 5 | 6 | local config = {} 7 | 8 | ---@class Options 9 | config.options = { 10 | ---Set the desired variant: "auto" will follow the vim background, 11 | ---defaulting to `dark_variant` for dark and "dawn" for light. 12 | ---@type "auto" | Variant 13 | variant = "auto", 14 | 15 | ---Set the desired dark variant when `options.variant` is set to "auto". 16 | ---@type Variant 17 | dark_variant = "moon", 18 | 19 | ---Differentiate between active and inactive windows and panels. 20 | dim_inactive_windows = false, 21 | 22 | ---Extend background behind borders. Appearance differs based on which 23 | ---border characters you are using. 24 | extend_background_behind_borders = true, 25 | 26 | enable = { 27 | legacy_highlights = true, 28 | migrations = true, 29 | terminal = true, 30 | }, 31 | 32 | styles = { 33 | bold = true, 34 | italic = false, 35 | transparency = false, 36 | }, 37 | 38 | ---@type table> 39 | palette = {}, 40 | 41 | ---@type table 42 | groups = { 43 | border = "muted", 44 | link = "purple_two", 45 | panel = "surface", 46 | 47 | error = "red_two", 48 | hint = "purple_two", 49 | info = "cyan_two", 50 | ok = "green_two", 51 | warn = "orange_two", 52 | note = "blue_two", 53 | todo = "magenta_two", 54 | 55 | git_add = "green_one", 56 | git_change = "yellow_one", 57 | git_delete = "red_one", 58 | git_dirty = "yellow_one", 59 | git_ignore = "muted", 60 | git_merge = "purple_one", 61 | git_rename = "blue_one", 62 | git_stage = "purple_one", 63 | git_text = "blue_one", 64 | git_untracked = "subtle", 65 | 66 | ---@type string | PaletteColor 67 | h1 = "purple_two", 68 | h2 = "cyan_two", 69 | h3 = "magenta_two", 70 | h4 = "orange_two", 71 | h5 = "blue_two", 72 | h6 = "green_two", 73 | 74 | ---@deprecated Replaced by `options.highlight_groups["Normal"]` 75 | -- background = "base", 76 | ---@deprecated Replaced by `options.highlight_groups["Comment"]` 77 | -- comment = "subtle", 78 | ---@deprecated Replaced by `options.highlight_groups["@punctuation"]` 79 | -- punctuation = "muted", 80 | ---@deprecated Expects a table with values h1...h6 81 | -- headings = "text", 82 | }, 83 | 84 | ---@type table 85 | highlight_groups = {}, 86 | 87 | ---Called before each highlight group, before setting the highlight. 88 | ---@param group string 89 | ---@param highlight Highlight 90 | ---@param palette Palette 91 | ---@diagnostic disable-next-line: unused-local 92 | before_highlight = function(group, highlight, palette) end, 93 | 94 | ---@deprecated Replaced by `options.dim_inactive_windows` 95 | -- dim_nc_background = false, 96 | ---@deprecated Replaced by `options.enable.transparency` 97 | -- disable_background = false, 98 | ---@deprecated Replaced by `options.highlight_groups["NormalFloat"]` 99 | -- disable_float_background = false, 100 | ---@deprecated Replaced by `options.styles.italic` 101 | -- disable_italics = false, 102 | ---@deprecated Replaced by `options.highlight_groups` 103 | -- bold_vert_split = false 104 | } 105 | 106 | local function migrate(options) 107 | if options.bold_vert_split then 108 | local border = options.groups.border or "muted" 109 | options.highlight_groups["VertSplit"] = { fg = border, bg = border } 110 | options.highlight_groups["WinSeparator"] = { fg = border, bg = border } 111 | end 112 | 113 | if options.disable_background then 114 | options.highlight_groups["Normal"] = { bg = "NONE" } 115 | end 116 | 117 | if options.disable_float_background then 118 | options.highlight_groups["NormalFloat"] = { bg = "NONE" } 119 | end 120 | 121 | options.dim_inactive_windows = options.dim_nc_background or options.dim_inactive_windows 122 | 123 | if options.groups.background ~= nil then 124 | options.highlight_groups["Normal"] = { bg = options.groups.background } 125 | end 126 | 127 | if options.groups.comment ~= nil then 128 | options.highlight_groups["Comment"] = { fg = options.groups.comment } 129 | end 130 | 131 | if options.groups.punctuation ~= nil then 132 | options.highlight_groups["@punctuation"] = { fg = options.groups.punctuation } 133 | end 134 | 135 | options.styles.transparency = (options.disable_background and options.disable_float_background) 136 | or options.styles.transparency 137 | 138 | -- These never actually existed, but may be set intuitively by the user 139 | -- because of `disable_italics` existing. 140 | options.styles.bold = not (options.disable_bold or options.disable_bolds) and options.styles.bold or false 141 | 142 | -- Similar to bold options, `disable_italic` never existed but could be a 143 | -- common typo of the actual `disable_italics`. 144 | options.styles.italic = not (options.disable_italic or options.disable_italics) and options.styles.italic or false 145 | 146 | -- Set h1 through h6 to the same color if only one is specified 147 | if type(options.groups.headings) == "string" then 148 | options.groups.h1 = options.groups.headings 149 | options.groups.h2 = options.groups.headings 150 | options.groups.h3 = options.groups.headings 151 | options.groups.h4 = options.groups.headings 152 | options.groups.h5 = options.groups.headings 153 | options.groups.h6 = options.groups.headings 154 | elseif options.groups.headings == "table" then 155 | options.groups.h1 = options.groups.headings.h1 or options.groups.h1 156 | options.groups.h2 = options.groups.headings.h2 or options.groups.h2 157 | options.groups.h3 = options.groups.headings.h3 or options.groups.h3 158 | options.groups.h4 = options.groups.headings.h4 or options.groups.h4 159 | options.groups.h5 = options.groups.headings.h5 or options.groups.h5 160 | options.groups.h6 = options.groups.headings.h6 or options.groups.h6 161 | end 162 | options.groups.headings = nil 163 | 164 | return options 165 | end 166 | 167 | ---@param options Options | nil 168 | function config.extend_options(options) 169 | config.options = vim.tbl_deep_extend("force", config.options, options or {}) 170 | 171 | if config.options.enable.migrations then 172 | config.options = migrate(config.options) 173 | end 174 | end 175 | 176 | return config 177 | -------------------------------------------------------------------------------- /lua/flexoki/palette.lua: -------------------------------------------------------------------------------- 1 | local options = require("flexoki.config").options 2 | 3 | local variants = { 4 | moon = { 5 | _nc = "#1f1d30", 6 | base = "#100f0f", 7 | surface = "#1f1d2e", 8 | overlay = "#1c1b1a", 9 | muted = "#575653", 10 | subtle = "#878580", 11 | text = "#cecdc3", 12 | yellow_one = "#ad8301", 13 | red_one = "#af3029", 14 | orange_one = "#bc5215", 15 | magenta_one = "#a02f6f", 16 | blue_one = "#205ea6", 17 | cyan_one = "#24837b", 18 | purple_one = "#5e409d", 19 | green_one = "#66800b", 20 | yellow_two = "#d0a215", 21 | red_two = "#d14d41", 22 | orange_two = "#da702c", 23 | magenta_two = "#ce5d97", 24 | blue_two = "#4385be", 25 | cyan_two = "#3aa99f", 26 | purple_two = "#8b7ec8", 27 | green_two = "#879a39", 28 | highlight_low = "#282726", 29 | highlight_med = "#343331", 30 | highlight_high = "#403e3c", 31 | none = "none", 32 | green_zero = "#EDEECF", 33 | }, 34 | dawn = { 35 | _nc = "#f2f0e5", 36 | base = "#fffcf0", 37 | surface = "#fffdf5", 38 | overlay = "#f2f0e5", 39 | muted = "#b7b5ac", 40 | subtle = "#6f6e69", 41 | text = "#100f0f", 42 | yellow_two = "#8E6B01", 43 | red_two = "#af3029", 44 | orange_two = "#bc5215", 45 | magenta_two = "#a02f6f", 46 | blue_two = "#205ea6", 47 | cyan_two = "#1C6C66", 48 | purple_two = "#5e409d", 49 | green_two = "#536907", 50 | yellow_one = "#d0a215", 51 | red_one = "#d14d41", 52 | orange_one = "#da702c", 53 | magenta_one = "#ce5d97", 54 | blue_one = "#4385be", 55 | cyan_one = "#3aa99f", 56 | purple_one = "#8b7ec8", 57 | green_one = "#879a39", 58 | highlight_low = "#e6e4d9", 59 | highlight_med = "#dad8ce", 60 | highlight_high = "#cecdc3", 61 | none = "none", 62 | green_zero = "#EDEECF", 63 | }, 64 | } 65 | 66 | if options.palette ~= nil and next(options.palette) then 67 | -- handle variant specific overrides 68 | for variant_name, override_palette in pairs(options.palette) do 69 | if variants[variant_name] then 70 | variants[variant_name] = vim.tbl_extend("force", variants[variant_name], override_palette or {}) 71 | end 72 | end 73 | end 74 | 75 | if variants[options.variant] ~= nil then 76 | return variants[options.variant] 77 | end 78 | 79 | return vim.o.background == "light" and variants.dawn or variants.moon 80 | -------------------------------------------------------------------------------- /lua/flexoki/plugins/bufferline.lua: -------------------------------------------------------------------------------- 1 | --- Rosé Pine for bufferline 2 | --- https://github.com/akinsho/bufferline.nvim 3 | --- 4 | --- @usage 5 | --- local highlights = require("flexoki.plugins.bufferline") 6 | --- require("bufferline").setup({ highlights = highlights }) 7 | 8 | local p = require("flexoki.palette") 9 | 10 | return { 11 | -- fill = { 12 | -- fg = "", 13 | -- bg = "", 14 | -- }, 15 | -- background = { 16 | -- fg = "", 17 | -- bg = "", 18 | -- }, 19 | -- tab = { 20 | -- fg = "", 21 | -- bg = "", 22 | -- }, 23 | tab_selected = { 24 | fg = p.text, 25 | bg = p.overlay, 26 | }, 27 | -- tab_close = { 28 | -- fg = "", 29 | -- bg = "", 30 | -- }, 31 | -- close_button = { 32 | -- fg = "", 33 | -- bg = "", 34 | -- }, 35 | -- close_button_visible = { 36 | -- fg = "", 37 | -- bg = "", 38 | -- }, 39 | -- close_button_selected = { 40 | -- fg = "", 41 | -- bg = "", 42 | -- }, 43 | buffer_visible = { 44 | fg = p.subtle, 45 | bg = p.base, 46 | }, 47 | buffer_selected = { 48 | fg = p.text, 49 | bg = p.surface, 50 | bold = true, 51 | italic = true, 52 | }, 53 | -- diagnostic = { 54 | -- fg = "", 55 | -- bg = "", 56 | -- }, 57 | -- diagnostic_visible = { 58 | -- fg = "", 59 | -- bg = "", 60 | -- }, 61 | -- diagnostic_selected = { 62 | -- fg = "", 63 | -- bg = "", 64 | -- bold = true, 65 | -- italic = true, 66 | -- }, 67 | -- info = { 68 | -- fg = "", 69 | -- sp = "", 70 | -- bg = "", 71 | -- }, 72 | -- info_visible = { 73 | -- fg = "", 74 | -- bg = "", 75 | -- }, 76 | -- info_selected = { 77 | -- fg = "", 78 | -- bg = "", 79 | -- bold = true, 80 | -- italic = true, 81 | -- sp = "", 82 | -- }, 83 | -- info_diagnostic = { 84 | -- fg = "", 85 | -- sp = "", 86 | -- bg = "", 87 | -- }, 88 | -- info_diagnostic_visible = { 89 | -- fg = "", 90 | -- bg = "", 91 | -- }, 92 | -- info_diagnostic_selected = { 93 | -- fg = "", 94 | -- bg = "", 95 | -- bold = true, 96 | -- italic = true, 97 | -- sp = "", 98 | -- }, 99 | -- warning = { 100 | -- fg = "", 101 | -- sp = "", 102 | -- bg = "", 103 | -- }, 104 | -- warning_visible = { 105 | -- fg = "", 106 | -- bg = "", 107 | -- }, 108 | -- warning_selected = { 109 | -- fg = "", 110 | -- bg = "", 111 | -- bold = true, 112 | -- italic = true, 113 | -- sp = "", 114 | -- }, 115 | -- warning_diagnostic = { 116 | -- fg = "", 117 | -- sp = "", 118 | -- bg = "", 119 | -- }, 120 | -- warning_diagnostic_visible = { 121 | -- fg = "", 122 | -- bg = "", 123 | -- }, 124 | -- warning_diagnostic_selected = { 125 | -- fg = "", 126 | -- bg = "", 127 | -- bold = true, 128 | -- italic = true, 129 | -- sp = warning_diagnostic_fg, 130 | -- }, 131 | -- error = { 132 | -- fg = "", 133 | -- bg = "", 134 | -- sp = "", 135 | -- }, 136 | -- error_visible = { 137 | -- fg = "", 138 | -- bg = "", 139 | -- }, 140 | -- error_selected = { 141 | -- fg = "", 142 | -- bg = "", 143 | -- bold = true, 144 | -- italic = true, 145 | -- sp = "", 146 | -- }, 147 | -- error_diagnostic = { 148 | -- fg = "", 149 | -- bg = "", 150 | -- sp = "", 151 | -- }, 152 | -- error_diagnostic_visible = { 153 | -- fg = "", 154 | -- bg = "", 155 | -- }, 156 | -- error_diagnostic_selected = { 157 | -- fg = "", 158 | -- bg = "", 159 | -- bold = true, 160 | -- italic = true, 161 | -- sp = "", 162 | -- }, 163 | -- modified = { 164 | -- fg = "", 165 | -- bg = "", 166 | -- }, 167 | -- modified_visible = { 168 | -- fg = "", 169 | -- bg = "", 170 | -- }, 171 | -- modified_selected = { 172 | -- fg = "", 173 | -- bg = "", 174 | -- }, 175 | -- duplicate_selected = { 176 | -- fg = "", 177 | -- italic = true, 178 | -- bg = "", 179 | -- }, 180 | -- duplicate_visible = { 181 | -- fg = "", 182 | -- italic = true, 183 | -- bg = "", 184 | -- }, 185 | -- duplicate = { 186 | -- fg = "", 187 | -- italic = true, 188 | -- bg = "", 189 | -- }, 190 | -- separator_selected = { 191 | -- fg = "", 192 | -- bg = "", 193 | -- }, 194 | -- separator_visible = { 195 | -- fg = "", 196 | -- bg = "", 197 | -- }, 198 | -- separator = { 199 | -- fg = "", 200 | -- bg = "", 201 | -- }, 202 | -- indicator_selected = { 203 | -- fg = "", 204 | -- bg = "", 205 | -- }, 206 | -- pick_selected = { 207 | -- fg = "", 208 | -- bg = "", 209 | -- italic = true, 210 | -- }, 211 | -- pick_visible = { 212 | -- fg = "", 213 | -- bg = "", 214 | -- bold = true, 215 | -- italic = true, 216 | -- }, 217 | -- pick = { 218 | -- fg = "", 219 | -- bg = "", 220 | -- bold = true, 221 | -- italic = true, 222 | -- }, 223 | } 224 | -------------------------------------------------------------------------------- /lua/flexoki/plugins/galaxyline.lua: -------------------------------------------------------------------------------- 1 | --- Rosé Pine for galaxyline fork 2 | --- https://github.com/NTBBloodbath/galaxyline.nvim 3 | --- 4 | --- @usage 5 | --- local highlights = require("flexoki.plugins.galaxyline") 6 | 7 | local p = require("flexoki.palette") 8 | 9 | return { 10 | bg = p.surface, 11 | fg = p.text, 12 | fg_alt = p.subtle, 13 | yellow = p.yellow_two, 14 | cyan = p.magenta_two, 15 | green = p.blue_two, 16 | orange = p.muted, 17 | magenta = p.purple_two, 18 | blue = p.cyan_two, 19 | red = p.red_two, 20 | } 21 | -------------------------------------------------------------------------------- /lua/flexoki/plugins/markid.lua: -------------------------------------------------------------------------------- 1 | --- Rosé Pine for markid 2 | --- https://github.com/David-Kunz/markid 3 | --- 4 | --- @usage 5 | --- local highlights = require("flexoki.plugins.markid") 6 | --- require("nvim-treesitter.configs").setup({ markid = { enable = true, colors = highlights } }) 7 | 8 | local p = require("flexoki.palette") 9 | 10 | return { p.cyan_two, p.magenta_two, p.purple_two } 11 | -------------------------------------------------------------------------------- /lua/flexoki/plugins/obsidian.lua: -------------------------------------------------------------------------------- 1 | --- Rosé Pine for Obsidian(epwalsh) 2 | --- https://github.com/epwalsh/obsidian.nvim 3 | --- 4 | --- @usage 5 | --- local highlights = require("flexoki.plugins.obsidian") 6 | --- require("obsidian").setup({ ui = {hl_groups = highlights} }) 7 | 8 | local p = require("flexoki.palette") 9 | 10 | return { 11 | ObsidianBullet = { fg = p.muted }, 12 | ObsidianRefText = { underline = true, fg = p.purple_two }, 13 | ObsidianDone = { bold = true, fg = p.cyan_two } 14 | } 15 | -------------------------------------------------------------------------------- /lua/flexoki/plugins/toggleterm.lua: -------------------------------------------------------------------------------- 1 | --- Rosé Pine for toggleterm 2 | --- https://github.com/akinsho/toggleterm.nvim 3 | --- 4 | --- @usage 5 | --- local highlights = require("flexoki.plugins.toggleterm") 6 | --- require("toggleterm").setup({ highlights = highlights }) 7 | 8 | return { 9 | Normal = { link = "Normal" }, 10 | NormalFloat = { link = "Normal" }, 11 | FloatBorder = { link = "FloatBorder" }, 12 | SignColumn = { link = "SignColumn" }, 13 | StatusLine = { link = "StatusLine" }, 14 | StatusLineNC = { link = "StatusLineNC" }, 15 | } 16 | -------------------------------------------------------------------------------- /lua/flexoki/utilities.lua: -------------------------------------------------------------------------------- 1 | local utilities = {} 2 | 3 | ---@param color string 4 | local function color_to_rgb(color) 5 | local function byte(value, offset) 6 | return bit.band(bit.rshift(value, offset), 0xFF) 7 | end 8 | 9 | local new_color = vim.api.nvim_get_color_by_name(color) 10 | if new_color == -1 then 11 | new_color = vim.opt.background:get() == "dark" and 000 or 255255255 12 | end 13 | 14 | return { byte(new_color, 16), byte(new_color, 8), byte(new_color, 0) } 15 | end 16 | 17 | ---@param color string Palette key or hex value 18 | function utilities.parse_color(color) 19 | if color == nil then 20 | return print("Invalid color: " .. color) 21 | end 22 | 23 | color = color:lower() 24 | 25 | if not color:find("#") and color ~= "NONE" then 26 | color = require("flexoki.palette")[color] or vim.api.nvim_get_color_by_name(color) 27 | end 28 | 29 | return color 30 | end 31 | 32 | ---@param fg string Foreground color 33 | ---@param bg string Background color 34 | ---@param alpha number Between 0 (background) and 1 (foreground) 35 | function utilities.blend(fg, bg, alpha) 36 | local fg_rgb = color_to_rgb(fg) 37 | local bg_rgb = color_to_rgb(bg) 38 | 39 | local function blend_channel(i) 40 | local ret = (alpha * fg_rgb[i] + ((1 - alpha) * bg_rgb[i])) 41 | return math.floor(math.min(math.max(0, ret), 255) + 0.5) 42 | end 43 | 44 | return string.format("#%02X%02X%02X", blend_channel(1), blend_channel(2), blend_channel(3)) 45 | end 46 | 47 | return utilities 48 | -------------------------------------------------------------------------------- /lua/lualine/themes/flexoki-alt.lua: -------------------------------------------------------------------------------- 1 | local p = require("flexoki.palette") 2 | 3 | return { 4 | normal = { 5 | a = { bg = p.surface, fg = p.magenta_two, gui = "bold" }, 6 | b = { bg = p.surface, fg = p.text }, 7 | c = { bg = p.surface, fg = p.subtle, gui = "italic" }, 8 | }, 9 | insert = { 10 | a = { bg = p.surface, fg = p.cyan_two, gui = "bold" }, 11 | }, 12 | visual = { 13 | a = { bg = p.surface, fg = p.purple_two, gui = "bold" }, 14 | }, 15 | replace = { 16 | a = { bg = p.surface, fg = p.blue_two, gui = "bold" }, 17 | }, 18 | command = { 19 | a = { bg = p.surface, fg = p.red_two, gui = "bold" }, 20 | }, 21 | inactive = { 22 | a = { bg = p.base, fg = p.subtle, gui = "bold" }, 23 | b = { bg = p.base, fg = p.subtle }, 24 | c = { bg = p.base, fg = p.subtle, gui = "italic" }, 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /lua/lualine/themes/flexoki.lua: -------------------------------------------------------------------------------- 1 | local p = require("flexoki.palette") 2 | 3 | return { 4 | normal = { 5 | a = { bg = p.blue_two, fg = p.base, gui = "bold" }, 6 | b = { bg = p.overlay, fg = p.blue_two }, 7 | c = { bg = p.base, fg = p.text }, 8 | }, 9 | insert = { 10 | a = { bg = p.yellow_two, fg = p.base, gui = "bold" }, 11 | b = { bg = p.overlay, fg = p.yellow_two }, 12 | c = { bg = p.base, fg = p.text }, 13 | }, 14 | visual = { 15 | a = { bg = p.purple_two, fg = p.base, gui = "bold" }, 16 | b = { bg = p.overlay, fg = p.purple_two }, 17 | c = { bg = p.base, fg = p.text }, 18 | }, 19 | replace = { 20 | a = { bg = p.red_two, fg = p.base, gui = "bold" }, 21 | b = { bg = p.overlay, fg = p.red_two }, 22 | c = { bg = p.base, fg = p.text }, 23 | }, 24 | command = { 25 | a = { bg = p.orange_two, fg = p.base, gui = "bold" }, 26 | b = { bg = p.overlay, fg = p.orange_two }, 27 | c = { bg = p.base, fg = p.text }, 28 | }, 29 | inactive = { 30 | a = { bg = p.base, fg = p.muted, gui = "bold" }, 31 | b = { bg = p.base, fg = p.muted }, 32 | c = { bg = p.base, fg = p.muted }, 33 | }, 34 | } 35 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |

2 |

Flexoki for neovim

3 |

4 | 5 | > Flexoki is an inky color scheme for prose and code. Flexoki is designed for reading and writing on digital screens. It is inspired by analog printing inks and warm shades of paper 6 | 7 | This repo contains a light and dark theme for Flexoki, based on [https://stephango.com/flexoki](https://stephango.com/flexoki). This repo was based off of [rose-pine/neovim](https://github.com/rose-pine/neovim). 8 | 9 | ## Getting started 10 | 11 | Install `flexoki-nvim` using your favourite plugin manager: 12 | 13 | **lazy.nvim** 14 | 15 | ```lua 16 | { "nuvic/flexoki-nvim", name = "flexoki" } 17 | ``` 18 | 19 | **paq-nvim** 20 | 21 | ```lua 22 | { "nuvic/flexoki-nvim", as = "flexoki" } 23 | ``` 24 | 25 | ## Gallery 26 | 27 | **Flexoki Dawn** 28 | 29 | ![flexoki-dawn](https://github.com/user-attachments/assets/8ad5bd55-6da8-4966-8c4e-360be0a8847a) 30 | 31 | **Flexoki Moon** 32 | 33 | ![flexoki-moon](https://github.com/user-attachments/assets/f29beed6-6cf8-48d3-90cb-b4a10f00e373) 34 | 35 | ## Options 36 | 37 | > [!IMPORTANT] 38 | > Configure options _before_ setting colorscheme. 39 | 40 | Flexoki has two variants: moon, and dawn. By default, `vim.o.background` is followed, using dawn when light and moon when dark. 41 | 42 | Colour values accept named colours from the palette, e.g. "cyan_two", or valid hex, e.g. "#fa8072". 43 | 44 | ```lua 45 | require("flexoki").setup({ 46 | variant = "auto", -- auto, moon, or dawn 47 | dim_inactive_windows = false, 48 | extend_background_behind_borders = true, 49 | 50 | enable = { 51 | terminal = true, 52 | }, 53 | 54 | styles = { 55 | bold = true, 56 | italic = false, 57 | }, 58 | 59 | groups = { 60 | border = "muted", 61 | link = "purple_two", 62 | panel = "surface", 63 | 64 | error = "red_one", 65 | hint = "purple_one", 66 | info = "cyan_one", 67 | ok = "green_one", 68 | warn = "orange_one", 69 | note = "blue_one", 70 | todo = "magenta_one", 71 | 72 | git_add = "green_one", 73 | git_change = "yellow_one", 74 | git_delete = "red_one", 75 | git_dirty = "yellow_one", 76 | git_ignore = "muted", 77 | git_merge = "purple_one", 78 | git_rename = "blue_one", 79 | git_stage = "purple_one", 80 | git_text = "magenta_one", 81 | git_untracked = "subtle", 82 | 83 | h1 = "purple_two", 84 | h2 = "cyan_two", 85 | h3 = "magenta_two", 86 | h4 = "orange_two", 87 | h5 = "blue_two", 88 | h6 = "cyan_two", 89 | }, 90 | 91 | palette = { 92 | -- Override the builtin palette per variant 93 | -- moon = { 94 | -- base = '#100f0f', 95 | -- overlay = '#1c1b1a', 96 | -- }, 97 | }, 98 | 99 | highlight_groups = { 100 | -- Comment = { fg = "subtle" }, 101 | -- VertSplit = { fg = "muted", bg = "muted" }, 102 | }, 103 | 104 | before_highlight = function(group, highlight, palette) 105 | -- Disable all undercurls 106 | -- if highlight.undercurl then 107 | -- highlight.undercurl = false 108 | -- end 109 | -- 110 | -- Change palette colour 111 | -- if highlight.fg == palette.blue_two then 112 | -- highlight.fg = palette.cyan_two 113 | -- end 114 | end, 115 | }) 116 | 117 | vim.cmd("colorscheme flexoki") 118 | -- vim.cmd("colorscheme flexoki-moon") 119 | -- vim.cmd("colorscheme flexoki-dawn") 120 | ``` 121 | 122 | > [!NOTE] 123 | > Visit the [wiki](https://github.com/nuvic/flexoki-nvim/wiki) for issues with plugins. 124 | 125 | ## Contributing 126 | 127 | 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). 128 | 129 | Feel free to update the [wiki](https://github.com/nuvic/flexoki-nvim/wiki/) with any recipes. 130 | --------------------------------------------------------------------------------