דילוג לתוכן

טבלה

טבלה סמנטית ב-HTML עבור חשבוניות, רשימות ניהול וטבלאות מחירים — שורות עם מסגרת, כותרות מודגשות וצללית ניאו-ברוטליסטית בולטת.

import {
  Table,
  TableBody,

ה-table מעצב את אלמנטי טבלת ה-HTML המקוריים — <table>, <thead>, <tbody>, <th>, <td>, <caption> — בלי ספריית פרימיטיבים מתחת; הווריאנטים של Radix ו-Base מגיעים עם אותו קובץ. המתכון הנאו-ברוטליסטי: מסגרת עבה וצל חד סביב כל הטבלה, תאי כותרת בגופן כותרות, ומפרידי שורה של 2px.

השתמשו בו כש:

  • חשבוניות והזמנות — פריטי שורה עם שורת TableFooter לסכום.
  • רשימות ניהול — משתמשים, מפתחות API, מנויים, עם dropdown של פעולות שורה.
  • רשתות תמחור והשוואה — מטריצות תכונות שבהן כותרות העמודות נושאות את המשמעות.

התקנה

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 כך שיתאימו להגדרות הפרויקט שלכם.

שימוש

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"

נגישות

רינדור אלמנטי טבלה מקוריים נותן לקוראי מסך הכרזת טבלה, ניווט שורה/עמודה וקישור כותרות בלי חיווט ARIA. תנו שם לכל טבלה עם TableCaption ושמרו TableHead לתאי כותרת אמיתיים. מיכל הגלילה אינו ניתן לפוקוס, כך שמשתמשי מקלדת בלבד לא יכולים לגלול טבלה שגולשת — אם טבלאות רחבות סבירות, הוסיפו tabIndex={0}, role="region" ו-aria-label ל-div המיכל בעותק של הרכיב שלכם.