223 lines
4.7 KiB
SCSS
223 lines
4.7 KiB
SCSS
// 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;
|
|
}
|
|
|
|
} |