Đườ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.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/breadcrumb.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/breadcrumb.jsonbunx --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.
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
└── BreadcrumbPageVí 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"
Dropdown#
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 {Thành phần link#
Để 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 Tab và Enter tiêu chuẩn, không cần nối thêm gì cho bàn phím.
Tham chiếu API#
Breadcrumb#
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.
| Prop | Type | Default |
|---|---|---|
className | string | - |
BreadcrumbList#
Thành phần BreadcrumbList hiển thị danh sách có thứ tự của các mục breadcrumb.
| Prop | Type | Default |
|---|---|---|
className | string | - |
BreadcrumbItem#
Thành phần BreadcrumbItem bao bọc từng mục breadcrumb riêng lẻ.
| Prop | Type | Default |
|---|---|---|
className | string | - |
BreadcrumbLink#
Thành phần BreadcrumbLink hiển thị một link có thể nhấp trong breadcrumb.
| Prop | Type | Default |
|---|---|---|
className | string | - |
BreadcrumbPage#
Thành phần BreadcrumbPage hiển thị trang hiện tại trong breadcrumb (không thể nhấp).
| Prop | Type | Default |
|---|---|---|
className | string | - |
BreadcrumbSeparator#
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.
| Prop | Type | Default |
|---|---|---|
children | React.ReactNode | - |
className | string | - |
BreadcrumbEllipsis#
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.
| Prop | Type | Default |
|---|---|---|
className | string | - |