Skip to content

Commit a658bc5

Browse files
committed
fix: color-contrast() function for WCAG 2.1 compliance
1 parent 9898118 commit a658bc5

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

scss/functions/_contrast-ratio.scss

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,31 @@
11
@use "sass:color";
2+
@use "sass:list";
23
@use "sass:map";
34
@use "sass:math";
4-
@use "math" as *;
5+
6+
// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)
7+
// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern
8+
$_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;
59

610
@function contrast-ratio($background, $foreground) {
711
$l1: luminance($background);
812
$l2: luminance(opaque($background, $foreground));
913

10-
@return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));
14+
@return if($l1 > $l2, math.div($l1 + .05, $l2 + .05), math.div($l2 + .05, $l1 + .05));
1115
}
1216

1317
// Return WCAG2.2 relative luminance
1418
// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance
1519
// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio
1620
@function luminance($color) {
1721
$rgb: (
18-
"r": color.channel($color, "red", $space: rgb), // stylelint-disable-line scss/at-function-named-arguments
19-
"g": color.channel($color, "green", $space: rgb), // stylelint-disable-line scss/at-function-named-arguments
20-
"b": color.channel($color, "blue", $space: rgb) // stylelint-disable-line scss/at-function-named-arguments
22+
"r": color.channel($color, "red"),
23+
"g": color.channel($color, "green"),
24+
"b": color.channel($color, "blue")
2125
);
2226

2327
@each $name, $value in $rgb {
24-
$value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), math.pow(divide((divide(math.round($value) + 1, 255) + .055), 1.055), 2.4));
28+
$value: if(math.div($value, 255) < .04045, math.div(math.div($value, 255), 12.92), list.nth($_luminance-list, math.round($value + 1)));
2529
$rgb: map.merge($rgb, ($name: $value));
2630
}
2731

scss/tests/mixins/_color-contrast.test.scss

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
@use "../../functions" as *;
1+
@use "../../functions/color-contrast" as *;
2+
@use "../../functions/contrast-ratio" as *;
23
@use "../../variables" as *;
34
@use "../../maps" as *;
45
@use "../../mixins" as *;
56

7+
$black: #000;
8+
69
@include describe("color-contrast function") {
710
@include it("should return a color when contrast ratio equals minimum requirement (WCAG 2.1 compliance)") {
811
// Test case: Background color that produces contrast ratio close to 4.5:1

0 commit comments

Comments
 (0)