All skills

Design, mock up, build and review terminal UIs — full-screen TUIs, interactive CLIs and pickers, and plugin panels or popups inside a host (herdr, tmux, Neovim, k9s, lazygit). Use when designing, reviewing (from code, a live capture or a screenshot) or redesigning a TUI's layout, keybindings, states or colors, including requests that name a known TUI (lazygit, k9s, btop, yazi, helix, fzf); writing terminal mockups; building or fixing one in Ink, Textual, Bubble Tea, Ratatui or gum; mapping a color scheme (Catppuccin, Dracula, Nord, Gruvbox, Tokyo Night, Rosé Pine…) onto a TUI's theme; fixing misaligned glyphs, flicker, NO_COLOR, exit codes, signals, pipes or a broken terminal after exit; suspend or $EDITOR handoff; or profiling a slow TUI. Not for web or native GUIs, terminal-emulator, editor or shell-prompt themes.

Use this Skill: https://skilld.dev/gh/diegomarino/tui-design/tui-design

Nothing lands on disk. Nothing to clean up.

Fork this Skill

Edit a local copy. It keeps the author and licence.

referencesschemessolarized.md

≈3.5k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Solarized (Dark, Light): palette → token map

Sections — read only the line range you need (sed -n 'START,ENDp' on this file, or Read with offset/limit):

  • At a glance · L15–25 — variant ids, appearance, base/text/accent hex, license and sources.
  • Palette (official hex) · L27–67 — the exact official hex of a named palette entry.
  • Author's role rules · L69–71 — the scheme author's own rules for what each colour is for.
  • Token map · L73–134 — the palette entry, hex and contrast behind each semantic token (tier 1 and tier 2).
  • Contrast findings · L136–143 — which tokens fail a floor per variant, in truecolor, 16 and 256 colours.
  • 16-color mode · L145–160 — the per-variant ansi16 overrides and their ratios.
  • Quirks and discrepancy decisions · L162–168 — where sources disagree and which value was kept, light-theme limits.
  • App ports · L170–177 — whether helix, lazygit, k9s, btop, yazi, gitui or Textual ship a port of this scheme.

Read this when a TUI uses Solarized and you need the exact palette entry, hex and contrast for each semantic token, the author's role rules, and the 16-color caveats. Token meanings: ../color-tokens.md. All schemes: ../color-schemes.md. Machine-readable: solarized-dark.json, solarized-light.json.

At a glance

variant id appearance bg.base fg.default accent.primary license
Dark solarized-dark dark #002b36 #839496 4.75 blue #268bd2 MIT
Light solarized-light light #fdf6e3 #657b83 4.13 blue #268bd2 MIT

Sources:

Palette (official hex)

name Dark Light
base03 #002b36 #002b36
base02 #073642 #073642
base01 #586e75 #586e75
base00 #657b83 #657b83
base0 #839496 #839496
base1 #93a1a1 #93a1a1
base2 #eee8d5 #eee8d5
base3 #fdf6e3 #fdf6e3
yellow #b58900 #b58900
orange #cb4b16 #cb4b16
red #dc322f #dc322f
magenta #d33682 #d33682
violet #6c71c4 #6c71c4
blue #268bd2 #268bd2
cyan #2aa198 #2aa198
green #859900 #859900

ANSI 0–15 (terminal slots, in order black … bright white):

slot Dark Light
0 black #073642 base02 #073642 base02
1 red #dc322f red #dc322f red
2 green #859900 green #859900 green
3 yellow #b58900 yellow #b58900 yellow
4 blue #268bd2 blue #268bd2 blue
5 magenta #d33682 magenta #d33682 magenta
6 cyan #2aa198 cyan #2aa198 cyan
7 white #eee8d5 base2 #eee8d5 base2
8 br.black #002b36 base03 #002b36 base03
9 br.red #cb4b16 orange #cb4b16 orange
10 br.green #586e75 base01 #586e75 base01
11 br.yellow #657b83 base00 #657b83 base00
12 br.blue #839496 base0 #839496 base0
13 br.magenta #6c71c4 violet #6c71c4 violet
14 br.cyan #93a1a1 base1 #93a1a1 base1
15 br.white #fdf6e3 base3 #fdf6e3 base3

Author's role rules

Source: README "Usage & Development": "four monotones form the core values (with an optional fifth for emphasized content)"; dark: "the normal relationship for background and body text is base03:base0 (please note that body text is not base00)... text can be highlighted using a combination of base02:base1... simply inverted in the case of a light background." base01 = comments/secondary content (dark), base1 = emphasis. The eight accents are identical in both modes and defined with equal lightness, so none reaches 4.5:1 on base3.

Token map

Cell = palette name, hex, contrast. Contrast is vs bg.base (for bg tokens it shows the step from the base), selection.fg is vs selection.bg, fg.on-accent is the lowest ratio over the accent and status fills. FAIL = below the contrast floor. → token = unmapped tier-2 token resolved through its fallback; derived = computed hex (see Basis).

Tier 1 (always mapped)

