[{"data":1,"prerenderedAt":2067},["ShallowReactive",2],{"navigation_docs":3,"-guides-migration":412,"-guides-migration-surround":2062},[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":150,"body":414,"description":2055,"extension":2056,"links":2057,"meta":2058,"navigation":2059,"path":151,"seo":2060,"stem":152,"__hash__":2061},"docs\u002F3.guides\u002F21.migration.md",{"type":415,"value":416,"toc":2047},"minimark",[417,430,463,893,953,979,984,991,1571,1574,1625,1629,1665,1752,1766,1771,1774,1903,1910,1924,1931],[418,419,420,421,425,426,429],"p",{},"The former Nuxt module ",[422,423,424],"code",{},"modules\u002Ftiptap-editor"," (alias ",[422,427,428],{},"#tiptap-editor",", auto-imported components, composables and utils, one server directory) is gone. Nothing is auto-imported and no alias remains: import from the entries below.",[431,432,433,460],"ol",{},[434,435,436,439,440,443,444,447,448,451,452,455,456,459],"li",{},[422,437,438],{},"nuxt.config.ts",": replace ",[422,441,442],{},"'.\u002Fmodules\u002Ftiptap-editor'"," with ",[422,445,446],{},"'@skaile\u002Fforge-editor\u002Fnuxt'"," (after ",[422,449,450],{},"'@nuxt\u002Fui'","). The ",[422,453,454],{},"tiptapEditor"," options keep their shape and defaults. Add ",[422,457,458],{},"\"@skaile\u002Fforge-editor\": \"workspace:*\""," to the host's dependencies.",[434,461,462],{},"Replace auto-imported components and composables by explicit imports:",[464,465,466,482],"table",{},[467,468,469],"thead",{},[470,471,472,479],"tr",{},[473,474,475,476,478],"th",{},"Before (auto-import or ",[422,477,428],{},")",[473,480,481],{},"After",[483,484,485,514,543,564,608,639,654,722,746,768,790,840,877],"tbody",{},[470,486,487,493],{},[488,489,490],"td",{},[422,491,492],{},"DocumentEditor",[488,494,495,498,499,502,503,506,507,510,511],{},[422,496,497],{},"AdvancedEditor"," from ",[422,500,501],{},"@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced"," (same props and events; plus ",[422,504,505],{},"settings-ui",", see ",[508,509,353],"a",{"href":354},"); on React ",[422,512,513],{},"@skaile\u002Fforge-editor\u002Freact\u002Fadvanced",[470,515,516,534],{},[488,517,518,521,522,521,525,521,528,521,531],{},[422,519,520],{},"EditorToolbar",", ",[422,523,524],{},"EditorSettingsModal",[422,526,527],{},"useEditorSettings",[422,529,530],{},"useEditorUi",[422,532,533],{},"useEditorContext",[488,535,536,539,540,478],{},[422,537,538],{},"@skaile\u002Fforge-editor\u002Fvue"," (the toolbar and the panel take ",[422,541,542],{},":editor",[470,544,545,550],{},[488,546,547],{},[422,548,549],{},"AiSidebar",[488,551,552,555,556,559,560,563],{},[422,553,554],{},"@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat"," (needs the optional peer ",[422,557,558],{},"@skaile\u002Fforge-chat","; ",[422,561,562],{},"\u002Fai\u002Freact"," on React)",[470,565,566,586],{},[488,567,568,521,571,521,574,521,577,521,580,521,583],{},[422,569,570],{},"AiReviewBar",[422,572,573],{},"AiSelectionMenu",[422,575,576],{},"ModelQuickSwitch",[422,578,579],{},"useAiAssistant",[422,581,582],{},"useDocumentChat",[422,584,585],{},"useModelProfiles",[488,587,588,591,592,594,595,521,598,521,601,604,605,478],{},[422,589,590],{},"@skaile\u002Fforge-editor\u002Fai\u002Fvue"," (",[422,593,562],{}," on React; the framework-free models ",[422,596,597],{},"modelProfiles",[422,599,600],{},"createAiAssistant",[422,602,603],{},"createDocumentChat"," in ",[422,606,607],{},"@skaile\u002Fforge-editor\u002Fai",[470,609,610,624],{},[488,611,612,521,615,521,618,521,621],{},[422,613,614],{},"useFileImport",[422,616,617],{},"AudioRecorderModal",[422,619,620],{},"useAudioRecorder",[422,622,623],{},"pickFiles",[488,625,626,591,629,632,633,635,636],{},[422,627,628],{},"@skaile\u002Fforge-editor\u002Fmedia\u002Fvue",[422,630,631],{},"\u002Fmedia\u002Freact"," on React); ",[422,634,623],{}," and the framework-free models in ",[422,637,638],{},"@skaile\u002Fforge-editor\u002Fmedia",[470,640,641,649],{},[488,642,643,521,646],{},[422,644,645],{},"createTranscriptCleanup",[422,647,648],{},"hasTranscriptSegments",[488,650,651],{},[422,652,653],{},"@skaile\u002Fforge-editor\u002Fintegrations\u002Ftranscript-ai",[470,655,656,702],{},[488,657,658,659,662,663,521,666,521,669,672,673,521,676,521,679,521,682,521,685,688,689,521,692,521,695,521,698,701],{},"The Block type API (the module's former ",[422,660,661],{},"Composite*"," names; today ",[422,664,665],{},"defaultBlockTypes(t)",[422,667,668],{},"BlockType",[422,670,671],{},"acceptsChild","), ",[422,674,675],{},"AcceptedChildren",[422,677,678],{},"headingsMarkdown",[422,680,681],{},"compositeOutline",[422,683,684],{},"moveBlockInto",[422,686,687],{},"moveIntoVerdict",", markdown fence helpers, ",[422,690,691],{},"CompositeTable",[422,693,694],{},"CompositeInspector",[422,696,697],{},"useCompositeRows",[422,699,700],{},"setComposite*"," writers",[488,703,704,707,708,711,712,715,716,718,719,478],{},[422,705,706],{},"@skaile\u002Fforge-editor\u002Fcomposites"," (framework-free), ",[422,709,710],{},"\u002Fcomposites\u002Fvue"," or ",[422,713,714],{},"\u002Fcomposites\u002Freact"," for the components and ",[422,717,697],{}," (schema subset: ",[422,720,721],{},"\u002Fcomposites\u002Fschema",[470,723,724,741],{},[488,725,726,521,729,707,732,591,735,521,738,478],{},[422,727,728],{},"headingOutline",[422,730,731],{},"revealBlockInEditor",[422,733,734],{},"EditorOutline",[422,736,737],{},"\u002Foutline\u002Fvue",[422,739,740],{},"\u002Foutline\u002Freact",[488,742,743],{},[422,744,745],{},"@skaile\u002Fforge-editor\u002Foutline",[470,747,748,763],{},[488,749,750,521,753,521,756,521,759,762],{},[422,751,752],{},"EMPTY_EDITOR_CONTENT",[422,754,755],{},"ABILITY",[422,757,758],{},"Ability",[422,760,761],{},"findBlockById",", block ID helpers",[488,764,765],{},[422,766,767],{},"@skaile\u002Fforge-editor\u002Fcore\u002Fschema",[470,769,770,785],{},[488,771,772,521,775,778,779,521,782,478],{},[422,773,774],{},"fetchErrorMessage",[422,776,777],{},"downloadText",", abilities helpers (",[422,780,781],{},"abilitiesAtSelection",[422,783,784],{},"hasAbility",[488,786,787],{},[422,788,789],{},"@skaile\u002Fforge-editor\u002Fcore",[470,791,792,807],{},[488,793,794,521,797,521,800,521,803,806],{},[422,795,796],{},"DocumentTree",[422,798,799],{},"useTreeView",[422,801,802],{},"TreeFolder",[422,804,805],{},"DocumentSummary"," (were host files and host shared types)",[488,808,809,521,811,498,813,816,817,820,821,521,824,521,826,498,828,831,832,834,835,498,838,478],{},[422,810,796],{},[422,812,799],{},[422,814,815],{},"@skaile\u002Fforge-editor\u002Ftree\u002Fvue"," (or ",[422,818,819],{},"\u002Ftree\u002Freact","); ",[422,822,823],{},"DocumentStore",[422,825,802],{},[422,827,805],{},[422,829,830],{},"@skaile\u002Fforge-editor\u002Ftree"," (the host's ",[422,833,823],{}," implementation stays in the app; the host's ref-based store becomes stores with ",[422,836,837],{},"storeFromRef",[422,839,538],{},[470,841,842,857],{},[488,843,844,521,847,521,850,521,853,856],{},[422,845,846],{},"setEditorAdapter",[422,848,849],{},"forgetCollabDocument",[422,851,852],{},"liveContent",[422,854,855],{},"EditorAdapter"," (Nitro, previously auto-imported)",[488,858,859,521,862,521,865,498,868,521,871,498,874],{},[422,860,861],{},"provideEditorServer({ ports })",[422,863,864],{},"useEditorServer().forgetDocument",[422,866,867],{},"useEditorServer().liveContent",[422,869,870],{},"@skaile\u002Fforge-editor\u002Fserver\u002Fnitro",[422,872,873],{},"EditorPorts",[422,875,876],{},"@skaile\u002Fforge-editor\u002Fserver",[470,878,879,882],{},[488,880,881],{},"Server schema \u002F migration imports of the old shared directory",[488,883,884,521,887,521,889,892],{},[422,885,886],{},"@skaile\u002Fforge-editor\u002Fschema\u002Fadvanced",[422,888,721],{},[422,890,891],{},"\u002Fmedia\u002Fschema",", …",[431,894,896,920,942],{"start":895},3,[434,897,898,899,901,902,521,905,908,909,591,912,521,915,919],{},"Collaboration, block UI and the integrations are now features. ",[422,900,497],{}," includes them; a custom preset adds ",[422,903,904],{},"collabFeature()",[422,906,907],{},"blockUiFeature()"," and the integrations explicitly. Features report user-facing messages through the surface's ",[422,910,911],{},"Notifier",[422,913,914],{},"ctx.notify",[508,916,918],{"href":917},"\u002Fguides\u002Fcomposition#per-feature-entries-framework-free-vue-react","per-feature entries","), so host code no longer hands toast objects to feature functions.",[434,921,922,923,521,925,927,928,521,930,521,932,521,934,937,938,941],{},"Search the host for ",[422,924,428],{},[422,926,424],{}," and for symbols that used to resolve without an import (",[422,929,527],{},[422,931,614],{},[422,933,755],{},[422,935,936],{},"fileNameError","'s neighbors…); ",[422,939,940],{},"nuxt typecheck"," reports every unresolved one.",[434,943,944,945,948,949,952],{},"Styles: the Nuxt module adds every feature stylesheet; a plain-Vue app imports ",[422,946,947],{},"core.css"," plus the feature CSS it uses (",[508,950,951],{"href":362},"README",").",[418,954,955,956,521,959,962,963,966,967,970,971,974,975,978],{},"Stored data needs no migration: document JSON, Yjs state, ",[422,957,958],{},"tiptap-editor:settings",[422,960,961],{},"tiptap-editor:model-profiles"," and ",[422,964,965],{},"tip-tree:node-filters"," keep their keys and shapes. Legacy ",[422,968,969],{},"section"," nodes are still migrated on load (",[422,972,973],{},"currentContent"," on the server, the composites Feature's ",[422,976,977],{},"migrateContent"," hook in the editor).",[980,981,983],"h2",{"id":982},"block-vocabulary","Block vocabulary",[418,985,986,987,990],{},"The library, the reference app and the docs name things in the block vocabulary (",[508,988,989],{"href":34},"glossary",": Typed block, Block type, Property definition, Model role, …). The former names are removed; no alias remains. Switch a host over like this:",[464,992,993,1006],{},[467,994,995],{},[470,996,997,1000,1003],{},[473,998,999],{},"Former name",[473,1001,1002],{},"New name",[473,1004,1005],{},"Where",[483,1007,1008,1041,1072,1086,1115,1135,1157,1173,1202,1227,1265,1285,1323,1342,1376,1400,1425,1441,1464,1498,1513,1549],{},[470,1009,1010,1021,1031],{},[488,1011,1012,521,1015,521,1018],{},[422,1013,1014],{},"CompositeKind",[422,1016,1017],{},"CompositeKindAi",[422,1019,1020],{},"CompositeMetaField",[488,1022,1023,521,1025,521,1028],{},[422,1024,668],{},[422,1026,1027],{},"BlockTypeAi",[422,1029,1030],{},"PropertyDefinition",[488,1032,1033,521,1035,559,1037,498,1039],{},[422,1034,706],{},[422,1036,721],{},[422,1038,1030],{},[422,1040,789],{},[470,1042,1043,1057,1069],{},[488,1044,1045,521,1048,521,1051,521,1054],{},[422,1046,1047],{},"defaultCompositeKinds",[422,1049,1050],{},"fallbackCompositeKinds",[422,1052,1053],{},"compositeKind",[422,1055,1056],{},"kindAccepts",[488,1058,1059,521,1061,521,1064,521,1067],{},[422,1060,665],{},[422,1062,1063],{},"fallbackBlockTypes",[422,1065,1066],{},"blockTypeOf",[422,1068,671],{},[488,1070,1071],{},"the same entries",[470,1073,1074,1079,1084],{},[488,1075,1076],{},[422,1077,1078],{},"compositeKindsOf(editor)",[488,1080,1081],{},[422,1082,1083],{},"blockTypesOf(editor)",[488,1085,1071],{},[470,1087,1088,1099,1110],{},[488,1089,1090,521,1093,521,1096],{},[422,1091,1092],{},"CompositeKindCount",[422,1094,1095],{},"CompositeKindOption",[422,1097,1098],{},"ChatCompositeKind",[488,1100,1101,521,1104,521,1107],{},[422,1102,1103],{},"BlockTypeCount",[422,1105,1106],{},"BlockTypeOption",[422,1108,1109],{},"ChatBlockType",[488,1111,1112,1113],{},"the same entries; the chat type in ",[422,1114,607],{},[470,1116,1117,1123,1128],{},[488,1118,1119,1120],{},"command ",[422,1121,1122],{},"setCompositeKind(kind, pos?)",[488,1124,1125],{},[422,1126,1127],{},"changeBlockType(blockTypeId, pos?)",[488,1129,1130,1131,1134],{},"editor commands of the Typed block (not ",[422,1132,1133],{},"setBlockType",": ProseMirror uses that name for node-type changes)",[470,1136,1137,1145,1153],{},[488,1138,1139,521,1142],{},[422,1140,1141],{},"compositeMetaWith",[422,1143,1144],{},"setCompositeMetaField",[488,1146,1147,521,1150],{},[422,1148,1149],{},"metaWithProperty",[422,1151,1152],{},"setBlockProperty",[488,1154,1155],{},[422,1156,706],{},[470,1158,1159,1164,1169],{},[488,1160,1161],{},[422,1162,1163],{},"renditionsOf",[488,1165,1166],{},[422,1167,1168],{},"derivedChildrenOf",[488,1170,1171],{},[422,1172,789],{},[470,1174,1175,1184,1200],{},[488,1176,1177,1178,711,1181],{},"option and prop ",[422,1179,1180],{},"kinds",[422,1182,1183],{},"compositeKinds",[488,1185,1186,591,1189,521,1192,521,1195,521,1197,478],{},[422,1187,1188],{},"blockTypes",[422,1190,1191],{},"compositeFeature({ blockTypes })",[422,1193,1194],{},"composeEditor({ blockTypes })",[422,1196,497],{},[422,1198,1199],{},"ComposedSurface",[488,1201,1071],{},[470,1203,1204,1217,1222],{},[488,1205,1206,1209,1210,1213,1214],{},[422,1207,1208],{},"skeleton"," in the ",[422,1211,1212],{},"ai"," brief of a Block type, and the AI wire field ",[422,1215,1216],{},"block.skeleton",[488,1218,1219],{},[422,1220,1221],{},"contentTemplate",[488,1223,1224,1226],{},[422,1225,1027],{},"; client and server of the AI endpoints ship in the same package",[470,1228,1229,1240,1251],{},[488,1230,1231,521,1234,521,1237],{},[422,1232,1233],{},"ModelSlot",[422,1235,1236],{},"MODEL_SLOTS",[422,1238,1239],{},"MODEL_SLOT_KEYS",[488,1241,1242,521,1245,521,1248],{},[422,1243,1244],{},"ModelRole",[422,1246,1247],{},"MODEL_ROLES",[422,1249,1250],{},"MODEL_ROLE_KEYS",[488,1252,1253,1256,1257,1260,1261,1264],{},[422,1254,1255],{},"@skaile\u002Fforge-editor\u002Fsettings"," (the stored key ",[422,1258,1259],{},"ai.slots"," is now ",[422,1262,1263],{},"ai.roles","; saved settings migrate on load)",[470,1266,1267,1272,1277],{},[488,1268,1269],{},[422,1270,1271],{},"PresetConfig",[488,1273,1274],{},[422,1275,1276],{},"ModelPresetConfig",[488,1278,1279,521,1282],{},[422,1280,1281],{},"@skaile\u002Fforge-editor\u002Fconfig",[422,1283,1284],{},"\u002Fserver",[470,1286,1287,1295,1303],{},[488,1288,1289,521,1292,1294],{},[422,1290,1291],{},"Identity",[422,1293,823],{}," of the server ports",[488,1296,1297,521,1300],{},[422,1298,1299],{},"AccessControl",[422,1301,1302],{},"DocumentContentStore",[488,1304,1305,1307,1308,1310,1311,962,1314,1317,1318,604,1320,1322],{},[422,1306,876],{}," (the ",[422,1309,873],{}," members ",[422,1312,1313],{},"identity",[422,1315,1316],{},"documents"," keep their names; the Document tree's own ",[422,1319,823],{},[422,1321,830],{}," keeps its name)",[470,1324,1325,1328,1333],{},[488,1326,1327],{},"the tree command string of the folder block",[488,1329,1330],{},[422,1331,1332],{},"createFolderBlock",[488,1334,1335,1338,1339,1341],{},[422,1336,1337],{},"TreeCommand"," of ",[422,1340,830],{},"; a host executor that switches on the command type must use the new string",[470,1343,1344,1355,1366],{},[488,1345,1346,521,1349,521,1352],{},[422,1347,1348],{},"aiKindsOf",[422,1350,1351],{},"derivableKindsOf",[422,1353,1354],{},"AiContextKind",[488,1356,1357,521,1360,521,1363],{},[422,1358,1359],{},"aiBlockTypesOf",[422,1361,1362],{},"derivableBlockTypesOf",[422,1364,1365],{},"AiContextBlockType",[488,1367,1368,521,1370,521,1373],{},[422,1369,706],{},[422,1371,1372],{},"\u002Fintegrations\u002Fcomposite-ai",[422,1374,1375],{},"\u002Fcore",[470,1377,1378,1389,1393],{},[488,1379,1380,521,1383,1386,1387],{},[422,1381,1382],{},"AiContext.kinds",[422,1384,1385],{},"ChatBlockModel.kinds",", the AI chat request field ",[422,1388,1180],{},[488,1390,1391],{},[422,1392,1188],{},[488,1394,1395,521,1397,1226],{},[422,1396,789],{},[422,1398,1399],{},"\u002Fai",[470,1401,1402,1411,1421],{},[488,1403,1404,1407,1408],{},[422,1405,1406],{},"ConvertTarget"," ",[422,1409,1410],{},"{ type: 'typedBlock', kind }",[488,1412,1413,1416,1417,1420],{},[422,1414,1415],{},"{ type: 'typedBlock', blockType }"," (the target id ",[422,1418,1419],{},"typedBlock:\u003Cid>"," is unchanged)",[488,1422,1423],{},[422,1424,789],{},[470,1426,1427,1432,1437],{},[488,1428,1429],{},[422,1430,1431],{},"BlockProperties.fields",[488,1433,1434],{},[422,1435,1436],{},"BlockProperties.definitions",[488,1438,1439],{},[422,1440,706],{},[470,1442,1443,1451,1460],{},[488,1444,1445,521,1448],{},[422,1446,1447],{},"listsBlockTypeCapability(type, id)",[422,1449,1450],{},"listsCapability(ctx, node, id)",[488,1452,1453,1456,1457,478],{},[422,1454,1455],{},"listsCapability(type, id)"," (pass ",[422,1458,1459],{},"ctx.blockTypeOf(node)",[488,1461,1462],{},[422,1463,789],{},[470,1465,1466,1474,1479],{},[488,1467,1468,498,1471],{},[422,1469,1470],{},"blockTypeConfigOf",[422,1472,1473],{},"\u002Fcomposites",[488,1475,1476],{},[422,1477,1478],{},"blockTypeConfigOf(type, id)",[488,1480,1481,559,1483,962,1486,1489,1490,1493,1494,1497],{},[422,1482,789],{},[422,1484,1485],{},"configOf",[422,1487,1488],{},"capabilityConfigOf"," now return ",[422,1491,1492],{},"undefined"," (was ",[422,1495,1496],{},"null",") when absent",[470,1499,1500,1505,1509],{},[488,1501,1502],{},[422,1503,1504],{},"BlockTypeSpec",[488,1506,1507],{},[422,1508,668],{},[488,1510,1511],{},[422,1512,706],{},[470,1514,1515,1541,1544],{},[488,1516,1517,521,1520,521,1523,521,1526,521,1529,521,1532,521,1535,498,1537,711,1539],{},[422,1518,1519],{},"derivationOf",[422,1521,1522],{},"derivationState",[422,1524,1525],{},"DERIVATION_KEY",[422,1527,1528],{},"Derivation",[422,1530,1531],{},"DerivationMethod",[422,1533,1534],{},"DerivationSource",[422,1536,1030],{},[422,1538,1473],{},[422,1540,721],{},[488,1542,1543],{},"the same names",[488,1545,1546,1548],{},[422,1547,789],{}," only",[470,1550,1551,1560,1568],{},[488,1552,1553,1554,521,1557],{},"CSS ",[422,1555,1556],{},"--sk-kind-tone",[422,1558,1559],{},"--sk-kind-tone-mix",[488,1561,1562,521,1565],{},[422,1563,1564],{},"--sk-block-type-tone",[422,1566,1567],{},"--sk-block-type-tone-mix",[488,1569,1570],{},"host stylesheets that set or read the tone",[418,1572,1573],{},"Behaviour that changed with the rename:",[1575,1576,1577,1605,1615],"ul",{},[434,1578,1579,1583,1584,1587,1588,1591,1592,1594,1595,711,1598,1601,1602,1604],{},[1580,1581,1582],"strong",{},"Accepted children."," The built-in Folder and Document Block types declare ",[422,1585,1586],{},"accepts: 'all'"," themselves; the id-keyed default is gone. A Block type without ",[422,1589,1590],{},"accepts",", and a type ID that a list does not define, accepts no nested Typed blocks (",[422,1593,671],{},"). A host list that defines its own ",[422,1596,1597],{},"folder",[422,1599,1600],{},"document"," Block type must set ",[422,1603,1590],{}," on it.",[434,1606,1607,1610,1611,952],{},[1580,1608,1609],{},"Block UI."," The hover bar, the toolbar Block actions and the drag handle address the outermost block, so a caret in a list item or a quote paragraph acts on the whole list or quote (",[508,1612,1614],{"href":1613},"\u002Fguides\u002Fblock-ui#where-block-actions-appear","Block UI",[434,1616,1617,1620,1621,1624],{},[1580,1618,1619],{},"Labels."," English: Typed block, Block type, Readable rendition, Theme with Default appearance, Document facts, Structure mode and Flat mode. German: Block and Blocktyp; the two German labels that still use the legacy words for basket and readable rendition stay. Message keys keep their IDs, so ",[422,1622,1623],{},"messages"," overrides still apply, but check the wording of an override against the new labels.",[980,1626,1628],{"id":1627},"block-types-as-data","Block types as data",[418,1630,1631,1632,591,1634,1636,1637,1640,1641,521,1644,521,1647,521,1650,521,1653,1656,1657,1660,1661,1664],{},"A ",[422,1633,668],{},[422,1635,706],{},") is now an ",[422,1638,1639],{},"id",", its presentation (",[422,1642,1643],{},"label",[422,1645,1646],{},"icon",[422,1648,1649],{},"titlePlaceholder",[422,1651,1652],{},"descriptionPlaceholder",[422,1654,1655],{},"chrome",") and a list ",[422,1658,1659],{},"capabilities: { id, config? }[]",". The former switches move into it (",[508,1662,1663],{"href":110},"Typed blocks","):",[464,1666,1667,1677],{},[467,1668,1669],{},[470,1670,1671,1674],{},[473,1672,1673],{},"Former field",[473,1675,1676],{},"Now",[483,1678,1679,1691,1703,1715,1727,1738],{},[470,1680,1681,1686],{},[488,1682,1683],{},[422,1684,1685],{},"fields: PropertyDefinition[]",[488,1687,1688],{},[422,1689,1690],{},"{ id: 'properties', config: { definitions } }",[470,1692,1693,1698],{},[488,1694,1695],{},[422,1696,1697],{},"source: ('image' | 'audio' | 'video' | 'file')[]",[488,1699,1700],{},[422,1701,1702],{},"{ id: 'source', config: { media } }",[470,1704,1705,1710],{},[488,1706,1707],{},[422,1708,1709],{},"accepts: string[] | 'all'",[488,1711,1712],{},[422,1713,1714],{},"{ id: 'container', config: { accepts } }",[470,1716,1717,1722],{},[488,1718,1719],{},[422,1720,1721],{},"ai: BlockTypeAi",[488,1723,1724],{},[422,1725,1726],{},"{ id: 'ai-brief', config: ai }",[470,1728,1729,1732],{},[488,1730,1731],{},"(every type had a Basket menu)",[488,1733,1734,1737],{},[422,1735,1736],{},"{ id: 'basket' }","; a type without it has no Basket menu",[470,1739,1740,1747],{},[488,1741,1742,1743,1746],{},"a ",[422,1744,1745],{},"bibliography"," property implied the BibTeX export",[488,1748,1749],{},[422,1750,1751],{},"{ id: 'bibliography' }",[418,1753,1754,1755,1757,1758,1761,1762,1765],{},"A host list that spreads ",[422,1756,665],{}," and adds its own types must give them the capabilities they need. An unknown capability id or an invalid config throws when the editor is created. ",[422,1759,1760],{},"meta"," keys and the ",[422,1763,1764],{},"::: \u003CBlock type id>"," Markdown fences keep their names; the node and its type attribute are renamed (below).",[1767,1768,1770],"h3",{"id":1769},"persisted-names","Persisted names",[418,1772,1773],{},"Stored documents and settings use the vocabulary of the glossary. Everything saved before loads through a migration that reads the old names and never writes them back; hosts do nothing for stored data.",[464,1775,1776,1788],{},[467,1777,1778],{},[470,1779,1780,1783,1786],{},[473,1781,1782],{},"Old",[473,1784,1785],{},"New",[473,1787,1005],{},[483,1789,1790,1810,1837,1864,1880],{},[470,1791,1792,1798,1803],{},[488,1793,1794,1795],{},"node ",[422,1796,1797],{},"composite",[488,1799,1800],{},[422,1801,1802],{},"typedBlock",[488,1804,1805,1806,1809],{},"document JSON, Yjs state, ",[422,1807,1808],{},".cdoc"," packages, clipboard and drag payloads",[470,1811,1812,1823,1834],{},[488,1813,1814,521,1817,521,1820],{},[422,1815,1816],{},"compositeTitle",[422,1818,1819],{},"compositeDescription",[422,1821,1822],{},"compositeTags",[488,1824,1825,521,1828,521,1831],{},[422,1826,1827],{},"typedBlockTitle",[422,1829,1830],{},"typedBlockDescription",[422,1832,1833],{},"typedBlockTags",[488,1835,1836],{},"same",[470,1838,1839,1849,1854],{},[488,1840,1841,1842,1845,1846],{},"attribute ",[422,1843,1844],{},"kind"," on the Typed block and on ",[422,1847,1848],{},"opaqueFence",[488,1850,1851],{},[422,1852,1853],{},"blockType",[488,1855,1856,1857,1860,1861,1863],{},"same; block IDs (",[422,1858,1859],{},"attrs.id",") and ",[422,1862,1760],{}," are untouched",[470,1865,1866,1872,1877],{},[488,1867,1868,1869],{},"HTML ",[422,1870,1871],{},"section[data-type=\"composite\"][data-kind]",[488,1873,1874],{},[422,1875,1876],{},"section[data-type=\"typedBlock\"][data-block-type]",[488,1878,1879],{},"clipboard HTML: both shapes parse, only the new one is written",[470,1881,1882,1891,1896],{},[488,1883,1884,1887,1888,478],{},[422,1885,1886],{},"BlockTransfer.kind"," (drag payload on ",[422,1889,1890],{},"application\u002Fx-tip-block",[488,1892,1893],{},[422,1894,1895],{},"BlockTransfer.blockType",[488,1897,1898,1899,1902],{},"an old payload is read, its ",[422,1900,1901],{},"json"," migrated",[418,1904,1905,1906,1909],{},"Markdown needs no migration: the fence is ",[422,1907,1908],{},"::: \u003CBlock type id> #id {meta}"," before and after, so old Markdown parses to Typed blocks and the export is byte-identical.",[418,1911,1912,1913,1916,1917,1920,1921,1923],{},"The server migrates Yjs state when a document loads (",[422,1914,1915],{},"onLoadDocument",", before any client syncs): it reads the schema-less JSON of the stored state, applies the same JSON migration and writes the result back with the block IDs and content unchanged, then persists the migrated state. A second load finds nothing to migrate. Client JSON goes through the rename in ",[422,1918,1919],{},"defineEditor",", which runs ahead of any contributed ",[422,1922,977],{}," (the Typed blocks feature contributes the legacy-node migration), so a host hook cannot drop it.",[418,1925,1926,1927,1930],{},"Settings version 2 renamed four keys (table below). Saved settings (server store, ",[422,1928,1929],{},"localStorage",") migrate on load and are rewritten once. The host config key change needs a code change (no migration).",[464,1932,1933,1943],{},[467,1934,1935],{},[470,1936,1937,1939,1941],{},[473,1938,1782],{},[473,1940,1785],{},[473,1942,1005],{},[483,1944,1945,1958,1977,1992,2006,2024],{},[470,1946,1947,1951,1955],{},[488,1948,1949],{},[422,1950,1259],{},[488,1952,1953],{},[422,1954,1263],{},[488,1956,1957],{},"settings; host config key (code change, no migration)",[470,1959,1960,1969,1974],{},[488,1961,1962,1963,1338,1966],{},"wire key ",[422,1964,1965],{},"slots",[422,1967,1968],{},"GET \u002Fapi\u002Fai\u002Fmodels",[488,1970,1971],{},[422,1972,1973],{},"roles",[488,1975,1976],{},"HTTP response",[470,1978,1979,1984,1989],{},[488,1980,1981],{},[422,1982,1983],{},"blocks.defaultKind",[488,1985,1986],{},[422,1987,1988],{},"blocks.defaultBlockType",[488,1990,1991],{},"settings",[470,1993,1994,1999,2004],{},[488,1995,1996],{},[422,1997,1998],{},"blocks.kindIcon",[488,2000,2001],{},[422,2002,2003],{},"blocks.blockTypeIcon",[488,2005,1991],{},[470,2007,2008,2017,2022],{},[488,2009,2010,2013,2014],{},[422,2011,2012],{},"blocks.structure"," value ",[422,2015,2016],{},"'composite'",[488,2018,2019],{},[422,2020,2021],{},"'structured'",[488,2023,1991],{},[470,2025,2026,2034,2042],{},[488,2027,2028,521,2031],{},[422,2029,2030],{},"KIND_ICON_VISIBILITIES",[422,2032,2033],{},"KindIconVisibility",[488,2035,2036,521,2039],{},[422,2037,2038],{},"BLOCK_TYPE_ICON_VISIBILITIES",[422,2040,2041],{},"BlockTypeIconVisibility",[488,2043,2044,2046],{},[422,2045,1255],{}," (code names, nothing stored)",{"title":2048,"searchDepth":2049,"depth":2049,"links":2050},"",2,[2051,2052],{"id":982,"depth":2049,"text":983},{"id":1627,"depth":2049,"text":1628,"children":2053},[2054],{"id":1769,"depth":895,"text":1770},"Move a host from the removed #tiptap-editor Nuxt module to explicit imports from @skaile\u002Fforge-editor entries.","md",null,{},{"icon":153},{"title":150,"description":2055},"XXW7Cn2cDBpqIaZmzuGUBuDVgmhQ5mI6DyXwTYIXYvI",[2063,2065],{"title":145,"path":146,"stem":147,"description":2064,"icon":148,"children":-1},"Pick where documents live with ready-made EditorPorts adapters, comment stores, a Nuxt-free Nitro host and the useEditorDocument composable.",{"title":155,"path":156,"stem":157,"description":2066,"icon":158,"children":-1},"Work on a tree of Typed blocks: colour baskets and hidden titles, splitting by hand, by length or with AI, outline cleanup, focus and basket filter in the tree, and block transfer between two editors.",1793213903262]