جدول
جدول HTML دلالي للفواتير وقوائم الإدارة وجداول الأسعار — صفوف محددة بحدود، وعناوين بخط عريض، وظل قوي على الطراز النيوبروتالي.
import {
Table,
TableBody,يقوم هذا الجدول بتنسيق عناصر الجدول الأصلية في HTML — <table>، <thead>، <tbody>، <th>، <td>، <caption> — دون الاعتماد على مكتبة أساسية؛ وتشتمل إصدارات Radix وBase على الملف نفسه. وصفة النمط «النيوبروتالستي»: حدود سميكة وظل قوي حول الجدول بأكمله، وخلايا العناوين بخط العناوين، وفواصل بين الصفوف بعرض 2 بكسل.
استخدمه عندما:
- الفواتير والطلبات — بنود تفصيلية مع صف
TableFooterللإجمالي. - قوائم الإدارة — المستخدمون، ومفاتيح واجهة برمجة التطبيقات (API)، والاشتراكات، مع قائمة منسدلة لإجراءات الصفوف.
- جداول الأسعار والمقارنة — مصفوفات الميزات حيث تحمل عناوين الأعمدة المعنى.
التثبيت#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/table.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/table.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/table.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/table.json
انسخ الكود التالي والصقه في مشروعك.
"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"إمكانية الوصول#
يؤدي عرض عناصر الجدول الأصلية إلى تزويد برامج قراءة الشاشة بإمكانية الإعلان عن الجدول، والتنقل بين الصفوف والأعمدة، وربط العناوين دون الحاجة إلى تكوين ARIA. قم بتسمية كل جدول بـ TableCaption واحتفظ بـ TableHead لخلايا العناوين الأصلية. لا يمكن تحديد عنصر التركيز في حاوية التمرير، لذا لا يمكن للمستخدمين الذين يعتمدون على لوحة المفاتيح فقط التمرير في الجدول الذي يتجاوز حدود الحاوية — إذا كان من المحتمل وجود جداول عريضة، أضف tabIndex={0} وrole="region" وaria-label إلى عنصر div الخاص بالحاوية في نسختك من المكون.