-
Notifications
You must be signed in to change notification settings - Fork 841
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Set up sass functions folder, add new functions for color contrast (#628
) What this PR does: 1. Separates Sass functions into a new `/global_styling/functions/` folder so that they don't dirty up the rest of the files. These get imported along with `global_styling` genetically like our other mixins. 2. Adds new math and color functions: * A bunch of math functions for the single purpose of calculating luminosity is Sass * Using luminosity, we now have functions to `checkContrast`, `chooseLightOrDarkText` and `makeHighContrastColor`.
- Loading branch information
Showing
10 changed files
with
171 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
// Mixes a provided color with white. | ||
@function tint($color, $percent) { | ||
@return mix(#fff, $color, $percent); | ||
} | ||
|
||
// Mixes a provided color with black. | ||
@function shade($color, $percent) { | ||
@return mix(#000, $color, $percent); | ||
} | ||
|
||
// For theming. Checks the text color and tells us whether it's light or dark. | ||
// Based on that we either tint (add white) or shade (add black). | ||
@function tintOrShade($color, $tint, $shade) { | ||
@if (lightness($euiTextColor) > 50) { | ||
@return shade($color, $shade); | ||
} @else { | ||
@return tint($color, $tint); | ||
} | ||
} | ||
|
||
// The reverse of the above | ||
@function shadeOrTint($color, $shade, $tint) { | ||
@if (lightness($euiTextColor) < 50) { | ||
@return shade($color, $shade); | ||
} @else { | ||
@return tint($color, $tint); | ||
} | ||
} | ||
|
||
// Calculates luminance, which is better than brightness for checking colors | ||
// pow, nth functions come from the _math.scss functions | ||
@function luminance($color) { | ||
// Formula: http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef | ||
$rgba: red($color), green($color), blue($color); | ||
$rgba2: (); | ||
|
||
@for $i from 1 through 3 { | ||
$rgb: nth($rgba, $i); | ||
$rgb: $rgb / 255; | ||
|
||
$rgb: if($rgb < .03928, $rgb / 12.92, pow(($rgb + .055) / 1.055, 2.4)); | ||
|
||
$rgba2: append($rgba2, $rgb); | ||
} | ||
|
||
@return .2126 * nth($rgba2, 1) + .7152 * nth($rgba2, 2) + 0.0722 * nth($rgba2, 3); | ||
} | ||
|
||
// Calculate contrast | ||
@function contrastRatio($background, $foreground) { | ||
$backgroundLum: luminance($background) + .05; | ||
$foregroundLum: luminance($foreground) + .05; | ||
|
||
@return max($backgroundLum, $foregroundLum) / min($backgroundLum, $foregroundLum); | ||
} | ||
|
||
// Given $color, decide whether $lightText or $darkText should be used as the text color | ||
// ex: chooseLightOrDarkText(#EEE, #FFF, #000) would return #000 because it has | ||
// a higher contrast than #FFF against a #EEE background. | ||
@function chooseLightOrDarkText($background, $lightText, $darkText) { | ||
$lightContrast: contrastRatio($background, $lightText); | ||
$darkContrast: contrastRatio($background, $darkText); | ||
|
||
@if ($lightContrast > $darkContrast) { | ||
@return $lightText; | ||
} | ||
@else { | ||
@return $darkText; | ||
} | ||
} | ||
|
||
// Given a $foreground and a $background, make the $foreground AA accessibility by slightly | ||
// adjusting it till the contrast is high enough | ||
|
||
// ex: makeContrastColor($lightPink, #FFF) would continually shade the pink until | ||
// it had higher than 4.5 contrast on a white background. | ||
@function makeHighContrastColor($foreground, $background) { | ||
$contrast: contrastRatio($foreground, $background); | ||
|
||
$highContrastTextColor: $foreground; | ||
|
||
@while ($contrast < 4.5) { | ||
$highContrastTextColor: shadeOrTint($highContrastTextColor, 5%, 5%); | ||
$contrast: contrastRatio($highContrastTextColor, $euiColorEmptyShade); | ||
} | ||
|
||
@return $highContrastTextColor; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// Math needs to be first in the load order | ||
@import 'math'; | ||
|
||
// Using math, we have functions to manipulate contrast / luminosity for accessibility | ||
@import 'colors'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// Greatest common devisor | ||
// From: http://rosettacode.org/wiki/Greatest_common_divisor#JavaScript | ||
@function gcd($a, $b) { | ||
@if ($b != 0) { | ||
@return gcd($b, $a % $b); | ||
} @else { | ||
@return abs($a); | ||
} | ||
} | ||
|
||
// Handles decimal exponents by trying to convert them into a fraction and then | ||
// use a nthRoot-algorithm for parts of the calculation | ||
@function pow($base, $exponent, $prec: 12) { | ||
@if (floor($exponent) != $exponent) { | ||
$prec2 : pow(10, $prec); | ||
$exponent: round($exponent * $prec2); | ||
$denominator: gcd($exponent, $prec2); | ||
@return nthRoot(pow($base, $exponent / $denominator), $prec2 / $denominator, $prec); | ||
} | ||
|
||
$value: $base; | ||
@if $exponent > 1 { | ||
@for $i from 2 through $exponent { | ||
$value: $value * $base; | ||
} | ||
} @else if $exponent < 1 { | ||
@for $i from 0 through -$exponent { | ||
$value: $value / $base; | ||
} | ||
} | ||
|
||
@return $value; | ||
} | ||
|
||
// From: http://rosettacode.org/wiki/Nth_root#JavaScript | ||
@function nthRoot($num, $n: 2, $prec: 12) { | ||
$x: 1; | ||
|
||
@for $i from 0 through $prec { | ||
$x: 1 / $n * (($n - 1) * $x + ($num / pow($x, $n - 1))); | ||
} | ||
|
||
@return $x; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,13 @@ | ||
// Core | ||
|
||
// Functions need to be first, since we use them in our variables and mixin definitions | ||
@import 'functions/index'; | ||
|
||
// Variables come next, and are used in some mixins | ||
@import 'variables/index'; | ||
|
||
// Mixins provide generic code expansion through helpers | ||
@import 'mixins/index'; | ||
|
||
// The reset file makes use of variables and mixins | ||
@import 'reset/index'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters