// --------------------------------------------------------------------------- // Media Mixins // Create a new layout context for (@content) descendants. // // $layout-cols : a (unitless) number of columns to use for this layout. @mixin layout( $layout-cols ) { // store default $total-columns setting for later, then change it. $default-layout : $total-columns; $total-columns : $layout-cols; // apply children in this new layout context. @content; // return to default $total-columns setting. $total-columns : $default-layout; } // Nest a block of code inside a new media-query and layout context. // // $media-layout : a list of values [$min $layout $max $ie] including... // : - one unitless number (columns in a layout) // : - two optional lengths (min and max-width media-query breakpoints). // : - one optional boolean or string to trigger fallback support for IE. // $font-size : [optional] The base font-size of your layout, if you are using ems. // : - defaults to $base-font-size @mixin at-breakpoint( $media-layout, $font-size: $base-font-size ) { $media-layout : medialayout($media-layout,$font-size); $min : nth($media-layout,1); $layout : nth($media-layout,2); $max : nth($media-layout,3); $ie : nth($media-layout,4); @if (not $breakpoint-media-output) and (not $breakpoint-ie-output) and (not $breakpoint-raw-output) { @warn "Either $breakpoint-media-output, $breakpoint-ie-output, or $breakpoint-raw-output must be true for at-breakpoint to work."; } // We need to have either a min-width breakpoint or a layout in order to proceed. @if $min or $layout or $max { // If we don't have a layout, we create one based on the min-width. @if not $layout { $layout: get-layout($min); } // If we still don't have a layout, we have a problem. @if $layout { // Set our new layout context. @include layout($layout) { @if $breakpoint-media-output { // Capture current state of ie support and set new $atbreak-legacy-ie-matrix: capture-legacy-ie-matrix(); @include set-legacy-ie-support; @if $min and $max { // Both $min and $max @media (min-width: $min) and (max-width: $max) { @content; } } @else { @if (not $min) and (not $max) { // Neither $min nor $max: // We can create a breakpoint based on the number of columns in the layout. $min: fix-ems(container-outer-width($width: false)); } @if $min { // Min only: @media (min-width: $min) { @content; } } @else { // Max only: @media (max-width: $max) { @content; } } } // Return legacy-ie support to original @include set-legacy-ie-support($atbreak-legacy-ie-matrix...); } // Set an IE fallback @if $ie and $breakpoint-ie-output { @if (type-of($ie) == 'bool') { $ie: 'lt-ie9'; } .#{$ie} & { $atbreak-experimental-matrix: capture-experimental-matrix(); @include set-experimental-support($ms: true); @content; @include set-experimental-support($atbreak-experimental-matrix...); } } @if $breakpoint-raw-output { @content; } } } @else { @warn "Something went horribly wrong here. Try adjusting your variables."; } } @else { @warn "You need to provide either a valid layout (number of columns) or a valid media-query min-width breakpoint (length)."; } }