aboutsummaryrefslogtreecommitdiff
path: root/scss
diff options
context:
space:
mode:
authorGaĆ«l Poupard <[email protected]>2020-03-23 18:03:56 +0100
committerGitHub <[email protected]>2020-03-23 18:03:56 +0100
commit03908ea37a55eaa44c12ce5694dddc1630c980b3 (patch)
tree719e43a0d06bf3254adbdfe59fe296707f2f6927 /scss
parent2e150e722a946f20ded62b39abe28f244f6ae050 (diff)
downloadbootstrap-03908ea37a55eaa44c12ce5694dddc1630c980b3.tar.xz
bootstrap-03908ea37a55eaa44c12ce5694dddc1630c980b3.zip
Use WCAG contrast algo (#30168)
Diffstat (limited to 'scss')
-rw-r--r--scss/_functions.scss41
-rw-r--r--scss/_variables.scss13
-rw-r--r--scss/mixins/_buttons.scss10
-rw-r--r--scss/mixins/_forms.scss2
4 files changed, 48 insertions, 18 deletions
diff --git a/scss/_functions.scss b/scss/_functions.scss
index ad0e7a667..00179049c 100644
--- a/scss/_functions.scss
+++ b/scss/_functions.scss
@@ -88,14 +88,43 @@
}
// Color contrast
-@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
- $r: red($color);
- $g: green($color);
- $b: blue($color);
+// See https://github.com/twbs/bootstrap/pull/30168
- $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
+// A list of pre-calculated numbers of pow(($value / 255 + .055) / 1.055, 2.4). (from 0 to 255)
+// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern
+$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;
- @return if($yiq >= $yiq-contrasted-threshold, $dark, $light);
+@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light) {
+ $l1: luminance($background);
+ $l2: luminance(opaque($background, $color-contrast-light));
+
+ $contrast: if($l1 > $l2, ($l1 + .05) / ($l2 + .05), ($l2 + .05) / ($l1 + .05));
+
+ @return if($contrast < $min-contrast-ratio, $color-contrast-dark, $color-contrast-light);
+}
+
+// Return WCAG2.0 relative luminance
+// See https://www.w3.org/WAI/GL/wiki/Relative_luminance
+// See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+@function luminance($color) {
+ $rgb: (
+ "r": red($color),
+ "g": green($color),
+ "b": blue($color)
+ );
+
+ @each $name, $value in $rgb {
+ $value: if($value / 255 < .03928, $value / 255 / 12.92, nth($_luminance-list, $value + 1));
+ $rgb: map-merge($rgb, ($name: $value));
+ }
+
+ @return (map-get($rgb, "r") * .2126) + (map-get($rgb, "g") * .7152) + (map-get($rgb, "b") * .0722);
+}
+
+// Return opaque color
+// opaque(#fff, rgba(0, 0, 0, .5)) => #808080
+@function opaque($background, $foreground) {
+ @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100);
}
// Request a color level
diff --git a/scss/_variables.scss b/scss/_variables.scss
index 7818a09d8..5060a2066 100644
--- a/scss/_variables.scss
+++ b/scss/_variables.scss
@@ -79,14 +79,15 @@ $theme-colors: (
) !default;
// Set a specific jump point for requesting color jumps
-$theme-color-interval: 8% !default;
+$theme-color-interval: 8% !default;
-// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255.
-$yiq-contrasted-threshold: 150 !default;
+// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.
+// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast
+$min-contrast-ratio: 3 !default;
-// Customize the light and dark text colors for use in our YIQ color contrast function.
-$yiq-text-dark: $gray-900 !default;
-$yiq-text-light: $white !default;
+// Customize the light and dark text colors for use in our color contrast function.
+$color-contrast-dark: $gray-900 !default;
+$color-contrast-light: $white !default;
// fusv-disable
$blue-100: tint-color($blue, 8) !default;
diff --git a/scss/mixins/_buttons.scss b/scss/mixins/_buttons.scss
index acf6b450c..53a337ba0 100644
--- a/scss/mixins/_buttons.scss
+++ b/scss/mixins/_buttons.scss
@@ -6,13 +6,13 @@
@mixin button-variant(
$background,
$border,
- $color: color-yiq($background),
+ $color: color-contrast($background),
$hover-background: darken($background, 7.5%),
$hover-border: darken($border, 10%),
- $hover-color: color-yiq($hover-background),
+ $hover-color: color-contrast($hover-background),
$active-background: darken($background, 10%),
$active-border: darken($border, 12.5%),
- $active-color: color-yiq($active-background)
+ $active-color: color-contrast($active-background)
) {
color: $color;
@include gradient-bg($background);
@@ -69,10 +69,10 @@
@mixin button-outline-variant(
$color,
- $color-hover: color-yiq($color),
+ $color-hover: color-contrast($color),
$active-background: $color,
$active-border: $color,
- $active-color: color-yiq($active-background)
+ $active-color: color-contrast($active-background)
) {
color: $color;
border-color: $color;
diff --git a/scss/mixins/_forms.scss b/scss/mixins/_forms.scss
index 187355994..7abfd23bf 100644
--- a/scss/mixins/_forms.scss
+++ b/scss/mixins/_forms.scss
@@ -32,7 +32,7 @@
margin-top: .1rem;
@include font-size($form-feedback-tooltip-font-size);
line-height: $form-feedback-tooltip-line-height;
- color: color-yiq($color);
+ color: color-contrast($color);
background-color: rgba($color, $form-feedback-tooltip-opacity);
@include border-radius($form-feedback-tooltip-border-radius);
}