<!-- Protocore Design System — Breadcrumb -->
# Breadcrumb

- **Category:** Navigation (`navigation`)
- **Slug:** `navigation/breadcrumb`
- **Status:** stable
- **Platforms:** web
- **Import:** `import { Breadcrumb } from "@protocore/pds";`
- **Docs:** https://pds.protocore.io/components/navigation/breadcrumb

> Breadcrumb trail — a mono UPPERCASE, "/"-separated path where crumbs are links and the last is the inked current page.

## When to use it

Use **Breadcrumb** to show where a page sits in a hierarchy and give a one-click path back up — deep console routes, nested resources, docs sections.

- Pair it with **PageHeader**: the breadcrumb sits above, the h1 restates the leaf.
- Moving between *pages of results* on one screen? That's **Pagination**, not a breadcrumb.
- Switching peer views of the current entity? Use **Tabs**.
- With a router, make each crumb a real link via `Breadcrumb.Link asChild` wrapping your framework's `<Link>`.

## Props

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `aria-label` | `string` | no | — | Overrides the default `"Breadcrumb"` accessible name. |
| `className` | `string` | no | — | — |
| `style` | `CSSProperties` | no | — | — |

## Examples

### Basics

Wrap each crumb in a `Breadcrumb.Item`. Use `Breadcrumb.Link` for ancestors and `Breadcrumb.Page` for the current, non-interactive location. Separators are drawn by CSS.

```tsx
import { Breadcrumb } from "@protocore/pds";

export default function BreadcrumbBasics() {
  return (
    <Breadcrumb>
      <Breadcrumb.Item>
        <Breadcrumb.Link href="#">Console</Breadcrumb.Link>
      </Breadcrumb.Item>
      <Breadcrumb.Item>
        <Breadcrumb.Link href="#">Networks</Breadcrumb.Link>
      </Breadcrumb.Item>
      <Breadcrumb.Item>
        <Breadcrumb.Link href="#">Ethereum</Breadcrumb.Link>
      </Breadcrumb.Item>
      <Breadcrumb.Item>
        <Breadcrumb.Page>Endpoint 0xA1…9F</Breadcrumb.Page>
      </Breadcrumb.Item>
    </Breadcrumb>
  );
}
```

### Two levels

A breadcrumb earns its place from two levels up. Below that, a plain page title is enough.

```tsx
import { Breadcrumb } from "@protocore/pds";

export default function BreadcrumbTwoLevel() {
  return (
    <Breadcrumb>
      <Breadcrumb.Item>
        <Breadcrumb.Link href="#">Ledger</Breadcrumb.Link>
      </Breadcrumb.Item>
      <Breadcrumb.Item>
        <Breadcrumb.Page>Settlements</Breadcrumb.Page>
      </Breadcrumb.Item>
    </Breadcrumb>
  );
}
```

## Do & don't

**Do**

- Make Breadcrumb.Page the last crumb and never a link — it's the current page.
- Use asChild on Breadcrumb.Link to render a router link and keep client-side nav.
- Truncate long leaf labels (e.g. an id) rather than wrapping the trail.
- Keep the trail to the real hierarchy, not the user's click history.

**Don't**

- Don't show a breadcrumb one level deep — it adds noise without payoff.
- Don't use it as the primary navigation for a flat site.
- Don't make the current page a clickable link back to itself.
- Don't hand-draw "/" separators in markup — CSS renders them.

## Accessibility

**Keyboard**

| Keys | Action |
| --- | --- |
| `Tab` | Move focus to the next crumb link |
| `Enter` | Follow the focused crumb link |

**Notes**

- The root renders a `<nav aria-label="Breadcrumb">` wrapping an ordered list, so assistive tech announces it as a landmark; override the label via `aria-label`.
- Breadcrumb.Page carries `aria-current="page"` and `aria-disabled="true"` so the current location is announced and not actionable.

## Related

`page-header`, `pagination`, `tabs`

---

© Protocore. All rights reserved. Use of the Protocore Design System requires prior written authorization from Protocore (contact@protocore.io). These machine-readable materials must not be ingested into ML-training datasets or derivative design systems. See https://pds.protocore.io/legal/
