تخطَّ إلى المحتوى الرئيسي

الإعداد

EditorConfig وRendererConfig هما نقطتا الدخول لكل تخصيص. مرر أيًا منهما إلى Editor.create() أو Renderer.render() على التوالي. containerId فقط (وdata للـ Renderer) مطلوبان، وباقي الخيارات لها قيم افتراضية آمنة.

EditorConfig

مرر EditorConfig كوسيط وحيد إلى Editor.create(). يجب أن يتطابق containerId المطلوب مع معرف عنصر DOM موجود مسبقًا.

الخيارالنوعمطلوبالوصف
containerIdstringنعممعرف عنصر DOM الذي سيستضيف المحرر. يجب أن يكون موجودًا في DOM قبل استدعاء Editor.create().
maxHeightnumberلاالارتفاع الأقصى للمحرر بالبكسل. اضبط على 0 (الافتراضي) لعدم وضع حد أقصى للارتفاع.
minHeightnumberلاالارتفاع الأدنى للمحرر بالبكسل. الافتراضي هو 300.
onChange(data: EditorData) => voidلادالة رد نداء تُطلق عند كل تغيير في المستند. تستقبل لقطة كاملة من EditorData.
onReady() => voidلادالة رد نداء تُطلق بمجرد اكتمال تهيئة المحرر واستعداده لاستقبال استدعاءات API.
placeholderstringلانص العنصر النائب المعروض عندما يكون المحرر فارغًا. الافتراضي هو "Start writing...".
initialDataEditorDataلاEditorData محملة مسبقًا لتحميلها عند تركيب المحرر.
initialView'edit' | 'preview' | 'json'لاوضع العرض الأولي. أحد القيم: edit وpreview وjson. الافتراضي هو "edit".
allowJsonViewEditingbooleanلاعند الضبط على true، يصبح عرض JSON قابلًا للتحرير وتنتشر التغييرات مجددًا إلى المستند. الافتراضي false.
hasViewSwitcherbooleanلاعند الضبط على false، تُحذف أزرار التحرير والمعاينة وJSON من شريط الإجراءات. الافتراضي true.
hasDocumentActionsbooleanلاعند الضبط على false، تُحذف أزرار النسخ والتنزيل والمسح من شريط الإجراءات. وإذا كان hasViewSwitcher أيضًا false، فلا يُرسم شريط الإجراءات. الافتراضي true.
onClearRequest() => Promise<boolean>لايُستدعى عند الضغط على زر المسح. تُمسح الصفحة فقط إذا أعاد true، ويبقيها الرفض كما هي. إذا لم يُحدَّد، يتم المسح فورًا.
marginsBlockMarginsلاالهامش العلوي والسفلي العام (بالبكسل) المطبق على كل كتلة. تأخذ الإعدادات على مستوى الكتلة الأولوية.
stylesEditorStylesلاكائن EditorStyles لتخصيص CSS الدقيق لواجهة المحرر (أشرطة الأدوات والحوارات والعناصر التفاعلية).
classNamesEditorClassNamesلاكائن EditorClassNames لإرفاق أسماء فئات CSS بعناصر واجهة المحرر.
imageUploaderUploadFunctionلادالة غير متزامنة تُحمّل ملف صورة وتُعيد سلسلة URL عامة.
audioUploaderUploadFunctionلادالة غير متزامنة تُحمّل ملف صوت وتُعيد سلسلة URL عامة.
videoUploaderUploadFunctionلادالة غير متزامنة تُحمّل ملف فيديو وتُعيد سلسلة URL عامة.
fileUploaderUploadFunctionلادالة رفع تنقل مرفقات كتلة الملف إلى مخزنك.
localestringلااللغة الواحدة التي يحررها المحرر. تُسوّى الكتل متعددة اللغات إلى هذه اللغة.
defaultLocalestringلالغة احتياطية تُستخدم عندما لا تملك الكتلة محتوى للغة المطلوبة.
onLocaleFallback(info: { blockId: string; locale: string }) => voidلايُستدعى عندما تسقط كتلة إلى اللغة الاحتياطية، ليعرض المضيف مؤشرًا.
onInlineRewrite(selection: string, action: InlineRewriteAction) => Promise<string | null>لادالة تعيد كتابة النص المحدد بالذكاء الاصطناعي؛ عند ضبطها يعرض شريط الأدوات زر إعادة الكتابة.
inlineRewriteLabelsPartial<Record<InlineRewriteAction, string>>لايستبدل تسميات إجراءات قائمة إعادة الكتابة، للترجمة.
inlineRewriteTooltipstringلايستبدل تلميح عصا إعادة الكتابة في شريط الأدوات المضمّن، للترجمة.
blockToolLabelsPartial<Record<BlockToolType, string>>لايستبدل تسميات أدوات الكتل في صندوق الأدوات وقائمة الشرطة المائلة، للترجمة.
blockToolbarLabelsPartial<Record<BlockToolbarLabel, string>>لايستبدل نصوص شريط أدوات الكتلة (إضافة، نقل، حذف وغيرها) والتلميحات الظاهرة في حقول الكتل الفارغة، للترجمة.
controlLabelsPartial<Record<ControlLabel, string>>لايستبدل أسماء أزرار شريط الإجراءات (تحرير، معاينة، JSON، نسخ، تنزيل، مسح)، وتُستخدم أسماءً لقارئات الشاشة وتلميحات، للترجمة.
dialogLabelsPartial<Record<DialogLabel, string>>لاالكلمات التي تعرضها نوافذ الرابط والتلميح والحالة، مفهرسة بالاسم: العناوين وتسميات الحقول والنصوص الإرشادية وأنماط الحالة وإلغاء وتطبيق. بالإنجليزية إذا لم تُحدَّد.
resolveLink(url: string) => Promise<Partial<EmbedData>>لايملأ لقطة التضمين الملصق من خادمك: العنوان، ملف Drive، ملفات gist أو سبب تعذر العرض المباشر. البحث الذي يفشل يرسم البطاقة كأن الأداة لم تستجب، مع "حاول مرة أخرى" بجانبها.
onEmbedAction(action: EmbedAction, blockId: string) => voidلاالإصلاح بجانب سبب البطاقة الذي لا يستطيع سوى المضيف تنفيذه: connectGoogle يرسل العضو لربط حساب Google الخاص به؛ أما retry فيتعامل معه المحرر نفسه.
disabledEmbedProvidersreadonly string[]لاأدوات التضمين التي أوقفتها مساحة العمل بمفتاحها (figma، miro، loom، google_drive، github_gist)؛ تُرسم روابطها كبطاقات تذكر السبب.
pasteEmbeds'live' | 'offer' | 'card'لاما يفعله لصق رابط مدعوم: عرضه مباشرةً (الافتراضي)، أو اقتراح ذلك، أو عرض بطاقة.
embedLabelsPartial<Record<EmbedLabel, string>>لاكلمات مترجمة لأسطر أسباب كتلة التضمين وإجراءاتها وتسميات gist، بمفتاح EmbedLabel؛ وإلا تُستخدم الإنجليزية.
resolveIssues(urls: string[]) => Promise<Record<string, IssueSnapshot>>لايجيب عن روابط مشكلات الصفحة بلقطاتها مفهرسة بالرابط. إن غاب، تبقى الشارات والكروت على ما خزّنه المستند ولا يُحدَّث شيء.
onIssueAction(action: IssueAction, tool: string) => voidلاالإصلاح بجانب سبب المشكلة الذي لا يستطيع إجراءه إلا المضيف: ربط الأداة، وهو ما يُفضي إلى صفحة التكاملات في المضيف.
issueCards'off' | 'on'لاما إذا كان رابط المشكلة المُلصق في سطر مستقل يصبح كرتًا؛ off إن غاب. الشارة داخل الجملة تبقى شارة دائمًا.
issueChip{ assignee: boolean; status: boolean }لامفتاحا الشارة الخاصان بالعضو: قرص الحالة والمسؤول. كلاهما مفعّل إن غاب.
issueLabelsPartial<Record<IssueLabel, string>>لاكلمات مترجمة لشارة المشكلة والكرت وجدول المشكلات المرتبطة، بمفتاح IssueLabel؛ وإلا تُستخدم الإنجليزية.
jiraSitesreadonly string[]لاروابط مواقع Jira التي تصلها اتصالات مساحة العمل، حتى يُعرَف رابط على نطاق الموقع الخاص كمشكلة.
allowedBlockToolsreadonly BlockToolType[]لاأنواع الكتل التي يقدمها المحرر في قائمة الكتل وبحثها وقائمة التحويل وعند اللصق. كل كتلة مسجلة عند غيابه؛ وتظل الكتلة المخزنة خارج القائمة تُعرض.
allowedInlineToolsreadonly InlineToolType[]لاالعلامات التي يقدمها شريط الأدوات المضمّن. كل علامة مسجلة عند غيابه.
theme'auto' | 'light' | 'dark'لانظام الألوان. أحد القيم: auto (يتبع النظام)، light، dark. الافتراضي هو auto.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }لاتجاوزات الرمز المميز لكل وضع. قدّم خرائط رموز light و/أو dark لتخصيص الألوان دون استبدال الثيم الكامل.
TypeScript
import { Editor } from '@clepit/core';

