Breadcrumbs
PortedWhere the page is: a trail of links to the pages above it, then the current page. A nav named "Breadcrumb" (change it with aria-label) around an ordered list. Ancestors keep their width; the current page truncates. When the trail is narrower than 40 rem, it shows only "…", the parent and the current page.
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";
export function Preview() {
return (
<Breadcrumbs>
<BreadcrumbsLink href="#breadcrumbs">Tracer</BreadcrumbsLink>
<BreadcrumbsLink href="#breadcrumbs">Compiler Engineer</BreadcrumbsLink>
<BreadcrumbsCurrent>Ana Ruiz</BreadcrumbsCurrent>
</Breadcrumbs>
);
}Installation
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";Examples
Links and the current page
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";
export function LinksAndTheCurrentPage() {
return (
<Breadcrumbs>
<BreadcrumbsLink href="#breadcrumbs">Tracer</BreadcrumbsLink>
<BreadcrumbsLink href="#breadcrumbs">Compiler Engineer</BreadcrumbsLink>
<BreadcrumbsCurrent>Ana Ruiz</BreadcrumbsCurrent>
</Breadcrumbs>
);
}With icons
import { HouseIcon } from "@phosphor-icons/react";
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";
export function WithIcons() {
return (
<Breadcrumbs aria-label="Breadcrumb, with icons">
<BreadcrumbsLink href="#breadcrumbs" icon={<HouseIcon />}>
Home
</BreadcrumbsLink>
<BreadcrumbsLink href="#breadcrumbs">Runs</BreadcrumbsLink>
<BreadcrumbsCurrent>Run 1284</BreadcrumbsCurrent>
</Breadcrumbs>
);
}Small
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";
export function Small() {
return (
<Breadcrumbs size="sm" aria-label="Breadcrumb, small">
<BreadcrumbsLink href="#breadcrumbs">Settings</BreadcrumbsLink>
<BreadcrumbsCurrent>Data quality</BreadcrumbsCurrent>
</Breadcrumbs>
);
}Loading
A placeholder line holds the current page's place until its name arrives.
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";
export function Loading() {
return (
<Breadcrumbs aria-label="Breadcrumb, loading">
<BreadcrumbsLink href="#breadcrumbs">Tracer</BreadcrumbsLink>
<BreadcrumbsCurrent loading />
</Breadcrumbs>
);
}Router links
render puts a router's link in place of the a; it gets the crumb's class and children.
import type { AnchorHTMLAttributes } from "react";
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";
// Stands in for a router's link component, such as React Router's or Next.js's.
function RouterLink({ to, ...props }: AnchorHTMLAttributes<HTMLAnchorElement> & { to: string }) {
return <a href={to} data-router-link="" {...props} />;
}
export function RouterLinks() {
return (
<Breadcrumbs aria-label="Breadcrumb, router links">
<BreadcrumbsLink render={<RouterLink to="#breadcrumbs" />}>Runs</BreadcrumbsLink>
<BreadcrumbsCurrent>Run 1284</BreadcrumbsCurrent>
</Breadcrumbs>
);
}Narrow
Below 40 rem, the trail shows "…", the parent and the current page. Ancestors keep their width; the current page truncates.
import { Breadcrumbs, BreadcrumbsCurrent, BreadcrumbsLink } from "@etched/monet/breadcrumbs";
export function Narrow() {
return (
<div style={{ maxInlineSize: "20rem" }}>
<Breadcrumbs aria-label="Breadcrumb, narrow">
<BreadcrumbsLink href="#breadcrumbs">Tracer</BreadcrumbsLink>
<BreadcrumbsLink href="#breadcrumbs">Compiler Engineer</BreadcrumbsLink>
<BreadcrumbsLink href="#breadcrumbs">Pipeline</BreadcrumbsLink>
<BreadcrumbsCurrent>Ana Ruiz, staff compiler engineer, Toronto</BreadcrumbsCurrent>
</Breadcrumbs>
</div>
);
}Accessibility
- A
navigationlandmark named "Breadcrumb" (change it witharia-label) around an orderedlist. The chevrons are hidden. - The last crumb has
aria-current="page"and is not a link, soTabskips it. Whileloading, it hasaria-busy. - On a narrow trail, the hidden crumbs are hidden from screen readers too, and the "…" is not read.
- With two trails on one page, give each its own
aria-label.