Navigation

Examples

Grouped

The following example shows two navigation groups, each with a title prop passed into the nav group component. To keep nav groups accessible an aria-label must be passed in if the title prop is not passed in.

Expandable third level

Flyout

A flyout should be a Menu component. Press space or right arrow to open a flyout using the keyboard, use the arrow keys to navigate between flyout items, and press escape or left arrow to close a flyout.

Types

The NavItem onClick prop accepts the NavSelectClickHandler type, which is made up of the following argument and return types:

(
  event: React.FormEvent<HTMLInputElement>,
  itemId: number | string,
  groupId: number | string,
  to: string
) => void;

Props

*required
NameTypeDefaultDescription
aria-labelstringAccessible label for the nav when there are multiple navs on the page
childrenReact.ReactNodeAnything that can be rendered inside of the nav
classNamestringAdditional classes added to the container
onSelect( event: React.FormEvent<HTMLInputElement>, selectedItem: { groupId: number | string; itemId: number | string; to: string; } ) => void() => undefinedCallback for updating when item selection changes
onToggle( event: React.MouseEvent<HTMLButtonElement>, toggledItem: { groupId: number | string; isExpanded: boolean; } ) => void() => undefinedCallback for when a list is expanded or collapsed
ouiaIdnumber | stringValue to overwrite the randomly generated data-ouia-component-id.
ouiaSafebooleantrueSet the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false.
variant'default' | 'horizontal' | 'horizontal-subnav' | 'docked'The nav variant to use. Docked is in beta.
*required
NameTypeDefaultDescription
backScrollAriaLabelstring'Scroll back'Aria-label for the back scroll button
childrenReact.ReactNodeChildren nodes
classNamestringAdditional classes added to the list
forwardScrollAriaLabelstring'Scroll foward'Aria-label for the forward scroll button
*required
NameTypeDefaultDescription
childrenReact.ReactNodenullAnything that can be rendered inside of the group
classNamestring''Additional classes added to the container
idstringgetUniqueId()Identifier to use for the section aria label
titlestringTitle shown for the group
*required
NameTypeDefaultDescription
*required
NameTypeDefaultDescription
componentNo type info'li'
roleNo type info'presentation'
*required
NameTypeDefaultDescription
titlerequiredReact.ReactNodeTitle content shown for the expandable list
buttonPropsanyAdditional props added to the NavExpandable <button>
childrenReact.ReactNode''Anything that can be rendered inside of the expandable list
classNamestring''Additional classes added to the container
groupIdstring | numbernullGroup identifier, will be returned with the onToggle and onSelect callback passed to the Nav component
idstring''Identifier to use for the section aria label
isActivebooleanfalseIf true makes the expandable list title active
isExpandedbooleanfalseBoolean to pragmatically expand or collapse section
onExpand(event: React.MouseEvent<HTMLButtonElement, MouseEvent>, val: boolean) => voidallow consumer to optionally override this callback and manage expand state externally. if passed will not call Nav's onToggle.
ouiaIdnumber | stringValue to overwrite the randomly generated data-ouia-component-id.
srTextstring''If defined, screen readers will read this text instead of the list title

CSS variables

