[{"data":1,"prerenderedAt":2644},["ShallowReactive",2],{"navigation_docs":3,"-tutorial-simple-editor":412,"-tutorial-simple-editor-surround":2639},[4,38,84,326,386],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":37},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,24,28,32],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick start: Nuxt","\u002Fgetting-started\u002Fquick-start-nuxt","1.getting-started\u002F3.quick-start-nuxt",{"title":25,"path":26,"stem":27,"icon":6},"Quick start: plain Vue","\u002Fgetting-started\u002Fquick-start-vue","1.getting-started\u002F4.quick-start-vue",{"title":29,"path":30,"stem":31,"icon":6},"Quick start: React","\u002Fgetting-started\u002Fquick-start-react","1.getting-started\u002F5.quick-start-react",{"title":33,"path":34,"stem":35,"icon":36},"Glossary","\u002Fgetting-started\u002Fglossary","1.getting-started\u002F6.glossary","i-lucide-book-a",false,{"title":39,"icon":40,"path":41,"stem":42,"children":43,"page":37},"Tutorial","i-lucide-graduation-cap","\u002Ftutorial","2.tutorial",[44,49,54,59,64,69,74,79],{"title":45,"path":46,"stem":47,"icon":48},"Tutorial: overview","\u002Ftutorial\u002Foverview","2.tutorial\u002F1.overview","i-lucide-map",{"title":50,"path":51,"stem":52,"icon":53},"Chapter 2: A simple editor","\u002Ftutorial\u002Fsimple-editor","2.tutorial\u002F2.simple-editor","i-lucide-pencil",{"title":55,"path":56,"stem":57,"icon":58},"Chapter 3: Compose features","\u002Ftutorial\u002Fcompose-features","2.tutorial\u002F3.compose-features","i-lucide-blocks",{"title":60,"path":61,"stem":62,"icon":63},"Chapter 4: Your own block, path A","\u002Ftutorial\u002Fown-block-path-a","2.tutorial\u002F4.own-block-path-a","i-lucide-square-plus",{"title":65,"path":66,"stem":67,"icon":68},"Chapter 5: Your own feature, path B","\u002Ftutorial\u002Fown-feature-path-b","2.tutorial\u002F5.own-feature-path-b","i-lucide-puzzle",{"title":70,"path":71,"stem":72,"icon":73},"Chapter 6: Backend and collaboration","\u002Ftutorial\u002Fbackend-and-collaboration","2.tutorial\u002F6.backend-and-collaboration","i-lucide-users",{"title":75,"path":76,"stem":77,"icon":78},"Chapter 7: AI","\u002Ftutorial\u002Fai","2.tutorial\u002F7.ai","i-lucide-sparkles",{"title":80,"path":81,"stem":82,"icon":83},"Chapter 8: The React surface","\u002Ftutorial\u002Freact-surface","2.tutorial\u002F8.react-surface","i-lucide-atom",{"title":85,"icon":14,"path":86,"stem":87,"children":88,"page":37},"Guides","\u002Fguides","3.guides",[89,93,98,103,108,112,116,121,126,130,134,139,144,149,154,159,164,169,174,179,184,189,194,199,204,209,213,218,223,228,233,237,242,247,251,256,261,266,271,276,281,286,291,295,302,307,311,316,321],{"title":90,"path":91,"stem":92,"icon":58},"Feature composition and entries","\u002Fguides\u002Fcomposition","3.guides\u002F1.composition",{"title":94,"path":95,"stem":96,"icon":97},"Media, mentions and transcript features","\u002Fguides\u002Fmedia-mentions-transcript","3.guides\u002F10.media-mentions-transcript","i-lucide-image",{"title":99,"path":100,"stem":101,"icon":102},"Authors and comments","\u002Fguides\u002Fauthors-and-comments","3.guides\u002F11.authors-and-comments","i-lucide-message-square-text",{"title":104,"path":105,"stem":106,"icon":107},"Themes (Obsidian)","\u002Fguides\u002Fthemes","3.guides\u002F12.themes","i-lucide-palette",{"title":109,"path":110,"stem":111,"icon":58},"Composites and the settings UI","\u002Fguides\u002Fcomposites","3.guides\u002F13.composites",{"title":113,"path":114,"stem":115,"icon":78},"AI","\u002Fguides\u002Fai","3.guides\u002F14.ai",{"title":117,"path":118,"stem":119,"icon":120},"Document tree","\u002Fguides\u002Fdocument-tree","3.guides\u002F15.document-tree","i-lucide-folder-tree",{"title":122,"path":123,"stem":124,"icon":125},"Markdown and code","\u002Fguides\u002Fmarkdown-and-code","3.guides\u002F16.markdown-and-code","i-lucide-file-code",{"title":127,"path":128,"stem":129,"icon":83},"Advanced editor in React","\u002Fguides\u002Fadvanced-react","3.guides\u002F17.advanced-react",{"title":131,"path":132,"stem":133,"icon":6},"Kitchen sink: learning path","\u002Fguides\u002Fadvanced-nuxt-example","3.guides\u002F18.advanced-nuxt-example",{"title":135,"path":136,"stem":137,"icon":138},"Production","\u002Fguides\u002Fproduction","3.guides\u002F19.production","i-lucide-server",{"title":140,"path":141,"stem":142,"icon":143},"Register the Nuxt module","\u002Fguides\u002Fnuxt-module","3.guides\u002F2.nuxt-module","i-lucide-package",{"title":145,"path":146,"stem":147,"icon":148},"Storage adapters, comment stores, Nitro host","\u002Fguides\u002Fstorage-adapters","3.guides\u002F20.storage-adapters","i-lucide-database",{"title":150,"path":151,"stem":152,"icon":153},"Migrating from #tiptap-editor","\u002Fguides\u002Fmigration","3.guides\u002F21.migration","i-lucide-arrow-right-left",{"title":155,"path":156,"stem":157,"icon":158},"Content tree mechanics","\u002Fguides\u002Fcontent-tree","3.guides\u002F22.content-tree","i-lucide-git-fork",{"title":160,"path":161,"stem":162,"icon":163},"Block capabilities, abilities and actions","\u002Fguides\u002Fblock-capabilities","3.guides\u002F23.block-capabilities","i-lucide-shield-check",{"title":165,"path":166,"stem":167,"icon":168},"Block types in code and JSON","\u002Fguides\u002Fblock-types","3.guides\u002F24.block-types","i-lucide-shapes",{"title":170,"path":171,"stem":172,"icon":173},"Derive methods and the Derivation index","\u002Fguides\u002Fderive-methods","3.guides\u002F25.derive-methods","i-lucide-git-branch-plus",{"title":175,"path":176,"stem":177,"icon":178},"Block properties and Property definitions","\u002Fguides\u002Fblock-properties","3.guides\u002F26.block-properties","i-lucide-sliders-horizontal",{"title":180,"path":181,"stem":182,"icon":183},"Image studio","\u002Fguides\u002Fimage-studio","3.guides\u002F27.image-studio","i-lucide-image-plus",{"title":185,"path":186,"stem":187,"icon":188},"Prüfung and Freigabestatus","\u002Fguides\u002Fpruefung","3.guides\u002F28.pruefung","i-lucide-stamp",{"title":190,"path":191,"stem":192,"icon":193},"Workspace: find, read, reference and embed Blocks across Documents","\u002Fguides\u002Fworkspace","3.guides\u002F29.workspace","i-lucide-network",{"title":195,"path":196,"stem":197,"icon":198},"EditorPorts: auth and storage","\u002Fguides\u002Feditor-ports","3.guides\u002F3.editor-ports","i-lucide-plug",{"title":200,"path":201,"stem":202,"icon":203},"Collections: an ordered list of Blocks","\u002Fguides\u002Fcollections","3.guides\u002F30.collections","i-lucide-list-checks",{"title":205,"path":206,"stem":207,"icon":208},"Data views: a query shown as table, list or board","\u002Fguides\u002Fdata-views","3.guides\u002F31.data-views","i-lucide-table-properties",{"title":210,"path":211,"stem":212,"icon":193},"Explore: backlinks, related Blocks and the trail","\u002Fguides\u002Fexplore","3.guides\u002F32.explore",{"title":214,"path":215,"stem":216,"icon":217},"Render: export a Block or a Document to a file","\u002Fguides\u002Frender","3.guides\u002F33.render","i-lucide-file-output",{"title":219,"path":220,"stem":221,"icon":222},"Importers: what a dropped file becomes","\u002Fguides\u002Fimporters","3.guides\u002F34.importers","i-lucide-file-input",{"title":224,"path":225,"stem":226,"icon":227},"Templates: start a Document from a Dokumentvorlage","\u002Fguides\u002Ftemplates","3.guides\u002F35.templates","i-lucide-file-stack",{"title":229,"path":230,"stem":231,"icon":232},"Citations","\u002Fguides\u002Fcitations","3.guides\u002F36.citations","i-lucide-quote",{"title":234,"path":235,"stem":236,"icon":163},"AI proposals and the export check","\u002Fguides\u002Fexport-check","3.guides\u002F37.export-check",{"title":238,"path":239,"stem":240,"icon":241},"Query: filter, sort, group and total Blocks","\u002Fguides\u002Fquery","3.guides\u002F38.query","i-lucide-list-filter",{"title":243,"path":244,"stem":245,"icon":246},"Edges: backlinks and authored connections","\u002Fguides\u002Fedges","3.guides\u002F39.edges","i-lucide-link-2",{"title":248,"path":249,"stem":250,"icon":163},"Server routes and authentication","\u002Fguides\u002Froutes-and-auth","3.guides\u002F4.routes-and-auth",{"title":252,"path":253,"stem":254,"icon":255},"Speech: text to audio, and subtitle files","\u002Fguides\u002Fspeech","3.guides\u002F41.speech","i-lucide-audio-lines",{"title":257,"path":258,"stem":259,"icon":260},"Graph: the Edges around a Block","\u002Fguides\u002Fgraph","3.guides\u002F42.graph","i-lucide-waypoints",{"title":262,"path":263,"stem":264,"icon":265},"PDF viewer: passages, anchors and quotes","\u002Fguides\u002Fpdf-viewer","3.guides\u002F43.pdf-viewer","i-lucide-file-search",{"title":267,"path":268,"stem":269,"icon":270},"Obsidian: import and export a vault","\u002Fguides\u002Fobsidian","3.guides\u002F44.obsidian","i-lucide-folder-input",{"title":272,"path":273,"stem":274,"icon":275},"Typst: render a Document as a PDF with citations","\u002Fguides\u002Ftypst","3.guides\u002F45.typst","i-lucide-file-text",{"title":277,"path":278,"stem":279,"icon":280},"Audio: read aloud, mixdown and ElevenLabs","\u002Fguides\u002Faudio","3.guides\u002F46.audio","i-lucide-audio-waveform",{"title":282,"path":283,"stem":284,"icon":285},"Slides: decks, slide layouts and exports","\u002Fguides\u002Fslides","3.guides\u002F47.slides","i-lucide-presentation",{"title":287,"path":288,"stem":289,"icon":290},"Knowledge graph: sources and concepts beside the Documents","\u002Fguides\u002Fknowledge-graph","3.guides\u002F49.knowledge-graph","i-lucide-share-2",{"title":292,"path":293,"stem":294,"icon":78},"AI configuration and secrets","\u002Fguides\u002Fai-configuration","3.guides\u002F5.ai-configuration",{"title":296,"path":297,"stem":298,"children":299,"icon":301},"Index on Postgres: typos, meaning and SQL pushdown","\u002Fguides\u002Findex-pg","3.guides\u002F50.index-pg",[300],{"title":296,"path":297,"stem":298,"icon":301},"i-lucide-database-zap",{"title":303,"path":304,"stem":305,"icon":306},"Charts: bar, line, pie and scatter over a query","\u002Fguides\u002Fcharts","3.guides\u002F51.charts","i-lucide-chart-column",{"title":308,"path":309,"stem":310,"icon":73},"Collaboration on the client","\u002Fguides\u002Fcollaboration","3.guides\u002F6.collaboration",{"title":312,"path":313,"stem":314,"icon":315},"Block UI (drag handle, hover actions)","\u002Fguides\u002Fblock-ui","3.guides\u002F7.block-ui","i-lucide-grip-vertical",{"title":317,"path":318,"stem":319,"icon":320},"Settings and app lifetime","\u002Fguides\u002Fsettings","3.guides\u002F8.settings","i-lucide-settings",{"title":322,"path":323,"stem":324,"icon":325},"Language","\u002Fguides\u002Flanguage","3.guides\u002F9.language","i-lucide-languages",{"title":327,"icon":14,"path":328,"stem":329,"children":330,"page":37},"Reference","\u002Freference","4.reference",[331,335,339,344,348,352,356,360,364,368,373,378,382],{"title":332,"path":333,"stem":334,"icon":143},"Public exports","\u002Freference\u002Fexports","4.reference\u002F1.exports",{"title":336,"path":337,"stem":338,"icon":173},"Derive method contract","\u002Freference\u002Fderive-methods","4.reference\u002F10.derive-methods",{"title":340,"path":341,"stem":342,"icon":343},"Changelog","\u002Freference\u002Fchangelog","4.reference\u002F11.changelog","i-lucide-history",{"title":345,"path":346,"stem":347,"icon":217},"Renderer port","\u002Freference\u002Frenderer-port","4.reference\u002F12.renderer-port",{"title":349,"path":350,"stem":351,"icon":255},"Speech port","\u002Freference\u002Fspeech-port","4.reference\u002F13.speech-port",{"title":353,"path":354,"stem":355,"icon":58},"Presets and features","\u002Freference\u002Fpresets-and-features","4.reference\u002F2.presets-and-features",{"title":357,"path":358,"stem":359,"icon":68},"Feature contract","\u002Freference\u002Ffeature-contract","4.reference\u002F3.feature-contract",{"title":361,"path":362,"stem":363,"icon":107},"CSS and UI-provider requirements","\u002Freference\u002Fcss-and-ui","4.reference\u002F4.css-and-ui",{"title":365,"path":366,"stem":367,"icon":148},"Vue-free advanced schema","\u002Freference\u002Fadvanced-schema","4.reference\u002F5.advanced-schema",{"title":369,"path":370,"stem":371,"icon":372},"Dependency rules","\u002Freference\u002Fdependency-rules","4.reference\u002F6.dependency-rules","i-lucide-git-branch",{"title":374,"path":375,"stem":376,"icon":377},"Commands","\u002Freference\u002Fcommands","4.reference\u002F7.commands","i-lucide-terminal",{"title":379,"path":380,"stem":381,"icon":163},"Block capability contract","\u002Freference\u002Fblock-capabilities","4.reference\u002F8.block-capabilities",{"title":383,"path":384,"stem":385,"icon":168},"Block type contract","\u002Freference\u002Fblock-types","4.reference\u002F9.block-types",{"title":387,"path":388,"stem":389,"children":390,"icon":393},"AI agents","\u002Fai-agents","5.ai-agents\u002F1.index",[391,394,398,402,407],{"title":392,"path":388,"stem":389,"icon":393},"Overview","i-lucide-bot",{"title":395,"path":396,"stem":397,"icon":198},"Integrate the editor","\u002Fai-agents\u002Fintegrate","5.ai-agents\u002F2.integrate",{"title":399,"path":400,"stem":401,"icon":68},"Add a block or feature","\u002Fai-agents\u002Fextend","5.ai-agents\u002F3.extend",{"title":403,"path":404,"stem":405,"icon":406},"Pitfalls and invariants","\u002Fai-agents\u002Finvariants","5.ai-agents\u002F4.invariants","i-lucide-shield-alert",{"title":408,"path":409,"stem":410,"icon":411},"Verify","\u002Fai-agents\u002Fverify","5.ai-agents\u002F5.verify","i-lucide-check-check",{"id":413,"title":50,"body":414,"description":2632,"extension":2633,"links":2634,"meta":2635,"navigation":2636,"path":51,"seo":2637,"stem":52,"__hash__":2638},"docs\u002F2.tutorial\u002F2.simple-editor.md",{"type":415,"value":416,"toc":2624},"minimark",[417,433,436,439,444,463,943,992,999,1071,1098,1102,1127,1492,1498,2405,2408,2457,2463,2480,2585,2598,2602,2608,2612,2620],[418,419,420,424,425,428,429,432],"p",{},[421,422,423],"code",{},"SimpleEditor"," is the two core features alone (",[421,426,427],{},"core-content"," and ",[421,430,431],{},"core-ui","): bold, italic, underline, strike, code and link, headings, lists, quotes, code blocks, a horizontal rule, undo and redo. It makes no backend request, has no Yjs and no feature code. This is the right start for meeting notes.",[418,434,435],{},"Try it first. The toolbar and the outline sit beside the editor, the JSON pane shows the document the editor holds, and the switch makes it read-only:",[437,438],"demo-simple-editor",{},[440,441,443],"h2",{"id":442},"the-editor-context","The editor context",[418,445,446,447,450,451,454,455,458,459,462],{},"Every editor component reads shared state (settings, language, backend) from an editor context that the app installs once. ",[421,448,449],{},"createEditor()"," from ",[421,452,453],{},"@skaile\u002Fforge-editor\u002Fvue"," is that context as a Vue plugin; Nuxt UI's ",[421,456,457],{},"ui"," plugin provides the components. The example's ",[421,460,461],{},"main.ts"," in full:",[464,465,471],"pre",{"className":466,"code":467,"filename":468,"language":469,"meta":470,"style":470},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import ui from '@nuxt\u002Fui\u002Fvue-plugin'\nimport { createMemoryBackend } from '@skaile\u002Fforge-editor\u002Fadapters\u002Fmemory'\nimport { createEditor } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { nuxtUiKit } from '@skaile\u002Fforge-editor\u002Fvue\u002Fkit\u002Fnuxt-ui'\nimport { createApp } from 'vue'\nimport App from '.\u002FApp.vue'\nimport '.\u002Fstyle.css'\n\n\u002F\u002F No data layer: documents, dropped files (as blob: URLs), mention users and tags, and settings live in the page.\nconst backend = createMemoryBackend({\n  users: [\n    { id: 'u1', username: 'Ada Lovelace', color: '#7c3aed' },\n    { id: 'u2', username: 'Alan Turing', color: '#0ea5e9' },\n    { id: 'u3', username: 'Grace Hopper', color: '#16a34a' },\n  ],\n  tags: ['idee', 'entwurf', 'wichtig'],\n})\n\ncreateApp(App)\n  .use(ui)\n  .use(createEditor({ kit: nuxtUiKit(), backend }))\n  .mount('#app')\n","examples\u002Fvue-simple\u002Fsrc\u002Fmain.ts","ts","",[421,472,473,500,524,544,565,586,603,615,622,629,651,664,715,759,803,812,853,862,867,876,888,924],{"__ignoreMap":470},[474,475,478,482,486,489,493,497],"span",{"class":476,"line":477},"line",1,[474,479,481],{"class":480},"s7zQu","import",[474,483,485],{"class":484},"sTEyZ"," ui ",[474,487,488],{"class":480},"from",[474,490,492],{"class":491},"sMK4o"," '",[474,494,496],{"class":495},"sfazB","@nuxt\u002Fui\u002Fvue-plugin",[474,498,499],{"class":491},"'\n",[474,501,503,505,508,511,514,517,519,522],{"class":476,"line":502},2,[474,504,481],{"class":480},[474,506,507],{"class":491}," {",[474,509,510],{"class":484}," createMemoryBackend",[474,512,513],{"class":491}," }",[474,515,516],{"class":480}," from",[474,518,492],{"class":491},[474,520,521],{"class":495},"@skaile\u002Fforge-editor\u002Fadapters\u002Fmemory",[474,523,499],{"class":491},[474,525,527,529,531,534,536,538,540,542],{"class":476,"line":526},3,[474,528,481],{"class":480},[474,530,507],{"class":491},[474,532,533],{"class":484}," createEditor",[474,535,513],{"class":491},[474,537,516],{"class":480},[474,539,492],{"class":491},[474,541,453],{"class":495},[474,543,499],{"class":491},[474,545,547,549,551,554,556,558,560,563],{"class":476,"line":546},4,[474,548,481],{"class":480},[474,550,507],{"class":491},[474,552,553],{"class":484}," nuxtUiKit",[474,555,513],{"class":491},[474,557,516],{"class":480},[474,559,492],{"class":491},[474,561,562],{"class":495},"@skaile\u002Fforge-editor\u002Fvue\u002Fkit\u002Fnuxt-ui",[474,564,499],{"class":491},[474,566,568,570,572,575,577,579,581,584],{"class":476,"line":567},5,[474,569,481],{"class":480},[474,571,507],{"class":491},[474,573,574],{"class":484}," createApp",[474,576,513],{"class":491},[474,578,516],{"class":480},[474,580,492],{"class":491},[474,582,583],{"class":495},"vue",[474,585,499],{"class":491},[474,587,589,591,594,596,598,601],{"class":476,"line":588},6,[474,590,481],{"class":480},[474,592,593],{"class":484}," App ",[474,595,488],{"class":480},[474,597,492],{"class":491},[474,599,600],{"class":495},".\u002FApp.vue",[474,602,499],{"class":491},[474,604,606,608,610,613],{"class":476,"line":605},7,[474,607,481],{"class":480},[474,609,492],{"class":491},[474,611,612],{"class":495},".\u002Fstyle.css",[474,614,499],{"class":491},[474,616,618],{"class":476,"line":617},8,[474,619,621],{"emptyLinePlaceholder":620},true,"\n",[474,623,625],{"class":476,"line":624},9,[474,626,628],{"class":627},"sHwdD","\u002F\u002F No data layer: documents, dropped files (as blob: URLs), mention users and tags, and settings live in the page.\n",[474,630,632,636,639,642,645,648],{"class":476,"line":631},10,[474,633,635],{"class":634},"spNyl","const",[474,637,638],{"class":484}," backend ",[474,640,641],{"class":491},"=",[474,643,510],{"class":644},"s2Zo4",[474,646,647],{"class":484},"(",[474,649,650],{"class":491},"{\n",[474,652,654,658,661],{"class":476,"line":653},11,[474,655,657],{"class":656},"swJcz","  users",[474,659,660],{"class":491},":",[474,662,663],{"class":484}," [\n",[474,665,667,670,673,675,677,680,683,686,689,691,693,696,698,700,703,705,707,710,712],{"class":476,"line":666},12,[474,668,669],{"class":491},"    {",[474,671,672],{"class":656}," id",[474,674,660],{"class":491},[474,676,492],{"class":491},[474,678,679],{"class":495},"u1",[474,681,682],{"class":491},"'",[474,684,685],{"class":491},",",[474,687,688],{"class":656}," username",[474,690,660],{"class":491},[474,692,492],{"class":491},[474,694,695],{"class":495},"Ada Lovelace",[474,697,682],{"class":491},[474,699,685],{"class":491},[474,701,702],{"class":656}," color",[474,704,660],{"class":491},[474,706,492],{"class":491},[474,708,709],{"class":495},"#7c3aed",[474,711,682],{"class":491},[474,713,714],{"class":491}," },\n",[474,716,718,720,722,724,726,729,731,733,735,737,739,742,744,746,748,750,752,755,757],{"class":476,"line":717},13,[474,719,669],{"class":491},[474,721,672],{"class":656},[474,723,660],{"class":491},[474,725,492],{"class":491},[474,727,728],{"class":495},"u2",[474,730,682],{"class":491},[474,732,685],{"class":491},[474,734,688],{"class":656},[474,736,660],{"class":491},[474,738,492],{"class":491},[474,740,741],{"class":495},"Alan Turing",[474,743,682],{"class":491},[474,745,685],{"class":491},[474,747,702],{"class":656},[474,749,660],{"class":491},[474,751,492],{"class":491},[474,753,754],{"class":495},"#0ea5e9",[474,756,682],{"class":491},[474,758,714],{"class":491},[474,760,762,764,766,768,770,773,775,777,779,781,783,786,788,790,792,794,796,799,801],{"class":476,"line":761},14,[474,763,669],{"class":491},[474,765,672],{"class":656},[474,767,660],{"class":491},[474,769,492],{"class":491},[474,771,772],{"class":495},"u3",[474,774,682],{"class":491},[474,776,685],{"class":491},[474,778,688],{"class":656},[474,780,660],{"class":491},[474,782,492],{"class":491},[474,784,785],{"class":495},"Grace Hopper",[474,787,682],{"class":491},[474,789,685],{"class":491},[474,791,702],{"class":656},[474,793,660],{"class":491},[474,795,492],{"class":491},[474,797,798],{"class":495},"#16a34a",[474,800,682],{"class":491},[474,802,714],{"class":491},[474,804,806,809],{"class":476,"line":805},15,[474,807,808],{"class":484},"  ]",[474,810,811],{"class":491},",\n",[474,813,815,818,820,823,825,828,830,832,834,837,839,841,843,846,848,851],{"class":476,"line":814},16,[474,816,817],{"class":656},"  tags",[474,819,660],{"class":491},[474,821,822],{"class":484}," [",[474,824,682],{"class":491},[474,826,827],{"class":495},"idee",[474,829,682],{"class":491},[474,831,685],{"class":491},[474,833,492],{"class":491},[474,835,836],{"class":495},"entwurf",[474,838,682],{"class":491},[474,840,685],{"class":491},[474,842,492],{"class":491},[474,844,845],{"class":495},"wichtig",[474,847,682],{"class":491},[474,849,850],{"class":484},"]",[474,852,811],{"class":491},[474,854,856,859],{"class":476,"line":855},17,[474,857,858],{"class":491},"}",[474,860,861],{"class":484},")\n",[474,863,865],{"class":476,"line":864},18,[474,866,621],{"emptyLinePlaceholder":620},[474,868,870,873],{"class":476,"line":869},19,[474,871,872],{"class":644},"createApp",[474,874,875],{"class":484},"(App)\n",[474,877,879,882,885],{"class":476,"line":878},20,[474,880,881],{"class":491},"  .",[474,883,884],{"class":644},"use",[474,886,887],{"class":484},"(ui)\n",[474,889,891,893,895,897,900,902,905,908,910,912,915,917,919,921],{"class":476,"line":890},21,[474,892,881],{"class":491},[474,894,884],{"class":644},[474,896,647],{"class":484},[474,898,899],{"class":644},"createEditor",[474,901,647],{"class":484},[474,903,904],{"class":491},"{",[474,906,907],{"class":656}," kit",[474,909,660],{"class":491},[474,911,553],{"class":644},[474,913,914],{"class":484},"()",[474,916,685],{"class":491},[474,918,638],{"class":484},[474,920,858],{"class":491},[474,922,923],{"class":484},"))\n",[474,925,927,929,932,934,936,939,941],{"class":476,"line":926},22,[474,928,881],{"class":491},[474,930,931],{"class":644},"mount",[474,933,647],{"class":484},[474,935,682],{"class":491},[474,937,938],{"class":495},"#app",[474,940,682],{"class":491},[474,942,861],{"class":484},[944,945,946,953,986],"ul",{},[947,948,949,952],"li",{},[421,950,951],{},"nuxtUiKit()"," tells the library's Vue layer to render its toolbar, menus and dialogs with Nuxt UI components.",[947,954,955,958,959,961,962,965,966,969,970,428,973,976,977,980,981,985],{},[421,956,957],{},"createMemoryBackend()"," (",[421,960,521],{},") keeps everything in the page: settings in ",[421,963,964],{},"localStorage",", dropped files as ",[421,967,968],{},"blob:"," URLs, and the lists behind ",[421,971,972],{},"@",[421,974,975],{},"#",". The simple editor does not use the lists; chapter 3 does. Without a ",[421,978,979],{},"backend"," option the context talks to the HTTP routes of the Nuxt module instead (",[982,983,984],"a",{"href":141},"Nuxt module",").",[947,987,988,991],{},[421,989,990],{},"createEditor({ locale: 'en' })"," switches the library's own strings to English.",[418,993,994,995,998],{},"Then the stylesheet. Tailwind, Nuxt UI, then the core CSS, and a ",[421,996,997],{},"@source"," line so Tailwind generates the utility classes the library's Vue files use:",[464,1000,1004],{"className":1001,"code":1002,"language":1003,"meta":470,"style":470},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@import \"tailwindcss\";\n@import \"@nuxt\u002Fui\";\n@import \"@skaile\u002Fforge-editor\u002Fvue\u002Fkit\u002Fnuxt-ui.css\";\n@import \"@skaile\u002Fforge-editor\u002Fstyles\u002Fcore.css\";\n@source \"..\u002Fnode_modules\u002F@skaile\u002Fforge-editor\u002Fdist\";\n","css",[421,1005,1006,1023,1036,1049,1062],{"__ignoreMap":470},[474,1007,1008,1011,1014,1017,1020],{"class":476,"line":477},[474,1009,1010],{"class":480},"@import",[474,1012,1013],{"class":491}," \"",[474,1015,1016],{"class":495},"tailwindcss",[474,1018,1019],{"class":491},"\"",[474,1021,1022],{"class":491},";\n",[474,1024,1025,1027,1029,1032,1034],{"class":476,"line":502},[474,1026,1010],{"class":480},[474,1028,1013],{"class":491},[474,1030,1031],{"class":495},"@nuxt\u002Fui",[474,1033,1019],{"class":491},[474,1035,1022],{"class":491},[474,1037,1038,1040,1042,1045,1047],{"class":476,"line":526},[474,1039,1010],{"class":480},[474,1041,1013],{"class":491},[474,1043,1044],{"class":495},"@skaile\u002Fforge-editor\u002Fvue\u002Fkit\u002Fnuxt-ui.css",[474,1046,1019],{"class":491},[474,1048,1022],{"class":491},[474,1050,1051,1053,1055,1058,1060],{"class":476,"line":546},[474,1052,1010],{"class":480},[474,1054,1013],{"class":491},[474,1056,1057],{"class":495},"@skaile\u002Fforge-editor\u002Fstyles\u002Fcore.css",[474,1059,1019],{"class":491},[474,1061,1022],{"class":491},[474,1063,1064,1066,1069],{"class":476,"line":567},[474,1065,997],{"class":480},[474,1067,1068],{"class":484}," \"..\u002Fnode_modules\u002F@skaile\u002Fforge-editor\u002Fdist\"",[474,1070,1022],{"class":491},[418,1072,1073,1074,1076,1077,1080,1081,1084,1085,1087,1088,958,1091,1094,1095,1097],{},"The ",[421,1075,997],{}," path is relative to the CSS file and points to the installed library's ",[421,1078,1079],{},"dist"," directory: the whole of it, because the Features' components (",[421,1082,1083],{},"features\u002F*\u002Fcomponents",") sit beside ",[421,1086,583],{},". In this repository the examples point at the sibling's ",[421,1089,1090],{},"src",[421,1092,1093],{},"..\u002F..\u002F..\u002Fpackages\u002Feditor\u002Fsrc",") instead. The order matters: ",[982,1096,361],{"href":362}," lists every sheet and why it comes where it does.",[440,1099,1101],{"id":1100},"mount-the-editor","Mount the editor",[418,1103,1104,1107,1108,428,1111,1114,1115,1118,1119,1122,1123,1126],{},[421,1105,1106],{},"v-model"," carries the document as TipTap JSON. ",[421,1109,1110],{},"EditorToolbar",[421,1112,1113],{},"EditorOutline"," are siblings of the editor, not children: they work on exactly the editor you hand them, taken from the ",[421,1116,1117],{},"ready"," event. Keep that instance in a ",[421,1120,1121],{},"shallowRef","; a deep ",[421,1124,1125],{},"ref"," would wrap the TipTap instance in a Vue proxy.",[464,1128,1131],{"className":1129,"code":1130,"language":583,"meta":470,"style":470},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { ref, shallowRef } from 'vue'\nimport type { Editor, JSONContent } from '@tiptap\u002Fcore'\nimport { SimpleEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fsimple'\nimport { EditorToolbar } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { EditorOutline } from '@skaile\u002Fforge-editor\u002Foutline\u002Fvue'\n\nconst editor = shallowRef\u003CEditor>()\nconst content = ref\u003CJSONContent>({ type: 'doc', content: [{ type: 'paragraph' }] })\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUApp>\n    \u003CEditorToolbar :editor=\"editor\" \u002F>\n    \u003CSimpleEditor v-model=\"content\" @ready=\"editor = $event\" \u002F>\n    \u003CEditorOutline :editor=\"editor\" \u002F>\n  \u003C\u002FUApp>\n\u003C\u002Ftemplate>\n",[421,1132,1133,1158,1182,1210,1230,1249,1269,1273,1296,1360,1369,1373,1382,1392,1416,1455,1475,1484],{"__ignoreMap":470},[474,1134,1135,1138,1141,1144,1147,1149,1151,1153,1155],{"class":476,"line":477},[474,1136,1137],{"class":491},"\u003C",[474,1139,1140],{"class":656},"script",[474,1142,1143],{"class":634}," setup",[474,1145,1146],{"class":634}," lang",[474,1148,641],{"class":491},[474,1150,1019],{"class":491},[474,1152,469],{"class":495},[474,1154,1019],{"class":491},[474,1156,1157],{"class":491},">\n",[474,1159,1160,1162,1164,1167,1169,1172,1174,1176,1178,1180],{"class":476,"line":502},[474,1161,481],{"class":480},[474,1163,507],{"class":491},[474,1165,1166],{"class":484}," ref",[474,1168,685],{"class":491},[474,1170,1171],{"class":484}," shallowRef",[474,1173,513],{"class":491},[474,1175,516],{"class":480},[474,1177,492],{"class":491},[474,1179,583],{"class":495},[474,1181,499],{"class":491},[474,1183,1184,1186,1189,1191,1194,1196,1199,1201,1203,1205,1208],{"class":476,"line":526},[474,1185,481],{"class":480},[474,1187,1188],{"class":480}," type",[474,1190,507],{"class":491},[474,1192,1193],{"class":484}," Editor",[474,1195,685],{"class":491},[474,1197,1198],{"class":484}," JSONContent",[474,1200,513],{"class":491},[474,1202,516],{"class":480},[474,1204,492],{"class":491},[474,1206,1207],{"class":495},"@tiptap\u002Fcore",[474,1209,499],{"class":491},[474,1211,1212,1214,1216,1219,1221,1223,1225,1228],{"class":476,"line":546},[474,1213,481],{"class":480},[474,1215,507],{"class":491},[474,1217,1218],{"class":484}," SimpleEditor",[474,1220,513],{"class":491},[474,1222,516],{"class":480},[474,1224,492],{"class":491},[474,1226,1227],{"class":495},"@skaile\u002Fforge-editor\u002Fvue\u002Fsimple",[474,1229,499],{"class":491},[474,1231,1232,1234,1236,1239,1241,1243,1245,1247],{"class":476,"line":567},[474,1233,481],{"class":480},[474,1235,507],{"class":491},[474,1237,1238],{"class":484}," EditorToolbar",[474,1240,513],{"class":491},[474,1242,516],{"class":480},[474,1244,492],{"class":491},[474,1246,453],{"class":495},[474,1248,499],{"class":491},[474,1250,1251,1253,1255,1258,1260,1262,1264,1267],{"class":476,"line":588},[474,1252,481],{"class":480},[474,1254,507],{"class":491},[474,1256,1257],{"class":484}," EditorOutline",[474,1259,513],{"class":491},[474,1261,516],{"class":480},[474,1263,492],{"class":491},[474,1265,1266],{"class":495},"@skaile\u002Fforge-editor\u002Foutline\u002Fvue",[474,1268,499],{"class":491},[474,1270,1271],{"class":476,"line":605},[474,1272,621],{"emptyLinePlaceholder":620},[474,1274,1275,1277,1280,1282,1284,1286,1290,1293],{"class":476,"line":617},[474,1276,635],{"class":634},[474,1278,1279],{"class":484}," editor ",[474,1281,641],{"class":491},[474,1283,1171],{"class":644},[474,1285,1137],{"class":491},[474,1287,1289],{"class":1288},"sBMFI","Editor",[474,1291,1292],{"class":491},">",[474,1294,1295],{"class":484},"()\n",[474,1297,1298,1300,1303,1305,1307,1309,1312,1314,1316,1318,1320,1322,1324,1327,1329,1331,1334,1336,1338,1340,1342,1344,1346,1349,1351,1353,1356,1358],{"class":476,"line":624},[474,1299,635],{"class":634},[474,1301,1302],{"class":484}," content ",[474,1304,641],{"class":491},[474,1306,1166],{"class":644},[474,1308,1137],{"class":491},[474,1310,1311],{"class":1288},"JSONContent",[474,1313,1292],{"class":491},[474,1315,647],{"class":484},[474,1317,904],{"class":491},[474,1319,1188],{"class":656},[474,1321,660],{"class":491},[474,1323,492],{"class":491},[474,1325,1326],{"class":495},"doc",[474,1328,682],{"class":491},[474,1330,685],{"class":491},[474,1332,1333],{"class":656}," content",[474,1335,660],{"class":491},[474,1337,822],{"class":484},[474,1339,904],{"class":491},[474,1341,1188],{"class":656},[474,1343,660],{"class":491},[474,1345,492],{"class":491},[474,1347,1348],{"class":495},"paragraph",[474,1350,682],{"class":491},[474,1352,513],{"class":491},[474,1354,1355],{"class":484},"] ",[474,1357,858],{"class":491},[474,1359,861],{"class":484},[474,1361,1362,1365,1367],{"class":476,"line":631},[474,1363,1364],{"class":491},"\u003C\u002F",[474,1366,1140],{"class":656},[474,1368,1157],{"class":491},[474,1370,1371],{"class":476,"line":653},[474,1372,621],{"emptyLinePlaceholder":620},[474,1374,1375,1377,1380],{"class":476,"line":666},[474,1376,1137],{"class":491},[474,1378,1379],{"class":656},"template",[474,1381,1157],{"class":491},[474,1383,1384,1387,1390],{"class":476,"line":717},[474,1385,1386],{"class":491},"  \u003C",[474,1388,1389],{"class":656},"UApp",[474,1391,1157],{"class":491},[474,1393,1394,1397,1399,1402,1405,1407,1409,1411,1413],{"class":476,"line":761},[474,1395,1396],{"class":491},"    \u003C",[474,1398,1110],{"class":656},[474,1400,1401],{"class":491}," :",[474,1403,1404],{"class":634},"editor",[474,1406,641],{"class":491},[474,1408,1019],{"class":491},[474,1410,1404],{"class":484},[474,1412,1019],{"class":491},[474,1414,1415],{"class":491}," \u002F>\n",[474,1417,1418,1420,1422,1425,1427,1429,1432,1434,1437,1439,1441,1443,1445,1448,1451,1453],{"class":476,"line":805},[474,1419,1396],{"class":491},[474,1421,423],{"class":656},[474,1423,1424],{"class":634}," v-model",[474,1426,641],{"class":491},[474,1428,1019],{"class":491},[474,1430,1431],{"class":484},"content",[474,1433,1019],{"class":491},[474,1435,1436],{"class":491}," @",[474,1438,1117],{"class":634},[474,1440,641],{"class":491},[474,1442,1019],{"class":491},[474,1444,1404],{"class":484},[474,1446,1447],{"class":491}," = ",[474,1449,1450],{"class":484},"$event",[474,1452,1019],{"class":491},[474,1454,1415],{"class":491},[474,1456,1457,1459,1461,1463,1465,1467,1469,1471,1473],{"class":476,"line":814},[474,1458,1396],{"class":491},[474,1460,1113],{"class":656},[474,1462,1401],{"class":491},[474,1464,1404],{"class":634},[474,1466,641],{"class":491},[474,1468,1019],{"class":491},[474,1470,1404],{"class":484},[474,1472,1019],{"class":491},[474,1474,1415],{"class":491},[474,1476,1477,1480,1482],{"class":476,"line":855},[474,1478,1479],{"class":491},"  \u003C\u002F",[474,1481,1389],{"class":656},[474,1483,1157],{"class":491},[474,1485,1486,1488,1490],{"class":476,"line":864},[474,1487,1364],{"class":491},[474,1489,1379],{"class":656},[474,1491,1157],{"class":491},[418,1493,1494,1497],{},[421,1495,1496],{},"\u003CUApp>"," provides the overlays, tooltips and toasts the toolbar uses. The example's own template adds a sample picker, the read-only switch and two output panes. The part that matters here is how the editor, its toolbar and its outline are wired:",[464,1499,1502],{"className":1129,"code":1500,"filename":1501,"language":583,"meta":470,"style":470},"\u003Ctemplate>\n  \u003CUApp>\n    \u003Cmain class=\"mx-auto flex max-w-7xl flex-col gap-4 p-6\">\n      \u003Ch1 class=\"text-xl font-semibold\">@skaile\u002Fforge-editor – SimpleEditor\u003C\u002Fh1>\n\n      \u003Cdiv class=\"flex flex-wrap items-center gap-3\">\n        \u003CUSelect\n          v-model=\"sample\"\n          :items=\"SAMPLES\"\n          value-key=\"id\"\n          label-key=\"label\"\n          class=\"w-64\"\n          aria-label=\"Beispiel\"\n          data-testid=\"sample\"\n        \u002F>\n        \u003CUSwitch v-model=\"editable\" label=\"Bearbeitbar\" data-testid=\"editable\" \u002F>\n        \u003Cspan class=\"text-sm text-muted\" data-testid=\"edits\">Änderungen: {{ edits }}\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n\n      \u003CUAlert v-if=\"contentError\" color=\"error\" variant=\"subtle\" title=\"Inhalt abgelehnt\" :description=\"contentError\" data-testid=\"content-error\" \u002F>\n\n      \u003Cdiv class=\"grid grid-cols-[14rem_minmax(0,1fr)_20rem] gap-6\">\n        \u003Caside aria-label=\"Gliederung\">\n          \u003CEditorOutline :editor=\"editor\" \u002F>\n        \u003C\u002Faside>\n        \u003Cdiv class=\"flex min-w-0 flex-col gap-3\">\n          \u003CEditorToolbar :editor=\"editable ? editor : undefined\" \u002F>\n          \u003Cdiv class=\"rounded-lg border border-default p-4\" data-testid=\"surface\">\n            \u003CSimpleEditor\n              :model-value=\"content\"\n              :editable=\"editable\"\n              :extensions=\"extensions\"\n              :commands=\"hostCommands\"\n              @ready=\"onReady\"\n              @update:model-value=\"onUpdate\"\n              @content-error=\"onContentError\"\n            \u002F>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"flex min-w-0 flex-col gap-3\">\n          \u003Csection>\n            \u003Ch3 class=\"mb-1 text-sm font-semibold\">JSON\u003C\u002Fh3>\n            \u003Cpre class=\"max-h-72 overflow-auto rounded-lg bg-elevated p-3 text-xs\" data-testid=\"json\">{{ json }}\u003C\u002Fpre>\n          \u003C\u002Fsection>\n          \u003Csection>\n            \u003Ch3 class=\"mb-1 text-sm font-semibold\">Markdown\u003C\u002Fh3>\n            \u003Cpre class=\"max-h-72 overflow-auto rounded-lg bg-elevated p-3 text-xs\" data-testid=\"markdown\">{{ markdown }}\u003C\u002Fpre>\n          \u003C\u002Fsection>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n","examples\u002Fvue-simple\u002Fsrc\u002FApp.vue",[421,1503,1504,1512,1520,1541,1571,1575,1595,1603,1618,1635,1649,1663,1677,1691,1704,1709,1752,1791,1800,1804,1884,1888,1907,1929,1951,1961,1981,2010,2041,2050,2067,2082,2098,2115,2132,2153,2169,2175,2185,2194,2213,2223,2253,2293,2302,2311,2339,2378,2387,2396],{"__ignoreMap":470},[474,1505,1506,1508,1510],{"class":476,"line":477},[474,1507,1137],{"class":491},[474,1509,1379],{"class":656},[474,1511,1157],{"class":491},[474,1513,1514,1516,1518],{"class":476,"line":502},[474,1515,1386],{"class":491},[474,1517,1389],{"class":656},[474,1519,1157],{"class":491},[474,1521,1522,1524,1527,1530,1532,1534,1537,1539],{"class":476,"line":526},[474,1523,1396],{"class":491},[474,1525,1526],{"class":656},"main",[474,1528,1529],{"class":634}," class",[474,1531,641],{"class":491},[474,1533,1019],{"class":491},[474,1535,1536],{"class":495},"mx-auto flex max-w-7xl flex-col gap-4 p-6",[474,1538,1019],{"class":491},[474,1540,1157],{"class":491},[474,1542,1543,1546,1549,1551,1553,1555,1558,1560,1562,1565,1567,1569],{"class":476,"line":546},[474,1544,1545],{"class":491},"      \u003C",[474,1547,1548],{"class":656},"h1",[474,1550,1529],{"class":634},[474,1552,641],{"class":491},[474,1554,1019],{"class":491},[474,1556,1557],{"class":495},"text-xl font-semibold",[474,1559,1019],{"class":491},[474,1561,1292],{"class":491},[474,1563,1564],{"class":484},"@skaile\u002Fforge-editor – SimpleEditor",[474,1566,1364],{"class":491},[474,1568,1548],{"class":656},[474,1570,1157],{"class":491},[474,1572,1573],{"class":476,"line":567},[474,1574,621],{"emptyLinePlaceholder":620},[474,1576,1577,1579,1582,1584,1586,1588,1591,1593],{"class":476,"line":588},[474,1578,1545],{"class":491},[474,1580,1581],{"class":656},"div",[474,1583,1529],{"class":634},[474,1585,641],{"class":491},[474,1587,1019],{"class":491},[474,1589,1590],{"class":495},"flex flex-wrap items-center gap-3",[474,1592,1019],{"class":491},[474,1594,1157],{"class":491},[474,1596,1597,1600],{"class":476,"line":605},[474,1598,1599],{"class":491},"        \u003C",[474,1601,1602],{"class":656},"USelect\n",[474,1604,1605,1608,1610,1612,1615],{"class":476,"line":617},[474,1606,1607],{"class":634},"          v-model",[474,1609,641],{"class":491},[474,1611,1019],{"class":491},[474,1613,1614],{"class":484},"sample",[474,1616,1617],{"class":491},"\"\n",[474,1619,1620,1623,1626,1628,1630,1633],{"class":476,"line":624},[474,1621,1622],{"class":491},"          :",[474,1624,1625],{"class":634},"items",[474,1627,641],{"class":491},[474,1629,1019],{"class":491},[474,1631,1632],{"class":484},"SAMPLES",[474,1634,1617],{"class":491},[474,1636,1637,1640,1642,1644,1647],{"class":476,"line":631},[474,1638,1639],{"class":634},"          value-key",[474,1641,641],{"class":491},[474,1643,1019],{"class":491},[474,1645,1646],{"class":495},"id",[474,1648,1617],{"class":491},[474,1650,1651,1654,1656,1658,1661],{"class":476,"line":653},[474,1652,1653],{"class":634},"          label-key",[474,1655,641],{"class":491},[474,1657,1019],{"class":491},[474,1659,1660],{"class":495},"label",[474,1662,1617],{"class":491},[474,1664,1665,1668,1670,1672,1675],{"class":476,"line":666},[474,1666,1667],{"class":634},"          class",[474,1669,641],{"class":491},[474,1671,1019],{"class":491},[474,1673,1674],{"class":495},"w-64",[474,1676,1617],{"class":491},[474,1678,1679,1682,1684,1686,1689],{"class":476,"line":717},[474,1680,1681],{"class":634},"          aria-label",[474,1683,641],{"class":491},[474,1685,1019],{"class":491},[474,1687,1688],{"class":495},"Beispiel",[474,1690,1617],{"class":491},[474,1692,1693,1696,1698,1700,1702],{"class":476,"line":761},[474,1694,1695],{"class":634},"          data-testid",[474,1697,641],{"class":491},[474,1699,1019],{"class":491},[474,1701,1614],{"class":495},[474,1703,1617],{"class":491},[474,1705,1706],{"class":476,"line":805},[474,1707,1708],{"class":491},"        \u002F>\n",[474,1710,1711,1713,1716,1718,1720,1722,1725,1727,1730,1732,1734,1737,1739,1742,1744,1746,1748,1750],{"class":476,"line":814},[474,1712,1599],{"class":491},[474,1714,1715],{"class":656},"USwitch",[474,1717,1424],{"class":634},[474,1719,641],{"class":491},[474,1721,1019],{"class":491},[474,1723,1724],{"class":484},"editable",[474,1726,1019],{"class":491},[474,1728,1729],{"class":634}," label",[474,1731,641],{"class":491},[474,1733,1019],{"class":491},[474,1735,1736],{"class":495},"Bearbeitbar",[474,1738,1019],{"class":491},[474,1740,1741],{"class":634}," data-testid",[474,1743,641],{"class":491},[474,1745,1019],{"class":491},[474,1747,1724],{"class":495},[474,1749,1019],{"class":491},[474,1751,1415],{"class":491},[474,1753,1754,1756,1758,1760,1762,1764,1767,1769,1771,1773,1775,1778,1780,1782,1785,1787,1789],{"class":476,"line":855},[474,1755,1599],{"class":491},[474,1757,474],{"class":656},[474,1759,1529],{"class":634},[474,1761,641],{"class":491},[474,1763,1019],{"class":491},[474,1765,1766],{"class":495},"text-sm text-muted",[474,1768,1019],{"class":491},[474,1770,1741],{"class":634},[474,1772,641],{"class":491},[474,1774,1019],{"class":491},[474,1776,1777],{"class":495},"edits",[474,1779,1019],{"class":491},[474,1781,1292],{"class":491},[474,1783,1784],{"class":484},"Änderungen: {{ edits }}",[474,1786,1364],{"class":491},[474,1788,474],{"class":656},[474,1790,1157],{"class":491},[474,1792,1793,1796,1798],{"class":476,"line":864},[474,1794,1795],{"class":491},"      \u003C\u002F",[474,1797,1581],{"class":656},[474,1799,1157],{"class":491},[474,1801,1802],{"class":476,"line":869},[474,1803,621],{"emptyLinePlaceholder":620},[474,1805,1806,1808,1811,1814,1816,1818,1821,1823,1825,1827,1829,1832,1834,1837,1839,1841,1844,1846,1849,1851,1853,1856,1858,1860,1863,1865,1867,1869,1871,1873,1875,1877,1880,1882],{"class":476,"line":878},[474,1807,1545],{"class":491},[474,1809,1810],{"class":656},"UAlert",[474,1812,1813],{"class":480}," v-if",[474,1815,641],{"class":491},[474,1817,1019],{"class":491},[474,1819,1820],{"class":484},"contentError",[474,1822,1019],{"class":491},[474,1824,702],{"class":634},[474,1826,641],{"class":491},[474,1828,1019],{"class":491},[474,1830,1831],{"class":495},"error",[474,1833,1019],{"class":491},[474,1835,1836],{"class":634}," variant",[474,1838,641],{"class":491},[474,1840,1019],{"class":491},[474,1842,1843],{"class":495},"subtle",[474,1845,1019],{"class":491},[474,1847,1848],{"class":634}," title",[474,1850,641],{"class":491},[474,1852,1019],{"class":491},[474,1854,1855],{"class":495},"Inhalt abgelehnt",[474,1857,1019],{"class":491},[474,1859,1401],{"class":491},[474,1861,1862],{"class":634},"description",[474,1864,641],{"class":491},[474,1866,1019],{"class":491},[474,1868,1820],{"class":484},[474,1870,1019],{"class":491},[474,1872,1741],{"class":634},[474,1874,641],{"class":491},[474,1876,1019],{"class":491},[474,1878,1879],{"class":495},"content-error",[474,1881,1019],{"class":491},[474,1883,1415],{"class":491},[474,1885,1886],{"class":476,"line":890},[474,1887,621],{"emptyLinePlaceholder":620},[474,1889,1890,1892,1894,1896,1898,1900,1903,1905],{"class":476,"line":926},[474,1891,1545],{"class":491},[474,1893,1581],{"class":656},[474,1895,1529],{"class":634},[474,1897,641],{"class":491},[474,1899,1019],{"class":491},[474,1901,1902],{"class":495},"grid grid-cols-[14rem_minmax(0,1fr)_20rem] gap-6",[474,1904,1019],{"class":491},[474,1906,1157],{"class":491},[474,1908,1910,1912,1915,1918,1920,1922,1925,1927],{"class":476,"line":1909},23,[474,1911,1599],{"class":491},[474,1913,1914],{"class":656},"aside",[474,1916,1917],{"class":634}," aria-label",[474,1919,641],{"class":491},[474,1921,1019],{"class":491},[474,1923,1924],{"class":495},"Gliederung",[474,1926,1019],{"class":491},[474,1928,1157],{"class":491},[474,1930,1932,1935,1937,1939,1941,1943,1945,1947,1949],{"class":476,"line":1931},24,[474,1933,1934],{"class":491},"          \u003C",[474,1936,1113],{"class":656},[474,1938,1401],{"class":491},[474,1940,1404],{"class":634},[474,1942,641],{"class":491},[474,1944,1019],{"class":491},[474,1946,1404],{"class":484},[474,1948,1019],{"class":491},[474,1950,1415],{"class":491},[474,1952,1954,1957,1959],{"class":476,"line":1953},25,[474,1955,1956],{"class":491},"        \u003C\u002F",[474,1958,1914],{"class":656},[474,1960,1157],{"class":491},[474,1962,1964,1966,1968,1970,1972,1974,1977,1979],{"class":476,"line":1963},26,[474,1965,1599],{"class":491},[474,1967,1581],{"class":656},[474,1969,1529],{"class":634},[474,1971,641],{"class":491},[474,1973,1019],{"class":491},[474,1975,1976],{"class":495},"flex min-w-0 flex-col gap-3",[474,1978,1019],{"class":491},[474,1980,1157],{"class":491},[474,1982,1984,1986,1988,1990,1992,1994,1996,1998,2001,2003,2006,2008],{"class":476,"line":1983},27,[474,1985,1934],{"class":491},[474,1987,1110],{"class":656},[474,1989,1401],{"class":491},[474,1991,1404],{"class":634},[474,1993,641],{"class":491},[474,1995,1019],{"class":491},[474,1997,1724],{"class":484},[474,1999,2000],{"class":491}," ? ",[474,2002,1404],{"class":484},[474,2004,2005],{"class":491}," : undefined",[474,2007,1019],{"class":491},[474,2009,1415],{"class":491},[474,2011,2013,2015,2017,2019,2021,2023,2026,2028,2030,2032,2034,2037,2039],{"class":476,"line":2012},28,[474,2014,1934],{"class":491},[474,2016,1581],{"class":656},[474,2018,1529],{"class":634},[474,2020,641],{"class":491},[474,2022,1019],{"class":491},[474,2024,2025],{"class":495},"rounded-lg border border-default p-4",[474,2027,1019],{"class":491},[474,2029,1741],{"class":634},[474,2031,641],{"class":491},[474,2033,1019],{"class":491},[474,2035,2036],{"class":495},"surface",[474,2038,1019],{"class":491},[474,2040,1157],{"class":491},[474,2042,2044,2047],{"class":476,"line":2043},29,[474,2045,2046],{"class":491},"            \u003C",[474,2048,2049],{"class":656},"SimpleEditor\n",[474,2051,2053,2056,2059,2061,2063,2065],{"class":476,"line":2052},30,[474,2054,2055],{"class":491},"              :",[474,2057,2058],{"class":634},"model-value",[474,2060,641],{"class":491},[474,2062,1019],{"class":491},[474,2064,1431],{"class":484},[474,2066,1617],{"class":491},[474,2068,2070,2072,2074,2076,2078,2080],{"class":476,"line":2069},31,[474,2071,2055],{"class":491},[474,2073,1724],{"class":634},[474,2075,641],{"class":491},[474,2077,1019],{"class":491},[474,2079,1724],{"class":484},[474,2081,1617],{"class":491},[474,2083,2085,2087,2090,2092,2094,2096],{"class":476,"line":2084},32,[474,2086,2055],{"class":491},[474,2088,2089],{"class":634},"extensions",[474,2091,641],{"class":491},[474,2093,1019],{"class":491},[474,2095,2089],{"class":484},[474,2097,1617],{"class":491},[474,2099,2101,2103,2106,2108,2110,2113],{"class":476,"line":2100},33,[474,2102,2055],{"class":491},[474,2104,2105],{"class":634},"commands",[474,2107,641],{"class":491},[474,2109,1019],{"class":491},[474,2111,2112],{"class":484},"hostCommands",[474,2114,1617],{"class":491},[474,2116,2118,2121,2123,2125,2127,2130],{"class":476,"line":2117},34,[474,2119,2120],{"class":491},"              @",[474,2122,1117],{"class":634},[474,2124,641],{"class":491},[474,2126,1019],{"class":491},[474,2128,2129],{"class":484},"onReady",[474,2131,1617],{"class":491},[474,2133,2135,2137,2140,2142,2144,2146,2148,2151],{"class":476,"line":2134},35,[474,2136,2120],{"class":491},[474,2138,2139],{"class":634},"update",[474,2141,660],{"class":491},[474,2143,2058],{"class":634},[474,2145,641],{"class":491},[474,2147,1019],{"class":491},[474,2149,2150],{"class":484},"onUpdate",[474,2152,1617],{"class":491},[474,2154,2156,2158,2160,2162,2164,2167],{"class":476,"line":2155},36,[474,2157,2120],{"class":491},[474,2159,1879],{"class":634},[474,2161,641],{"class":491},[474,2163,1019],{"class":491},[474,2165,2166],{"class":484},"onContentError",[474,2168,1617],{"class":491},[474,2170,2172],{"class":476,"line":2171},37,[474,2173,2174],{"class":491},"            \u002F>\n",[474,2176,2178,2181,2183],{"class":476,"line":2177},38,[474,2179,2180],{"class":491},"          \u003C\u002F",[474,2182,1581],{"class":656},[474,2184,1157],{"class":491},[474,2186,2188,2190,2192],{"class":476,"line":2187},39,[474,2189,1956],{"class":491},[474,2191,1581],{"class":656},[474,2193,1157],{"class":491},[474,2195,2197,2199,2201,2203,2205,2207,2209,2211],{"class":476,"line":2196},40,[474,2198,1599],{"class":491},[474,2200,1581],{"class":656},[474,2202,1529],{"class":634},[474,2204,641],{"class":491},[474,2206,1019],{"class":491},[474,2208,1976],{"class":495},[474,2210,1019],{"class":491},[474,2212,1157],{"class":491},[474,2214,2216,2218,2221],{"class":476,"line":2215},41,[474,2217,1934],{"class":491},[474,2219,2220],{"class":656},"section",[474,2222,1157],{"class":491},[474,2224,2226,2228,2231,2233,2235,2237,2240,2242,2244,2247,2249,2251],{"class":476,"line":2225},42,[474,2227,2046],{"class":491},[474,2229,2230],{"class":656},"h3",[474,2232,1529],{"class":634},[474,2234,641],{"class":491},[474,2236,1019],{"class":491},[474,2238,2239],{"class":495},"mb-1 text-sm font-semibold",[474,2241,1019],{"class":491},[474,2243,1292],{"class":491},[474,2245,2246],{"class":484},"JSON",[474,2248,1364],{"class":491},[474,2250,2230],{"class":656},[474,2252,1157],{"class":491},[474,2254,2256,2258,2260,2262,2264,2266,2269,2271,2273,2275,2277,2280,2282,2284,2287,2289,2291],{"class":476,"line":2255},43,[474,2257,2046],{"class":491},[474,2259,464],{"class":656},[474,2261,1529],{"class":634},[474,2263,641],{"class":491},[474,2265,1019],{"class":491},[474,2267,2268],{"class":495},"max-h-72 overflow-auto rounded-lg bg-elevated p-3 text-xs",[474,2270,1019],{"class":491},[474,2272,1741],{"class":634},[474,2274,641],{"class":491},[474,2276,1019],{"class":491},[474,2278,2279],{"class":495},"json",[474,2281,1019],{"class":491},[474,2283,1292],{"class":491},[474,2285,2286],{"class":484},"{{ json }}",[474,2288,1364],{"class":491},[474,2290,464],{"class":656},[474,2292,1157],{"class":491},[474,2294,2296,2298,2300],{"class":476,"line":2295},44,[474,2297,2180],{"class":491},[474,2299,2220],{"class":656},[474,2301,1157],{"class":491},[474,2303,2305,2307,2309],{"class":476,"line":2304},45,[474,2306,1934],{"class":491},[474,2308,2220],{"class":656},[474,2310,1157],{"class":491},[474,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330,2333,2335,2337],{"class":476,"line":2313},46,[474,2315,2046],{"class":491},[474,2317,2230],{"class":656},[474,2319,1529],{"class":634},[474,2321,641],{"class":491},[474,2323,1019],{"class":491},[474,2325,2239],{"class":495},[474,2327,1019],{"class":491},[474,2329,1292],{"class":491},[474,2331,2332],{"class":484},"Markdown",[474,2334,1364],{"class":491},[474,2336,2230],{"class":656},[474,2338,1157],{"class":491},[474,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2365,2367,2369,2372,2374,2376],{"class":476,"line":2341},47,[474,2343,2046],{"class":491},[474,2345,464],{"class":656},[474,2347,1529],{"class":634},[474,2349,641],{"class":491},[474,2351,1019],{"class":491},[474,2353,2268],{"class":495},[474,2355,1019],{"class":491},[474,2357,1741],{"class":634},[474,2359,641],{"class":491},[474,2361,1019],{"class":491},[474,2363,2364],{"class":495},"markdown",[474,2366,1019],{"class":491},[474,2368,1292],{"class":491},[474,2370,2371],{"class":484},"{{ markdown }}",[474,2373,1364],{"class":491},[474,2375,464],{"class":656},[474,2377,1157],{"class":491},[474,2379,2381,2383,2385],{"class":476,"line":2380},48,[474,2382,2180],{"class":491},[474,2384,2220],{"class":656},[474,2386,1157],{"class":491},[474,2388,2390,2392,2394],{"class":476,"line":2389},49,[474,2391,1956],{"class":491},[474,2393,1581],{"class":656},[474,2395,1157],{"class":491},[474,2397,2399,2401,2403],{"class":476,"line":2398},50,[474,2400,1795],{"class":491},[474,2402,1581],{"class":656},[474,2404,1157],{"class":491},[418,2406,2407],{},"Three details:",[944,2409,2410,2424,2439],{},[947,2411,2412,2416,2417,2419,2420,2423],{},[2413,2414,2415],"strong",{},"Read-only."," ",[421,2418,1724],{}," is reactive. The example hands the toolbar ",[421,2421,2422],{},"undefined"," while the editor is read-only; without an editor the toolbar renders no groups.",[947,2425,2426,2416,2429,2431,2432,2435,2436,2438],{},[2413,2427,2428],{},"The editor owns the document.",[421,2430,1106],{}," mirrors it as JSON. Assigning a new object to the model replaces the document without an update event (the editor calls ",[421,2433,2434],{},"setContent(json, { emitUpdate: false })","), so loading a sample does not count as an edit. JSON the editor emitted itself and you hand back unchanged is recognised and ignored, so the usual ",[421,2437,1106],{}," round trip keeps the caret and the undo history.",[947,2440,2441,2416,2444,2446,2447,428,2449,2452,2453,2456],{},[2413,2442,2443],{},"Props that are read once.",[421,2445,2089],{},", ",[421,2448,2105],{},[421,2450,2451],{},"abilities"," are read when the component is set up. Pass constants, or remount with a new ",[421,2454,2455],{},"key",".",[440,2458,2460,2461],{"id":2459},"rejected-content-contenterror","Rejected content: ",[421,2462,1820],{},[418,2464,2465,2466,2469,2470,2472,2473,2476,2477,2479],{},"The simple schema is not a lossy view of richer documents. Initial and external JSON is checked against the installed schema. A document with unknown node or mark types, for example ",[421,2467,2468],{},"{ type: 'doc', content: [{ type: 'typedBlock' }] }"," (the node of a Typed block), is rejected: ",[421,2471,1820],{}," fires with the reason and the ",[2413,2474,2475],{},"last valid document stays"," in the editor. Nothing is flattened or silently dropped. The ",[421,2478,1106],{}," value is your own state, so move it back when you want it to follow the editor. This is how the example handles its „Ungültig (Block-JSON)“ sample: the alert shows the reason, and the model and the picker return to the previous sample.",[464,2481,2483],{"className":1129,"code":2482,"filename":1501,"language":583,"meta":470,"style":470},"\u002F\u002F `shown` is the sample the editor currently shows. The editor keeps its last valid document when it rejects a\n\u002F\u002F load; the model and the picker follow it back.\nlet shown = firstSample.id\nlet rejectedLoad: { id: string, content: JSONContent } | undefined\nwatch(sample, (id) => {\n  const next = SAMPLES.find(s => s.id === id)\n  if (!next || id === shown) return\n  rejectedLoad = { id: shown, content: content.value }\n  shown = id\n  contentError.value = ''\n  content.value = next.content\n})\nfunction onContentError(error: Error) {\n  contentError.value = error.message\n  if (!rejectedLoad) return\n  content.value = rejectedLoad.content\n  shown = rejectedLoad.id\n  sample.value = rejectedLoad.id\n  rejectedLoad = undefined\n}\n",[421,2484,2485,2490,2495,2500,2505,2510,2515,2520,2525,2530,2535,2540,2545,2550,2555,2560,2565,2570,2575,2580],{"__ignoreMap":470},[474,2486,2487],{"class":476,"line":477},[474,2488,2489],{"class":484},"\u002F\u002F `shown` is the sample the editor currently shows. The editor keeps its last valid document when it rejects a\n",[474,2491,2492],{"class":476,"line":502},[474,2493,2494],{"class":484},"\u002F\u002F load; the model and the picker follow it back.\n",[474,2496,2497],{"class":476,"line":526},[474,2498,2499],{"class":484},"let shown = firstSample.id\n",[474,2501,2502],{"class":476,"line":546},[474,2503,2504],{"class":484},"let rejectedLoad: { id: string, content: JSONContent } | undefined\n",[474,2506,2507],{"class":476,"line":567},[474,2508,2509],{"class":484},"watch(sample, (id) => {\n",[474,2511,2512],{"class":476,"line":588},[474,2513,2514],{"class":484},"  const next = SAMPLES.find(s => s.id === id)\n",[474,2516,2517],{"class":476,"line":605},[474,2518,2519],{"class":484},"  if (!next || id === shown) return\n",[474,2521,2522],{"class":476,"line":617},[474,2523,2524],{"class":484},"  rejectedLoad = { id: shown, content: content.value }\n",[474,2526,2527],{"class":476,"line":624},[474,2528,2529],{"class":484},"  shown = id\n",[474,2531,2532],{"class":476,"line":631},[474,2533,2534],{"class":484},"  contentError.value = ''\n",[474,2536,2537],{"class":476,"line":653},[474,2538,2539],{"class":484},"  content.value = next.content\n",[474,2541,2542],{"class":476,"line":666},[474,2543,2544],{"class":484},"})\n",[474,2546,2547],{"class":476,"line":717},[474,2548,2549],{"class":484},"function onContentError(error: Error) {\n",[474,2551,2552],{"class":476,"line":761},[474,2553,2554],{"class":484},"  contentError.value = error.message\n",[474,2556,2557],{"class":476,"line":805},[474,2558,2559],{"class":484},"  if (!rejectedLoad) return\n",[474,2561,2562],{"class":476,"line":814},[474,2563,2564],{"class":484},"  content.value = rejectedLoad.content\n",[474,2566,2567],{"class":476,"line":855},[474,2568,2569],{"class":484},"  shown = rejectedLoad.id\n",[474,2571,2572],{"class":476,"line":864},[474,2573,2574],{"class":484},"  sample.value = rejectedLoad.id\n",[474,2576,2577],{"class":476,"line":869},[474,2578,2579],{"class":484},"  rejectedLoad = undefined\n",[474,2581,2582],{"class":476,"line":878},[474,2583,2584],{"class":484},"}\n",[418,2586,2587,2588,2590,2591,2593,2594,2597],{},"The full list of props and events of ",[421,2589,423],{}," is in ",[982,2592,25],{"href":26},". The editor is isolated on purpose: ",[421,2595,2596],{},"bun run check:editor-entries"," proves that the simple bundle contains no feature, AI SDK, Yjs, Hocuspocus or server module.",[440,2599,2601],{"id":2600},"what-you-have-now","What you have now",[418,2603,2604,2605,2607],{},"A Vue app with a working rich-text editor: JSON ",[421,2606,1106],{},", a toolbar and an outline that follow the editor you give them, a read-only mode, and a defined behaviour for documents the schema rejects. The editor has no features beyond the core ones yet.",[440,2609,2611],{"id":2610},"next","Next",[418,2613,2614,2616,2617,2619],{},[982,2615,55],{"href":56}," replaces ",[421,2618,423],{}," with an editor you assemble from features.",[2621,2622,2623],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":470,"searchDepth":502,"depth":502,"links":2625},[2626,2627,2628,2630,2631],{"id":442,"depth":502,"text":443},{"id":1100,"depth":502,"text":1101},{"id":2459,"depth":502,"text":2629},"Rejected content: contentError",{"id":2600,"depth":502,"text":2601},{"id":2610,"depth":502,"text":2611},"Mount SimpleEditor with a JSON v-model, add the toolbar and the outline beside it, switch it read-only and handle rejected content.","md",null,{},{"icon":53},{"title":50,"description":2632},"QCFwzsKMgCKe453sSXg2qdfivDsfuwVueX2L6kMVbXU",[2640,2642],{"title":45,"path":46,"stem":47,"description":2641,"icon":48,"children":-1},"Build a meeting-notes editor in eight chapters: a simple editor, composed features, an own block, a backend with collaboration, AI, and the same editor on React.",{"title":55,"path":56,"stem":57,"description":2643,"icon":58,"children":-1},"Replace SimpleEditor with EditorSurface over defineEditor and add mentions, media, tables and block UI as features.",1793178228816]