const editor = Editor.create({
  containerId: 'editor',
  minHeight: 400,
  placeholder: 'Start writing...',
  theme: 'auto',
  onChange: data => console.log(data),
  onReady: () => console.log('Editor ready'),
  imageUploader: async file => {
    const form = new FormData();
    form.append('file', file);
    const res = await fetch('/api/upload', { body: form, method: 'POST' });
    const { url } = await res.json();
    return url;
  },
});

RendererConfig

مرر RendererConfig كوسيط وحيد إلى Renderer.render(). كلٌّ من containerId وdata مطلوبان.

الخيارالنوعمطلوبالوصف
containerIdstringنعممعرف عنصر DOM حيث سيتم حقن الناتج المُصيَّر.
dataEditorDataنعممستند EditorData المراد تصييره. مطلوب.
marginsBlockMarginsلاالهامش العلوي والسفلي العام (بالبكسل) المطبق على كل كتلة مُصيَّرة.
stylesBlockStylesلاخريطة BlockStyles لتخصيص CSS لكل نوع كتلة في الناتج المُصيَّر.
classNamesBlockClassNamesلاخريطة BlockClassNames لأسماء فئات CSS لكل نوع كتلة في الناتج المُصيَّر.
editorClassNamesEditorClassNamesلاEditorClassNames تُمرَّر إلى الكتل التي تُصيِّر مكونات تفاعلية (مثل أسماء فئات tooltip للفقرات).
configsPartial<BlockTypeOutputConfigs>لاخريطة جزئية من كائنات OutputConfig لكل كتلة. يمكن لكل إدخال تعيين هوامش على مستوى الكتلة وأسماء فئات tooltip.
theme'auto' | 'light' | 'dark'لانظام الألوان. أحد القيم: auto وlight وdark.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }لاتجاوزات الرمز المميز لكل وضع للناتج المُصيَّر.
TypeScript
import { Renderer } from '@clepit/core';
import type { EditorData } from '@clepit/core';