token Dark Light basis
bg.base base03 #002b36 1.00 base3 #fdf6e3 1.00 spec: dark background = base03 (varies by variant: see JSON)
bg.inset base03 #002b36 1.00 base3 #fdf6e3 1.00 choice: no tone below base03 (varies by variant: see JSON)
bg.surface base02 #073642 1.15 base2 #eee8d5 1.14 spec: base02 = background highlights (varies by variant: see JSON)
bg.raised base02 #073642 1.15 base2 #eee8d5 1.14 spec: base02 = background highlights (only raised tone) (varies by variant: see JSON)
fg.default base0 #839496 4.75 base00 #657b83 4.13 FAIL spec: 'body text is base0 on base03 (not base00)' (varies by variant: see JSON)
fg.muted base01 #586e75 2.79 FAIL base1 #93a1a1 2.48 FAIL spec: base01 = comments / secondary content (varies by variant: see JSON)
fg.faint base01 #586e75 2.79 FAIL base1 #93a1a1 2.48 FAIL spec: base01 = comments (only tone dimmer than body) (varies by variant: see JSON)
fg.on-accent base03 #002b36 3.25 FAIL base03 #002b36 3.25 FAIL choice: Solarized accents are mid-luminance; base03 gives the highest ratio on them in both modes
border.default base01 #586e75 2.79 base1 #93a1a1 2.48 choice: dimmest visible monotone (base02 is 1.15:1) (varies by variant: see JSON)
accent.primary blue #268bd2 4.08 FAIL blue #268bd2 3.41 FAIL choice: Solarized identity hue; no accent reaches 4.5:1 in light mode
accent.secondary violet #6c71c4 3.43 violet #6c71c4 4.06 choice: distinct from blue and from info cyan
selection.bg base02 #073642 1.15 base2 #eee8d5 1.14 spec: highlighted pair base02:base1 (varies by variant: see JSON)
status.error red #dc322f 3.25 FAIL red #dc322f 4.29 FAIL choice: accent red (README defines no UI roles)
status.warning yellow #b58900 4.68 yellow #b58900 2.98 FAIL choice: accent yellow
status.success green #859900 4.69 green #859900 2.97 FAIL choice: accent green
status.info cyan #2aa198 4.75 cyan #2aa198 2.93 FAIL choice: accent cyan

Tier 2

token Dark Light basis
bg.overlay base02 #073642 1.15 base2 #eee8d5 1.14 spec: background highlights
bg.stripe derived #00262f 1.06 derived #f5efde 1.06 derived: bg.base darkened to 1.06:1 (weakest fill; bg.inset is invisible here, 1.00:1 vs inactive … (varies by variant: see JSON)
fg.title base1 #93a1a1 5.61 base01 #586e75 4.99 spec: base1 = optional emphasized content (varies by variant: see JSON)
border.focus → accent.primary #268bd2 4.08 → accent.primary #268bd2 3.41 fallback
selection.fg base1 #93a1a1 4.86 base01 #586e75 4.39 FAIL spec: highlighted pair base02:base1 (varies by variant: see JSON)
selection.inactive.bg → bg.surface #073642 1.15 → bg.surface #eee8d5 1.14 fallback
text-selection.bg base02 #073642 1.15 base2 #eee8d5 1.14 spec: background highlights
cursor.bg base1 #93a1a1 5.61 base01 #586e75 4.99 port: solarized/xresources cursorColor = base1 (varies by variant: see JSON)
cursor.fg base03 #002b36 1.00 base3 #fdf6e3 1.00 choice: background tone
search.match → status.warning #b58900 4.68 → status.warning #b58900 2.98 fallback
link → accent.primary #268bd2 4.08 FAIL → accent.primary #268bd2 3.41 FAIL fallback
keyhint.key → accent.primary #268bd2 4.08 FAIL → accent.primary #268bd2 3.41 FAIL fallback
keyhint.desc → fg.muted #586e75 2.79 → fg.muted #93a1a1 2.48 fallback
statusbar.bg base02 #073642 1.15 base2 #eee8d5 1.14 choice: background highlight band
statusbar.fg base1 #93a1a1 5.61 base01 #586e75 4.99 spec: highlighted pair base02:base1 (varies by variant: see JSON)
tab.active.fg → accent.primary #268bd2 4.08 → accent.primary #268bd2 3.41 fallback
tab.active.bg → bg.raised #073642 1.15 → bg.raised #eee8d5 1.14 fallback
tab.inactive.fg → fg.muted #586e75 2.79 → fg.muted #93a1a1 2.48 fallback
table.header → fg.default #839496 4.75 → fg.default #657b83 4.13 fallback
mark → accent.secondary #6c71c4 3.43 → accent.secondary #6c71c4 4.06 fallback
scrollbar.thumb → fg.faint #586e75 2.79 → fg.faint #93a1a1 2.48 fallback
scrollbar.track → border.default #586e75 2.79 → border.default #93a1a1 2.48 fallback
diff.added → status.success #859900 4.69 → status.success #859900 2.97 fallback
diff.removed → status.error #dc322f 3.25 → status.error #dc322f 4.29 fallback
diff.changed → status.info #2aa198 4.75 → status.info #2aa198 2.93 fallback
ramp.low green #859900 4.69 green #859900 2.97 cross-scheme: severity ramp
ramp.mid yellow #b58900 4.68 yellow #b58900 2.98 cross-scheme: severity ramp
ramp.high red #dc322f 3.25 red #dc322f 4.29 cross-scheme: severity ramp

