////
/// Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>
///
/// Permission is hereby granted, free of charge, to any person obtaining a
/// copy of this software and associated documentation files (the "Software"),
/// to deal in the Software without restriction, including without limitation
/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
/// and/or sell copies of the Software, and to permit persons to whom the
/// Software is furnished to do so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in
/// all copies or substantial portions of the Software.
///
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
/// DEALINGS
////

// ----------------------------------------------------------------------------
// Rules
// ----------------------------------------------------------------------------

// Icon definitions
:root {
  --md-nav-icon--prev: svg-load("@mdi/svg/svg/arrow-left.svg");
  --md-nav-icon--next: svg-load("@mdi/svg/svg/chevron-right.svg");
  --md-toc-icon: svg-load("@mdi/svg/svg/table-of-contents.svg");
}

// ----------------------------------------------------------------------------

// Navigation container
.md-nav {
  font-size: px2rem(14px);
  line-height: 1.3;

  // List title
  &__title {
    display: block;
    padding: 0 px2rem(12px);
    overflow: hidden;
    font-weight: 700;
    text-overflow: ellipsis;

    // Hide buttons by default
    .md-nav__button {
      display: none;

      // Stretch images
      img {
        width: 100%;
        height: auto;
      }

      // Logo
      &.md-logo {

        // Image or icon
        img,
        svg {
          display: block;
          width: px2rem(48px);
          height: px2rem(48px);
        }

        // Icon
        svg {
          fill: currentColor;
        }
      }
    }
  }

  // List of items
  &__list {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  // List item
  &__item {
    padding: 0 px2rem(12px);

    // Add bottom spacing to last item
    &:last-child {
      padding-bottom: px2rem(12px);
    }

    // 2nd+ level items
    & & {
      padding-right: 0;

      // Adjust for right-to-left languages
      [dir="rtl"] & {
        padding-right: px2rem(12px);
        padding-left: 0;
      }

      // Remove bottom spacing for nested items
      &:last-child {
        padding-bottom: 0;
      }
    }
  }

  // Link inside item
  &__link {
    display: block;
    margin-top: 0.625em;
    overflow: hidden;
    text-overflow: ellipsis;
    cursor: pointer;
    transition: color 125ms;
    scroll-snap-align: start;

    // Hide link to table of contents by default - this will only match the
    // table of contents inside the drawer below and including tablet portrait
    html &[for="__toc"] {
      display: none;

      // Hide table of contents by default
      & ~ .md-nav {
        display: none;
      }
    }

    // Blurred link
    &[data-md-state="blur"] {
      color: var(--md-default-fg-color--light);
    }

    // Active link
    .md-nav__item &--active {
      color: var(--md-typeset-a-color);
    }

    // Reset active color for nested list titles
    .md-nav__item--nested > & {
      color: inherit;
    }

    // Focused or hovered link
    &:focus,
    &:hover {
      color: var(--md-accent-fg-color);
    }
  }

  // Repository containing source
  &__source {
    display: none;
  }

  // [tablet -]: Layered navigation
  @include break-to-device(tablet) {

    // Stretch primary navigation to drawer
    &--primary,
    &--primary .md-nav {
      position: absolute;
      top: 0;
      right: 0;
      left: 0;
      z-index: 1;
      display: flex;
      flex-direction: column;
      height: 100%;
      background-color: var(--md-default-bg-color);
    }

    // Adjust styles for primary navigation
    &--primary {

      // List title and item
      .md-nav__title,
      .md-nav__item {
        font-size: px2rem(16px);
        line-height: 1.5;
      }

      // List title
      .md-nav__title {
        position: relative;
        height: px2rem(112px);
        padding: px2rem(60px) px2rem(16px) px2rem(4px);
        color: var(--md-default-fg-color--light);
        font-weight: 400;
        line-height: px2rem(48px);
        white-space: nowrap;
        background-color: var(--md-default-fg-color--lightest);
        cursor: pointer;

        // Navigation icon
        .md-nav__icon {
          position: absolute;
          top: px2rem(8px);
          left: px2rem(8px);
          display: block;
          width: px2rem(24px);
          height: px2rem(24px);
          margin: px2rem(4px);

          // Previous navigation item icon
          &::after {
            display: block;
            width: 100%;
            height: 100%;
            background-color: currentColor;
            mask-image: var(--md-nav-icon--prev);
            mask-repeat: no-repeat;
            mask-size: contain;
            content: "";
          }

          // Adjust for right-to-left languages
          [dir="rtl"] & {
            right: px2rem(8px);
            left: initial;
          }
        }

        // Main lists
        ~ .md-nav__list {
          overflow-y: auto;
          background-color: var(--md-default-bg-color);
          box-shadow:
            0 px2rem(1px) 0 var(--md-default-fg-color--lightest) inset;
          scroll-snap-type: y mandatory;
          touch-action: pan-y;

          // Remove border for first list item
          > .md-nav__item:first-child {
            border-top: 0;
          }
        }

        // Site title in main navigation
        &[for="__drawer"] {
          position: relative;
          color: var(--md-primary-bg-color);
          background-color: var(--md-primary-fg-color);

          // Site logo
          .md-nav__button {
            position: absolute;
            top: px2rem(4px);
            left: px2rem(4px);
            display: block;
            margin: px2rem(4px);
            padding: px2rem(8px);
            font-size: px2rem(48px);
          }
        }
      }

      // Adjust for right-to-left languages
      html [dir="rtl"] & .md-nav__title {

        // Site title in main navigation
        &[for="__drawer"] .md-nav__button {
          right: px2rem(4px);
          left: initial;
        }
      }

      // List of items
      .md-nav__list {
        flex: 1;
      }

      // List item
      .md-nav__item {
        padding: 0;
        border-top: px2rem(1px) solid var(--md-default-fg-color--lightest);

        // Adjust for right-to-left languages
        [dir="rtl"] & {
          padding: 0;
        }

        // Increase spacing to account for icon
        &--nested > .md-nav__link {
          padding-right: px2rem(48px);

          // Adjust for right-to-left languages
          [dir="rtl"] & {
            padding-right: px2rem(16px);
            padding-left: px2rem(48px);
          }
        }

        // Active parent item
        &--active > .md-nav__link {
          color: var(--md-typeset-a-color);

          // Focused or hovered linl
          &:focus,
          &:hover {
            color: var(--md-accent-fg-color);
          }
        }
      }

      // Link inside item
      .md-nav__link {
        position: relative;
        margin-top: 0;
        padding: px2rem(12px) px2rem(16px);

        // Navigation icon
        .md-nav__icon {
          position: absolute;
          top: 50%;
          right: px2rem(12px);
          width: px2rem(24px);
          height: px2rem(24px);
          margin-top: px2rem(-12px);
          color: inherit;
          font-size: px2rem(24px);

          // Next navigation item icon
          &::after {
            display: block;
            width: 100%;
            height: 100%;
            background-color: currentColor;
            mask-image: var(--md-nav-icon--next);
            mask-repeat: no-repeat;
            mask-size: contain;
            content: "";
          }

          // Adjust for right-to-left languages
          [dir="rtl"] & {
            right: initial;
            left: px2rem(12px);
          }
        }
      }

      // Flip icon vertically
      .md-nav__icon::after {

        // Adjust for right-to-left languages
        [dir="rtl"] & {
          transform: scale(-1);
        }
      }

      // Table of contents inside navigation
      .md-nav--secondary {

        // Set links to static to avoid unnecessary layering
        .md-nav__link {
          position: static;
        }

        // Set nested navigation for table of contents to static
        .md-nav {
          position: static;
          background-color: transparent;

          // 3rd level link
          .md-nav__link {
            padding-left: px2rem(28px);

            // Adjust for right-to-left languages
            [dir="rtl"] & {
              padding-right: px2rem(28px);
              padding-left: initial;
            }
          }

          // 4th level link
          .md-nav .md-nav__link {
            padding-left: px2rem(40px);

            // Adjust for right-to-left languages
            [dir="rtl"] & {
              padding-right: px2rem(40px);
              padding-left: initial;
            }
          }

          // 5th level link
          .md-nav .md-nav .md-nav__link {
            padding-left: px2rem(52px);

            // Adjust for right-to-left languages
            [dir="rtl"] & {
              padding-right: px2rem(52px);
              padding-left: initial;
            }
          }

          // 6th level link
          .md-nav .md-nav .md-nav .md-nav__link {
            padding-left: px2rem(64px);

            // Adjust for right-to-left languages
            [dir="rtl"] & {
              padding-right: px2rem(64px);
              padding-left: initial;
            }
          }
        }
      }
    }

    // Adjust styles for secondary navigation
    &--secondary {
      background-color: transparent;
    }

    // Hide nested navigation by default
    .md-nav__toggle ~ & {
      display: flex;
      transform: translateX(100%);
      opacity: 0;
      transition:
        transform 250ms cubic-bezier(0.8, 0, 0.6, 1),
        opacity   125ms 50ms;

      // Adjust for right-to-left languages
      [dir="rtl"] & {
        transform: translateX(-100%);
      }
    }

    // Expand nested navigation, if toggle is checked
    .md-nav__toggle:checked ~ & {
      transform: translateX(0);
      opacity: 1;
      transition:
        transform 250ms cubic-bezier(0.4, 0, 0.2, 1),
        opacity   125ms 125ms;

      // Hack: reduce jitter
      > .md-nav__list {
        backface-visibility: hidden;
      }
    }
  }

  // [tablet portrait -]: Show table of contents in drawer
  @include break-to-device(tablet portrait) {

    // Show link to table of contents - higher specificity is necessary to
    // display the table of contents inside the drawer
    html &__link[for="__toc"] {
      display: block;
      padding-right: px2rem(48px);

      // Hide link to current item
      + .md-nav__link {
        display: none;
      }

      // Table of contents icon
      .md-icon::after {
        display: block;
        width: 100%;
        height: 100%;
        mask-image: var(--md-toc-icon);
        background-color: currentColor;
        content: "";
      }

      // Show table of contents
      & ~ .md-nav {
        display: flex;
      }
    }

    // Adjust for right-to-left languages
    html [dir="rtl"] &__link {
      padding-right: px2rem(16px);
      padding-left: px2rem(48px);
    }

    // Repository containing source
    &__source {
      display: block;
      padding: 0 px2rem(4px);
      color: var(--md-primary-bg-color);
      background-color: var(--md-primary-fg-color--dark);
    }
  }

  // [tablet landscape +]: Tree-like navigation
  @include break-from-device(tablet landscape) {

    // List title
    &--secondary .md-nav__title {

      // Snap to table of contents title
      &[for="__toc"] {
        scroll-snap-align: start;
      }

      // Hide icon
      .md-nav__icon {
        display: none;
      }
    }
  }

  // [screen +]: Tree-like navigation
  @include break-from-device(screen) {
    transition: max-height 250ms cubic-bezier(0.86, 0, 0.07, 1);

    // List title
    &--primary .md-nav__title {

      // Snap to site title
      &[for="__drawer"] {
        scroll-snap-align: start;
      }

      // Hide icon
      .md-nav__icon {
        display: none;
      }
    }

    // Hide nested navigation by default
    .md-nav__toggle ~ & {
      display: none;
    }

    // Show nested navigation, if toggle is checked
    .md-nav__toggle:checked ~ & {
      display: block;
    }

    // Hide titles for nested navigation
    &__item--nested > .md-nav > &__title {
      display: none;
    }

    // Navigation icon
    &__icon {
      float: right;
      width: px2rem(18px);
      height: px2rem(18px);
      transition: transform 250ms;

      // Adjust for right-to-left languages
      [dir="rtl"] & {
        float: left;
        transform: rotate(180deg);
      }

      // Inline icon and adjust icon to match font size
      &::after {
        display: inline-block;
        width: 100%;
        height: 100%;
        vertical-align: px2rem(-2px);
        background-color: currentColor;
        mask-image: var(--md-nav-icon--next);
        mask-repeat: no-repeat;
        mask-size: contain;
        content: "";
      }

      // Rotate icon for expanded lists
      .md-nav__item--nested .md-nav__toggle:checked ~ .md-nav__link & {
        transform: rotate(90deg);
      }
    }
  }
}
