[{"data":1,"prerenderedAt":1650},["ShallowReactive",2],{"navigation_docs":3,"-guides-slides":412,"-guides-slides-surround":1645},[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":282,"body":414,"description":1638,"extension":1639,"links":1640,"meta":1641,"navigation":1642,"path":283,"seo":1643,"stem":284,"__hash__":1644},"docs\u002F3.guides\u002F47.slides.md",{"type":415,"value":416,"toc":1629},"minimark",[417,459,576,583,588,951,1082,1089,1093,1197,1206,1210,1242,1311,1318,1322,1331,1425,1434,1438,1452,1465,1518,1537,1555,1559,1572,1599,1605,1609,1625],[418,419,420,421,425,426,430,431,433,434,437,438,441,442,446,447,450,451,454,455,458],"p",{},"The add-on ",[422,423,424],"code",{},"@skaile\u002Fforge-editor-slides"," adds presentations to the editor. A ",[427,428,429],"strong",{},"deck"," is a Typed block of the Block type ",[422,432,429],{},". Its body is ",[427,435,436],{},"slides",", Typed blocks of the Block type ",[422,439,440],{},"slide",". A slide has a title, a description (the subtitle of a title slide), a body, and three ",[443,444,445],"a",{"href":176},"Block properties",": ",[422,448,449],{},"layout",", ",[422,452,453],{},"notes"," and ",[422,456,457],{},"status",".",[460,461,462,478],"table",{},[463,464,465],"thead",{},[466,467,468,472,475],"tr",{},[469,470,471],"th",{},"Piece",[469,473,474],{},"What it does",[469,476,477],{},"Where",[479,480,481,503,519,545,564],"tbody",{},[466,482,483,489,500],{},[484,485,486],"td",{},[422,487,488],{},"slideBlockTypes(locale)",[484,490,491,492,494,495,497,498],{},"the Block types ",[422,493,429],{}," (a container that accepts ",[422,496,440],{},") and ",[422,499,440],{},[484,501,502],{},"editor and server",[466,504,505,513,516],{},[484,506,507,450,510],{},[422,508,509],{},"renderSlide",[422,511,512],{},"renderDeck",[484,514,515],{},"pure HTML and CSS of a slide or a deck",[484,517,518],{},"anywhere",[466,520,521,526,542],{},[484,522,523],{},[422,524,525],{},"slidesTargets()",[484,527,528,529,532,533,450,536,450,539],{},"the ",[443,530,531],{"href":215},"render targets"," ",[422,534,535],{},"reveal-html",[422,537,538],{},"pptx",[422,540,541],{},"marp-md",[484,543,544],{},"server",[466,546,547,552,561],{},[484,548,549],{},[422,550,551],{},"slidesTransforms()",[484,553,554,555,454,558],{},"the transfer transforms ",[422,556,557],{},"slides-from-blocks",[422,559,560],{},"slides-from-blocks-ai",[484,562,563],{},"editor",[466,565,566,571,574],{},[484,567,568],{},[422,569,570],{},"slidesFeature()",[484,572,573],{},"the block actions „Folien-Layout“ and „Folie anhängen“, the slide preview in the inspector",[484,575,563],{},[418,577,578,579,582],{},"The add-on imports the library through its public entries only. The entry ",[422,580,581],{},"@skaile\u002Fforge-editor-slides\u002Fserver"," reaches no editor code: use it in a server program.",[584,585,587],"h2",{"id":586},"install-and-wire","Install and wire",[589,590,595],"pre",{"className":591,"code":592,"language":593,"meta":594,"style":594},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defaultBlockTypes } from '@skaile\u002Fforge-editor\u002Fcomposites'\nimport { copyTransform } from '@skaile\u002Fforge-editor\u002Ftransfer'\nimport { bulletsTransform, summaryTransform } from '@skaile\u002Fforge-editor\u002Fintegrations\u002Fcomposite-ai'\nimport { slideBlockTypes, slidesTransforms } from '@skaile\u002Fforge-editor-slides'\nimport { slidesFeature } from '@skaile\u002Fforge-editor-slides\u002Fvue' \u002F\u002F or '\u002Freact'\n\nconst editor = composeEditor({\n  content: 'rich',\n  interaction: [...INTERACTION.full, 'transfer'],\n  \u002F\u002F The Block types of the editor: the built-in ones and the two of this add-on.\n  blockTypes: [...defaultBlockTypes(t), ...slideBlockTypes('de')],\n  add: [slidesFeature()],\n  \u002F\u002F A `transfer.transforms` list replaces the default list, so name the built-in transforms too.\n  transfer: { transforms: [copyTransform, summaryTransform, bulletsTransform, ...slidesTransforms({ locale: 'de' })] },\n})\n","ts","",[422,596,597,630,651,678,703,729,736,759,779,815,821,861,879,885,942],{"__ignoreMap":594},[598,599,602,606,610,614,617,620,623,627],"span",{"class":600,"line":601},"line",1,[598,603,605],{"class":604},"s7zQu","import",[598,607,609],{"class":608},"sMK4o"," {",[598,611,613],{"class":612},"sTEyZ"," defaultBlockTypes",[598,615,616],{"class":608}," }",[598,618,619],{"class":604}," from",[598,621,622],{"class":608}," '",[598,624,626],{"class":625},"sfazB","@skaile\u002Fforge-editor\u002Fcomposites",[598,628,629],{"class":608},"'\n",[598,631,633,635,637,640,642,644,646,649],{"class":600,"line":632},2,[598,634,605],{"class":604},[598,636,609],{"class":608},[598,638,639],{"class":612}," copyTransform",[598,641,616],{"class":608},[598,643,619],{"class":604},[598,645,622],{"class":608},[598,647,648],{"class":625},"@skaile\u002Fforge-editor\u002Ftransfer",[598,650,629],{"class":608},[598,652,654,656,658,661,664,667,669,671,673,676],{"class":600,"line":653},3,[598,655,605],{"class":604},[598,657,609],{"class":608},[598,659,660],{"class":612}," bulletsTransform",[598,662,663],{"class":608},",",[598,665,666],{"class":612}," summaryTransform",[598,668,616],{"class":608},[598,670,619],{"class":604},[598,672,622],{"class":608},[598,674,675],{"class":625},"@skaile\u002Fforge-editor\u002Fintegrations\u002Fcomposite-ai",[598,677,629],{"class":608},[598,679,681,683,685,688,690,693,695,697,699,701],{"class":600,"line":680},4,[598,682,605],{"class":604},[598,684,609],{"class":608},[598,686,687],{"class":612}," slideBlockTypes",[598,689,663],{"class":608},[598,691,692],{"class":612}," slidesTransforms",[598,694,616],{"class":608},[598,696,619],{"class":604},[598,698,622],{"class":608},[598,700,424],{"class":625},[598,702,629],{"class":608},[598,704,706,708,710,713,715,717,719,722,725],{"class":600,"line":705},5,[598,707,605],{"class":604},[598,709,609],{"class":608},[598,711,712],{"class":612}," slidesFeature",[598,714,616],{"class":608},[598,716,619],{"class":604},[598,718,622],{"class":608},[598,720,721],{"class":625},"@skaile\u002Fforge-editor-slides\u002Fvue",[598,723,724],{"class":608},"'",[598,726,728],{"class":727},"sHwdD"," \u002F\u002F or '\u002Freact'\n",[598,730,732],{"class":600,"line":731},6,[598,733,735],{"emptyLinePlaceholder":734},true,"\n",[598,737,739,743,746,749,753,756],{"class":600,"line":738},7,[598,740,742],{"class":741},"spNyl","const",[598,744,745],{"class":612}," editor ",[598,747,748],{"class":608},"=",[598,750,752],{"class":751},"s2Zo4"," composeEditor",[598,754,755],{"class":612},"(",[598,757,758],{"class":608},"{\n",[598,760,762,766,769,771,774,776],{"class":600,"line":761},8,[598,763,765],{"class":764},"swJcz","  content",[598,767,768],{"class":608},":",[598,770,622],{"class":608},[598,772,773],{"class":625},"rich",[598,775,724],{"class":608},[598,777,778],{"class":608},",\n",[598,780,782,785,787,790,793,796,798,801,803,805,808,810,813],{"class":600,"line":781},9,[598,783,784],{"class":764},"  interaction",[598,786,768],{"class":608},[598,788,789],{"class":612}," [",[598,791,792],{"class":608},"...",[598,794,795],{"class":612},"INTERACTION",[598,797,458],{"class":608},[598,799,800],{"class":612},"full",[598,802,663],{"class":608},[598,804,622],{"class":608},[598,806,807],{"class":625},"transfer",[598,809,724],{"class":608},[598,811,812],{"class":612},"]",[598,814,778],{"class":608},[598,816,818],{"class":600,"line":817},10,[598,819,820],{"class":727},"  \u002F\u002F The Block types of the editor: the built-in ones and the two of this add-on.\n",[598,822,824,827,829,831,833,836,839,841,844,847,849,851,854,856,859],{"class":600,"line":823},11,[598,825,826],{"class":764},"  blockTypes",[598,828,768],{"class":608},[598,830,789],{"class":612},[598,832,792],{"class":608},[598,834,835],{"class":751},"defaultBlockTypes",[598,837,838],{"class":612},"(t)",[598,840,663],{"class":608},[598,842,843],{"class":608}," ...",[598,845,846],{"class":751},"slideBlockTypes",[598,848,755],{"class":612},[598,850,724],{"class":608},[598,852,853],{"class":625},"de",[598,855,724],{"class":608},[598,857,858],{"class":612},")]",[598,860,778],{"class":608},[598,862,864,867,869,871,874,877],{"class":600,"line":863},12,[598,865,866],{"class":764},"  add",[598,868,768],{"class":608},[598,870,789],{"class":612},[598,872,873],{"class":751},"slidesFeature",[598,875,876],{"class":612},"()]",[598,878,778],{"class":608},[598,880,882],{"class":600,"line":881},13,[598,883,884],{"class":727},"  \u002F\u002F A `transfer.transforms` list replaces the default list, so name the built-in transforms too.\n",[598,886,888,891,893,895,898,900,903,905,907,909,911,913,915,918,920,923,926,928,930,932,934,936,939],{"class":600,"line":887},14,[598,889,890],{"class":764},"  transfer",[598,892,768],{"class":608},[598,894,609],{"class":608},[598,896,897],{"class":764}," transforms",[598,899,768],{"class":608},[598,901,902],{"class":612}," [copyTransform",[598,904,663],{"class":608},[598,906,666],{"class":612},[598,908,663],{"class":608},[598,910,660],{"class":612},[598,912,663],{"class":608},[598,914,843],{"class":608},[598,916,917],{"class":751},"slidesTransforms",[598,919,755],{"class":612},[598,921,922],{"class":608},"{",[598,924,925],{"class":764}," locale",[598,927,768],{"class":608},[598,929,622],{"class":608},[598,931,853],{"class":625},[598,933,724],{"class":608},[598,935,616],{"class":608},[598,937,938],{"class":612},")] ",[598,940,941],{"class":608},"},\n",[598,943,945,948],{"class":600,"line":944},15,[598,946,947],{"class":608},"}",[598,949,950],{"class":612},")\n",[589,952,954],{"className":591,"code":953,"language":593,"meta":594,"style":594},"import { createRenderer, markdownTarget } from '@skaile\u002Fforge-editor\u002Fadapters\u002Frender'\nimport { slideBlockTypes, slidesTargets } from '@skaile\u002Fforge-editor-slides\u002Fserver'\n\n\u002F\u002F installEditorServer({ ports: { render }, blockTypes })\nexport const render = createRenderer([markdownTarget(), ...slidesTargets()])\nexport const blockTypes = [...serverBlockTypes, ...slideBlockTypes('de')]\n",[422,955,956,981,1004,1008,1013,1047],{"__ignoreMap":594},[598,957,958,960,962,965,967,970,972,974,976,979],{"class":600,"line":601},[598,959,605],{"class":604},[598,961,609],{"class":608},[598,963,964],{"class":612}," createRenderer",[598,966,663],{"class":608},[598,968,969],{"class":612}," markdownTarget",[598,971,616],{"class":608},[598,973,619],{"class":604},[598,975,622],{"class":608},[598,977,978],{"class":625},"@skaile\u002Fforge-editor\u002Fadapters\u002Frender",[598,980,629],{"class":608},[598,982,983,985,987,989,991,994,996,998,1000,1002],{"class":600,"line":632},[598,984,605],{"class":604},[598,986,609],{"class":608},[598,988,687],{"class":612},[598,990,663],{"class":608},[598,992,993],{"class":612}," slidesTargets",[598,995,616],{"class":608},[598,997,619],{"class":604},[598,999,622],{"class":608},[598,1001,581],{"class":625},[598,1003,629],{"class":608},[598,1005,1006],{"class":600,"line":653},[598,1007,735],{"emptyLinePlaceholder":734},[598,1009,1010],{"class":600,"line":680},[598,1011,1012],{"class":727},"\u002F\u002F installEditorServer({ ports: { render }, blockTypes })\n",[598,1014,1015,1018,1021,1024,1026,1028,1031,1034,1037,1039,1041,1044],{"class":600,"line":705},[598,1016,1017],{"class":604},"export",[598,1019,1020],{"class":741}," const",[598,1022,1023],{"class":612}," render ",[598,1025,748],{"class":608},[598,1027,964],{"class":751},[598,1029,1030],{"class":612},"([",[598,1032,1033],{"class":751},"markdownTarget",[598,1035,1036],{"class":612},"()",[598,1038,663],{"class":608},[598,1040,843],{"class":608},[598,1042,1043],{"class":751},"slidesTargets",[598,1045,1046],{"class":612},"()])\n",[598,1048,1049,1051,1053,1056,1058,1060,1062,1065,1067,1069,1071,1073,1075,1077,1079],{"class":600,"line":731},[598,1050,1017],{"class":604},[598,1052,1020],{"class":741},[598,1054,1055],{"class":612}," blockTypes ",[598,1057,748],{"class":608},[598,1059,789],{"class":612},[598,1061,792],{"class":608},[598,1063,1064],{"class":612},"serverBlockTypes",[598,1066,663],{"class":608},[598,1068,843],{"class":608},[598,1070,846],{"class":751},[598,1072,755],{"class":612},[598,1074,724],{"class":608},[598,1076,853],{"class":625},[598,1078,724],{"class":608},[598,1080,1081],{"class":612},")]\n",[418,1083,1084,1085,1088],{},"The Block types go to the server too: the AI chat then knows what a deck is, and the server builds the schema from the same list (",[443,1086,1087],{"href":166},"Block types",").",[584,1090,1092],{"id":1091},"the-slide-model","The slide model",[460,1094,1095,1105],{},[463,1096,1097],{},[466,1098,1099,1102],{},[469,1100,1101],{},"Part of a slide",[469,1103,1104],{},"Source",[479,1106,1107,1119,1129,1137,1163,1175],{},[466,1108,1109,1112],{},[484,1110,1111],{},"title",[484,1113,1114,1115,1118],{},"the title row of the Typed block (hidden on a ",[422,1116,1117],{},"blank"," slide)",[466,1120,1121,1124],{},[484,1122,1123],{},"subtitle",[484,1125,1126,1127,1118],{},"the description row (shown on a ",[422,1128,1111],{},[466,1130,1131,1134],{},[484,1132,1133],{},"body",[484,1135,1136],{},"the blocks after the chrome rows: paragraphs, headings, lists, quotes, code, images, rules",[466,1138,1139,1143],{},[484,1140,1141],{},[422,1142,449],{},[484,1144,1145,1146,446,1149,450,1151,1154,1155,450,1158,450,1161],{},"Block property, a ",[422,1147,1148],{},"select",[422,1150,1111],{},[422,1152,1153],{},"bullets"," (default), ",[422,1156,1157],{},"two-column",[422,1159,1160],{},"image",[422,1162,1117],{},[466,1164,1165,1169],{},[484,1166,1167],{},[422,1168,453],{},[484,1170,1145,1171,1174],{},[422,1172,1173],{},"textarea",": speaker notes",[466,1176,1177,1181],{},[484,1178,1179],{},[422,1180,457],{},[484,1182,1145,1183,446,1185,1188,1189,1192,1193,1196],{},[422,1184,457],{},[422,1186,1187],{},"draft"," (todo), ",[422,1190,1191],{},"ready"," (doing), ",[422,1194,1195],{},"final"," (done)",[418,1198,1199,1200,1202,1203,1205],{},"Layouts decide the arrangement only. ",[422,1201,1157],{}," splits the body at the first horizontal rule, or after the first half of its blocks. ",[422,1204,1160],{}," shows the first image above the other blocks. A deck ignores body blocks that are not slides.",[584,1207,1209],{"id":1208},"the-render-contract","The render contract",[418,1211,1212,1215,1216,1219,1220,1223,1224,1227,1228,450,1231,450,1234,1237,1238,1241],{},[422,1213,1214],{},"renderSlide(slide, layout?)"," returns one slide in a 16:9 frame. ",[422,1217,1218],{},"renderDeck(deck, { css? })"," returns all slides, one frame each, in front of a ",[422,1221,1222],{},"\u003Cstyle>"," element with ",[422,1225,1226],{},"SLIDE_CSS",". Both are pure: the same JSON gives the same string, and every text is escaped (links keep only ",[422,1229,1230],{},"http",[422,1232,1233],{},"https",[422,1235,1236],{},"mailto"," and relative targets; an image source must be web, relative or a ",[422,1239,1240],{},"data:image\u002F"," address).",[589,1243,1245],{"className":591,"code":1244,"language":593,"meta":594,"style":594},"import { renderDeck } from '@skaile\u002Fforge-editor-slides\u002Fserver'\n\nconst html = renderDeck(deckJson, { css: false })\n\u002F\u002F \u003Cdiv class=\"sk-deck\" data-title=\"Quartalsbericht\">\n\u002F\u002F \u003Cdiv class=\"sk-frame\">\u003Csection class=\"sk-slide sk-slide--title\" data-layout=\"title\">\u003Ch1>Willkommen\u003C\u002Fh1>…\n",[422,1246,1247,1266,1270,1301,1306],{"__ignoreMap":594},[598,1248,1249,1251,1253,1256,1258,1260,1262,1264],{"class":600,"line":601},[598,1250,605],{"class":604},[598,1252,609],{"class":608},[598,1254,1255],{"class":612}," renderDeck",[598,1257,616],{"class":608},[598,1259,619],{"class":604},[598,1261,622],{"class":608},[598,1263,581],{"class":625},[598,1265,629],{"class":608},[598,1267,1268],{"class":600,"line":632},[598,1269,735],{"emptyLinePlaceholder":734},[598,1271,1272,1274,1277,1279,1281,1284,1286,1288,1291,1293,1297,1299],{"class":600,"line":653},[598,1273,742],{"class":741},[598,1275,1276],{"class":612}," html ",[598,1278,748],{"class":608},[598,1280,1255],{"class":751},[598,1282,1283],{"class":612},"(deckJson",[598,1285,663],{"class":608},[598,1287,609],{"class":608},[598,1289,1290],{"class":764}," css",[598,1292,768],{"class":608},[598,1294,1296],{"class":1295},"sfNiH"," false",[598,1298,616],{"class":608},[598,1300,950],{"class":612},[598,1302,1303],{"class":600,"line":680},[598,1304,1305],{"class":727},"\u002F\u002F \u003Cdiv class=\"sk-deck\" data-title=\"Quartalsbericht\">\n",[598,1307,1308],{"class":600,"line":705},[598,1309,1310],{"class":727},"\u002F\u002F \u003Cdiv class=\"sk-frame\">\u003Csection class=\"sk-slide sk-slide--title\" data-layout=\"title\">\u003Ch1>Willkommen\u003C\u002Fh1>…\n",[418,1312,1313,1314,1317],{},"Nothing in the contract knows reveal.js, PowerPoint or Marp. Every target reads the same slide blocks (",[422,1315,1316],{},"blocksOf",") and builds its own format.",[584,1319,1321],{"id":1320},"render-targets","Render targets",[418,1323,1324,1327,1328,1330],{},[422,1325,1326],{},"slidesTargets(options)"," gives three targets for a Block of the type ",[422,1329,429],{},". A render of any other block fails with a message the client shows.",[460,1332,1333,1346],{},[463,1334,1335],{},[466,1336,1337,1340,1343],{},[469,1338,1339],{},"Target",[469,1341,1342],{},"File",[469,1344,1345],{},"What it holds",[479,1347,1348,1386,1407],{},[466,1349,1350,1354,1359],{},[484,1351,1352],{},[422,1353,535],{},[484,1355,1356],{},[422,1357,1358],{},".html",[484,1360,1361,1362,1365,1366,1369,1370,1373,1374,1377,1378,1381,1382,1385],{},"a reveal.js 6 page: one ",[422,1363,1364],{},"\u003Csection>"," per slide, the speaker notes as ",[422,1367,1368],{},"\u003Caside class=\"notes\">"," (speaker view with ",[422,1371,1372],{},"S","). reveal.js loads from ",[422,1375,1376],{},"REVEAL_CDN"," (jsDelivr); ",[422,1379,1380],{},"options.reveal.cdn"," points it at your own copy, ",[422,1383,1384],{},"options.reveal.theme"," picks the theme",[466,1387,1388,1392,1397],{},[484,1389,1390],{},[422,1391,538],{},[484,1393,1394],{},[422,1395,1396],{},".pptx",[484,1398,1399,1400,1402,1403,1406],{},"PowerPoint through PptxGenJS: the title as one text box, every block of the body as one text box, two stacks for ",[422,1401,1157],{},", pictures for ",[422,1404,1405],{},"data:"," images, speaker notes on the notes page",[466,1408,1409,1413,1418],{},[484,1410,1411],{},[422,1412,541],{},[484,1414,1415],{},[422,1416,1417],{},".md",[484,1419,1420,1421,1424],{},"Marp Markdown: front matter, ",[422,1422,1423],{},"---"," between slides, the layout as a Marp class, speaker notes as HTML comments",[418,1426,1427,1428,1430,1431,1433],{},"A ",[422,1429,538],{}," text box has a height from an estimate of the wrapped lines; PowerPoint shrinks text that does not fit when a person edits it. An image with a source other than a ",[422,1432,1405],{}," address shows its alt text, because the render cannot fetch it.",[584,1435,1437],{"id":1436},"make-slides-from-blocks","Make slides from blocks",[418,1439,1440,1441,1444,1445,1447,1448,1451],{},"Drag a block into a deck and pick a transform, or drop it in the document and pick ",[427,1442,1443],{},"Als Folien einfügen",". Both transforms insert a new ",[422,1446,429],{}," Typed block after the drop position, titled „Folien: ",[1449,1450],"source",{"title":594},"“, with one slide per block of the source:",[1453,1454,1455,1459,1462],"ul",{},[1456,1457,1458],"li",{},"A Typed block with nested Typed blocks gives one slide per nested block, depth first. Its own content comes first as a slide titled after it.",[1456,1460,1461],{},"Any other block is split at its headings: a heading starts a slide.",[1456,1463,1464],{},"A block without headings is one slide.",[460,1466,1467,1483],{},[463,1468,1469],{},[466,1470,1471,1474,1480],{},[469,1472,1473],{},"Transform",[469,1475,1476,1477],{},"Derivation ",[422,1478,1479],{},"method",[469,1481,1482],{},"Needs",[479,1484,1485,1500],{},[466,1486,1487,1491,1497],{},[484,1488,1489],{},[422,1490,557],{},[484,1492,1493,1496],{},[422,1494,1495],{},"link",": the structure is copied",[484,1498,1499],{},"nothing",[466,1501,1502,1506,1512],{},[484,1503,1504],{},[422,1505,560],{},[484,1507,1508,1511],{},[422,1509,1510],{},"ai:slides",": a model writes the slides from the block's Markdown",[484,1513,528,1514,1517],{},[422,1515,1516],{},"ai"," capability",[418,1519,1520,1521,1524,1525,1528,1529,1532,1533,1536],{},"The new deck records a ",[443,1522,1523],{"href":171},"Derivation"," that names the source block. ",[422,1526,1527],{},"inputHash"," is the hash of the source's body Markdown at that moment (the snapshot) and ",[422,1530,1531],{},"outputHash"," is the hash of the deck's body, so the Derivation badge shows the deck as stale when the source changes and as edited when the deck body changes. The AI transform also records ",[422,1534,1535],{},"activity"," (a request id and the model). A drag of a block that has no block id inserts the deck without a Derivation.",[418,1538,1539,1540,1543,1544,454,1547,1550,1551,1554],{},"The AI transform asks for Markdown: every slide starts with ",[422,1541,1542],{},"## Title",", bullets follow, optional lines ",[422,1545,1546],{},"Layout: …",[422,1548,1549],{},"Notizen: …"," set the layout and the speaker notes. The answer is parsed by ",[422,1552,1553],{},"slideDraftsFromMarkdown","; an answer without a slide shows a notice and inserts nothing.",[584,1556,1558],{"id":1557},"in-the-editor","In the editor",[418,1560,1561,1563,1564,1567,1568,1571],{},[422,1562,570],{}," of ",[422,1565,1566],{},"\u002Fvue"," or ",[422,1569,1570],{},"\u002Freact"," adds:",[1453,1573,1574,1589],{},[1456,1575,1576,1577,1580,1581,1584,1585,1588],{},"the block action ",[427,1578,1579],{},"Folien-Layout"," on a slide (a menu of the layouts; ",[422,1582,1583],{},"layouts"," in the feature options narrows it) and ",[427,1586,1587],{},"Folie anhängen"," on a deck,",[1456,1590,1591,1592,1595,1596,458],{},"the section ",[427,1593,1594],{},"Folienvorschau"," in the Typed block inspector and details card: a slide shows its 16:9 preview, layout buttons and notes; a deck shows all slides. The component is ",[422,1597,1598],{},"SlideView",[418,1600,1601,1602,1604],{},"The framework-free ",[422,1603,570],{}," of the package entry has the block actions without the preview.",[584,1606,1608],{"id":1607},"strings","Strings",[418,1610,1611,1612,450,1615,1618,1619,454,1621,1624],{},"The add-on keeps its own small catalog in German and English (",[422,1613,1614],{},"SLIDES_MESSAGES",[422,1616,1617],{},"createSlidesTranslator(locale, overrides)","), because the library's message keys are closed over the library's own strings. ",[422,1620,488],{},[422,1622,1623],{},"slidesTransforms({ locale })"," take the language; the feature and the preview read it from the editor context.",[1626,1627,1628],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":594,"searchDepth":632,"depth":632,"links":1630},[1631,1632,1633,1634,1635,1636,1637],{"id":586,"depth":632,"text":587},{"id":1091,"depth":632,"text":1092},{"id":1208,"depth":632,"text":1209},{"id":1320,"depth":632,"text":1321},{"id":1436,"depth":632,"text":1437},{"id":1557,"depth":632,"text":1558},{"id":1607,"depth":632,"text":1608},"The add-on @skaile\u002Fforge-editor-slides: the Block types deck and slide, the pure HTML render contract, the render targets reveal-html, pptx and marp-md, the transfer transforms that turn blocks into slides, and the slide preview in the inspector.","md",null,{},{"icon":285},{"title":282,"description":1638},"B7ZOcuhzD0rfbL6gxPPM67yUBBfIDhEIHX-PyZXVDn8",[1646,1648],{"title":277,"path":278,"stem":279,"description":1647,"icon":280,"children":-1},"The add-on @skaile\u002Fforge-editor-audio: an ElevenLabs SpeechProvider, the derive methods audio-tts and audio-mixdown that make recording blocks with named Derivation inputs, and the render target audio-mixdown that mixes takes through ffmpeg.",{"title":287,"path":288,"stem":289,"description":1649,"icon":290,"children":-1},"The read-only KnowledgeGraph port with its search and neighbours routes, the Wissensgraph tab of the Explore panel, the memory adapter for tests and the @skaile\u002Fforge-editor-kgs add-on over the KGS SDK.",1793219829853]