Bỏ qua đến nội dung

Đường dẫn

Hiển thị vị trí của trang trong hệ thống phân cấp của trang web — các đường dẫn liên kết cho tài liệu, danh mục cửa hàng và bảng điều khiển — bằng phông chữ kiểu tân-brutalist in đậm.

import Link from "next/link"

import {

Breadcrumb cho thấy vị trí của trang hiện tại trong cấu trúc phân cấp của site và liên kết đến mọi cấp phía trên nó. Đây không phải một primitive của Base UI — chỉ là HTML ngữ nghĩa (nav + <ol>) dùng useRender của Base UI cho cách kết hợp bằng prop render — tạo kiểu theo công thức neobrutalist: liên kết dùng phông tiêu đề, trang hiện tại in đậm bằng màu chữ chính.

Nên dùng khi:

  • Tài liệu và cơ sở tri thức — Docs / Components / Breadcrumb; người đọc lùi lên một cấp mà không phải mò trong sidebar.
  • Cây danh mục thương mại điện tử — Trang chủ / Quần áo / Áo khoác giúp thoát khỏi một trang sản phẩm ở tầng sâu chỉ bằng một cú nhấp.
  • Dashboard và trình quản lý tệp — dự án lồng nhau, cài đặt hoặc đường dẫn thư mục, nơi chỉ riêng URL không đủ để định vị.

Cài đặt

pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/breadcrumb.json
npx shadcn@latest add https://neobrutalism.com/r/base/breadcrumb.json
yarn dlx shadcn@latest add https://neobrutalism.com/r/base/breadcrumb.json
bunx --bun shadcn@latest add https://neobrutalism.com/r/base/breadcrumb.json

Sao chép và dán đoạn mã sau vào dự án của bạn.

components/ui/breadcrumb.tsx
import * as React from "react"
import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react"
import { Slot } from "radix-ui"

import { cn } from "@/lib/utils"

function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) {
  return (
    <nav
      aria-label="breadcrumb"
      data-slot="breadcrumb"
      className={cn(className)}
      {...props}
    />
  )
}

function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
  return (
    <ol
      data-slot="breadcrumb-list"
      className={cn(
        "flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground",
        className
      )}
      {...props}
    />
  )
}

function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
  return (
    <li
      data-slot="breadcrumb-item"
      className={cn("inline-flex items-center gap-1", className)}
      {...props}
    />
  )
}

function BreadcrumbLink({
  asChild,
  className,
  ...props
}: React.ComponentProps<"a"> & {
  asChild?: boolean
}) {
  const Comp = asChild ? Slot.Root : "a"

  return (
    <Comp
      data-slot="breadcrumb-link"
      className={cn("font-head transition-colors hover:text-foreground", className)}
      {...props}
    />
  )
}

function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
  return (
    <span
      data-slot="breadcrumb-page"
      role="link"
      aria-disabled="true"
      aria-current="page"
      className={cn("font-medium text-foreground", className)}
      {...props}
    />
  )
}

function BreadcrumbSeparator({
  children,
  className,
  ...props
}: React.ComponentProps<"li">) {
  return (
    <li
      data-slot="breadcrumb-separator"
      role="presentation"
      aria-hidden="true"
      className={cn("[&>svg]:size-3.5", className)}
      {...props}
    >
      {children ?? <ChevronRightIcon className="cn-rtl-flip" />}
    </li>
  )
}

function BreadcrumbEllipsis({
  className,
  ...props
}: React.ComponentProps<"span">) {
  return (
    <span
      data-slot="breadcrumb-ellipsis"
      role="presentation"
      aria-hidden="true"
      className={cn(
        "flex size-5 items-center justify-center [&>svg]:size-4",
        className
      )}
      {...props}
    >
      <MoreHorizontalIcon />
      <span className="sr-only">More</span>
    </span>
  )
}

export {
  Breadcrumb,
  BreadcrumbList,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbPage,
  BreadcrumbSeparator,
  BreadcrumbEllipsis,
}

Cập nhật các đường dẫn import cho khớp với cấu trúc dự án của bạn.

Cách dùng

