BetaPublic beta — Read the release notes
Documentation

Breadcrumb

Standard breadcrumb navigation with multiple levels.

Package
@solidiom/breadcrumb
Version
0.0.1-next.0
Status
stable

Examples

import * as Breadcrumb from "@solidiom/breadcrumb"

;<Breadcrumb.Root>
  <Breadcrumb.List>
    <Breadcrumb.Item>
      <Breadcrumb.Link href="/">Home</Breadcrumb.Link>
    </Breadcrumb.Item>
    <Breadcrumb.Separator />
    <Breadcrumb.Item>
      <Breadcrumb.Link href="/products">Products</Breadcrumb.Link>
    </Breadcrumb.Item>
    <Breadcrumb.Separator />
    <Breadcrumb.Item>
      <Breadcrumb.Link href="/products/widget" current>
        Widget
      </Breadcrumb.Link>
    </Breadcrumb.Item>
  </Breadcrumb.List>
</Breadcrumb.Root>

With ellipsis

Use Ellipsis to indicate skipped levels in a deeply nested breadcrumb trail.

;<Breadcrumb.Root>
  <Breadcrumb.List>
    <Breadcrumb.Item>
      <Breadcrumb.Link href="/">Home</Breadcrumb.Link>
    </Breadcrumb.Item>
    <Breadcrumb.Separator />
    <Breadcrumb.Ellipsis />
    <Breadcrumb.Separator />
    <Breadcrumb.Item>
      <Breadcrumb.Link href="/products/widget" current>
        Widget
      </Breadcrumb.Link>
    </Breadcrumb.Item>
  </Breadcrumb.List>
</Breadcrumb.Root>

Custom separator

Provide custom content to Separator to change the visual divider between items.

;<Breadcrumb.Root>
  <Breadcrumb.List>
    <Breadcrumb.Item>
      <Breadcrumb.Link href="/">Home</Breadcrumb.Link>
    </Breadcrumb.Item>
    <Breadcrumb.Separator>&gt;</Breadcrumb.Separator>
    <Breadcrumb.Item>
      <Breadcrumb.Link href="/docs" current>
        Docs
      </Breadcrumb.Link>
    </Breadcrumb.Item>
  </Breadcrumb.List>
</Breadcrumb.Root>
View source
        /**
 * @solidiom/breadcrumb — Hierarchical navigation breadcrumb.
 *
 * Parts: Root, List, Item, Link, Separator, Ellipsis.
 */

import { type JSX } from "@solidjs/web"
import { applySemanticAttrs } from "@solidiom/runtime"

// ─── Props ─────────────────────────────────────────────────────────────────────

export interface RootProps {
  children: JSX.Element
  class?: string
}

export interface ListProps {
  children: JSX.Element
  class?: string
}

export interface ItemProps {
  children: JSX.Element
  class?: string
}

export interface LinkProps {
  children: JSX.Element
  href: string
  current?: boolean
  class?: string
}

export interface SeparatorProps {
  children?: JSX.Element
  class?: string
}

export interface EllipsisProps {
  children?: JSX.Element
  class?: string
}

// ─── Parts ─────────────────────────────────────────────────────────────────────

export function Root(props: RootProps) {
  return (
    <nav
      aria-label="Breadcrumb"
      class={props.class}
      {...applySemanticAttrs({ scope: "breadcrumb", part: "root" })}
    >
      {props.children}
    </nav>
  )
}

export function List(props: ListProps) {
  return (
    <ol class={props.class} {...applySemanticAttrs({ scope: "breadcrumb", part: "list" })}>
      {props.children}
    </ol>
  )
}

export function Item(props: ItemProps) {
  return (
    <li class={props.class} {...applySemanticAttrs({ scope: "breadcrumb", part: "item" })}>
      {props.children}
    </li>
  )
}

export function Link(props: LinkProps) {
  return (
    <a
      href={props.href}
      aria-current={props.current ? "page" : undefined}
      class={props.class}
      {...applySemanticAttrs({ scope: "breadcrumb", part: "link" })}
    >
      {props.children}
    </a>
  )
}

export function Separator(props: SeparatorProps) {
  return (
    <span
      role="presentation"
      aria-hidden="true"
      class={props.class}
      {...applySemanticAttrs({ scope: "breadcrumb", part: "separator" })}
    >
      {props.children ?? "/"}
    </span>
  )
}

export function Ellipsis(props: EllipsisProps) {
  return (
    <span
      role="presentation"
      class={props.class}
      {...applySemanticAttrs({ scope: "breadcrumb", part: "ellipsis" })}
    >
      {props.children ?? "..."}
    </span>
  )
}