First version
This commit is contained in:
234
colors/lgwtdark.lua
Normal file
234
colors/lgwtdark.lua
Normal file
@@ -0,0 +1,234 @@
|
||||
-- Learn Go With Tests (dark) - palette from site CSS, dark-mode token colors.
|
||||
-- Requires: termguicolors. For Go, nvim-treesitter is strongly recommended.
|
||||
|
||||
vim.cmd.hi('clear')
|
||||
vim.g.colors_name = 'lgwtdark'
|
||||
|
||||
if vim.fn.exists('syntax_on') == 1 then
|
||||
vim.cmd.syntax('reset')
|
||||
end
|
||||
|
||||
vim.o.termguicolors = true
|
||||
vim.o.background = 'dark'
|
||||
|
||||
-- Dark-mode values from your spec (second branch of light-dark / --shiki-dark).
|
||||
local C = {
|
||||
-- primary-2: code panels on the site read slightly cooler than primary-1; warm text pops closer to the book.
|
||||
bg = '#202325',
|
||||
keyword = '#f8a8a1', -- danger-11
|
||||
string_ = '#9bd0a1', -- success-11
|
||||
entity = '#a0c6e0', -- primary-11 (packages, types, func/method names & calls)
|
||||
-- warning-11 nudged warmer (more R, less B) so it matches the orange-gold on the page next to this bg
|
||||
warm = '#e5b899',
|
||||
fg = '#feffff', -- tint-12 (variables, brackets, delimiters)
|
||||
comment = '#787878', -- neutral-9
|
||||
operator = '#bdc1c3', -- tint-11
|
||||
-- subtle UI derived from primary scale
|
||||
cursorline = '#262d32', -- primary-3
|
||||
visual = '#34495a', -- between primary-4 / 5
|
||||
linenr = '#525252', -- neutral-7
|
||||
float_bg = '#222222',
|
||||
}
|
||||
|
||||
local function hi(name, opts)
|
||||
vim.api.nvim_set_hl(0, name, opts)
|
||||
end
|
||||
|
||||
-- Editor chrome
|
||||
hi('Normal', { fg = C.fg, bg = C.bg })
|
||||
hi('NormalNC', { fg = C.fg, bg = C.bg })
|
||||
hi('NormalFloat', { fg = C.fg, bg = C.float_bg })
|
||||
hi('Cursor', { fg = C.bg, bg = C.entity })
|
||||
hi('lCursor', { link = 'Cursor' })
|
||||
hi('CursorLine', { bg = C.cursorline })
|
||||
hi('CursorColumn', { bg = C.cursorline })
|
||||
hi('LineNr', { fg = C.linenr, bg = C.bg })
|
||||
hi('CursorLineNr', { fg = C.warm, bg = C.cursorline })
|
||||
hi('SignColumn', { bg = C.bg })
|
||||
hi('Folded', { fg = C.comment, bg = '#242424' })
|
||||
hi('FoldColumn', { fg = C.comment, bg = C.bg })
|
||||
hi('Whitespace', { fg = '#333333' })
|
||||
hi('WinSeparator', { fg = '#2a2a2a', bg = C.bg })
|
||||
hi('EndOfBuffer', { fg = C.bg, bg = C.bg })
|
||||
|
||||
hi('Search', { fg = C.bg, bg = C.warm })
|
||||
hi('IncSearch', { fg = C.bg, bg = C.keyword })
|
||||
hi('Visual', { bg = C.visual })
|
||||
hi('VisualNOS', { bg = C.visual })
|
||||
|
||||
hi('StatusLine', { fg = C.fg, bg = '#333333' })
|
||||
hi('StatusLineNC', { fg = C.comment, bg = '#252525' })
|
||||
hi('TabLine', { fg = C.comment, bg = '#252525' })
|
||||
hi('TabLineFill', { bg = C.bg })
|
||||
hi('TabLineSel', { fg = C.entity, bg = '#333333' })
|
||||
|
||||
hi('Error', { fg = '#fb2c36', bold = true })
|
||||
hi('WarningMsg', { fg = '#fe9a00' })
|
||||
hi('MatchParen', { fg = C.keyword, bg = '#3a3a3a', bold = true })
|
||||
|
||||
hi('Pmenu', { fg = C.fg, bg = '#2d2d2d' })
|
||||
hi('PmenuSel', { fg = C.bg, bg = C.entity })
|
||||
hi('PmenuSbar', { bg = '#444444' })
|
||||
hi('PmenuThumb', { bg = '#666666' })
|
||||
|
||||
hi('Title', { fg = C.entity, bold = true })
|
||||
hi('Directory', { fg = C.entity })
|
||||
|
||||
-- Builtin highlight groups (legacy syntax / fallbacks)
|
||||
hi('Comment', { fg = C.comment })
|
||||
hi('String', { fg = C.string_ })
|
||||
hi('Character', { fg = C.string_ })
|
||||
hi('Number', { fg = C.warm })
|
||||
hi('Float', { fg = C.warm })
|
||||
hi('Boolean', { fg = C.warm })
|
||||
hi('Constant', { fg = C.warm })
|
||||
|
||||
hi('Identifier', { fg = C.fg })
|
||||
hi('Function', { fg = C.entity })
|
||||
hi('Statement', { fg = C.keyword })
|
||||
hi('Conditional', { fg = C.keyword })
|
||||
hi('Repeat', { fg = C.keyword })
|
||||
hi('Label', { fg = C.keyword })
|
||||
hi('Operator', { fg = C.operator })
|
||||
hi('Keyword', { fg = C.keyword })
|
||||
hi('Exception', { fg = C.keyword })
|
||||
hi('PreProc', { fg = C.keyword })
|
||||
hi('Include', { fg = C.keyword })
|
||||
hi('Define', { fg = C.keyword })
|
||||
hi('Macro', { fg = C.entity })
|
||||
hi('Type', { fg = C.entity })
|
||||
hi('StorageClass', { fg = C.keyword })
|
||||
hi('Structure', { fg = C.keyword })
|
||||
hi('Special', { fg = C.warm })
|
||||
hi('SpecialChar', { fg = C.warm })
|
||||
hi('Delimiter', { fg = C.fg })
|
||||
hi('Underlined', { fg = C.entity, underline = true })
|
||||
hi('Ignore', { fg = C.bg })
|
||||
hi('Todo', { fg = C.warm, bold = true })
|
||||
|
||||
-- Treesitter (Go and general)
|
||||
local ts = {
|
||||
['@comment'] = { fg = C.comment },
|
||||
['@comment.documentation'] = { fg = C.comment },
|
||||
|
||||
['@keyword'] = { fg = C.keyword },
|
||||
['@keyword.function'] = { fg = C.keyword },
|
||||
['@keyword.operator'] = { fg = C.keyword },
|
||||
['@keyword.return'] = { fg = C.keyword },
|
||||
['@keyword.import'] = { fg = C.keyword },
|
||||
['@keyword.exception'] = { fg = C.keyword },
|
||||
['@keyword.coroutine'] = { fg = C.keyword },
|
||||
['@keyword.directive'] = { fg = C.keyword },
|
||||
['@keyword.directive.define'] = { fg = C.keyword },
|
||||
|
||||
['@type.builtin'] = { fg = C.keyword },
|
||||
|
||||
['@string'] = { fg = C.string_ },
|
||||
['@string.documentation'] = { fg = C.string_ },
|
||||
['@string.regex'] = { fg = C.string_ },
|
||||
['@string.escape'] = { fg = C.warm },
|
||||
['@string.special'] = { fg = C.warm },
|
||||
['@string.special.url'] = { fg = C.entity, underline = true },
|
||||
['@character'] = { fg = C.string_ },
|
||||
['@character.special'] = { fg = C.warm },
|
||||
|
||||
['@number'] = { fg = C.warm },
|
||||
['@float'] = { fg = C.warm },
|
||||
['@boolean'] = { fg = C.warm },
|
||||
|
||||
['@function'] = { fg = C.entity },
|
||||
['@function.call'] = { fg = C.entity },
|
||||
['@function.builtin'] = { fg = C.entity },
|
||||
['@function.macro'] = { fg = C.entity },
|
||||
|
||||
['@method'] = { fg = C.entity },
|
||||
['@method.call'] = { fg = C.entity },
|
||||
|
||||
['@constructor'] = { fg = C.entity },
|
||||
|
||||
['@type'] = { fg = C.entity },
|
||||
['@type.definition'] = { fg = C.entity },
|
||||
|
||||
['@namespace'] = { fg = C.entity },
|
||||
['@module'] = { fg = C.entity },
|
||||
|
||||
['@variable'] = { fg = C.fg },
|
||||
['@variable.builtin'] = { fg = C.keyword },
|
||||
['@variable.parameter'] = { fg = C.warm },
|
||||
['@variable.member'] = { fg = C.fg },
|
||||
|
||||
['@parameter'] = { fg = C.warm },
|
||||
|
||||
['@constant'] = { fg = C.warm },
|
||||
['@constant.builtin'] = { fg = C.keyword },
|
||||
['@constant.macro'] = { fg = C.entity },
|
||||
|
||||
['@property'] = { fg = C.fg },
|
||||
['@field'] = { fg = C.fg },
|
||||
|
||||
['@operator'] = { fg = C.operator },
|
||||
|
||||
['@punctuation.delimiter'] = { fg = C.fg },
|
||||
['@punctuation.bracket'] = { fg = C.fg },
|
||||
['@punctuation.special'] = { fg = C.fg },
|
||||
|
||||
['@label'] = { fg = C.warm },
|
||||
['@exception'] = { fg = C.keyword },
|
||||
['@include'] = { fg = C.keyword },
|
||||
['@repeat'] = { fg = C.keyword },
|
||||
['@conditional'] = { fg = C.keyword },
|
||||
|
||||
['@tag'] = { fg = C.entity },
|
||||
['@tag.attribute'] = { fg = C.warm },
|
||||
['@tag.delimiter'] = { fg = C.fg },
|
||||
|
||||
['@markup.link'] = { fg = C.entity, underline = true },
|
||||
['@markup.link.url'] = { fg = C.entity, underline = true },
|
||||
['@markup.strong'] = { bold = true },
|
||||
['@markup.italic'] = { italic = true },
|
||||
}
|
||||
|
||||
for g, o in pairs(ts) do
|
||||
hi(g, o)
|
||||
end
|
||||
|
||||
-- Diagnostics (readable on this bg)
|
||||
hi('DiagnosticError', { fg = '#fb2c36' })
|
||||
hi('DiagnosticWarn', { fg = '#fe9a00' })
|
||||
hi('DiagnosticInfo', { fg = C.entity })
|
||||
hi('DiagnosticHint', { fg = C.comment })
|
||||
hi('DiagnosticUnderlineError', { sp = '#fb2c36', undercurl = true })
|
||||
hi('DiagnosticUnderlineWarn', { sp = '#fe9a00', undercurl = true })
|
||||
hi('DiagnosticUnderlineInfo', { sp = C.entity, undercurl = true })
|
||||
hi('DiagnosticUnderlineHint', { sp = C.comment, undercurl = true })
|
||||
|
||||
-- LSP semantic tokens → same story as Treesitter where possible
|
||||
hi('@lsp.type.namespace', { link = '@module' })
|
||||
hi('@lsp.type.type', { link = '@type' })
|
||||
hi('@lsp.type.class', { link = '@type' })
|
||||
hi('@lsp.type.enum', { link = '@type' })
|
||||
hi('@lsp.type.interface', { link = '@type' })
|
||||
hi('@lsp.type.struct', { link = '@type' })
|
||||
hi('@lsp.type.typeParameter', { link = '@type' })
|
||||
hi('@lsp.type.function', { link = '@function' })
|
||||
hi('@lsp.type.method', { link = '@method' })
|
||||
hi('@lsp.type.property', { link = '@property' })
|
||||
hi('@lsp.type.variable', { link = '@variable' })
|
||||
hi('@lsp.type.parameter', { link = '@parameter' })
|
||||
hi('@lsp.type.enumMember', { link = '@constant' })
|
||||
hi('@lsp.type.decorator', { link = '@function.macro' })
|
||||
hi('@lsp.type.macro', { link = '@function.macro' })
|
||||
hi('@lsp.type.keyword', { link = '@keyword' })
|
||||
hi('@lsp.type.operator', { link = '@operator' })
|
||||
hi('@lsp.type.string', { link = '@string' })
|
||||
hi('@lsp.type.number', { link = '@number' })
|
||||
hi('@lsp.type.regexp', { link = '@string.regex' })
|
||||
hi('@lsp.mod.readonly', { link = '@constant' })
|
||||
hi('@lsp.mod.defaultLibrary', { link = '@type.builtin' })
|
||||
|
||||
-- Extmarks from lua/lgwtdark/go_extra.lua (fmt verbs, rune delimiters)
|
||||
hi('LgwtdFmtVerb', { fg = C.warm })
|
||||
hi('LgwtdQuote', { fg = C.fg })
|
||||
hi('LgwtdStrInner', { fg = C.string_ })
|
||||
hi('LgwtdEscape', { fg = C.warm })
|
||||
hi('LgwtdNil', { link = '@number' })
|
||||
Reference in New Issue
Block a user