Skip to content

Commit

Permalink
Pick best contrast between black/white in theme::palette
Browse files Browse the repository at this point in the history
  • Loading branch information
hecrj committed Apr 7, 2024
1 parent ee86aea commit 72b975e
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions core/src/theme/palette.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use crate::{color, Color};
use once_cell::sync::Lazy;
use palette::color_difference::Wcag21RelativeContrast;
use palette::rgb::Rgb;
use palette::{FromColor, Hsl, Lch, Mix};
use palette::{FromColor, Hsl, Mix};

/// A color palette.
#[derive(Debug, Clone, Copy, PartialEq)]
Expand Down Expand Up @@ -613,10 +613,15 @@ fn mix(a: Color, b: Color, factor: f32) -> Color {
fn readable(background: Color, text: Color) -> Color {
if is_readable(background, text) {
text
} else if to_lch(background).l < 70.0 {
Color::WHITE
} else {
Color::BLACK
let white_contrast = relative_contrast(background, Color::WHITE);
let black_contrast = relative_contrast(background, Color::BLACK);

if white_contrast >= black_contrast {
Color::WHITE
} else {
Color::BLACK
}
}
}

Expand All @@ -631,12 +636,15 @@ fn is_readable(a: Color, b: Color) -> bool {
a_srgb.has_enhanced_contrast_text(b_srgb)
}

fn to_hsl(color: Color) -> Hsl {
Hsl::from_color(Rgb::from(color))
fn relative_contrast(a: Color, b: Color) -> f32 {
let a_srgb = Rgb::from(a);
let b_srgb = Rgb::from(b);

a_srgb.relative_contrast(b_srgb)
}

fn to_lch(color: Color) -> Lch {
Lch::from_color(Rgb::from(color))
fn to_hsl(color: Color) -> Hsl {
Hsl::from_color(Rgb::from(color))
}

fn from_hsl(hsl: Hsl) -> Color {
Expand Down

0 comments on commit 72b975e

Please sign in to comment.