////////////////////////////// // Private Breakpoint Variables ////////////////////////////// $private-breakpoint-context-holder: (); $private-breakpoint-query-count: 0 !default; ////////////////////////////// // Breakpoint Has Context // Returns whether or not you are inside a Breakpoint query ////////////////////////////// @function breakpoint-has-context() { @if length($private-breakpoint-query-count) { @return true; } @else { @return false; } } ////////////////////////////// // Breakpoint Get Context // $feature: Input feature to get it's current MQ context. Returns false if no context ////////////////////////////// @function breakpoint-get-context($feature) { @if map-has-key($private-breakpoint-context-holder, $feature) { $get: map-get($private-breakpoint-context-holder, $feature); // Special handling of no-query from get side so /false/ prepends aren't returned @if $feature == 'no-query' { @if type-of($get) == 'list' and length($get) > 1 and nth($get, 1) == false { $get: nth($get, length($get)); } } @return $get; } @else { @if breakpoint-has-context() and $feature == 'media' { @return breakpoint-get('default media'); } @else { @return false; } } } ////////////////////////////// // Private function to set context ////////////////////////////// @function private-breakpoint-set-context($feature, $value) { @if $value == 'monochrome' { $feature: 'monochrome'; } $current: map-get($private-breakpoint-context-holder, $feature); @if $current and length($current) == $private-breakpoint-query-count { @warn "You have already queried against `#{$feature}`. Unexpected things may happen if you query against the same feature more than once in the same `and` query. Breakpoint is overwriting the current context with `#{$value}`"; } @if not map-has-key($private-breakpoint-context-holder, $feature) { $v-holder: (); @for $i from 1 to $private-breakpoint-query-count { @if $feature == 'media' { $v-holder: append($v-holder, breakpoint-get('default media')); } @else { $v-holder: append($v-holder, false); } } $v-holder: append($v-holder, $value); $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; } @else { $v-holder: map-get($private-breakpoint-context-holder, $feature); $length: length($v-holder); @for $i from $length to $private-breakpoint-query-count - 1 { @if $feature == 'media' { $v-holder: append($v-holder, breakpoint-get('default media')); } @else { $v-holder: append($v-holder, false); } } $v-holder: append($v-holder, $value); $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; } @return true; } ////////////////////////////// // Private function to reset context ////////////////////////////// @mixin private-breakpoint-reset-contexts { $private-breakpoint-context-holder: () !global; $private-breakpoint-query-count: 0 !global; }