- مقدمة
- العرض
- MVP
- خارطة الطريق
- متطلبات المنتج
- ابدأ الآن
- البيئة المحلية
- البنية المعمارية
- الهيكل
- الأنماط
- الحزمة التقنية
- قاعدة البيانات
- تعدّد المستأجرين
- الفهرس (Catalog)
- العمل دون اتصال
- المصادقة
- التهيئة (Onboarding)
- تدفق التكامل (Integration Flow)
- التهيئة (Provision)
- القبول
- الحضور
- الامتثال التنظيمي
- الملف الشخصي
- الاجتماعات
- إدارة الرسوم
- الفاتورة
- التدويل
- الترجمة
- دليل الترجمة
- أمان قاعدة البيانات
- المساهمة
- هَوْغوارتس
- عرض حي
- الإلهام
المبيعات والانتشار
الاتساق هو الأساس. كل ميزة تأخذ نفس الشكل، وكل ملف له دور قانوني. الكود الجديد الذي يطابق هذه الأنماط يصبح قابلاً للمراجعة في دقائق، والذي لا يطابقها يولّد احتكاكاً.
التسمية
الملفات والمجلدات
- المكونات والملفات — kebab-case (
button.tsx,user-profile.tsx). - المسارات — مقاطع kebab-case (
/user-profile,/sign-in). - Hooks — بادئة
use-(use-leads.ts). - الأنواع — معرّفات PascalCase (interfaces, type aliases, enums).
- الثوابت —
UPPER_SNAKE_CASEللقيم الأولية،camelCaseللكائنات.
المعرّفات في الكود
- المكونات — PascalCase (
export function UserCard()). - الدوال — camelCase (
formatCurrency). - المتغيرات — camelCase (
const userData = ...). - الثوابت —
UPPER_SNAKE_CASE(const API_BASE_URL = "..."). - الأنواع والواجهات — PascalCase (
interface UserData,type ApiResponse).
قاعدة البيانات والـ API
- الجداول — snake_case (
user_profiles). - مسارات API — kebab-case (
/api/user-profile). - متغيرات البيئة —
SCREAMING_SNAKE_CASE(DATABASE_URL).
أنماط الدوال
استخدم function declarations للمكونات، route handlers، والدوال المُصدَّرة — تُرفَع وتُنتج stack traces أفضل. استخدم arrow functions لـ utility callbacks القصيرة.
// utility — arrow مناسب
const formatPrice = (amount: number) =>
new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }).format(amount)
// component — function declaration
export function UserProfile({ userId }: Props) {
const { user, loading } = useUser(userId)
if (loading) return <Skeleton />
return <Card>{user.name}</Card>
}Server actions وجلب البيانات
- التعديلات في
actions.tsمع"use server"في الأعلى. - القراءات في
queries.ts. دوال خادم خالصة، لا حاجة لـ"use server"ما لم تُستدعَ من العميل. - كل server action يشغّل التدفق المؤلَّف من 5 خطوات: auth → tenant → permission → validate → execute + revalidate.
- Server actions تُعيد
ActionResponse<T>من@/lib/action-response. - مكونات الخادم تجلب عبر
queries.tsوتمرّر البيانات لمكونات العميل كـ props.
هرم المكونات
| المستوى | الاسم | الوصف | مثال |
|---|---|---|---|
| 1 | UI | Radix primitives | Dialog, Tabs |
| 2 | Atom | تركيبات من 2+ primitives | LabeledInput |
| 3 | Template | تخطيط صفحة كاملة | WizardLayout |
| 4 | Block | UI + منطق أعمال | StudentsTable |
| 5 | Micro | mini service / widget مستقل | BellIcon |
نمط المرآة
كل URL ينتج مجلدين — أحدهما في app/ (التوجيه، اللوايآت، page.tsx)، والآخر في components/<feature>/ (كل ما عدا ذلك). راجع وثيقة البنية المعمارية للخريطة الكاملة.
src/app/[lang]/s/[subdomain]/(school-dashboard)/students/page.tsx
→ يستورد من src/components/school-dashboard/listings/students/content.tsx
أنماط الملفات الموحّدة لكل ميزة
| الملف | الغرض | الوثيقة |
|---|---|---|
page.tsx | نقطة دخول المسار. Auth + tenant + عرض <XxxContent />. رفيع. | page |
content.tsx | خادم (جلب بيانات) أو عميل (تفاعل) — يكوّن الميزة. | content |
client.tsx | حدود "use client" واحدة، يستقبل بيانات الخادم كـprops. | content |
actions.ts | server actions — تعديلات فقط. | actions |
queries.ts | قراءات قاعدة بيانات على الخادم. | queries |
authorization.ts | فحوص صلاحيات RBAC (canCreate, canRead, …). | authorization |
validation.ts | Zod schemas + أنواع z.infer. | validation |
types.ts | أنواع المجال والـUI. | types |
config.ts | مصفوفات خيارات enum، تسميات، افتراضيات. | config |
form.tsx | عميل. يعرض المدخلات، يشغّل RHF + Zod، يرسل لـserver action. | form |
table.tsx | عميل. يلفّ atom DataTable بأعمدة الميزة. | table |
columns.tsx | عميل. تعريفات أعمدة، يستخدم useMemo إن وُجدت hooks. | table |
card.tsx | بطاقات KPI / ملخّص. | card |
detail.tsx | تكوين صفحة التفاصيل. | detail |
views.tsx | مبدّلات عرض (grid / list / kanban). | views |
list-params.ts | URL search-param cache (nuqs). | list-params |
util.ts | helpers ميزة خالصة. | util |
hooks.ts / use-<x>.ts | hooks الميزة. | hooks |
README.md | سياق على مستوى الكتلة (قرارات، مناطق خطر). | readme |
ISSUE.md | issues مفتوحة، سجل منجَز. | issue |
المحتوى القانوني الكامل لكل ملف يعيش في الوثيقة المرتبطة — هذه الصفحة فهرس.
قواعد متعدّد المستأجرين
- كل نموذج أعمال يحمل
schoolId. - كل استعلام يُحدَّد بـ
schoolId. غيابschoolId= تسريب بيانات. getTenantContext()هو مصدر الحقيقة لـschoolIdالحالي.- اكتشاف النطاق الفرعي يحدث في الـmiddleware، وسياق المستأجر يحلّه.
راجع تعدد المستأجرين للبنية الكاملة.
TypeScript
- strict mode مُفعَّل. لا
any، ولاas any. import typeللاستيرادات النوعية فقط.- اشتقاق الأنواع من Zod عبر
z.infer. اشتقاق أنواع صفوف Prisma عبرPrisma.XxxGetPayload. - discriminated unions لآلات الحالة (
ActionResponse<T>, حالة خطوات المعالج). enumفقط حين تعبر القيم حدود runtime، وإلا فضّل string literal unions.
التنسيق
- Tailwind 4 مع OKLCH tokens.
- HTML دلالي — لا
text-*/font-*مكتوبة في كود الميزات، اعتمد على المُصيِّر. - tokens واعية للسمة فقط —
text-foreground,bg-card,border-border. لا hex. - خصائص منطقية للـRTL —
ms-,me-,ps-,pe-,start-,end-. لاml-ولاpl-ولاleft-ولاright-.
معالجة الأخطاء
- server actions تُعيد
errorCode، لا نصوصاً إنجليزية. القاموس يربطها على العميل. - لا ترمي خطأً للعميل أبداً. التقطه في الـaction وأعد استجابة منظَّمة.
- حدود
error.tsxتتولّى استثناءات شجرة المكونات. console.errorلتشخيصات الخادم، ولا تستخدمconsole.logفي الكود المشحون.
الأداء
- مكونات الخادم افتراضياً،
"use client"فقط عند الحاجة. - وازِ awaits المستقلة بـ
Promise.all. revalidatePathبعد التعديلات.- لفّ الحسابات الثقيلة في
useMemo، ولفّ الـcallbacks المستقرة فيuseCallbackعند القياس فقط. - بثّ حيث أمكن — حدود
Suspenseداخل مكونات الخادم.
الاعتماد
عند إضافة كود جديد:
- اختر أقرب مجلد ميزة قائم وانسخ شكله.
- طابق التسمية ومجموعة الملفات تماماً.
- قاوم رغبة اختراع ملف جديد (
utils.ts,helpers.ts)، استخدم الأسماء القانونية. - إن لم يلائم شيءٌ فعلاً، اكتب ملاحظة في
README.mdكي يعرف من بعدك السبب.