diff --git a/editors/vscode/themes/lume-color-theme.json b/editors/vscode/themes/lume-color-theme.json index 18c2e7d..145183f 100644 --- a/editors/vscode/themes/lume-color-theme.json +++ b/editors/vscode/themes/lume-color-theme.json @@ -121,7 +121,7 @@ "terminal.background": "#12101e", "terminal.foreground": "#d8d0e4", - "terminal.ansiBlack": "#1e1a2c", + "terminal.ansiBlack": "#56526c", "terminal.ansiRed": "#c49080", "terminal.ansiGreen": "#a0d4a8", "terminal.ansiYellow": "#c4b080", @@ -129,7 +129,7 @@ "terminal.ansiMagenta": "#b8a0e0", "terminal.ansiCyan": "#88c0b8", "terminal.ansiWhite": "#b0a8c4", - "terminal.ansiBrightBlack": "#302c42", + "terminal.ansiBrightBlack": "#68647e", "terminal.ansiBrightRed": "#d0a0b8", "terminal.ansiBrightGreen": "#a8d4b8", "terminal.ansiBrightYellow": "#e8b4a0", diff --git a/editors/zed/themes/lume.json b/editors/zed/themes/lume.json index c6f6345..4af1d36 100644 --- a/editors/zed/themes/lume.json +++ b/editors/zed/themes/lume.json @@ -141,7 +141,7 @@ "terminal.foreground": "#d8d0e4", "terminal.bright_foreground": "#d8d0e4", "terminal.dim_foreground": "#b0a8c4", - "terminal.ansi.black": "#1e1a2c", + "terminal.ansi.black": "#56526c", "terminal.ansi.red": "#c49080", "terminal.ansi.green": "#a0d4a8", "terminal.ansi.yellow": "#c4b080", @@ -149,7 +149,7 @@ "terminal.ansi.magenta": "#b8a0e0", "terminal.ansi.cyan": "#88c0b8", "terminal.ansi.white": "#b0a8c4", - "terminal.ansi.bright_black": "#302c42", + "terminal.ansi.bright_black": "#68647e", "terminal.ansi.bright_red": "#d0a0b8", "terminal.ansi.bright_green": "#a8d4b8", "terminal.ansi.bright_yellow": "#e8b4a0", diff --git a/lua/lume/palette.lua b/lua/lume/palette.lua index 95ab658..3a17f6f 100644 --- a/lua/lume/palette.lua +++ b/lua/lume/palette.lua @@ -31,7 +31,7 @@ M.accents = { } M.ansi = { - black = "#1e1a2c", + black = "#56526c", red = "#c49080", green = "#a0d4a8", yellow = "#c4b080", @@ -39,7 +39,7 @@ M.ansi = { magenta = "#b8a0e0", cyan = "#88c0b8", white = "#b0a8c4", - brightBlack = "#302c42", + brightBlack = "#68647e", brightRed = "#d0a0b8", brightGreen = "#a8d4b8", brightYellow = "#e8b4a0", diff --git a/palette.json b/palette.json index a3906b8..50bd242 100644 --- a/palette.json +++ b/palette.json @@ -26,7 +26,7 @@ "honey": "#c4b080" }, "ansi": { - "black": "#1e1a2c", + "black": "#56526c", "red": "#c49080", "green": "#a0d4a8", "yellow": "#c4b080", @@ -34,7 +34,7 @@ "magenta": "#b8a0e0", "cyan": "#88c0b8", "white": "#b0a8c4", - "brightBlack": "#302c42", + "brightBlack": "#68647e", "brightRed": "#d0a0b8", "brightGreen": "#a8d4b8", "brightYellow": "#e8b4a0", diff --git a/scripts/validate-contrast.ts b/scripts/validate-contrast.ts index 12499ce..88ebdef 100644 --- a/scripts/validate-contrast.ts +++ b/scripts/validate-contrast.ts @@ -99,5 +99,10 @@ export function validatePalette(palette: Palette): ValidationResult { if (bg.surface0) check(`${name} on surface0`, hex, bg.surface0, 3); } + // ANSI black/brightBlack: must be readable as foreground on base + const ansi = palette.ansi || {}; + if (ansi.black) check("ansi black on base", ansi.black, bg.base, 2); + if (ansi.brightBlack) check("ansi brightBlack on base", ansi.brightBlack, bg.base, 3); + return { pass: failures.length === 0, failures }; } diff --git a/terminals/alacritty/lume.toml b/terminals/alacritty/lume.toml index 4b2d639..a39f1aa 100644 --- a/terminals/alacritty/lume.toml +++ b/terminals/alacritty/lume.toml @@ -36,7 +36,7 @@ foreground = "#d8d0e4" background = "#0e0c18" [colors.normal] -black = "#1e1a2c" +black = "#56526c" red = "#c49080" green = "#a0d4a8" yellow = "#c4b080" @@ -46,7 +46,7 @@ cyan = "#88c0b8" white = "#b0a8c4" [colors.bright] -black = "#302c42" +black = "#68647e" red = "#d0a0b8" green = "#a8d4b8" yellow = "#e8b4a0" diff --git a/terminals/foot/lume.ini b/terminals/foot/lume.ini index 21d9093..a5d3316 100644 --- a/terminals/foot/lume.ini +++ b/terminals/foot/lume.ini @@ -10,7 +10,7 @@ selection-foreground = d8d0e4 selection-background = 262236 urls = 8cc0e0 -regular0 = 1e1a2c +regular0 = 56526c regular1 = c49080 regular2 = a0d4a8 regular3 = c4b080 @@ -19,7 +19,7 @@ regular5 = b8a0e0 regular6 = 88c0b8 regular7 = b0a8c4 -bright0 = 302c42 +bright0 = 68647e bright1 = d0a0b8 bright2 = a8d4b8 bright3 = e8b4a0 diff --git a/terminals/ghostty/lume b/terminals/ghostty/lume index 4a72578..c27ae97 100644 --- a/terminals/ghostty/lume +++ b/terminals/ghostty/lume @@ -9,7 +9,7 @@ selection-background = 262236 selection-foreground = d8d0e4 # ANSI colors -palette = 0=1e1a2c +palette = 0=56526c palette = 1=c49080 palette = 2=a0d4a8 palette = 3=c4b080 @@ -17,7 +17,7 @@ palette = 4=8cc0e0 palette = 5=b8a0e0 palette = 6=88c0b8 palette = 7=b0a8c4 -palette = 8=302c42 +palette = 8=68647e palette = 9=d0a0b8 palette = 10=a8d4b8 palette = 11=e8b4a0 diff --git a/terminals/iterm2/lume.itermcolors b/terminals/iterm2/lume.itermcolors index e8b316b..92a1555 100644 --- a/terminals/iterm2/lume.itermcolors +++ b/terminals/iterm2/lume.itermcolors @@ -9,13 +9,13 @@ Alpha Component 1 Blue Component - 0.172549 + 0.423529 Color Space sRGB Green Component - 0.101961 + 0.321569 Red Component - 0.117647 + 0.337255 Ansi 1 Color @@ -113,13 +113,13 @@ Alpha Component 1 Blue Component - 0.258824 + 0.494118 Color Space sRGB Green Component - 0.172549 + 0.392157 Red Component - 0.188235 + 0.407843 Ansi 9 Color diff --git a/terminals/kitty/lume.conf b/terminals/kitty/lume.conf index 40444d4..9a1339a 100644 --- a/terminals/kitty/lume.conf +++ b/terminals/kitty/lume.conf @@ -10,8 +10,8 @@ cursor_text_color #12101e url_color #8cc0e0 # Black -color0 #1e1a2c -color8 #302c42 +color0 #56526c +color8 #68647e # Red color1 #c49080 diff --git a/terminals/wezterm/lume.toml b/terminals/wezterm/lume.toml index de5817b..f5c5177 100644 --- a/terminals/wezterm/lume.toml +++ b/terminals/wezterm/lume.toml @@ -13,7 +13,7 @@ scrollbar_thumb = "#302c42" split = "#262236" compose_cursor = "#c4b080" ansi = [ - "#1e1a2c", + "#56526c", "#c49080", "#a0d4a8", "#c4b080", @@ -23,7 +23,7 @@ ansi = [ "#b0a8c4", ] brights = [ - "#302c42", + "#68647e", "#d0a0b8", "#a8d4b8", "#e8b4a0", diff --git a/terminals/windows-terminal/lume.json b/terminals/windows-terminal/lume.json index 2a7fd4f..e783629 100644 --- a/terminals/windows-terminal/lume.json +++ b/terminals/windows-terminal/lume.json @@ -4,7 +4,7 @@ "foreground": "#d8d0e4", "cursorColor": "#d0a0b8", "selectionBackground": "#262236", - "black": "#1e1a2c", + "black": "#56526c", "red": "#c49080", "green": "#a0d4a8", "yellow": "#c4b080", @@ -12,7 +12,7 @@ "purple": "#b8a0e0", "cyan": "#88c0b8", "white": "#b0a8c4", - "brightBlack": "#302c42", + "brightBlack": "#68647e", "brightRed": "#d0a0b8", "brightGreen": "#a8d4b8", "brightYellow": "#e8b4a0", diff --git a/tests/contrast.test.ts b/tests/contrast.test.ts index 82e16e3..3261aea 100644 --- a/tests/contrast.test.ts +++ b/tests/contrast.test.ts @@ -82,4 +82,34 @@ describe("validatePalette", () => { it("throws on missing required palette groups", () => { expect(() => validatePalette({} as any)).toThrow("Palette missing required group"); }); + + it("fails when ansi black has insufficient contrast against base", () => { + const badPalette = { + name: "bad", + variant: "dark", + backgrounds: { base: "#12101e" }, + foregrounds: { text: "#d8d0e4" }, + accents: {}, + ansi: { black: "#12101e" }, + special: {}, + }; + const results = validatePalette(badPalette as any); + expect(results.pass).toBe(false); + expect(results.failures.some(f => f.name.includes("ansi black"))).toBe(true); + }); + + it("fails when ansi brightBlack has insufficient contrast against base", () => { + const badPalette = { + name: "bad", + variant: "dark", + backgrounds: { base: "#12101e" }, + foregrounds: { text: "#d8d0e4" }, + accents: {}, + ansi: { brightBlack: "#1e1a2c" }, + special: {}, + }; + const results = validatePalette(badPalette as any); + expect(results.pass).toBe(false); + expect(results.failures.some(f => f.name.includes("ansi brightBlack"))).toBe(true); + }); });