import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from "@/components/ui/breadcrumb"
<Breadcrumb>
  <BreadcrumbList>
    <BreadcrumbItem>
      <BreadcrumbLink render={<a href="/" />}>Home</BreadcrumbLink>
    </BreadcrumbItem>
    <BreadcrumbSeparator />
    <BreadcrumbItem>
      <BreadcrumbLink render={<a href="/components" />}>
        Components
      </BreadcrumbLink>
    </BreadcrumbItem>
    <BreadcrumbSeparator />
    <BreadcrumbItem>
      <BreadcrumbPage>Breadcrumb</BreadcrumbPage>
    </BreadcrumbItem>
  </BreadcrumbList>
</Breadcrumb>

Kết hợp

Dùng cách kết hợp sau để dựng một Breadcrumb:

Breadcrumb
└── BreadcrumbList
    ├── BreadcrumbItem
    │   └── BreadcrumbLink
    ├── BreadcrumbSeparator
    ├── BreadcrumbItem
    │   └── BreadcrumbLink
    ├── BreadcrumbSeparator
    └── BreadcrumbItem
        └── BreadcrumbPage

Ví dụ

Cơ bản

Một breadcrumb cơ bản với một link home và một link components.

import {
  Breadcrumb,
  BreadcrumbItem,

Dấu phân cách tùy chỉnh

Dùng một thành phần tùy chỉnh làm children cho <BreadcrumbSeparator /> để tạo một dấu phân cách tùy chỉnh.

import Link from "next/link"
import { DotIcon } from "lucide-react"

Bạn có thể kết hợp <BreadcrumbItem /> với một <DropdownMenu /> để tạo một dropdown trong breadcrumb.

import Link from "next/link"
import { ChevronDownIcon, DotIcon } from "lucide-react"

Thu gọn

Chúng tôi cung cấp một thành phần <BreadcrumbEllipsis /> để hiển thị trạng thái thu gọn khi breadcrumb quá dài.

import Link from "next/link"

import {

Để dùng một thành phần link tùy chỉnh từ thư viện routing của bạn, bạn có thể dùng prop render trên <BreadcrumbLink />.

import Link from "next/link"

import {

RTL

Để bật hỗ trợ RTL trong Neobrutalism, xem hướng dẫn cấu hình RTL.

"use client"

import Link from "next/link"

Khả năng truy cập

Breadcrumb tuân theo mẫu Breadcrumb của WAI-ARIA: Breadcrumb render một landmark <nav aria-label="breadcrumb"> bọc quanh một danh sách có thứ tự, nên trình đọc màn hình đọc nó như phần điều hướng breadcrumb và người dùng có thể nhảy thẳng tới đó. BreadcrumbPage mang aria-current="page" để đánh dấu vị trí hiện tại, còn các dấu phân cách là aria-hidden nên không bị đọc lên. Các mục chỉ là liên kết thường — hành vi TabEnter tiêu chuẩn, không cần nối thêm gì cho bàn phím.

Tham chiếu API

Thành phần Breadcrumb là phần tử điều hướng gốc bao bọc tất cả thành phần breadcrumb.

PropTypeDefault
classNamestring-

Thành phần BreadcrumbList hiển thị danh sách có thứ tự của các mục breadcrumb.

PropTypeDefault
classNamestring-

Thành phần BreadcrumbItem bao bọc từng mục breadcrumb riêng lẻ.

PropTypeDefault
classNamestring-

Thành phần BreadcrumbLink hiển thị một link có thể nhấp trong breadcrumb.

PropTypeDefault
classNamestring-

Thành phần BreadcrumbPage hiển thị trang hiện tại trong breadcrumb (không thể nhấp).

PropTypeDefault
classNamestring-

Thành phần BreadcrumbSeparator hiển thị một dấu phân cách giữa các mục breadcrumb. Bạn có thể truyền children tùy chỉnh để ghi đè biểu tượng dấu phân cách mặc định.

PropTypeDefault
childrenReact.ReactNode-
classNamestring-

Thành phần BreadcrumbEllipsis hiển thị một chỉ báo dấu ba chấm cho các mục breadcrumb đã thu gọn.

PropTypeDefault
classNamestring-