blob: 1065161bfcca2a4c0bdfe250a9ed2da9bc08774e [file] [log] [blame]
/**
* Computes a CSS border property value for the given base color.
*
* @group style
*
* @param {list} $border ($v-border) - CSS border value which can contain any of the color keywords
* @param {color} $color ($v-background-color) - the base color to which the color keywords are applied to
* @param {color} $context (null) - context/surrounding color where the border is expected to appear. The color of the final border is the darker of the two parameters passed to this function.
* @param {number} $strength (1) - adjustment for the border contrast
*
* @return {list} The input $border value with any color keyword replaced with the corresponding actual color
*/
@function valo-border($border: $v-border, $color: $v-background-color, $context: null, $strength: 1) {
@if type-of($border) != list {
@return $border;
}
@if $context {
@if color-luminance($color) > color-luminance($context) {
$color: $context;
}
}
$ret: null;
@each $part in $border {
@if $part == v-tint or $part == v-shade or $part == v-tone {
$part: $part 1;
}
@if type-of($part) == list {
$adjust-type: first-string($part);
$adjust-amount: first-number($part);
$tint: blend-screen(rgba(#fff, $v-bevel-depth/100%*$adjust-amount*$strength), $color);
$shade: blend-linearburn(rgba(#000, $v-bevel-depth/100%*$adjust-amount*$strength), $color);
@if $adjust-type == v-tone {
@if is-dark-color($color) {
$color: $tint;
} @else {
$color: $shade;
}
} @else if $adjust-type == v-tint {
$color: $tint;
} @else if $adjust-type == v-shade {
$color: $shade;
}
$ret: $ret $color;
} @else {
$ret: $ret $part;
}
}
@return $ret;
}
/**
* Similar to the valo-border function, but adjusts the top and bottom border colors to suit an element with a gradient background-color.
*
* @group style
*
* @param {list} $border ($v-border) - CSS border value which can contain any of the color keywords
* @param {color} $color ($v-background-color) - the base color to which the color keywords are applied to
* @param {color} $context (null) - context/surrounding color where the border is expected to appear. The color of the final border is the darker of the two parameters passed to this function.
* @param {number} $strength (1) - adjustment for the border contrast
* @param {list} $gradient ($v-gradient) - Valo specific gradient value. See the documentation for $v-gradient.
*/
@mixin valo-border-with-gradient($border: $v-border, $color: $v-background-color, $context: null, $strength: 1, $gradient: $v-gradient) {
border: valo-border($border, $color, $context, $strength);
// Adjust border colors for gradient
@if $gradient {
$color-stops: valo-gradient-color-stops($color, $gradient);
$top: first(first($color-stops));
$bottom: first(last($color-stops));
border-top-color: first-color(valo-border($border, $top, $context, $strength));
border-bottom-color: first-color(valo-border($border, $bottom, $context, $strength));
}
}
/**
* Computes a CSS box-shadow value according to the specified style parameters.
*
* @group style
*
* @param {list} $bevel (null) - box-shadow value according to $v-bevel documentation
* @param {number} $bevel-depth ($v-bevel-depth) - percentage defining the depth/amount of the bevel effect. Affects the color keywords specified in the $bevel parameter.
* @param {list} $shadow (null) - box-shadow value according to $v-shadow documentation
* @param {number} $shadow-opacity ($v-shadow-opacity) - percentage defining the opacity/amount of the shadow effect. Affects the color keywords specified in the $shadow parameter.
* @param {color} $background-color ($v-background-color) - the base color to which the color keywords are applied to
* @param {list} $gradient (null) - Valo specific gradient value. See the documentation for $v-gradient. Affects the color keywords specified in the $bevel parameter.
* @param {bool} $include-focus (false) - should the box-shadow value include $v-focus-style as well (only added if $v-focus-style is a)
*
* @return {list} CSS box-shadow value, combined from $bevel and $shadow with all occurences of v-tint, v-shade and v-tone color keywords replaced with the corresponding actual color
*/
@function valo-bevel-and-shadow ($bevel: null, $bevel-depth: $v-bevel-depth, $shadow: null, $shadow-opacity: $v-shadow-opacity, $background-color: $v-background-color, $gradient: null, $include-focus: false) {
$box-shadow: null;
@if $bevel {
@if list-of-lists($bevel) {
@each $b in $bevel {
$this: valo-bevel-and-shadow($bevel: $b, $shadow: null, $background-color: $background-color, $gradient: $gradient);
@if $this {
@if length($box-shadow) > 0 {
$box-shadow: $box-shadow, $this;
} @else {
$box-shadow: $this;
}
}
}
} @else if $bevel and $bevel != none {
$this: valo-replace-tones($bevel, $background-color, $gradient);
@if $this {
@if length($box-shadow) > 0 {
$box-shadow: $box-shadow, $this;
} @else {
$box-shadow: $this;
}
}
}
}
@if $shadow {
@if list-of-lists($shadow) {
@each $s in $shadow {
$this: valo-bevel-and-shadow($bevel: null, $shadow: $s, $background-color: null, $gradient: null);
@if $this {
@if length($box-shadow) > 0 {
$box-shadow: $box-shadow, $this;
} @else {
$box-shadow: $this;
}
}
}
} @else {
$this: valo-replace-shadow($shadow);
@if $this {
@if length($box-shadow) > 0 {
$box-shadow: $box-shadow, $this;
} @else {
$box-shadow: $this;
}
}
}
}
@if $include-focus and type-of($v-focus-style) == list {
$box-shadow: $v-focus-style, $box-shadow;
}
@return $box-shadow;
}
/**
* Replaces color keywords in the given list.
*
* @group style
*
* @param {list} $list - any CSS list with possible color keywords
* @param {color} $color - The color to which color keywords are applied to
* @param {list} $gradient (null) - Valo specific gradient value. See the documentation for $v-gradient. Affects the replacement colors to accommodate the gradient.
*
* @return {list} The input $list parameter with all occurences of v-tint, v-shade and v-tone color keywords replaced with the corresponding actual color
*/
@function valo-replace-tones($list, $color, $gradient: null) {
$ret: ();
@each $part in $list {
@if $part == v-tint or $part == v-shade or $part == v-tone {
$part: $part 1;
}
@if type-of($part) == list {
$adjust-type: first-string($part);
$adjust-amount: first-number($part);
$top-color: $color;
$bottom-color: $color;
@if $gradient {
$color-stops: valo-gradient-color-stops($color, $gradient);
$top-color: first(first($color-stops));
$bottom-color: first(last($color-stops));
}
$tint: blend-lighten(adjust-color($top-color, $lightness: $v-bevel-depth/4*$adjust-amount, $saturation: -$v-bevel-depth/2), scale-color($top-color, $lightness: $v-bevel-depth/4*$adjust-amount));
$shade: blend-darken(rgba(scale-color($bottom-color, $lightness: max(-30%, -$v-bevel-depth/3*$adjust-amount), $saturation: -$v-bevel-depth/2), $v-bevel-depth/100%), $bottom-color);
$new-color: null;
@if $adjust-type == v-tone {
@if is-dark-color($color) {
$new-color: $tint;
} @else {
$new-color: $shade;
}
} @else if $adjust-type == v-tint {
$new-color: $tint;
} @else if $adjust-type == v-shade {
$new-color: $shade;
}
$ret: join($ret, $new-color);
} @else {
$ret: join($ret, $part);
}
}
@return $ret;
}
/**
* Replace color keywords in the given box-shadow parameter.
*
* @group style
*
* @param {list} $shadow - CSS box-shadow value, or any other CSS list which might contain either the v-tint or the v-shade color keywords.
*
* @return {list} the input $shadow parameter with all occurences of v-tint and v-shade color keywords replaced with the corresponding actual color
*/
@function valo-replace-shadow ($shadow) {
$ret: ();
@each $part in $shadow {
@if $part == v-tint or $part == v-shade {
$part: $part 1;
}
@if type-of($part) == list {
$adjust-type: first-string($part);
$adjust-amount: first-number($part);
$tint: rgba(#fff, min(1, $v-shadow-opacity/100% * $adjust-amount));
$shade: rgba(#000, min(1, $v-shadow-opacity/100% * $adjust-amount));
$color: null;
@if $adjust-type == v-tint {
$color: $tint;
} @else if $adjust-type == v-shade {
$color: $shade;
}
$ret: join($ret, $color);
} @else {
$ret: join($ret, $part);
}
}
@return $ret;
}
/**
* Return a CSS text-shadow property value according to the specified style parameters.
*
* @group style
*
* @param {color} $font-color ($v-font-color) - the color of the text to which the text-shadow is added
* @param {color} $background-color ($v-background-color) - the color of the background where the text is to which the text-shadow is added
* @param {size} $offset (-1px) - the size of the text shadow vertical offset
* @param {number (pct)} $opacity ($v-shadow-opacity) - the percentage amount of shadow which is applied
*/
@function valo-text-shadow($font-color: $v-font-color, $background-color: $v-background-color, $offset: -1px, $opacity: $v-shadow-opacity) {
$color: null;
@if color-luminance($font-color) < color-luminance($background-color) {
$color: rgba(#fff, $opacity / 100%);
$offset: $offset * -1;
} @else {
$color: rgba(#000, $opacity / 100%);
}
@return 0 $offset 0 $color;
}