blob: e4aab4596d380ccd7961e0c1c8b15f14976895d5 [file] [log] [blame]
// "Photoshop" blend modes
@import "blend-modes";
/**
* Returns the luminance of a color (0-255), i.e. the perceived brightness, rather than
* the absolute mathematical lightness value.
*
* "The luminance calculation is a weighted average of the color channels that approximates
* how humans perceive brightness, while lightness is just an average of the largest and
* smallest channels without regard to perception."
*
* Source: http://en.wikipedia.org/wiki/Luminance_(relative)
*
* @group color
*
* @param {color} $color - the color whose luminance value to get
*
* @return {number} the luminance value of the color, in the range of 0-255
*
*/
@function color-luminance ($color) {
@return 0.2126 * red($color) + 0.7152 * green($color) + 0.0722 * blue($color);
}
/**
* Luminance value after which colors will be considered light (i.e. not dark).
*
* @group color
*/
$v-luminance-threshold: 150 !default;
/**
* Contrast default value for valo-font-color function.
*
* @group color
* @type number
*/
$v-font-color-contrast: 0.72 !default;
/**
* Checks whether the color is considered dark or light, according to it's luminance and saturation.
*
* @group color
*
* @param {color} $color - the color to check
*
* @return {bool} true if the color is considered dark, false if considered light
*/
@function is-dark-color($color) {
$luminance: color-luminance($color);
@if $luminance < $v-luminance-threshold or (saturation($color) > 80% and ($luminance < $v-luminance-threshold + 20)) {
@return true;
} @else {
@return false;
}
}
/**
* Get the darkest color (by luminance) from a list of colors.
*
* @group color
*
* @param {list} $colors - a list of CSS colors
*
* @return {color} darkest color (by luminance) from a list of colors
*/
@function darkest-color($colors...) {
$darkest: first($colors);
@each $color in $colors {
@if color-luminance($color) < color-luminance($darkest) {
$darkest: $color;
}
}
@return $darkest;
}
/**
* Returns a font color with enough contrast for the given background color.
*
* @group color
*
* @param {color} $bg-color - the background color for which to compute a suitable font color
* @param {number} $contrast (0.8) - the contrast of the font color compared to the background color
*
* @return {color} a suitable font color for the given background color
*/
@function valo-font-color ($bg-color, $contrast: $v-font-color-contrast) {
@if type-of($bg-color) == color {
@if is-dark-color($bg-color) {
@return scale-color($bg-color, $lightness: min(100%, 100% * $contrast), $saturation: max(-100%, -50% * $contrast));
} @else {
@return scale-color($bg-color, $lightness: max(-100%, -100% * $contrast), $saturation: max(-100%, -50% * $contrast));
}
}
@return null;
}
/**
* Returns a suitable focus color for the given background color.
*
* @group color
*
* @param {color} $context ($v-app-background-color) - the background color for which to compute a suitable focus color
*
* @return {color} a suitable focus color for the given background color
*/
@function valo-focus-color ($context: $v-app-background-color) {
$color: $context;
@if is-dark-color($context) {
$color: scale-color($color, $lightness: 40%, $saturation: 80%);
} @else {
$color: scale-color($color, $lightness: -50%, $saturation: 80%);
}
@return $color;
}
/**
* Output the default focus styles (border-color and box-shadow).
*
* @group style
*/
@mixin valo-focus-style {
@if type-of($v-focus-style) == list {
@include box-shadow($v-focus-style);
} @else if type-of($v-focus-style) == color {
border-color: $v-focus-style;
}
}