@charset "UTF-8";

/**
 * This code is modified from Material Design Lite _grid.sass,
 * which is Licensed under the Apache License, Version 2.0
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

///////////////////////////////////////////////////////////////////////
//
// Grid media queries, modified from Material Design Lite _grid.sass
//
///////////////////////////////////////////////////////////////////////
// Use of this module requires the user to include variables from material-design-lite in hers/his main SASS module
//@import "../../node_modules/material-design-lite/src/variables";


.mdlext-grid {
  display: flex;
  flex-flow: row wrap;
  margin: 0 auto;
  align-items: stretch;

  &.mdlext-grid--no-spacing {
    padding: 0;
  }
}

.mdlext-cell {
  box-sizing: border-box;
}


.mdlext-cell--top {
  align-self: flex-start;
}

.mdlext-cell--middle {
  align-self: center;
}

.mdlext-cell--bottom {
  align-self: flex-end;
}

.mdlext-cell--stretch {
  align-self: stretch;
}

.mdlext-grid.mdlext-grid--no-spacing > .mdlext-cell {
  margin: 0;
}

// Define order override classes.
@for $i from 1 through $grid-max-columns {
  .mdlext-cell--order-#{$i} {
    order: $i;
  }
}


// Mixins for width calculation.
@mixin partial-size($size, $columns, $gutter) {
  width: calc(#{(($size / $columns) * 100) + "%"} - #{$gutter});

  .mdlext-grid--no-spacing > & {
    width: #{(($size / $columns) * 100) + "%"};
  }
}

@mixin full-size($gutter) {
  @include partial-size(1, 1, $gutter);
}

@mixin offset-size($size, $columns, $gutter) {
  margin-left: calc(#{(($size / $columns) * 100) + "%"} + #{$gutter / 2});

  .mdlext-grid.mdlext-grid--no-spacing > & {
    margin-left: #{(($size / $columns) * 100) + "%"};
  }
}



////////// Phone //////////

/* stylelint-disable */
@media (max-width: $grid-tablet-breakpoint - 1) {
/* stylelint-enable */
  .mdlext-grid {
    padding: $grid-phone-margin - ($grid-phone-gutter / 2);
  }

  .mdlext-cell {
    margin: $grid-phone-gutter / 2;
    @include partial-size($grid-cell-default-columns, $grid-phone-columns, $grid-phone-gutter);
  }

  .mdlext-cell--hide-phone {
    display: none !important;
  }

  // Define order override classes.
  @for $i from 1 through $grid-max-columns {
    .mdlext-cell--order-#{$i}-phone.mdlext-cell--order-#{$i}-phone {
      order: $i;
    }
  }

  // Define partial sizes for columnNumber < totalColumns.
  @for $i from 1 through ($grid-phone-columns - 1) {
    .mdlext-cell--#{$i}-col,
    .mdlext-cell--#{$i}-col-phone.mdlext-cell--#{$i}-col-phone {
      @include partial-size($i, $grid-phone-columns, $grid-phone-gutter);
    }
  }

  // Define 100% for everything else.
  @for $i from $grid-phone-columns through $grid-desktop-columns {
    .mdlext-cell--#{$i}-col,
    .mdlext-cell--#{$i}-col-phone.mdlext-cell--#{$i}-col-phone {
      @include full-size($grid-phone-gutter);
    }
  }

  // Define valid phone offsets.
  @for $i from 1 through ($grid-phone-columns - 1) {
    .mdlext-cell--#{$i}-offset,
    .mdlext-cell--#{$i}-offset-phone.mdlext-cell--#{$i}-offset-phone {
      @include offset-size($i, $grid-phone-columns, $grid-phone-gutter);
    }
  }
}


////////// Tablet //////////

/* stylelint-disable */
@media (min-width: $grid-tablet-breakpoint) and (max-width: $grid-desktop-breakpoint - 1) { /* stylelint-enable */
  .mdlext-grid {
    padding: $grid-tablet-margin - ($grid-tablet-gutter / 2);
  }

  .mdlext-cell {
    margin: $grid-tablet-gutter / 2;
    @include partial-size($grid-cell-default-columns, $grid-tablet-columns, $grid-tablet-gutter);
  }

  .mdlext-cell--hide-tablet {
    display: none !important;
  }

  // Define order override classes.
  @for $i from 1 through $grid-max-columns {
    .mdlext-cell--order-#{$i}-tablet.mdlext-cell--order-#{$i}-tablet {
      order: $i;
    }
  }

  // Define partial sizes for columnNumber < totalColumns.
  @for $i from 1 through ($grid-tablet-columns - 1) {
    .mdlext-cell--#{$i}-col,
    .mdlext-cell--#{$i}-col-tablet.mdlext-cell--#{$i}-col-tablet {
      @include partial-size($i, $grid-tablet-columns, $grid-tablet-gutter);
    }
  }

  // Define 100% for everything else.
  @for $i from $grid-tablet-columns through $grid-desktop-columns {
    .mdlext-cell--#{$i}-col,
    .mdlext-cell--#{$i}-col-tablet.mdlext-cell--#{$i}-col-tablet {
      @include full-size($grid-tablet-gutter);
    }
  }

  // Define valid tablet offsets.
  @for $i from 1 through ($grid-tablet-columns - 1) {
    .mdlext-cell--#{$i}-offset,
    .mdlext-cell--#{$i}-offset-tablet.mdlext-cell--#{$i}-offset-tablet {
      @include offset-size($i, $grid-tablet-columns, $grid-tablet-gutter);
    }
  }
}


////////// Desktop //////////

@media (min-width: $grid-desktop-breakpoint) {
  .mdlext-grid {
    padding: $grid-desktop-margin - ($grid-desktop-gutter / 2);
  }

  .mdlext-cell {
    margin: $grid-desktop-gutter / 2;
    @include partial-size($grid-cell-default-columns, $grid-desktop-columns, $grid-desktop-gutter);
  }

  .mdlext-cell--hide-desktop {
    display: none !important;
  }

  // Define order override classes.
  @for $i from 1 through $grid-max-columns {
    .mdlext-cell--order-#{$i}-desktop.mdlext-cell--order-#{$i}-desktop {
      order: $i;
    }
  }

  // Define partial sizes for all numbers of columns.
  @for $i from 1 through $grid-desktop-columns {
    .mdlext-cell--#{$i}-col,
    .mdlext-cell--#{$i}-col-desktop.mdlext-cell--#{$i}-col-desktop {
      @include partial-size($i, $grid-desktop-columns, $grid-desktop-gutter);
    }
  }

  // Define valid desktop offsets.
  @for $i from 1 through ($grid-desktop-columns - 1) {
    .mdlext-cell--#{$i}-offset,
    .mdlext-cell--#{$i}-offset-desktop.mdlext-cell--#{$i}-offset-desktop {
      @include offset-size($i, $grid-desktop-columns, $grid-desktop-gutter);
    }
  }
}

