Skip to content

Instantly share code, notes, and snippets.

@snide
Last active January 12, 2020 23:11
Show Gist options
  • Save snide/5b7d851e46c6db1918f60fc3b95cb4fe to your computer and use it in GitHub Desktop.
Save snide/5b7d851e46c6db1918f60fc3b95cb4fe to your computer and use it in GitHub Desktop.
// The luminance function requires some math functions be added to sass as shown below
@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);
}
// 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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment