Compare commits

...

2 Commits

Author SHA1 Message Date
d98de5aba4 add WCAG contrast table, add raw OKLCH definitions 2025-10-25 04:04:16 -07:00
f01b841aa8 increase contrast of FF theme bar border 2025-10-22 17:22:20 -07:00
11 changed files with 305 additions and 16 deletions

View File

@ -85,19 +85,13 @@ the relevant values for making a decision. We want to ensure all accents can
reach >4.5 WCAG 2 contrast ratio (the standard requirement for small text on reach >4.5 WCAG 2 contrast ratio (the standard requirement for small text on
the web) against all biome monotones for each theme: the web) against all biome monotones for each theme:
+ For BG l20 (harsh, dark) -> l65 is min lightness where all accents have CR + For BG l20 (harsh, dark) -> l65 is min lightness where all accents have CR >=4.5
>=4.5 + For BG l25 (regular, dark) -> l65 is min lightness where all accents have CR >=4.5
+ For BG l25 (regular, dark) -> l65 is min lightness where all accents have CR + For BG l30 (soft, dark) -> l70 is min lightness where all accents have CR >=4.5
>=4.5
+ For BG l30 (soft, dark) -> l70 is min lightness where all accents have CR
>=4.5
+ For BG l90 (harsh, dark) -> l45 is max lightness where all accents have CR + For BG l90 (harsh, dark) -> l45 is max lightness where all accents have CR >=4.5
>=4.5 + For BG l85 (regular, dark) -> l45 is min lightness where all accents have CR >=4.5
+ For BG l85 (regular, dark) -> l45 is min lightness where all accents have CR + For BG l80 (soft, dark) -> l40 is min lightness where all accents have CR >=4.5
>=4.5
+ For BG l80 (soft, dark) -> l40 is min lightness where all accents have CR
>=4.5
For the monotone boundaries (l15 and l95, neither of which are possible For the monotone boundaries (l15 and l95, neither of which are possible
backgrounds for terminal or nvim in the current theme definitions), the backgrounds for terminal or nvim in the current theme definitions), the
@ -117,3 +111,76 @@ shade" of the l15-l95 shade group is l55, meaning these groups are very central
(the light triplet could move down by one shade step, but we want these accents (the light triplet could move down by one shade step, but we want these accents
to be as bright as we can get away with; otherwise, they are extremely dull in to be as bright as we can get away with; otherwise, they are extremely dull in
the light modes, and we thus don't mind bias toward a brighter lightness). the light modes, and we thus don't mind bias toward a brighter lightness).
The following table shows the lightness thresholds of accent colors required to achieve various
contrast ratios under different lightness levels of monotone backgrounds. These
ratios correspond to WCAG 2.2 standards:
- WCAG AA: contrast ratio ≥3:1 for large text, ≥4.5:1 for normal text
- WCAG AAA: contrast ratio ≥4.5:1 for large text, ≥7:1 for normal text
The official theme variants treat WCAG AA for normal text as the sweet spot,
but one could redefine accent selection around a more extreme contrast
threshold as desired.
<table>
<tr>
<th rowspan="2">Monotone<br>lightness</th>
<th colspan="3">Accent lightness for contrast ratio</th>
</tr>
<tr>
<th>3:1</th>
<th>4.5:1</th>
<th>7:1</th>
</tr>
<tr>
<td>=15%</td>
<td>≥50%</td>
<td>≥60%</td>
<td>≥75%</td>
</tr>
<tr>
<td>=20%</td>
<td>≥55%</td>
<td>≥65%</td>
<td>≥75%</td>
</tr>
<tr>
<td>=25%</td>
<td>≥55%</td>
<td>≥65%</td>
<td>≥80%</td>
</tr>
<tr>
<td>=30%</td>
<td>≥60%</td>
<td>≥70%</td>
<td>≥80%</td>
</tr>
<tr>
<td>=80%</td>
<td>≤50%</td>
<td>≤40%</td>
<td>≤30%</td>
</tr>
<tr>
<td>=85%</td>
<td>≤50%</td>
<td>≤45%</td>
<td>≤30%</td>
</tr>
<tr>
<td>=90%</td>
<td>≤55%</td>
<td>≤45%</td>
<td>≤35%</td>
</tr>
<tr>
<td>=95%</td>
<td>≤60%</td>
<td>≤50%</td>
<td>≤40%</td>
</tr>
</table>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -1,6 +1,6 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"version": "1.1.0", "version": "1.1.1",
"name": "monobiome-f{{theme.biome}}", "name": "monobiome-f{{theme.biome}}",
"theme": { "theme": {
"colors": { "colors": {
@ -14,7 +14,7 @@
"popup": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_text": "rgbx{{ tuple(int(f{{theme.vim.bg0}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_text": "rgbx{{ tuple(int(f{{theme.vim.bg0}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"ntp_background": "rgbx{{ tuple(int(f{{theme.vim.fg2}}[1:][i:i+2],16) for i in (0,2,4)) }}", "ntp_background": "rgbx{{ tuple(int(f{{theme.vim.fg2}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_border": "rgbx{{ tuple(int(f{{theme.vim.fg3}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_border": "rgbx{{ tuple(int(f{{theme.vim.grey}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_highlight_text": "rgbx{{ tuple(int(f{{theme.vim.bg0}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_highlight_text": "rgbx{{ tuple(int(f{{theme.vim.bg0}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_highlight": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_highlight": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"toolbar_bottom_separator": "rgbx{{ tuple(int(f{{theme.vim.grey}}[1:][i:i+2],16) for i in (0,2,4)) }}", "toolbar_bottom_separator": "rgbx{{ tuple(int(f{{theme.vim.grey}}[1:][i:i+2],16) for i in (0,2,4)) }}",
@ -37,7 +37,7 @@
"popup": "rgbx{{ tuple(int(f{{theme.vim.bg2}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup": "rgbx{{ tuple(int(f{{theme.vim.bg2}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_text": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_text": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"ntp_background": "rgbx{{ tuple(int(f{{theme.vim.bg0}}[1:][i:i+2],16) for i in (0,2,4)) }}", "ntp_background": "rgbx{{ tuple(int(f{{theme.vim.bg0}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_border": "rgbx{{ tuple(int(f{{theme.vim.bg3}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_border": "rgbx{{ tuple(int(f{{theme.vim.grey}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_highlight_text": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_highlight_text": "rgbx{{ tuple(int(f{{theme.vim.fg0}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"popup_highlight": "rgbx{{ tuple(int(f{{theme.vim.bg2}}[1:][i:i+2],16) for i in (0,2,4)) }}", "popup_highlight": "rgbx{{ tuple(int(f{{theme.vim.bg2}}[1:][i:i+2],16) for i in (0,2,4)) }}",
"toolbar_bottom_separator": "rgbx{{ tuple(int(f{{theme.vim.grey}}[1:][i:i+2],16) for i in (0,2,4)) }}", "toolbar_bottom_separator": "rgbx{{ tuple(int(f{{theme.vim.grey}}[1:][i:i+2],16) for i in (0,2,4)) }}",

View File

@ -0,0 +1,222 @@
{
"default": {
"l15": "oklch(15% 0 137.33)",
"l20": "oklch(20% 0 137.33)",
"l25": "oklch(25% 0 137.33)",
"l30": "oklch(30% 0 137.33)",
"l35": "oklch(35% 0 137.33)",
"l40": "oklch(40% 0 137.33)",
"l45": "oklch(45% 0 137.33)",
"l50": "oklch(50% 0 137.33)",
"l55": "oklch(55% 0 137.33)",
"l60": "oklch(60% 0 137.33)",
"l65": "oklch(65% 0 137.33)",
"l70": "oklch(70% 0 137.33)",
"l75": "oklch(75% 0 137.33)",
"l80": "oklch(80% 0 137.33)",
"l85": "oklch(85% 0 137.33)",
"l90": "oklch(90% 0 137.33)",
"l95": "oklch(95% 0 137.33)",
"l98": "oklch(97.5% 0 137.33)"
},
"badlands": {
"l15": "oklch(15% 0.011 29)",
"l20": "oklch(20% 0.011 29)",
"l25": "oklch(25% 0.011 29)",
"l30": "oklch(30% 0.011 29)",
"l35": "oklch(35% 0.011 29)",
"l40": "oklch(40% 0.011 29)",
"l45": "oklch(45% 0.011 29)",
"l50": "oklch(50% 0.011 29)",
"l55": "oklch(55% 0.011 29)",
"l60": "oklch(60% 0.011 29)",
"l65": "oklch(65% 0.011 29)",
"l70": "oklch(70% 0.011 29)",
"l75": "oklch(75% 0.011 29)",
"l80": "oklch(80% 0.011 29)",
"l85": "oklch(85% 0.011 29)",
"l90": "oklch(90% 0.011 29)",
"l95": "oklch(95% 0.011 29)",
"l98": "oklch(97.5% 0.011 29)"
},
"chaparral": {
"l15": "oklch(15% 0.011 62.5)",
"l20": "oklch(20% 0.011 62.5)",
"l25": "oklch(25% 0.011 62.5)",
"l30": "oklch(30% 0.011 62.5)",
"l35": "oklch(35% 0.011 62.5)",
"l40": "oklch(40% 0.011 62.5)",
"l45": "oklch(45% 0.011 62.5)",
"l50": "oklch(50% 0.011 62.5)",
"l55": "oklch(55% 0.011 62.5)",
"l60": "oklch(60% 0.011 62.5)",
"l65": "oklch(65% 0.011 62.5)",
"l70": "oklch(70% 0.011 62.5)",
"l75": "oklch(75% 0.011 62.5)",
"l80": "oklch(80% 0.011 62.5)",
"l85": "oklch(85% 0.011 62.5)",
"l90": "oklch(90% 0.011 62.5)",
"l95": "oklch(95% 0.011 62.5)",
"l98": "oklch(97.5% 0.011 62.5)"
},
"savanna": {
"l15": "oklch(15% 0.011 104)",
"l20": "oklch(20% 0.011 104)",
"l25": "oklch(25% 0.011 104)",
"l30": "oklch(30% 0.011 104)",
"l35": "oklch(35% 0.011 104)",
"l40": "oklch(40% 0.011 104)",
"l45": "oklch(45% 0.011 104)",
"l50": "oklch(50% 0.011 104)",
"l55": "oklch(55% 0.011 104)",
"l60": "oklch(60% 0.011 104)",
"l65": "oklch(65% 0.011 104)",
"l70": "oklch(70% 0.011 104)",
"l75": "oklch(75% 0.011 104)",
"l80": "oklch(80% 0.011 104)",
"l85": "oklch(85% 0.011 104)",
"l90": "oklch(90% 0.011 104)",
"l95": "oklch(95% 0.011 104)",
"l98": "oklch(97.5% 0.011 104)"
},
"grassland": {
"l15": "oklch(15.01% 0.011 148)",
"l20": "oklch(20% 0.011 148)",
"l25": "oklch(25% 0.011 148)",
"l30": "oklch(30% 0.011 148)",
"l35": "oklch(35% 0.011 148)",
"l40": "oklch(40% 0.011 148)",
"l45": "oklch(45% 0.011 148)",
"l50": "oklch(50% 0.011 148)",
"l55": "oklch(55% 0.011 148)",
"l60": "oklch(60% 0.011 148)",
"l65": "oklch(65% 0.011 148)",
"l70": "oklch(70% 0.011 148)",
"l75": "oklch(75% 0.011 148)",
"l80": "oklch(80% 0.011 148)",
"l85": "oklch(85% 0.011 148)",
"l90": "oklch(90% 0.011 148)",
"l95": "oklch(95% 0.011 148)",
"l98": "oklch(97.5% 0.011 148)"
},
"tundra": {
"l15": "oklch(15% 0.011 262)",
"l20": "oklch(20% 0.011 262)",
"l25": "oklch(25% 0.011 262)",
"l30": "oklch(30% 0.011 262)",
"l35": "oklch(35% 0.011 262)",
"l40": "oklch(40% 0.011 262)",
"l45": "oklch(45% 0.011 262)",
"l50": "oklch(50% 0.011 262)",
"l55": "oklch(55% 0.011 262)",
"l60": "oklch(60% 0.011 262)",
"l65": "oklch(65% 0.011 262)",
"l70": "oklch(70% 0.011 262)",
"l75": "oklch(75% 0.011 262)",
"l80": "oklch(80% 0.011 262)",
"l85": "oklch(85% 0.011 262)",
"l90": "oklch(90% 0.011 262)",
"l95": "oklch(95% 0.011 262)",
"l98": "oklch(97.5% 0.011 262)"
},
"red": {
"l15": "oklch(15% 0.058 29)",
"l20": "oklch(20% 0.074 29)",
"l25": "oklch(25% 0.092 29)",
"l30": "oklch(30% 0.11 29)",
"l35": "oklch(35% 0.128 29)",
"l40": "oklch(40% 0.147 29)",
"l45": "oklch(45% 0.167 29)",
"l50": "oklch(50% 0.183 29)",
"l55": "oklch(55% 0.193 29)",
"l60": "oklch(60% 0.193 29)",
"l65": "oklch(65% 0.182 29)",
"l70": "oklch(70% 0.164 29)",
"l75": "oklch(75% 0.14 29)",
"l80": "oklch(80% 0.112 29)",
"l85": "oklch(85% 0.081 29)",
"l90": "oklch(90% 0.052 29)",
"l95": "oklch(95% 0.024 29)",
"l98": "oklch(97.5% 0.012 29)"
},
"orange": {
"l15": "oklch(15% 0.0301 62.5)",
"l20": "oklch(20% 0.038 62.5)",
"l25": "oklch(25% 0.046 62.5)",
"l30": "oklch(30% 0.058 62.5)",
"l35": "oklch(35% 0.07 62.5)",
"l40": "oklch(40% 0.084 62.5)",
"l45": "oklch(45% 0.1 62.5)",
"l50": "oklch(50% 0.114 62.5)",
"l55": "oklch(55% 0.125 62.5)",
"l60": "oklch(60% 0.134 62.5)",
"l65": "oklch(65% 0.138 62.5)",
"l70": "oklch(70% 0.136 62.5)",
"l75": "oklch(75% 0.128 62.5)",
"l80": "oklch(80% 0.112 62.5)",
"l85": "oklch(85% 0.092 62.5)",
"l90": "oklch(90% 0.064 62.5)",
"l95": "oklch(95% 0.032 62.5)",
"l98": "oklch(97.5% 0.008 62.5)"
},
"yellow": {
"l15": "oklch(14.99% 0.02 104)",
"l20": "oklch(20% 0.024 104)",
"l25": "oklch(25% 0.03 104)",
"l30": "oklch(30% 0.036 104)",
"l35": "oklch(35% 0.044 104)",
"l40": "oklch(40% 0.05 104)",
"l45": "oklch(45% 0.06 104)",
"l50": "oklch(50% 0.068 104)",
"l55": "oklch(55% 0.076 104)",
"l60": "oklch(60% 0.082 104)",
"l65": "oklch(65% 0.088 104)",
"l70": "oklch(70% 0.088 104)",
"l75": "oklch(75% 0.086 104)",
"l80": "oklch(80% 0.082 104)",
"l85": "oklch(85% 0.072 104)",
"l90": "oklch(90% 0.058 104)",
"l95": "oklch(95% 0.04 104)",
"l98": "oklch(97.5% 0.016 104)"
},
"green": {
"l15": "oklch(14.99% 0.0401 148)",
"l20": "oklch(20% 0.048 148)",
"l25": "oklch(25% 0.056 148)",
"l30": "oklch(30% 0.064 148)",
"l35": "oklch(35% 0.072 148)",
"l40": "oklch(40% 0.08 148)",
"l45": "oklch(45% 0.09 148)",
"l50": "oklch(50% 0.098 148)",
"l55": "oklch(55% 0.104 148)",
"l60": "oklch(60% 0.108 148)",
"l65": "oklch(65% 0.11 148)",
"l70": "oklch(70% 0.108 148)",
"l75": "oklch(75% 0.102 148)",
"l80": "oklch(80% 0.094 148)",
"l85": "oklch(85% 0.084 148)",
"l90": "oklch(90% 0.072 148)",
"l95": "oklch(95% 0.05 148)",
"l98": "oklch(97.5% 0.024 148)"
},
"blue": {
"l15": "oklch(15% 0.06 262)",
"l20": "oklch(20% 0.072 262)",
"l25": "oklch(25% 0.084 262)",
"l30": "oklch(30% 0.096 262)",
"l35": "oklch(35% 0.106 262)",
"l40": "oklch(40% 0.116 262.01)",
"l45": "oklch(45% 0.124 262)",
"l50": "oklch(50% 0.13 262)",
"l55": "oklch(55% 0.132 262)",
"l60": "oklch(60% 0.128 262)",
"l65": "oklch(65% 0.122 262)",
"l70": "oklch(70% 0.11 262)",
"l75": "oklch(75% 0.096 262)",
"l80": "oklch(80% 0.08 262)",
"l85": "oklch(85% 0.064 262)",
"l90": "oklch(90% 0.044 262)",
"l95": "oklch(95% 0.023 262)",
"l98": "oklch(97.5% 0.011 262)"
}
}

View File

@ -1,4 +1,4 @@
version = "1.1.0" version = "1.1.1"
[default] [default]
l15 = "#0b0b0b" l15 = "#0b0b0b"