Blueprint

Breadcrumb

Breadcrumbs is a navigation pattern that helps users understand the hierarchy of a website.

Import

Blueprint exports 4 breadcrumb-related components:

  • Breadcrumb: The parent container for breadcrumbs.
  • BreadcrumbItem: Individual breadcrumb element containing a link and a divider.
  • BreadcrumbLink: The breadcrumb link.
  • BreadcrumbSeparator: The visual separator between each breadcrumb.

import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbSeparator,
} from '@hover/blueprint'

Usage

Add isCurrentPage prop to the BreadcrumbItem that matches the current path. When this prop is present, the BreadcrumbLink renders a span with aria-current set to page instead of an anchor element.


<Breadcrumb>
<BreadcrumbItem>
<BreadcrumbLink href='#'>Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem>
<BreadcrumbLink href='#'>Docs</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem isCurrentPage>
<BreadcrumbLink href='#'>Breadcrumb</BreadcrumbLink>
</BreadcrumbItem>
</Breadcrumb>

Separators

Change the separator used in the breadcrumb by passing a string, like - or an icon.


<Breadcrumb separator='-'>
<BreadcrumbItem>
<BreadcrumbLink href='#'>Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem>
<BreadcrumbLink href='#'>About</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem isCurrentPage>
<BreadcrumbLink href='#'>Contact</BreadcrumbLink>
</BreadcrumbItem>
</Breadcrumb>

Using an icon as the separator


<Breadcrumb spacing='8px' separator={<ChevronRightIcon color='gray.500' />}>
<BreadcrumbItem>
<BreadcrumbLink href='#'>Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem>
<BreadcrumbLink href='#'>About</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem isCurrentPage>
<BreadcrumbLink href='#'>Contact</BreadcrumbLink>
</BreadcrumbItem>
</Breadcrumb>

Using a separator in last item

If you want to have a BreadcrumbSeparator in the last item of the Breadcrumb you have different ways to achieve it. But to avoid the 'React does not recognize the isLastChild prop on a DOM element.' error you can not simply add the separator directly in the Breadcrumb.

The clean way to achieve it is to put the separator in the last BreadcrumbItem. Feel free to also inspect the example below with the browsers dev tools.


<Box>
<Breadcrumb>
<BreadcrumbItem>
<BreadcrumbLink href=''>Page 1</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem>
<BreadcrumbLink href=''>Page 2</BreadcrumbLink>
</BreadcrumbItem>
{/* this will generate a span in the ol HTML tag which causes the error: */}
{/* <BreadcrumbSeparator /> */}
</Breadcrumb>
{/* preferred solution: */}
<Breadcrumb pt='3'>
<BreadcrumbItem>
<BreadcrumbLink href=''>Page 1</BreadcrumbLink>
</BreadcrumbItem>
{/* this creates the exact same HTML as for page 1 */}
<BreadcrumbItem>
<BreadcrumbLink href=''>Page 2</BreadcrumbLink>
<BreadcrumbSeparator />
</BreadcrumbItem>
</Breadcrumb>
<Breadcrumb pt='3'>
<BreadcrumbItem>
<BreadcrumbLink href=''>Page 1</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem>
<BreadcrumbLink href=''>Page 2</BreadcrumbLink>
</BreadcrumbItem>
{/* this works too, but creates an additional empty li HTML tag */}
<BreadcrumbItem />
</Breadcrumb>
</Box>

Composition

Breadcrumb composes Box so you can pass all Box props to change the style of the breadcrumbs. Let's say we need to reduce the fontSize of the breadcrumbs.


<Breadcrumb fontWeight='medium' fontSize='sm'>
<BreadcrumbItem>
<BreadcrumbLink href='#'>Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem>
<BreadcrumbLink href='#'>About</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem isCurrentPage>
<BreadcrumbLink href='#'>Current</BreadcrumbLink>
</BreadcrumbItem>
</Breadcrumb>

Usage with Routing Library

To use the Breadcrumb with a routing Library like Reach Router or React Router, all you need to do is to pass the as prop to the BreadcrumbLink component.

It'll replace the rendered a tag with Reach's Link.


// import { Link } from "@reach/router"
<Breadcrumb>
<BreadcrumbItem>
<BreadcrumbLink as={Link} to='#'>
Home
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem>
<BreadcrumbLink as={Link} to='#'>
About
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbItem isCurrentPage>
<BreadcrumbLink>Contact</BreadcrumbLink>
</BreadcrumbItem>
</Breadcrumb>

Accessibility

  • The Breadcrumbs are rendered in a nav to denote that it is a navigation landmark.
  • The Breadcrumb nav has aria-label set to breadcrumb.
  • The BreadcrumbItem with isCurrentPage prop adds the aria-current=page to the BreadcrumbLink.
  • The separator has role set to presentation to denote that its for presentation purposes.


Copyright © 2024 Hover Inc. All Rights Reserved.