@import "../../themes/ionic.globals";
@import "../../themes/ionic.mixins";

// Responsive Mixins
// --------------------------------------------------

// Creates a grid with padding
// ---------------------------------------------------------------------------------

@mixin make-grid($padding-width: $grid-padding-width) {
  @include padding($padding-width / 2);
  @include margin-horizontal(auto);

  width: 100%;

  display: flex;

  flex-direction: column;

  // Remove the padding from the grid and all immediate children columns
  &[no-padding] {
    @include padding(0);

    > .row > .col {
      @include padding(0);
    }
  }
}

// Creates maximum widths for the grid based on screen size
// ---------------------------------------------------------------------------------

@mixin make-grid-max-widths($max-widths: $grid-max-widths, $breakpoints: $grid-breakpoints) {
  @each $breakpoint, $container-max-width in $max-widths {
    @include media-breakpoint-up($breakpoint, $breakpoints) {
      width: $container-max-width;
      max-width: 100%;
    }
  }
}

// Creates a row used to align columns
// ---------------------------------------------------------------------------------

@mixin make-row() {
  display: flex;
  flex-wrap: wrap;

  &[nowrap] {
    flex-wrap: nowrap;
  }

  &[wrap-reverse] {
    flex-wrap: wrap-reverse;
  }

  &[align-items-start] {
    align-items: flex-start;
  }

  &[align-items-center] {
    align-items: center;
  }

  &[align-items-end] {
    align-items: flex-end;
  }

  &[align-items-stretch] {
    align-items: stretch;
  }

  &[align-items-baseline] {
    align-items: baseline;
  }

  &[justify-content-start] {
    justify-content: flex-start;
  }

  &[justify-content-center] {
    justify-content: center;
  }

  &[justify-content-end] {
    justify-content: flex-end;
  }

  &[justify-content-around] {
    justify-content: space-around;
  }

  &[justify-content-between] {
    justify-content: space-between;
  }
}


// Creates the base column which has shared styles among all columns
// ---------------------------------------------------------------------------------

@mixin make-column-base($padding-width: $grid-padding-width) {
  @include padding($padding-width / 2);

  position: relative;

  width: 100%;
  @include margin(0);
  min-height: 1px; // Prevent columns from collapsing when empty
  flex-basis: 0;
  flex-grow: 1;
  max-width: 100%;

  &[align-self-start] {
    align-self: flex-start;
  }

  &[align-self-end] {
    align-self: flex-end;
  }

  &[align-self-center] {
    align-self: center;
  }

  &[align-self-stretch] {
    align-self: stretch;
  }

  &[align-self-baseline] {
    align-self: baseline;
  }
}


// Create an individual column
// ---------------------------------------------------------------------------------

@mixin make-column($size, $columns: $grid-columns) {
  flex: 0 0 percentage($size / $columns);
  width: percentage($size / $columns);
  // Add a `max-width` to ensure content within each column does not blow out
  // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
  // do not appear to require this.
  max-width: percentage($size / $columns);
}


// Adds padding to the column
// ---------------------------------------------------------------------------------

@mixin make-column-padding($padding-widths: $grid-padding-widths) {
  @each $breakpoint in map-keys($padding-widths) {
    @include media-breakpoint-up($breakpoint) {
      $padding-width: map-get($padding-widths, $breakpoint);
      @include padding($padding-width / 2);
    }
  }
}


// Offset the column using margin-start
// ---------------------------------------------------------------------------------

@mixin make-column-offset($size, $columns: $grid-columns) {
  @include margin-horizontal(percentage($size / $columns), null);
}


// Push the column using left
// ---------------------------------------------------------------------------------

@mixin make-column-push($size, $columns: $grid-columns) {
  @include position(null, null, null, if($size > 0, percentage($size / $columns), auto));
}


// Pull the column using right
// ---------------------------------------------------------------------------------

@mixin make-column-pull($size, $columns: $grid-columns) {
  @include position(null, if($size > 0, percentage($size / $columns), auto), null, null);
}


// Determine which modifier to add
// ---------------------------------------------------------------------------------

@mixin make-column-modifier($type, $size, $columns) {
  // Work around the lack of dynamic mixin @include support (https://github.com/sass/sass/issues/626)
  @if $type == push {
    @include make-column-push($size, $columns);
  } @else if $type == pull {
    @include make-column-pull($size, $columns);
  } @else if $type == offset {
    @include make-column-offset($size, $columns);
  }
}


// Create the responsive grid columns
// --------------------------------------------------

@mixin make-grid-columns($columns: $grid-columns, $padding-widths: $grid-padding-widths, $breakpoints: $grid-breakpoints) {
  @each $breakpoint in map-keys($breakpoints) {
    $infix: breakpoint-infix($breakpoint, $breakpoints);

    // Allow columns to stretch full width below their breakpoints
    @for $i from 1 through $columns {
      [col#{$infix}-#{$i}] {
        @include make-column-padding($padding-widths);
      }
    }

    [col#{$infix}] {
      @include make-column-padding($padding-widths);
    }

    @include media-breakpoint-up($breakpoint, $breakpoints) {
      // Provide basic `[col-{bp}]` attributes for equal-width flexbox columns
      [col#{$infix}] {
        flex-basis: 0;
        flex-grow: 1;

        max-width: 100%;
      }

      [col#{$infix}-auto] {
        flex: 0 0 auto;

        width: auto;
      }

      @for $i from 1 through $columns {
        [col#{$infix}-#{$i}] {
          @include make-column($i, $columns);
        }
      }

      @each $modifier in (pull, push) {
        @for $i from 0 through $columns {
          [#{$modifier}#{$infix}-#{$i}] {
            @include make-column-modifier($modifier, $i, $columns)
          }
        }
      }

      // `$columns - 1` because offsetting by the width of an entire row isn't possible
      @for $i from 0 through ($columns - 1) {
        @if not ($infix == "" and $i == 0) { // Avoid emitting useless [offset-xs-0]
          [offset#{$infix}-#{$i}] {
            @include make-column-modifier(offset, $i, $columns)
          }
        }
      }
    }
  }
}
