Skip to content

Commit

Permalink
adding Hugo Giraudel's linear gradient mixin; initial pass needs cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
yvonnetangsu committed Feb 28, 2019
1 parent d630c77 commit 5a180d6
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 0 deletions.
89 changes: 89 additions & 0 deletions core/scss/utilities/mixins/gradient/_linear-gradient.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
@charset 'UTF-8';

//
// @linear-gradient
//
// @author Hugo Giraudel
//
// Mixin to create a linear gradient with a plain color fallback.
//
// $direction - Linear gradient direction
// $color-stops - List of color-stops composing the gradient
//
// Style guide: Mixins.Gradient.LinearGradient
//

/// Convert angle
/// @author Chris Eppstein
/// @param {Number} $value - Value to convert
/// @param {String} $unit - Unit to convert to
/// @return {Number} Converted angle
@function convert-angle($value, $unit) {
$convertable-units: deg grad turn rad;
$conversion-factors: 1 (10grad/9deg) (1turn/360deg) (3.1415926rad/180deg);
@if index($convertable-units, unit($value)) and index($convertable-units, $unit) {
@return $value
/ nth($conversion-factors, index($convertable-units, unit($value)))
* nth($conversion-factors, index($convertable-units, $unit));
}

@warn "Cannot convert `#{unit($value)}` to `#{$unit}`.";
}

/// Test if `$value` is an angle
/// @param {*} $value - Value to test
/// @return {Bool}
@function is-direction($value) {
$is-direction: index((to top, to top right, to right top, to right, to bottom right, to right bottom, to bottom, to bottom left, to left bottom, to left, to left top, to top left), $value);
$is-angle: type-of($value) == 'number' and index('deg' 'grad' 'turn' 'rad', unit($value));

@return $is-direction or $is-angle;
}

/// Convert a direction to legacy syntax
/// @param {Keyword | Angle} $value - Value to convert
/// @require {function} is-direction
/// @require {function} convert-angle
@function legacy-direction($value) {
@if is-direction($value) == false {
@warn "Cannot convert `#{$value}` to legacy syntax because it doesn't seem to be an angle or a direction";
}

$conversion-map: (
to top : bottom,
to top right : bottom left,
to right top : left bottom,
to right : left,
to bottom right : top left,
to right bottom : left top,
to bottom : top,
to bottom left : top right,
to left bottom : right top,
to left : right,
to left top : right bottom,
to top left : bottom right
);

@if map-has-key($conversion-map, $value) {
@return map-get($conversion-map, $value);
}

@return 90deg - convert-angle($value, 'deg');
}

/// Mixin printing a linear-gradient
/// as well as a plain color fallback
/// and the `-webkit-` prefixed declaration
/// @access public
/// @param {String | List | Angle} $direction - Linear gradient direction
/// @param {Arglist} $color-stops - List of color-stops composing the gradient
@mixin linear-gradient($direction, $color-stops...) {
@if is-direction($direction) == false {
$color-stops: ($direction, $color-stops);
$direction: 180deg;
}

background: nth(nth($color-stops, 1), 1);
background: -webkit-linear-gradient(legacy-direction($direction), $color-stops);
background: linear-gradient($direction, $color-stops);
}
11 changes: 11 additions & 0 deletions core/scss/utilities/mixins/gradient/index.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@charset "UTF-8";

// Gradient
//
// Mixins for creating gradients
//
// Style guide: Mixins.Gradient
//
@import
'linear-gradient'
;
1 change: 1 addition & 0 deletions core/scss/utilities/mixins/index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
'cta/index',
'display/index',
'flex/index',
'gradient/index',
'grid/index',
'icons-logos/index',
'image/index',
Expand Down

0 comments on commit 5a180d6

Please sign in to comment.