[{"data":1,"prerenderedAt":824},["ShallowReactive",2],{"navigation_docs":3,"-guides-nuxt-module":412,"-guides-nuxt-module-surround":819},[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":140,"body":414,"description":812,"extension":813,"links":814,"meta":815,"navigation":816,"path":141,"seo":817,"stem":142,"__hash__":818},"docs\u002F3.guides\u002F2.nuxt-module.md",{"type":415,"value":416,"toc":808},"minimark",[417,421,426,548,605,620,696,700,710,782,804],[418,419,420],"p",{},"Nuxt apps use the same package entries as every other host; the module only adds the build and server wiring and one client plugin.",[422,423,425],"h2",{"id":424},"register-the-module","Register the module",[427,428,433],"pre",{"className":429,"code":430,"language":431,"meta":432,"style":432},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  \u002F\u002F @nuxt\u002Fui first: the editor module patches its generated `ui.css` template.\n  modules: ['@nuxt\u002Fui', '@skaile\u002Fforge-editor\u002Fnuxt'],\n  tiptapEditor: { ai: { \u002F* see the AI configuration guide *\u002F } },\n})\n","ts","",[434,435,436,445,467,473,512,539],"code",{"__ignoreMap":432},[437,438,441],"span",{"class":439,"line":440},"line",1,[437,442,444],{"class":443},"sHwdD","\u002F\u002F nuxt.config.ts\n",[437,446,448,452,455,459,463],{"class":439,"line":447},2,[437,449,451],{"class":450},"s7zQu","export",[437,453,454],{"class":450}," default",[437,456,458],{"class":457},"s2Zo4"," defineNuxtConfig",[437,460,462],{"class":461},"sTEyZ","(",[437,464,466],{"class":465},"sMK4o","{\n",[437,468,470],{"class":439,"line":469},3,[437,471,472],{"class":443},"  \u002F\u002F @nuxt\u002Fui first: the editor module patches its generated `ui.css` template.\n",[437,474,476,480,483,486,489,493,495,498,501,504,506,509],{"class":439,"line":475},4,[437,477,479],{"class":478},"swJcz","  modules",[437,481,482],{"class":465},":",[437,484,485],{"class":461}," [",[437,487,488],{"class":465},"'",[437,490,492],{"class":491},"sfazB","@nuxt\u002Fui",[437,494,488],{"class":465},[437,496,497],{"class":465},",",[437,499,500],{"class":465}," '",[437,502,503],{"class":491},"@skaile\u002Fforge-editor\u002Fnuxt",[437,505,488],{"class":465},[437,507,508],{"class":461},"]",[437,510,511],{"class":465},",\n",[437,513,515,518,520,523,526,528,530,533,536],{"class":439,"line":514},5,[437,516,517],{"class":478},"  tiptapEditor",[437,519,482],{"class":465},[437,521,522],{"class":465}," {",[437,524,525],{"class":478}," ai",[437,527,482],{"class":465},[437,529,522],{"class":465},[437,531,532],{"class":443}," \u002F* see the AI configuration guide *\u002F",[437,534,535],{"class":465}," }",[437,537,538],{"class":465}," },\n",[437,540,542,545],{"class":439,"line":541},6,[437,543,544],{"class":465},"}",[437,546,547],{"class":461},")\n",[418,549,550,551,554,555,558,559,562,563,566,567,570,571,574,575,578,579,582,583,586,587,590,591,594,595,598,599,578,601,604],{},"Add ",[434,552,553],{},"\"@skaile\u002Fforge-editor\""," to the host's dependencies (",[434,556,557],{},"workspace:*"," in this repository, the registry version elsewhere). The package ships built ESM (",[434,560,561],{},"dist","); the module puts it into ",[434,564,565],{},"build.transpile"," for the client and Nitro's ",[434,568,569],{},"externals.inline"," for the server so the runtime files in ",[434,572,573],{},"dist\u002Fnuxt\u002Fruntime"," (they import ",[434,576,577],{},"h3"," and ",[434,580,581],{},"nitropack\u002Fruntime"," for the server and ",[434,584,585],{},"#app"," for the client explicitly) are compiled by the host. Because the package is transpiled, Vite does not pre-bundle it; the module therefore adds the TipTap\u002FProseMirror\u002FYjs entries the editor imports to ",[434,588,589],{},"vite.optimizeDeps.include"," (merged with the host's list), so they share one ProseMirror with the pre-bundled ",[434,592,593],{},"@tiptap\u002F*"," deps instead of failing with ",[434,596,597],{},"RangeError: Adding different instances of a keyed plugin",". ",[434,600,577],{},[434,602,603],{},"nitropack"," are optional peers: a Nuxt app already provides them; only a strictly isolated install (pnpm without hoisting) may need them listed next to the package.",[418,606,607,608,611,612,615,616,619],{},"The module registers exactly one client plugin (",[434,609,610],{},"src\u002Fnuxt\u002Fruntime\u002Fplugins\u002Feditor-context-nuxt-ui.client.ts",", which hands ",[434,613,614],{},"nuxtUiKit()"," to the context; the module has no ",[434,617,618],{},"kit"," option): it installs the editor context with account-synced settings and the public AI configuration. It auto-registers no component or composable: import everything from the package entries.",[418,621,622,623,626,627,630,631,634,635,638,639,638,642,638,645,648,649,652,653,656,657,659,660,663,664,659,667,638,670,578,673,676,677,680,681,683,684,687,688,691,692,695],{},"The Nuxt module's server plugin installs the routes at the first request, after every Nitro plugin has run, so the host's ",[434,624,625],{},"provideEditorServer({ ports })"," call (",[434,628,629],{},"@skaile\u002Fforge-editor\u002Fserver\u002Fnitro",") may sit in any plugin; host routes then reach the installed server with ",[434,632,633],{},"useEditorServer()"," (",[434,636,637],{},"forgetDocument",", ",[434,640,641],{},"liveContent",[434,643,644],{},"enforceRateLimit",[434,646,647],{},"resolveModel","). Without provided ports the first request logs “@skaile\u002Fforge-editor: provideEditorServer() was not called” and the routes stay unmounted until a request succeeds in installing them. A route whose port the host did not register is not mounted at all (the path answers 404): ",[434,650,651],{},"documents"," routes always exist, ",[434,654,655],{},"settings"," needs the ",[434,658,655],{}," port, ",[434,661,662],{},"users"," the ",[434,665,666],{},"directory",[434,668,669],{},"assets",[434,671,672],{},"themes",[434,674,675],{},"comments"," their ports, and ",[434,678,679],{},"tags"," follows from ",[434,682,651],{},". The AI routes (",[434,685,686],{},"\u002Fapi\u002Fai\u002F*",") are mounted by the module always, by a plain Nitro app when it passes ",[434,689,690],{},"ai",". The collaboration websocket is mounted when the ",[434,693,694],{},"collabState"," port is present.",[422,697,699],{"id":698},"without-an-editor-server","Without an editor server",[418,701,702,703,706,707,482],{},"A host that serves no editor routes (a client-only editor, or a host with its own ",[434,704,705],{},"\u002Fapi\u002Feditor\u002F*",") sets ",[434,708,709],{},"server: false",[427,711,713],{"className":429,"code":712,"language":431,"meta":432,"style":432},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['@nuxt\u002Fui', '@skaile\u002Fforge-editor\u002Fnuxt'],\n  tiptapEditor: { server: false },\n})\n",[434,714,715,719,731,757,776],{"__ignoreMap":432},[437,716,717],{"class":439,"line":440},[437,718,444],{"class":443},[437,720,721,723,725,727,729],{"class":439,"line":447},[437,722,451],{"class":450},[437,724,454],{"class":450},[437,726,458],{"class":457},[437,728,462],{"class":461},[437,730,466],{"class":465},[437,732,733,735,737,739,741,743,745,747,749,751,753,755],{"class":439,"line":469},[437,734,479],{"class":478},[437,736,482],{"class":465},[437,738,485],{"class":461},[437,740,488],{"class":465},[437,742,492],{"class":491},[437,744,488],{"class":465},[437,746,497],{"class":465},[437,748,500],{"class":465},[437,750,503],{"class":491},[437,752,488],{"class":465},[437,754,508],{"class":461},[437,756,511],{"class":465},[437,758,759,761,763,765,768,770,774],{"class":439,"line":475},[437,760,517],{"class":478},[437,762,482],{"class":465},[437,764,522],{"class":465},[437,766,767],{"class":478}," server",[437,769,482],{"class":465},[437,771,773],{"class":772},"sfNiH"," false",[437,775,538],{"class":465},[437,777,778,780],{"class":439,"line":514},[437,779,544],{"class":465},[437,781,547],{"class":461},[418,783,784,785,787,788,791,792,795,796,799,800,803],{},"The module then adds only the build wiring: the stylesheets, ",[434,786,565],{},", the Vite pre-bundling, the Tailwind ",[434,789,790],{},"@source"," and the public AI configuration. It mounts no routes and no websocket, sets no server config and registers no client plugin, because that plugin's HTTP backend talks to the module's routes. The host installs the editor context itself (",[434,793,794],{},"createEditor"," from ",[434,797,798],{},"@skaile\u002Fforge-editor\u002Fvue",") with the backend it has, and calls no ",[434,801,802],{},"provideEditorServer()",".",[805,806,807],"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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":432,"searchDepth":447,"depth":447,"links":809},[810,811],{"id":424,"depth":447,"text":425},{"id":698,"depth":447,"text":699},"Register @skaile\u002Fforge-editor\u002Fnuxt in nuxt.config.ts, what the module wires into build, client and server, and which routes it mounts.","md",null,{},{"icon":143},{"title":140,"description":812},"35pPrwWfRs0w9b3VoTI5Yd2sojVKWZoAoE2lkzLGAuE",[820,822],{"title":135,"path":136,"stem":137,"description":821,"icon":138,"children":-1},"Build and run a Nuxt host with the editor module: runtime secrets, persistent storage and shutdown behaviour.",{"title":145,"path":146,"stem":147,"description":823,"icon":148,"children":-1},"Pick where documents live with ready-made EditorPorts adapters, comment stores, a Nuxt-free Nitro host and the useEditorDocument composable.",1793213903041]