Skip to content

Terminal design system

My terminal design system supplies shared tokens and atomic compositions across native interfaces. Application code stays grouped by capability. The built-in Nord preset establishes the first baseline before a personal green preset is designed.

Jump to theme roles, presentation tokens, Git status components, the atomic catalog, or integration boundaries.

The source chain is palette → semantic roles → component roles → native mappings. Preset selection chooses the input; --theme overrides it for an experiment. Runtime filenames, theme identifiers and adapter mappings stay independent of that choice. The status broker supplies state names; the generated tmux adapter resolves their presentation locally, ignoring producer-supplied colors. Shared tokens own reusable aliases, blend recipes and typed presentation defaults. Presets assign palette values; component definitions describe presentation roles. Adapters translate those definitions into each host’s native vocabulary.

The theme distinguishes selected rows, active tabs, warnings, errors, success, attention and unknown observations. Status retains a label or glyph. Syntax grammars can differ across hosts; matching semantic roles does not promise identical token classification.

Kitty opacity remains 0.97; Neovim’s main background remains inherited. The theme defines solid surfaces for popups, selections and other native components. Transparent compositing depends on the terminal and desktop behind it; preset captures show the solid theme backing.

Charmed’s foundations inform this system’s separation of meaning, emphasis, glyphs and terminal geometry. Atomic levels describe composition depth; native adapters stay organized by capability. The catalog leads with resolved component examples and links each component to its tokens and native consumers.

Foundation Contract here
Meaning Git file state, unstaged hunks, staged hunks and branch comparison keep separate identities. A renderer displays state supplied by its application.
Tone Semantic color roles own meaning; glyph tokens carry no color. Focus, selection and status retain separate roles.
Emphasis Bold changes weight; dim selects an explicit semantic shade. Neither changes the glyph or adds padding.
Glyphs Every managed symbol declares a printable ASCII fallback of at most one cell. An empty glyph explicitly means count-only or no separator.
Geometry Dimensions declare horizontal cells or vertical rows. Native adapters decide where padding is supported; website pixels are independent.
Evidence Saved native examples belong to their preset. Browser color chips are references; actual terminal fixtures verify native translation.

Charmed’s contrast floors, one-cell Unicode geometry, lifecycle state catalog and chart-series palette belong to its native components. Existing dotfile adapters do not establish those guarantees. In particular, inherited backgrounds and Nord’s subdued gutter colors need separate contrast evaluation. Color remains accompanied by a state name, a glyph, or native Git context; the prompt deliberately keeps compact counts.

Presets can override presentation without changing native adapters. Boolean emphasis, single-line symbol strings, and nonnegative integer spacing are typed. Spacing declares cell or row units; an adapter must explicitly support the unit. Current inline padding consumers use cells. These terminal units are separate from the website’s CSS pixels.

{
"presentation": {
"emphasis.heading": false,
"space.inline": 2,
"symbol.git.file.modified": "M"
}
}

Add this optional object to a preset. Override values retain the shared declaration’s type and unit; aliases use { "token": "another.declared.token" }. Component/native references use the same explicit token object. A cell dimension becomes native text padding only through { "token": "space.inline", "as": "spaces" }. Missing references, cycles, incompatible types or units, and unsupported native syntax fail before generated files are written.

Heading emphasis reaches Neovim and Glow; Glow’s sixth-level heading stays subdued. Inline padding reaches Glow code spans and tmux’s session label. Powerline separators reach tmux and lualine. Git file status icons feed Starship’s native modules, preserving counts and ahead/behind composition. Unstaged, staged and branch-comparison gutter signs have separate token names and preserve their existing defaults. Empty symbol strings are allowed, including Starship’s count-only staged indicator. Each managed symbol also declares an ascii fallback in the shared token source. Nerd Font availability and native glyph widths remain host constraints; Neovim rejects gutter symbols wider than two display cells.

Starship’s complete configuration is generated from a native template; its existing configuration path remains stable. Other prompt-module symbols stay application specific. The catalog lists direct consumers and exceptions. Generated tokens.json records defaults, overrides and resolved values; existing colors.json consumers retain their color interface. Neovim and Python exports also expose resolved presentation values.