const data: EditorData = await fetch('/api/content/123').then(r => r.json());

Renderer.render({
  containerId: 'output',
  data,
  theme: 'auto',
  margins: { bottom: 16, top: 16 },
});

التنسيق على مستوى الكتلة

يقبل كلٌّ من EditorConfig وRendererConfig خصائص styles وclassNames وconfigs مفتاحة حسب نوع الكتلة. استخدمها للتجاوزات المستهدفة؛ راجع صفحة Themes للحصول على مرجع الرمز المميز الكامل لكل كتلة.

TypeScript
import { Editor, Renderer } from '@clepit/core';
import type { BlockStyles, BlockClassNames, EditorStyles } from '@clepit/core';

const editorStyles: EditorStyles = {
  blockToolbar: { container: { borderRadius: '8px' } },
};

const blockStyles: BlockStyles = {
  header: { h1: { fontFamily: 'Georgia, serif' } },
  paragraph: { lineHeight: '1.75' },
  table: { cell: { padding: '8px 12px' } },
};

const blockClassNames: BlockClassNames = {
  paragraph: 'prose-paragraph',
  header: { h1: 'prose-h1', h2: 'prose-h2' },
  alert: { info: 'alert-info', error: 'alert-error' },
};

Editor.create({
  containerId: 'editor',
  styles: editorStyles,
});

Renderer.render({
  containerId: 'output',
  data,
  styles: blockStyles,
  classNames: blockClassNames,
});