Expand or collapse columnSelectorVariableValue
.pf-v6-c-nav--pf-v6-c-nav__link--PaddingBlockStart
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__link--PaddingBlockEnd
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__link--PaddingInlineStart
1rem
.pf-v6-c-nav--pf-v6-c-nav__link--PaddingInlineEnd
1rem
.pf-v6-c-nav--pf-v6-c-nav__list--RowGap
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__list--ColumnGap
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--PaddingBlockStart
1rem
.pf-v6-c-nav--pf-v6-c-nav--PaddingBlockEnd
1rem
.pf-v6-c-nav--pf-v6-c-nav--PaddingInlineStart
0
.pf-v6-c-nav--pf-v6-c-nav--PaddingInlineEnd
0
.pf-v6-c-nav--pf-v6-c-nav--RowGap
1.5rem
.pf-v6-c-nav--pf-v6-c-nav--ColumnGap
0
.pf-v6-c-nav--pf-v6-c-nav--AlignItems
baseline
.pf-v6-c-nav--pf-v6-c-nav--FontSize
0.875rem
.pf-v6-c-nav--pf-v6-c-nav--FontWeight
400
.pf-v6-c-nav--pf-v6-c-nav--LineHeight
1.5
.pf-v6-c-nav--pf-v6-c-nav--OutlineOffset
calc(0.25rem * -1)
.pf-v6-c-nav--pf-v6-c-nav--BackgroundColor
transparent
.pf-v6-c-nav--pf-v6-c-nav__list--ScrollSnapTypeAxis
x
.pf-v6-c-nav--pf-v6-c-nav__list--ScrollSnapTypeStrictness
proximity
.pf-v6-c-nav--pf-v6-c-nav__list--ScrollSnapType
x proximity
.pf-v6-c-nav--pf-v6-c-nav__item--ScrollSnapAlign
end
.pf-v6-c-nav--pf-v6-c-nav__section-title--FontWeight
500
.pf-v6-c-nav--pf-v6-c-nav__section-title--Color
(In light theme) #151515
.pf-v6-c-nav--pf-v6-c-nav__section-title--PaddingBlockStart
0
.pf-v6-c-nav--pf-v6-c-nav__section-title--PaddingBlockEnd
0
.pf-v6-c-nav--pf-v6-c-nav__section-title--PaddingInlineStart
1rem
.pf-v6-c-nav--pf-v6-c-nav__section-title--PaddingInlineEnd
1rem
.pf-v6-c-nav--pf-v6-c-nav__item--RowGap
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__item--accent--size
3px
.pf-v6-c-nav--pf-v6-c-nav__item--accent--color
(In light theme) #0066cc
.pf-v6-c-nav--pf-v6-c-nav__item--accent--offset
calc(0.5rem * -1)
.pf-v6-c-nav--pf-v6-c-nav__item--accent--BorderRadius
6px
.pf-v6-c-nav--pf-v6-c-nav__item--accent--ScaleY
0
.pf-v6-c-nav--pf-v6-c-nav__item--current--accent--ScaleY
1
.pf-v6-c-nav--pf-v6-c-nav__item--accent--TransitionDuration
0
.pf-v6-c-nav--pf-v6-c-nav__item--current--accent--TransitionDuration
200ms
.pf-v6-c-nav--pf-v6-c-nav__item--accent--TransitionTimingFunction
cubic-bezier(0, 0, .2, 1)
.pf-v6-c-nav--pf-v6-c-nav__item__toggle-icon--Rotate
0
.pf-v6-c-nav--pf-v6-c-nav__item--m-expanded__toggle-icon--Rotate
90deg
.pf-v6-c-nav--pf-v6-c-nav__item__toggle-icon--TransitionDuration--transform
100ms
.pf-v6-c-nav--pf-v6-c-nav__item__toggle-icon--TransitionTimingFunction--transform
cubic-bezier(.4, 0, .2, 1)
.pf-v6-c-nav--pf-v6-c-nav__link--ColumnGap
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__link--AlignItems
baseline
.pf-v6-c-nav--pf-v6-c-nav__link--BorderRadius
6px
.pf-v6-c-nav--pf-v6-c-nav__link--BackgroundColor
(In light theme) rgba(255, 255, 255, 0.0000)
.pf-v6-c-nav--pf-v6-c-nav__link--WhiteSpace
normal
.pf-v6-c-nav--pf-v6-c-nav__link--Color
(In light theme) #4d4d4d
.pf-v6-c-nav--pf-v6-c-nav__link--hover--Color
(In light theme) #151515
.pf-v6-c-nav--pf-v6-c-nav__link--hover--BackgroundColor
(In light theme) #ffffff
.pf-v6-c-nav--pf-v6-c-nav__link--m-current--BackgroundColor
(In light theme) #ffffff
.pf-v6-c-nav--pf-v6-c-nav__link--m-current--Color
(In light theme) #151515
.pf-v6-c-nav--pf-v6-c-nav__link--BorderColor
(In light theme) rgba(255, 255, 255, 0.0000)
.pf-v6-c-nav--pf-v6-c-nav__link--BorderWidth
0px
.pf-v6-c-nav--pf-v6-c-nav__link--hover--BorderWidth
0px
.pf-v6-c-nav--pf-v6-c-nav__link--m-current--BorderWidth
0px
.pf-v6-c-nav--pf-v6-c-nav__link--TransitionDuration--background-color
200ms
.pf-v6-c-nav--pf-v6-c-nav__link--TransitionTimingFunction--background-color
cubic-bezier(.4, 0, .2, 1)
.pf-v6-c-nav--pf-v6-c-nav__link--m-current--TransitionDuration--color
100ms
.pf-v6-c-nav--pf-v6-c-nav__link--m-current--TransitionTimingFunction--color
cubic-bezier(.4, 0, .2, 1)
.pf-v6-c-nav--pf-v6-c-nav__link-icon--Color
(In light theme) #707070
.pf-v6-c-nav--pf-v6-c-nav__link--m-current__link-icon--Color
(In light theme) #1f1f1f
.pf-v6-c-nav--pf-v6-c-nav__link-text--FontSize
initial
.pf-v6-c-nav--pf-v6-c-nav__subnav--RowGap
3px
.pf-v6-c-nav--pf-v6-c-nav__subnav--PaddingBlockStart
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__subnav--PaddingBlockEnd
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__subnav--PaddingInlineStart
1rem
.pf-v6-c-nav--pf-v6-c-nav__subnav--TransitionDuration--expand
200ms
.pf-v6-c-nav--pf-v6-c-nav__subnav--TransitionDuration--expand--slide
0s
.pf-v6-c-nav--pf-v6-c-nav__subnav--TransitionDuration--collapse
100ms
.pf-v6-c-nav--pf-v6-c-nav__subnav--TransitionDuration--collapse--slide
0s
.pf-v6-c-nav--pf-v6-c-nav__subnav--TransitionTimingFunction--expand
cubic-bezier(.4, 0, .2, 1)
.pf-v6-c-nav--pf-v6-c-nav__subnav--TranslateY
0
.pf-v6-c-nav--pf-v6-c-nav__subnav--hidden--TranslateY
0
.pf-v6-c-nav--pf-v6-c-nav__scroll-button--BorderColor
(In light theme) #c7c7c7
.pf-v6-c-nav--pf-v6-c-nav__scroll-button--BorderWidth
1px
.pf-v6-c-nav--pf-v6-c-nav__scroll-button--first-of-type--c-button--BorderStartStartRadius
999px
.pf-v6-c-nav--pf-v6-c-nav__scroll-button--first-of-type--c-button--BorderEndStartRadius
999px
.pf-v6-c-nav--pf-v6-c-nav__scroll-button--last-of-type--c-button--BorderStartEndRadius
999px
.pf-v6-c-nav--pf-v6-c-nav__scroll-button--last-of-type--c-button--BorderEndEndRadius
999px
.pf-v6-c-nav--pf-v6-c-nav__toggle--PaddingInlineStart
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__toggle--PaddingInlineEnd
0.5rem
.pf-v6-c-nav--pf-v6-c-nav__toggle--TranslateY
calc((1.5 * 0.875rem / 2) - 50%)
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal__list--PaddingBlockStart
0
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal__list--PaddingBlockEnd
0
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal__list--PaddingInlineStart
0
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal__list--PaddingInlineEnd
0
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-scrollable__list--PaddingInlineStart
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-scrollable__list--PaddingInlineEnd
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav--BackgroundColor
(In light theme) #f2f2f2
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav--BorderRadius
999px
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav--BorderWidth
0px
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav--BorderColor
(In light theme) rgba(255, 255, 255, 0.0000)
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__list--PaddingBlockStart
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__list--PaddingBlockEnd
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__list--PaddingInlineStart
1rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__list--PaddingInlineEnd
1rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav--m-scrollable__list--PaddingInlineStart
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav--m-scrollable__list--PaddingInlineEnd
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__link--PaddingBlockStart
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__link--PaddingBlockEnd
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__link--PaddingInlineStart
1rem
.pf-v6-c-nav--pf-v6-c-nav--m-horizontal--m-subnav__link--PaddingInlineEnd
1rem
.pf-v6-c-nav--pf-v6-c-nav--m-docked__list--RowGap
0.25rem
.pf-v6-c-nav--pf-v6-c-nav--m-docked__link--PaddingInlineStart
0.5rem
.pf-v6-c-nav--pf-v6-c-nav--m-docked__link--PaddingInlineEnd
0.5rem
.pf-v6-c-nav--pf-v6-c-nav--m-docked__link--hover--BackgroundColor
(In light theme) rgba(199, 199, 199, 0.2500)
.pf-v6-c-nav--pf-v6-c-nav--m-docked__link--m-current--BackgroundColor
(In light theme) rgba(199, 199, 199, 0.2500)
.pf-v6-c-nav.pf-m-inset--pf-v6-c-nav--PaddingInlineStart
1rem
.pf-v6-c-nav.pf-m-inset--pf-v6-c-nav--PaddingInlineEnd
1rem
.pf-v6-c-nav.pf-m-docked--pf-v6-c-nav--PaddingBlockStart
0
.pf-v6-c-nav.pf-m-docked--pf-v6-c-nav--PaddingBlockEnd
0
.pf-v6-c-nav.pf-m-docked--pf-v6-c-nav__list--RowGap
0.25rem
.pf-v6-c-nav.pf-m-docked--pf-v6-c-nav__link--PaddingInlineStart
0.5rem
.pf-v6-c-nav.pf-m-docked--pf-v6-c-nav__link--PaddingInlineEnd
0.5rem
.pf-v6-c-nav.pf-m-docked--pf-v6-c-nav__link--hover--BackgroundColor
(In light theme) rgba(199, 199, 199, 0.2500)
.pf-v6-c-nav.pf-m-docked--pf-v6-c-nav__link--m-current--BackgroundColor
(In light theme) rgba(199, 199, 199, 0.2500)
.pf-v6-c-nav .pf-v6-c-menu--pf-v6-c-menu--MinWidth
100%
.pf-v6-c-nav .pf-v6-c-menu.pf-m-drilldown--pf-v6-c-menu--PaddingBlockStart
0
.pf-v6-c-nav .pf-v6-c-menu.pf-m-drilldown--pf-v6-c-menu--PaddingBlockEnd
0
.pf-v6-c-nav .pf-v6-c-menu.pf-m-drilldown--pf-v6-c-menu--BackgroundColor
transparent
.pf-v6-c-nav .pf-v6-c-menu.pf-m-drilldown--pf-v6-c-menu--BoxShadow
none
.pf-v6-c-nav .pf-v6-c-menu.pf-m-drilldown--pf-v6-c-menu__list-item--hover--BackgroundColor
(In light theme) #ffffff
.pf-v6-c-nav__nav--pf-v6-c-nav__item--RowGap--row-offset
calc(0.5rem / 2 * -1)
.pf-v6-c-nav__nav--pf-v6-c-nav__link--clickable-inset--Block
calc(0.5rem / 2 * -1)
.pf-v6-c-nav__nav--pf-v6-c-nav__button--RowGap--row-offset
calc(0.5rem * -1)
.pf-v6-c-nav__subnav--pf-v6-c-nav__list--RowGap
3px
.pf-v6-c-nav__subnav[hidden]--pf-v6-c-nav__subnav--TransitionDelay--expand--focus
200ms
.pf-v6-c-nav__subnav[hidden]--pf-v6-c-nav__subnav--TransitionDuration--expand
100ms
.pf-v6-c-nav__subnav[hidden]--pf-v6-c-nav__subnav--TransitionDuration--expand--slide
0s
.pf-v6-c-nav__subnav[hidden]--pf-v6-c-nav__subnav--PaddingBlockStart
0
.pf-v6-c-nav__subnav[hidden]--pf-v6-c-nav__subnav--PaddingBlockEnd
0
.pf-v6-c-nav__subnav[hidden]--pf-v6-c-nav__subnav--TranslateY
0
.pf-v6-c-nav__item:has(> .pf-v6-c-nav__link.pf-m-current)--pf-v6-c-nav__item--accent--ScaleY
1
.pf-v6-c-nav__item:has(> .pf-v6-c-nav__link.pf-m-current)--pf-v6-c-nav__item--accent--TransitionDuration
200ms
.pf-v6-c-nav__link:hover--pf-v6-c-nav__link--BorderWidth
0px
.pf-v6-c-nav__link.pf-m-current--pf-v6-c-nav__link-icon--Color
(In light theme) #1f1f1f
.pf-v6-c-nav__link.pf-m-current--pf-v6-c-nav__link--BorderWidth
0px
.pf-v6-c-nav__item:where(.pf-m-flyout) .pf-v6-c-nav__toggle-icon--pf-v6-c-nav__item--m-expanded__toggle-icon--Rotate
0
.pf-v6-c-nav__scroll-button:first-of-type .pf-v6-c-button--pf-v6-c-button--BorderStartStartRadius
999px
.pf-v6-c-nav__scroll-button:first-of-type .pf-v6-c-button--pf-v6-c-button--BorderEndStartRadius
999px
.pf-v6-c-nav__scroll-button:last-of-type .pf-v6-c-button--pf-v6-c-button--BorderStartEndRadius
999px
.pf-v6-c-nav__scroll-button:last-of-type .pf-v6-c-button--pf-v6-c-button--BorderEndEndRadius
999px
.pf-v6-c-nav:where(.pf-m-horizontal)--pf-v6-c-nav__item--accent--content
none
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav--BackgroundColor
(In light theme) #f2f2f2
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav--m-horizontal__list--PaddingBlockStart
0.25rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav--m-horizontal__list--PaddingBlockEnd
0.25rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav--m-horizontal__list--PaddingInlineStart
1rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav--m-horizontal__list--PaddingInlineEnd
1rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav--m-horizontal--m-scrollable__list--PaddingInlineStart
0.25rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav--m-horizontal--m-scrollable__list--PaddingInlineEnd
0.25rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav__link--PaddingBlockStart
0.25rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-subnav--pf-v6-c-nav__link--PaddingBlockEnd
0.25rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-scrollable--pf-v6-c-nav--m-horizontal__list--PaddingInlineStart
0.25rem
.pf-v6-c-nav:where(.pf-m-horizontal).pf-m-scrollable--pf-v6-c-nav--m-horizontal__list--PaddingInlineEnd
0.25rem