Glyph representation is independent of the palette preset. Select it in design-system/config.json with { "theme": "nord", "symbols": "ascii" }, or generate an isolated variant:

Terminal window
python3 scripts/theme.py --theme nord --symbols ascii --output-dir /tmp/my-theme-ascii

The default is unicode. ASCII mode selects each managed symbol’s declared fallback, including Git status, gutter signs and separators. It takes precedence over a preset’s Unicode symbol override; edit the token’s ascii declaration to change that fallback. Color, emphasis and spacing retain their selected values. Other Starship modules, application-owned icons, border characters and document content keep their native behavior; this is a managed-glyph presentation, not an ASCII-only terminal or monochrome mode. Generation and native reload remain separate steps.

A symbol token supplies a character; a semantic component pairs it with a foreground role and supported emphasis. For example, git.file.modified combines symbol.git.file.modified, the git.file.modified color role, and its bold/dim tokens. The Starship adapter formats that component together with its native count. A preset can change the glyph, color, or emphasis independently without editing the adapter.

{
"roles": { "git.file.modified": "@status.info" },
"presentation": {
"symbol.git.file.modified": "M",
"emphasis.git.file.modified.bold": true
}
}

Shared Git foreground defaults reference ANSI slots, preserving the existing prompt palette while giving each state its own semantic role. The component always refers to that role. Unstaged, staged and branch-comparison components pair their sign tokens with separate diff foregrounds; the native editor adapter turns those components into sign text and highlight groups. Dim file status selects its dim_fg role before native output is generated; Starship receives the resulting RGB without a faint attribute. Staged/branch colors retain their separate muted diff roles. Shared recipes blend each semantic hue toward the preset surface; presets can supply a different shade through role overrides. Other symbols, such as separators, inherit the style of their enclosing component.

Terminal window
make theme-generate # compile committed native artifacts
make theme-check # validate sources and detect stale artifacts without writes
make shell kitty tmux-config vim-config zellij
make theme-cache # refresh bat's cache, also consumed by delta

For the initial Zellij migration, build the changed status plugin with make zellij-status zellij. Subsequent palette changes use native KDL theme styles; the status renderer no longer embeds the theme RGB values. Runtime installation remains explicit and separate from theme generation.

Use Kitty’s existing Cmd+Shift+R binding, :colorscheme dotfiles in Neovim, and tmux source-file ~/.config/tmux/tmux.conf. Reopen pickers and pagers; restart bottom. Start a new Zellij session if its native watcher does not reload a theme-file edit. The main tmux config reload refreshes existing agent segment colors without resetting their state age. There is no coordinated live-switch guarantee.

For an isolated theme experiment, run python3 scripts/theme.py --theme nord --output-dir /tmp/my-theme. DOTFILES_THEME_DIR selects alternate generated artifacts for the native fixture runner and owned Python/Neovim/fzf consumers; it does not select a theme globally across running applications. Generated files carry native formats and require no generator during normal startup.

The built-in Nord preset owns its palette reference, native examples and initial regression baseline. New presets use the same token contract and native adapters; preset-specific captures stay with their preset.

Git status components

A Git-state component combines a symbol, semantic foreground and supported emphasis. File status and gutter signs retain distinct meanings. Previews use the selected preset’s surface and resolved color, including explicit dim shades.

File status · Starship
Unstaged hunks · Neovim
┃

git.hunk.add

@diff.add · #A3BE8C

Normal weight · Full intensity

Consumer: neovim

~

git.hunk.changedelete

@diff.change · #EBCB8B

Normal weight · Full intensity

Consumer: neovim

┆

git.hunk.untracked

@diff.add · #A3BE8C

Normal weight · Full intensity

Consumer: neovim

Staged hunks · Neovim
Branch comparison · Neovim

Resolved theme roles

Resolved from the currently generated preset: nord. Preset references own their palettes and native examples.

