جدول البيانات
جدول يدعم الفرز والتحديد والترقيم وبيانات الخادم والصفوف الشجرية والصفوف الافتراضية وإعادة ترتيب الصفوف.
| الموعد | ||
|---|---|---|
| إطلاق الإصدار 2 | لينا | 3 أكتوبر |
| إصلاح التصدير | عمر | 6 أكتوبر |
| مراجعة النماذج | صوفيا | 9 أكتوبر |
| خطة الربع الرابع | يوكي | 14 أكتوبر |
كل جزء فيها slot قابل للاستبدال؛ وما لا تستبدله يبقى مكتمل المظهر.
| 1042 | لينا بارك | 3 | تم الشحن |
| 1043 | عمر حداد | 1 | قيد التجهيز |
| 1044 | صوفيا رييس | 5 | تم الشحن |
| 1045 | يوكي تاناكا | 2 | مدفوع |
| 1046 | أمير ناصر | 4 | قيد التجهيز |
الجدول نفسه في بعض أنظمة التصميم المعروفة، ويعمل نظامك بالطريقة نفسها. لا يتغيّر إلا الخاصية components.
| Lena Park | Engineer | Platform | Active | 2021-03-08 | |
| Omar Haddad | Designer | Product | Active | 2020-11-16 | |
| Sofia Reyes | Engineer | Payments | Away | 2022-01-24 | |
| Yuki Tanaka | Manager | Platform | Active | 2019-06-03 | |
| Amir Nasser | Analyst | Growth | Active | 2023-02-13 |
landing/swap-fallback.tsx
import { DataTable } from "slotsmith/data-table";
import { columns, people } from "../shared/people";
export default function Swap() {
return (
<DataTable
data={people}
columns={columns}
enableRowSelection
defaultPagination={{ pageIndex: 0, pageSize: 5 }}
/>
);
}import { DataTable } from "slotsmith/data-table";
import { shadcnComponents } from "../adapters/data-table/shadcn"; سطر متغيّر
import { columns, people } from "../shared/people";
export default function Swap() {
return (
<DataTable
data={people}
columns={columns}
enableRowSelection
defaultPagination={{ pageIndex: 0, pageSize: 5 }}
components={shadcnComponents} سطر متغيّر
/>
);
}import { DataTable } from "slotsmith/data-table";
import { muiComponents } from "../adapters/data-table/mui"; سطر متغيّر
import { columns, people } from "../shared/people";
export default function Swap() {
return (
<DataTable
data={people}
columns={columns}
enableRowSelection
defaultPagination={{ pageIndex: 0, pageSize: 5 }}
components={muiComponents} سطر متغيّر
/>
);
}import { DataTable } from "slotsmith/data-table";
import { chakraComponents } from "../adapters/data-table/chakra"; سطر متغيّر
import { columns, people } from "../shared/people";
export default function Swap() {
return (
<DataTable
data={people}
columns={columns}
enableRowSelection
defaultPagination={{ pageIndex: 0, pageSize: 5 }}
components={chakraComponents} سطر متغيّر
/>
);
}import { DataTable } from "slotsmith/data-table";
import { antdComponents } from "../adapters/data-table/antd"; سطر متغيّر
import { columns, people } from "../shared/people";
export default function Swap() {
return (
<DataTable
data={people}
columns={columns}
enableRowSelection
defaultPagination={{ pageIndex: 0, pageSize: 5 }}
components={antdComponents} سطر متغيّر
/>
);
}<element> تأخذ خصائص DOM، وأجزاء {widget} تأخذ خصائص دلالية.كل جزء في كل مكوّن من أحد نوعين، والنوع يحدّد ما يستقبله البديل الذي تضعه مكانه.
<Row>أجزاء العناصرجزء العنصر يرسم عنصر DOM واحدًا. يستقبل خصائص DOM عادية، والحالة في سمات data-*، لذا يحلّ محلّه العنصر الأساسي من أي مكتبة كما هو.
import TableRow from "@mui/material/TableRow";
import { DataTable } from "slotsmith/data-table";
import { columns, people } from "../shared/people";
// Row is an element part: TableRow takes the <tr> props as is.
export default function ElementPart() {
return (
<DataTable
data={people}
columns={columns}
components={{ Row: TableRow }}
/>
);
}| النوع | يستقبل | بديل عن |
|---|---|---|
أجزاء العناصر<Root><Table><Row><Cell> | خصائص DOM عادية، والحالة في سمات data-* | العناصر الأساسية من أي مكتبة، دون تعديل، مثل عناصر shadcn/ui وMUI وChakra |
أجزاء الأدوات{Checkbox}{Pagination}{Empty} | خصائص دلالية (checked وpageIndex وsetPageSize) | مكوّناتك، عبر محوّل من بضعة أسطر |
كل لوحة هي المكوّن نفسه بأجزائه المدمجة. افتح أيًّا منها لتقرأ أدلته وواجهته البرمجية.
جدول يدعم الفرز والتحديد والترقيم وبيانات الخادم والصفوف الشجرية والصفوف الافتراضية وإعادة ترتيب الصفوف.
| الموعد | ||
|---|---|---|
| إطلاق الإصدار 2 | لينا | 3 أكتوبر |
| إصلاح التصدير | عمر | 6 أكتوبر |
| مراجعة النماذج | صوفيا | 9 أكتوبر |
| خطة الربع الرابع | يوكي | 14 أكتوبر |
قائمة بحث وقائمة اختيار في مكوّن واحد.
منتقي ملفات مع الرفع والبطاقات والتحقق من الصحة وتعديل السجلات والقوائم الافتراضية.
منتقي تواريخ لليوم الواحد والنطاقات والتواريخ المتعددة، مع حدود وأيام محظورة وإعدادات جاهزة.
احتفظ بنظام التصميم وطبقة البيانات لديك، أيًّا كانا. هذه بعض المكتبات المعروفة، وكل اسم يفتح الصفحة التي تعرضه وهو يعمل.
كل تسمية تأتي من حزمة لغة. بدّل اللغة: تتغيّر التسميات، وينعكس الجدول للكتابة من اليمين إلى اليسار.
| لينا بارك | برلين | مدفوع |
| عمر حداد | عمّان | تم الشحن |
| صوفيا رييس | مدريد | قيد التجهيز |
| يوكي تاناكا | أوساكا | مدفوع |
| أمير ناصر | طهران | تم الشحن |
import { useState } from "react";
import { DataTable, type DataTableColumnDef } from "slotsmith/data-table";
import { SlotsmithProvider, useSlotsmithLocale } from "slotsmith/provider";
import { ar } from "slotsmith/locales/ar";
import { fa } from "slotsmith/locales/fa";
type Order = { id: string; customer: string; city: string; status: string };
const LANGUAGES = [
{ locale: "en-US", lang: "en", name: "English" },
{ locale: "ar", lang: "ar", name: "العربية" },
{ locale: "fa", lang: "fa", name: "فارسی" },
] as const;
type Locale = (typeof LANGUAGES)[number]["locale"];
const packs = [ar, fa];
/** The toggle's name, in the page's language. */
const GROUP_LABEL: Record<string, string> = { en: "Language", ar: "اللغة", fa: "زبان" };
const copy: Record<Locale, { headers: Record<"customer" | "city" | "status", string>; rows: Order[] }> = {
"en-US": {
headers: { customer: "Customer", city: "City", status: "Status" },
rows: [
{ id: "1", customer: "Lena Park", city: "Berlin", status: "Paid" },
{ id: "2", customer: "Omar Haddad", city: "Amman", status: "Shipped" },
{ id: "3", customer: "Sofia Reyes", city: "Madrid", status: "Packing" },
{ id: "4", customer: "Yuki Tanaka", city: "Osaka", status: "Paid" },
{ id: "5", customer: "Amir Nasser", city: "Tehran", status: "Shipped" },
{ id: "6", customer: "Nadia Karimi", city: "Dubai", status: "Packing" },
],
},
ar: {
headers: { customer: "العميل", city: "المدينة", status: "الحالة" },
rows: [
{ id: "1", customer: "لينا بارك", city: "برلين", status: "مدفوع" },
{ id: "2", customer: "عمر حداد", city: "عمّان", status: "تم الشحن" },
{ id: "3", customer: "صوفيا رييس", city: "مدريد", status: "قيد التجهيز" },
{ id: "4", customer: "يوكي تاناكا", city: "أوساكا", status: "مدفوع" },
{ id: "5", customer: "أمير ناصر", city: "طهران", status: "تم الشحن" },
{ id: "6", customer: "نادية كريمي", city: "دبي", status: "قيد التجهيز" },
],
},
fa: {
headers: { customer: "مشتری", city: "شهر", status: "وضعیت" },
rows: [
{ id: "1", customer: "لنا پارک", city: "برلین", status: "پرداختشده" },
{ id: "2", customer: "عمر حداد", city: "امان", status: "ارسالشده" },
{ id: "3", customer: "سوفیا رییس", city: "مادرید", status: "در حال بستهبندی" },
{ id: "4", customer: "یوکی تاناکا", city: "اوساکا", status: "پرداختشده" },
{ id: "5", customer: "امیر ناصر", city: "تهران", status: "ارسالشده" },
{ id: "6", customer: "نادیا کریمی", city: "دبی", status: "در حال بستهبندی" },
],
},
};
/** The table in the provider's language, inside an element that takes its direction. */
function Orders({ locale }: { locale: Locale }) {
const { dir } = useSlotsmithLocale();
const { headers, rows } = copy[locale];
const columns: DataTableColumnDef<Order>[] = [
{ accessorKey: "customer", header: headers.customer },
{ accessorKey: "city", header: headers.city },
{ accessorKey: "status", header: headers.status },
];
return (
<div dir={dir} lang={locale}>
<DataTable data={rows} columns={columns} defaultPagination={{ pageIndex: 0, pageSize: 5 }} pageSizeOptions={[5, 10]} />
</div>
);
}
export default function Languages() {
// Starts in the page's language when an outer provider sets one.
const page = useSlotsmithLocale().code;
const label = GROUP_LABEL[page.split("-")[0]!] ?? "Language";
const [locale, setLocale] = useState<Locale>(page.startsWith("ar") ? "ar" : page.startsWith("fa") ? "fa" : "en-US");
return (
<div className="languages-demo">
<div role="group" aria-label={label}>
{LANGUAGES.map((language) => (
<button
key={language.locale}
type="button"
lang={language.lang}
aria-pressed={locale === language.locale}
onClick={() => setLocale(language.locale)}
>
{language.name}
</button>
))}
</div>
<SlotsmithProvider locale={locale} locales={packs}>
<Orders locale={locale} />
</SlotsmithProvider>
</div>
);
}slotsmith-ai خادم MCP. يعطي وكيلَ البرمجة لديك كل خاصية وكل جزء وكل تسمية، وينسخ محوّلات جاهزة إلى مشروعك. يضيفه Claude Code بأمر واحد، ويقرأه Cursor من .cursor/mcp.json، ويقرأه VS Code من .vscode/mcp.json.
claude mcp add slotsmith -- npx -y slotsmith-ai mcp{
"mcpServers": {
"slotsmith": {
"command": "npx",
"args": ["-y", "slotsmith-ai", "mcp"]
}
}
}{
"servers": {
"slotsmith": {
"type": "stdio",
"command": "npx",
"args": ["-y", "slotsmith-ai", "mcp"]
}
}
}{ tests: 1761, suites: 20, gzip: "38.5 KB", license: "ISC", react: ">=18" }
نعم. تبدأ كل نقطة دخول بالتوجيه "use client"، لذا يمكنك استيراد المكوّن مباشرة في ملف Server Component. يُعرض على الخادم ثم يُفعَّل في المتصفح.
لا. يأتي كل مكوّن بملف CSS عادي تُضبط ألوانه بخصائص CSS المخصّصة. لا تحتاج إلى Tailwind إلا إذا كان نظام التصميم لديك يستخدمه.
نعم. كل جزء منفذ (slot): مرّر زر نظامك أو مربع الاختيار أو القائمة المنسدلة فيحلّ محلّ البديل الافتراضي. تعرض صفحات المحوّلات shadcn/ui وMUI وChakra وAnt Design وRadix Themes أمثلةً على ذلك.
لكل مكوّن نقطة دخول خاصة به. حجم نقطة دخول جدول البيانات 38.5 KB بعد ضغط gzip، دون احتساب React وTanStack Table اللتين يستوردهما، فلا تعتمد slotsmith على أي حزمة أخرى. تسرد صفحة الثقة كل نقاط الدخول.
نعم. نطاق الاعتمادية النظيرة هو react >=18، لذا يعمل الإصداران React 18 وReact 19.
ISC. يمكنك استخدام slotsmith في المشاريع التجارية والمغلقة المصدر.
npm i slotsmith