diff options
| author | Gaƫl Poupard <[email protected]> | 2020-03-23 18:03:56 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-03-23 18:03:56 +0100 |
| commit | 03908ea37a55eaa44c12ce5694dddc1630c980b3 (patch) | |
| tree | 719e43a0d06bf3254adbdfe59fe296707f2f6927 /scss | |
| parent | 2e150e722a946f20ded62b39abe28f244f6ae050 (diff) | |
| download | bootstrap-03908ea37a55eaa44c12ce5694dddc1630c980b3.tar.xz bootstrap-03908ea37a55eaa44c12ce5694dddc1630c980b3.zip | |
Use WCAG contrast algo (#30168)
Diffstat (limited to 'scss')
| -rw-r--r-- | scss/_functions.scss | 41 | ||||
| -rw-r--r-- | scss/_variables.scss | 13 | ||||
| -rw-r--r-- | scss/mixins/_buttons.scss | 10 | ||||
| -rw-r--r-- | scss/mixins/_forms.scss | 2 |
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); } |