surface#2E3440
surface.raised#3B4252
surface.selected#434C5E
border#4C566A
text#D8DEE9
text.strong#ECEFF4
text.muted#81A1C1
text.inverse#2E3440
accent#88C0D0
accent.secondary#8FBCBB
focus#B48EAD
status.success#A3BE8C
status.warning#EBCB8B
status.error#BF616A
status.info#88C0D0
status.attention#D08770
status.idle#81A1C1
status.off#4C566A
syntax.comment#4C566A
syntax.keyword#81A1C1
syntax.function#88C0D0
syntax.string#A3BE8C
syntax.type#8FBCBB
syntax.number#B48EAD
syntax.constant#D8DEE9
syntax.operator#81A1C1
syntax.special#EBCB8B
syntax.variable#D8DEE9
diff.add#A3BE8C
diff.change#EBCB8B
diff.delete#BF616A
diff.add.bg#414A4C
diff.change.bg#4C4C4C
diff.delete.bg#453B47
diff.add.dim#6E806A
diff.change.dim#968769
diff.delete.dim#7E4D57
selection.bg#434C5E
selection.fg#ECEFF4
match#A3BE8C
tab.active.bg#B48EAD
tab.active.fg#2E3440
tab.inactive.bg#2E3440
tab.inactive.fg#81A1C1
frame.inactive.fg#979DA9
keyhint#88C0D0
heading#88C0D0
prompt#88C0D0
diff.add.emph.bg#515D57
diff.delete.emph.bg#5A424D
git.file.conflicted#BF616A
git.file.stashed#E5E9F0
git.file.deleted#BF616A
git.file.renamed#88C0D0
git.file.modified#EBCB8B
git.file.staged#A3BE8C
git.file.untracked#81A1C1
git.file.typechanged#B48EAD
git.file.ahead#A3BE8C
git.file.behind#EBCB8B
git.file.branch#81A1C1
git.file.conflicted.dim#8C515B
git.file.stashed.dim#A5AAB2
git.file.deleted.dim#8C515B
git.file.renamed.dim#688F9E
git.file.modified.dim#A99671
git.file.staged.dim#7A8E71
git.file.untracked.dim#647B94
git.file.typechanged.dim#856E87
git.file.ahead.dim#7A8E71
git.file.behind.dim#A99671
git.file.branch.dim#647B94
file.directory#81A1C1
file.executable#A3BE8C
file.special#B48EAD
file.archive#D08770
file.project#EBCB8B

Presentation tokens

Inspect defaults, selected preset overrides and direct consumers. File status icons and gutter signs retain their own meanings. Native adapters own units and supported mappings.

Selected glyph representation: unicode. Git counts and ahead/behind composition stay in Starship’s native adapter. The bundled font previews default symbols; Unicode values identify variants requiring other glyphs.

Heading emphasis

emphasis.heading

Type
boolean
Default
true
Override
None
Resolved
true

Consumers: components, glow, neovim

Glow h6 remains subdued; other heading consumers use this emphasis.

Git file emphasis

emphasis.git.file.conflicted.bold

Type
boolean
Default
true
Override
None
Resolved
true

Consumers: components, starship

emphasis.git.file.conflicted.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.stashed.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.stashed.dim

Type
boolean
Default
true
Override
None
Resolved
true

Consumers: components, starship

emphasis.git.file.deleted.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.deleted.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.renamed.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.renamed.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.modified.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.modified.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.staged.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.staged.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.untracked.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.untracked.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.typechanged.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.typechanged.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.ahead.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.ahead.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.behind.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.behind.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.branch.bold

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

emphasis.git.file.branch.dim

Type
boolean
Default
false
Override
None
Resolved
false

Consumers: components, starship

Terminal spacing

space.inline

Type
dimension · cell
Default
1
Override
None
Resolved
1

Consumers: glow, tmux

Separators

symbol.separator.section.left

Type
string
Default
""
Override
None
Resolved
""
ASCII
">"

U+E0B0

Consumers: neovim, tmux

symbol.separator.section.right

Type
string
Default
""
Override
None
Resolved
""
ASCII
"<"

U+E0B2

Consumers: neovim, tmux

