- Set up project structure and Source of Truth (GEMINI.md). - Implement DNA source files (src/*.yaml) with semantic color definitions. - Build clinical light (Aeon) and high-contrast dark (Neon) specifications. - Create Jinja2-based build system (build.py) using uv for reproducibility. - Implement Neovim theme template mirroring the philosophy.
165 lines
6.5 KiB
Django/Jinja
165 lines
6.5 KiB
Django/Jinja
-- {{ scheme }}: Standalone Theme Engine
|
|
-- Philosophy: State over Decoration. Red is Presence. Cyan is Data.
|
|
|
|
local M = {}
|
|
|
|
M.palette = {
|
|
-- The Void
|
|
void = "{{ palette.background }}", -- Background
|
|
panel = "{{ ui.panel }}", -- Dark Surface (Statusline/Gutter)
|
|
border = "{{ ui.border }}", -- Muted Border
|
|
stealth = "{{ ui.stealth }}", -- Comments / Ignored
|
|
|
|
-- The Signal
|
|
text = "{{ palette.foreground }}", -- Stark White
|
|
dim = "{{ ui.dim }}", -- Muted Text
|
|
|
|
-- The Hunter (Presence)
|
|
razor = "{{ palette.cursor }}", -- PRIMARY: Cursor, Current Match, Active Border
|
|
alert = "{{ ansi.bright.red }}", -- ERROR: Readable text on Red
|
|
|
|
-- The HUD (Data)
|
|
tech = "{{ palette.info }}", -- INFO: Selection, Search Match, Constants
|
|
toxic = "{{ palette.success }}", -- SUCCESS: Strings
|
|
amber = "{{ palette.warning }}", -- WARNING: Types, Search
|
|
azure = "{{ palette.azure }}", -- STRUCT: Functions (Deep Blue)
|
|
sacred = "{{ palette.special }}", -- SPECIAL: Keywords, Root
|
|
}
|
|
|
|
function M.load()
|
|
vim.cmd "hi clear"
|
|
if vim.fn.exists "syntax_on" then vim.cmd "syntax reset" end
|
|
vim.o.background = "{{ type }}"
|
|
vim.g.colors_name = "{{ scheme | lower | replace(' ', '-') }}"
|
|
|
|
local p = M.palette
|
|
local groups = {
|
|
-- CANVAS & UI -----------------------------------------------------------
|
|
Normal = { fg = p.text, bg = p.void },
|
|
NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows
|
|
SignColumn = { bg = p.void },
|
|
FoldColumn = { fg = p.stealth, bg = p.void },
|
|
VertSplit = { fg = p.razor }, -- Deprecated in nvim 0.10, but good fallback
|
|
WinSeparator = { fg = p.razor }, -- The Cage (Red Borders)
|
|
EndOfBuffer = { fg = p.void }, -- Hide tildes
|
|
|
|
-- CURSOR & NAVIGATION ("The Hunter") ------------------------------------
|
|
Cursor = { fg = p.void, bg = p.razor }, -- Red Beam
|
|
TermCursor = { fg = p.void, bg = p.razor },
|
|
CursorLine = { bg = p.panel },
|
|
CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here)
|
|
LineNr = { fg = p.stealth }, -- Other lines fade out
|
|
|
|
-- SELECTION & SEARCH ("Terminator Vision") ------------------------------
|
|
Visual = { fg = p.void, bg = p.tech, bold = true }, -- Cyan (Data Lock)
|
|
VisualNOS = { fg = p.void, bg = p.border },
|
|
|
|
Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets)
|
|
IncSearch = { fg = p.void, bg = p.razor }, -- Red (Acquiring...)
|
|
CurSearch = { fg = p.void, bg = p.razor, bold = true }, -- Red (Target Locked)
|
|
|
|
-- STATUS & MESSAGES -----------------------------------------------------
|
|
StatusLine = { fg = p.text, bg = p.panel },
|
|
StatusLineNC = { fg = p.dim, bg = p.void },
|
|
WildMenu = { fg = p.void, bg = p.tech },
|
|
Pmenu = { fg = p.text, bg = p.panel },
|
|
PmenuSel = { fg = p.void, bg = p.razor, bold = true }, -- Red Menu Selection
|
|
PmenuSbar = { bg = p.panel },
|
|
PmenuThumb = { bg = p.stealth },
|
|
|
|
-- SYNTAX HIGHLIGHTING ---------------------------------------------------
|
|
Comment = { fg = p.stealth, italic = true },
|
|
Constant = { fg = p.tech }, -- Cyan (Digital values)
|
|
String = { fg = p.toxic }, -- Green (Organic strings)
|
|
Character = { fg = p.toxic },
|
|
Number = { fg = p.tech },
|
|
Boolean = { fg = p.tech },
|
|
Float = { fg = p.tech },
|
|
|
|
Identifier = { fg = p.text }, -- Variables (White)
|
|
Function = { fg = p.azure }, -- Deep Blue (Structure)
|
|
|
|
Statement = { fg = p.sacred }, -- Purple (Keywords)
|
|
Conditional = { fg = p.sacred },
|
|
Repeat = { fg = p.sacred },
|
|
Label = { fg = p.sacred },
|
|
Operator = { fg = p.tech }, -- Cyan (Tech)
|
|
Keyword = { fg = p.sacred },
|
|
Exception = { fg = p.razor }, -- Red (Errors)
|
|
|
|
PreProc = { fg = p.sacred },
|
|
Include = { fg = p.sacred },
|
|
Define = { fg = p.sacred },
|
|
Macro = { fg = p.sacred },
|
|
PreCondit = { fg = p.sacred },
|
|
|
|
Type = { fg = p.amber }, -- Yellow (Types/Classes)
|
|
StorageClass = { fg = p.amber },
|
|
Structure = { fg = p.amber },
|
|
Typedef = { fg = p.amber },
|
|
|
|
Special = { fg = p.tech },
|
|
SpecialChar = { fg = p.tech },
|
|
Tag = { fg = p.tech },
|
|
Delimiter = { fg = p.dim }, -- Subtle delimiters
|
|
Debug = { fg = p.razor },
|
|
|
|
Underlined = { underline = true },
|
|
Ignore = { fg = p.stealth },
|
|
Error = { fg = p.razor },
|
|
Todo = { fg = p.void, bg = p.amber, bold = true },
|
|
|
|
-- DIAGNOSTICS -----------------------------------------------------------
|
|
DiagnosticError = { fg = p.razor },
|
|
DiagnosticWarn = { fg = p.amber },
|
|
DiagnosticInfo = { fg = p.tech },
|
|
DiagnosticHint = { fg = p.dim },
|
|
|
|
DiagnosticUnderlineError = { sp = p.razor, underline = true },
|
|
DiagnosticUnderlineWarn = { sp = p.amber, underline = true },
|
|
|
|
-- PLUGINS: TELESCOPE ("The HUD") ----------------------------------------
|
|
TelescopeNormal = { bg = p.void },
|
|
TelescopeBorder = { fg = p.razor, bg = p.void }, -- Red Border
|
|
TelescopePromptNormal = { fg = p.text, bg = p.void },
|
|
TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border
|
|
TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label
|
|
TelescopePreviewTitle = { fg = p.void, bg = p.razor }, -- Red Label
|
|
TelescopeResultsTitle = { fg = p.void, bg = p.panel },
|
|
TelescopeSelection = { fg = p.void, bg = p.razor }, -- Red Selection
|
|
|
|
-- PLUGINS: NEO-TREE ("Stealth") -----------------------------------------
|
|
NeoTreeNormal = { bg = p.void },
|
|
NeoTreeNormalNC = { bg = p.void },
|
|
NeoTreeVertSplit = { fg = p.panel, bg = p.void },
|
|
NeoTreeWinSeparator = { fg = p.panel, bg = p.void }, -- Fade out tree border
|
|
NeoTreeRootName = { fg = p.razor, bold = true }, -- Root is Red
|
|
NeoTreeGitAdded = { fg = p.toxic },
|
|
NeoTreeGitConflict = { fg = p.amber },
|
|
NeoTreeGitDeleted = { fg = p.razor },
|
|
NeoTreeGitModified = { fg = p.tech },
|
|
|
|
-- PLUGINS: GITSIGNS -----------------------------------------------------
|
|
GitSignsAdd = { fg = p.toxic, bg = p.void },
|
|
GitSignsChange = { fg = p.tech, bg = p.void },
|
|
GitSignsDelete = { fg = p.razor, bg = p.void },
|
|
|
|
-- PLUGINS: CMP (Completion) ---------------------------------------------
|
|
CmpItemAbbrDeprecated = { fg = p.dim, strikethrough = true },
|
|
CmpItemAbbrMatch = { fg = p.tech, bold = true },
|
|
CmpItemAbbrMatchFuzzy = { fg = p.tech, bold = true },
|
|
CmpItemKindFunction = { fg = p.azure },
|
|
CmpItemKindMethod = { fg = p.azure },
|
|
CmpItemKindKeyword = { fg = p.sacred },
|
|
CmpItemKindVariable = { fg = p.text },
|
|
}
|
|
|
|
for group, highlight in pairs(groups) do
|
|
vim.api.nvim_set_hl(0, group, highlight)
|
|
end
|
|
end
|
|
|
|
M.load()
|
|
|
|
return M
|