Konsep inti
Model blok
Inti dari EditorData adalah array blocks: objek Block yang mempertahankan urutan. Setiap Block membawa tipenya, data spesifik tipe, dan metadata tunes opsional.
| Bidang | Tipe | Deskripsi |
|---|---|---|
| id | string | undefined | Pengenal unik opsional, ditetapkan oleh editor saat pembuatan. |
| type | BlockToolType | Kunci literal yang mengikat blok ke skema, komponen input, dan renderer-nya. |
| data | object | Objek data spesifik tipe: bentuk berbeda per jenis blok. |
| tunes | BlockTunes | undefined | Kamus metadata tune opsional lintas tipe. Kunci adalah nama tune dan nilai adalah data bebas. |
{
"time": 1745000000000,
"version": "1.0.0",
"blocks": [
{
"id": "abc123",
"type": "header",
"data": { "html": "Hello world", "level": "h1" }
},
{
"id": "def456",
"type": "paragraph",
"data": { "html": "This is a <b>rich</b> paragraph." }
}
]
}Alat blok vs alat inline
Alat blok membuat slot tingkat atas langsung di dalam EditorData. Alat inline menghias teks di dalam payload html yang dimiliki sebuah blok. Dua lapisan ini sepenuhnya terpisah. Tidak dapat saling menggantikan.
Output JSON-first
Editor tidak pernah menyimpan HTML. Saat Anda memanggil editor.data.extract(), Anda mendapatkan JSON EditorData murni: lengkap termasuk URL media. JSON ini dapat disimpan dalam database, dipersonalisasi, atau dikonversi ke format lain.
import { Editor } from '@clepit/core';
const editor = Editor.create({ containerId: 'editor' });
const data = editor.data.extract();
// data: EditorData
// {
// time: 1745000000000,
// version: '1.0.0',
// blocks: [ ... ]
// }Editor vs Renderer
Penyetelan blok
Tunes adalah slot metadata yang tidak bergantung pada tipe untuk semua jenis blok. Kuncinya adalah nama tune yang ditetapkan oleh sistem atau plugin, dan nilainya diketik ke BlockTuneData: kombinasi apa pun dari string, number, boolean, atau null. Tunes dapat menambah semantik tanpa merusak bentuk data inti.
{
"id": "abc123",
"type": "paragraph",
"data": { "html": "Some text." },
"tunes": {
"textAlign": { "alignment": "center" },
"visibility": { "hidden": false }
}
}