symbol.separator.component.left

Type
string
Default
""
Override
None
Resolved
""
ASCII
">"

U+E0B1

Consumers: neovim, tmux

symbol.separator.component.right

Type
string
Default
""
Override
None
Resolved
""
ASCII
"<"

U+E0B3

Consumers: neovim, tmux

Git file status

symbol.git.file.conflicted

Type
string
Default
""
Override
None
Resolved
""
ASCII
"!"

U+F071

Consumers: components, starship

symbol.git.file.stashed

Type
string
Default
""
Override
None
Resolved
""
ASCII
"s"

U+F187

Consumers: components, starship

symbol.git.file.deleted

Type
string
Default
""
Override
None
Resolved
""
ASCII
"-"

U+F1F8

Consumers: components, starship

symbol.git.file.renamed

Type
string
Default
""
Override
None
Resolved
""
ASCII
"r"

U+F02B

Consumers: components, starship

symbol.git.file.modified

Type
string
Default
""
Override
None
Resolved
""
ASCII
"~"

U+F040

Consumers: components, starship

symbol.git.file.staged

Type
string
Default
(empty)
Override
None
Resolved
(empty)
ASCII
(empty)

Consumers: components, starship

symbol.git.file.untracked

Type
string
Default
""
Override
None
Resolved
""
ASCII
"?"

U+F059

Consumers: components, starship

symbol.git.file.typechanged

Type
string
Default
""
Override
None
Resolved
""
ASCII
"t"

U+F074

Consumers: components, starship

symbol.git.file.ahead

Type
string
Default
""
Override
None
Resolved
""
ASCII
"^"

U+F062

Consumers: components, starship

symbol.git.file.behind

Type
string
Default
""
Override
None
Resolved
""
ASCII
"v"

U+F063

Consumers: components, starship

symbol.git.file.branch

Type
string
Default
""
Override
None
Resolved
""
ASCII
"@"

U+F418

Consumers: components, starship, zellij

Git unstaged hunks

symbol.git.hunk.add

Type
string
Default
"┃"
Override
None
Resolved
"┃"
ASCII
"+"

U+2503

Consumers: components, neovim

symbol.git.hunk.change

Type
string
Default
"┃"
Override
None
Resolved
"┃"
ASCII
"~"

U+2503

Consumers: components, neovim

symbol.git.hunk.delete

Type
string
Default
"▁"
Override
None
Resolved
"▁"
ASCII
"-"

U+2581

Consumers: components, neovim

symbol.git.hunk.topdelete

Type
string
Default
"^"
Override
None
Resolved
"^"
ASCII
"^"

U+005E

Consumers: components, neovim

symbol.git.hunk.changedelete

Type
string
Default
"~"
Override
None
Resolved
"~"
ASCII
"~"

U+007E

Consumers: components, neovim

symbol.git.hunk.untracked

Type
string
Default
"┆"
Override
None
Resolved
"┆"
ASCII
"?"

U+2506

Consumers: components, neovim

Git staged hunks

symbol.git.staged_hunk.add

Type
string
Default
"┃"
Override
None
Resolved
"┃"
ASCII
"+"

U+2503

Consumers: components, neovim

symbol.git.staged_hunk.change

Type
string
Default
"┃"
Override
None
Resolved
"┃"
ASCII
"~"

U+2503

Consumers: components, neovim

symbol.git.staged_hunk.delete

Type
string
Default
"▁"
Override
None
Resolved
"▁"
ASCII
"-"

U+2581

Consumers: components, neovim

symbol.git.staged_hunk.topdelete

Type
string
Default
"▔"
Override
None
Resolved
"▔"
ASCII
"^"

U+2594

Consumers: components, neovim

symbol.git.staged_hunk.changedelete

Type
string
Default
"~"
Override
None
Resolved
"~"
ASCII
"~"

U+007E

Consumers: components, neovim

Git branch comparison

symbol.git.branch_hunk.add

Type
string
Default
"│"
Override
None
Resolved
"│"
ASCII
"+"

U+2502

Consumers: components, neovim

symbol.git.branch_hunk.change

