[{"data":1,"prerenderedAt":2211},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-quick-start-nuxt":412,"-getting-started-quick-start-nuxt-surround":2206},[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":21,"body":414,"description":2199,"extension":2200,"links":2201,"meta":2202,"navigation":2203,"path":22,"seo":2204,"stem":23,"__hash__":2205},"docs\u002F1.getting-started\u002F3.quick-start-nuxt.md",{"type":415,"value":416,"toc":2189},"minimark",[417,459,2163,2167,2185],[418,419,420,421,425,426,425,429,425,432,425,435,425,438,425,441,425,444,425,447,450,451,454,455,458],"p",{},"Install the peers next to the package (",[422,423,424],"code",{},"vue",", ",[422,427,428],{},"@nuxt\u002Fui",[422,430,431],{},"@tiptap\u002Fcore",[422,433,434],{},"@tiptap\u002Fpm",[422,436,437],{},"@tiptap\u002Fvue-3",[422,439,440],{},"yjs",[422,442,443],{},"@hocuspocus\u002Fprovider",[422,445,446],{},"tailwindcss",[422,448,449],{},"@iconify-json\u002Flucide","; see ",[452,453,16],"a",{"href":17},"), then follow the steps. Inside the repository declare ",[422,456,457],{},"\"@skaile\u002Fforge-editor\": \"workspace:*\""," instead of the npm version.",[460,461,463,470,595,632,638,749,760,764,803,807,821,969,976,1019,1865,1869,1881,2126,2148],"steps",{"level":462},"2",[464,465,467,468],"h2",{"id":466},"register-the-module-after-nuxtui","Register the module after ",[422,469,428],{},[471,472,477],"pre",{"className":473,"code":474,"language":475,"meta":476,"style":476},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  ssr: false, \u002F\u002F TipTap renders on the client only\n  modules: ['@nuxt\u002Fui', '@skaile\u002Fforge-editor\u002Fnuxt'],\n  css: ['~\u002Fassets\u002Fmain.css'],\n})\n","ts","",[422,478,479,488,510,530,565,586],{"__ignoreMap":476},[480,481,484],"span",{"class":482,"line":483},"line",1,[480,485,487],{"class":486},"sHwdD","\u002F\u002F nuxt.config.ts\n",[480,489,491,495,498,502,506],{"class":482,"line":490},2,[480,492,494],{"class":493},"s7zQu","export",[480,496,497],{"class":493}," default",[480,499,501],{"class":500},"s2Zo4"," defineNuxtConfig",[480,503,505],{"class":504},"sTEyZ","(",[480,507,509],{"class":508},"sMK4o","{\n",[480,511,513,517,520,524,527],{"class":482,"line":512},3,[480,514,516],{"class":515},"swJcz","  ssr",[480,518,519],{"class":508},":",[480,521,523],{"class":522},"sfNiH"," false",[480,525,526],{"class":508},",",[480,528,529],{"class":486}," \u002F\u002F TipTap renders on the client only\n",[480,531,533,536,538,541,544,547,549,551,554,557,559,562],{"class":482,"line":532},4,[480,534,535],{"class":515},"  modules",[480,537,519],{"class":508},[480,539,540],{"class":504}," [",[480,542,543],{"class":508},"'",[480,545,428],{"class":546},"sfazB",[480,548,543],{"class":508},[480,550,526],{"class":508},[480,552,553],{"class":508}," '",[480,555,556],{"class":546},"@skaile\u002Fforge-editor\u002Fnuxt",[480,558,543],{"class":508},[480,560,561],{"class":504},"]",[480,563,564],{"class":508},",\n",[480,566,568,571,573,575,577,580,582,584],{"class":482,"line":567},5,[480,569,570],{"class":515},"  css",[480,572,519],{"class":508},[480,574,540],{"class":504},[480,576,543],{"class":508},[480,578,579],{"class":546},"~\u002Fassets\u002Fmain.css",[480,581,543],{"class":508},[480,583,561],{"class":504},[480,585,564],{"class":508},[480,587,589,592],{"class":482,"line":588},6,[480,590,591],{"class":508},"}",[480,593,594],{"class":504},")\n",[418,596,597,598,601,602,604,605,608,609,612,613,616,617,620,621,608,624,627,628,631],{},"The module patches Nuxt UI's generated ",[422,599,600],{},"ui.css"," template and throws if that template is missing, so ",[422,603,428],{}," must come first. It adds every feature stylesheet to ",[422,606,607],{},"css"," (",[422,610,611],{},"themes.css"," last), puts the package into ",[422,614,615],{},"build.transpile"," and Nitro's ",[422,618,619],{},"externals.inline",", enables Nitro websockets, installs the client plugin ",[422,622,623],{},"editor-context-nuxt-ui.client.ts",[422,625,626],{},"createEditor({ kit: nuxtUiKit(), backend: createHttpBackend({ fetch: $fetch, probe: true }) })","; the module has no ",[422,629,630],{},"kit"," option, the Vue binding is Nuxt UI) and scans the Nitro routes. It registers no component or composable.",[418,633,634,635,519],{},"Module options live under the config key ",[422,636,637],{},"tiptapEditor",[471,639,641],{"className":473,"code":640,"language":475,"meta":476,"style":476},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  ssr: false, \u002F\u002F TipTap renders on the client only\n  modules: ['@nuxt\u002Fui', '@skaile\u002Fforge-editor\u002Fnuxt'],\n  tiptapEditor: { ai: { \u002F* optional; presets (Model presets), roles (the default Model preset per Model role), rateLimit, transcription: see AI configuration *\u002F }, collab: { authenticateUpgrade: false \u002F* true: refuse an unauthenticated \u002Fcollab upgrade with HTTP 401 (cookie hosts only) *\u002F } },\n})\n",[422,642,643,647,659,671,697,743],{"__ignoreMap":476},[480,644,645],{"class":482,"line":483},[480,646,487],{"class":486},[480,648,649,651,653,655,657],{"class":482,"line":490},[480,650,494],{"class":493},[480,652,497],{"class":493},[480,654,501],{"class":500},[480,656,505],{"class":504},[480,658,509],{"class":508},[480,660,661,663,665,667,669],{"class":482,"line":512},[480,662,516],{"class":515},[480,664,519],{"class":508},[480,666,523],{"class":522},[480,668,526],{"class":508},[480,670,529],{"class":486},[480,672,673,675,677,679,681,683,685,687,689,691,693,695],{"class":482,"line":532},[480,674,535],{"class":515},[480,676,519],{"class":508},[480,678,540],{"class":504},[480,680,543],{"class":508},[480,682,428],{"class":546},[480,684,543],{"class":508},[480,686,526],{"class":508},[480,688,553],{"class":508},[480,690,556],{"class":546},[480,692,543],{"class":508},[480,694,561],{"class":504},[480,696,564],{"class":508},[480,698,699,702,704,707,710,712,714,717,720,723,725,727,730,732,734,737,740],{"class":482,"line":567},[480,700,701],{"class":515},"  tiptapEditor",[480,703,519],{"class":508},[480,705,706],{"class":508}," {",[480,708,709],{"class":515}," ai",[480,711,519],{"class":508},[480,713,706],{"class":508},[480,715,716],{"class":486}," \u002F* optional; presets (Model presets), roles (the default Model preset per Model role), rateLimit, transcription: see AI configuration *\u002F",[480,718,719],{"class":508}," },",[480,721,722],{"class":515}," collab",[480,724,519],{"class":508},[480,726,706],{"class":508},[480,728,729],{"class":515}," authenticateUpgrade",[480,731,519],{"class":508},[480,733,523],{"class":522},[480,735,736],{"class":486}," \u002F* true: refuse an unauthenticated \u002Fcollab upgrade with HTTP 401 (cookie hosts only) *\u002F",[480,738,739],{"class":508}," }",[480,741,742],{"class":508}," },\n",[480,744,745,747],{"class":482,"line":588},[480,746,591],{"class":508},[480,748,594],{"class":504},[418,750,751,752,755,756,759],{},"The ",[422,753,754],{},"ai"," options are described in ",[452,757,758],{"href":293},"AI configuration",".",[464,761,763],{"id":762},"add-the-stylesheet","Add the stylesheet",[471,765,768],{"className":766,"code":767,"language":607,"meta":476,"style":476},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F* app\u002Fassets\u002Fmain.css *\u002F\n@import \"tailwindcss\";\n@import \"@nuxt\u002Fui\";\n",[422,769,770,775,791],{"__ignoreMap":476},[480,771,772],{"class":482,"line":483},[480,773,774],{"class":486},"\u002F* app\u002Fassets\u002Fmain.css *\u002F\n",[480,776,777,780,783,785,788],{"class":482,"line":490},[480,778,779],{"class":493},"@import",[480,781,782],{"class":508}," \"",[480,784,446],{"class":546},[480,786,787],{"class":508},"\"",[480,789,790],{"class":508},";\n",[480,792,793,795,797,799,801],{"class":482,"line":512},[480,794,779],{"class":493},[480,796,782],{"class":508},[480,798,428],{"class":546},[480,800,787],{"class":508},[480,802,790],{"class":508},[464,804,806],{"id":805},"mount-the-simple-editor","Mount the simple editor",[418,808,809,810,608,813,816,817,820],{},"Wrap the app in ",[422,811,812],{},"\u003CUApp>",[422,814,815],{},"app\u002Fapp.vue",": ",[422,818,819],{},"\u003CUApp>\u003CNuxtPage \u002F>\u003C\u002FUApp>",") and mount an editor on a page (the simple editor needs no backend):",[471,822,825],{"className":823,"code":824,"language":424,"meta":476,"style":476},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { SimpleEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fsimple'\nimport { ref } from 'vue'\nconst content = ref()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CSimpleEditor v-model=\"content\" \u002F>\n\u003C\u002Ftemplate>\n",[422,826,827,854,877,896,911,920,926,936,960],{"__ignoreMap":476},[480,828,829,832,835,839,842,845,847,849,851],{"class":482,"line":483},[480,830,831],{"class":508},"\u003C",[480,833,834],{"class":515},"script",[480,836,838],{"class":837},"spNyl"," setup",[480,840,841],{"class":837}," lang",[480,843,844],{"class":508},"=",[480,846,787],{"class":508},[480,848,475],{"class":546},[480,850,787],{"class":508},[480,852,853],{"class":508},">\n",[480,855,856,859,861,864,866,869,871,874],{"class":482,"line":490},[480,857,858],{"class":493},"import",[480,860,706],{"class":508},[480,862,863],{"class":504}," SimpleEditor",[480,865,739],{"class":508},[480,867,868],{"class":493}," from",[480,870,553],{"class":508},[480,872,873],{"class":546},"@skaile\u002Fforge-editor\u002Fvue\u002Fsimple",[480,875,876],{"class":508},"'\n",[480,878,879,881,883,886,888,890,892,894],{"class":482,"line":512},[480,880,858],{"class":493},[480,882,706],{"class":508},[480,884,885],{"class":504}," ref",[480,887,739],{"class":508},[480,889,868],{"class":493},[480,891,553],{"class":508},[480,893,424],{"class":546},[480,895,876],{"class":508},[480,897,898,901,904,906,908],{"class":482,"line":532},[480,899,900],{"class":837},"const",[480,902,903],{"class":504}," content ",[480,905,844],{"class":508},[480,907,885],{"class":500},[480,909,910],{"class":504},"()\n",[480,912,913,916,918],{"class":482,"line":567},[480,914,915],{"class":508},"\u003C\u002F",[480,917,834],{"class":515},[480,919,853],{"class":508},[480,921,922],{"class":482,"line":588},[480,923,925],{"emptyLinePlaceholder":924},true,"\n",[480,927,929,931,934],{"class":482,"line":928},7,[480,930,831],{"class":508},[480,932,933],{"class":515},"template",[480,935,853],{"class":508},[480,937,939,942,945,948,950,952,955,957],{"class":482,"line":938},8,[480,940,941],{"class":508},"  \u003C",[480,943,944],{"class":515},"SimpleEditor",[480,946,947],{"class":837}," v-model",[480,949,844],{"class":508},[480,951,787],{"class":508},[480,953,954],{"class":504},"content",[480,956,787],{"class":508},[480,958,959],{"class":508}," \u002F>\n",[480,961,963,965,967],{"class":482,"line":962},9,[480,964,915],{"class":508},[480,966,933],{"class":515},[480,968,853],{"class":508},[464,970,972,973],{"id":971},"register-editorports","Register ",[422,974,975],{},"EditorPorts",[418,977,978,979,981,982,425,985,425,988,425,991,425,994,425,997,425,1000,425,1003,1006,1007,1010,1011,1014,1015,1018],{},"The module's API routes call the host's ",[422,980,975],{}," (identity first, then one port per capability: ",[422,983,984],{},"documents",[422,986,987],{},"collabState",[422,989,990],{},"directory",[422,992,993],{},"assets",[422,995,996],{},"settings",[422,998,999],{},"themes",[422,1001,1002],{},"models",[422,1004,1005],{},"comments","). Hand them to the module with ",[422,1008,1009],{},"provideEditorServer({ ports })"," in a Nitro plugin; the module installs the editor server at the first request, and without provided ports the client logs „Einstellungen konnten nicht geladen werden“ and every route answers 500. A route whose port you leave out answers 501. These minimal ports keep everything in memory and let any visitor in (replace ",[422,1012,1013],{},"authenticate"," and the storage with yours; ",[452,1016,1017],{"href":196},"Server ports"," lists every member, the routes that call it and the required results):",[471,1020,1023],{"className":473,"code":1021,"filename":1022,"language":475,"meta":476,"style":476},"\u002F\u002F server\u002Fplugins\u002Feditor-adapter.ts\nimport type { JSONContent } from '@tiptap\u002Fcore'\nimport { type AssetStore } from '@skaile\u002Fforge-editor\u002Fserver'\nimport { provideEditorServer } from '@skaile\u002Fforge-editor\u002Fserver\u002Fnitro'\n\nexport default defineNitroPlugin(() => {\n  const contents = new Map\u003Cstring, JSONContent>()\n  const states = new Map\u003Cstring, Uint8Array>()\n  const assets = new Map\u003Cstring, Parameters\u003CAssetStore['storeAsset']>[1]>()\n  provideEditorServer({\n    ports: {\n      \u002F\u002F `null` = 401 on API routes; on \u002Fcollab the socket is closed with 4401 (HTTP 401 at the upgrade with `collab.authenticateUpgrade`)\n      identity: { authenticate: async () => ({ id: 'demo', username: 'demo' }) },\n      documents: {\n        loadContent: async id => contents.get(id) ?? null,\n        storeContent: async (id, content) => { contents.set(id, content) },\n        listContents: async () => [...contents].map(([id, content]) => ({ id, content })),\n      },\n      collabState: {\n        loadState: async id => states.get(id) ?? null,\n        storeState: async (id, state) => { states.set(id, state) },\n        removeState: async (id) => { states.delete(id) },\n      },\n      directory: { listUsers: async () => [] },\n      assets: {\n        storeAsset: async (id, asset) => { assets.set(`${id}\u002F${asset.name}`, asset) },\n        loadAsset: async (id, name) => {\n          const asset = assets.get(`${id}\u002F${name}`)\n          if (!asset) return null\n          const { data, ...record } = asset\n          return { record, data }\n        },\n      },\n      \u002F\u002F Omit `settings`: settings stay in the browser (GET answers 204).\n      \u002F\u002F Omit `themes`: the themes routes answer 501 and the standard look stays.\n    },\n  })\n})\n","docs\u002Fsnippets\u002Fminimal-ports.ts",[422,1024,1025,1030,1052,1074,1094,1098,1118,1150,1176,1229,1239,1249,1255,1316,1326,1361,1406,1468,1474,1484,1514,1557,1592,1597,1623,1633,1698,1723,1757,1778,1803,1821,1827,1832,1838,1844,1850,1858],{"__ignoreMap":476},[480,1026,1027],{"class":482,"line":483},[480,1028,1029],{"class":486},"\u002F\u002F server\u002Fplugins\u002Feditor-adapter.ts\n",[480,1031,1032,1034,1037,1039,1042,1044,1046,1048,1050],{"class":482,"line":490},[480,1033,858],{"class":493},[480,1035,1036],{"class":493}," type",[480,1038,706],{"class":508},[480,1040,1041],{"class":504}," JSONContent",[480,1043,739],{"class":508},[480,1045,868],{"class":493},[480,1047,553],{"class":508},[480,1049,431],{"class":546},[480,1051,876],{"class":508},[480,1053,1054,1056,1058,1060,1063,1065,1067,1069,1072],{"class":482,"line":512},[480,1055,858],{"class":493},[480,1057,706],{"class":508},[480,1059,1036],{"class":493},[480,1061,1062],{"class":504}," AssetStore",[480,1064,739],{"class":508},[480,1066,868],{"class":493},[480,1068,553],{"class":508},[480,1070,1071],{"class":546},"@skaile\u002Fforge-editor\u002Fserver",[480,1073,876],{"class":508},[480,1075,1076,1078,1080,1083,1085,1087,1089,1092],{"class":482,"line":532},[480,1077,858],{"class":493},[480,1079,706],{"class":508},[480,1081,1082],{"class":504}," provideEditorServer",[480,1084,739],{"class":508},[480,1086,868],{"class":493},[480,1088,553],{"class":508},[480,1090,1091],{"class":546},"@skaile\u002Fforge-editor\u002Fserver\u002Fnitro",[480,1093,876],{"class":508},[480,1095,1096],{"class":482,"line":567},[480,1097,925],{"emptyLinePlaceholder":924},[480,1099,1100,1102,1104,1107,1109,1112,1115],{"class":482,"line":588},[480,1101,494],{"class":493},[480,1103,497],{"class":493},[480,1105,1106],{"class":500}," defineNitroPlugin",[480,1108,505],{"class":504},[480,1110,1111],{"class":508},"()",[480,1113,1114],{"class":837}," =>",[480,1116,1117],{"class":508}," {\n",[480,1119,1120,1123,1126,1129,1132,1135,1137,1141,1143,1145,1148],{"class":482,"line":928},[480,1121,1122],{"class":837},"  const",[480,1124,1125],{"class":504}," contents",[480,1127,1128],{"class":508}," =",[480,1130,1131],{"class":508}," new",[480,1133,1134],{"class":500}," Map",[480,1136,831],{"class":508},[480,1138,1140],{"class":1139},"sBMFI","string",[480,1142,526],{"class":508},[480,1144,1041],{"class":1139},[480,1146,1147],{"class":508},">",[480,1149,910],{"class":515},[480,1151,1152,1154,1157,1159,1161,1163,1165,1167,1169,1172,1174],{"class":482,"line":938},[480,1153,1122],{"class":837},[480,1155,1156],{"class":504}," states",[480,1158,1128],{"class":508},[480,1160,1131],{"class":508},[480,1162,1134],{"class":500},[480,1164,831],{"class":508},[480,1166,1140],{"class":1139},[480,1168,526],{"class":508},[480,1170,1171],{"class":1139}," Uint8Array",[480,1173,1147],{"class":508},[480,1175,910],{"class":515},[480,1177,1178,1180,1183,1185,1187,1189,1191,1193,1195,1198,1200,1203,1206,1208,1211,1213,1215,1217,1219,1223,1225,1227],{"class":482,"line":962},[480,1179,1122],{"class":837},[480,1181,1182],{"class":504}," assets",[480,1184,1128],{"class":508},[480,1186,1131],{"class":508},[480,1188,1134],{"class":500},[480,1190,831],{"class":508},[480,1192,1140],{"class":1139},[480,1194,526],{"class":508},[480,1196,1197],{"class":1139}," Parameters",[480,1199,831],{"class":508},[480,1201,1202],{"class":1139},"AssetStore",[480,1204,1205],{"class":515},"[",[480,1207,543],{"class":508},[480,1209,1210],{"class":546},"storeAsset",[480,1212,543],{"class":508},[480,1214,561],{"class":515},[480,1216,1147],{"class":508},[480,1218,1205],{"class":515},[480,1220,1222],{"class":1221},"sbssI","1",[480,1224,561],{"class":515},[480,1226,1147],{"class":508},[480,1228,910],{"class":515},[480,1230,1232,1235,1237],{"class":482,"line":1231},10,[480,1233,1234],{"class":500},"  provideEditorServer",[480,1236,505],{"class":515},[480,1238,509],{"class":508},[480,1240,1242,1245,1247],{"class":482,"line":1241},11,[480,1243,1244],{"class":515},"    ports",[480,1246,519],{"class":508},[480,1248,1117],{"class":508},[480,1250,1252],{"class":482,"line":1251},12,[480,1253,1254],{"class":486},"      \u002F\u002F `null` = 401 on API routes; on \u002Fcollab the socket is closed with 4401 (HTTP 401 at the upgrade with `collab.authenticateUpgrade`)\n",[480,1256,1258,1261,1263,1265,1268,1270,1273,1276,1278,1280,1283,1286,1288,1290,1293,1295,1297,1300,1302,1304,1306,1308,1310,1313],{"class":482,"line":1257},13,[480,1259,1260],{"class":515},"      identity",[480,1262,519],{"class":508},[480,1264,706],{"class":508},[480,1266,1267],{"class":500}," authenticate",[480,1269,519],{"class":508},[480,1271,1272],{"class":837}," async",[480,1274,1275],{"class":508}," ()",[480,1277,1114],{"class":837},[480,1279,608],{"class":515},[480,1281,1282],{"class":508},"{",[480,1284,1285],{"class":515}," id",[480,1287,519],{"class":508},[480,1289,553],{"class":508},[480,1291,1292],{"class":546},"demo",[480,1294,543],{"class":508},[480,1296,526],{"class":508},[480,1298,1299],{"class":515}," username",[480,1301,519],{"class":508},[480,1303,553],{"class":508},[480,1305,1292],{"class":546},[480,1307,543],{"class":508},[480,1309,739],{"class":508},[480,1311,1312],{"class":515},") ",[480,1314,1315],{"class":508},"},\n",[480,1317,1319,1322,1324],{"class":482,"line":1318},14,[480,1320,1321],{"class":515},"      documents",[480,1323,519],{"class":508},[480,1325,1117],{"class":508},[480,1327,1329,1332,1334,1336,1339,1341,1343,1345,1348,1350,1353,1355,1358],{"class":482,"line":1328},15,[480,1330,1331],{"class":500},"        loadContent",[480,1333,519],{"class":508},[480,1335,1272],{"class":837},[480,1337,1285],{"class":1338},"sHdIc",[480,1340,1114],{"class":837},[480,1342,1125],{"class":504},[480,1344,759],{"class":508},[480,1346,1347],{"class":500},"get",[480,1349,505],{"class":515},[480,1351,1352],{"class":504},"id",[480,1354,1312],{"class":515},[480,1356,1357],{"class":508},"??",[480,1359,1360],{"class":508}," null,\n",[480,1362,1364,1367,1369,1371,1373,1375,1377,1380,1383,1385,1387,1389,1391,1394,1396,1398,1400,1402,1404],{"class":482,"line":1363},16,[480,1365,1366],{"class":500},"        storeContent",[480,1368,519],{"class":508},[480,1370,1272],{"class":837},[480,1372,608],{"class":508},[480,1374,1352],{"class":1338},[480,1376,526],{"class":508},[480,1378,1379],{"class":1338}," content",[480,1381,1382],{"class":508},")",[480,1384,1114],{"class":837},[480,1386,706],{"class":508},[480,1388,1125],{"class":504},[480,1390,759],{"class":508},[480,1392,1393],{"class":500},"set",[480,1395,505],{"class":515},[480,1397,1352],{"class":504},[480,1399,526],{"class":508},[480,1401,1379],{"class":504},[480,1403,1312],{"class":515},[480,1405,1315],{"class":508},[480,1407,1409,1412,1414,1416,1418,1420,1422,1425,1428,1430,1432,1435,1437,1440,1442,1444,1446,1449,1451,1453,1455,1457,1459,1461,1463,1466],{"class":482,"line":1408},17,[480,1410,1411],{"class":500},"        listContents",[480,1413,519],{"class":508},[480,1415,1272],{"class":837},[480,1417,1275],{"class":508},[480,1419,1114],{"class":837},[480,1421,540],{"class":515},[480,1423,1424],{"class":508},"...",[480,1426,1427],{"class":504},"contents",[480,1429,561],{"class":515},[480,1431,759],{"class":508},[480,1433,1434],{"class":500},"map",[480,1436,505],{"class":515},[480,1438,1439],{"class":508},"([",[480,1441,1352],{"class":1338},[480,1443,526],{"class":508},[480,1445,1379],{"class":1338},[480,1447,1448],{"class":508},"])",[480,1450,1114],{"class":837},[480,1452,608],{"class":515},[480,1454,1282],{"class":508},[480,1456,1285],{"class":504},[480,1458,526],{"class":508},[480,1460,1379],{"class":504},[480,1462,739],{"class":508},[480,1464,1465],{"class":515},"))",[480,1467,564],{"class":508},[480,1469,1471],{"class":482,"line":1470},18,[480,1472,1473],{"class":508},"      },\n",[480,1475,1477,1480,1482],{"class":482,"line":1476},19,[480,1478,1479],{"class":515},"      collabState",[480,1481,519],{"class":508},[480,1483,1117],{"class":508},[480,1485,1487,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512],{"class":482,"line":1486},20,[480,1488,1489],{"class":500},"        loadState",[480,1491,519],{"class":508},[480,1493,1272],{"class":837},[480,1495,1285],{"class":1338},[480,1497,1114],{"class":837},[480,1499,1156],{"class":504},[480,1501,759],{"class":508},[480,1503,1347],{"class":500},[480,1505,505],{"class":515},[480,1507,1352],{"class":504},[480,1509,1312],{"class":515},[480,1511,1357],{"class":508},[480,1513,1360],{"class":508},[480,1515,1517,1520,1522,1524,1526,1528,1530,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555],{"class":482,"line":1516},21,[480,1518,1519],{"class":500},"        storeState",[480,1521,519],{"class":508},[480,1523,1272],{"class":837},[480,1525,608],{"class":508},[480,1527,1352],{"class":1338},[480,1529,526],{"class":508},[480,1531,1532],{"class":1338}," state",[480,1534,1382],{"class":508},[480,1536,1114],{"class":837},[480,1538,706],{"class":508},[480,1540,1156],{"class":504},[480,1542,759],{"class":508},[480,1544,1393],{"class":500},[480,1546,505],{"class":515},[480,1548,1352],{"class":504},[480,1550,526],{"class":508},[480,1552,1532],{"class":504},[480,1554,1312],{"class":515},[480,1556,1315],{"class":508},[480,1558,1560,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1584,1586,1588,1590],{"class":482,"line":1559},22,[480,1561,1562],{"class":500},"        removeState",[480,1564,519],{"class":508},[480,1566,1272],{"class":837},[480,1568,608],{"class":508},[480,1570,1352],{"class":1338},[480,1572,1382],{"class":508},[480,1574,1114],{"class":837},[480,1576,706],{"class":508},[480,1578,1156],{"class":504},[480,1580,759],{"class":508},[480,1582,1583],{"class":500},"delete",[480,1585,505],{"class":515},[480,1587,1352],{"class":504},[480,1589,1312],{"class":515},[480,1591,1315],{"class":508},[480,1593,1595],{"class":482,"line":1594},23,[480,1596,1473],{"class":508},[480,1598,1600,1603,1605,1607,1610,1612,1614,1616,1618,1621],{"class":482,"line":1599},24,[480,1601,1602],{"class":515},"      directory",[480,1604,519],{"class":508},[480,1606,706],{"class":508},[480,1608,1609],{"class":500}," listUsers",[480,1611,519],{"class":508},[480,1613,1272],{"class":837},[480,1615,1275],{"class":508},[480,1617,1114],{"class":837},[480,1619,1620],{"class":515}," [] ",[480,1622,1315],{"class":508},[480,1624,1626,1629,1631],{"class":482,"line":1625},25,[480,1627,1628],{"class":515},"      assets",[480,1630,519],{"class":508},[480,1632,1117],{"class":508},[480,1634,1636,1639,1641,1643,1645,1647,1649,1652,1654,1656,1658,1660,1662,1664,1666,1669,1671,1673,1676,1679,1682,1684,1687,1690,1692,1694,1696],{"class":482,"line":1635},26,[480,1637,1638],{"class":500},"        storeAsset",[480,1640,519],{"class":508},[480,1642,1272],{"class":837},[480,1644,608],{"class":508},[480,1646,1352],{"class":1338},[480,1648,526],{"class":508},[480,1650,1651],{"class":1338}," asset",[480,1653,1382],{"class":508},[480,1655,1114],{"class":837},[480,1657,706],{"class":508},[480,1659,1182],{"class":504},[480,1661,759],{"class":508},[480,1663,1393],{"class":500},[480,1665,505],{"class":515},[480,1667,1668],{"class":508},"`${",[480,1670,1352],{"class":504},[480,1672,591],{"class":508},[480,1674,1675],{"class":546},"\u002F",[480,1677,1678],{"class":508},"${",[480,1680,1681],{"class":504},"asset",[480,1683,759],{"class":508},[480,1685,1686],{"class":504},"name",[480,1688,1689],{"class":508},"}`",[480,1691,526],{"class":508},[480,1693,1651],{"class":504},[480,1695,1312],{"class":515},[480,1697,1315],{"class":508},[480,1699,1701,1704,1706,1708,1710,1712,1714,1717,1719,1721],{"class":482,"line":1700},27,[480,1702,1703],{"class":500},"        loadAsset",[480,1705,519],{"class":508},[480,1707,1272],{"class":837},[480,1709,608],{"class":508},[480,1711,1352],{"class":1338},[480,1713,526],{"class":508},[480,1715,1716],{"class":1338}," name",[480,1718,1382],{"class":508},[480,1720,1114],{"class":837},[480,1722,1117],{"class":508},[480,1724,1726,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755],{"class":482,"line":1725},28,[480,1727,1728],{"class":837},"          const",[480,1730,1651],{"class":504},[480,1732,1128],{"class":508},[480,1734,1182],{"class":504},[480,1736,759],{"class":508},[480,1738,1347],{"class":500},[480,1740,505],{"class":515},[480,1742,1668],{"class":508},[480,1744,1352],{"class":504},[480,1746,591],{"class":508},[480,1748,1675],{"class":546},[480,1750,1678],{"class":508},[480,1752,1686],{"class":504},[480,1754,1689],{"class":508},[480,1756,594],{"class":515},[480,1758,1760,1763,1765,1768,1770,1772,1775],{"class":482,"line":1759},29,[480,1761,1762],{"class":493},"          if",[480,1764,608],{"class":515},[480,1766,1767],{"class":508},"!",[480,1769,1681],{"class":504},[480,1771,1312],{"class":515},[480,1773,1774],{"class":493},"return",[480,1776,1777],{"class":508}," null\n",[480,1779,1781,1783,1785,1788,1790,1793,1796,1798,1800],{"class":482,"line":1780},30,[480,1782,1728],{"class":837},[480,1784,706],{"class":508},[480,1786,1787],{"class":504}," data",[480,1789,526],{"class":508},[480,1791,1792],{"class":508}," ...",[480,1794,1795],{"class":504},"record",[480,1797,739],{"class":508},[480,1799,1128],{"class":508},[480,1801,1802],{"class":504}," asset\n",[480,1804,1806,1809,1811,1814,1816,1818],{"class":482,"line":1805},31,[480,1807,1808],{"class":493},"          return",[480,1810,706],{"class":508},[480,1812,1813],{"class":504}," record",[480,1815,526],{"class":508},[480,1817,1787],{"class":504},[480,1819,1820],{"class":508}," }\n",[480,1822,1824],{"class":482,"line":1823},32,[480,1825,1826],{"class":508},"        },\n",[480,1828,1830],{"class":482,"line":1829},33,[480,1831,1473],{"class":508},[480,1833,1835],{"class":482,"line":1834},34,[480,1836,1837],{"class":486},"      \u002F\u002F Omit `settings`: settings stay in the browser (GET answers 204).\n",[480,1839,1841],{"class":482,"line":1840},35,[480,1842,1843],{"class":486},"      \u002F\u002F Omit `themes`: the themes routes answer 501 and the standard look stays.\n",[480,1845,1847],{"class":482,"line":1846},36,[480,1848,1849],{"class":508},"    },\n",[480,1851,1853,1856],{"class":482,"line":1852},37,[480,1854,1855],{"class":508},"  }",[480,1857,594],{"class":515},[480,1859,1861,1863],{"class":482,"line":1860},38,[480,1862,591],{"class":508},[480,1864,594],{"class":504},[464,1866,1868],{"id":1867},"mount-the-advanced-editor","Mount the advanced editor",[418,1870,1871,1874,1875,1877,1878,519],{},[422,1872,1873],{},"app.vue"," must wrap pages in ",[422,1876,812],{}," (overlays, toasts, tooltips). The toolbar is a sibling that receives the editor from ",[422,1879,1880],{},"ready",[471,1882,1884],{"className":823,"code":1883,"language":424,"meta":476,"style":476},"\u003Cscript setup lang=\"ts\">\nimport type { Editor, JSONContent } from '@tiptap\u002Fvue-3'\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { EditorToolbar } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { ref, shallowRef } from 'vue'\n\nconst content = ref\u003CJSONContent>()\nconst editor = shallowRef\u003CEditor>()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CEditorToolbar :editor=\"editor\" \u002F>\n  \u003CAdvancedEditor v-model=\"content\" @ready=\"editor = $event\" \u002F>\n\u003C\u002Ftemplate>\n",[422,1885,1886,1906,1931,1951,1971,1994,1998,2017,2037,2045,2049,2057,2080,2118],{"__ignoreMap":476},[480,1887,1888,1890,1892,1894,1896,1898,1900,1902,1904],{"class":482,"line":483},[480,1889,831],{"class":508},[480,1891,834],{"class":515},[480,1893,838],{"class":837},[480,1895,841],{"class":837},[480,1897,844],{"class":508},[480,1899,787],{"class":508},[480,1901,475],{"class":546},[480,1903,787],{"class":508},[480,1905,853],{"class":508},[480,1907,1908,1910,1912,1914,1917,1919,1921,1923,1925,1927,1929],{"class":482,"line":490},[480,1909,858],{"class":493},[480,1911,1036],{"class":493},[480,1913,706],{"class":508},[480,1915,1916],{"class":504}," Editor",[480,1918,526],{"class":508},[480,1920,1041],{"class":504},[480,1922,739],{"class":508},[480,1924,868],{"class":493},[480,1926,553],{"class":508},[480,1928,437],{"class":546},[480,1930,876],{"class":508},[480,1932,1933,1935,1937,1940,1942,1944,1946,1949],{"class":482,"line":512},[480,1934,858],{"class":493},[480,1936,706],{"class":508},[480,1938,1939],{"class":504}," AdvancedEditor",[480,1941,739],{"class":508},[480,1943,868],{"class":493},[480,1945,553],{"class":508},[480,1947,1948],{"class":546},"@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced",[480,1950,876],{"class":508},[480,1952,1953,1955,1957,1960,1962,1964,1966,1969],{"class":482,"line":532},[480,1954,858],{"class":493},[480,1956,706],{"class":508},[480,1958,1959],{"class":504}," EditorToolbar",[480,1961,739],{"class":508},[480,1963,868],{"class":493},[480,1965,553],{"class":508},[480,1967,1968],{"class":546},"@skaile\u002Fforge-editor\u002Fvue",[480,1970,876],{"class":508},[480,1972,1973,1975,1977,1979,1981,1984,1986,1988,1990,1992],{"class":482,"line":567},[480,1974,858],{"class":493},[480,1976,706],{"class":508},[480,1978,885],{"class":504},[480,1980,526],{"class":508},[480,1982,1983],{"class":504}," shallowRef",[480,1985,739],{"class":508},[480,1987,868],{"class":493},[480,1989,553],{"class":508},[480,1991,424],{"class":546},[480,1993,876],{"class":508},[480,1995,1996],{"class":482,"line":588},[480,1997,925],{"emptyLinePlaceholder":924},[480,1999,2000,2002,2004,2006,2008,2010,2013,2015],{"class":482,"line":928},[480,2001,900],{"class":837},[480,2003,903],{"class":504},[480,2005,844],{"class":508},[480,2007,885],{"class":500},[480,2009,831],{"class":508},[480,2011,2012],{"class":1139},"JSONContent",[480,2014,1147],{"class":508},[480,2016,910],{"class":504},[480,2018,2019,2021,2024,2026,2028,2030,2033,2035],{"class":482,"line":938},[480,2020,900],{"class":837},[480,2022,2023],{"class":504}," editor ",[480,2025,844],{"class":508},[480,2027,1983],{"class":500},[480,2029,831],{"class":508},[480,2031,2032],{"class":1139},"Editor",[480,2034,1147],{"class":508},[480,2036,910],{"class":504},[480,2038,2039,2041,2043],{"class":482,"line":962},[480,2040,915],{"class":508},[480,2042,834],{"class":515},[480,2044,853],{"class":508},[480,2046,2047],{"class":482,"line":1231},[480,2048,925],{"emptyLinePlaceholder":924},[480,2050,2051,2053,2055],{"class":482,"line":1241},[480,2052,831],{"class":508},[480,2054,933],{"class":515},[480,2056,853],{"class":508},[480,2058,2059,2061,2064,2067,2070,2072,2074,2076,2078],{"class":482,"line":1251},[480,2060,941],{"class":508},[480,2062,2063],{"class":515},"EditorToolbar",[480,2065,2066],{"class":508}," :",[480,2068,2069],{"class":837},"editor",[480,2071,844],{"class":508},[480,2073,787],{"class":508},[480,2075,2069],{"class":504},[480,2077,787],{"class":508},[480,2079,959],{"class":508},[480,2081,2082,2084,2087,2089,2091,2093,2095,2097,2100,2102,2104,2106,2108,2111,2114,2116],{"class":482,"line":1257},[480,2083,941],{"class":508},[480,2085,2086],{"class":515},"AdvancedEditor",[480,2088,947],{"class":837},[480,2090,844],{"class":508},[480,2092,787],{"class":508},[480,2094,954],{"class":504},[480,2096,787],{"class":508},[480,2098,2099],{"class":508}," @",[480,2101,1880],{"class":837},[480,2103,844],{"class":508},[480,2105,787],{"class":508},[480,2107,2069],{"class":504},[480,2109,2110],{"class":508}," = ",[480,2112,2113],{"class":504},"$event",[480,2115,787],{"class":508},[480,2117,959],{"class":508},[480,2119,2120,2122,2124],{"class":482,"line":1318},[480,2121,915],{"class":508},[480,2123,933],{"class":515},[480,2125,853],{"class":508},[418,2127,2128,2129,2132,2133,2136,2137,2140,2141,608,2144,2147],{},"Without a ",[422,2130,2131],{},"collaboration"," prop the editor is standalone (JSON ",[422,2134,2135],{},"v-model",", own undo history). Collaboration is a mode fixed at mount: pass ",[422,2138,2139],{},":collaboration=\"{ ydoc, provider, user }\""," and connect the provider to ",[422,2142,2143],{},"\u002Fcollab\u002F:id",[452,2145,2146],{"href":309},"Collaboration",").",[418,2149,2150,2152,2153,2155,2156,2159,2160,759],{},[422,2151,2086],{}," pulls in every feature. For a smaller bundle use ",[422,2154,944],{}," or compose your own list (",[452,2157,2158],{"href":91},"Feature composition","). For the simple editor in plain Vue (no Nuxt, no backend) follow the ",[452,2161,2162],{"href":26},"plain Vue quick start",[464,2164,2166],{"id":2165},"next-steps","Next steps",[418,2168,2169,2170,425,2172,425,2175,2177,2178,2180,2181,2184],{},"The advanced editor, every adapter method, collaboration and AI are covered in the guides: ",[452,2171,1017],{"href":196},[452,2173,2174],{"href":249},"Routes and authentication",[452,2176,2146],{"href":309}," and ",[452,2179,758],{"href":293},". The ",[452,2182,2183],{"href":46},"tutorial"," builds an editor from the simple editor up.",[2186,2187,2188],"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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":476,"searchDepth":490,"depth":490,"links":2190},[2191,2193,2194,2195,2197,2198],{"id":466,"depth":490,"text":2192},"Register the module after @nuxt\u002Fui",{"id":762,"depth":490,"text":763},{"id":805,"depth":490,"text":806},{"id":971,"depth":490,"text":2196},"Register EditorPorts",{"id":1867,"depth":490,"text":1868},{"id":2165,"depth":490,"text":2166},"Register the Nuxt module, provide EditorPorts and mount the simple and the advanced editor in a Nuxt app.","md",null,{},{"icon":6},{"title":21,"description":2199},"OVCv9lPzwRwomWDuNSWmvfjMNLaSaoNqou8Nobf3NAY",[2207,2209],{"title":16,"path":17,"stem":18,"description":2208,"icon":19,"children":-1},"Requirements, peer dependencies and the npm install command for @skaile\u002Fforge-editor.",{"title":25,"path":26,"stem":27,"description":2210,"icon":6,"children":-1},"Set up the simple editor in a Vite and Vue app: peers, Nuxt UI plugin, CSS and a mounted SimpleEditor with toolbar and outline.",1793219823068]