@mixin tabs-horizontal($direction) {
  flex-direction: column;

  &.#{$rd-prefix}tabs--center {
    @include e(tab) {
      @include m(first) {
        margin-left: auto;
      }

      @include m(last) {
        margin-right: auto;
      }
    }
  }

  &:not(.#{$rd-prefix}tabs--slider) {
    @include e(button) {
      @include m(add) {
        @if $direction == top {
          border-bottom-color: transparent;
        } @else {
          border-top-color: transparent;
        }
      }
    }
  }

  @include e(tabpanel) {
    @if $direction == top {
      margin-top: 20px;
    } @else {
      margin-bottom: 20px;
    }
  }

  @include e(tablist-wrapper) {
    width: 100%;
    overflow: auto hidden;

    @if $direction == top {
      padding-bottom: 2px;
    } @else {
      padding-top: 2px;
    }
  }

  @include e(tablist) {
    min-width: 100%;

    & > * + *:not(.#{$rd-prefix}tabs__indicator) {
      margin-left: var(--#{$rd-prefix}tabs-tab-gap);
    }

    &::after {
      left: 0;
      width: 100%;
      height: 1px;

      @if $direction == top {
        bottom: -1px;
      } @else {
        top: -1px;
      }
    }
  }

  @include e(indicator) {
    left: 0;
    width: 0;
    height: 2px;
    transition: left var(--#{$rd-prefix}animation-duration-slow) linear, opacity var(--#{$rd-prefix}animation-duration-base) linear,
      width var(--#{$rd-prefix}animation-duration-base) linear;

    @if $direction == top {
      bottom: -2px;
    } @else {
      top: -2px;
    }
  }
  @include e(slider-indicator) {
    left: 0;
    width: 0;
    height: 100%;
    transition: left var(--#{$rd-prefix}animation-duration-slow) linear, opacity var(--#{$rd-prefix}animation-duration-base) linear,
      width var(--#{$rd-prefix}animation-duration-base) linear;
  }
  @include e(wrap-indicator) {
    left: 0;
    width: 0;
    height: calc(100% + 1px);
    transition: left var(--#{$rd-prefix}animation-duration-slow) linear, opacity var(--#{$rd-prefix}animation-duration-base) linear,
      width var(--#{$rd-prefix}animation-duration-base) linear;

    @if $direction == top {
      top: 0;
      border-bottom: none;
      border-radius: var(--#{$rd-prefix}border-radius) var(--#{$rd-prefix}border-radius) 0 0;
    } @else {
      bottom: 0;
      border-top: none;
      border-radius: 0 0 var(--#{$rd-prefix}border-radius) var(--#{$rd-prefix}border-radius);
    }
  }

  @include e(button-container) {
    right: 0;
  }

  @include e(button) {
    width: 52px;
    height: var(--#{$rd-prefix}tabs-tab-size);

    @include m(more) {
      box-shadow: -3px 0 8px -2px var(--#{$rd-prefix}shadow-color);

      @include when(end) {
        border-left-color: var(--#{$rd-prefix}background-color-indicator);
      }
    }
  }
}

@mixin tabs-vertical($direction) {
  flex-direction: row;

  &.#{$rd-prefix}tabs--center {
    @include e(tab) {
      @include m(first) {
        margin-top: auto;
      }

      @include m(last) {
        margin-bottom: auto;
      }
    }
  }

  @include e(tabpanel) {
    flex-grow: 1;
    overflow: hidden;

    @if $direction == left {
      margin-left: 20px;
    } @else {
      margin-right: 20px;
    }
  }

  @include e(tab) {
    padding: 0 var(--#{$rd-prefix}tabs-tab-padding);

    @if $direction == left {
      justify-content: flex-end;
    } @else {
      justify-content: flex-start;
    }
  }

  @include e(button) {
    @include m(add) {
      border-right-color: transparent;
      border-left-color: transparent;
    }
  }

  @include e(tablist-wrapper) {
    flex-shrink: 0;
    overflow: hidden auto;

    @if $direction == left {
      padding-right: 2px;
    } @else {
      padding-left: 2px;
    }
  }

  @include e(tablist) {
    flex-direction: column;

    &::after {
      top: 0;
      width: 1px;
      height: 100%;

      @if $direction == left {
        right: -1px;
      } @else {
        left: -1px;
      }
    }
  }

  @include e(indicator) {
    top: 0;
    width: 2px;
    height: var(--#{$rd-prefix}tabs-tab-size);
    transition: top var(--#{$rd-prefix}animation-duration-slow) linear, opacity var(--#{$rd-prefix}animation-duration-base) linear;

    @if $direction == left {
      right: -2px;
    } @else {
      left: -2px;
    }
  }

  @include e(slider-indicator) {
    top: 0;
    width: 100%;
    height: var(--#{$rd-prefix}tabs-tab-size);
    transition: top var(--#{$rd-prefix}animation-duration-slow) linear, opacity var(--#{$rd-prefix}animation-duration-base) linear;
  }

  @include e(wrap-indicator) {
    top: 0;
    width: calc(100% + 1px);
    height: var(--#{$rd-prefix}tabs-tab-size);
    transition: top var(--#{$rd-prefix}animation-duration-slow) linear, opacity var(--#{$rd-prefix}animation-duration-base) linear;

    @if $direction == left {
      left: 0;
      border-right: none;
      border-radius: 0 var(--#{$rd-prefix}border-radius) var(--#{$rd-prefix}border-radius) 0;
    } @else {
      right: 0;
      border-left: none;
      border-radius: var(--#{$rd-prefix}border-radius) 0 0 var(--#{$rd-prefix}border-radius);
    }
  }

  @include e(button-container) {
    bottom: 0;
    flex-direction: column;
    width: 100%;
  }

  @include e(button) {
    width: 100%;
    height: 36px;

    @include m(more) {
      box-shadow: 0 -3px 8px -2px var(--#{$rd-prefix}shadow-color);
      @include when(end) {
        border-top-color: var(--#{$rd-prefix}background-color-indicator);
      }
    }
  }
}

@include b(tabs) {
  $selector: &;

  --#{$rd-prefix}tabs-tab-size: 44px;
  --#{$rd-prefix}tabs-slider-tab-size: 36px;
  --#{$rd-prefix}tabs-tab-padding: 16px;

  position: relative;
  display: flex;

  &:not(.#{$rd-prefix}tabs--slider):not(.#{$rd-prefix}tabs--wrap) {
    --#{$rd-prefix}tabs-tab-gap: 32px;
  }

  @include m(top) {
    @include tabs-horizontal(top);
  }

  @include m(bottom) {
    @include tabs-horizontal(bottom);
  }

  @include m(left) {
    @include tabs-vertical(left);
  }

  @include m(right) {
    @include tabs-vertical(right);
  }

  @include m(smaller) {
    --#{$rd-prefix}tabs-tab-size: 36px;
    --#{$rd-prefix}tabs-slider-tab-size: 32px;
    --#{$rd-prefix}tabs-tab-padding: 12px;

    @include font-size(0.9rem);

    &:not(.#{$rd-prefix}tabs--slider):not(.#{$rd-prefix}tabs--wrap) {
      --#{$rd-prefix}tabs-tab-gap: 20px;
    }
  }

  @include m(larger) {
    --#{$rd-prefix}tabs-tab-size: 52px;
    --#{$rd-prefix}tabs-slider-tab-size: 44px;
    --#{$rd-prefix}tabs-tab-padding: 20px;

    @include font-size(1.15rem);

    &:not(.#{$rd-prefix}tabs--slider):not(.#{$rd-prefix}tabs--wrap) {
      --#{$rd-prefix}tabs-tab-gap: 36px;
    }
  }

  @include m(slider) {
    --#{$rd-prefix}tabs-tab-size: var(--#{$rd-prefix}tabs-slider-tab-size);
    --#{$rd-prefix}tabs-tab-gap: 0;

    &#{$selector}--top,
    &#{$selector}--bottom {
      @include e(tab) {
        padding: 0 var(--#{$rd-prefix}tabs-tab-padding);
      }
    }

    @include e(tablist-wrapper) {
      padding: 0;
      border-radius: var(--#{$rd-prefix}border-radius);
    }

    @include e(tablist) {
      min-width: unset;
      background-color: var(--#{$rd-prefix}tabs-background-color-slider);

      &::after {
        content: none;
      }
    }
  }

  @include m(wrap) {
    --#{$rd-prefix}tabs-tab-gap: 0;

    &#{$selector}--top,
    &#{$selector}--bottom {
      @include e(tab) {
        padding: 0 var(--#{$rd-prefix}tabs-tab-padding);
      }
    }
  }

  @include e(tablist-wrapper) {
    position: relative;
  }

  @include e(tablist) {
    position: relative;
    display: inline-flex;

    &::after {
      position: absolute;
      content: '';
      background-color: var(--#{$rd-prefix}background-color-indicator);
    }
  }

  @include e(indicator) {
    position: absolute;
    z-index: 1;
    pointer-events: none;
    background-color: var(--#{$rd-prefix}color-primary);
    opacity: 0;
  }

  @include e(button-container) {
    position: sticky;
    z-index: 6;
    display: flex;
    flex-wrap: nowrap;
  }

  @include e(button) {
    display: inline-flex;
    flex-shrink: 0;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    background-color: var(--#{$rd-prefix}background-color);
    transition: color var(--#{$rd-prefix}animation-duration-base) linear;

    &:hover,
    &:focus {
      color: var(--#{$rd-prefix}color-primary-lighter);
    }

    &:active {
      color: var(--#{$rd-prefix}color-primary-darker);
    }

    @include when(disabled) {
      color: var(--#{$rd-prefix}color-disabled);
      pointer-events: none;
    }

    @include m(add) {
      border: 1px solid var(--#{$rd-prefix}background-color-indicator);
    }

    @include m(more) {
      border: 1px solid transparent;
      transition: color var(--#{$rd-prefix}animation-duration-base) linear, box-shadow var(--#{$rd-prefix}animation-duration-base) linear;

      @include when(end) {
        box-shadow: none;
      }
    }
  }

  @include e(slider-indicator) {
    position: absolute;
    z-index: 1;
    pointer-events: none;
    opacity: 0;

    &::after {
      position: absolute;
      top: 3px;
      right: 3px;
      bottom: 3px;
      left: 3px;
      content: '';
      background-color: var(--#{$rd-prefix}background-color);
      border-radius: var(--#{$rd-prefix}border-radius);
      box-shadow: 0 2px 4px 0 var(--#{$rd-prefix}shadow-color);
    }
  }

  @include e(wrap-indicator) {
    position: absolute;
    z-index: 1;
    pointer-events: none;
    background-color: var(--#{$rd-prefix}background-color-light-gray);
    border: 1px solid var(--#{$rd-prefix}background-color-indicator);
    opacity: 0;
  }

  @include e(dropdown-item) {
    @include when(active) {
      color: var(--#{$rd-prefix}color-primary);
    }
  }

  @include e(tab) {
    position: relative;
    z-index: 5;
    display: inline-flex;
    flex-shrink: 0;
    align-items: center;
    height: var(--#{$rd-prefix}tabs-tab-size);
    cursor: pointer;
    transition: color var(--#{$rd-prefix}animation-duration-base) linear;

    &:focus,
    &:hover {
      color: var(--#{$rd-prefix}color-primary-lighter);
    }

    @include when(active) {
      color: var(--#{$rd-prefix}color-primary);
    }

    @include when(disabled) {
      pointer-events: none;
      filter: opacity(50%);
    }
  }

  @include e(close) {
    margin: 0 0 0 4px;
    transition: color var(--#{$rd-prefix}animation-duration-base) linear;

    &:hover,
    &:focus {
      color: var(--#{$rd-prefix}color-primary-lighter);
    }

    &:active {
      color: var(--#{$rd-prefix}color-primary-darker);
    }
  }

  @include e(tabpanel) {
    outline: none;
  }
}