Type
string
Default
"│"
Override
None
Resolved
"│"
ASCII
"~"

U+2502

Consumers: components, neovim

symbol.git.branch_hunk.delete

Type
string
Default
"_"
Override
None
Resolved
"_"
ASCII
"-"

U+005F

Consumers: components, neovim

symbol.git.branch_hunk.topdelete

Type
string
Default
"^"
Override
None
Resolved
"^"
ASCII
"^"

U+005E

Consumers: components, neovim

Atomic catalog

Follow a component into its building blocks or into the interfaces that use it. Code remains organized by capability.

Foundations

theme Canonical palette, semantic roles, ANSI slots and explicit blend recipes.

Atoms

text Readable normal, strong and muted text.
heading Heading color and shared emphasis, with native exceptions documented per consumer.
git-state Git state components pair symbols, semantic colors and supported emphasis without conflating file status and hunk meanings.
status Success, warning, error, attention, idle and unknown states retain labels or glyphs.

status

Success, warning, error, attention, idle and unknown states retain labels or glyphs.

Composes: theme

Neovim
Diagnostic* / GitSigns*
Zellij
native attention glyph + received theme style
tmux
agent-state segment and glyph
CLI
labeled success / warning / error / unknown

Used by: metadata-row, tab-label, code-and-diff

Source: design-system/components.json

selection Focused selection and inactive state.

selection

Focused selection and inactive state.

Composes: theme

Neovim
Visual / PmenuSel / FzfLuaCursorLine
Zellij
selected native declarations and themed fzf
tmux
window-status-current-style and themed fzf
CLI
fzf selected foreground / background

Used by: metadata-row, tab-label

Source: design-system/components.json

keyhint Native key notation with shared emphasis.

Molecules

metadata-row A selectable identity with nearby status and metadata.
tab-label Name, active state, attention and zoom.
file-listing File kinds, exact byte sizes and native index/worktree Git indicators in listings and bounded directory previews.

Organisms

picker Search, results, selection, preview and cancellation.
status-bar Persistent navigation and attention.
code-and-diff Syntax and change states with staged and unstaged distinctions.

Templates

browse-inspect Browse a collection and inspect a preview before accepting.

browse-inspect

Browse a collection and inspect a preview before accepting.

Composes: picker

Neovim
worktree picker
Zellij
tab/session pickers with native previews
tmux
window/session pickers with native previews
CLI
fzf preview composition

Used by: zellij, tmux

Source: bin/zellij-picker · bin/fzf-path-preview

Interfaces

zellij Tab/session switching and persistent attention.
neovim Editing, diagnostics, diffs and navigation.
tmux Native styles, window/session navigation and attention.
cli Pagers, Markdown rendering and ordinary command output.

cli

Pagers, Markdown rendering and ordinary command output.

Composes: code-and-diff, git-state, file-listing

CLI
bat, delta, Glow, bottom and shell inheritance; Starship Git modules; eza native file metadata and Git status

Used by: Complete interface

Source: sh/alias · git/gitconfig

Integration boundaries

Mapped settings are distinct from exercised application behavior. Coverage statements describe local verification; Linux runs are configured in CI and require an actual successful run.

kitty generated native include

kitty

Color owner
Kitty palette and UI settings
Mechanism
generated native include
Reload
Existing Cmd+Shift+R load_config_file binding
Coverage and gaps
Mapped; native config parse checked. Emulator compositing requires visual inspection.

Source: kitty/kittyconf · design-system/generated/kitty.conf

neovim generated Lua mappings; reapplied after LazyLoad/VeryLazy

neovim

Color owner
Owned colorscheme, standard groups and explicit plugin groups
Mechanism
generated Lua mappings; reapplied after LazyLoad/VeryLazy
Reload
:colorscheme dotfiles
Coverage and gaps
Real Gitsigns, lualine and fzf-lua loads plus colorscheme reload checked. Other plugins have mappings or inherit core groups; full interactive coverage remains incomplete. Presentation checks exercise heading emphasis, Gitsigns extmarks, branch gutter symbols and lualine separators; colorscheme reload refreshes the token consumers. Gutter symbols are limited by Neovim to two display cells; actual glyph width depends on the font.

