Skip to content

β˜• Explore switchable theme: Catppuccin LatteΒ #215

Description

@martinciu

🎯 Goal

Add Catppuccin Latte as a sixth selectable theme via the theme-set <name>
fish switcher, and the first light theme in the collection. Machinery
landed in #185; Mocha reference implementation in #183/#185.

Architectural significance: introduces the dark/light axis the prior
issues deferred (see "Light variant: skip unless we also commit to
Solarized Light and Catppuccin Latte" in #188). All five existing themes
are dark; Latte forces a few semantic assumptions baked into the helpers
and palettes to be re-examined.

🎨 Palette (Latte)

  • bg/surface: base #eff1f5, mantle #e6e9ef, crust #dce0e8,
    surface0 #ccd0da, surface1 #bcc0cc, surface2 #acb0be
  • text: text #4c4f69, subtext1 #5c5f77, subtext0 #6c6f85,
    overlay2 #7c7f93, overlay1 #8c8fa1, overlay0 #9ca0b0
  • accents: blue #1e66f5, sky #04a5e5, sapphire #209fb5,
    teal #179299, green #40a02b, yellow #df8e1d, peach #fe640b,
    maroon #e64553, red #d20f39, mauve #8839ef, pink #ea76cb,
    flamingo #dd7878, rosewater #dc8a78, lavender #7287fd

πŸ“ Architecture

Machinery is settled (#185). Slots in as one more <name> across each
tool β€” same shape as #188/#193/#197 β€” with two simplifications and one
genuine inflection point.

Simplifications (Catppuccin pairing):

  • nvim already installs catppuccin/nvim for Mocha β€” extend
    lua/config/theme.lua resolver to set flavour = "latte" instead of
    installing a new plugin.
  • lnav already vendors catppuccin.json (from ninetailedtori/catppuccin-lnav,
    MIT) β€” that vendor ships all four flavours; the Latte selector is a
    one-line theme-latte.json pointing at Catppuccin Latte.
  • bat ships Catppuccin Latte built-in (0.26+, same vintage as Mocha).
  • vivid ships catppuccin-latte (0.11+).
  • Ghostty ships Catppuccin Latte built-in (1.0+).

Inflection point (first light theme):

  • tmux bar bg flips from dark surface to light surface (mantle #e6e9ef
    or crust #dce0e8). Every helper that hardcoded a dark assumption for
    bar bg / muted fg needs to be re-read.
  • @color_light_fg semantics: Latte's accents are still saturated (blue
    #1e66f5, green #40a02b, mauve #8839ef), so chips can keep
    light-on-saturated text (base #eff1f5). The relationship that
    changes is bar bg ↔ chip bg β€” chips are saturated against a light
    bar
    , not a dark one.

πŸ› οΈ Work breakdown

Same 8-file + plugin-spec + switch shape as #197, with the Catppuccin
simplifications folded in:

  • .config/themes/latte.tmux β€” semantic @color_* map.
  • .config/themes/delta-latte.gitconfig β€” syntax-theme = "Catppuccin Latte"
    (bat name, case-sensitive β€” verify with bat --list-themes | grep -i latte).
  • .config/ghostty/theme-latte.ghostty β€” theme = Catppuccin Latte
  • .config/starship-latte.toml β€” pastel_rose = '#ea76cb'
    (Latte pink β€” the canonical "personal" accent matching Mocha's
    #f5c2e7). cp from starship-mocha.toml + surgical Edits to
    preserve the U+E0B4 cap byte (see 🌾 Explore switchable theme: Gruvbox #188 Lesson + memory).
  • .config/glow/glamour-latte.json β€” light-bg glamour style;
    glow doesn't ship a Latte preset (Mocha was hand-rolled, Latte
    likely needs the same).
  • .config/gh-dash/theme-colors-latte.yml β€” clone Mocha's, swap
    theme.colors for Latte hex (new mixed-dir pattern: config-base.yml
    + theme-colors-<name>.yml concat at theme-set time).
  • .config/lnav/configs/installed/theme-latte.json β€” one-line
    selector pointing at Catppuccin Latte (theme-defs already
    vendored via catppuccin.json).
  • nvim: extended lua/config/theme.lua resolver to recognise
    latte and set flavour = "latte". No new plugin needed.
  • Extended .config/fish/functions/theme-set.fish switch
    (case latte), set BAT_THEME to "Catppuccin Latte" and
    VIVID_THEME to "catppuccin-latte".
  • Extended bootstrap.sh with a link line for starship-latte.toml.
  • Updated scripts/test-theme-switch.sh to round-trip Latte
    (partial-coverage assertions: delta/glow/lnav/gh-dash stay on previous theme).

βš–οΈ Tradeoff

βœ… Win: complements Mocha cleanly β€” Catppuccin was designed as a
light/dark pair, and Latte is the canonical light flavour. The two share
design intent (pastel-warm) so the cognitive load of switching is small.
Zero new plugin installs (nvim + lnav both already wired). Most popular
light theme right now.

❌ Loss: introduces the light/dark axis the prior issues deferred β€”
every future theme decision now carries a "is there a light pair?"
question. The Solarized-only tools (procs, tailspin, xh) and the
Solarized-Dark-only cheatsheets (docs/*.html) become visibly
mismatched when Latte is active. Either accept as a known limitation
(cheapest) or expand the theme indirection further (more cost).

🚦 Open questions

  • 🎨 Chip text inversion: Latte's accents are saturated, not pastel
    β€” light-on-accent chip text should work
    (@color_light_fg = '#eff1f5', base). The bar bg β†’ chip bg
    contrast is the new variable: with mantle #e6e9ef as bar bg, the
    saturated chips will read as darker than the bar, not lighter.
    Verify on the actual terminal before pinning.

  • β˜€οΈ Stay-Solarized tools (procs, tailspin, xh): these were
    intentionally left Solarized-only because their use-cases are
    low-stakes color hierarchies. On a Latte terminal bg, their dark-bg
    assumptions render poorly. Three options:

    • Accept as known limitation (cheapest, matches existing posture).
    • Extend theme-set to swap their configs too β€” moves them into the
      main indirection layer, ~3 more variant files per theme.
    • Pin xh to a light variant when on Latte (monokai-light? probe).

    Recommend status-quo for v1; revisit if it grates.

  • πŸ“„ Cheatsheets (docs/*.html): currently Solarized-Dark-styled.
    Latte being active doesn't change cheatsheet rendering. The CSS could
    be extracted to variables with a theme toggle button (called out in
    🎨 Explore switchable theme: Catppuccin ↔ SolarizedΒ #183's work breakdown but never landed). Defer to a separate issue β€”
    not Latte-specific.

  • β˜• pastel_rose pick: Latte pink #ea76cb is the obvious
    analogue to Mocha's #f5c2e7. Flamingo #dd7878 is a softer
    alternative if pink reads too sharp on the light bg. Default to pink
    for symmetry with Mocha.

  • 🎯 Unique-accent rule mapping (clean β€” six distinct hues, same
    layout as Mocha):

    • session chip (blue): blue #1e66f5
    • active window pin (green): green #40a02b
    • PR chip (orange): peach #fe640b
    • git main chip (violet): mauve #8839ef
    • git wt chip (yellow): yellow #df8e1d
    • usage cluster (violet + yellow): mauve + yellow

🧠 Lessons

See consolidated lessons in #188 and the Gruvbox PR (#193). One new
class of consideration enters with the first light theme:

  • Light-theme chip readability is a two-step contrast check, not
    one
    . With dark themes, only chip-bg vs chip-text matters (the bar
    bg is also dark and chips pop against it automatically). With light
    themes, chip-bg vs bar-bg becomes a separate readability axis β€”
    saturated chips on a light bar can look correct in isolation but
    read as "weird coloured rectangles on a beige strip" in motion.
    Verify by switching back and forth, not just by inspecting Latte
    statically.

πŸ”— Links

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions