All Downloads are FREE. Search and download functionalities are using the official Maven repository.

package.components.Nav.nav.scss Maven / Gradle / Ivy

The newest version!
@use '../../sass-utilities' as *;

@include pf-root($nav) {
  // * Nav shared values
  --#{$nav}__link--PaddingBlockStart: var(--pf-t--global--spacer--sm);
  --#{$nav}__link--PaddingBlockEnd: var(--pf-t--global--spacer--sm);
  --#{$nav}__link--PaddingInlineStart: var(--pf-t--global--spacer--md);
  --#{$nav}__link--PaddingInlineEnd: var(--pf-t--global--spacer--md);
  --#{$nav}__list--RowGap: var(--pf-t--global--spacer--sm);
  --#{$nav}__list--ColumnGap: var(--pf-t--global--spacer--xs);

  // * Nav // default to row gap if no custom value is set
  --#{$nav}--PaddingBlockStart: var(--pf-t--global--spacer--md);
  --#{$nav}--PaddingBlockEnd: var(--pf-t--global--spacer--md);
  --#{$nav}--PaddingInlineStart: 0;
  --#{$nav}--PaddingInlineEnd: 0;
  --#{$nav}--RowGap: var(--pf-t--global--spacer--lg);
  --#{$nav}--ColumnGap: 0;
  --#{$nav}--AlignItems: baseline;
  --#{$nav}--FontSize: var(--pf-t--global--font--size--body--default);
  --#{$nav}--FontWeight: var(--pf-t--global--font--weight--body--default);
  --#{$nav}--LineHeight: var(--pf-t--global--font--line-height--body);
  --#{$nav}--OutlineOffset: calc(var(--pf-t--global--spacer--xs) * -1);
  --#{$nav}--BackgroundColor: transparent;

  // * Nav list
  --#{$nav}__list--ScrollSnapTypeAxis: x;
  --#{$nav}__list--ScrollSnapTypeStrictness: proximity;
  --#{$nav}__list--ScrollSnapType: var(--#{$nav}__list--ScrollSnapTypeAxis) var(--#{$nav}__list--ScrollSnapTypeStrictness);
  --#{$nav}__item--ScrollSnapAlign: end;

  // * Nav section title
  --#{$nav}__section-title--FontWeight: var(--pf-t--global--font--weight--body--bold);
  --#{$nav}__section-title--Color: var(--pf-t--global--text--color--regular);
  --#{$nav}__section-title--PaddingBlockStart: var(--#{$nav}__link--PaddingBlockStart);
  --#{$nav}__section-title--PaddingBlockEnd: var(--#{$nav}__link--PaddingBlockEnd);
  --#{$nav}__section-title--PaddingInlineStart: var(--#{$nav}__link--PaddingInlineStart);
  --#{$nav}__section-title--PaddingInlineEnd: var(--#{$nav}__link--PaddingInlineEnd);

  // * Nav toggle icon
  --#{$nav}__item--RowGap: var(--#{$nav}__list--RowGap);
  --#{$nav}__item__toggle-icon--Rotate: 0;
  --#{$nav}__item--m-expanded__toggle-icon--Rotate: 90deg;

  // * Nav link
  --#{$nav}__link--ColumnGap: var(--pf-t--global--spacer--sm);
  --#{$nav}__link--AlignItems: baseline;
  --#{$nav}__link--BorderRadius: var(--pf-t--global--border--radius--small);
  --#{$nav}__link--BackgroundColor: var(--pf-t--global--background--color--action--plain--default);
  --#{$nav}__link--WhiteSpace: normal;
  --#{$nav}__link--Color: var(--pf-t--global--text--color--subtle);
  --#{$nav}__link--hover--Color: var(--pf-t--global--text--color--regular);
  --#{$nav}__link--hover--BackgroundColor: var(--pf-t--global--background--color--action--plain--alt--hover);
  --#{$nav}__link--m-current--BackgroundColor: var(--pf-t--global--background--color--action--plain--alt--clicked);
  --#{$nav}__link--m-current--Color: var(--pf-t--global--text--color--regular);

  // * Nav link icon
  --#{$nav}__link-icon--Color: var(--pf-t--global--icon--color--subtle);
  --#{$nav}__link--m-current__link-icon--Color: var(--pf-t--global--icon--color--regular);

  // * Nav subnav
  --#{$nav}__subnav--RowGap: var(--pf-t--global--border--width--extra-strong);
  --#{$nav}__subnav--PaddingInlineStart: var(--pf-t--global--spacer--md);

  // * Nav scroll button
  --#{$nav}__scroll-button--BorderColor: var(--pf-t--global--border--color--default);
  --#{$nav}__scroll-button--BorderWidth: var(--pf-t--global--border--width--divider--default);
  --#{$nav}__scroll-button--first-of-type--c-button--BorderStartStartRadius: var(--pf-t--global--border--radius--pill);
  --#{$nav}__scroll-button--first-of-type--c-button--BorderEndStartRadius: var(--pf-t--global--border--radius--pill);
  --#{$nav}__scroll-button--last-of-type--c-button--BorderStartEndRadius: var(--pf-t--global--border--radius--pill);
  --#{$nav}__scroll-button--last-of-type--c-button--BorderEndEndRadius: var(--pf-t--global--border--radius--pill);

  // * Nav toggle
  --#{$nav}__toggle--PaddingInlineStart: var(--pf-t--global--spacer--sm);
  --#{$nav}__toggle--PaddingInlineEnd: var(--pf-t--global--spacer--sm);
  --#{$nav}__toggle--TranslateY: calc((var(--#{$nav}--LineHeight) * var(--#{$nav}--FontSize) / 2) - 50%); // find height of single label, divide by two, offset by 50% of own height

  // * Nav horizontal list
  --#{$nav}--m-horizontal__list--PaddingBlockStart: 0;
  --#{$nav}--m-horizontal__list--PaddingBlockEnd: 0;
  --#{$nav}--m-horizontal__list--PaddingInlineStart: 0;
  --#{$nav}--m-horizontal__list--PaddingInlineEnd: 0;
  --#{$nav}--m-horizontal--m-scrollable__list--PaddingInlineStart: var(--#{$nav}__list--ColumnGap);
  --#{$nav}--m-horizontal--m-scrollable__list--PaddingInlineEnd: var(--#{$nav}__list--ColumnGap);

  // * Nav horizontal subnav
  --#{$nav}--m-horizontal--m-subnav--BackgroundColor: var(--pf-t--global--background--color--secondary--default);
  --#{$nav}--m-horizontal--m-subnav--BorderRadius: var(--pf-t--global--border--radius--pill);
  --#{$nav}--m-horizontal--m-subnav__list--PaddingBlockStart: var(--pf-t--global--spacer--xs);
  --#{$nav}--m-horizontal--m-subnav__list--PaddingBlockEnd: var(--pf-t--global--spacer--xs);
  --#{$nav}--m-horizontal--m-subnav__list--PaddingInlineStart: var(--pf-t--global--spacer--md);
  --#{$nav}--m-horizontal--m-subnav__list--PaddingInlineEnd: var(--pf-t--global--spacer--md);
  --#{$nav}--m-horizontal--m-subnav--m-scrollable__list--PaddingInlineStart: var(--#{$nav}__list--ColumnGap);
  --#{$nav}--m-horizontal--m-subnav--m-scrollable__list--PaddingInlineEnd: var(--#{$nav}__list--ColumnGap);
  --#{$nav}--m-horizontal--m-subnav__link--PaddingBlockStart: var(--pf-t--global--spacer--xs);
  --#{$nav}--m-horizontal--m-subnav__link--PaddingBlockEnd: var(--pf-t--global--spacer--xs);
  --#{$nav}--m-horizontal--m-subnav__link--PaddingInlineStart: var(--pf-t--global--spacer--md);
  --#{$nav}--m-horizontal--m-subnav__link--PaddingInlineEnd: var(--pf-t--global--spacer--md);
}

// - Nav display - default to grid
.#{$nav},
.#{$nav}__section,
.#{$nav}__subnav,
.#{$nav}__list,
.#{$nav}__item {
  display: grid;
}

// - Nav root
.#{$nav} {
  position: relative;
  row-gap: var(--#{$nav}--RowGap);
  column-gap: var(--#{$nav}--ColumnGap);
  max-width: 100%;
  padding-block-start: var(--#{$nav}--PaddingBlockStart);
  padding-block-end: var(--#{$nav}--PaddingBlockEnd);
  padding-inline-start: var(--#{$nav}--PaddingInlineStart);
  padding-inline-end: var(--#{$nav}--PaddingInlineEnd);
  font-size: var(--#{$nav}--FontSize);
  font-weight: var(--#{$nav}--FontWeight);
  line-height: var(--#{$nav}--LineHeight);
  background-color: var(--#{$nav}--BackgroundColor);

  &.pf-m-overflow-hidden {
    overflow: hidden;
  }

  &.pf-m-inset {
    --#{$nav}--PaddingInlineStart: var(--pf-t--global--spacer--md);
    --#{$nav}--PaddingInlineEnd: var(--pf-t--global--spacer--md);  
  }

  &.pf-m-fill {
    flex-grow: 1;
  }

  .#{$menu} {
    --#{$menu}--MinWidth: 100%;

    &.pf-m-drilldown,
    &.pf-m-drilldown .#{$menu} {
      --#{$menu}--PaddingBlockStart: 0;
      --#{$menu}--PaddingBlockEnd: 0;
      --#{$menu}--BackgroundColor: var(--#{$nav}--BackgroundColor);
      --#{$menu}--BoxShadow: none;
      --#{$menu}__list-item--hover--BackgroundColor: var(--#{$nav}__link--hover--BackgroundColor);

      .#{$menu}__list {
        row-gap: var(--#{$nav}__subnav--RowGap);
      }
    
      .#{$menu}__list-item::before {
        border-radius: var(--#{$nav}__link--BorderRadius);
      }
    }
  }
}

[class^="#{$nav}"][hidden] {
  display: none;
}

// Magic value calcs
.#{$nav}__nav,
.#{$nav}__list,
.#{$nav}__subnav {
  // These variables need to remove local to list and subnav to be recalculated upon row gap setting updates
  --#{$nav}__item--RowGap--row-offset: calc(var(--#{$nav}__list--RowGap) / 2 * -1); // row gap offset calcs 1/2 height of row gap
  --#{$nav}__link--clickable-inset--Block: var(--#{$nav}__item--RowGap--row-offset); // set link's clickable area offset based on 1/2 row gap
  --#{$nav}__button--RowGap--row-offset: calc(var(--#{$nav}__item--RowGap) * -1); // match extra bottom paddings applied to expanded nav_links
}

// - Nav list
.#{$nav}__list {
  row-gap: var(--#{$nav}__list--RowGap);
  column-gap: var(--#{$nav}__list--ColumnGap);
}

// - Nav subnav
.#{$nav}__subnav {
  --#{$nav}__list--RowGap: var(--#{$nav}__subnav--RowGap); // this value is passed to --#{$nav}__item--RowGap--row-offset and updates clickable area based on value passed

  padding-inline-start: var(--#{$nav}__subnav--PaddingInlineStart); // indent nested lists
}

// - Nav item
.#{$nav}__item {
  row-gap: var(--#{$nav}__item--RowGap); // no fallback here as this value is used to calc clickable offsets
  scroll-snap-align: var(--#{$nav}__item--ScrollSnapAlign);

  > .#{$nav}__link[button] {
    margin-block-end: var(--#{$nav}__button--RowGap--row-offset);
  }

  &.pf-m-expanded:is(:not(:only-child, :last-child)) {
    margin-block-end: var(--#{$nav}__item--m-expanded--MarginBlockEnd, var(--#{$nav}__item--RowGap)); // default to row gap if no custom value is set

    + .#{$nav}__item > .#{$nav}__link::before {
      inset-block-start: calc(var(--#{$nav}__item--RowGap) * -1 - var(--#{$nav}__list--RowGap));
    }
  }
}

// - Nav section
.#{$nav}__section {
  row-gap: var(--#{$nav}__section--RowGap, var(--#{$nav}__list--RowGap));
}

// - Nav section title
.#{$nav}__section-title {
  padding-block-start: var(--#{$nav}__section-title--PaddingBlockStart);
  padding-block-end: var(--#{$nav}__section-title--PaddingBlockEnd);
  padding-inline-start: var(--#{$nav}__section-title--PaddingInlineStart);
  padding-inline-end: var(--#{$nav}__section-title--PaddingInlineEnd);
  font-size: var(--#{$nav}__section-title--FontSize, inherit); // default to inherit if no custom value is set
  font-weight: var(--#{$nav}__section-title--FontWeight);
  color: var(--#{$nav}__section-title--Color);
}

// - Nav link
.#{$nav}__link {
  position: relative;
  display: flex;
  column-gap: var(--#{$nav}__link--ColumnGap);
  align-items: var(--#{$nav}__link--AlignItems);
  padding-block-start: var(--#{$nav}__link--PaddingBlockStart);
  padding-block-end: var(--#{$nav}__link--PaddingBlockEnd);
  padding-inline-start: var(--#{$nav}__link--PaddingInlineStart);
  padding-inline-end: var(--#{$nav}__link--PaddingInlineEnd);
  font-size: var(--#{$nav}__link--FontSize, inherit); // default to nav font size if no custom no custom value is set
  font-weight: var(--#{$nav}__link--FontWeight, inherit); // default to nav font weight if no custom value is set
  line-height: var(--#{$nav}__link--LineHeight, inherit); // default to nav line height if no custom value is set
  color: var(--#{$nav}__link--Color);
  text-align: start;
  text-decoration: none;
  background-color: var(--#{$nav}__link--BackgroundColor);
  border: none;
  border-radius: var(--#{$nav}__link--BorderRadius);

  // increase height clickable area of expanded nav_links to account for
  &[aria-expanded="true"]::before {
    inset-block-end: calc(var(--#{$nav}__item--RowGap) * -1);
  }

  // explicitly set background-color prop to avoid affecting child elements settings
  &:hover,
  &.pf-m-hover,
  &:focus {
    color: var(--#{$nav}__link--hover--Color);
    background-color: var(--#{$nav}__link--hover--BackgroundColor);
  }

  &.pf-m-current,
  &.pf-m-current:hover {
    --#{$nav}__link-icon--Color: var(--#{$nav}__link--m-current__link-icon--Color);

    color: var(--#{$nav}__link--m-current--Color);
    background-color: var(--#{$nav}__link--m-current--BackgroundColor);
  }
}

// - Nav toggle caret
.#{$nav}__link-icon {
  color: var(--#{$nav}__link-icon--Color);
}

// - Nav toggle caret
.#{$nav}__toggle {
  flex: none;
  align-self: start;
  margin-inline-start: auto;

  // find height of single text string, divide by two, offset by 50% of own height
  transform: translateY(var(--#{$nav}__toggle--TranslateY));
}

// - Nav toggle icon
.#{$nav}__toggle-icon {
  display: inline-block;
  transform: rotate(var(--#{$nav}__item__toggle-icon--Rotate));

  @include pf-v6-mirror-inline-on-rtl;

  .#{$nav}__item:where(.pf-m-flyout) & {
    --#{$nav}__item--m-expanded__toggle-icon--Rotate: 0;
  }

  .#{$nav}__link:where([aria-expanded="true"]) & {
    transform: rotate(var(--#{$nav}__item--m-expanded__toggle-icon--Rotate));
  }
}

// - Nav scroll button
.#{$nav}__scroll-button {
  position: relative;

  &::before {
    position: absolute;
    inset: 0;
    content: "";
  }

  &:first-of-type {
    .#{$button} {
      --#{$button}--BorderStartStartRadius: var(--#{$nav}__scroll-button--first-of-type--c-button--BorderStartStartRadius);
      --#{$button}--BorderEndStartRadius: var(--#{$nav}__scroll-button--first-of-type--c-button--BorderEndStartRadius);
    }

    &::before {
      border-inline-end: var(--#{$nav}__scroll-button--BorderWidth) solid var(--#{$nav}__scroll-button--BorderColor);
    }
  }

  &:last-of-type {
    .#{$button} {
      --#{$button}--BorderStartEndRadius: var(--#{$nav}__scroll-button--last-of-type--c-button--BorderStartEndRadius);
      --#{$button}--BorderEndEndRadius: var(--#{$nav}__scroll-button--last-of-type--c-button--BorderEndEndRadius);
    }

    &::before {
      border-inline-start: var(--#{$nav}__scroll-button--BorderWidth) solid var(--#{$nav}__scroll-button--BorderColor);
    }
  }

  // TODO - update this selector to the $pf-button__icon once that is introduced
  .#{$button} {
    outline-offset: var(--#{$nav}--OutlineOffset);

    > * {
      @include pf-v6-mirror-inline-on-rtl;
    }
  }
}

// - Nav horizontal
.#{$nav}:where(.pf-m-horizontal) {
  padding: 0;
  overflow: hidden;

  // update to flex
  &,
  .#{$nav}__section,
  .#{$nav}__subnav,
  .#{$nav}__list,
  .#{$nav}__item {
    display: flex;
  }

  // - Nav horizontal list
  .#{$nav}__list {
    padding-block-start: var(--#{$nav}--m-horizontal__list--PaddingBlockStart);
    padding-block-end: var(--#{$nav}--m-horizontal__list--PaddingBlockEnd);
    padding-inline-start: var(--#{$nav}--m-horizontal__list--PaddingInlineStart);
    padding-inline-end: var(--#{$nav}--m-horizontal__list--PaddingInlineEnd);
    overflow-x: auto;
    white-space: nowrap;
    scroll-snap-type: var(--#{$nav}__list--ScrollSnapType);
    scroll-padding-inline-end: var(--#{$nav}--m-horizontal__list--PaddingInlineEnd);
    -webkit-overflow-scrolling: touch;

    @include pf-v6-overflow-hide-scroll;
  }

  .#{$nav}__link {
    outline-offset: var(--#{$nav}--OutlineOffset);
  }

  // - Nav subnav
  &.pf-m-subnav {
    --#{$nav}--BackgroundColor: var(--#{$nav}--m-horizontal--m-subnav--BackgroundColor);
    --#{$nav}--m-horizontal__list--PaddingBlockStart: var(--#{$nav}--m-horizontal--m-subnav__list--PaddingBlockStart);
    --#{$nav}--m-horizontal__list--PaddingBlockEnd: var(--#{$nav}--m-horizontal--m-subnav__list--PaddingBlockEnd);
    --#{$nav}--m-horizontal__list--PaddingInlineStart: var(--#{$nav}--m-horizontal--m-subnav__list--PaddingInlineStart);
    --#{$nav}--m-horizontal__list--PaddingInlineEnd: var(--#{$nav}--m-horizontal--m-subnav__list--PaddingInlineEnd);
    --#{$nav}--m-horizontal--m-scrollable__list--PaddingInlineStart: var(--#{$nav}--m-horizontal--m-subnav--m-scrollable__list--PaddingInlineStart);
    --#{$nav}--m-horizontal--m-scrollable__list--PaddingInlineEnd: var(--#{$nav}--m-horizontal--m-subnav--m-scrollable__list--PaddingInlineEnd);
    --#{$nav}__link--PaddingBlockStart: var(--#{$nav}--m-horizontal--m-subnav__link--PaddingBlockStart);
    --#{$nav}__link--PaddingBlockEnd: var(--#{$nav}--m-horizontal--m-subnav__link--PaddingBlockEnd);

    border-radius: var(--#{$nav}--m-horizontal--m-subnav--BorderRadius);
  }

  &.pf-m-scrollable {
    --#{$nav}--m-horizontal__list--PaddingInlineStart: var(--#{$nav}--m-horizontal--m-scrollable__list--PaddingInlineStart);
    --#{$nav}--m-horizontal__list--PaddingInlineEnd: var(--#{$nav}--m-horizontal--m-scrollable__list--PaddingInlineEnd);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy