[{"data":1,"prerenderedAt":2033},["ShallowReactive",2],{"navigation_docs":3,"-guides-media-mentions-transcript":412,"-guides-media-mentions-transcript-surround":2028},[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":94,"body":414,"description":2021,"extension":2022,"links":2023,"meta":2024,"navigation":2025,"path":95,"seo":2026,"stem":96,"__hash__":2027},"docs\u002F3.guides\u002F10.media-mentions-transcript.md",{"type":415,"value":416,"toc":2015},"minimark",[417,438,867,880,929,934,942,1060,1067,1225,1279,1283,1311,1380,1493,1512,1596,1646,1650,1664,1741,1744,1920,1965,1995,1998,2011],[418,419,420,421,425,426,429,430,433,434,437],"p",{},"Three independent features extend the core editor. Each is one factory you add to ",[422,423,424],"code",{},"defineEditor({ features })"," next to ",[422,427,428],{},"coreContentFeature()"," and ",[422,431,432],{},"coreUiFeature()","; none needs Typed blocks, AI or Yjs, and none imports the others (",[422,435,436],{},"bun run check:editor-entries"," proves it per feature).",[439,440,445],"pre",{"className":441,"code":442,"language":443,"meta":444,"style":444},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { coreContentFeature, coreUiFeature, defineEditor } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { EditorSurface, EditorToolbar } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { mediaFeature } from '@skaile\u002Fforge-editor\u002Fmedia\u002Fvue'\nimport { mentionsFeature } from '@skaile\u002Fforge-editor\u002Fmentions'\nimport { transcriptFeature } from '@skaile\u002Fforge-editor\u002Ftranscript\u002Fvue'\nimport type { Editor } from '@tiptap\u002Fvue-3'\nimport { shallowRef } from 'vue'\n\nconst preset = defineEditor({ features: [coreContentFeature(), coreUiFeature(), mediaFeature(), mentionsFeature(), transcriptFeature()] })\nconst editor = shallowRef\u003CEditor>()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CEditorToolbar :editor=\"editor\" \u002F>\n  \u003CEditorSurface v-model=\"content\" :preset=\"preset\" @ready=\"editor = $event\" \u002F>\n\u003C\u002Ftemplate>\n","vue","",[422,446,447,482,522,548,569,590,611,635,655,662,728,752,762,767,777,803,858],{"__ignoreMap":444},[448,449,452,456,460,464,467,470,473,477,479],"span",{"class":450,"line":451},"line",1,[448,453,455],{"class":454},"sMK4o","\u003C",[448,457,459],{"class":458},"swJcz","script",[448,461,463],{"class":462},"spNyl"," setup",[448,465,466],{"class":462}," lang",[448,468,469],{"class":454},"=",[448,471,472],{"class":454},"\"",[448,474,476],{"class":475},"sfazB","ts",[448,478,472],{"class":454},[448,480,481],{"class":454},">\n",[448,483,485,489,492,496,499,502,504,507,510,513,516,519],{"class":450,"line":484},2,[448,486,488],{"class":487},"s7zQu","import",[448,490,491],{"class":454}," {",[448,493,495],{"class":494},"sTEyZ"," coreContentFeature",[448,497,498],{"class":454},",",[448,500,501],{"class":494}," coreUiFeature",[448,503,498],{"class":454},[448,505,506],{"class":494}," defineEditor",[448,508,509],{"class":454}," }",[448,511,512],{"class":487}," from",[448,514,515],{"class":454}," '",[448,517,518],{"class":475},"@skaile\u002Fforge-editor\u002Fcore",[448,520,521],{"class":454},"'\n",[448,523,525,527,529,532,534,537,539,541,543,546],{"class":450,"line":524},3,[448,526,488],{"class":487},[448,528,491],{"class":454},[448,530,531],{"class":494}," EditorSurface",[448,533,498],{"class":454},[448,535,536],{"class":494}," EditorToolbar",[448,538,509],{"class":454},[448,540,512],{"class":487},[448,542,515],{"class":454},[448,544,545],{"class":475},"@skaile\u002Fforge-editor\u002Fvue",[448,547,521],{"class":454},[448,549,551,553,555,558,560,562,564,567],{"class":450,"line":550},4,[448,552,488],{"class":487},[448,554,491],{"class":454},[448,556,557],{"class":494}," mediaFeature",[448,559,509],{"class":454},[448,561,512],{"class":487},[448,563,515],{"class":454},[448,565,566],{"class":475},"@skaile\u002Fforge-editor\u002Fmedia\u002Fvue",[448,568,521],{"class":454},[448,570,572,574,576,579,581,583,585,588],{"class":450,"line":571},5,[448,573,488],{"class":487},[448,575,491],{"class":454},[448,577,578],{"class":494}," mentionsFeature",[448,580,509],{"class":454},[448,582,512],{"class":487},[448,584,515],{"class":454},[448,586,587],{"class":475},"@skaile\u002Fforge-editor\u002Fmentions",[448,589,521],{"class":454},[448,591,593,595,597,600,602,604,606,609],{"class":450,"line":592},6,[448,594,488],{"class":487},[448,596,491],{"class":454},[448,598,599],{"class":494}," transcriptFeature",[448,601,509],{"class":454},[448,603,512],{"class":487},[448,605,515],{"class":454},[448,607,608],{"class":475},"@skaile\u002Fforge-editor\u002Ftranscript\u002Fvue",[448,610,521],{"class":454},[448,612,614,616,619,621,624,626,628,630,633],{"class":450,"line":613},7,[448,615,488],{"class":487},[448,617,618],{"class":487}," type",[448,620,491],{"class":454},[448,622,623],{"class":494}," Editor",[448,625,509],{"class":454},[448,627,512],{"class":487},[448,629,515],{"class":454},[448,631,632],{"class":475},"@tiptap\u002Fvue-3",[448,634,521],{"class":454},[448,636,638,640,642,645,647,649,651,653],{"class":450,"line":637},8,[448,639,488],{"class":487},[448,641,491],{"class":454},[448,643,644],{"class":494}," shallowRef",[448,646,509],{"class":454},[448,648,512],{"class":487},[448,650,515],{"class":454},[448,652,443],{"class":475},[448,654,521],{"class":454},[448,656,658],{"class":450,"line":657},9,[448,659,661],{"emptyLinePlaceholder":660},true,"\n",[448,663,665,668,671,673,676,679,682,685,688,691,694,697,699,701,703,705,707,709,711,713,715,717,719,722,725],{"class":450,"line":664},10,[448,666,667],{"class":462},"const",[448,669,670],{"class":494}," preset ",[448,672,469],{"class":454},[448,674,506],{"class":675},"s2Zo4",[448,677,678],{"class":494},"(",[448,680,681],{"class":454},"{",[448,683,684],{"class":458}," features",[448,686,687],{"class":454},":",[448,689,690],{"class":494}," [",[448,692,693],{"class":675},"coreContentFeature",[448,695,696],{"class":494},"()",[448,698,498],{"class":454},[448,700,501],{"class":675},[448,702,696],{"class":494},[448,704,498],{"class":454},[448,706,557],{"class":675},[448,708,696],{"class":494},[448,710,498],{"class":454},[448,712,578],{"class":675},[448,714,696],{"class":494},[448,716,498],{"class":454},[448,718,599],{"class":675},[448,720,721],{"class":494},"()] ",[448,723,724],{"class":454},"}",[448,726,727],{"class":494},")\n",[448,729,731,733,736,738,740,742,746,749],{"class":450,"line":730},11,[448,732,667],{"class":462},[448,734,735],{"class":494}," editor ",[448,737,469],{"class":454},[448,739,644],{"class":675},[448,741,455],{"class":454},[448,743,745],{"class":744},"sBMFI","Editor",[448,747,748],{"class":454},">",[448,750,751],{"class":494},"()\n",[448,753,755,758,760],{"class":450,"line":754},12,[448,756,757],{"class":454},"\u003C\u002F",[448,759,459],{"class":458},[448,761,481],{"class":454},[448,763,765],{"class":450,"line":764},13,[448,766,661],{"emptyLinePlaceholder":660},[448,768,770,772,775],{"class":450,"line":769},14,[448,771,455],{"class":454},[448,773,774],{"class":458},"template",[448,776,481],{"class":454},[448,778,780,783,786,789,792,794,796,798,800],{"class":450,"line":779},15,[448,781,782],{"class":454},"  \u003C",[448,784,785],{"class":458},"EditorToolbar",[448,787,788],{"class":454}," :",[448,790,791],{"class":462},"editor",[448,793,469],{"class":454},[448,795,472],{"class":454},[448,797,791],{"class":494},[448,799,472],{"class":454},[448,801,802],{"class":454}," \u002F>\n",[448,804,806,808,811,814,816,818,821,823,825,828,830,832,834,836,839,842,844,846,848,851,854,856],{"class":450,"line":805},16,[448,807,782],{"class":454},[448,809,810],{"class":458},"EditorSurface",[448,812,813],{"class":462}," v-model",[448,815,469],{"class":454},[448,817,472],{"class":454},[448,819,820],{"class":494},"content",[448,822,472],{"class":454},[448,824,788],{"class":454},[448,826,827],{"class":462},"preset",[448,829,469],{"class":454},[448,831,472],{"class":454},[448,833,827],{"class":494},[448,835,472],{"class":454},[448,837,838],{"class":454}," @",[448,840,841],{"class":462},"ready",[448,843,469],{"class":454},[448,845,472],{"class":454},[448,847,791],{"class":494},[448,849,850],{"class":454}," = ",[448,852,853],{"class":494},"$event",[448,855,472],{"class":454},[448,857,802],{"class":454},[448,859,861,863,865],{"class":450,"line":860},17,[448,862,757],{"class":454},[448,864,774],{"class":458},[448,866,481],{"class":454},[418,868,869,870,873,874,429,877,687],{},"Import the feature CSS after ",[422,871,872],{},"tailwindcss",", ",[422,875,876],{},"@nuxt\u002Fui",[422,878,879],{},"core.css",[439,881,885],{"className":882,"code":883,"language":884,"meta":444,"style":444},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@import \"@skaile\u002Fforge-editor\u002Fstyles\u002Fmedia.css\";\n@import \"@skaile\u002Fforge-editor\u002Fstyles\u002Fmentions.css\";\n@import \"@skaile\u002Fforge-editor\u002Fstyles\u002Ftranscript.css\";\n","css",[422,886,887,903,916],{"__ignoreMap":444},[448,888,889,892,895,898,900],{"class":450,"line":451},[448,890,891],{"class":487},"@import",[448,893,894],{"class":454}," \"",[448,896,897],{"class":475},"@skaile\u002Fforge-editor\u002Fstyles\u002Fmedia.css",[448,899,472],{"class":454},[448,901,902],{"class":454},";\n",[448,904,905,907,909,912,914],{"class":450,"line":484},[448,906,891],{"class":487},[448,908,894],{"class":454},[448,910,911],{"class":475},"@skaile\u002Fforge-editor\u002Fstyles\u002Fmentions.css",[448,913,472],{"class":454},[448,915,902],{"class":454},[448,917,918,920,922,925,927],{"class":450,"line":524},[448,919,891],{"class":487},[448,921,894],{"class":454},[448,923,924],{"class":475},"@skaile\u002Fforge-editor\u002Fstyles\u002Ftranscript.css",[448,926,472],{"class":454},[448,928,902],{"class":454},[930,931,933],"h2",{"id":932},"dependency-setup","Dependency setup",[418,935,936,937,941],{},"Installing the package brings the feature dependencies; nothing else is required in the consumer beyond the peers listed in ",[938,939,16],"a",{"href":940},"\u002Fgetting-started\u002Finstallation#prerequisites",".",[943,944,945,967],"table",{},[946,947,948],"thead",{},[949,950,951,955,958,961,964],"tr",{},[952,953,954],"th",{},"Feature",[952,956,957],{},"Entry",[952,959,960],{},"Vue-free schema entry",[952,962,963],{},"Runtime dependencies it adds",[952,965,966],{},"Needs a backend",[968,969,970,1008,1033],"tbody",{},[949,971,972,976,988,993,1001],{},[973,974,975],"td",{},"Media",[973,977,978,981,982,873,985],{},[422,979,980],{},"@skaile\u002Fforge-editor\u002Fmedia"," (framework-free), ",[422,983,984],{},"\u002Fmedia\u002Fvue",[422,986,987],{},"\u002Fmedia\u002Freact",[973,989,990],{},[422,991,992],{},"@skaile\u002Fforge-editor\u002Fmedia\u002Fschema",[973,994,995,873,998],{},[422,996,997],{},"@tiptap\u002Fextension-image",[422,999,1000],{},"@tiptap\u002Fextension-file-handler",[973,1002,1003,1004,1007],{},"only for uploads (see below); a backend with ",[422,1005,1006],{},"assets"," stores them",[949,1009,1010,1013,1017,1022,1030],{},[973,1011,1012],{},"Mentions",[973,1014,1015],{},[422,1016,587],{},[973,1018,1019],{},[422,1020,1021],{},"@skaile\u002Fforge-editor\u002Fmentions\u002Fschema",[973,1023,1024,873,1027],{},[422,1025,1026],{},"@tiptap\u002Fextension-mention",[422,1028,1029],{},"@tiptap\u002Fsuggestion",[973,1031,1032],{},"only for the built-in lists (see below); host lists replace them",[949,1034,1035,1038,1049,1054,1057],{},[973,1036,1037],{},"Transcript",[973,1039,1040,981,1043,873,1046],{},[422,1041,1042],{},"@skaile\u002Fforge-editor\u002Ftranscript",[422,1044,1045],{},"\u002Ftranscript\u002Fvue",[422,1047,1048],{},"\u002Ftranscript\u002Freact",[973,1050,1051],{},[422,1052,1053],{},"@skaile\u002Fforge-editor\u002Ftranscript\u002Fschema",[973,1055,1056],{},"none beyond core",[973,1058,1059],{},"no",[418,1061,1062,1063,1066],{},"The ",[422,1064,1065],{},"\u002Fschema"," entries import no Vue, no node view and no feature factory. A server that validates or seeds documents builds the matching schema from them:",[439,1068,1071],{"className":1069,"code":1070,"language":476,"meta":444,"style":444},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { getSchema } from '@tiptap\u002Fcore'\nimport { coreSchemaExtensions } from '@skaile\u002Fforge-editor\u002Fcore\u002Fschema'\nimport { mediaSchemaExtensions } from '@skaile\u002Fforge-editor\u002Fmedia\u002Fschema'\nimport { mentionsSchemaExtensions } from '@skaile\u002Fforge-editor\u002Fmentions\u002Fschema'\nimport { transcriptSchemaExtensions } from '@skaile\u002Fforge-editor\u002Ftranscript\u002Fschema'\n\nconst schema = getSchema([...coreSchemaExtensions(), ...mediaSchemaExtensions(), ...mentionsSchemaExtensions(), ...transcriptSchemaExtensions()])\n",[422,1072,1073,1093,1113,1132,1151,1170,1174],{"__ignoreMap":444},[448,1074,1075,1077,1079,1082,1084,1086,1088,1091],{"class":450,"line":451},[448,1076,488],{"class":487},[448,1078,491],{"class":454},[448,1080,1081],{"class":494}," getSchema",[448,1083,509],{"class":454},[448,1085,512],{"class":487},[448,1087,515],{"class":454},[448,1089,1090],{"class":475},"@tiptap\u002Fcore",[448,1092,521],{"class":454},[448,1094,1095,1097,1099,1102,1104,1106,1108,1111],{"class":450,"line":484},[448,1096,488],{"class":487},[448,1098,491],{"class":454},[448,1100,1101],{"class":494}," coreSchemaExtensions",[448,1103,509],{"class":454},[448,1105,512],{"class":487},[448,1107,515],{"class":454},[448,1109,1110],{"class":475},"@skaile\u002Fforge-editor\u002Fcore\u002Fschema",[448,1112,521],{"class":454},[448,1114,1115,1117,1119,1122,1124,1126,1128,1130],{"class":450,"line":524},[448,1116,488],{"class":487},[448,1118,491],{"class":454},[448,1120,1121],{"class":494}," mediaSchemaExtensions",[448,1123,509],{"class":454},[448,1125,512],{"class":487},[448,1127,515],{"class":454},[448,1129,992],{"class":475},[448,1131,521],{"class":454},[448,1133,1134,1136,1138,1141,1143,1145,1147,1149],{"class":450,"line":550},[448,1135,488],{"class":487},[448,1137,491],{"class":454},[448,1139,1140],{"class":494}," mentionsSchemaExtensions",[448,1142,509],{"class":454},[448,1144,512],{"class":487},[448,1146,515],{"class":454},[448,1148,1021],{"class":475},[448,1150,521],{"class":454},[448,1152,1153,1155,1157,1160,1162,1164,1166,1168],{"class":450,"line":571},[448,1154,488],{"class":487},[448,1156,491],{"class":454},[448,1158,1159],{"class":494}," transcriptSchemaExtensions",[448,1161,509],{"class":454},[448,1163,512],{"class":487},[448,1165,515],{"class":454},[448,1167,1053],{"class":475},[448,1169,521],{"class":454},[448,1171,1172],{"class":450,"line":592},[448,1173,661],{"emptyLinePlaceholder":660},[448,1175,1176,1178,1181,1183,1185,1188,1191,1194,1196,1198,1201,1204,1206,1208,1210,1213,1215,1217,1219,1222],{"class":450,"line":613},[448,1177,667],{"class":462},[448,1179,1180],{"class":494}," schema ",[448,1182,469],{"class":454},[448,1184,1081],{"class":675},[448,1186,1187],{"class":494},"([",[448,1189,1190],{"class":454},"...",[448,1192,1193],{"class":675},"coreSchemaExtensions",[448,1195,696],{"class":494},[448,1197,498],{"class":454},[448,1199,1200],{"class":454}," ...",[448,1202,1203],{"class":675},"mediaSchemaExtensions",[448,1205,696],{"class":494},[448,1207,498],{"class":454},[448,1209,1200],{"class":454},[448,1211,1212],{"class":675},"mentionsSchemaExtensions",[448,1214,696],{"class":494},[448,1216,498],{"class":454},[448,1218,1200],{"class":454},[448,1220,1221],{"class":675},"transcriptSchemaExtensions",[448,1223,1224],{"class":494},"()])\n",[418,1226,1227,1228,873,1231,873,1234,873,1237,873,1240,873,1243,873,1246,873,1249,1252,1253,873,1256,873,1259,873,1262,873,1265,1268,1269,873,1272,873,1275,1278],{},"The schema entries also export the helpers servers need: ",[422,1229,1230],{},"MEDIA_TYPES",[422,1232,1233],{},"MAX_MEDIA_BYTES",[422,1235,1236],{},"mediaKindOf",[422,1238,1239],{},"assetUrl",[422,1241,1242],{},"assetRefOf",[422,1244,1245],{},"ASSET_NAME",[422,1247,1248],{},"ASSET_DOCUMENT_ID",[422,1250,1251],{},"SCRATCH_DOCUMENT_ID"," (media), ",[422,1254,1255],{},"mentionsFromText",[422,1257,1258],{},"mentionUsersIn",[422,1260,1261],{},"tagsFromText",[422,1263,1264],{},"collectTagNames",[422,1266,1267],{},"normalizeTagName"," (mentions), ",[422,1270,1271],{},"speakerParagraphsToSegments",[422,1273,1274],{},"lastSpeaker",[422,1276,1277],{},"speakersIn"," (transcript).",[930,1280,1282],{"id":1281},"upload","Upload",[418,1284,1285,1288,1289,1292,1293,1296,1297,1299,1300,1303,1304,1307,1308,941],{},[422,1286,1287],{},"mediaFeature()"," adds image, audio, video and file blocks, drop\u002Fpaste of files, toolbar buttons (Bild, Audio-Datei, Video, Aufnahme), the matching ",[422,1290,1291],{},"\u002F"," commands and the audio recorder modal. Every path ends in one function, ",[422,1294,1295],{},"editor.storage.media.upload(file): Promise\u003C{ url: string, sha256?: string }>",", which calls the backend's ",[422,1298,1006],{}," capability: ",[422,1301,1302],{},"backend.assets.upload(documentId, file)","; ",[422,1305,1306],{},"documentId"," is the surface's prop, default ",[422,1309,1310],{},"scratch",[1312,1313,1314,1349],"ul",{},[1315,1316,1317,1318,1321,1322,1325,1326,1329,1330,1333,1334,1337,1338,1341,1342,1345,1346,1348],"li",{},"The HTTP backend (",[422,1319,1320],{},"createHttpBackend()",", the default) sends ",[422,1323,1324],{},"POST \u002Fapi\u002Feditor\u002Fassets\u002F\u003CdocumentId>"," with a ",[422,1327,1328],{},"multipart\u002Fform-data"," body (field ",[422,1331,1332],{},"file","); the response must be ",[422,1335,1336],{},"{ url }"," and may add ",[422,1339,1340],{},"sha256"," (hex SHA-256 of the bytes; the bundled server always sends it, and stores it in the asset record). The media blocks keep it as their ",[422,1343,1344],{},"hash"," attribute; backends that send none (the memory backend) leave ",[422,1347,1344],{}," empty.",[1315,1350,1351,1352,1355,1356,1359,1360,1363,1364,1367,1368,1371,1372,1375,1376,1379],{},"To store files elsewhere (S3, a data URL, …), implement ",[422,1353,1354],{},"assets.upload"," in your own ",[422,1357,1358],{},"EditorBackend"," (",[422,1361,1362],{},"createEditor({ backend })","); the returned ",[422,1365,1366],{},"url"," becomes the block's ",[422,1369,1370],{},"src",". ",[422,1373,1374],{},"createMemoryBackend()"," answers with a ",[422,1377,1378],{},"blob:"," URL.",[439,1381,1383],{"className":1069,"code":1382,"language":476,"meta":444,"style":444},"const backend: EditorBackend = { name: 'my-store', assets: { upload: async (_documentId, file) => ({ url: await storeSomewhere(file) }) } }\ncreateEditor({ backend })\n",[422,1384,1385,1477],{"__ignoreMap":444},[448,1386,1387,1389,1392,1394,1397,1400,1402,1405,1407,1409,1412,1415,1417,1420,1422,1424,1427,1429,1432,1434,1438,1440,1443,1446,1449,1451,1453,1456,1458,1461,1464,1467,1469,1472,1474],{"class":450,"line":451},[448,1388,667],{"class":462},[448,1390,1391],{"class":494}," backend",[448,1393,687],{"class":454},[448,1395,1396],{"class":744}," EditorBackend",[448,1398,1399],{"class":454}," =",[448,1401,491],{"class":454},[448,1403,1404],{"class":458}," name",[448,1406,687],{"class":454},[448,1408,515],{"class":454},[448,1410,1411],{"class":475},"my-store",[448,1413,1414],{"class":454},"'",[448,1416,498],{"class":454},[448,1418,1419],{"class":458}," assets",[448,1421,687],{"class":454},[448,1423,491],{"class":454},[448,1425,1426],{"class":675}," upload",[448,1428,687],{"class":454},[448,1430,1431],{"class":462}," async",[448,1433,1359],{"class":454},[448,1435,1437],{"class":1436},"sHdIc","_documentId",[448,1439,498],{"class":454},[448,1441,1442],{"class":1436}," file",[448,1444,1445],{"class":454},")",[448,1447,1448],{"class":462}," =>",[448,1450,1359],{"class":494},[448,1452,681],{"class":454},[448,1454,1455],{"class":458}," url",[448,1457,687],{"class":454},[448,1459,1460],{"class":487}," await",[448,1462,1463],{"class":675}," storeSomewhere",[448,1465,1466],{"class":494},"(file) ",[448,1468,724],{"class":454},[448,1470,1471],{"class":494},") ",[448,1473,724],{"class":454},[448,1475,1476],{"class":454}," }\n",[448,1478,1479,1482,1484,1486,1489,1491],{"class":450,"line":484},[448,1480,1481],{"class":675},"createEditor",[448,1483,678],{"class":494},[448,1485,681],{"class":454},[448,1487,1488],{"class":494}," backend ",[448,1490,724],{"class":454},[448,1492,727],{"class":494},[418,1494,1495,1496,429,1498,1500,1501,1503,1504,1507,1508,1511],{},"Accepted types and size limits are ",[422,1497,1230],{},[422,1499,1233],{}," (Vue-free, from ",[422,1502,992],{},"): images up to 5 MB (png, jpeg, gif, webp), audio 50 MB, video 200 MB, and any other type up to 50 MB as a downloadable file block. A server endpoint should validate against the same constants; the Nuxt module's ",[422,1505,1506],{},"\u002Fapi\u002Feditor\u002Fassets\u002F*"," routes do. A failed upload shows a toast (",[422,1509,1510],{},"Import fehlgeschlagen",") and inserts nothing.",[418,1513,1514,1518,1519,1521,1522,1303,1525,1528,1529,1531,1532,1534,1535,1538,1539,1541,1542,1545,1546,1549,1550,1553,1554,1359,1556,1559,1560,1564,1565,873,1568,1571,1572,1575,1576,1579,1580,1583,1584,1587,1588,1591,1592,1595],{},[1515,1516,1517],"strong",{},"File import."," Drop, paste, the toolbar and ",[422,1520,1291],{}," commands all call ",[422,1523,1524],{},"editor.storage.media.importFiles(editor, files, pos?)",[422,1526,1527],{},"useFileImport()"," (from ",[422,1530,566],{}," or ",[422,1533,987],{},"; call it in ",[422,1536,1537],{},"setup"," \u002F while rendering: it binds the notifier of ",[422,1540,791],{},"'s surface when you pass the editor, else the app's: a Nuxt UI toast on Vue and a sonner toast on React unless the host's ",[422,1543,1544],{},"notify"," says otherwise) returns the same ",[422,1547,1548],{},"importFiles"," for your own buttons; the framework-free model is ",[422,1551,1552],{},"fileImport(notify, t)"," from ",[422,1555,980],{},[422,1557,1558],{},"t"," is the editor context's translator). Every file is planned by the ",[938,1561,1563],{"href":1562},".\u002F34.importers","importer registry",": a Markdown, subtitle (",[422,1566,1567],{},".vtt",[422,1569,1570],{},".srt",") or BibTeX (",[422,1573,1574],{},".bib",") file by its own importer; any other text file (",[422,1577,1578],{},".txt",", at most 2 MB) is parsed through the editor's block pipeline (Markdown parse, then ",[422,1581,1582],{},"normalize"," — mention\u002Ftag chips —, ",[422,1585,1586],{},"segment"," — speaker lines —, ",[422,1589,1590],{},"structure","); every other file is uploaded and appears as its media or file block. A wrapping importer (",[422,1593,1594],{},"composite-media",") may then wrap the plan; the resulting blocks are inserted as they are at the drop position (anchored while uploads run, so editing meanwhile does not shift it) or at the selection. Files are imported sequentially; a failed file is reported and skipped.",[418,1597,1598,1599,1602,1603,1605,1606,1608,1609,1612,1613,1615,1616,1618,1619,1622,1623,1626,1627,1553,1630,1632,1633,873,1636,873,1639,873,1642,1645],{},"The recorder (",[422,1600,1601],{},"AudioRecorderModal",") is mounted by ",[422,1604,810],{}," as a feature overlay. In a custom layout without ",[422,1607,810],{},", render ",[422,1610,1611],{},"\u003CAudioRecorderModal :editor=\"editor\" \u002F>"," yourself (exported from ",[422,1614,566],{},", or ",[422,1617,987],{},") and open it with ",[422,1620,1621],{},"openAudioRecorder(editor)",". It records through ",[422,1624,1625],{},"MediaRecorder"," (needs HTTPS or localhost and microphone permission) and imports the result like any file. The recording model itself is framework-free: ",[422,1628,1629],{},"createAudioRecorder()",[422,1631,980],{}," (a store with ",[422,1634,1635],{},"start",[422,1637,1638],{},"stop",[422,1640,1641],{},"cancel",[422,1643,1644],{},"dispose",").",[930,1647,1649],{"id":1648},"metadata","Metadata",[418,1651,1652,1653,1655,1656,1659,1660,1663],{},"The mentions feature reads two named lists, the transcript feature one; hosts replace any of them through the ",[422,1654,1648],{}," prop (",[422,1657,1658],{},"EditorMetadata",": a static array or a search function ",[422,1661,1662],{},"(q: MetadataQuery) => items | Promise\u003Citems>","). Lists the host does not supply fall back to the feature's built-in source; the fallback is only searched when a suggestion popup is actually used.",[943,1665,1666,1679],{},[946,1667,1668],{},[949,1669,1670,1673,1676],{},[952,1671,1672],{},"List",[952,1674,1675],{},"Used by",[952,1677,1678],{},"Built-in source when the host supplies none",[968,1680,1681,1707,1728],{},[949,1682,1683,1688,1697],{},[973,1684,1685],{},[422,1686,1687],{},"mentions",[973,1689,1690,1693,1694,1696],{},[422,1691,1692],{},"@"," popup, ",[422,1695,1582],{}," stage",[973,1698,1699,1702,1703,1706],{},[422,1700,1701],{},"GET \u002Fapi\u002Feditor\u002Fusers?q=\u003Cquery>"," → ",[422,1704,1705],{},"{ id, username, color }[]"," (through the context's HTTP client)",[949,1708,1709,1714,1720],{},[973,1710,1711],{},[422,1712,1713],{},"hashtags",[973,1715,1716,1719],{},[422,1717,1718],{},"#"," popup",[973,1721,1722,1702,1725],{},[422,1723,1724],{},"GET \u002Fapi\u002Feditor\u002Ftags?q=\u003Cnormalized query>",[422,1726,1727],{},"string[]",[949,1729,1730,1735,1738],{},[973,1731,1732],{},[422,1733,1734],{},"speakers",[973,1736,1737],{},"speaker field of a segment",[973,1739,1740],{},"speakers already in the document (no backend)",[418,1742,1743],{},"A backend-free app passes its own lists and never calls those endpoints:",[439,1745,1747],{"className":441,"code":1746,"language":443,"meta":444,"style":444},"\u003CEditorSurface\n  :preset=\"preset\"\n  :metadata=\"{\n    mentions: [{ id: 'u1', label: 'anna', color: '#e11d48' }],\n    hashtags: q => searchTags(q.query),\n  }\"\n  @metadata-create=\"(list, item) => persist(list, item)\"\n\u002F>\n",[422,1748,1749,1756,1772,1785,1844,1869,1876,1915],{"__ignoreMap":444},[448,1750,1751,1753],{"class":450,"line":451},[448,1752,455],{"class":454},[448,1754,1755],{"class":458},"EditorSurface\n",[448,1757,1758,1761,1763,1765,1767,1769],{"class":450,"line":484},[448,1759,1760],{"class":454},"  :",[448,1762,827],{"class":462},[448,1764,469],{"class":454},[448,1766,472],{"class":454},[448,1768,827],{"class":494},[448,1770,1771],{"class":454},"\"\n",[448,1773,1774,1776,1778,1780,1782],{"class":450,"line":524},[448,1775,1760],{"class":454},[448,1777,1648],{"class":462},[448,1779,469],{"class":454},[448,1781,472],{"class":454},[448,1783,1784],{"class":454},"{\n",[448,1786,1787,1790,1792,1794,1796,1799,1801,1803,1806,1808,1810,1813,1815,1817,1820,1822,1824,1827,1829,1831,1834,1836,1838,1841],{"class":450,"line":550},[448,1788,1789],{"class":458},"    mentions",[448,1791,687],{"class":454},[448,1793,690],{"class":494},[448,1795,681],{"class":454},[448,1797,1798],{"class":458}," id",[448,1800,687],{"class":454},[448,1802,515],{"class":454},[448,1804,1805],{"class":475},"u1",[448,1807,1414],{"class":454},[448,1809,498],{"class":454},[448,1811,1812],{"class":458}," label",[448,1814,687],{"class":454},[448,1816,515],{"class":454},[448,1818,1819],{"class":475},"anna",[448,1821,1414],{"class":454},[448,1823,498],{"class":454},[448,1825,1826],{"class":458}," color",[448,1828,687],{"class":454},[448,1830,515],{"class":454},[448,1832,1833],{"class":475},"#e11d48",[448,1835,1414],{"class":454},[448,1837,509],{"class":454},[448,1839,1840],{"class":494},"]",[448,1842,1843],{"class":454},",\n",[448,1845,1846,1849,1851,1854,1856,1859,1862,1864,1867],{"class":450,"line":571},[448,1847,1848],{"class":675},"    hashtags",[448,1850,687],{"class":454},[448,1852,1853],{"class":1436}," q",[448,1855,1448],{"class":462},[448,1857,1858],{"class":675}," searchTags",[448,1860,1861],{"class":494},"(q",[448,1863,941],{"class":454},[448,1865,1866],{"class":494},"query)",[448,1868,1843],{"class":454},[448,1870,1871,1874],{"class":450,"line":592},[448,1872,1873],{"class":454},"  }",[448,1875,1771],{"class":454},[448,1877,1878,1881,1884,1886,1888,1890,1893,1895,1898,1900,1902,1905,1908,1910,1913],{"class":450,"line":613},[448,1879,1880],{"class":454},"  @",[448,1882,1883],{"class":462},"metadata-create",[448,1885,469],{"class":454},[448,1887,472],{"class":454},[448,1889,678],{"class":454},[448,1891,1892],{"class":1436},"list",[448,1894,498],{"class":454},[448,1896,1897],{"class":1436}," item",[448,1899,1445],{"class":454},[448,1901,1448],{"class":462},[448,1903,1904],{"class":675}," persist",[448,1906,1907],{"class":494},"(list",[448,1909,498],{"class":454},[448,1911,1912],{"class":494}," item)",[448,1914,1771],{"class":454},[448,1916,1917],{"class":450,"line":637},[448,1918,1919],{"class":494},"\u002F>\n",[418,1921,1922,1923,1926,1927,1930,1931,1291,1934,1937,1938,1941,1942,1944,1945,1948,1949,1291,1951,1954,1955,1957,1958,1961,1962,941],{},"Mentions are ",[422,1924,1925],{},"@username"," chips tinted with the item's ",[422,1928,1929],{},"color"," (a ",[422,1932,1933],{},"#rgb",[422,1935,1936],{},"#rrggbb"," value; anything else is dropped). Tags are ",[422,1939,1940],{},"#tag"," chips; the typed name is normalized (",[422,1943,1267],{},": lowercase, spaces → ",[422,1946,1947],{},"-",", letters\u002Fdigits\u002F",[422,1950,1947],{},[422,1952,1953],{},"_"," only plus ",[422,1956,1291],{}," as the separator of a nested name like ",[422,1959,1960],{},"inbox\u002Fto-read",", at most 64 characters), and the popup offers „#name erstellen“ when it is not in the list — picking it emits ",[422,1963,1964],{},"metadataCreate('hashtags', { id, label })",[418,1966,1967,1970,1971,1973,1974,1977,1978,1980,1981,1983,1984,1986,1987,1990,1991,1994],{},[1515,1968,1969],{},"Pipeline stages."," The mentions feature contributes the ",[422,1972,1582],{}," stage: ",[422,1975,1976],{},"@name"," \u002F ",[422,1979,1940],{}," in Markdown that is imported from a file or written by AI turns into chips when the name matches a user already in the document or in the ",[422,1982,1687],{}," list, or a tag already in the document. Without the feature installed, those stay plain text. The transcript feature contributes the ",[422,1985,1586],{}," stage: a paragraph that starts with a bold ",[422,1988,1989],{},"**Name:**"," followed by text becomes a speaker segment (a bare ",[422,1992,1993],{},"**Aufgaben:**"," label stays a paragraph). Both stages run for imported files and for AI results.",[930,1996,1037],{"id":1997},"transcript",[418,1999,2000,2003,2004,2006,2007,2010],{},[422,2001,2002],{},"transcriptFeature()"," adds the speaker segment block: a „Sprecherblock“ toolbar button (Mod-Shift-S), Enter inside a segment splits it keeping the speaker, a speaker field with suggestions from the ",[422,2005,1734],{}," list, the „Sprecherzeile“ entry in the „Umwandeln in …“ menus (paragraphs, headings, lists, quotes and code blocks become segments carrying the last speaker; segments convert back into any core target), and Markdown ",[422,2008,2009],{},"**Name:** text"," export. A segment holds only inline text: headings, lists, quotes, code blocks, media and Typed blocks are revoked inside it.",[2012,2013,2014],"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 .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);}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}",{"title":444,"searchDepth":484,"depth":484,"links":2016},[2017,2018,2019,2020],{"id":932,"depth":484,"text":933},{"id":1281,"depth":484,"text":1282},{"id":1648,"depth":484,"text":1649},{"id":1997,"depth":484,"text":1037},"Add image, audio, video and file blocks, @ mentions and # tags, and speaker transcripts as independent features, with uploads, metadata lists and server schemas.","md",null,{},{"icon":97},{"title":94,"description":2021},"YNdLmKYcQiWzPqByu0IwNLBGEiDXzuPw3wSQwbHnark",[2029,2031],{"title":90,"path":91,"stem":92,"description":2030,"icon":58,"children":-1},"Compose an editor from features and presets, pick the right entries, and choose the integration depth from no data layer to a Nuxt server.",{"title":99,"path":100,"stem":101,"description":2032,"icon":102,"children":-1},"Mark who wrote which text and let readers discuss selections in threads, with a margin or inline layout.",1793213901567]