Initial commit
[editorial.git] / assets / main / sass / libs / _breakpoints.scss
diff --git a/assets/main/sass/libs/_breakpoints.scss b/assets/main/sass/libs/_breakpoints.scss
new file mode 100644 (file)
index 0000000..c5301d8
--- /dev/null
@@ -0,0 +1,223 @@
+// 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;
+                       }
+
+       }
\ No newline at end of file