پرش به محتوا

جدول

جدول HTML معنایی برای فاکتورها، فهرست‌های مدیریتی و جدول‌های قیمت‌گذاری — سطرهای حاشیه‌دار، سربرگ‌های پررنگ و سایهٔ سخت نئوبروتالیست.

import {
  Table,
  TableBody,

Table عناصر بومی جدول HTML — <table>، <thead>، <tbody>، <th>، <td>، <caption> — را استایل می‌کند بدون کتابخانهٔ primitive زیرین؛ variantهای Radix و Base همان فایل را می‌فرستند. دستور پخت نئوبروتالیستی: حاشیهٔ ضخیم و سایهٔ سخت دور کل جدول، سلول‌های header با فونت heading، و divider ردیف 2px.

برای این موارد از آن استفاده کنید:

  • فاکتور و سفارش — اقلام خط با ردیف TableFooter برای جمع.
  • فهرست ادمین — کاربر، API key، اشتراک، با dropdown اقدامات ردیف.
  • شبکهٔ قیمت و مقایسه — ماتریس ویژگی جایی که header ستون معنا را حمل می‌کند.

نصب

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

کد زیر را کپی کرده و در پروژهٔ خود بچسبانید.

components/ui/table.tsx
"use client"

import * as React from "react"

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

function Table({ className, ...props }: React.ComponentProps<"table">) {
  return (
    <div
      data-slot="table-container"
      className="relative w-full overflow-x-auto rounded border-2 shadow-md"
    >
      <table
        data-slot="table"
        className={cn("w-full caption-bottom text-sm", className)}
        {...props}
      />
    </div>
  )
}

function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
  return (
    <thead
      data-slot="table-header"
      className={cn("[&_tr]:border-b-2", className)}
      {...props}
    />
  )
}

function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
  return (
    <tbody
      data-slot="table-body"
      className={cn("[&_tr:last-child]:border-0", className)}
      {...props}
    />
  )
}

function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
  return (
    <tfoot
      data-slot="table-footer"
      className={cn(
        "border-t-2 bg-muted/50 font-medium [&>tr]:last:border-b-0",
        className
      )}
      {...props}
    />
  )
}

function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
  return (
    <tr
      data-slot="table-row"
      className={cn(
        "border-b-2 transition-colors hover:bg-accent has-aria-expanded:bg-accent data-[state=selected]:bg-accent",
        className
      )}
      {...props}
    />
  )
}

function TableHead({ className, ...props }: React.ComponentProps<"th">) {
  return (
    <th
      data-slot="table-head"
      className={cn(
        "h-10 bg-muted px-2 text-left align-middle font-head font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",
        className
      )}
      {...props}
    />
  )
}

function TableCell({ className, ...props }: React.ComponentProps<"td">) {
  return (
    <td
      data-slot="table-cell"
      className={cn(
        "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0",
        className
      )}
      {...props}
    />
  )
}

function TableCaption({
  className,
  ...props
}: React.ComponentProps<"caption">) {
  return (
    <caption
      data-slot="table-caption"
      className={cn("mt-4 text-sm text-muted-foreground", className)}
      {...props}
    />
  )
}

export {
  Table,
  TableHeader,
  TableBody,
  TableFooter,
  TableHead,
  TableRow,
  TableCell,
  TableCaption,
}

مسیرهای ایمپورت را مطابق با تنظیمات پروژهٔ خود به‌روزرسانی کنید.

استفاده

import {
  Table,
  TableBody,
  TableCaption,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table"
<Table>
  <TableCaption>A list of your recent invoices.</TableCaption>
  <TableHeader>
    <TableRow>
      <TableHead className="w-[100px]">Invoice</TableHead>
      <TableHead>Status</TableHead>
      <TableHead>Method</TableHead>
      <TableHead className="text-right">Amount</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    <TableRow>
      <TableCell className="font-medium">INV001</TableCell>
      <TableCell>Paid</TableCell>
      <TableCell>Credit Card</TableCell>
      <TableCell className="text-right">$250.00</TableCell>
    </TableRow>
  </TableBody>
</Table>

ترکیب

برای ساخت یک Table از ترکیب زیر استفاده کنید:

Table
├── TableCaption
├── TableHeader
│   └── TableRow
│       ├── TableHead
│       ├── TableHead
│       ├── TableHead
│       └── TableHead
├── TableBody
│   ├── TableRow
│   │   ├── TableCell
│   │   ├── TableCell
│   │   ├── TableCell
│   │   └── TableCell
│   └── TableRow
│       ├── TableCell
│       ├── TableCell
│       ├── TableCell
│       └── TableCell
└── TableFooter

نمونه‌ها

پابرگ جدول

برای افزودن یک پابرگ به جدول از کامپوننت <TableFooter /> استفاده کنید.

import {
  Table,
  TableBody,

کنش‌ها

جدولی که با استفاده از کامپوننت <DropdownMenu /> کنش‌های هر ردیف را نمایش می‌دهد.

import { MoreHorizontalIcon } from "lucide-react"

import { Button } from "@/components/ui/button"

Data Table

می‌توانید از کامپوننت <Table /> برای ساخت جدول‌های داده پیچیده‌تر استفاده کنید. آن را با @tanstack/react-table ترکیب کنید تا جدول‌هایی با مرتب‌سازی، فیلترگذاری و صفحه‌بندی بسازید.

برای اطلاعات بیشتر، مستندات Data Table را ببینید.

همچنین می‌توانید نمونه‌ای از یک جدول داده را در دموی Tasks ببینید.

RTL

برای فعال‌کردن پشتیبانی از RTL در Neobrutalism، راهنمای پیکربندی RTL را ببینید.

"use client"

import * as React from "react"

دسترسی‌پذیری

رندر عناصر بومی جدول به صفحه‌خوان اعلام جدول، ناوبری سطر/ستون و ارتباط header را بدون سیم‌کشی ARIA می‌دهد. هر جدول را با TableCaption نام‌گذاری کنید و TableHead را برای سلول‌های header واقعی نگه دارید. کانتینر اسکرول focusable نیست، پس کاربر فقط‌صفحه‌کلید نمی‌تواند جدول سرریز را اسکرول کند — اگر جدول‌های عریض محتمل‌اند، در کپی کامپوننت به div کانتینر tabIndex={0}، role="region" و aria-label اضافه کنید.