[{"data":1,"prerenderedAt":1414},["ShallowReactive",2],{"navigation_docs":3,"-guides-explore":412,"-guides-explore-surround":1409},[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":210,"body":414,"description":1402,"extension":1403,"links":1404,"meta":1405,"navigation":1406,"path":211,"seo":1407,"stem":212,"__hash__":1408},"docs\u002F3.guides\u002F32.explore.md",{"type":415,"value":416,"toc":1395},"minimark",[417,435,535,565,570,606,838,912,923,927,951,974,978,1001,1039,1053,1082,1121,1125,1156,1237,1298,1302,1322,1391],[418,419,420,421,425,426,430,431,434],"p",{},"The ",[422,423,424],"strong",{},"Explore"," panel answers three questions about one Block, all from the ",[427,428,429],"a",{"href":191},"Block index",", and a fourth from the host's ",[427,432,433],{"href":288},"knowledge graph"," when it has one:",[436,437,438,454],"table",{},[439,440,441],"thead",{},[442,443,444,448,451],"tr",{},[445,446,447],"th",{},"Tab",[445,449,450],{},"Question",[445,452,453],{},"Source",[455,456,457,483,499,515],"tbody",{},[442,458,459,466,469],{},[460,461,462],"td",{},[463,464,465],"code",{},"backlinks",[460,467,468],{},"Which Blocks point at this one?",[460,470,471,474,475,478,479,482],{},[463,472,473],{},"EditorBackend.index.edges(address, 'in')"," without the ",[463,476,477],{},"tag"," Edges (see ",[427,480,481],{"href":244},"Edges",")",[442,484,485,490,493],{},[460,486,487],{},[463,488,489],{},"related",[460,491,492],{},"Which Blocks are about the same thing?",[460,494,495,498],{},[463,496,497],{},"EditorBackend.index.related(address)",", the related route below",[442,500,501,506,509],{},[460,502,503],{},[463,504,505],{},"trail",[460,507,508],{},"How was this Block made?",[460,510,511,514],{},[463,512,513],{},"derivationTrailOf(address, index)",", the chain of Derivations, the original first",[442,516,517,522,525],{},[460,518,519],{},[463,520,521],{},"knowledge",[460,523,524],{},"What does the knowledge graph know about it?",[460,526,527,530,531,534],{},[463,528,529],{},"EditorBackend.knowledge.search(title)",", then ",[463,532,533],{},"neighbours(id)"," of the node you choose; see below",[418,536,537,538,540,541,544,545,540,547,544,550,552,553,544,556,558,559,561,562,564],{},"A tab shows only when the backend can fill it: ",[463,539,465],{}," needs ",[463,542,543],{},"index.edges",", ",[463,546,489],{},[463,548,549],{},"index.related",[463,551,505],{}," needs only ",[463,554,555],{},"index",[463,557,521],{}," needs the ",[463,560,521],{}," capability. A backend without the ",[463,563,555],{}," capability has no Explore panel.",[566,567,569],"h2",{"id":568},"enable-it","Enable it",[418,571,420,572,575,576,579,580,583,584,587,588,591,592,595,596,598,599,601,602,605],{},[463,573,574],{},"explore"," Feature is in no level list of the presets. A host that composes with ",[463,577,578],{},"composeEditor"," opts in by id: ",[463,581,582],{},"interaction: [...INTERACTION.full, 'explore']",", with ",[463,585,586],{},"explore: { open, show }"," in the options. The Feature ",[463,589,590],{},"requires"," the ",[463,593,594],{},"composites"," Feature and the backend capability ",[463,597,555],{},"; over a backend without it, ",[463,600,578],{}," reports the Feature in ",[463,603,604],{},"omitted",".",[607,608,613],"pre",{"className":609,"code":610,"language":611,"meta":612,"style":612},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { INTERACTION } from '@skaile\u002Fforge-editor\u002Fpresets\u002Fcompose'\nimport { composeEditor } from '@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced'\n\nconst composed = composeEditor({\n  content: 'rich',\n  interaction: [...INTERACTION.full, 'explore'],\n  ai: false,\n  backend,\n  explore: {\n    \u002F\u002F What choosing a Block does: open its Document and reveal the Block.\n    open: address => workspace.openBlock(address),\n  },\n})\n","ts","",[463,614,615,648,669,676,698,719,755,769,777,788,795,823,829],{"__ignoreMap":612},[616,617,620,624,628,632,635,638,641,645],"span",{"class":618,"line":619},"line",1,[616,621,623],{"class":622},"s7zQu","import",[616,625,627],{"class":626},"sMK4o"," {",[616,629,631],{"class":630},"sTEyZ"," INTERACTION",[616,633,634],{"class":626}," }",[616,636,637],{"class":622}," from",[616,639,640],{"class":626}," '",[616,642,644],{"class":643},"sfazB","@skaile\u002Fforge-editor\u002Fpresets\u002Fcompose",[616,646,647],{"class":626},"'\n",[616,649,651,653,655,658,660,662,664,667],{"class":618,"line":650},2,[616,652,623],{"class":622},[616,654,627],{"class":626},[616,656,657],{"class":630}," composeEditor",[616,659,634],{"class":626},[616,661,637],{"class":622},[616,663,640],{"class":626},[616,665,666],{"class":643},"@skaile\u002Fforge-editor\u002Fvue\u002Fadvanced",[616,668,647],{"class":626},[616,670,672],{"class":618,"line":671},3,[616,673,675],{"emptyLinePlaceholder":674},true,"\n",[616,677,679,683,686,689,692,695],{"class":618,"line":678},4,[616,680,682],{"class":681},"spNyl","const",[616,684,685],{"class":630}," composed ",[616,687,688],{"class":626},"=",[616,690,657],{"class":691},"s2Zo4",[616,693,694],{"class":630},"(",[616,696,697],{"class":626},"{\n",[616,699,701,705,708,710,713,716],{"class":618,"line":700},5,[616,702,704],{"class":703},"swJcz","  content",[616,706,707],{"class":626},":",[616,709,640],{"class":626},[616,711,712],{"class":643},"rich",[616,714,715],{"class":626},"'",[616,717,718],{"class":626},",\n",[616,720,722,725,727,730,733,736,738,741,744,746,748,750,753],{"class":618,"line":721},6,[616,723,724],{"class":703},"  interaction",[616,726,707],{"class":626},[616,728,729],{"class":630}," [",[616,731,732],{"class":626},"...",[616,734,735],{"class":630},"INTERACTION",[616,737,605],{"class":626},[616,739,740],{"class":630},"full",[616,742,743],{"class":626},",",[616,745,640],{"class":626},[616,747,574],{"class":643},[616,749,715],{"class":626},[616,751,752],{"class":630},"]",[616,754,718],{"class":626},[616,756,758,761,763,767],{"class":618,"line":757},7,[616,759,760],{"class":703},"  ai",[616,762,707],{"class":626},[616,764,766],{"class":765},"sfNiH"," false",[616,768,718],{"class":626},[616,770,772,775],{"class":618,"line":771},8,[616,773,774],{"class":630},"  backend",[616,776,718],{"class":626},[616,778,780,783,785],{"class":618,"line":779},9,[616,781,782],{"class":703},"  explore",[616,784,707],{"class":626},[616,786,787],{"class":626}," {\n",[616,789,791],{"class":618,"line":790},10,[616,792,794],{"class":793},"sHwdD","    \u002F\u002F What choosing a Block does: open its Document and reveal the Block.\n",[616,796,798,801,803,807,810,813,815,818,821],{"class":618,"line":797},11,[616,799,800],{"class":691},"    open",[616,802,707],{"class":626},[616,804,806],{"class":805},"sHdIc"," address",[616,808,809],{"class":681}," =>",[616,811,812],{"class":630}," workspace",[616,814,605],{"class":626},[616,816,817],{"class":691},"openBlock",[616,819,820],{"class":630},"(address)",[616,822,718],{"class":626},[616,824,826],{"class":618,"line":825},12,[616,827,828],{"class":626},"  },\n",[616,830,832,835],{"class":618,"line":831},13,[616,833,834],{"class":626},"}",[616,836,837],{"class":630},")\n",[436,839,840,850],{},[439,841,842],{},[442,843,844,847],{},[445,845,846],{},"Entry",[445,848,849],{},"Content",[455,851,852,887],{},[442,853,854,859],{},[460,855,856],{},[463,857,858],{},"@skaile\u002Fforge-editor\u002Fexplore",[460,860,861,862,544,865,544,868,544,871,544,874,544,877,544,880,544,883,886],{},"framework-free: ",[463,863,864],{},"exploreFeature",[463,866,867],{},"exploreFeatureCore",[463,869,870],{},"createExploreModel",[463,872,873],{},"exploreTabsOf",[463,875,876],{},"exploreCountOf",[463,878,879],{},"exploreTabLabel",[463,881,882],{},"exploreKindLabel",[463,884,885],{},"exploreKnowledgeLinksOf"," and the types",[442,888,889,897],{},[460,890,891,544,894],{},[463,892,893],{},"@skaile\u002Fforge-editor\u002Fexplore\u002Fvue",[463,895,896],{},"@skaile\u002Fforge-editor\u002Fexplore\u002Freact",[460,898,899,901,902,544,905,908,909],{},[463,900,864],{}," with the inspector section, plus ",[463,903,904],{},"ExplorePanel",[463,906,907],{},"ExploreSection"," and ",[463,910,911],{},"useExploreModel",[418,913,914,915,918,919,922],{},"The Feature adds the section ",[422,916,917],{},"Verknüpfungen"," to the inspector and the details card of a Typed block: the count of each tab and a button to the panel. ",[463,920,921],{},"show(address)"," in the options is where the host places its panel (a sidebar tab, a drawer); without it, the section shows the panel inline under the counts.",[566,924,926],{"id":925},"the-panel","The panel",[418,928,929,931,932,544,935,938,939,942,943,946,947,950],{},[463,930,904],{}," takes the Block to show (",[463,933,934],{},"address",[463,936,937],{},"null"," for none) and ",[463,940,941],{},"open",", the host's way to a Block. It renders the ",[463,944,945],{},"ExploreModel"," of ",[463,948,949],{},"createExploreModel({ backend, address, open })","; the Vue and React components render the same model.",[418,952,953,954,957,958,961,962,965,966,969,970,973],{},"The model keeps one state: the selected ",[463,955,956],{},"tab"," and, per tab, ",[463,959,960],{},"{ status: 'idle' | 'loading' | 'done' | 'failed', items }",". It loads the three lists when the address changes, cancels what a newer Block replaced, and never loads the same Block twice (",[463,963,964],{},"refresh()"," loads again). A failing list is ",[463,967,968],{},"failed"," and the others stay usable. ",[463,971,972],{},"open(address)"," calls the host and resolves whether it happened; a throwing host is logged, never rethrown.",[566,975,977],{"id":976},"the-related-route","The related route",[418,979,980,983,984,987,988,544,991,544,994,544,997,1000],{},[463,981,982],{},"GET \u002Fapi\u002Feditor\u002Fblocks\u002F:documentId\u002F:blockId\u002Frelated"," answers the Blocks most related to one Block as ",[463,985,986],{},"BlockSearchHit[]"," (",[463,989,990],{},"documentId",[463,992,993],{},"blockId",[463,995,996],{},"title",[463,998,999],{},"type","), best first, at most ten, the Block itself never. The score of a candidate Block is:",[436,1002,1003,1013],{},[439,1004,1005],{},[442,1006,1007,1010],{},[445,1008,1009],{},"Evidence",[445,1011,1012],{},"Points",[455,1014,1015,1023,1031],{},[442,1016,1017,1020],{},[460,1018,1019],{},"each tag it shares with the Block",[460,1021,1022],{},"2",[442,1024,1025,1028],{},[460,1026,1027],{},"each reference target both point at with a chip",[460,1029,1030],{},"3",[442,1032,1033,1036],{},[460,1034,1035],{},"it holds every word of the Block's title",[460,1037,1038],{},"1",[418,1040,1041,1042,908,1045,1048,1049,1052],{},"A candidate with score 0 is left out, and equal scores keep the order of the Documents. ",[463,1043,1044],{},"relatedBlocks(row, candidates)",[463,1046,1047],{},"relatedScore"," in ",[463,1050,1051],{},"@skaile\u002Fforge-editor\u002Fcore"," are the ranking; the route and the in-memory backend both use them.",[418,1054,1055,1056,1059,1060,1063,1064,1067,1068,1071,1072,1075,1076,474,1079,1081],{},"The route reads only Documents the user may read (the scope of the ",[427,1057,1058],{"href":191},"Workspace search","). It answers ",[463,1061,1062],{},"[]"," for an unknown Block, ",[463,1065,1066],{},"403"," when the user may not read the Document of the Block, ",[463,1069,1070],{},"400"," without a Document or Block ID, ",[463,1073,1074],{},"401"," without a user and ",[463,1077,1078],{},"501",[463,1080,555],{}," port. An adapter with vectors can rank better behind the same route.",[436,1083,1084,1092],{},[439,1085,1086],{},[442,1087,1088,1090],{},[445,1089],{},[445,1091],{},[455,1093,1094,1107],{},[442,1095,1096,1099],{},[460,1097,1098],{},"Route",[460,1100,1101,1104,1105,482],{},[463,1102,1103],{},"API.blockRelated"," (port ",[463,1106,555],{},[442,1108,1109,1112],{},[460,1110,1111],{},"Client",[460,1113,1114,1117,1118,1120],{},[463,1115,1116],{},"EditorBackend.index.related(address, signal?)",", optional: a backend without it leaves the ",[463,1119,489],{}," tab out",[566,1122,1124],{"id":1123},"the-trail","The trail",[418,1126,1127,987,1130,1132,1133,1136,1137,1140,1141,1144,1145,1148,1149,1059,1152,1155],{},[463,1128,1129],{},"derivationTrailOf(address, source, signal?)",[463,1131,1051],{},") follows ",[463,1134,1135],{},"derivedFrom"," of the ",[427,1138,1139],{"href":110},"Derivation"," through ",[463,1142,1143],{},"source.blockGet"," (the Document's current content, so ",[463,1146,1147],{},"EditorBackend.index"," is a ",[463,1150,1151],{},"TrailSource",[463,1153,1154],{},"TrailStep[]",", the original first and the Block itself last:",[607,1157,1159],{"className":609,"code":1158,"language":611,"meta":612,"style":612},"const trail = await derivationTrailOf({ documentId: 'doc', blockId: 'rendition-of-rendition' }, backend.index!)\n\u002F\u002F [{ address: …'original', method: null, state: null },\n\u002F\u002F  { address: …'summary',  method: 'ai:summary', state: 'fresh' },\n\u002F\u002F  { address: …'short',    method: 'ai:rewrite', state: 'stale' }]\n",[463,1160,1161,1222,1227,1232],{"__ignoreMap":612},[616,1162,1163,1165,1168,1170,1173,1176,1178,1181,1184,1186,1188,1191,1193,1195,1198,1200,1202,1205,1207,1210,1213,1215,1217,1220],{"class":618,"line":619},[616,1164,682],{"class":681},[616,1166,1167],{"class":630}," trail ",[616,1169,688],{"class":626},[616,1171,1172],{"class":622}," await",[616,1174,1175],{"class":691}," derivationTrailOf",[616,1177,694],{"class":630},[616,1179,1180],{"class":626},"{",[616,1182,1183],{"class":703}," documentId",[616,1185,707],{"class":626},[616,1187,640],{"class":626},[616,1189,1190],{"class":643},"doc",[616,1192,715],{"class":626},[616,1194,743],{"class":626},[616,1196,1197],{"class":703}," blockId",[616,1199,707],{"class":626},[616,1201,640],{"class":626},[616,1203,1204],{"class":643},"rendition-of-rendition",[616,1206,715],{"class":626},[616,1208,1209],{"class":626}," },",[616,1211,1212],{"class":630}," backend",[616,1214,605],{"class":626},[616,1216,555],{"class":630},[616,1218,1219],{"class":626},"!",[616,1221,837],{"class":630},[616,1223,1224],{"class":618,"line":650},[616,1225,1226],{"class":793},"\u002F\u002F [{ address: …'original', method: null, state: null },\n",[616,1228,1229],{"class":618,"line":671},[616,1230,1231],{"class":793},"\u002F\u002F  { address: …'summary',  method: 'ai:summary', state: 'fresh' },\n",[616,1233,1234],{"class":618,"line":678},[616,1235,1236],{"class":793},"\u002F\u002F  { address: …'short',    method: 'ai:rewrite', state: 'stale' }]\n",[1238,1239,1240,1248,1257,1264,1292],"ul",{},[1241,1242,1243,1244,1247],"li",{},"It goes at most ",[463,1245,1246],{},"TRAIL_MAX_HOPS"," (8) Derivations back and never visits a Block twice.",[1241,1249,1250,1251,908,1254,605],{},"A Block without a Derivation is a trail of one step with ",[463,1252,1253],{},"method: null",[463,1255,1256],{},"state: null",[1241,1258,1259,1260,1263],{},"A Block made from an uploaded asset ends the trail there; its ",[463,1261,1262],{},"method"," says how it was made.",[1241,1265,1266,1267,1270,1271,544,1274,544,1277,544,1280,544,1283,1286,1287,1289,1290,605],{},"Each step's ",[463,1268,1269],{},"state"," is the one the row badge shows (",[463,1272,1273],{},"fresh",[463,1275,1276],{},"stale",[463,1278,1279],{},"edited",[463,1281,1282],{},"missing",[463,1284,1285],{},"foreign","). An original that is gone gives ",[463,1288,1282],{},"; one the user may not read gives ",[463,1291,1285],{},[1241,1293,1294,1295,1297],{},"It answers ",[463,1296,1062],{}," for a Block that does not exist and rejects when the Block itself cannot be read.",[566,1299,1301],{"id":1300},"the-knowledge-tab","The knowledge tab",[418,1303,420,1304,1306,1307,1309,1310,1313,1314,1317,1318,1321],{},[463,1305,521],{}," tab („Wissensgraph“) is offered only when the backend has the ",[463,1308,521],{}," capability (",[463,1311,1312],{},"EditorBackend.knowledge",", served by the ",[463,1315,1316],{},"KnowledgeGraph"," port; see ",[427,1319,1320],{"href":288},"Knowledge graph","). It sits after the trail.",[1238,1323,1324,1350,1383],{},[1241,1325,1326,1329,1330,1333,1334,1337,1338,1341,1342,1345,1346,1349],{},[422,1327,1328],{},"List."," Per Block the model reads the title through ",[463,1331,1332],{},"index.blockGet"," and searches the graph for it. ",[463,1335,1336],{},"state.query"," is that text (",[463,1339,1340],{},"''"," for a Block without a title, which searches nothing), ",[463,1343,1344],{},"state.knowledge"," the hits (",[463,1347,1348],{},"{ id, label, kind, score }",", best first).",[1241,1351,1352,1355,1356,1359,1360,1363,1364,987,1367,1370,1371,1374,1375,1378,1379,1382],{},[422,1353,1354],{},"Neighbours."," ",[463,1357,1358],{},"model.focusNode(hit)"," loads ",[463,1361,1362],{},"knowledge.neighbours(hit.id)"," into ",[463,1365,1366],{},"state.focus",[463,1368,1369],{},"{ node, status, nodes, edges }","); ",[463,1372,1373],{},"exploreKnowledgeLinksOf(state.focus)"," lists the nodes joined to it with the edge type and its direction. ",[463,1376,1377],{},"focusNode(node)"," on one of them moves on, ",[463,1380,1381],{},"focusNode(null)"," returns to the hits. Another Block resets the focus.",[1241,1384,1385,1388,1389,605],{},[422,1386,1387],{},"No Block."," A knowledge node is no Block, so choosing one never calls the host's ",[463,1390,941],{},[1392,1393,1394],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":612,"searchDepth":650,"depth":650,"links":1396},[1397,1398,1399,1400,1401],{"id":568,"depth":650,"text":569},{"id":925,"depth":650,"text":926},{"id":976,"depth":650,"text":977},{"id":1123,"depth":650,"text":1124},{"id":1300,"depth":650,"text":1301},"What is connected to a Block: the Blocks that point at it, the Blocks related to it, and the chain of Derivations behind it. The explore Feature, the panel, the related route and derivationTrailOf.","md",null,{},{"icon":193},{"title":210,"description":1402},"jr0mPkCEZiSUmx_LOdYDPw9_Z3rbPtfqLpBBzURBzVA",[1410,1412],{"title":205,"path":206,"stem":207,"description":1411,"icon":208,"children":-1},"The dataView Block type: its stored query and layout, the three layouts and what a board needs, how the view asks and refreshes, \u002Fansicht, and the Typed blocks table as the table layout.",{"title":214,"path":215,"stem":216,"description":1413,"icon":217,"children":-1},"The Renderer port with its render targets, the SSE route that streams progress and stores the result as an asset, the client call, and the block action and command that offer it.",1793213905599]