import {UnderlineNav} from '@primer/react/drafts'
<UnderlineNav aria-label="Repository"><UnderlineNav.Item aria-current="page">Code</UnderlineNav.Item><UnderlineNav.Item>Issues</UnderlineNav.Item><UnderlineNav.Item>Pull Requests</UnderlineNav.Item></UnderlineNav>
<UnderlineNav aria-label="Repository"><UnderlineNav.Item aria-current="page" icon={CodeIcon}>Code</UnderlineNav.Item><UnderlineNav.Item icon={IssueOpenedIcon} counter={30}>Issues</UnderlineNav.Item><UnderlineNav.Item icon={GitPullRequestIcon} counter={3}>Pull Requests</UnderlineNav.Item><UnderlineNav.Item icon={CommentDiscussionIcon}>Discussions</UnderlineNav.Item><UnderlineNav.Item icon={EyeIcon} counter={9}>Actions</UnderlineNav.Item><UnderlineNav.Item icon={EyeIcon} counter={7}>Projects</UnderlineNav.Item></UnderlineNav>
Component first hides icons if they present to optimize for space and show as many items as possible. If there is still an overflow, it will display the items that don't fit in the More
menu.
const Navigation = () => {const items = [{navigation: 'Code', icon: CodeIcon},{navigation: 'Issues', icon: IssueOpenedIcon, counter: 120},{navigation: 'Pull Requests', icon: GitPullRequestIcon, counter: 13},{navigation: 'Discussions', icon: CommentDiscussionIcon, counter: 5},{navigation: 'Actions', icon: PlayIcon, counter: 4},{navigation: 'Projects', icon: ProjectIcon, counter: 9},{navigation: 'Insights', icon: GraphIcon},{navigation: 'Settings', icon: GearIcon, counter: 10},{navigation: 'Security', icon: ShieldLockIcon},]const [selectedIndex, setSelectedIndex] = React.useState(0)return (<Box sx={{width: 750, border: '1px solid', borderBottom: 0, borderColor: 'border.default'}}><UnderlineNav aria-label="Repository">{items.map((item, index) => (<UnderlineNav.Itemkey={item.navigation}icon={item.icon}aria-current={index === selectedIndex ? 'page' : undefined}onSelect={e => {setSelectedIndex(index)e.preventDefault()}}counter={item.counter}>{item.navigation}</UnderlineNav.Item>))}</UnderlineNav></Box>)}render(<Navigation />)
<UnderlineNav aria-label="Repository" loadingCounters={true}><UnderlineNav.Item counter={4} aria-current="page">Code</UnderlineNav.Item><UnderlineNav.Item counter={44}>Issues</UnderlineNav.Item><UnderlineNav.Item>Pull Requests</UnderlineNav.Item></UnderlineNav>
import {Link, useMatch, useResolvedPath} from 'react-router-dom'import {UnderlineNav} from '@primer/react/drafts'function UnderlineNavItem({to, children, ...rest}) {const resolved = useResolvedPath(to)const isCurrent = useMatch({path: resolved.pathname, end: true})return (<UnderlineNav.Item as={Link} to={to} aria-current={isCurrent ? 'page' : undefined} {...rest}>{children}</UnderlineNav.Item>)}const Navigation = () => {return (<UnderlineNav aria-label="Repository"><UnderlineNavItem to="/code" counter={4}>Code</UnderlineNavItem><UnderlineNavItem to="/issues" counter={44}>Issues</UnderlineNavItem><UnderlineNavItem to="/pulls">Pull Requests</UnderlineNavItem></UnderlineNav>)}
import {useRouter} from 'next/router'import Link from 'next/link'import {UnderlineNav} from '@primer/react/drafts'function UnderlineNavItem({href, children, ...rest}) {const router = useRouter()const isCurrent = typeof href === 'string' ? router.asPath === href : router.pathname === href.pathnamereturn (<UnderlineNav.Item s={Link} href={href} aria-current={isCurrent ? 'page' : undefined} {...rest}>{children}</UnderlineNav.Item>)}const Navigation = () => {return (<UnderlineNav aria-label="Repository"><UnderlineNavItem href="/code" counter={4}>Code</UnderlineNavItem><UnderlineNavItem href="/issues" counter={44}>Issues</UnderlineNavItem><UnderlineNavItem href="/pulls">Pull Requests</UnderlineNavItem></UnderlineNav>)}
Name | Type | Default | Description |
---|---|---|---|
afterSelect | (event) => void | The handler that gets called when a nav link child is selected | |
aria-label | string | A unique name for the rendered 'nav' landmark. It will also be used to label the arrow buttons that control the scroll behaviour on coarse pointer devices. (I.e. 'Scroll ${aria-label} left/right') | |
children Required | UnderlineNav.Item[] | ||
loadingCounters | boolean | false | Whether the navigation items are in loading state. Component waits for all the counters to finish loading to prevent multiple layout shifts. |
sx | SystemStyleObject | Style overrides to apply to the component. See also overriding styles. |
Name | Type | Default | Description |
---|---|---|---|
aria-current | | 'page' | 'step' | 'location' | 'date' | 'time' | true | false | false | Set `aria-current` to `"page"` to indicate that the item represents the current page. Set `aria-current` to `"location"` to indicate that the item represents the current location on a page. For more information about `aria-current`, see [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current). |
counter | number | The number to display in the counter label. | |
href | string | The URL that the item navigates to. 'href' is passed to the underlying '<a>' element. If 'as' is specified, the component may need different props and 'href' is ignored. (Required prop for the react router is 'to' for example) | |
icon | Component | The leading icon comes before item label | |
onSelect | (event) => void | The handler that gets called when a nav link is selected. For example, a manual route binding can be done here(I.e. 'navigate(href)' for the react router.) | |
as | React.ElementType | "a" | The underlying element to render — either a HTML element name or a React component. |
as | React.ElementType | "a" | The underlying element to render — either a HTML element name or a React component. |
sx | SystemStyleObject | Style overrides to apply to the component. See also overriding styles. | |
Additional props are passed to the <a> element. See a docs for a list of props accepted by the <a> element. |