art220/dancheong.nvim

github github
colorscheme
stars 1
issues 0
subscribers 0
forks 0
CREATED

UPDATED


Dancheong for Neovim

Four Neovim colorschemes drawn from dancheong (단청) — the pigment scheme painted on Korean temple eaves for the last 1,500 years. The palette is the old one: 진사 cinnabar, 뇌록 mineral green, 삼청 azurite, 석황 orpiment.

The colors are not eyeballed. They come out of a generator whose build fails if any foreground/background pair misses its contrast gate — 177 distinct pairs, 7:1 for body text, 4.5:1 for UI text and syntax accents, 3:1 on selections and diagnostics. Measured over what actually ships here: of the 311 text-bearing highlight groups in each variant, none lands below 3:1, and comments land between 4.57:1 and 4.70:1 depending on the variant. Run python3 scripts/contrast_check.py to reproduce that.

Variant Background For
dancheong-night dark default
dancheong-dawn light daylight, projectors
dancheong-storm dark high contrast — accents at 7.5:1 and up
dancheong-mist dark muted, low saturation

Install

lazy.nvim

{
  "art220/dancheong.nvim",
  lazy = false,
  priority = 1000,
  config = function()
    vim.cmd.colorscheme("dancheong-night")
  end,
}

packer.nvim

use { "art220/dancheong.nvim" }

vim-plug

Plug 'art220/dancheong.nvim'

Then :colorscheme dancheong-night (or -dawn, -storm, -mist).

Requires Neovim 0.8+ and a true-color terminal (termguicolors is set by the colorscheme itself).

What is covered

  • Legacy syntax groups and the full editor UI — floats, borders, folds, diffs, spell, quickfix, :terminal ANSI colors.
  • Tree-sitter captures, including the granular ones most themes skip: @variable.parameter, @keyword.return, @markup.heading.*, @string.escape, @constructor, @lsp.type.*, @lsp.typemod.*.
  • LSP semantic tokens — so colors stay put once a language server attaches instead of falling back to regex highlighting.
  • Diagnostics with undercurl, not blocks of background color.
  • Plugins: gitsigns, Telescope, nvim-tree, neo-tree, nvim-cmp, bufferline, indent-blankline (v2 and v3), which-key, nvim-notify, noice, trouble, todo-comments, lazy, mason, dashboard, nvim-dap, flash, illuminate, rainbow-delimiters.

Statusline

A matching lualine theme ships with each variant:

require("lualine").setup { options = { theme = "dancheong-night" } }

The rest of your tools

The same palette is generated for VS Code, JetBrains, Sublime Text, Obsidian, iTerm2, Alacritty, Kitty, Ghostty, Windows Terminal, Warp, tmux and Zed — one source file, so the hex values match byte-for-byte across all of them.

This colorscheme is free and MIT-licensed, and stays that way.

Contrast gate

The generator refuses to emit a variant whose colors miss their thresholds, so a palette change cannot quietly regress readability.

scripts/contrast_check.py re-measures the shipped colors/*.lua directly — it parses every nvim_set_hl call, resolves groups with no bg against Normal, and reports the worst pairs. It exempts groups that carry no text: window borders, indent guides, whitespace markers, the cursor and visual blocks. That exemption list is in the script, not hidden behind a passing score — read it and disagree if you like. Everything else is measured, and nothing there is below 3:1.

The pipeline write-up, including where the gate had holes: how the gate works.

License

MIT