[{"data":1,"prerenderedAt":1309},["ShallowReactive",2],{"navigation_docs":3,"-guides-settings":412,"-guides-settings-surround":1304},[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":317,"body":414,"description":1297,"extension":1298,"links":1299,"meta":1300,"navigation":1301,"path":318,"seo":1302,"stem":319,"__hash__":1303},"docs\u002F3.guides\u002F8.settings.md",{"type":415,"value":416,"toc":1289},"minimark",[417,422,512,516,578,582,613,670,674,700,704,756,790,1186,1189,1285],[418,419,421],"h2",{"id":420},"one-settings-object-per-app","One settings object per app",[423,424,425,429,430,433,434,437,438,433,441,444,445,448,449,452,453,452,456,452,459,462,463,466,467,470,471,474,475,452,478,452,481,484,485,488,489,429,492,495,496,499,500,503,504,507,508,511],"p",{},[426,427,428],"code",{},"app.use(createEditor())"," (",[426,431,432],{},"createEditor"," from ",[426,435,436],{},"@skaile\u002Fforge-editor\u002Fvue","; the Nuxt module does it in a client plugin) provides the context; it wraps the framework-free ",[426,439,440],{},"createEditorContext()",[426,442,443],{},"\u002Fcore",", whose ",[426,446,447],{},"settings"," is a store (",[426,450,451],{},"get",", ",[426,454,455],{},"set",[426,457,458],{},"update",[426,460,461],{},"subscribe","). The settings are one versioned JSON object (",[426,464,465],{},"EditorSettings",", version 2) that every editor, panel and tree of the app shares. A simple editor and a preset without a feature never prune the settings of features it does not install; unknown-to-this-bundle values stay in the stored JSON. ",[426,468,469],{},"createEditor()"," defaults the app's notifier to a queued Vue notifier; pass ",[426,472,473],{},"notify"," to replace it. The object has the sections ",[426,476,477],{},"editing",[426,479,480],{},"ai",[426,482,483],{},"blocks"," and ",[426,486,487],{},"appearance",". Read and edit it with ",[426,490,491],{},"useEditorSettings()",[426,493,494],{},"\u002Fvue"," or ",[426,497,498],{},"\u002Freact","); in features use the ",[426,501,502],{},"ctx.settings"," store. Validate with ",[426,505,506],{},"parseEditorSettings"," (drops unknown keys, replaces invalid values) or ",[426,509,510],{},"editorSettingsSchema",".",[418,513,515],{"id":514},"react","React",[423,517,518,429,521,452,524,484,527,433,530,452,533,433,536,538,539,542,543,545,546,549,550,552,553,556,557,559,560,452,562,565,566,569,570,573,574,577],{},[426,519,520],{},"\u003CEditorContextProvider context={createEditorContext({ notify: reactNotifier })}>",[426,522,523],{},"EditorContextProvider",[426,525,526],{},"reactNotifier",[426,528,529],{},"Toaster",[426,531,532],{},"@skaile\u002Fforge-editor\u002Freact",[426,534,535],{},"createEditorContext",[426,537,443],{},") provides the same context to a React tree. The host creates it and owns it: the provider never disposes it, call ",[426,540,541],{},"context.dispose()"," when it outlives the app. ",[426,544,491],{}," returns ",[426,547,548],{},"{ settings, update, set, ready, synced }",". Without ",[426,551,473],{}," the context drops app-level notices (",[426,554,555],{},"silentNotifier","). ",[426,558,447],{}," is the current ",[426,561,465],{},[426,563,564],{},"update(draft => { … })"," mutates a copy and stores it, and ",[426,567,568],{},"set(value)"," replaces it. ",[426,571,572],{},"useStore(store)"," subscribes a component to any ",[426,575,576],{},"ReadonlyStore"," of the core.",[418,579,581],{"id":580},"local-storage-and-account-sync","Local storage and account sync",[423,583,584,585,429,588,591,592,595,596,598,599,604,605,608,609,612],{},"The settings are read from ",[426,586,587],{},"localStorage",[426,589,590],{},"tiptap-editor:settings",") at install time and written back on every change; unreadable or blocked storage falls back to the defaults for the session. A record saved by an earlier version is migrated when it is read (",[426,593,594],{},"migrateEditorSettings",", applied by ",[426,597,506],{},") and written back once: version 2 renamed keys (see the ",[600,601,603],"a",{"href":602},"\u002Fguides\u002Fmigration#persisted-names","migration guide","). The server migrates a stored older record on ",[426,606,607],{},"GET \u002Fapi\u002Feditor\u002Fsettings"," and stores it again, and ",[426,610,611],{},"PUT"," accepts a body of an older version (a tab that was open during the update).",[423,614,615,616,618,619,622,623,626,627,629,630,633,634,636,637,640,641,429,644,647,648,452,651,654,655,658,659,662,663,666,667,669],{},"A backend that offers ",[426,617,447],{}," (the default backend and ",[426,620,621],{},"createHttpBackend()"," do; ",[426,624,625],{},"createMemoryBackend()"," keeps settings in memory only) syncs per account. On the first ",[426,628,491],{}," the client calls ",[426,631,632],{},"backend.settings.load()"," (the HTTP backend: ",[426,635,607],{},"; only once an editor-side component needs the settings, not at install time): the stored settings replace the local values (",[426,638,639],{},"synced","), ",[426,642,643],{},"null",[426,645,646],{},"204",": the adapter keeps none), a refusal (",[426,649,650],{},"401",[426,652,653],{},"501",") and network errors keep the local ones; an account without stored settings uploads this browser's. Afterwards every change is sent with ",[426,656,657],{},"backend.settings.save()"," (debounced, 500 ms). The status codes are listed in ",[600,660,248],{"href":661},"\u002Fguides\u002Froutes-and-auth#settings-route-status-codes",". A plain-Vue or React app gets this from the default backend only when its server implements the same two endpoints (",[426,664,665],{},"examples\u002Freact-advanced"," reaches the Nuxt host's through its proxy), otherwise it passes ",[426,668,625],{}," and stays local.",[418,671,673],{"id":672},"view-state-of-the-tree","View state of the tree",[423,675,676,677,680,681,684,685,688,689,484,692,695,696,699],{},"The tree's filters and expanded keys are the framework-free ",[426,678,679],{},"TreeViewModel"," of the app's context (",[426,682,683],{},"treeView(context)","); ",[426,686,687],{},"useTreeView()"," of ",[426,690,691],{},"\u002Ftree\u002Fvue",[426,693,694],{},"\u002Ftree\u002Freact"," returns them. Filters persist (",[426,697,698],{},"tip-tree:node-filters","), expansion lasts for the session. The model belongs to the app context (cached per context, nothing is global to the process), and a model that is dropped takes its subscription with it.",[418,701,703],{"id":702},"settings-ui","Settings UI",[423,705,706,707,710,711,452,713,452,715,452,718,452,721,710,724,726,727,730,731,452,734,452,737,740,741,730,744,452,746,452,749,751,752,755],{},"Tabs come from the features of a preset (",[426,708,709],{},"composites"," ",[426,712,477],{},[426,714,480],{},[426,716,717],{},"authors",[426,719,720],{},"comments",[426,722,723],{},"themes",[426,725,487],{},"); the simple editor has none. ",[426,728,729],{},"EditorSettingsPanel"," (props ",[426,732,733],{},"editor",[426,735,736],{},"contentClass?",[426,738,739],{},"v-model:tab",") places the tabs anywhere; ",[426,742,743],{},"EditorSettingsModal",[426,745,733],{},[426,747,748],{},"v-model:open",[426,750,739],{},") is the same panel in a fixed-width (",[426,753,754],{},"42rem",") popup with a blurred backdrop. Both render nothing when the editor's preset has no tab.",[423,757,758,759,762,763,484,766,769,770,773,774,777,778,781,782,495,784,786,787,789],{},"The ",[426,760,761],{},"settingsUi"," prop of ",[426,764,765],{},"EditorSurface",[426,767,768],{},"AdvancedEditor"," takes two values: ",[426,771,772],{},"'internal'"," (default) mounts the modal inside the surface and the toolbar's settings entry opens it. ",[426,775,776],{},"'external'"," mounts nothing and emits ",[426,779,780],{},"settingsOpen(tab?)","; the host then shows its own ",[426,783,729],{},[426,785,743],{}," for the same ",[426,788,733],{},":",[791,792,797],"pre",{"className":793,"code":794,"language":795,"meta":796,"style":796},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { EditorSettingsModal } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport type { Editor } from '@tiptap\u002Fvue-3'\nimport { ref, shallowRef } from 'vue'\n\nconst editor = shallowRef\u003CEditor>()\nconst open = ref(false)\nconst tab = ref\u003Cstring>()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CAdvancedEditor settings-ui=\"external\" @ready=\"editor = $event\" @settings-open=\"(t) => { tab = t; open = true }\" \u002F>\n  \u003CEditorSettingsModal v-model:open=\"open\" v-model:tab=\"tab\" :editor=\"editor\" \u002F>\n\u003C\u002Ftemplate>\n","vue","",[426,798,799,834,862,883,907,933,940,966,988,1009,1019,1024,1034,1124,1177],{"__ignoreMap":796},[800,801,804,808,812,816,819,822,825,829,831],"span",{"class":802,"line":803},"line",1,[800,805,807],{"class":806},"sMK4o","\u003C",[800,809,811],{"class":810},"swJcz","script",[800,813,815],{"class":814},"spNyl"," setup",[800,817,818],{"class":814}," lang",[800,820,821],{"class":806},"=",[800,823,824],{"class":806},"\"",[800,826,828],{"class":827},"sfazB","ts",[800,830,824],{"class":806},[800,832,833],{"class":806},">\n",[800,835,837,841,844,848,851,854,857,859],{"class":802,"line":836},2,[800,838,840],{"class":839},"s7zQu","import",[800,842,843],{"class":806}," {",[800,845,847],{"class":846},"sTEyZ"," EditorSettingsModal",[800,849,850],{"class":806}," }",[800,852,853],{"class":839}," from",[800,855,856],{"class":806}," '",[800,858,436],{"class":827},[800,860,861],{"class":806},"'\n",[800,863,865,867,869,872,874,876,878,881],{"class":802,"line":864},3,[800,866,840],{"class":839},[800,868,843],{"class":806},[800,870,871],{"class":846}," AdvancedEditor",[800,873,850],{"class":806},[800,875,853],{"class":839},[800,877,856],{"class":806},[800,879,880],{"class":827},"@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced",[800,882,861],{"class":806},[800,884,886,888,891,893,896,898,900,902,905],{"class":802,"line":885},4,[800,887,840],{"class":839},[800,889,890],{"class":839}," type",[800,892,843],{"class":806},[800,894,895],{"class":846}," Editor",[800,897,850],{"class":806},[800,899,853],{"class":839},[800,901,856],{"class":806},[800,903,904],{"class":827},"@tiptap\u002Fvue-3",[800,906,861],{"class":806},[800,908,910,912,914,917,920,923,925,927,929,931],{"class":802,"line":909},5,[800,911,840],{"class":839},[800,913,843],{"class":806},[800,915,916],{"class":846}," ref",[800,918,919],{"class":806},",",[800,921,922],{"class":846}," shallowRef",[800,924,850],{"class":806},[800,926,853],{"class":839},[800,928,856],{"class":806},[800,930,795],{"class":827},[800,932,861],{"class":806},[800,934,936],{"class":802,"line":935},6,[800,937,939],{"emptyLinePlaceholder":938},true,"\n",[800,941,943,946,949,951,954,956,960,963],{"class":802,"line":942},7,[800,944,945],{"class":814},"const",[800,947,948],{"class":846}," editor ",[800,950,821],{"class":806},[800,952,922],{"class":953},"s2Zo4",[800,955,807],{"class":806},[800,957,959],{"class":958},"sBMFI","Editor",[800,961,962],{"class":806},">",[800,964,965],{"class":846},"()\n",[800,967,969,971,974,976,978,981,985],{"class":802,"line":968},8,[800,970,945],{"class":814},[800,972,973],{"class":846}," open ",[800,975,821],{"class":806},[800,977,916],{"class":953},[800,979,980],{"class":846},"(",[800,982,984],{"class":983},"sfNiH","false",[800,986,987],{"class":846},")\n",[800,989,991,993,996,998,1000,1002,1005,1007],{"class":802,"line":990},9,[800,992,945],{"class":814},[800,994,995],{"class":846}," tab ",[800,997,821],{"class":806},[800,999,916],{"class":953},[800,1001,807],{"class":806},[800,1003,1004],{"class":958},"string",[800,1006,962],{"class":806},[800,1008,965],{"class":846},[800,1010,1012,1015,1017],{"class":802,"line":1011},10,[800,1013,1014],{"class":806},"\u003C\u002F",[800,1016,811],{"class":810},[800,1018,833],{"class":806},[800,1020,1022],{"class":802,"line":1021},11,[800,1023,939],{"emptyLinePlaceholder":938},[800,1025,1027,1029,1032],{"class":802,"line":1026},12,[800,1028,807],{"class":806},[800,1030,1031],{"class":810},"template",[800,1033,833],{"class":806},[800,1035,1037,1040,1042,1045,1047,1049,1052,1054,1057,1060,1062,1064,1066,1069,1072,1074,1076,1079,1081,1083,1085,1089,1092,1095,1097,1100,1103,1106,1109,1112,1114,1117,1119,1121],{"class":802,"line":1036},13,[800,1038,1039],{"class":806},"  \u003C",[800,1041,768],{"class":810},[800,1043,1044],{"class":814}," settings-ui",[800,1046,821],{"class":806},[800,1048,824],{"class":806},[800,1050,1051],{"class":827},"external",[800,1053,824],{"class":806},[800,1055,1056],{"class":806}," @",[800,1058,1059],{"class":814},"ready",[800,1061,821],{"class":806},[800,1063,824],{"class":806},[800,1065,733],{"class":846},[800,1067,1068],{"class":806}," = ",[800,1070,1071],{"class":846},"$event",[800,1073,824],{"class":806},[800,1075,1056],{"class":806},[800,1077,1078],{"class":814},"settings-open",[800,1080,821],{"class":806},[800,1082,824],{"class":806},[800,1084,980],{"class":806},[800,1086,1088],{"class":1087},"sHdIc","t",[800,1090,1091],{"class":806},") ",[800,1093,1094],{"class":814},"=>",[800,1096,843],{"class":806},[800,1098,1099],{"class":846}," tab",[800,1101,1102],{"class":806}," =",[800,1104,1105],{"class":846}," t",[800,1107,1108],{"class":806},";",[800,1110,1111],{"class":846}," open",[800,1113,1102],{"class":806},[800,1115,1116],{"class":983}," true",[800,1118,850],{"class":806},[800,1120,824],{"class":806},[800,1122,1123],{"class":806}," \u002F>\n",[800,1125,1127,1129,1131,1134,1136,1139,1141,1143,1145,1147,1149,1151,1154,1156,1158,1160,1162,1165,1167,1169,1171,1173,1175],{"class":802,"line":1126},14,[800,1128,1039],{"class":806},[800,1130,743],{"class":810},[800,1132,1133],{"class":814}," v-model",[800,1135,789],{"class":806},[800,1137,1138],{"class":814},"open",[800,1140,821],{"class":806},[800,1142,824],{"class":806},[800,1144,1138],{"class":846},[800,1146,824],{"class":806},[800,1148,1133],{"class":814},[800,1150,789],{"class":806},[800,1152,1153],{"class":814},"tab",[800,1155,821],{"class":806},[800,1157,824],{"class":806},[800,1159,1153],{"class":846},[800,1161,824],{"class":806},[800,1163,1164],{"class":806}," :",[800,1166,733],{"class":814},[800,1168,821],{"class":806},[800,1170,824],{"class":806},[800,1172,733],{"class":846},[800,1174,824],{"class":806},[800,1176,1123],{"class":806},[800,1178,1180,1182,1184],{"class":802,"line":1179},15,[800,1181,1014],{"class":806},[800,1183,1031],{"class":810},[800,1185,833],{"class":806},[418,1187,1188],{"id":723},"Themes",[423,1190,1191,1194,1195,1198,1199,429,1202,1204,1205,1208,1209,1212,1213,1216,1217,1220,1221,1224,1225,1228,1229,1232,1233,1236,1237,1240,1241,1244,1245,1249,1250,1228,1253,1256,1257,1260,1261,452,1264,452,1267,452,1270,452,1273,452,1276,452,1279,1282,1283,511],{},[426,1192,1193],{},"themesFeature()"," (part of ",[426,1196,1197],{},"advancedEditor()"," on both surfaces): the setting ",[426,1200,1201],{},"appearance.theme",[426,1203,643],{}," = Default appearance, which applies no Theme) names an Obsidian theme served by ",[426,1206,1207],{},"GET \u002Fapi\u002Feditor\u002Fthemes\u002F:id","; users pick it in the settings tab „Theme“. The feature's ",[426,1210,1211],{},"setup"," hook starts one runtime per app as soon as the first surface mounts (reference-counted, released by the teardown: on Vue it lives until the Vue app unmounts, on React until the last surface that started it unmounts), injects the scoped CSS as ",[426,1214,1215],{},"\u003Cstyle data-tiptap-theme>"," and sets ",[426,1218,1219],{},"obsidian-theme theme-dark|theme-light"," on ",[426,1222,1223],{},"\u003Chtml>"," (following ",[426,1226,1227],{},"html.dark","\u002F",[426,1230,1231],{},"html.light",", else the system preference). ",[426,1234,1235],{},"styles\u002Fthemes.css"," bridges Obsidian variables onto every ",[426,1238,1239],{},"--ui-*"," token (React: ",[426,1242,1243],{},"react\u002Fstyles\u002Fthemes-bridge.css"," onto the shadcn tokens), so the ",[1246,1247,1248],"strong",{},"whole site"," is themed, not only the editor. Needs an adapter with ",[426,1251,1252],{},"listThemes",[426,1254,1255],{},"loadTheme",". Builtin themes in this repository (",[426,1258,1259],{},"server\u002Fthemes\u002F\u003Cid>\u002F","): ",[426,1262,1263],{},"nord",[426,1265,1266],{},"things",[426,1268,1269],{},"minimal",[426,1271,1272],{},"catppuccin",[426,1274,1275],{},"border",[426,1277,1278],{},"blue-topaz",[426,1280,1281],{},"tokyo-night",". Details, mapping table and limits: ",[600,1284,1188],{"href":105},[1286,1287,1288],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":796,"searchDepth":836,"depth":836,"links":1290},[1291,1292,1293,1294,1295,1296],{"id":420,"depth":836,"text":421},{"id":514,"depth":836,"text":515},{"id":580,"depth":836,"text":581},{"id":672,"depth":836,"text":673},{"id":702,"depth":836,"text":703},{"id":723,"depth":836,"text":1188},"The versioned EditorSettings object every editor of an app shares: local storage, per-account sync, the settings UI, the settingsUi prop and themes.","md",null,{},{"icon":320},{"title":317,"description":1297},"JFGZvw8IElmviCma9B24J7Mr3X1P6E2XjMgb451CNPo",[1305,1307],{"title":312,"path":313,"stem":314,"description":1306,"icon":315,"children":-1},"Add the drag handle, hover targeting, block actions and block-range selection with blockUiFeature().",{"title":322,"path":323,"stem":324,"description":1308,"icon":325,"children":-1},"Choose the editor language once per app, override single messages, and keep user-facing strings in the German and English catalogs.",1793178237029]