Breadcrumb
Navigation trail that shows the user's current location in a page hierarchy, with separator icons and current-page indication.
<arc-breadcrumb>Overview
Breadcrumbs are a secondary navigation pattern that reveals the user's position inside a site hierarchy. Each crumb is a clickable link back to a parent page, separated by a visual divider, with the final crumb representing the current page. Users can see where they are and jump several levels up without repeatedly hitting the browser back button.
The component renders a <nav> landmark with aria-label="Breadcrumb" and marks the last item with aria-current="page", following the WAI-ARIA Breadcrumb pattern. Separator characters are injected automatically and hidden from assistive technology with aria-hidden="true", so screen readers announce a list of links instead of reading out each slash or chevron.
Breadcrumbs work best alongside a primary navigation element like a sidebar or top bar. They do not replace top-level navigation. They answer "where am I?" once the user has drilled into a deep page. In applications with a flat structure (fewer than two levels), breadcrumbs add clutter and should be omitted.
Guidelines
When to use
- Place breadcrumbs near the top of the page, above the main content heading, so users see their location before engaging with page content
- Always include the root page (e.g. "Dashboard" or "Home") as the first crumb to anchor the trail
- Keep crumb labels short: one or two words that match the actual page title so users can predict where each link goes
- Use breadcrumbs in apps with three or more levels of hierarchy where users frequently navigate between depths
- Listen for the `arc-navigate` event to handle route changes in single-page applications instead of relying on full page navigations
When not to use
- Do not use breadcrumbs as a replacement for primary navigation; they are a supplementary wayfinding aid
- Avoid making the current (last) crumb a clickable link; it represents the page the user is already on
- Do not show breadcrumbs on top-level pages with no parent; a single crumb provides no navigational value
- Avoid duplicating breadcrumbs and a back button in the same spot. Pick one pattern to reduce visual noise
- Do not include more than five or six levels in a single trail; deep trails suggest an information architecture that is too nested
Features
- Automatic separator icons inserted between crumb items, with no manual markup
- Current-page indication via `aria-current="page"` on the last item with distinct font weight
- Fires `arc-navigate` custom event on crumb click, for SPA routing without full page reloads
- Wraps on narrow viewports using flex-wrap so long trails never overflow
- Renders a semantic `<nav>` landmark with `aria-label="Breadcrumb"` for assistive technology
- Separator characters hidden from screen readers with `aria-hidden="true"`
- Focus-visible ring on each link for keyboard-only users
- Declarative slotted API: compose `<arc-breadcrumb-item>` children in any template language
- CSS custom-property theming for text color, separator color, and spacing via design tokens
Preview
Usage
Layout and styling work without JavaScript via the HTML/CSS versions. Interactive features like events and state management require the Web Component or a framework wrapper.
<arc-breadcrumb>
<arc-breadcrumb-item href="/dashboard">Dashboard</arc-breadcrumb-item>
<arc-breadcrumb-item href="/dashboard/projects">Projects</arc-breadcrumb-item>
<arc-breadcrumb-item href="/dashboard/projects/arc-ui">ARC UI</arc-breadcrumb-item>
<arc-breadcrumb-item>Settings</arc-breadcrumb-item>
</arc-breadcrumb>import { Breadcrumb, BreadcrumbItem } from '@arclux/arc-ui-react';
export default function Example() {
return (
<Breadcrumb>
<BreadcrumbItem href="/dashboard">Dashboard</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects">Projects</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects/arc-ui">ARC UI</BreadcrumbItem>
<BreadcrumbItem>Settings</BreadcrumbItem>
</Breadcrumb>
);
}<script setup>
import { Breadcrumb, BreadcrumbItem } from '@arclux/arc-ui-vue';
</script>
<template>
<Breadcrumb>
<BreadcrumbItem href="/dashboard">Dashboard</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects">Projects</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects/arc-ui">ARC UI</BreadcrumbItem>
<BreadcrumbItem>Settings</BreadcrumbItem>
</Breadcrumb>
</template><script>
import { Breadcrumb, BreadcrumbItem } from '@arclux/arc-ui-svelte';
</script>
<Breadcrumb>
<BreadcrumbItem href="/dashboard">Dashboard</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects">Projects</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects/arc-ui">ARC UI</BreadcrumbItem>
<BreadcrumbItem>Settings</BreadcrumbItem>
</Breadcrumb>import { Component } from '@angular/core';
import { Breadcrumb, BreadcrumbItem } from '@arclux/arc-ui-angular';
@Component({
imports: [Breadcrumb, BreadcrumbItem],
template: `
<arc-breadcrumb>
<arc-breadcrumb-item href="/dashboard">Dashboard</arc-breadcrumb-item>
<arc-breadcrumb-item href="/dashboard/projects">Projects</arc-breadcrumb-item>
<arc-breadcrumb-item href="/dashboard/projects/arc-ui">ARC UI</arc-breadcrumb-item>
<arc-breadcrumb-item>Settings</arc-breadcrumb-item>
</arc-breadcrumb>
`,
})
export class BreadcrumbDemoComponent {}import { Breadcrumb, BreadcrumbItem } from '@arclux/arc-ui-solid';
export default function BreadcrumbDemo() {
return (
<Breadcrumb>
<BreadcrumbItem href="/dashboard">Dashboard</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects">Projects</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects/arc-ui">ARC UI</BreadcrumbItem>
<BreadcrumbItem>Settings</BreadcrumbItem>
</Breadcrumb>
);
}import { Breadcrumb, BreadcrumbItem } from '@arclux/arc-ui-preact';
export default function BreadcrumbDemo() {
return (
<Breadcrumb>
<BreadcrumbItem href="/dashboard">Dashboard</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects">Projects</BreadcrumbItem>
<BreadcrumbItem href="/dashboard/projects/arc-ui">ARC UI</BreadcrumbItem>
<BreadcrumbItem>Settings</BreadcrumbItem>
</Breadcrumb>
);
}<arc-breadcrumb>
<arc-breadcrumb-item href="/dashboard">Dashboard</arc-breadcrumb-item>
<arc-breadcrumb-item href="/dashboard/projects">Projects</arc-breadcrumb-item>
<arc-breadcrumb-item href="/dashboard/projects/arc-ui">ARC UI</arc-breadcrumb-item>
<arc-breadcrumb-item>Settings</arc-breadcrumb-item>
</arc-breadcrumb><!-- arc-breadcrumb is hybrid — CSS handles layout, JS enhances interactivity -->
<arc-breadcrumb></arc-breadcrumb>API
separatorstring'/'- Character used as the separator between breadcrumb items. Common options: '/', '>', '•'.
labelstring'Breadcrumb'
Events
arc-navigate- Fired when a breadcrumb item is clicked
See Also
- PaginationPage navigation control with previous/next arrows, numbered page buttons, and smart ellipsis truncation.
- Navigation MenuHorizontal navigation bar with hover-triggered dropdown sub-menus and full keyboard accessibility. Designed for marketing sites, documentation hubs, and product landing pages where top-level sections expand into categorised link lists.
- LinkStyled anchor with nav, muted, and default variants.