local variant = vim.o.background -- "dark" or "light" local colors = {} if variant == "dark" then colors = { bg = "#0b1220", -- Deep midnight blue fg = "#d7dbe7", -- Starlight white comment = "#5b6a8a", -- Muted blue-gray red = "#d77b6e", -- Rusty crimson (village roofs) green = "#7ea97e", -- Cypress green yellow = "#f5d97a", -- Star glow blue = "#345d9d", -- Ultramarine swirl magenta = "#9d7cae", -- Violet undertones cyan = "#5fb8c5", -- Turquoise accent cursorline = "#162033", -- Soft navy for line highlight highlight = "#244060", -- Glow for visual mode } else colors = { bg = "#f7f4ed", -- Soft parchment dawn fg = "#2f3d59", -- Ink blue comment = "#7c869f", -- Cloud gray red = "#c05a50", -- Terracotta red green = "#608b6f", -- Cypress softened yellow = "#e6c45d", -- Morning gold blue = "#476c9b", -- Sky blue magenta = "#8c6f98", -- Lilac violet cyan = "#6aa5b4", -- Light teal cursorline = "#e1ddd3", -- Pale beige highlight = "#c9b99a", -- Golden-beige for visual select } end vim.cmd("hi clear") vim.o.termguicolors = true vim.g.colors_name = "demoiselles" local set = vim.api.nvim_set_hl local function hi(group, opts) set(0, group, opts) end -- Core UI hi("Normal", { fg = colors.fg, bg = colors.bg }) hi("CursorLine", { bg = colors.cursorline }) hi("Visual", { bg = colors.highlight }) hi("LineNr", { fg = colors.comment }) hi("CursorLineNr",{ fg = colors.yellow, bold = true }) hi("VertSplit", { fg = colors.comment }) hi("StatusLine", { fg = colors.fg, bg = colors.cursorline }) hi("StatusLineNC",{ fg = colors.comment, bg = colors.cursorline }) hi("Pmenu", { fg = colors.fg, bg = colors.cursorline }) hi("PmenuSel", { fg = colors.bg, bg = colors.yellow }) hi("Search", { fg = colors.bg, bg = colors.yellow }) hi("IncSearch", { fg = colors.bg, bg = colors.red }) -- Syntax hi("Comment", { fg = colors.comment, italic = true }) hi("Constant", { fg = colors.red }) hi("String", { fg = colors.yellow }) hi("Character", { fg = colors.yellow }) hi("Number", { fg = colors.cyan }) hi("Boolean", { fg = colors.cyan }) hi("Float", { fg = colors.cyan }) hi("Identifier", { fg = colors.blue }) hi("Function", { fg = colors.green }) hi("Statement", { fg = colors.blue }) hi("Conditional", { fg = colors.magenta }) hi("Repeat", { fg = colors.magenta }) hi("Label", { fg = colors.yellow }) hi("Operator", { fg = colors.fg }) hi("Keyword", { fg = colors.blue, bold = true }) hi("Exception", { fg = colors.red }) hi("PreProc", { fg = colors.magenta }) hi("Include", { fg = colors.blue }) hi("Define", { fg = colors.magenta }) hi("Macro", { fg = colors.magenta }) hi("PreCondit", { fg = colors.magenta }) hi("Type", { fg = colors.green }) hi("StorageClass",{ fg = colors.green }) hi("Structure", { fg = colors.green }) hi("Typedef", { fg = colors.green }) hi("Special", { fg = colors.cyan }) hi("SpecialChar", { fg = colors.yellow }) hi("Tag", { fg = colors.blue }) hi("Delimiter", { fg = colors.fg }) hi("SpecialComment",{ fg = colors.comment, italic = true }) hi("Debug", { fg = colors.red }) hi("Underlined", { fg = colors.blue, underline = true }) hi("Bold", { bold = true }) hi("Italic", { italic = true }) hi("Error", { fg = colors.red, bold = true }) hi("Todo", { fg = colors.magenta, bold = true }) hi("WarningMsg", { fg = colors.yellow }) hi("ErrorMsg", { fg = colors.red, bold = true }) -- Diagnostics (LSP) hi("DiagnosticError", { fg = colors.red }) hi("DiagnosticWarn", { fg = colors.yellow }) hi("DiagnosticInfo", { fg = colors.blue }) hi("DiagnosticHint", { fg = colors.cyan }) hi("DiagnosticUnderlineError", { undercurl = true, sp = colors.red }) hi("DiagnosticUnderlineWarn", { undercurl = true, sp = colors.yellow }) hi("DiagnosticUnderlineInfo", { undercurl = true, sp = colors.blue }) hi("DiagnosticUnderlineHint", { undercurl = true, sp = colors.cyan }) -- LSP Semantic Tokens hi("@lsp.type.class", { fg = colors.yellow }) hi("@lsp.type.function", { fg = colors.blue }) hi("@lsp.type.variable", { fg = colors.fg }) hi("@lsp.type.parameter", { fg = colors.cyan }) hi("@lsp.type.property", { fg = colors.green }) hi("@lsp.type.enum", { fg = colors.magenta }) -- Treesitter hi("@comment", { fg = colors.comment, italic = true }) hi("@function", { fg = colors.green }) hi("@keyword", { fg = colors.red, italic = true }) hi("@string", { fg = colors.green }) hi("@variable", { fg = colors.fg }) hi("@type", { fg = colors.yellow }) hi("@property", { fg = colors.green }) hi("@number", { fg = colors.magenta }) -- Telescope hi("TelescopeBorder", { fg = colors.comment }) hi("TelescopePromptTitle",{ fg = colors.yellow, bold = true }) hi("TelescopeSelection", { bg = colors.cursorline }) hi("TelescopeMatching", { fg = colors.blue }) -- DAP (Debug) hi("DebugBreakpoint", { fg = colors.red }) hi("DebugBreakpointLine", { bg = colors.cursorline }) hi("DebugPC", { bg = colors.highlight }) hi("DebugCurrentLine", { underline = true, sp = colors.yellow }) -- Pmenu (Completion) hi("Pmenu", { fg = colors.fg, bg = colors.cursorline }) hi("PmenuSel", { fg = colors.bg, bg = colors.highlight }) hi("PmenuThumb", { bg = colors.highlight }) -- Notify / Noice / Snacks hi("NotifyINFOBorder", { fg = colors.blue }) hi("NotifyWARNBorder", { fg = colors.yellow }) hi("NotifyERRORBorder", { fg = colors.red }) hi("NotifyDEBUGBorder", { fg = colors.cyan }) hi("NotifyTRACEBorder", { fg = colors.magenta }) hi("NoicePopup", { bg = colors.cursorline }) hi("NoicePopupmenu", { bg = colors.cursorline, fg = colors.fg }) -- Git Diff hi("DiffAdd", { fg = colors.green }) hi("DiffChange", { fg = colors.blue }) hi("DiffDelete", { fg = colors.red }) -- Terminal Colors vim.g.terminal_color_0 = colors.bg vim.g.terminal_color_1 = colors.red vim.g.terminal_color_2 = colors.green vim.g.terminal_color_3 = colors.yellow vim.g.terminal_color_4 = colors.blue vim.g.terminal_color_5 = colors.magenta vim.g.terminal_color_6 = colors.cyan vim.g.terminal_color_7 = colors.fg vim.g.terminal_color_8 = colors.comment vim.g.terminal_color_9 = colors.red vim.g.terminal_color_10 = colors.green vim.g.terminal_color_11 = colors.yellow vim.g.terminal_color_12 = colors.blue vim.g.terminal_color_13 = colors.magenta vim.g.terminal_color_14 = colors.cyan vim.g.terminal_color_15 = colors.fg -- Apply Snacks highlights unconditionally hi("SnacksNormal", { fg = colors.fg, bg = colors.bg }) hi("SnacksNormalNC", { fg = colors.comment, bg = colors.bg }) hi("SnacksWinBar", { fg = colors.magenta, bg = colors.bg, bold = true }) hi("SnacksWinBarNC", { fg = colors.comment, bg = colors.bg }) hi("SnacksCursorLine", { bg = colors.highlight }) hi("SnacksCursor", { bg = colors.highlight }) hi("SnacksPickerFile", { fg = colors.green, bold = true }) hi("SnacksPickerDir", { fg = colors.comment }) hi("SnacksPickerPathHidden", { fg = colors.comment, italic = true }) hi("SnacksPickerPathIgnored",{ fg = colors.comment, italic = true }) hi("SnacksPickerPrefix", { fg = colors.yellow }) hi("SnacksPickerNormal", { fg = colors.fg, bg = colors.yellow }) -- Normal picker line hi("SnacksPickerSelected", { fg = colors.bg, bg = colors.highlight }) -- Selected item (invert fg/bg) hi("SnacksPickerCursor", { fg = colors.yellow, bg = colors.cursorline }) hi("NormalFloat", { fg = colors.fg, bg = colors.bg })