[{"data":1,"prerenderedAt":1372},["ShallowReactive",2],{"navigation_docs":3,"-reference-block-capabilities":412,"-reference-block-capabilities-surround":1367},[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":379,"body":414,"description":1360,"extension":1361,"links":1362,"meta":1363,"navigation":1364,"path":380,"seo":1365,"stem":381,"__hash__":1366},"docs\u002F4.reference\u002F8.block-capabilities.md",{"type":415,"value":416,"toc":1349},"minimark",[417,434,441,456,603,606,613,679,688,692,885,928,933,972,976,992,1256,1310,1326],[418,419,420,421,425,426,429,430,433],"p",{},"The types below come from ",[422,423,424],"code",{},"packages\u002Feditor\u002Fsrc\u002Fcore\u002Fcapabilities.ts"," and are exported from ",[422,427,428],{},"@skaile\u002Fforge-editor\u002Fcore",". For how to declare a capability and use it, see ",[431,432,160],"a",{"href":161},".",[435,436,438],"h2",{"id":437},"blockcapability",[422,439,440],{},"BlockCapability",[418,442,443,444,447,448,451,452,455],{},"A Feature declares capabilities in ",[422,445,446],{},"EditorFeature.blockCapabilities",". ",[422,449,450],{},"defineEditor"," merges them with the built-in ones into ",[422,453,454],{},"preset.capabilities"," and throws for a duplicate id or an id of a built-in capability.",[457,458,459,475],"table",{},[460,461,462],"thead",{},[463,464,465,469,472],"tr",{},[466,467,468],"th",{},"Field",[466,470,471],{},"Type",[466,473,474],{},"Meaning",[476,477,478,506,533,550,565,584],"tbody",{},[463,479,480,486,491],{},[481,482,483],"td",{},[422,484,485],{},"id",[481,487,488],{},[422,489,490],{},"string",[481,492,493,494,497,498,501,502,505],{},"Unique across the preset. A Block type's ",[422,495,496],{},"capabilities"," entry and a ",[422,499,500],{},"BlockAction.requires"," or ",[422,503,504],{},"DeriveMethod.requires"," entry name it.",[463,507,508,513,518],{},[481,509,510],{},[422,511,512],{},"appliesTo",[481,514,515],{},[422,516,517],{},"(node, ctx: CapabilityContext) => boolean",[481,519,520,521,524,525,528,529,532],{},"Whether ",[422,522,523],{},"node"," has the capability. Memoised per node type and Block type id, so it may read only the node type (spec and flags), ",[422,526,527],{},"ctx.blockTypeId"," and the Block type's config (",[422,530,531],{},"ctx.configOf",").",[463,534,535,540,545],{},[481,536,537],{},[422,538,539],{},"perNode",[481,541,542],{},[422,543,544],{},"boolean?",[481,546,547,549],{},[422,548,512],{}," reads attributes of the node itself. It then runs for every node, so keep it a constant-time attribute check.",[463,551,552,557,562],{},[481,553,554],{},[422,555,556],{},"configSchema",[481,558,559],{},[422,560,561],{},"ZodType?",[481,563,564],{},"Validates the config a Block type gives. Absent: the capability takes no config, and a Block type that gives one is refused.",[463,566,567,572,577],{},[481,568,569],{},[422,570,571],{},"read",[481,573,574],{},[422,575,576],{},"(node, ctx) => unknown?",[481,578,579,580,583],{},"What the Block holds for the capability (Source child, Basket id, Bibliographic record), or ",[422,581,582],{},"null",". Runs only for Blocks that have the capability; not memoised.",[463,585,586,591,596],{},[481,587,588],{},[422,589,590],{},"storage",[481,592,593],{},[422,594,595],{},"{ metaKeys?, childTypes? }?",[481,597,598,599,602],{},"Where the data lives: keys of the ",[422,600,601],{},"meta"," attribute, node type names of the children. Descriptive only.",[418,604,605],{},"A capability never installs schema, extensions, node views or settings.",[607,608,610],"h3",{"id":609},"capabilitycontext",[422,611,612],{},"CapabilityContext",[457,614,615,623],{},[460,616,617],{},[463,618,619,621],{},[466,620,468],{},[466,622,474],{},[476,624,625,642,658],{},[463,626,627,632],{},[481,628,629],{},[422,630,631],{},"blockTypeId",[481,633,634,635,638,639,641],{},"The persisted ",[422,636,637],{},"attrs.blockType"," of the node; ",[422,640,582],{}," for a node without one.",[463,643,644,649],{},[481,645,646],{},[422,647,648],{},"blockTypeOf(node)",[481,650,651,652,654,655,657],{},"The Block type of ",[422,653,523],{}," among the editor's Block types; ",[422,656,582],{}," for a node without one, an unknown id, or an editor without Block types.",[463,659,660,665],{},[481,661,662],{},[422,663,664],{},"configOf(node, capability)",[481,666,667,668,670,671,674,675,678],{},"The config the Block type of ",[422,669,523],{}," gives ",[422,672,673],{},"capability","; ",[422,676,677],{},"undefined"," when the type does not list it or lists it without config.",[418,680,681,684,685,687],{},[422,682,683],{},"listsCapability(ctx.blockTypeOf(node), id)"," is the usual ",[422,686,512],{}," of a capability a Block type opts into.",[435,689,691],{"id":690},"registry-and-functions","Registry and functions",[457,693,694,704],{},[460,695,696],{},[463,697,698,701],{},[466,699,700],{},"Export",[466,702,703],{},"Does",[476,705,706,724,747,770,783,797,809,824,847,866],{},[463,707,708,713],{},[481,709,710],{},[422,711,712],{},"BUILT_IN_BLOCK_CAPABILITIES",[481,714,715,716,719,720,723],{},"the structural capabilities every editor has (",[422,717,718],{},"container",", ",[422,721,722],{},"title",")",[463,725,726,731],{},[481,727,728],{},[422,729,730],{},"createCapabilityRegistry(capabilities)",[481,732,733,734,737,738,740,741,719,744],{},"a ",[422,735,736],{},"CapabilityRegistry",": ",[422,739,496],{}," (built-in first, then the Features' in feature order), ",[422,742,743],{},"has(id)",[422,745,746],{},"get(id)",[463,748,749,754],{},[481,750,751],{},[422,752,753],{},"createCapabilityIndex(registry, blockTypes)",[481,755,756,757,737,760,719,763,719,766,769],{},"the per-editor ",[422,758,759],{},"CapabilityIndex",[422,761,762],{},"of(node)",[422,764,765],{},"read(node, id)",[422,767,768],{},"configOf(node, id)",". It depends on the editor's Block types, so editors do not share it.",[463,771,772,777],{},[481,773,774],{},[422,775,776],{},"capabilitiesOf(editor, node)",[481,778,779,780,782],{},"ids of the capabilities ",[422,781,523],{}," has",[463,784,785,790],{},[481,786,787],{},[422,788,789],{},"capabilitiesAt(editor, pos)",[481,791,792,793,796],{},"the same for the Block at ",[422,794,795],{},"pos","; empty where no node starts",[463,798,799,804],{},[481,800,801],{},[422,802,803],{},"capabilityConfigOf(editor, node, id)",[481,805,806,807],{},"the config the Block type gives the capability, or ",[422,808,677],{},[463,810,811,816],{},[481,812,813],{},[422,814,815],{},"capabilityDataOf(editor, node, id)",[481,817,818,819,821,822],{},"what ",[422,820,571],{}," returns, or ",[422,823,582],{},[463,825,826,831],{},[481,827,828],{},[422,829,830],{},"validateBlockTypes(registry, blockTypes)",[481,832,833,834,447,836,839,840,842,843,846],{},"throws when a Block type id is defined twice, a listed capability is unknown or listed twice, or a config fails its ",[422,835,556],{},[422,837,838],{},"capabilityIssues(registry, type)"," is the same check for one Block type, and returns the problems instead of throwing. ",[422,841,450],{}," runs ",[422,844,845],{},"validateBlockTypes"," for the Block types of the Features when an editor is created.",[463,848,849,854],{},[481,850,851],{},[422,852,853],{},"blockTypeConfigOf(type, id)",[481,855,856,857,860,861,863,864,723],{},"the config ",[422,858,859],{},"type"," gives the capability, or ",[422,862,677],{}," (also without a ",[422,865,859],{},[463,867,868,873],{},[481,869,870],{},[422,871,872],{},"listsCapability(type, id)",[481,874,875,876,878,879,882,883],{},"whether ",[422,877,859],{}," lists the capability; ",[422,880,881],{},"false"," without a ",[422,884,859],{},[418,886,887,890,891,893,894,896,897,900,901,904,905,908,909,912,913,908,916,919,920,923,924,908,926,532],{},[422,888,889],{},"typeIdOf(node)"," (the Typed block module of ",[422,892,428],{},") gives the ",[422,895,637],{}," of a node (",[422,898,899],{},"''"," for a node without one); ",[422,902,903],{},"findBlockType(blockTypes, node)"," is the Block type lookup. ",[422,906,907],{},"BlockTypeCapability"," (",[422,910,911],{},"{ id, config? }",") and ",[422,914,915],{},"BlockTypeData",[422,917,918],{},"{ id, capabilities }",") are what the registry knows of a Block type; the public ",[422,921,922],{},"BlockType"," extends ",[422,925,915],{},[431,927,383],{"href":384},[435,929,931],{"id":930},"blockactionrequires",[422,932,500],{},[418,934,935,938,939,942,943,945,946,447,949,952,953,956,957,960,961,963,964,967,968,532],{},[422,936,937],{},"BlockAction.requires?: readonly string[]"," lists capability ids. The action is hidden on a Block that lacks one of them. ",[422,940,941],{},"blockActionsOf(preset, ctx)"," throws when an id is declared by no Feature; ",[422,944,450],{}," throws the same for a derive method. It replaces node-name checks in ",[422,947,948],{},"isVisible",[422,950,951],{},"blockTypes?: readonly string[]"," limits an action to named Block types and is for actions that are truly specific to a type. ",[422,954,955],{},"ability"," is a separate gate: ",[422,958,959],{},"requires"," is what the Block is, ",[422,962,955],{}," what its place in the document allows (",[422,965,966],{},"abilitiesAt(editor, pos, node)","); it hides the action but refuses no edit (",[431,969,971],{"href":970},"\u002Fguides\u002Fblock-capabilities#abilities","Abilities",[435,973,975],{"id":974},"built-in-capabilities","Built-in capabilities",[418,977,978,980,981,983,984,987,988,991],{},[422,979,718],{}," and ",[422,982,722],{}," are built in. The composites feature declares the others (",[422,985,986],{},"compositeBlockCapabilities()","), so a Block type file that is parsed with the default registry may name all of them. A Block type that lists a capability its node cannot hold (for example ",[422,989,990],{},"source"," on a type without a container body) has no effect.",[457,993,994,1014],{},[460,995,996],{},[463,997,998,1001,1006,1009],{},[466,999,1000],{},"Id",[466,1002,1003,1004,723],{},"Config (",[422,1005,556],{},[466,1007,1008],{},"Applies to",[466,1010,1011,1013],{},[422,1012,571],{}," returns",[476,1015,1016,1038,1051,1075,1096,1120,1141,1160,1177,1201,1217,1230],{},[463,1017,1018,1022,1028,1035],{},[481,1019,1020],{},[422,1021,718],{},[481,1023,1024,1027],{},[422,1025,1026],{},"{ accepts?: string[] | 'all' }",": the Block types accepted as nested Typed blocks",[481,1029,1030,1031,1034],{},"nodes that hold Blocks of their own (",[422,1032,1033],{},"doc",", a Typed block)",[481,1036,1037],{},"none",[463,1039,1040,1044,1046,1049],{},[481,1041,1042],{},[422,1043,722],{},[481,1045,1037],{},[481,1047,1048],{},"nodes whose content starts with chrome (the title row of a Typed block)",[481,1050,1037],{},[463,1052,1053,1058,1063,1069],{},[481,1054,1055],{},[422,1056,1057],{},"properties",[481,1059,1060],{},[422,1061,1062],{},"{ definitions: PropertyDefinition[] }",[481,1064,1065,1066,1068],{},"a node with the ",[422,1067,601],{}," attribute, if its Block type lists it",[481,1070,1071,1072,1074],{},"the ",[422,1073,601],{}," values of the keys the definitions name",[463,1076,1077,1081,1087,1090],{},[481,1078,1079],{},[422,1080,990],{},[481,1082,1083,1086],{},[422,1084,1085],{},"{ media: ('image' | 'audio' | 'video' | 'file')[] }"," (at least one)",[481,1088,1089],{},"a container node, if its Block type lists it",[481,1091,1092,1093,1095],{},"the Source media block, or ",[422,1094,582],{}," while the body holds none",[463,1097,1098,1103,1105,1111],{},[481,1099,1100],{},[422,1101,1102],{},"bibliography",[481,1104,1037],{},[481,1106,1107,1108,1110],{},"a node with ",[422,1109,601],{},", if its Block type lists it",[481,1112,1113,1114,1117,1118],{},"the CSL-JSON item (",[422,1115,1116],{},"meta.bib","), or ",[422,1119,582],{},[463,1121,1122,1127,1129,1133],{},[481,1123,1124],{},[422,1125,1126],{},"basket",[481,1128,1037],{},[481,1130,1107,1131,1110],{},[422,1132,601],{},[481,1134,1135,1136,1117,1139],{},"the Basket id (",[422,1137,1138],{},"meta.basket",[422,1140,582],{},[463,1142,1143,1148,1150,1154],{},[481,1144,1145],{},[422,1146,1147],{},"titleHidden",[481,1149,1037],{},[481,1151,1107,1152,1110],{},[422,1153,601],{},[481,1155,1156,1157,723],{},"whether the title is hidden (",[422,1158,1159],{},"meta.titleHidden",[463,1161,1162,1167,1172,1175],{},[481,1163,1164],{},[422,1165,1166],{},"ai-brief",[481,1168,1169],{},[422,1170,1171],{},"{ purpose, instructions?, instructionsField?, contentTemplate? }",[481,1173,1174],{},"any node whose Block type lists it",[481,1176,1037],{},[463,1178,1179,1184,1186,1199],{},[481,1180,1181],{},[422,1182,1183],{},"references",[481,1185,1037],{},[481,1187,1107,1188,1190,1191,1195,1196],{},[422,1189,601],{},", if its Block type lists it ",[1192,1193,1194],"strong",{},"or"," one of its Property definitions has the type ",[422,1197,1198],{},"reference",[481,1200,1037],{},[463,1202,1203,1208,1213,1215],{},[481,1204,1205],{},[422,1206,1207],{},"import",[481,1209,1210],{},[422,1211,1212],{},"{ media?: ('image' | 'audio' | 'video' | 'file')[] }",[481,1214,1089],{},[481,1216,1037],{},[463,1218,1219,1224,1226,1228],{},[481,1220,1221],{},[422,1222,1223],{},"export",[481,1225,1037],{},[481,1227,1089],{},[481,1229,1037],{},[463,1231,1232,1237,1239,1251],{},[481,1233,1234],{},[422,1235,1236],{},"derived",[481,1238,1037],{},[481,1240,1107,1241,1243,1244,1247,1248,1250],{},[422,1242,601],{}," whose ",[422,1245,1246],{},"meta.derivation"," is a Derivation (",[422,1249,539],{},"; any Typed block can be derived, whatever its Block type lists)",[481,1252,1071,1253],{},[422,1254,1255],{},"Derivation",[418,1257,1258,1259,980,1261,1263,1264,908,1266,1268,1269,1272,1273,1275,1276,719,1278,1275,1280,719,1282,1275,1284,719,1286,1288,1289,1292,1293,719,1296,719,1299,719,1302,1272,1305,1275,1307,1309],{},"Storage of the built-ins that keep data: ",[422,1260,1057],{},[422,1262,1236],{}," use ",[422,1265,601],{},[422,1267,1236],{},": the key ",[422,1270,1271],{},"derivation","), ",[422,1274,1102],{}," uses ",[422,1277,1116],{},[422,1279,1126],{},[422,1281,1138],{},[422,1283,1147],{},[422,1285,1159],{},[422,1287,990],{}," keeps its media block in the body (",[422,1290,1291],{},"childTypes"," ",[422,1294,1295],{},"image",[422,1297,1298],{},"audio",[422,1300,1301],{},"video",[422,1303,1304],{},"file",[422,1306,1183],{},[422,1308,1198],{}," nodes.",[418,1311,1312,1314,1315,1318,1319,1321,1322,1325],{},[422,1313,1147],{}," gates the eye button of the chrome („Titel ausblenden“ \u002F „Titel einblenden“, Vue and React ",[422,1316,1317],{},"CompositeChrome","): a Typed block of a Block type that does not list it shows no button, so a host that shows or edits the title elsewhere can leave it out. The flag itself (",[422,1320,1159],{},") is a reserved key that every Block type keeps, and ",[422,1323,1324],{},"setCompositeTitleHidden"," works for every type; every built-in Block type lists the capability.",[418,1327,1328,1330,1331,1334,1335,719,1338,980,1341,1344,1345,532],{},[422,1329,1166],{}," is what the Block type tells the model: ",[422,1332,1333],{},"purpose"," goes into every AI request's block model; ",[422,1336,1337],{},"instructions",[422,1339,1340],{},"instructionsField",[422,1342,1343],{},"contentTemplate"," are read only by the AI fill (",[431,1346,1348],{"href":1347},"\u002Freference\u002Fblock-types#blocktypeai","Block types",{"title":1350,"searchDepth":1351,"depth":1351,"links":1352},"",2,[1353,1357,1358,1359],{"id":437,"depth":1351,"text":440,"children":1354},[1355],{"id":609,"depth":1356,"text":612},3,{"id":690,"depth":1351,"text":691},{"id":930,"depth":1351,"text":500},{"id":974,"depth":1351,"text":975},"BlockCapability, the capability registry, the built-in capabilities with their config and appliesTo, and the BlockAction.requires gate.","md",null,{},{"icon":163},{"title":379,"description":1360},"7JrDI0nEUqyAny6-Q_QbHNLCh2h7_yZacrXMq35K7wA",[1368,1370],{"title":374,"path":375,"stem":376,"description":1369,"icon":377,"children":-1},"Build, check and dev commands of the repository: what each one proves and when to run it.",{"title":383,"path":384,"stem":385,"description":1371,"icon":168,"children":-1},"BlockType, the config types of the built-in capabilities, PropertyDefinition and the functions that read and combine Block types.",1793213909903]