/// Modifies a grid to give it "frame" behavior (no overflow, no wrap, stretch behavior) /// /// @param {Boolean} $vertical [false] - Is grid vertical or horizontal. Should match grid. /// @param {Boolean} $nested [false] - Is grid nested or not. If nested is true this sets the frame to 100% height, otherwise will be 100vh. /// @param {Number|Map} $gutters [null] - Map or single value for gutters. /// @param {String} $breakpoint [null] - The name of the breakpoint size in your gutters map to get the size from. /// @param {Boolean} $include-base [true] - Include the base styles that don't vary per breakpoint. @mixin xy-grid-frame( $vertical: false, $nested: false, $gutters: null, $breakpoint: null, $include-base: true ) { @if $include-base { overflow: hidden; position: relative; flex-wrap: nowrap; align-items: stretch; } @if $breakpoint == null and type-of($gutters) == 'map' { @include -zf-each-breakpoint() { @include xy-grid-frame($vertical, $nested, $gutters, $-zf-size, false); } } @else { // Get our gutters if applicable $gutter: -zf-get-bp-val($gutters, $breakpoint); // If we have a gutter, add it to the width/height @if $gutter { @if $vertical == true { $unit: if($nested == true, 100%, 100vh); $gutter: rem-calc($gutter); height: calc(#{$unit} + #{$gutter}); } @else { $unit: if($nested == true, 100%, 100vw); $gutter: rem-calc($gutter); width: calc(#{$unit} + #{$gutter}); } } @else { @if $vertical == true { height: if($nested == true, 100%, 100vh); } @else { width: if($nested == true, 100%, 100vw); } } } } /// Modifies a cell to give it "block" behavior (overflow auto, inertial scrolling) /// /// @param {Boolean} $vertical [false] - Is grid vertical or horizontal. Should match grid. @mixin xy-cell-block( $vertical: false ) { $property: if($vertical == true, 'overflow-y', 'overflow-x'); @if $vertical == true { overflow-y: auto; max-height: 100%; min-height: 100%; } @else { overflow-x: auto; max-width: 100%; } -webkit-overflow-scrolling: touch; -ms-overflow-style: -ms-autohiding-scrollbar; } /// Container for inside a grid frame containing multiple blocks. Typically used /// as a modifier for a `.cell` to allow the cell to pass along flex sizing /// constraints / from parents to children. @mixin xy-cell-block-container() { display: flex; flex-direction: column; max-height: 100%; > .grid-x { max-height: 100%; flex-wrap: nowrap; } }