MorningHue

A vivid light color theme for VS Code, Vim, xterm, and tmux. Designed for brightly-lit environments with WCAG-verified contrast ratios.

AAA 7:1+ Keywords AA 4.5:1+ All Syntax Light Theme VS Code 256-Color

View on GitHub

Color Palette

Every color is verified against the warm off-white background (#F1EDE5). Keywords and control flow exceed AAA (7:1), all other syntax colors meet AA (4.5:1).

Background & Foreground

Aa Bb Cc
Background
#F1EDE5
The quick brown fox
Foreground
#444444 · cterm 238 · CR 8.33
CursorLine
Cursor Line
#E4DED6 · cterm 254
// comment
Comment
#949494 · cterm 246 · Subtle

AAA Tier — CR ≥ 7:1

module
Vivid Blue
#0000d7 · 20 · CR 9.08
`define
Dark Crimson
#870000 · 88 · CR 8.86
always_ff
Deep Magenta
#870087 · 90 · CR 7.56
logic
Vivid Purple
#5f00d7 · 56 · CR 7.29

AA Tier — CR ≥ 4.5:1

"string"
Dark Green
#005f00 · 22 · CR 6.82
1'b1
Sea Teal
#005f5f · 23 · CR 6.42
Error
Deep Red
#af0000 · 124 · CR 6.37
a + b
Medium Blue
#005faf · 25 · CR 5.52
my_func()
Dark Teal
#005f87 · 24 · CR 6.06
32'hFF
Dark Golden
#875f00 · 94 · CR 4.90
assert
Bright Purple
#af00d7 · 128 · CR 4.73
import
Vivid Red
#d70000 · 160 · CR 4.62

Code Examples

MorningHue highlights all standard Vim syntax groups, so any language Vim supports works automatically. Here are examples from several languages commonly used in hardware verification and software development.

SystemVerilog

alu_scoreboard.sv
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
`include "uvm_macros.svh" `define TIMEOUT 1000 module alu_scoreboard #(parameter int WIDTH = 32) ( input logic clk, input logic rst_n, input logic [WIDTH-1:0] a, b, output logic [WIDTH-1:0] result ); logic [WIDTH-1:0] expected; always_comb begin case (opcode) 3'b000: expected = a + b; 3'b001: expected = a - b; default: expected = '0; endcase end assert property (@(posedge clk) result === expected) else $error("Mismatch: got %h, exp %h", result, expected); endmodule

Python

regression.py
1 2 3 4 5 6 7 8 9 10 11 12 13
import subprocess from pathlib import Path MAX_PARALLEL = 8 def run_regression(test_dir: str, seed: int = 42) -> bool: """Execute a full regression run.""" test_path = Path(test_dir) if not test_path.exists(): raise FileNotFoundError(f"Test dir missing") for cfg in test_path.glob("*.cfg"): result = subprocess.run(["simv", "+seed=" + str(seed)]) return True

C

driver.c
1 2 3 4 5 6 7 8 9 10 11 12
#include <stdio.h> #include <stdlib.h> #define BUF_SIZE 1024 int process_data(const char *input, size_t len) { char buffer[BUF_SIZE]; if (input == NULL || len == 0) { return -1; } printf("Processing %zu bytes\n", len); return 0; }

Makefile

Makefile
1 2 3 4 5 6 7 8
# Simulation build targets VCS_HOME := /tools/synopsys/vcs/R-2023.12 SEED := 42 compile: filelist.f $(VCS_HOME)/bin/vcs -sverilog -f filelist.f sim: compile ./simv +ntb_random_seed=$(SEED)

TCL

run_sim.tcl
1 2 3 4 5 6 7 8
# Simulation run script proc run_test {testname seed} { set logfile "logs/${testname}_${seed}.log" if {[file exists $logfile]} { file delete $logfile } puts "Running: $testname with seed $seed" source "configs/${testname}.tcl" }

Bash / Shell

run_tests.sh
1 2 3 4 5 6 7 8 9
#!/bin/bash PROJ_DIR="/home/user/verification" NUM_SEEDS=10 for seed in $(seq 1 $NUM_SEEDS); do echo "Running seed: $seed" if ! ./simv +seed=$seed; then echo "FAILED at seed $seed" >&2 fi done

JSON

config.json
1 2 3 4 5 6 7 8
{ "testbench": "alu_tb", "num_tests": 1000, "coverage": true, "timeout_ns": 50000, "debug": false, "seed": null }

Markdown

README.md
1 2 3 4 5 6 7
# ALU Verification This project contains the UVM testbench for the ALU module. ## Getting Started `make compile` followed by `make sim` to run. [Documentation](https://example.com)

UI Elements

Vim Statusline

 NORMAL  | alu_scoreboard.sv [+]                utf-8 | systemverilog   15:24
 regression.py                                                          1:1

tmux Status Bar

[verif]
0:build
1:vim
2:sim
3:waves
14:32   18-Feb-26

Diagnostics & Selection

Visual: selected text
Search: /pattern/
Error: undefined 'clk_i'
Warning: unused 'debug_en'
TODO: add edge case coverage
MatchParen: begin )

Diff View

− logic [7:0] data_old;
+ logic [15:0] data_wide;
  assign result = a + b + carry;

Broken Symlinks (ls --color)

A common problem with light themes: broken symlinks are invisible. MorningHue's dircolors configuration fixes this.

src/ include/ build/ Makefile run.tcl sim.py alu.sv libvcs.so -> /tools/lib/libvcs.so broken_link -> /missing/target ← clearly visible!

Accessibility & Contrast Ratios

All contrast ratios are calculated against the background (#F1EDE5, luminance 0.849) using the WCAG 2.1 formula. Colors are sorted by contrast ratio.

ColorHexctermContrast RatioGradeUsage
#0000d7209.08 : 1 AAAKeyword, module, structure
#870000888.86 : 1 AAAPreProc, `define, `ifdef
#4444442388.33 : 1 AAANormal text
#870087907.56 : 1 AAAControl flow, always, if
#5f00d7567.29 : 1 AAAType, StorageClass
#005f00226.82 : 1 AAString
#005f5f236.42 : 1 AABoolean, tag
#af00001246.37 : 1 AAError, exception
#005f87246.06 : 1 AAFunction, Identifier
#005faf255.52 : 1 AAOperator, delimiter
#875f00944.90 : 1 AANumber, constant
#af00d71284.73 : 1 AAStatement, assert
#d700001604.62 : 1 AAImport, include
#9494942462.60 : 1 SubtleComment (italic)
#1c1c1c16.29 : 1 AAAANSI color15 (bright white) — remapped for TUI tool visibility

* ANSI palette slots color7 (#444444, listed above as Normal text) and color15 (#1c1c1c) are remapped to dark values. On a light background, tools like GitHub Copilot CLI render text in these slots; keeping them light would make the output invisible.

Why Accessibility Matters for Code

Engineers spend hours reading code on screen. A theme with poor contrast forces the eyes to work harder, leading to fatigue and missed details. MorningHue ensures:

Comparison with PaperColor

PaperColor is an excellent theme, but several of its colors fall below the WCAG AA threshold on its own background. MorningHue addresses every one:

ElementPaperColorCRMorningHueCRChange
Background#eeeeee#F1EDE5Warmer, less harsh
Strings#5f87003.65#005f006.82+87%
Statement#d700874.27#af00d74.73+11%
Operator#0087af3.56#005faf5.52+55%
Numbers#d75f003.28#875f004.90+49%
Boolean#0087004.05#005f5f6.42+59%
Broken symlinksInvisibleBold red on pinkFixed

Installation

VS Code

Clone into your VS Code extensions directory:

# Linux / macOS git clone https://github.com/glenzac/morninghue-theme ~/.vscode/extensions/morninghue # Windows git clone https://github.com/glenzac/morninghue-theme %USERPROFILE%\.vscode\extensions\morninghue

Then restart VS Code, open the Command Palette (Ctrl+Shift+P), type Preferences: Color Theme, and select MorningHue.

Vim / Neovim

mkdir -p ~/.vim/colors cp colors/morninghue.vim ~/.vim/colors/

Add to ~/.vimrc:

set background=light colorscheme morninghue

xterm (.Xresources)

cp morninghue.Xresources ~/.Xresources xrdb -merge ~/.Xresources

The ANSI white palette slots are remapped to dark values (color7 = #444444, color15 = #1c1c1c) so TUI tools like GitHub Copilot CLI render text visibly on the light background.

tmux

Add to ~/.tmux.conf:

source-file /path/to/morninghue.tmux.conf

dircolors (fixes broken symlinks)

Add to your shell rc file:

# bash / zsh [ -f /path/to/morninghue.dircolors ] && eval $(dircolors /path/to/morninghue.dircolors) # tcsh / csh if ( -f /path/to/morninghue.dircolors ) eval `dircolors -c /path/to/morninghue.dircolors`