Spaces:
Sleeping
Sleeping
// breakpoints.scss v1.0 | @ajlkn | MIT licensed */ | |
// Vars. | |
/// Breakpoints. | |
/// @var {list} | |
$breakpoints: () !global; | |
// Mixins. | |
/// Sets breakpoints. | |
/// @param {map} $x Breakpoints. | |
@mixin breakpoints($x: ()) { | |
$breakpoints: $x !global; | |
} | |
/// Wraps @content in a @media block targeting a specific orientation. | |
/// @param {string} $orientation Orientation. | |
@mixin orientation($orientation) { | |
@media screen and (orientation: #{$orientation}) { | |
@content; | |
} | |
} | |
/// Wraps @content in a @media block using a given query. | |
/// @param {string} $query Query. | |
@mixin breakpoint($query: null) { | |
$breakpoint: null; | |
$op: null; | |
$media: null; | |
// Determine operator, breakpoint. | |
// Greater than or equal. | |
@if (str-slice($query, 0, 2) == '>=') { | |
$op: 'gte'; | |
$breakpoint: str-slice($query, 3); | |
} | |
// Less than or equal. | |
@elseif (str-slice($query, 0, 2) == '<=') { | |
$op: 'lte'; | |
$breakpoint: str-slice($query, 3); | |
} | |
// Greater than. | |
@elseif (str-slice($query, 0, 1) == '>') { | |
$op: 'gt'; | |
$breakpoint: str-slice($query, 2); | |
} | |
// Less than. | |
@elseif (str-slice($query, 0, 1) == '<') { | |
$op: 'lt'; | |
$breakpoint: str-slice($query, 2); | |
} | |
// Not. | |
@elseif (str-slice($query, 0, 1) == '!') { | |
$op: 'not'; | |
$breakpoint: str-slice($query, 2); | |
} | |
// Equal. | |
@else { | |
$op: 'eq'; | |
$breakpoint: $query; | |
} | |
// Build media. | |
@if ($breakpoint and map-has-key($breakpoints, $breakpoint)) { | |
$a: map-get($breakpoints, $breakpoint); | |
// Range. | |
@if (type-of($a) == 'list') { | |
$x: nth($a, 1); | |
$y: nth($a, 2); | |
// Max only. | |
@if ($x == null) { | |
// Greater than or equal (>= 0 / anything) | |
@if ($op == 'gte') { | |
$media: 'screen'; | |
} | |
// Less than or equal (<= y) | |
@elseif ($op == 'lte') { | |
$media: 'screen and (max-width: ' + $y + ')'; | |
} | |
// Greater than (> y) | |
@elseif ($op == 'gt') { | |
$media: 'screen and (min-width: ' + ($y + 1) + ')'; | |
} | |
// Less than (< 0 / invalid) | |
@elseif ($op == 'lt') { | |
$media: 'screen and (max-width: -1px)'; | |
} | |
// Not (> y) | |
@elseif ($op == 'not') { | |
$media: 'screen and (min-width: ' + ($y + 1) + ')'; | |
} | |
// Equal (<= y) | |
@else { | |
$media: 'screen and (max-width: ' + $y + ')'; | |
} | |
} | |
// Min only. | |
@else if ($y == null) { | |
// Greater than or equal (>= x) | |
@if ($op == 'gte') { | |
$media: 'screen and (min-width: ' + $x + ')'; | |
} | |
// Less than or equal (<= inf / anything) | |
@elseif ($op == 'lte') { | |
$media: 'screen'; | |
} | |
// Greater than (> inf / invalid) | |
@elseif ($op == 'gt') { | |
$media: 'screen and (max-width: -1px)'; | |
} | |
// Less than (< x) | |
@elseif ($op == 'lt') { | |
$media: 'screen and (max-width: ' + ($x - 1) + ')'; | |
} | |
// Not (< x) | |
@elseif ($op == 'not') { | |
$media: 'screen and (max-width: ' + ($x - 1) + ')'; | |
} | |
// Equal (>= x) | |
@else { | |
$media: 'screen and (min-width: ' + $x + ')'; | |
} | |
} | |
// Min and max. | |
@else { | |
// Greater than or equal (>= x) | |
@if ($op == 'gte') { | |
$media: 'screen and (min-width: ' + $x + ')'; | |
} | |
// Less than or equal (<= y) | |
@elseif ($op == 'lte') { | |
$media: 'screen and (max-width: ' + $y + ')'; | |
} | |
// Greater than (> y) | |
@elseif ($op == 'gt') { | |
$media: 'screen and (min-width: ' + ($y + 1) + ')'; | |
} | |
// Less than (< x) | |
@elseif ($op == 'lt') { | |
$media: 'screen and (max-width: ' + ($x - 1) + ')'; | |
} | |
// Not (< x and > y) | |
@elseif ($op == 'not') { | |
$media: 'screen and (max-width: ' + ($x - 1) + '), screen and (min-width: ' + ($y + 1) + ')'; | |
} | |
// Equal (>= x and <= y) | |
@else { | |
$media: 'screen and (min-width: ' + $x + ') and (max-width: ' + $y + ')'; | |
} | |
} | |
} | |
// String. | |
@else { | |
// Missing a media type? Prefix with "screen". | |
@if (str-slice($a, 0, 1) == '(') { | |
$media: 'screen and ' + $a; | |
} | |
// Otherwise, use as-is. | |
@else { | |
$media: $a; | |
} | |
} | |
} | |
// Output. | |
@media #{$media} { | |
@content; | |
} | |
} |