From 1c7272be54be8783d81dd25900c6c7dc9beca09d Mon Sep 17 00:00:00 2001 From: Volpeon Date: Sun, 13 Feb 2022 10:15:46 +0100 Subject: Better palette generation algorithm --- src/_functions.scss | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'src/_functions.scss') diff --git a/src/_functions.scss b/src/_functions.scss index 9425413..73a1ec9 100644 --- a/src/_functions.scss +++ b/src/_functions.scss @@ -1,4 +1,7 @@ +@use 'sass:math'; @use 'iro-sass/src/index' as iro; +@use '@oddbird/blend'; +@use '@oddbird/blend/sass/convert' as blend-convert; @function color($key, $tree: 'colors', $default: null, $global: false) { @return iro.props-get(join(--colors, $key), $tree, $default, $global); @@ -59,3 +62,45 @@ } } } + +@function multi-contrast($base-color, $colors, $wanted-contrasts) { + $dir: if(lightness($base-color) >= 50%, -1, 1); + $base-lum: nth(blend-convert.lin_sRGB_to_XYZ(blend-convert.lin_sRGB(blend-convert.sassToRgb($base-color))), 2) + .05; + + $result: (); + $colors-len: length($colors); + $colors-idx: if($dir == -1, $colors-len, 1); + $wanted-len: length($wanted-contrasts); + $wanted-idx: 1; + + @while $colors-idx >= 1 and $colors-idx <= $colors-len and $wanted-idx <= $wanted-len { + $color: nth($colors, $colors-idx); + $lum: nth(blend-convert.lin_sRGB_to_XYZ(blend-convert.lin_sRGB(blend-convert.sassToRgb($color))), 2) + .05; + $contrast: math.div(math.max($base-lum, $lum), math.min($lum, $base-lum)); + + @if $contrast != 1 { + $contrast: $dir * $contrast; + + @if $lum <= $base-lum { + $contrast: -1 * $contrast; + } + } + + $wanted-contrast: nth($wanted-contrasts, $wanted-idx); + + @if $contrast >= $wanted-contrast { + $result: append($result, $color); + $wanted-idx: $wanted-idx + 1; + } @else { + $colors-idx: $colors-idx + $dir * 1; + } + } + + $last-color: nth($colors, if($dir == -1, 1, $colors-len)); + + @for $i from $wanted-idx through $wanted-len { + $result: append($result, $last-color); + } + + @return $result; +} -- cgit v1.2.3-54-g00ecf