theme-aware codebox styling

This commit is contained in:
booleanmaybe 2026-04-13 10:38:33 -04:00
parent a5a7c2d124
commit 9eee3ea019
6 changed files with 28 additions and 12 deletions

View file

@ -147,7 +147,7 @@ type Palette struct {
DeepPurple Color // #865ad6 — fallback for burndown gradient
// Content area
ContentBackgroundColor Color // canvas background (dark: black, light: transparent/default)
ContentBackgroundColor Color // canvas background (transparent/default — inherits terminal bg)
// Statusline (Nord palette)
NordPolarNight1 Color // #2e3440
@ -187,7 +187,7 @@ func DarkPalette() Palette {
DeepSkyBlue: NewColorRGB(0, 191, 255),
DeepPurple: NewColorRGB(134, 90, 214),
ContentBackgroundColor: NewColor(tcell.ColorBlack),
ContentBackgroundColor: DefaultColor(), // transparent — inherit terminal background
NordPolarNight1: NewColorHex("#2e3440"),
NordPolarNight2: NewColorHex("#3b4252"),

View file

@ -155,7 +155,7 @@ func setDefaults() {
// Appearance defaults
viper.SetDefault("appearance.theme", "auto")
viper.SetDefault("appearance.gradientThreshold", 256)
viper.SetDefault("appearance.codeBlock.theme", "nord")
// code block theme resolved dynamically in GetCodeBlockTheme()
}
// bindFlags binds supported command line flags to viper so they can override config values.
@ -389,9 +389,16 @@ func GetGradientThreshold() int {
return threshold
}
// GetCodeBlockTheme returns the chroma syntax highlighting theme for code blocks
// GetCodeBlockTheme returns the chroma syntax highlighting theme for code blocks.
// defaults to "nord" (dark) or "github" (light) when not explicitly configured.
func GetCodeBlockTheme() string {
return viper.GetString("appearance.codeBlock.theme")
if t := viper.GetString("appearance.codeBlock.theme"); t != "" {
return t
}
if GetEffectiveTheme() == "light" {
return "github"
}
return "nord"
}
// GetCodeBlockBackground returns the background color for code blocks

View file

@ -182,9 +182,13 @@ func TestLoadConfigCodeBlockDefaults(t *testing.T) {
t.Fatalf("LoadConfig failed: %v", err)
}
// codeBlock.theme defaults to "nord"; background and border have no defaults
if cfg.Appearance.CodeBlock.Theme != "nord" {
t.Errorf("expected default codeBlock.theme 'nord', got '%s'", cfg.Appearance.CodeBlock.Theme)
// codeBlock.theme is empty in config (resolved dynamically by GetCodeBlockTheme)
if cfg.Appearance.CodeBlock.Theme != "" {
t.Errorf("expected empty default codeBlock.theme, got '%s'", cfg.Appearance.CodeBlock.Theme)
}
// GetCodeBlockTheme resolves to "nord" for dark (default) theme
if got := GetCodeBlockTheme(); got != "nord" {
t.Errorf("expected GetCodeBlockTheme() 'nord' for dark theme, got '%s'", got)
}
if cfg.Appearance.CodeBlock.Background != "" {
t.Errorf("expected empty default codeBlock.background, got '%s'", cfg.Appearance.CodeBlock.Background)

2
go.mod
View file

@ -4,7 +4,7 @@ go 1.25.0
require (
github.com/alecthomas/participle/v2 v2.1.4
github.com/boolean-maybe/navidown v0.4.16
github.com/boolean-maybe/navidown v0.4.17
github.com/charmbracelet/bubbles v0.21.1-0.20250623103423-23b8fd6302d7
github.com/charmbracelet/bubbletea v1.3.10
github.com/charmbracelet/huh v0.8.0

4
go.sum
View file

@ -27,8 +27,8 @@ github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3v
github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/boolean-maybe/navidown v0.4.16 h1:KfanPIG6vm26+Y7rjT5ztrERkZa6FDiSZ6Z0e0wfZeI=
github.com/boolean-maybe/navidown v0.4.16/go.mod h1:uF4Z/5uTnEtC6ZWyfKRv5Qw8Nir1nfp4kUraggTRfrk=
github.com/boolean-maybe/navidown v0.4.17 h1:5xlXhgd6/nzjrmQAi0puSuD6p+rbDFJlcJbKhEnU/Nc=
github.com/boolean-maybe/navidown v0.4.17/go.mod h1:uF4Z/5uTnEtC6ZWyfKRv5Qw8Nir1nfp4kUraggTRfrk=
github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY=
github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc=
github.com/charmbracelet/bubbles v0.21.1-0.20250623103423-23b8fd6302d7 h1:JFgG/xnwFfbezlUnFMJy0nusZvytYysV4SCS2cYbvws=

View file

@ -297,9 +297,14 @@ func InitColorAndGradientSupport(cfg *config.Config) *sysinfo.SystemInfo {
"wideGradients", config.UseWideGradients)
}
// set tview global background so all primitives inherit the theme background
// set tview global styles so all primitives inherit the theme colors.
// PrimaryTextColor must be set for light theme — tview defaults to white,
// which is invisible on light backgrounds.
colors := config.GetColors()
tview.Styles.PrimitiveBackgroundColor = colors.ContentBackgroundColor.TCell()
if config.GetEffectiveTheme() == "light" {
tview.Styles.PrimaryTextColor = colors.ContentTextColor.TCell()
}
return systemInfo
}