Derived hex values (computed, not palette entries; blend(a, b, α) = a composited over b at opacity α):

  • Dark: bg.stripe = #00262f = see provenance
  • Light: bg.stripe = #f5efde = see provenance

Contrast findings

variant truecolor failures 16-color failures (after overrides) 256-color failures (OKLab nearest)
Dark fg.muted 2.79, fg.faint 2.79, status.error 3.25, accent.primary 4.08, keyhint.key 4.08, link 4.08, fg.on-accent 3.25 status.error 3.25, accent.primary 4.08, keyhint.key 4.08, link 4.08, fg.on-accent 3.25 fg.muted 2.88, fg.faint 2.88, status.error 2.80, status.success 3.96, accent.primary 3.93, keyhint.key 3.93, link 3.93, fg.on-accent 2.80
Light fg.default 4.13, fg.muted 2.48, fg.faint 2.48, status.error 4.29, status.warning 2.98, status.success 2.97, status.info 2.93, accent.primary 3.41, keyhint.key 3.41, link 3.41, selection.fg 4.39, fg.on-accent 3.25 fg.default 4.13, fg.muted 4.13, status.error 4.29, status.warning 2.98, status.success 2.97, status.info 2.93, accent.primary 3.41, keyhint.key 3.41, link 3.41, selection.fg 4.13, fg.on-accent 3.25 fg.default 4.44, fg.muted 2.62, fg.faint 2.62, status.warning 3.27, status.success 3.74, status.info 2.65, accent.primary 3.77, keyhint.key 3.77, link 3.77, selection.fg 4.13, fg.on-accent 2.80

Rule for failures: the official mapping is kept unless the palette offers a same-role entry that passes (those swaps are listed in Basis). Where a status color fails, never rely on it alone: pair it with a glyph and a word (see ../color-tokens.md).

16-color mode

Per-theme ansi16 overrides of the _tokens.json defaults (spec = slot [attrs]; ratio vs the terminal background in that mode):

token default Dark Light
fg.muted default dim 7 dim 4.66 default 4.13
fg.faint 8 7 dim 4.66 ·
fg.on-accent bg · 8 3.25
border.default 8 default dim 2.39 ·
accent.secondary 5 13 3.43 13 4.06
keyhint.desc default dim 7 dim 4.66 8 dim 3.57
tab.inactive.fg default dim 7 dim 4.66 8 dim 3.57
mark 5 13 3.43 13 4.06
scrollbar.track 8 default dim 2.39 ·
diff.changed 4 6 4.75 ·

Quirks and discrepancy decisions

  • Terminal slots: solarized/xresources (same ANSI assignment in dark and light): 8 = base03 (= background, invisible), 9 = orange, 10-12/14 = monotones base01/base00/base0/base1, 13 = violet, 15 = base3. ansi16 overrides route faint text and borders to slot 10 (base01). (Dark)
  • Discrepancy: altercation iterm2 files use color-managed values (bg #001e27); kept the canonical README/xresources hex. (Dark)
  • Solarized has two text tones per mode: body base0 (4.75:1) and secondary base01 (2.79:1). fg.muted and fg.faint are both base01 and fail their floors; use fg.title (base1) for emphasis to keep hierarchy. (Dark)
  • Terminal slots: solarized/xresources (identical ANSI assignment to dark): 8 = base03 (darkest, not faint), 10-12/14 = monotones. (Light)
  • Body text base00 on base3 is 4.13:1 (spec pairing) and fails 4.5:1; no same-role tone passes. No accent reaches 4.5:1 on base3. (Light)

App ports

O = official (scheme org or scheme repo extras), B = bundled in the app repo, C = community repo, - = none found (checked 2026-10).

variant helix lazygit k9s btop yazi gitui textual
Dark B - B B - - B
Light B - B B - - B

Source: SKILL.md on GitHub

skilld matched fixed text patterns in SKILL.md and file names. Patterns miss obfuscated code.

skilld run checks every file with the same patterns. It asks for approval before it loads a Skill with a behavior marked Needs approval.

1 warning3d3 checks · Risk SAFE
  • Gen Agent Trust Hub3d

    This skill provides a set of tools and guidelines for designing and auditing terminal user interfaces. No security issues were detected. It performs legitimate technical operations such as calling local utilities, fetching framework version information from trusted registries, and implementing robust prompts to protect against indirect injection when processing audited content.

  • Socket3d

    2 alerts: gptSecurity, gptAnomaly

  • Snyk3d

    Risk: LOW · No issues

Signed by skilld at a4de5fc. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated last week

README badge

README badge for diegomarino/tui-design