diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..9daa135 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Bartłomiej Jaszczak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100755 index 0000000..8f87fde --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# finale-nvim + +**finale** is a refined dark theme for Neovim, balancing vivid and pastel tones with a focus on readability and comfort. Designed for contrast, finale offers a polished aesthetic that builds on my previous themes. + +## Features + +- 10 carefully selected accent colours, along with 10 pastel variations +- Supports **treesitter** highlighting as well as **semantic tokens** +- Supports some major plugins (feel free to open an issue if you'd like your plugin supported) +- Includes themes for **lualine** and **barbecue** + +## Usage + +### Lazy + +There are no settings to this theme, so there's no need to call `setup()`. Simply enable and activate the theme: + +```lua +{ + "https://gitlab.com/bartekjaszczak/finale-nvim", + + priority = 1000, + config = function() + -- Activate the theme + vim.cmd.colorscheme("finale") + end +} +``` + +### Lualine + +```lua +require("lualine").setup({ + options = { + -- ... + theme = "finale" + -- ... + }, +}) +``` + +### Barbecue + + +```lua +require("barbecue").setup({ + -- ... + theme = "finale" + -- ... +}) +``` + +## Preview + +![showcase](showcase/showcase.png?) + +## FAQ + +### Why is it called finale? + +Because it's my 4th Neovim theme this year and I hope it'll be the last one. Forever. + +### I'd like to adjust some colours to my liking, how can I do that? + +Currently there's no settings available. If you feel like you could use colour overrides (or some other custom configuration), feel free to open an issue. diff --git a/colors/finale.lua b/colors/finale.lua new file mode 100755 index 0000000..cff50de --- /dev/null +++ b/colors/finale.lua @@ -0,0 +1 @@ +require("finale").load() diff --git a/lua/barbecue/theme/finale.lua b/lua/barbecue/theme/finale.lua new file mode 100644 index 0000000..f9de322 --- /dev/null +++ b/lua/barbecue/theme/finale.lua @@ -0,0 +1,44 @@ +local colours = require("finale.colours") +local theme = require("finale.theme") +theme = theme.get_theme(colours) + +local bbq = { + normal = { fg = theme.ui.fg }, + + ellipsis = { fg = theme.ui.fg }, + separator = { fg = theme.ui.accent_weak, bold = true }, + modified = { fg = theme.diag.warn.fg }, + + dirname = { fg = theme.ui.accent_weak }, + basename = { fg = theme.ui.accent_strong, bold = true }, + context = { fg = theme.ui.fg }, + + context_file = { fg = theme.ui.fg }, + context_module = { fg = theme.syntax.namespace }, + context_namespace = { fg = theme.syntax.namespace }, + context_package = { fg = theme.syntax.namespace }, + context_class = { fg = theme.syntax.type }, + context_method = { fg = theme.syntax.method }, + context_property = { fg = theme.syntax.field }, + context_field = { fg = theme.syntax.field }, + context_constructor = { fg = theme.syntax.method }, + context_enum = { fg = theme.syntax.type }, + context_interface = { fg = theme.syntax.type }, + context_function = { fg = theme.syntax.func }, + context_variable = { fg = theme.syntax.variable }, + context_constant = { fg = theme.syntax.constant }, + context_string = { fg = theme.syntax.string }, + context_number = { fg = theme.syntax.number }, + context_boolean = { fg = theme.syntax.boolean }, + context_array = { fg = theme.syntax.variable }, + context_object = { fg = theme.syntax.variable }, + context_key = { fg = theme.syntax.field }, + context_null = { fg = theme.syntax.keyword }, + context_enum_member = { fg = theme.syntax.constant }, + context_struct = { fg = theme.syntax.type }, + context_event = { fg = theme.syntax.type }, + context_type_parameter = { fg = theme.syntax.constant }, + context_operator = { fg = theme.syntax.operator }, +} + +return bbq diff --git a/lua/finale/colours.lua b/lua/finale/colours.lua new file mode 100755 index 0000000..597a6fa --- /dev/null +++ b/lua/finale/colours.lua @@ -0,0 +1,42 @@ +local colours = { + base = { + bg_2 = "#0d0700", + bg_1 = "#201d17", + bg_0 = "#333029", + + highlight = "#48443d", + + dark_grey = "#625e56", + light_grey = "#949088", + + fg_0 = "#c1b6a3", + fg_1 = "#dfd9c2", + fg_2 = "#e9e5dc", + }, + main = { + red = "#fb4934", + orange = "#ff8800", + yellow = "#ffd500", + lime = "#83b324", + green = "#08bd40", + teal = "#17bda9", + blue = "#219fe3", + violet = "#9a64ff", + purple = "#db4ae8", + pink = "#f752a4", + }, + pastel = { + red = "#d67569", + orange = "#ffbd7a", + yellow = "#f2de77", + lime = "#9bb36d", + green = "#6ebd87", + teal = "#5fbdb2", + blue = "#78bde3", + violet = "#c2a1ff", + purple = "#e197e8", + pink = "#f79cc9", + }, +} + +return colours diff --git a/lua/finale/highlights/editor.lua b/lua/finale/highlights/editor.lua new file mode 100755 index 0000000..5b535c8 --- /dev/null +++ b/lua/finale/highlights/editor.lua @@ -0,0 +1,142 @@ +local M = {} + +function M.get_highlights(theme) + return { + -- ColorColumn Used for the columns set with 'colorcolumn'. + ColorColumn = { bg = theme.ui.bg_weak }, + -- Conceal Placeholder characters substituted for concealed text (see 'conceallevel'). + Conceal = { fg = theme.none }, + -- CurSearch Used for highlighting a search pattern under the cursor (see 'hlsearch'). + CurSearch = { fg = theme.ui.bg_neutral, bg = theme.ui.accent_strong, bold = true }, + -- Cursor Character under the cursor. + Cursor = { fg = theme.ui.bg_neutral, bg = theme.ui.accent_strong }, + -- lCursor Character under the cursor when |language-mapping| is used (see 'guicursor'). + lCursor = { link = "Cursor" }, + -- CursorIM Like Cursor, but used when in IME mode. + CursorIM = { link = "Cursor" }, + -- CursorColumn Screen-column at the cursor, when 'cursorcolumn' is set. + CursorColumn = { link = "CursorLine" }, + -- CursorLine Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. + CursorLine = { bg = theme.ui.bg_weak }, + -- Directory Directory names (and other special names in listings). + Directory = { fg = theme.ui.accent_weak }, + -- DiffAdd Diff mode: Added line. |diff.txt| + DiffAdd = { bg = theme.git.add, fg = theme.ui.bg_weak }, + -- DiffChange Diff mode: Changed line. |diff.txt| + DiffChange = { bg = theme.git.change, fg = theme.ui.bg_weak }, + -- DiffDelete Diff mode: Deleted line. |diff.txt| + DiffDelete = { bg = theme.git.delete, fg = theme.ui.bg_weak }, + -- DiffText Diff mode: Changed text within a changed line. |diff.txt| + DiffText = { bg = theme.git.delete }, + -- EndOfBuffer Filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. + EndOfBuffer = { fg = theme.ui.grey_strong }, + -- TermCursor Cursor in a focused terminal. + -- TermCursorNC Cursor in an unfocused terminal. + -- ErrorMsg Error messages on the command line. + ErrorMsg = { fg = theme.diag.error.fg, bold = true }, + -- WinSeparator Separators between window splits. + WinSeparator = { fg = theme.ui.accent_weak, bold = true }, + VertSplit = { link = "WinSeparator" }, + -- Folded Line used for closed folds. + Folded = { fg = theme.ui.fg, bg = theme.ui.bg_strong }, + -- FoldColumn 'foldcolumn' + FoldColumn = { fg = theme.ui.fg, bg = theme.ui.bg_neutral }, + -- SignColumn Column where |signs| are displayed. + SignColumn = { fg = theme.ui.fg, bg = theme.ui.bg_neutral }, + -- IncSearch 'incsearch' highlighting; also used for the text replaced with ":s///c". + IncSearch = { link = "CurSearch" }, + -- Substitute |:substitute| replacement text highlighting. + Substitute = { fg = theme.ui.bg_neutral, bg = theme.ui.secondary_accent_strong, bold = true }, + -- LineNr Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. + LineNr = { fg = theme.ui.grey_strong, bg = theme.ui.bg_neutral }, + -- LineNrAbove Line number for when the 'relativenumber' option is set, above the cursor line. + -- LineNrBelow Line number for when the 'relativenumber' option is set, below the cursor line. + -- CursorLineNr Like LineNr when 'cursorline' is set and 'cursorlineopt' contains "number" or is "both", for the cursor line. + CursorLineNr = { fg = theme.ui.accent_strong, bg = theme.ui.bg_neutral, bold = true }, + -- CursorLineFold Like FoldColumn when 'cursorline' is set for the cursor line. + -- CursorLineSign Like SignColumn when 'cursorline' is set for the cursor line. + -- MatchParen Character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| + MatchParen = { fg = theme.syntax.special, bg = theme.ui.bg_strong, bold = true }, + -- ModeMsg 'showmode' message (e.g., "-- INSERT --"). + ModeMsg = { fg = theme.ui.fg, bold = true }, + -- MsgArea Area for messages and cmdline. + MsgArea = { fg = theme.ui.fg, bg = theme.ui.bg_weak }, + -- MsgSeparator Separator for scrolled messages |msgsep|. + MsgSeparator = { fg = theme.ui.fg, bg = theme.ui.bg_weak }, + -- MoreMsg |more-prompt| + MoreMsg = { fg = theme.diag.info.fg }, + -- NonText '@' at the end of the window, characters from 'showbreak' and other characters that do not really exist in the text (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line). See also |hl-EndOfBuffer|. + NonText = { fg = theme.ui.grey_weak }, + -- Normal Normal text. + Normal = { fg = theme.ui.fg, bg = theme.ui.bg_neutral }, + -- NormalFloat Normal text in floating windows. + NormalFloat = { fg = theme.ui.fg, bg = theme.ui.bg_neutral }, + -- FloatBorder Border of floating windows. + FloatBorder = { fg = theme.ui.accent_weak, bg = theme.ui.bg_neutral }, + -- FloatTitle Title of floating windows. + FloatTitle = { fg = theme.ui.accent_strong, bg = theme.ui.bg_neutral, bold = true }, + -- FloatFooter Footer of floating windows. + FloatFooter = { fg = theme.ui.fg, bg = theme.ui.bg_neutral }, + -- NormalNC Normal text in non-current windows. + NormalNC = { link = "Normal" }, + -- Pmenu Popup menu: Normal item. + Pmenu = { fg = theme.ui.fg, bg = theme.ui.bg_neutral }, + -- PmenuSel Popup menu: Selected item. + PmenuSel = { fg = theme.ui.bg_neutral, bg = theme.ui.accent_strong }, + -- PmenuSbar Popup menu: Scrollbar. + PmenuSbar = { bg = theme.ui.bg_weak }, + -- PmenuThumb Popup menu: Thumb of the scrollbar. + PmenuThumb = { bg = theme.ui.accent_weak }, + -- Question |hit-enter| prompt and yes/no questions. + Question = { link = "MoreMsg" }, + -- QuickFixLine Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. + QuickFixLine = { link = "CurSearch" }, + -- Search Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. + Search = { link = "CurSearch" }, + -- SpecialKey Unprintable characters: Text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| + SpecialKey = { fg = theme.ui.grey_strong }, + -- SpellBad Word that is not recognized by the spellchecker. |spell| Combined with the highlighting used otherwise. + SpellBad = { undercurl = true, sp = theme.diag.error.fg }, + -- SpellCap Word that should start with a capital. |spell| Combined with the highlighting used otherwise. + SpellCap = { undercurl = true, sp = theme.diag.hint.fg }, + -- SpellLocal Word that is recognized by the spellchecker as one that is used in another region. |spell| Combined with the highlighting used otherwise. + SpellLocal = { undercurl = true, sp = theme.diag.hint.fg }, + -- SpellRare Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. + SpellRare = { undercurl = true, sp = theme.diag.hint.fg }, + -- StatusLine Status line of current window. + StatusLine = { fg = theme.ui.accent_weak, bg = theme.ui.bg_strong }, + -- StatusLineNC Status lines of not-current windows. Note: If this is equal to "StatusLine", Vim will use "^^^" in the status line of the current window. + StatusLineNC = { fg = theme.ui.fg, bg = theme.ui.bg_strong }, + -- TabLine Tab pages line, not active tab page label. + TabLine = { bg = theme.ui.bg_weak, fg = theme.ui.grey_strong }, + -- TabLineFill Tab pages line, where there are no labels. + TabLineFill = { bg = theme.ui.bg_neutral }, + -- TabLineSel Tab pages line, active tab page label. + TabLineSel = { fg = theme.ui.accent_weak, bg = theme.ui.grey_weak, bold = true }, + -- Title Titles for output from ":set all", ":autocmd" etc. + Title = { fg = theme.ui.accent_strong, bold = true }, + -- Visual Visual mode selection. + Visual = { bg = theme.ui.accent_weak, fg = theme.ui.bg_weak }, + -- VisualNOS Visual mode selection when vim is "Not Owning the Selection". + VisualNOS = { link = "Visual" }, + -- WarningMsg Warning messages. + WarningMsg = { fg = theme.diag.warn.fg }, + -- Whitespace "nbsp", "space", "tab", "multispace", "lead" and "trail" in 'listchars'. + Whitespace = { fg = theme.ui.bg_weak }, + -- WildMenu Current match in 'wildmenu' completion. + WildMenu = { link = "Pmenu" }, + -- WinBar Window bar of current window. + Winbar = { fg = theme.ui.bg_weak, bg = "NONE" }, + -- WinBarNC Window bar of not-current windows. + WinbarNC = { fg = theme.ui.bg_weak, bg = "NONE" }, + + -- SignColumnSB = { link = "SignColumn" }, + -- NormalSB = { link = "Normal" }, + + healthError = { fg = theme.diag.error.fg }, + healthSuccess = { fg = theme.diag.ok.fg }, + healthWarning = { fg = theme.diag.warn.fg }, + } +end + +return M diff --git a/lua/finale/highlights/init.lua b/lua/finale/highlights/init.lua new file mode 100755 index 0000000..e17d1cc --- /dev/null +++ b/lua/finale/highlights/init.lua @@ -0,0 +1,16 @@ +local M = {} + +function M.get_highlights(theme) + local highlights = {} + + for _, file in ipairs({"editor", "syntax", "plugins"}) do + local group = require("finale.highlights." .. file) + for hl, opts in pairs(group.get_highlights(theme)) do + highlights[hl] = opts + end + end + + return highlights +end + +return M diff --git a/lua/finale/highlights/plugins.lua b/lua/finale/highlights/plugins.lua new file mode 100755 index 0000000..4e184ae --- /dev/null +++ b/lua/finale/highlights/plugins.lua @@ -0,0 +1,207 @@ +local M = {} + +function M.get_highlights(theme) + return { + -- Copilot + CopilotAnnotation = { fg = theme.suggestions }, + CopilotSuggestion = { fg = theme.suggestions }, + + -- GitSigns + GitSignsAdd = { fg = theme.git.add }, + GitSignsChange = { fg = theme.git.change }, + GitSignsDelete = { fg = theme.git.delete }, + + -- Indent-blankline + IndentBlanklineChar = { fg = theme.ui.bg_weak }, + IndentBlanklineSpaceChar = { fg = theme.ui.bg_weak }, + IndentBlanklineSpaceCharBlankline = { fg = theme.ui.bg_weak }, + IndentBlanklineContextChar = { fg = theme.ui.special_accent_strong }, + IndentBlanklineContextStart = { sp = theme.ui.special_accent_strong, underline = true }, + IblIndent = { fg = theme.ui.bg_weak }, + IblWhitespace = { fg = theme.ui.bg_weak }, + IblScope = { fg = theme.ui.special_accent_strong }, + + -- Lazy + LazySpecial = { fg = theme.ui.secondary_accent_strong }, + + -- Lsp-signature + LspSignatureActiveParameter = { bg = theme.diag.warn.fg, fg = theme.ui.bg_neutral, bold = true }, + + -- Mason + MasonHeader = { fg = theme.ui.accent_strong }, + MasonHeaderSecondary = { fg = theme.ui.secondary_accent_strong }, + MasonHeading = { fg = theme.ui.fg }, + + MasonHighlight = { fg = theme.ui.accent_strong }, + MasonHighlightBlock = { fg = theme.ui.accent_strong, bg = theme.ui.grey_weak }, + MasonHighlightBlockBold = { fg = theme.ui.accent_strong, bg = theme.ui.grey_weak, bold = true }, + MasonHighlightBlockBoldSecondary = { + fg = theme.ui.secondary_accent_strong, + bg = theme.ui.grey_weak, + bold = true, + }, + MasonHighlightBlockSecondary = { fg = theme.ui.secondary_accent_strong, bg = theme.ui.grey_weak }, + MasonHighlightSecondary = { fg = theme.ui.secondary_accent_strong }, + + MasonMuted = { fg = theme.ui.special_accent_weak }, + MasonMutedBlock = { fg = theme.ui.special_accent_weak, bg = theme.ui.grey_weak }, + MasonMutedBlockBold = { fg = theme.ui.special_accent_strong, bg = theme.ui.grey_weak, bold = true }, + + MasonNormal = { bg = theme.ui.bg_weak }, + MasonWarning = { link = "WarningMsg" }, + MasonError = { link = "ErrorMsg" }, + MasonLink = { link = "MasonHighlight" }, + + -- Nvim-bfq + -- BqfPreviewFloat = {}, + BqfPreviewBorder = { fg = theme.ui.accent_weak, bg = theme.ui.bg_neutral }, + -- BqfPreviewTitle = {}, + -- BqfPreviewThumb = {}, + -- BqfPreviewSbar = {}, + -- BqfPreviewCursor = {}, + -- BqfPreviewCursorLine = {}, + -- BqfPreviewRange = {}, + -- BqfPreviewBufLabel = {}, + -- BqfSign = {}, + + -- Nvim-cmp + CmpDocumentation = { link = "NormalFloat" }, + CmpDocumentationBorder = { link = "FloatBorder" }, + CmpGhostText = { link = "FloatBorder" }, + CmpCompletion = { link = "Pmenu" }, + CmpCompletionSel = { link = "PmenuSel" }, + CmpCompletionBorder = { link = "CmpDocumentationBorder" }, + CmpCompletionThumb = { link = "PmenuThumb" }, + CmpCompletionSbar = { link = "PmenuSbar" }, + CmpItemAbbr = { fg = theme.ui.fg }, + CmpItemAbbrDeprecated = { fg = theme.ui.grey_strong, strikethrough = true }, + CmpItemAbbrMatch = { fg = theme.ui.secondary_accent_strong, bold = true }, + CmpItemAbbrMatchFuzzy = { link = "CmpItemAbbrMatch" }, + CmpItemKindDefault = { fg = theme.ui.fg }, + CmpItemMenu = { fg = theme.ui.fg }, + + CmpItemKind = { fg = theme.ui.fg }, -- Default + + CmpItemKindClass = { link = "Type" }, + -- CmpItemKindColor = {}, + CmpItemKindConstant = { link = "Constant" }, + CmpItemKindConstructor = { link = "@constructor" }, + CmpItemKindEnum = { link = "Type" }, + CmpItemKindEnumMember = { link = "@lsp.type.enumMember" }, + -- CmpItemKindEvent = {}, + CmpItemKindField = { link = "@field" }, + CmpItemKindFile = { link = "Directory" }, + CmpItemKindFolder = { link = "Directory" }, + CmpItemKindFunction = { link = "Function" }, + CmpItemKindInterface = { link = "Type" }, + CmpItemKindKeyword = { link = "@keyword" }, + CmpItemKindMethod = { link = "@method" }, + CmpItemKindModule = { link = "@include" }, + CmpItemKindOperator = { link = "Operator" }, + CmpItemKindProperty = { link = "@property" }, + CmpItemKindReference = { link = "Type" }, + CmpItemKindSnippet = { fg = theme.ui.secondary_accent_weak }, + CmpItemKindStruct = { link = "Type" }, + CmpItemKindText = { fg = theme.ui.fg }, + CmpItemKindTypeParameter = { link = "Type" }, + CmpItemKindUnit = {}, + CmpItemKindValue = { link = "String" }, + CmpItemKindVariable = { link = "@variable" }, + + CmpItemKindCopilot = { fg = theme.suggestions }, + CmpItemKindCodeium = { fg = theme.suggestions }, + CmpItemKindTabNine = { fg = theme.suggestions }, + + -- Local-highlight.nvim + LocalHighlight = { bg = theme.ui.highlight }, + + -- Nvim-spectre + SpectreBody = { link = "WinSeparator" }, + SpectreBorder = { link = "FloatBorder" }, + SpectreDir = { link = "Directory" }, + SpectreFile = { link = "FloatTitle" }, + SpectreHeader = { link = "Comment" }, + SpectreReplace = { link = "DiffAdd" }, + SpectreSearch = { link = "DiffDelete" }, + + -- Nvim-surround + -- NvimSurroundHighlight = { link = "Visual" }, + + -- Symbols-outline + FocusedSymbol = { fg = theme.diag.info.fg, bg = theme.diag.info.bg }, + SymbolsOutlineConnector = { fg = theme.ui.accent_weak }, + + -- Telescope + TelescopeNormal = { fg = theme.ui.fg, bg = theme.ui.bg_neutral }, + TelescopeBorder = { link = "Normal" }, + TelescopeSelection = { link = "IncSearch" }, + TelescopeSelectionCaret = { link = "IncSearch" }, + TelescopeResultsClass = { link = "Type" }, + TelescopeResultsStruct = { link = "Type" }, + TelescopeResultsField = { link = "@field" }, + TelescopeResultsMethod = { link = "@method" }, + TelescopeResultsVariable = { link = "@variable" }, + TelescopeMatching = { fg = theme.ui.secondary_accent_strong, bold = true }, + + -- Todo-comments + Todo = { link = "TodoBgTODO" }, + TodoFgTODO = { fg = theme.diag.info.fg }, + TodoBgTODO = { fg = theme.ui.bg_neutral, bg = theme.diag.info.fg }, + TodoSignTODO = { fg = theme.diag.info.fg, bg = theme.ui.bg_neutral }, + TodoFgFIX = { fg = theme.diag.error.fg }, + TodoBgFIX = { fg = theme.ui.bg_neutral, bg = theme.diag.error.fg }, + TodoSignFIX = { fg = theme.diag.error.fg, bg = theme.ui.bg_neutral }, + TodoFgHACK = { fg = theme.diag.warn.fg }, + TodoBgHACK = { fg = theme.ui.bg_neutral, bg = theme.diag.warn.fg }, + TodoSignHACK = { fg = theme.diag.warn.fg, bg = theme.ui.bg_neutral }, + TodoFgNOTE = { fg = theme.diag.hint.fg }, + TodoBgNOTE = { fg = theme.ui.bg_neutral, bg = theme.diag.hint.fg }, + TodoSignNOTE = { fg = theme.diag.hint.fg, bg = theme.ui.bg_neutral }, + TodoFgPERF = { fg = theme.diag.warn.fg }, + TodoBgPERF = { fg = theme.ui.bg_neutral, bg = theme.diag.warn.fg }, + TodoSignPERF = { fg = theme.diag.warn.fg, bg = theme.ui.bg_neutral }, + TodoFgTEST = { fg = theme.diag.hint.fg }, + TodoBgTEST = { fg = theme.ui.bg_neutral, bg = theme.diag.hint.fg }, + TodoSignTEST = { fg = theme.diag.hint.fg, bg = theme.ui.bg_neutral }, + TodoFgWARN = { fg = theme.diag.warn.fg }, + TodoBgWARN = { fg = theme.ui.bg_neutral, bg = theme.diag.warn.fg }, + TodoSignWARN = { fg = theme.diag.warn.fg, bg = theme.ui.bg_neutral }, + + -- Treesitter-context + -- TreesitterContext = {}, + TreesitterContextLineNumber = { fg = theme.ui.accent_weak }, + -- TreesitterContextBottom = {}, + + -- Undotree + UndotreeBranch = { fg = theme.diag.ok.fg }, + UndotreeCurrent = { fg = theme.diag.error.fg, bold = true }, + UndotreeFirstNode = { fg = theme.diag.hint.fg }, + UndotreeHead = { fg = theme.diag.hint.fg, bold = true }, + UndotreeHelp = { fg = theme.ui.accent_weak }, + UndotreeHelpKey = { fg = theme.diag.warn.fg }, + UndotreeHelpTitle = { fg = theme.diag.error.fg }, + UndotreeNext = { fg = theme.diag.error.fg }, + UndotreeNode = { fg = theme.diag.ok.fg }, + UndotreeNodeCurrent = { fg = theme.diag.error.fg, bold = true }, + UndotreeSavedBig = { fg = theme.diag.warn.fg, bold = true }, + UndotreeSavedSmall = { fg = theme.diag.warn.fg }, + UndotreeSeq = { fg = theme.ui.accent_weak }, + UndotreeTimeStamp = { fg = theme.ui.grey_strong }, + + -- Render-markdown + RenderMarkdownH1 = { fg = theme.syntax.h1, bg = theme.ui.bg_neutral }, + RenderMarkdownH1Bg = { bg = theme.syntax.h1, fg = theme.ui.bg_neutral }, + RenderMarkdownH2 = { fg = theme.syntax.h2, bg = theme.ui.bg_neutral }, + RenderMarkdownH2Bg = { bg = theme.syntax.h2, fg = theme.ui.bg_neutral }, + RenderMarkdownH3 = { fg = theme.syntax.h3, bg = theme.ui.bg_neutral }, + RenderMarkdownH3Bg = { bg = theme.syntax.h3, fg = theme.ui.bg_neutral }, + RenderMarkdownH4 = { fg = theme.syntax.h4, bg = theme.ui.bg_neutral }, + RenderMarkdownH4Bg = { bg = theme.syntax.h4, fg = theme.ui.bg_neutral }, + RenderMarkdownH5 = { fg = theme.syntax.h5, bg = theme.ui.bg_neutral }, + RenderMarkdownH5Bg = { bg = theme.syntax.h5, fg = theme.ui.bg_neutral }, + RenderMarkdownH6 = { fg = theme.syntax.h6, bg = theme.ui.bg_neutral }, + RenderMarkdownH6Bg = { bg = theme.syntax.h6, fg = theme.ui.bg_neutral }, + } +end + +return M diff --git a/lua/finale/highlights/syntax.lua b/lua/finale/highlights/syntax.lua new file mode 100755 index 0000000..12586ff --- /dev/null +++ b/lua/finale/highlights/syntax.lua @@ -0,0 +1,334 @@ +local M = {} + +function M.get_highlights(theme) + return { + Comment = { fg = theme.syntax.comment, italic = true }, -- (preferred) any constant + Constant = { fg = theme.syntax.constant }, -- (preferred) any constant + String = { fg = theme.syntax.string }, -- a string constant: "this is a string" + Character = { fg = theme.syntax.char }, -- a character constant: 'c', '\n' + Number = { fg = theme.syntax.number }, -- a number constant: 234, 0xff + Boolean = { fg = theme.syntax.boolean }, -- a boolean constant: TRUE, false + Float = { fg = theme.syntax.number }, -- a floating point constant: 2.3e10 + + Identifier = { fg = theme.syntax.variable }, -- (preferred) any variable name + Function = { fg = theme.syntax.func }, -- function name (also: methods for classes) + + Statement = { fg = theme.syntax.statement }, -- (preferred) any statement + -- Conditional = { }, -- if, then, else, endif, switch, etc. + -- Repeat = { }, -- for, do, while, etc. + Label = { fg = theme.syntax.label }, -- case, default, etc. + Operator = { fg = theme.syntax.operator }, -- "sizeof", "+", "*", etc. + Keyword = { fg = theme.syntax.keyword, bold = true }, -- any other keyword + -- Exception = { }, -- try, catch, throw + PreProc = { fg = theme.syntax.keyword }, -- (preferred) generic Preprocessor + -- Include = { }, -- preprocessor #include + -- Define = {}, -- preprocessor #define + Macro = { fg = theme.syntax.preproc }, -- same as Define + -- PreCondit = { }, -- preprocessor #if, #else, #endif, etc. + + Type = { fg = theme.syntax.type }, -- (preferred) int, long, char, etc. + StorageClass = { fg = theme.syntax.keyword }, -- static, register, volatile, etc. + -- Structure = { }, -- struct, union, enum, etc. + -- Typedef = { }, -- A typedef + + Special = { fg = theme.syntax.special }, -- (preferred) any special symbol + -- SpecialChar = { }, -- special character in a constant + -- Tag = { }, -- you can use CTRL-] on this + -- Delimiter = { }, -- character that needs attention + -- SpecialComment= { }, -- special things inside a comment + Debug = { fg = theme.syntax.debug }, -- debugging statements + + Underlined = { underline = true }, -- (preferred) text that stands out, HTML links + Bold = { bold = true }, + Italic = { italic = true }, + Strikethrough = { strikethrough = true }, + + -- ("Ignore", below, may be invisible...) + -- Ignore = { }, -- (preferred) left blank, hidden |hl-Ignore| + + Error = { fg = theme.syntax.error }, -- (preferred) any erroneous construct + -- Todo = { bg = theme.syntax.todo, fg = theme.ui.bg_neutral }, -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX + + qfLineNr = { fg = theme.ui.accent_weak }, + qfFileName = { fg = theme.ui.fg }, + + htmlH1 = { fg = theme.syntax.h1, bold = true }, + htmlH2 = { fg = theme.syntax.h2, bold = true }, + htmlH3 = { fg = theme.syntax.h3, bold = true }, + htmlH4 = { fg = theme.syntax.h4, bold = true }, + htmlH5 = { fg = theme.syntax.h5, bold = true }, + htmlH6 = { fg = theme.syntax.h6, bold = true }, + + -- mkdHeading = {}, + -- mkdCode = {}, + mkdCodeDelimiter = { bg = theme.ui.bg_strong, fg = theme.ui.fg }, + mkdCodeStart = { fg = theme.ui.accent_weak, bold = true }, + mkdCodeEnd = { fg = theme.ui.accent_weak, bold = true }, + -- mkdLink = {}, + + markdownHeadingDelimiter = { fg = theme.syntax.h1, bold = true }, + markdownCode = { fg = theme.ui.accent_weak }, + markdownCodeBlock = { fg = theme.ui.accent_weak }, + markdownH1 = { fg = theme.syntax.h1, bold = true }, + markdownH1Delimiter = { link = "markdownH1" }, + markdownH2 = { fg = theme.syntax.h2, bold = true }, + markdownH2Delimiter = { link = "markdownH2" }, + markdownH3 = { fg = theme.syntax.h3, bold = true }, + markdownH3Delimiter = { link = "markdownH3" }, + markdownH4 = { fg = theme.syntax.h4, bold = true }, + markdownH4Delimiter = { link = "markdownH4" }, + markdownH5 = { fg = theme.syntax.h5, bold = true }, + markdownH5Delimiter = { link = "markdownH5" }, + markdownH6 = { fg = theme.syntax.h6, bold = true }, + markdownH6Delimiter = { link = "markdownH6" }, + markdownUrl = { fg = theme.syntax.link, underline = true }, + markdownLinkText = { fg = theme.syntax.link, underline = true }, + + -- ["helpCommand"] = {}, + + -- debugPc Current line in terminal-debug + debugPC = { bg = theme.diag.info.bg }, + -- debugBreakpoint Breakpoint in terminal-debug + debugBreakpoint = { fg = theme.ui.accent_strong, bg = theme.ui.bg_neutral }, + + LspReferenceText = { bg = theme.diag.info.bg }, + LspReferenceRead = { link = "LspReferenceText" }, + LspReferenceWrite = { bg = theme.diag.info.bg, underline = true }, + -- LspInlayHint = { link = "NonText"}, + + DiagnosticError = { fg = theme.diag.error.fg }, + DiagnosticWarn = { fg = theme.diag.warn.fg }, + DiagnosticInfo = { fg = theme.diag.info.fg }, + DiagnosticHint = { fg = theme.diag.hint.fg }, + DiagnosticOk = { fg = theme.diag.ok.fg }, + + DiagnosticUnnecessary = { undercurl = true, special = theme.diag.hint.fg }, + + DiagnosticSignError = { fg = theme.diag.error.fg }, + DiagnosticSignWarn = { fg = theme.diag.warn.fg }, + DiagnosticSignInfo = { fg = theme.diag.info.fg }, + DiagnosticSignHint = { fg = theme.diag.hint.fg }, + + DiagnosticVirtualTextError = { fg = theme.diag.error.fg, bg = theme.diag.error.bg }, + DiagnosticVirtualTextWarn = { fg = theme.diag.warn.fg, bg = theme.diag.warn.bg }, + DiagnosticVirtualTextInfo = { fg = theme.diag.info.fg, bg = theme.diag.info.bg }, + DiagnosticVirtualTextHint = { fg = theme.diag.hint.fg, bg = theme.diag.hint.bg }, + + DiagnosticUnderlineError = { + underdouble = true, + sp = theme.diag.error.fg, + }, + DiagnosticUnderlineWarn = { + underdouble = true, + sp = theme.diag.warn.fg, + }, + DiagnosticUnderlineInfo = { + underline = true, + sp = theme.diag.info.fg, + }, + DiagnosticUnderlineHint = { + underline = true, + sp = theme.diag.hint.fg, + }, + + LspCodeLens = { fg = theme.syntax.comment }, + + LspInfoBorder = { fg = theme.accent_weak, bg = theme.ui.bg_neutral }, + ALEErrorSign = { fg = theme.diag.error.fg }, + ALEWarningSign = { fg = theme.diag.warn.fg }, + + DapStoppedLine = { bg = theme.diag.warn.fg }, + + -- vcs + diffAdded = { fg = theme.git.add }, + diffRemoved = { fg = theme.git.delete }, + diffDeleted = { fg = theme.git.delete }, + diffChanged = { fg = theme.git.change }, + diffOldFile = { fg = theme.git.delete }, + diffNewFile = { fg = theme.git.add }, + + dosIniLabel = { link = "@property" }, + + -- Treesitter groups + ["@variable"] = { fg = theme.syntax.variable }, -- Any variable name that does not have another highlight. + ["@variable.builtin"] = { fg = theme.syntax.builtin, bold = true }, -- Variable names that are defined by the languages, like `this` or `self`. + ["@variable.parameter"] = { fg = theme.syntax.param }, + -- ["@variable.parameter.builtin"] = {}, + ["@variable.member"] = { fg = theme.syntax.field }, + + ["@constant"] = { fg = theme.syntax.constant }, + ["@constant.builtin"] = { link = "@constant", bold = true }, + -- ["@constant.macro"] = {}, + + ["@module"] = { fg = theme.syntax.module }, + ["@module.builtin"] = { fg = theme.syntax.module, bold = true }, + ["@label"] = { link = "Label" }, -- For labels: `label:` in C and `:label:` in Lua. + + -- ["@string"] = {}, + ["@string.documentation"] = { fg = theme.ui.accent_weak }, + ["@string.regexp"] = { fg = theme.syntax.stringspecial }, -- For regexes. + ["@string.escape"] = { fg = theme.syntax.stringspecial }, -- For escape characters within a string. + ["@string.special"] = { fg = theme.syntax.stringspecial }, + -- ["@string.special.symbol"] = {}, + ["@string.special.url"] = { link = "@markup.link" }, + ["@string.special.path"] = { link = "@markup.link" }, + + -- ["@character"] = {}, + -- ["@character.special"] = {}, + + ["@boolean"] = { fg = theme.syntax.boolean }, + -- ["@number"] = {}, + -- ["@number.float"] = {}, + + ["@type"] = { link = "Type" }, + ["@type.builtin"] = { fg = theme.syntax.type_builtin, bold = true }, + -- ["@type.definition"] = {}, + + ["@attribute"] = { fg = theme.syntax.attribute }, + ["@attribute.builtin"] = { fg = theme.syntax.attribute, bold = true }, + ["@property"] = { link = "@variable.member" }, + + -- ["@function"] = {}, + ["@function.builtin"] = { fg = theme.syntax.func, bold = true }, + -- ["@function.call"] = {}, + ["@function.macro"] = { link = "Macro" }, + + ["@function.method"] = { fg = theme.syntax.method }, + -- ["@function.method.call"] = {}, + + ["@constructor"] = { fg = theme.syntax.method }, -- For constructor calls and definitions: `= { }` in Lua, and Java constructors. + ["@operator"] = { fg = theme.syntax.operator }, -- For any operator: `+`, but also `->` and `*` in C. + + ["@keyword"] = { fg = theme.syntax.keyword, bold = true }, -- For keywords that don't fall in previous categories. + -- ["@keyword.coroutine"] = {}, + -- ["@keyword.function"] = {}, + -- ["@keyword.operator"] = {}, + -- ["@keyword.import"] = {}, + -- ["@keyword.type"] = {}, + -- ["@keyword.modifier"] = {}, + ["@keyword.repeat"] = { fg = theme.syntax.keyword_flow, bold = true }, + ["@keyword.return"] = { fg = theme.syntax.keyword_flow, bold = true }, + -- ["@keyword.debug"] = {}, + -- ["@keyword.exception"] = {}, + + ["@keyword.conditional"] = { fg = theme.syntax.keyword_flow, bold = true }, + -- ["@keyword.conditional.ternary"] = {}, + + -- ["@keyword.directive"] = {}, + -- ["@keyword.directive.define"] = {}, + + ["@punctuation.delimiter"] = { fg = theme.syntax.delimiter }, -- For delimiters ie: `.` + ["@punctuation.bracket"] = { fg = theme.syntax.bracket }, -- For brackets and parens. + ["@punctuation.special"] = { fg = theme.syntax.special }, -- For special punctutation that does not fall in the catagories before. + + -- ["@comment"] = { link = "Comment" }, + ["@comment.documentation"] = { fg = theme.syntax.comment_special }, + + ["@comment.error"] = { fg = theme.diag.error.fg }, + ["@comment.warning"] = { fg = theme.diag.warn.fg }, + ["@comment.todo"] = { fg = theme.diag.ok.fg }, + ["@comment.note"] = { fg = theme.diag.hint.fg }, + + ["@markup.strong"] = { bold = true }, + ["@markup.italic"] = { italic = true }, + ["@markup.strikethrough"] = { strikethrough = true }, + ["@markup.underline"] = { underline = true }, + + ["@markup.heading"] = { link = "Title" }, + ["@markup.heading.1"] = { fg = theme.syntax.h1, bold = true }, + ["@markup.heading.2"] = { fg = theme.syntax.h2, bold = true }, + ["@markup.heading.3"] = { fg = theme.syntax.h3, bold = true }, + ["@markup.heading.4"] = { fg = theme.syntax.h4, bold = true }, + ["@markup.heading.5"] = { fg = theme.syntax.h5, bold = true }, + ["@markup.heading.6"] = { fg = theme.syntax.h6, bold = true }, + + ["@text.quote"] = { fg = theme.syntax.string }, + ["@text.math"] = { fg = theme.syntax.number }, + + ["@markup.link"] = { fg = theme.syntax.link, underline = true }, + ["@markup.link.label"] = { link = "SpecialChar" }, + ["@markup.link.url"] = { link = "@markup.link" }, + + ["@markup.raw"] = { fg = theme.ui.accent_weak }, + ["@markup.raw.block"] = { link = "@markup.raw" }, + + ["@markup.list"] = { fg = theme.syntax.builtin }, + ["@markup.list.checked"] = { fg = theme.syntax.constant }, + ["@markup.list.unchecked"] = { fg = theme.syntax.type }, + + ["@diff.plus"] = { link = "DiffAdd" }, + ["@diff.minus"] = { link = "DiffDelete" }, + ["@diff.delta"] = { link = "DiffChange" }, + + ["@tag"] = { fg = theme.syntax.tag }, + ["@tag.builtin"] = { fg = theme.syntax.tag, bold = true }, + ["@tag.attribute"] = { fg = theme.syntax.attribute }, + ["@tag.delimiter"] = { fg = theme.syntax.delimiter }, + + -- LSP Semantic Token Groups + -- Reference: https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide + ["@lsp.type.boolean"] = { link = "@boolean" }, + ["@lsp.type.builtinType"] = { link = "@type.builtin" }, + ["@lsp.type.class"] = { link = "@type" }, + ["@lsp.type.comment"] = { link = "@comment" }, + ["@lsp.type.decorator"] = { link = "@attribute" }, + ["@lsp.type.deriveHelper"] = { link = "@attribute" }, + ["@lsp.type.enum"] = { link = "@type" }, + ["@lsp.type.enumMember"] = { fg = theme.syntax.enummember }, + ["@lsp.type.event"] = { link = "@function" }, + ["@lsp.type.escapeSequence"] = { link = "@string.escape" }, + ["@lsp.type.formatSpecifier"] = { link = "@punctuation.special" }, + ["@lsp.type.function"] = { link = "@function" }, + ["@lsp.type.generic"] = { link = "@variable" }, + ["@lsp.type.interface"] = { link = "@type" }, + ["@lsp.type.keyword"] = { link = "@keyword" }, + ["@lsp.type.label"] = { link = "@label" }, + ["@lsp.type.lifetime"] = { link = "StorageClass" }, + ["@lsp.type.macro"] = { link = "Macro" }, + ["@lsp.type.method"] = { link = "@function.method" }, + ["@lsp.type.namespace"] = { fg = theme.syntax.namespace }, + ["@lsp.type.number"] = { link = "@number" }, + ["@lsp.type.operator"] = { link = "@operator" }, + ["@lsp.type.parameter"] = { link = "@variable.parameter" }, + ["@lsp.type.property"] = { link = "@property" }, + ["@lsp.type.regexp"] = { link = "@string.regexp" }, + ["@lsp.type.selfKeyword"] = { link = "@variable.builtin" }, + ["@lsp.type.selfTypeKeyword"] = { link = "@type" }, + ["@lsp.type.string"] = { link = "@string" }, + ["@lsp.type.struct"] = { link = "@type" }, + ["@lsp.type.type"] = { link = "@type" }, + ["@lsp.type.typeAlias"] = { link = "@type.definition" }, + ["@lsp.type.typeParameter"] = { link = "@type" }, + ["@lsp.type.unresolvedReference"] = { undercurl = true, sp = theme.diag.error.fg }, + ["@lsp.type.variable"] = { link = "@variable" }, -- use treesitter styles for regular variables + ["@lsp.typemod.class.constructorOrDestructor"] = { link = "@constructor" }, + ["@lsp.typemod.comment.documentation"] = { link = "@comment.documentation" }, + ["@lsp.typemod.keyword.async"] = { link = "@keyword.coroutine" }, + ["@lsp.typemod.keyword.injected"] = { link = "@keyword" }, + ["@lsp.typemod.keyword.controlFlow"] = { link = "@keyword.conditional" }, + ["@lsp.typemod.operator.injected"] = { link = "@operator" }, + ["@lsp.typemod.string.injected"] = { link = "@string" }, + ["@lsp.typemod.variable.callable"] = { link = "@function" }, + ["@lsp.typemod.variable.injected"] = { link = "@variable" }, + ["@lsp.typemod.variable.static"] = { fg = theme.syntax.static }, + ["@lsp.typemod.variable.globalScope"] = { fg = theme.syntax.global }, --(global variables) + -- ["@lsp.typemod.variable.readOnly"] = { fg = theme.syntax.constant }, + ["@lsp.mod.mutable"] = { link = "Underlined" }, + -- ["@lsp.mod.declaration"] = { }, + -- ["@lsp.mod.definition"] = { }, + -- ["@lsp.mod.readonly"] = { }, + -- ["@lsp.mod.static"] = { }, + ["@lsp.mod.deprecated"] = { strikethrough = true }, + ["@lsp.mod.abstract"] = { italic = true }, + ["@lsp.mod.virtual"] = { link = "@lsp.mod.abstract" }, + -- ["@lsp.mod.async"] = { }, + -- ["@lsp.mod.modification"] = { }, + -- ["@lsp.mod.documentation"] = { }, + -- ["@lsp.mod.defaultLibrary"] = { }, + + -- Other (TODO?) + -- ["@embedded"] = {}, + } +end + +return M diff --git a/lua/finale/init.lua b/lua/finale/init.lua new file mode 100755 index 0000000..7d3d0e5 --- /dev/null +++ b/lua/finale/init.lua @@ -0,0 +1,31 @@ +local M = {} + +local function set_highlights(theme) + local highlights = require("finale.highlights").get_highlights(theme) + for hl, opts in pairs(highlights) do + vim.api.nvim_set_hl(0, hl, opts) + end +end + +function M.load() + -- Reset colour scheme + if vim.g.colors_name then + vim.cmd("hi clear") + end + if vim.fn.exists("syntax_on") then + vim.cmd("syntax reset") + end + + -- Settings + vim.o.termguicolors = true + vim.g.colors_name = "finale" + + -- Enable highlights + local colours = require("finale.colours") + local theme = require("finale.theme") + theme = theme.get_theme(colours) + + set_highlights(theme) +end + +return M diff --git a/lua/finale/theme.lua b/lua/finale/theme.lua new file mode 100755 index 0000000..69ae332 --- /dev/null +++ b/lua/finale/theme.lua @@ -0,0 +1,125 @@ +local M = {} + +function M.get_theme(colours) + return { + none = "NONE", + + -- UI elements + ui = { + bg_weak = colours.base.bg_0, + bg_neutral = colours.base.bg_1, + bg_strong = colours.base.bg_2, + + fg = colours.base.fg_2, + + grey_weak = colours.base.dark_grey, + grey_strong = colours.base.light_grey, + + highlight = colours.base.highlight, + + -- Main accent + accent_weak = colours.pastel.yellow, + accent_strong = colours.main.yellow, + + -- Complementary accent + secondary_accent_weak = colours.pastel.blue, + secondary_accent_strong = colours.main.blue, + + -- Special colour + special_accent_weak = colours.pastel.pink, + special_accent_strong = colours.main.pink, + + }, + + diag = { + error = { + fg = colours.pastel.red, + bg = colours.base.bg_0, + }, + warn = { + fg = colours.pastel.orange, + bg = colours.base.bg_0, + }, + info = { + fg = colours.pastel.lime, + bg = colours.base.bg_0, + }, + hint = { + fg = colours.pastel.blue, + bg = colours.base.bg_0, + }, + ok = { + fg = colours.pastel.green, + }, + }, + + git = { + add = colours.pastel.lime, + change = colours.pastel.orange, + delete = colours.pastel.red, + }, + + suggestions = colours.base.dark_grey, + + syntax = { + text = colours.base.fg_2, + comment = colours.base.dark_grey, + comment_special = colours.base.light_grey, + + string = colours.pastel.yellow, + char = colours.main.lime, + stringspecial = colours.main.pink, + + constant = colours.pastel.green, + enummember = colours.pastel.lime, + + number = colours.pastel.pink, + boolean = colours.pastel.pink, + + variable = colours.base.fg_1, + param = colours.pastel.orange, + field = colours.pastel.blue, + global = colours.pastel.red, + static = colours.pastel.violet, + + func = colours.main.blue, + method = colours.main.orange, + + statement = colours.main.red, + keyword = colours.main.red, + keyword_flow = colours.main.purple, + operator = colours.main.red, + + preproc = colours.main.green, + + type = colours.main.yellow, + type_builtin = colours.main.yellow, + + special = colours.main.pink, + + debug = colours.base.fg_2, + error = colours.base.fg_2, + todo = colours.base.fg_2, + + bracket = colours.base.fg_2, + delimiter = colours.base.fg_2, + + label = colours.main.teal, + namespace = colours.base.fg_0, + module = colours.base.fg_0, + builtin = colours.pastel.purple, + tag = colours.main.red, + attribute = colours.main.lime, + + h1 = colours.main.yellow, + h2 = colours.main.purple, + h3 = colours.main.orange, + h4 = colours.main.green, + h5 = colours.main.red, + h6 = colours.main.blue, + link = colours.pastel.blue, + }, + } +end + +return M diff --git a/lua/lualine/themes/finale.lua b/lua/lualine/themes/finale.lua new file mode 100644 index 0000000..7ca0ff7 --- /dev/null +++ b/lua/lualine/themes/finale.lua @@ -0,0 +1,44 @@ +local colours = require("finale.colours") +local theme = require("finale.theme") +theme = theme.get_theme(colours) + +local finale = {} + +finale.normal = { + a = { bg = theme.syntax.h1, fg = theme.ui.bg_neutral, gui = "bold" }, + b = { bg = theme.ui.bg_weak, fg = theme.syntax.h1 }, + c = { bg = theme.ui.bg_strong, fg = theme.ui.fg, gui = "bold" }, +} + +finale.insert = { + a = { bg = theme.syntax.h2, fg = theme.ui.bg_neutral, gui = "bold" }, + b = { bg = theme.ui.bg_weak, fg = theme.syntax.h2 }, +} + +finale.command = { + a = { bg = theme.syntax.h4, fg = theme.ui.bg_neutral, gui = "bold" }, + b = { bg = theme.ui.bg_weak, fg = theme.syntax.h4 }, +} + +finale.visual = { + a = { bg = theme.syntax.h6, fg = theme.ui.bg_neutral, gui = "bold" }, + b = { bg = theme.ui.bg_weak, fg = theme.syntax.h6 }, +} + +finale.replace = { + a = { bg = theme.syntax.h5, fg = theme.ui.bg_neutral, gui = "bold" }, + b = { bg = theme.ui.bg_weak, fg = theme.syntax.h5 }, +} + +finale.terminal = { + a = { bg = theme.syntax.h3, fg = theme.ui.bg_neutral, gui = "bold" }, + b = { bg = theme.ui.bg_weak, fg = theme.syntax.h3 }, +} + +finale.inactive = { + a = { bg = theme.ui.grey_weak, fg = theme.ui.bg_neutral, gui = "bold" }, + b = { bg = theme.ui.bg_weak, fg = theme.ui.grey_weak }, + c = { bg = theme.ui.bg_strong, fg = theme.ui.grey_strong }, +} + +return finale diff --git a/showcase/showcase.png b/showcase/showcase.png new file mode 100644 index 0000000..21fc240 Binary files /dev/null and b/showcase/showcase.png differ diff --git a/stylua.toml b/stylua.toml new file mode 100755 index 0000000..3f79723 --- /dev/null +++ b/stylua.toml @@ -0,0 +1,7 @@ +column_width = 120 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 4 +quote_style = "AutoPreferDouble" +call_parentheses = "Always" +collapse_simple_statement = "Never"