/*
	Off-canvas menu
  ---------------

  A generic container that stays fixed to the left, top, right, or bottom of the screen, and is summoned when needed. When an off-canvas panel is open, the app frame shifts over to reveal the menu.
*/
////
/// @group off-canvas
////

// Off-canvas
/// @type Number
$offcanvas-size-horizontal: 250px !default;
/// @type Number
$offcanvas-size-vertical: 250px !default;

/// @type Color
$offcanvas-background: #fff !default;
/// @type Color
$offcanvas-color: isitlight($offcanvas-background) !default;
/// @type Number
$offcanvas-padding: 0 !default;
/// @type Color
$offcanvas-shadow: 3px 0 10px rgba(black, 0.25) !default;
/// @type Number
$offcanvas-animation-speed: 0.25s !default;

/// @type String
$offcanvas-frame-selector: '.grid-frame' !default;
///

%off-canvas {
  position: fixed;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  transition: transform $offcanvas-animation-speed ease-out;
  z-index: 2;

  // Active state
  &.is-active {
    transform: translate(0,0) !important;
  }

  // Frame styles
  & ~ #{$offcanvas-frame-selector} {
    transform: translate(0,0,0);
    transition: transform 0.25s ease-out;
    backface-visibility: hidden;
    background: white;
  }
}
@mixin off-canvas-detached {
  z-index: 0;
  box-shadow: none;

  &, &.is-active {
    transform: none;
  }

  & ~ #{$offcanvas-frame-selector} {
    z-index: 1;
    box-shadow: 0 0 15px rgba(0,0,0,0.5);
  }
}

@mixin off-canvas-layout(
  $position: left,
  $size: default,
  $shadow: $offcanvas-shadow
) {
  /*
    Get shadow values for later use
  */
  $shadow-length: '';
  $shadow-size: '';
  $shadow-color: '';
  @if hasvalue($shadow) {
    $shadow-length: get-shadow-value($shadow, x);
    $shadow-size: get-shadow-value($shadow, size);
    $shadow-color: get-shadow-value($shadow, color);
  }

  /*
    Sizing
  */
  @if $position == left or $position == right {
    @if $size == default {
      $size: $offcanvas-size-horizontal;
    }
    width: $size;
    height: 100%;
  }
  @else {
    @if $size == default {
      $size: $offcanvas-size-vertical;
    }
    height: $size;
    width: 100%;
  }

  /*
    Positioning
  */
  @if $position == left {
    top: 0;
    left: 0;
    @if hasvalue($shadow) { box-shadow: inset (-$shadow-length) 0 $shadow-size $shadow-color; }
    transform: translateX(-100%);
    &.is-active {
      & ~ #{$offcanvas-frame-selector} { transform: translateX($size) !important; }
    }
  }
  @else if $position == right {
    left: auto;
    top: 0;
    right: 0;
    @if hasvalue($shadow) { box-shadow: inset $shadow-length 0 $shadow-size $shadow-color; }
    transform: translateX(100%);
    &.is-active {
      & ~ #{$offcanvas-frame-selector} { transform: translateX(-$size) !important; }
    }
  }
  @else if $position == top {
    top: 0;
    left: 0;
    transform: translateY(-100%);
    @if hasvalue($shadow) { box-shadow: inset 0 (-$shadow-length) $shadow-size $shadow-color; }
    &.is-active {
      & ~ #{$offcanvas-frame-selector} { transform: translateY($size) !important; }
    }
  }
  @else if $position == bottom {
    top: auto;
    bottom: 0;
    left: 0;
    transform: translateY(100%);
    @if hasvalue($shadow) { box-shadow: inset 0 $shadow-length $shadow-size $shadow-color; }
    &.is-active {
      & ~ #{$offcanvas-frame-selector} { transform: translateY(-$size) !important; }
    }
  }
}

@mixin off-canvas-style(
  $background: $offcanvas-background,
  $color: $offcanvas-color,
  $padding: $offcanvas-padding
) {
  background: $background;

  @if $color == auto {
    color: isitlight($background, #000, #fff);
  }
  @else {
    color: $color;
  }

  @if hasvalue($padding) {
    padding: $padding;
  }
}

@include exports(off-canvas) {
  .off-canvas {
    @extend %off-canvas;
    @include off-canvas-layout;
    @include off-canvas-style;

    &.top    { @include off-canvas-layout(top); }
    &.right  { @include off-canvas-layout(right); }
    &.bottom { @include off-canvas-layout(bottom); }
    &.left   { @include off-canvas-layout(left); }

    &.detached { @include off-canvas-detached; }

    &.primary { @include off-canvas-style($primary-color, auto); }
    &.dark    { @include off-canvas-style($dark-color, auto); }
  }
}
