[{"data":1,"prerenderedAt":960},["ShallowReactive",2],{"navigation_docs":3,"-tutorial-overview":412,"-tutorial-overview-surround":955},[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":45,"body":414,"description":948,"extension":949,"links":950,"meta":951,"navigation":952,"path":46,"seo":953,"stem":47,"__hash__":954},"docs\u002F2.tutorial\u002F1.overview.md",{"type":415,"value":416,"toc":941},"minimark",[417,421,429,432,437,604,611,615,653,673,874,893,897,900,922,926,929,933,937],[418,419,420],"p",{},"This tutorial builds one editor for meeting notes. You start with the smallest working editor, add features one at a time, write your own block, connect it to a server, teach it to an AI model and finally see the same editor on React. Every chapter ends with a working result and one link to the next chapter.",[418,422,423,424,428],{},"The finished editor of chapters 1 to 5 runs below. Type ",[425,426,427],"code",{},"\u002Fcallout"," to add a callout, hover a callout block to change its tone, and open „Umwandeln in …“ on any paragraph.",[430,431],"demo-callout-path-b",{},[433,434,436],"h2",{"id":435},"what-you-build","What you build",[438,439,440,456],"table",{},[441,442,443],"thead",{},[444,445,446,450,453],"tr",{},[447,448,449],"th",{},"Chapter",[447,451,452],{},"You add",[447,454,455],{},"Result",[457,458,459,483,510,534,550,567,585],"tbody",{},[444,460,461,468,480],{},[462,463,464],"td",{},[465,466,467],"a",{"href":51},"2. A simple editor",[462,469,470,473,474,473,477],{},[425,471,472],{},"SimpleEditor",", ",[425,475,476],{},"EditorToolbar",[425,478,479],{},"EditorOutline",[462,481,482],{},"Rich text, toolbar, outline, read-only switch",[444,484,485,490,500],{},[462,486,487],{},[465,488,489],{"href":56},"3. Compose features",[462,491,492,495,496,499],{},[425,493,494],{},"EditorSurface"," over ",[425,497,498],{},"defineEditor",", mentions, media, tables, block UI",[462,501,502,505,506,509],{},[425,503,504],{},"@"," and ",[425,507,508],{},"#"," suggestions, image drop, tables, drag handle",[444,511,512,517,527],{},[462,513,514],{},[465,515,516],{"href":61},"4. Own block, path A",[462,518,519,520,505,523,526],{},"The „Hinweis“ node through the ",[425,521,522],{},"extensions",[425,524,525],{},"commands"," props",[462,528,529,530,533],{},"A callout block with a ",[425,531,532],{},"\u002Fhinweis"," entry",[444,535,536,541,547],{},[462,537,538],{},[465,539,540],{"href":66},"5. Own feature, path B",[462,542,543,544],{},"The callout as an ",[425,545,546],{},"EditorFeature",[462,548,549],{},"Toolbar button, hover menu, „Umwandeln in …“",[444,551,552,557,564],{},[462,553,554],{},[465,555,556],{"href":71},"6. Backend and collaboration",[462,558,559,560,563],{},"The Nuxt module, ",[425,561,562],{},"EditorPorts",", a collaboration session",[462,565,566],{},"Two browsers on one document",[444,568,569,574,582],{},[462,570,571],{},[465,572,573],{"href":76},"7. AI",[462,575,576,473,579],{},[425,577,578],{},"aiFeature()",[425,580,581],{},"aiContext",[462,583,584],{},"The model knows about callouts",[444,586,587,592,601],{},[462,588,589],{},[465,590,591],{"href":81},"8. The React surface",[462,593,594,473,597,473,599],{},[425,595,596],{},"EditorContextProvider",[425,598,494],{},[425,600,472],{},[462,602,603],{},"The same editor on React",[418,605,606,607,610],{},"The UI strings of the examples are German („Hinweis“, „Warnung“, „Erledigt“, „Umwandeln in …“), the code and this tutorial are English. Pass ",[425,608,609],{},"createEditor({ locale: 'en' })"," to switch the built-in strings of the library to English; the strings of your own block stay yours.",[433,612,614],{"id":613},"prerequisites","Prerequisites",[616,617,618,637,644],"ul",{},[619,620,621,622,628,629,632,633,636],"li",{},"Node 22 or newer and ",[465,623,627],{"href":624,"rel":625},"https:\u002F\u002Fbun.sh",[626],"nofollow","Bun"," (the commands below use ",[425,630,631],{},"bun","; ",[425,634,635],{},"npm"," works the same).",[619,638,639,640,643],{},"A Vite app with Vue 3. Nuxt UI's Vite plugin, ",[425,641,642],{},"@nuxt\u002Fui\u002Fvite",", provides the theme, icons and component imports; the editor's Vue layer uses Nuxt UI components. You do not need Nuxt for chapters 1 to 5.",[619,645,646,649,650,652],{},[425,647,648],{},"@skaile\u002Fforge-editor"," and its peers installed as described in ",[465,651,16],{"href":17},".",[418,654,655,656,658,659,473,662,473,665,668,669,672],{},"If you start from nothing, ",[465,657,25],{"href":26}," lists the three small files (",[425,660,661],{},"package.json",[425,663,664],{},"index.html",[425,666,667],{},"tsconfig.json",") a new app needs. The Vite config of the runnable example, ",[425,670,671],{},"examples\u002Fvue-simple",", is the one this tutorial builds on:",[674,675,681],"pre",{"className":676,"code":677,"filename":678,"language":679,"meta":680,"style":680},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Plain Vite + Vue (no Nuxt, router or backend). Nuxt UI's Vite plugin brings the theme, icons and component imports.\nexport default defineConfig({\n  server: { port: 3040, strictPort: true },\n  resolve: sourceResolve,\n  plugins: [\n    vue(),\n    ui({ router: false, icon: { clientBundle: { scan: true, icons: [...libraryIcons] } } }),\n  ],\n})\n","examples\u002Fvue-simple\u002Fvite.config.ts","ts","",[425,682,683,692,714,751,765,776,787,858,866],{"__ignoreMap":680},[684,685,688],"span",{"class":686,"line":687},"line",1,[684,689,691],{"class":690},"sHwdD","\u002F\u002F Plain Vite + Vue (no Nuxt, router or backend). Nuxt UI's Vite plugin brings the theme, icons and component imports.\n",[684,693,695,699,702,706,710],{"class":686,"line":694},2,[684,696,698],{"class":697},"s7zQu","export",[684,700,701],{"class":697}," default",[684,703,705],{"class":704},"s2Zo4"," defineConfig",[684,707,709],{"class":708},"sTEyZ","(",[684,711,713],{"class":712},"sMK4o","{\n",[684,715,717,721,724,727,730,732,736,739,742,744,748],{"class":686,"line":716},3,[684,718,720],{"class":719},"swJcz","  server",[684,722,723],{"class":712},":",[684,725,726],{"class":712}," {",[684,728,729],{"class":719}," port",[684,731,723],{"class":712},[684,733,735],{"class":734},"sbssI"," 3040",[684,737,738],{"class":712},",",[684,740,741],{"class":719}," strictPort",[684,743,723],{"class":712},[684,745,747],{"class":746},"sfNiH"," true",[684,749,750],{"class":712}," },\n",[684,752,754,757,759,762],{"class":686,"line":753},4,[684,755,756],{"class":719},"  resolve",[684,758,723],{"class":712},[684,760,761],{"class":708}," sourceResolve",[684,763,764],{"class":712},",\n",[684,766,768,771,773],{"class":686,"line":767},5,[684,769,770],{"class":719},"  plugins",[684,772,723],{"class":712},[684,774,775],{"class":708}," [\n",[684,777,779,782,785],{"class":686,"line":778},6,[684,780,781],{"class":704},"    vue",[684,783,784],{"class":708},"()",[684,786,764],{"class":712},[684,788,790,793,795,798,801,803,806,808,811,813,815,818,820,822,825,827,829,831,834,836,839,842,845,848,851,853,856],{"class":686,"line":789},7,[684,791,792],{"class":704},"    ui",[684,794,709],{"class":708},[684,796,797],{"class":712},"{",[684,799,800],{"class":719}," router",[684,802,723],{"class":712},[684,804,805],{"class":746}," false",[684,807,738],{"class":712},[684,809,810],{"class":719}," icon",[684,812,723],{"class":712},[684,814,726],{"class":712},[684,816,817],{"class":719}," clientBundle",[684,819,723],{"class":712},[684,821,726],{"class":712},[684,823,824],{"class":719}," scan",[684,826,723],{"class":712},[684,828,747],{"class":746},[684,830,738],{"class":712},[684,832,833],{"class":719}," icons",[684,835,723],{"class":712},[684,837,838],{"class":708}," [",[684,840,841],{"class":712},"...",[684,843,844],{"class":708},"libraryIcons] ",[684,846,847],{"class":712},"}",[684,849,850],{"class":712}," }",[684,852,850],{"class":712},[684,854,855],{"class":708},")",[684,857,764],{"class":712},[684,859,861,864],{"class":686,"line":860},8,[684,862,863],{"class":708},"  ]",[684,865,764],{"class":712},[684,867,869,871],{"class":686,"line":868},9,[684,870,847],{"class":712},[684,872,873],{"class":708},")\n",[418,875,876,877,880,881,884,885,888,889,892],{},"Two parts of this file belong to the repository only. ",[425,878,879],{},"sourceResolve"," makes Vite read the library from ",[425,882,883],{},"packages\u002Feditor\u002Fsrc"," instead of a built package, and ",[425,886,887],{},"libraryIcons"," bundles the library's icons although the library lies outside the Vite root. In your own app the plugin list ",[425,890,891],{},"[vue(), ui({ router: false })]"," is enough; the icon bundling is optional and only avoids runtime requests to the Iconify API.",[433,894,896],{"id":895},"run-the-examples","Run the examples",[418,898,899],{},"Every chapter shows code from a real file of the repository, so you can run the same code:",[674,901,905],{"className":902,"code":903,"language":904,"meta":680,"style":680},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun install\nbun run --cwd examples\u002Fvue-simple dev   # chapters 2 and 4, port 3040\nbun run dev                             # chapters 5 to 7, port 3056 (the repository's Nuxt app)\n","sh",[425,906,907,912,917],{"__ignoreMap":680},[684,908,909],{"class":686,"line":687},[684,910,911],{},"bun install\n",[684,913,914],{"class":686,"line":694},[684,915,916],{},"bun run --cwd examples\u002Fvue-simple dev   # chapters 2 and 4, port 3040\n",[684,918,919],{"class":686,"line":716},[684,920,921],{},"bun run dev                             # chapters 5 to 7, port 3056 (the repository's Nuxt app)\n",[433,923,925],{"id":924},"what-you-have-now","What you have now",[418,927,928],{},"A plan, and a place to run each step: the simple example app for the first chapters and the repository's Nuxt app for the advanced ones.",[433,930,932],{"id":931},"next","Next",[418,934,935,652],{},[465,936,50],{"href":51},[938,939,940],"style",{},"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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);}",{"title":680,"searchDepth":694,"depth":694,"links":942},[943,944,945,946,947],{"id":435,"depth":694,"text":436},{"id":613,"depth":694,"text":614},{"id":895,"depth":694,"text":896},{"id":924,"depth":694,"text":925},{"id":931,"depth":694,"text":932},"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.","md",null,{},{"icon":48},{"title":45,"description":948},"IYxs4ZXrfVAqE_e4i7r4N64czi3exengAA0aDSPsGSQ",[956,958],{"title":33,"path":34,"stem":35,"description":957,"icon":36,"children":-1},"Terms used across the documentation: editor composition, document, block, source, AI and panel vocabulary.",{"title":50,"path":51,"stem":52,"description":959,"icon":53,"children":-1},"Mount SimpleEditor with a JSON v-model, add the toolbar and the outline beside it, switch it read-only and handle rejected content.",1793178225761]