[{"data":1,"prerenderedAt":1197},["ShallowReactive",2],{"quirekit-doc:\u002Fen\u002Fbuild\u002Fextension":3,"quirekit-source:product\u002Ffeature\u002Fextension.ts":516,"mdc--jbh9g8-key":517},{"id":4,"title":5,"body":6,"description":505,"extension":506,"keywords":507,"locale":508,"meta":509,"navigation":510,"order":111,"path":511,"section":512,"seo":513,"stem":514,"__hash__":515},"docs\u002Fbuild\u002Fextension.en.md","Add your own content type",{"type":7,"value":8,"toc":496},"minimark",[9,13,21,26,37,126,144,151,155,166,265,280,319,326,330,337,347,356,360,363,373,377,383,387,391,462,465,469,473,484,492],[10,11,12],"p",{},"Suppose your knowledge base needs a note group containing editable paragraphs. Users should select, copy and save it with the document. This is a new document structure, beyond changing a paragraph's color.",[10,14,15,16,20],{},"We call it ",[17,18,19],"code",{},"docsNote",". First define its content and insertion command, then add Canvas\u002FSVG display and selection behavior.",[22,23,25],"h2",{"id":24},"_1-define-what-it-stores","1. Define what it stores",[10,27,28,29,32,33,36],{},"In ",[17,30,31],{},"feature\u002Fnode.ts",", ",[17,34,35],{},"Node.create()"," defines the structure:",[38,39,45],"pre",{"className":40,"code":41,"filename":42,"language":43,"meta":44,"style":44},"language-ts shiki shiki-themes github-light github-light github-dark","const DocsNote = Node.create({\n  name: 'docsNote',\n  group: 'block',\n  content: 'block+',\n  isolating: true,\n})\n","feature\u002Fnode.ts · Structure","ts","",[17,46,47,74,87,98,109,120],{"__ignoreMap":44},[48,49,52,56,60,63,67,71],"span",{"class":50,"line":51},"line",1,[48,53,55],{"class":54},"sDD9d","const",[48,57,59],{"class":58},"sUNQB"," DocsNote",[48,61,62],{"class":54}," =",[48,64,66],{"class":65},"sVPnS"," Node.",[48,68,70],{"class":69},"sgQzM","create",[48,72,73],{"class":65},"({\n",[48,75,77,80,84],{"class":50,"line":76},2,[48,78,79],{"class":65},"  name: ",[48,81,83],{"class":82},"s-HEn","'docsNote'",[48,85,86],{"class":65},",\n",[48,88,90,93,96],{"class":50,"line":89},3,[48,91,92],{"class":65},"  group: ",[48,94,95],{"class":82},"'block'",[48,97,86],{"class":65},[48,99,101,104,107],{"class":50,"line":100},4,[48,102,103],{"class":65},"  content: ",[48,105,106],{"class":82},"'block+'",[48,108,86],{"class":65},[48,110,112,115,118],{"class":50,"line":111},5,[48,113,114],{"class":65},"  isolating: ",[48,116,117],{"class":58},"true",[48,119,86],{"class":65},[48,121,123],{"class":50,"line":122},6,[48,124,125],{"class":65},"})\n",[10,127,128,131,132,135,136,139,140,143],{},[17,129,130],{},"name"," is stored in JSON. ",[17,133,134],{},"group: 'block'"," lets the group appear alongside paragraphs. ",[17,137,138],{},"content: 'block+'"," requires at least one block child. ",[17,141,142],{},"isolating"," makes general editing operations respect the container boundary.",[10,145,146,147,150],{},"The complete file also maps HTML input and output to ",[17,148,149],{},"aside[data-docs-note]",", preserving children when copying HTML. This excerpt explains the structure fields; inspect the complete definition at the end of this page.",[22,152,154],{"id":153},"_2-provide-an-insertion-command","2. Provide an insertion command",[10,156,157,158,161,162,165],{},"The interface should call “insert note” without constructing JSON itself. ",[17,159,160],{},"feature\u002Fextension.ts"," provides ",[17,163,164],{},"insertDocsNote(text)",". Its command body is:",[38,167,170],{"className":40,"code":168,"filename":169,"language":43,"meta":44,"style":44},"insertDocsNote: (text: string) => ({ commands }) =>\n  commands.insertContent({\n    type: 'docsNote',\n    content: [{\n      type: 'paragraph',\n      content: [{ type: 'text', text }],\n    }],\n  })\n","feature\u002Fextension.ts · Insertion",[17,171,172,208,218,227,232,242,253,259],{"__ignoreMap":44},[48,173,174,177,180,184,187,190,193,196,199,202,205],{"class":50,"line":51},[48,175,176],{"class":69},"insertDocsNote",[48,178,179],{"class":65},": (",[48,181,183],{"class":182},"sde8i","text",[48,185,186],{"class":54},":",[48,188,189],{"class":58}," string",[48,191,192],{"class":65},") ",[48,194,195],{"class":54},"=>",[48,197,198],{"class":65}," ({ ",[48,200,201],{"class":182},"commands",[48,203,204],{"class":65}," }) ",[48,206,207],{"class":54},"=>\n",[48,209,210,213,216],{"class":50,"line":76},[48,211,212],{"class":65},"  commands.",[48,214,215],{"class":69},"insertContent",[48,217,73],{"class":65},[48,219,220,223,225],{"class":50,"line":89},[48,221,222],{"class":65},"    type: ",[48,224,83],{"class":82},[48,226,86],{"class":65},[48,228,229],{"class":50,"line":100},[48,230,231],{"class":65},"    content: [{\n",[48,233,234,237,240],{"class":50,"line":111},[48,235,236],{"class":65},"      type: ",[48,238,239],{"class":82},"'paragraph'",[48,241,86],{"class":65},[48,243,244,247,250],{"class":50,"line":122},[48,245,246],{"class":65},"      content: [{ type: ",[48,248,249],{"class":82},"'text'",[48,251,252],{"class":65},", text }],\n",[48,254,256],{"class":50,"line":255},7,[48,257,258],{"class":65},"    }],\n",[48,260,262],{"class":50,"line":261},8,[48,263,264],{"class":65},"  })\n",[10,266,267,268,271,272,275,276,279],{},"Using ",[17,269,270],{},"insertContent()"," preserves Core transactions and undo. The complete file adds TypeScript declarations and installs the node through ",[17,273,274],{},"addExtensions()",". After installing ",[17,277,278],{},"DocsNoteFeature",", a button can call:",[38,281,284],{"className":40,"code":282,"filename":283,"language":43,"meta":44,"style":44},"editor.chain().focus().insertDocsNote('Note content').run()\n","Call from a button",[17,285,286],{"__ignoreMap":44},[48,287,288,291,294,297,300,302,304,307,310,313,316],{"class":50,"line":51},[48,289,290],{"class":65},"editor.",[48,292,293],{"class":69},"chain",[48,295,296],{"class":65},"().",[48,298,299],{"class":69},"focus",[48,301,296],{"class":65},[48,303,176],{"class":69},[48,305,306],{"class":65},"(",[48,308,309],{"class":82},"'Note content'",[48,311,312],{"class":65},").",[48,314,315],{"class":69},"run",[48,317,318],{"class":65},"()\n",[10,320,321,322,325],{},"Use ",[17,323,324],{},"can().insertDocsNote(...)"," to determine whether that button is enabled.",[22,327,329],{"id":328},"_3-arrange-children-in-canvassvg","3. Arrange children in Canvas\u002FSVG",[10,331,332,333,336],{},"DOM can display HTML elements directly. Canvas\u002FSVG uses QuireKit layout results, so ",[17,334,335],{},"renderHTML()"," alone is insufficient. The note also needs a layout provider.",[10,338,339,342,343,346],{},[17,340,341],{},"feature\u002Flayout.ts"," uses existing engine services to lay out paragraphs within the available width and place them in the group. It does not measure browser DOM or reimplement text layout. ",[17,344,345],{},"addLayoutProviders()"," registers this behavior.",[10,348,349,350,355],{},"The group now has a display in both Canvas and SVG. Detailed size, document-range and pagination parameters are in the ",[351,352,354],"a",{"href":353},"\u002Fen\u002Fapi\u002Fextensions","extension API","; start by reusing this ordinary container layout.",[22,357,359],{"id":358},"_4-explain-container-boundaries-to-selection","4. Explain container boundaries to selection",[10,361,362],{},"Dragging inside the group should select ordinary text. Dragging across its boundary also requires a definition of which children belong to the selection.",[10,364,365,368,369,372],{},[17,366,367],{},"feature\u002Fselection.ts"," delegates internal selection to text and uses child units when crossing the group. ",[17,370,371],{},"addSelectionAdapters()"," registers these rules, allowing copy and replacement to use consistent content ranges.",[22,374,376],{"id":375},"try-it","Try it",[10,378,379,380,382],{},"Click “Insert note group”, type inside it, select across its boundary and undo. Switch to SVG and confirm that content remains. Download JSON to see ",[17,381,19],{}," and its paragraphs.",[384,385],"docs-demo",{"name":386},"product\u002Fgeneric",[22,388,390],{"id":389},"inspect-complete-files-by-purpose","Inspect complete files by purpose",[392,393,394,410],"table",{},[395,396,397],"thead",{},[398,399,400,404,407],"tr",{},[401,402,403],"th",{},"File",[401,405,406],{},"When to read it",[401,408,409],{},"Responsibility",[411,412,413,426,438,450],"tbody",{},[398,414,415,420,423],{},[416,417,418],"td",{},[17,419,31],{},[416,421,422],{},"Change attributes or allowed children",[416,424,425],{},"Structure and HTML parsing\u002Foutput",[398,427,428,432,435],{},[416,429,430],{},[17,431,160],{},[416,433,434],{},"Install the feature or change insertion",[416,436,437],{},"Command types, implementation and registration",[398,439,440,444,447],{},[416,441,442],{},[17,443,341],{},[416,445,446],{},"Change container arrangement",[416,448,449],{},"Canvas\u002FSVG child sizes and positions",[398,451,452,456,459],{},[416,453,454],{},[17,455,367],{},[416,457,458],{},"Change cross-container selection",[416,460,461],{},"Internal and boundary selection rules",[10,463,464],{},"Choose one file below. Read the node and extension first; inspect the other two when adjusting layout or selection.",[466,467],"docs-recipe",{"name":468},"product\u002Ffeature\u002Fextension",[22,470,472],{"id":471},"saving-and-other-formats","Saving and other formats",[10,474,475,476,479,480,483],{},"The node is saved with document JSON; install the extension again on restore. This example implements neither DOCX conversion nor AI integration. Add the respective rules through ",[17,477,478],{},"addDocx()"," and ",[17,481,482],{},"addAiCapabilities()"," when needed. JSON persistence alone does not provide another format's support.",[10,485,486,487,491],{},"For a toolbar or sidebar rather than new content, continue with ",[351,488,490],{"href":489},"\u002Fen\u002Fbuild\u002Fproduct-plugin","product plugins",".",[493,494,495],"style",{},"html pre.shiki code .sDD9d, html code.shiki .sDD9d{--shiki-default:#D73A49;--shiki-light:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sUNQB, html code.shiki .sUNQB{--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s-HEn, html code.shiki .s-HEn{--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#9ECBFF}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 .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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sde8i, html code.shiki .sde8i{--shiki-default:#E36209;--shiki-light:#E36209;--shiki-dark:#FFAB70}",{"title":44,"searchDepth":76,"depth":76,"links":497},[498,499,500,501,502,503,504],{"id":24,"depth":76,"text":25},{"id":153,"depth":76,"text":154},{"id":328,"depth":76,"text":329},{"id":358,"depth":76,"text":359},{"id":375,"depth":76,"text":376},{"id":389,"depth":76,"text":390},{"id":471,"depth":76,"text":472},"Build a note group by understanding nodes, commands, display and selection step by step.","md",null,"en",{},true,"\u002Fen\u002Fbuild\u002Fextension","Build a product",{"title":5,"description":505},"build\u002Fextension.en","5L5EzWHuJOLfEaiD8t7C6-uGfIdykB4KmAKHJulGXI0","import { Extension } from \"@quirekit\u002Fcore\";\nimport { DocsNote } from \".\u002Fnode\";\nimport { noteLayout } from \".\u002Flayout\";\nimport { noteSelection } from \".\u002Fselection\";\n\ndeclare module \"@quirekit\u002Fcore\" {\n  \u002F** The same typed command registry used by direct, chain and can modes. *\u002F\n  interface Commands\u003CReturnType> {\n    \u002F** Feature-owned commands. *\u002F\n    docsNote: {\n      \u002F** @param text - Paragraph text inside a new note. @returns Whether insertion can run or was handled. *\u002F\n      insertDocsNote: (text: string) => ReturnType;\n    };\n  }\n}\n\u002F** One installable feature owns schema, command, retained layout and structured selection. *\u002F\nexport const DocsNoteFeature = Extension.create({\n  name: \"docsNoteFeature\",\n  \u002F** @returns Schema owner; no second document is maintained. *\u002F\n  addExtensions() { return [DocsNote]; },\n  \u002F** @returns Typed raw command factories, also safe in can() dry runs. *\u002F\n  addCommands() {\n    return {\n      insertDocsNote: (text: string) => ({ commands }) => commands.insertContent({ type: \"docsNote\",\n        content: [{ type: \"paragraph\", content: [{ type: \"text\", text }] }] }),\n    };\n  },\n  \u002F** @returns Renderer-neutral geometry owner. *\u002F\n  addLayoutProviders() { return [noteLayout]; },\n  \u002F** @returns Structured crossing semantics, independently of hit testing. *\u002F\n  addSelectionAdapters() { return [noteSelection]; },\n});\n",{"data":518,"body":519},{},{"type":520,"children":521},"root",[522,1192],{"type":523,"tag":38,"props":524,"children":526},"element",{"className":40,"code":525,"language":43,"meta":44,"style":44},"import { Extension } from \"@quirekit\u002Fcore\";\nimport { DocsNote } from \".\u002Fnode\";\nimport { noteLayout } from \".\u002Flayout\";\nimport { noteSelection } from \".\u002Fselection\";\n\ndeclare module \"@quirekit\u002Fcore\" {\n  \u002F** The same typed command registry used by direct, chain and can modes. *\u002F\n  interface Commands\u003CReturnType> {\n    \u002F** Feature-owned commands. *\u002F\n    docsNote: {\n      \u002F** @param text - Paragraph text inside a new note. @returns Whether insertion can run or was handled. *\u002F\n      insertDocsNote: (text: string) => ReturnType;\n    };\n  }\n}\n\u002F** One installable feature owns schema, command, retained layout and structured selection. *\u002F\nexport const DocsNoteFeature = Extension.create({\n  name: \"docsNoteFeature\",\n  \u002F** @returns Schema owner; no second document is maintained. *\u002F\n  addExtensions() { return [DocsNote]; },\n  \u002F** @returns Typed raw command factories, also safe in can() dry runs. *\u002F\n  addCommands() {\n    return {\n      insertDocsNote: (text: string) => ({ commands }) => commands.insertContent({ type: \"docsNote\",\n        content: [{ type: \"paragraph\", content: [{ type: \"text\", text }] }] }),\n    };\n  },\n  \u002F** @returns Renderer-neutral geometry owner. *\u002F\n  addLayoutProviders() { return [noteLayout]; },\n  \u002F** @returns Structured crossing semantics, independently of hit testing. *\u002F\n  addSelectionAdapters() { return [noteSelection]; },\n});\n\n",[527],{"type":523,"tag":17,"props":528,"children":529},{"__ignoreMap":44},[530,561,586,611,636,644,666,675,704,713,731,765,813,822,831,840,849,885,902,920,944,961,975,988,1059,1088,1096,1105,1122,1144,1161,1183],{"type":523,"tag":48,"props":531,"children":532},{"class":50,"line":51},[533,539,545,550,556],{"type":523,"tag":48,"props":534,"children":536},{"style":535},"--shiki-default:#D73A49;--shiki-light:#D73A49;--shiki-dark:#F97583",[537],{"type":183,"value":538},"import",{"type":523,"tag":48,"props":540,"children":542},{"style":541},"--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8",[543],{"type":183,"value":544}," { Extension } ",{"type":523,"tag":48,"props":546,"children":547},{"style":535},[548],{"type":183,"value":549},"from",{"type":523,"tag":48,"props":551,"children":553},{"style":552},"--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#9ECBFF",[554],{"type":183,"value":555}," \"@quirekit\u002Fcore\"",{"type":523,"tag":48,"props":557,"children":558},{"style":541},[559],{"type":183,"value":560},";\n",{"type":523,"tag":48,"props":562,"children":563},{"class":50,"line":76},[564,568,573,577,582],{"type":523,"tag":48,"props":565,"children":566},{"style":535},[567],{"type":183,"value":538},{"type":523,"tag":48,"props":569,"children":570},{"style":541},[571],{"type":183,"value":572}," { DocsNote } ",{"type":523,"tag":48,"props":574,"children":575},{"style":535},[576],{"type":183,"value":549},{"type":523,"tag":48,"props":578,"children":579},{"style":552},[580],{"type":183,"value":581}," \".\u002Fnode\"",{"type":523,"tag":48,"props":583,"children":584},{"style":541},[585],{"type":183,"value":560},{"type":523,"tag":48,"props":587,"children":588},{"class":50,"line":89},[589,593,598,602,607],{"type":523,"tag":48,"props":590,"children":591},{"style":535},[592],{"type":183,"value":538},{"type":523,"tag":48,"props":594,"children":595},{"style":541},[596],{"type":183,"value":597}," { noteLayout } ",{"type":523,"tag":48,"props":599,"children":600},{"style":535},[601],{"type":183,"value":549},{"type":523,"tag":48,"props":603,"children":604},{"style":552},[605],{"type":183,"value":606}," \".\u002Flayout\"",{"type":523,"tag":48,"props":608,"children":609},{"style":541},[610],{"type":183,"value":560},{"type":523,"tag":48,"props":612,"children":613},{"class":50,"line":100},[614,618,623,627,632],{"type":523,"tag":48,"props":615,"children":616},{"style":535},[617],{"type":183,"value":538},{"type":523,"tag":48,"props":619,"children":620},{"style":541},[621],{"type":183,"value":622}," { noteSelection } ",{"type":523,"tag":48,"props":624,"children":625},{"style":535},[626],{"type":183,"value":549},{"type":523,"tag":48,"props":628,"children":629},{"style":552},[630],{"type":183,"value":631}," \".\u002Fselection\"",{"type":523,"tag":48,"props":633,"children":634},{"style":541},[635],{"type":183,"value":560},{"type":523,"tag":48,"props":637,"children":638},{"class":50,"line":111},[639],{"type":523,"tag":48,"props":640,"children":641},{"emptyLinePlaceholder":510},[642],{"type":183,"value":643},"\n",{"type":523,"tag":48,"props":645,"children":646},{"class":50,"line":122},[647,652,657,661],{"type":523,"tag":48,"props":648,"children":649},{"style":535},[650],{"type":183,"value":651},"declare",{"type":523,"tag":48,"props":653,"children":654},{"style":535},[655],{"type":183,"value":656}," module",{"type":523,"tag":48,"props":658,"children":659},{"style":552},[660],{"type":183,"value":555},{"type":523,"tag":48,"props":662,"children":663},{"style":541},[664],{"type":183,"value":665}," {\n",{"type":523,"tag":48,"props":667,"children":668},{"class":50,"line":255},[669],{"type":523,"tag":48,"props":670,"children":672},{"style":671},"--shiki-default:#6A737D;--shiki-light:#6A737D;--shiki-dark:#6A737D",[673],{"type":183,"value":674},"  \u002F** The same typed command registry used by direct, chain and can modes. *\u002F\n",{"type":523,"tag":48,"props":676,"children":677},{"class":50,"line":261},[678,683,689,694,699],{"type":523,"tag":48,"props":679,"children":680},{"style":535},[681],{"type":183,"value":682},"  interface",{"type":523,"tag":48,"props":684,"children":686},{"style":685},"--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0",[687],{"type":183,"value":688}," Commands",{"type":523,"tag":48,"props":690,"children":691},{"style":541},[692],{"type":183,"value":693},"\u003C",{"type":523,"tag":48,"props":695,"children":696},{"style":685},[697],{"type":183,"value":698},"ReturnType",{"type":523,"tag":48,"props":700,"children":701},{"style":541},[702],{"type":183,"value":703},"> {\n",{"type":523,"tag":48,"props":705,"children":707},{"class":50,"line":706},9,[708],{"type":523,"tag":48,"props":709,"children":710},{"style":671},[711],{"type":183,"value":712},"    \u002F** Feature-owned commands. *\u002F\n",{"type":523,"tag":48,"props":714,"children":716},{"class":50,"line":715},10,[717,723,727],{"type":523,"tag":48,"props":718,"children":720},{"style":719},"--shiki-default:#E36209;--shiki-light:#E36209;--shiki-dark:#FFAB70",[721],{"type":183,"value":722},"    docsNote",{"type":523,"tag":48,"props":724,"children":725},{"style":535},[726],{"type":183,"value":186},{"type":523,"tag":48,"props":728,"children":729},{"style":541},[730],{"type":183,"value":665},{"type":523,"tag":48,"props":732,"children":734},{"class":50,"line":733},11,[735,740,745,750,755,760],{"type":523,"tag":48,"props":736,"children":737},{"style":671},[738],{"type":183,"value":739},"      \u002F** ",{"type":523,"tag":48,"props":741,"children":742},{"style":535},[743],{"type":183,"value":744},"@param",{"type":523,"tag":48,"props":746,"children":747},{"style":541},[748],{"type":183,"value":749}," text",{"type":523,"tag":48,"props":751,"children":752},{"style":671},[753],{"type":183,"value":754}," - Paragraph text inside a new note. ",{"type":523,"tag":48,"props":756,"children":757},{"style":535},[758],{"type":183,"value":759},"@returns",{"type":523,"tag":48,"props":761,"children":762},{"style":671},[763],{"type":183,"value":764}," Whether insertion can run or was handled. *\u002F\n",{"type":523,"tag":48,"props":766,"children":768},{"class":50,"line":767},12,[769,774,778,783,787,791,796,800,804,809],{"type":523,"tag":48,"props":770,"children":771},{"style":685},[772],{"type":183,"value":773},"      insertDocsNote",{"type":523,"tag":48,"props":775,"children":776},{"style":535},[777],{"type":183,"value":186},{"type":523,"tag":48,"props":779,"children":780},{"style":541},[781],{"type":183,"value":782}," (",{"type":523,"tag":48,"props":784,"children":785},{"style":719},[786],{"type":183,"value":183},{"type":523,"tag":48,"props":788,"children":789},{"style":535},[790],{"type":183,"value":186},{"type":523,"tag":48,"props":792,"children":794},{"style":793},"--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF",[795],{"type":183,"value":189},{"type":523,"tag":48,"props":797,"children":798},{"style":541},[799],{"type":183,"value":192},{"type":523,"tag":48,"props":801,"children":802},{"style":535},[803],{"type":183,"value":195},{"type":523,"tag":48,"props":805,"children":806},{"style":685},[807],{"type":183,"value":808}," ReturnType",{"type":523,"tag":48,"props":810,"children":811},{"style":541},[812],{"type":183,"value":560},{"type":523,"tag":48,"props":814,"children":816},{"class":50,"line":815},13,[817],{"type":523,"tag":48,"props":818,"children":819},{"style":541},[820],{"type":183,"value":821},"    };\n",{"type":523,"tag":48,"props":823,"children":825},{"class":50,"line":824},14,[826],{"type":523,"tag":48,"props":827,"children":828},{"style":541},[829],{"type":183,"value":830},"  }\n",{"type":523,"tag":48,"props":832,"children":834},{"class":50,"line":833},15,[835],{"type":523,"tag":48,"props":836,"children":837},{"style":541},[838],{"type":183,"value":839},"}\n",{"type":523,"tag":48,"props":841,"children":843},{"class":50,"line":842},16,[844],{"type":523,"tag":48,"props":845,"children":846},{"style":671},[847],{"type":183,"value":848},"\u002F** One installable feature owns schema, command, retained layout and structured selection. *\u002F\n",{"type":523,"tag":48,"props":850,"children":852},{"class":50,"line":851},17,[853,858,863,868,872,877,881],{"type":523,"tag":48,"props":854,"children":855},{"style":535},[856],{"type":183,"value":857},"export",{"type":523,"tag":48,"props":859,"children":860},{"style":535},[861],{"type":183,"value":862}," const",{"type":523,"tag":48,"props":864,"children":865},{"style":793},[866],{"type":183,"value":867}," DocsNoteFeature",{"type":523,"tag":48,"props":869,"children":870},{"style":535},[871],{"type":183,"value":62},{"type":523,"tag":48,"props":873,"children":874},{"style":541},[875],{"type":183,"value":876}," Extension.",{"type":523,"tag":48,"props":878,"children":879},{"style":685},[880],{"type":183,"value":70},{"type":523,"tag":48,"props":882,"children":883},{"style":541},[884],{"type":183,"value":73},{"type":523,"tag":48,"props":886,"children":888},{"class":50,"line":887},18,[889,893,898],{"type":523,"tag":48,"props":890,"children":891},{"style":541},[892],{"type":183,"value":79},{"type":523,"tag":48,"props":894,"children":895},{"style":552},[896],{"type":183,"value":897},"\"docsNoteFeature\"",{"type":523,"tag":48,"props":899,"children":900},{"style":541},[901],{"type":183,"value":86},{"type":523,"tag":48,"props":903,"children":905},{"class":50,"line":904},19,[906,911,915],{"type":523,"tag":48,"props":907,"children":908},{"style":671},[909],{"type":183,"value":910},"  \u002F** ",{"type":523,"tag":48,"props":912,"children":913},{"style":535},[914],{"type":183,"value":759},{"type":523,"tag":48,"props":916,"children":917},{"style":671},[918],{"type":183,"value":919}," Schema owner; no second document is maintained. *\u002F\n",{"type":523,"tag":48,"props":921,"children":923},{"class":50,"line":922},20,[924,929,934,939],{"type":523,"tag":48,"props":925,"children":926},{"style":685},[927],{"type":183,"value":928},"  addExtensions",{"type":523,"tag":48,"props":930,"children":931},{"style":541},[932],{"type":183,"value":933},"() { ",{"type":523,"tag":48,"props":935,"children":936},{"style":535},[937],{"type":183,"value":938},"return",{"type":523,"tag":48,"props":940,"children":941},{"style":541},[942],{"type":183,"value":943}," [DocsNote]; },\n",{"type":523,"tag":48,"props":945,"children":947},{"class":50,"line":946},21,[948,952,956],{"type":523,"tag":48,"props":949,"children":950},{"style":671},[951],{"type":183,"value":910},{"type":523,"tag":48,"props":953,"children":954},{"style":535},[955],{"type":183,"value":759},{"type":523,"tag":48,"props":957,"children":958},{"style":671},[959],{"type":183,"value":960}," Typed raw command factories, also safe in can() dry runs. *\u002F\n",{"type":523,"tag":48,"props":962,"children":964},{"class":50,"line":963},22,[965,970],{"type":523,"tag":48,"props":966,"children":967},{"style":685},[968],{"type":183,"value":969},"  addCommands",{"type":523,"tag":48,"props":971,"children":972},{"style":541},[973],{"type":183,"value":974},"() {\n",{"type":523,"tag":48,"props":976,"children":978},{"class":50,"line":977},23,[979,984],{"type":523,"tag":48,"props":980,"children":981},{"style":535},[982],{"type":183,"value":983},"    return",{"type":523,"tag":48,"props":985,"children":986},{"style":541},[987],{"type":183,"value":665},{"type":523,"tag":48,"props":989,"children":991},{"class":50,"line":990},24,[992,996,1000,1004,1008,1012,1016,1020,1024,1028,1032,1036,1041,1045,1050,1055],{"type":523,"tag":48,"props":993,"children":994},{"style":685},[995],{"type":183,"value":773},{"type":523,"tag":48,"props":997,"children":998},{"style":541},[999],{"type":183,"value":179},{"type":523,"tag":48,"props":1001,"children":1002},{"style":719},[1003],{"type":183,"value":183},{"type":523,"tag":48,"props":1005,"children":1006},{"style":535},[1007],{"type":183,"value":186},{"type":523,"tag":48,"props":1009,"children":1010},{"style":793},[1011],{"type":183,"value":189},{"type":523,"tag":48,"props":1013,"children":1014},{"style":541},[1015],{"type":183,"value":192},{"type":523,"tag":48,"props":1017,"children":1018},{"style":535},[1019],{"type":183,"value":195},{"type":523,"tag":48,"props":1021,"children":1022},{"style":541},[1023],{"type":183,"value":198},{"type":523,"tag":48,"props":1025,"children":1026},{"style":719},[1027],{"type":183,"value":201},{"type":523,"tag":48,"props":1029,"children":1030},{"style":541},[1031],{"type":183,"value":204},{"type":523,"tag":48,"props":1033,"children":1034},{"style":535},[1035],{"type":183,"value":195},{"type":523,"tag":48,"props":1037,"children":1038},{"style":541},[1039],{"type":183,"value":1040}," commands.",{"type":523,"tag":48,"props":1042,"children":1043},{"style":685},[1044],{"type":183,"value":215},{"type":523,"tag":48,"props":1046,"children":1047},{"style":541},[1048],{"type":183,"value":1049},"({ type: ",{"type":523,"tag":48,"props":1051,"children":1052},{"style":552},[1053],{"type":183,"value":1054},"\"docsNote\"",{"type":523,"tag":48,"props":1056,"children":1057},{"style":541},[1058],{"type":183,"value":86},{"type":523,"tag":48,"props":1060,"children":1062},{"class":50,"line":1061},25,[1063,1068,1073,1078,1083],{"type":523,"tag":48,"props":1064,"children":1065},{"style":541},[1066],{"type":183,"value":1067},"        content: [{ type: ",{"type":523,"tag":48,"props":1069,"children":1070},{"style":552},[1071],{"type":183,"value":1072},"\"paragraph\"",{"type":523,"tag":48,"props":1074,"children":1075},{"style":541},[1076],{"type":183,"value":1077},", content: [{ type: ",{"type":523,"tag":48,"props":1079,"children":1080},{"style":552},[1081],{"type":183,"value":1082},"\"text\"",{"type":523,"tag":48,"props":1084,"children":1085},{"style":541},[1086],{"type":183,"value":1087},", text }] }] }),\n",{"type":523,"tag":48,"props":1089,"children":1091},{"class":50,"line":1090},26,[1092],{"type":523,"tag":48,"props":1093,"children":1094},{"style":541},[1095],{"type":183,"value":821},{"type":523,"tag":48,"props":1097,"children":1099},{"class":50,"line":1098},27,[1100],{"type":523,"tag":48,"props":1101,"children":1102},{"style":541},[1103],{"type":183,"value":1104},"  },\n",{"type":523,"tag":48,"props":1106,"children":1108},{"class":50,"line":1107},28,[1109,1113,1117],{"type":523,"tag":48,"props":1110,"children":1111},{"style":671},[1112],{"type":183,"value":910},{"type":523,"tag":48,"props":1114,"children":1115},{"style":535},[1116],{"type":183,"value":759},{"type":523,"tag":48,"props":1118,"children":1119},{"style":671},[1120],{"type":183,"value":1121}," Renderer-neutral geometry owner. *\u002F\n",{"type":523,"tag":48,"props":1123,"children":1125},{"class":50,"line":1124},29,[1126,1131,1135,1139],{"type":523,"tag":48,"props":1127,"children":1128},{"style":685},[1129],{"type":183,"value":1130},"  addLayoutProviders",{"type":523,"tag":48,"props":1132,"children":1133},{"style":541},[1134],{"type":183,"value":933},{"type":523,"tag":48,"props":1136,"children":1137},{"style":535},[1138],{"type":183,"value":938},{"type":523,"tag":48,"props":1140,"children":1141},{"style":541},[1142],{"type":183,"value":1143}," [noteLayout]; },\n",{"type":523,"tag":48,"props":1145,"children":1147},{"class":50,"line":1146},30,[1148,1152,1156],{"type":523,"tag":48,"props":1149,"children":1150},{"style":671},[1151],{"type":183,"value":910},{"type":523,"tag":48,"props":1153,"children":1154},{"style":535},[1155],{"type":183,"value":759},{"type":523,"tag":48,"props":1157,"children":1158},{"style":671},[1159],{"type":183,"value":1160}," Structured crossing semantics, independently of hit testing. *\u002F\n",{"type":523,"tag":48,"props":1162,"children":1164},{"class":50,"line":1163},31,[1165,1170,1174,1178],{"type":523,"tag":48,"props":1166,"children":1167},{"style":685},[1168],{"type":183,"value":1169},"  addSelectionAdapters",{"type":523,"tag":48,"props":1171,"children":1172},{"style":541},[1173],{"type":183,"value":933},{"type":523,"tag":48,"props":1175,"children":1176},{"style":535},[1177],{"type":183,"value":938},{"type":523,"tag":48,"props":1179,"children":1180},{"style":541},[1181],{"type":183,"value":1182}," [noteSelection]; },\n",{"type":523,"tag":48,"props":1184,"children":1186},{"class":50,"line":1185},32,[1187],{"type":523,"tag":48,"props":1188,"children":1189},{"style":541},[1190],{"type":183,"value":1191},"});\n",{"type":523,"tag":493,"props":1193,"children":1194},{},[1195],{"type":183,"value":1196},"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 .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 .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);}",1793045208528]