[{"data":1,"prerenderedAt":1098},["ShallowReactive",2],{"navigation_docs":3,"-guides-authors-and-comments":412,"-guides-authors-and-comments-surround":1093},[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":99,"body":414,"description":1086,"extension":1087,"links":1088,"meta":1089,"navigation":1090,"path":100,"seo":1091,"stem":101,"__hash__":1092},"docs\u002F3.guides\u002F11.authors-and-comments.md",{"type":415,"value":416,"toc":1084},"minimark",[417,472,626,641,650,695,711,907,1028,1031,1068,1080],[418,419,420,421,425,426,429,430,433,434,437,438,441,442,445,446,433,449,452,453,456,457,460,461,441,464,467,468,471],"p",{},"Both features belong to the advanced editor (not the simple one) and need a collaborative surface for the user's identity: ",[422,423,424],"code",{},":collaboration=\"{ ydoc, provider, user: { id, name, color } }\""," (",[422,427,428],{},"AuthorIdentity","). Entries: ",[422,431,432],{},"@skaile\u002Fforge-editor\u002Fauthors\u002Fvue"," or ",[422,435,436],{},"\u002Fauthors\u002Freact"," (the framework-free ",[422,439,440],{},"\u002Fauthors"," and ",[422,443,444],{},"\u002Fauthors\u002Fschema"," hold the model), ",[422,447,448],{},"@skaile\u002Fforge-editor\u002Fcomments\u002Fvue",[422,450,451],{},"\u002Fcomments\u002Freact"," (framework-free ",[422,454,455],{},"\u002Fcomments",", ",[422,458,459],{},"\u002Fcomments\u002Fschema","); CSS ",[422,462,463],{},"styles\u002Fauthors.css",[422,465,466],{},"styles\u002Fcomments.css"," (after ",[422,469,470],{},"core.css","; the Nuxt module adds them).",[473,474,479],"pre",{"className":475,"code":476,"language":477,"meta":478,"style":478},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { authorsFeature } from '@skaile\u002Fforge-editor\u002Fauthors\u002Fvue'\nimport { collabFeature } from '@skaile\u002Fforge-editor\u002Fcollab\u002Fvue'\nimport { commentsFeature } from '@skaile\u002Fforge-editor\u002Fcomments\u002Fvue'\nconst preset = defineEditor({ features: [coreContentFeature(), coreUiFeature(), collabFeature(), authorsFeature(), commentsFeature()] })\n","ts","",[422,480,481,513,534,554],{"__ignoreMap":478},[482,483,486,490,494,498,501,504,507,510],"span",{"class":484,"line":485},"line",1,[482,487,489],{"class":488},"s7zQu","import",[482,491,493],{"class":492},"sMK4o"," {",[482,495,497],{"class":496},"sTEyZ"," authorsFeature",[482,499,500],{"class":492}," }",[482,502,503],{"class":488}," from",[482,505,506],{"class":492}," '",[482,508,432],{"class":509},"sfazB",[482,511,512],{"class":492},"'\n",[482,514,516,518,520,523,525,527,529,532],{"class":484,"line":515},2,[482,517,489],{"class":488},[482,519,493],{"class":492},[482,521,522],{"class":496}," collabFeature",[482,524,500],{"class":492},[482,526,503],{"class":488},[482,528,506],{"class":492},[482,530,531],{"class":509},"@skaile\u002Fforge-editor\u002Fcollab\u002Fvue",[482,533,512],{"class":492},[482,535,537,539,541,544,546,548,550,552],{"class":484,"line":536},3,[482,538,489],{"class":488},[482,540,493],{"class":492},[482,542,543],{"class":496}," commentsFeature",[482,545,500],{"class":492},[482,547,503],{"class":488},[482,549,506],{"class":492},[482,551,448],{"class":509},[482,553,512],{"class":492},[482,555,557,561,564,567,571,574,577,581,584,587,590,593,596,599,601,603,605,607,609,611,613,615,617,620,623],{"class":484,"line":556},4,[482,558,560],{"class":559},"spNyl","const",[482,562,563],{"class":496}," preset ",[482,565,566],{"class":492},"=",[482,568,570],{"class":569},"s2Zo4"," defineEditor",[482,572,573],{"class":496},"(",[482,575,576],{"class":492},"{",[482,578,580],{"class":579},"swJcz"," features",[482,582,583],{"class":492},":",[482,585,586],{"class":496}," [",[482,588,589],{"class":569},"coreContentFeature",[482,591,592],{"class":496},"()",[482,594,595],{"class":492},",",[482,597,598],{"class":569}," coreUiFeature",[482,600,592],{"class":496},[482,602,595],{"class":492},[482,604,522],{"class":569},[482,606,592],{"class":496},[482,608,595],{"class":492},[482,610,497],{"class":569},[482,612,592],{"class":496},[482,614,595],{"class":492},[482,616,543],{"class":569},[482,618,619],{"class":496},"()] ",[482,621,622],{"class":492},"}",[482,624,625],{"class":496},")\n",[418,627,628,629,456,631,441,634,636,637,640],{},"On React the same list comes from ",[422,630,436],{},[422,632,633],{},"\u002Fcollab\u002Freact",[422,635,451],{},", and ",[422,638,639],{},"collaboration"," is a prop of the same name.",[418,642,643,649],{},[644,645,646],"strong",{},[422,647,648],{},"authorsFeature()"," (no dependency, inert without a user)",[651,652,653,673],"ul",{},[654,655,656,657,660,661,664,665,668,669,672],"li",{},"Every inserted text run carries an ",[422,658,659],{},"author"," mark ",[422,662,663],{},"{ id, name, color }"," (persisted, invisible, not in Markdown). Text typed inside someone else's run takes the typist's mark; remote edits and Yjs undo\u002Fredo keep the original author. ",[422,666,667],{},"documentAuthors(doc)"," lists the authors with their character counts; ",[422,670,671],{},"currentAuthor(editor)"," is the user the editor writes as.",[654,674,675,676,679,680,425,683,686,687,690,691,694],{},"The colouring mode is a per-user preference: ",[422,677,678],{},"editing.authorColors"," (off by default) and ",[422,681,682],{},"editing.authorColorStyle",[422,684,685],{},"'background'"," tint or ",[422,688,689],{},"'text'"," colour). It is set in the „Autorenfarben“ settings tab and in the toolbar's palette button, whose popover also holds a legend of the document's authors (",[422,692,693],{},"AuthorColorsPanel",").",[418,696,697,702,703,706,707,710],{},[644,698,699],{},[422,700,701],{},"commentsFeature({ model? })"," (requires ",[422,704,705],{},"collab"," unless ",[422,708,709],{},"model"," is given)",[651,712,713,777,798,904],{},[654,714,715,718,719,721,722,725,726,729,730,456,733,456,736,456,739,456,742,745,746,749,750,753,754,757,758,760,761,456,764,456,767,456,770,773,774,776],{},[422,716,717],{},"model: (getEditor) => CommentsModel"," backs the comments with the host's own data (REST threads, a database) instead of the Y.Doc: the feature then requires no ",[422,720,705],{},", the ",[422,723,724],{},"Comments"," plugin reads the user, the thread ids and the ranges from ",[422,727,728],{},"model.state"," (a snapshot with ",[422,731,732],{},"available",[422,734,735],{},"canComment",[422,737,738],{},"user",[422,740,741],{},"threads",[422,743,744],{},"ranges",", …), and ",[422,747,748],{},"useComments(editor)"," resolves the model of the editor's surface (",[422,751,752],{},"commentsModelOf(ctx)","; the factory runs once for the plugin and once per hook consumer, so share state outside it). ",[422,755,756],{},"CommentsSnapshot.canComment"," gates the selection bubble: the default model says ",[422,759,732],{}," and editable, a host model may allow readers. ",[422,762,763],{},"CommentsModel",[422,765,766],{},"CommentsSnapshot",[422,768,769],{},"CommentsActions",[422,771,772],{},"DocRange"," are exported from ",[422,775,455],{},".",[654,778,779,780,425,783,786,787,789,790,793,794,797],{},"Select text and choose „Kommentar“ in the selection bubble; others reply, anyone resolves or reopens a thread („Erledigt“ threads lose their highlight), authors edit or delete their own comments. A thread whose text was deleted stays as orphan („Textstelle gelöscht“). Threads live in the Y.Doc map ",[422,781,782],{},"comments",[422,784,785],{},"createCommentsModel(getEditor)"," is the framework-free model; ",[422,788,748],{}," is the thin Vue hook, returning the ",[422,791,792],{},"CommentsStore",", and the React binding has the same hook), the range is the ",[422,795,796],{},"comment"," mark (the schema mark is always registered, so stored marks round-trip even without the feature's UI).",[654,799,800,425,803,806,807,810,811],{},[422,801,802],{},"editing.commentsLayout",[422,804,805],{},"'margin'"," default, ",[422,808,809],{},"'inline'",") is a per-user setting in the „Kommentare“ settings tab:",[651,812,813,857,890],{},[654,814,815,818,819,822,823,456,826,456,829,832,833,836,837,840,841,844,845,848,849,852,853,856],{},[422,816,817],{},"margin"," („Randspalte“): cards beside the commented text. The host places ",[422,820,821],{},"CommentsMargin"," (props ",[422,824,825],{},"editor",[422,827,828],{},"container",[422,830,831],{},"open",") inside the editor's scroll container (",[422,834,835],{},"relative flex",", editor wrapper ",[422,838,839],{},"min-w-0 flex-1",") and binds ",[422,842,843],{},"v-model:comments-open"," on the surface (React: ",[422,846,847],{},"commentsOpen","\u002F",[422,850,851],{},"onCommentsOpenChange","). The toolbar's „Kommentare“ button and ",[422,854,855],{},"Mod-Shift-m"," toggle it; opening it closes the AI sidebar and vice versa.",[654,858,859,860,863,864,867,868,871,872,875,876,879,880,883,884,886,887,694],{},"Layout „Aktiver Faden“: the active thread (or the draft composer) is pinned exactly to the top of its text's line and shows in full; every other open thread is a one-line card (author, excerpt, reply count) that moves up or down out of its way, as close to its own line as its neighbours allow, never overlapping. Without an active thread the cards stack top-down at their lines. A click on a card activates it and reveals its text. Resolved threads are hidden behind the „Erledigt (n)“ toggle at the bottom of the column. A thread whose text was deleted stays as a greyed-out card at the deletion point, labelled „Text gelöscht“ (its position comes from the thread's anchor, a Yjs relative position kept in the Y.Map; a thread without one goes to the end); undoing the deletion attaches it to its text again. The rule is framework-free and testable on its own: ",[422,861,862],{},"layoutMargin(entries, activeId, { gap, minTop })"," maps measured cards (",[422,865,866],{},"MarginEntry",": id, line top or ",[422,869,870],{},"null",", height) to tops, ",[422,873,874],{},"marginCards(...)"," builds the cards in document order, and ",[422,877,878],{},"createMarginController(source)"," does the measuring (",[422,881,882],{},"coordsAtPos",", card heights, one layout per animation frame); both ",[422,885,821],{}," components only render it (all from ",[422,888,889],{},"@skaile\u002Fforge-editor\u002Fcomments",[654,891,892,895,896,899,900,903],{},[422,893,894],{},"inline",": ",[422,897,898],{},"CommentsPopover"," (mounted by the feature as an overlay) opens at the commented text; the toolbar's ",[422,901,902],{},"CommentsListMenu"," lists all threads with the open count. Esc closes the popover.",[654,905,906],{},"Without collaboration the toolbar button is disabled with an explanation. Switching the layout closes any open thread or draft.",[473,908,912],{"className":909,"code":910,"language":911,"meta":478,"style":478},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cdiv ref=\"scrollEl\" class=\"relative flex overflow-auto\">\n  \u003Cdiv class=\"min-w-0 flex-1\">\n    \u003CAdvancedEditor v-model:comments-open=\"commentsOpen\" :collaboration=\"{ ydoc, provider, user: { id, name, color } }\" \u002F>\n  \u003C\u002Fdiv>\n  \u003CCommentsMargin :editor=\"editor\" :container=\"scrollEl\" :open=\"commentsOpen\" \u002F>\n\u003C\u002Fdiv>\n","vue",[422,913,914,950,955,960,969,1017],{"__ignoreMap":478},[482,915,916,919,922,925,927,930,933,935,938,940,942,945,947],{"class":484,"line":485},[482,917,918],{"class":492},"\u003C",[482,920,921],{"class":579},"div",[482,923,924],{"class":559}," ref",[482,926,566],{"class":492},[482,928,929],{"class":492},"\"",[482,931,932],{"class":509},"scrollEl",[482,934,929],{"class":492},[482,936,937],{"class":559}," class",[482,939,566],{"class":492},[482,941,929],{"class":492},[482,943,944],{"class":509},"relative flex overflow-auto",[482,946,929],{"class":492},[482,948,949],{"class":492},">\n",[482,951,952],{"class":484,"line":515},[482,953,954],{"class":496},"  \u003Cdiv class=\"min-w-0 flex-1\">\n",[482,956,957],{"class":484,"line":536},[482,958,959],{"class":496},"    \u003CAdvancedEditor v-model:comments-open=\"commentsOpen\" :collaboration=\"{ ydoc, provider, user: { id, name, color } }\" \u002F>\n",[482,961,962,965,967],{"class":484,"line":556},[482,963,964],{"class":492},"  \u003C\u002F",[482,966,921],{"class":579},[482,968,949],{"class":492},[482,970,972,975,977,980,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1008,1010,1012,1014],{"class":484,"line":971},5,[482,973,974],{"class":492},"  \u003C",[482,976,821],{"class":579},[482,978,979],{"class":492}," :",[482,981,825],{"class":559},[482,983,566],{"class":492},[482,985,929],{"class":492},[482,987,825],{"class":496},[482,989,929],{"class":492},[482,991,979],{"class":492},[482,993,828],{"class":559},[482,995,566],{"class":492},[482,997,929],{"class":492},[482,999,932],{"class":496},[482,1001,929],{"class":492},[482,1003,979],{"class":492},[482,1005,831],{"class":559},[482,1007,566],{"class":492},[482,1009,929],{"class":492},[482,1011,847],{"class":496},[482,1013,929],{"class":492},[482,1015,1016],{"class":492}," \u002F>\n",[482,1018,1020,1022,1024,1026],{"class":484,"line":1019},6,[482,1021,918],{"class":492},[482,1023,848],{"class":496},[482,1025,921],{"class":579},[482,1027,949],{"class":492},[418,1029,1030],{},"React, same layout:",[473,1032,1036],{"className":1033,"code":1034,"language":1035,"meta":478,"style":478},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cmain ref={setScrollEl} className=\"relative flex overflow-auto\">\n  \u003Cdiv className=\"min-w-0 flex-1\">\n    \u003CAdvancedEditor commentsOpen={commentsOpen} onCommentsOpenChange={setCommentsOpen} collaboration={{ ydoc, provider, user: { id, name, color } }} \u002F>\n  \u003C\u002Fdiv>\n  \u003CCommentsMargin editor={editor} container={scrollEl} open={commentsOpen} \u002F>\n\u003C\u002Fmain>\n","tsx",[422,1037,1038,1043,1048,1053,1058,1063],{"__ignoreMap":478},[482,1039,1040],{"class":484,"line":485},[482,1041,1042],{},"\u003Cmain ref={setScrollEl} className=\"relative flex overflow-auto\">\n",[482,1044,1045],{"class":484,"line":515},[482,1046,1047],{},"  \u003Cdiv className=\"min-w-0 flex-1\">\n",[482,1049,1050],{"class":484,"line":536},[482,1051,1052],{},"    \u003CAdvancedEditor commentsOpen={commentsOpen} onCommentsOpenChange={setCommentsOpen} collaboration={{ ydoc, provider, user: { id, name, color } }} \u002F>\n",[482,1054,1055],{"class":484,"line":556},[482,1056,1057],{},"  \u003C\u002Fdiv>\n",[482,1059,1060],{"class":484,"line":971},[482,1061,1062],{},"  \u003CCommentsMargin editor={editor} container={scrollEl} open={commentsOpen} \u002F>\n",[482,1064,1065],{"class":484,"line":1019},[482,1066,1067],{},"\u003C\u002Fmain>\n",[418,1069,1070,1073,1074,441,1077,1079],{},[422,1071,1072],{},"bun run check:editor-entries"," proves the isolation with the ",[422,1075,1076],{},"authors",[422,1078,782],{}," fixtures; the marks are part of the server schema snapshot.",[1081,1082,1083],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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":478,"searchDepth":515,"depth":515,"links":1085},[],"Mark who wrote which text and let readers discuss selections in threads, with a margin or inline layout.","md",null,{},{"icon":102},{"title":99,"description":1086},"cVbaOK7mLETAOsbBhED7xuhwZPjOmAs5vwF91jqNykc",[1094,1096],{"title":94,"path":95,"stem":96,"description":1095,"icon":97,"children":-1},"Add image, audio, video and file blocks, @ mentions and # tags, and speaker transcripts as independent features, with uploads, metadata lists and server schemas.",{"title":104,"path":105,"stem":106,"description":1097,"icon":107,"children":-1},"Render an Obsidian theme on the whole app, choose, upload and delete themes, and know the limits.",1793213901837]