Skip to content

تطوير السمة ​

سمات mineproj هي حزم npm تتحكم في مظهر وشعور موقعك.

عقد السمة ​

السمة هي كائن بالخصائص التالية:

الخاصيةالنوعمطلوبالوصف
namestring✅اسم فريد للسمة
layoutsRecord<string, Component>✅تخطيطات لكل نوع مسار
componentsRecord<string, Component>اختياريمكونات قابلة لإعادة الاستخدام
slotsstring[]اختيارينقاط إدخال مسماة
configSchemaZodSchemaاختياريمخطط لـ themeConfig
localesRecord<string, Record<string, string>>اختياريقواميس ترجمة واجهة المستخدم
stylesstring[]اختيارينصوص CSS تُدرج في رأس كل صفحة
headScriptsstring[]اختيارينصوص برمجية مضمنة تُحقن في رأس الصفحة
islandsRecord<string, Component>اختياريمكونات تفاعلية تُرطّب على العميل
extendsTheme | stringاختياريسمة أصل للوراثة منها

مثال ​

ts
import { defineTheme } from '@mineproj/core';

const theme = defineTheme({
  name: 'my-theme',
  layouts: {
    home: ({ data, config }) => (
      <main>
        <h1>{config.title}</h1>
        <ul>
          {data.projects.map(p => <li key={p.slug}>{p.name}</li>)}
        </ul>
      </main>
    ),
  },
  styles: [`:root { --mp-color-accent: #ff5500; }`],
});

export default theme;

استخدام سمة محلية ​

أنشئ ملف .mineproj/theme/index.mts:

ts
import { defineTheme } from '@mineproj/core';
export default defineTheme({ ... });

ثم اضبط theme: '.mineproj/theme' في إعداداتك.

التخطيطات ​

أنواع التخطيطات السبعة المطلوبة:

التخطيطالمسارالغرض
home/الصفحة الرئيسية مع قسم البطل، المشاريع المميزة، شبكة
list/projects/شبكة مشاريع قابلة للتصفية
detail/projects/<slug>/تفاصيل المشروع مع شريط جانبي
tag/tags/<name>/مشاريع مصفاة حسب الوسم
collection/collections/<slug>/مجموعة منسقة
about/about/الملف الشخصي للمؤلف
notFound404.htmlصفحة 404 مخصصة

الجزر (Islands) ​

يتم تمييز المكونات التفاعلية كجزر:

tsx
export function MyCounter({ start }: { start: number }) {
  const [count, setCount] = useState(start);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}

سجلها في السمة:

ts
const theme = defineTheme({
  name: 'my-theme',
  layouts: { ... },
  islands: { 'my-counter': MyCounter },
  islandsImport: 'my-theme/islands',
});

اختبار العقد ​

ts
import { runThemeContract } from '@mineproj/test-utils';
const result = runThemeContract(myTheme, { requireAllLayouts: true });
console.log(result.errors); // [] إذا كان صحيحًا

النشر ​

  1. سمِّ حزمتك mineproj-theme-* أو @scope/mineproj-theme-*
  2. أضف "keywords": ["mineproj-theme"] إلى ملف package.json
  3. قم بتشغيل runThemeContract للتحقق من الصحة
  4. انشر على npm

Released under the Apache-2.0 License.