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);
+ });
});