[{"data":1,"prerenderedAt":14167},["ShallowReactive",2],{"navigation_docs":3,"-guides-advanced-nuxt-example":412,"-guides-advanced-nuxt-example-surround":14162},[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":131,"body":414,"description":14155,"extension":14156,"links":14157,"meta":14158,"navigation":14159,"path":132,"seo":14160,"stem":133,"__hash__":14161},"docs\u002F3.guides\u002F18.advanced-nuxt-example.md",{"type":415,"value":416,"toc":14134},"minimark",[417,438,541,556,581,610,638,669,675,680,701,776,1833,1836,1842,1907,1952,1989,2397,2401,2415,2494,3177,3181,3187,3289,5136,5139,5157,5184,5930,5933,5936,5973,6281,6284,6290,6386,7395,7398,7404,7469,8051,8054,8057,8130,8767,8770,8773,8848,9553,9556,9559,9635,10255,10258,10261,10350,10929,10932,10935,11001,11528,11531,11534,11595,12030,12033,12036,12117,12914,12918,12921,13102,13106,13135,13140,13210,13247,13251,13798,13919,13923,14130],[418,419,420,421,425,426,429,430,433,434,437],"p",{},"The kitchen sink is the part of the repository's Nuxt app that teaches the framework by example. Start the app with ",[422,423,424],"code",{},"bun run dev"," (port 3056; it needs ",[422,427,428],{},"NUXT_SESSION_PASSWORD",", at least 32 characters, in ",[422,431,432],{},".env","), open ",[422,435,436],{},"http:\u002F\u002Flocalhost:3056\u002Fkitchen-sink"," and pick a card. The gallery has three tracks, and this guide has one section per page in the same order:",[439,440,441,454],"table",{},[442,443,444],"thead",{},[445,446,447,451],"tr",{},[448,449,450],"th",{},"Track",[448,452,453],{},"Pages",[455,456,457,487,506],"tbody",{},[445,458,459,463],{},[460,461,462],"td",{},"Basics: what a document is made of, how it is structured, stored and acted on",[460,464,465,470,471,470,475,470,479,470,483],{},[466,467,469],"a",{"href":468},"#structure","Flat & Structure",", ",[466,472,474],{"href":473},"#blocks","Content blocks",[466,476,478],{"href":477},"#json-and-markdown","JSON & Markdown",[466,480,482],{"href":481},"#actions","Acting on blocks",[466,484,486],{"href":485},"#settings","Editor settings",[445,488,489,492],{},[460,490,491],{},"Building blocks: one API of the library, shown on its own",[460,493,494,470,498,470,502],{},[466,495,497],{"href":496},"#simple","Simple",[466,499,501],{"href":500},"#advanced","Advanced",[466,503,505],{"href":504},"#surface","Surface",[445,507,508,511],{},[460,509,510],{},"Use cases: a planned application, built from the framework",[460,512,513,470,517,470,521,470,525,470,529,470,533,470,537],{},[466,514,516],{"href":515},"#minutes","Minutes",[466,518,520],{"href":519},"#slides","Slides",[466,522,524],{"href":523},"#databases","Databases",[466,526,528],{"href":527},"#science","Science",[466,530,532],{"href":531},"#podcast","Podcast",[466,534,536],{"href":535},"#pkm","PKM",[466,538,540],{"href":539},"#epikrise","Epikrise",[418,542,543,544,547,548,551,552,555],{},"Read a page in the browser and the matching section here side by side. Every page is one Vue file, ",[422,545,546],{},"app\u002Fpages\u002Fkitchen-sink\u002F\u003Cslug>.vue",", and the snippet in each section is that file's ",[422,549,550],{},"\u003Cscript setup>",", pulled from the repository by ",[422,553,554],{},"bun run docs:snippets",".",[418,557,558,562,563,566,567,569,570,572,573,576,577,580],{},[559,560,561],"strong",{},"What every page has."," A header with the sample select (each page ships tuned sample documents and an empty one), the toolbar, an „editable“ switch, the settings button and the AI sidebar button. Settings open in a popup the page places itself (",[422,564,565],{},"settings-ui=\"external\"",", see ",[466,568,109],{"href":110},"), the AI sidebar comes in through a slot (",[466,571,113],{"href":114},"). The body is the editor and a side panel on the right; the panel differs per page, and where it has nothing page-specific it shows the document as JSON and Markdown. ",[559,574,575],{},"How it's built"," (the code icon in the header) opens a drawer with the page's lessons and its own source text, and ",[559,578,579],{},"Open in docs"," leads to the section below.",[418,582,583,586,587,590,591,594,595,598,599,602,603,606,607,609],{},[559,584,585],{},"English editor chrome."," The rest of the app is German, the kitchen sink is English. ",[422,588,589],{},"app\u002Flayouts\u002Fkitchen-sink.vue"," provides a copy of the app's editor context with ",[422,592,593],{},"locale: 'en'"," and ",[422,596,597],{},"t: createTranslator('en')",", so the toolbar, the ",[422,600,601],{},"\u002F"," menu and ",[422,604,605],{},"defaultBlockTypes(t)"," read English under that layout while settings, backend and notifier stay the app's own (",[466,608,322],{"href":323},").",[418,611,612,615,616,618,619,622,623,626,627,470,630,633,634,637],{},[559,613,614],{},"Server hints."," Add-ons are imported straight into the pages that use them, so their block types, node views and inspector sections work in a plain ",[422,617,424],{},". What runs on the server (the render targets of slides, charts and Typst, speech synthesis, review records) depends on the ",[422,620,621],{},"NUXT_PUBLIC_ADDONS_*"," flags of ",[422,624,625],{},".env.example",". A page that demonstrates such a capability asks the backend for it (",[422,628,629],{},"ctx.backend.render?.targets()",[422,631,632],{},"ctx.backend.speech",") and shows a ",[422,635,636],{},"ServerHint"," card in its panel, naming the flag, when the server lacks it.",[418,639,640,643,644,470,647,470,650,470,653,656,657,660,661,664,665,668],{},[559,641,642],{},"One editor per page."," Every component placed beside an editor names it: ",[422,645,646],{},"EditorToolbar :editor",[422,648,649],{},"AiSidebar :editor",[422,651,652],{},"CompositeInspector :editor",[422,654,655],{},"useEditorUi(() => editor)",". The editor registers its chrome (settings routing, sidebar toggle, block actions) under its own Tiptap instance. Content lives in the page as TipTap JSON behind ",[422,658,659],{},"v-model",", with its own undo history; no document store, no websocket. External content replacement (picking a sample) emits no update event, so the page refreshes the Markdown output itself once the editor took the new content (",[422,662,663],{},"loadSample"," in ",[422,666,667],{},"app\u002Feditor\u002Fkitchen-sink\u002Fpane.ts","). Switching pages remounts the editor.",[418,670,671,674],{},[559,672,673],{},"Read in this order."," The five Basics pages first: Flat and Structure mode, the blocks a document is made of, the document as JSON and Markdown, the actions on its blocks and the settings every editor reads; every other page assumes them. Then the three editor shapes (Simple, Advanced, Surface), then the applications built from them. Epikrise comes last: it is the only page whose state lives on the server, where the review records are kept by block id.",[676,677,679],"h2",{"id":678},"structure","Structure",[418,681,682,683,686,687,690,691,694,695,697,698,609],{},"Flat mode and Structure mode, shown on one project brief written twice. The mode is the editor setting ",[422,684,685],{},"blocks.structure"," (",[422,688,689],{},"'flat'"," or ",[422,692,693],{},"'structured'",", default ",[422,696,693],{},"); it is one setting for the whole app, stored per user, not state of the page (",[466,699,700],{"href":318},"Settings",[702,703,704,715,723,747,766],"ul",{},[705,706,707,710,711,714],"li",{},[559,708,709],{},"The switch."," The Flat | Structure tabs in the header read and write ",[422,712,713],{},"useEditorSettings().settings.value.blocks.structure","; the settings bridge deep-watches the ref and persists the change, so every editor of the app follows it. Users find the same choice in the settings popup under Editing.",[705,716,717,720,721,609],{},[559,718,719],{},"What changes."," In Flat mode the toolbar offers Heading 1–3; in Structure mode it does not, and new sections are Typed blocks. The AI shapes its output the same way: Markdown headings in Flat mode, nested Typed blocks in Structure mode (",[466,722,113],{"href":114},[705,724,725,728,729,732,733,736,737,740,741,744,745,609],{},[559,726,727],{},"Two samples."," „Flat: project brief“ is headings with paragraphs and lists below them; its Markdown output has ",[422,730,731],{},"##"," headings. „Structure: the same brief“ is the same text as ",[422,734,735],{},"section"," Typed blocks (title, description, tags, body; „Out of scope“ nested inside „Scope“) plus one ",[422,738,739],{},"task"," with status, due date and assignee; its Markdown output wraps each block in a ",[422,742,743],{},"::: section"," fence (",[466,746,122],{"href":123},[705,748,749,752,753,756,757,760,761,763,764,609],{},[559,750,751],{},"Converting."," The two header buttons run the composites feature's commands on the whole document: ",[422,754,755],{},"convertHeadingsToComposites({ recursive: true, scope: 'document', kind })"," groups every heading level into nested Typed blocks of the default Block type, ",[422,758,759],{},"convertCompositesToHeadings({ recursive: true, scope: 'document' })"," turns Typed blocks into headings of their nesting level, with description, tags and properties as text lines. The ",[422,762,601],{}," menu has the same conversions for one level or all levels („Headings to Typed blocks“, „Typed blocks to headings“ and their nested variants), the toolbar's „Convert structure“ menu too. Converting changes the document, not the setting (",[466,765,109],{"href":110},[705,767,768,771,772,775],{},[559,769,770],{},"No panel."," The page leaves the ",[422,773,774],{},"panel"," slot empty on purpose: the default JSON and Markdown output is where the difference shows.",[777,778,784],"pre",{"className":779,"code":780,"filename":781,"language":782,"meta":783,"style":783},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport type { StructureMode } from '@skaile\u002Fforge-editor\u002Fsettings'\nimport { useEditorI18n, useEditorSettings } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_STRUCTURE } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fstructure'\nimport source from '.\u002Fstructure.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F Flat mode & Structure mode. The switch in the header is `blocks.structure`, the app's shared and persisted editor\n\u002F\u002F setting (the same one as settings → Editing), not state of this page: every editor of the app follows it. It decides\n\u002F\u002F what the toolbar offers (Heading 1-3 only in Flat mode) and how the AI shapes its output. The two buttons convert the\n\u002F\u002F whole document with the composites feature's commands; converting does not change the setting. No `panel` on purpose:\n\u002F\u002F the default JSON\u002FMarkdown output shows the difference, `##` headings against `::: section` fences.\n\n\u002F\u002F The built-in Block types put `typedBlock` into the schema, so `section` blocks and the conversion commands exist.\nconst { t } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t)]\n\nconst { settings } = useEditorSettings()\n\u002F\u002F The settings bridge deep-watches the ref and persists the change.\nconst mode = computed\u003CStructureMode>({\n  get: () => settings.value.blocks.structure,\n  set: (value) => { settings.value.blocks.structure = value },\n})\nconst modes = [{ label: 'Flat', value: 'flat' }, { label: 'Structure', value: 'structured' }]\n\nconst page = pageOf('structure')!\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_STRUCTURE)\n\n\u002F\u002F Whole document, every heading level, no matter where the caret is (a non-empty selection narrows it).\nconst groupOptions = () => ({ recursive: true, scope: 'document' as const, kind: settings.value.blocks.defaultBlockType })\nconst flattenOptions = { recursive: true, scope: 'document' as const }\n\u002F\u002F `pane.content` is read so the checks re-run on every edit: the TipTap instance itself is not reactive.\nconst canGroup = computed(() => pane.content && pane.editable && !!pane.editor?.can().convertHeadingsToComposites(groupOptions()))\nconst canFlatten = computed(() => pane.content && pane.editable && !!pane.editor?.can().convertCompositesToHeadings(flattenOptions))\nconst group = () => pane.editor?.chain().focus().convertHeadingsToComposites(groupOptions()).run()\nconst flatten = () => pane.editor?.chain().focus().convertCompositesToHeadings(flattenOptions).run()\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fstructure.vue","vue","",[422,785,786,821,850,871,901,924,950,968,989,1025,1046,1063,1070,1102,1107,1114,1120,1126,1132,1138,1143,1149,1171,1201,1206,1224,1230,1256,1290,1332,1339,1411,1416,1441,1447,1472,1477,1483,1556,1593,1599,1670,1726,1778,1823],{"__ignoreMap":783},[787,788,791,795,799,803,806,809,812,816,818],"span",{"class":789,"line":790},"line",1,[787,792,794],{"class":793},"sMK4o","\u003C",[787,796,798],{"class":797},"swJcz","script",[787,800,802],{"class":801},"spNyl"," setup",[787,804,805],{"class":801}," lang",[787,807,808],{"class":793},"=",[787,810,811],{"class":793},"\"",[787,813,815],{"class":814},"sfazB","ts",[787,817,811],{"class":793},[787,819,820],{"class":793},">\n",[787,822,824,828,831,835,838,841,844,847],{"class":789,"line":823},2,[787,825,827],{"class":826},"s7zQu","import",[787,829,830],{"class":793}," {",[787,832,834],{"class":833},"sTEyZ"," AdvancedEditor",[787,836,837],{"class":793}," }",[787,839,840],{"class":826}," from",[787,842,843],{"class":793}," '",[787,845,846],{"class":814},"@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced",[787,848,849],{"class":793},"'\n",[787,851,853,855,857,860,862,864,866,869],{"class":789,"line":852},3,[787,854,827],{"class":826},[787,856,830],{"class":793},[787,858,859],{"class":833}," AiSidebar",[787,861,837],{"class":793},[787,863,840],{"class":826},[787,865,843],{"class":793},[787,867,868],{"class":814},"@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat",[787,870,849],{"class":793},[787,872,874,876,878,881,884,887,890,892,894,896,899],{"class":789,"line":873},4,[787,875,827],{"class":826},[787,877,830],{"class":793},[787,879,880],{"class":826}," type",[787,882,883],{"class":833}," BlockType",[787,885,886],{"class":793},",",[787,888,889],{"class":833}," defaultBlockTypes",[787,891,837],{"class":793},[787,893,840],{"class":826},[787,895,843],{"class":793},[787,897,898],{"class":814},"@skaile\u002Fforge-editor\u002Fcomposites",[787,900,849],{"class":793},[787,902,904,906,908,910,913,915,917,919,922],{"class":789,"line":903},5,[787,905,827],{"class":826},[787,907,880],{"class":826},[787,909,830],{"class":793},[787,911,912],{"class":833}," StructureMode",[787,914,837],{"class":793},[787,916,840],{"class":826},[787,918,843],{"class":793},[787,920,921],{"class":814},"@skaile\u002Fforge-editor\u002Fsettings",[787,923,849],{"class":793},[787,925,927,929,931,934,936,939,941,943,945,948],{"class":789,"line":926},6,[787,928,827],{"class":826},[787,930,830],{"class":793},[787,932,933],{"class":833}," useEditorI18n",[787,935,886],{"class":793},[787,937,938],{"class":833}," useEditorSettings",[787,940,837],{"class":793},[787,942,840],{"class":826},[787,944,843],{"class":793},[787,946,947],{"class":814},"@skaile\u002Fforge-editor\u002Fvue",[787,949,849],{"class":793},[787,951,953,955,958,961,963,966],{"class":789,"line":952},7,[787,954,827],{"class":826},[787,956,957],{"class":833}," KitchenSinkPage ",[787,959,960],{"class":826},"from",[787,962,843],{"class":793},[787,964,965],{"class":814},"~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue",[787,967,849],{"class":793},[787,969,971,973,975,978,980,982,984,987],{"class":789,"line":970},8,[787,972,827],{"class":826},[787,974,830],{"class":793},[787,976,977],{"class":833}," pageOf",[787,979,837],{"class":793},[787,981,840],{"class":826},[787,983,843],{"class":793},[787,985,986],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fpages",[787,988,849],{"class":793},[787,990,992,994,996,999,1001,1004,1006,1009,1011,1014,1016,1018,1020,1023],{"class":789,"line":991},9,[787,993,827],{"class":826},[787,995,830],{"class":793},[787,997,998],{"class":833}," createPane",[787,1000,886],{"class":793},[787,1002,1003],{"class":833}," paneReady",[787,1005,886],{"class":793},[787,1007,1008],{"class":833}," paneUpdated",[787,1010,886],{"class":793},[787,1012,1013],{"class":833}," showSettings",[787,1015,837],{"class":793},[787,1017,840],{"class":826},[787,1019,843],{"class":793},[787,1021,1022],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fpane",[787,1024,849],{"class":793},[787,1026,1028,1030,1032,1035,1037,1039,1041,1044],{"class":789,"line":1027},10,[787,1029,827],{"class":826},[787,1031,830],{"class":793},[787,1033,1034],{"class":833}," SAMPLES_STRUCTURE",[787,1036,837],{"class":793},[787,1038,840],{"class":826},[787,1040,843],{"class":793},[787,1042,1043],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fstructure",[787,1045,849],{"class":793},[787,1047,1049,1051,1054,1056,1058,1061],{"class":789,"line":1048},11,[787,1050,827],{"class":826},[787,1052,1053],{"class":833}," source ",[787,1055,960],{"class":826},[787,1057,843],{"class":793},[787,1059,1060],{"class":814},".\u002Fstructure.vue?raw",[787,1062,849],{"class":793},[787,1064,1066],{"class":789,"line":1065},12,[787,1067,1069],{"emptyLinePlaceholder":1068},true,"\n",[787,1071,1073,1077,1080,1083,1086,1089,1091,1094,1097,1099],{"class":789,"line":1072},13,[787,1074,1076],{"class":1075},"s2Zo4","definePageMeta",[787,1078,1079],{"class":833},"(",[787,1081,1082],{"class":793},"{",[787,1084,1085],{"class":797}," layout",[787,1087,1088],{"class":793},":",[787,1090,843],{"class":793},[787,1092,1093],{"class":814},"kitchen-sink",[787,1095,1096],{"class":793},"'",[787,1098,837],{"class":793},[787,1100,1101],{"class":833},")\n",[787,1103,1105],{"class":789,"line":1104},14,[787,1106,1069],{"emptyLinePlaceholder":1068},[787,1108,1110],{"class":789,"line":1109},15,[787,1111,1113],{"class":1112},"sHwdD","\u002F\u002F Flat mode & Structure mode. The switch in the header is `blocks.structure`, the app's shared and persisted editor\n",[787,1115,1117],{"class":789,"line":1116},16,[787,1118,1119],{"class":1112},"\u002F\u002F setting (the same one as settings → Editing), not state of this page: every editor of the app follows it. It decides\n",[787,1121,1123],{"class":789,"line":1122},17,[787,1124,1125],{"class":1112},"\u002F\u002F what the toolbar offers (Heading 1-3 only in Flat mode) and how the AI shapes its output. The two buttons convert the\n",[787,1127,1129],{"class":789,"line":1128},18,[787,1130,1131],{"class":1112},"\u002F\u002F whole document with the composites feature's commands; converting does not change the setting. No `panel` on purpose:\n",[787,1133,1135],{"class":789,"line":1134},19,[787,1136,1137],{"class":1112},"\u002F\u002F the default JSON\u002FMarkdown output shows the difference, `##` headings against `::: section` fences.\n",[787,1139,1141],{"class":789,"line":1140},20,[787,1142,1069],{"emptyLinePlaceholder":1068},[787,1144,1146],{"class":789,"line":1145},21,[787,1147,1148],{"class":1112},"\u002F\u002F The built-in Block types put `typedBlock` into the schema, so `section` blocks and the conversion commands exist.\n",[787,1150,1152,1155,1157,1160,1163,1166,1168],{"class":789,"line":1151},22,[787,1153,1154],{"class":801},"const",[787,1156,830],{"class":793},[787,1158,1159],{"class":833}," t ",[787,1161,1162],{"class":793},"}",[787,1164,1165],{"class":793}," =",[787,1167,933],{"class":1075},[787,1169,1170],{"class":833},"()\n",[787,1172,1174,1176,1179,1181,1184,1187,1189,1192,1195,1198],{"class":789,"line":1173},23,[787,1175,1154],{"class":801},[787,1177,1178],{"class":833}," blockTypes",[787,1180,1088],{"class":793},[787,1182,883],{"class":1183},"sBMFI",[787,1185,1186],{"class":833},"[] ",[787,1188,808],{"class":793},[787,1190,1191],{"class":833}," [",[787,1193,1194],{"class":793},"...",[787,1196,1197],{"class":1075},"defaultBlockTypes",[787,1199,1200],{"class":833},"(t)]\n",[787,1202,1204],{"class":789,"line":1203},24,[787,1205,1069],{"emptyLinePlaceholder":1068},[787,1207,1209,1211,1213,1216,1218,1220,1222],{"class":789,"line":1208},25,[787,1210,1154],{"class":801},[787,1212,830],{"class":793},[787,1214,1215],{"class":833}," settings ",[787,1217,1162],{"class":793},[787,1219,1165],{"class":793},[787,1221,938],{"class":1075},[787,1223,1170],{"class":833},[787,1225,1227],{"class":789,"line":1226},26,[787,1228,1229],{"class":1112},"\u002F\u002F The settings bridge deep-watches the ref and persists the change.\n",[787,1231,1233,1235,1238,1240,1243,1245,1248,1251,1253],{"class":789,"line":1232},27,[787,1234,1154],{"class":801},[787,1236,1237],{"class":833}," mode ",[787,1239,808],{"class":793},[787,1241,1242],{"class":1075}," computed",[787,1244,794],{"class":793},[787,1246,1247],{"class":1183},"StructureMode",[787,1249,1250],{"class":793},">",[787,1252,1079],{"class":833},[787,1254,1255],{"class":793},"{\n",[787,1257,1259,1262,1264,1267,1270,1273,1275,1278,1280,1283,1285,1287],{"class":789,"line":1258},28,[787,1260,1261],{"class":1075},"  get",[787,1263,1088],{"class":793},[787,1265,1266],{"class":793}," ()",[787,1268,1269],{"class":801}," =>",[787,1271,1272],{"class":833}," settings",[787,1274,555],{"class":793},[787,1276,1277],{"class":833},"value",[787,1279,555],{"class":793},[787,1281,1282],{"class":833},"blocks",[787,1284,555],{"class":793},[787,1286,678],{"class":833},[787,1288,1289],{"class":793},",\n",[787,1291,1293,1296,1298,1300,1303,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1329],{"class":789,"line":1292},29,[787,1294,1295],{"class":1075},"  set",[787,1297,1088],{"class":793},[787,1299,686],{"class":793},[787,1301,1277],{"class":1302},"sHdIc",[787,1304,1305],{"class":793},")",[787,1307,1269],{"class":801},[787,1309,830],{"class":793},[787,1311,1272],{"class":833},[787,1313,555],{"class":793},[787,1315,1277],{"class":833},[787,1317,555],{"class":793},[787,1319,1282],{"class":833},[787,1321,555],{"class":793},[787,1323,678],{"class":833},[787,1325,1165],{"class":793},[787,1327,1328],{"class":833}," value",[787,1330,1331],{"class":793}," },\n",[787,1333,1335,1337],{"class":789,"line":1334},30,[787,1336,1162],{"class":793},[787,1338,1101],{"class":833},[787,1340,1342,1344,1347,1349,1351,1353,1356,1358,1360,1363,1365,1367,1369,1371,1373,1376,1378,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1404,1406,1408],{"class":789,"line":1341},31,[787,1343,1154],{"class":801},[787,1345,1346],{"class":833}," modes ",[787,1348,808],{"class":793},[787,1350,1191],{"class":833},[787,1352,1082],{"class":793},[787,1354,1355],{"class":797}," label",[787,1357,1088],{"class":793},[787,1359,843],{"class":793},[787,1361,1362],{"class":814},"Flat",[787,1364,1096],{"class":793},[787,1366,886],{"class":793},[787,1368,1328],{"class":797},[787,1370,1088],{"class":793},[787,1372,843],{"class":793},[787,1374,1375],{"class":814},"flat",[787,1377,1096],{"class":793},[787,1379,1380],{"class":793}," },",[787,1382,830],{"class":793},[787,1384,1355],{"class":797},[787,1386,1088],{"class":793},[787,1388,843],{"class":793},[787,1390,679],{"class":814},[787,1392,1096],{"class":793},[787,1394,886],{"class":793},[787,1396,1328],{"class":797},[787,1398,1088],{"class":793},[787,1400,843],{"class":793},[787,1402,1403],{"class":814},"structured",[787,1405,1096],{"class":793},[787,1407,837],{"class":793},[787,1409,1410],{"class":833},"]\n",[787,1412,1414],{"class":789,"line":1413},32,[787,1415,1069],{"emptyLinePlaceholder":1068},[787,1417,1419,1421,1424,1426,1428,1430,1432,1434,1436,1438],{"class":789,"line":1418},33,[787,1420,1154],{"class":801},[787,1422,1423],{"class":833}," page ",[787,1425,808],{"class":793},[787,1427,977],{"class":1075},[787,1429,1079],{"class":833},[787,1431,1096],{"class":793},[787,1433,678],{"class":814},[787,1435,1096],{"class":793},[787,1437,1305],{"class":833},[787,1439,1440],{"class":793},"!\n",[787,1442,1444],{"class":789,"line":1443},34,[787,1445,1446],{"class":1112},"\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\n",[787,1448,1450,1452,1455,1457,1459,1462,1464,1467,1469],{"class":789,"line":1449},35,[787,1451,1154],{"class":801},[787,1453,1454],{"class":833}," pane ",[787,1456,808],{"class":793},[787,1458,998],{"class":1075},[787,1460,1461],{"class":833},"(page",[787,1463,555],{"class":793},[787,1465,1466],{"class":833},"title",[787,1468,886],{"class":793},[787,1470,1471],{"class":833}," SAMPLES_STRUCTURE)\n",[787,1473,1475],{"class":789,"line":1474},36,[787,1476,1069],{"emptyLinePlaceholder":1068},[787,1478,1480],{"class":789,"line":1479},37,[787,1481,1482],{"class":1112},"\u002F\u002F Whole document, every heading level, no matter where the caret is (a non-empty selection narrows it).\n",[787,1484,1486,1488,1491,1493,1495,1497,1499,1501,1504,1506,1510,1512,1515,1517,1519,1522,1524,1527,1530,1532,1535,1537,1539,1541,1543,1545,1547,1549,1552,1554],{"class":789,"line":1485},38,[787,1487,1154],{"class":801},[787,1489,1490],{"class":833}," groupOptions ",[787,1492,808],{"class":793},[787,1494,1266],{"class":793},[787,1496,1269],{"class":801},[787,1498,686],{"class":833},[787,1500,1082],{"class":793},[787,1502,1503],{"class":797}," recursive",[787,1505,1088],{"class":793},[787,1507,1509],{"class":1508},"sfNiH"," true",[787,1511,886],{"class":793},[787,1513,1514],{"class":797}," scope",[787,1516,1088],{"class":793},[787,1518,843],{"class":793},[787,1520,1521],{"class":814},"document",[787,1523,1096],{"class":793},[787,1525,1526],{"class":826}," as",[787,1528,1529],{"class":801}," const",[787,1531,886],{"class":793},[787,1533,1534],{"class":797}," kind",[787,1536,1088],{"class":793},[787,1538,1272],{"class":833},[787,1540,555],{"class":793},[787,1542,1277],{"class":833},[787,1544,555],{"class":793},[787,1546,1282],{"class":833},[787,1548,555],{"class":793},[787,1550,1551],{"class":833},"defaultBlockType ",[787,1553,1162],{"class":793},[787,1555,1101],{"class":833},[787,1557,1559,1561,1564,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590],{"class":789,"line":1558},39,[787,1560,1154],{"class":801},[787,1562,1563],{"class":833}," flattenOptions ",[787,1565,808],{"class":793},[787,1567,830],{"class":793},[787,1569,1503],{"class":797},[787,1571,1088],{"class":793},[787,1573,1509],{"class":1508},[787,1575,886],{"class":793},[787,1577,1514],{"class":797},[787,1579,1088],{"class":793},[787,1581,843],{"class":793},[787,1583,1521],{"class":814},[787,1585,1096],{"class":793},[787,1587,1526],{"class":826},[787,1589,1529],{"class":801},[787,1591,1592],{"class":793}," }\n",[787,1594,1596],{"class":789,"line":1595},40,[787,1597,1598],{"class":1112},"\u002F\u002F `pane.content` is read so the checks re-run on every edit: the TipTap instance itself is not reactive.\n",[787,1600,1602,1604,1607,1609,1611,1613,1616,1618,1621,1623,1626,1629,1631,1633,1636,1638,1641,1644,1646,1649,1652,1655,1657,1659,1662,1664,1667],{"class":789,"line":1601},41,[787,1603,1154],{"class":801},[787,1605,1606],{"class":833}," canGroup ",[787,1608,808],{"class":793},[787,1610,1242],{"class":1075},[787,1612,1079],{"class":833},[787,1614,1615],{"class":793},"()",[787,1617,1269],{"class":801},[787,1619,1620],{"class":833}," pane",[787,1622,555],{"class":793},[787,1624,1625],{"class":833},"content ",[787,1627,1628],{"class":793},"&&",[787,1630,1620],{"class":833},[787,1632,555],{"class":793},[787,1634,1635],{"class":833},"editable ",[787,1637,1628],{"class":793},[787,1639,1640],{"class":793}," !!",[787,1642,1643],{"class":833},"pane",[787,1645,555],{"class":793},[787,1647,1648],{"class":833},"editor",[787,1650,1651],{"class":793},"?.",[787,1653,1654],{"class":1075},"can",[787,1656,1615],{"class":833},[787,1658,555],{"class":793},[787,1660,1661],{"class":1075},"convertHeadingsToComposites",[787,1663,1079],{"class":833},[787,1665,1666],{"class":1075},"groupOptions",[787,1668,1669],{"class":833},"()))\n",[787,1671,1673,1675,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1720,1723],{"class":789,"line":1672},42,[787,1674,1154],{"class":801},[787,1676,1677],{"class":833}," canFlatten ",[787,1679,808],{"class":793},[787,1681,1242],{"class":1075},[787,1683,1079],{"class":833},[787,1685,1615],{"class":793},[787,1687,1269],{"class":801},[787,1689,1620],{"class":833},[787,1691,555],{"class":793},[787,1693,1625],{"class":833},[787,1695,1628],{"class":793},[787,1697,1620],{"class":833},[787,1699,555],{"class":793},[787,1701,1635],{"class":833},[787,1703,1628],{"class":793},[787,1705,1640],{"class":793},[787,1707,1643],{"class":833},[787,1709,555],{"class":793},[787,1711,1648],{"class":833},[787,1713,1651],{"class":793},[787,1715,1654],{"class":1075},[787,1717,1615],{"class":833},[787,1719,555],{"class":793},[787,1721,1722],{"class":1075},"convertCompositesToHeadings",[787,1724,1725],{"class":833},"(flattenOptions))\n",[787,1727,1729,1731,1734,1736,1738,1740,1742,1744,1746,1748,1751,1753,1755,1758,1760,1762,1764,1766,1768,1771,1773,1776],{"class":789,"line":1728},43,[787,1730,1154],{"class":801},[787,1732,1733],{"class":833}," group ",[787,1735,808],{"class":793},[787,1737,1266],{"class":793},[787,1739,1269],{"class":801},[787,1741,1620],{"class":833},[787,1743,555],{"class":793},[787,1745,1648],{"class":833},[787,1747,1651],{"class":793},[787,1749,1750],{"class":1075},"chain",[787,1752,1615],{"class":833},[787,1754,555],{"class":793},[787,1756,1757],{"class":1075},"focus",[787,1759,1615],{"class":833},[787,1761,555],{"class":793},[787,1763,1661],{"class":1075},[787,1765,1079],{"class":833},[787,1767,1666],{"class":1075},[787,1769,1770],{"class":833},"())",[787,1772,555],{"class":793},[787,1774,1775],{"class":1075},"run",[787,1777,1170],{"class":833},[787,1779,1781,1783,1786,1788,1790,1792,1794,1796,1798,1800,1802,1804,1806,1808,1810,1812,1814,1817,1819,1821],{"class":789,"line":1780},44,[787,1782,1154],{"class":801},[787,1784,1785],{"class":833}," flatten ",[787,1787,808],{"class":793},[787,1789,1266],{"class":793},[787,1791,1269],{"class":801},[787,1793,1620],{"class":833},[787,1795,555],{"class":793},[787,1797,1648],{"class":833},[787,1799,1651],{"class":793},[787,1801,1750],{"class":1075},[787,1803,1615],{"class":833},[787,1805,555],{"class":793},[787,1807,1757],{"class":1075},[787,1809,1615],{"class":833},[787,1811,555],{"class":793},[787,1813,1722],{"class":1075},[787,1815,1816],{"class":833},"(flattenOptions)",[787,1818,555],{"class":793},[787,1820,1775],{"class":1075},[787,1822,1170],{"class":833},[787,1824,1826,1829,1831],{"class":789,"line":1825},45,[787,1827,1828],{"class":793},"\u003C\u002F",[787,1830,798],{"class":797},[787,1832,820],{"class":793},[676,1834,1835],{"id":1282},"Blocks",[418,1837,1838,1839,1088],{},"What a document is made of, in the words of the ",[466,1840,1841],{"href":34},"glossary",[702,1843,1844,1850,1856,1862,1868,1874,1882,1893],{},[705,1845,1846,1849],{},[559,1847,1848],{},"Document",": the stored unit a user opens; it holds Blocks but is not itself a Block.",[705,1851,1852,1855],{},[559,1853,1854],{},"Block",": an addressable unit of a Document's content, either a Simple block or a Container block.",[705,1857,1858,1861],{},[559,1859,1860],{},"Simple block",": holds no other Blocks: paragraph, heading, list, quote, code block, media. The items of a list belong to the list.",[705,1863,1864,1867],{},[559,1865,1866],{},"Container block",": holds other Blocks, each addressable and movable on its own.",[705,1869,1870,1873],{},[559,1871,1872],{},"Typed block",": a Container block with a Block type: title, description, tags, then a body of Blocks.",[705,1875,1876,1879,1880,609],{},[559,1877,1878],{},"Block type",": the exact kind of a Typed block (Section, Task, Note, …); it defines the Property definitions, the Accepted children, the Source media types and the AI brief (",[466,1881,165],{"href":166},[705,1883,1884,594,1887,1890,1891,609],{},[559,1885,1886],{},"Block properties",[559,1888,1889],{},"Property definition",": the values a Block carries (status, due date) and the declaration of one of them (key, label, value type) (",[466,1892,175],{"href":176},[705,1894,1895,470,1898,470,1901,1904,1905,609],{},[559,1896,1897],{},"Block capabilities",[559,1899,1900],{},"Block actions",[559,1902,1903],{},"Ability",": what a Block supports, what a user can run on it, and what may be done at one place in the Document (",[466,1906,160],{"href":161},[418,1908,1909,1911,1912,470,1914,470,1916,470,1919,470,1921,470,1924,470,1927,470,1930,470,1933,470,1936,470,1939,594,1942,1945,1946,686,1949,609],{},[422,1910,605],{}," returns the twelve built-in Block types: ",[422,1913,735],{},[422,1915,739],{},[422,1917,1918],{},"note",[422,1920,1521],{},[422,1922,1923],{},"recording",[422,1925,1926],{},"paper",[422,1928,1929],{},"book",[422,1931,1932],{},"figure",[422,1934,1935],{},"rendition",[422,1937,1938],{},"collection",[422,1940,1941],{},"dataView",[422,1943,1944],{},"folder",", labelled in the editor's language. The page appends the host's own ",[422,1947,1948],{},"decisionBlockType",[422,1950,1951],{},"app\u002Feditor\u002Fkitchen-sink\u002Fdecision.ts",[702,1953,1954,1973],{},[705,1955,1956,1959,1960,1962,1963,1965,1966,1968,1969,1972],{},[559,1957,1958],{},"The tour sample."," „Block tour“ introduces each step with a paragraph: Simple blocks (paragraph, heading, list, quote, code block), a ",[422,1961,735],{}," Typed block with tags and a nested section, a ",[422,1964,739],{}," with properties next to a ",[422,1967,1918],{}," without any (its Block type defines none), and the host's ",[422,1970,1971],{},"decision"," with its status.",[705,1974,1975,1978,1979,1982,1983,1986,1987,609],{},[559,1976,1977],{},"Panel."," ",[422,1980,1981],{},"CompositeInspector"," shows the selected block: its Block type, title, description, tags and properties. ",[422,1984,1985],{},"CompositeTable"," lists every Typed block of the document as a row, with filters by Block type and tag. Both read the same editor (",[466,1988,109],{"href":110},[777,1990,1993],{"className":779,"code":1991,"filename":1992,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { CompositeInspector, CompositeTable } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport { useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { decisionBlockType } from '~\u002Feditor\u002Fkitchen-sink\u002Fdecision'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_BLOCKS } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fblocks'\nimport source from '.\u002Fblocks.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F Content blocks: what a document is made of. The sample walks from Simple blocks (paragraph, heading, list, quote,\n\u002F\u002F code) to Container blocks and Typed blocks, then to Block types and their properties. The editor knows the built-in\n\u002F\u002F Block types plus the host's own `decision`; the panel shows two readers of the same document: the inspector for the\n\u002F\u002F selected block's properties and the table of every Typed block.\n\n\u002F\u002F The built-in Block types (labelled in the editor's language) plus the host's own.\nconst { t } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t), decisionBlockType]\n\nconst page = pageOf('blocks')!\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_BLOCKS)\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fblocks.vue",[422,1994,1995,2015,2033,2051,2075,2100,2118,2132,2152,2170,2200,2220,2235,2239,2261,2265,2270,2275,2280,2285,2289,2294,2310,2338,2342,2364,2368,2389],{"__ignoreMap":783},[787,1996,1997,1999,2001,2003,2005,2007,2009,2011,2013],{"class":789,"line":790},[787,1998,794],{"class":793},[787,2000,798],{"class":797},[787,2002,802],{"class":801},[787,2004,805],{"class":801},[787,2006,808],{"class":793},[787,2008,811],{"class":793},[787,2010,815],{"class":814},[787,2012,811],{"class":793},[787,2014,820],{"class":793},[787,2016,2017,2019,2021,2023,2025,2027,2029,2031],{"class":789,"line":823},[787,2018,827],{"class":826},[787,2020,830],{"class":793},[787,2022,834],{"class":833},[787,2024,837],{"class":793},[787,2026,840],{"class":826},[787,2028,843],{"class":793},[787,2030,846],{"class":814},[787,2032,849],{"class":793},[787,2034,2035,2037,2039,2041,2043,2045,2047,2049],{"class":789,"line":852},[787,2036,827],{"class":826},[787,2038,830],{"class":793},[787,2040,859],{"class":833},[787,2042,837],{"class":793},[787,2044,840],{"class":826},[787,2046,843],{"class":793},[787,2048,868],{"class":814},[787,2050,849],{"class":793},[787,2052,2053,2055,2057,2059,2061,2063,2065,2067,2069,2071,2073],{"class":789,"line":873},[787,2054,827],{"class":826},[787,2056,830],{"class":793},[787,2058,880],{"class":826},[787,2060,883],{"class":833},[787,2062,886],{"class":793},[787,2064,889],{"class":833},[787,2066,837],{"class":793},[787,2068,840],{"class":826},[787,2070,843],{"class":793},[787,2072,898],{"class":814},[787,2074,849],{"class":793},[787,2076,2077,2079,2081,2084,2086,2089,2091,2093,2095,2098],{"class":789,"line":903},[787,2078,827],{"class":826},[787,2080,830],{"class":793},[787,2082,2083],{"class":833}," CompositeInspector",[787,2085,886],{"class":793},[787,2087,2088],{"class":833}," CompositeTable",[787,2090,837],{"class":793},[787,2092,840],{"class":826},[787,2094,843],{"class":793},[787,2096,2097],{"class":814},"@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue",[787,2099,849],{"class":793},[787,2101,2102,2104,2106,2108,2110,2112,2114,2116],{"class":789,"line":926},[787,2103,827],{"class":826},[787,2105,830],{"class":793},[787,2107,933],{"class":833},[787,2109,837],{"class":793},[787,2111,840],{"class":826},[787,2113,843],{"class":793},[787,2115,947],{"class":814},[787,2117,849],{"class":793},[787,2119,2120,2122,2124,2126,2128,2130],{"class":789,"line":952},[787,2121,827],{"class":826},[787,2123,957],{"class":833},[787,2125,960],{"class":826},[787,2127,843],{"class":793},[787,2129,965],{"class":814},[787,2131,849],{"class":793},[787,2133,2134,2136,2138,2141,2143,2145,2147,2150],{"class":789,"line":970},[787,2135,827],{"class":826},[787,2137,830],{"class":793},[787,2139,2140],{"class":833}," decisionBlockType",[787,2142,837],{"class":793},[787,2144,840],{"class":826},[787,2146,843],{"class":793},[787,2148,2149],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fdecision",[787,2151,849],{"class":793},[787,2153,2154,2156,2158,2160,2162,2164,2166,2168],{"class":789,"line":991},[787,2155,827],{"class":826},[787,2157,830],{"class":793},[787,2159,977],{"class":833},[787,2161,837],{"class":793},[787,2163,840],{"class":826},[787,2165,843],{"class":793},[787,2167,986],{"class":814},[787,2169,849],{"class":793},[787,2171,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198],{"class":789,"line":1027},[787,2173,827],{"class":826},[787,2175,830],{"class":793},[787,2177,998],{"class":833},[787,2179,886],{"class":793},[787,2181,1003],{"class":833},[787,2183,886],{"class":793},[787,2185,1008],{"class":833},[787,2187,886],{"class":793},[787,2189,1013],{"class":833},[787,2191,837],{"class":793},[787,2193,840],{"class":826},[787,2195,843],{"class":793},[787,2197,1022],{"class":814},[787,2199,849],{"class":793},[787,2201,2202,2204,2206,2209,2211,2213,2215,2218],{"class":789,"line":1048},[787,2203,827],{"class":826},[787,2205,830],{"class":793},[787,2207,2208],{"class":833}," SAMPLES_BLOCKS",[787,2210,837],{"class":793},[787,2212,840],{"class":826},[787,2214,843],{"class":793},[787,2216,2217],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fblocks",[787,2219,849],{"class":793},[787,2221,2222,2224,2226,2228,2230,2233],{"class":789,"line":1065},[787,2223,827],{"class":826},[787,2225,1053],{"class":833},[787,2227,960],{"class":826},[787,2229,843],{"class":793},[787,2231,2232],{"class":814},".\u002Fblocks.vue?raw",[787,2234,849],{"class":793},[787,2236,2237],{"class":789,"line":1072},[787,2238,1069],{"emptyLinePlaceholder":1068},[787,2240,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259],{"class":789,"line":1104},[787,2242,1076],{"class":1075},[787,2244,1079],{"class":833},[787,2246,1082],{"class":793},[787,2248,1085],{"class":797},[787,2250,1088],{"class":793},[787,2252,843],{"class":793},[787,2254,1093],{"class":814},[787,2256,1096],{"class":793},[787,2258,837],{"class":793},[787,2260,1101],{"class":833},[787,2262,2263],{"class":789,"line":1109},[787,2264,1069],{"emptyLinePlaceholder":1068},[787,2266,2267],{"class":789,"line":1116},[787,2268,2269],{"class":1112},"\u002F\u002F Content blocks: what a document is made of. The sample walks from Simple blocks (paragraph, heading, list, quote,\n",[787,2271,2272],{"class":789,"line":1122},[787,2273,2274],{"class":1112},"\u002F\u002F code) to Container blocks and Typed blocks, then to Block types and their properties. The editor knows the built-in\n",[787,2276,2277],{"class":789,"line":1128},[787,2278,2279],{"class":1112},"\u002F\u002F Block types plus the host's own `decision`; the panel shows two readers of the same document: the inspector for the\n",[787,2281,2282],{"class":789,"line":1134},[787,2283,2284],{"class":1112},"\u002F\u002F selected block's properties and the table of every Typed block.\n",[787,2286,2287],{"class":789,"line":1140},[787,2288,1069],{"emptyLinePlaceholder":1068},[787,2290,2291],{"class":789,"line":1145},[787,2292,2293],{"class":1112},"\u002F\u002F The built-in Block types (labelled in the editor's language) plus the host's own.\n",[787,2295,2296,2298,2300,2302,2304,2306,2308],{"class":789,"line":1151},[787,2297,1154],{"class":801},[787,2299,830],{"class":793},[787,2301,1159],{"class":833},[787,2303,1162],{"class":793},[787,2305,1165],{"class":793},[787,2307,933],{"class":1075},[787,2309,1170],{"class":833},[787,2311,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330,2333,2335],{"class":789,"line":1173},[787,2313,1154],{"class":801},[787,2315,1178],{"class":833},[787,2317,1088],{"class":793},[787,2319,883],{"class":1183},[787,2321,1186],{"class":833},[787,2323,808],{"class":793},[787,2325,1191],{"class":833},[787,2327,1194],{"class":793},[787,2329,1197],{"class":1075},[787,2331,2332],{"class":833},"(t)",[787,2334,886],{"class":793},[787,2336,2337],{"class":833}," decisionBlockType]\n",[787,2339,2340],{"class":789,"line":1203},[787,2341,1069],{"emptyLinePlaceholder":1068},[787,2343,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362],{"class":789,"line":1208},[787,2345,1154],{"class":801},[787,2347,1423],{"class":833},[787,2349,808],{"class":793},[787,2351,977],{"class":1075},[787,2353,1079],{"class":833},[787,2355,1096],{"class":793},[787,2357,1282],{"class":814},[787,2359,1096],{"class":793},[787,2361,1305],{"class":833},[787,2363,1440],{"class":793},[787,2365,2366],{"class":789,"line":1226},[787,2367,1446],{"class":1112},[787,2369,2370,2372,2374,2376,2378,2380,2382,2384,2386],{"class":789,"line":1232},[787,2371,1154],{"class":801},[787,2373,1454],{"class":833},[787,2375,808],{"class":793},[787,2377,998],{"class":1075},[787,2379,1461],{"class":833},[787,2381,555],{"class":793},[787,2383,1466],{"class":833},[787,2385,886],{"class":793},[787,2387,2388],{"class":833}," SAMPLES_BLOCKS)\n",[787,2390,2391,2393,2395],{"class":789,"line":1258},[787,2392,1828],{"class":793},[787,2394,798],{"class":797},[787,2396,820],{"class":793},[676,2398,2400],{"id":2399},"json-and-markdown","JSON and Markdown",[418,2402,2403,2404,2406,2407,2410,2411,2414],{},"Document in, document out. The stored form of a document is TipTap JSON: the page hands it to the editor through ",[422,2405,659],{}," and gets every change back as JSON. The editor gives every block an ",[422,2408,2409],{},"id"," attribute when it loads the document; look for ",[422,2412,2413],{},"attrs.id"," in the JSON panel.",[702,2416,2417,2447,2474,2484],{},[705,2418,2419,1978,2422,2425,2426,470,2429,2432,2433,2436,2437,2440,2441,2444,2445,609],{},[559,2420,2421],{},"Markdown out.",[422,2423,2424],{},"editor.getMarkdown()"," writes the document as Markdown. Simple blocks and marks become plain Markdown (",[422,2427,2428],{},"**bold**",[422,2430,2431],{},"++underline++",", lists, quotes, fenced code); a Typed block becomes a ",[422,2434,2435],{},"::: \u003Ckind>"," fence with its properties as JSON, its title as ",[422,2438,2439],{},"## …",", its description as a quote and its tags as a ",[422,2442,2443],{},"Tags:"," line. Markdown keeps a block id only where something in the document points at it (",[466,2446,122],{"href":123},[705,2448,2449,1978,2452,2455,2456,2459,2460,2463,2464,2466,2467,2470,2471,2473],{},[559,2450,2451],{},"Markdown in.",[422,2453,2454],{},"parseBlocks(editor, markdown)"," from ",[422,2457,2458],{},"@skaile\u002Fforge-editor\u002Fcore"," runs the block pipeline a file import uses: ",[422,2461,2462],{},"parsed"," is the whole document as JSON, ",[422,2465,1282],{}," the blocks to insert at the caret. ",[559,2468,2469],{},"Load Markdown"," in the header replaces the document with ",[422,2472,2462],{}," of a release note written as Markdown.",[705,2475,2476,2479,2480,2483],{},[559,2477,2478],{},"The round trip."," The panel writes the document as Markdown, reads it back and compares the result with the document, block ids and the trailing empty paragraph left out (",[422,2481,2482],{},"app\u002Feditor\u002Fkitchen-sink\u002Fround-trip.ts","). „Release note (JSON)“ comes back unchanged; „Lossy: author marks“ does not, because Markdown has no syntax for who wrote a text, and the panel names the first place that differs.",[705,2485,2486,2489,2490,2493],{},[559,2487,2488],{},"JSON the editor refuses."," „Invalid: unknown block“ holds a node the schema does not know. The editor keeps its last valid document and emits ",[422,2491,2492],{},"contentError","; the page shows the message.",[777,2495,2498],{"className":779,"code":2496,"filename":2497,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { parseBlocks } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, refreshMarkdown, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { roundTrip } from '~\u002Feditor\u002Fkitchen-sink\u002Fround-trip'\nimport { RELEASE_MARKDOWN, SAMPLES_JSON_MARKDOWN } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fjson-markdown'\nimport source from '.\u002Fjson-markdown.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F Document in, document out. The stored form is TipTap JSON behind `v-model`; Markdown is a second way in\n\u002F\u002F (`parseBlocks`, the block pipeline an import uses) and out (`editor.getMarkdown()`). The panel writes the document as\n\u002F\u002F Markdown, reads it back and compares the two, block ids left out. JSON the schema does not know is refused through\n\u002F\u002F `contentError`: the editor keeps its last valid document, and the page shows why.\n\nconst { t } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t)]\n\nconst page = pageOf('json-markdown')!\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_JSON_MARKDOWN)\n\nconst contentError = ref\u003Cstring | null>(null)\n\u002F\u002F `sync`: cleared the moment new content is handed in, before the editor checks it and possibly reports an error.\nwatch(() => pane.content, () => { contentError.value = null }, { flush: 'sync' })\n\n\u002F** Replaces the document with Markdown read through the block pipeline: `parsed` is the whole document as JSON. *\u002F\nasync function loadMarkdown() {\n  const editor = pane.editor\n  if (!editor) return\n  pane.content = parseBlocks(editor, RELEASE_MARKDOWN).parsed\n  await nextTick()\n  refreshMarkdown(pane)\n}\n\n\u002F\u002F `pane.markdown` is refreshed on every update, so the round trip follows the document.\nconst trip = computed(() => pane.editor && pane.markdown ? roundTrip(pane.editor, pane.markdown) : null)\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fjson-markdown.vue",[422,2499,2500,2520,2538,2556,2580,2599,2617,2631,2649,2684,2704,2729,2744,2748,2770,2774,2779,2784,2789,2794,2798,2814,2836,2840,2863,2867,2888,2892,2924,2929,2986,2990,2995,3011,3028,3046,3074,3084,3095,3100,3104,3109,3169],{"__ignoreMap":783},[787,2501,2502,2504,2506,2508,2510,2512,2514,2516,2518],{"class":789,"line":790},[787,2503,794],{"class":793},[787,2505,798],{"class":797},[787,2507,802],{"class":801},[787,2509,805],{"class":801},[787,2511,808],{"class":793},[787,2513,811],{"class":793},[787,2515,815],{"class":814},[787,2517,811],{"class":793},[787,2519,820],{"class":793},[787,2521,2522,2524,2526,2528,2530,2532,2534,2536],{"class":789,"line":823},[787,2523,827],{"class":826},[787,2525,830],{"class":793},[787,2527,834],{"class":833},[787,2529,837],{"class":793},[787,2531,840],{"class":826},[787,2533,843],{"class":793},[787,2535,846],{"class":814},[787,2537,849],{"class":793},[787,2539,2540,2542,2544,2546,2548,2550,2552,2554],{"class":789,"line":852},[787,2541,827],{"class":826},[787,2543,830],{"class":793},[787,2545,859],{"class":833},[787,2547,837],{"class":793},[787,2549,840],{"class":826},[787,2551,843],{"class":793},[787,2553,868],{"class":814},[787,2555,849],{"class":793},[787,2557,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578],{"class":789,"line":873},[787,2559,827],{"class":826},[787,2561,830],{"class":793},[787,2563,880],{"class":826},[787,2565,883],{"class":833},[787,2567,886],{"class":793},[787,2569,889],{"class":833},[787,2571,837],{"class":793},[787,2573,840],{"class":826},[787,2575,843],{"class":793},[787,2577,898],{"class":814},[787,2579,849],{"class":793},[787,2581,2582,2584,2586,2589,2591,2593,2595,2597],{"class":789,"line":903},[787,2583,827],{"class":826},[787,2585,830],{"class":793},[787,2587,2588],{"class":833}," parseBlocks",[787,2590,837],{"class":793},[787,2592,840],{"class":826},[787,2594,843],{"class":793},[787,2596,2458],{"class":814},[787,2598,849],{"class":793},[787,2600,2601,2603,2605,2607,2609,2611,2613,2615],{"class":789,"line":926},[787,2602,827],{"class":826},[787,2604,830],{"class":793},[787,2606,933],{"class":833},[787,2608,837],{"class":793},[787,2610,840],{"class":826},[787,2612,843],{"class":793},[787,2614,947],{"class":814},[787,2616,849],{"class":793},[787,2618,2619,2621,2623,2625,2627,2629],{"class":789,"line":952},[787,2620,827],{"class":826},[787,2622,957],{"class":833},[787,2624,960],{"class":826},[787,2626,843],{"class":793},[787,2628,965],{"class":814},[787,2630,849],{"class":793},[787,2632,2633,2635,2637,2639,2641,2643,2645,2647],{"class":789,"line":970},[787,2634,827],{"class":826},[787,2636,830],{"class":793},[787,2638,977],{"class":833},[787,2640,837],{"class":793},[787,2642,840],{"class":826},[787,2644,843],{"class":793},[787,2646,986],{"class":814},[787,2648,849],{"class":793},[787,2650,2651,2653,2655,2657,2659,2661,2663,2665,2667,2670,2672,2674,2676,2678,2680,2682],{"class":789,"line":991},[787,2652,827],{"class":826},[787,2654,830],{"class":793},[787,2656,998],{"class":833},[787,2658,886],{"class":793},[787,2660,1003],{"class":833},[787,2662,886],{"class":793},[787,2664,1008],{"class":833},[787,2666,886],{"class":793},[787,2668,2669],{"class":833}," refreshMarkdown",[787,2671,886],{"class":793},[787,2673,1013],{"class":833},[787,2675,837],{"class":793},[787,2677,840],{"class":826},[787,2679,843],{"class":793},[787,2681,1022],{"class":814},[787,2683,849],{"class":793},[787,2685,2686,2688,2690,2693,2695,2697,2699,2702],{"class":789,"line":1027},[787,2687,827],{"class":826},[787,2689,830],{"class":793},[787,2691,2692],{"class":833}," roundTrip",[787,2694,837],{"class":793},[787,2696,840],{"class":826},[787,2698,843],{"class":793},[787,2700,2701],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fround-trip",[787,2703,849],{"class":793},[787,2705,2706,2708,2710,2713,2715,2718,2720,2722,2724,2727],{"class":789,"line":1048},[787,2707,827],{"class":826},[787,2709,830],{"class":793},[787,2711,2712],{"class":833}," RELEASE_MARKDOWN",[787,2714,886],{"class":793},[787,2716,2717],{"class":833}," SAMPLES_JSON_MARKDOWN",[787,2719,837],{"class":793},[787,2721,840],{"class":826},[787,2723,843],{"class":793},[787,2725,2726],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fjson-markdown",[787,2728,849],{"class":793},[787,2730,2731,2733,2735,2737,2739,2742],{"class":789,"line":1065},[787,2732,827],{"class":826},[787,2734,1053],{"class":833},[787,2736,960],{"class":826},[787,2738,843],{"class":793},[787,2740,2741],{"class":814},".\u002Fjson-markdown.vue?raw",[787,2743,849],{"class":793},[787,2745,2746],{"class":789,"line":1072},[787,2747,1069],{"emptyLinePlaceholder":1068},[787,2749,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768],{"class":789,"line":1104},[787,2751,1076],{"class":1075},[787,2753,1079],{"class":833},[787,2755,1082],{"class":793},[787,2757,1085],{"class":797},[787,2759,1088],{"class":793},[787,2761,843],{"class":793},[787,2763,1093],{"class":814},[787,2765,1096],{"class":793},[787,2767,837],{"class":793},[787,2769,1101],{"class":833},[787,2771,2772],{"class":789,"line":1109},[787,2773,1069],{"emptyLinePlaceholder":1068},[787,2775,2776],{"class":789,"line":1116},[787,2777,2778],{"class":1112},"\u002F\u002F Document in, document out. The stored form is TipTap JSON behind `v-model`; Markdown is a second way in\n",[787,2780,2781],{"class":789,"line":1122},[787,2782,2783],{"class":1112},"\u002F\u002F (`parseBlocks`, the block pipeline an import uses) and out (`editor.getMarkdown()`). The panel writes the document as\n",[787,2785,2786],{"class":789,"line":1128},[787,2787,2788],{"class":1112},"\u002F\u002F Markdown, reads it back and compares the two, block ids left out. JSON the schema does not know is refused through\n",[787,2790,2791],{"class":789,"line":1134},[787,2792,2793],{"class":1112},"\u002F\u002F `contentError`: the editor keeps its last valid document, and the page shows why.\n",[787,2795,2796],{"class":789,"line":1140},[787,2797,1069],{"emptyLinePlaceholder":1068},[787,2799,2800,2802,2804,2806,2808,2810,2812],{"class":789,"line":1145},[787,2801,1154],{"class":801},[787,2803,830],{"class":793},[787,2805,1159],{"class":833},[787,2807,1162],{"class":793},[787,2809,1165],{"class":793},[787,2811,933],{"class":1075},[787,2813,1170],{"class":833},[787,2815,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834],{"class":789,"line":1151},[787,2817,1154],{"class":801},[787,2819,1178],{"class":833},[787,2821,1088],{"class":793},[787,2823,883],{"class":1183},[787,2825,1186],{"class":833},[787,2827,808],{"class":793},[787,2829,1191],{"class":833},[787,2831,1194],{"class":793},[787,2833,1197],{"class":1075},[787,2835,1200],{"class":833},[787,2837,2838],{"class":789,"line":1173},[787,2839,1069],{"emptyLinePlaceholder":1068},[787,2841,2842,2844,2846,2848,2850,2852,2854,2857,2859,2861],{"class":789,"line":1203},[787,2843,1154],{"class":801},[787,2845,1423],{"class":833},[787,2847,808],{"class":793},[787,2849,977],{"class":1075},[787,2851,1079],{"class":833},[787,2853,1096],{"class":793},[787,2855,2856],{"class":814},"json-markdown",[787,2858,1096],{"class":793},[787,2860,1305],{"class":833},[787,2862,1440],{"class":793},[787,2864,2865],{"class":789,"line":1208},[787,2866,1446],{"class":1112},[787,2868,2869,2871,2873,2875,2877,2879,2881,2883,2885],{"class":789,"line":1226},[787,2870,1154],{"class":801},[787,2872,1454],{"class":833},[787,2874,808],{"class":793},[787,2876,998],{"class":1075},[787,2878,1461],{"class":833},[787,2880,555],{"class":793},[787,2882,1466],{"class":833},[787,2884,886],{"class":793},[787,2886,2887],{"class":833}," SAMPLES_JSON_MARKDOWN)\n",[787,2889,2890],{"class":789,"line":1232},[787,2891,1069],{"emptyLinePlaceholder":1068},[787,2893,2894,2896,2899,2901,2904,2906,2909,2912,2915,2917,2919,2922],{"class":789,"line":1258},[787,2895,1154],{"class":801},[787,2897,2898],{"class":833}," contentError ",[787,2900,808],{"class":793},[787,2902,2903],{"class":1075}," ref",[787,2905,794],{"class":793},[787,2907,2908],{"class":1183},"string",[787,2910,2911],{"class":793}," |",[787,2913,2914],{"class":1183}," null",[787,2916,1250],{"class":793},[787,2918,1079],{"class":833},[787,2920,2921],{"class":793},"null",[787,2923,1101],{"class":833},[787,2925,2926],{"class":789,"line":1292},[787,2927,2928],{"class":1112},"\u002F\u002F `sync`: cleared the moment new content is handed in, before the editor checks it and possibly reports an error.\n",[787,2930,2931,2934,2936,2938,2940,2942,2944,2947,2949,2951,2953,2955,2958,2960,2962,2964,2966,2968,2970,2973,2975,2977,2980,2982,2984],{"class":789,"line":1334},[787,2932,2933],{"class":1075},"watch",[787,2935,1079],{"class":833},[787,2937,1615],{"class":793},[787,2939,1269],{"class":801},[787,2941,1620],{"class":833},[787,2943,555],{"class":793},[787,2945,2946],{"class":833},"content",[787,2948,886],{"class":793},[787,2950,1266],{"class":793},[787,2952,1269],{"class":801},[787,2954,830],{"class":793},[787,2956,2957],{"class":833}," contentError",[787,2959,555],{"class":793},[787,2961,1277],{"class":833},[787,2963,1165],{"class":793},[787,2965,2914],{"class":793},[787,2967,1380],{"class":793},[787,2969,830],{"class":793},[787,2971,2972],{"class":797}," flush",[787,2974,1088],{"class":793},[787,2976,843],{"class":793},[787,2978,2979],{"class":814},"sync",[787,2981,1096],{"class":793},[787,2983,837],{"class":793},[787,2985,1101],{"class":833},[787,2987,2988],{"class":789,"line":1341},[787,2989,1069],{"emptyLinePlaceholder":1068},[787,2991,2992],{"class":789,"line":1413},[787,2993,2994],{"class":1112},"\u002F** Replaces the document with Markdown read through the block pipeline: `parsed` is the whole document as JSON. *\u002F\n",[787,2996,2997,3000,3003,3006,3008],{"class":789,"line":1418},[787,2998,2999],{"class":801},"async",[787,3001,3002],{"class":801}," function",[787,3004,3005],{"class":1075}," loadMarkdown",[787,3007,1615],{"class":793},[787,3009,3010],{"class":793}," {\n",[787,3012,3013,3016,3019,3021,3023,3025],{"class":789,"line":1443},[787,3014,3015],{"class":801},"  const",[787,3017,3018],{"class":833}," editor",[787,3020,1165],{"class":793},[787,3022,1620],{"class":833},[787,3024,555],{"class":793},[787,3026,3027],{"class":833},"editor\n",[787,3029,3030,3033,3035,3038,3040,3043],{"class":789,"line":1449},[787,3031,3032],{"class":826},"  if",[787,3034,686],{"class":797},[787,3036,3037],{"class":793},"!",[787,3039,1648],{"class":833},[787,3041,3042],{"class":797},") ",[787,3044,3045],{"class":826},"return\n",[787,3047,3048,3051,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071],{"class":789,"line":1474},[787,3049,3050],{"class":833},"  pane",[787,3052,555],{"class":793},[787,3054,2946],{"class":833},[787,3056,1165],{"class":793},[787,3058,2588],{"class":1075},[787,3060,1079],{"class":797},[787,3062,1648],{"class":833},[787,3064,886],{"class":793},[787,3066,2712],{"class":833},[787,3068,1305],{"class":797},[787,3070,555],{"class":793},[787,3072,3073],{"class":833},"parsed\n",[787,3075,3076,3079,3082],{"class":789,"line":1479},[787,3077,3078],{"class":826},"  await",[787,3080,3081],{"class":1075}," nextTick",[787,3083,1170],{"class":797},[787,3085,3086,3089,3091,3093],{"class":789,"line":1485},[787,3087,3088],{"class":1075},"  refreshMarkdown",[787,3090,1079],{"class":797},[787,3092,1643],{"class":833},[787,3094,1101],{"class":797},[787,3096,3097],{"class":789,"line":1558},[787,3098,3099],{"class":793},"}\n",[787,3101,3102],{"class":789,"line":1595},[787,3103,1069],{"emptyLinePlaceholder":1068},[787,3105,3106],{"class":789,"line":1601},[787,3107,3108],{"class":1112},"\u002F\u002F `pane.markdown` is refreshed on every update, so the round trip follows the document.\n",[787,3110,3111,3113,3116,3118,3120,3122,3124,3126,3128,3130,3133,3135,3137,3139,3142,3145,3147,3150,3152,3154,3156,3158,3160,3163,3165,3167],{"class":789,"line":1672},[787,3112,1154],{"class":801},[787,3114,3115],{"class":833}," trip ",[787,3117,808],{"class":793},[787,3119,1242],{"class":1075},[787,3121,1079],{"class":833},[787,3123,1615],{"class":793},[787,3125,1269],{"class":801},[787,3127,1620],{"class":833},[787,3129,555],{"class":793},[787,3131,3132],{"class":833},"editor ",[787,3134,1628],{"class":793},[787,3136,1620],{"class":833},[787,3138,555],{"class":793},[787,3140,3141],{"class":833},"markdown ",[787,3143,3144],{"class":793},"?",[787,3146,2692],{"class":1075},[787,3148,3149],{"class":833},"(pane",[787,3151,555],{"class":793},[787,3153,1648],{"class":833},[787,3155,886],{"class":793},[787,3157,1620],{"class":833},[787,3159,555],{"class":793},[787,3161,3162],{"class":833},"markdown) ",[787,3164,1088],{"class":793},[787,3166,2914],{"class":793},[787,3168,1101],{"class":833},[787,3170,3171,3173,3175],{"class":789,"line":1728},[787,3172,1828],{"class":793},[787,3174,798],{"class":797},[787,3176,820],{"class":793},[676,3178,3180],{"id":3179},"actions","Actions",[418,3182,3183,3184,3186],{},"Commands and block actions are two ways to act on a document. A command (the ",[422,3185,601],{}," menu, the toolbar) inserts or formats at the caret; a block action acts on a block that is already there. The drag handle on the left of a block moves it.",[702,3188,3189,3222,3248,3284],{},[705,3190,3191,3194,3195,686,3198,470,3201,690,3204,3207,3208,3211,3212,3215,3216,3219,3220,555],{},[559,3192,3193],{},"Where block actions appear."," On the hover bar of the block under the pointer, on the toolbar of the block holding the selection, or both: ",[422,3196,3197],{},"blockUi.actions",[422,3199,3200],{},"'hover'",[422,3202,3203],{},"'toolbar'",[422,3205,3206],{},"'both'","; ",[466,3209,3210],{"href":313},"Block UI","). The editor reads ",[422,3213,3214],{},"blockUi"," once, so the Hover\u002FToolbar\u002FBoth switch in the header remounts it with ",[422,3217,3218],{},":key","; the document stays in ",[422,3221,659],{},[705,3223,3224,1978,3227,3230,3231,470,3233,3236,3237,3240,3241,470,3244,3247],{},[559,3225,3226],{},"Own actions.",[422,3228,3229],{},"blockActions"," adds the page's three: „Copy block id“ (",[422,3232,1775],{},[422,3234,3235],{},"readOnly: true",", so it stays in a read-only editor), „Insert after“ (",[422,3238,3239],{},"menu",": a dropdown of a paragraph or a divider) and „Count blocks inside“ (",[422,3242,3243],{},"requires: ['container']",[422,3245,3246],{},"target: 'typedBlock'",": only on Typed blocks, and on the toolbar also while the caret is in such a block's body).",[705,3249,3250,3253,3254,3257,3258,3261,3262,3265,3266,3268,3269,3272,3273,594,3276,3279,3280,3283],{},[559,3251,3252],{},"Who decides."," Whether an action is offered is decided per block: its ",[422,3255,3256],{},"ability"," at that place in the document, the Block capabilities it ",[422,3259,3260],{},"requires",", and ",[422,3263,3264],{},"readOnly"," in a read-only editor (",[466,3267,160],{"href":161},"). The page's ",[422,3270,3271],{},"abilities"," rule revokes ",[422,3274,3275],{},"block.delete",[422,3277,3278],{},"block.duplicate"," inside every ",[422,3281,3282],{},"blockquote",", so the quote's paragraph has no Delete and no Duplicate. Turn off „editable“ and only the reading actions are left.",[705,3285,3286,3288],{},[559,3287,1977],{}," The action log lists the last runs of the page's own actions with the block they ran on, above the document as Markdown.",[777,3290,3293],{"className":779,"code":3291,"filename":3292,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport type { AbilitiesOptions, BlockAction, BlockActionContext, BlockActionSurface } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { ABILITY } from '@skaile\u002Fforge-editor\u002Fcore\u002Fschema'\nimport { useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_ACTIONS } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Factions'\nimport source from '.\u002Factions.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F Acting on blocks. Commands (`\u002F` menu, toolbar) insert; block actions act on a block that is there, on its hover bar,\n\u002F\u002F on the toolbar of the block holding the selection, or both (`blockUi`, read once at setup: the editor is remounted\n\u002F\u002F with `:key` when the surface changes, the document stays in `v-model`). Whether an action is offered is decided per\n\u002F\u002F block: its `ability` at that place in the document, the capabilities it `requires`, and `readOnly` in a read-only\n\u002F\u002F editor. The page's ability rule takes delete and duplicate away inside quotes; the panel logs every run.\n\nconst { t } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t)]\n\nconst page = pageOf('actions')!\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_ACTIONS)\n\nconst surface = ref\u003CBlockActionSurface | 'both'>('hover')\nconst surfaces = [{ label: 'Hover', value: 'hover' }, { label: 'Toolbar', value: 'toolbar' }, { label: 'Both', value: 'both' }]\n\n\u002F\u002F Inside a quote, its blocks may not be deleted or duplicated: the built-in actions with these abilities disappear there.\nconst abilities: Partial\u003CAbilitiesOptions> = { rules: { blockquote: { revokes: [ABILITY.blockDelete, ABILITY.blockDuplicate] } } }\n\nconst log = ref\u003C{ at: string, action: string, block: string }[]>([])\nfunction record(action: string, { node }: BlockActionContext) {\n  const block = node.attrs.blockType ? `${node.type.name} (${node.attrs.blockType})` : node.type.name\n  log.value = [{ at: new Date().toLocaleTimeString('en-GB'), action, block }, ...log.value].slice(0, 8)\n}\n\nconst toast = useToast()\nconst blockActions: BlockAction[] = [\n  {\n    \u002F\u002F Reads only, so it stays on the bar of a read-only editor.\n    id: 'copy-id',\n    label: 'Copy block id',\n    icon: 'i-lucide-fingerprint',\n    readOnly: true,\n    run: (ctx) => {\n      void navigator.clipboard?.writeText(String(ctx.node.attrs.id ?? ''))\n      toast.add({ title: 'Block id copied', description: String(ctx.node.attrs.id ?? 'no id'), icon: 'i-lucide-fingerprint' })\n      record('Copy block id', ctx)\n    },\n  },\n  {\n    \u002F\u002F A `menu` instead of `run`: a dropdown of the items it returns.\n    id: 'insert-after',\n    label: 'Insert after',\n    icon: 'i-lucide-list-plus',\n    menu: ctx => [\n      { label: 'Paragraph', icon: 'i-lucide-pilcrow', onSelect: () => insertAfter(ctx, { type: 'paragraph' }, 'Insert paragraph') },\n      { label: 'Divider', icon: 'i-lucide-minus', onSelect: () => insertAfter(ctx, { type: 'horizontalRule' }, 'Insert divider') },\n    ],\n  },\n  {\n    \u002F\u002F Only on blocks that hold other blocks; on the toolbar also while the caret is inside such a block's body.\n    id: 'count-children',\n    label: 'Count blocks inside',\n    icon: 'i-lucide-hash',\n    requires: ['container'],\n    target: 'typedBlock',\n    readOnly: true,\n    run: (ctx) => {\n      let count = 0\n      \u002F\u002F Title, description and tags are the Typed block's chrome, not blocks of its body.\n      ctx.node.forEach((child) => { if (!['typedBlockTitle', 'typedBlockDescription', 'typedBlockTags'].includes(child.type.name)) count++ })\n      toast.add({ title: `${count} blocks inside`, icon: 'i-lucide-hash' })\n      record('Count blocks inside', ctx)\n    },\n  },\n]\n\nfunction insertAfter(ctx: BlockActionContext, node: { type: string }, action: string) {\n  ctx.editor.chain().focus().insertContentAt(ctx.pos + ctx.node.nodeSize, node).run()\n  record(action, ctx)\n}\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Factions.vue",[422,3294,3295,3315,3333,3351,3375,3411,3431,3449,3463,3481,3511,3531,3546,3550,3572,3576,3581,3586,3591,3596,3601,3605,3621,3643,3647,3669,3673,3694,3698,3736,3831,3835,3840,3905,3909,3959,3992,4069,4153,4157,4161,4175,4193,4198,4203,4219,4236,4253,4265,4284,4333,4414,4435,4441,4447,4452,4458,4474,4490,4506,4520,4596,4667,4675,4680,4685,4691,4707,4723,4739,4760,4777,4788,4805,4819,4825,4920,4964,4983,4988,4993,4998,5003,5044,5106,5122,5127],{"__ignoreMap":783},[787,3296,3297,3299,3301,3303,3305,3307,3309,3311,3313],{"class":789,"line":790},[787,3298,794],{"class":793},[787,3300,798],{"class":797},[787,3302,802],{"class":801},[787,3304,805],{"class":801},[787,3306,808],{"class":793},[787,3308,811],{"class":793},[787,3310,815],{"class":814},[787,3312,811],{"class":793},[787,3314,820],{"class":793},[787,3316,3317,3319,3321,3323,3325,3327,3329,3331],{"class":789,"line":823},[787,3318,827],{"class":826},[787,3320,830],{"class":793},[787,3322,834],{"class":833},[787,3324,837],{"class":793},[787,3326,840],{"class":826},[787,3328,843],{"class":793},[787,3330,846],{"class":814},[787,3332,849],{"class":793},[787,3334,3335,3337,3339,3341,3343,3345,3347,3349],{"class":789,"line":852},[787,3336,827],{"class":826},[787,3338,830],{"class":793},[787,3340,859],{"class":833},[787,3342,837],{"class":793},[787,3344,840],{"class":826},[787,3346,843],{"class":793},[787,3348,868],{"class":814},[787,3350,849],{"class":793},[787,3352,3353,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373],{"class":789,"line":873},[787,3354,827],{"class":826},[787,3356,830],{"class":793},[787,3358,880],{"class":826},[787,3360,883],{"class":833},[787,3362,886],{"class":793},[787,3364,889],{"class":833},[787,3366,837],{"class":793},[787,3368,840],{"class":826},[787,3370,843],{"class":793},[787,3372,898],{"class":814},[787,3374,849],{"class":793},[787,3376,3377,3379,3381,3383,3386,3388,3391,3393,3396,3398,3401,3403,3405,3407,3409],{"class":789,"line":903},[787,3378,827],{"class":826},[787,3380,880],{"class":826},[787,3382,830],{"class":793},[787,3384,3385],{"class":833}," AbilitiesOptions",[787,3387,886],{"class":793},[787,3389,3390],{"class":833}," BlockAction",[787,3392,886],{"class":793},[787,3394,3395],{"class":833}," BlockActionContext",[787,3397,886],{"class":793},[787,3399,3400],{"class":833}," BlockActionSurface",[787,3402,837],{"class":793},[787,3404,840],{"class":826},[787,3406,843],{"class":793},[787,3408,2458],{"class":814},[787,3410,849],{"class":793},[787,3412,3413,3415,3417,3420,3422,3424,3426,3429],{"class":789,"line":926},[787,3414,827],{"class":826},[787,3416,830],{"class":793},[787,3418,3419],{"class":833}," ABILITY",[787,3421,837],{"class":793},[787,3423,840],{"class":826},[787,3425,843],{"class":793},[787,3427,3428],{"class":814},"@skaile\u002Fforge-editor\u002Fcore\u002Fschema",[787,3430,849],{"class":793},[787,3432,3433,3435,3437,3439,3441,3443,3445,3447],{"class":789,"line":952},[787,3434,827],{"class":826},[787,3436,830],{"class":793},[787,3438,933],{"class":833},[787,3440,837],{"class":793},[787,3442,840],{"class":826},[787,3444,843],{"class":793},[787,3446,947],{"class":814},[787,3448,849],{"class":793},[787,3450,3451,3453,3455,3457,3459,3461],{"class":789,"line":970},[787,3452,827],{"class":826},[787,3454,957],{"class":833},[787,3456,960],{"class":826},[787,3458,843],{"class":793},[787,3460,965],{"class":814},[787,3462,849],{"class":793},[787,3464,3465,3467,3469,3471,3473,3475,3477,3479],{"class":789,"line":991},[787,3466,827],{"class":826},[787,3468,830],{"class":793},[787,3470,977],{"class":833},[787,3472,837],{"class":793},[787,3474,840],{"class":826},[787,3476,843],{"class":793},[787,3478,986],{"class":814},[787,3480,849],{"class":793},[787,3482,3483,3485,3487,3489,3491,3493,3495,3497,3499,3501,3503,3505,3507,3509],{"class":789,"line":1027},[787,3484,827],{"class":826},[787,3486,830],{"class":793},[787,3488,998],{"class":833},[787,3490,886],{"class":793},[787,3492,1003],{"class":833},[787,3494,886],{"class":793},[787,3496,1008],{"class":833},[787,3498,886],{"class":793},[787,3500,1013],{"class":833},[787,3502,837],{"class":793},[787,3504,840],{"class":826},[787,3506,843],{"class":793},[787,3508,1022],{"class":814},[787,3510,849],{"class":793},[787,3512,3513,3515,3517,3520,3522,3524,3526,3529],{"class":789,"line":1048},[787,3514,827],{"class":826},[787,3516,830],{"class":793},[787,3518,3519],{"class":833}," SAMPLES_ACTIONS",[787,3521,837],{"class":793},[787,3523,840],{"class":826},[787,3525,843],{"class":793},[787,3527,3528],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Factions",[787,3530,849],{"class":793},[787,3532,3533,3535,3537,3539,3541,3544],{"class":789,"line":1065},[787,3534,827],{"class":826},[787,3536,1053],{"class":833},[787,3538,960],{"class":826},[787,3540,843],{"class":793},[787,3542,3543],{"class":814},".\u002Factions.vue?raw",[787,3545,849],{"class":793},[787,3547,3548],{"class":789,"line":1072},[787,3549,1069],{"emptyLinePlaceholder":1068},[787,3551,3552,3554,3556,3558,3560,3562,3564,3566,3568,3570],{"class":789,"line":1104},[787,3553,1076],{"class":1075},[787,3555,1079],{"class":833},[787,3557,1082],{"class":793},[787,3559,1085],{"class":797},[787,3561,1088],{"class":793},[787,3563,843],{"class":793},[787,3565,1093],{"class":814},[787,3567,1096],{"class":793},[787,3569,837],{"class":793},[787,3571,1101],{"class":833},[787,3573,3574],{"class":789,"line":1109},[787,3575,1069],{"emptyLinePlaceholder":1068},[787,3577,3578],{"class":789,"line":1116},[787,3579,3580],{"class":1112},"\u002F\u002F Acting on blocks. Commands (`\u002F` menu, toolbar) insert; block actions act on a block that is there, on its hover bar,\n",[787,3582,3583],{"class":789,"line":1122},[787,3584,3585],{"class":1112},"\u002F\u002F on the toolbar of the block holding the selection, or both (`blockUi`, read once at setup: the editor is remounted\n",[787,3587,3588],{"class":789,"line":1128},[787,3589,3590],{"class":1112},"\u002F\u002F with `:key` when the surface changes, the document stays in `v-model`). Whether an action is offered is decided per\n",[787,3592,3593],{"class":789,"line":1134},[787,3594,3595],{"class":1112},"\u002F\u002F block: its `ability` at that place in the document, the capabilities it `requires`, and `readOnly` in a read-only\n",[787,3597,3598],{"class":789,"line":1140},[787,3599,3600],{"class":1112},"\u002F\u002F editor. The page's ability rule takes delete and duplicate away inside quotes; the panel logs every run.\n",[787,3602,3603],{"class":789,"line":1145},[787,3604,1069],{"emptyLinePlaceholder":1068},[787,3606,3607,3609,3611,3613,3615,3617,3619],{"class":789,"line":1151},[787,3608,1154],{"class":801},[787,3610,830],{"class":793},[787,3612,1159],{"class":833},[787,3614,1162],{"class":793},[787,3616,1165],{"class":793},[787,3618,933],{"class":1075},[787,3620,1170],{"class":833},[787,3622,3623,3625,3627,3629,3631,3633,3635,3637,3639,3641],{"class":789,"line":1173},[787,3624,1154],{"class":801},[787,3626,1178],{"class":833},[787,3628,1088],{"class":793},[787,3630,883],{"class":1183},[787,3632,1186],{"class":833},[787,3634,808],{"class":793},[787,3636,1191],{"class":833},[787,3638,1194],{"class":793},[787,3640,1197],{"class":1075},[787,3642,1200],{"class":833},[787,3644,3645],{"class":789,"line":1203},[787,3646,1069],{"emptyLinePlaceholder":1068},[787,3648,3649,3651,3653,3655,3657,3659,3661,3663,3665,3667],{"class":789,"line":1208},[787,3650,1154],{"class":801},[787,3652,1423],{"class":833},[787,3654,808],{"class":793},[787,3656,977],{"class":1075},[787,3658,1079],{"class":833},[787,3660,1096],{"class":793},[787,3662,3179],{"class":814},[787,3664,1096],{"class":793},[787,3666,1305],{"class":833},[787,3668,1440],{"class":793},[787,3670,3671],{"class":789,"line":1226},[787,3672,1446],{"class":1112},[787,3674,3675,3677,3679,3681,3683,3685,3687,3689,3691],{"class":789,"line":1232},[787,3676,1154],{"class":801},[787,3678,1454],{"class":833},[787,3680,808],{"class":793},[787,3682,998],{"class":1075},[787,3684,1461],{"class":833},[787,3686,555],{"class":793},[787,3688,1466],{"class":833},[787,3690,886],{"class":793},[787,3692,3693],{"class":833}," SAMPLES_ACTIONS)\n",[787,3695,3696],{"class":789,"line":1258},[787,3697,1069],{"emptyLinePlaceholder":1068},[787,3699,3700,3702,3705,3707,3709,3711,3714,3716,3718,3721,3723,3725,3727,3729,3732,3734],{"class":789,"line":1292},[787,3701,1154],{"class":801},[787,3703,3704],{"class":833}," surface ",[787,3706,808],{"class":793},[787,3708,2903],{"class":1075},[787,3710,794],{"class":793},[787,3712,3713],{"class":1183},"BlockActionSurface",[787,3715,2911],{"class":793},[787,3717,843],{"class":793},[787,3719,3720],{"class":814},"both",[787,3722,1096],{"class":793},[787,3724,1250],{"class":793},[787,3726,1079],{"class":833},[787,3728,1096],{"class":793},[787,3730,3731],{"class":814},"hover",[787,3733,1096],{"class":793},[787,3735,1101],{"class":833},[787,3737,3738,3740,3743,3745,3747,3749,3751,3753,3755,3758,3760,3762,3764,3766,3768,3770,3772,3774,3776,3778,3780,3782,3785,3787,3789,3791,3793,3795,3798,3800,3802,3804,3806,3808,3810,3813,3815,3817,3819,3821,3823,3825,3827,3829],{"class":789,"line":1334},[787,3739,1154],{"class":801},[787,3741,3742],{"class":833}," surfaces ",[787,3744,808],{"class":793},[787,3746,1191],{"class":833},[787,3748,1082],{"class":793},[787,3750,1355],{"class":797},[787,3752,1088],{"class":793},[787,3754,843],{"class":793},[787,3756,3757],{"class":814},"Hover",[787,3759,1096],{"class":793},[787,3761,886],{"class":793},[787,3763,1328],{"class":797},[787,3765,1088],{"class":793},[787,3767,843],{"class":793},[787,3769,3731],{"class":814},[787,3771,1096],{"class":793},[787,3773,1380],{"class":793},[787,3775,830],{"class":793},[787,3777,1355],{"class":797},[787,3779,1088],{"class":793},[787,3781,843],{"class":793},[787,3783,3784],{"class":814},"Toolbar",[787,3786,1096],{"class":793},[787,3788,886],{"class":793},[787,3790,1328],{"class":797},[787,3792,1088],{"class":793},[787,3794,843],{"class":793},[787,3796,3797],{"class":814},"toolbar",[787,3799,1096],{"class":793},[787,3801,1380],{"class":793},[787,3803,830],{"class":793},[787,3805,1355],{"class":797},[787,3807,1088],{"class":793},[787,3809,843],{"class":793},[787,3811,3812],{"class":814},"Both",[787,3814,1096],{"class":793},[787,3816,886],{"class":793},[787,3818,1328],{"class":797},[787,3820,1088],{"class":793},[787,3822,843],{"class":793},[787,3824,3720],{"class":814},[787,3826,1096],{"class":793},[787,3828,837],{"class":793},[787,3830,1410],{"class":833},[787,3832,3833],{"class":789,"line":1341},[787,3834,1069],{"emptyLinePlaceholder":1068},[787,3836,3837],{"class":789,"line":1413},[787,3838,3839],{"class":1112},"\u002F\u002F Inside a quote, its blocks may not be deleted or duplicated: the built-in actions with these abilities disappear there.\n",[787,3841,3842,3844,3847,3849,3852,3854,3857,3859,3861,3863,3866,3868,3870,3873,3875,3877,3880,3882,3885,3887,3890,3892,3894,3896,3899,3901,3903],{"class":789,"line":1418},[787,3843,1154],{"class":801},[787,3845,3846],{"class":833}," abilities",[787,3848,1088],{"class":793},[787,3850,3851],{"class":1183}," Partial",[787,3853,794],{"class":793},[787,3855,3856],{"class":1183},"AbilitiesOptions",[787,3858,1250],{"class":793},[787,3860,1165],{"class":793},[787,3862,830],{"class":793},[787,3864,3865],{"class":797}," rules",[787,3867,1088],{"class":793},[787,3869,830],{"class":793},[787,3871,3872],{"class":797}," blockquote",[787,3874,1088],{"class":793},[787,3876,830],{"class":793},[787,3878,3879],{"class":797}," revokes",[787,3881,1088],{"class":793},[787,3883,3884],{"class":833}," [ABILITY",[787,3886,555],{"class":793},[787,3888,3889],{"class":833},"blockDelete",[787,3891,886],{"class":793},[787,3893,3419],{"class":833},[787,3895,555],{"class":793},[787,3897,3898],{"class":833},"blockDuplicate] ",[787,3900,1162],{"class":793},[787,3902,837],{"class":793},[787,3904,1592],{"class":793},[787,3906,3907],{"class":789,"line":1443},[787,3908,1069],{"emptyLinePlaceholder":1068},[787,3910,3911,3913,3916,3918,3920,3923,3926,3928,3931,3933,3936,3938,3940,3942,3945,3947,3949,3951,3954,3956],{"class":789,"line":1449},[787,3912,1154],{"class":801},[787,3914,3915],{"class":833}," log ",[787,3917,808],{"class":793},[787,3919,2903],{"class":1075},[787,3921,3922],{"class":793},"\u003C{",[787,3924,3925],{"class":797}," at",[787,3927,1088],{"class":793},[787,3929,3930],{"class":1183}," string",[787,3932,886],{"class":793},[787,3934,3935],{"class":797}," action",[787,3937,1088],{"class":793},[787,3939,3930],{"class":1183},[787,3941,886],{"class":793},[787,3943,3944],{"class":797}," block",[787,3946,1088],{"class":793},[787,3948,3930],{"class":1183},[787,3950,837],{"class":793},[787,3952,3953],{"class":833},"[]",[787,3955,1250],{"class":793},[787,3957,3958],{"class":833},"([])\n",[787,3960,3961,3964,3967,3969,3972,3974,3976,3978,3980,3983,3986,3988,3990],{"class":789,"line":1474},[787,3962,3963],{"class":801},"function",[787,3965,3966],{"class":1075}," record",[787,3968,1079],{"class":793},[787,3970,3971],{"class":1302},"action",[787,3973,1088],{"class":793},[787,3975,3930],{"class":1183},[787,3977,886],{"class":793},[787,3979,830],{"class":793},[787,3981,3982],{"class":1302}," node",[787,3984,3985],{"class":793}," }:",[787,3987,3395],{"class":1183},[787,3989,1305],{"class":793},[787,3991,3010],{"class":793},[787,3993,3994,3996,3998,4000,4002,4004,4007,4009,4012,4015,4018,4021,4023,4026,4028,4031,4033,4035,4038,4040,4042,4044,4046,4048,4050,4052,4055,4058,4060,4062,4064,4066],{"class":789,"line":1479},[787,3995,3015],{"class":801},[787,3997,3944],{"class":833},[787,3999,1165],{"class":793},[787,4001,3982],{"class":833},[787,4003,555],{"class":793},[787,4005,4006],{"class":833},"attrs",[787,4008,555],{"class":793},[787,4010,4011],{"class":833},"blockType",[787,4013,4014],{"class":793}," ?",[787,4016,4017],{"class":793}," `${",[787,4019,4020],{"class":833},"node",[787,4022,555],{"class":793},[787,4024,4025],{"class":833},"type",[787,4027,555],{"class":793},[787,4029,4030],{"class":833},"name",[787,4032,1162],{"class":793},[787,4034,686],{"class":814},[787,4036,4037],{"class":793},"${",[787,4039,4020],{"class":833},[787,4041,555],{"class":793},[787,4043,4006],{"class":833},[787,4045,555],{"class":793},[787,4047,4011],{"class":833},[787,4049,1162],{"class":793},[787,4051,1305],{"class":814},[787,4053,4054],{"class":793},"`",[787,4056,4057],{"class":793}," :",[787,4059,3982],{"class":833},[787,4061,555],{"class":793},[787,4063,4025],{"class":833},[787,4065,555],{"class":793},[787,4067,4068],{"class":833},"name\n",[787,4070,4071,4074,4076,4078,4080,4082,4084,4086,4088,4091,4094,4096,4098,4101,4103,4105,4108,4110,4112,4114,4116,4118,4120,4122,4125,4128,4130,4132,4135,4137,4140,4142,4146,4148,4151],{"class":789,"line":1485},[787,4072,4073],{"class":833},"  log",[787,4075,555],{"class":793},[787,4077,1277],{"class":833},[787,4079,1165],{"class":793},[787,4081,1191],{"class":797},[787,4083,1082],{"class":793},[787,4085,3925],{"class":797},[787,4087,1088],{"class":793},[787,4089,4090],{"class":793}," new",[787,4092,4093],{"class":1075}," Date",[787,4095,1615],{"class":797},[787,4097,555],{"class":793},[787,4099,4100],{"class":1075},"toLocaleTimeString",[787,4102,1079],{"class":797},[787,4104,1096],{"class":793},[787,4106,4107],{"class":814},"en-GB",[787,4109,1096],{"class":793},[787,4111,1305],{"class":797},[787,4113,886],{"class":793},[787,4115,3935],{"class":833},[787,4117,886],{"class":793},[787,4119,3944],{"class":833},[787,4121,1380],{"class":793},[787,4123,4124],{"class":793}," ...",[787,4126,4127],{"class":833},"log",[787,4129,555],{"class":793},[787,4131,1277],{"class":833},[787,4133,4134],{"class":797},"]",[787,4136,555],{"class":793},[787,4138,4139],{"class":1075},"slice",[787,4141,1079],{"class":797},[787,4143,4145],{"class":4144},"sbssI","0",[787,4147,886],{"class":793},[787,4149,4150],{"class":4144}," 8",[787,4152,1101],{"class":797},[787,4154,4155],{"class":789,"line":1558},[787,4156,3099],{"class":793},[787,4158,4159],{"class":789,"line":1595},[787,4160,1069],{"emptyLinePlaceholder":1068},[787,4162,4163,4165,4168,4170,4173],{"class":789,"line":1601},[787,4164,1154],{"class":801},[787,4166,4167],{"class":833}," toast ",[787,4169,808],{"class":793},[787,4171,4172],{"class":1075}," useToast",[787,4174,1170],{"class":833},[787,4176,4177,4179,4182,4184,4186,4188,4190],{"class":789,"line":1672},[787,4178,1154],{"class":801},[787,4180,4181],{"class":833}," blockActions",[787,4183,1088],{"class":793},[787,4185,3390],{"class":1183},[787,4187,1186],{"class":833},[787,4189,808],{"class":793},[787,4191,4192],{"class":833}," [\n",[787,4194,4195],{"class":789,"line":1728},[787,4196,4197],{"class":793},"  {\n",[787,4199,4200],{"class":789,"line":1780},[787,4201,4202],{"class":1112},"    \u002F\u002F Reads only, so it stays on the bar of a read-only editor.\n",[787,4204,4205,4208,4210,4212,4215,4217],{"class":789,"line":1825},[787,4206,4207],{"class":797},"    id",[787,4209,1088],{"class":793},[787,4211,843],{"class":793},[787,4213,4214],{"class":814},"copy-id",[787,4216,1096],{"class":793},[787,4218,1289],{"class":793},[787,4220,4222,4225,4227,4229,4232,4234],{"class":789,"line":4221},46,[787,4223,4224],{"class":797},"    label",[787,4226,1088],{"class":793},[787,4228,843],{"class":793},[787,4230,4231],{"class":814},"Copy block id",[787,4233,1096],{"class":793},[787,4235,1289],{"class":793},[787,4237,4239,4242,4244,4246,4249,4251],{"class":789,"line":4238},47,[787,4240,4241],{"class":797},"    icon",[787,4243,1088],{"class":793},[787,4245,843],{"class":793},[787,4247,4248],{"class":814},"i-lucide-fingerprint",[787,4250,1096],{"class":793},[787,4252,1289],{"class":793},[787,4254,4256,4259,4261,4263],{"class":789,"line":4255},48,[787,4257,4258],{"class":797},"    readOnly",[787,4260,1088],{"class":793},[787,4262,1509],{"class":1508},[787,4264,1289],{"class":793},[787,4266,4268,4271,4273,4275,4278,4280,4282],{"class":789,"line":4267},49,[787,4269,4270],{"class":1075},"    run",[787,4272,1088],{"class":793},[787,4274,686],{"class":793},[787,4276,4277],{"class":1302},"ctx",[787,4279,1305],{"class":793},[787,4281,1269],{"class":801},[787,4283,3010],{"class":793},[787,4285,4287,4290,4293,4295,4298,4300,4303,4305,4308,4310,4312,4314,4316,4318,4320,4322,4324,4327,4330],{"class":789,"line":4286},50,[787,4288,4289],{"class":793},"      void",[787,4291,4292],{"class":833}," navigator",[787,4294,555],{"class":793},[787,4296,4297],{"class":833},"clipboard",[787,4299,1651],{"class":793},[787,4301,4302],{"class":1075},"writeText",[787,4304,1079],{"class":797},[787,4306,4307],{"class":1075},"String",[787,4309,1079],{"class":797},[787,4311,4277],{"class":833},[787,4313,555],{"class":793},[787,4315,4020],{"class":833},[787,4317,555],{"class":793},[787,4319,4006],{"class":833},[787,4321,555],{"class":793},[787,4323,2409],{"class":833},[787,4325,4326],{"class":793}," ??",[787,4328,4329],{"class":793}," ''",[787,4331,4332],{"class":797},"))\n",[787,4334,4336,4339,4341,4344,4346,4348,4351,4353,4355,4358,4360,4362,4365,4367,4370,4372,4374,4376,4378,4380,4382,4384,4386,4388,4390,4393,4395,4397,4399,4402,4404,4406,4408,4410,4412],{"class":789,"line":4335},51,[787,4337,4338],{"class":833},"      toast",[787,4340,555],{"class":793},[787,4342,4343],{"class":1075},"add",[787,4345,1079],{"class":797},[787,4347,1082],{"class":793},[787,4349,4350],{"class":797}," title",[787,4352,1088],{"class":793},[787,4354,843],{"class":793},[787,4356,4357],{"class":814},"Block id copied",[787,4359,1096],{"class":793},[787,4361,886],{"class":793},[787,4363,4364],{"class":797}," description",[787,4366,1088],{"class":793},[787,4368,4369],{"class":1075}," String",[787,4371,1079],{"class":797},[787,4373,4277],{"class":833},[787,4375,555],{"class":793},[787,4377,4020],{"class":833},[787,4379,555],{"class":793},[787,4381,4006],{"class":833},[787,4383,555],{"class":793},[787,4385,2409],{"class":833},[787,4387,4326],{"class":793},[787,4389,843],{"class":793},[787,4391,4392],{"class":814},"no id",[787,4394,1096],{"class":793},[787,4396,1305],{"class":797},[787,4398,886],{"class":793},[787,4400,4401],{"class":797}," icon",[787,4403,1088],{"class":793},[787,4405,843],{"class":793},[787,4407,4248],{"class":814},[787,4409,1096],{"class":793},[787,4411,837],{"class":793},[787,4413,1101],{"class":797},[787,4415,4417,4420,4422,4424,4426,4428,4430,4433],{"class":789,"line":4416},52,[787,4418,4419],{"class":1075},"      record",[787,4421,1079],{"class":797},[787,4423,1096],{"class":793},[787,4425,4231],{"class":814},[787,4427,1096],{"class":793},[787,4429,886],{"class":793},[787,4431,4432],{"class":833}," ctx",[787,4434,1101],{"class":797},[787,4436,4438],{"class":789,"line":4437},53,[787,4439,4440],{"class":793},"    },\n",[787,4442,4444],{"class":789,"line":4443},54,[787,4445,4446],{"class":793},"  },\n",[787,4448,4450],{"class":789,"line":4449},55,[787,4451,4197],{"class":793},[787,4453,4455],{"class":789,"line":4454},56,[787,4456,4457],{"class":1112},"    \u002F\u002F A `menu` instead of `run`: a dropdown of the items it returns.\n",[787,4459,4461,4463,4465,4467,4470,4472],{"class":789,"line":4460},57,[787,4462,4207],{"class":797},[787,4464,1088],{"class":793},[787,4466,843],{"class":793},[787,4468,4469],{"class":814},"insert-after",[787,4471,1096],{"class":793},[787,4473,1289],{"class":793},[787,4475,4477,4479,4481,4483,4486,4488],{"class":789,"line":4476},58,[787,4478,4224],{"class":797},[787,4480,1088],{"class":793},[787,4482,843],{"class":793},[787,4484,4485],{"class":814},"Insert after",[787,4487,1096],{"class":793},[787,4489,1289],{"class":793},[787,4491,4493,4495,4497,4499,4502,4504],{"class":789,"line":4492},59,[787,4494,4241],{"class":797},[787,4496,1088],{"class":793},[787,4498,843],{"class":793},[787,4500,4501],{"class":814},"i-lucide-list-plus",[787,4503,1096],{"class":793},[787,4505,1289],{"class":793},[787,4507,4509,4512,4514,4516,4518],{"class":789,"line":4508},60,[787,4510,4511],{"class":1075},"    menu",[787,4513,1088],{"class":793},[787,4515,4432],{"class":1302},[787,4517,1269],{"class":801},[787,4519,4192],{"class":833},[787,4521,4523,4526,4528,4530,4532,4535,4537,4539,4541,4543,4545,4548,4550,4552,4555,4557,4559,4561,4564,4567,4569,4571,4573,4575,4577,4580,4582,4584,4586,4589,4591,4593],{"class":789,"line":4522},61,[787,4524,4525],{"class":793},"      {",[787,4527,1355],{"class":797},[787,4529,1088],{"class":793},[787,4531,843],{"class":793},[787,4533,4534],{"class":814},"Paragraph",[787,4536,1096],{"class":793},[787,4538,886],{"class":793},[787,4540,4401],{"class":797},[787,4542,1088],{"class":793},[787,4544,843],{"class":793},[787,4546,4547],{"class":814},"i-lucide-pilcrow",[787,4549,1096],{"class":793},[787,4551,886],{"class":793},[787,4553,4554],{"class":1075}," onSelect",[787,4556,1088],{"class":793},[787,4558,1266],{"class":793},[787,4560,1269],{"class":801},[787,4562,4563],{"class":1075}," insertAfter",[787,4565,4566],{"class":833},"(ctx",[787,4568,886],{"class":793},[787,4570,830],{"class":793},[787,4572,880],{"class":797},[787,4574,1088],{"class":793},[787,4576,843],{"class":793},[787,4578,4579],{"class":814},"paragraph",[787,4581,1096],{"class":793},[787,4583,1380],{"class":793},[787,4585,843],{"class":793},[787,4587,4588],{"class":814},"Insert paragraph",[787,4590,1096],{"class":793},[787,4592,3042],{"class":833},[787,4594,4595],{"class":793},"},\n",[787,4597,4599,4601,4603,4605,4607,4610,4612,4614,4616,4618,4620,4623,4625,4627,4629,4631,4633,4635,4637,4639,4641,4643,4645,4647,4649,4652,4654,4656,4658,4661,4663,4665],{"class":789,"line":4598},62,[787,4600,4525],{"class":793},[787,4602,1355],{"class":797},[787,4604,1088],{"class":793},[787,4606,843],{"class":793},[787,4608,4609],{"class":814},"Divider",[787,4611,1096],{"class":793},[787,4613,886],{"class":793},[787,4615,4401],{"class":797},[787,4617,1088],{"class":793},[787,4619,843],{"class":793},[787,4621,4622],{"class":814},"i-lucide-minus",[787,4624,1096],{"class":793},[787,4626,886],{"class":793},[787,4628,4554],{"class":1075},[787,4630,1088],{"class":793},[787,4632,1266],{"class":793},[787,4634,1269],{"class":801},[787,4636,4563],{"class":1075},[787,4638,4566],{"class":833},[787,4640,886],{"class":793},[787,4642,830],{"class":793},[787,4644,880],{"class":797},[787,4646,1088],{"class":793},[787,4648,843],{"class":793},[787,4650,4651],{"class":814},"horizontalRule",[787,4653,1096],{"class":793},[787,4655,1380],{"class":793},[787,4657,843],{"class":793},[787,4659,4660],{"class":814},"Insert divider",[787,4662,1096],{"class":793},[787,4664,3042],{"class":833},[787,4666,4595],{"class":793},[787,4668,4670,4673],{"class":789,"line":4669},63,[787,4671,4672],{"class":833},"    ]",[787,4674,1289],{"class":793},[787,4676,4678],{"class":789,"line":4677},64,[787,4679,4446],{"class":793},[787,4681,4683],{"class":789,"line":4682},65,[787,4684,4197],{"class":793},[787,4686,4688],{"class":789,"line":4687},66,[787,4689,4690],{"class":1112},"    \u002F\u002F Only on blocks that hold other blocks; on the toolbar also while the caret is inside such a block's body.\n",[787,4692,4694,4696,4698,4700,4703,4705],{"class":789,"line":4693},67,[787,4695,4207],{"class":797},[787,4697,1088],{"class":793},[787,4699,843],{"class":793},[787,4701,4702],{"class":814},"count-children",[787,4704,1096],{"class":793},[787,4706,1289],{"class":793},[787,4708,4710,4712,4714,4716,4719,4721],{"class":789,"line":4709},68,[787,4711,4224],{"class":797},[787,4713,1088],{"class":793},[787,4715,843],{"class":793},[787,4717,4718],{"class":814},"Count blocks inside",[787,4720,1096],{"class":793},[787,4722,1289],{"class":793},[787,4724,4726,4728,4730,4732,4735,4737],{"class":789,"line":4725},69,[787,4727,4241],{"class":797},[787,4729,1088],{"class":793},[787,4731,843],{"class":793},[787,4733,4734],{"class":814},"i-lucide-hash",[787,4736,1096],{"class":793},[787,4738,1289],{"class":793},[787,4740,4742,4745,4747,4749,4751,4754,4756,4758],{"class":789,"line":4741},70,[787,4743,4744],{"class":797},"    requires",[787,4746,1088],{"class":793},[787,4748,1191],{"class":833},[787,4750,1096],{"class":793},[787,4752,4753],{"class":814},"container",[787,4755,1096],{"class":793},[787,4757,4134],{"class":833},[787,4759,1289],{"class":793},[787,4761,4763,4766,4768,4770,4773,4775],{"class":789,"line":4762},71,[787,4764,4765],{"class":797},"    target",[787,4767,1088],{"class":793},[787,4769,843],{"class":793},[787,4771,4772],{"class":814},"typedBlock",[787,4774,1096],{"class":793},[787,4776,1289],{"class":793},[787,4778,4780,4782,4784,4786],{"class":789,"line":4779},72,[787,4781,4258],{"class":797},[787,4783,1088],{"class":793},[787,4785,1509],{"class":1508},[787,4787,1289],{"class":793},[787,4789,4791,4793,4795,4797,4799,4801,4803],{"class":789,"line":4790},73,[787,4792,4270],{"class":1075},[787,4794,1088],{"class":793},[787,4796,686],{"class":793},[787,4798,4277],{"class":1302},[787,4800,1305],{"class":793},[787,4802,1269],{"class":801},[787,4804,3010],{"class":793},[787,4806,4808,4811,4814,4816],{"class":789,"line":4807},74,[787,4809,4810],{"class":801},"      let",[787,4812,4813],{"class":833}," count",[787,4815,1165],{"class":793},[787,4817,4818],{"class":4144}," 0\n",[787,4820,4822],{"class":789,"line":4821},75,[787,4823,4824],{"class":1112},"      \u002F\u002F Title, description and tags are the Typed block's chrome, not blocks of its body.\n",[787,4826,4828,4831,4833,4835,4837,4840,4842,4844,4847,4849,4851,4853,4856,4858,4860,4863,4865,4868,4870,4872,4874,4877,4879,4881,4883,4886,4888,4890,4892,4895,4897,4899,4901,4903,4905,4907,4910,4913,4916,4918],{"class":789,"line":4827},76,[787,4829,4830],{"class":833},"      ctx",[787,4832,555],{"class":793},[787,4834,4020],{"class":833},[787,4836,555],{"class":793},[787,4838,4839],{"class":1075},"forEach",[787,4841,1079],{"class":797},[787,4843,1079],{"class":793},[787,4845,4846],{"class":1302},"child",[787,4848,1305],{"class":793},[787,4850,1269],{"class":801},[787,4852,830],{"class":793},[787,4854,4855],{"class":826}," if",[787,4857,686],{"class":797},[787,4859,3037],{"class":793},[787,4861,4862],{"class":797},"[",[787,4864,1096],{"class":793},[787,4866,4867],{"class":814},"typedBlockTitle",[787,4869,1096],{"class":793},[787,4871,886],{"class":793},[787,4873,843],{"class":793},[787,4875,4876],{"class":814},"typedBlockDescription",[787,4878,1096],{"class":793},[787,4880,886],{"class":793},[787,4882,843],{"class":793},[787,4884,4885],{"class":814},"typedBlockTags",[787,4887,1096],{"class":793},[787,4889,4134],{"class":797},[787,4891,555],{"class":793},[787,4893,4894],{"class":1075},"includes",[787,4896,1079],{"class":797},[787,4898,4846],{"class":833},[787,4900,555],{"class":793},[787,4902,4025],{"class":833},[787,4904,555],{"class":793},[787,4906,4030],{"class":833},[787,4908,4909],{"class":797},")) ",[787,4911,4912],{"class":833},"count",[787,4914,4915],{"class":793},"++",[787,4917,837],{"class":793},[787,4919,1101],{"class":797},[787,4921,4923,4925,4927,4929,4931,4933,4935,4937,4939,4941,4943,4946,4948,4950,4952,4954,4956,4958,4960,4962],{"class":789,"line":4922},77,[787,4924,4338],{"class":833},[787,4926,555],{"class":793},[787,4928,4343],{"class":1075},[787,4930,1079],{"class":797},[787,4932,1082],{"class":793},[787,4934,4350],{"class":797},[787,4936,1088],{"class":793},[787,4938,4017],{"class":793},[787,4940,4912],{"class":833},[787,4942,1162],{"class":793},[787,4944,4945],{"class":814}," blocks inside",[787,4947,4054],{"class":793},[787,4949,886],{"class":793},[787,4951,4401],{"class":797},[787,4953,1088],{"class":793},[787,4955,843],{"class":793},[787,4957,4734],{"class":814},[787,4959,1096],{"class":793},[787,4961,837],{"class":793},[787,4963,1101],{"class":797},[787,4965,4967,4969,4971,4973,4975,4977,4979,4981],{"class":789,"line":4966},78,[787,4968,4419],{"class":1075},[787,4970,1079],{"class":797},[787,4972,1096],{"class":793},[787,4974,4718],{"class":814},[787,4976,1096],{"class":793},[787,4978,886],{"class":793},[787,4980,4432],{"class":833},[787,4982,1101],{"class":797},[787,4984,4986],{"class":789,"line":4985},79,[787,4987,4440],{"class":793},[787,4989,4991],{"class":789,"line":4990},80,[787,4992,4446],{"class":793},[787,4994,4996],{"class":789,"line":4995},81,[787,4997,1410],{"class":833},[787,4999,5001],{"class":789,"line":5000},82,[787,5002,1069],{"emptyLinePlaceholder":1068},[787,5004,5006,5008,5010,5012,5014,5016,5018,5020,5022,5024,5026,5028,5030,5032,5034,5036,5038,5040,5042],{"class":789,"line":5005},83,[787,5007,3963],{"class":801},[787,5009,4563],{"class":1075},[787,5011,1079],{"class":793},[787,5013,4277],{"class":1302},[787,5015,1088],{"class":793},[787,5017,3395],{"class":1183},[787,5019,886],{"class":793},[787,5021,3982],{"class":1302},[787,5023,1088],{"class":793},[787,5025,830],{"class":793},[787,5027,880],{"class":797},[787,5029,1088],{"class":793},[787,5031,3930],{"class":1183},[787,5033,1380],{"class":793},[787,5035,3935],{"class":1302},[787,5037,1088],{"class":793},[787,5039,3930],{"class":1183},[787,5041,1305],{"class":793},[787,5043,3010],{"class":793},[787,5045,5047,5050,5052,5054,5056,5058,5060,5062,5064,5066,5068,5071,5073,5075,5077,5080,5083,5085,5087,5089,5091,5094,5096,5098,5100,5102,5104],{"class":789,"line":5046},84,[787,5048,5049],{"class":833},"  ctx",[787,5051,555],{"class":793},[787,5053,1648],{"class":833},[787,5055,555],{"class":793},[787,5057,1750],{"class":1075},[787,5059,1615],{"class":797},[787,5061,555],{"class":793},[787,5063,1757],{"class":1075},[787,5065,1615],{"class":797},[787,5067,555],{"class":793},[787,5069,5070],{"class":1075},"insertContentAt",[787,5072,1079],{"class":797},[787,5074,4277],{"class":833},[787,5076,555],{"class":793},[787,5078,5079],{"class":833},"pos",[787,5081,5082],{"class":793}," +",[787,5084,4432],{"class":833},[787,5086,555],{"class":793},[787,5088,4020],{"class":833},[787,5090,555],{"class":793},[787,5092,5093],{"class":833},"nodeSize",[787,5095,886],{"class":793},[787,5097,3982],{"class":833},[787,5099,1305],{"class":797},[787,5101,555],{"class":793},[787,5103,1775],{"class":1075},[787,5105,1170],{"class":797},[787,5107,5109,5112,5114,5116,5118,5120],{"class":789,"line":5108},85,[787,5110,5111],{"class":1075},"  record",[787,5113,1079],{"class":797},[787,5115,3971],{"class":833},[787,5117,886],{"class":793},[787,5119,4432],{"class":833},[787,5121,1101],{"class":797},[787,5123,5125],{"class":789,"line":5124},86,[787,5126,3099],{"class":793},[787,5128,5130,5132,5134],{"class":789,"line":5129},87,[787,5131,1828],{"class":793},[787,5133,798],{"class":797},[787,5135,820],{"class":793},[676,5137,700],{"id":5138},"settings",[418,5140,5141,5142,5144,5145,5148,5149,5152,5153,5156],{},"One settings object per app, read by every editor and stored per user (",[466,5143,700],{"href":318},"). ",[422,5146,5147],{},"useEditorSettings()"," returns it as a Vue ref with two flags: ",[422,5150,5151],{},"ready"," (the stored settings are usable) and ",[422,5154,5155],{},"synced"," (the account's settings from the server are in effect). Assigning to the ref persists the change; every editor of the app follows it, the Flat & Structure switch included.",[702,5158,5159,5170,5179],{},[705,5160,5161,1978,5163,5166,5167,555],{},[559,5162,1977],{},[422,5164,5165],{},"EditorSettingsPanel"," sits inline here instead of in the popup. Its tabs (Editing, Author colors, Comments, Theme, AI) are the ones the editor's features contribute; an editor without a feature has no tab for it. Below the panel: the live settings object as JSON, and the keys whose value differs from ",[422,5168,5169],{},"EDITOR_SETTINGS_DEFAULTS",[705,5171,5172,5175,5176,5178],{},[559,5173,5174],{},"Reset."," The button in the header assigns ",[422,5177,5169],{}," back, the theme kept. It resets the settings of every editor of the app, not only of this page.",[705,5180,5181,5183],{},[559,5182,1958],{}," „Settings tour“ has a place to try each Editing setting: headings for the „Convert structure“ scope, a Typed block for the block type icon and the drag handle, a long section for the split target size, and a task to type in with author colors on.",[777,5185,5188],{"className":779,"code":5186,"filename":5187,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { EDITOR_SETTINGS_DEFAULTS } from '@skaile\u002Fforge-editor\u002Fsettings'\nimport { EditorSettingsPanel, useEditorI18n, useEditorSettings } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_SETTINGS } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fsettings'\nimport source from '.\u002Fsettings.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F Editor settings: one object per app (`useEditorSettings()`), stored per user, read by every editor. The panel places\n\u002F\u002F `EditorSettingsPanel` inline instead of the popup (its tabs are the ones the editor's features contribute) above the\n\u002F\u002F live settings object, the keys that differ from `EDITOR_SETTINGS_DEFAULTS`, and a reset. `ready` turns true when the\n\u002F\u002F stored settings are usable, `synced` when the account's settings from the server are in effect.\n\nconst { t } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t)]\n\nconst page = pageOf('settings')!\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_SETTINGS)\n\nconst { settings, ready, synced } = useEditorSettings()\nconst tab = ref\u003Cstring>()\n\ntype Sections = Record\u003Cstring, Record\u003Cstring, unknown>>\n\u002F\u002F `section.key` of every setting whose value is not the default one.\nconst changed = computed(() => Object.entries(EDITOR_SETTINGS_DEFAULTS as unknown as Sections)\n  .filter(([, values]) => typeof values === 'object' && values !== null)\n  .flatMap(([section, values]) => Object.keys(values)\n    .filter(key => JSON.stringify((settings.value as unknown as Sections)[section]?.[key]) !== JSON.stringify(values[key]))\n    .map(key => `${section}.${key}`)))\n\n\u002F\u002F Everything back to the defaults except the theme: the settings bridge deep-watches the ref and persists the change.\nfunction reset() {\n  settings.value = { ...structuredClone(EDITOR_SETTINGS_DEFAULTS), appearance: settings.value.appearance }\n}\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fsettings.vue",[422,5189,5190,5210,5228,5246,5270,5289,5316,5330,5348,5378,5398,5413,5417,5439,5443,5448,5453,5458,5463,5467,5483,5505,5509,5531,5535,5556,5560,5586,5605,5609,5641,5646,5685,5734,5766,5823,5854,5858,5863,5874,5918,5922],{"__ignoreMap":783},[787,5191,5192,5194,5196,5198,5200,5202,5204,5206,5208],{"class":789,"line":790},[787,5193,794],{"class":793},[787,5195,798],{"class":797},[787,5197,802],{"class":801},[787,5199,805],{"class":801},[787,5201,808],{"class":793},[787,5203,811],{"class":793},[787,5205,815],{"class":814},[787,5207,811],{"class":793},[787,5209,820],{"class":793},[787,5211,5212,5214,5216,5218,5220,5222,5224,5226],{"class":789,"line":823},[787,5213,827],{"class":826},[787,5215,830],{"class":793},[787,5217,834],{"class":833},[787,5219,837],{"class":793},[787,5221,840],{"class":826},[787,5223,843],{"class":793},[787,5225,846],{"class":814},[787,5227,849],{"class":793},[787,5229,5230,5232,5234,5236,5238,5240,5242,5244],{"class":789,"line":852},[787,5231,827],{"class":826},[787,5233,830],{"class":793},[787,5235,859],{"class":833},[787,5237,837],{"class":793},[787,5239,840],{"class":826},[787,5241,843],{"class":793},[787,5243,868],{"class":814},[787,5245,849],{"class":793},[787,5247,5248,5250,5252,5254,5256,5258,5260,5262,5264,5266,5268],{"class":789,"line":873},[787,5249,827],{"class":826},[787,5251,830],{"class":793},[787,5253,880],{"class":826},[787,5255,883],{"class":833},[787,5257,886],{"class":793},[787,5259,889],{"class":833},[787,5261,837],{"class":793},[787,5263,840],{"class":826},[787,5265,843],{"class":793},[787,5267,898],{"class":814},[787,5269,849],{"class":793},[787,5271,5272,5274,5276,5279,5281,5283,5285,5287],{"class":789,"line":903},[787,5273,827],{"class":826},[787,5275,830],{"class":793},[787,5277,5278],{"class":833}," EDITOR_SETTINGS_DEFAULTS",[787,5280,837],{"class":793},[787,5282,840],{"class":826},[787,5284,843],{"class":793},[787,5286,921],{"class":814},[787,5288,849],{"class":793},[787,5290,5291,5293,5295,5298,5300,5302,5304,5306,5308,5310,5312,5314],{"class":789,"line":926},[787,5292,827],{"class":826},[787,5294,830],{"class":793},[787,5296,5297],{"class":833}," EditorSettingsPanel",[787,5299,886],{"class":793},[787,5301,933],{"class":833},[787,5303,886],{"class":793},[787,5305,938],{"class":833},[787,5307,837],{"class":793},[787,5309,840],{"class":826},[787,5311,843],{"class":793},[787,5313,947],{"class":814},[787,5315,849],{"class":793},[787,5317,5318,5320,5322,5324,5326,5328],{"class":789,"line":952},[787,5319,827],{"class":826},[787,5321,957],{"class":833},[787,5323,960],{"class":826},[787,5325,843],{"class":793},[787,5327,965],{"class":814},[787,5329,849],{"class":793},[787,5331,5332,5334,5336,5338,5340,5342,5344,5346],{"class":789,"line":970},[787,5333,827],{"class":826},[787,5335,830],{"class":793},[787,5337,977],{"class":833},[787,5339,837],{"class":793},[787,5341,840],{"class":826},[787,5343,843],{"class":793},[787,5345,986],{"class":814},[787,5347,849],{"class":793},[787,5349,5350,5352,5354,5356,5358,5360,5362,5364,5366,5368,5370,5372,5374,5376],{"class":789,"line":991},[787,5351,827],{"class":826},[787,5353,830],{"class":793},[787,5355,998],{"class":833},[787,5357,886],{"class":793},[787,5359,1003],{"class":833},[787,5361,886],{"class":793},[787,5363,1008],{"class":833},[787,5365,886],{"class":793},[787,5367,1013],{"class":833},[787,5369,837],{"class":793},[787,5371,840],{"class":826},[787,5373,843],{"class":793},[787,5375,1022],{"class":814},[787,5377,849],{"class":793},[787,5379,5380,5382,5384,5387,5389,5391,5393,5396],{"class":789,"line":1027},[787,5381,827],{"class":826},[787,5383,830],{"class":793},[787,5385,5386],{"class":833}," SAMPLES_SETTINGS",[787,5388,837],{"class":793},[787,5390,840],{"class":826},[787,5392,843],{"class":793},[787,5394,5395],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fsettings",[787,5397,849],{"class":793},[787,5399,5400,5402,5404,5406,5408,5411],{"class":789,"line":1048},[787,5401,827],{"class":826},[787,5403,1053],{"class":833},[787,5405,960],{"class":826},[787,5407,843],{"class":793},[787,5409,5410],{"class":814},".\u002Fsettings.vue?raw",[787,5412,849],{"class":793},[787,5414,5415],{"class":789,"line":1065},[787,5416,1069],{"emptyLinePlaceholder":1068},[787,5418,5419,5421,5423,5425,5427,5429,5431,5433,5435,5437],{"class":789,"line":1072},[787,5420,1076],{"class":1075},[787,5422,1079],{"class":833},[787,5424,1082],{"class":793},[787,5426,1085],{"class":797},[787,5428,1088],{"class":793},[787,5430,843],{"class":793},[787,5432,1093],{"class":814},[787,5434,1096],{"class":793},[787,5436,837],{"class":793},[787,5438,1101],{"class":833},[787,5440,5441],{"class":789,"line":1104},[787,5442,1069],{"emptyLinePlaceholder":1068},[787,5444,5445],{"class":789,"line":1109},[787,5446,5447],{"class":1112},"\u002F\u002F Editor settings: one object per app (`useEditorSettings()`), stored per user, read by every editor. The panel places\n",[787,5449,5450],{"class":789,"line":1116},[787,5451,5452],{"class":1112},"\u002F\u002F `EditorSettingsPanel` inline instead of the popup (its tabs are the ones the editor's features contribute) above the\n",[787,5454,5455],{"class":789,"line":1122},[787,5456,5457],{"class":1112},"\u002F\u002F live settings object, the keys that differ from `EDITOR_SETTINGS_DEFAULTS`, and a reset. `ready` turns true when the\n",[787,5459,5460],{"class":789,"line":1128},[787,5461,5462],{"class":1112},"\u002F\u002F stored settings are usable, `synced` when the account's settings from the server are in effect.\n",[787,5464,5465],{"class":789,"line":1134},[787,5466,1069],{"emptyLinePlaceholder":1068},[787,5468,5469,5471,5473,5475,5477,5479,5481],{"class":789,"line":1140},[787,5470,1154],{"class":801},[787,5472,830],{"class":793},[787,5474,1159],{"class":833},[787,5476,1162],{"class":793},[787,5478,1165],{"class":793},[787,5480,933],{"class":1075},[787,5482,1170],{"class":833},[787,5484,5485,5487,5489,5491,5493,5495,5497,5499,5501,5503],{"class":789,"line":1145},[787,5486,1154],{"class":801},[787,5488,1178],{"class":833},[787,5490,1088],{"class":793},[787,5492,883],{"class":1183},[787,5494,1186],{"class":833},[787,5496,808],{"class":793},[787,5498,1191],{"class":833},[787,5500,1194],{"class":793},[787,5502,1197],{"class":1075},[787,5504,1200],{"class":833},[787,5506,5507],{"class":789,"line":1151},[787,5508,1069],{"emptyLinePlaceholder":1068},[787,5510,5511,5513,5515,5517,5519,5521,5523,5525,5527,5529],{"class":789,"line":1173},[787,5512,1154],{"class":801},[787,5514,1423],{"class":833},[787,5516,808],{"class":793},[787,5518,977],{"class":1075},[787,5520,1079],{"class":833},[787,5522,1096],{"class":793},[787,5524,5138],{"class":814},[787,5526,1096],{"class":793},[787,5528,1305],{"class":833},[787,5530,1440],{"class":793},[787,5532,5533],{"class":789,"line":1203},[787,5534,1446],{"class":1112},[787,5536,5537,5539,5541,5543,5545,5547,5549,5551,5553],{"class":789,"line":1208},[787,5538,1154],{"class":801},[787,5540,1454],{"class":833},[787,5542,808],{"class":793},[787,5544,998],{"class":1075},[787,5546,1461],{"class":833},[787,5548,555],{"class":793},[787,5550,1466],{"class":833},[787,5552,886],{"class":793},[787,5554,5555],{"class":833}," SAMPLES_SETTINGS)\n",[787,5557,5558],{"class":789,"line":1226},[787,5559,1069],{"emptyLinePlaceholder":1068},[787,5561,5562,5564,5566,5568,5570,5573,5575,5578,5580,5582,5584],{"class":789,"line":1232},[787,5563,1154],{"class":801},[787,5565,830],{"class":793},[787,5567,1272],{"class":833},[787,5569,886],{"class":793},[787,5571,5572],{"class":833}," ready",[787,5574,886],{"class":793},[787,5576,5577],{"class":833}," synced ",[787,5579,1162],{"class":793},[787,5581,1165],{"class":793},[787,5583,938],{"class":1075},[787,5585,1170],{"class":833},[787,5587,5588,5590,5593,5595,5597,5599,5601,5603],{"class":789,"line":1258},[787,5589,1154],{"class":801},[787,5591,5592],{"class":833}," tab ",[787,5594,808],{"class":793},[787,5596,2903],{"class":1075},[787,5598,794],{"class":793},[787,5600,2908],{"class":1183},[787,5602,1250],{"class":793},[787,5604,1170],{"class":833},[787,5606,5607],{"class":789,"line":1292},[787,5608,1069],{"emptyLinePlaceholder":1068},[787,5610,5611,5613,5616,5618,5621,5623,5625,5627,5629,5631,5633,5635,5638],{"class":789,"line":1334},[787,5612,4025],{"class":801},[787,5614,5615],{"class":1183}," Sections",[787,5617,1165],{"class":793},[787,5619,5620],{"class":1183}," Record",[787,5622,794],{"class":793},[787,5624,2908],{"class":1183},[787,5626,886],{"class":793},[787,5628,5620],{"class":1183},[787,5630,794],{"class":793},[787,5632,2908],{"class":1183},[787,5634,886],{"class":793},[787,5636,5637],{"class":1183}," unknown",[787,5639,5640],{"class":793},">>\n",[787,5642,5643],{"class":789,"line":1341},[787,5644,5645],{"class":1112},"\u002F\u002F `section.key` of every setting whose value is not the default one.\n",[787,5647,5648,5650,5653,5655,5657,5659,5661,5663,5666,5668,5671,5674,5677,5679,5681,5683],{"class":789,"line":1413},[787,5649,1154],{"class":801},[787,5651,5652],{"class":833}," changed ",[787,5654,808],{"class":793},[787,5656,1242],{"class":1075},[787,5658,1079],{"class":833},[787,5660,1615],{"class":793},[787,5662,1269],{"class":801},[787,5664,5665],{"class":833}," Object",[787,5667,555],{"class":793},[787,5669,5670],{"class":1075},"entries",[787,5672,5673],{"class":833},"(EDITOR_SETTINGS_DEFAULTS ",[787,5675,5676],{"class":826},"as",[787,5678,5637],{"class":1183},[787,5680,1526],{"class":826},[787,5682,5615],{"class":1183},[787,5684,1101],{"class":833},[787,5686,5687,5690,5693,5695,5698,5701,5704,5706,5709,5712,5715,5717,5720,5722,5725,5727,5730,5732],{"class":789,"line":1418},[787,5688,5689],{"class":793},"  .",[787,5691,5692],{"class":1075},"filter",[787,5694,1079],{"class":833},[787,5696,5697],{"class":793},"([,",[787,5699,5700],{"class":1302}," values",[787,5702,5703],{"class":793},"])",[787,5705,1269],{"class":801},[787,5707,5708],{"class":793}," typeof",[787,5710,5711],{"class":833}," values ",[787,5713,5714],{"class":793},"===",[787,5716,843],{"class":793},[787,5718,5719],{"class":814},"object",[787,5721,1096],{"class":793},[787,5723,5724],{"class":793}," &&",[787,5726,5711],{"class":833},[787,5728,5729],{"class":793},"!==",[787,5731,2914],{"class":793},[787,5733,1101],{"class":833},[787,5735,5736,5738,5741,5743,5746,5748,5750,5752,5754,5756,5758,5760,5763],{"class":789,"line":1443},[787,5737,5689],{"class":793},[787,5739,5740],{"class":1075},"flatMap",[787,5742,1079],{"class":833},[787,5744,5745],{"class":793},"([",[787,5747,735],{"class":1302},[787,5749,886],{"class":793},[787,5751,5700],{"class":1302},[787,5753,5703],{"class":793},[787,5755,1269],{"class":801},[787,5757,5665],{"class":833},[787,5759,555],{"class":793},[787,5761,5762],{"class":1075},"keys",[787,5764,5765],{"class":833},"(values)\n",[787,5767,5768,5771,5773,5775,5778,5780,5783,5785,5788,5791,5793,5796,5798,5800,5802,5804,5807,5809,5812,5814,5816,5818,5820],{"class":789,"line":1449},[787,5769,5770],{"class":793},"    .",[787,5772,5692],{"class":1075},[787,5774,1079],{"class":833},[787,5776,5777],{"class":1302},"key",[787,5779,1269],{"class":801},[787,5781,5782],{"class":833}," JSON",[787,5784,555],{"class":793},[787,5786,5787],{"class":1075},"stringify",[787,5789,5790],{"class":833},"((settings",[787,5792,555],{"class":793},[787,5794,5795],{"class":833},"value ",[787,5797,5676],{"class":826},[787,5799,5637],{"class":1183},[787,5801,1526],{"class":826},[787,5803,5615],{"class":1183},[787,5805,5806],{"class":833},")[section]",[787,5808,1651],{"class":793},[787,5810,5811],{"class":833},"[key]) ",[787,5813,5729],{"class":793},[787,5815,5782],{"class":833},[787,5817,555],{"class":793},[787,5819,5787],{"class":1075},[787,5821,5822],{"class":833},"(values[key]))\n",[787,5824,5825,5827,5830,5832,5834,5836,5838,5840,5842,5844,5846,5848,5851],{"class":789,"line":1474},[787,5826,5770],{"class":793},[787,5828,5829],{"class":1075},"map",[787,5831,1079],{"class":833},[787,5833,5777],{"class":1302},[787,5835,1269],{"class":801},[787,5837,4017],{"class":793},[787,5839,735],{"class":833},[787,5841,1162],{"class":793},[787,5843,555],{"class":814},[787,5845,4037],{"class":793},[787,5847,5777],{"class":833},[787,5849,5850],{"class":793},"}`",[787,5852,5853],{"class":833},")))\n",[787,5855,5856],{"class":789,"line":1479},[787,5857,1069],{"emptyLinePlaceholder":1068},[787,5859,5860],{"class":789,"line":1485},[787,5861,5862],{"class":1112},"\u002F\u002F Everything back to the defaults except the theme: the settings bridge deep-watches the ref and persists the change.\n",[787,5864,5865,5867,5870,5872],{"class":789,"line":1558},[787,5866,3963],{"class":801},[787,5868,5869],{"class":1075}," reset",[787,5871,1615],{"class":793},[787,5873,3010],{"class":793},[787,5875,5876,5879,5881,5883,5885,5887,5889,5892,5894,5896,5898,5900,5903,5905,5907,5909,5911,5913,5916],{"class":789,"line":1595},[787,5877,5878],{"class":833},"  settings",[787,5880,555],{"class":793},[787,5882,1277],{"class":833},[787,5884,1165],{"class":793},[787,5886,830],{"class":793},[787,5888,4124],{"class":793},[787,5890,5891],{"class":1075},"structuredClone",[787,5893,1079],{"class":797},[787,5895,5169],{"class":833},[787,5897,1305],{"class":797},[787,5899,886],{"class":793},[787,5901,5902],{"class":797}," appearance",[787,5904,1088],{"class":793},[787,5906,1272],{"class":833},[787,5908,555],{"class":793},[787,5910,1277],{"class":833},[787,5912,555],{"class":793},[787,5914,5915],{"class":833},"appearance",[787,5917,1592],{"class":793},[787,5919,5920],{"class":789,"line":1601},[787,5921,3099],{"class":793},[787,5923,5924,5926,5928],{"class":789,"line":1672},[787,5925,1828],{"class":793},[787,5927,798],{"class":797},[787,5929,820],{"class":793},[676,5931,497],{"id":5932},"simple",[418,5934,5935],{},"The smallest editor, with the AI sidebar and the selection actions switched on.",[702,5937,5938,5948,5967],{},[705,5939,5940,5945,5946,609],{},[559,5941,5942,555],{},[422,5943,5944],{},"SimpleEditor"," Core blocks only: marks, headings, lists, quotes, code (",[466,5947,50],{"href":51},[705,5949,5950,5955,5956,5959,5960,5962,5963,470,5965,609],{},[559,5951,5952,5953,555],{},"AI through ",[422,5954,4343],{}," The simple bundle holds no catalog feature, so ",[422,5957,5958],{},"aiFeature()"," comes in through the ",[422,5961,4343],{}," prop; it brings the AI sidebar and the selection actions (",[466,5964,113],{"href":114},[466,5966,292],{"href":293},[705,5968,5969,5972],{},[559,5970,5971],{},"The same page shell."," Sample select, settings popup and output panes are the ones of the bigger pages.",[777,5974,5977],{"className":779,"code":5975,"filename":5976,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { SimpleEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fsimple'\nimport { aiFeature } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_SIMPLE } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fsimple'\nimport source from '.\u002Fsimple.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F A standalone editor (TipTap JSON via v-model, own undo history, no websocket) built as a `SimpleEditor` with\n\u002F\u002F `add: [aiFeature()]`: core blocks plus the AI sidebar and selection actions. The settings popup is\n\u002F\u002F `settings-ui=\"external\"`: the editor emits `settingsOpen`, `KitchenSinkPage` places `EditorSettingsModal`.\nconst page = pageOf('simple')!\n\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the compositions inject the app context.\nconst pane = createPane(page.title, SAMPLES_SIMPLE)\n\u002F\u002F The simple editor's bundle holds no catalog feature, so the AI feature comes in through `add`.\nconst add = [aiFeature()]\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fsimple.vue",[422,5978,5979,5999,6019,6039,6057,6071,6089,6119,6139,6154,6158,6180,6184,6189,6194,6199,6221,6225,6230,6251,6256,6273],{"__ignoreMap":783},[787,5980,5981,5983,5985,5987,5989,5991,5993,5995,5997],{"class":789,"line":790},[787,5982,794],{"class":793},[787,5984,798],{"class":797},[787,5986,802],{"class":801},[787,5988,805],{"class":801},[787,5990,808],{"class":793},[787,5992,811],{"class":793},[787,5994,815],{"class":814},[787,5996,811],{"class":793},[787,5998,820],{"class":793},[787,6000,6001,6003,6005,6008,6010,6012,6014,6017],{"class":789,"line":823},[787,6002,827],{"class":826},[787,6004,830],{"class":793},[787,6006,6007],{"class":833}," SimpleEditor",[787,6009,837],{"class":793},[787,6011,840],{"class":826},[787,6013,843],{"class":793},[787,6015,6016],{"class":814},"@skaile\u002Fforge-editor\u002Fvue\u002Fsimple",[787,6018,849],{"class":793},[787,6020,6021,6023,6025,6028,6030,6032,6034,6037],{"class":789,"line":852},[787,6022,827],{"class":826},[787,6024,830],{"class":793},[787,6026,6027],{"class":833}," aiFeature",[787,6029,837],{"class":793},[787,6031,840],{"class":826},[787,6033,843],{"class":793},[787,6035,6036],{"class":814},"@skaile\u002Fforge-editor\u002Fai\u002Fvue",[787,6038,849],{"class":793},[787,6040,6041,6043,6045,6047,6049,6051,6053,6055],{"class":789,"line":873},[787,6042,827],{"class":826},[787,6044,830],{"class":793},[787,6046,859],{"class":833},[787,6048,837],{"class":793},[787,6050,840],{"class":826},[787,6052,843],{"class":793},[787,6054,868],{"class":814},[787,6056,849],{"class":793},[787,6058,6059,6061,6063,6065,6067,6069],{"class":789,"line":903},[787,6060,827],{"class":826},[787,6062,957],{"class":833},[787,6064,960],{"class":826},[787,6066,843],{"class":793},[787,6068,965],{"class":814},[787,6070,849],{"class":793},[787,6072,6073,6075,6077,6079,6081,6083,6085,6087],{"class":789,"line":926},[787,6074,827],{"class":826},[787,6076,830],{"class":793},[787,6078,977],{"class":833},[787,6080,837],{"class":793},[787,6082,840],{"class":826},[787,6084,843],{"class":793},[787,6086,986],{"class":814},[787,6088,849],{"class":793},[787,6090,6091,6093,6095,6097,6099,6101,6103,6105,6107,6109,6111,6113,6115,6117],{"class":789,"line":952},[787,6092,827],{"class":826},[787,6094,830],{"class":793},[787,6096,998],{"class":833},[787,6098,886],{"class":793},[787,6100,1003],{"class":833},[787,6102,886],{"class":793},[787,6104,1008],{"class":833},[787,6106,886],{"class":793},[787,6108,1013],{"class":833},[787,6110,837],{"class":793},[787,6112,840],{"class":826},[787,6114,843],{"class":793},[787,6116,1022],{"class":814},[787,6118,849],{"class":793},[787,6120,6121,6123,6125,6128,6130,6132,6134,6137],{"class":789,"line":970},[787,6122,827],{"class":826},[787,6124,830],{"class":793},[787,6126,6127],{"class":833}," SAMPLES_SIMPLE",[787,6129,837],{"class":793},[787,6131,840],{"class":826},[787,6133,843],{"class":793},[787,6135,6136],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fsimple",[787,6138,849],{"class":793},[787,6140,6141,6143,6145,6147,6149,6152],{"class":789,"line":991},[787,6142,827],{"class":826},[787,6144,1053],{"class":833},[787,6146,960],{"class":826},[787,6148,843],{"class":793},[787,6150,6151],{"class":814},".\u002Fsimple.vue?raw",[787,6153,849],{"class":793},[787,6155,6156],{"class":789,"line":1027},[787,6157,1069],{"emptyLinePlaceholder":1068},[787,6159,6160,6162,6164,6166,6168,6170,6172,6174,6176,6178],{"class":789,"line":1048},[787,6161,1076],{"class":1075},[787,6163,1079],{"class":833},[787,6165,1082],{"class":793},[787,6167,1085],{"class":797},[787,6169,1088],{"class":793},[787,6171,843],{"class":793},[787,6173,1093],{"class":814},[787,6175,1096],{"class":793},[787,6177,837],{"class":793},[787,6179,1101],{"class":833},[787,6181,6182],{"class":789,"line":1065},[787,6183,1069],{"emptyLinePlaceholder":1068},[787,6185,6186],{"class":789,"line":1072},[787,6187,6188],{"class":1112},"\u002F\u002F A standalone editor (TipTap JSON via v-model, own undo history, no websocket) built as a `SimpleEditor` with\n",[787,6190,6191],{"class":789,"line":1104},[787,6192,6193],{"class":1112},"\u002F\u002F `add: [aiFeature()]`: core blocks plus the AI sidebar and selection actions. The settings popup is\n",[787,6195,6196],{"class":789,"line":1109},[787,6197,6198],{"class":1112},"\u002F\u002F `settings-ui=\"external\"`: the editor emits `settingsOpen`, `KitchenSinkPage` places `EditorSettingsModal`.\n",[787,6200,6201,6203,6205,6207,6209,6211,6213,6215,6217,6219],{"class":789,"line":1116},[787,6202,1154],{"class":801},[787,6204,1423],{"class":833},[787,6206,808],{"class":793},[787,6208,977],{"class":1075},[787,6210,1079],{"class":833},[787,6212,1096],{"class":793},[787,6214,5932],{"class":814},[787,6216,1096],{"class":793},[787,6218,1305],{"class":833},[787,6220,1440],{"class":793},[787,6222,6223],{"class":789,"line":1122},[787,6224,1069],{"emptyLinePlaceholder":1068},[787,6226,6227],{"class":789,"line":1128},[787,6228,6229],{"class":1112},"\u002F\u002F Called in setup: the AI\u002Fprofile features of the compositions inject the app context.\n",[787,6231,6232,6234,6236,6238,6240,6242,6244,6246,6248],{"class":789,"line":1134},[787,6233,1154],{"class":801},[787,6235,1454],{"class":833},[787,6237,808],{"class":793},[787,6239,998],{"class":1075},[787,6241,1461],{"class":833},[787,6243,555],{"class":793},[787,6245,1466],{"class":833},[787,6247,886],{"class":793},[787,6249,6250],{"class":833}," SAMPLES_SIMPLE)\n",[787,6252,6253],{"class":789,"line":1140},[787,6254,6255],{"class":1112},"\u002F\u002F The simple editor's bundle holds no catalog feature, so the AI feature comes in through `add`.\n",[787,6257,6258,6260,6263,6265,6267,6270],{"class":789,"line":1145},[787,6259,1154],{"class":801},[787,6261,6262],{"class":833}," add ",[787,6264,808],{"class":793},[787,6266,1191],{"class":833},[787,6268,6269],{"class":1075},"aiFeature",[787,6271,6272],{"class":833},"()]\n",[787,6274,6275,6277,6279],{"class":789,"line":1151},[787,6276,1828],{"class":793},[787,6278,798],{"class":797},[787,6280,820],{"class":793},[676,6282,501],{"id":6283},"advanced",[418,6285,6286,6289],{},[422,6287,6288],{},"AdvancedEditor"," with its host props, one prop per extension point.",[702,6291,6292,6302,6322,6348,6368],{},[705,6293,6294,1978,6297,6299,6300,609],{},[559,6295,6296],{},"The preset.",[422,6298,6288],{}," is the advanced composition behind one component (",[466,6301,90],{"href":91},[705,6303,6304,1978,6307,6310,6311,6313,6314,6316,6317,6319,6320,609],{},[559,6305,6306],{},"Own block type.",[422,6308,6309],{},"blockTypes"," is ",[422,6312,605],{}," plus ",[422,6315,1948],{},"; it shows in the ",[422,6318,601],{}," menu, the block badge and the toolbar's Typed block dropdown (",[466,6321,165],{"href":166},[705,6323,6324,1978,6327,6330,6331,6333,6334,6337,6338,6340,6341,6343,6344,470,6346,609],{},[559,6325,6326],{},"Own command and action.",[422,6328,6329],{},"commands"," receives the default ",[422,6332,601],{}," commands and returns them with ",[422,6335,6336],{},"\u002Fdate"," appended; ",[422,6339,3229],{}," adds a hover action gated by the ",[422,6342,3275],{}," ability (",[466,6345,160],{"href":161},[466,6347,3210],{"href":313},[705,6349,6350,1978,6353,6355,6356,6359,6360,6363,6364,6367],{},[559,6351,6352],{},"Abilities and metadata.",[422,6354,3271],{}," revokes ",[422,6357,6358],{},"ai.rewrite"," inside bullet lists; ",[422,6361,6362],{},"metadata"," provides hashtags and speakers, and ",[422,6365,6366],{},"@metadata-create"," logs a newly created item.",[705,6369,6370,1978,6373,6376,6377,6379,6380,6383,6384,609],{},[559,6371,6372],{},"Composition props.",[422,6374,6375],{},"remove: ['tables']"," leaves tables out of the composition and of the schema the samples must fit; ",[422,6378,565],{}," makes the editor emit ",[422,6381,6382],{},"settingsOpen"," for the page to place the popup (",[466,6385,109],{"href":110},[777,6387,6390],{"className":779,"code":6388,"filename":6389,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport type { AbilitiesOptions, BlockAction, CommandDef, EditorMetadata, MetadataItem } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { decisionBlockType } from '~\u002Feditor\u002Fkitchen-sink\u002Fdecision'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_ADVANCED } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fadvanced'\nimport source from '.\u002Fadvanced.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F A standalone AdvancedEditor (TipTap JSON via v-model, own undo history, no websocket) that shows the host extension\n\u002F\u002F points as plain props: metadata lists, an ability override, an own hover action, an own `\u002F` command and an own Block\n\u002F\u002F type (offered in the `\u002F` menu, the Block type badge and the toolbar's Typed block dropdown). `remove: ['tables']`\n\u002F\u002F leaves tables out of the composition, and out of the schema its samples must fit. The settings popup is\n\u002F\u002F `settings-ui=\"external\"`: the editor emits `settingsOpen`, `KitchenSinkPage` places `EditorSettingsModal`.\nconst page = pageOf('advanced')!\n\n\u002F\u002F Constants, not template literals: a new `metadata` object on every re-render would replace the lists each time.\nconst metadata: EditorMetadata = {\n  hashtags: [{ id: 'demo', label: 'demo' }, { id: 'reference', label: 'reference' }],\n  speakers: [{ id: 'anna', label: 'Anna' }, { id: 'ben', label: 'Ben' }],\n}\nconst abilities: Partial\u003CAbilitiesOptions> = { rules: { bulletList: { revokes: ['ai.rewrite'] } } }\n\u002F\u002F Shown on every block that may be deleted, after the default hover actions.\nconst blockActions: BlockAction[] = [\n  { id: 'log', label: 'Log to console', icon: 'i-lucide-terminal', ability: 'block.delete', run: ({ node }) => console.log(node.toJSON()) },\n]\n\u002F\u002F Appended to the default `\u002F` commands (incl. `\u002Fdecision` from `blockTypes`); no `ability`: plain text may go wherever\n\u002F\u002F the `\u002F` menu opens.\nfunction withDateCommand(defaults: CommandDef[]): CommandDef[] {\n  return [...defaults, { id: 'date', label: 'Insert date', icon: 'i-lucide-calendar', slash: {}, run: editor => editor.chain().focus().insertContent(new Date().toLocaleDateString('en-GB')).run() }]\n}\n\u002F\u002F The built-in Block types (labelled in the editor's language) plus one of the host's own.\nconst { t } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t), decisionBlockType]\nconst remove = ['tables'] as const\n\nfunction logCreated(list: string, item: MetadataItem) {\n  console.log('create', list, item)\n}\n\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the compositions inject the app context.\nconst pane = createPane(page.title, SAMPLES_ADVANCED)\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fadvanced.vue",[422,6391,6392,6412,6430,6448,6472,6511,6529,6543,6561,6579,6609,6629,6644,6648,6670,6674,6679,6684,6689,6694,6698,6720,6724,6729,6744,6812,6881,6885,6939,6944,6960,7050,7054,7059,7064,7091,7216,7220,7225,7241,7267,7292,7296,7325,7354,7358,7362,7366,7387],{"__ignoreMap":783},[787,6393,6394,6396,6398,6400,6402,6404,6406,6408,6410],{"class":789,"line":790},[787,6395,794],{"class":793},[787,6397,798],{"class":797},[787,6399,802],{"class":801},[787,6401,805],{"class":801},[787,6403,808],{"class":793},[787,6405,811],{"class":793},[787,6407,815],{"class":814},[787,6409,811],{"class":793},[787,6411,820],{"class":793},[787,6413,6414,6416,6418,6420,6422,6424,6426,6428],{"class":789,"line":823},[787,6415,827],{"class":826},[787,6417,830],{"class":793},[787,6419,834],{"class":833},[787,6421,837],{"class":793},[787,6423,840],{"class":826},[787,6425,843],{"class":793},[787,6427,846],{"class":814},[787,6429,849],{"class":793},[787,6431,6432,6434,6436,6438,6440,6442,6444,6446],{"class":789,"line":852},[787,6433,827],{"class":826},[787,6435,830],{"class":793},[787,6437,859],{"class":833},[787,6439,837],{"class":793},[787,6441,840],{"class":826},[787,6443,843],{"class":793},[787,6445,868],{"class":814},[787,6447,849],{"class":793},[787,6449,6450,6452,6454,6456,6458,6460,6462,6464,6466,6468,6470],{"class":789,"line":873},[787,6451,827],{"class":826},[787,6453,830],{"class":793},[787,6455,880],{"class":826},[787,6457,883],{"class":833},[787,6459,886],{"class":793},[787,6461,889],{"class":833},[787,6463,837],{"class":793},[787,6465,840],{"class":826},[787,6467,843],{"class":793},[787,6469,898],{"class":814},[787,6471,849],{"class":793},[787,6473,6474,6476,6478,6480,6482,6484,6486,6488,6491,6493,6496,6498,6501,6503,6505,6507,6509],{"class":789,"line":903},[787,6475,827],{"class":826},[787,6477,880],{"class":826},[787,6479,830],{"class":793},[787,6481,3385],{"class":833},[787,6483,886],{"class":793},[787,6485,3390],{"class":833},[787,6487,886],{"class":793},[787,6489,6490],{"class":833}," CommandDef",[787,6492,886],{"class":793},[787,6494,6495],{"class":833}," EditorMetadata",[787,6497,886],{"class":793},[787,6499,6500],{"class":833}," MetadataItem",[787,6502,837],{"class":793},[787,6504,840],{"class":826},[787,6506,843],{"class":793},[787,6508,2458],{"class":814},[787,6510,849],{"class":793},[787,6512,6513,6515,6517,6519,6521,6523,6525,6527],{"class":789,"line":926},[787,6514,827],{"class":826},[787,6516,830],{"class":793},[787,6518,933],{"class":833},[787,6520,837],{"class":793},[787,6522,840],{"class":826},[787,6524,843],{"class":793},[787,6526,947],{"class":814},[787,6528,849],{"class":793},[787,6530,6531,6533,6535,6537,6539,6541],{"class":789,"line":952},[787,6532,827],{"class":826},[787,6534,957],{"class":833},[787,6536,960],{"class":826},[787,6538,843],{"class":793},[787,6540,965],{"class":814},[787,6542,849],{"class":793},[787,6544,6545,6547,6549,6551,6553,6555,6557,6559],{"class":789,"line":970},[787,6546,827],{"class":826},[787,6548,830],{"class":793},[787,6550,2140],{"class":833},[787,6552,837],{"class":793},[787,6554,840],{"class":826},[787,6556,843],{"class":793},[787,6558,2149],{"class":814},[787,6560,849],{"class":793},[787,6562,6563,6565,6567,6569,6571,6573,6575,6577],{"class":789,"line":991},[787,6564,827],{"class":826},[787,6566,830],{"class":793},[787,6568,977],{"class":833},[787,6570,837],{"class":793},[787,6572,840],{"class":826},[787,6574,843],{"class":793},[787,6576,986],{"class":814},[787,6578,849],{"class":793},[787,6580,6581,6583,6585,6587,6589,6591,6593,6595,6597,6599,6601,6603,6605,6607],{"class":789,"line":1027},[787,6582,827],{"class":826},[787,6584,830],{"class":793},[787,6586,998],{"class":833},[787,6588,886],{"class":793},[787,6590,1003],{"class":833},[787,6592,886],{"class":793},[787,6594,1008],{"class":833},[787,6596,886],{"class":793},[787,6598,1013],{"class":833},[787,6600,837],{"class":793},[787,6602,840],{"class":826},[787,6604,843],{"class":793},[787,6606,1022],{"class":814},[787,6608,849],{"class":793},[787,6610,6611,6613,6615,6618,6620,6622,6624,6627],{"class":789,"line":1048},[787,6612,827],{"class":826},[787,6614,830],{"class":793},[787,6616,6617],{"class":833}," SAMPLES_ADVANCED",[787,6619,837],{"class":793},[787,6621,840],{"class":826},[787,6623,843],{"class":793},[787,6625,6626],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fadvanced",[787,6628,849],{"class":793},[787,6630,6631,6633,6635,6637,6639,6642],{"class":789,"line":1065},[787,6632,827],{"class":826},[787,6634,1053],{"class":833},[787,6636,960],{"class":826},[787,6638,843],{"class":793},[787,6640,6641],{"class":814},".\u002Fadvanced.vue?raw",[787,6643,849],{"class":793},[787,6645,6646],{"class":789,"line":1072},[787,6647,1069],{"emptyLinePlaceholder":1068},[787,6649,6650,6652,6654,6656,6658,6660,6662,6664,6666,6668],{"class":789,"line":1104},[787,6651,1076],{"class":1075},[787,6653,1079],{"class":833},[787,6655,1082],{"class":793},[787,6657,1085],{"class":797},[787,6659,1088],{"class":793},[787,6661,843],{"class":793},[787,6663,1093],{"class":814},[787,6665,1096],{"class":793},[787,6667,837],{"class":793},[787,6669,1101],{"class":833},[787,6671,6672],{"class":789,"line":1109},[787,6673,1069],{"emptyLinePlaceholder":1068},[787,6675,6676],{"class":789,"line":1116},[787,6677,6678],{"class":1112},"\u002F\u002F A standalone AdvancedEditor (TipTap JSON via v-model, own undo history, no websocket) that shows the host extension\n",[787,6680,6681],{"class":789,"line":1122},[787,6682,6683],{"class":1112},"\u002F\u002F points as plain props: metadata lists, an ability override, an own hover action, an own `\u002F` command and an own Block\n",[787,6685,6686],{"class":789,"line":1128},[787,6687,6688],{"class":1112},"\u002F\u002F type (offered in the `\u002F` menu, the Block type badge and the toolbar's Typed block dropdown). `remove: ['tables']`\n",[787,6690,6691],{"class":789,"line":1134},[787,6692,6693],{"class":1112},"\u002F\u002F leaves tables out of the composition, and out of the schema its samples must fit. The settings popup is\n",[787,6695,6696],{"class":789,"line":1140},[787,6697,6198],{"class":1112},[787,6699,6700,6702,6704,6706,6708,6710,6712,6714,6716,6718],{"class":789,"line":1145},[787,6701,1154],{"class":801},[787,6703,1423],{"class":833},[787,6705,808],{"class":793},[787,6707,977],{"class":1075},[787,6709,1079],{"class":833},[787,6711,1096],{"class":793},[787,6713,6283],{"class":814},[787,6715,1096],{"class":793},[787,6717,1305],{"class":833},[787,6719,1440],{"class":793},[787,6721,6722],{"class":789,"line":1151},[787,6723,1069],{"emptyLinePlaceholder":1068},[787,6725,6726],{"class":789,"line":1173},[787,6727,6728],{"class":1112},"\u002F\u002F Constants, not template literals: a new `metadata` object on every re-render would replace the lists each time.\n",[787,6730,6731,6733,6736,6738,6740,6742],{"class":789,"line":1203},[787,6732,1154],{"class":801},[787,6734,6735],{"class":833}," metadata",[787,6737,1088],{"class":793},[787,6739,6495],{"class":1183},[787,6741,1165],{"class":793},[787,6743,3010],{"class":793},[787,6745,6746,6749,6751,6753,6755,6758,6760,6762,6765,6767,6769,6771,6773,6775,6777,6779,6781,6783,6785,6787,6789,6792,6794,6796,6798,6800,6802,6804,6806,6808,6810],{"class":789,"line":1208},[787,6747,6748],{"class":797},"  hashtags",[787,6750,1088],{"class":793},[787,6752,1191],{"class":833},[787,6754,1082],{"class":793},[787,6756,6757],{"class":797}," id",[787,6759,1088],{"class":793},[787,6761,843],{"class":793},[787,6763,6764],{"class":814},"demo",[787,6766,1096],{"class":793},[787,6768,886],{"class":793},[787,6770,1355],{"class":797},[787,6772,1088],{"class":793},[787,6774,843],{"class":793},[787,6776,6764],{"class":814},[787,6778,1096],{"class":793},[787,6780,1380],{"class":793},[787,6782,830],{"class":793},[787,6784,6757],{"class":797},[787,6786,1088],{"class":793},[787,6788,843],{"class":793},[787,6790,6791],{"class":814},"reference",[787,6793,1096],{"class":793},[787,6795,886],{"class":793},[787,6797,1355],{"class":797},[787,6799,1088],{"class":793},[787,6801,843],{"class":793},[787,6803,6791],{"class":814},[787,6805,1096],{"class":793},[787,6807,837],{"class":793},[787,6809,4134],{"class":833},[787,6811,1289],{"class":793},[787,6813,6814,6817,6819,6821,6823,6825,6827,6829,6832,6834,6836,6838,6840,6842,6845,6847,6849,6851,6853,6855,6857,6860,6862,6864,6866,6868,6870,6873,6875,6877,6879],{"class":789,"line":1226},[787,6815,6816],{"class":797},"  speakers",[787,6818,1088],{"class":793},[787,6820,1191],{"class":833},[787,6822,1082],{"class":793},[787,6824,6757],{"class":797},[787,6826,1088],{"class":793},[787,6828,843],{"class":793},[787,6830,6831],{"class":814},"anna",[787,6833,1096],{"class":793},[787,6835,886],{"class":793},[787,6837,1355],{"class":797},[787,6839,1088],{"class":793},[787,6841,843],{"class":793},[787,6843,6844],{"class":814},"Anna",[787,6846,1096],{"class":793},[787,6848,1380],{"class":793},[787,6850,830],{"class":793},[787,6852,6757],{"class":797},[787,6854,1088],{"class":793},[787,6856,843],{"class":793},[787,6858,6859],{"class":814},"ben",[787,6861,1096],{"class":793},[787,6863,886],{"class":793},[787,6865,1355],{"class":797},[787,6867,1088],{"class":793},[787,6869,843],{"class":793},[787,6871,6872],{"class":814},"Ben",[787,6874,1096],{"class":793},[787,6876,837],{"class":793},[787,6878,4134],{"class":833},[787,6880,1289],{"class":793},[787,6882,6883],{"class":789,"line":1232},[787,6884,3099],{"class":793},[787,6886,6887,6889,6891,6893,6895,6897,6899,6901,6903,6905,6907,6909,6911,6914,6916,6918,6920,6922,6924,6926,6928,6930,6933,6935,6937],{"class":789,"line":1258},[787,6888,1154],{"class":801},[787,6890,3846],{"class":833},[787,6892,1088],{"class":793},[787,6894,3851],{"class":1183},[787,6896,794],{"class":793},[787,6898,3856],{"class":1183},[787,6900,1250],{"class":793},[787,6902,1165],{"class":793},[787,6904,830],{"class":793},[787,6906,3865],{"class":797},[787,6908,1088],{"class":793},[787,6910,830],{"class":793},[787,6912,6913],{"class":797}," bulletList",[787,6915,1088],{"class":793},[787,6917,830],{"class":793},[787,6919,3879],{"class":797},[787,6921,1088],{"class":793},[787,6923,1191],{"class":833},[787,6925,1096],{"class":793},[787,6927,6358],{"class":814},[787,6929,1096],{"class":793},[787,6931,6932],{"class":833},"] ",[787,6934,1162],{"class":793},[787,6936,837],{"class":793},[787,6938,1592],{"class":793},[787,6940,6941],{"class":789,"line":1292},[787,6942,6943],{"class":1112},"\u002F\u002F Shown on every block that may be deleted, after the default hover actions.\n",[787,6945,6946,6948,6950,6952,6954,6956,6958],{"class":789,"line":1334},[787,6947,1154],{"class":801},[787,6949,4181],{"class":833},[787,6951,1088],{"class":793},[787,6953,3390],{"class":1183},[787,6955,1186],{"class":833},[787,6957,808],{"class":793},[787,6959,4192],{"class":833},[787,6961,6962,6965,6967,6969,6971,6973,6975,6977,6979,6981,6983,6986,6988,6990,6992,6994,6996,6998,7000,7002,7005,7007,7009,7011,7013,7015,7018,7020,7023,7025,7028,7030,7033,7035,7037,7040,7042,7045,7048],{"class":789,"line":1341},[787,6963,6964],{"class":793},"  {",[787,6966,6757],{"class":797},[787,6968,1088],{"class":793},[787,6970,843],{"class":793},[787,6972,4127],{"class":814},[787,6974,1096],{"class":793},[787,6976,886],{"class":793},[787,6978,1355],{"class":797},[787,6980,1088],{"class":793},[787,6982,843],{"class":793},[787,6984,6985],{"class":814},"Log to console",[787,6987,1096],{"class":793},[787,6989,886],{"class":793},[787,6991,4401],{"class":797},[787,6993,1088],{"class":793},[787,6995,843],{"class":793},[787,6997,377],{"class":814},[787,6999,1096],{"class":793},[787,7001,886],{"class":793},[787,7003,7004],{"class":797}," ability",[787,7006,1088],{"class":793},[787,7008,843],{"class":793},[787,7010,3275],{"class":814},[787,7012,1096],{"class":793},[787,7014,886],{"class":793},[787,7016,7017],{"class":1075}," run",[787,7019,1088],{"class":793},[787,7021,7022],{"class":793}," ({",[787,7024,3982],{"class":1302},[787,7026,7027],{"class":793}," })",[787,7029,1269],{"class":801},[787,7031,7032],{"class":833}," console",[787,7034,555],{"class":793},[787,7036,4127],{"class":1075},[787,7038,7039],{"class":833},"(node",[787,7041,555],{"class":793},[787,7043,7044],{"class":1075},"toJSON",[787,7046,7047],{"class":833},"()) ",[787,7049,4595],{"class":793},[787,7051,7052],{"class":789,"line":1413},[787,7053,1410],{"class":833},[787,7055,7056],{"class":789,"line":1418},[787,7057,7058],{"class":1112},"\u002F\u002F Appended to the default `\u002F` commands (incl. `\u002Fdecision` from `blockTypes`); no `ability`: plain text may go wherever\n",[787,7060,7061],{"class":789,"line":1443},[787,7062,7063],{"class":1112},"\u002F\u002F the `\u002F` menu opens.\n",[787,7065,7066,7068,7071,7073,7076,7078,7080,7082,7085,7087,7089],{"class":789,"line":1449},[787,7067,3963],{"class":801},[787,7069,7070],{"class":1075}," withDateCommand",[787,7072,1079],{"class":793},[787,7074,7075],{"class":1302},"defaults",[787,7077,1088],{"class":793},[787,7079,6490],{"class":1183},[787,7081,3953],{"class":833},[787,7083,7084],{"class":793},"):",[787,7086,6490],{"class":1183},[787,7088,1186],{"class":833},[787,7090,1255],{"class":793},[787,7092,7093,7096,7098,7100,7102,7104,7106,7108,7110,7112,7115,7117,7119,7121,7123,7125,7128,7130,7132,7134,7136,7138,7141,7143,7145,7148,7150,7153,7155,7157,7159,7161,7163,7165,7167,7169,7171,7173,7175,7177,7180,7182,7185,7187,7189,7191,7194,7196,7198,7200,7202,7205,7207,7209,7212,7214],{"class":789,"line":1474},[787,7094,7095],{"class":826},"  return",[787,7097,1191],{"class":797},[787,7099,1194],{"class":793},[787,7101,7075],{"class":833},[787,7103,886],{"class":793},[787,7105,830],{"class":793},[787,7107,6757],{"class":797},[787,7109,1088],{"class":793},[787,7111,843],{"class":793},[787,7113,7114],{"class":814},"date",[787,7116,1096],{"class":793},[787,7118,886],{"class":793},[787,7120,1355],{"class":797},[787,7122,1088],{"class":793},[787,7124,843],{"class":793},[787,7126,7127],{"class":814},"Insert date",[787,7129,1096],{"class":793},[787,7131,886],{"class":793},[787,7133,4401],{"class":797},[787,7135,1088],{"class":793},[787,7137,843],{"class":793},[787,7139,7140],{"class":814},"i-lucide-calendar",[787,7142,1096],{"class":793},[787,7144,886],{"class":793},[787,7146,7147],{"class":797}," slash",[787,7149,1088],{"class":793},[787,7151,7152],{"class":793}," {},",[787,7154,7017],{"class":1075},[787,7156,1088],{"class":793},[787,7158,3018],{"class":1302},[787,7160,1269],{"class":801},[787,7162,3018],{"class":833},[787,7164,555],{"class":793},[787,7166,1750],{"class":1075},[787,7168,1615],{"class":797},[787,7170,555],{"class":793},[787,7172,1757],{"class":1075},[787,7174,1615],{"class":797},[787,7176,555],{"class":793},[787,7178,7179],{"class":1075},"insertContent",[787,7181,1079],{"class":797},[787,7183,7184],{"class":793},"new",[787,7186,4093],{"class":1075},[787,7188,1615],{"class":797},[787,7190,555],{"class":793},[787,7192,7193],{"class":1075},"toLocaleDateString",[787,7195,1079],{"class":797},[787,7197,1096],{"class":793},[787,7199,4107],{"class":814},[787,7201,1096],{"class":793},[787,7203,7204],{"class":797},"))",[787,7206,555],{"class":793},[787,7208,1775],{"class":1075},[787,7210,7211],{"class":797},"() ",[787,7213,1162],{"class":793},[787,7215,1410],{"class":797},[787,7217,7218],{"class":789,"line":1479},[787,7219,3099],{"class":793},[787,7221,7222],{"class":789,"line":1485},[787,7223,7224],{"class":1112},"\u002F\u002F The built-in Block types (labelled in the editor's language) plus one of the host's own.\n",[787,7226,7227,7229,7231,7233,7235,7237,7239],{"class":789,"line":1558},[787,7228,1154],{"class":801},[787,7230,830],{"class":793},[787,7232,1159],{"class":833},[787,7234,1162],{"class":793},[787,7236,1165],{"class":793},[787,7238,933],{"class":1075},[787,7240,1170],{"class":833},[787,7242,7243,7245,7247,7249,7251,7253,7255,7257,7259,7261,7263,7265],{"class":789,"line":1595},[787,7244,1154],{"class":801},[787,7246,1178],{"class":833},[787,7248,1088],{"class":793},[787,7250,883],{"class":1183},[787,7252,1186],{"class":833},[787,7254,808],{"class":793},[787,7256,1191],{"class":833},[787,7258,1194],{"class":793},[787,7260,1197],{"class":1075},[787,7262,2332],{"class":833},[787,7264,886],{"class":793},[787,7266,2337],{"class":833},[787,7268,7269,7271,7274,7276,7278,7280,7283,7285,7287,7289],{"class":789,"line":1601},[787,7270,1154],{"class":801},[787,7272,7273],{"class":833}," remove ",[787,7275,808],{"class":793},[787,7277,1191],{"class":833},[787,7279,1096],{"class":793},[787,7281,7282],{"class":814},"tables",[787,7284,1096],{"class":793},[787,7286,6932],{"class":833},[787,7288,5676],{"class":826},[787,7290,7291],{"class":801}," const\n",[787,7293,7294],{"class":789,"line":1672},[787,7295,1069],{"emptyLinePlaceholder":1068},[787,7297,7298,7300,7303,7305,7308,7310,7312,7314,7317,7319,7321,7323],{"class":789,"line":1728},[787,7299,3963],{"class":801},[787,7301,7302],{"class":1075}," logCreated",[787,7304,1079],{"class":793},[787,7306,7307],{"class":1302},"list",[787,7309,1088],{"class":793},[787,7311,3930],{"class":1183},[787,7313,886],{"class":793},[787,7315,7316],{"class":1302}," item",[787,7318,1088],{"class":793},[787,7320,6500],{"class":1183},[787,7322,1305],{"class":793},[787,7324,3010],{"class":793},[787,7326,7327,7330,7332,7334,7336,7338,7341,7343,7345,7348,7350,7352],{"class":789,"line":1780},[787,7328,7329],{"class":833},"  console",[787,7331,555],{"class":793},[787,7333,4127],{"class":1075},[787,7335,1079],{"class":797},[787,7337,1096],{"class":793},[787,7339,7340],{"class":814},"create",[787,7342,1096],{"class":793},[787,7344,886],{"class":793},[787,7346,7347],{"class":833}," list",[787,7349,886],{"class":793},[787,7351,7316],{"class":833},[787,7353,1101],{"class":797},[787,7355,7356],{"class":789,"line":1825},[787,7357,3099],{"class":793},[787,7359,7360],{"class":789,"line":4221},[787,7361,1069],{"emptyLinePlaceholder":1068},[787,7363,7364],{"class":789,"line":4238},[787,7365,6229],{"class":1112},[787,7367,7368,7370,7372,7374,7376,7378,7380,7382,7384],{"class":789,"line":4255},[787,7369,1154],{"class":801},[787,7371,1454],{"class":833},[787,7373,808],{"class":793},[787,7375,998],{"class":1075},[787,7377,1461],{"class":833},[787,7379,555],{"class":793},[787,7381,1466],{"class":833},[787,7383,886],{"class":793},[787,7385,7386],{"class":833}," SAMPLES_ADVANCED)\n",[787,7388,7389,7391,7393],{"class":789,"line":4267},[787,7390,1828],{"class":793},[787,7392,798],{"class":797},[787,7394,820],{"class":793},[676,7396,505],{"id":7397},"surface",[418,7399,7400,7403],{},[422,7401,7402],{},"EditorSurface"," on an explicit composition, with a feature of your own.",[702,7405,7406,7423,7438,7453],{},[705,7407,7408,1978,7411,7414,7415,7417,7418,7420,7421,609],{},[559,7409,7410],{},"A preset handed to the surface.",[422,7412,7413],{},"advancedEditor({ blockTypes, add: [calloutFeature()] })"," builds the advanced composition plus the host's feature; ",[422,7416,7402],{}," mounts it. Call it in ",[422,7419,550],{},": some features hook the app's lifetime (",[466,7422,90],{"href":91},[705,7424,7425,1978,7428,7431,7432,7435,7436,555],{},[559,7426,7427],{},"An own feature.",[422,7429,7430],{},"app\u002Feditor\u002Fcallout\u002F"," is a block of the host: node, node view, a toolbar button, the ",[422,7433,7434],{},"\u002Fcallout"," command, a hover menu for the tone, „Convert to …“ in both directions and a description for the AI. The tutorial builds it step by step: ",[466,7437,65],{"href":66},[705,7439,7440,1978,7443,7446,7447,7449,7450,555],{},[559,7441,7442],{},"An own ability.",[422,7444,7445],{},"CALLOUT_ABILITY"," gates the callout's items; the ",[422,7448,3271],{}," prop grants it at document root next to ",[422,7451,7452],{},"ROOT_ABILITIES",[705,7454,7455,7458,7459,7462,7463,7466,7467,609],{},[559,7456,7457],{},"Markdown."," „Insert Markdown“ runs ",[422,7460,7461],{},"parseBlocks(editor, CALLOUT_MARKDOWN)"," and inserts the result, which shows the callout's ",[422,7464,7465],{},"!!!"," syntax going through the block pipeline (",[466,7468,122],{"href":123},[777,7470,7473],{"className":779,"code":7471,"filename":7472,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { advancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { type AbilitiesOptions, parseBlocks } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { ROOT_ABILITIES } from '@skaile\u002Fforge-editor\u002Fcore\u002Fschema'\nimport { EditorSurface, useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { CALLOUT_ABILITY, calloutFeature } from '~\u002Feditor\u002Fcallout\u002Ffeature'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { CALLOUT_MARKDOWN, SAMPLES_SURFACE } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fsurface'\nimport source from '.\u002Fsurface.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F A standalone editor (TipTap JSON via v-model, own undo history, no websocket) built as an `EditorSurface` on the\n\u002F\u002F advanced composition (`advancedEditor({ add })`) plus one own feature (`app\u002Feditor\u002Fcallout`): a block of the host with\n\u002F\u002F toolbar button, `\u002F` command, hover menu, \"Convert to …\" target and Markdown form. The settings popup is\n\u002F\u002F `settings-ui=\"external\"`: the editor emits `settingsOpen`, `KitchenSinkPage` places `EditorSettingsModal`.\nconst page = pageOf('surface')!\n\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the compositions inject the app context.\n\u002F\u002F The advanced composition plus the host's own feature, handed to the surface as one preset.\nconst preset = advancedEditor({ blockTypes: defaultBlockTypes(useEditorI18n().t), add: [calloutFeature()] })\nconst pane = createPane(page.title, SAMPLES_SURFACE)\n\u002F\u002F The custom ability must be granted at document root, or the callout's toolbar button, `\u002Fcallout` and hover menu stay hidden.\nconst abilities: Partial\u003CAbilitiesOptions> = { root: [...ROOT_ABILITIES, CALLOUT_ABILITY] }\n\n\u002F** Imports Markdown with the callout syntax through the editor's block pipeline (the tokenizer of `callout\u002Fnode.ts`). *\u002F\nfunction insertCalloutMarkdown() {\n  const editor = pane.editor\n  if (!editor) return\n  editor.chain().focus().insertContent(parseBlocks(editor, CALLOUT_MARKDOWN).blocks).run()\n}\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fsurface.vue",[422,7474,7475,7495,7514,7532,7550,7574,7593,7616,7630,7655,7673,7703,7728,7743,7747,7769,7773,7778,7783,7788,7792,7814,7818,7822,7827,7879,7900,7905,7943,7947,7952,7963,7977,7991,8039,8043],{"__ignoreMap":783},[787,7476,7477,7479,7481,7483,7485,7487,7489,7491,7493],{"class":789,"line":790},[787,7478,794],{"class":793},[787,7480,798],{"class":797},[787,7482,802],{"class":801},[787,7484,805],{"class":801},[787,7486,808],{"class":793},[787,7488,811],{"class":793},[787,7490,815],{"class":814},[787,7492,811],{"class":793},[787,7494,820],{"class":793},[787,7496,7497,7499,7501,7504,7506,7508,7510,7512],{"class":789,"line":823},[787,7498,827],{"class":826},[787,7500,830],{"class":793},[787,7502,7503],{"class":833}," advancedEditor",[787,7505,837],{"class":793},[787,7507,840],{"class":826},[787,7509,843],{"class":793},[787,7511,846],{"class":814},[787,7513,849],{"class":793},[787,7515,7516,7518,7520,7522,7524,7526,7528,7530],{"class":789,"line":852},[787,7517,827],{"class":826},[787,7519,830],{"class":793},[787,7521,859],{"class":833},[787,7523,837],{"class":793},[787,7525,840],{"class":826},[787,7527,843],{"class":793},[787,7529,868],{"class":814},[787,7531,849],{"class":793},[787,7533,7534,7536,7538,7540,7542,7544,7546,7548],{"class":789,"line":873},[787,7535,827],{"class":826},[787,7537,830],{"class":793},[787,7539,889],{"class":833},[787,7541,837],{"class":793},[787,7543,840],{"class":826},[787,7545,843],{"class":793},[787,7547,898],{"class":814},[787,7549,849],{"class":793},[787,7551,7552,7554,7556,7558,7560,7562,7564,7566,7568,7570,7572],{"class":789,"line":903},[787,7553,827],{"class":826},[787,7555,830],{"class":793},[787,7557,880],{"class":826},[787,7559,3385],{"class":833},[787,7561,886],{"class":793},[787,7563,2588],{"class":833},[787,7565,837],{"class":793},[787,7567,840],{"class":826},[787,7569,843],{"class":793},[787,7571,2458],{"class":814},[787,7573,849],{"class":793},[787,7575,7576,7578,7580,7583,7585,7587,7589,7591],{"class":789,"line":926},[787,7577,827],{"class":826},[787,7579,830],{"class":793},[787,7581,7582],{"class":833}," ROOT_ABILITIES",[787,7584,837],{"class":793},[787,7586,840],{"class":826},[787,7588,843],{"class":793},[787,7590,3428],{"class":814},[787,7592,849],{"class":793},[787,7594,7595,7597,7599,7602,7604,7606,7608,7610,7612,7614],{"class":789,"line":952},[787,7596,827],{"class":826},[787,7598,830],{"class":793},[787,7600,7601],{"class":833}," EditorSurface",[787,7603,886],{"class":793},[787,7605,933],{"class":833},[787,7607,837],{"class":793},[787,7609,840],{"class":826},[787,7611,843],{"class":793},[787,7613,947],{"class":814},[787,7615,849],{"class":793},[787,7617,7618,7620,7622,7624,7626,7628],{"class":789,"line":970},[787,7619,827],{"class":826},[787,7621,957],{"class":833},[787,7623,960],{"class":826},[787,7625,843],{"class":793},[787,7627,965],{"class":814},[787,7629,849],{"class":793},[787,7631,7632,7634,7636,7639,7641,7644,7646,7648,7650,7653],{"class":789,"line":991},[787,7633,827],{"class":826},[787,7635,830],{"class":793},[787,7637,7638],{"class":833}," CALLOUT_ABILITY",[787,7640,886],{"class":793},[787,7642,7643],{"class":833}," calloutFeature",[787,7645,837],{"class":793},[787,7647,840],{"class":826},[787,7649,843],{"class":793},[787,7651,7652],{"class":814},"~\u002Feditor\u002Fcallout\u002Ffeature",[787,7654,849],{"class":793},[787,7656,7657,7659,7661,7663,7665,7667,7669,7671],{"class":789,"line":1027},[787,7658,827],{"class":826},[787,7660,830],{"class":793},[787,7662,977],{"class":833},[787,7664,837],{"class":793},[787,7666,840],{"class":826},[787,7668,843],{"class":793},[787,7670,986],{"class":814},[787,7672,849],{"class":793},[787,7674,7675,7677,7679,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701],{"class":789,"line":1048},[787,7676,827],{"class":826},[787,7678,830],{"class":793},[787,7680,998],{"class":833},[787,7682,886],{"class":793},[787,7684,1003],{"class":833},[787,7686,886],{"class":793},[787,7688,1008],{"class":833},[787,7690,886],{"class":793},[787,7692,1013],{"class":833},[787,7694,837],{"class":793},[787,7696,840],{"class":826},[787,7698,843],{"class":793},[787,7700,1022],{"class":814},[787,7702,849],{"class":793},[787,7704,7705,7707,7709,7712,7714,7717,7719,7721,7723,7726],{"class":789,"line":1065},[787,7706,827],{"class":826},[787,7708,830],{"class":793},[787,7710,7711],{"class":833}," CALLOUT_MARKDOWN",[787,7713,886],{"class":793},[787,7715,7716],{"class":833}," SAMPLES_SURFACE",[787,7718,837],{"class":793},[787,7720,840],{"class":826},[787,7722,843],{"class":793},[787,7724,7725],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fsurface",[787,7727,849],{"class":793},[787,7729,7730,7732,7734,7736,7738,7741],{"class":789,"line":1072},[787,7731,827],{"class":826},[787,7733,1053],{"class":833},[787,7735,960],{"class":826},[787,7737,843],{"class":793},[787,7739,7740],{"class":814},".\u002Fsurface.vue?raw",[787,7742,849],{"class":793},[787,7744,7745],{"class":789,"line":1104},[787,7746,1069],{"emptyLinePlaceholder":1068},[787,7748,7749,7751,7753,7755,7757,7759,7761,7763,7765,7767],{"class":789,"line":1109},[787,7750,1076],{"class":1075},[787,7752,1079],{"class":833},[787,7754,1082],{"class":793},[787,7756,1085],{"class":797},[787,7758,1088],{"class":793},[787,7760,843],{"class":793},[787,7762,1093],{"class":814},[787,7764,1096],{"class":793},[787,7766,837],{"class":793},[787,7768,1101],{"class":833},[787,7770,7771],{"class":789,"line":1116},[787,7772,1069],{"emptyLinePlaceholder":1068},[787,7774,7775],{"class":789,"line":1122},[787,7776,7777],{"class":1112},"\u002F\u002F A standalone editor (TipTap JSON via v-model, own undo history, no websocket) built as an `EditorSurface` on the\n",[787,7779,7780],{"class":789,"line":1128},[787,7781,7782],{"class":1112},"\u002F\u002F advanced composition (`advancedEditor({ add })`) plus one own feature (`app\u002Feditor\u002Fcallout`): a block of the host with\n",[787,7784,7785],{"class":789,"line":1134},[787,7786,7787],{"class":1112},"\u002F\u002F toolbar button, `\u002F` command, hover menu, \"Convert to …\" target and Markdown form. The settings popup is\n",[787,7789,7790],{"class":789,"line":1140},[787,7791,6198],{"class":1112},[787,7793,7794,7796,7798,7800,7802,7804,7806,7808,7810,7812],{"class":789,"line":1145},[787,7795,1154],{"class":801},[787,7797,1423],{"class":833},[787,7799,808],{"class":793},[787,7801,977],{"class":1075},[787,7803,1079],{"class":833},[787,7805,1096],{"class":793},[787,7807,7397],{"class":814},[787,7809,1096],{"class":793},[787,7811,1305],{"class":833},[787,7813,1440],{"class":793},[787,7815,7816],{"class":789,"line":1151},[787,7817,1069],{"emptyLinePlaceholder":1068},[787,7819,7820],{"class":789,"line":1173},[787,7821,6229],{"class":1112},[787,7823,7824],{"class":789,"line":1203},[787,7825,7826],{"class":1112},"\u002F\u002F The advanced composition plus the host's own feature, handed to the surface as one preset.\n",[787,7828,7829,7831,7834,7836,7838,7840,7842,7844,7846,7848,7850,7853,7855,7857,7860,7862,7865,7867,7869,7872,7875,7877],{"class":789,"line":1208},[787,7830,1154],{"class":801},[787,7832,7833],{"class":833}," preset ",[787,7835,808],{"class":793},[787,7837,7503],{"class":1075},[787,7839,1079],{"class":833},[787,7841,1082],{"class":793},[787,7843,1178],{"class":797},[787,7845,1088],{"class":793},[787,7847,889],{"class":1075},[787,7849,1079],{"class":833},[787,7851,7852],{"class":1075},"useEditorI18n",[787,7854,1615],{"class":833},[787,7856,555],{"class":793},[787,7858,7859],{"class":833},"t)",[787,7861,886],{"class":793},[787,7863,7864],{"class":797}," add",[787,7866,1088],{"class":793},[787,7868,1191],{"class":833},[787,7870,7871],{"class":1075},"calloutFeature",[787,7873,7874],{"class":833},"()] ",[787,7876,1162],{"class":793},[787,7878,1101],{"class":833},[787,7880,7881,7883,7885,7887,7889,7891,7893,7895,7897],{"class":789,"line":1226},[787,7882,1154],{"class":801},[787,7884,1454],{"class":833},[787,7886,808],{"class":793},[787,7888,998],{"class":1075},[787,7890,1461],{"class":833},[787,7892,555],{"class":793},[787,7894,1466],{"class":833},[787,7896,886],{"class":793},[787,7898,7899],{"class":833}," SAMPLES_SURFACE)\n",[787,7901,7902],{"class":789,"line":1232},[787,7903,7904],{"class":1112},"\u002F\u002F The custom ability must be granted at document root, or the callout's toolbar button, `\u002Fcallout` and hover menu stay hidden.\n",[787,7906,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7928,7930,7932,7934,7936,7938,7941],{"class":789,"line":1258},[787,7908,1154],{"class":801},[787,7910,3846],{"class":833},[787,7912,1088],{"class":793},[787,7914,3851],{"class":1183},[787,7916,794],{"class":793},[787,7918,3856],{"class":1183},[787,7920,1250],{"class":793},[787,7922,1165],{"class":793},[787,7924,830],{"class":793},[787,7926,7927],{"class":797}," root",[787,7929,1088],{"class":793},[787,7931,1191],{"class":833},[787,7933,1194],{"class":793},[787,7935,7452],{"class":833},[787,7937,886],{"class":793},[787,7939,7940],{"class":833}," CALLOUT_ABILITY] ",[787,7942,3099],{"class":793},[787,7944,7945],{"class":789,"line":1292},[787,7946,1069],{"emptyLinePlaceholder":1068},[787,7948,7949],{"class":789,"line":1334},[787,7950,7951],{"class":1112},"\u002F** Imports Markdown with the callout syntax through the editor's block pipeline (the tokenizer of `callout\u002Fnode.ts`). *\u002F\n",[787,7953,7954,7956,7959,7961],{"class":789,"line":1341},[787,7955,3963],{"class":801},[787,7957,7958],{"class":1075}," insertCalloutMarkdown",[787,7960,1615],{"class":793},[787,7962,3010],{"class":793},[787,7964,7965,7967,7969,7971,7973,7975],{"class":789,"line":1413},[787,7966,3015],{"class":801},[787,7968,3018],{"class":833},[787,7970,1165],{"class":793},[787,7972,1620],{"class":833},[787,7974,555],{"class":793},[787,7976,3027],{"class":833},[787,7978,7979,7981,7983,7985,7987,7989],{"class":789,"line":1418},[787,7980,3032],{"class":826},[787,7982,686],{"class":797},[787,7984,3037],{"class":793},[787,7986,1648],{"class":833},[787,7988,3042],{"class":797},[787,7990,3045],{"class":826},[787,7992,7993,7996,7998,8000,8002,8004,8006,8008,8010,8012,8014,8017,8019,8021,8023,8025,8027,8029,8031,8033,8035,8037],{"class":789,"line":1443},[787,7994,7995],{"class":833},"  editor",[787,7997,555],{"class":793},[787,7999,1750],{"class":1075},[787,8001,1615],{"class":797},[787,8003,555],{"class":793},[787,8005,1757],{"class":1075},[787,8007,1615],{"class":797},[787,8009,555],{"class":793},[787,8011,7179],{"class":1075},[787,8013,1079],{"class":797},[787,8015,8016],{"class":1075},"parseBlocks",[787,8018,1079],{"class":797},[787,8020,1648],{"class":833},[787,8022,886],{"class":793},[787,8024,7711],{"class":833},[787,8026,1305],{"class":797},[787,8028,555],{"class":793},[787,8030,1282],{"class":833},[787,8032,1305],{"class":797},[787,8034,555],{"class":793},[787,8036,1775],{"class":1075},[787,8038,1170],{"class":797},[787,8040,8041],{"class":789,"line":1449},[787,8042,3099],{"class":793},[787,8044,8045,8047,8049],{"class":789,"line":1474},[787,8046,1828],{"class":793},[787,8048,798],{"class":797},[787,8050,820],{"class":793},[676,8052,516],{"id":8053},"minutes",[418,8055,8056],{},"Meeting minutes from a transcript: the core scenario of the framework. The sample „Weekly sync“ has speaker segments, a task and a decision; „Status report“ has sections with nested notes.",[702,8058,8059,8086,8094,8118],{},[705,8060,8061,8064,8065,8067,8068,8071,8072,8075,8076,8079,8080,8083,8084,555],{},[559,8062,8063],{},"Metadata lists."," The page passes ",[422,8066,6362],{}," with ",[422,8069,8070],{},"speakers"," (the speaker picker of a transcript segment and the ",[422,8073,8074],{},"@"," menu) and ",[422,8077,8078],{},"hashtags"," (the ",[422,8081,8082],{},"#"," menu). Constants, not template literals: a new object on every render would replace the lists each time. See ",[466,8085,94],{"href":95},[705,8087,8088,8091,8092,609],{},[559,8089,8090],{},"Transcript segments."," One paragraph per speaker turn, from the transcript feature of the advanced composition (",[466,8093,90],{"href":91},[705,8095,8096,1978,8099,8101,8102,8104,8105,8107,8108,8111,8112,686,8114,470,8116,609],{},[559,8097,8098],{},"Typed blocks with properties.",[422,8100,739],{}," is a built-in Block type; ",[422,8103,1971],{}," is the host's own, defined as data in ",[422,8106,1951],{}," (a ",[422,8109,8110],{},"status"," select property) and appended to ",[422,8113,605],{},[466,8115,165],{"href":166},[466,8117,175],{"href":176},[705,8119,8120,1978,8122,594,8125,8127,8128,609],{},[559,8121,1977],{},[422,8123,8124],{},"EditorOutline",[422,8126,1985],{}," read the same editor: the heading outline, and every Typed block as a row (",[466,8129,109],{"href":110},[777,8131,8134],{"className":779,"code":8132,"filename":8133,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { CompositeTable } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport type { EditorMetadata } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { EditorOutline } from '@skaile\u002Fforge-editor\u002Foutline\u002Fvue'\nimport { useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { decisionBlockType } from '~\u002Feditor\u002Fkitchen-sink\u002Fdecision'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_MINUTES } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fminutes'\nimport source from '.\u002Fminutes.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F The core scenario: meeting minutes. The default advanced composition plus the host's metadata lists (the speakers\n\u002F\u002F of the transcript segments, the hashtags the `#` menu offers) and one own Block type, `decision`. The panel shows\n\u002F\u002F two views of the same document: the heading outline and the table of its Typed blocks.\n\n\u002F\u002F Constants, not template literals: a new `metadata` object on every re-render would replace the lists each time.\nconst metadata: EditorMetadata = {\n  speakers: [{ id: 'anna', label: 'Anna' }, { id: 'ben', label: 'Ben' }, { id: 'clara', label: 'Clara' }],\n  hashtags: [{ id: 'northlight', label: 'northlight' }, { id: 'decision', label: 'decision' }, { id: 'risk', label: 'risk' }],\n}\n\u002F\u002F The built-in Block types (labelled in the editor's language) plus the host's own.\nconst { t } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t), decisionBlockType]\n\nconst page = pageOf('minutes')!\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_MINUTES)\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fminutes.vue",[422,8135,8136,8156,8174,8192,8216,8234,8254,8274,8292,8306,8324,8342,8372,8392,8407,8411,8433,8437,8442,8447,8452,8456,8460,8474,8566,8658,8662,8666,8682,8708,8712,8734,8738,8759],{"__ignoreMap":783},[787,8137,8138,8140,8142,8144,8146,8148,8150,8152,8154],{"class":789,"line":790},[787,8139,794],{"class":793},[787,8141,798],{"class":797},[787,8143,802],{"class":801},[787,8145,805],{"class":801},[787,8147,808],{"class":793},[787,8149,811],{"class":793},[787,8151,815],{"class":814},[787,8153,811],{"class":793},[787,8155,820],{"class":793},[787,8157,8158,8160,8162,8164,8166,8168,8170,8172],{"class":789,"line":823},[787,8159,827],{"class":826},[787,8161,830],{"class":793},[787,8163,834],{"class":833},[787,8165,837],{"class":793},[787,8167,840],{"class":826},[787,8169,843],{"class":793},[787,8171,846],{"class":814},[787,8173,849],{"class":793},[787,8175,8176,8178,8180,8182,8184,8186,8188,8190],{"class":789,"line":852},[787,8177,827],{"class":826},[787,8179,830],{"class":793},[787,8181,859],{"class":833},[787,8183,837],{"class":793},[787,8185,840],{"class":826},[787,8187,843],{"class":793},[787,8189,868],{"class":814},[787,8191,849],{"class":793},[787,8193,8194,8196,8198,8200,8202,8204,8206,8208,8210,8212,8214],{"class":789,"line":873},[787,8195,827],{"class":826},[787,8197,830],{"class":793},[787,8199,880],{"class":826},[787,8201,883],{"class":833},[787,8203,886],{"class":793},[787,8205,889],{"class":833},[787,8207,837],{"class":793},[787,8209,840],{"class":826},[787,8211,843],{"class":793},[787,8213,898],{"class":814},[787,8215,849],{"class":793},[787,8217,8218,8220,8222,8224,8226,8228,8230,8232],{"class":789,"line":903},[787,8219,827],{"class":826},[787,8221,830],{"class":793},[787,8223,2088],{"class":833},[787,8225,837],{"class":793},[787,8227,840],{"class":826},[787,8229,843],{"class":793},[787,8231,2097],{"class":814},[787,8233,849],{"class":793},[787,8235,8236,8238,8240,8242,8244,8246,8248,8250,8252],{"class":789,"line":926},[787,8237,827],{"class":826},[787,8239,880],{"class":826},[787,8241,830],{"class":793},[787,8243,6495],{"class":833},[787,8245,837],{"class":793},[787,8247,840],{"class":826},[787,8249,843],{"class":793},[787,8251,2458],{"class":814},[787,8253,849],{"class":793},[787,8255,8256,8258,8260,8263,8265,8267,8269,8272],{"class":789,"line":952},[787,8257,827],{"class":826},[787,8259,830],{"class":793},[787,8261,8262],{"class":833}," EditorOutline",[787,8264,837],{"class":793},[787,8266,840],{"class":826},[787,8268,843],{"class":793},[787,8270,8271],{"class":814},"@skaile\u002Fforge-editor\u002Foutline\u002Fvue",[787,8273,849],{"class":793},[787,8275,8276,8278,8280,8282,8284,8286,8288,8290],{"class":789,"line":970},[787,8277,827],{"class":826},[787,8279,830],{"class":793},[787,8281,933],{"class":833},[787,8283,837],{"class":793},[787,8285,840],{"class":826},[787,8287,843],{"class":793},[787,8289,947],{"class":814},[787,8291,849],{"class":793},[787,8293,8294,8296,8298,8300,8302,8304],{"class":789,"line":991},[787,8295,827],{"class":826},[787,8297,957],{"class":833},[787,8299,960],{"class":826},[787,8301,843],{"class":793},[787,8303,965],{"class":814},[787,8305,849],{"class":793},[787,8307,8308,8310,8312,8314,8316,8318,8320,8322],{"class":789,"line":1027},[787,8309,827],{"class":826},[787,8311,830],{"class":793},[787,8313,2140],{"class":833},[787,8315,837],{"class":793},[787,8317,840],{"class":826},[787,8319,843],{"class":793},[787,8321,2149],{"class":814},[787,8323,849],{"class":793},[787,8325,8326,8328,8330,8332,8334,8336,8338,8340],{"class":789,"line":1048},[787,8327,827],{"class":826},[787,8329,830],{"class":793},[787,8331,977],{"class":833},[787,8333,837],{"class":793},[787,8335,840],{"class":826},[787,8337,843],{"class":793},[787,8339,986],{"class":814},[787,8341,849],{"class":793},[787,8343,8344,8346,8348,8350,8352,8354,8356,8358,8360,8362,8364,8366,8368,8370],{"class":789,"line":1065},[787,8345,827],{"class":826},[787,8347,830],{"class":793},[787,8349,998],{"class":833},[787,8351,886],{"class":793},[787,8353,1003],{"class":833},[787,8355,886],{"class":793},[787,8357,1008],{"class":833},[787,8359,886],{"class":793},[787,8361,1013],{"class":833},[787,8363,837],{"class":793},[787,8365,840],{"class":826},[787,8367,843],{"class":793},[787,8369,1022],{"class":814},[787,8371,849],{"class":793},[787,8373,8374,8376,8378,8381,8383,8385,8387,8390],{"class":789,"line":1072},[787,8375,827],{"class":826},[787,8377,830],{"class":793},[787,8379,8380],{"class":833}," SAMPLES_MINUTES",[787,8382,837],{"class":793},[787,8384,840],{"class":826},[787,8386,843],{"class":793},[787,8388,8389],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fminutes",[787,8391,849],{"class":793},[787,8393,8394,8396,8398,8400,8402,8405],{"class":789,"line":1104},[787,8395,827],{"class":826},[787,8397,1053],{"class":833},[787,8399,960],{"class":826},[787,8401,843],{"class":793},[787,8403,8404],{"class":814},".\u002Fminutes.vue?raw",[787,8406,849],{"class":793},[787,8408,8409],{"class":789,"line":1109},[787,8410,1069],{"emptyLinePlaceholder":1068},[787,8412,8413,8415,8417,8419,8421,8423,8425,8427,8429,8431],{"class":789,"line":1116},[787,8414,1076],{"class":1075},[787,8416,1079],{"class":833},[787,8418,1082],{"class":793},[787,8420,1085],{"class":797},[787,8422,1088],{"class":793},[787,8424,843],{"class":793},[787,8426,1093],{"class":814},[787,8428,1096],{"class":793},[787,8430,837],{"class":793},[787,8432,1101],{"class":833},[787,8434,8435],{"class":789,"line":1122},[787,8436,1069],{"emptyLinePlaceholder":1068},[787,8438,8439],{"class":789,"line":1128},[787,8440,8441],{"class":1112},"\u002F\u002F The core scenario: meeting minutes. The default advanced composition plus the host's metadata lists (the speakers\n",[787,8443,8444],{"class":789,"line":1134},[787,8445,8446],{"class":1112},"\u002F\u002F of the transcript segments, the hashtags the `#` menu offers) and one own Block type, `decision`. The panel shows\n",[787,8448,8449],{"class":789,"line":1140},[787,8450,8451],{"class":1112},"\u002F\u002F two views of the same document: the heading outline and the table of its Typed blocks.\n",[787,8453,8454],{"class":789,"line":1145},[787,8455,1069],{"emptyLinePlaceholder":1068},[787,8457,8458],{"class":789,"line":1151},[787,8459,6728],{"class":1112},[787,8461,8462,8464,8466,8468,8470,8472],{"class":789,"line":1173},[787,8463,1154],{"class":801},[787,8465,6735],{"class":833},[787,8467,1088],{"class":793},[787,8469,6495],{"class":1183},[787,8471,1165],{"class":793},[787,8473,3010],{"class":793},[787,8475,8476,8478,8480,8482,8484,8486,8488,8490,8492,8494,8496,8498,8500,8502,8504,8506,8508,8510,8512,8514,8516,8518,8520,8522,8524,8526,8528,8530,8532,8534,8536,8538,8540,8542,8545,8547,8549,8551,8553,8555,8558,8560,8562,8564],{"class":789,"line":1203},[787,8477,6816],{"class":797},[787,8479,1088],{"class":793},[787,8481,1191],{"class":833},[787,8483,1082],{"class":793},[787,8485,6757],{"class":797},[787,8487,1088],{"class":793},[787,8489,843],{"class":793},[787,8491,6831],{"class":814},[787,8493,1096],{"class":793},[787,8495,886],{"class":793},[787,8497,1355],{"class":797},[787,8499,1088],{"class":793},[787,8501,843],{"class":793},[787,8503,6844],{"class":814},[787,8505,1096],{"class":793},[787,8507,1380],{"class":793},[787,8509,830],{"class":793},[787,8511,6757],{"class":797},[787,8513,1088],{"class":793},[787,8515,843],{"class":793},[787,8517,6859],{"class":814},[787,8519,1096],{"class":793},[787,8521,886],{"class":793},[787,8523,1355],{"class":797},[787,8525,1088],{"class":793},[787,8527,843],{"class":793},[787,8529,6872],{"class":814},[787,8531,1096],{"class":793},[787,8533,1380],{"class":793},[787,8535,830],{"class":793},[787,8537,6757],{"class":797},[787,8539,1088],{"class":793},[787,8541,843],{"class":793},[787,8543,8544],{"class":814},"clara",[787,8546,1096],{"class":793},[787,8548,886],{"class":793},[787,8550,1355],{"class":797},[787,8552,1088],{"class":793},[787,8554,843],{"class":793},[787,8556,8557],{"class":814},"Clara",[787,8559,1096],{"class":793},[787,8561,837],{"class":793},[787,8563,4134],{"class":833},[787,8565,1289],{"class":793},[787,8567,8568,8570,8572,8574,8576,8578,8580,8582,8585,8587,8589,8591,8593,8595,8597,8599,8601,8603,8605,8607,8609,8611,8613,8615,8617,8619,8621,8623,8625,8627,8629,8631,8633,8635,8638,8640,8642,8644,8646,8648,8650,8652,8654,8656],{"class":789,"line":1208},[787,8569,6748],{"class":797},[787,8571,1088],{"class":793},[787,8573,1191],{"class":833},[787,8575,1082],{"class":793},[787,8577,6757],{"class":797},[787,8579,1088],{"class":793},[787,8581,843],{"class":793},[787,8583,8584],{"class":814},"northlight",[787,8586,1096],{"class":793},[787,8588,886],{"class":793},[787,8590,1355],{"class":797},[787,8592,1088],{"class":793},[787,8594,843],{"class":793},[787,8596,8584],{"class":814},[787,8598,1096],{"class":793},[787,8600,1380],{"class":793},[787,8602,830],{"class":793},[787,8604,6757],{"class":797},[787,8606,1088],{"class":793},[787,8608,843],{"class":793},[787,8610,1971],{"class":814},[787,8612,1096],{"class":793},[787,8614,886],{"class":793},[787,8616,1355],{"class":797},[787,8618,1088],{"class":793},[787,8620,843],{"class":793},[787,8622,1971],{"class":814},[787,8624,1096],{"class":793},[787,8626,1380],{"class":793},[787,8628,830],{"class":793},[787,8630,6757],{"class":797},[787,8632,1088],{"class":793},[787,8634,843],{"class":793},[787,8636,8637],{"class":814},"risk",[787,8639,1096],{"class":793},[787,8641,886],{"class":793},[787,8643,1355],{"class":797},[787,8645,1088],{"class":793},[787,8647,843],{"class":793},[787,8649,8637],{"class":814},[787,8651,1096],{"class":793},[787,8653,837],{"class":793},[787,8655,4134],{"class":833},[787,8657,1289],{"class":793},[787,8659,8660],{"class":789,"line":1226},[787,8661,3099],{"class":793},[787,8663,8664],{"class":789,"line":1232},[787,8665,2293],{"class":1112},[787,8667,8668,8670,8672,8674,8676,8678,8680],{"class":789,"line":1258},[787,8669,1154],{"class":801},[787,8671,830],{"class":793},[787,8673,1159],{"class":833},[787,8675,1162],{"class":793},[787,8677,1165],{"class":793},[787,8679,933],{"class":1075},[787,8681,1170],{"class":833},[787,8683,8684,8686,8688,8690,8692,8694,8696,8698,8700,8702,8704,8706],{"class":789,"line":1292},[787,8685,1154],{"class":801},[787,8687,1178],{"class":833},[787,8689,1088],{"class":793},[787,8691,883],{"class":1183},[787,8693,1186],{"class":833},[787,8695,808],{"class":793},[787,8697,1191],{"class":833},[787,8699,1194],{"class":793},[787,8701,1197],{"class":1075},[787,8703,2332],{"class":833},[787,8705,886],{"class":793},[787,8707,2337],{"class":833},[787,8709,8710],{"class":789,"line":1334},[787,8711,1069],{"emptyLinePlaceholder":1068},[787,8713,8714,8716,8718,8720,8722,8724,8726,8728,8730,8732],{"class":789,"line":1341},[787,8715,1154],{"class":801},[787,8717,1423],{"class":833},[787,8719,808],{"class":793},[787,8721,977],{"class":1075},[787,8723,1079],{"class":833},[787,8725,1096],{"class":793},[787,8727,8053],{"class":814},[787,8729,1096],{"class":793},[787,8731,1305],{"class":833},[787,8733,1440],{"class":793},[787,8735,8736],{"class":789,"line":1413},[787,8737,1446],{"class":1112},[787,8739,8740,8742,8744,8746,8748,8750,8752,8754,8756],{"class":789,"line":1418},[787,8741,1154],{"class":801},[787,8743,1454],{"class":833},[787,8745,808],{"class":793},[787,8747,998],{"class":1075},[787,8749,1461],{"class":833},[787,8751,555],{"class":793},[787,8753,1466],{"class":833},[787,8755,886],{"class":793},[787,8757,8758],{"class":833}," SAMPLES_MINUTES)\n",[787,8760,8761,8763,8765],{"class":789,"line":1443},[787,8762,1828],{"class":793},[787,8764,798],{"class":797},[787,8766,820],{"class":793},[676,8768,520],{"id":8769},"slides",[418,8771,8772],{},"A deck written as blocks, with a preview of each slide and render targets for reveal.js, PowerPoint and Marp.",[702,8774,8775,8799,8814,8834],{},[705,8776,8777,1978,8780,2455,8783,8786,8787,594,8790,8793,8794,8796,8797,609],{},[559,8778,8779],{},"Block types from an add-on.",[422,8781,8782],{},"slideBlockTypes(locale)",[422,8784,8785],{},"@skaile\u002Fforge-editor-slides\u002Fclient"," adds ",[422,8788,8789],{},"deck",[422,8791,8792],{},"slide","; the page appends them to ",[422,8795,605],{},". The „Kickoff deck“ sample has a deck with six slides in different layouts (",[466,8798,282],{"href":283},[705,8800,8801,1978,8804,2455,8807,8810,8811,8813],{},[559,8802,8803],{},"A feature from the add-on.",[422,8805,8806],{},"slidesFeature()",[422,8808,8809],{},"@skaile\u002Fforge-editor-slides\u002Fvue"," is passed through ",[422,8812,4343],{},"; it contributes the slide preview section of the inspector and the slide hover actions.",[705,8815,8816,1978,8819,6310,8822,594,8825,6310,8828,8831,8832,609],{},[559,8817,8818],{},"Transfer transforms.",[422,8820,8821],{},"interaction",[422,8823,8824],{},"[...INTERACTION.full, 'transfer']",[422,8826,8827],{},"transfer.extraTransforms",[422,8829,8830],{},"slidesTransforms({ locale })",". The „Outline to deck“ sample is plain headings and bullets to drag into a deck with „Insert as slides“ (",[466,8833,90],{"href":91},[705,8835,8836,8839,8840,8843,8844,686,8846,609],{},[559,8837,8838],{},"Render targets."," Select the deck block, open its hover menu and choose „Render as…“. The targets live on the server; without ",[422,8841,8842],{},"NUXT_PUBLIC_ADDONS_SLIDES=1"," the panel shows a ",[422,8845,636],{},[466,8847,214],{"href":215},[777,8849,8852],{"className":779,"code":8850,"filename":8851,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { CompositeInspector } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport { type FeatureId, INTERACTION } from '@skaile\u002Fforge-editor\u002Fpresets\u002Fcompose'\nimport type { TransferFeatureOptions } from '@skaile\u002Fforge-editor\u002Ftransfer'\nimport { useEditorContext, useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { slideBlockTypes, slidesTransforms } from '@skaile\u002Fforge-editor-slides\u002Fclient'\nimport { slidesFeature } from '@skaile\u002Fforge-editor-slides\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport ServerHint from '~\u002Fcomponents\u002Fkitchen-sink\u002FServerHint.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_SLIDES } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fslides'\nimport source from '.\u002Fslides.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F The slides add-on on an AdvancedEditor: it brings two Block types (`deck`, `slide`), a host feature (the preview section in the\n\u002F\u002F inspector and the slide hover actions) and transfer transforms (\"Insert as slides\"). The page imports the add-on's `\u002Fclient`\n\u002F\u002F and `\u002Fvue` entries directly, so the editor shows decks whatever `NUXT_PUBLIC_ADDONS_SLIDES` says; only the server render targets\n\u002F\u002F (reveal.js, PowerPoint, Marp) need that flag.\nconst page = pageOf('slides')!\nconst { t, locale } = useEditorI18n()\nconst ctx = useEditorContext()\n\u002F\u002F Called in setup, before the first await: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_SLIDES)\n\n\u002F\u002F Constants, not template literals: a new object on every re-render would replace the editor's options each time.\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t), ...slideBlockTypes(locale)]\nconst interaction: FeatureId[] = [...INTERACTION.full, 'transfer']\nconst transfer: TransferFeatureOptions = { extraTransforms: slidesTransforms({ locale }) }\nconst features = [slidesFeature()]\n\n\u002F\u002F The renderer is a server port: without it (or without the slides targets) the \"Render as…\" menu has no deck formats.\nconst targets = await ctx.backend.render?.targets().catch(() => []) ?? []\nconst hasRender = targets.some(target => target.id === 'reveal-html')\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fslides.vue",[422,8853,8854,8874,8892,8910,8934,8952,8979,9001,9024,9048,9067,9081,9097,9115,9145,9165,9180,9184,9206,9210,9215,9220,9225,9230,9252,9274,9287,9292,9313,9317,9322,9354,9392,9426,9442,9446,9451,9502,9545],{"__ignoreMap":783},[787,8855,8856,8858,8860,8862,8864,8866,8868,8870,8872],{"class":789,"line":790},[787,8857,794],{"class":793},[787,8859,798],{"class":797},[787,8861,802],{"class":801},[787,8863,805],{"class":801},[787,8865,808],{"class":793},[787,8867,811],{"class":793},[787,8869,815],{"class":814},[787,8871,811],{"class":793},[787,8873,820],{"class":793},[787,8875,8876,8878,8880,8882,8884,8886,8888,8890],{"class":789,"line":823},[787,8877,827],{"class":826},[787,8879,830],{"class":793},[787,8881,834],{"class":833},[787,8883,837],{"class":793},[787,8885,840],{"class":826},[787,8887,843],{"class":793},[787,8889,846],{"class":814},[787,8891,849],{"class":793},[787,8893,8894,8896,8898,8900,8902,8904,8906,8908],{"class":789,"line":852},[787,8895,827],{"class":826},[787,8897,830],{"class":793},[787,8899,859],{"class":833},[787,8901,837],{"class":793},[787,8903,840],{"class":826},[787,8905,843],{"class":793},[787,8907,868],{"class":814},[787,8909,849],{"class":793},[787,8911,8912,8914,8916,8918,8920,8922,8924,8926,8928,8930,8932],{"class":789,"line":873},[787,8913,827],{"class":826},[787,8915,830],{"class":793},[787,8917,880],{"class":826},[787,8919,883],{"class":833},[787,8921,886],{"class":793},[787,8923,889],{"class":833},[787,8925,837],{"class":793},[787,8927,840],{"class":826},[787,8929,843],{"class":793},[787,8931,898],{"class":814},[787,8933,849],{"class":793},[787,8935,8936,8938,8940,8942,8944,8946,8948,8950],{"class":789,"line":903},[787,8937,827],{"class":826},[787,8939,830],{"class":793},[787,8941,2083],{"class":833},[787,8943,837],{"class":793},[787,8945,840],{"class":826},[787,8947,843],{"class":793},[787,8949,2097],{"class":814},[787,8951,849],{"class":793},[787,8953,8954,8956,8958,8960,8963,8965,8968,8970,8972,8974,8977],{"class":789,"line":926},[787,8955,827],{"class":826},[787,8957,830],{"class":793},[787,8959,880],{"class":826},[787,8961,8962],{"class":833}," FeatureId",[787,8964,886],{"class":793},[787,8966,8967],{"class":833}," INTERACTION",[787,8969,837],{"class":793},[787,8971,840],{"class":826},[787,8973,843],{"class":793},[787,8975,8976],{"class":814},"@skaile\u002Fforge-editor\u002Fpresets\u002Fcompose",[787,8978,849],{"class":793},[787,8980,8981,8983,8985,8987,8990,8992,8994,8996,8999],{"class":789,"line":952},[787,8982,827],{"class":826},[787,8984,880],{"class":826},[787,8986,830],{"class":793},[787,8988,8989],{"class":833}," TransferFeatureOptions",[787,8991,837],{"class":793},[787,8993,840],{"class":826},[787,8995,843],{"class":793},[787,8997,8998],{"class":814},"@skaile\u002Fforge-editor\u002Ftransfer",[787,9000,849],{"class":793},[787,9002,9003,9005,9007,9010,9012,9014,9016,9018,9020,9022],{"class":789,"line":970},[787,9004,827],{"class":826},[787,9006,830],{"class":793},[787,9008,9009],{"class":833}," useEditorContext",[787,9011,886],{"class":793},[787,9013,933],{"class":833},[787,9015,837],{"class":793},[787,9017,840],{"class":826},[787,9019,843],{"class":793},[787,9021,947],{"class":814},[787,9023,849],{"class":793},[787,9025,9026,9028,9030,9033,9035,9038,9040,9042,9044,9046],{"class":789,"line":991},[787,9027,827],{"class":826},[787,9029,830],{"class":793},[787,9031,9032],{"class":833}," slideBlockTypes",[787,9034,886],{"class":793},[787,9036,9037],{"class":833}," slidesTransforms",[787,9039,837],{"class":793},[787,9041,840],{"class":826},[787,9043,843],{"class":793},[787,9045,8785],{"class":814},[787,9047,849],{"class":793},[787,9049,9050,9052,9054,9057,9059,9061,9063,9065],{"class":789,"line":1027},[787,9051,827],{"class":826},[787,9053,830],{"class":793},[787,9055,9056],{"class":833}," slidesFeature",[787,9058,837],{"class":793},[787,9060,840],{"class":826},[787,9062,843],{"class":793},[787,9064,8809],{"class":814},[787,9066,849],{"class":793},[787,9068,9069,9071,9073,9075,9077,9079],{"class":789,"line":1048},[787,9070,827],{"class":826},[787,9072,957],{"class":833},[787,9074,960],{"class":826},[787,9076,843],{"class":793},[787,9078,965],{"class":814},[787,9080,849],{"class":793},[787,9082,9083,9085,9088,9090,9092,9095],{"class":789,"line":1065},[787,9084,827],{"class":826},[787,9086,9087],{"class":833}," ServerHint ",[787,9089,960],{"class":826},[787,9091,843],{"class":793},[787,9093,9094],{"class":814},"~\u002Fcomponents\u002Fkitchen-sink\u002FServerHint.vue",[787,9096,849],{"class":793},[787,9098,9099,9101,9103,9105,9107,9109,9111,9113],{"class":789,"line":1072},[787,9100,827],{"class":826},[787,9102,830],{"class":793},[787,9104,977],{"class":833},[787,9106,837],{"class":793},[787,9108,840],{"class":826},[787,9110,843],{"class":793},[787,9112,986],{"class":814},[787,9114,849],{"class":793},[787,9116,9117,9119,9121,9123,9125,9127,9129,9131,9133,9135,9137,9139,9141,9143],{"class":789,"line":1104},[787,9118,827],{"class":826},[787,9120,830],{"class":793},[787,9122,998],{"class":833},[787,9124,886],{"class":793},[787,9126,1003],{"class":833},[787,9128,886],{"class":793},[787,9130,1008],{"class":833},[787,9132,886],{"class":793},[787,9134,1013],{"class":833},[787,9136,837],{"class":793},[787,9138,840],{"class":826},[787,9140,843],{"class":793},[787,9142,1022],{"class":814},[787,9144,849],{"class":793},[787,9146,9147,9149,9151,9154,9156,9158,9160,9163],{"class":789,"line":1109},[787,9148,827],{"class":826},[787,9150,830],{"class":793},[787,9152,9153],{"class":833}," SAMPLES_SLIDES",[787,9155,837],{"class":793},[787,9157,840],{"class":826},[787,9159,843],{"class":793},[787,9161,9162],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fslides",[787,9164,849],{"class":793},[787,9166,9167,9169,9171,9173,9175,9178],{"class":789,"line":1116},[787,9168,827],{"class":826},[787,9170,1053],{"class":833},[787,9172,960],{"class":826},[787,9174,843],{"class":793},[787,9176,9177],{"class":814},".\u002Fslides.vue?raw",[787,9179,849],{"class":793},[787,9181,9182],{"class":789,"line":1122},[787,9183,1069],{"emptyLinePlaceholder":1068},[787,9185,9186,9188,9190,9192,9194,9196,9198,9200,9202,9204],{"class":789,"line":1128},[787,9187,1076],{"class":1075},[787,9189,1079],{"class":833},[787,9191,1082],{"class":793},[787,9193,1085],{"class":797},[787,9195,1088],{"class":793},[787,9197,843],{"class":793},[787,9199,1093],{"class":814},[787,9201,1096],{"class":793},[787,9203,837],{"class":793},[787,9205,1101],{"class":833},[787,9207,9208],{"class":789,"line":1134},[787,9209,1069],{"emptyLinePlaceholder":1068},[787,9211,9212],{"class":789,"line":1140},[787,9213,9214],{"class":1112},"\u002F\u002F The slides add-on on an AdvancedEditor: it brings two Block types (`deck`, `slide`), a host feature (the preview section in the\n",[787,9216,9217],{"class":789,"line":1145},[787,9218,9219],{"class":1112},"\u002F\u002F inspector and the slide hover actions) and transfer transforms (\"Insert as slides\"). The page imports the add-on's `\u002Fclient`\n",[787,9221,9222],{"class":789,"line":1151},[787,9223,9224],{"class":1112},"\u002F\u002F and `\u002Fvue` entries directly, so the editor shows decks whatever `NUXT_PUBLIC_ADDONS_SLIDES` says; only the server render targets\n",[787,9226,9227],{"class":789,"line":1173},[787,9228,9229],{"class":1112},"\u002F\u002F (reveal.js, PowerPoint, Marp) need that flag.\n",[787,9231,9232,9234,9236,9238,9240,9242,9244,9246,9248,9250],{"class":789,"line":1203},[787,9233,1154],{"class":801},[787,9235,1423],{"class":833},[787,9237,808],{"class":793},[787,9239,977],{"class":1075},[787,9241,1079],{"class":833},[787,9243,1096],{"class":793},[787,9245,8769],{"class":814},[787,9247,1096],{"class":793},[787,9249,1305],{"class":833},[787,9251,1440],{"class":793},[787,9253,9254,9256,9258,9261,9263,9266,9268,9270,9272],{"class":789,"line":1208},[787,9255,1154],{"class":801},[787,9257,830],{"class":793},[787,9259,9260],{"class":833}," t",[787,9262,886],{"class":793},[787,9264,9265],{"class":833}," locale ",[787,9267,1162],{"class":793},[787,9269,1165],{"class":793},[787,9271,933],{"class":1075},[787,9273,1170],{"class":833},[787,9275,9276,9278,9281,9283,9285],{"class":789,"line":1226},[787,9277,1154],{"class":801},[787,9279,9280],{"class":833}," ctx ",[787,9282,808],{"class":793},[787,9284,9009],{"class":1075},[787,9286,1170],{"class":833},[787,9288,9289],{"class":789,"line":1232},[787,9290,9291],{"class":1112},"\u002F\u002F Called in setup, before the first await: the AI\u002Fprofile features of the composition inject the app context.\n",[787,9293,9294,9296,9298,9300,9302,9304,9306,9308,9310],{"class":789,"line":1258},[787,9295,1154],{"class":801},[787,9297,1454],{"class":833},[787,9299,808],{"class":793},[787,9301,998],{"class":1075},[787,9303,1461],{"class":833},[787,9305,555],{"class":793},[787,9307,1466],{"class":833},[787,9309,886],{"class":793},[787,9311,9312],{"class":833}," SAMPLES_SLIDES)\n",[787,9314,9315],{"class":789,"line":1292},[787,9316,1069],{"emptyLinePlaceholder":1068},[787,9318,9319],{"class":789,"line":1334},[787,9320,9321],{"class":1112},"\u002F\u002F Constants, not template literals: a new object on every re-render would replace the editor's options each time.\n",[787,9323,9324,9326,9328,9330,9332,9334,9336,9338,9340,9342,9344,9346,9348,9351],{"class":789,"line":1341},[787,9325,1154],{"class":801},[787,9327,1178],{"class":833},[787,9329,1088],{"class":793},[787,9331,883],{"class":1183},[787,9333,1186],{"class":833},[787,9335,808],{"class":793},[787,9337,1191],{"class":833},[787,9339,1194],{"class":793},[787,9341,1197],{"class":1075},[787,9343,2332],{"class":833},[787,9345,886],{"class":793},[787,9347,4124],{"class":793},[787,9349,9350],{"class":1075},"slideBlockTypes",[787,9352,9353],{"class":833},"(locale)]\n",[787,9355,9356,9358,9361,9363,9365,9367,9369,9371,9373,9376,9378,9381,9383,9385,9388,9390],{"class":789,"line":1413},[787,9357,1154],{"class":801},[787,9359,9360],{"class":833}," interaction",[787,9362,1088],{"class":793},[787,9364,8962],{"class":1183},[787,9366,1186],{"class":833},[787,9368,808],{"class":793},[787,9370,1191],{"class":833},[787,9372,1194],{"class":793},[787,9374,9375],{"class":833},"INTERACTION",[787,9377,555],{"class":793},[787,9379,9380],{"class":833},"full",[787,9382,886],{"class":793},[787,9384,843],{"class":793},[787,9386,9387],{"class":814},"transfer",[787,9389,1096],{"class":793},[787,9391,1410],{"class":833},[787,9393,9394,9396,9399,9401,9403,9405,9407,9410,9412,9414,9416,9418,9420,9422,9424],{"class":789,"line":1418},[787,9395,1154],{"class":801},[787,9397,9398],{"class":833}," transfer",[787,9400,1088],{"class":793},[787,9402,8989],{"class":1183},[787,9404,1165],{"class":793},[787,9406,830],{"class":793},[787,9408,9409],{"class":797}," extraTransforms",[787,9411,1088],{"class":793},[787,9413,9037],{"class":1075},[787,9415,1079],{"class":833},[787,9417,1082],{"class":793},[787,9419,9265],{"class":833},[787,9421,1162],{"class":793},[787,9423,3042],{"class":833},[787,9425,3099],{"class":793},[787,9427,9428,9430,9433,9435,9437,9440],{"class":789,"line":1443},[787,9429,1154],{"class":801},[787,9431,9432],{"class":833}," features ",[787,9434,808],{"class":793},[787,9436,1191],{"class":833},[787,9438,9439],{"class":1075},"slidesFeature",[787,9441,6272],{"class":833},[787,9443,9444],{"class":789,"line":1449},[787,9445,1069],{"emptyLinePlaceholder":1068},[787,9447,9448],{"class":789,"line":1474},[787,9449,9450],{"class":1112},"\u002F\u002F The renderer is a server port: without it (or without the slides targets) the \"Render as…\" menu has no deck formats.\n",[787,9452,9453,9455,9458,9460,9463,9465,9467,9470,9472,9475,9477,9480,9482,9484,9487,9489,9491,9493,9496,9499],{"class":789,"line":1479},[787,9454,1154],{"class":801},[787,9456,9457],{"class":833}," targets ",[787,9459,808],{"class":793},[787,9461,9462],{"class":826}," await",[787,9464,4432],{"class":833},[787,9466,555],{"class":793},[787,9468,9469],{"class":833},"backend",[787,9471,555],{"class":793},[787,9473,9474],{"class":833},"render",[787,9476,1651],{"class":793},[787,9478,9479],{"class":1075},"targets",[787,9481,1615],{"class":833},[787,9483,555],{"class":793},[787,9485,9486],{"class":1075},"catch",[787,9488,1079],{"class":833},[787,9490,1615],{"class":793},[787,9492,1269],{"class":801},[787,9494,9495],{"class":833}," []) ",[787,9497,9498],{"class":793},"??",[787,9500,9501],{"class":833}," []\n",[787,9503,9504,9506,9509,9511,9514,9516,9519,9521,9524,9526,9529,9531,9534,9536,9538,9541,9543],{"class":789,"line":1485},[787,9505,1154],{"class":801},[787,9507,9508],{"class":833}," hasRender ",[787,9510,808],{"class":793},[787,9512,9513],{"class":833}," targets",[787,9515,555],{"class":793},[787,9517,9518],{"class":1075},"some",[787,9520,1079],{"class":833},[787,9522,9523],{"class":1302},"target",[787,9525,1269],{"class":801},[787,9527,9528],{"class":833}," target",[787,9530,555],{"class":793},[787,9532,9533],{"class":833},"id ",[787,9535,5714],{"class":793},[787,9537,843],{"class":793},[787,9539,9540],{"class":814},"reveal-html",[787,9542,1096],{"class":793},[787,9544,1101],{"class":833},[787,9546,9547,9549,9551],{"class":789,"line":1558},[787,9548,1828],{"class":793},[787,9550,798],{"class":797},[787,9552,820],{"class":793},[676,9554,524],{"id":9555},"databases",[418,9557,9558],{},"Tasks as rows, queried into tables, boards, collections and charts.",[702,9560,9561,9587,9599,9607],{},[705,9562,9563,9566,9567,9569,9570,470,9573,470,9576,9579,9580,9582,9583,470,9585,609],{},[559,9564,9565],{},"DataQuery."," A ",[422,9568,1941],{}," block stores a query (",[422,9571,9572],{},"source",[422,9574,9575],{},"sorts",[422,9577,9578],{},"group",") and a layout; it holds no rows. The „Task tracker“ sample has eight ",[422,9581,739],{}," blocks, a table view sorted by due date and a board grouped by status (",[466,9584,205],{"href":206},[466,9586,238],{"href":239},[705,9588,9589,9592,9593,9596,9597,609],{},[559,9590,9591],{},"No index needed."," A data view or chart asks the backend's Block index and answers from the open document only when the backend has none. The standalone editor's blocks are in no index, so the page provides its editor a copy of the context whose backend has no ",[422,9594,9595],{},"index","; everything else stays the app's (",[466,9598,190],{"href":191},[705,9600,9601,9604,9605,609],{},[559,9602,9603],{},"Collections."," The „Collection“ sample lists three tasks by block id; the sample gives those tasks fixed ids so the references resolve (",[466,9606,200],{"href":201},[705,9608,9609,1978,9612,594,9615,9618,9619,594,9622,9625,9626,9629,9630,9632,9633,609],{},[559,9610,9611],{},"Charts.",[422,9613,9614],{},"chartBlockTypes(locale)",[422,9616,9617],{},"chartNodeViews"," come from the charts add-on's ",[422,9620,9621],{},"\u002Fclient",[422,9623,9624],{},"\u002Fvue"," entries, so charts draw in the browser whatever ",[422,9627,9628],{},"NUXT_PUBLIC_ADDONS_CHARTS"," says; the flag adds the server's SVG export, and the panel shows a ",[422,9631,636],{}," without it (",[466,9634,303],{"href":304},[777,9636,9639],{"className":779,"code":9637,"filename":9638,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { CompositeTable } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport { EDITOR_CONTEXT, useEditorContext, useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { chartBlockTypes } from '@skaile\u002Fforge-editor-charts\u002Fclient'\nimport { chartNodeViews } from '@skaile\u002Fforge-editor-charts\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport ServerHint from '~\u002Fcomponents\u002Fkitchen-sink\u002FServerHint.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_DATABASES } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fdatabases'\nimport source from '.\u002Fdatabases.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F Typed blocks as database rows. `task` blocks carry properties (status, due, assignee); the built-in `dataView` block shows a stored\n\u002F\u002F query as a table or a board, and the charts add-on's `chart` block draws one. The page imports the charts add-on's `\u002Fclient`\n\u002F\u002F and `\u002Fvue` entries directly, whatever `NUXT_PUBLIC_ADDONS_CHARTS` says; only the server's chart export needs that flag.\nconst page = pageOf('databases')!\nconst { t, locale } = useEditorI18n()\nconst ctx = useEditorContext()\n\u002F\u002F A data view or chart asks the backend's Block index (every Document of the workspace) and answers from the open Document\n\u002F\u002F only when the backend has none. This editor is standalone: its Blocks are in no index, so the page hands its editor a\n\u002F\u002F backend without `index`, and the views show the sample's tasks. Everything else (render, AI, settings) stays the app's.\nconst { index: _workspaceIndex, ...localBackend } = ctx.backend\nprovide(EDITOR_CONTEXT, { ...ctx, backend: localBackend })\n\u002F\u002F Called in setup, before the first await: the AI\u002Fprofile features of the composition inject the app context.\nconst pane = createPane(page.title, SAMPLES_DATABASES)\n\n\u002F\u002F Constant, not a template literal: a new array on every re-render would replace the editor's Block types each time.\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t), ...chartBlockTypes(locale)]\n\n\u002F\u002F The renderer is a server port: without it (or without the chart target) a chart cannot be exported as SVG.\nconst targets = await ctx.backend.render?.targets().catch(() => []) ?? []\nconst hasChartExport = targets.some(target => target.id === 'chart-svg')\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fdatabases.vue",[422,9640,9641,9661,9679,9697,9721,9739,9766,9786,9806,9820,9834,9852,9882,9902,9917,9921,9943,9947,9952,9957,9962,9984,10004,10016,10021,10026,10031,10063,10093,10097,10118,10122,10127,10158,10162,10167,10209,10247],{"__ignoreMap":783},[787,9642,9643,9645,9647,9649,9651,9653,9655,9657,9659],{"class":789,"line":790},[787,9644,794],{"class":793},[787,9646,798],{"class":797},[787,9648,802],{"class":801},[787,9650,805],{"class":801},[787,9652,808],{"class":793},[787,9654,811],{"class":793},[787,9656,815],{"class":814},[787,9658,811],{"class":793},[787,9660,820],{"class":793},[787,9662,9663,9665,9667,9669,9671,9673,9675,9677],{"class":789,"line":823},[787,9664,827],{"class":826},[787,9666,830],{"class":793},[787,9668,834],{"class":833},[787,9670,837],{"class":793},[787,9672,840],{"class":826},[787,9674,843],{"class":793},[787,9676,846],{"class":814},[787,9678,849],{"class":793},[787,9680,9681,9683,9685,9687,9689,9691,9693,9695],{"class":789,"line":852},[787,9682,827],{"class":826},[787,9684,830],{"class":793},[787,9686,859],{"class":833},[787,9688,837],{"class":793},[787,9690,840],{"class":826},[787,9692,843],{"class":793},[787,9694,868],{"class":814},[787,9696,849],{"class":793},[787,9698,9699,9701,9703,9705,9707,9709,9711,9713,9715,9717,9719],{"class":789,"line":873},[787,9700,827],{"class":826},[787,9702,830],{"class":793},[787,9704,880],{"class":826},[787,9706,883],{"class":833},[787,9708,886],{"class":793},[787,9710,889],{"class":833},[787,9712,837],{"class":793},[787,9714,840],{"class":826},[787,9716,843],{"class":793},[787,9718,898],{"class":814},[787,9720,849],{"class":793},[787,9722,9723,9725,9727,9729,9731,9733,9735,9737],{"class":789,"line":903},[787,9724,827],{"class":826},[787,9726,830],{"class":793},[787,9728,2088],{"class":833},[787,9730,837],{"class":793},[787,9732,840],{"class":826},[787,9734,843],{"class":793},[787,9736,2097],{"class":814},[787,9738,849],{"class":793},[787,9740,9741,9743,9745,9748,9750,9752,9754,9756,9758,9760,9762,9764],{"class":789,"line":926},[787,9742,827],{"class":826},[787,9744,830],{"class":793},[787,9746,9747],{"class":833}," EDITOR_CONTEXT",[787,9749,886],{"class":793},[787,9751,9009],{"class":833},[787,9753,886],{"class":793},[787,9755,933],{"class":833},[787,9757,837],{"class":793},[787,9759,840],{"class":826},[787,9761,843],{"class":793},[787,9763,947],{"class":814},[787,9765,849],{"class":793},[787,9767,9768,9770,9772,9775,9777,9779,9781,9784],{"class":789,"line":952},[787,9769,827],{"class":826},[787,9771,830],{"class":793},[787,9773,9774],{"class":833}," chartBlockTypes",[787,9776,837],{"class":793},[787,9778,840],{"class":826},[787,9780,843],{"class":793},[787,9782,9783],{"class":814},"@skaile\u002Fforge-editor-charts\u002Fclient",[787,9785,849],{"class":793},[787,9787,9788,9790,9792,9795,9797,9799,9801,9804],{"class":789,"line":970},[787,9789,827],{"class":826},[787,9791,830],{"class":793},[787,9793,9794],{"class":833}," chartNodeViews",[787,9796,837],{"class":793},[787,9798,840],{"class":826},[787,9800,843],{"class":793},[787,9802,9803],{"class":814},"@skaile\u002Fforge-editor-charts\u002Fvue",[787,9805,849],{"class":793},[787,9807,9808,9810,9812,9814,9816,9818],{"class":789,"line":991},[787,9809,827],{"class":826},[787,9811,957],{"class":833},[787,9813,960],{"class":826},[787,9815,843],{"class":793},[787,9817,965],{"class":814},[787,9819,849],{"class":793},[787,9821,9822,9824,9826,9828,9830,9832],{"class":789,"line":1027},[787,9823,827],{"class":826},[787,9825,9087],{"class":833},[787,9827,960],{"class":826},[787,9829,843],{"class":793},[787,9831,9094],{"class":814},[787,9833,849],{"class":793},[787,9835,9836,9838,9840,9842,9844,9846,9848,9850],{"class":789,"line":1048},[787,9837,827],{"class":826},[787,9839,830],{"class":793},[787,9841,977],{"class":833},[787,9843,837],{"class":793},[787,9845,840],{"class":826},[787,9847,843],{"class":793},[787,9849,986],{"class":814},[787,9851,849],{"class":793},[787,9853,9854,9856,9858,9860,9862,9864,9866,9868,9870,9872,9874,9876,9878,9880],{"class":789,"line":1065},[787,9855,827],{"class":826},[787,9857,830],{"class":793},[787,9859,998],{"class":833},[787,9861,886],{"class":793},[787,9863,1003],{"class":833},[787,9865,886],{"class":793},[787,9867,1008],{"class":833},[787,9869,886],{"class":793},[787,9871,1013],{"class":833},[787,9873,837],{"class":793},[787,9875,840],{"class":826},[787,9877,843],{"class":793},[787,9879,1022],{"class":814},[787,9881,849],{"class":793},[787,9883,9884,9886,9888,9891,9893,9895,9897,9900],{"class":789,"line":1072},[787,9885,827],{"class":826},[787,9887,830],{"class":793},[787,9889,9890],{"class":833}," SAMPLES_DATABASES",[787,9892,837],{"class":793},[787,9894,840],{"class":826},[787,9896,843],{"class":793},[787,9898,9899],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fdatabases",[787,9901,849],{"class":793},[787,9903,9904,9906,9908,9910,9912,9915],{"class":789,"line":1104},[787,9905,827],{"class":826},[787,9907,1053],{"class":833},[787,9909,960],{"class":826},[787,9911,843],{"class":793},[787,9913,9914],{"class":814},".\u002Fdatabases.vue?raw",[787,9916,849],{"class":793},[787,9918,9919],{"class":789,"line":1109},[787,9920,1069],{"emptyLinePlaceholder":1068},[787,9922,9923,9925,9927,9929,9931,9933,9935,9937,9939,9941],{"class":789,"line":1116},[787,9924,1076],{"class":1075},[787,9926,1079],{"class":833},[787,9928,1082],{"class":793},[787,9930,1085],{"class":797},[787,9932,1088],{"class":793},[787,9934,843],{"class":793},[787,9936,1093],{"class":814},[787,9938,1096],{"class":793},[787,9940,837],{"class":793},[787,9942,1101],{"class":833},[787,9944,9945],{"class":789,"line":1122},[787,9946,1069],{"emptyLinePlaceholder":1068},[787,9948,9949],{"class":789,"line":1128},[787,9950,9951],{"class":1112},"\u002F\u002F Typed blocks as database rows. `task` blocks carry properties (status, due, assignee); the built-in `dataView` block shows a stored\n",[787,9953,9954],{"class":789,"line":1134},[787,9955,9956],{"class":1112},"\u002F\u002F query as a table or a board, and the charts add-on's `chart` block draws one. The page imports the charts add-on's `\u002Fclient`\n",[787,9958,9959],{"class":789,"line":1140},[787,9960,9961],{"class":1112},"\u002F\u002F and `\u002Fvue` entries directly, whatever `NUXT_PUBLIC_ADDONS_CHARTS` says; only the server's chart export needs that flag.\n",[787,9963,9964,9966,9968,9970,9972,9974,9976,9978,9980,9982],{"class":789,"line":1145},[787,9965,1154],{"class":801},[787,9967,1423],{"class":833},[787,9969,808],{"class":793},[787,9971,977],{"class":1075},[787,9973,1079],{"class":833},[787,9975,1096],{"class":793},[787,9977,9555],{"class":814},[787,9979,1096],{"class":793},[787,9981,1305],{"class":833},[787,9983,1440],{"class":793},[787,9985,9986,9988,9990,9992,9994,9996,9998,10000,10002],{"class":789,"line":1151},[787,9987,1154],{"class":801},[787,9989,830],{"class":793},[787,9991,9260],{"class":833},[787,9993,886],{"class":793},[787,9995,9265],{"class":833},[787,9997,1162],{"class":793},[787,9999,1165],{"class":793},[787,10001,933],{"class":1075},[787,10003,1170],{"class":833},[787,10005,10006,10008,10010,10012,10014],{"class":789,"line":1173},[787,10007,1154],{"class":801},[787,10009,9280],{"class":833},[787,10011,808],{"class":793},[787,10013,9009],{"class":1075},[787,10015,1170],{"class":833},[787,10017,10018],{"class":789,"line":1203},[787,10019,10020],{"class":1112},"\u002F\u002F A data view or chart asks the backend's Block index (every Document of the workspace) and answers from the open Document\n",[787,10022,10023],{"class":789,"line":1208},[787,10024,10025],{"class":1112},"\u002F\u002F only when the backend has none. This editor is standalone: its Blocks are in no index, so the page hands its editor a\n",[787,10027,10028],{"class":789,"line":1226},[787,10029,10030],{"class":1112},"\u002F\u002F backend without `index`, and the views show the sample's tasks. Everything else (render, AI, settings) stays the app's.\n",[787,10032,10033,10035,10037,10040,10042,10045,10047,10049,10052,10054,10056,10058,10060],{"class":789,"line":1232},[787,10034,1154],{"class":801},[787,10036,830],{"class":793},[787,10038,10039],{"class":797}," index",[787,10041,1088],{"class":793},[787,10043,10044],{"class":833}," _workspaceIndex",[787,10046,886],{"class":793},[787,10048,4124],{"class":793},[787,10050,10051],{"class":833},"localBackend ",[787,10053,1162],{"class":793},[787,10055,1165],{"class":793},[787,10057,4432],{"class":833},[787,10059,555],{"class":793},[787,10061,10062],{"class":833},"backend\n",[787,10064,10065,10068,10071,10073,10075,10077,10079,10081,10084,10086,10089,10091],{"class":789,"line":1258},[787,10066,10067],{"class":1075},"provide",[787,10069,10070],{"class":833},"(EDITOR_CONTEXT",[787,10072,886],{"class":793},[787,10074,830],{"class":793},[787,10076,4124],{"class":793},[787,10078,4277],{"class":833},[787,10080,886],{"class":793},[787,10082,10083],{"class":797}," backend",[787,10085,1088],{"class":793},[787,10087,10088],{"class":833}," localBackend ",[787,10090,1162],{"class":793},[787,10092,1101],{"class":833},[787,10094,10095],{"class":789,"line":1292},[787,10096,9291],{"class":1112},[787,10098,10099,10101,10103,10105,10107,10109,10111,10113,10115],{"class":789,"line":1334},[787,10100,1154],{"class":801},[787,10102,1454],{"class":833},[787,10104,808],{"class":793},[787,10106,998],{"class":1075},[787,10108,1461],{"class":833},[787,10110,555],{"class":793},[787,10112,1466],{"class":833},[787,10114,886],{"class":793},[787,10116,10117],{"class":833}," SAMPLES_DATABASES)\n",[787,10119,10120],{"class":789,"line":1341},[787,10121,1069],{"emptyLinePlaceholder":1068},[787,10123,10124],{"class":789,"line":1413},[787,10125,10126],{"class":1112},"\u002F\u002F Constant, not a template literal: a new array on every re-render would replace the editor's Block types each time.\n",[787,10128,10129,10131,10133,10135,10137,10139,10141,10143,10145,10147,10149,10151,10153,10156],{"class":789,"line":1418},[787,10130,1154],{"class":801},[787,10132,1178],{"class":833},[787,10134,1088],{"class":793},[787,10136,883],{"class":1183},[787,10138,1186],{"class":833},[787,10140,808],{"class":793},[787,10142,1191],{"class":833},[787,10144,1194],{"class":793},[787,10146,1197],{"class":1075},[787,10148,2332],{"class":833},[787,10150,886],{"class":793},[787,10152,4124],{"class":793},[787,10154,10155],{"class":1075},"chartBlockTypes",[787,10157,9353],{"class":833},[787,10159,10160],{"class":789,"line":1443},[787,10161,1069],{"emptyLinePlaceholder":1068},[787,10163,10164],{"class":789,"line":1449},[787,10165,10166],{"class":1112},"\u002F\u002F The renderer is a server port: without it (or without the chart target) a chart cannot be exported as SVG.\n",[787,10168,10169,10171,10173,10175,10177,10179,10181,10183,10185,10187,10189,10191,10193,10195,10197,10199,10201,10203,10205,10207],{"class":789,"line":1474},[787,10170,1154],{"class":801},[787,10172,9457],{"class":833},[787,10174,808],{"class":793},[787,10176,9462],{"class":826},[787,10178,4432],{"class":833},[787,10180,555],{"class":793},[787,10182,9469],{"class":833},[787,10184,555],{"class":793},[787,10186,9474],{"class":833},[787,10188,1651],{"class":793},[787,10190,9479],{"class":1075},[787,10192,1615],{"class":833},[787,10194,555],{"class":793},[787,10196,9486],{"class":1075},[787,10198,1079],{"class":833},[787,10200,1615],{"class":793},[787,10202,1269],{"class":801},[787,10204,9495],{"class":833},[787,10206,9498],{"class":793},[787,10208,9501],{"class":833},[787,10210,10211,10213,10216,10218,10220,10222,10224,10226,10228,10230,10232,10234,10236,10238,10240,10243,10245],{"class":789,"line":1479},[787,10212,1154],{"class":801},[787,10214,10215],{"class":833}," hasChartExport ",[787,10217,808],{"class":793},[787,10219,9513],{"class":833},[787,10221,555],{"class":793},[787,10223,9518],{"class":1075},[787,10225,1079],{"class":833},[787,10227,9523],{"class":1302},[787,10229,1269],{"class":801},[787,10231,9528],{"class":833},[787,10233,555],{"class":793},[787,10235,9533],{"class":833},[787,10237,5714],{"class":793},[787,10239,843],{"class":793},[787,10241,10242],{"class":814},"chart-svg",[787,10244,1096],{"class":793},[787,10246,1101],{"class":833},[787,10248,10249,10251,10253],{"class":789,"line":1485},[787,10250,1828],{"class":793},[787,10252,798],{"class":797},[787,10254,820],{"class":793},[676,10256,528],{"id":10257},"science",[418,10259,10260],{},"Papers with a bibliography, inline citations, quotes with source anchors and PDF output.",[702,10262,10263,10281,10300,10325],{},[705,10264,10265,9566,10268,10270,10271,10274,10275,10278,10279,609],{},[559,10266,10267],{},"A bibliography in a property.",[422,10269,1926],{}," block keeps one CSL-JSON item in ",[422,10272,10273],{},"meta.bib"," (two references are two blocks). The „Paper notes“ sample computes the citation keys with ",[422,10276,10277],{},"bibtexKey"," instead of writing them by hand (",[466,10280,229],{"href":230},[705,10282,10283,1978,10286,10289,10290,10293,10294,10297,10298,609],{},[559,10284,10285],{},"Cite nodes.",[422,10287,10288],{},"cite"," nodes (insert with ",[422,10291,10292],{},"\u002Fcite"," or type ",[422,10295,10296],{},"[cite:",") name an entry by key and show a short label such as „(Vaswani et al. 2017)“, resolved against the bibliography (",[466,10299,229],{"href":230},[705,10301,10302,1978,10305,2455,10308,10311,10312,10315,10316,10319,10320,10322,10323,609],{},[559,10303,10304],{},"Quotes and source anchors.",[422,10306,10307],{},"quoteBlockTypes(locale)",[422,10309,10310],{},"@skaile\u002Fforge-editor-pdf-viewer"," adds the ",[422,10313,10314],{},"quote"," type, ",[422,10317,10318],{},"pdfViewerFeature()"," from its ",[422,10321,9624],{}," entry the viewer in the inspector (",[466,10324,262],{"href":263},[705,10326,10327,10330,10331,10334,10335,10338,10339,10341,10342,10345,10346,470,10348,609],{},[559,10328,10329],{},"PDF output."," The ",[422,10332,10333],{},"typst-pdf"," render target is server-side. The page waits for ",[422,10336,10337],{},"ctx.backend.ready",", lists the targets and shows a ",[422,10340,636],{}," for ",[422,10343,10344],{},"NUXT_PUBLIC_ADDONS_TYPST"," when it is missing (",[466,10347,272],{"href":273},[466,10349,214],{"href":215},[777,10351,10354],{"className":779,"code":10352,"filename":10353,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { CompositeInspector } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport { useEditorContext, useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { quoteBlockTypes } from '@skaile\u002Fforge-editor-pdf-viewer'\nimport { pdfViewerFeature } from '@skaile\u002Fforge-editor-pdf-viewer\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport ServerHint from '~\u002Fcomponents\u002Fkitchen-sink\u002FServerHint.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_SCIENCE } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fscience'\nimport source from '.\u002Fscience.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F Scientific writing: the default composition plus the PDF-viewer add-on. A `paper` block keeps one CSL-JSON item in\n\u002F\u002F `meta.bib`; `cite` nodes (`\u002Fcite` or `[cite:`) name an entry by its key and show \"(Vaswani et al. 2017)\". `quoteBlockTypes`\n\u002F\u002F adds the `quote` kind (a passage of a PDF with a source anchor), `pdfViewerFeature` the viewer in the inspector. The\n\u002F\u002F \"PDF (Typst)\" render target lives on the server, so the page asks the backend whether it is there.\nconst page = pageOf('science')!\nconst pane = createPane(page.title, SAMPLES_SCIENCE)\n\nconst ctx = useEditorContext()\nconst { t, locale } = useEditorI18n()\nconst blockTypes: BlockType[] = [...defaultBlockTypes(t), ...quoteBlockTypes(locale)]\n\u002F\u002F The `\u002Fvue` entry's feature draws the viewer section of the inspector (the root entry has the framework-free core).\nconst add = [pdfViewerFeature()]\n\n\u002F\u002F `typst-pdf` is the id of `packages\u002Feditor-typst`'s render target (`NUXT_PUBLIC_ADDONS_TYPST=1` installs it on the server).\n\u002F\u002F `backend.ready` settles once the HTTP backend has dropped the capabilities the server lacks.\nawait ctx.backend.ready\nconst targets = (await ctx.backend.render?.targets().catch(() => [])) ?? []\nconst typstMissing = !targets.some(target => target.id === 'typst-pdf')\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fscience.vue",[422,10355,10356,10376,10394,10412,10436,10454,10476,10495,10515,10529,10543,10561,10591,10611,10626,10630,10652,10656,10661,10666,10671,10676,10698,10719,10723,10735,10755,10786,10791,10806,10810,10815,10820,10836,10881,10921],{"__ignoreMap":783},[787,10357,10358,10360,10362,10364,10366,10368,10370,10372,10374],{"class":789,"line":790},[787,10359,794],{"class":793},[787,10361,798],{"class":797},[787,10363,802],{"class":801},[787,10365,805],{"class":801},[787,10367,808],{"class":793},[787,10369,811],{"class":793},[787,10371,815],{"class":814},[787,10373,811],{"class":793},[787,10375,820],{"class":793},[787,10377,10378,10380,10382,10384,10386,10388,10390,10392],{"class":789,"line":823},[787,10379,827],{"class":826},[787,10381,830],{"class":793},[787,10383,834],{"class":833},[787,10385,837],{"class":793},[787,10387,840],{"class":826},[787,10389,843],{"class":793},[787,10391,846],{"class":814},[787,10393,849],{"class":793},[787,10395,10396,10398,10400,10402,10404,10406,10408,10410],{"class":789,"line":852},[787,10397,827],{"class":826},[787,10399,830],{"class":793},[787,10401,859],{"class":833},[787,10403,837],{"class":793},[787,10405,840],{"class":826},[787,10407,843],{"class":793},[787,10409,868],{"class":814},[787,10411,849],{"class":793},[787,10413,10414,10416,10418,10420,10422,10424,10426,10428,10430,10432,10434],{"class":789,"line":873},[787,10415,827],{"class":826},[787,10417,830],{"class":793},[787,10419,880],{"class":826},[787,10421,883],{"class":833},[787,10423,886],{"class":793},[787,10425,889],{"class":833},[787,10427,837],{"class":793},[787,10429,840],{"class":826},[787,10431,843],{"class":793},[787,10433,898],{"class":814},[787,10435,849],{"class":793},[787,10437,10438,10440,10442,10444,10446,10448,10450,10452],{"class":789,"line":903},[787,10439,827],{"class":826},[787,10441,830],{"class":793},[787,10443,2083],{"class":833},[787,10445,837],{"class":793},[787,10447,840],{"class":826},[787,10449,843],{"class":793},[787,10451,2097],{"class":814},[787,10453,849],{"class":793},[787,10455,10456,10458,10460,10462,10464,10466,10468,10470,10472,10474],{"class":789,"line":926},[787,10457,827],{"class":826},[787,10459,830],{"class":793},[787,10461,9009],{"class":833},[787,10463,886],{"class":793},[787,10465,933],{"class":833},[787,10467,837],{"class":793},[787,10469,840],{"class":826},[787,10471,843],{"class":793},[787,10473,947],{"class":814},[787,10475,849],{"class":793},[787,10477,10478,10480,10482,10485,10487,10489,10491,10493],{"class":789,"line":952},[787,10479,827],{"class":826},[787,10481,830],{"class":793},[787,10483,10484],{"class":833}," quoteBlockTypes",[787,10486,837],{"class":793},[787,10488,840],{"class":826},[787,10490,843],{"class":793},[787,10492,10310],{"class":814},[787,10494,849],{"class":793},[787,10496,10497,10499,10501,10504,10506,10508,10510,10513],{"class":789,"line":970},[787,10498,827],{"class":826},[787,10500,830],{"class":793},[787,10502,10503],{"class":833}," pdfViewerFeature",[787,10505,837],{"class":793},[787,10507,840],{"class":826},[787,10509,843],{"class":793},[787,10511,10512],{"class":814},"@skaile\u002Fforge-editor-pdf-viewer\u002Fvue",[787,10514,849],{"class":793},[787,10516,10517,10519,10521,10523,10525,10527],{"class":789,"line":991},[787,10518,827],{"class":826},[787,10520,957],{"class":833},[787,10522,960],{"class":826},[787,10524,843],{"class":793},[787,10526,965],{"class":814},[787,10528,849],{"class":793},[787,10530,10531,10533,10535,10537,10539,10541],{"class":789,"line":1027},[787,10532,827],{"class":826},[787,10534,9087],{"class":833},[787,10536,960],{"class":826},[787,10538,843],{"class":793},[787,10540,9094],{"class":814},[787,10542,849],{"class":793},[787,10544,10545,10547,10549,10551,10553,10555,10557,10559],{"class":789,"line":1048},[787,10546,827],{"class":826},[787,10548,830],{"class":793},[787,10550,977],{"class":833},[787,10552,837],{"class":793},[787,10554,840],{"class":826},[787,10556,843],{"class":793},[787,10558,986],{"class":814},[787,10560,849],{"class":793},[787,10562,10563,10565,10567,10569,10571,10573,10575,10577,10579,10581,10583,10585,10587,10589],{"class":789,"line":1065},[787,10564,827],{"class":826},[787,10566,830],{"class":793},[787,10568,998],{"class":833},[787,10570,886],{"class":793},[787,10572,1003],{"class":833},[787,10574,886],{"class":793},[787,10576,1008],{"class":833},[787,10578,886],{"class":793},[787,10580,1013],{"class":833},[787,10582,837],{"class":793},[787,10584,840],{"class":826},[787,10586,843],{"class":793},[787,10588,1022],{"class":814},[787,10590,849],{"class":793},[787,10592,10593,10595,10597,10600,10602,10604,10606,10609],{"class":789,"line":1072},[787,10594,827],{"class":826},[787,10596,830],{"class":793},[787,10598,10599],{"class":833}," SAMPLES_SCIENCE",[787,10601,837],{"class":793},[787,10603,840],{"class":826},[787,10605,843],{"class":793},[787,10607,10608],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fscience",[787,10610,849],{"class":793},[787,10612,10613,10615,10617,10619,10621,10624],{"class":789,"line":1104},[787,10614,827],{"class":826},[787,10616,1053],{"class":833},[787,10618,960],{"class":826},[787,10620,843],{"class":793},[787,10622,10623],{"class":814},".\u002Fscience.vue?raw",[787,10625,849],{"class":793},[787,10627,10628],{"class":789,"line":1109},[787,10629,1069],{"emptyLinePlaceholder":1068},[787,10631,10632,10634,10636,10638,10640,10642,10644,10646,10648,10650],{"class":789,"line":1116},[787,10633,1076],{"class":1075},[787,10635,1079],{"class":833},[787,10637,1082],{"class":793},[787,10639,1085],{"class":797},[787,10641,1088],{"class":793},[787,10643,843],{"class":793},[787,10645,1093],{"class":814},[787,10647,1096],{"class":793},[787,10649,837],{"class":793},[787,10651,1101],{"class":833},[787,10653,10654],{"class":789,"line":1122},[787,10655,1069],{"emptyLinePlaceholder":1068},[787,10657,10658],{"class":789,"line":1128},[787,10659,10660],{"class":1112},"\u002F\u002F Scientific writing: the default composition plus the PDF-viewer add-on. A `paper` block keeps one CSL-JSON item in\n",[787,10662,10663],{"class":789,"line":1134},[787,10664,10665],{"class":1112},"\u002F\u002F `meta.bib`; `cite` nodes (`\u002Fcite` or `[cite:`) name an entry by its key and show \"(Vaswani et al. 2017)\". `quoteBlockTypes`\n",[787,10667,10668],{"class":789,"line":1140},[787,10669,10670],{"class":1112},"\u002F\u002F adds the `quote` kind (a passage of a PDF with a source anchor), `pdfViewerFeature` the viewer in the inspector. The\n",[787,10672,10673],{"class":789,"line":1145},[787,10674,10675],{"class":1112},"\u002F\u002F \"PDF (Typst)\" render target lives on the server, so the page asks the backend whether it is there.\n",[787,10677,10678,10680,10682,10684,10686,10688,10690,10692,10694,10696],{"class":789,"line":1151},[787,10679,1154],{"class":801},[787,10681,1423],{"class":833},[787,10683,808],{"class":793},[787,10685,977],{"class":1075},[787,10687,1079],{"class":833},[787,10689,1096],{"class":793},[787,10691,10257],{"class":814},[787,10693,1096],{"class":793},[787,10695,1305],{"class":833},[787,10697,1440],{"class":793},[787,10699,10700,10702,10704,10706,10708,10710,10712,10714,10716],{"class":789,"line":1173},[787,10701,1154],{"class":801},[787,10703,1454],{"class":833},[787,10705,808],{"class":793},[787,10707,998],{"class":1075},[787,10709,1461],{"class":833},[787,10711,555],{"class":793},[787,10713,1466],{"class":833},[787,10715,886],{"class":793},[787,10717,10718],{"class":833}," SAMPLES_SCIENCE)\n",[787,10720,10721],{"class":789,"line":1203},[787,10722,1069],{"emptyLinePlaceholder":1068},[787,10724,10725,10727,10729,10731,10733],{"class":789,"line":1208},[787,10726,1154],{"class":801},[787,10728,9280],{"class":833},[787,10730,808],{"class":793},[787,10732,9009],{"class":1075},[787,10734,1170],{"class":833},[787,10736,10737,10739,10741,10743,10745,10747,10749,10751,10753],{"class":789,"line":1226},[787,10738,1154],{"class":801},[787,10740,830],{"class":793},[787,10742,9260],{"class":833},[787,10744,886],{"class":793},[787,10746,9265],{"class":833},[787,10748,1162],{"class":793},[787,10750,1165],{"class":793},[787,10752,933],{"class":1075},[787,10754,1170],{"class":833},[787,10756,10757,10759,10761,10763,10765,10767,10769,10771,10773,10775,10777,10779,10781,10784],{"class":789,"line":1232},[787,10758,1154],{"class":801},[787,10760,1178],{"class":833},[787,10762,1088],{"class":793},[787,10764,883],{"class":1183},[787,10766,1186],{"class":833},[787,10768,808],{"class":793},[787,10770,1191],{"class":833},[787,10772,1194],{"class":793},[787,10774,1197],{"class":1075},[787,10776,2332],{"class":833},[787,10778,886],{"class":793},[787,10780,4124],{"class":793},[787,10782,10783],{"class":1075},"quoteBlockTypes",[787,10785,9353],{"class":833},[787,10787,10788],{"class":789,"line":1258},[787,10789,10790],{"class":1112},"\u002F\u002F The `\u002Fvue` entry's feature draws the viewer section of the inspector (the root entry has the framework-free core).\n",[787,10792,10793,10795,10797,10799,10801,10804],{"class":789,"line":1292},[787,10794,1154],{"class":801},[787,10796,6262],{"class":833},[787,10798,808],{"class":793},[787,10800,1191],{"class":833},[787,10802,10803],{"class":1075},"pdfViewerFeature",[787,10805,6272],{"class":833},[787,10807,10808],{"class":789,"line":1334},[787,10809,1069],{"emptyLinePlaceholder":1068},[787,10811,10812],{"class":789,"line":1341},[787,10813,10814],{"class":1112},"\u002F\u002F `typst-pdf` is the id of `packages\u002Feditor-typst`'s render target (`NUXT_PUBLIC_ADDONS_TYPST=1` installs it on the server).\n",[787,10816,10817],{"class":789,"line":1413},[787,10818,10819],{"class":1112},"\u002F\u002F `backend.ready` settles once the HTTP backend has dropped the capabilities the server lacks.\n",[787,10821,10822,10825,10827,10829,10831,10833],{"class":789,"line":1418},[787,10823,10824],{"class":826},"await",[787,10826,4432],{"class":833},[787,10828,555],{"class":793},[787,10830,9469],{"class":833},[787,10832,555],{"class":793},[787,10834,10835],{"class":833},"ready\n",[787,10837,10838,10840,10842,10844,10846,10848,10850,10852,10854,10856,10858,10860,10862,10864,10866,10868,10870,10872,10874,10877,10879],{"class":789,"line":1443},[787,10839,1154],{"class":801},[787,10841,9457],{"class":833},[787,10843,808],{"class":793},[787,10845,686],{"class":833},[787,10847,10824],{"class":826},[787,10849,4432],{"class":833},[787,10851,555],{"class":793},[787,10853,9469],{"class":833},[787,10855,555],{"class":793},[787,10857,9474],{"class":833},[787,10859,1651],{"class":793},[787,10861,9479],{"class":1075},[787,10863,1615],{"class":833},[787,10865,555],{"class":793},[787,10867,9486],{"class":1075},[787,10869,1079],{"class":833},[787,10871,1615],{"class":793},[787,10873,1269],{"class":801},[787,10875,10876],{"class":833}," [])) ",[787,10878,9498],{"class":793},[787,10880,9501],{"class":833},[787,10882,10883,10885,10888,10890,10893,10895,10897,10899,10901,10903,10905,10907,10909,10911,10913,10915,10917,10919],{"class":789,"line":1449},[787,10884,1154],{"class":801},[787,10886,10887],{"class":833}," typstMissing ",[787,10889,808],{"class":793},[787,10891,10892],{"class":793}," !",[787,10894,9479],{"class":833},[787,10896,555],{"class":793},[787,10898,9518],{"class":1075},[787,10900,1079],{"class":833},[787,10902,9523],{"class":1302},[787,10904,1269],{"class":801},[787,10906,9528],{"class":833},[787,10908,555],{"class":793},[787,10910,9533],{"class":833},[787,10912,5714],{"class":793},[787,10914,843],{"class":793},[787,10916,10333],{"class":814},[787,10918,1096],{"class":793},[787,10920,1101],{"class":833},[787,10922,10923,10925,10927],{"class":789,"line":1474},[787,10924,1828],{"class":793},[787,10926,798],{"class":797},[787,10928,820],{"class":793},[676,10930,532],{"id":10931},"podcast",[418,10933,10934],{},"Recordings with their transcripts and a script, and speech synthesis and mixdown as block actions.",[702,10936,10937,10951,10960,10974],{},[705,10938,10939,1978,10942,594,10944,10946,10947,470,10949,609],{},[559,10940,10941],{},"Recordings and renditions.",[422,10943,1923],{},[422,10945,1935],{}," are built-in types; a transcript is a rendition nested in its recording. The „Episode“ sample has no audio file, since the page is about the structure (",[466,10948,170],{"href":171},[466,10950,94],{"href":95},[705,10952,10953,1978,10956,10959],{},[559,10954,10955],{},"Speaker segments.",[422,10957,10958],{},"metadata.speakers"," offers the two hosts in the speaker picker of each segment.",[705,10961,10962,1978,10965,2455,10968,10971,10972,609],{},[559,10963,10964],{},"Audio actions.",[422,10966,10967],{},"audioFeature({ mixdownMode: 'concat' })",[422,10969,10970],{},"@skaile\u002Fforge-editor-audio"," adds two derive methods to the block actions: read a text block aloud into a new recording, and mix several recordings into one. Both record a Derivation, so a mixdown is marked outdated when one of its takes changes (",[466,10973,277],{"href":278},[705,10975,10976,10979,10980,10983,10984,594,10987,10990,10991,10993,10994,10996,10997,686,10999,609],{},[559,10977,10978],{},"Server ports."," Speech needs the server's ",[422,10981,10982],{},"speech"," port (",[422,10985,10986],{},"NUXT_PUBLIC_ADDONS_AUDIO=1",[422,10988,10989],{},"ELEVENLABS_API_KEY","; the mixdown needs ffmpeg). The page waits for ",[422,10992,10337],{},", tests ",[422,10995,632],{}," and shows a ",[422,10998,636],{},[466,11000,252],{"href":253},[777,11002,11005],{"className":779,"code":11003,"filename":11004,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { CompositeInspector } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport type { EditorMetadata } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { useEditorContext } from '@skaile\u002Fforge-editor\u002Fvue'\nimport { audioFeature } from '@skaile\u002Fforge-editor-audio'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport ServerHint from '~\u002Fcomponents\u002Fkitchen-sink\u002FServerHint.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_PODCAST } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fpodcast'\nimport source from '.\u002Fpodcast.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F A podcast script: the built-in `recording` and `rendition` kinds (a transcript is a rendition nested in its recording) plus\n\u002F\u002F the audio add-on. `audioFeature` adds two derive methods to the block actions: read a text block aloud into a new recording\n\u002F\u002F (text to speech) and mix several recordings into one. Both record a Derivation, so the library marks a mixdown outdated when\n\u002F\u002F one of its takes changes. Speech needs the server's `speech` port, which the page looks up in the backend.\nconst page = pageOf('podcast')!\nconst pane = createPane(page.title, SAMPLES_PODCAST)\n\nconst ctx = useEditorContext()\n\u002F\u002F The hosts offered in the speaker picker of a transcript segment; a constant, so a re-render does not replace the list.\nconst metadata: EditorMetadata = {\n  speakers: [{ id: 'anna', label: 'Anna' }, { id: 'ben', label: 'Ben' }],\n}\nconst add = [audioFeature({ mixdownMode: 'concat' })]\n\u002F\u002F `backend.ready` settles once the HTTP backend has dropped the capabilities the server lacks (`speech` without the audio add-on).\nawait ctx.backend.ready\nconst speechMissing = !ctx.backend.speech\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fpodcast.vue",[422,11006,11007,11027,11045,11063,11081,11101,11119,11138,11152,11166,11184,11214,11234,11249,11253,11275,11279,11284,11289,11294,11299,11321,11342,11346,11358,11363,11377,11441,11445,11479,11484,11498,11520],{"__ignoreMap":783},[787,11008,11009,11011,11013,11015,11017,11019,11021,11023,11025],{"class":789,"line":790},[787,11010,794],{"class":793},[787,11012,798],{"class":797},[787,11014,802],{"class":801},[787,11016,805],{"class":801},[787,11018,808],{"class":793},[787,11020,811],{"class":793},[787,11022,815],{"class":814},[787,11024,811],{"class":793},[787,11026,820],{"class":793},[787,11028,11029,11031,11033,11035,11037,11039,11041,11043],{"class":789,"line":823},[787,11030,827],{"class":826},[787,11032,830],{"class":793},[787,11034,834],{"class":833},[787,11036,837],{"class":793},[787,11038,840],{"class":826},[787,11040,843],{"class":793},[787,11042,846],{"class":814},[787,11044,849],{"class":793},[787,11046,11047,11049,11051,11053,11055,11057,11059,11061],{"class":789,"line":852},[787,11048,827],{"class":826},[787,11050,830],{"class":793},[787,11052,859],{"class":833},[787,11054,837],{"class":793},[787,11056,840],{"class":826},[787,11058,843],{"class":793},[787,11060,868],{"class":814},[787,11062,849],{"class":793},[787,11064,11065,11067,11069,11071,11073,11075,11077,11079],{"class":789,"line":873},[787,11066,827],{"class":826},[787,11068,830],{"class":793},[787,11070,2083],{"class":833},[787,11072,837],{"class":793},[787,11074,840],{"class":826},[787,11076,843],{"class":793},[787,11078,2097],{"class":814},[787,11080,849],{"class":793},[787,11082,11083,11085,11087,11089,11091,11093,11095,11097,11099],{"class":789,"line":903},[787,11084,827],{"class":826},[787,11086,880],{"class":826},[787,11088,830],{"class":793},[787,11090,6495],{"class":833},[787,11092,837],{"class":793},[787,11094,840],{"class":826},[787,11096,843],{"class":793},[787,11098,2458],{"class":814},[787,11100,849],{"class":793},[787,11102,11103,11105,11107,11109,11111,11113,11115,11117],{"class":789,"line":926},[787,11104,827],{"class":826},[787,11106,830],{"class":793},[787,11108,9009],{"class":833},[787,11110,837],{"class":793},[787,11112,840],{"class":826},[787,11114,843],{"class":793},[787,11116,947],{"class":814},[787,11118,849],{"class":793},[787,11120,11121,11123,11125,11128,11130,11132,11134,11136],{"class":789,"line":952},[787,11122,827],{"class":826},[787,11124,830],{"class":793},[787,11126,11127],{"class":833}," audioFeature",[787,11129,837],{"class":793},[787,11131,840],{"class":826},[787,11133,843],{"class":793},[787,11135,10970],{"class":814},[787,11137,849],{"class":793},[787,11139,11140,11142,11144,11146,11148,11150],{"class":789,"line":970},[787,11141,827],{"class":826},[787,11143,957],{"class":833},[787,11145,960],{"class":826},[787,11147,843],{"class":793},[787,11149,965],{"class":814},[787,11151,849],{"class":793},[787,11153,11154,11156,11158,11160,11162,11164],{"class":789,"line":991},[787,11155,827],{"class":826},[787,11157,9087],{"class":833},[787,11159,960],{"class":826},[787,11161,843],{"class":793},[787,11163,9094],{"class":814},[787,11165,849],{"class":793},[787,11167,11168,11170,11172,11174,11176,11178,11180,11182],{"class":789,"line":1027},[787,11169,827],{"class":826},[787,11171,830],{"class":793},[787,11173,977],{"class":833},[787,11175,837],{"class":793},[787,11177,840],{"class":826},[787,11179,843],{"class":793},[787,11181,986],{"class":814},[787,11183,849],{"class":793},[787,11185,11186,11188,11190,11192,11194,11196,11198,11200,11202,11204,11206,11208,11210,11212],{"class":789,"line":1048},[787,11187,827],{"class":826},[787,11189,830],{"class":793},[787,11191,998],{"class":833},[787,11193,886],{"class":793},[787,11195,1003],{"class":833},[787,11197,886],{"class":793},[787,11199,1008],{"class":833},[787,11201,886],{"class":793},[787,11203,1013],{"class":833},[787,11205,837],{"class":793},[787,11207,840],{"class":826},[787,11209,843],{"class":793},[787,11211,1022],{"class":814},[787,11213,849],{"class":793},[787,11215,11216,11218,11220,11223,11225,11227,11229,11232],{"class":789,"line":1065},[787,11217,827],{"class":826},[787,11219,830],{"class":793},[787,11221,11222],{"class":833}," SAMPLES_PODCAST",[787,11224,837],{"class":793},[787,11226,840],{"class":826},[787,11228,843],{"class":793},[787,11230,11231],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fpodcast",[787,11233,849],{"class":793},[787,11235,11236,11238,11240,11242,11244,11247],{"class":789,"line":1072},[787,11237,827],{"class":826},[787,11239,1053],{"class":833},[787,11241,960],{"class":826},[787,11243,843],{"class":793},[787,11245,11246],{"class":814},".\u002Fpodcast.vue?raw",[787,11248,849],{"class":793},[787,11250,11251],{"class":789,"line":1104},[787,11252,1069],{"emptyLinePlaceholder":1068},[787,11254,11255,11257,11259,11261,11263,11265,11267,11269,11271,11273],{"class":789,"line":1109},[787,11256,1076],{"class":1075},[787,11258,1079],{"class":833},[787,11260,1082],{"class":793},[787,11262,1085],{"class":797},[787,11264,1088],{"class":793},[787,11266,843],{"class":793},[787,11268,1093],{"class":814},[787,11270,1096],{"class":793},[787,11272,837],{"class":793},[787,11274,1101],{"class":833},[787,11276,11277],{"class":789,"line":1116},[787,11278,1069],{"emptyLinePlaceholder":1068},[787,11280,11281],{"class":789,"line":1122},[787,11282,11283],{"class":1112},"\u002F\u002F A podcast script: the built-in `recording` and `rendition` kinds (a transcript is a rendition nested in its recording) plus\n",[787,11285,11286],{"class":789,"line":1128},[787,11287,11288],{"class":1112},"\u002F\u002F the audio add-on. `audioFeature` adds two derive methods to the block actions: read a text block aloud into a new recording\n",[787,11290,11291],{"class":789,"line":1134},[787,11292,11293],{"class":1112},"\u002F\u002F (text to speech) and mix several recordings into one. Both record a Derivation, so the library marks a mixdown outdated when\n",[787,11295,11296],{"class":789,"line":1140},[787,11297,11298],{"class":1112},"\u002F\u002F one of its takes changes. Speech needs the server's `speech` port, which the page looks up in the backend.\n",[787,11300,11301,11303,11305,11307,11309,11311,11313,11315,11317,11319],{"class":789,"line":1145},[787,11302,1154],{"class":801},[787,11304,1423],{"class":833},[787,11306,808],{"class":793},[787,11308,977],{"class":1075},[787,11310,1079],{"class":833},[787,11312,1096],{"class":793},[787,11314,10931],{"class":814},[787,11316,1096],{"class":793},[787,11318,1305],{"class":833},[787,11320,1440],{"class":793},[787,11322,11323,11325,11327,11329,11331,11333,11335,11337,11339],{"class":789,"line":1151},[787,11324,1154],{"class":801},[787,11326,1454],{"class":833},[787,11328,808],{"class":793},[787,11330,998],{"class":1075},[787,11332,1461],{"class":833},[787,11334,555],{"class":793},[787,11336,1466],{"class":833},[787,11338,886],{"class":793},[787,11340,11341],{"class":833}," SAMPLES_PODCAST)\n",[787,11343,11344],{"class":789,"line":1173},[787,11345,1069],{"emptyLinePlaceholder":1068},[787,11347,11348,11350,11352,11354,11356],{"class":789,"line":1203},[787,11349,1154],{"class":801},[787,11351,9280],{"class":833},[787,11353,808],{"class":793},[787,11355,9009],{"class":1075},[787,11357,1170],{"class":833},[787,11359,11360],{"class":789,"line":1208},[787,11361,11362],{"class":1112},"\u002F\u002F The hosts offered in the speaker picker of a transcript segment; a constant, so a re-render does not replace the list.\n",[787,11364,11365,11367,11369,11371,11373,11375],{"class":789,"line":1226},[787,11366,1154],{"class":801},[787,11368,6735],{"class":833},[787,11370,1088],{"class":793},[787,11372,6495],{"class":1183},[787,11374,1165],{"class":793},[787,11376,3010],{"class":793},[787,11378,11379,11381,11383,11385,11387,11389,11391,11393,11395,11397,11399,11401,11403,11405,11407,11409,11411,11413,11415,11417,11419,11421,11423,11425,11427,11429,11431,11433,11435,11437,11439],{"class":789,"line":1232},[787,11380,6816],{"class":797},[787,11382,1088],{"class":793},[787,11384,1191],{"class":833},[787,11386,1082],{"class":793},[787,11388,6757],{"class":797},[787,11390,1088],{"class":793},[787,11392,843],{"class":793},[787,11394,6831],{"class":814},[787,11396,1096],{"class":793},[787,11398,886],{"class":793},[787,11400,1355],{"class":797},[787,11402,1088],{"class":793},[787,11404,843],{"class":793},[787,11406,6844],{"class":814},[787,11408,1096],{"class":793},[787,11410,1380],{"class":793},[787,11412,830],{"class":793},[787,11414,6757],{"class":797},[787,11416,1088],{"class":793},[787,11418,843],{"class":793},[787,11420,6859],{"class":814},[787,11422,1096],{"class":793},[787,11424,886],{"class":793},[787,11426,1355],{"class":797},[787,11428,1088],{"class":793},[787,11430,843],{"class":793},[787,11432,6872],{"class":814},[787,11434,1096],{"class":793},[787,11436,837],{"class":793},[787,11438,4134],{"class":833},[787,11440,1289],{"class":793},[787,11442,11443],{"class":789,"line":1258},[787,11444,3099],{"class":793},[787,11446,11447,11449,11451,11453,11455,11458,11460,11462,11465,11467,11469,11472,11474,11476],{"class":789,"line":1292},[787,11448,1154],{"class":801},[787,11450,6262],{"class":833},[787,11452,808],{"class":793},[787,11454,1191],{"class":833},[787,11456,11457],{"class":1075},"audioFeature",[787,11459,1079],{"class":833},[787,11461,1082],{"class":793},[787,11463,11464],{"class":797}," mixdownMode",[787,11466,1088],{"class":793},[787,11468,843],{"class":793},[787,11470,11471],{"class":814},"concat",[787,11473,1096],{"class":793},[787,11475,837],{"class":793},[787,11477,11478],{"class":833},")]\n",[787,11480,11481],{"class":789,"line":1334},[787,11482,11483],{"class":1112},"\u002F\u002F `backend.ready` settles once the HTTP backend has dropped the capabilities the server lacks (`speech` without the audio add-on).\n",[787,11485,11486,11488,11490,11492,11494,11496],{"class":789,"line":1341},[787,11487,10824],{"class":826},[787,11489,4432],{"class":833},[787,11491,555],{"class":793},[787,11493,9469],{"class":833},[787,11495,555],{"class":793},[787,11497,10835],{"class":833},[787,11499,11500,11502,11505,11507,11509,11511,11513,11515,11517],{"class":789,"line":1413},[787,11501,1154],{"class":801},[787,11503,11504],{"class":833}," speechMissing ",[787,11506,808],{"class":793},[787,11508,10892],{"class":793},[787,11510,4277],{"class":833},[787,11512,555],{"class":793},[787,11514,9469],{"class":833},[787,11516,555],{"class":793},[787,11518,11519],{"class":833},"speech\n",[787,11521,11522,11524,11526],{"class":789,"line":1418},[787,11523,1828],{"class":793},[787,11525,798],{"class":797},[787,11527,820],{"class":793},[676,11529,536],{"id":11530},"pkm",[418,11532,11533],{},"A knowledge base in one document: a folder of tagged notes that link to each other.",[702,11535,11536,11548,11562,11573],{},[705,11537,11538,1978,11541,594,11543,11545,11546,609],{},[559,11539,11540],{},"Folders and notes.",[422,11542,1944],{},[422,11544,1918],{}," are built-in Typed blocks; the „Vault“ sample nests notes in a folder (",[466,11547,165],{"href":166},[705,11549,11550,1978,11553,11556,11557,11559,11560,609],{},[559,11551,11552],{},"Tags.",[422,11554,11555],{},"metadata.hashtags"," feeds the ",[422,11558,8082],{}," menu (",[466,11561,94],{"href":95},[705,11563,11564,1978,11567,11570,11571,609],{},[559,11565,11566],{},"References.",[422,11568,11569],{},"[@"," inserts a reference chip to another block of the same document; the sample gives its targets fixed ids (",[466,11572,190],{"href":191},[705,11574,11575,10330,11578,11581,11582,470,11585,470,11588,594,11591,11594],{},[559,11576,11577],{},"What the index adds.",[422,11579,11580],{},"explore"," interaction (backlinks, related notes, the trail) is left out on purpose: it needs the workspace index, which a standalone editor does not have. ",[466,11583,11584],{"href":211},"Explore",[466,11586,11587],{"href":244},"Edges",[466,11589,11590],{"href":258},"Graph",[466,11592,11593],{"href":288},"Knowledge graph"," show what a workspace adds.",[777,11596,11599],{"className":779,"code":11597,"filename":11598,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { AdvancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { CompositeTable } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport type { EditorMetadata } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { EditorOutline } from '@skaile\u002Fforge-editor\u002Foutline\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_PKM } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fpkm'\nimport source from '.\u002Fpkm.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F A knowledge base in one document: a `folder` of `note` blocks, tags from the host's hashtag list and `[@` reference chips\n\u002F\u002F between the notes. The table beside the editor lists every Typed block with its tags, the outline the headings. Left out on\n\u002F\u002F purpose: the `explore` interaction (backlinks, search, related notes across documents) needs the workspace index, which a\n\u002F\u002F standalone editor does not have.\nconst page = pageOf('pkm')!\nconst pane = createPane(page.title, SAMPLES_PKM)\n\n\u002F\u002F A constant, so a re-render does not replace the list.\nconst metadata: EditorMetadata = {\n  hashtags: [{ id: 'idea', label: 'idea' }, { id: 'source', label: 'source' }, { id: 'todo', label: 'todo' }],\n}\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fpkm.vue",[422,11600,11601,11621,11639,11657,11675,11695,11713,11727,11745,11775,11795,11810,11814,11836,11840,11845,11850,11855,11860,11882,11903,11907,11912,11926,12018,12022],{"__ignoreMap":783},[787,11602,11603,11605,11607,11609,11611,11613,11615,11617,11619],{"class":789,"line":790},[787,11604,794],{"class":793},[787,11606,798],{"class":797},[787,11608,802],{"class":801},[787,11610,805],{"class":801},[787,11612,808],{"class":793},[787,11614,811],{"class":793},[787,11616,815],{"class":814},[787,11618,811],{"class":793},[787,11620,820],{"class":793},[787,11622,11623,11625,11627,11629,11631,11633,11635,11637],{"class":789,"line":823},[787,11624,827],{"class":826},[787,11626,830],{"class":793},[787,11628,834],{"class":833},[787,11630,837],{"class":793},[787,11632,840],{"class":826},[787,11634,843],{"class":793},[787,11636,846],{"class":814},[787,11638,849],{"class":793},[787,11640,11641,11643,11645,11647,11649,11651,11653,11655],{"class":789,"line":852},[787,11642,827],{"class":826},[787,11644,830],{"class":793},[787,11646,859],{"class":833},[787,11648,837],{"class":793},[787,11650,840],{"class":826},[787,11652,843],{"class":793},[787,11654,868],{"class":814},[787,11656,849],{"class":793},[787,11658,11659,11661,11663,11665,11667,11669,11671,11673],{"class":789,"line":873},[787,11660,827],{"class":826},[787,11662,830],{"class":793},[787,11664,2088],{"class":833},[787,11666,837],{"class":793},[787,11668,840],{"class":826},[787,11670,843],{"class":793},[787,11672,2097],{"class":814},[787,11674,849],{"class":793},[787,11676,11677,11679,11681,11683,11685,11687,11689,11691,11693],{"class":789,"line":903},[787,11678,827],{"class":826},[787,11680,880],{"class":826},[787,11682,830],{"class":793},[787,11684,6495],{"class":833},[787,11686,837],{"class":793},[787,11688,840],{"class":826},[787,11690,843],{"class":793},[787,11692,2458],{"class":814},[787,11694,849],{"class":793},[787,11696,11697,11699,11701,11703,11705,11707,11709,11711],{"class":789,"line":926},[787,11698,827],{"class":826},[787,11700,830],{"class":793},[787,11702,8262],{"class":833},[787,11704,837],{"class":793},[787,11706,840],{"class":826},[787,11708,843],{"class":793},[787,11710,8271],{"class":814},[787,11712,849],{"class":793},[787,11714,11715,11717,11719,11721,11723,11725],{"class":789,"line":952},[787,11716,827],{"class":826},[787,11718,957],{"class":833},[787,11720,960],{"class":826},[787,11722,843],{"class":793},[787,11724,965],{"class":814},[787,11726,849],{"class":793},[787,11728,11729,11731,11733,11735,11737,11739,11741,11743],{"class":789,"line":970},[787,11730,827],{"class":826},[787,11732,830],{"class":793},[787,11734,977],{"class":833},[787,11736,837],{"class":793},[787,11738,840],{"class":826},[787,11740,843],{"class":793},[787,11742,986],{"class":814},[787,11744,849],{"class":793},[787,11746,11747,11749,11751,11753,11755,11757,11759,11761,11763,11765,11767,11769,11771,11773],{"class":789,"line":991},[787,11748,827],{"class":826},[787,11750,830],{"class":793},[787,11752,998],{"class":833},[787,11754,886],{"class":793},[787,11756,1003],{"class":833},[787,11758,886],{"class":793},[787,11760,1008],{"class":833},[787,11762,886],{"class":793},[787,11764,1013],{"class":833},[787,11766,837],{"class":793},[787,11768,840],{"class":826},[787,11770,843],{"class":793},[787,11772,1022],{"class":814},[787,11774,849],{"class":793},[787,11776,11777,11779,11781,11784,11786,11788,11790,11793],{"class":789,"line":1027},[787,11778,827],{"class":826},[787,11780,830],{"class":793},[787,11782,11783],{"class":833}," SAMPLES_PKM",[787,11785,837],{"class":793},[787,11787,840],{"class":826},[787,11789,843],{"class":793},[787,11791,11792],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fpkm",[787,11794,849],{"class":793},[787,11796,11797,11799,11801,11803,11805,11808],{"class":789,"line":1048},[787,11798,827],{"class":826},[787,11800,1053],{"class":833},[787,11802,960],{"class":826},[787,11804,843],{"class":793},[787,11806,11807],{"class":814},".\u002Fpkm.vue?raw",[787,11809,849],{"class":793},[787,11811,11812],{"class":789,"line":1065},[787,11813,1069],{"emptyLinePlaceholder":1068},[787,11815,11816,11818,11820,11822,11824,11826,11828,11830,11832,11834],{"class":789,"line":1072},[787,11817,1076],{"class":1075},[787,11819,1079],{"class":833},[787,11821,1082],{"class":793},[787,11823,1085],{"class":797},[787,11825,1088],{"class":793},[787,11827,843],{"class":793},[787,11829,1093],{"class":814},[787,11831,1096],{"class":793},[787,11833,837],{"class":793},[787,11835,1101],{"class":833},[787,11837,11838],{"class":789,"line":1104},[787,11839,1069],{"emptyLinePlaceholder":1068},[787,11841,11842],{"class":789,"line":1109},[787,11843,11844],{"class":1112},"\u002F\u002F A knowledge base in one document: a `folder` of `note` blocks, tags from the host's hashtag list and `[@` reference chips\n",[787,11846,11847],{"class":789,"line":1116},[787,11848,11849],{"class":1112},"\u002F\u002F between the notes. The table beside the editor lists every Typed block with its tags, the outline the headings. Left out on\n",[787,11851,11852],{"class":789,"line":1122},[787,11853,11854],{"class":1112},"\u002F\u002F purpose: the `explore` interaction (backlinks, search, related notes across documents) needs the workspace index, which a\n",[787,11856,11857],{"class":789,"line":1128},[787,11858,11859],{"class":1112},"\u002F\u002F standalone editor does not have.\n",[787,11861,11862,11864,11866,11868,11870,11872,11874,11876,11878,11880],{"class":789,"line":1134},[787,11863,1154],{"class":801},[787,11865,1423],{"class":833},[787,11867,808],{"class":793},[787,11869,977],{"class":1075},[787,11871,1079],{"class":833},[787,11873,1096],{"class":793},[787,11875,11530],{"class":814},[787,11877,1096],{"class":793},[787,11879,1305],{"class":833},[787,11881,1440],{"class":793},[787,11883,11884,11886,11888,11890,11892,11894,11896,11898,11900],{"class":789,"line":1140},[787,11885,1154],{"class":801},[787,11887,1454],{"class":833},[787,11889,808],{"class":793},[787,11891,998],{"class":1075},[787,11893,1461],{"class":833},[787,11895,555],{"class":793},[787,11897,1466],{"class":833},[787,11899,886],{"class":793},[787,11901,11902],{"class":833}," SAMPLES_PKM)\n",[787,11904,11905],{"class":789,"line":1145},[787,11906,1069],{"emptyLinePlaceholder":1068},[787,11908,11909],{"class":789,"line":1151},[787,11910,11911],{"class":1112},"\u002F\u002F A constant, so a re-render does not replace the list.\n",[787,11913,11914,11916,11918,11920,11922,11924],{"class":789,"line":1173},[787,11915,1154],{"class":801},[787,11917,6735],{"class":833},[787,11919,1088],{"class":793},[787,11921,6495],{"class":1183},[787,11923,1165],{"class":793},[787,11925,3010],{"class":793},[787,11927,11928,11930,11932,11934,11936,11938,11940,11942,11945,11947,11949,11951,11953,11955,11957,11959,11961,11963,11965,11967,11969,11971,11973,11975,11977,11979,11981,11983,11985,11987,11989,11991,11993,11995,11998,12000,12002,12004,12006,12008,12010,12012,12014,12016],{"class":789,"line":1203},[787,11929,6748],{"class":797},[787,11931,1088],{"class":793},[787,11933,1191],{"class":833},[787,11935,1082],{"class":793},[787,11937,6757],{"class":797},[787,11939,1088],{"class":793},[787,11941,843],{"class":793},[787,11943,11944],{"class":814},"idea",[787,11946,1096],{"class":793},[787,11948,886],{"class":793},[787,11950,1355],{"class":797},[787,11952,1088],{"class":793},[787,11954,843],{"class":793},[787,11956,11944],{"class":814},[787,11958,1096],{"class":793},[787,11960,1380],{"class":793},[787,11962,830],{"class":793},[787,11964,6757],{"class":797},[787,11966,1088],{"class":793},[787,11968,843],{"class":793},[787,11970,9572],{"class":814},[787,11972,1096],{"class":793},[787,11974,886],{"class":793},[787,11976,1355],{"class":797},[787,11978,1088],{"class":793},[787,11980,843],{"class":793},[787,11982,9572],{"class":814},[787,11984,1096],{"class":793},[787,11986,1380],{"class":793},[787,11988,830],{"class":793},[787,11990,6757],{"class":797},[787,11992,1088],{"class":793},[787,11994,843],{"class":793},[787,11996,11997],{"class":814},"todo",[787,11999,1096],{"class":793},[787,12001,886],{"class":793},[787,12003,1355],{"class":797},[787,12005,1088],{"class":793},[787,12007,843],{"class":793},[787,12009,11997],{"class":814},[787,12011,1096],{"class":793},[787,12013,837],{"class":793},[787,12015,4134],{"class":833},[787,12017,1289],{"class":793},[787,12019,12020],{"class":789,"line":1208},[787,12021,3099],{"class":793},[787,12023,12024,12026,12028],{"class":789,"line":1226},[787,12025,1828],{"class":793},[787,12027,798],{"class":797},[787,12029,820],{"class":793},[676,12031,540],{"id":12032},"epikrise",[418,12034,12035],{},"Epikrise comes last because it is the only page whose state lives on the server: the review records are kept by block id. A discharge report built from domain block types, each with its own AI brief and a review record per block.",[702,12037,12038,12065,12083,12110],{},[705,12039,12040,1978,12043,664,12046,12049,12050,12053,12054,594,12057,12060,12061,470,12063,609],{},[559,12041,12042],{},"Domain block types.",[422,12044,12045],{},"EPIKRISE_KINDS",[422,12047,12048],{},"app\u002Feditor\u002Fepikrise\u002Fkinds.ts"," are Block types as data: properties, placeholders and an ",[422,12051,12052],{},"ai-brief"," capability per kind. The UI labels are English; the ",[422,12055,12056],{},"purpose",[422,12058,12059],{},"instructions"," prompt texts stay German because the clinical sample is German (",[466,12062,165],{"href":166},[466,12064,160],{"href":161},[705,12066,12067,10330,12070,12072,12073,12076,12077,12080,12081,609],{},[559,12068,12069],{},"AI brief and data.",[422,12071,12052],{}," config tells „Fill block (AI)“ what a block is for; ",[422,12074,12075],{},"epikriseFeature()"," supplies example paragraphs through ",[422,12078,12079],{},"aiBlockData"," for the reason-for-admission type (",[466,12082,113],{"href":114},[705,12084,12085,12088,12089,12092,12093,12095,12096,12099,12100,12103,12104,12107,12108,609],{},[559,12086,12087],{},"Prüfung."," The page lists the ",[422,12090,12091],{},"pruefung"," capability on every Epikrise kind and on the built-in ",[422,12094,735],{}," type (editorial check, then medical check; the medical check locks the block), installs the feature with ",[422,12097,12098],{},"with: ['pruefung']"," and grants ",[422,12101,12102],{},"ABILITY.pruefungRecord"," at document root. ",[422,12105,12106],{},"document-id=\"kitchen-sink-epikrise\""," gives the server port an id to keep the records under, so they survive a reload; the panel states this (",[466,12109,185],{"href":186},[705,12111,12112,1978,12114,12116],{},[559,12113,1977],{},[422,12115,1981],{}," beside the editor shows the properties and details of the selected block.",[777,12118,12121],{"className":779,"code":12119,"filename":12120,"language":782,"meta":783,"style":783},"\u003Cscript setup lang=\"ts\">\nimport { advancedEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\nimport { AiSidebar } from '@skaile\u002Fforge-editor\u002Fai\u002Fvue\u002Fchat'\nimport { type BlockType, defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { CompositeInspector } from '@skaile\u002Fforge-editor\u002Fcomposites\u002Fvue'\nimport type { AbilitiesOptions, BlockTypeCapability } from '@skaile\u002Fforge-editor\u002Fcore'\nimport { ABILITY, ROOT_ABILITIES } from '@skaile\u002Fforge-editor\u002Fcore\u002Fschema'\nimport { EditorSurface, useEditorI18n } from '@skaile\u002Fforge-editor\u002Fvue'\nimport KitchenSinkPage from '~\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue'\nimport { epikriseFeature } from '~\u002Feditor\u002Fepikrise\u002Ffeature'\nimport { EPIKRISE_KINDS } from '~\u002Feditor\u002Fepikrise\u002Fkinds'\nimport { pageOf } from '~\u002Feditor\u002Fkitchen-sink\u002Fpages'\nimport { createPane, paneReady, paneUpdated, showSettings } from '~\u002Feditor\u002Fkitchen-sink\u002Fpane'\nimport { SAMPLES_EPIKRISE } from '~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fepikrise'\nimport source from '.\u002Fepikrise.vue?raw'\n\ndefinePageMeta({ layout: 'kitchen-sink' })\n\n\u002F\u002F A clinical report with review. An `EditorSurface` on the advanced composition (`advancedEditor`) with the host's\n\u002F\u002F domain Block type (`aufnahme-anlass`, its AI brief and properties are data in `app\u002Feditor\u002Fepikrise\u002Fkinds.ts`), the\n\u002F\u002F host feature that supplies example paragraphs, and the opt-in `pruefung` feature. The page lists the `pruefung`\n\u002F\u002F capability on the reason for admission and on the built-in `section` type, so each part of the report has its own\n\u002F\u002F review; the server keeps the records per document.\n\n\u002F\u002F The Prüfung records are stored under this id by the server port, so they survive a reload.\nconst DOCUMENT_ID = 'kitchen-sink-epikrise'\n\u002F\u002F `pruefung.record` is not part of ROOT_ABILITIES: the host grants it at document root.\nconst abilities: Partial\u003CAbilitiesOptions> = { root: [...ROOT_ABILITIES, ABILITY.pruefungRecord] }\n\u002F\u002F An editorial check, then a medical one (`chain`); the medical check locks the block until it changes or someone lifts\n\u002F\u002F the lock (`lock`). Kinds are host data, the server stores them as given. Listed here and not in `EPIKRISE_KINDS`: a\n\u002F\u002F capability no installed feature declares makes the editor throw, and only this page installs `pruefung`.\nconst review: BlockTypeCapability = { id: 'pruefung', config: { kinds: ['editorial', 'medical'], chain: true, lock: 'medical' } }\nconst reviewed = (type: BlockType): BlockType => ({ ...type, capabilities: [...type.capabilities, review] })\n\nconst { t } = useEditorI18n()\nconst page = pageOf('epikrise')!\n\u002F\u002F Called in setup: the AI\u002Fprofile features of the composition inject the app context.\nconst preset = advancedEditor({\n  blockTypes: [...defaultBlockTypes(t).map(type => type.id === 'section' ? reviewed(type) : type), ...EPIKRISE_KINDS.map(reviewed)],\n  add: [epikriseFeature()],\n  \u002F\u002F `pruefung` is a catalog feature in no interaction level list: added on top of the bundle's `full` interaction.\n  with: ['pruefung'],\n})\nconst pane = createPane(page.title, SAMPLES_EPIKRISE)\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fkitchen-sink\u002Fepikrise.vue",[422,12122,12123,12143,12161,12179,12203,12221,12246,12268,12290,12304,12324,12344,12362,12392,12412,12427,12431,12453,12457,12462,12467,12472,12477,12482,12486,12491,12507,12512,12553,12558,12563,12568,12653,12711,12715,12731,12753,12757,12771,12838,12855,12860,12879,12885,12906],{"__ignoreMap":783},[787,12124,12125,12127,12129,12131,12133,12135,12137,12139,12141],{"class":789,"line":790},[787,12126,794],{"class":793},[787,12128,798],{"class":797},[787,12130,802],{"class":801},[787,12132,805],{"class":801},[787,12134,808],{"class":793},[787,12136,811],{"class":793},[787,12138,815],{"class":814},[787,12140,811],{"class":793},[787,12142,820],{"class":793},[787,12144,12145,12147,12149,12151,12153,12155,12157,12159],{"class":789,"line":823},[787,12146,827],{"class":826},[787,12148,830],{"class":793},[787,12150,7503],{"class":833},[787,12152,837],{"class":793},[787,12154,840],{"class":826},[787,12156,843],{"class":793},[787,12158,846],{"class":814},[787,12160,849],{"class":793},[787,12162,12163,12165,12167,12169,12171,12173,12175,12177],{"class":789,"line":852},[787,12164,827],{"class":826},[787,12166,830],{"class":793},[787,12168,859],{"class":833},[787,12170,837],{"class":793},[787,12172,840],{"class":826},[787,12174,843],{"class":793},[787,12176,868],{"class":814},[787,12178,849],{"class":793},[787,12180,12181,12183,12185,12187,12189,12191,12193,12195,12197,12199,12201],{"class":789,"line":873},[787,12182,827],{"class":826},[787,12184,830],{"class":793},[787,12186,880],{"class":826},[787,12188,883],{"class":833},[787,12190,886],{"class":793},[787,12192,889],{"class":833},[787,12194,837],{"class":793},[787,12196,840],{"class":826},[787,12198,843],{"class":793},[787,12200,898],{"class":814},[787,12202,849],{"class":793},[787,12204,12205,12207,12209,12211,12213,12215,12217,12219],{"class":789,"line":903},[787,12206,827],{"class":826},[787,12208,830],{"class":793},[787,12210,2083],{"class":833},[787,12212,837],{"class":793},[787,12214,840],{"class":826},[787,12216,843],{"class":793},[787,12218,2097],{"class":814},[787,12220,849],{"class":793},[787,12222,12223,12225,12227,12229,12231,12233,12236,12238,12240,12242,12244],{"class":789,"line":926},[787,12224,827],{"class":826},[787,12226,880],{"class":826},[787,12228,830],{"class":793},[787,12230,3385],{"class":833},[787,12232,886],{"class":793},[787,12234,12235],{"class":833}," BlockTypeCapability",[787,12237,837],{"class":793},[787,12239,840],{"class":826},[787,12241,843],{"class":793},[787,12243,2458],{"class":814},[787,12245,849],{"class":793},[787,12247,12248,12250,12252,12254,12256,12258,12260,12262,12264,12266],{"class":789,"line":952},[787,12249,827],{"class":826},[787,12251,830],{"class":793},[787,12253,3419],{"class":833},[787,12255,886],{"class":793},[787,12257,7582],{"class":833},[787,12259,837],{"class":793},[787,12261,840],{"class":826},[787,12263,843],{"class":793},[787,12265,3428],{"class":814},[787,12267,849],{"class":793},[787,12269,12270,12272,12274,12276,12278,12280,12282,12284,12286,12288],{"class":789,"line":970},[787,12271,827],{"class":826},[787,12273,830],{"class":793},[787,12275,7601],{"class":833},[787,12277,886],{"class":793},[787,12279,933],{"class":833},[787,12281,837],{"class":793},[787,12283,840],{"class":826},[787,12285,843],{"class":793},[787,12287,947],{"class":814},[787,12289,849],{"class":793},[787,12291,12292,12294,12296,12298,12300,12302],{"class":789,"line":991},[787,12293,827],{"class":826},[787,12295,957],{"class":833},[787,12297,960],{"class":826},[787,12299,843],{"class":793},[787,12301,965],{"class":814},[787,12303,849],{"class":793},[787,12305,12306,12308,12310,12313,12315,12317,12319,12322],{"class":789,"line":1027},[787,12307,827],{"class":826},[787,12309,830],{"class":793},[787,12311,12312],{"class":833}," epikriseFeature",[787,12314,837],{"class":793},[787,12316,840],{"class":826},[787,12318,843],{"class":793},[787,12320,12321],{"class":814},"~\u002Feditor\u002Fepikrise\u002Ffeature",[787,12323,849],{"class":793},[787,12325,12326,12328,12330,12333,12335,12337,12339,12342],{"class":789,"line":1048},[787,12327,827],{"class":826},[787,12329,830],{"class":793},[787,12331,12332],{"class":833}," EPIKRISE_KINDS",[787,12334,837],{"class":793},[787,12336,840],{"class":826},[787,12338,843],{"class":793},[787,12340,12341],{"class":814},"~\u002Feditor\u002Fepikrise\u002Fkinds",[787,12343,849],{"class":793},[787,12345,12346,12348,12350,12352,12354,12356,12358,12360],{"class":789,"line":1065},[787,12347,827],{"class":826},[787,12349,830],{"class":793},[787,12351,977],{"class":833},[787,12353,837],{"class":793},[787,12355,840],{"class":826},[787,12357,843],{"class":793},[787,12359,986],{"class":814},[787,12361,849],{"class":793},[787,12363,12364,12366,12368,12370,12372,12374,12376,12378,12380,12382,12384,12386,12388,12390],{"class":789,"line":1072},[787,12365,827],{"class":826},[787,12367,830],{"class":793},[787,12369,998],{"class":833},[787,12371,886],{"class":793},[787,12373,1003],{"class":833},[787,12375,886],{"class":793},[787,12377,1008],{"class":833},[787,12379,886],{"class":793},[787,12381,1013],{"class":833},[787,12383,837],{"class":793},[787,12385,840],{"class":826},[787,12387,843],{"class":793},[787,12389,1022],{"class":814},[787,12391,849],{"class":793},[787,12393,12394,12396,12398,12401,12403,12405,12407,12410],{"class":789,"line":1104},[787,12395,827],{"class":826},[787,12397,830],{"class":793},[787,12399,12400],{"class":833}," SAMPLES_EPIKRISE",[787,12402,837],{"class":793},[787,12404,840],{"class":826},[787,12406,843],{"class":793},[787,12408,12409],{"class":814},"~\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002Fepikrise",[787,12411,849],{"class":793},[787,12413,12414,12416,12418,12420,12422,12425],{"class":789,"line":1109},[787,12415,827],{"class":826},[787,12417,1053],{"class":833},[787,12419,960],{"class":826},[787,12421,843],{"class":793},[787,12423,12424],{"class":814},".\u002Fepikrise.vue?raw",[787,12426,849],{"class":793},[787,12428,12429],{"class":789,"line":1116},[787,12430,1069],{"emptyLinePlaceholder":1068},[787,12432,12433,12435,12437,12439,12441,12443,12445,12447,12449,12451],{"class":789,"line":1122},[787,12434,1076],{"class":1075},[787,12436,1079],{"class":833},[787,12438,1082],{"class":793},[787,12440,1085],{"class":797},[787,12442,1088],{"class":793},[787,12444,843],{"class":793},[787,12446,1093],{"class":814},[787,12448,1096],{"class":793},[787,12450,837],{"class":793},[787,12452,1101],{"class":833},[787,12454,12455],{"class":789,"line":1128},[787,12456,1069],{"emptyLinePlaceholder":1068},[787,12458,12459],{"class":789,"line":1134},[787,12460,12461],{"class":1112},"\u002F\u002F A clinical report with review. An `EditorSurface` on the advanced composition (`advancedEditor`) with the host's\n",[787,12463,12464],{"class":789,"line":1140},[787,12465,12466],{"class":1112},"\u002F\u002F domain Block type (`aufnahme-anlass`, its AI brief and properties are data in `app\u002Feditor\u002Fepikrise\u002Fkinds.ts`), the\n",[787,12468,12469],{"class":789,"line":1145},[787,12470,12471],{"class":1112},"\u002F\u002F host feature that supplies example paragraphs, and the opt-in `pruefung` feature. The page lists the `pruefung`\n",[787,12473,12474],{"class":789,"line":1151},[787,12475,12476],{"class":1112},"\u002F\u002F capability on the reason for admission and on the built-in `section` type, so each part of the report has its own\n",[787,12478,12479],{"class":789,"line":1173},[787,12480,12481],{"class":1112},"\u002F\u002F review; the server keeps the records per document.\n",[787,12483,12484],{"class":789,"line":1203},[787,12485,1069],{"emptyLinePlaceholder":1068},[787,12487,12488],{"class":789,"line":1208},[787,12489,12490],{"class":1112},"\u002F\u002F The Prüfung records are stored under this id by the server port, so they survive a reload.\n",[787,12492,12493,12495,12498,12500,12502,12505],{"class":789,"line":1226},[787,12494,1154],{"class":801},[787,12496,12497],{"class":833}," DOCUMENT_ID ",[787,12499,808],{"class":793},[787,12501,843],{"class":793},[787,12503,12504],{"class":814},"kitchen-sink-epikrise",[787,12506,849],{"class":793},[787,12508,12509],{"class":789,"line":1232},[787,12510,12511],{"class":1112},"\u002F\u002F `pruefung.record` is not part of ROOT_ABILITIES: the host grants it at document root.\n",[787,12513,12514,12516,12518,12520,12522,12524,12526,12528,12530,12532,12534,12536,12538,12540,12542,12544,12546,12548,12551],{"class":789,"line":1258},[787,12515,1154],{"class":801},[787,12517,3846],{"class":833},[787,12519,1088],{"class":793},[787,12521,3851],{"class":1183},[787,12523,794],{"class":793},[787,12525,3856],{"class":1183},[787,12527,1250],{"class":793},[787,12529,1165],{"class":793},[787,12531,830],{"class":793},[787,12533,7927],{"class":797},[787,12535,1088],{"class":793},[787,12537,1191],{"class":833},[787,12539,1194],{"class":793},[787,12541,7452],{"class":833},[787,12543,886],{"class":793},[787,12545,3419],{"class":833},[787,12547,555],{"class":793},[787,12549,12550],{"class":833},"pruefungRecord] ",[787,12552,3099],{"class":793},[787,12554,12555],{"class":789,"line":1292},[787,12556,12557],{"class":1112},"\u002F\u002F An editorial check, then a medical one (`chain`); the medical check locks the block until it changes or someone lifts\n",[787,12559,12560],{"class":789,"line":1334},[787,12561,12562],{"class":1112},"\u002F\u002F the lock (`lock`). Kinds are host data, the server stores them as given. Listed here and not in `EPIKRISE_KINDS`: a\n",[787,12564,12565],{"class":789,"line":1341},[787,12566,12567],{"class":1112},"\u002F\u002F capability no installed feature declares makes the editor throw, and only this page installs `pruefung`.\n",[787,12569,12570,12572,12575,12577,12579,12581,12583,12585,12587,12589,12591,12593,12595,12598,12600,12602,12605,12607,12609,12611,12614,12616,12618,12620,12623,12625,12627,12629,12632,12634,12636,12638,12641,12643,12645,12647,12649,12651],{"class":789,"line":1413},[787,12571,1154],{"class":801},[787,12573,12574],{"class":833}," review",[787,12576,1088],{"class":793},[787,12578,12235],{"class":1183},[787,12580,1165],{"class":793},[787,12582,830],{"class":793},[787,12584,6757],{"class":797},[787,12586,1088],{"class":793},[787,12588,843],{"class":793},[787,12590,12091],{"class":814},[787,12592,1096],{"class":793},[787,12594,886],{"class":793},[787,12596,12597],{"class":797}," config",[787,12599,1088],{"class":793},[787,12601,830],{"class":793},[787,12603,12604],{"class":797}," kinds",[787,12606,1088],{"class":793},[787,12608,1191],{"class":833},[787,12610,1096],{"class":793},[787,12612,12613],{"class":814},"editorial",[787,12615,1096],{"class":793},[787,12617,886],{"class":793},[787,12619,843],{"class":793},[787,12621,12622],{"class":814},"medical",[787,12624,1096],{"class":793},[787,12626,4134],{"class":833},[787,12628,886],{"class":793},[787,12630,12631],{"class":797}," chain",[787,12633,1088],{"class":793},[787,12635,1509],{"class":1508},[787,12637,886],{"class":793},[787,12639,12640],{"class":797}," lock",[787,12642,1088],{"class":793},[787,12644,843],{"class":793},[787,12646,12622],{"class":814},[787,12648,1096],{"class":793},[787,12650,837],{"class":793},[787,12652,1592],{"class":793},[787,12654,12655,12657,12660,12662,12664,12666,12668,12670,12672,12674,12676,12678,12680,12682,12684,12686,12689,12691,12693,12695,12697,12699,12702,12704,12707,12709],{"class":789,"line":1418},[787,12656,1154],{"class":801},[787,12658,12659],{"class":833}," reviewed ",[787,12661,808],{"class":793},[787,12663,686],{"class":793},[787,12665,4025],{"class":1302},[787,12667,1088],{"class":793},[787,12669,883],{"class":1183},[787,12671,7084],{"class":793},[787,12673,883],{"class":1183},[787,12675,1269],{"class":801},[787,12677,686],{"class":833},[787,12679,1082],{"class":793},[787,12681,4124],{"class":793},[787,12683,4025],{"class":833},[787,12685,886],{"class":793},[787,12687,12688],{"class":797}," capabilities",[787,12690,1088],{"class":793},[787,12692,1191],{"class":833},[787,12694,1194],{"class":793},[787,12696,4025],{"class":833},[787,12698,555],{"class":793},[787,12700,12701],{"class":833},"capabilities",[787,12703,886],{"class":793},[787,12705,12706],{"class":833}," review] ",[787,12708,1162],{"class":793},[787,12710,1101],{"class":833},[787,12712,12713],{"class":789,"line":1443},[787,12714,1069],{"emptyLinePlaceholder":1068},[787,12716,12717,12719,12721,12723,12725,12727,12729],{"class":789,"line":1449},[787,12718,1154],{"class":801},[787,12720,830],{"class":793},[787,12722,1159],{"class":833},[787,12724,1162],{"class":793},[787,12726,1165],{"class":793},[787,12728,933],{"class":1075},[787,12730,1170],{"class":833},[787,12732,12733,12735,12737,12739,12741,12743,12745,12747,12749,12751],{"class":789,"line":1474},[787,12734,1154],{"class":801},[787,12736,1423],{"class":833},[787,12738,808],{"class":793},[787,12740,977],{"class":1075},[787,12742,1079],{"class":833},[787,12744,1096],{"class":793},[787,12746,12032],{"class":814},[787,12748,1096],{"class":793},[787,12750,1305],{"class":833},[787,12752,1440],{"class":793},[787,12754,12755],{"class":789,"line":1479},[787,12756,1446],{"class":1112},[787,12758,12759,12761,12763,12765,12767,12769],{"class":789,"line":1485},[787,12760,1154],{"class":801},[787,12762,7833],{"class":833},[787,12764,808],{"class":793},[787,12766,7503],{"class":1075},[787,12768,1079],{"class":833},[787,12770,1255],{"class":793},[787,12772,12773,12776,12778,12780,12782,12784,12786,12788,12790,12792,12794,12796,12798,12800,12802,12804,12806,12808,12810,12812,12815,12818,12820,12823,12825,12827,12829,12831,12833,12836],{"class":789,"line":1558},[787,12774,12775],{"class":797},"  blockTypes",[787,12777,1088],{"class":793},[787,12779,1191],{"class":833},[787,12781,1194],{"class":793},[787,12783,1197],{"class":1075},[787,12785,2332],{"class":833},[787,12787,555],{"class":793},[787,12789,5829],{"class":1075},[787,12791,1079],{"class":833},[787,12793,4025],{"class":1302},[787,12795,1269],{"class":801},[787,12797,880],{"class":833},[787,12799,555],{"class":793},[787,12801,9533],{"class":833},[787,12803,5714],{"class":793},[787,12805,843],{"class":793},[787,12807,735],{"class":814},[787,12809,1096],{"class":793},[787,12811,4014],{"class":793},[787,12813,12814],{"class":1075}," reviewed",[787,12816,12817],{"class":833},"(type) ",[787,12819,1088],{"class":793},[787,12821,12822],{"class":833}," type)",[787,12824,886],{"class":793},[787,12826,4124],{"class":793},[787,12828,12045],{"class":833},[787,12830,555],{"class":793},[787,12832,5829],{"class":1075},[787,12834,12835],{"class":833},"(reviewed)]",[787,12837,1289],{"class":793},[787,12839,12840,12843,12845,12847,12850,12853],{"class":789,"line":1595},[787,12841,12842],{"class":797},"  add",[787,12844,1088],{"class":793},[787,12846,1191],{"class":833},[787,12848,12849],{"class":1075},"epikriseFeature",[787,12851,12852],{"class":833},"()]",[787,12854,1289],{"class":793},[787,12856,12857],{"class":789,"line":1601},[787,12858,12859],{"class":1112},"  \u002F\u002F `pruefung` is a catalog feature in no interaction level list: added on top of the bundle's `full` interaction.\n",[787,12861,12862,12865,12867,12869,12871,12873,12875,12877],{"class":789,"line":1672},[787,12863,12864],{"class":797},"  with",[787,12866,1088],{"class":793},[787,12868,1191],{"class":833},[787,12870,1096],{"class":793},[787,12872,12091],{"class":814},[787,12874,1096],{"class":793},[787,12876,4134],{"class":833},[787,12878,1289],{"class":793},[787,12880,12881,12883],{"class":789,"line":1728},[787,12882,1162],{"class":793},[787,12884,1101],{"class":833},[787,12886,12887,12889,12891,12893,12895,12897,12899,12901,12903],{"class":789,"line":1780},[787,12888,1154],{"class":801},[787,12890,1454],{"class":833},[787,12892,808],{"class":793},[787,12894,998],{"class":1075},[787,12896,1461],{"class":833},[787,12898,555],{"class":793},[787,12900,1466],{"class":833},[787,12902,886],{"class":793},[787,12904,12905],{"class":833}," SAMPLES_EPIKRISE)\n",[787,12907,12908,12910,12912],{"class":789,"line":1825},[787,12909,1828],{"class":793},[787,12911,798],{"class":797},[787,12913,820],{"class":793},[676,12915,12917],{"id":12916},"beyond-the-kitchen-sink","Beyond the kitchen sink",[418,12919,12920],{},"The kitchen sink keeps every page standalone, so some features are shown elsewhere in the app or only in their guide:",[439,12922,12923,12933],{},[442,12924,12925],{},[445,12926,12927,12930],{},[448,12928,12929],{},"Feature",[448,12931,12932],{},"Where to see it",[455,12934,12935,12957,12973,12997,13020,13035,13062,13076,13085],{},[445,12936,12937,12944],{},[460,12938,12939,12940,12943],{},"Collaboration (",[422,12941,12942],{},"collaboration"," prop, Hocuspocus session)",[460,12945,12946,470,12954],{},[466,12947,12951],{"href":12948,"rel":12949},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fpages\u002Fdocuments\u002F%5Bid%5D.vue",[12950],"nofollow",[422,12952,12953],{},"app\u002Fpages\u002Fdocuments\u002F[id].vue",[466,12955,12956],{"href":309},"Collaboration",[445,12958,12959,12968],{},[460,12960,12961,12962,470,12965,1305],{},"Comments and authors (",[422,12963,12964],{},"CommentsMargin",[422,12966,12967],{},"v-model:comments-open",[460,12969,12970,12971],{},"the same document page, ",[466,12972,99],{"href":100},[445,12974,12975,12986],{},[460,12976,12977,12978,470,12980,470,12983,1305],{},"Explore and search (",[422,12979,11580],{},[422,12981,12982],{},"ExplorePanel",[422,12984,12985],{},"SearchPanel",[460,12987,12988,470,12995],{},[466,12989,12992],{"href":12990,"rel":12991},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Flayouts\u002Fdefault.vue",[12950],[422,12993,12994],{},"app\u002Flayouts\u002Fdefault.vue",[466,12996,11584],{"href":211},[445,12998,12999,13008],{},[460,13000,13001,13002,470,13005,1305],{},"Templates (",[422,13003,13004],{},"templatesOf",[422,13006,13007],{},"TEMPLATES_FOLDER",[460,13009,13010,470,13017],{},[466,13011,13014],{"href":13012,"rel":13013},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fpages\u002Fdocuments\u002Findex.vue",[12950],[422,13015,13016],{},"app\u002Fpages\u002Fdocuments\u002Findex.vue",[466,13018,13019],{"href":225},"Templates",[445,13021,13022,13029],{},[460,13023,13024,13025,13028],{},"Themes (",[422,13026,13027],{},"appearance.theme",", the Theme tab)",[460,13030,13031,13032],{},"the settings popup of any page, ",[466,13033,13034],{"href":105},"Themes",[445,13036,13037,13046],{},[460,13038,13039,13040,13043,13044,1305],{},"The editor-owned settings modal (",[422,13041,13042],{},"settings-ui=\"internal\"",", the default; the kitchen sink places its settings itself with ",[422,13045,565],{},[460,13047,13048,13049,13051,13052,470,13055,470,13057,13059,13060],{},"the document page, ",[466,13050,700],{"href":318},"; the settings object itself (",[422,13053,13054],{},"useEditorSettings",[422,13056,5169],{},[422,13058,5165],{},") has its own page, ",[466,13061,486],{"href":485},[445,13063,13064,13071],{},[460,13065,13066,13067,13070],{},"UI kit (",[422,13068,13069],{},"createEditor({ kit })",") and the module options",[460,13072,13073],{},[466,13074,13075],{"href":141},"Nuxt module",[445,13077,13078,13081],{},[460,13079,13080],{},"Export check",[460,13082,13083],{},[466,13084,13080],{"href":235},[445,13086,13087,13090],{},[460,13088,13089],{},"Obsidian vaults, image studio, graph, Typst",[460,13091,13092,470,13095,470,13097,470,13099],{},[466,13093,13094],{"href":268},"Obsidian",[466,13096,180],{"href":181},[466,13098,11590],{"href":258},[466,13100,13101],{"href":273},"Typst",[676,13103,13105],{"id":13104},"the-rest-of-the-app","The rest of the app",[418,13107,13108,13109,470,13111,594,13113,686,13116,13119,13120,13122,13123,13125,13126,13128,13129,13132,13133,555],{},"The repository's Nuxt app is the runnable advanced reference: documents with real-time collaboration, the file drawer, AI, and the kitchen sink above. It has no login: a visitor acts as one of the demo users ",[422,13110,6831],{},[422,13112,6859],{},[422,13114,13115],{},"bernd",[422,13117,13118],{},"shared\u002Futils\u002Fdemo-users.ts","), starts as ",[422,13121,6831],{}," and switches in the user menu top right („Benutzer wechseln“, which reloads the page under the new user). Start it with ",[422,13124,424],{}," (port 3056); it needs ",[422,13127,428],{}," (at least 32 characters, for the ",[422,13130,13131],{},"nuxt-auth-utils"," session cookie) and, for AI, the API key variables below in ",[422,13134,432],{},[418,13136,13137],{},[559,13138,13139],{},"Walkthrough",[13141,13142,13143,13165,13179,13189,13199],"ol",{},[705,13144,13145,13146,13149,13150,13152,13153,13156,13157,13160,13161,13164],{},"Open ",[422,13147,13148],{},"http:\u002F\u002Flocalhost:3056\u002F","; you are ",[422,13151,6831],{}," and land on ",[422,13154,13155],{},"\u002Fdocuments",", the app's home: the file drawer on the left lists the documents and the folders, the main area reads „Kein Dokument ausgewählt“. A fresh store (no ",[422,13158,13159],{},".data\u002Fdocuments"," yet, or ",[422,13162,13163],{},"NUXT_DOCUMENTS_DIR"," pointing at a missing directory) starts with the folder „Blocktypen“: an overview and one document per set of block types (text blocks, inline elements and links, media and transcript, sections\u002Ftasks\u002Fnotes, sources, collections\u002Fviews\u002Ffolders, the host's own Prüfabschnitt), each explaining its blocks on a working example. They are ordinary documents; to get them back, stop the server and remove the store directory.",[705,13166,13167,13168,13171,13172,13174,13175,13178],{},"Press „Neues Dokument“ (in the main area, or „Hinzufügen“ → „Neues Dokument“ on a drawer row) to create a document; the app opens ",[422,13169,13170],{},"\u002Fdocuments\u002F\u003Cid>"," and the new document appears in the drawer. The drawer sorts the documents of a folder by title, numbers by value, and the folders by name; editing a document does not move it. In the drawer you can also create folders, drag documents and folders between folders, rename, filter and delete with undo (",[466,13173,117],{"href":118},"); each document row has an export button that downloads a ",[422,13176,13177],{},".cdoc"," package.",[705,13180,13181,13182,13184,13185,13188],{},"Type. Use the toolbar, the ",[422,13183,601],{}," menu, the drag handles and the hover block actions; the AI sidebar (the toolbar's AI button or ",[422,13186,13187],{},"Mod-Shift-k",") and the settings cog in the header open their host-placed UI.",[705,13190,13191,13192,13194,13195,13198],{},"Open the same URL in a second browser tab, or as another user in a second browser (or a private window) where you switch to ",[422,13193,6859],{}," in the user menu; the session cookie is per browser, so tabs of one browser share the user. Text and carets appear in both within a moment and the header badge reads „Synchronisiert“; each tab keeps its own undo history. Text carries its author (switch the colouring on with the toolbar's palette button), and a selection can be commented („Kommentar“, ",[422,13196,13197],{},"Mod-Shift-m"," for the margin) with replies, resolve and reopen visible to both.",[705,13200,13201,13202,13205,13206,13209],{},"Optional: press „Kitchen sink“ at the top of the drawer (",[422,13203,13204],{},"\u002Fkitchen-sink",") for the gallery of the fifteen pages above, in three tracks: Basics, Building blocks, Use cases. The layout has no document tree: a navigation on the left lists the pages by track, a link back to „Dokumente“ and the standalone examples (",[422,13207,13208],{},"examples\u002F*",", each its own dev server). Open the settings popup and pick the Theme tab („Theme“) to try the Themes: the whole app, header and navigation included, switches look.",[418,13211,13212,13215,13216,13218,13219,13222,13223,13226,13227,13230,13231,13234,13235,13238,13239,13242,13243,13246],{},[559,13213,13214],{},"Optional AI configuration."," The editor works without AI credentials; AI requests then fail with the server's message. Keys come from the environment only (see ",[466,13217,292],{"href":293},"): ",[422,13220,13221],{},"NUXT_TIPTAP_EDITOR_AI_API_KEY"," (shared fallback for every Model preset), ",[422,13224,13225],{},"NUXT_TIPTAP_EDITOR_AI_PRESETS_\u003CID>_API_KEY"," (one Model preset; ",[422,13228,13229],{},"flashLite"," → ",[422,13232,13233],{},"NUXT_TIPTAP_EDITOR_AI_PRESETS_FLASH_LITE_API_KEY",") and ",[422,13236,13237],{},"NUXT_TIPTAP_EDITOR_AI_TRANSCRIPTION_API_KEY"," (a Deepgram key; the host enables ",[422,13240,13241],{},"ai.transcription"," with Deepgram ",[422,13244,13245],{},"nova-3"," only when it is set, which makes “Create readable rendition” (English label) available on recordings).",[676,13248,13250],{"id":13249},"where-each-part-lives","Where each part lives",[439,13252,13253,13263],{},[442,13254,13255],{},[445,13256,13257,13260],{},[448,13258,13259],{},"Part",[448,13261,13262],{},"File",[455,13264,13265,13312,13379,13393,13415,13429,13460,13534,13550,13563,13577,13614,13633,13650,13668,13710,13753],{},[445,13266,13267,13305],{},[460,13268,13269,13270,13272,13273,13276,13277,13280,13281,13284,13285,13288,13289,13291,13292,13294,13295,13297,13298,1305],{},"Collaborative page: ",[422,13271,6288],{}," with a ",[422,13274,13275],{},"HocuspocusProvider"," session, toolbar and ",[422,13278,13279],{},"AiSidebar"," placed by the page, editor-owned settings modal (",[422,13282,13283],{},"settingsUi"," default ",[422,13286,13287],{},"'internal'","), a „Text | Tabelle“ switch to ",[422,13290,1985],{}," (a row returns to the text and reveals its Typed block) and a docked ",[422,13293,1981],{}," with the page's own Document facts in its ",[422,13296,1521],{}," slot (",[466,13299,13302],{"href":13300,"rel":13301},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002FDocumentProperties.vue",[12950],[422,13303,13304],{},"DocumentProperties.vue",[460,13306,13307],{},[466,13308,13310],{"href":12948,"rel":13309},[12950],[422,13311,12953],{},[445,13313,13314,13320],{},[460,13315,13316,13317,13319],{},"The fifteen pages: one Vue file each with its own editor, ",[422,13318,659],{}," content, panel and the source its „How it's built“ drawer shows",[460,13321,13322,13329,13330,470,13333,470,13336,470,13339,470,13342,470,13345,470,13348,470,13351,470,13354,470,13357,470,13360,470,13363,470,13366,470,13369,470,13372,3207,13375,13378],{},[466,13323,13326],{"href":13324,"rel":13325},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Ftree\u002Fmain\u002Fapp\u002Fpages\u002Fkitchen-sink",[12950],[422,13327,13328],{},"app\u002Fpages\u002Fkitchen-sink\u002F",": ",[422,13331,13332],{},"structure.vue",[422,13334,13335],{},"blocks.vue",[422,13337,13338],{},"json-markdown.vue",[422,13340,13341],{},"actions.vue",[422,13343,13344],{},"settings.vue",[422,13346,13347],{},"simple.vue",[422,13349,13350],{},"advanced.vue",[422,13352,13353],{},"surface.vue",[422,13355,13356],{},"minutes.vue",[422,13358,13359],{},"slides.vue",[422,13361,13362],{},"databases.vue",[422,13364,13365],{},"science.vue",[422,13367,13368],{},"podcast.vue",[422,13370,13371],{},"pkm.vue",[422,13373,13374],{},"epikrise.vue",[422,13376,13377],{},"index.vue"," is the gallery",[445,13380,13381,13384],{},[460,13382,13383],{},"Page registry: slug, track, title, tagline, icon, accent, lessons and docs anchor of every page, read by the gallery, the layout's navigation and each page",[460,13385,13386],{},[466,13387,13390],{"href":13388,"rel":13389},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Feditor\u002Fkitchen-sink\u002Fpages.ts",[12950],[422,13391,13392],{},"app\u002Feditor\u002Fkitchen-sink\u002Fpages.ts",[445,13394,13395,13406],{},[460,13396,13397,13398,470,13400,594,13402,13405],{},"Shared page shell: header (sample select, toolbar, switches, settings, AI), the ",[422,13399,774],{},[422,13401,3179],{},[422,13403,13404],{},"sidebar"," slots, the settings popup and the „How it's built“ drawer",[460,13407,13408],{},[466,13409,13412],{"href":13410,"rel":13411},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue",[12950],[422,13413,13414],{},"app\u002Fcomponents\u002Fkitchen-sink\u002FKitchenSinkPage.vue",[445,13416,13417,13420],{},[460,13418,13419],{},"Card for a capability that needs a server port or add-on flag this run lacks",[460,13421,13422],{},[466,13423,13426],{"href":13424,"rel":13425},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002Fkitchen-sink\u002FServerHint.vue",[12950],[422,13427,13428],{},"app\u002Fcomponents\u002Fkitchen-sink\u002FServerHint.vue",[445,13430,13431,13452],{},[460,13432,13433,13434,470,13437,470,13439,470,13442,13445,13446,470,13449,1305],{},"Pane state (",[422,13435,13436],{},"createPane",[422,13438,663],{},[422,13440,13441],{},"showSettings",[422,13443,13444],{},"refreshMarkdown",") and the editor callbacks the pages share (",[422,13447,13448],{},"paneReady",[422,13450,13451],{},"paneUpdated",[460,13453,13454],{},[466,13455,13458],{"href":13456,"rel":13457},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Feditor\u002Fkitchen-sink\u002Fpane.ts",[12950],[422,13459,667],{},[445,13461,13462,13478],{},[460,13463,13464,13465,470,13468,470,13471,470,13474,13477],{},"Demo documents, one file per page, with the builders they share (",[422,13466,13467],{},"typed",[422,13469,13470],{},"heading",[422,13472,13473],{},"bullets",[422,13475,13476],{},"withId"," for fixed block ids, …) and the Markdown for „Insert Markdown“ and „Load Markdown“",[460,13479,13480,13329,13487,13490,13491,594,13493,13496,13497,13500,13501,13504,13505,13508,13509,13512,13513,13519,13520,594,13527],{},[466,13481,13484],{"href":13482,"rel":13483},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Ftree\u002Fmain\u002Fapp\u002Feditor\u002Fkitchen-sink\u002Fsamples",[12950],[422,13485,13486],{},"app\u002Feditor\u002Fkitchen-sink\u002Fsamples\u002F",[422,13488,13489],{},"helpers.ts"," (with ",[422,13492,10314],{},[422,13494,13495],{},"codeBlock"," for the block tour) and ",[422,13498,13499],{},"\u003Cslug>.ts",", among them ",[422,13502,13503],{},"structure.ts"," (one brief, flat and structured), ",[422,13506,13507],{},"blocks.ts"," (the block tour) and ",[422,13510,13511],{},"json-markdown.ts"," (a release note as JSON and as Markdown, a lossy and an invalid document); the round-trip comparison of the JSON & Markdown page is ",[466,13514,13517],{"href":13515,"rel":13516},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Feditor\u002Fkitchen-sink\u002Fround-trip.ts",[12950],[422,13518,2482],{},"; assets ",[466,13521,13524],{"href":13522,"rel":13523},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fpublic\u002Fdemo\u002Fdiagramm.svg",[12950],[422,13525,13526],{},"public\u002Fdemo\u002Fdiagramm.svg",[466,13528,13531],{"href":13529,"rel":13530},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fpublic\u002Fdemo\u002Fprotokoll.txt",[12950],[422,13532,13533],{},"protokoll.txt",[445,13535,13536,13542],{},[460,13537,13538,13539,13541],{},"The host's ",[422,13540,1971],{}," Block type, used by Content blocks, Minutes and Advanced",[460,13543,13544],{},[466,13545,13548],{"href":13546,"rel":13547},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Feditor\u002Fkitchen-sink\u002Fdecision.ts",[12950],[422,13549,1951],{},[445,13551,13552,13555],{},[460,13553,13554],{},"Layout of the kitchen sink: navigation built from the registry, back to „Dokumente“, links to the standalone examples, and the English copy of the editor context",[460,13556,13557],{},[466,13558,13561],{"href":13559,"rel":13560},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Flayouts\u002Fkitchen-sink.vue",[12950],[422,13562,589],{},[445,13564,13565,13568],{},[460,13566,13567],{},"Accent colours, gallery and page-enter animations",[460,13569,13570],{},[466,13571,13574],{"href":13572,"rel":13573},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fassets\u002Fcss\u002Fkitchen-sink.css",[12950],[422,13575,13576],{},"app\u002Fassets\u002Fcss\u002Fkitchen-sink.css",[445,13578,13579,13588],{},[460,13580,13581,13582,13584,13585],{},"The own block as a feature: node, node view, styles, feature (toolbar, ",[422,13583,601],{},", hover menu, conversion) and conversion provider; walked through in the ",[466,13586,13587],{"href":66},"tutorial",[460,13589,13590,13329,13596,470,13599,470,13602,470,13605,470,13608,470,13611],{},[466,13591,13594],{"href":13592,"rel":13593},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Ftree\u002Fmain\u002Fapp\u002Feditor\u002Fcallout",[12950],[422,13595,7430],{},[422,13597,13598],{},"node.ts",[422,13600,13601],{},"CalloutView.vue",[422,13603,13604],{},"index.ts",[422,13606,13607],{},"callout.css",[422,13609,13610],{},"feature.ts",[422,13612,13613],{},"convert.ts",[445,13615,13616,13619],{},[460,13617,13618],{},"The Epikrise domain: Block types as data (properties, AI brief) and the host feature that supplies example paragraphs",[460,13620,13621,470,13627],{},[466,13622,13625],{"href":13623,"rel":13624},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Feditor\u002Fepikrise\u002Fkinds.ts",[12950],[422,13626,12048],{},[466,13628,13631],{"href":13629,"rel":13630},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Feditor\u002Fepikrise\u002Ffeature.ts",[12950],[422,13632,13610],{},[445,13634,13635,13641],{},[460,13636,13637,13638,1305],{},"Module registration (",[422,13639,13640],{},"@skaile\u002Fforge-editor\u002Fnuxt",[460,13642,13643],{},[466,13644,13647],{"href":13645,"rel":13646},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fnuxt.config.ts",[12950],[422,13648,13649],{},"nuxt.config.ts",[445,13651,13652,13659],{},[460,13653,13654,13655,13658],{},"Ports plugin: ",[422,13656,13657],{},"provideEditorServer"," with sessions, document store, Yjs state, assets and per-user settings",[460,13660,13661],{},[466,13662,13665],{"href":13663,"rel":13664},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Fplugins\u002Feditor-adapter.ts",[12950],[422,13666,13667],{},"server\u002Fplugins\u002Feditor-adapter.ts",[445,13669,13670,13673],{},[460,13671,13672],{},"Store adapter: documents, Yjs state, assets, settings, users on the file system",[460,13674,13675,470,13682,470,13689,470,13696,470,13703],{},[466,13676,13679],{"href":13677,"rel":13678},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fdocuments.ts",[12950],[422,13680,13681],{},"server\u002Futils\u002Fdocuments.ts",[466,13683,13686],{"href":13684,"rel":13685},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fstate.ts",[12950],[422,13687,13688],{},"state.ts",[466,13690,13693],{"href":13691,"rel":13692},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fassets.ts",[12950],[422,13694,13695],{},"assets.ts",[466,13697,13700],{"href":13698,"rel":13699},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fsettings.ts",[12950],[422,13701,13702],{},"settings.ts",[466,13704,13707],{"href":13705,"rel":13706},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fusers.ts",[12950],[422,13708,13709],{},"users.ts",[445,13711,13712,13718],{},[460,13713,13714,13715],{},"Showcase seeded into a fresh store: fixed document and block ids (so the documents can reference, embed and collect each other), one module per document, and the seeding step of ",[422,13716,13717],{},"ensureStore",[460,13719,13720,686,13727,470,13730,470,13733,13735,13736,13738,13739,470,13746],{},[466,13721,13724],{"href":13722,"rel":13723},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Ftree\u002Fmain\u002Fshared\u002Fshowcase",[12950],[422,13725,13726],{},"shared\u002Fshowcase\u002F",[422,13728,13729],{},"ids.ts",[422,13731,13732],{},"build.ts",[422,13734,13604],{},", one ",[422,13737,13499],{}," per document), ",[466,13740,13743],{"href":13741,"rel":13742},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fshowcase.ts",[12950],[422,13744,13745],{},"server\u002Futils\u002Fshowcase.ts",[466,13747,13750],{"href":13748,"rel":13749},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fstore-root.ts",[12950],[422,13751,13752],{},"server\u002Futils\u002Fstore-root.ts",[445,13754,13755,13770],{},[460,13756,13757,13758,13761,13762,13765,13766,13769],{},"File drawer: ",[422,13759,13760],{},"DocumentTree"," over the host's ",[422,13763,13764],{},"DocumentStore"," (routes, ",[422,13767,13768],{},"$fetch",", toasts, delete-with-undo), selected folder held by the layout",[460,13771,13772,470,13777,470,13784,8079,13791,13793,13794,13797],{},[466,13773,13775],{"href":12990,"rel":13774},[12950],[422,13776,12994],{},[466,13778,13781],{"href":13779,"rel":13780},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002FAppDocumentTree.vue",[12950],[422,13782,13783],{},"app\u002Fcomponents\u002FAppDocumentTree.vue",[466,13785,13788],{"href":13786,"rel":13787},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Fblob\u002Fmain\u002Fapp\u002Fcomposables\u002FuseDocumentStore.ts",[12950],[422,13789,13790],{},"app\u002Fcomposables\u002FuseDocumentStore.ts",[422,13792,13177],{}," export button comes in through the ",[422,13795,13796],{},"document-actions"," slot; the format stays in the host)",[418,13799,13800,13801,594,13803,2455,13806,470,13808,2455,13810,470,13812,470,13815,470,13818,470,13820,470,13822,470,13825,470,13828,594,13830,2455,13832,13834,13835,13837,13838,2455,13840,470,13842,13844,13845,601,13848,13850,13851,470,13853,594,13855,2455,13858,470,13860,2455,13862,470,13864,2455,13866,470,13869,601,13871,2455,13873,470,13875,2455,13877,470,13879,2455,13881,470,13883,2455,13885,8079,13888,13890,13891,13894,13895,594,13897,13899,13900,470,13903,13906,13907,13909,13910,686,13917,609],{},"The pages and their components import only public entries: ",[422,13802,6288],{},[422,13804,13805],{},"advancedEditor",[422,13807,846],{},[422,13809,5944],{},[422,13811,6016],{},[422,13813,13814],{},"EditorToolbar",[422,13816,13817],{},"EditorSettingsModal",[422,13819,5165],{},[422,13821,7402],{},[422,13823,13824],{},"useEditorUi",[422,13826,13827],{},"useEditorContext",[422,13829,13054],{},[422,13831,7852],{},[422,13833,947],{},", the ",[422,13836,1247],{}," type and ",[422,13839,5169],{},[422,13841,921],{},[422,13843,8016],{}," and the ",[422,13846,13847],{},"BlockAction",[422,13849,3856],{}," types from ",[422,13852,2458],{},[422,13854,7452],{},[422,13856,13857],{},"ABILITY",[422,13859,3428],{},[422,13861,13279],{},[422,13863,6036],{},[422,13865,12964],{},[422,13867,13868],{},"@skaile\u002Fforge-editor\u002Fcomments\u002Fvue",[422,13870,1985],{},[422,13872,1981],{},[422,13874,2097],{},[422,13876,1197],{},[422,13878,898],{},[422,13880,8124],{},[422,13882,8271],{},[422,13884,13760],{},[422,13886,13887],{},"@skaile\u002Fforge-editor\u002Ftree\u002Fvue",[422,13889,13764],{}," type from ",[422,13892,13893],{},"@skaile\u002Fforge-editor\u002Ftree",") and the add-ons' ",[422,13896,9621],{},[422,13898,9624],{}," entries. The callout files add ",[422,13901,13902],{},"command",[422,13904,13905],{},"ConversionProvider"," and the conversion helpers from ",[422,13908,2458],{},". The app-level editor context (settings sync, fetch, public AI configuration) comes from the Nuxt module, no per-page setup. The React counterpart of the document page is ",[466,13911,13914],{"href":13912,"rel":13913},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Ftree\u002Fmain\u002Fexamples\u002Freact-advanced",[12950],[422,13915,13916],{},"examples\u002Freact-advanced",[466,13918,127],{"href":128},[676,13920,13922],{"id":13921},"runnable-examples","Runnable examples",[702,13924,13925,13967,14003,14074],{},[705,13926,13927,1978,13930,13937,13938,13940,13941,13943,13944,13947,13948,594,13951,13953,13954,470,13957,13960,13961,13963,13964,13966],{},[559,13928,13929],{},"Plain Vue, no backend:",[466,13931,13934],{"href":13932,"rel":13933},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Ftree\u002Fmain\u002Fexamples\u002Fvue-simple",[12950],[422,13935,13936],{},"examples\u002Fvue-simple"," — ",[422,13939,5944],{}," with a sibling toolbar and heading outline, JSON ",[422,13942,659],{},", read-only toggle, external replacement, host ",[422,13945,13946],{},"\u002Fdatum"," command and an own block, the „Hinweis“ callout, added through the ",[422,13949,13950],{},"extensions",[422,13952,6329],{}," props (",[422,13955,13956],{},"\u002Fhinweis",[422,13958,13959],{},"Mod-Shift-h",", tone select, ",[422,13962,7465],{}," Markdown form). A sample picker loads five demo documents (Start, Formatierung, Gliederung, Hinweise, and „Ungültig (Block-JSON)“, which the simple schema rejects through ",[422,13965,2492],{},"); next to the editor the JSON (with block IDs) and the Markdown of the document are shown.",[705,13968,13969,1978,13972,13979,13980,13982,13983,13985,13986,13989,13990,13992,13993,13995,13996,13998,13999,14002],{},[559,13970,13971],{},"Plain React, no backend:",[466,13973,13976],{"href":13974,"rel":13975},"https:\u002F\u002Fgithub.com\u002Fskaile-ai\u002Fforge-editor\u002Ftree\u002Fmain\u002Fexamples\u002Freact-simple",[12950],[422,13977,13978],{},"examples\u002Freact-simple"," — the same document picker, read-only toggle and JSON\u002FMarkdown panes with the React layer: ",[422,13981,13814],{}," beside ",[422,13984,7402],{}," over ",[422,13987,13988],{},"defineEditor({ features: [coreContentFeature(), coreUiFeature(), mentionsFeature()] })",", the host ",[422,13991,601],{}," commands, ",[422,13994,8074],{}," mentions from ",[422,13997,6362],{},", and rejected content through ",[422,14000,14001],{},"onContentError",". Vite, Tailwind 4 and shadcn tokens, no Nuxt UI.",[705,14004,14005,14008,14009,14011,14012,14015,14016,14019,14020,14022,14023,14025,14026,686,14028,470,14030,14032,14033,470,14035,14037,14038,14040,14041,14043,14044,14046,14047,14049,14050,14053,14054,14057,14058,14061,14062,14064,14065,14068,14069,14071,14072,555],{},[559,14006,14007],{},"Advanced, Nuxt:"," this repository's application (",[422,14010,424],{},", port 3056) — collaborative documents under switchable demo users (no login: ",[422,14013,14014],{},"server\u002Fmiddleware\u002Fdemo-session.ts"," signs every API request into a demo user, ",[422,14017,14018],{},"server\u002Fapi\u002Fauth\u002Fswitch.post.ts"," switches it; ",[422,14021,12953],{},"), the file drawer with ",[422,14024,13760],{}," and a host ",[422,14027,13764],{},[422,14029,13783],{},[422,14031,13790],{},"), and the kitchen sink: fifteen standalone pages under their own layout without the document tree (",[422,14034,13204],{},[422,14036,13328],{},"), in three tracks: Basics (Flat and Structure mode, content blocks, JSON and Markdown, block actions, editor settings), Building blocks (",[422,14039,5944],{}," with AI, ",[422,14042,6288],{}," host props, ",[422,14045,7402],{}," with the callout feature in ",[422,14048,7430],{},") and Use cases (minutes, slides, databases and charts, scientific writing, podcast, knowledge base, Epikrise review), all on the shared ",[422,14051,14052],{},"KitchenSinkPage"," shell. Each kitchen-sink page shows its own builtin Obsidian theme (",[422,14055,14056],{},"theme"," of its registry entry, pinned by the layout with ",[422,14059,14060],{},"pinObsidianTheme","; see ",[466,14063,13034],{"href":105},"). Everywhere else the Theme settings tab („Theme“) switches the whole site between the Default appearance („Standard“) and the fifteen builtin Obsidian themes (",[422,14066,14067],{},"server\u002Fthemes\u002F",": Nord, Things, Minimal, Catppuccin, Border, Blue Topaz, Tokyo Night, Flexoki, Cupertino, Prism, iA Writer, Shimmering Focus, Gruvbox, Rosé Pine, Solarized) or an uploaded one, served by the adapter in ",[422,14070,13667],{},". Walkthrough: see above. How to add a block of your own: the ",[466,14073,13587],{"href":66},[705,14075,14076,1978,14079,686,14084,14087,14088,594,14091,14094,14095,14098,14099,13985,14101,14103,14104,470,14106,470,14108,470,14110,601,14112,470,14114,470,14116,470,14118,14120,14121,14123,14124,3261,14126,14129],{},[559,14077,14078],{},"Advanced, React:",[466,14080,14082],{"href":13912,"rel":14081},[12950],[422,14083,13916],{},[422,14085,14086],{},"bun run --cwd examples\u002Freact-advanced dev",", port 3043; needs the Nuxt app running, Vite proxies ",[422,14089,14090],{},"\u002Fapi",[422,14092,14093],{},"\u002Fcollab"," to it) — the React counterpart of the Nuxt document page: a document picker over the editor's ",[422,14096,14097],{},"\u002Fapi\u002Feditor\u002Fdocuments",", a collaborative ",[422,14100,6288],{},[422,14102,13275],{}," as the demo session's user, ",[422,14105,13814],{},[422,14107,13817],{},[422,14109,12964],{},[422,14111,1985],{},[422,14113,1981],{},[422,14115,8124],{},[422,14117,13279],{},[422,14119,13760],{}," over an ",[422,14122,14090],{}," adapter of ",[422,14125,13764],{},[422,14127,14128],{},"Toaster",". Vite, Tailwind 4 and shadcn tokens, no Nuxt UI, no Vue.",[14131,14132,14133],"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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":783,"searchDepth":823,"depth":823,"links":14135},[14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154],{"id":678,"depth":823,"text":679},{"id":1282,"depth":823,"text":1835},{"id":2399,"depth":823,"text":2400},{"id":3179,"depth":823,"text":3180},{"id":5138,"depth":823,"text":700},{"id":5932,"depth":823,"text":497},{"id":6283,"depth":823,"text":501},{"id":7397,"depth":823,"text":505},{"id":8053,"depth":823,"text":516},{"id":8769,"depth":823,"text":520},{"id":9555,"depth":823,"text":524},{"id":10257,"depth":823,"text":528},{"id":10931,"depth":823,"text":532},{"id":11530,"depth":823,"text":536},{"id":12032,"depth":823,"text":540},{"id":12916,"depth":823,"text":12917},{"id":13104,"depth":823,"text":13105},{"id":13249,"depth":823,"text":13250},{"id":13921,"depth":823,"text":13922},"Fifteen pages, basics first: structure, content blocks, JSON and Markdown, block actions and settings, then the building blocks, then the use cases, each with the code that builds it","md",null,{},{"icon":6},{"title":131,"description":14155},"a7kvultpVdDFGdgwADTcCRAu-Irr1arvt3vnsAbh5Y8",[14163,14165],{"title":127,"path":128,"stem":129,"description":14164,"icon":83,"children":-1},"Mount the collaborative AdvancedEditor on React with the chrome components beside it, over the same backend as the Vue surface.",{"title":135,"path":136,"stem":137,"description":14166,"icon":138,"children":-1},"Build and run a Nuxt host with the editor module: runtime secrets, persistent storage and shutdown behaviour.",1793213902595]