Source: nvim/lua/dotfiles-theme.lua · design-system/adapters/neovim.json

zellij generated KDL; status consumes ModeInfo.style

zellij

Color owner
Native theme and owned status plugin
Mechanism
generated KDL; status consumes ModeInfo.style
Reload
Zellij watches managed config; use a new session if a native theme-file edit is not picked up. Rebuild/install the status plugin once for this migration.
Coverage and gaps
Native status/prefix and picker workflow checks exercise the pinned runtime. No synchronized live-switch guarantee.

Source: design-system/adapters/zellij.json · zellij/status/src/theme.rs

tmux generated source-file and role references

tmux

Color owner
Native styles and owned agent-state helpers
Mechanism
generated source-file and role references
Reload
tmux source-file ~/.config/tmux/tmux.conf; refresh-theme updates persisted segment colors without changing state age
Coverage and gaps
Style parsing and repeated source-file checked in an isolated server. The main config reload refreshes persisted @claude colors without resetting state age or reason. Broker events supply state; generated formats resolve its colors locally and ignore broker color values.

Source: design-system/adapters/tmux.conf.in · bin/tmux-claude-state · design-system/adapters/tmux-states.json

fzf generated options through shell settings or dotfiles-fzf

fzf

Color owner
fzf options; fzf-lua highlights inside Neovim
Mechanism
generated options through shell settings or dotfiles-fzf
Reload
Open a new picker; source the generated shell.sh for an existing shell
Coverage and gaps
Actual fzf frame captured. Caller-supplied --color or later FZF_DEFAULT_OPTS can deliberately override the theme.

Source: bin/dotfiles-fzf · bin/zellij-picker · nvim/lua/fzfconfig.lua

eza generated eza YAML adapter linked as ~/.config/eza/theme.yml; legacy ls color variables removed only for eza

eza

Color owner
Native file metadata, file kinds and Git status styles
Mechanism
generated eza YAML adapter linked as ~/.config/eza/theme.yml; legacy ls color variables removed only for eza
Reload
Run make shell once to install the theme link; regenerate and open a new listing or picker
Coverage and gaps
Native listings and fzf previews use semantic file and Git roles. Exact bytes and tree depth remain listing policy. Eza owns its Git letter pairs and file icons: glyph tokens cannot replace its status markers, and its single new style cannot color staged-new and untracked states independently; their index/worktree columns remain distinct.

Source: design-system/adapters/eza.json · sh/alias · bin/fzf-path-preview

bat-delta generated tmTheme and native gitconfig include

bat-delta

Color owner
Syntax theme cache and delta diff features
Mechanism
generated tmTheme and native gitconfig include
Reload
make theme-cache; reopen the pager
Coverage and gaps
Both installed applications recognize the generated theme; real code and diff output captured. Syntax grammars differ from Neovim.

Source: design-system/adapters/syntax.json · design-system/generated/delta.gitconfig

glow generated JSON and existing shell wrapper

glow

Color owner
Native Glamour style
Mechanism
generated JSON and existing shell wrapper
Reload
Run glow again
Coverage and gaps
Real Markdown output captured. Verbatim embedded images and arbitrary upstream ANSI are outside theme ownership.

Source: design-system/adapters/glow.json · sh/alias

bottom generated native TOML

bottom

Color owner
Native widget, table, graph and series styles
Mechanism
generated native TOML
Reload
Restart btm
Coverage and gaps
Configuration accepted by bottom 0.15.0; CPU0 label styling captured independently of resource values and CPU count. Other widget states and hardware-specific series remain unexercised.

Source: design-system/adapters/bottom.toml.in

shell-cli terminal inheritance and generated shell settings

shell-cli

Color owner
ANSI slots, named styles and owned CLI sample
Mechanism
terminal inheritance and generated shell settings
Reload
Reload Kitty and start a new shell; existing processes may cache settings
Coverage and gaps
Owned CLI sample checks labels and NO_COLOR behavior. Named colors inherit the terminal palette; truecolor output from other programs does not.

