[{"data":1,"prerenderedAt":1010},["ShallowReactive",2],{"navigation_docs":3,"-ai-agents-invariants":412,"-ai-agents-invariants-surround":1005},[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":403,"body":414,"description":998,"extension":999,"links":1000,"meta":1001,"navigation":1002,"path":404,"seo":1003,"stem":405,"__hash__":1004},"docs\u002F5.ai-agents\u002F4.invariants.md",{"type":415,"value":416,"toc":994},"minimark",[417,421],[418,419,420],"p",{},"Check this list before and after every change to an integration. Each bullet is a failure that does not announce itself at compile time.",[422,423,424,449,477,514,534,547,600,613,636,671,698,711,794,804,862,878],"ul",{},[425,426,427,431,432,436,437,440,441,444,445,448],"li",{},[428,429,430],"strong",{},"CSS order."," ",[433,434,435],"code",{},"core.css"," after Tailwind and Nuxt UI, feature sheets after it, ",[433,438,439],{},"themes.css"," last, and ",[433,442,443],{},"@source"," so Tailwind sees the library. The exact order per host is in ",[446,447,361],"a",{"href":362},".",[425,450,451,431,454,457,458,457,461,464,465,468,469,472,473,476],{},[428,452,453],{},"Editor context is mandatory.",[433,455,456],{},"EditorSurface",", ",[433,459,460],{},"SimpleEditor",[433,462,463],{},"AdvancedEditor"," and ",[433,466,467],{},"EditorToolbar"," throw without ",[433,470,471],{},"app.use(createEditor())"," (the Nuxt module does this in its client plugin); the React components throw without ",[433,474,475],{},"\u003CEditorContextProvider context={createEditorContext()}>",", and the React host owns (disposes) that context.",[425,478,479,482,483,486,487,490,491,457,494,497,498,501,502,505,506,509,510,513],{},[428,480,481],{},"Notices."," Features send user-facing messages through ",[433,484,485],{},"ctx.notify"," \u002F the context's ",[433,488,489],{},"notify"," (",[433,492,493],{},"Notifier",[433,495,496],{},"silentNotifier"," drops them). Vue: the queued notifier hands them to Nuxt UI toasts once a surface mounted (needs ",[433,499,500],{},"\u003CUApp>","). React: pass ",[433,503,504],{},"createEditorContext({ notify: reactNotifier })"," and mount sonner's ",[433,507,508],{},"\u003CToaster \u002F>"," (exported by ",[433,511,512],{},"\u002Freact",") once; without it no notice is visible.",[425,515,516,519,520,522,523,490,526,529,530,533],{},[428,517,518],{},"UI provider."," Wrap the page in ",[433,521,500],{},"; plain Vue also needs ",[433,524,525],{},"app.use(ui)",[433,527,528],{},"@nuxt\u002Fui\u002Fvue-plugin",") and the ",[433,531,532],{},"ui({ router: false })"," Vite plugin.",[425,535,536,539,540,543,544,448],{},[428,537,538],{},"SSR."," Editors are client-only. Nuxt apps in this repository run ",[433,541,542],{},"ssr: false","; with SSR enabled wrap editors in ",[433,545,546],{},"\u003CClientOnly>",[425,548,549,552,553,457,556,457,559,457,562,457,565,457,568,457,571,457,574,457,577,580,581,584,585,457,588,591,592,595,596,599],{},[428,550,551],{},"Mount-time props."," The preset (schema, features), ",[433,554,555],{},"collaboration",[433,557,558],{},"abilities",[433,560,561],{},"extensions",[433,563,564],{},"commands",[433,566,567],{},"blockActions",[433,569,570],{},"blockTypes",[433,572,573],{},"blockUi",[433,575,576],{},"coreContent",[433,578,579],{},"documentId"," are read once at setup. Change them by remounting with a new ",[433,582,583],{},"key",". ",[433,586,587],{},"editable",[433,589,590],{},"metadata"," and the model stay reactive. Build presets in ",[433,593,594],{},"\u003Cscript setup>"," (Vue) or a component\u002F",[433,597,598],{},"useMemo"," (React), not on every render.",[425,601,602,605,606,457,608,464,610,612],{},[428,603,604],{},"Stable props."," Pass ",[433,607,590],{},[433,609,558],{},[433,611,561],{}," as constants; a new object per render replaces the lists each time.",[425,614,615,618,619,622,623,625,626,629,630,633,634,448],{},[428,616,617],{},"Schema match."," A simple editor rejects advanced JSON through the ",[433,620,621],{},"contentError"," event (the last valid document stays). ",[433,624,555],{}," needs a preset containing ",[433,627,628],{},"collab","; ",[433,631,632],{},"commentsFeature()"," needs ",[433,635,628],{},[425,637,638,431,641,644,645,648,649,457,651,653,654,644,657,660,661,664,665,668,669,448],{},[428,639,640],{},"Bundle isolation.",[433,642,643],{},"core","\u002F",[433,646,647],{},"settings"," import no feature; a feature imports ",[433,650,643],{},[433,652,647],{}," and its own ",[433,655,656],{},"schema",[433,658,659],{},"protocol",", never another feature; integrations import only the features they connect; the ",[433,662,663],{},"simple"," bundle contains no feature code, Yjs, AI SDK, Nuxt or server modules. Keep it that way when adding code, and prove it with ",[433,666,667],{},"check:editor-entries",". Rules: ",[446,670,369],{"href":370},[425,672,673,676,677,457,680,457,683,457,686,689,690,693,694,697],{},[428,674,675],{},"Entries."," Server code imports only framework-free entries (",[433,678,679],{},"\u002Fschema",[433,681,682],{},"\u002Fprotocol",[433,684,685],{},"\u002Ftypes",[433,687,688],{},"\u002Fsettings",") or ",[433,691,692],{},"\u002Fserver",". A new public entry needs an explicit ",[433,695,696],{},"package.json#exports"," row; there is no wildcard.",[425,699,700,431,703,706,707,710],{},[428,701,702],{},"Icons.",[433,704,705],{},"i-lucide-*"," names resolve at build time inside the Vite root; a workspace library lies outside it. Bundle them (see ",[433,708,709],{},"examples\u002Fvue-simple\u002Fvite.config.ts",") to avoid Iconify API requests at runtime.",[425,712,713,716,717,720,721,457,724,726,727,730,731,733,734,737,738,629,741,744,745,748,749,752,753,756,757,760,761,763,764,457,766,457,768,464,770,772,773,756,776,779,780,783,784,786,787,789,790,464,792,448],{},[428,714,715],{},"React hosts."," CSS: Tailwind, ",[433,718,719],{},"tw-animate-css",", then either ",[433,722,723],{},"...\u002Freact\u002Fstyles\u002Fui-vars.css",[433,725,435],{}," and the feature sheets, or for the advanced editor the single ",[433,728,729],{},"...\u002Freact\u002Fstyles\u002Fadvanced.css","; the shadcn theme block, and ",[433,732,443],{}," to the whole ",[433,735,736],{},"dist"," of the package (",[433,739,740],{},"node_modules\u002F@skaile\u002Fforge-editor\u002Fdist",[433,742,743],{},"packages\u002Feditor\u002Fsrc"," in this repository), never just ",[433,746,747],{},"react",": the Features' components are in ",[433,750,751],{},"features\u002F*\u002Freact","; icons: ",[433,754,755],{},"addCollection(lucide)"," from ",[433,758,759],{},"@iconify\u002Freact"," before rendering; ",[433,762,508],{}," for notices. The preset, ",[433,765,590],{},[433,767,558],{},[433,769,561],{},[433,771,564],{}," are mount-time: keep them module constants (new objects per render replace the lists). ",[433,774,775],{},"editor",[433,777,778],{},"onReady"," goes in ",[433,781,782],{},"useState",", and ",[433,785,467],{}," takes it as ",[433,788,775],{},". Examples: ",[446,791,29],{"href":30},[446,793,127],{"href":128},[425,795,796,799,800,803],{},[428,797,798],{},"Settings keys."," Only keys of ",[433,801,802],{},"EditorSettings"," persist; unknown ones are dropped on read and write.",[425,805,806,431,809,812,813,816,817,457,820,457,823,457,826,457,829,457,832,457,835,457,838,457,841,457,844,457,847,850,851,854,855,858,859,861],{},[428,807,808],{},"Design tokens.",[433,810,811],{},"@skaile\u002Fforge-editor\u002Fstyles\u002Ftokens.css"," declares the shared ",[433,814,815],{},"--sk-*"," variables (",[433,818,819],{},"--sk-bg",[433,821,822],{},"--sk-fg",[433,824,825],{},"--sk-muted",[433,827,828],{},"--sk-border",[433,830,831],{},"--sk-primary",[433,833,834],{},"--sk-primary-fg",[433,836,837],{},"--sk-success",[433,839,840],{},"--sk-warning",[433,842,843],{},"--sk-danger",[433,845,846],{},"--sk-radius",[433,848,849],{},"--sk-font",") under ",[433,852,853],{},":where(:root)"," (dark values under ",[433,856,857],{},":where(.dark)","). Later UI work in this package reads ",[433,860,815],{},"; map them once in the host.",[425,863,864,431,867,870,871,874,875,448],{},[428,865,866],{},"Module order.",[433,868,869],{},"@nuxt\u002Fui"," before ",[433,872,873],{},"@skaile\u002Fforge-editor\u002Fnuxt"," in ",[433,876,877],{},"modules",[425,879,880,883,884,457,887,457,890,464,893,896,897,900,901,904,905,908,909,457,912,915,916,919,920,464,923,926,927,930,931,934,935,644,938,941,942,945,946,644,948,490,951,954,955,958,959,629,962,965,966,464,969,972,973,464,976,979,980,972,983,986,987,490,990,993],{},[428,881,882],{},"Adapters tier."," Entries under ",[433,885,886],{},"adapters\u002F",[433,888,889],{},"anchors",[433,891,892],{},"comments\u002F{server,json,drizzle,client}",[433,894,895],{},"server\u002Fnitro"," supply storage and wiring; they import no application code. Vue is reachable only from ",[433,898,899],{},".\u002Fadapters\u002Fvue",", React only from ",[433,902,903],{},".\u002Fadapters\u002Freact"," (and the framework layers), Nitro (",[433,906,907],{},"h3",") only from ",[433,910,911],{},".\u002Fserver\u002Fnitro",[433,913,914],{},"drizzle-orm"," only from the two drizzle entries; ",[433,917,918],{},".\u002Fadapters"," is types only. ",[433,921,922],{},".\u002Fserver\u002Fnest",[433,924,925],{},".\u002Fadapters\u002Fprisma"," are reserved and not exported. The Nitro host and the HTTP backend (",[433,928,929],{},"createHttpBackend",", which ",[433,932,933],{},"useEditorDocument"," reads documents, collaboration and comments through) speak one wire contract: ",[433,936,937],{},"GET",[433,939,940],{},"PUT \u002Fapi\u002Feditor\u002Fdocuments\u002F:id"," (TipTap JSON, 404 = missing, ",[433,943,944],{},"PUT"," 204 and only for adapters that manage documents), ",[433,947,937],{},[433,949,950],{},"POST \u002Fapi\u002Feditor\u002Fcomments\u002F:id",[433,952,953],{},"handleCommentsRequest",", which trusts its caller), ",[433,956,957],{},"\u002Fcollab\u002F:id"," (Hocuspocus). Every route authenticates through ",[433,960,961],{},"ports.identity.authenticate({ headers, token })",[433,963,964],{},"null"," answers 401; the default outside production is an anonymous dev user, in production nobody. The JSON and forge adapters and the JSON comment store are single-node. Mount the surface with ",[433,967,968],{},":key=\"id\"",[433,970,971],{},"v-if=\"doc.ready.value\""," (React: ",[433,974,975],{},"key={id}",[433,977,978],{},"doc.ready","), bind with ",[433,981,982],{},"v-bind=\"doc.bind.value\"",[433,984,985],{},"{...doc.bind}","). Runnable reference: ",[433,988,989],{},"examples\u002Fvue-nitro-json",[433,991,992],{},"bun run proto:vue-nitro-json",", port 3046).",{"title":995,"searchDepth":996,"depth":996,"links":997},"",2,[],"Rules that must stay true when integrating or changing @skaile\u002Fforge-editor: CSS order, mandatory context, SSR, mount-time props, bundle isolation, entries.","md",null,{},{"icon":406},{"title":403,"description":998},"-t-SUK08CytxVaaCwFJQxqg20sJqdJnFz5-dOoUtCvU",[1006,1008],{"title":399,"path":400,"stem":401,"description":1007,"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.",{"title":408,"path":409,"stem":410,"description":1009,"icon":411,"children":-1},"Which checks an agent runs after changing an @skaile\u002Fforge-editor integration or the package itself.",1793178239439]