/**
 * @class Global_CSS
 */
 
/**
 * @var [$color-by-background-dark-color=null]
 */
$color-by-background-dark-color: dynamic(null);
 
$color-by-background-light-color: dynamic(null);
 
/**
 * @method brightness
 * @ignore
 * Returns the brightness (out of 100) of a specified color.
 * @param {color} $color The color you want the brightness value of
 * @return {number}
 */
@function brightness($color) {
    $r: red($color) / 255 * 100;
    $g: green($color) / 255 * 100;
    $b: blue($color) / 255 * 100;
 
    $brightness: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
 
    @return $brightness;
}
 
/**
 * @method color-difference
 * @param {color} $c1
 * @param {color} $c2
 * @private
 * @ignore
 */
@function color-difference($c1, $c2) {
    @return (max(red($c1), red($c2)) - min(red($c1), red($c2))) + (max(green($c1), green($c2)) - min(green($c1), green($c2))) + (max(blue($c1), blue($c2)) - min(blue($c1), blue($c2)));
}
 
/**
 * @method color-luminance
 * @param {color} $value
 * @private
 * @ignore
 */
@function color-luminance($value) {
    @if $value <= 0.03928 {
        @return $value / 12.92;
    } @else {
        @return ($value + 0.055)/1.055 * ($value + 0.055)/1.055;
    }
}
 
/**
 * @method luminosity
 * @ignore
 * Returns the luminosity for a specified color
 * @param {color} color The color to check
 * @return {number}
 */
@function luminosity($color) {
    $r: color-luminance(red($color) / 255);
    $g: color-luminance(green($color) / 255);
    $b: color-luminance(blue($color) / 255);
    $l: 0.2126 * $r + 0.7152 * $g + 0.0722 * $b;
    @debug 'luminosity for ' + $color ' is ' + $l;
    @return $l;
}
 
/**
 * @method contrast-ratio
 * @ignore
 * Returns the contrast ratio between two colors
 * @param {color} $color1 The color to check
 * @param {color} $color2 The color to check against
 * @return {number}
 */
@function contrast-ratio($color1, $color2) {
    $l1: luminosity($color1);
    $l2: luminosity($color2);
 
    @if $l2 > $l1 {
        @return $l2 / $l1;
    } @else {
        @return $l1 / $l2;
    }
}
 
@function get-color-mode($color) {
    @if brightness($color) > 65 {
        @return light;
    } @else {
        @return dark;
    }
}
 
$color-mode: 'inverse';
 
@function color-offset($color, $contrast: 85%, $mode: $color-mode, $inverse: false, $light-color: null, $dark-color: null) {
    $flat_color: check-opacity($color);
 
    @if $mode == inverse {
        $mode: reverse-color-mode($color-mode);
    }
 
    @if $inverse == true {
        $mode: reverse-color-mode($mode);
    }
 
    @if ($mode == light) {
        @return $light-color or $color-by-background-light-color or rgba(lighten($flat_color, $contrast), opacity($color));
    } @else if ($mode == dark) {
        @return $dark-color or $color-by-background-dark-color or rgba(darken($flat_color, $contrast), opacity($color));
    } @else {
        @debug $mode " is not a valid color mode. Use light, dark, or inverse.";
        @return white;
    }
}
 
@function reverse-color-mode($mode) {
    @if $mode == dark {
        @return light;
    } @else {
        @return dark;
    }
}
 
@function check-opacity($color) {
    @if (opacity($color) == 0) {
        $color: opacify($color, 1);
    }
    @if $color == transparent {
        $color: opacify($color, 1);
    }
    @return $color;
}
 
@function color-by-background($bg-color, $contrast: $default-text-contrast, $light-color: null, $dark-color: null) {
    @if $bg-color == null {
        @return null;
    }
 
    $bg-color: check-opacity($bg-color);
    $tmpmode: get-color-mode($bg-color);
 
    @return color-offset( 
        $color: $bg-color, 
        $contrast: $contrast, 
        $mode: $tmpmode, 
        $inverse: true, 
        $light-color: $light-color, 
        $dark-color: $dark-color 
    );
}
 
@function get-inset-offset($mode){
    @if $mode == light {
        @return 1px;
    } @else {
        @return -1px;
    }
}
 
@function safe-saturate($color, $amount) {
    @if saturation($color) > 0 {
        @return saturate($color, $amount);
    } @else {
        @return $color;
    }
}
 
/**
 * Colors the text of an element based on lightness of its background.
 *
 *     .my-element {
 *       @include color-by-background(#fff); // Colors text black.
 *     }
 *
 *     .my-element {
 *       @include color-by-background(#fff, 40%); // Colors text gray.
 *     }
 *
 * @param {color} $bg-color Background color of element.
 * @param {percent} [$contrast=$default-text-contrast] Contrast of text color to its background.
 * @param {boolean} [$default-color=false]
 * @param {boolean} [$inset-text=false]
 *
 */
@mixin color-by-background(
    $bg-color,
    $contrast: $default-text-contrast,
    $default-color: false,
    $inset-text: false
) {
    @if $bg-color != null {
        @if $default-color {
            color: color-by-background(hsla(hue($default-color), saturation($default-color), lightness($bg-color), opacity($bg-color)), $contrast);
        } @else {
            color: color-by-background($bg-color, $contrast);
        }
 
        @if $inset-text {
            @include inset-by-background($bg-color);
        }
    }
}
 
@mixin inset-by-background($bg-color, $contrast: 10%, $box: false) {
    $bg-color: check-opacity($bg-color);
    $offset: get-inset-offset(get-color-mode($bg-color));
 
    @if ($box == true) {
        @include box-shadow(color-offset($bg-color, $contrast, $mode: get-color-mode($bg-color)) 0 $offset 0);
    }
 
    @include text-shadow(color-offset($bg-color, $contrast, $mode: get-color-mode($bg-color)) 0 $offset 0);
}
 
@function hsv-to-rgb($color) {
    $r: red($color) / 255;
    $g: green($color) / 255;
    $b: blue($color) / 255;
    $a: opacity($color);
}
 
// @debug hsv(rgba(#3E87E3, .5)); 
 
@function brighten($color, $amount) {
    $current_brightness: brightness($color);
}