kitty: put the grok themes in the picker, move the mode store aside

`kitten themes` treats every .conf in <config-dir>/themes as a user
theme, which the mode system's canonical store was sitting in -- so the
picker was offering three bogus entries named light, dark and
no-preference, and had been since that store was introduced.

Move the store to ./theme-modes so ./themes means only what the kitten
means by it, and repoint apply-theme-mode.sh, the kitten shim, the
run_after hook and the test at the new path.

GrokNight and GrokDay move into ./themes with the ## name/author/
license/upstream/blurb header the kitten reads, so they now show up in
`kitten themes` and `--dump-theme` resolves them.

theme-modes/dark.conf carries the #202020 theme that was already on
disk: the file had to be re-added at its new path, so that drift comes
along with it.
This commit is contained in:
Anton Volnuhin 2026-08-06 03:24:48 +03:00
parent c2d0485320
commit 1c4e3774cf
10 changed files with 57 additions and 46 deletions

View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# Regenerate the *-theme.auto.conf files kitty reads at startup from the # Regenerate the *-theme.auto.conf files kitty reads at startup from the
# canonical themes in ./themes, honouring the mode recorded in ./theme-mode: # canonical themes in ./theme-modes, honouring the mode recorded in ./theme-mode:
# #
# auto every appearance keeps its own theme, so kitty follows the OS # auto every appearance keeps its own theme, so kitty follows the OS
# light every appearance gets the light theme, so kitty stays light # light every appearance gets the light theme, so kitty stays light
@ -10,7 +10,8 @@
# kitty gives the automatic theme files priority over everything else -- includes # kitty gives the automatic theme files priority over everything else -- includes
# and even --override -- so pinning a mode means writing the wanted theme into # and even --override -- so pinning a mode means writing the wanted theme into
# whichever file the OS makes kitty pick. That is why the real themes live in # whichever file the OS makes kitty pick. That is why the real themes live in
# ./themes and these three files are generated. # ./theme-modes and these three files are generated. (./themes is separate:
# that is where the themes kitten looks for user themes.)
set -eu set -eu
@ -32,7 +33,7 @@ file_mode() {
script_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" script_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
config_dir=${1:-"$script_dir"} config_dir=${1:-"$script_dir"}
canonical_dir="$config_dir/themes" canonical_dir="$config_dir/theme-modes"
mode_file="$config_dir/theme-mode" mode_file="$config_dir/theme-mode"
mode=auto mode=auto

View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# Behavioural regression for the remembered light/dark mode: # Behavioural regression for the remembered light/dark mode:
# - apply-theme-mode.sh generates the automatic theme files from ./themes # - apply-theme-mode.sh generates the automatic theme files from ./theme-modes
# - a pinned mode puts one theme in all three, so kitty starts in it # - a pinned mode puts one theme in all three, so kitty starts in it
# - `theme auto` restores per-appearance themes without losing any # - `theme auto` restores per-appearance themes without losing any
# - `kitten themes` changes are captured even while a mode is pinned # - `kitten themes` changes are captured even while a mode is pinned
@ -16,7 +16,7 @@ trap 'rm -rf "$tmpdir"' EXIT HUP INT TERM
config_dir="$tmpdir/config" config_dir="$tmpdir/config"
fake_bin="$tmpdir/bin" fake_bin="$tmpdir/bin"
mkdir -p "$config_dir/themes" "$fake_bin" mkdir -p "$config_dir/theme-modes" "$fake_bin"
DARK='#111111' DARK='#111111'
LIGHT='#eeeeee' LIGHT='#eeeeee'
@ -24,11 +24,11 @@ NOPREF='#222222'
NEW_LIGHT='#abcdef' NEW_LIGHT='#abcdef'
printf 'background %s\nmacos_titlebar_color background\n' "$DARK" \ printf 'background %s\nmacos_titlebar_color background\n' "$DARK" \
>"$config_dir/themes/dark.conf" >"$config_dir/theme-modes/dark.conf"
printf 'background %s\nmacos_titlebar_color background\n' "$LIGHT" \ printf 'background %s\nmacos_titlebar_color background\n' "$LIGHT" \
>"$config_dir/themes/light.conf" >"$config_dir/theme-modes/light.conf"
printf 'background %s\nmacos_titlebar_color background\n' "$NOPREF" \ printf 'background %s\nmacos_titlebar_color background\n' "$NOPREF" \
>"$config_dir/themes/no-preference.conf" >"$config_dir/theme-modes/no-preference.conf"
bg() { bg() {
awk '/^background/ { print $2; exit }' "$1" awk '/^background/ { print $2; exit }' "$1"
@ -103,7 +103,7 @@ printf '#!/bin/sh\nexit 0\n' >"$fake_bin/kitty"
chmod +x "$fake_bin/kitten" "$fake_bin/kitty" chmod +x "$fake_bin/kitten" "$fake_bin/kitty"
run_fish light 'theme dark >/dev/null; kitten themes' >/dev/null run_fish light 'theme dark >/dev/null; kitten themes' >/dev/null
expect "captured new light theme" "$config_dir/themes/light.conf" "$NEW_LIGHT" expect "captured new light theme" "$config_dir/theme-modes/light.conf" "$NEW_LIGHT"
expect "pin still held after kitten themes" \ expect "pin still held after kitten themes" \
"$config_dir/light-theme.auto.conf" "$DARK" "$config_dir/light-theme.auto.conf" "$DARK"
[ "$(tr -d ' \n' <"$config_dir/theme-mode")" = dark ] || { [ "$(tr -d ' \n' <"$config_dir/theme-mode")" = dark ] || {
@ -115,7 +115,7 @@ run_fish light 'theme light >/dev/null'
expect "new light theme is used once selected" \ expect "new light theme is used once selected" \
"$config_dir/light-theme.auto.conf" "$NEW_LIGHT" "$config_dir/light-theme.auto.conf" "$NEW_LIGHT"
expect "dark theme survived the whole exchange" \ expect "dark theme survived the whole exchange" \
"$config_dir/themes/dark.conf" "$DARK" "$config_dir/theme-modes/dark.conf" "$DARK"
# --- a bare `theme` records auto when it lands on the macOS appearance ---- # --- a bare `theme` records auto when it lands on the macOS appearance ----
echo auto >"$config_dir/theme-mode" echo auto >"$config_dir/theme-mode"

View File

@ -0,0 +1,29 @@
background #202020
foreground #adadad
cursor #ffffff
selection_background #1a3272
color0 #000000
color8 #545454
color1 #fa5355
color9 #fb7172
color2 #126e00
color10 #67ff4f
color3 #c2c300
color11 #ffff00
color4 #4581eb
color12 #6d9df1
color5 #fa54ff
color13 #fb82ff
color6 #33c2c1
color14 #60d3d1
color7 #adadad
color15 #eeeeee
selection_foreground #202020
# START_AUTOGENERATED_TAB_STYLE
# Feel free to update these colors manually and remove these comments.
active_tab_foreground #eeeeee
active_tab_background #1a3272
inactive_tab_foreground #adadad
inactive_tab_background #1a1a1a
# END_AUTOGENERATED_TAB_STYLE

View File

@ -1,3 +1,9 @@
## name: GrokDay
## author: xAI (grok build), ported by Anton
## license: see https://github.com/xai-org/grok-build
## upstream: https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager-render/src/theme/grokday.rs
## blurb: The GrokDay theme from grok build's TUI: light counterpart with deepened accents.
# GrokDay — neutral light gray base with deepened accents. # GrokDay — neutral light gray base with deepened accents.
# #
# Ported from grok build's TUI theme: # Ported from grok build's TUI theme:

View File

@ -1,3 +1,9 @@
## name: GrokNight
## author: xAI (grok build), ported by Anton
## license: see https://github.com/xai-org/grok-build
## upstream: https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager-render/src/theme/groknight.rs
## blurb: The GrokNight theme from grok build's TUI: neutral gray base with TokyoNight accents.
# GrokNight — neutral gray base with TokyoNight accents. # GrokNight — neutral gray base with TokyoNight accents.
# #
# Ported from grok build's TUI theme: # Ported from grok build's TUI theme:

View File

@ -1,31 +0,0 @@
background #1c2836
foreground #ffffff
cursor #bbbbbb
selection_background #b4d5ff
color0 #000000
color8 #545454
color1 #f9555f
color9 #fa8b8e
color2 #20af89
color10 #34bb99
color3 #fdf029
color11 #ffff55
color4 #589cf5
color12 #589cf5
color5 #934d95
color13 #e75598
color6 #1e9ee6
color14 #3978bb
color7 #bbbbbb
color15 #ffffff
selection_foreground #1c2836
# START_AUTOGENERATED_TAB_STYLE
# Feel free to update these colors manually and remove these comments.
active_tab_foreground #1c2836
active_tab_background #2e84e6
inactive_tab_foreground #2e84e6
inactive_tab_background #1c2836
# END_AUTOGENERATED_TAB_STYLE
macos_titlebar_color background

View File

@ -9,7 +9,7 @@ function kitten --description 'Run kitten and restore Kitty theme overrides'
set is_themes true set is_themes true
end end
# The automatic theme files are generated from $config_dir/themes, so record # The automatic theme files are generated from $config_dir/theme-modes, so record
# their state first: whichever one the kitten rewrites is the theme just # their state first: whichever one the kitten rewrites is the theme just
# chosen for that appearance, and has to be captured before the mode is # chosen for that appearance, and has to be captured before the mode is
# re-applied over the top of it. # re-applied over the top of it.
@ -41,9 +41,9 @@ function kitten --description 'Run kitten and restore Kitty theme overrides'
test "$now" = "$before[$index]" test "$now" = "$before[$index]"
and continue and continue
command mkdir -p "$config_dir/themes" command mkdir -p "$config_dir/theme-modes"
or return $status or return $status
command cp "$file" "$config_dir/themes/$appearance.conf" command cp "$file" "$config_dir/theme-modes/$appearance.conf"
or return $status or return $status
end end

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
# The kitty *-theme.auto.conf files are generated from .config/kitty/themes and # The kitty *-theme.auto.conf files are generated from .config/kitty/theme-modes and
# the per-machine .config/kitty/theme-mode, both of which .chezmoiignore keeps # the per-machine .config/kitty/theme-mode, both of which .chezmoiignore keeps
# out of the source state. Regenerate them here so a freshly applied machine # out of the source state. Regenerate them here so a freshly applied machine
# ends up with theme files kitty can read. # ends up with theme files kitty can read.
@ -15,7 +15,7 @@ apply="$config_dir/apply-theme-mode.sh"
# Nothing to do on machines without this kitty config applied. # Nothing to do on machines without this kitty config applied.
[ -x "$apply" ] || exit 0 [ -x "$apply" ] || exit 0
[ -d "$config_dir/themes" ] || exit 0 [ -d "$config_dir/theme-modes" ] || exit 0
# Never let a theming problem fail the whole apply. # Never let a theming problem fail the whole apply.
if ! "$apply" "$config_dir"; then if ! "$apply" "$config_dir"; then