[{"data":1,"prerenderedAt":1895},["ShallowReactive",2],{"navigation_docs":3,"-ai-agents-integrate":412,"-ai-agents-integrate-surround":1890},[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":395,"body":414,"description":1883,"extension":1884,"links":1885,"meta":1886,"navigation":1887,"path":396,"seo":1888,"stem":397,"__hash__":1889},"docs\u002F5.ai-agents\u002F2.integrate.md",{"type":415,"value":416,"toc":1875},"minimark",[417,422,426,559,593,601,605,622,626,635,1743,1746,1861,1865],[418,419,421],"h2",{"id":420},"choose-the-surface","Choose the surface",[423,424,425],"p",{},"Decide first which host the editor lands in. Each row links to the page that holds the ordered setup steps and the code; do not retype them from memory.",[427,428,429,445],"table",{},[430,431,432],"thead",{},[433,434,435,439,442],"tr",{},[436,437,438],"th",{},"Host",[436,440,441],{},"Surface and entry",[436,443,444],{},"Setup",[446,447,448,478,499,527],"tbody",{},[433,449,450,454,473],{},[451,452,453],"td",{},"Nuxt app (editor plus backend)",[451,455,456,460,461,464,465,468,469,472],{},[457,458,459],"code",{},"AdvancedEditor"," from ",[457,462,463],{},"@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced",", module ",[457,466,467],{},"@skaile\u002Fforge-editor\u002Fnuxt",", ",[457,470,471],{},"EditorPorts"," in a Nitro plugin",[451,474,475],{},[476,477,21],"a",{"href":22},[433,479,480,483,494],{},[451,481,482],{},"Plain Vue 3 app (Vite), no backend",[451,484,485,460,488,468,491],{},[457,486,487],{},"SimpleEditor",[457,489,490],{},"@skaile\u002Fforge-editor\u002Fvue\u002Fsimple",[457,492,493],{},"createEditor()",[451,495,496],{},[476,497,498],{"href":26},"Quick start: Vue",[433,500,501,504,521],{},[451,502,503],{},"React 19 app",[451,505,506,460,508,511,512,515,516,460,518],{},[457,507,487],{},[457,509,510],{},"@skaile\u002Fforge-editor\u002Freact\u002Fsimple"," inside ",[457,513,514],{},"EditorContextProvider","; ",[457,517,459],{},[457,519,520],{},"@skaile\u002Fforge-editor\u002Freact\u002Fadvanced",[451,522,523,468,525],{},[476,524,29],{"href":30},[476,526,127],{"href":128},[433,528,529,532,555],{},[451,530,531],{},"Framework-free (headless, server, validator)",[451,533,534,537,538,541,542,545,546,468,549,468,552],{},[457,535,536],{},"\u002Fcore",", the ",[457,539,540],{},"\u003Cx>"," entries without ",[457,543,544],{},"\u002Fvue"," or ",[457,547,548],{},"\u002Freact",[457,550,551],{},"schema\u002F*",[457,553,554],{},"\u002Fserver",[451,556,557],{},[476,558,332],{"href":333},[423,560,561,562,564,565,569,570,573,574,576,577,580,581,584,585,588,589,592],{},"The Nuxt path in order: install the package and its peers (",[476,563,16],{"href":17},"); register the module ",[566,567,568],"strong",{},"after"," ",[457,571,572],{},"@nuxt\u002Fui","; register ",[457,575,471],{}," in a Nitro plugin (",[476,578,579],{"href":196},"EditorPorts guide","); mount the editor inside ",[457,582,583],{},"\u003CUApp>"," with the toolbar as a sibling that receives the editor from ",[457,586,587],{},"ready",". The Nuxt module installs the client plugin with ",[457,590,591],{},"createEditor","; plain Vue and React hosts create the context themselves.",[423,594,595,597,598,600],{},[457,596,459],{}," pulls in every feature. For a smaller bundle use ",[457,599,487],{}," or compose a list yourself.",[418,602,604],{"id":603},"choose-a-preset-or-features","Choose a preset or features",[423,606,607,608,611,612,614,615,618,619,621],{},"Which preset or feature list fits the goal, and what each feature needs from the backend: ",[476,609,610],{"href":91},"Composing an editor"," (decision table) and ",[476,613,353],{"href":354}," (every feature with ",[457,616,617],{},"requires"," and backend). Own features: ",[476,620,399],{"href":400},".",[418,623,625],{"id":624},"which-entry-to-import","Which entry to import",[423,627,628,629,632,633,621],{},"Every entry is an explicit subpath of ",[457,630,631],{},"package.json#exports","; a path that is not listed there does not resolve. Full inventory with every exported name: ",[476,634,332],{"href":333},[427,636,637,650],{},[430,638,639],{},[433,640,641,644,647],{},[436,642,643],{},"You need",[436,645,646],{},"Import",[436,648,649],{},"Side",[446,651,652,666,679,733,775,819,832,853,878,925,987,1104,1204,1264,1291,1340,1365,1405,1441,1478,1498,1519,1534,1564,1595,1648,1667,1696],{},[433,653,654,657,663],{},[451,655,656],{},"A ready simple editor component",[451,658,659,460,661],{},[457,660,487],{},[457,662,490],{},[451,664,665],{},"browser",[433,667,668,671,677],{},[451,669,670],{},"A ready advanced editor component",[451,672,673,460,675],{},[457,674,459],{},[457,676,463],{},[451,678,665],{},[433,680,681,693,731],{},[451,682,683,684,468,687,468,690],{},"A preset to pass to ",[457,685,686],{},"EditorSurface",[457,688,689],{},"EditorToolbar",[457,691,692],{},"EditorSettingsPanel",[451,694,695,460,698,701,702,705,706,460,709,545,712,715,716,718,719,468,722,468,725,468,728,730],{},[457,696,697],{},"simpleEditor",[457,699,700],{},"...\u002Fpresets\u002Fcompose"," (framework-free, no ⌘K palette), ",[457,703,704],{},"advancedEditor"," \u002F ",[457,707,708],{},"composeEditor",[457,710,711],{},"...\u002Fvue\u002Fadvanced",[457,713,714],{},"...\u002Freact\u002Fadvanced"," (the framework-free assembly behind them is ",[457,717,700],{},": ",[457,720,721],{},"composeEditor(ui, options)",[457,723,724],{},"CONTENT",[457,726,727],{},"INTERACTION",[457,729,113],{},")",[451,732,665],{},[433,734,735,767,772],{},[451,736,737,738,740,741,468,743,468,745,468,747,468,750,753,754,757,758,468,761,468,764],{},"Vue chrome: ",[457,739,591],{}," (mandatory Vue app context), ",[457,742,686],{},[457,744,689],{},[457,746,692],{},[457,748,749],{},"EditorSettingsModal",[457,751,752],{},"EditorCommandPalette"," (⌘K palette, the ",[457,755,756],{},"core-ui"," overlay), ",[457,759,760],{},"SettingsSection",[457,762,763],{},"useEditorSettings",[457,765,766],{},"useEditorUi",[451,768,769],{},[457,770,771],{},"@skaile\u002Fforge-editor\u002Fvue",[451,773,774],{},"browser (Vue)",[433,776,777,811,816],{},[451,778,779,780,782,783,786,787,468,789,468,791,468,793,468,795,753,797,757,799,468,801,468,803,468,805,468,808],{},"React chrome: ",[457,781,514],{}," (mandatory React context from ",[457,784,785],{},"createEditorContext()","), ",[457,788,686],{},[457,790,689],{},[457,792,692],{},[457,794,749],{},[457,796,752],{},[457,798,756],{},[457,800,760],{},[457,802,763],{},[457,804,766],{},[457,806,807],{},"Toaster",[457,809,810],{},"reactNotifier",[451,812,813],{},[457,814,815],{},"@skaile\u002Fforge-editor\u002Freact",[451,817,818],{},"browser (React)",[433,820,821,824,830],{},[451,822,823],{},"A ready simple editor component for React",[451,825,826,460,828],{},[457,827,487],{},[457,829,510],{},[451,831,818],{},[433,833,834,837,851],{},[451,835,836],{},"A ready advanced editor component for React",[451,838,839,468,841,460,843,845,846,848,849,730],{},[457,840,459],{},[457,842,704],{},[457,844,520],{}," (needs ",[457,847,514],{}," and ",[457,850,807],{},[451,852,818],{},[433,854,855,858,876],{},[451,856,857],{},"shadcn token mapping for the feature CSS (React hosts)",[451,859,860,863,864,867,868,871,872,875],{},[457,861,862],{},"@skaile\u002Fforge-editor\u002Freact\u002Fstyles\u002Fui-vars.css","; for the advanced editor ",[457,865,866],{},"@skaile\u002Fforge-editor\u002Freact\u002Fstyles\u002Fadvanced.css"," (token mapping, ",[457,869,870],{},"core.css",", every feature sheet, ",[457,873,874],{},"themes.css"," and the theme bridge in one import)",[451,877,818],{},[433,879,880,917,922],{},[451,881,882,883,468,886,468,889,468,892,468,895,468,898,468,901,468,904,468,907,910,911,468,914,730],{},"Framework-free core: ",[457,884,885],{},"defineEditor",[457,887,888],{},"coreContentFeature",[457,890,891],{},"coreUiFeature",[457,893,894],{},"createEditorContext",[457,896,897],{},"command",[457,899,900],{},"commandState",[457,902,903],{},"parseBlocks",[457,905,906],{},"createStore",[457,908,909],{},"Notifier",", extension-point types (",[457,912,913],{},"MenuItem",[457,915,916],{},"EditorFeature\u003CC>",[451,918,919],{},[457,920,921],{},"@skaile\u002Fforge-editor\u002Fcore",[451,923,924],{},"browser (no UI framework)",[433,926,927,930,985],{},[451,928,929],{},"One feature",[451,931,932,935,936,939,940,943,944,947,948,515,951,953,954,468,957,960,961,468,964,468,967,468,970,468,973,468,976,468,979,468,982],{},[457,933,934],{},"\u003Cx>FeatureCore(ui)",", models and types from ",[457,937,938],{},"...\u002F\u003Cx>","; the Vue binding ",[457,941,942],{},"\u003Cx>Feature()"," and components from ",[457,945,946],{},"...\u002F\u003Cx>\u002Fvue","; the React binding and components from ",[457,949,950],{},"...\u002F\u003Cx>\u002Freact",[457,952,540],{}," is ",[457,955,956],{},"media",[457,958,959],{},"mentions"," (framework-free only), ",[457,962,963],{},"transcript",[457,965,966],{},"authors",[457,968,969],{},"comments",[457,971,972],{},"composites",[457,974,975],{},"ai",[457,977,978],{},"collab",[457,980,981],{},"block-ui",[457,983,984],{},"themes",[451,986,665],{},[433,988,989,992,1096],{},[451,990,991],{},"Markdown string as the document",[451,993,994,468,997,468,1000,1003,1004,1007,1008,1011,1012,1015,1016,468,1019,1022,1023,1026,1027,468,1030,468,1033,468,1036,1039,1040,1043,1044,515,1047,1026,1050,1053,1054,848,1057,1043,1060,1063,1064,1067,1068,1067,1071,1074,1075,1077,1078,1081,1082,460,1085,1088,1089,1092,1093,730],{},[457,995,996],{},"splitFrontmatter",[457,998,999],{},"joinFrontmatter",[457,1001,1002],{},"markdownToContent(editor, body, { policy })"," → ",[457,1005,1006],{},"{ content, diagnostics }"," (raw HTML, unsafe URLs, unknown fences reported; ",[457,1009,1010],{},"OpaqueFence"," keeps unknown ",[457,1013,1014],{},"::: kind"," fences byte for byte), ",[457,1017,1018],{},"contentToMarkdown(editor)",[457,1020,1021],{},"MarkdownClipboard"," (paste\u002Fcopy as Markdown), ",[457,1024,1025],{},"createSourceMode({ getEditor })"," (",[457,1028,1029],{},"state",[457,1031,1032],{},"enter",[457,1034,1035],{},"edit",[457,1037,1038],{},"commit"," → false and editor untouched on a fatal diagnostic, ",[457,1041,1042],{},"cancel",") from ",[457,1045,1046],{},"...\u002Fmarkdown",[457,1048,1049],{},"MarkdownSurface",[457,1051,1052],{},"v-model"," string, YAML frontmatter kept verbatim, props ",[457,1055,1056],{},"policy",[457,1058,1059],{},"sourceMode",[457,1061,1062],{},"...\u002Fmarkdown\u002Fvue"," (React: ",[457,1065,1066],{},"value","\u002F",[457,1069,1070],{},"onChange",[457,1072,1073],{},"onDiagnostics",", prop ",[457,1076,1056],{},", no source view, from ",[457,1079,1080],{},"...\u002Fmarkdown\u002Freact","); GFM tables and task lists: ",[457,1083,1084],{},"tablesFeature()",[457,1086,1087],{},"...\u002Ftables"," (schema ",[457,1090,1091],{},"...\u002Ftables\u002Fschema",", CSS ",[457,1094,1095],{},"...\u002Fstyles\u002Ftables.css",[451,1097,1098,1099,468,1101,1103],{},"browser (",[457,1100,1046],{},[457,1102,1087],{}," also headless)",[433,1105,1106,1109,1202],{},[451,1107,1108],{},"Edit a code, YAML, JSON or text file",[451,1110,1111,460,1114,1026,1117,468,1119,468,1122,468,1125,1128,1129,468,1132,1134,1135,1026,1138,468,1140,468,1142,468,1145,1148,1149,468,1152,468,1155,468,1158,468,1161,468,1164,468,1167,468,1170,468,1173,460,1176,1179,1180,1183,1184,1186,1187,1190,1191,1194,1195,848,1198,1201],{},[457,1112,1113],{},"CodeSurface",[457,1115,1116],{},"...\u002Fcode\u002Fvue",[457,1118,1052],{},[457,1120,1121],{},"editable",[457,1123,1124],{},"language",[457,1126,1127],{},"wordWrap",", emits ",[457,1130,1131],{},"save",[457,1133,587],{},") or ",[457,1136,1137],{},"...\u002Fcode\u002Freact",[457,1139,1066],{},[457,1141,1070],{},[457,1143,1144],{},"onSave",[457,1146,1147],{},"onReady","); framework-free ",[457,1150,1151],{},"createCodeEditor",[457,1153,1154],{},"setReadOnly",[457,1156,1157],{},"setWordWrap",[457,1159,1160],{},"setLanguage",[457,1162,1163],{},"loadLanguage",[457,1165,1166],{},"setDocument",[457,1168,1169],{},"formatJsonInEditor",[457,1171,1172],{},"kindOf(path, mime?)",[457,1174,1175],{},"languageOf(path)",[457,1177,1178],{},"...\u002Fcode",". Language packs are yours: ",[457,1181,1182],{},"registerLanguage('yaml', async () => (await import('@codemirror\u002Flang-yaml')).yaml())"," once at startup, id from ",[457,1185,1175],{},". Theme = ",[457,1188,1189],{},"--sk-*"," tokens (",[457,1192,1193],{},"...\u002Fstyles\u002Ftokens.css","). Needs ",[457,1196,1197],{},"@codemirror\u002F{state,view,language,commands,search}",[457,1199,1200],{},"@lezer\u002Fhighlight"," installed (optional peers); no ProseMirror\u002FTipTap in the bundle",[451,1203,665],{},[433,1205,1206,1209,1262],{},[451,1207,1208],{},"One surface for Markdown and code files",[451,1210,1211,460,1214,1026,1217,468,1220,468,1222,1225,1226,1228,1229,468,1232,1235,1236,1026,1239,468,1241,468,1243,468,1245,468,1247,1250,1251,1254,1255,1067,1258,1261],{},[457,1212,1213],{},"DocumentSurface",[457,1215,1216],{},"...\u002Fdocument\u002Fvue",[457,1218,1219],{},"path",[457,1221,1052],{},[457,1223,1224],{},"markdown"," = props of ",[457,1227,1049],{}," incl. ",[457,1230,1231],{},"preset",[457,1233,1234],{},"binary"," slot) or ",[457,1237,1238],{},"...\u002Fdocument\u002Freact",[457,1240,1219],{},[457,1242,1066],{},[457,1244,1070],{},[457,1246,1224],{},[457,1248,1249],{},"binary(path)","); chooses by ",[457,1252,1253],{},"kindOf(path, mime)","; remount (",[457,1256,1257],{},":key",[457,1259,1260],{},"key"," = path) when the path changes. Reaches ProseMirror and CodeMirror both",[451,1263,665],{},[433,1265,1266,1269,1289],{},[451,1267,1268],{},"An integration (framework-free, works on both surfaces)",[451,1270,1271,468,1274,468,1277,460,1280,468,1283,468,1286],{},[457,1272,1273],{},"compositeMediaFeature",[457,1275,1276],{},"compositeAiFeature",[457,1278,1279],{},"transcriptAiFeature",[457,1281,1282],{},"...\u002Fintegrations\u002Fcomposite-media",[457,1284,1285],{},"\u002Fcomposite-ai",[457,1287,1288],{},"\u002Ftranscript-ai",[451,1290,665],{},[433,1292,1293,1296,1338],{},[451,1294,1295],{},"Heading outline, Document tree",[451,1297,1298,460,1301,545,1304,1026,1307,468,1310,460,1313,1316,1317,468,1320,460,1323,545,1326,515,1329,468,1332,460,1335],{},[457,1299,1300],{},"EditorOutline",[457,1302,1303],{},"...\u002Foutline\u002Fvue",[457,1305,1306],{},"...\u002Foutline\u002Freact",[457,1308,1309],{},"headingOutline",[457,1311,1312],{},"revealBlockInEditor",[457,1314,1315],{},"...\u002Foutline","); ",[457,1318,1319],{},"DocumentTree",[457,1321,1322],{},"useTreeView",[457,1324,1325],{},"...\u002Ftree\u002Fvue",[457,1327,1328],{},"...\u002Ftree\u002Freact",[457,1330,1331],{},"DocumentStore",[457,1333,1334],{},"createTreeView",[457,1336,1337],{},"...\u002Ftree",[451,1339,665],{},[433,1341,1342,1345,1362],{},[451,1343,1344],{},"Settings type, defaults, validation",[451,1346,1347,468,1350,468,1353,468,1356,460,1359],{},[457,1348,1349],{},"EditorSettings",[457,1351,1352],{},"EDITOR_SETTINGS_DEFAULTS",[457,1354,1355],{},"parseEditorSettings",[457,1357,1358],{},"editorSettingsSchema",[457,1360,1361],{},"...\u002Fsettings",[451,1363,1364],{},"anywhere",[433,1366,1367,1370,1402],{},[451,1368,1369],{},"ProseMirror schema for a server, validator or migration",[451,1371,1372,460,1375,515,1378,460,1381,1384,1385,1388,1389,468,1392,468,1395,1398,1399],{},[457,1373,1374],{},"simpleSchemaExtensions",[457,1376,1377],{},"...\u002Fschema\u002Fsimple",[457,1379,1380],{},"advancedSchemaExtensions",[457,1382,1383],{},"...\u002Fschema\u002Fadvanced","; per-feature ",[457,1386,1387],{},"...\u002F\u003Cname>\u002Fschema","; base ",[457,1390,1391],{},"coreSchemaExtensions",[457,1393,1394],{},"ROOT_ABILITIES",[457,1396,1397],{},"BlockId"," helpers from ",[457,1400,1401],{},"...\u002Fcore\u002Fschema",[451,1403,1404],{},"framework-free, Node-safe",[433,1406,1407,1410,1438],{},[451,1408,1409],{},"Nitro side: register the ports, forget a deleted document",[451,1411,1412,468,1415,1026,1418,468,1421,468,1424,468,1427,1043,1430,468,1433,460,1435],{},[457,1413,1414],{},"provideEditorServer",[457,1416,1417],{},"useEditorServer",[457,1419,1420],{},".forgetDocument",[457,1422,1423],{},".liveContent",[457,1425,1426],{},".enforceRateLimit",[457,1428,1429],{},".resolveModel",[457,1431,1432],{},"...\u002Fserver\u002Fnitro",[457,1434,471],{},[457,1436,1437],{},"...\u002Fserver",[451,1439,1440],{},"Nitro only",[433,1442,1443,1446,1475],{},[451,1444,1445],{},"Server without Nitro: collab server, AI models, rate limiter, route handlers, websocket listener",[451,1447,1448,468,1451,468,1454,460,1457,515,1459,468,1462,1465,1466,515,1469,460,1472],{},[457,1449,1450],{},"createCollabServer",[457,1452,1453],{},"createAiModels",[457,1455,1456],{},"createRateLimiter",[457,1458,1437],{},[457,1460,1461],{},"chatPost",[457,1463,1464],{},"usersGet",", … and their body schemas from ",[457,1467,1468],{},"...\u002Fserver\u002Fhandlers",[457,1470,1471],{},"listenCollab",[457,1473,1474],{},"...\u002Fserver\u002Fnode",[451,1476,1477],{},"any Node process",[433,1479,1480,1483,1495],{},[451,1481,1482],{},"Store documents as JSON files",[451,1484,1485,1488,1489,1491,1492],{},[457,1486,1487],{},"createJsonAdapter({ dir, authenticate?, authorize?, users? })"," (an ",[457,1490,471],{}," bundle) from ",[457,1493,1494],{},"@skaile\u002Fforge-editor\u002Fadapters\u002Fjson",[451,1496,1497],{},"Node",[433,1499,1500,1506,1517],{},[451,1501,1502,1503,730],{},"Store documents in SQLite via drizzle (optional peer ",[457,1504,1505],{},"drizzle-orm",[451,1507,1508,468,1511,460,1514],{},[457,1509,1510],{},"bootstrapEditorTables(db)",[457,1512,1513],{},"createDrizzleAdapter({ db, tables: editorTables() })",[457,1515,1516],{},"@skaile\u002Fforge-editor\u002Fadapters\u002Fdrizzle",[451,1518,1497],{},[433,1520,1521,1524,1532],{},[451,1522,1523],{},"Edit a host's Markdown files",[451,1525,1526,460,1529],{},[457,1527,1528],{},"createForgeAdapter({ content, state, schema, authenticate, … })",[457,1530,1531],{},"@skaile\u002Fforge-editor\u002Fadapters\u002Fforge",[451,1533,1497],{},[433,1535,1536,1539,1562],{},[451,1537,1538],{},"Mount the editor backend on Nitro (no Nuxt module)",[451,1540,1541,460,1544,1547,1548,1551,1552,1555,1556,1558,1559],{},[457,1542,1543],{},"installEditorServer(nitroApp, { ports, collab: {} | false, ai?, rateLimit? })",[457,1545,1546],{},"@skaile\u002Fforge-editor\u002Fserver\u002Fnitro"," (comments: ",[457,1549,1550],{},"ports.comments","), called from one Nitro plugin; needs ",[457,1553,1554],{},"experimental: { websocket: true }"," for ",[457,1557,978],{},"; peer ",[457,1560,1561],{},"h3",[451,1563,1440],{},[433,1565,1566,1569,1593],{},[451,1567,1568],{},"Bind an editor surface to a document",[451,1570,1571,1574,1575,1578,1579,1582,1583,460,1585,1588,1589,1592],{},[457,1572,1573],{},"useEditorDocument(id, { backend?, collaboration?: boolean | { token? }, user?, canComment? })"," → Vue: ",[457,1576,1577],{},"{ modelValue, ready, dirty, save, reload, error, collaboration, comments, editor, bind, dispose }"," refs from ",[457,1580,1581],{},"@skaile\u002Fforge-editor\u002Fadapters\u002Fvue","; React: the same as plain values plus ",[457,1584,1070],{},[457,1586,1587],{},"@skaile\u002Fforge-editor\u002Fadapters\u002Freact","; backend defaults to the editor context's (needs ",[457,1590,1591],{},"createHttpBackend()"," for collaboration and comments)",[451,1594,665],{},[433,1596,1597,1600,1642],{},[451,1598,1599],{},"Comment threads that survive edits",[451,1601,1602,1067,1605,1067,1608,460,1611,515,1614,460,1617,515,1620,460,1623,515,1626,460,1629,1632,1633,1636,1637,460,1639],{},[457,1603,1604],{},"captureAnchor",[457,1606,1607],{},"resolveAnchor",[457,1609,1610],{},"mapAnchor",[457,1612,1613],{},"...\u002Fanchors",[457,1615,1616],{},"createJsonCommentStore({ file })",[457,1618,1619],{},"...\u002Fcomments\u002Fjson",[457,1621,1622],{},"createDrizzleCommentStore({ db, tables: commentTables() })",[457,1624,1625],{},"...\u002Fcomments\u002Fdrizzle",[457,1627,1628],{},"handleCommentsRequest(store, { method, documentId, body })",[457,1630,1631],{},"...\u002Fcomments\u002Fserver","; the browser side is ",[457,1634,1635],{},"backend.comments(documentId, …)"," of ",[457,1638,1591],{},[457,1640,1641],{},"...\u002Fadapters\u002Fhttp",[451,1643,1644,1647],{},[457,1645,1646],{},"anchors",": browser (no UI framework); the others: Node",[433,1649,1650,1656,1664],{},[451,1651,1652,1653,730],{},"Nuxt module (config key ",[457,1654,1655],{},"tiptapEditor",[451,1657,1658,1660,1661],{},[457,1659,467],{}," in ",[457,1662,1663],{},"modules",[451,1665,1666],{},"build",[433,1668,1669,1672,1694],{},[451,1670,1671],{},"One config for module, server and client",[451,1673,1674,468,1677,468,1680,460,1683,1686,1687,468,1690,1693],{},[457,1675,1676],{},"defineEditorConfig(input)",[457,1678,1679],{},"serverConfig(config)",[457,1681,1682],{},"publicConfig(config)",[457,1684,1685],{},"...\u002Fconfig"," (defaults once; ",[457,1688,1689],{},"installEditorServer(nitroApp, { ports, ...serverConfig(config) })",[457,1691,1692],{},"createEditor({ ...publicConfig(config) })","; the Nuxt module options are its input)",[451,1695,1364],{},[433,1697,1698,1701,1741],{},[451,1699,1700],{},"CSS",[451,1702,1703,1706,1707,468,1710,468,1713,468,1716,468,1719,468,1722,468,1725,468,1728,468,1731,468,1734,468,1737,1740],{},[457,1704,1705],{},"...\u002Fstyles\u002Fcore.css"," (required) plus ",[457,1708,1709],{},"\u002Fmedia.css",[457,1711,1712],{},"\u002Fmentions.css",[457,1714,1715],{},"\u002Ftables.css",[457,1717,1718],{},"\u002Fauthors.css",[457,1720,1721],{},"\u002Fcomments.css",[457,1723,1724],{},"\u002Ftranscript.css",[457,1726,1727],{},"\u002Fcomposites.css",[457,1729,1730],{},"\u002Fai.css",[457,1732,1733],{},"\u002Fcollab.css",[457,1735,1736],{},"\u002Fblock-ui.css",[457,1738,1739],{},"\u002Fthemes.css"," for the features you use",[451,1742,665],{},[423,1744,1745],{},"Rules that follow from this table:",[1747,1748,1749,1829],"ul",{},[1750,1751,1752,1753,1756,1757,1760,1761,1764,1765,1767,1768,1770,1771,1773,1774,468,1777,468,1780,1782,1783,468,1785,468,1787,468,1789,468,1791,468,1793,468,1795,468,1797,468,1799,1802,1803,545,1805,1807,1808,1811,1812,1814,1815,848,1818,1821,1822,1825,1826,1828],"li",{},"Import values from the subpath that owns them. The root entry ",[457,1754,1755],{},"@skaile\u002Fforge-editor"," exports types only (",[457,1758,1759],{},"export type","), so ",[457,1762,1763],{},"import { createEditor } from '@skaile\u002Fforge-editor'"," does not compile; use ",[457,1766,771],{}," (Vue) or ",[457,1769,815],{}," (React). ",[457,1772,536],{}," contains no ",[457,1775,1776],{},"vue",[457,1778,1779],{},"@tiptap\u002Fvue-3",[457,1781,572],{}," or React module and no longer exports ",[457,1784,591],{},[457,1786,686],{},[457,1788,689],{},[457,1790,692],{},[457,1792,749],{},[457,1794,760],{},[457,1796,763],{},[457,1798,766],{},[457,1800,1801],{},"useEditorContext",": those come from ",[457,1804,544],{},[457,1806,548],{},". Feature entries follow the same rule: ",[457,1809,1810],{},"\u002F\u003Cx>"," is framework-free, the components and the ",[457,1813,942],{}," binding live in ",[457,1816,1817],{},"\u002F\u003Cx>\u002Fvue",[457,1819,1820],{},"\u002F\u003Cx>\u002Freact",". A React preset is ",[457,1823,1824],{},"defineEditor({ features: [coreContentFeature(), coreUiFeature(), mentionsFeature(), ...] })"," with factories from ",[457,1827,1820],{},"; features with Vue components are not assignable to it.",[1750,1830,1831,1832,545,1834,1837,1838,1067,1841,1067,1844,1847,1848,468,1851,468,1854,468,1857,1860],{},"Never import a browser entry from server code, and never import ",[457,1833,554],{},[457,1835,1836],{},"\u002Fnuxt"," from browser code. Servers use the framework-free ",[457,1839,1840],{},"schema",[457,1842,1843],{},"protocol",[457,1845,1846],{},"types"," entries (",[457,1849,1850],{},"\u002Fai\u002Fprotocol",[457,1852,1853],{},"\u002Fintegrations\u002Ftranscript-ai\u002Fprotocol",[457,1855,1856],{},"\u002Ftree\u002Ftypes",[457,1858,1859],{},"\u002Fsettings",").",[418,1862,1864],{"id":1863},"after-the-change","After the change",[423,1866,1867,1868,1871,1872,621],{},"Check the ",[476,1869,1870],{"href":404},"invariants"," and run the ",[476,1873,1874],{"href":409},"verification commands",{"title":1876,"searchDepth":1877,"depth":1877,"links":1878},"",2,[1879,1880,1881,1882],{"id":420,"depth":1877,"text":421},{"id":603,"depth":1877,"text":604},{"id":624,"depth":1877,"text":625},{"id":1863,"depth":1877,"text":1864},"Agent playbook for adding @skaile\u002Fforge-editor to an app: choose the surface, then the entry to import, then follow the matching setup page.","md",null,{},{"icon":198},{"title":395,"description":1883},"Fap9cNirSS73xy7pdgeDCY07CTTPRJpw421HpNBrOhw",[1891,1893],{"title":392,"path":388,"stem":389,"description":1892,"icon":393,"children":-1},"Machine entry points of this site (llms.txt, markdown twins, sitemap, installable Agent Skill) and where an agent starts.",{"title":399,"path":400,"stem":401,"description":1894,"icon":68,"children":-1},"Agent playbook for adding an own block or feature to @skaile\u002Fforge-editor: an ordered checklist where each step links to the tutorial chapter that shows it.",1793213910271]