.nav {
  $padding-horizontal: -4;
  $margin-horizontal: -2;
  $margin-vertical: -4;
  $height-item: spacing($nav-padding-vertical, $times: 2, $add: #{line-height("single", $include-calc: false)});
  $nav-site-nav-top-padding: -1;
  $nav-search-vertical-padding: -4;
  $nav-utilities-item-spacing: -5;

  $transition-duration-toggle: $animation-timing-expand-flip;
  $transition-duration-hover: 100ms;
  $transition-duration-fadeout: $animation-timing-expand-flip;
  $transition-duration-movein: 150ms;
  $transition-delay-movein: 50ms;
  $transition-num-delays-movein: 5;


  @mixin vertical-layout($sidebar: false) {
    flex-direction: column;
    align-items: flex-start;
    padding: spacing($margin-vertical) 0;
    white-space: normal;
    height: auto;

    @if $sidebar == false {
      margin-top: spacing($nav-padding-vertical);
    }
  }

  @mixin vertical-style($orientation: right) {
    margin-right: 0;
    margin-bottom: spacing($margin-vertical);
    background-size: 0 100%;
    padding-top: spacing($nav-padding-vertical-small);
    padding-bottom: spacing($nav-padding-vertical-small);
    height: auto;

    @if $orientation == right {
      padding-left: 0;
      padding-right: spacing($margin-horizontal);
      background-position: right center;
      width: 100%;
    }
    @else if $orientation == left {
      padding-right: 0;
      padding-left: spacing($margin-horizontal);
      background-position: left center;
    }

    &--active {
      background-size: $nav-width-active-style 100%;
    }

    &:hover:not(.nav__item--active) {
      background-size: $nav-width-active-style 100%;
    }

    &:last-child {
      margin-bottom: 0;
    }
  }

  @mixin vertical-header-style {
    padding: spacing(-1) spacing($nav-padding-vertical-small) spacing($nav-padding-vertical-small) 0;
    width: auto;
    flex-grow: 0;
    opacity: 1;

    &::after {
      content: none;
    }
  }

  @mixin icon-only-style {
    width: spacing($nav-utilities-item-spacing, $times: 2, $add: line-height("single", $include-calc: false, $fontsize-relative: ("current": 0, "target": 1)));
    overflow: hidden;

    &::before {
      flex: 0 0 calc(100% + 1px); //+ 1px to make sure label text is completely hidden
      margin: 0;
      text-align: center;
      margin-right: 0;
    }
  }

  display: flex;
  align-items: flex-start;
  line-height: line-height("single");
  padding: 0;
  border-bottom: solid color("border") $width-border;

  &--vertical {
    border-bottom: none;
    border-right: solid color("border") $width-border;
  }

  &--has-active-item {
    border-color: color("border-theme");
  }

  &--site-nav {
    display: grid;
    align-items: end;
    grid-template-columns: 1fr auto;
    grid-template-areas:
      "home utilities"
      "search search"
      "sitenav sitenav"
    ;
    padding: spacing($nav-site-nav-top-padding) 0 0 spacing($page-padding-side);
    min-height: spacing($nav-site-nav-top-padding, $add: "#{line-height("single", $include-calc: false)} + #{spacing($nav-padding-vertical)} + #{$width-border}");

    .nav__home {
      grid-area: home;
      height: auto;
      align-self: start;
      margin-right: spacing(-3);

      @include breakpoint("medium") {
        margin-right: spacing(0);
      }
    }

    .nav__utilities {
      grid-area: utilities;
      padding-right: spacing($page-padding-side, $subtract: spacing($nav-utilities-item-spacing));
      height: auto;
      align-self: start;
    }

    .nav__site {
      grid-area: sitenav;
      display: flex;
      padding-right: spacing($page-padding-side);
    }

    .nav__search-toggle {
      @include icon-style {
        @include set-icon("search");
        transform: rotate(0deg);
      }

      &[aria-expanded="true"] {
        &::before {
          @include set-icon("expand");
          transform: rotateX(-180deg);
          transition: transform $animation-timing-expand-flip $easing-in-out;
        }
      }

      @include breakpoint("wide") {
        display: none;
      }
    }

    .nav__search {
      grid-area: search;
      margin-top: spacing($nav-padding-vertical);
      margin-right: spacing("side");
      position: relative;
      display: none; //hide the search form by default on narrow screens

      &--toggled {
        display: block;
      }

      @include breakpoint("wide") {
        display: block;
        margin-top: 0;
        margin-right: 0;
        margin-left: spacing(0);
        margin-bottom: spacing($nav-padding-vertical, $subtract: spacing($nav-search-vertical-padding), $add: $width-border * -1);
      }

      .form__inline-submit {
        max-width: none;
      }

      .form__inline-submit__button {
        right: spacing(-5, $add: $width-border);
        bottom: 50%;
        transform: translateY(50%);
      }

      .form__field {
        margin: 0;
        max-width: none;

        label {
          padding-top: spacing($nav-search-vertical-padding);
          padding-bottom: spacing($nav-search-vertical-padding);

          @include breakpoint("wide") {
            display: inline-flex;
            align-items: baseline;

            @include icon-style {
              @include set-icon("search");
              margin-right: spacing(-5);
              line-height: 1;
            }
          }
        }

        input[type="search"] {
          padding-top: spacing($nav-search-vertical-padding);
          padding-bottom: spacing($nav-search-vertical-padding);
          max-width: none;
        }

        .form-info__message {
          @include breakpoint("wide") {
            top: unset;
            bottom: calc(#{line-height("single", $times: -1, $include-calc: false)} - #{$width-border});
          }
        }
      }
    }

    @include breakpoint("wide") {
      grid-template-columns: auto 1fr auto auto;
      grid-template-areas:
        "home sitenav search utilities"
      ;
      padding: spacing(-4) spacing($page-padding-side) 0 spacing($page-padding-side);

      min-height: spacing(-4, $add: "#{line-height("single", $include-calc: false)} + #{spacing($nav-padding-vertical, $times: 2)} + #{$width-border}");

      .nav__home {
        margin-right: spacing(0);
        height: $height-item;
      }

      .nav__utilities {
        height: $height-item;
        padding-right: 0;
        margin-left: spacing(0);

        &--has-only-search-toggle {
          margin-left: 0;
        }

        & .nav__item {
          height: $height-item;
        }
      }

      .nav__site {
        padding-right: 0;
      }
    }

    @include breakpoint("max-width") {
      padding-left: calc(50vw -  #{math.div($page-max-width, 2)} + #{spacing($page-padding-side)});
      padding-right: calc(50vw -  #{math.div($page-max-width, 2)} + #{spacing($page-padding-side)});
    }

    &--only-search {
      grid-template-areas:
        "home utilities"
        "search search"
      ;

      .nav__search {
        margin-bottom: spacing($nav-padding-vertical);
        margin-left: 0;
      }

      @include breakpoint("wide") {
        grid-template-areas:
          "home search utilities"
        ;
        grid-template-columns: auto 1fr auto;

        .nav__search {
          margin-left: 0;
          max-width: $line-width-max;
          margin-bottom: spacing($nav-padding-vertical, $subtract: spacing($nav-search-vertical-padding), $add: $width-border * -1);
        }
      }
    }
  }

  &__split {
    flex-grow: 1;
  }

  &__toggle {
    display: none; //inline-flex when visible
    align-items: center;
    color: color("foreground-hover");
    height: $height-item;
    flex: 0 0 auto;
    white-space: nowrap;
    margin-left: spacing($margin-horizontal);

    &:hover {
      color: color("foreground");
      outline: none;
    }

    &:focus-visible {
      outline: $outline-width solid color("utility-focus");
      outline-offset: $outline-offset;
    } 

    &:active {
      color: color("foreground");
      outline: none;
    }

    .nav--has-overflow & {
      display: inline-flex;
    }

    @include icon-style($position: "after") {
      @include set-icon("expand");
      display: inline-block;
      margin-left: spacing(-5);
      transform: rotate(0deg);

      transition: transform $transition-duration-toggle $easing-in-out;

      .nav--toggled & {
        transform: rotateX(-180deg);
      }
    }

    .nav--site-nav & {
      width: 1.4em;
      overflow: hidden;
      text-align: center;

      &::after {
        @include set-icon("menu");
        text-align: center;
        flex: 1 0 100%;
        font-size: font-size(1);
        margin-left: 0;
        order: -1;
      }
    }

    .nav--site-nav.nav--toggled & {
      &::after {
        @include set-icon("close");
        transform: rotateZ(-90deg);
      }
    }
  }

  .page--navigation-sidebar-left .page__sidebar-left & {
    @include breakpoint("wide") {
      border-right: $width-border solid color("border");
      border-bottom: none;
      padding-left: spacing($page-padding-side);

      &--has-active-item {
        border-color: color("border-theme");
      }

      &--toggled {

        & .nav__items {
          background-image: none;
          width: 100%;
        }
      }

      &__toggle {
        display: none;
      }

      &__header {
        @include vertical-header-style;
      }

      & .nav__items {
        @include vertical-layout($sidebar: true);

        & .nav__item {
          @include vertical-style;
          visibility: visible;

          &.nav__item--is-overflown.nav__item--active {
            order: initial;
          }
        }
      }
    }
  }

  &__items {
    position: relative;
    display: flex;
    flex-wrap: wrap;
    overflow-y: hidden;
    flex-grow: 1;
    height: spacing($nav-padding-vertical, $times: 2, $add: "#{line-height("single", $include-calc: false)}");

    &::before {
      content: "";
      visibility: hidden;
      background-color: color("border");
      width: $width-border;
      position: absolute;
      left: 0;
      top: 0;
      bottom: 0;
      transform: scaleY(0);
      transform-origin: top;
      transition: transform $transition-duration-fadeout $easing-in;

      @include breakpoint("medium") {
        top: spacing(-1);
        bottom: spacing(-1);
        left: spacing(-1);
      }
    }


    & > *:not(:last-child) {
      margin-right: spacing($margin-horizontal);
    }

    .nav--vertical & {
      @include vertical-layout($sidebar: true);
    }

    &--fadeout {
      background-size: $width-border 0;

      .nav__item,
      .nav__header {
        opacity: 0;
      }
    }
  }

  &__item {
    display: inline-flex;
    align-items: center;
    height: $height-item;
    color: color("foreground-hover");
    opacity: 1;

    background-image: linear-gradient(color("border"), color("border"));
    background-size: 100% 0;
    background-repeat: no-repeat;
    background-position: center bottom;

    transition: opacity $transition-duration-fadeout $easing-out;

    &--active {
      color: color("foreground");
      background-size: 100% $nav-width-active-style;
      background-image: linear-gradient(color("border-theme"), color("border-theme"));
    }

    &--icon {
      @include icon-style {
        font-size: font-size(0);
        line-height: 1;
        margin-right: spacing(-4);

        .nav__utilities & {
          font-size: font-size(1);
        }
      }

      //TODO deprecate, use .icon-[icon name] class instead
      &[data-icon] {
        &::before {
          content: attr(data-icon);
        }
      }

      &--right {
        &::before {
          order: 2;
          margin-right: 0;
          margin-left: spacing(-4);
        }
      }

      &--hide-label {
        @include icon-only-style;
        white-space: nowrap;
      }
    }

    &:focus {
      z-index: $z-index-just-above-static;
      outline-offset: $width-border * -1; //prevent outline from being cropped due to overflow hidden i nav
    }

    &:focus-visible {
      outline: $outline-width solid color("utility-focus");
      outline-offset: $outline-offset * -1;
    }

    &:hover:not(.nav__item--active) {
      color: color("foreground");
      background-size: 100% $nav-width-active-style;
    }

    &:active:not(.nav__item--active) {
      color: color("foreground-theme");
      background-image: linear-gradient(color("border-theme"), color("border-theme"));
    }

    &--is-overflown {
      visibility: hidden;

      &.nav__item--active {
        order: -1;
        visibility: visible;
        margin-right: spacing($margin-horizontal);
      }
    }

    .nav--vertical & {
      @include vertical-style;
    }
  }

  button.nav__item {
    color: color("foreground");
    background-image: none;

    &:hover {
      color: color("foreground-hover");
      background-image: none;
    }

    &:active {
      color: color("foreground-theme");
      background-image: none;
    }
  }

  &__header {
    @include set-font(-1, "single", $weight: bold, $transform: "uppercase");
    margin: 0;
    width: 0;
    flex-grow: 1;
    opacity: 0;

    @include breakpoint("wide") {
      width: auto;
      flex-grow: 0;
      opacity: 1;
    }

    .nav--vertical &,
    .nav--toggled & {
      @include vertical-header-style;
    }

  }

  &__home {
    position: relative;
    display: inline-flex;
    align-items: center;

    @include set-font(0, "single");
    height: spacing($nav-padding-vertical, $times: 2, $add: "#{line-height("single", $include-calc: false)}");
    margin: 0 spacing(0) 0 0;

    .nav__home__title {
      color: color("foreground-branding");
      background-image: none;
      //if there is no room for the site title wrap it on a hidden second line - only the before element will be visible
      display: flex;
      flex-wrap: wrap;
      overflow: hidden;
      word-break: break-all; //this will wrap the hidden site name in pieces once it wraps onto a second line allowing the title only to take up room required by the before element
      height: line-height("single"); //prevent logo (in ::before) from hanging, when there is no other content in the home link except the logo.

      &::before {
        content: "AU";
        font-family: "AU Peto";
        margin-right: spacing(-4);
        white-space: nowrap; //prevent element from breaking in very narrow viewports
      }
    }

    a.nav__home__title {
      &:hover {
        color: color("foreground-branding-hover");
        background-image: none;
      }
      &:focus-visible {
        outline: $outline-width solid color("utility-focus");
        outline-offset: $outline-offset;
      }
      &:active {
        color: color("foreground-theme");
        background-image: none;
      }
    }
  }

  &__utilities {
    display: flex;
    align-items: flex-end;
    flex-wrap: nowrap;
    height: spacing($nav-padding-vertical, $times: 2, $add: "#{line-height("single", $include-calc: false)}");

    .nav__item {
      background-image: none;
      height: auto;
      white-space: nowrap;

      &--attention {
        position: relative;
        &::after {
          content: '';
          position: absolute;
          width: spacing(-3);
          height: spacing(-3);
          background-color: color('utility-attention');
          border-radius: 50%;
          right: spacing($nav-utilities-item-spacing, $add: .1em);
          top: 0;

          @include breakpoint("wide") {
            width: spacing(-2);
            height: spacing(-2);
            top: .6rem;
            right: spacing($nav-utilities-item-spacing, $subtract: .1em);
          }
        }
      }

      &:hover {
        background-image: none;
      }

      &--icon:not(.nav__item--icon--always-show-label) {
        &::before {
          color: color("foreground");
        }

        &:hover {
          &:before {
            color: color("foreground-hover");
          }
        }

        &:active:not(.nav__item--active) {
          &:before {
            color: color("foreground-theme");
          }
        }

        &.nav__item--active {
          &::before {
            font-weight: $font-weight-icon-solid;
            color: color("foreground");
          }
        }

        @include breakpoint("wide") {
          &:not(button) {
            &::before {
              color: color("foreground-hover");
            }

            &:hover {
              &::before {
                color: color("foreground");
              }
            }

            &:active:not(.nav__item--active) {
              &:before {
                color: color("foreground-theme");
              }
            }
          }
        }
      }

      &--icon:not(.nav__item--icon--hide-label):not(.nav__item--icon--always-show-label) {
        @include icon-only-style;

        &.nav__item--icon--right {
          &::before {
            order: initial;

            @include breakpoint("wide") {
              order: 2;
              margin-right: 0;
              margin-left: spacing(-4);
            }
          }
        }

        @include breakpoint("wide") {
          width: auto;
          overflow: visible;

          &:last-child {
            margin-right: 0;
          }

          &::before {
            text-align: left;
            margin-right: spacing(-4);
            flex-basis: auto;
          }
        }
      }

      &--icon--hide-label {
        margin-right: 0;
      }
    }

    & > *:last-child {
      margin-right: spacing($nav-utilities-item-spacing);

      @include breakpoint("wide") {
        margin-right: 0;
      }
    }

    & > *:not(.nav__item--icon) {
      margin-left: spacing($nav-utilities-item-spacing);

      @include breakpoint("wide") {
        margin-left: 0;
      }
    }

    & > .sub-nav,
    & > .nav__item--icon {
      margin-left: 0;
      margin-right: 0;
    }

    @include breakpoint("wide") {
      & > *:not(:last-child) {
        margin-right: spacing($margin-horizontal);
      }
    }
  }


  &--toggled {
    padding-bottom: spacing(0);
    justify-content: flex-end;

    @include breakpoint("medium") {
      position: relative;
      padding-bottom: 0;
    }

    &.nav--site-nav {
      .nav__site {
        justify-content: flex-end;
        position: relative;
      }
    }

    &.nav--has-active-item {
      .nav__items {
          &::before {
            background-color: color("border-theme");
          }
      }
    }

    & .nav__items {
      @include vertical-layout;
      padding-left: $width-border;

      &::before {
        visibility: visible;
        transform: scaleY(1);
      }

      @include breakpoint("medium") {
        width: 18rem;
        background-color: color("background");
        position: absolute;
        z-index: $z-index-navigation;
        padding: spacing(-1, $add: spacing($margin-vertical)) spacing(0) spacing(-1, $add: spacing($margin-vertical)) spacing(-1, $add: $width-border);
        top: spacing($nav-padding-vertical, $times: 2, $add: "#{line-height("single", $include-calc: false)} + #{$width-border}");
        right: 0;
        margin-top: 0;
        box-shadow: $shadow-style-front color("shadow");
      }

      @include breakpoint("wide") {
        padding-right: spacing(-1);
        right: spacing(0, $times: -1);
      }

      &--fadeout {
        background-size: $width-border 0;

        &.nav__items > *:not(.nav__split){
          opacity: 0;
        }
      }

      & .nav__item {
        @include vertical-style(left);

        &--is-overflown {
          visibility: visible;

          &.nav__item--active {
            order: initial;
          }
        }

        &--icon-right {
          &::before {
            order: initial;
            margin-right: spacing(-4);
            margin-left: 0;
          }
        }

        &--icon-only {
          width: auto;

          &::before {
            flex: 0 0 auto;
            order: initial;
            margin-right: spacing(-4);
            margin-left: 0;
          }
        }
      }
    }

    & .nav__header {
      @include vertical-header-style;
      padding-left: spacing($margin-horizontal);
    }

    & .nav__split {
      height: spacing(-1);
    }
  }

  //NOTE hack to remove extra visual whitespace above nav when used outside the pageheader, either for local navigation, links or .tabbed-content.
  //TODO rewrite .nav so that it is only items in site--nav that has "padding" both above and below the tex. I.e. make this hack the default and nav--site the odd case
  &:not(.nav--site-nav):not(.nav--vertical) {
    $tab-height: spacing($nav-padding-vertical, $add: '#{line-height("single", $include-calc: false)}');
    $nav-height: spacing($nav-padding-vertical, $add: '#{line-height("single", $include-calc: false)} + #{$width-border}');

    &:not(.nav--toggled) {
      height: $nav-height;

      .nav__items {
        height: $tab-height;

        .nav__item {
          height: $tab-height;
          align-items: start;
        }
      }

      @include breakpoint("wide") {
        .page__sidebar-left & {
          height: auto;

          .nav__item {
            height: auto;
          }
        }

        .page__navigation-top {
          .nav__item {
            height: auto;
          }
        }

        .nav__items {
          height: auto;
        }
      }
    }


    &.nav--toggled {
      .nav__items {
        margin-top: 0;

        @include breakpoint("medium") {
          top: $nav-height;
        }
      }
    }

    .nav__toggle {
      height: $tab-height;
      align-items: start;
    }
  }
}