Source: sh/profile · design-system/adapters/starship.toml.in · bin/dotfiles-theme

starship generated complete native TOML with literal symbol escaping

starship

Color owner
Shared Git-state components; existing native prompt layout
Mechanism
generated complete native TOML with literal symbol escaping
Reload
The next prompt reads the generated configuration; no shell initialization change is required.
Coverage and gaps
Native Git fixtures exercise file states, stash, conflicts, counts, branch and tracking status. Git components generate semantic foregrounds and bold/dim flags; shared defaults use ANSI slots to preserve the original colors. Independent overrides of glyph, color and emphasis are exercised. Other prompt module symbols remain application specific.

Source: design-system/adapters/starship.toml.in · design-system/tokens.json · design-system/components.json

external-color-owners explicit gaps

external-color-owners

Color owner
Filetype icons, literal-color previews, other plugins and optional tools
Mechanism
explicit gaps
Reload
Application specific
Coverage and gaps
Devicons may assign filetype colors; nvim-highlight-colors intentionally displays data colors; Markview, Snacks, Noice, Octo and other enabled plugin surfaces need interactive audits. Optional presenterm, btop, WezTerm, Xresources, NeoMutt, claude-tail and graphical apps are outside this daily-theme migration.

Source: nvim/init.lua · presenterm/themes/nord.yaml · btop/btop.conf · wezterm.lua · rc/Xresources · mail/neomuttrc · claude-tail/themes/Nord.tmTheme

Terminal window
make test-theme
make test-theme-native
make test-theme-presentation
make test-zellij-status test-zellij

The first check validates definitions, composition, deterministic generation, wiring, failures and plain output. Native checks require Kitty’s CLI, Neovim, tmux, fzf, bat, delta, Glow, bottom, the pinned Zellij runtime and built status artifact, and the three pinned Neovim plugins from nvim/lazy-lock.json; --surface can run a single integration. The fixture runner uses uv and pyte. Presentation checks additionally require Starship 1.27.0 and exercise disposable Git repositories and native reloads. The full Zellij workflow checks additionally need the pane-navigation artifact described in the Zellij guide.

Regression baselines are named for their preset; the native runner selects the baseline directory from generated theme metadata. Unicode retains the preset’s root directory; ASCII recordings go into its ascii/ subdirectory in both baselines and saved captures, so recording a fallback cannot replace the Unicode reference. That metadata records provenance, not runtime dispatch. theme-generate never changes regression baselines. The Nord preset documents the initial normalization.

To intentionally replace native baselines, run uv run --script scripts/test-theme-native.py --record and inspect both the JSON diff and images. A recorded baseline is a candidate until reviewed; recording is not user approval. Version changes and volatile layout must be investigated before accepting a new baseline. A changed shared role or native highlight mapping must fail the affected detector.

Add its purpose, atomic level, composition, implementations and source locations to the catalog. Use existing roles where meanings agree; add a distinct role when a meaningful state would otherwise be lost. Keep application-specific field names in adapters. Supported native configuration takes precedence over patches or replacements.

Document unavailable customization in the integration inventory, including the owning application or plugin and what remains unverified. Verbatim pane output, literal color previews and filetype icon colors have independent owners. Optional applications are listed as gaps rather than silently claimed as migrated.

Eza consumes the generated native adapter through ~/.config/eza/theme.yml, installed by make shell. File kinds use shared file.* roles; native Git metadata uses shared git.file.* roles. ll and la retain exact byte sizes, and lt and fzf directory previews retain bounded trees and native index/worktree indicators. Previewed files use the generated bat theme through BAT_THEME. The shell login defaults reuse the generated fzf palette instead of resetting it to literal Nord colors.

Eza owns its Git letter pairs and file icons. Shared glyph tokens cannot replace those markers, and its single new style cannot give staged-new and untracked files independent colors; the two Git columns preserve that distinction. The integration inventory records these native limits. Legacy LS_COLORS and EZA_COLORS are removed only for eza so they do not override the selected preset.