[{"data":1,"prerenderedAt":1061},["ShallowReactive",2],{"navigation_docs":3,"-guides-edges":412,"-guides-edges-surround":1056},[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":243,"body":414,"description":1049,"extension":1050,"links":1051,"meta":1052,"navigation":1053,"path":244,"seo":1054,"stem":245,"__hash__":1055},"docs\u002F3.guides\u002F39.edges.md",{"type":415,"value":416,"toc":1041},"minimark",[417,431,436,451,567,570,687,691,705,731,742,747,798,835,839,867,886,905,909,920,1006,1037],[418,419,420,421,425,426,430],"p",{},"An ",[422,423,424],"strong",{},"Edge"," is a directed, typed connection from one Block to another Block or to a tag name. The ",[427,428,429],"a",{"href":191},"Block index"," holds the Edges of every Block next to its row, so the question „which Blocks point at this one?“ needs no scan of the Documents.",[432,433,435],"h2",{"id":434},"where-edges-come-from","Where Edges come from",[418,437,438,442,443,446,447,450],{},[439,440,441],"code",{},"projectDocument"," (",[439,444,445],{},"@skaile\u002Fforge-editor\u002Fcore",") fills ",[439,448,449],{},"BlockRow.edges"," while it projects a Document. One Edge exists per kind and target; a Block never lists the same Edge twice.",[452,453,454,474],"table",{},[455,456,457],"thead",{},[458,459,460,466,471],"tr",{},[461,462,463],"th",{},[439,464,465],{},"kind",[461,467,468],{},[439,469,470],{},"origin",[461,472,473],{},"Written by",[475,476,477,497,511,532,550],"tbody",{},[458,478,479,485,490],{},[480,481,482],"td",{},[439,483,484],{},"reference",[480,486,487],{},[439,488,489],{},"content",[480,491,492,493,496],{},"a reference chip (",[439,494,495],{},"[@…]",") anywhere in the Block, nested Blocks included",[458,498,499,504,508],{},[480,500,501],{},[439,502,503],{},"derivation",[480,505,506],{},[439,507,489],{},[480,509,510],{},"the Block the Block's Derivation was made from (not an uploaded asset)",[458,512,513,518,522],{},[480,514,515],{},[439,516,517],{},"embed",[480,519,520],{},[439,521,489],{},[480,523,524,525,442,528,531],{},"a ",[439,526,527],{},"blockEmbed",[439,529,530],{},"![[…]]",") in the Block",[458,533,534,539,543],{},[480,535,536],{},[439,537,538],{},"tag",[480,540,541],{},[439,542,489],{},[480,544,545,546,549],{},"a tag chip or a tag of a Typed block; the target is ",[439,547,548],{},"{ tag }",", not a Block",[458,551,552,555,560],{},[480,553,554],{},"any other string",[480,556,557],{},[439,558,559],{},"meta",[480,561,562,563,566],{},"an Edge a person added by hand: ",[439,564,565],{},"meta.edges"," of the Typed block",[418,568,569],{},"A target without a Document resolves to the Document the Block is in. The index never checks that the target exists: an Edge to a deleted Block stays until its source changes.",[571,572,577],"pre",{"className":573,"code":574,"language":575,"meta":576,"style":576},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { projectDocument } from '@skaile\u002Fforge-editor\u002Fcore'\n\nconst [row] = projectDocument(content, 'doc-1')\nrow.edges\n\u002F\u002F [{ to: { documentId: 'doc-2', blockId: 'b' }, kind: 'reference', origin: 'content' },\n\u002F\u002F  { to: { tag: 'klima' }, kind: 'tag', origin: 'content' },\n\u002F\u002F  { to: { documentId: 'doc-1', blockId: 'c' }, kind: 'supports', origin: 'meta' }]\n","ts","",[439,578,579,611,618,657,668,675,681],{"__ignoreMap":576},[580,581,584,588,592,596,599,602,605,608],"span",{"class":582,"line":583},"line",1,[580,585,587],{"class":586},"s7zQu","import",[580,589,591],{"class":590},"sMK4o"," {",[580,593,595],{"class":594},"sTEyZ"," projectDocument",[580,597,598],{"class":590}," }",[580,600,601],{"class":586}," from",[580,603,604],{"class":590}," '",[580,606,445],{"class":607},"sfazB",[580,609,610],{"class":590},"'\n",[580,612,614],{"class":582,"line":613},2,[580,615,617],{"emptyLinePlaceholder":616},true,"\n",[580,619,621,625,628,631,634,637,640,643,646,648,651,654],{"class":582,"line":620},3,[580,622,624],{"class":623},"spNyl","const",[580,626,627],{"class":590}," [",[580,629,630],{"class":594},"row",[580,632,633],{"class":590},"]",[580,635,636],{"class":590}," =",[580,638,595],{"class":639},"s2Zo4",[580,641,642],{"class":594},"(content",[580,644,645],{"class":590},",",[580,647,604],{"class":590},[580,649,650],{"class":607},"doc-1",[580,652,653],{"class":590},"'",[580,655,656],{"class":594},")\n",[580,658,660,662,665],{"class":582,"line":659},4,[580,661,630],{"class":594},[580,663,664],{"class":590},".",[580,666,667],{"class":594},"edges\n",[580,669,671],{"class":582,"line":670},5,[580,672,674],{"class":673},"sHwdD","\u002F\u002F [{ to: { documentId: 'doc-2', blockId: 'b' }, kind: 'reference', origin: 'content' },\n",[580,676,678],{"class":582,"line":677},6,[580,679,680],{"class":673},"\u002F\u002F  { to: { tag: 'klima' }, kind: 'tag', origin: 'content' },\n",[580,682,684],{"class":582,"line":683},7,[580,685,686],{"class":673},"\u002F\u002F  { to: { documentId: 'doc-1', blockId: 'c' }, kind: 'supports', origin: 'meta' }]\n",[432,688,690],{"id":689},"ask-for-the-edges-of-a-block","Ask for the Edges of a Block",[418,692,693,696,697,700,701,704],{},[439,694,695],{},"BlockIndex.edges(address, direction, scope)"," answers ",[439,698,699],{},"BlockEdge[]",": the row's Edge with ",[439,702,703],{},"from",", the Block it is written in.",[706,707,708,718],"ul",{},[709,710,711,714,715,717],"li",{},[439,712,713],{},"direction: 'out'"," are the Edges written in the Block itself, ",[439,716,538],{}," Edges included.",[709,719,720,723,724,727,728,730],{},[439,721,722],{},"direction: 'in'"," are the Edges of other Blocks that point at it, in Document order of ",[439,725,726],{},"scope",". A ",[439,729,538],{}," Edge never points at a Block, so it is never an incoming one.",[418,732,733,734,737,738,741],{},"The ",[422,735,736],{},"backlinks"," of a Block are its incoming Edges. A Block that does not exist has no Edges (",[439,739,740],{},"[]","), not an error.",[743,744,746],"h3",{"id":745},"route-and-client","Route and client",[452,748,749,757],{},[455,750,751],{},[458,752,753,755],{},[461,754],{},[461,756],{},[475,758,759,777,787],{},[458,760,761,764],{},[480,762,763],{},"Route",[480,765,766,442,769,772,773,776],{},[439,767,768],{},"GET \u002Fapi\u002Feditor\u002Fblocks\u002F:documentId\u002F:blockId\u002Fedges?direction=in|out",[439,770,771],{},"API.blockEdges",", port ",[439,774,775],{},"index",")",[458,778,779,782],{},[480,780,781],{},"Default",[480,783,784],{},[439,785,786],{},"in",[458,788,789,792],{},[480,790,791],{},"Client",[480,793,794,797],{},[439,795,796],{},"EditorBackend.index.edges(address, direction?, signal?)",", optional: a backend without Edges leaves it out",[418,799,800,801,804,805,808,809,812,813,816,817,819,820,823,824,827,828,831,832,834],{},"The route answers only Edges written in Documents the user may read (the same scope as the ",[427,802,803],{"href":191},"Workspace search","). It answers ",[439,806,807],{},"403"," when the user may not read the Document of the Block, ",[439,810,811],{},"400"," for a ",[439,814,815],{},"direction"," other than ",[439,818,786],{}," or ",[439,821,822],{},"out",", ",[439,825,826],{},"401"," without a user and ",[439,829,830],{},"501"," without the ",[439,833,775],{}," port.",[432,836,838],{"id":837},"add-edges-by-hand","Add Edges by hand",[418,840,841,842,845,846,849,850,823,853,856,857,859,860,863,864,866],{},"The inspector and the details card of a Typed block show the section ",[422,843,844],{},"Kanten"," (the ",[439,847,848],{},"edges"," slot of ",[439,851,852],{},"compositeFeature",[439,854,855],{},"EdgesSection"," in both bindings). It lists the Edges of ",[439,858,565],{}," with the kind and the title of the target, and it has a form to add one: the kind as free text, then the target, searched with the same list as the ",[439,861,862],{},"[@"," popup (the blocks of this Document, and with the ",[439,865,775],{}," capability those of other Documents). A click on an entry adds the Edge; the remove button next to an Edge takes it out again. A read-only editor shows the list without the form.",[418,868,869,871,872,442,875,823,878,881,882,885],{},[439,870,565],{}," is a list of ",[439,873,874],{},"{ to: { documentId?, blockId }, kind }",[439,876,877],{},"AuthoredEdge",[439,879,880],{},"META_EDGES_KEY","). The key is written through ",[439,883,884],{},"setBlockProperty",", so it follows the same rules as every other Block property: in a collaboration session the server writes it into the open Y.Doc. Entries without a block ID or without a kind are ignored by the projection.",[418,887,888,889,442,892,823,895,823,898,823,901,904],{},"The framework-free model is ",[439,890,891],{},"features\u002Fcomposites\u002Fedges-model.ts",[439,893,894],{},"edgesSectionOf",[439,896,897],{},"addAuthoredEdge",[439,899,900],{},"removeAuthoredEdge",[439,902,903],{},"edgeTargetChoicesOf","); the Vue and React components only render it.",[432,906,908],{"id":907},"the-drizzle-table","The drizzle table",[418,910,911,912,915,916,919],{},"The drizzle adapter writes the Edges to ",[439,913,914],{},"editor_block_edges"," in the same transaction as the rows of ",[439,917,918],{},"replace",":",[452,921,922,931],{},[455,923,924],{},[458,925,926,929],{},[461,927,928],{},"Column",[461,930],{},[475,932,933,946,959,978,992],{},[458,934,935,943],{},[480,936,937,823,940],{},[439,938,939],{},"from_document_id",[439,941,942],{},"from_block_id",[480,944,945],{},"the Block the Edge is written in",[458,947,948,953],{},[480,949,950],{},[439,951,952],{},"seq",[480,954,955,956,958],{},"position in the row's list; with ",[439,957,939],{}," the primary key",[458,960,961,969],{},[480,962,963,823,966],{},[439,964,965],{},"to_document_id",[439,967,968],{},"to_block_id",[480,970,971,972,812,975,977],{},"the target Block; ",[439,973,974],{},"NULL",[439,976,538],{}," Edge",[458,979,980,984],{},[480,981,982],{},[439,983,538],{},[480,985,986,987,989,990],{},"the tag name of a ",[439,988,538],{}," Edge, else ",[439,991,974],{},[458,993,994,1000],{},[480,995,996,823,998],{},[439,997,465],{},[439,999,470],{},[480,1001,1002,1003],{},"as in ",[439,1004,1005],{},"BlockEdgeRow",[418,1007,1008,1009,1012,1013,1016,1017,1020,1021,1024,1025,1028,1029,1032,1033,1036],{},"An index on ",[439,1010,1011],{},"(to_document_id, to_block_id)"," answers the incoming Edges without a scan. ",[439,1014,1015],{},"blockIndexTables()"," returns ",[439,1018,1019],{},"{ blocks, edges }",", so a host that migrates the tables with ",[439,1022,1023],{},"drizzle-kit"," adds both to its schema; ",[439,1026,1027],{},"bootstrapBlockIndexTables(db)"," creates both with ",[439,1030,1031],{},"IF NOT EXISTS",". The memory adapter answers from its rows; both pass the same contract suite (",[439,1034,1035],{},"test\u002Fsupport\u002Fblock-index-contract.ts",").",[1038,1039,1040],"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 .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 .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":576,"searchDepth":613,"depth":613,"links":1042},[1043,1044,1047,1048],{"id":434,"depth":613,"text":435},{"id":689,"depth":613,"text":690,"children":1045},[1046],{"id":745,"depth":620,"text":746},{"id":837,"depth":613,"text":838},{"id":907,"depth":613,"text":908},"Which Blocks point at a Block: the Edges the Block index projects from references, Derivations, embeds and tags, the ones a person adds in the inspector, the edges route and the drizzle table.","md",null,{},{"icon":246},{"title":243,"description":1049},"PY6G26NP2aRuTuYFQHtr3OK-UIEPBOIweHhwB24mlow",[1057,1059],{"title":238,"path":239,"stem":240,"description":1058,"icon":241,"children":-1},"The DataQuery model, its pseudo-fields and operators per property kind, the evaluator, the BlockIndex.query port method, the route, the client call and the find_blocks tool.",{"title":248,"path":249,"stem":250,"description":1060,"icon":163,"children":-1},"How every editor route authenticates through the identity port, the full route table with status codes, and websocket authentication.",1793219828899]