[{"data":1,"prerenderedAt":6851},["ShallowReactive",2],{"msfe-doc:\u002Fen\u002Fguide\u002Fmd-editor":3},{"id":4,"title":5,"body":6,"description":6838,"extension":6839,"keywords":6840,"locale":1822,"meta":6845,"navigation":326,"order":383,"path":6846,"section":6847,"seo":6848,"stem":6849,"__hash__":6850},"docs\u002Fguide\u002Fmd-editor.en.md","MD Editor component",{"type":7,"value":8,"toc":6799},"minimark",[9,14,28,39,43,87,90,102,127,131,134,137,140,151,154,223,230,297,300,446,454,457,462,465,472,560,570,574,577,588,592,610,906,928,935,980,991,995,1005,1088,1098,1116,1136,1140,1143,1146,1168,1172,1182,1189,1192,1199,1202,1227,1230,1287,1304,1308,1311,1322,1336,1343,1364,1375,1379,1730,1754,1758,1775,1790,1794,2179,2187,2238,2245,2390,2393,2455,2465,2659,2697,2701,2718,3060,3091,3095,3112,3533,3549,3570,3582,3599,3658,3684,3688,3724,3750,3754,3765,3867,3919,3953,3957,3960,4043,4046,4137,4148,4171,4175,4186,4235,4253,4257,4271,4274,4281,4324,4328,4331,4361,4364,4379,4388,4491,4532,4536,4539,4715,4725,4736,4740,4750,4757,4762,4765,4769,4787,4831,4838,4841,4848,4851,4854,4932,4964,5024,5028,5034,5082,5085,5093,5111,5154,5157,5161,5167,5302,5319,5328,5364,5371,5378,5385,5388,5391,5395,5404,5465,5468,5471,5483,5486,5600,5611,5618,5622,5663,5670,5674,5908,5941,5945,5957,6052,6068,6100,6104,6125,6146,6150,6182,6186,6197,6212,6233,6260,6279,6283,6286,6314,6319,6644,6659,6680,6715,6795],[10,11,13],"h2",{"id":12},"try-a-complete-document","Try a complete document",[15,16,17,22,23,27],"p",{},[18,19,21],"a",{"href":20},"\u002Fen\u002Fmd-editor","Open the standalone MD Editor example",". Edit one document, inspect its source,\nswitch to read-only mode, or capture a static ",[24,25,26],"code",{},"MdProse"," reading view. The example includes nested\ncontainers, disclosures, tasks, lists, quotes, code, tables, formulas, flowcharts, mind maps,\ndefinition lists and footnotes. Switching modes retains the editor,\nselection and undo history.",[15,29,30,33,34,38],{},[24,31,32],{},"@quirekit\u002Fmd-editor"," combines MSFE features with public QuireKit components. MSFE owns source,\ntransactions and parsing; Prose owns document styling. Use ",[18,35,37],{"href":36},"\u002Fen\u002Fguide\u002Fvue","Vue integration"," when\nyou want to assemble the entire interface yourself.",[10,40,42],{"id":41},"choose-the-saved-model-first","Choose the saved model first",[44,45,46,59],"table",{},[47,48,49],"thead",{},[50,51,52,56],"tr",{},[53,54,55],"th",{},"Need",[53,57,58],{},"Choice and boundary",[60,61,62,71,79],"tbody",{},[50,63,64,68],{},[65,66,67],"td",{},"README files, technical writing, Git review and portable Markdown",[65,69,70],{},"MD Editor keeps source authoritative; visual and source views share text and history",[50,72,73,76],{},[65,74,75],{},"Rich documents, visual blocks, richer tables and formatting",[65,77,78],{},"Block Editor uses a PM document and product interface; check delivered capabilities, and treat Markdown export as a conversion that can lose structure",[50,80,81,84],{},[65,82,83],{},"Custom schema, node views or an existing Tiptap ecosystem",[65,85,86],{},"Native Tiptap supplies the framework and extensions; the host assembles UI and services, and schema defines supported structures",[15,88,89],{},"GFM cells support bold, italic, strike, links and inline code. They cannot contain nested tables,\nlists, code blocks or multiple paragraphs, and do not express merged cells or arbitrary widths.\nInline styles can nest, but surrounding punctuation and text determine delimiter parsing.\nCode spans are literal. Unimplemented partial-style splitting is not a Markdown ban on combinations.",[15,91,92,93,97,98,101],{},"Visual format commands share ",[18,94,96],{"href":95},"\u002Fen\u002Fapi\u002Fcommands#semantic-format-commands","semantic validation",":\npreserve existing formats and prove the requested format, or refuse without changing source or adding spaces.\nCells permit inline formats while headings, lists and block insertion are disabled there.\nSource input remains free, including incomplete and custom syntax; unknown structures retain source fallback.\nExtensions need compatible readers. Saving only ",[24,99,100],{},".md"," does not include external comment or collaboration state.",[15,103,104,105,108,109,115,116,115,121,126],{},"The ",[18,106,107],{"href":20},"fixed default document"," contains the full comparison and editable examples.\nReferences: ",[18,110,114],{"href":111,"rel":112},"https:\u002F\u002Fgithub.github.com\u002Fgfm\u002F#tables-extension-",[113],"nofollow","GFM tables",",\n",[18,117,120],{"href":118,"rel":119},"https:\u002F\u002Fspec.commonmark.org\u002F0.31.2\u002F#emphasis-and-strong-emphasis",[113],"CommonMark emphasis",[18,122,125],{"href":123,"rel":124},"https:\u002F\u002Ftiptap.dev\u002Fdocs\u002Feditor\u002Fcore-concepts\u002Fschema",[113],"Tiptap schema",".",[10,128,130],{"id":129},"four-views","Four views",[15,132,133],{},"Desktop code language uses a compact dropdown with arrow-key navigation and label-prefix matching;\ntext style uses an anchored picker. Narrow code language retains a searchable bottom picker, while\ntext style joins the bottom formatting task. Existing custom languages remain available;\nchoosing Plain text clears the fence's language marker.\nA code language choice applies immediately and can be undone once; cancel preserves source.\nFormatting buttons also apply immediately, and closing the panel does not undo accepted settings. The narrow example\npage also uses a picker for document views, preserving selection and history when editing resumes.",[15,135,136],{},"Below 768px, the text column uses compact spacing and the bottom toolbar provides undo, redo,\ninsertion, text style, lists and import\u002Fexport. The dock uses the public Toolbar mobile mode without\nTooltips. Contextual table commands move into More only when they do not fit; More opens a bottom\naction surface. The insertion directory places common content before diagrams,\nstructure and text conversion, with prompts for search and parameter fields. Text formatting\noffers Select all and Select current block; the latter selects the nearest complete Markdown\nblock at the caret. Empty lines and incomplete fences do not offer block selection. Selecting a range\nchanges neither source nor history. Settings retain a static caret or range after previously focused\ntext loses focus. Document replacement and read-only\u002Flocked mode clear or hide the static caret.\nMobile live mode keeps disabled custom endpoints when the keyboard closes or the window loses focus;\ntapping an existing selection toggles actions without refocusing or reopening the keyboard.",[15,138,139],{},"The selection menu uses the public Toolbar for Copy, Cut, Paste and Select all, and closes after an action.\nPaste reads plain text from the system clipboard. If the browser denies access or the page uses LAN HTTP,\na paste panel opens: use the system Paste command in the Text to paste field, then choose Paste to replace the\noriginal selection. Cancel and empty text leave the document unchanged. Paste and Cut each take one undo\nstep. Changing the selection or document while a read is pending cancels that request.",[15,141,142,143,146,147,150],{},"On narrow touch devices, focusing editable text shows the public ",[24,144,145],{},"SelectionHandles"," caret grip.\nDrag it to move the caret. Holding text or the grip preserves an insertion point, without preselecting a word, until\nactual dragging extends a selection. After release, either endpoint\ncan be dragged across lines or past the other endpoint without changing its identity. Selection\nmovement does not add text undo entries. In mobile live mode, the rendered text is noneditable;\nan independent input proxy and shared ",[24,148,149],{},"@quirekit\u002Fime"," receive keyboard and composition input,\nwhile the product draws the caret and selection to avoid overlapping native menus and selection.\nPreedit appears temporarily in the document without changing source; confirmation commits one\nCodeMirror transaction with one undo step. The caret stays visible during composition, with dragging disabled.\nSource view, desktop, read-only state and embedded editors retain their own input behavior.\nMSFE\u002FCM always owns the document, logical selection, commands and history.\nHidden syntax and zero-height gaps accept only visible caret boundaries on either side. Tapping or dragging\nonto a table divider places the caret at an adjacent cell's text insertion point. Empty cells remain editable,\nand composition at a cell boundary stays inside the corresponding cell. Dragging at the\nusable viewport edge scrolls automatically and stops on release. When the keyboard reduces that viewport,\nthe caret and grip reveal above the dock. Already visible typing does not scroll repeatedly, and manual\nscrolling does not pull back to the previous position. The dock follows the\nvisual viewport without duplicating safe-area padding when obscured. The example editor route\ndisables pinch and keeps native input at least 16px to reduce focus zoom. Native iOS accessory bars\nand candidate windows still require physical-device verification.",[15,152,153],{},"MD Editor has four views. All of them edit and display the same Markdown source, with no format conversion in between:",[44,155,156,169],{},[47,157,158],{},[50,159,160,163,166],{},[53,161,162],{},"View",[53,164,165],{},"Setting",[53,167,168],{},"Behavior",[60,170,171,184,197,210],{},[50,172,173,176,181],{},[65,174,175],{},"Document (default)",[65,177,178],{},[24,179,180],{},"view=\"document\"",[65,182,183],{},"Recognized markers stay hidden while editing. Tables retain cells, code retains controls, and containers retain their nested structure",[50,185,186,189,194],{},[65,187,188],{},"Live preview",[65,190,191],{},[24,192,193],{},"view=\"preview\"",[65,195,196],{},"Paragraph or list-item markers reveal together. Active tables show structural source and selected cells show inline markers; container fences share the same indentation",[50,198,199,202,207],{},[65,200,201],{},"Source",[65,203,204],{},[24,205,206],{},"view=\"source\"",[65,208,209],{},"Inspect and edit all source",[50,211,212,215,220],{},[65,213,214],{},"Reading",[65,216,217],{},[24,218,219],{},"view=\"reading\"",[65,221,222],{},"Renders the current document with components; not editable. The editor stays mounted, so selection and history survive switching back",[15,224,225,226,229],{},"Read-only is ",[24,227,228],{},"readOnly"," over the first three views rather than a view of its own: it only stops input, so links,\nfolds and copying keep working, and it persists across view switches. All four views share Markdown,\nselection, history and Prose styling. The example lists all four views and a read-only switch; your host may offer\nany subset.",[231,232,237],"pre",{"className":233,"code":234,"language":235,"meta":236,"style":236},"language-vue shiki shiki-themes github-light github-light github-dark","\u003CMdEditor :markdown=\"initialMarkdown\" view=\"document\" locale=\"en\" \u002F>\n\u003C!-- Change to preview, source or reading to switch views without remounting. -->\n","vue","",[24,238,239,290],{"__ignoreMap":236},[240,241,244,248,252,255,259,262,266,269,271,274,276,279,282,284,287],"span",{"class":242,"line":243},"line",1,[240,245,247],{"class":246},"sVPnS","\u003C",[240,249,251],{"class":250},"su0ou","MdEditor",[240,253,254],{"class":246}," :",[240,256,258],{"class":257},"sgQzM","markdown",[240,260,261],{"class":246},"=",[240,263,265],{"class":264},"s-HEn","\"",[240,267,268],{"class":246},"initialMarkdown",[240,270,265],{"class":264},[240,272,273],{"class":257}," view",[240,275,261],{"class":246},[240,277,278],{"class":264},"\"document\"",[240,280,281],{"class":257}," locale",[240,283,261],{"class":246},[240,285,286],{"class":264},"\"en\"",[240,288,289],{"class":246}," \u002F>\n",[240,291,293],{"class":242,"line":292},2,[240,294,296],{"class":295},"sqmzS","\u003C!-- Change to preview, source or reading to switch views without remounting. -->\n",[15,298,299],{},"A framework-neutral instance has the three editable views (reading is rendered by the Vue component). Switch them\nwith the public methods:",[231,301,305],{"className":302,"code":303,"language":304,"meta":236,"style":236},"language-ts shiki shiki-themes github-light github-light github-dark","import { createMdEditor, getMdView, setMdView } from '@quirekit\u002Fmd-editor'\n\nconst editor = createMdEditor({ parent, markdown: '# Heading', view: 'document' })\nconst result = setMdView(editor, 'preview')\nif (!result.ok) console.error(result.reason)\nconsole.log(getMdView(editor)) \u002F\u002F Current view\nsetMdView(editor, 'source', true) \u002F\u002F The third argument sets read-only\n","ts",[24,306,307,322,328,359,381,402,423],{"__ignoreMap":236},[240,308,309,313,316,319],{"class":242,"line":243},[240,310,312],{"class":311},"sDD9d","import",[240,314,315],{"class":246}," { createMdEditor, getMdView, setMdView } ",[240,317,318],{"class":311},"from",[240,320,321],{"class":264}," '@quirekit\u002Fmd-editor'\n",[240,323,324],{"class":242,"line":292},[240,325,327],{"emptyLinePlaceholder":326},true,"\n",[240,329,331,334,338,341,344,347,350,353,356],{"class":242,"line":330},3,[240,332,333],{"class":311},"const",[240,335,337],{"class":336},"sUNQB"," editor",[240,339,340],{"class":311}," =",[240,342,343],{"class":257}," createMdEditor",[240,345,346],{"class":246},"({ parent, markdown: ",[240,348,349],{"class":264},"'# Heading'",[240,351,352],{"class":246},", view: ",[240,354,355],{"class":264},"'document'",[240,357,358],{"class":246}," })\n",[240,360,362,364,367,369,372,375,378],{"class":242,"line":361},4,[240,363,333],{"class":311},[240,365,366],{"class":336}," result",[240,368,340],{"class":311},[240,370,371],{"class":257}," setMdView",[240,373,374],{"class":246},"(editor, ",[240,376,377],{"class":264},"'preview'",[240,379,380],{"class":246},")\n",[240,382,384,387,390,393,396,399],{"class":242,"line":383},5,[240,385,386],{"class":311},"if",[240,388,389],{"class":246}," (",[240,391,392],{"class":311},"!",[240,394,395],{"class":246},"result.ok) console.",[240,397,398],{"class":257},"error",[240,400,401],{"class":246},"(result.reason)\n",[240,403,405,408,411,414,417,420],{"class":242,"line":404},6,[240,406,407],{"class":246},"console.",[240,409,410],{"class":257},"log",[240,412,413],{"class":246},"(",[240,415,416],{"class":257},"getMdView",[240,418,419],{"class":246},"(editor)) ",[240,421,422],{"class":295},"\u002F\u002F Current view\n",[240,424,426,429,431,434,437,440,443],{"class":242,"line":425},7,[240,427,428],{"class":257},"setMdView",[240,430,374],{"class":246},[240,432,433],{"class":264},"'source'",[240,435,436],{"class":246},", ",[240,438,439],{"class":336},"true",[240,441,442],{"class":246},") ",[240,444,445],{"class":295},"\u002F\u002F The third argument sets read-only\n",[15,447,448,449,453],{},"Switching does not mutate source or enter undo history. Requests defer during pointer selection\nand composition to preserve the input DOM. Hidden markers participate in native atomic navigation;\nEnter continues lists, and Backspace at a list start can remove its marker. Unknown or unfinished\nsyntax stays editable source. Custom projections follow the ",[18,450,452],{"href":451},"\u002Fen\u002Fapi\u002Frendering#source-reveal","source reveal contract",".\nThis does not automatically give every Markdown plugin an editable document UI: complex nodes\nstill require explicit projections, commands and fallback behavior.",[15,455,456],{},"Live preview reveals semantic owners together: a multi-line paragraph shows its bold,\nemphasis, link and inline-code spelling as one unit. A task item's list marker and checkbox\nsource appear together, while sibling items stay rendered. Nested lists resolve each item\nindependently, and container paragraphs retain local inline activation. An active table shows\nits pipes and delimiter row, but only selected cells reveal inline markers. IME preedit follows\nthe same ownership; unrelated headings, tables, code, math and diagrams remain projected.",[458,459,461],"h3",{"id":460},"enter-and-writing-after-blocks","Enter and writing after blocks",[15,463,464],{},"A soft rounded background identifies the paragraph, list or quote containing the caret. Inside a\ncontainer it follows the inner block. This passive hint does not change source, add spacing or intercept\nthe pointer. Source view, read-only state and Reading view do not show it.",[15,466,467,468,471],{},"Both editing experiences preserve newly created empty paragraphs. Compressed structural separators\nbetween blocks do not accept the text caret; navigation lands in neighboring real content. Source\nmode can edit those lines, and returning to editing classifies the result from the new syntax.\nIn paragraphs and ATX headings, including paragraphs inside nested\ncontainers, ",[24,469,470],{},"Enter"," inserts a Markdown paragraph separator, splitting the paragraph when used\nin the middle. Empty documents, repeated Enter, and\nexiting an empty list item remain editable. Prose still owns structural spacing; these edits do\nnot serialize the whole document.",[44,473,474,483],{},[47,475,476],{},[50,477,478,481],{},[53,479,480],{},"Position or key",[53,482,168],{},[60,484,485,495,505,515,533,546],{},[50,486,487,492],{},[65,488,489,491],{},[24,490,470],{}," in a paragraph or ATX heading",[65,493,494],{},"Split at the caret or start a paragraph at the end; text after a heading uses the body style",[50,496,497,502],{},[65,498,499,501],{},[24,500,470],{}," in a list or quote",[65,503,504],{},"Continue the current marker; an empty list item or quote line immediately exits one level, retaining a paragraph separator when returning to body text",[50,506,507,512],{},[65,508,509,511],{},[24,510,470],{}," in code content",[65,513,514],{},"Add a line inside the code block",[50,516,517,522],{},[65,518,519,521],{},[24,520,470],{}," in a document-editing table cell",[65,523,524,525,528,529,532],{},"Insert a row after the current row, retaining columns and alignment; ",[24,526,527],{},"Tab"," \u002F ",[24,530,531],{},"Shift+Tab"," still navigate cells",[50,534,535,543],{},[65,536,537,528,540],{},[24,538,539],{},"Cmd+Enter",[24,541,542],{},"Ctrl+Enter",[65,544,545],{},"Start a paragraph after the current code block, container, table, list or quote; nested blocks retain outer quote and list indentation",[50,547,548,554],{},[65,549,550,553],{},[24,551,552],{},"Shift+Enter"," in prose",[65,555,556,557],{},"Insert a Markdown hard break using two trailing spaces and a newline; preserve outer list indentation and quote prefixes without inserting ",[24,558,559],{},"\u003Cbr>",[15,561,562,563,566,567,569],{},"These paragraph rules apply to both ",[24,564,565],{},"document"," and ",[24,568,258],{},"; source mode keeps native source input.\nAt a quote's end, the first Enter immediately shows an editable blank line inside the quote. A second Enter exits the current quote level; nested quotes exit one level at a time.\nCode content keeps literal newlines, and Markdown-editing tables keep source operations. At a\nSetext heading's end, the new paragraph starts after its underline. Paragraph insertion is individually undoable, and\nthe same editor continues to own read-only and composition state.",[10,571,573],{"id":572},"caret-and-editing-boundaries","Caret and editing boundaries",[15,575,576],{},"In document mode, the text caret enters editable content. Features declare the complete source\nrange and its editable interior; the shared runtime uses them for arrows, Home\u002FEnd, clicks,\nselection drags, deletion and replacement across boundaries. Every position is a Markdown source\noffset. Hidden markers and compressed gaps do not introduce another line numbering system or document.",[15,578,579,580,583,584,126],{},"Inline code retains separate outside and inside insertion positions by default. Bold, emphasis\nand highlights enter their content directly. Code fences and language metadata are protected,\nwhile the code body stays editable. Partial cross-block deletion retains the shell; selecting a\ncomplete block allows its removal. Projected block components such as properties and diagrams\nare whole objects: deletion at an edge first selects the object. Enter, explicit line breaks and\nblock exit still use ",[24,581,582],{},"addBlockInput()","; see ",[18,585,587],{"href":586},"\u002Fen\u002Fapi\u002Fcommands#block-owned-enter","Block-owned Enter",[458,589,591],{"id":590},"override-product-defaults","Override product defaults",[15,593,594,597,598,601,602,605,606,609],{},[24,595,596],{},"editingBoundaries"," overrides rules by parser node name. This example makes inline code enter its\ncontent directly. Set ",[24,599,600],{},"navigation"," to ",[24,603,604],{},"split"," to restore separate outside and inside stops.\nPrepare the host's ",[24,607,608],{},"#editor"," element before mounting.",[231,611,613],{"className":302,"code":612,"language":304,"meta":236,"style":236},"import type { EditingBoundaryRule } from '@quirekit\u002Fmsfe-core'\nimport { createMdEditor } from '@quirekit\u002Fmd-editor'\n\nconst inlineCodeRule: EditingBoundaryRule = {\n  nodes: ['InlineCode'],\n  \u002F** @param context - Confirmed syntax. @returns Paired markers and editable content, or null when unclosed. *\u002F\n  resolve({ node }) {\n    const [opening, closing] = node.getChildren('CodeMark')\n    if (!opening || !closing) return null\n    return {\n      from: node.from, to: node.to,\n      contentFrom: opening.to, contentTo: closing.from,\n      kind: 'style', navigation: 'content', deletion: 'unwrap',\n    }\n  },\n}\n\nconst editor = createMdEditor({\n  parent: document.getElementById('editor')!,\n  markdown: 'Text `code` text',\n  view: 'document',\n  editingBoundaries: [inlineCodeRule],\n})\n",[24,614,615,630,641,645,663,674,694,709,744,772,780,786,792,815,821,827,833,838,852,873,884,894,900],{"__ignoreMap":236},[240,616,617,619,622,625,627],{"class":242,"line":243},[240,618,312],{"class":311},[240,620,621],{"class":311}," type",[240,623,624],{"class":246}," { EditingBoundaryRule } ",[240,626,318],{"class":311},[240,628,629],{"class":264}," '@quirekit\u002Fmsfe-core'\n",[240,631,632,634,637,639],{"class":242,"line":292},[240,633,312],{"class":311},[240,635,636],{"class":246}," { createMdEditor } ",[240,638,318],{"class":311},[240,640,321],{"class":264},[240,642,643],{"class":242,"line":330},[240,644,327],{"emptyLinePlaceholder":326},[240,646,647,649,652,655,658,660],{"class":242,"line":361},[240,648,333],{"class":311},[240,650,651],{"class":336}," inlineCodeRule",[240,653,654],{"class":311},":",[240,656,657],{"class":257}," EditingBoundaryRule",[240,659,340],{"class":311},[240,661,662],{"class":246}," {\n",[240,664,665,668,671],{"class":242,"line":383},[240,666,667],{"class":246},"  nodes: [",[240,669,670],{"class":264},"'InlineCode'",[240,672,673],{"class":246},"],\n",[240,675,676,679,682,685,688,691],{"class":242,"line":404},[240,677,678],{"class":295},"  \u002F** ",[240,680,681],{"class":311},"@param",[240,683,684],{"class":246}," context",[240,686,687],{"class":295}," - Confirmed syntax. ",[240,689,690],{"class":311},"@returns",[240,692,693],{"class":295}," Paired markers and editable content, or null when unclosed. *\u002F\n",[240,695,696,699,702,706],{"class":242,"line":425},[240,697,698],{"class":257},"  resolve",[240,700,701],{"class":246},"({ ",[240,703,705],{"class":704},"sde8i","node",[240,707,708],{"class":246}," }) {\n",[240,710,712,715,718,721,723,726,729,731,734,737,739,742],{"class":242,"line":711},8,[240,713,714],{"class":311},"    const",[240,716,717],{"class":246}," [",[240,719,720],{"class":336},"opening",[240,722,436],{"class":246},[240,724,725],{"class":336},"closing",[240,727,728],{"class":246},"] ",[240,730,261],{"class":311},[240,732,733],{"class":246}," node.",[240,735,736],{"class":257},"getChildren",[240,738,413],{"class":246},[240,740,741],{"class":264},"'CodeMark'",[240,743,380],{"class":246},[240,745,747,750,752,754,757,760,763,766,769],{"class":242,"line":746},9,[240,748,749],{"class":311},"    if",[240,751,389],{"class":246},[240,753,392],{"class":311},[240,755,756],{"class":246},"opening ",[240,758,759],{"class":311},"||",[240,761,762],{"class":311}," !",[240,764,765],{"class":246},"closing) ",[240,767,768],{"class":311},"return",[240,770,771],{"class":336}," null\n",[240,773,775,778],{"class":242,"line":774},10,[240,776,777],{"class":311},"    return",[240,779,662],{"class":246},[240,781,783],{"class":242,"line":782},11,[240,784,785],{"class":246},"      from: node.from, to: node.to,\n",[240,787,789],{"class":242,"line":788},12,[240,790,791],{"class":246},"      contentFrom: opening.to, contentTo: closing.from,\n",[240,793,795,798,801,804,807,810,813],{"class":242,"line":794},13,[240,796,797],{"class":246},"      kind: ",[240,799,800],{"class":264},"'style'",[240,802,803],{"class":246},", navigation: ",[240,805,806],{"class":264},"'content'",[240,808,809],{"class":246},", deletion: ",[240,811,812],{"class":264},"'unwrap'",[240,814,115],{"class":246},[240,816,818],{"class":242,"line":817},14,[240,819,820],{"class":246},"    }\n",[240,822,824],{"class":242,"line":823},15,[240,825,826],{"class":246},"  },\n",[240,828,830],{"class":242,"line":829},16,[240,831,832],{"class":246},"}\n",[240,834,836],{"class":242,"line":835},17,[240,837,327],{"emptyLinePlaceholder":326},[240,839,841,843,845,847,849],{"class":242,"line":840},18,[240,842,333],{"class":311},[240,844,337],{"class":336},[240,846,340],{"class":311},[240,848,343],{"class":257},[240,850,851],{"class":246},"({\n",[240,853,855,858,861,863,866,869,871],{"class":242,"line":854},19,[240,856,857],{"class":246},"  parent: document.",[240,859,860],{"class":257},"getElementById",[240,862,413],{"class":246},[240,864,865],{"class":264},"'editor'",[240,867,868],{"class":246},")",[240,870,392],{"class":311},[240,872,115],{"class":246},[240,874,876,879,882],{"class":242,"line":875},20,[240,877,878],{"class":246},"  markdown: ",[240,880,881],{"class":264},"'Text `code` text'",[240,883,115],{"class":246},[240,885,887,890,892],{"class":242,"line":886},21,[240,888,889],{"class":246},"  view: ",[240,891,355],{"class":264},[240,893,115],{"class":246},[240,895,897],{"class":242,"line":896},22,[240,898,899],{"class":246},"  editingBoundaries: [inlineCodeRule],\n",[240,901,903],{"class":242,"line":902},23,[240,904,905],{"class":246},"})\n",[15,907,908,911,912,915,916,919,920,923,924,927],{},[24,909,910],{},"nodes"," names parser nodes. ",[24,913,914],{},"from\u002Fto"," includes the backticks and text, while\n",[24,917,918],{},"contentFrom\u002FcontentTo"," covers only the code content. ",[24,921,922],{},"deletion: 'unwrap'"," removes paired markers\nat the relevant edge. The query does not dispatch transactions or change caret pixels.\nCall ",[24,925,926],{},"editor.destroy()"," when the host leaves.",[15,929,930,931,934],{},"Vue takes the same ",[24,932,933],{},"inlineCodeRule"," through the component prop:",[231,936,938],{"className":233,"code":937,"language":235,"meta":236,"style":236},"\u003CMdEditor :markdown=\"initialMarkdown\" :editing-boundaries=\"[inlineCodeRule]\" locale=\"en\" \u002F>\n",[24,939,940],{"__ignoreMap":236},[240,941,942,944,946,948,950,952,954,956,958,960,963,965,967,970,972,974,976,978],{"class":242,"line":243},[240,943,247],{"class":246},[240,945,251],{"class":250},[240,947,254],{"class":246},[240,949,258],{"class":257},[240,951,261],{"class":246},[240,953,265],{"class":264},[240,955,268],{"class":246},[240,957,265],{"class":264},[240,959,254],{"class":246},[240,961,962],{"class":257},"editing-boundaries",[240,964,261],{"class":246},[240,966,265],{"class":264},[240,968,969],{"class":246},"[inlineCodeRule]",[240,971,265],{"class":264},[240,973,281],{"class":257},[240,975,261],{"class":246},[240,977,286],{"class":264},[240,979,289],{"class":246},[15,981,982,983,986,987,990],{},"Rules are read on creation\u002Fmount. Recreate the instance when changing the rule set and preserve\nthe required document in the host. ",[24,984,985],{},"editingBoundaries: []"," adds no host overrides, so built-in\nrules remain active. The first rule at the highest priority owns each node. Returning ",[24,988,989],{},"null","\nopts that syntax owner out without falling back to its default rule. Projected components retain\ntheir independent whole-object protection.",[458,992,994],{"id":993},"declare-rules-in-a-feature","Declare rules in a feature",[15,996,997,998,1001,1002,654],{},"Rules belonging to a feature go in ",[24,999,1000],{},"addEditingBoundaries()",". For the existing inline-code grammar,\nreuse the rule above in an extension and install it through ",[24,1003,1004],{},"extensions: [InlineCodeBoundaries]",[231,1006,1008],{"className":302,"code":1007,"language":304,"meta":236,"style":236},"import { Extension } from '@quirekit\u002Fmsfe-core'\n\nconst InlineCodeBoundaries = Extension.create({\n  name: 'inline-code-boundaries',\n  priority: 1000,\n  \u002F** @returns Syntax ranges shared by navigation, selection and editing. *\u002F\n  addEditingBoundaries() { return [inlineCodeRule] },\n})\n",[24,1009,1010,1021,1025,1042,1052,1062,1071,1084],{"__ignoreMap":236},[240,1011,1012,1014,1017,1019],{"class":242,"line":243},[240,1013,312],{"class":311},[240,1015,1016],{"class":246}," { Extension } ",[240,1018,318],{"class":311},[240,1020,629],{"class":264},[240,1022,1023],{"class":242,"line":292},[240,1024,327],{"emptyLinePlaceholder":326},[240,1026,1027,1029,1032,1034,1037,1040],{"class":242,"line":330},[240,1028,333],{"class":311},[240,1030,1031],{"class":336}," InlineCodeBoundaries",[240,1033,340],{"class":311},[240,1035,1036],{"class":246}," Extension.",[240,1038,1039],{"class":257},"create",[240,1041,851],{"class":246},[240,1043,1044,1047,1050],{"class":242,"line":361},[240,1045,1046],{"class":246},"  name: ",[240,1048,1049],{"class":264},"'inline-code-boundaries'",[240,1051,115],{"class":246},[240,1053,1054,1057,1060],{"class":242,"line":383},[240,1055,1056],{"class":246},"  priority: ",[240,1058,1059],{"class":336},"1000",[240,1061,115],{"class":246},[240,1063,1064,1066,1068],{"class":242,"line":404},[240,1065,678],{"class":295},[240,1067,690],{"class":311},[240,1069,1070],{"class":295}," Syntax ranges shared by navigation, selection and editing. *\u002F\n",[240,1072,1073,1076,1079,1081],{"class":242,"line":425},[240,1074,1075],{"class":257},"  addEditingBoundaries",[240,1077,1078],{"class":246},"() { ",[240,1080,768],{"class":311},[240,1082,1083],{"class":246}," [inlineCodeRule] },\n",[240,1085,1086],{"class":242,"line":711},[240,1087,905],{"class":246},[15,1089,1090,1091,1093,1094,1097],{},"With feature installation, let the extension own the rule and reserve the product's\n",[24,1092,596],{}," for host overrides. Existing features can return rules in their own hook or\ncombine parent rules through ",[24,1095,1096],{},".extend()",". Put overrides before parent rules for the same node.\nThe hook only describes boundaries: a new syntax still needs parsing and projection registration.",[15,1099,1100,1103,1104,1107,1108,1111,1112,1115],{},[24,1101,1102],{},"when"," defaults to ",[24,1105,1106],{},"hidden",", enabling the rule when presentation hides syntax globally. ",[24,1109,1110],{},"prose","\nalso queries rules in Live preview; use ",[24,1113,1114],{},"isSourceRevealed(state, node)"," to check whether that\nparticular structure is already revealed. Source view disables boundary constraints. If text is\nentered on a source separator, returning to document mode classifies it as content from the new syntax.",[15,1117,1118,1119,1122,1123,1126,1127,1130,1131,1135],{},"Currently ",[24,1120,1121],{},"navigation: 'native'"," opts out of the entire syntax boundary rule. Use\n",[24,1124,1125],{},"deletion: 'native'"," to delegate editing while retaining navigation constraints. The older\n",[24,1128,1129],{},"inlineBoundaries"," option uses the same runtime and replaces only its original inline rule list.\nSee ",[18,1132,1134],{"href":1133},"\u002Fen\u002Fapi\u002Fcommands#editing-boundaries","Editing boundaries"," for the six kinds, complete fields\nand advanced CM integration.",[10,1137,1139],{"id":1138},"heading-folding","Heading folding",[15,1141,1142],{},"Headings with section content have a disclosure arrow outside the text column, without reducing title width.\nExpanded sections show it on hover or keyboard focus; collapsed sections and touch devices keep it visible. Collapsing keeps the title and\nhides content up to the next heading of equal or higher rank. Reopening a parent preserves each child\nheading's fold choice. ATX and Setext headings are supported; sections inside containers, quotes or list\nitems stay within that container.",[15,1144,1145],{},"Document view, Live preview, read-only and Source view share the same fold state. Folding does\nnot modify Markdown or add text undo entries. Finding hidden content reveals it; a heading-level change\nthat invalidates an existing range also unfolds it. Fold choices are not saved in the file and reset on\nreload or document replacement. Static Reading view continues to show the full document.",[15,1147,1148,1149,1152,1153,1156,1157,566,1160,1163,1164,1167],{},"The capability belongs to ",[24,1150,1151],{},"@quirekit\u002Fmsfe-heading",". Base MSFE integrations can use\n",[24,1154,1155],{},"Heading.configure({ folding: false })"," to disable heading controls and section validation while keeping\nCodeMirror's existing source folding. Hosts can supply ",[24,1158,1159],{},"controls",[24,1161,1162],{},"toggleLabel"," for their own components\nand labels; MD Editor uses the public ",[24,1165,1166],{},"QuireIconButton"," and shared icons by default.",[10,1169,1171],{"id":1170},"block-handles-and-menus","Block handles and menus",[15,1173,1174,1175,528,1178,1181],{},"Hover a block to reveal a neutral gray, bordered type-and-grip button outside the heading disclosure arrow. Click to open actions,\nor press ",[24,1176,1177],{},"Cmd+Alt+B",[24,1179,1180],{},"Ctrl+Alt+B"," in the document. The menu uses public QuireKit components\nfor paragraph, heading and list conversion, adjacent insertion, copying Markdown, cutting,\nduplication and deletion. Only valid conversions appear: lists offer list-type changes, while code,\ntables and formulas omit the conversion section to preserve their structure.\nNarrow touch devices hide the desktop hover grip while keeping insertion in the toolbar;\nan already open block menu retains its anchor.",[15,1183,1184,1185,1188],{},"Adjacent insertion groups all installed headings, Markdown blocks, formulas, flowcharts, mind maps,\nwhiteboards, text diagrams, dates, emoji and host contacts inside the public ",[24,1186,1187],{},"QuireScrollArea",".\nImages, links, formulas and diagrams open their parameter editor first and insert once before or after\nthe captured block on confirmation. Cancellation leaves no blank block. Changes to the original block,\ndocument replacement or read-only permissions reject obsolete submissions.",[15,1190,1191],{},"The default document includes a project delivery flowchart, project plan mind map and idea whiteboard,\nwith complete editable data and PNG previews saved from that same data. Double-click to continue\nediting. The text diagram section also includes a PlantUML sequence and a Graphviz \u002F DOT delivery\ngraph; like formulas, a click selects them and a double-click opens the editor, with preview and SVG download in the action bar. Reading view shows the same document.",[15,1193,1194,1195,1198],{},"“Flowchart”, “Mind map” and “Whiteboard” open the shared Flow Editor, Mind Editor and Whiteboard Editor.\n“Text diagram” opens the shared source workbench with Mermaid, PlantUML and Graphviz \u002F DOT.\nMermaid flowcharts, mind maps, sequence diagrams and others are written from templates in Text diagram\nand saved as Mermaid code blocks. Flowcharts and mind maps edited by dragging retain their own editable data.\nThe toolbar, empty-line plus and ",[24,1196,1197],{},"\u002F"," menu share these entries, with diagrams grouped before paragraph blocks.\nClicking a flowchart, mind map or whiteboard selects it and shows an action bar to edit, preview, download\nthe PNG, copy, cut or delete it; whiteboards can also be renamed. Press Delete to remove the selection or Esc to release it.\nPreview gathers the document's images and these diagrams into one gallery in document order, so you can page between them.",[15,1200,1201],{},"Focusing or hovering an editable empty line shows a gray outlined plus on its left. It opens the same\ninsertion catalog directly. Selecting content replaces that line while retaining required paragraph\nseparators, with one undo step. Cancelling the menu or parameter editor leaves the source unchanged.\nWhitespace inside code, formulas or lists is not a standalone insertion point; containers with declared\nchild flows support insertion on their empty lines.",[15,1203,1204,1205,1207,1208,436,1211,1214,1215,1218,1219,1222,1223,1226],{},"Type ",[24,1206,1197],{}," in an empty paragraph to open the same catalog, then search by localized name, English alias,\nor Chinese pinyin initials: ",[24,1209,1210],{},"\u002Ftable",[24,1212,1213],{},"\u002Fbg",", and ",[24,1216,1217],{},"\u002Fh2"," are examples. Use Up\u002FDown to select,\nEnter to insert, and Escape to close while keeping the literal query. Images, formulas and other\nparameterized entries reuse the existing editors: cancellation keeps ",[24,1220,1221],{},"\u002Fquery",", and one undo after\nconfirmation restores it. Native editing focus stays in the document, including Chinese input.\nOrdinary prose, URLs, code, quotes and list interiors do not trigger the menu.\nThis entry is independent of block handles and enabled by default; ",[24,1224,1225],{},":slash-menu=\"false\""," disables it dynamically.",[15,1228,1229],{},"Dragging displays a source summary and insertion line; release moves the source in one undo step.\nLists, quotes, code, tables, formulas and containers move as complete blocks. Direct children of\na container can move within that same container. Cross-container moves and individual list-item\ndragging are currently excluded; insertions that would break the outer fence are unavailable.\nEscape or loss of window focus cancels a drag. A source change closes obsolete menus.\nSource view, read-only state and Reading view hide the controls. Click inline formulas directly\nto edit them; they no longer have an extra pencil button.",[15,1231,1232,1233,1236,1237,1240,1241,1244,1245,1248,1249,566,1252,1255,1256,1259,1260,1263,1264,1267,1268,1271,1272,1275,1276,1278,1279,566,1283,126],{},"Vue enables the controls by default; pass ",[24,1234,1235],{},":block-controls=\"false\""," at mount to disable them.\nCustom hosts can use ",[24,1238,1239],{},"createSourceBlockControls"," from ",[24,1242,1243],{},"@quirekit\u002Fmsfe-core"," for current block,\nclient-space geometry, drag state and revision-guarded command targets, while rendering their own UI.\nCustom nested syntax declares child flows through ",[24,1246,1247],{},"sourceBlockScopes",".\nOptional ",[24,1250,1251],{},"insertionChange",[24,1253,1254],{},"openInsertionMenu"," callbacks provide ",[24,1257,1258],{},"SourceInsertionControls"," for empty\nlines. ",[24,1261,1262],{},"sourceBlankLineAt"," queries the current position and ",[24,1265,1266],{},"insertAtSourceBlankLine"," performs guarded\ninsertion without inventing a syntax block.\n",[24,1269,1270],{},"rect"," covers the complete block; ",[24,1273,1274],{},"firstLine"," describes its first visible native text row so controls\ncan align with the first row of a wrapped heading. Opaque block widgets return ",[24,1277,989],{},", allowing the host\nto fall back to the block's top edge.\nSee ",[18,1280,1282],{"href":1281},"\u002Fen\u002Fapi\u002Frendering#block-controls","block controls",[18,1284,1286],{"href":1285},"\u002Fen\u002Fapi\u002Fcommands#source-block-commands","source block commands",[15,1288,1289,1290,1292,1293,1240,1296,1299,1300,1303],{},"Each ",[24,1291,251],{}," owns a document overlay for block controls, block menus, mentions and toolbar insertion\npanels. Descendant components can call ",[24,1294,1295],{},"useMdOverlayTarget()",[24,1297,1298],{},"@quirekit\u002Fmd-editor\u002Fvue"," and pass the\nreturned readonly ref to the public Menu's ",[24,1301,1302],{},"portalTarget","; submenus inherit the same target. Menu still\nowns positioning, viewport constraints and dismissal, while modal editors use the public Dialog.\nThis API supplies the mounting container, not block commands or context-menu business behavior.",[10,1305,1307],{"id":1306},"dependencies-and-host-setup","Dependencies and host setup",[15,1309,1310],{},"Use workspace packages or locally built artifacts. A stable public npm release is not promised yet.",[231,1312,1316],{"className":1313,"code":1314,"language":1315,"meta":236,"style":236},"language-sh shiki shiki-themes github-light github-light github-dark","pnpm add '@quirekit\u002Fmd-editor@workspace:*' '@quirekit\u002Fui@workspace:*' '@quirekit\u002Funocss-preset@workspace:*'\n","sh",[24,1317,1318],{"__ignoreMap":236},[240,1319,1320],{"class":242,"line":243},[240,1321,1314],{},[15,1323,1324,1325,1329,1330,1332,1333,126],{},"Reuse the application's QuireKit theme, icon provider and UnoCSS or standalone stylesheet.\nThe product does not ship a second document skin. See ",[18,1326,1328],{"href":1327},"\u002Fen\u002Fcustomization\u002Ftheme","UI and themes",".\nMount ",[24,1331,251],{}," on the client in SSR applications, for example inside Nuxt's ",[24,1334,1335],{},"ClientOnly",[15,1337,1338,1339,1342],{},"Also import ",[24,1340,1341],{},"@quirekit\u002Fmd-editor\u002Fstyles.css"," from the built package. This stylesheet owns toolbar\nand document layout only; public Prose styles still own document typography and block appearance.",[15,1344,1345,1346,566,1349,1352,1353,1356,1357,1359,1360,1363],{},"The editor uses source-maintained ",[24,1347,1348],{},"@quirekit\u002Fcm-*",[24,1350,1351],{},"@quirekit\u002Flezer-markdown"," packages.\nBlock-gap measurement, retired view cleanup and syntax-reuse observations ship in their builds;\nconsumers do not need separate CodeMirror\u002FLezer installation patches. Each package includes\n",[24,1354,1355],{},"UPSTREAM.json"," with the upstream version, commit and local differences, plus the original MIT license.\nNative CodeMirror extensions must import from the same ",[24,1358,1348],{}," family. Adapt third-party\nextensions that depend on official ",[24,1361,1362],{},"@codemirror\u002F*"," packages before using them, so one editor never\nmixes different State, View or Facet identities.",[15,1365,1366,1367,1370,1371,1374],{},"Mermaid uses ",[24,1368,1369],{},"mermaid@12.1.0"," with ",[24,1372,1373],{},"patches\u002Fmermaid@12.1.0.patch"," to correct shifted mind-map\nnode labels in SVG-text mode. Editing, reading and Word image export share this fix. External\nconsumers still need this Mermaid patch; it targets the default ESM entry, not standalone browser scripts.",[10,1376,1378],{"id":1377},"mount-edit-and-save","Mount, edit and save",[231,1380,1382],{"className":233,"code":1381,"language":235,"meta":236,"style":236},"\u003Cscript setup lang=\"ts\">\nimport { shallowRef, ref } from 'vue'\nimport { MdEditor, type MdEditorInstance } from '@quirekit\u002Fmd-editor\u002Fvue'\nimport '@quirekit\u002Fmd-editor\u002Fstyles.css'\nimport { QuireButton } from '@quirekit\u002Fui\u002Fvue'\nconst product = shallowRef\u003CMdEditorInstance | null>(null)\nconst dirty = ref(false)\nconst initialMarkdown = '# Release plan\\n\\n- [ ] Verify the current version\\n'\n\nfunction save() {\n  const editor = product.value?.editor\n  if (!editor) return\n  const markdown = editor.getMarkdown()\n  \u002F\u002F Pass markdown to your persistence layer; clear dirty after success.\n  console.log(markdown)\n}\n\u003C\u002Fscript>\n\u003Ctemplate>\n  \u003CMdEditor ref=\"product\" :markdown=\"initialMarkdown\" locale=\"en\" @change=\"dirty = true\" \u002F>\n  \u003CQuireButton :disabled=\"!dirty\" @click=\"save\">Save\u003C\u002FQuireButton>\n\u003C\u002Ftemplate>\n",[24,1383,1384,1405,1417,1435,1442,1454,1484,1503,1527,1531,1542,1554,1569,1587,1592,1602,1606,1615,1624,1678,1722],{"__ignoreMap":236},[240,1385,1386,1388,1391,1394,1397,1399,1402],{"class":242,"line":243},[240,1387,247],{"class":246},[240,1389,1390],{"class":250},"script",[240,1392,1393],{"class":257}," setup",[240,1395,1396],{"class":257}," lang",[240,1398,261],{"class":246},[240,1400,1401],{"class":264},"\"ts\"",[240,1403,1404],{"class":246},">\n",[240,1406,1407,1409,1412,1414],{"class":242,"line":292},[240,1408,312],{"class":311},[240,1410,1411],{"class":246}," { shallowRef, ref } ",[240,1413,318],{"class":311},[240,1415,1416],{"class":264}," 'vue'\n",[240,1418,1419,1421,1424,1427,1430,1432],{"class":242,"line":330},[240,1420,312],{"class":311},[240,1422,1423],{"class":246}," { MdEditor, ",[240,1425,1426],{"class":311},"type",[240,1428,1429],{"class":246}," MdEditorInstance } ",[240,1431,318],{"class":311},[240,1433,1434],{"class":264}," '@quirekit\u002Fmd-editor\u002Fvue'\n",[240,1436,1437,1439],{"class":242,"line":361},[240,1438,312],{"class":311},[240,1440,1441],{"class":264}," '@quirekit\u002Fmd-editor\u002Fstyles.css'\n",[240,1443,1444,1446,1449,1451],{"class":242,"line":383},[240,1445,312],{"class":311},[240,1447,1448],{"class":246}," { QuireButton } ",[240,1450,318],{"class":311},[240,1452,1453],{"class":264}," '@quirekit\u002Fui\u002Fvue'\n",[240,1455,1456,1458,1461,1463,1466,1468,1471,1474,1477,1480,1482],{"class":242,"line":404},[240,1457,333],{"class":311},[240,1459,1460],{"class":336}," product",[240,1462,340],{"class":311},[240,1464,1465],{"class":257}," shallowRef",[240,1467,247],{"class":246},[240,1469,1470],{"class":257},"MdEditorInstance",[240,1472,1473],{"class":311}," |",[240,1475,1476],{"class":336}," null",[240,1478,1479],{"class":246},">(",[240,1481,989],{"class":336},[240,1483,380],{"class":246},[240,1485,1486,1488,1491,1493,1496,1498,1501],{"class":242,"line":425},[240,1487,333],{"class":311},[240,1489,1490],{"class":336}," dirty",[240,1492,340],{"class":311},[240,1494,1495],{"class":257}," ref",[240,1497,413],{"class":246},[240,1499,1500],{"class":336},"false",[240,1502,380],{"class":246},[240,1504,1505,1507,1510,1512,1515,1518,1521,1524],{"class":242,"line":711},[240,1506,333],{"class":311},[240,1508,1509],{"class":336}," initialMarkdown",[240,1511,340],{"class":311},[240,1513,1514],{"class":264}," '# Release plan",[240,1516,1517],{"class":336},"\\n\\n",[240,1519,1520],{"class":264},"- [ ] Verify the current version",[240,1522,1523],{"class":336},"\\n",[240,1525,1526],{"class":264},"'\n",[240,1528,1529],{"class":242,"line":746},[240,1530,327],{"emptyLinePlaceholder":326},[240,1532,1533,1536,1539],{"class":242,"line":774},[240,1534,1535],{"class":311},"function",[240,1537,1538],{"class":257}," save",[240,1540,1541],{"class":246},"() {\n",[240,1543,1544,1547,1549,1551],{"class":242,"line":782},[240,1545,1546],{"class":311},"  const",[240,1548,337],{"class":336},[240,1550,340],{"class":311},[240,1552,1553],{"class":246}," product.value?.editor\n",[240,1555,1556,1559,1561,1563,1566],{"class":242,"line":788},[240,1557,1558],{"class":311},"  if",[240,1560,389],{"class":246},[240,1562,392],{"class":311},[240,1564,1565],{"class":246},"editor) ",[240,1567,1568],{"class":311},"return\n",[240,1570,1571,1573,1576,1578,1581,1584],{"class":242,"line":794},[240,1572,1546],{"class":311},[240,1574,1575],{"class":336}," markdown",[240,1577,340],{"class":311},[240,1579,1580],{"class":246}," editor.",[240,1582,1583],{"class":257},"getMarkdown",[240,1585,1586],{"class":246},"()\n",[240,1588,1589],{"class":242,"line":817},[240,1590,1591],{"class":295},"  \u002F\u002F Pass markdown to your persistence layer; clear dirty after success.\n",[240,1593,1594,1597,1599],{"class":242,"line":823},[240,1595,1596],{"class":246},"  console.",[240,1598,410],{"class":257},[240,1600,1601],{"class":246},"(markdown)\n",[240,1603,1604],{"class":242,"line":829},[240,1605,832],{"class":246},[240,1607,1608,1611,1613],{"class":242,"line":835},[240,1609,1610],{"class":246},"\u003C\u002F",[240,1612,1390],{"class":250},[240,1614,1404],{"class":246},[240,1616,1617,1619,1622],{"class":242,"line":840},[240,1618,247],{"class":246},[240,1620,1621],{"class":250},"template",[240,1623,1404],{"class":246},[240,1625,1626,1629,1631,1633,1635,1638,1640,1642,1644,1646,1648,1650,1652,1654,1656,1659,1662,1664,1666,1669,1671,1674,1676],{"class":242,"line":854},[240,1627,1628],{"class":246},"  \u003C",[240,1630,251],{"class":250},[240,1632,1495],{"class":257},[240,1634,261],{"class":246},[240,1636,1637],{"class":264},"\"product\"",[240,1639,254],{"class":246},[240,1641,258],{"class":257},[240,1643,261],{"class":246},[240,1645,265],{"class":264},[240,1647,268],{"class":246},[240,1649,265],{"class":264},[240,1651,281],{"class":257},[240,1653,261],{"class":246},[240,1655,286],{"class":264},[240,1657,1658],{"class":246}," @",[240,1660,1661],{"class":257},"change",[240,1663,261],{"class":246},[240,1665,265],{"class":264},[240,1667,1668],{"class":246},"dirty ",[240,1670,261],{"class":311},[240,1672,1673],{"class":336}," true",[240,1675,265],{"class":264},[240,1677,289],{"class":246},[240,1679,1680,1682,1685,1687,1690,1692,1694,1696,1699,1701,1703,1706,1708,1710,1713,1715,1718,1720],{"class":242,"line":875},[240,1681,1628],{"class":246},[240,1683,1684],{"class":250},"QuireButton",[240,1686,254],{"class":246},[240,1688,1689],{"class":257},"disabled",[240,1691,261],{"class":246},[240,1693,265],{"class":264},[240,1695,392],{"class":311},[240,1697,1698],{"class":246},"dirty",[240,1700,265],{"class":264},[240,1702,1658],{"class":246},[240,1704,1705],{"class":257},"click",[240,1707,261],{"class":246},[240,1709,265],{"class":264},[240,1711,1712],{"class":246},"save",[240,1714,265],{"class":264},[240,1716,1717],{"class":246},">Save\u003C\u002F",[240,1719,1684],{"class":250},[240,1721,1404],{"class":246},[240,1723,1724,1726,1728],{"class":242,"line":886},[240,1725,1610],{"class":246},[240,1727,1621],{"class":250},[240,1729,1404],{"class":246},[15,1731,1732,1734,1735,1737,1738,1741,1742,1745,1746,1749,1750,126],{},[24,1733,258],{}," is the initial value, read once on mount. It is not a two-way model. ",[24,1736,1661],{}," emits the\noriginal incremental ",[24,1739,1740],{},"MsfeChangeEvent",", without copying the entire document on each keystroke.\nUse the exposed editor's ",[24,1743,1744],{},"replaceDocument()"," for a different document and ",[24,1747,1748],{},"applyChanges()"," for\nversioned external updates. See ",[18,1751,1753],{"href":1752},"\u002Fen\u002Fguide\u002Fsaving","Reading and saving",[10,1755,1757],{"id":1756},"errors-and-source-preservation","Errors and source preservation",[15,1759,1760,1762,1763,1766,1767,1770,1771,1774],{},[24,1761,251],{}," uses the public ",[24,1764,1765],{},"QuireAlert"," for creation and runtime errors, with messages matching\n",[24,1768,1769],{},"locale",". Failed creation displays the initial Markdown in a copyable ",[24,1772,1773],{},"QuireProseSource"," instead\nof leaving an empty editor. Errors from extensions or listeners in a mounted instance preserve\nits document, selection and undo history. Dismissing the alert does not recreate the instance.\nSave the source before the application remounts the editor after fixing its configuration.",[15,1776,1777,1778,1781,1782,1785,1786,1789],{},"Use ",[24,1779,1780],{},"@error=\"handleEditorError\""," to receive the original ",[24,1783,1784],{},"unknown"," exception for your application's\ndiagnostics. Internal codes and stacks are not used as user-facing messages. This covers editor\ncreation and errors reported through MSFE's ",[24,1787,1788],{},"onError","; it does not suppress unrelated Vue errors\nor build-tool diagnostics.",[10,1791,1793],{"id":1792},"configure-the-product","Configure the product",[44,1795,1796,1806],{},[47,1797,1798],{},[50,1799,1800,1803],{},[53,1801,1802],{},"Property",[53,1804,1805],{},"Purpose",[60,1807,1808,1824,1834,1856,1865,1890,1900,1910,1923,1933,1947,1980,1997,2011,2027,2040,2058,2068,2085,2128,2138,2152,2167],{},[50,1809,1810,1814],{},[65,1811,1812],{},[24,1813,1769],{},[65,1815,1816,1819,1820,1823],{},[24,1817,1818],{},"zh-CN"," or ",[24,1821,1822],{},"en"," for controls; never translates document content",[50,1825,1826,1831],{},[65,1827,1828],{},[24,1829,1830],{},"label",[65,1832,1833],{},"Accessible name of the editing region",[50,1835,1836,1841],{},[65,1837,1838],{},[24,1839,1840],{},"view",[65,1842,1843,1845,1846,436,1849,1819,1852,1855],{},[24,1844,565],{}," (default), ",[24,1847,1848],{},"preview",[24,1850,1851],{},"source",[24,1853,1854],{},"reading","; all four share source and history and update reactively",[50,1857,1858,1862],{},[65,1859,1860],{},[24,1861,228],{},[65,1863,1864],{},"Read-only over the first three views; disclosures and copying remain available",[50,1866,1867,1872],{},[65,1868,1869],{},[24,1870,1871],{},"toolbar",[65,1873,1874,1875,1819,1877,1880,1881,1884,1885,1887,1888],{},"Built-in toolbar: ",[24,1876,439],{},[24,1878,1879],{},"'fixed'"," (default) stays above the document; ",[24,1882,1883],{},"'floating'"," shows text style, inline formats and link above a desktop text selection; ",[24,1886,1500],{}," hides it. Narrow screens use the bottom dock whenever it is not ",[24,1889,1500],{},[50,1891,1892,1897],{},[65,1893,1894],{},[24,1895,1896],{},"selectionToolbar",[65,1898,1899],{},"With the fixed toolbar, a desktop text selection also floats style, inline formats, link and Add comment above it; on by default. A read-only source keeps only Add comment",[50,1901,1902,1907],{},[65,1903,1904],{},[24,1905,1906],{},"blockControls",[65,1908,1909],{},"Enable block handles, menus and drag sorting at mount; enabled by default",[50,1911,1912,1917],{},[65,1913,1914],{},[24,1915,1916],{},"slashMenu",[65,1918,1919,1920,1922],{},"Search and insert with ",[24,1921,1197],{}," in empty paragraphs; enabled by default and dynamically configurable",[50,1924,1925,1930],{},[65,1926,1927],{},[24,1928,1929],{},"placeholder",[65,1931,1932],{},"Hint shown in an empty editable document; defaults to a localized \"Type \u002F to insert\" prompt, an empty string hides it; read on mount",[50,1934,1935,1940],{},[65,1936,1937],{},[24,1938,1939],{},"mentions",[65,1941,1942,1943,1946],{},"Host contact array or cancellable async provider; enables the contact picker and typed ",[24,1944,1945],{},"@"," trigger when supplied on mount",[50,1948,1949,1954],{},[65,1950,1951],{},[24,1952,1953],{},"documentLinks",[65,1955,1956,1957,1960,1961,1964,1965,1968,1969,1972,1973,1975,1976,1979],{},"Host document links: ",[24,1958,1959],{},"search"," is a document array or cancellable async search (an empty query may return recent documents) — typing ",[24,1962,1963],{},"[["," opens a document search that inserts a standard ",[24,1966,1967],{},"[title](url)"," link, and the link dialog can search documents too; ",[24,1970,1971],{},"recognize"," identifies host document URLs, which render as references with a document icon; ",[24,1974,1848],{}," returns a Markdown excerpt shown as a thumbnail when hovering a reference; ",[24,1977,1978],{},"exportUrl"," sets the destination written when exporting Markdown, Word and other files, such as an absolute URL",[50,1981,1982,1987],{},[65,1983,1984],{},[24,1985,1986],{},"docx",[65,1988,1989,1990,1993,1994,1996],{},"Word converter, conversion and image options such as ",[24,1991,1992],{},"{ converter: mdDocx() }","; omitted or ",[24,1995,1500],{}," hides Word import and export",[50,1998,1999,2004],{},[65,2000,2001],{},[24,2002,2003],{},"exporters",[65,2005,2006,2007,2010],{},"Host-installed export formats (",[24,2008,2009],{},"MdExporter"," list), such as PDF and OFD; each adds an Export menu item and reuses the selected template and node converters",[50,2012,2013,2018],{},[65,2014,2015],{},[24,2016,2017],{},"layout",[65,2019,2020,2023,2024,2026],{},[24,2021,2022],{},"embedded"," for a framed component; ",[24,2025,565],{}," for a full-width toolbar and centered document",[50,2028,2029,2034],{},[65,2030,2031],{},[24,2032,2033],{},"outline",[65,2035,2036,2037,2039],{},"Heading outline that follows the reading position in the ",[24,2038,565],{}," layout, off by default; with room it is pinned to the editor edge and can be collapsed to a button and expanded again, otherwise the button opens a popover; the document centers independently and makes room for the outline and comments when space is limited",[50,2041,2042,2047],{},[65,2043,2044],{},[24,2045,2046],{},"outlinePosition",[65,2048,2049,2050,2053,2054,2057],{},"Outline side: ",[24,2051,2052],{},"start"," (default, left of the text, leaving the right side to comments) or ",[24,2055,2056],{},"end"," (right of the text, after the comment rail)",[50,2059,2060,2065],{},[65,2061,2062],{},[24,2063,2064],{},"features",[65,2066,2067],{},"Replace or disable features through StarterKit options",[50,2069,2070,2075],{},[65,2071,2072],{},[24,2073,2074],{},"containers",[65,2076,2077,2078,2080,2081,2084],{},"Container options, or ",[24,2079,1500],{},"; ",[24,2082,2083],{},"types"," replaces the complete name list",[50,2086,2087,2092],{},[65,2088,2089],{},[24,2090,2091],{},"extras",[65,2093,2094,2095,436,2098,436,2101,436,2104,436,2107,436,2110,436,2113,436,2116,436,2119,566,2122,2080,2125,2127],{},"Replace or disable ",[24,2096,2097],{},"math",[24,2099,2100],{},"mermaid",[24,2102,2103],{},"textDiagram",[24,2105,2106],{},"footnotes",[24,2108,2109],{},"definitionList",[24,2111,2112],{},"subscript",[24,2114,2115],{},"superscript",[24,2117,2118],{},"insertedText",[24,2120,2121],{},"highlight",[24,2123,2124],{},"frontmatter",[24,2126,1500],{}," disables all extras",[50,2129,2130,2135],{},[65,2131,2132],{},[24,2133,2134],{},"extensions",[65,2136,2137],{},"Additional MSFE features; do not install duplicate built-in names",[50,2139,2140,2145],{},[65,2141,2142],{},[24,2143,2144],{},"codeLanguages",[65,2146,2147,2148,2151],{},"Built-in lazy catalog by default; supplying a catalog replaces it, ",[24,2149,2150],{},"[]"," disables it, and unregistered languages stay plain text",[50,2153,2154,2158],{},[65,2155,2156],{},[24,2157,596],{},[65,2159,2160,2161,2163,2164],{},"Override or add boundary rules by syntax node at mount; ",[24,2162,2150],{}," retains feature defaults. See ",[18,2165,573],{"href":2166},"#caret-and-editing-boundaries",[50,2168,2169,2173],{},[65,2170,2171],{},[24,2172,1129],{},[65,2174,2175,2176,2178],{},"Compatible inline rule list; defaults to separate code positions and direct content entry for other styles; ",[24,2177,2150],{}," removes this list while link, block and component rules remain active",[15,2180,2181,2182,566,2184,2186],{},"Features and language catalogs are installed on mount. Explicitly remount for a different feature\nset and preserve the document in the host. ",[24,2183,1840],{},[24,2185,228],{}," update directly. Key the component\nby locale when switching the complete interface language.",[15,2188,2189,2190,2193,2194,2196,2197,2200,2201,2204,2205,2207,2208,2211,2212,2215,2216,1240,2219,2221,2222,2225,2226,2229,2230,2232,2233,2237],{},"The policy accepts ",[24,2191,2192],{},"InlineBoundaryRule[]",". Each rule declares syntax ",[24,2195,910],{},", opening\u002Fclosing\n",[24,2198,2199],{},"marker"," children and a ",[24,2202,2203],{},"behavior",": ",[24,2206,604],{}," preserves distinct inside\u002Foutside insertion positions,\n",[24,2209,2210],{},"content"," skips duplicate boundary stops, and ",[24,2213,2214],{},"native"," opts that inline rule out of boundary handling. Import and copy\n",[24,2217,2218],{},"mdInlineBoundaries",[24,2220,32],{}," to customize the defaults. The Vue component and\n",[24,2223,2224],{},"createMdEditor"," share this option. It applies to hidden syntax in document mode; source reveal,\ndrag selection and composition retain their existing behavior. This option and the lower-level\n",[24,2227,2228],{},"inlineBoundaryNavigation(rules)"," now adapt to the shared editing-boundary runtime; prefer\n",[24,2231,1000],{}," for new features.\nSee ",[18,2234,2236],{"href":2235},"\u002Fen\u002Fextensions\u002Fcode-blocks","Custom code blocks"," for empty-code placeholders and default languages.",[15,2239,2240,2241,2244],{},"The built-in toolbar uses public ",[24,2242,2243],{},"QuireToolbar",", sharing Classic's grouping, tooltips, toggle\nstates, arrow-key navigation and narrow-screen scrolling. Menus capture the selection before opening and mutate the same Markdown\nthrough its existing command and undo contracts.",[44,2246,2247,2257],{},[47,2248,2249],{},[50,2250,2251,2254],{},[53,2252,2253],{},"Feature",[53,2255,2256],{},"Source and behavior",[60,2258,2259,2267,2288,2296,2308,2316,2324,2340,2348,2356,2367,2382],{},[50,2260,2261,2264],{},[65,2262,2263],{},"Paragraphs and headings",[65,2265,2266],{},"Paragraphs and six heading levels over the original Markdown",[50,2268,2269,2272],{},[65,2270,2271],{},"Inline formatting",[65,2273,2274,2275,436,2278,436,2281,566,2284,2287],{},"Bold, italic, strikethrough, inline code, plus ",[24,2276,2277],{},"++underline++",[24,2279,2280],{},"==highlight==",[24,2282,2283],{},"H~2~O",[24,2285,2286],{},"x^2^"," extensions",[50,2289,2290,2293],{},[65,2291,2292],{},"Lists",[65,2294,2295],{},"Convert the current paragraph or selected lines to bullet, numbered or task lists; indent nested lists, continue with Enter and exit with Backspace",[50,2297,2298,2301],{},[65,2299,2300],{},"Links and images",[65,2302,2303,2304,2307],{},"Edit destinations, labels and titles in a shared dialog; images use ",[24,2305,2306],{},"QuireProseImage",", without embedding resource contents in the document",[50,2309,2310,2313],{},[65,2311,2312],{},"Tables",[65,2314,2315],{},"Insert above\u002Fbelow or delete the current row; insert left\u002Fright or delete the current column; set left\u002Fcenter\u002Fright\u002Fdefault column alignment",[50,2317,2318,2321],{},[65,2319,2320],{},"Code and containers",[65,2322,2323],{},"Code language and copy controls; notes, warnings, disclosures, highlight blocks and nested containers with directly editable bodies",[50,2325,2326,2329],{},[65,2327,2328],{},"Formulas",[65,2330,2331,2332,2335,2336,2339],{},"Inline ",[24,2333,2334],{},"$…$"," and display ",[24,2337,2338],{},"$$…$$",", edited with the shared structured formula editor",[50,2341,2342,2345],{},[65,2343,2344],{},"Text diagrams",[65,2346,2347],{},"Shared Mermaid, PlantUML and Graphviz\u002FDOT workspace with templates, live previews and SVG\u002FPNG downloads",[50,2349,2350,2353],{},[65,2351,2352],{},"Notes and terminology",[65,2354,2355],{},"Atomic footnote reference\u002Fdefinition insertion, navigation between them, and definition lists",[50,2357,2358,2361],{},[65,2359,2360],{},"Dividers, dates and emoji",[65,2362,2363,2364],{},"Standard thematic breaks, plain ISO calendar dates and Unicode emoji; emoji use the public ",[24,2365,2366],{},"QuireEmojiPicker",[50,2368,2369,2372],{},[65,2370,2371],{},"Mentions",[65,2373,2374,2375,2377,2378,2381],{},"Choose host contacts from Insert or type ",[24,2376,1945],{}," at a word boundary; writes an ordinary ",[24,2379,2380],{},"[@name](\u003Cdestination>)"," link without sending notifications",[50,2383,2384,2387],{},[65,2385,2386],{},"Files",[65,2388,2389],{},"Preview Markdown or Word imports, then replace the document or append to its end; export Markdown, Word or host-enabled PDF\u002FOFD",[15,2391,2392],{},"Underline, highlights, formulas, footnotes and custom containers are extensions; other applications\nneed compatible plugins to render them. GFM tables have no merged-cell syntax. Merging cells,\ncolumn widths, font sizes and text colors are not presented as standard Markdown capabilities.\nCloud documents, comments and polls are outside these source commands.",[15,2394,2395,2396,2398,2399,2402,2403,2406,2407,2410,2411,2414,2415,2418,2419,2422,2423,2426,2427,2430,2431,2434,2435,436,2438,436,2441,1819,2444,2447,2448,1819,2451,2454],{},"In ",[24,2397,565],{}," layout, ",[24,2400,2401],{},"--md-editor-toolbar-top"," reserves space for a fixed host header (default\n",[24,2404,2405],{},"0px","), and ",[24,2408,2409],{},"--md-editor-document-width"," controls the document's maximum width (default ",[24,2412,2413],{},"960px",").\nWhen the toolbar sticks inside the host's own scroller, ",[24,2416,2417],{},"--md-editor-panel-top"," places the side panel\nbelow the host chrome (defaults to the toolbar offset).\nFor a host toolbar, set ",[24,2420,2421],{},":toolbar=\"false\""," and invoke public commands through ",[24,2424,2425],{},"product.editor",".\nDo not replace the editable DOM.\nHost menus can call the instance's ",[24,2428,2429],{},"openFile(mode, exporter?)"," to open the same windows as the built-in\nImport \u002F Export menu: ",[24,2432,2433],{},"mode"," is ",[24,2436,2437],{},"markdownImport",[24,2439,2440],{},"wordImport",[24,2442,2443],{},"wordExport",[24,2445,2446],{},"formatExport"," (the last\nnames an installed exporter such as ",[24,2449,2450],{},"pdf",[24,2452,2453],{},"ofd","). It is ignored while another task is open or when the\naction is not enabled.",[15,2456,104,2457,2460,2461,2464],{},[24,2458,2459],{},"header"," slot places host content above the document, aligned to the document width, such as a\ntitle input or author details; the ",[24,2462,2463],{},"footer"," slot does the same below the document, such as likes or a\ncomment entry. Both scroll with the document, are not editable content and are never written to Markdown.",[231,2466,2468],{"className":233,"code":2467,"language":235,"meta":236,"style":236},"\u003CMdEditor\n  :markdown=\"initialMarkdown\"\n  locale=\"en\"\n  :containers=\"{ types: ['note', 'warning', 'details', 'decision'] }\"\n  :features=\"{ image: false }\"\n  :extras=\"{ mermaid: false }\"\n  :code-languages=\"[\n    { name: 'typescript', load: () => import('@quirekit\u002Fcm-lang-javascript').then(m => m.javascript({ typescript: true })) },\n  ]\"\n\u002F>\n",[24,2469,2470,2477,2493,2503,2539,2559,2578,2592,2647,2654],{"__ignoreMap":236},[240,2471,2472,2474],{"class":242,"line":243},[240,2473,247],{"class":246},[240,2475,2476],{"class":250},"MdEditor\n",[240,2478,2479,2482,2484,2486,2488,2490],{"class":242,"line":292},[240,2480,2481],{"class":246},"  :",[240,2483,258],{"class":257},[240,2485,261],{"class":246},[240,2487,265],{"class":264},[240,2489,268],{"class":246},[240,2491,2492],{"class":264},"\"\n",[240,2494,2495,2498,2500],{"class":242,"line":330},[240,2496,2497],{"class":257},"  locale",[240,2499,261],{"class":246},[240,2501,2502],{"class":264},"\"en\"\n",[240,2504,2505,2507,2509,2511,2513,2516,2519,2521,2524,2526,2529,2531,2534,2537],{"class":242,"line":361},[240,2506,2481],{"class":246},[240,2508,2074],{"class":257},[240,2510,261],{"class":246},[240,2512,265],{"class":264},[240,2514,2515],{"class":246},"{ types: [",[240,2517,2518],{"class":264},"'note'",[240,2520,436],{"class":246},[240,2522,2523],{"class":264},"'warning'",[240,2525,436],{"class":246},[240,2527,2528],{"class":264},"'details'",[240,2530,436],{"class":246},[240,2532,2533],{"class":264},"'decision'",[240,2535,2536],{"class":246},"] }",[240,2538,2492],{"class":264},[240,2540,2541,2543,2545,2547,2549,2552,2554,2557],{"class":242,"line":383},[240,2542,2481],{"class":246},[240,2544,2064],{"class":257},[240,2546,261],{"class":246},[240,2548,265],{"class":264},[240,2550,2551],{"class":246},"{ image: ",[240,2553,1500],{"class":336},[240,2555,2556],{"class":246}," }",[240,2558,2492],{"class":264},[240,2560,2561,2563,2565,2567,2569,2572,2574,2576],{"class":242,"line":404},[240,2562,2481],{"class":246},[240,2564,2091],{"class":257},[240,2566,261],{"class":246},[240,2568,265],{"class":264},[240,2570,2571],{"class":246},"{ mermaid: ",[240,2573,1500],{"class":336},[240,2575,2556],{"class":246},[240,2577,2492],{"class":264},[240,2579,2580,2582,2585,2587,2589],{"class":242,"line":425},[240,2581,2481],{"class":246},[240,2583,2584],{"class":257},"code-languages",[240,2586,261],{"class":246},[240,2588,265],{"class":264},[240,2590,2591],{"class":246},"[\n",[240,2593,2594,2597,2600,2602,2605,2608,2611,2614,2616,2619,2622,2625,2627,2630,2633,2636,2639,2642,2644],{"class":242,"line":711},[240,2595,2596],{"class":246},"    { name: ",[240,2598,2599],{"class":264},"'typescript'",[240,2601,436],{"class":246},[240,2603,2604],{"class":257},"load",[240,2606,2607],{"class":246},": () ",[240,2609,2610],{"class":311},"=>",[240,2612,2613],{"class":311}," import",[240,2615,413],{"class":246},[240,2617,2618],{"class":264},"'@quirekit\u002Fcm-lang-javascript'",[240,2620,2621],{"class":246},").",[240,2623,2624],{"class":257},"then",[240,2626,413],{"class":246},[240,2628,2629],{"class":704},"m",[240,2631,2632],{"class":311}," =>",[240,2634,2635],{"class":246}," m.",[240,2637,2638],{"class":257},"javascript",[240,2640,2641],{"class":246},"({ typescript: ",[240,2643,439],{"class":336},[240,2645,2646],{"class":246}," })) },\n",[240,2648,2649,2652],{"class":242,"line":746},[240,2650,2651],{"class":246},"  ]",[240,2653,2492],{"class":264},[240,2655,2656],{"class":242,"line":774},[240,2657,2658],{"class":246},"\u002F>\n",[15,2660,2661,2662,2665,2666,2669,2670,528,2673,528,2676,2679,2680,2682,2683,2685,2686,115,2689,566,2693,126],{},"Pass ",[24,2663,2664],{},"ProseCodeBlock.extend({ addNodeView() { … } })"," through ",[24,2667,2668],{},"features.codeBlock"," to replace code\ncontrols while retaining the Prose frame and source language command. Replace default formula and diagram\nfeatures through ",[24,2671,2672],{},"extras.math",[24,2674,2675],{},"extras.mermaid",[24,2677,2678],{},"extras.textDiagram",", not duplicate entries in ",[24,2681,2134],{},". Add new\ndiagram languages such as ECharts through ",[24,2684,2134],{},". See ",[18,2687,2688],{"href":2235},"Code blocks",[18,2690,2692],{"href":2691},"\u002Fen\u002Fextensions\u002Fdiagrams","Diagrams",[18,2694,2696],{"href":2695},"\u002Fen\u002Fextensions\u002Fmarkdown-plugins","Markdown plugins",[10,2698,2700],{"id":2699},"present-body-text-as-links","Present body text as links",[15,2702,2703,2704,2707,2708,2711,2712,2714,2715,126],{},"Short identifiers such as issue keys can appear as links without changing the source: ",[24,2705,2706],{},"textLinks()"," from\n",[24,2709,2710],{},"@quirekit\u002Fmsfe-link"," matches visible text with a host rule and is installed through ",[24,2713,2134],{},". The saved\nMarkdown keeps the original text, such as ",[24,2716,2717],{},"CLOUD-15084",[231,2719,2721],{"className":302,"code":2720,"language":304,"meta":236,"style":236},"import { textLinks } from '@quirekit\u002Fmsfe-link'\n\nconst issueLinks = textLinks({\n  id: 'issues',\n  pattern: \u002F[A-Z][A-Z0-9]+-\\d+\u002Fu,\n  href: key => `https:\u002F\u002Fissues.example.com\u002Fbrowse\u002F${key}`,\n  \u002F\u002F Optional: link only identifiers that exist. Visible candidates are checked in one batch and cached by text.\n  verify: async (keys, signal) => {\n    const response = await fetch(`\u002Fapi\u002Fissues?keys=${keys.join(',')}`, { signal })\n    return response.ok ? await response.json() as string[] : []\n  },\n  \u002F\u002F Optional hover card, rendered by MD Editor with a shared plain-text layout.\n  card: async (key, signal) => {\n    const issue = await fetch(`\u002Fapi\u002Fissues\u002F${key}`, { signal }).then(response => response.ok ? response.json() : null)\n    return issue && { subtitle: `${key} · ${issue.type}`, title: issue.summary,\n      status: { label: issue.status, tone: 'info' }, fields: [{ label: 'Assignee', value: issue.assignee }] }\n  },\n})\n",[24,2722,2723,2735,2739,2753,2763,2793,2815,2820,2846,2885,2920,2924,2929,2952,3002,3035,3052,3056],{"__ignoreMap":236},[240,2724,2725,2727,2730,2732],{"class":242,"line":243},[240,2726,312],{"class":311},[240,2728,2729],{"class":246}," { textLinks } ",[240,2731,318],{"class":311},[240,2733,2734],{"class":264}," '@quirekit\u002Fmsfe-link'\n",[240,2736,2737],{"class":242,"line":292},[240,2738,327],{"emptyLinePlaceholder":326},[240,2740,2741,2743,2746,2748,2751],{"class":242,"line":330},[240,2742,333],{"class":311},[240,2744,2745],{"class":336}," issueLinks",[240,2747,340],{"class":311},[240,2749,2750],{"class":257}," textLinks",[240,2752,851],{"class":246},[240,2754,2755,2758,2761],{"class":242,"line":361},[240,2756,2757],{"class":246},"  id: ",[240,2759,2760],{"class":264},"'issues'",[240,2762,115],{"class":246},[240,2764,2765,2768,2771,2774,2777,2781,2784,2786,2788,2791],{"class":242,"line":383},[240,2766,2767],{"class":246},"  pattern:",[240,2769,2770],{"class":264}," \u002F",[240,2772,2773],{"class":336},"[A-Z][A-Z0-9]",[240,2775,2776],{"class":311},"+",[240,2778,2780],{"class":2779},"sAPpe","-",[240,2782,2783],{"class":336},"\\d",[240,2785,2776],{"class":311},[240,2787,1197],{"class":264},[240,2789,2790],{"class":311},"u",[240,2792,115],{"class":246},[240,2794,2795,2798,2800,2803,2805,2808,2810,2813],{"class":242,"line":404},[240,2796,2797],{"class":257},"  href",[240,2799,2204],{"class":246},[240,2801,2802],{"class":704},"key",[240,2804,2632],{"class":311},[240,2806,2807],{"class":264}," `https:\u002F\u002Fissues.example.com\u002Fbrowse\u002F${",[240,2809,2802],{"class":246},[240,2811,2812],{"class":264},"}`",[240,2814,115],{"class":246},[240,2816,2817],{"class":242,"line":425},[240,2818,2819],{"class":295},"  \u002F\u002F Optional: link only identifiers that exist. Visible candidates are checked in one batch and cached by text.\n",[240,2821,2822,2825,2827,2830,2832,2835,2837,2840,2842,2844],{"class":242,"line":711},[240,2823,2824],{"class":257},"  verify",[240,2826,2204],{"class":246},[240,2828,2829],{"class":311},"async",[240,2831,389],{"class":246},[240,2833,2834],{"class":704},"keys",[240,2836,436],{"class":246},[240,2838,2839],{"class":704},"signal",[240,2841,442],{"class":246},[240,2843,2610],{"class":311},[240,2845,662],{"class":246},[240,2847,2848,2850,2853,2855,2858,2861,2863,2866,2868,2870,2873,2875,2878,2880,2882],{"class":242,"line":746},[240,2849,714],{"class":311},[240,2851,2852],{"class":336}," response",[240,2854,340],{"class":311},[240,2856,2857],{"class":311}," await",[240,2859,2860],{"class":257}," fetch",[240,2862,413],{"class":246},[240,2864,2865],{"class":264},"`\u002Fapi\u002Fissues?keys=${",[240,2867,2834],{"class":246},[240,2869,126],{"class":264},[240,2871,2872],{"class":257},"join",[240,2874,413],{"class":264},[240,2876,2877],{"class":264},"','",[240,2879,868],{"class":264},[240,2881,2812],{"class":264},[240,2883,2884],{"class":246},", { signal })\n",[240,2886,2887,2889,2892,2895,2897,2900,2903,2906,2909,2912,2915,2917],{"class":242,"line":774},[240,2888,777],{"class":311},[240,2890,2891],{"class":246}," response.ok ",[240,2893,2894],{"class":311},"?",[240,2896,2857],{"class":311},[240,2898,2899],{"class":246}," response.",[240,2901,2902],{"class":257},"json",[240,2904,2905],{"class":246},"() ",[240,2907,2908],{"class":311},"as",[240,2910,2911],{"class":336}," string",[240,2913,2914],{"class":246},"[] ",[240,2916,654],{"class":311},[240,2918,2919],{"class":246}," []\n",[240,2921,2922],{"class":242,"line":782},[240,2923,826],{"class":246},[240,2925,2926],{"class":242,"line":788},[240,2927,2928],{"class":295},"  \u002F\u002F Optional hover card, rendered by MD Editor with a shared plain-text layout.\n",[240,2930,2931,2934,2936,2938,2940,2942,2944,2946,2948,2950],{"class":242,"line":794},[240,2932,2933],{"class":257},"  card",[240,2935,2204],{"class":246},[240,2937,2829],{"class":311},[240,2939,389],{"class":246},[240,2941,2802],{"class":704},[240,2943,436],{"class":246},[240,2945,2839],{"class":704},[240,2947,442],{"class":246},[240,2949,2610],{"class":311},[240,2951,662],{"class":246},[240,2953,2954,2956,2959,2961,2963,2965,2967,2970,2972,2974,2977,2979,2981,2984,2986,2988,2990,2992,2994,2996,2998,3000],{"class":242,"line":817},[240,2955,714],{"class":311},[240,2957,2958],{"class":336}," issue",[240,2960,340],{"class":311},[240,2962,2857],{"class":311},[240,2964,2860],{"class":257},[240,2966,413],{"class":246},[240,2968,2969],{"class":264},"`\u002Fapi\u002Fissues\u002F${",[240,2971,2802],{"class":246},[240,2973,2812],{"class":264},[240,2975,2976],{"class":246},", { signal }).",[240,2978,2624],{"class":257},[240,2980,413],{"class":246},[240,2982,2983],{"class":704},"response",[240,2985,2632],{"class":311},[240,2987,2891],{"class":246},[240,2989,2894],{"class":311},[240,2991,2899],{"class":246},[240,2993,2902],{"class":257},[240,2995,2905],{"class":246},[240,2997,654],{"class":311},[240,2999,1476],{"class":336},[240,3001,380],{"class":246},[240,3003,3004,3006,3009,3012,3015,3018,3020,3023,3026,3028,3030,3032],{"class":242,"line":823},[240,3005,777],{"class":311},[240,3007,3008],{"class":246}," issue ",[240,3010,3011],{"class":311},"&&",[240,3013,3014],{"class":246}," { subtitle: ",[240,3016,3017],{"class":264},"`${",[240,3019,2802],{"class":246},[240,3021,3022],{"class":264},"} · ${",[240,3024,3025],{"class":246},"issue",[240,3027,126],{"class":264},[240,3029,1426],{"class":246},[240,3031,2812],{"class":264},[240,3033,3034],{"class":246},", title: issue.summary,\n",[240,3036,3037,3040,3043,3046,3049],{"class":242,"line":829},[240,3038,3039],{"class":246},"      status: { label: issue.status, tone: ",[240,3041,3042],{"class":264},"'info'",[240,3044,3045],{"class":246}," }, fields: [{ label: ",[240,3047,3048],{"class":264},"'Assignee'",[240,3050,3051],{"class":246},", value: issue.assignee }] }\n",[240,3053,3054],{"class":242,"line":835},[240,3055,826],{"class":246},[240,3057,3058],{"class":242,"line":840},[240,3059,905],{"class":246},[15,3061,3062,3063,3066,3067,3070,3071,3074,3075,3078,3079,3082,3083,3086,3087,3090],{},"Matches look like ordinary links and carry ",[24,3064,3065],{},"data-msfe-text-link","; Cmd\u002FCtrl+click follows them while editing and\na plain click does in read-only mode. Code, existing links, images, HTML and math are never matched, nor are\nmatches touching letters or digits; source view stays raw. Failed checks are not cached and are retried. An\nunchecked candidate ending at the caret waits until the caret leaves, so typing does not query every prefix.\nPass the same options object to several editors to share results. With ",[24,3068,3069],{},"card",", hovering a link for 300 ms\nshows a card: subtitle, title, up to three lines of description, a status tag (",[24,3072,3073],{},"tone"," is neutral, info, success,\nwarning or danger), short fields and an open-link action; returning null shows none. Add ",[24,3076,3077],{},"fromHref(url)"," to map destinations back\nto text so ordinary Markdown links to the same target, such as ",[24,3080,3081],{},"[spec](https:\u002F\u002Fissues.example.com\u002Fbrowse\u002FCLOUD-9)",",\nshow the card too. With ",[24,3084,3085],{},"exportLinks: true",", Markdown, Word, PDF and OFD exports write matches as standard links\nthat work in other software, while the editor source stays unchanged; host-owned exports can call\n",[24,3088,3089],{},"linkifyTextLinks(editor.state)"," for the same result. Cards are cached by text and\nfailed requests retry on the next hover. Converting matches to real links on export belongs to the host.",[10,3092,3094],{"id":3093},"comments","Comments",[15,3096,3097,3098,3101,3102,601,3105,3107,3108,3111],{},"Comments come from the commercial package ",[24,3099,3100],{},"@quirekit\u002Fmd-editor-comments"," (free for development and evaluation; production use\nrequires a license key): pass ",[24,3103,3104],{},"mdComments()",[24,3106,3093],{}," and import its ",[24,3109,3110],{},"styles.css",". Select text and use Add comment in the toolbar, the floating selection toolbar or\n⌘\u002FCtrl + Alt + M. People can reply, edit or delete their own messages and resolve threads. The focused card has\nprevious \u002F next buttons with its position, the toolbar Comments menu also moves between comments or shows them all,\nand resolving a thread moves on to the next unresolved one. Comments never enter the Markdown: the source stays clean,\nand the application stores comments itself in a standard exchange format.",[231,3113,3115],{"className":233,"code":3114,"language":235,"meta":236,"style":236},"\u003Cscript setup lang=\"ts\">\nimport { shallowRef, watch } from 'vue'\nimport { MdEditor, type MdEditorInstance } from '@quirekit\u002Fmd-editor\u002Fvue'\nimport { mdComments } from '@quirekit\u002Fmd-editor-comments'\nimport '@quirekit\u002Fmd-editor-comments\u002Fstyles.css'\nimport { getComments } from '@quirekit\u002Fmsfe-comments'\n\nconst props = defineProps\u003C{ markdown: string; saved?: unknown }>()\nconst product = shallowRef\u003CMdEditorInstance | null>(null)\nconst comments = mdComments({\n  user: { id: 'lin', name: 'Lin' },                   \u002F\u002F signs new messages and resolutions; null is read-only\n  canResolve: thread => thread.messages[0]!.author.id !== 'admin', \u002F\u002F optional: the application decides who may resolve\n  onChange: change => saveComments(change.snapshot()), \u002F\u002F save after each comment operation\n})\n\u002F\u002F Import saved comments after mount. Edited text is re-anchored by its quote; unplaced threads are listed separately.\nwatch(() => product.value?.editor, editor => { if (editor && props.saved) getComments(editor)?.importComments(props.saved) })\n\u002F\u002F Text edits only move comment ranges and are not reported; export with the document so anchors stay current.\nfunction save() { return { markdown: product.value?.editor?.getMarkdown(), comments: product.value?.editor && getComments(product.value.editor)?.exportComments() } }\ndeclare function saveComments(data: unknown): void\n\u003C\u002Fscript>\n\u003Ctemplate>\n  \u003CMdEditor ref=\"product\" layout=\"document\" :markdown=\"markdown\" :comments=\"comments\" \u002F>\n\u003C\u002Ftemplate>\n",[24,3116,3117,3133,3144,3158,3170,3177,3189,3193,3228,3252,3266,3286,3323,3349,3353,3358,3401,3406,3438,3464,3472,3480,3525],{"__ignoreMap":236},[240,3118,3119,3121,3123,3125,3127,3129,3131],{"class":242,"line":243},[240,3120,247],{"class":246},[240,3122,1390],{"class":250},[240,3124,1393],{"class":257},[240,3126,1396],{"class":257},[240,3128,261],{"class":246},[240,3130,1401],{"class":264},[240,3132,1404],{"class":246},[240,3134,3135,3137,3140,3142],{"class":242,"line":292},[240,3136,312],{"class":311},[240,3138,3139],{"class":246}," { shallowRef, watch } ",[240,3141,318],{"class":311},[240,3143,1416],{"class":264},[240,3145,3146,3148,3150,3152,3154,3156],{"class":242,"line":330},[240,3147,312],{"class":311},[240,3149,1423],{"class":246},[240,3151,1426],{"class":311},[240,3153,1429],{"class":246},[240,3155,318],{"class":311},[240,3157,1434],{"class":264},[240,3159,3160,3162,3165,3167],{"class":242,"line":361},[240,3161,312],{"class":311},[240,3163,3164],{"class":246}," { mdComments } ",[240,3166,318],{"class":311},[240,3168,3169],{"class":264}," '@quirekit\u002Fmd-editor-comments'\n",[240,3171,3172,3174],{"class":242,"line":383},[240,3173,312],{"class":311},[240,3175,3176],{"class":264}," '@quirekit\u002Fmd-editor-comments\u002Fstyles.css'\n",[240,3178,3179,3181,3184,3186],{"class":242,"line":404},[240,3180,312],{"class":311},[240,3182,3183],{"class":246}," { getComments } ",[240,3185,318],{"class":311},[240,3187,3188],{"class":264}," '@quirekit\u002Fmsfe-comments'\n",[240,3190,3191],{"class":242,"line":425},[240,3192,327],{"emptyLinePlaceholder":326},[240,3194,3195,3197,3200,3202,3205,3208,3210,3212,3214,3216,3219,3222,3225],{"class":242,"line":711},[240,3196,333],{"class":311},[240,3198,3199],{"class":336}," props",[240,3201,340],{"class":311},[240,3203,3204],{"class":257}," defineProps",[240,3206,3207],{"class":246},"\u003C{ ",[240,3209,258],{"class":704},[240,3211,654],{"class":311},[240,3213,2911],{"class":336},[240,3215,2080],{"class":246},[240,3217,3218],{"class":704},"saved",[240,3220,3221],{"class":311},"?:",[240,3223,3224],{"class":336}," unknown",[240,3226,3227],{"class":246}," }>()\n",[240,3229,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250],{"class":242,"line":746},[240,3231,333],{"class":311},[240,3233,1460],{"class":336},[240,3235,340],{"class":311},[240,3237,1465],{"class":257},[240,3239,247],{"class":246},[240,3241,1470],{"class":257},[240,3243,1473],{"class":311},[240,3245,1476],{"class":336},[240,3247,1479],{"class":246},[240,3249,989],{"class":336},[240,3251,380],{"class":246},[240,3253,3254,3256,3259,3261,3264],{"class":242,"line":774},[240,3255,333],{"class":311},[240,3257,3258],{"class":336}," comments",[240,3260,340],{"class":311},[240,3262,3263],{"class":257}," mdComments",[240,3265,851],{"class":246},[240,3267,3268,3271,3274,3277,3280,3283],{"class":242,"line":782},[240,3269,3270],{"class":246},"  user: { id: ",[240,3272,3273],{"class":264},"'lin'",[240,3275,3276],{"class":246},", name: ",[240,3278,3279],{"class":264},"'Lin'",[240,3281,3282],{"class":246}," },                   ",[240,3284,3285],{"class":295},"\u002F\u002F signs new messages and resolutions; null is read-only\n",[240,3287,3288,3291,3293,3296,3298,3301,3304,3307,3309,3312,3315,3318,3320],{"class":242,"line":788},[240,3289,3290],{"class":257},"  canResolve",[240,3292,2204],{"class":246},[240,3294,3295],{"class":704},"thread",[240,3297,2632],{"class":311},[240,3299,3300],{"class":246}," thread.messages[",[240,3302,3303],{"class":336},"0",[240,3305,3306],{"class":246},"]",[240,3308,392],{"class":311},[240,3310,3311],{"class":246},".author.id ",[240,3313,3314],{"class":311},"!==",[240,3316,3317],{"class":264}," 'admin'",[240,3319,436],{"class":246},[240,3321,3322],{"class":295},"\u002F\u002F optional: the application decides who may resolve\n",[240,3324,3325,3328,3330,3332,3334,3337,3340,3343,3346],{"class":242,"line":794},[240,3326,3327],{"class":257},"  onChange",[240,3329,2204],{"class":246},[240,3331,1661],{"class":704},[240,3333,2632],{"class":311},[240,3335,3336],{"class":257}," saveComments",[240,3338,3339],{"class":246},"(change.",[240,3341,3342],{"class":257},"snapshot",[240,3344,3345],{"class":246},"()), ",[240,3347,3348],{"class":295},"\u002F\u002F save after each comment operation\n",[240,3350,3351],{"class":242,"line":817},[240,3352,905],{"class":246},[240,3354,3355],{"class":242,"line":823},[240,3356,3357],{"class":295},"\u002F\u002F Import saved comments after mount. Edited text is re-anchored by its quote; unplaced threads are listed separately.\n",[240,3359,3360,3363,3366,3368,3371,3374,3376,3379,3381,3384,3386,3389,3392,3395,3398],{"class":242,"line":829},[240,3361,3362],{"class":257},"watch",[240,3364,3365],{"class":246},"(() ",[240,3367,2610],{"class":311},[240,3369,3370],{"class":246}," product.value?.editor, ",[240,3372,3373],{"class":704},"editor",[240,3375,2632],{"class":311},[240,3377,3378],{"class":246}," { ",[240,3380,386],{"class":311},[240,3382,3383],{"class":246}," (editor ",[240,3385,3011],{"class":311},[240,3387,3388],{"class":246}," props.saved) ",[240,3390,3391],{"class":257},"getComments",[240,3393,3394],{"class":246},"(editor)?.",[240,3396,3397],{"class":257},"importComments",[240,3399,3400],{"class":246},"(props.saved) })\n",[240,3402,3403],{"class":242,"line":835},[240,3404,3405],{"class":295},"\u002F\u002F Text edits only move comment ranges and are not reported; export with the document so anchors stay current.\n",[240,3407,3408,3410,3412,3414,3416,3419,3421,3424,3426,3429,3432,3435],{"class":242,"line":840},[240,3409,1535],{"class":311},[240,3411,1538],{"class":257},[240,3413,1078],{"class":246},[240,3415,768],{"class":311},[240,3417,3418],{"class":246}," { markdown: product.value?.editor?.",[240,3420,1583],{"class":257},[240,3422,3423],{"class":246},"(), comments: product.value?.editor ",[240,3425,3011],{"class":311},[240,3427,3428],{"class":257}," getComments",[240,3430,3431],{"class":246},"(product.value.editor)?.",[240,3433,3434],{"class":257},"exportComments",[240,3436,3437],{"class":246},"() } }\n",[240,3439,3440,3443,3446,3448,3450,3453,3455,3457,3459,3461],{"class":242,"line":854},[240,3441,3442],{"class":311},"declare",[240,3444,3445],{"class":311}," function",[240,3447,3336],{"class":257},[240,3449,413],{"class":246},[240,3451,3452],{"class":704},"data",[240,3454,654],{"class":311},[240,3456,3224],{"class":336},[240,3458,868],{"class":246},[240,3460,654],{"class":311},[240,3462,3463],{"class":336}," void\n",[240,3465,3466,3468,3470],{"class":242,"line":875},[240,3467,1610],{"class":246},[240,3469,1390],{"class":250},[240,3471,1404],{"class":246},[240,3473,3474,3476,3478],{"class":242,"line":886},[240,3475,247],{"class":246},[240,3477,1621],{"class":250},[240,3479,1404],{"class":246},[240,3481,3482,3484,3486,3488,3490,3492,3495,3497,3499,3501,3503,3505,3507,3509,3511,3513,3515,3517,3519,3521,3523],{"class":242,"line":896},[240,3483,1628],{"class":246},[240,3485,251],{"class":250},[240,3487,1495],{"class":257},[240,3489,261],{"class":246},[240,3491,1637],{"class":264},[240,3493,3494],{"class":257}," layout",[240,3496,261],{"class":246},[240,3498,278],{"class":264},[240,3500,254],{"class":246},[240,3502,258],{"class":257},[240,3504,261],{"class":246},[240,3506,265],{"class":264},[240,3508,258],{"class":246},[240,3510,265],{"class":264},[240,3512,254],{"class":246},[240,3514,3093],{"class":257},[240,3516,261],{"class":246},[240,3518,265],{"class":264},[240,3520,3093],{"class":246},[240,3522,265],{"class":264},[240,3524,289],{"class":246},[240,3526,3527,3529,3531],{"class":242,"line":902},[240,3528,1610],{"class":246},[240,3530,1621],{"class":250},[240,3532,1404],{"class":246},[15,3534,3535,3536,3538,3539,3541,3542,3545,3546,3548],{},"Wide document layouts show comments in the right margin, each card aligned with its text; narrow screens, embedded\nlayouts and phones open a list from Comments. With ",[24,3537,1939],{},", typing ",[24,3540,1945],{}," in a comment field lists contacts and inserts\nthe same ",[24,3543,3544],{},"[@name](\u003Curl>)"," link as the document, also listed in the message's ",[24,3547,1939],{}," for notifications. Comment text\nsupports bold, italic, inline code, strikethrough, links and mentions; other Markdown shows as written.",[15,3550,3551,3554,3555,3558,3559,3562,3563,3566,3567,126],{},[24,3552,3553],{},"canComment: false"," allows viewing only; ",[24,3556,3557],{},"canResolve"," decides whether Resolve \u002F Reopen is offered and is unrestricted\nwhen omitted. Users can always delete their own messages; ",[24,3560,3561],{},"canDelete"," also lets roles such as moderators delete other\npeople's messages (never edit them). ",[24,3564,3565],{},"avatar"," returns an avatar URL per author, falling back to initials. These settings only shape the interface, so the application's server must enforce the same rules.\nRead-only documents can still be commented. Comments are not exported to Word, PDF or OFD, and Word comments are not\nimported as comments. The exchange format, re-anchoring and collaboration plans are documented in the types of\n",[24,3568,3569],{},"@quirekit\u002Fmsfe-comments",[15,3571,3572,3573,3577,3578,3581],{},"Besides comments on selected text, people can leave ",[3574,3575,3576],"strong",{},"document comments"," on the whole document from Comment on document\nin the toolbar Comments menu or the comment list. They have no position in the text; replies, resolving and mentions\nwork the same, and they are grouped as Document comments at the top of All comments. With ",[24,3579,3580],{},"documentComments: \"end\"",", a\ndocument comment section also appears after the document. Data with document comments exports as exchange version 2;\ndata without them stays version 1.",[15,3583,3584,3585,3590,3591,3594,3595,3598],{},"To exchange files with tools that support ",[18,3586,3589],{"href":3587,"rel":3588},"https:\u002F\u002Fgithub.com\u002FCriticMarkup\u002FCriticMarkup-toolkit",[113],"CriticMarkup",", set\n",[24,3592,3593],{},"criticMarkup: true",". Export gains “Export Markdown with comments”, which writes comments as\n",[24,3596,3597],{},"{==text==}{>>@author: comment\u003C\u003C}",", and importing Markdown turns those marks into comments without keeping them in the\ntext. Inside the editor the source and the comments stay separate; marks exist only in the exported file. Each\ndirection can be configured:",[231,3600,3602],{"className":302,"code":3601,"language":304,"meta":236,"style":236},"const comments = mdComments({\n  user: { id: 'lin', name: 'Lin' },\n  criticMarkup: { export: true, import: true, includeResolved: false, suggestions: 'keep' },\n})\n",[24,3603,3604,3616,3629,3654],{"__ignoreMap":236},[240,3605,3606,3608,3610,3612,3614],{"class":242,"line":243},[240,3607,333],{"class":311},[240,3609,3258],{"class":336},[240,3611,340],{"class":311},[240,3613,3263],{"class":257},[240,3615,851],{"class":246},[240,3617,3618,3620,3622,3624,3626],{"class":242,"line":292},[240,3619,3270],{"class":246},[240,3621,3273],{"class":264},[240,3623,3276],{"class":246},[240,3625,3279],{"class":264},[240,3627,3628],{"class":246}," },\n",[240,3630,3631,3634,3636,3639,3641,3644,3646,3649,3652],{"class":242,"line":330},[240,3632,3633],{"class":246},"  criticMarkup: { export: ",[240,3635,439],{"class":336},[240,3637,3638],{"class":246},", import: ",[240,3640,439],{"class":336},[240,3642,3643],{"class":246},", includeResolved: ",[240,3645,1500],{"class":336},[240,3647,3648],{"class":246},", suggestions: ",[240,3650,3651],{"class":264},"'keep'",[240,3653,3628],{"class":246},[240,3655,3656],{"class":242,"line":361},[240,3657,905],{"class":246},[15,3659,3660,3663,3664,436,3667,566,3670,3673,3674,566,3677,2707,3680,3683],{},[24,3661,3662],{},"suggestions"," decides whether ",[24,3665,3666],{},"{++added++}",[24,3668,3669],{},"{--deleted--}",[24,3671,3672],{},"{~~old~>new~~}"," marks are kept as written, all\naccepted or all rejected on import. Comments in code or across lines are written as a separate mark beside it, so\nexisting syntax is never broken. Without the editor, call ",[24,3675,3676],{},"exportCriticMarkup",[24,3678,3679],{},"importCriticMarkup",[24,3681,3682],{},"@quirekit\u002Fmsfe-comments\u002Fcritic-markup"," directly.",[10,3685,3687],{"id":3686},"ai-assistant","AI assistant",[15,3689,3690,1240,3693,3696,3697,436,3700,1214,3702,3705,3706,3708,3709,3711,3712,3715,3716,3719,3720,3723],{},[24,3691,3692],{},"createMdEditorAi()",[24,3694,3695],{},"@quirekit\u002Fmd-editor-ai"," returns ",[24,3698,3699],{},"panel",[24,3701,2134],{},[24,3703,3704],{},"destroy()",".\nPass the first two to ",[24,3707,251],{}," and call ",[24,3710,3704],{}," when the host page unmounts. The assistant uses\nbuilt-in model settings, document tools, and change review. ",[24,3713,3714],{},"ownerDocument"," supplies the page document,\n",[24,3717,3718],{},"storage"," supplies browser storage, and ",[24,3721,3722],{},"images"," can reuse the host's image storage.",[15,3725,3726,3727,3730,3731,1370,3734,3737,3738,3741,3742,3745,3746,3749],{},"For centrally managed models, pass ",[24,3728,3729],{},"connection: () => Promise\u003CQuireAiModelConnection>"," to load authorized\nmodels when the panel first opens. This hides personal connection settings and bypasses saved provider\nconfiguration; model selection and approval preferences can still persist. An administrator page can reuse\n",[24,3732,3733],{},"createQuireAiProviderSettings({ persistence })",[24,3735,3736],{},"initialDraft",", asynchronous ",[24,3739,3740],{},"save(draft)",", and\n",[24,3743,3744],{},"clear()"," backed by the host server. Failed saves retain the draft without writing browser credentials.\nUse ",[24,3747,3748],{},"@quirekit\u002Fai-assistant\u002Fsettings"," for server validation; the host owns credentials, member permissions,\nand gateway authentication.",[10,3751,3753],{"id":3752},"activity","Activity",[15,3755,3756,3757,3760,3761,3764],{},"Activity answers who did what, and when. Records live outside the document in the public\n",[24,3758,3759],{},"@quirekit\u002Fedit-history"," protocol; the host implements ",[24,3762,3763],{},"ActivityStore",", and the editor only records and\ndisplays. Install both parts with the same store and document identity:",[231,3766,3768],{"className":302,"code":3767,"language":304,"meta":236,"style":236},"import { MdActivity } from '@quirekit\u002Fmd-editor'\nimport { mdActivityPanel } from '@quirekit\u002Fmd-editor\u002Fvue'\n\nconst activity = MdActivity.configure({\n  store, documentId: 'doc-42', epoch: '1',\n  actor: { id: user.id, name: user.name, trust: 'local' },\n})\nconst panel = mdActivityPanel({ store, documentId: 'doc-42', local: true })\n",[24,3769,3770,3781,3792,3796,3813,3829,3839,3843],{"__ignoreMap":236},[240,3771,3772,3774,3777,3779],{"class":242,"line":243},[240,3773,312],{"class":311},[240,3775,3776],{"class":246}," { MdActivity } ",[240,3778,318],{"class":311},[240,3780,321],{"class":264},[240,3782,3783,3785,3788,3790],{"class":242,"line":292},[240,3784,312],{"class":311},[240,3786,3787],{"class":246}," { mdActivityPanel } ",[240,3789,318],{"class":311},[240,3791,1434],{"class":264},[240,3793,3794],{"class":242,"line":330},[240,3795,327],{"emptyLinePlaceholder":326},[240,3797,3798,3800,3803,3805,3808,3811],{"class":242,"line":361},[240,3799,333],{"class":311},[240,3801,3802],{"class":336}," activity",[240,3804,340],{"class":311},[240,3806,3807],{"class":246}," MdActivity.",[240,3809,3810],{"class":257},"configure",[240,3812,851],{"class":246},[240,3814,3815,3818,3821,3824,3827],{"class":242,"line":383},[240,3816,3817],{"class":246},"  store, documentId: ",[240,3819,3820],{"class":264},"'doc-42'",[240,3822,3823],{"class":246},", epoch: ",[240,3825,3826],{"class":264},"'1'",[240,3828,115],{"class":246},[240,3830,3831,3834,3837],{"class":242,"line":404},[240,3832,3833],{"class":246},"  actor: { id: user.id, name: user.name, trust: ",[240,3835,3836],{"class":264},"'local'",[240,3838,3628],{"class":246},[240,3840,3841],{"class":242,"line":425},[240,3842,905],{"class":246},[240,3844,3845,3847,3850,3852,3855,3858,3860,3863,3865],{"class":242,"line":711},[240,3846,333],{"class":311},[240,3848,3849],{"class":336}," panel",[240,3851,340],{"class":311},[240,3853,3854],{"class":257}," mdActivityPanel",[240,3856,3857],{"class":246},"({ store, documentId: ",[240,3859,3820],{"class":264},[240,3861,3862],{"class":246},", local: ",[240,3864,439],{"class":336},[240,3866,358],{"class":246},[231,3868,3870],{"className":233,"code":3869,"language":235,"meta":236,"style":236},"\u003CMdEditor :markdown=\"markdown\" :extensions=\"[activity]\" :panels=\"[panel]\" \u002F>\n",[24,3871,3872],{"__ignoreMap":236},[240,3873,3874,3876,3878,3880,3882,3884,3886,3888,3890,3892,3894,3896,3898,3901,3903,3905,3908,3910,3912,3915,3917],{"class":242,"line":243},[240,3875,247],{"class":246},[240,3877,251],{"class":250},[240,3879,254],{"class":246},[240,3881,258],{"class":257},[240,3883,261],{"class":246},[240,3885,265],{"class":264},[240,3887,258],{"class":246},[240,3889,265],{"class":264},[240,3891,254],{"class":246},[240,3893,2134],{"class":257},[240,3895,261],{"class":246},[240,3897,265],{"class":264},[240,3899,3900],{"class":246},"[activity]",[240,3902,265],{"class":264},[240,3904,254],{"class":246},[240,3906,3907],{"class":257},"panels",[240,3909,261],{"class":246},[240,3911,265],{"class":264},[240,3913,3914],{"class":246},"[panel]",[240,3916,265],{"class":264},[240,3918,289],{"class":246},[3920,3921,3922,3926,3929],"ul",{},[3923,3924,3925],"li",{},"Typing in one block becomes one entry after a pause of about three seconds, a move to another block or\na blur; paste, cut, undo, block insertion, moving or deleting blocks, conversions and highlight color or\nicon changes each make one entry. Changes written by peers or the host are not recorded locally.",[3923,3927,3928],{},"The panel groups entries by day and nearby time, expands details, shows the Markdown before and after,\nfilters by member or time and hides system notices. Clicking an entry selects the current source: when\nthe place moved it selects the same content and says so; when the content was deleted or is ambiguous\n(the same text appears more than once) it only says so instead of jumping elsewhere. Comment entries\nselect the text the comment currently marks.",[3923,3930,3931,3932,601,3935,2080,3938,3941,3942,3945,3946,3949,3950,126],{},"For single-user use set ",[24,3933,3934],{},"trust",[24,3936,3937],{},"local",[24,3939,3940],{},"local: true"," marks the panel as device-only. Verified\nmulti-user records need server confirmation; a general collaboration collector is not provided yet.\nHosts can write protocol events after accepting source updates on the server and mount only\n",[24,3943,3944],{},"mdActivityPanel"," on the client to avoid duplicate local recording. The in-memory store in\n",[24,3947,3948],{},"@quirekit\u002Fedit-history\u002Fmemory"," is for demos and tests and is lost on reload; check your own store\nagainst the rules in ",[24,3951,3952],{},"@quirekit\u002Fedit-history\u002Fconformance",[458,3954,3956],{"id":3955},"with-collaboration","With collaboration",[15,3958,3959],{},"In collaboration the server confirms and writes records; clients no longer write the store. Install the\nHocuspocus extension on the server; authors come from authentication:",[231,3961,3963],{"className":302,"code":3962,"language":304,"meta":236,"style":236},"import { createMsfeActivityExtension } from '@quirekit\u002Fmsfe-collaboration-hocuspocus\u002Fserver'\n\nconst activity = createMsfeActivityExtension({\n  resolveActor: context => ({ id: context.user.id, name: context.user.name, trust: 'verified' }),\n  resolveDocument: room => ({ documentId: room, epoch: '1' }),\n})\n\u002F\u002F Inside your document store transaction: activity.takeActivity(room); on failure activity.restoreActivity(room, events)\n",[24,3964,3965,3977,3981,3994,4015,4034,4038],{"__ignoreMap":236},[240,3966,3967,3969,3972,3974],{"class":242,"line":243},[240,3968,312],{"class":311},[240,3970,3971],{"class":246}," { createMsfeActivityExtension } ",[240,3973,318],{"class":311},[240,3975,3976],{"class":264}," '@quirekit\u002Fmsfe-collaboration-hocuspocus\u002Fserver'\n",[240,3978,3979],{"class":242,"line":292},[240,3980,327],{"emptyLinePlaceholder":326},[240,3982,3983,3985,3987,3989,3992],{"class":242,"line":330},[240,3984,333],{"class":311},[240,3986,3802],{"class":336},[240,3988,340],{"class":311},[240,3990,3991],{"class":257}," createMsfeActivityExtension",[240,3993,851],{"class":246},[240,3995,3996,3999,4001,4004,4006,4009,4012],{"class":242,"line":361},[240,3997,3998],{"class":257},"  resolveActor",[240,4000,2204],{"class":246},[240,4002,4003],{"class":704},"context",[240,4005,2632],{"class":311},[240,4007,4008],{"class":246}," ({ id: context.user.id, name: context.user.name, trust: ",[240,4010,4011],{"class":264},"'verified'",[240,4013,4014],{"class":246}," }),\n",[240,4016,4017,4020,4022,4025,4027,4030,4032],{"class":242,"line":383},[240,4018,4019],{"class":257},"  resolveDocument",[240,4021,2204],{"class":246},[240,4023,4024],{"class":704},"room",[240,4026,2632],{"class":311},[240,4028,4029],{"class":246}," ({ documentId: room, epoch: ",[240,4031,3826],{"class":264},[240,4033,4014],{"class":246},[240,4035,4036],{"class":242,"line":404},[240,4037,905],{"class":246},[240,4039,4040],{"class":242,"line":425},[240,4041,4042],{"class":295},"\u002F\u002F Inside your document store transaction: activity.takeActivity(room); on failure activity.restoreActivity(room, events)\n",[15,4044,4045],{},"Clients send hints only for labelled operations such as block insertion, paste and undo; the server merges\ntyping from the updates it receives:",[231,4047,4049],{"className":302,"code":4048,"language":304,"meta":236,"style":236},"import { encodeActivityHint } from '@quirekit\u002Fedit-history\u002Fwriter'\nimport { relativeActivityResolver } from '@quirekit\u002Fmsfe-collaboration'\n\nMdActivity.configure({ documentId, epoch, actor: null, store: null,\n  hints: hint => session.sendStateless(encodeActivityHint(hint)) })\nmdActivityPanel({ store, documentId, resolveTarget: relativeActivityResolver(session.document) })\n",[24,4050,4051,4063,4075,4079,4098,4124],{"__ignoreMap":236},[240,4052,4053,4055,4058,4060],{"class":242,"line":243},[240,4054,312],{"class":311},[240,4056,4057],{"class":246}," { encodeActivityHint } ",[240,4059,318],{"class":311},[240,4061,4062],{"class":264}," '@quirekit\u002Fedit-history\u002Fwriter'\n",[240,4064,4065,4067,4070,4072],{"class":242,"line":292},[240,4066,312],{"class":311},[240,4068,4069],{"class":246}," { relativeActivityResolver } ",[240,4071,318],{"class":311},[240,4073,4074],{"class":264}," '@quirekit\u002Fmsfe-collaboration'\n",[240,4076,4077],{"class":242,"line":330},[240,4078,327],{"emptyLinePlaceholder":326},[240,4080,4081,4084,4086,4089,4091,4094,4096],{"class":242,"line":361},[240,4082,4083],{"class":246},"MdActivity.",[240,4085,3810],{"class":257},[240,4087,4088],{"class":246},"({ documentId, epoch, actor: ",[240,4090,989],{"class":336},[240,4092,4093],{"class":246},", store: ",[240,4095,989],{"class":336},[240,4097,115],{"class":246},[240,4099,4100,4103,4105,4108,4110,4113,4116,4118,4121],{"class":242,"line":383},[240,4101,4102],{"class":257},"  hints",[240,4104,2204],{"class":246},[240,4106,4107],{"class":704},"hint",[240,4109,2632],{"class":311},[240,4111,4112],{"class":246}," session.",[240,4114,4115],{"class":257},"sendStateless",[240,4117,413],{"class":246},[240,4119,4120],{"class":257},"encodeActivityHint",[240,4122,4123],{"class":246},"(hint)) })\n",[240,4125,4126,4128,4131,4134],{"class":242,"line":404},[240,4127,3944],{"class":257},[240,4129,4130],{"class":246},"({ store, documentId, resolveTarget: ",[240,4132,4133],{"class":257},"relativeActivityResolver",[240,4135,4136],{"class":246},"(session.document) })\n",[15,4138,4139,4140,4143,4144,4147],{},"When a hint does not match the observed change, the server records the change as a plain edit. A quick\nreconnect continues the same session instead of recording another join. With ",[24,4141,4142],{},"commentsRoom: room => room.endsWith(':comments')",",\nadding, replying to, resolving, reopening and deleting comments are recorded too, authored by the connection; take the comment\nroom's records with ",[24,4145,4146],{},"takeActivity(commentRoom)"," when storing that room.",[15,4149,4150,4151,4154,4155,4158,4159,4162,4163,4166,4167,4170],{},"Server records need a cap or they keep growing. The protocol's retention policy limits both count and age: ",[24,4152,4153],{},"maxEvents","\nkeeps only the newest entries per document, ",[24,4156,4157],{},"fullDays"," drops changes and keeps summaries, and ",[24,4160,4161],{},"summaryDays"," removes\nentries entirely. The reference ",[24,4164,4165],{},"createMemoryActivityStore({ retention })"," applies it after every append; a database store\ncan run the same cleanup after its write transaction or on a schedule, for example deleting old rows past the count by\nsequence. Versions are thinned separately with ",[24,4168,4169],{},"versionThinning","; named versions are kept.",[458,4172,4174],{"id":4173},"versions","Versions",[15,4176,4177,4178,4181,4182,4185],{},"A version is a snapshot of the whole Markdown, stored by the host's ",[24,4179,4180],{},"VersionStore",". Give the same version store to\n",[24,4183,4184],{},"MdActivity"," and the panel, and the panel gains a Versions tab:",[231,4187,4189],{"className":302,"code":4188,"language":304,"meta":236,"style":236},"const activity = MdActivity.configure({ store, versions, documentId: 'doc-42', epoch: '1', actor })\nconst panel = mdActivityPanel({ store, versions, documentId: 'doc-42', local: true })\n",[24,4190,4191,4215],{"__ignoreMap":236},[240,4192,4193,4195,4197,4199,4201,4203,4206,4208,4210,4212],{"class":242,"line":243},[240,4194,333],{"class":311},[240,4196,3802],{"class":336},[240,4198,340],{"class":311},[240,4200,3807],{"class":246},[240,4202,3810],{"class":257},[240,4204,4205],{"class":246},"({ store, versions, documentId: ",[240,4207,3820],{"class":264},[240,4209,3823],{"class":246},[240,4211,3826],{"class":264},[240,4213,4214],{"class":246},", actor })\n",[240,4216,4217,4219,4221,4223,4225,4227,4229,4231,4233],{"class":242,"line":292},[240,4218,333],{"class":311},[240,4220,3849],{"class":336},[240,4222,340],{"class":311},[240,4224,3854],{"class":257},[240,4226,4205],{"class":246},[240,4228,3820],{"class":264},[240,4230,3862],{"class":246},[240,4232,439],{"class":336},[240,4234,358],{"class":246},[3920,4236,4237,4244,4247,4250],{},[3923,4238,4239,4240,4243],{},"Type a name to save a named version, which is kept permanently. The host calls ",[24,4241,4242],{},"getMdVersions(editor).save()"," at its\nown save points for automatic versions; when nothing changed since the latest version it is reused, not stored again.",[3923,4245,4246],{},"Clicking a version opens a read-only preview; \"Compare with current\" shows a line diff, and \"Copy all\" lets you paste\nback the parts you need by hand.",[3923,4248,4249],{},"\"Restore this version\" saves the current content as a version first, then rewrites only the differing lines as one\nundoable edit recorded as \"Restored a version\"; comments and collaboration anchors on unchanged lines survive.\nRead-only editors cannot restore.",[3923,4251,4252],{},"In collaboration the server takes automatic versions while storing, and the host's version API records \"Saved a\nversion\" on the server with the authenticated author; restores are confirmed through hint pairing as usual, and the\nclient never writes records itself. Undoing one past edit on its own is not offered yet.",[10,4254,4256],{"id":4255},"use-the-shared-formula-editor","Use the shared formula editor",[15,4258,4259,4260,1240,4263,4266,4267,4270],{},"Choose an inline or block formula from Insert. Double-click an existing block formula (or select it and\nchoose Edit in its action bar), or click an inline formula, to edit it. The dialog uses ",[24,4261,4262],{},"MathAuthoringPanel",[24,4264,4265],{},"@quirekit\u002Fmath-ui",", retaining the ",[24,4268,4269],{},"@quirekit\u002Fmath","\ndocument, templates, structured input and optional LaTeX entry. The product does not implement\nanother formula interface. KaTeX rendering resources and the authoring panel load on demand.",[15,4272,4273],{},"Drafts are separate from the document. Cancel makes no change. Confirm replaces only the formula's\nLaTeX body, retaining dollar fences and surrounding quote\u002Flist prefixes, as one undo step. Inline\nformulas require a single line without surrounding dollar signs; use display formulas for multiple\nlines. If the anchored content changes, the document is replaced, or editing becomes read-only,\nsubmission is refused and the draft remains available.",[15,4275,4276,4277,4280],{},"Workspace hosts using UnoCSS must scan the public ",[24,4278,4279],{},"math-ui"," sources alongside product and UI\nsources. The panel uses existing public component classes. Hosts using precompiled styles must\ninclude the corresponding public component styles.",[15,4282,4283,4284,4287,4288,4290,4291,436,4293,566,4296,4299,4300,4302,4303,4306,4307,4310,4311,4314,4315,4318,4319,4323],{},"For a custom formula host, configure MSFE's ",[24,4285,4286],{},"Math.configure({ edit })"," and pass it through\n",[24,4289,2672],{},". The callback receives ",[24,4292,3373],{},[24,4294,4295],{},"range",[24,4297,4298],{},"kind","; return ",[24,4301,439],{}," after taking\nownership. Do not retain a bare range across an asynchronous dialog: call ",[24,4304,4305],{},"captureAnchor(range)",",\nobtain ",[24,4308,4309],{},"anchor.target()"," on confirmation, run ",[24,4312,4313],{},"editor.run(replaceMdPreview(latex), target)",", and\nrelease the anchor on close. The same contract applies to ",[24,4316,4317],{},"Mermaid.configure({ edit })",".\nSee the ",[18,4320,4322],{"href":4321},"\u002Fen\u002Fapi\u002Frendering","rendering API"," for component lifetimes.",[10,4325,4327],{"id":4326},"edit-diagrams-links-and-images","Edit diagrams, links and images",[15,4329,4330],{},"“Insert → Text diagram” opens the shared Classic, Block and MSFE source workspace for Mermaid, PlantUML and Graphviz\u002FDOT. Switching languages retains separate drafts; applying a template is explicit. Successful previews can be saved or downloaded as SVG\u002FPNG. Errors retain the draft, and cancellation leaves the document unchanged. Standard Markdown fences have no separate title field, so this host hides title editing.",[15,4332,4333,4334,436,4336,1819,4339,4342,4343,528,4346,4349,4350,4353,4354,4357,4358,126],{},"Saves produce ordinary ",[24,4335,2100],{},[24,4337,4338],{},"plantuml",[24,4340,4341],{},"dot"," fences; ",[24,4344,4345],{},"puml",[24,4347,4348],{},"graphviz"," aliases can also be reopened. Editing preserves fence style and enclosing block prefixes, growing delimiters when needed to prevent source from closing the fence. The language name changes only when switching grammar. ",[24,4351,4352],{},"extras.mermaid: false"," disables Mermaid; ",[24,4355,4356],{},"extras.textDiagram: false"," disables PlantUML\u002FDOT. Disabled languages remain ordinary code. Engines run locally; external includes, optional PlantUML libraries and D2 are not enabled. See ",[18,4359,4360],{"href":2691},"text diagram integration",[15,4362,4363],{},"Place the caret inside a link and select Link in the toolbar to edit it. Clicking an image\nselects it and shows an action bar to edit, preview, copy, cut or delete it; double-click\npreviews it directly. Unchanged labels preserve their original formatting.\nEditing one reference-style link converts that usage to an inline link while retaining the\nshared definition and other usages. Unsafe destination protocols are rejected.",[15,4365,4366,4367,4370,4371,4374,4375,126],{},"Markdown stores an image destination. The host owns uploads, private attachments and object-URL\nresolution. Use ",[24,4368,4369],{},"Image.configure({ resolve })"," to retain the image resource contract and override\n",[24,4372,4373],{},"addNodeView"," for a custom public image component. MSFE still owns resource release through node\nlifetimes; see ",[18,4376,4378],{"href":4377},"\u002Fen\u002Fextensions\u002Fresources","Images and resources",[15,4380,4381,4382,389,4384,4387],{},"With ",[24,4383,3722],{},[24,4385,4386],{},"MdImageStorage","), the host's storage receives new images and the document stores only the\nreturned address:",[231,4389,4391],{"className":302,"code":4390,"language":304,"meta":236,"style":236},"const images: MdImageStorage = {\n  upload: async (file, { signal, source, name }) => (await uploadToHost(file, { signal, name })).url,\n  \u002F\u002F Optional: fetch an address back as a PNG\u002FJPEG data URI for Word, PDF and OFD export.\n  resolve: async (url, signal) => await fetchAsDataUrl(url, signal),\n}\n",[24,4392,4393,4409,4453,4458,4487],{"__ignoreMap":236},[240,4394,4395,4397,4400,4402,4405,4407],{"class":242,"line":243},[240,4396,333],{"class":311},[240,4398,4399],{"class":336}," images",[240,4401,654],{"class":311},[240,4403,4404],{"class":257}," MdImageStorage",[240,4406,340],{"class":311},[240,4408,662],{"class":246},[240,4410,4411,4414,4416,4418,4420,4423,4426,4428,4430,4432,4434,4437,4440,4442,4444,4447,4450],{"class":242,"line":292},[240,4412,4413],{"class":257},"  upload",[240,4415,2204],{"class":246},[240,4417,2829],{"class":311},[240,4419,389],{"class":246},[240,4421,4422],{"class":704},"file",[240,4424,4425],{"class":246},", { ",[240,4427,2839],{"class":704},[240,4429,436],{"class":246},[240,4431,1851],{"class":704},[240,4433,436],{"class":246},[240,4435,4436],{"class":704},"name",[240,4438,4439],{"class":246}," }) ",[240,4441,2610],{"class":311},[240,4443,389],{"class":246},[240,4445,4446],{"class":311},"await",[240,4448,4449],{"class":257}," uploadToHost",[240,4451,4452],{"class":246},"(file, { signal, name })).url,\n",[240,4454,4455],{"class":242,"line":330},[240,4456,4457],{"class":295},"  \u002F\u002F Optional: fetch an address back as a PNG\u002FJPEG data URI for Word, PDF and OFD export.\n",[240,4459,4460,4462,4464,4466,4468,4471,4473,4475,4477,4479,4481,4484],{"class":242,"line":361},[240,4461,698],{"class":257},[240,4463,2204],{"class":246},[240,4465,2829],{"class":311},[240,4467,389],{"class":246},[240,4469,4470],{"class":704},"url",[240,4472,436],{"class":246},[240,4474,2839],{"class":704},[240,4476,442],{"class":246},[240,4478,2610],{"class":311},[240,4480,2857],{"class":311},[240,4482,4483],{"class":257}," fetchAsDataUrl",[240,4485,4486],{"class":246},"(url, signal),\n",[240,4488,4489],{"class":242,"line":383},[240,4490,832],{"class":246},[3920,4492,4493,4496,4502,4516,4526],{},[3923,4494,4495],{},"The image dialog shows an upload action that fills the address and alternative text for confirmation.",[3923,4497,4498,4499,126],{},"Pasted screenshots and dropped image files upload directly and are inserted where they were pasted or\ndropped; edits during the upload do not move the landing point. A clipboard that also carries text, such\nas a copied web page, uses the ordinary paste. A failed upload writes nothing; the host reports it in ",[24,4500,4501],{},"upload",[3923,4503,4504,4505,4508,4509,4512,4513,126],{},"Flowchart, mind map and whiteboard previews upload with ",[24,4506,4507],{},"source: 'diagram'"," on save, and the embed stores\nonly the address (",[24,4510,4511],{},"preview.url","). A failed upload keeps the preview inline without losing the edit. Word, PDF\nand OFD export fetch the preview back through ",[24,4514,4515],{},"resolve",[3923,4517,4518,4519,528,4522,4525],{},"When ",[24,4520,4521],{},"docx.storeImage",[24,4523,4524],{},"docx.resolveImage"," are unset, Word import and export use the same storage.",[3923,4527,4528,4529,4531],{},"Read-only editors never upload; without ",[24,4530,3722],{}," the editor keeps accepting addresses only, and diagram\npreviews stay inline as base64.",[10,4533,4535],{"id":4534},"call-product-source-commands","Call product source commands",[15,4537,4538],{},"The toolbar consumes public commands. Custom controls use the same editor and transaction:",[231,4540,4542],{"className":302,"code":4541,"language":304,"meta":236,"style":236},"import {\n  editMdDestination, insertMdFootnote, replaceMdPreview,\n  toggleMdInlineCode, toggleMdList,\n} from '@quirekit\u002Fmd-editor'\n\neditor.run(toggleMdList('ordered')) \u002F\u002F Convert the current paragraph\u002Fselection\neditor.run(toggleMdInlineCode())\neditor.run(insertMdFootnote('Additional context')) \u002F\u002F One reference\u002Fdefinition transaction\neditor.run(editMdDestination(false, { url: '\u002Fdocs' })) \u002F\u002F false: link; true: image\n\neditor.commands.insertTableRow('before')\neditor.commands.insertTableColumn('after')\neditor.commands.setTableColumnAlignment('center')\neditor.commands.deleteTableRow()\n",[24,4543,4544,4550,4555,4560,4569,4573,4597,4611,4632,4659,4663,4678,4692,4706],{"__ignoreMap":236},[240,4545,4546,4548],{"class":242,"line":243},[240,4547,312],{"class":311},[240,4549,662],{"class":246},[240,4551,4552],{"class":242,"line":292},[240,4553,4554],{"class":246},"  editMdDestination, insertMdFootnote, replaceMdPreview,\n",[240,4556,4557],{"class":242,"line":330},[240,4558,4559],{"class":246},"  toggleMdInlineCode, toggleMdList,\n",[240,4561,4562,4565,4567],{"class":242,"line":361},[240,4563,4564],{"class":246},"} ",[240,4566,318],{"class":311},[240,4568,321],{"class":264},[240,4570,4571],{"class":242,"line":383},[240,4572,327],{"emptyLinePlaceholder":326},[240,4574,4575,4578,4581,4583,4586,4588,4591,4594],{"class":242,"line":404},[240,4576,4577],{"class":246},"editor.",[240,4579,4580],{"class":257},"run",[240,4582,413],{"class":246},[240,4584,4585],{"class":257},"toggleMdList",[240,4587,413],{"class":246},[240,4589,4590],{"class":264},"'ordered'",[240,4592,4593],{"class":246},")) ",[240,4595,4596],{"class":295},"\u002F\u002F Convert the current paragraph\u002Fselection\n",[240,4598,4599,4601,4603,4605,4608],{"class":242,"line":425},[240,4600,4577],{"class":246},[240,4602,4580],{"class":257},[240,4604,413],{"class":246},[240,4606,4607],{"class":257},"toggleMdInlineCode",[240,4609,4610],{"class":246},"())\n",[240,4612,4613,4615,4617,4619,4622,4624,4627,4629],{"class":242,"line":711},[240,4614,4577],{"class":246},[240,4616,4580],{"class":257},[240,4618,413],{"class":246},[240,4620,4621],{"class":257},"insertMdFootnote",[240,4623,413],{"class":246},[240,4625,4626],{"class":264},"'Additional context'",[240,4628,4593],{"class":246},[240,4630,4631],{"class":295},"\u002F\u002F One reference\u002Fdefinition transaction\n",[240,4633,4634,4636,4638,4640,4643,4645,4647,4650,4653,4656],{"class":242,"line":746},[240,4635,4577],{"class":246},[240,4637,4580],{"class":257},[240,4639,413],{"class":246},[240,4641,4642],{"class":257},"editMdDestination",[240,4644,413],{"class":246},[240,4646,1500],{"class":336},[240,4648,4649],{"class":246},", { url: ",[240,4651,4652],{"class":264},"'\u002Fdocs'",[240,4654,4655],{"class":246}," })) ",[240,4657,4658],{"class":295},"\u002F\u002F false: link; true: image\n",[240,4660,4661],{"class":242,"line":774},[240,4662,327],{"emptyLinePlaceholder":326},[240,4664,4665,4668,4671,4673,4676],{"class":242,"line":782},[240,4666,4667],{"class":246},"editor.commands.",[240,4669,4670],{"class":257},"insertTableRow",[240,4672,413],{"class":246},[240,4674,4675],{"class":264},"'before'",[240,4677,380],{"class":246},[240,4679,4680,4682,4685,4687,4690],{"class":242,"line":788},[240,4681,4667],{"class":246},[240,4683,4684],{"class":257},"insertTableColumn",[240,4686,413],{"class":246},[240,4688,4689],{"class":264},"'after'",[240,4691,380],{"class":246},[240,4693,4694,4696,4699,4701,4704],{"class":242,"line":794},[240,4695,4667],{"class":246},[240,4697,4698],{"class":257},"setTableColumnAlignment",[240,4700,413],{"class":246},[240,4702,4703],{"class":264},"'center'",[240,4705,380],{"class":246},[240,4707,4708,4710,4713],{"class":242,"line":817},[240,4709,4667],{"class":246},[240,4711,4712],{"class":257},"deleteTableRow",[240,4714,1586],{"class":246},[15,4716,4717,4720,4721,4724],{},[24,4718,4719],{},"replaceMdPreview(body, language?)"," requires a confirmed formula or text-diagram target. The optional\nlanguage switches an existing diagram fence; it does not create a new block. Table commands require a selection inside one table. Column alignment modifies only the\ncorresponding delimiter field, preserving all other cell source. Inspect ",[24,4722,4723],{},"result.ok",": read-only,\nstale and structurally inapplicable targets refuse changes.",[15,4726,4727,4728,4731,4732,126],{},"Do not apply a command planner by editing DOM or bypass the target, permission and history checks\nin ",[24,4729,4730],{},"editor.run()",". External dialogs capture their intent and release anchors on completion.\nSee ",[18,4733,4735],{"href":4734},"\u002Fen\u002Fapi\u002Fcommands","Commands and transactions",[10,4737,4739],{"id":4738},"import-and-export","Import and export",[15,4741,4742,4743,4746,4747,4749],{},"The toolbar's up\u002Fdown arrow icon opens ",[3574,4744,4745],{},"Import \u002F Export",", with its name shown on hover.\nThe menu groups actions by direction: import Markdown or Word,\nand export Markdown or Word. Formats installed through ",[24,4748,2003],{},", such as PDF and OFD, each add an export item; uninstalled formats are hidden.\nEach import and export has a file-type icon marked MD, W, PDF or OFD; disabled entries also dim their icons.",[15,4751,4752,4753,4756],{},"Import Markdown accepts pasted text or a local ",[24,4754,4755],{},".md\u002F.markdown\u002F.txt"," file up to 2 MB. The shared\nFileUpload handles selection, validation and removal. Files load into a draft, strip a UTF-8 BOM,\nand normalize CRLF\u002FCR to LF. The shared CodeBlock previews and copies the source; “Edit content”\nopens the editable draft for changes or pasted Markdown.",[15,4758,4759,4760,126],{},"“Replace document” replaces all current content with the draft. “Append to end” keeps the original\nand appends the draft, independently of the current selection. Both actions undo in one step.\nSource changes, document replacement or read-only state while the dialog is open block writes and\nretain the draft. Hosts opening a different document and resetting identity and history should\nhandle saving and call ",[24,4761,1744],{},[15,4763,4764],{},"Export Markdown reads the authoritative current source, without converting Prose DOM or JSON\nback to Markdown. Backend persistence belongs to the host. Export also works in read-only mode.",[10,4766,4768],{"id":4767},"word-import-and-export","Word import and export",[15,4770,4771,4772,4774,4775,4778,4779,4782,4783,4786],{},"Word actions in ",[3574,4773,4745],{}," come from a host-installed converter. ",[24,4776,4777],{},"mdDocx()"," lives in the\ncommercial ",[24,4780,4781],{},"@quirekit\u002Fmd-editor-export"," package; the base editor only defines the ",[24,4784,4785],{},"MdDocxConverter","\ncontract and hides the Word items when none is installed:",[231,4788,4790],{"className":302,"code":4789,"language":304,"meta":236,"style":236},"import { mdDocx } from '@quirekit\u002Fmd-editor-export'\n\nconst docx = { converter: mdDocx() }\n\u002F\u002F \u003CMdEditor :docx=\"docx\" \u002F>\n",[24,4791,4792,4804,4808,4826],{"__ignoreMap":236},[240,4793,4794,4796,4799,4801],{"class":242,"line":243},[240,4795,312],{"class":311},[240,4797,4798],{"class":246}," { mdDocx } ",[240,4800,318],{"class":311},[240,4802,4803],{"class":264}," '@quirekit\u002Fmd-editor-export'\n",[240,4805,4806],{"class":242,"line":292},[240,4807,327],{"emptyLinePlaceholder":326},[240,4809,4810,4812,4815,4817,4820,4823],{"class":242,"line":330},[240,4811,333],{"class":311},[240,4813,4814],{"class":336}," docx",[240,4816,340],{"class":311},[240,4818,4819],{"class":246}," { converter: ",[240,4821,4822],{"class":257},"mdDocx",[240,4824,4825],{"class":246},"() }\n",[240,4827,4828],{"class":242,"line":361},[240,4829,4830],{"class":295},"\u002F\u002F \u003CMdEditor :docx=\"docx\" \u002F>\n",[15,4832,4833,4834,4837],{},"The conversion runtime loads after an explicit user action.\nImport accepts ",[24,4835,4836],{},".docx"," files up to 20 MB, converts to a Markdown draft and shows a CodeBlock preview\nand report. It shares the “Replace document” and “Append to end” actions with Markdown import;\neach undoes in one step. Cancellation, conversion failure, source changes during import or read-only\nstate cannot write back. Export captures the source when the window opens; review the report before downloading.\nRead-only documents can still export.",[15,4839,4840],{},"The first slice supports paragraphs, headings 1–6, bold\u002Fitalic\u002Fstrikethrough\u002Finline code, links,\ncode languages, basic nested lists, bordered tables with shaded headers, native footnotes, equations and PNG\u002FJPEG images. Code blocks\nretain language and line breaks, with shading and border spacing for extra inset space. Tasks become visible checkbox\ncharacters. Default containers and Mermaid use the node conversions below.\nOn import, complex tables, fonts and layout are simplified;\ncomments and headers\u002Ffooters are omitted with diagnostics. Export templates can create new headers\u002Ffooters. Word fidelity and original Markdown\nspelling are not guaranteed. Recognized tracked deletions are excluded and insertions retained;\nthis is not a full Word “accept all revisions” implementation.",[15,4842,4843,4844,4847],{},"Inline and display equations use ",[24,4845,4846],{},"@quirekit\u002Fmath-omml"," to produce editable native Word OMML.\nReimport accepts LaTeX only after strict structural verification. Unsupported source equations retain\ntheir source; Word equations that cannot be decoded retain readable math text, with diagnostics.\nComplex formula properties, surrounding Markdown formatting and equations in notes are not guaranteed to round-trip.",[15,4849,4850],{},"Footnote references and bodies become native Word footnotes and import back as Markdown references\nand definitions, retaining basic paragraphs and text formatting such as bold and italic. Repeated\nreferences become independent Word footnotes with a diagnostic; unused definitions remain visible\nbody notes. Note hyperlinks retain their labels and URLs, images retain alternative text, and complex\nblocks retain source with diagnostics. Word endnotes become Markdown footnotes with a placement\ndiagnostic. Ordinary note labels are normalized, so their original spelling is not guaranteed.",[15,4852,4853],{},"Use the independent adapter without mounting an editor:",[231,4855,4857],{"className":302,"code":4856,"language":304,"meta":236,"style":236},"import { exportMarkdownDocx, importDocxMarkdown } from '@quirekit\u002Fmarkdown-docx'\n\nconst exported = await exportMarkdownDocx('# Document\\n\\n**Body**')\n\u002F\u002F exported.data is Uint8Array; diagnostics reports approximations and omissions.\nconst imported = await importDocxMarkdown(exported.data)\nconsole.log(imported.markdown, imported.diagnostics)\n",[24,4858,4859,4871,4875,4901,4906,4923],{"__ignoreMap":236},[240,4860,4861,4863,4866,4868],{"class":242,"line":243},[240,4862,312],{"class":311},[240,4864,4865],{"class":246}," { exportMarkdownDocx, importDocxMarkdown } ",[240,4867,318],{"class":311},[240,4869,4870],{"class":264}," '@quirekit\u002Fmarkdown-docx'\n",[240,4872,4873],{"class":242,"line":292},[240,4874,327],{"emptyLinePlaceholder":326},[240,4876,4877,4879,4882,4884,4886,4889,4891,4894,4896,4899],{"class":242,"line":330},[240,4878,333],{"class":311},[240,4880,4881],{"class":336}," exported",[240,4883,340],{"class":311},[240,4885,2857],{"class":311},[240,4887,4888],{"class":257}," exportMarkdownDocx",[240,4890,413],{"class":246},[240,4892,4893],{"class":264},"'# Document",[240,4895,1517],{"class":336},[240,4897,4898],{"class":264},"**Body**'",[240,4900,380],{"class":246},[240,4902,4903],{"class":242,"line":361},[240,4904,4905],{"class":295},"\u002F\u002F exported.data is Uint8Array; diagnostics reports approximations and omissions.\n",[240,4907,4908,4910,4913,4915,4917,4920],{"class":242,"line":383},[240,4909,333],{"class":311},[240,4911,4912],{"class":336}," imported",[240,4914,340],{"class":311},[240,4916,2857],{"class":311},[240,4918,4919],{"class":257}," importDocxMarkdown",[240,4921,4922],{"class":246},"(exported.data)\n",[240,4924,4925,4927,4929],{"class":242,"line":404},[240,4926,407],{"class":246},[240,4928,410],{"class":257},[240,4930,4931],{"class":246},"(imported.markdown, imported.diagnostics)\n",[15,4933,4934,566,4937,4940,4941,4944,4945,4948,4949,4952,4953,1370,4956,4959,4960,4963],{},[24,4935,4936],{},"markdownToLitAst()",[24,4938,4939],{},"litAstToMarkdown()"," expose the same intermediate conversion stages.\nThe former returns ",[24,4942,4943],{},"authoredParts"," for styles and document settings. Custom compilation must pass them\nwith the AST to ",[24,4946,4947],{},"createDocxPackagePlan(ast, { authoredParts })",", so styles and round-trip metadata share one result.\n",[24,4950,4951],{},"lossPolicy: 'strict'"," throws ",[24,4954,4955],{},"MarkdownDocxLossError",[24,4957,4958],{},"diagnostics"," when loss is detected;\nthe default ",[24,4961,4962],{},"best-effort"," returns content and the report. The adapter is a QuireKit commercial\ncomponent; existing MSFE licenses are unchanged.",[15,4965,4966,4967,4970,4971,4974,4975,4978,4979,4981,4982,4984,4985,4988,4989,4992,4993,4996,4997,5000,5001,5004,5005,5008,5009,5012,5013,389,5016,5019,5020,5023],{},"There is no implicit image fetching. Export embeds PNG\u002FJPEG data URIs; other sources require an\nexplicit ",[24,4968,4969],{},"resolveImage(source): Promise\u003Cstring | null>"," returning a supported data URI. Images\nretain their aspect ratio and shrink without enlargement to the actual body, list or nested cell area.\nThe default template writes an A4 page with 1-inch margins. Headings default to 1.1 line spacing with 4–6 pt\nafter, body paragraphs to 1.15 line spacing with 6 pt after, and list items to 2 pt after. Explicit spacing\nor style references supplied by custom conversions take precedence. Adjacent tables and framed containers\nreceive an 8 pt separator in addition to existing paragraph spacing, including sibling blocks inside\nnested containers; reimport does not add empty content for this spacing. Export templates now configure\nthese appearances; omitting a template retains the defaults. Import retains data URIs by default;\n",[24,4972,4973],{},"storeImage({ dataUrl, alt }): Promise\u003Cstring | null>"," can store them and return a persistent URL.\nStorage failure retains embedded data with a diagnostic; temporary ",[24,4976,4977],{},"blob:"," URLs are never persisted.\nPass these options with the converter to the component's ",[24,4980,1986],{}," prop, or to a standalone conversion\nfunction. Omit ",[24,4983,1986],{}," or set ",[24,4986,4987],{},":docx=\"false\""," to hide only the Word import and export items.\nOutside the editor (for example, when a host imports a Word file as a new document), call\n",[24,4990,4991],{},"mdDocx().importDocx(data, { policy, features, signal })","; it applies the editor's default conversions\n(flowcharts, mind maps, whiteboards, containers and code diagrams), so import and export round-trip\nconsistently. Install custom node conversions with ",[24,4994,4995],{},"mdDocx({ extensions })",".\nMarkdown has no syntax for native Word charts, so import renders each chart from its cached data to a\nstatic PNG (stored through ",[24,4998,4999],{},"storeImage"," like other images) and reports one ",[24,5002,5003],{},"chart-rasterized"," per chart.\nChart families it cannot read (scatter, combination, newer chart types and so on) become an ",[24,5006,5007],{},"[alt text]","\nplaceholder reported as ",[24,5010,5011],{},"chart-omitted","; a chart never fails the whole import. Hosts can supply their own renderer\nwith ",[24,5014,5015],{},"mdDocx({ renderChart })",[24,5017,5018],{},"(chart) => Promise\u003Cstring | null>","); ",[24,5021,5022],{},"builtins: false"," disables chart rendering.",[458,5025,5027],{"id":5026},"pdf-and-ofd-export","PDF and OFD export",[15,5029,5030,5031,5033],{},"PDF and OFD come from the optional commercial ",[24,5032,4781],{}," package as export plugins;\nthe basic editor does not depend on it:",[231,5035,5037],{"className":302,"code":5036,"language":304,"meta":236,"style":236},"import { mdOfdExport, mdPdfExport } from '@quirekit\u002Fmd-editor-export'\n\nconst exporters = [mdPdfExport(), mdOfdExport()]\n\u002F\u002F \u003CMdEditor :exporters=\"exporters\" \u002F>\n",[24,5038,5039,5050,5054,5077],{"__ignoreMap":236},[240,5040,5041,5043,5046,5048],{"class":242,"line":243},[240,5042,312],{"class":311},[240,5044,5045],{"class":246}," { mdOfdExport, mdPdfExport } ",[240,5047,318],{"class":311},[240,5049,4803],{"class":264},[240,5051,5052],{"class":242,"line":292},[240,5053,327],{"emptyLinePlaceholder":326},[240,5055,5056,5058,5061,5063,5065,5068,5071,5074],{"class":242,"line":330},[240,5057,333],{"class":311},[240,5059,5060],{"class":336}," exporters",[240,5062,340],{"class":311},[240,5064,717],{"class":246},[240,5066,5067],{"class":257},"mdPdfExport",[240,5069,5070],{"class":246},"(), ",[240,5072,5073],{"class":257},"mdOfdExport",[240,5075,5076],{"class":246},"()]\n",[240,5078,5079],{"class":242,"line":361},[240,5080,5081],{"class":295},"\u002F\u002F \u003CMdEditor :exporters=\"exporters\" \u002F>\n",[15,5083,5084],{},"Each plugin adds one Export menu item. Exporting captures the current source and selected template, then\nshows the physical page count and conversion report before download. Read-only documents can export.\nChanging the template regenerates the captured source; closing the dialog or switching documents discards\nstale results. Converters and fonts load on the first export.",[15,5086,5087,5088,5092],{},"Both formats paginate through a temporary Classic document, then encode native PDF or native OFD (without\na PDF intermediate). Body text remains selectable. Tables, containers, footnotes, headers, footers and page\nfields use existing layout; diagrams become images. Equations currently use the default math face as\nhigh-resolution graphics, with a diagnostic, and their text cannot be selected individually. Custom nodes\nreuse the ",[18,5089,5091],{"href":5090},"\u002Fen\u002Fguide\u002Fexport-nodes","existing converters"," instead of a converter per format.",[15,5094,5095,5096,5099,5100,5103,5104,5107,5108,5110],{},"By default the plugins use ",[24,5097,5098],{},"@quirekit\u002Ffont-pack","'s portable fonts: the same bytes are installed as browser\nfaces for measurement and embedded in the file. OFD has no standard Courier, so the plugin embeds DejaVu\nSans Mono for common code faces and reports the substitution; its license ships with font-pack. In PDF an\nunavailable code font resolves to a monospace fallback before measurement, with a diagnostic. Hosts can\nreplace the whole font set through ",[24,5101,5102],{},"fonts"," and set title or author through ",[24,5105,5106],{},"metadata",". Missing glyphs and\nresource failures are reported; ",[24,5109,4951],{}," rejects lossy output.",[15,5112,5113,5114,1240,5117,5120,5121,1240,5124,5127,5128,436,5130,566,5133,5135,5136,5139,5140,5143,5144,1103,5147,5150,5151,126],{},"Without the editor UI, call ",[24,5115,5116],{},"exportMarkdownPdf(markdown, options)",[24,5118,5119],{},"@quirekit\u002Fmd-editor-export\u002Fpdf","\nor ",[24,5122,5123],{},"exportMarkdownOfd",[24,5125,5126],{},"\u002Fofd","; both return ",[24,5129,3452],{},[24,5131,5132],{},"pageCount",[24,5134,4958],{},". Supply embeddable\nfonts explicitly. Non-browser hosts must provide ",[24,5137,5138],{},"textMeasurer"," and, for equations, ",[24,5141,5142],{},"rasterizeFormula",".\nOFD ",[24,5145,5146],{},"fontEmbedding",[24,5148,5149],{},"subset"," and can be ",[24,5152,5153],{},"full",[15,5155,5156],{},"Neither format promises pixel identity with Word in different font environments, preserves editable\nMarkdown metadata or supports Markdown import. PDF\u002FA, Tagged PDF and background workers for large\ndocuments remain future work.",[458,5158,5160],{"id":5159},"export-templates","Export templates",[15,5162,5163,5166],{},[24,5164,5165],{},"@quirekit\u002Fexport-template"," provides a format-neutral configuration, default style and strict validation under\nthe MIT license. Templates affect export without changing Markdown content, selection, undo history or Word import.\nPage geometry uses mm; text sizes, spacing, borders and padding use pt. Line height explicitly distinguishes\nmultiples from exact values. This is a public synthetic configuration example:",[231,5168,5170],{"className":302,"code":5169,"language":304,"meta":236,"style":236},"import { resolveExportTemplate } from '@quirekit\u002Fexport-template'\nimport { exportMarkdownDocx } from '@quirekit\u002Fmarkdown-docx'\n\nconst template = resolveExportTemplate({\n  fonts: { body: { latin: 'Arial', eastAsia: 'Microsoft YaHei' } },\n  body: { after: 5 },\n  headings: { h1: { border: { color: '287B69', width: 0.75 }, borderSpace: 4 } },\n  footer: { enabled: true, center: '{page} \u002F {pages}' },\n})\nconst file = await exportMarkdownDocx(markdown, { template, documentTitle: 'Project notes' })\n",[24,5171,5172,5184,5195,5199,5213,5230,5240,5262,5277,5281],{"__ignoreMap":236},[240,5173,5174,5176,5179,5181],{"class":242,"line":243},[240,5175,312],{"class":311},[240,5177,5178],{"class":246}," { resolveExportTemplate } ",[240,5180,318],{"class":311},[240,5182,5183],{"class":264}," '@quirekit\u002Fexport-template'\n",[240,5185,5186,5188,5191,5193],{"class":242,"line":292},[240,5187,312],{"class":311},[240,5189,5190],{"class":246}," { exportMarkdownDocx } ",[240,5192,318],{"class":311},[240,5194,4870],{"class":264},[240,5196,5197],{"class":242,"line":330},[240,5198,327],{"emptyLinePlaceholder":326},[240,5200,5201,5203,5206,5208,5211],{"class":242,"line":361},[240,5202,333],{"class":311},[240,5204,5205],{"class":336}," template",[240,5207,340],{"class":311},[240,5209,5210],{"class":257}," resolveExportTemplate",[240,5212,851],{"class":246},[240,5214,5215,5218,5221,5224,5227],{"class":242,"line":383},[240,5216,5217],{"class":246},"  fonts: { body: { latin: ",[240,5219,5220],{"class":264},"'Arial'",[240,5222,5223],{"class":246},", eastAsia: ",[240,5225,5226],{"class":264},"'Microsoft YaHei'",[240,5228,5229],{"class":246}," } },\n",[240,5231,5232,5235,5238],{"class":242,"line":404},[240,5233,5234],{"class":246},"  body: { after: ",[240,5236,5237],{"class":336},"5",[240,5239,3628],{"class":246},[240,5241,5242,5245,5248,5251,5254,5257,5260],{"class":242,"line":425},[240,5243,5244],{"class":246},"  headings: { h1: { border: { color: ",[240,5246,5247],{"class":264},"'287B69'",[240,5249,5250],{"class":246},", width: ",[240,5252,5253],{"class":336},"0.75",[240,5255,5256],{"class":246}," }, borderSpace: ",[240,5258,5259],{"class":336},"4",[240,5261,5229],{"class":246},[240,5263,5264,5267,5269,5272,5275],{"class":242,"line":711},[240,5265,5266],{"class":246},"  footer: { enabled: ",[240,5268,439],{"class":336},[240,5270,5271],{"class":246},", center: ",[240,5273,5274],{"class":264},"'{page} \u002F {pages}'",[240,5276,3628],{"class":246},[240,5278,5279],{"class":242,"line":746},[240,5280,905],{"class":246},[240,5282,5283,5285,5288,5290,5292,5294,5297,5300],{"class":242,"line":774},[240,5284,333],{"class":311},[240,5286,5287],{"class":336}," file",[240,5289,340],{"class":311},[240,5291,2857],{"class":311},[240,5293,4888],{"class":257},[240,5295,5296],{"class":246},"(markdown, { template, documentTitle: ",[240,5298,5299],{"class":264},"'Project notes'",[240,5301,358],{"class":246},[15,5303,5304,5305,5308,5309,436,5312,566,5315,5318],{},"Configure body text, headings H1–H6, lists, quotes, code, tables, containers, footnotes, equations and images.\nFont roles provide Latin, East Asian and complex-script slots; empty slots retain theme fonts.\n",[24,5306,5307],{},"fonts.math.latin"," selects the native Word math font; equations remain editable. Fonts are not embedded,\nand pagination can vary between devices. Default single-section headers\u002Ffooters support left, center and right\ncontent with ",[24,5310,5311],{},"{title}",[24,5313,5314],{},"{page}",[24,5316,5317],{},"{pages}",". Page values are native Word fields that require reader updates;\nlong single-line text is shortened with a diagnostic. The style illustration is not a Word pagination preview.",[15,5320,5321,5323,5324,5327],{},[24,5322,251],{}," accepts ",[24,5325,5326],{},":docx=\"{ converter, template }\""," directly, or a host can install a template catalog:",[3920,5329,5330,5340,5350],{},[3923,5331,5332,5335,5336,5339],{},[24,5333,5334],{},"templates",": an ",[24,5337,5338],{},"ExportTemplateProvider"," with listing, exact revision reads and optional save\u002Fdelete operations.",[3923,5341,5342,5345,5346,5349],{},[24,5343,5344],{},"v-model:exportStyle",": the current document's ",[24,5347,5348],{},"{ id, revision }",", persisted by the host alongside document settings.",[3923,5351,5352,5355,5356,5359,5360,5363],{},[24,5353,5354],{},"#export-templates=\"{ provider, selected, choose, close }\"",": mount the host picker; call ",[24,5357,5358],{},"choose"," to accept or ",[24,5361,5362],{},"close"," to cancel.",[15,5365,5366,5367,5370],{},"Providing both the provider and slot adds an “Export style” menu item. Word and installed PDF\u002FOFD exporters reuse the selected revision.\nChanging the style inside the export dialog keeps its captured source and regenerates the file. Closing the dialog\nor switching documents discards stale results. Without host persistence, selection lasts only for the current instance.\nMissing or unauthorized revisions block export and require another choice, without a silent fallback. Read-only\ndocuments can still select styles and export. Extensions read the same resolved configuration through\n",[24,5368,5369],{},"markdownExportTemplateService","; explicit formatting and style references from custom conversions take precedence.",[15,5372,5373,5374,5377],{},"The existing ",[18,5375,5376],{"href":20},"MD Editor example"," includes the template library. Chinese and English examples\npersist their export selections separately. The private documentation host is commercially licensed; the basic\neditor and export protocol retain their existing licenses.",[15,5379,5380,5381,5384],{},"The first-party ",[24,5382,5383],{},"@quirekit\u002Fexport-template-library"," and official design packs are separately commercially licensed.\nThey provide browsing, creation, duplicate\u002Fedit, versioned saving and explicitly enabled local storage, installed by a commercial\nhost through these public seams. Component and content-pack entitlements are separate; payment, accounts and production\nlicense verification belong to the host. Basic Markdown\u002FWord export does not depend on commercial packages. Using uploaded\nDOCX\u002FDOTX files as templates remain future capabilities.",[15,5386,5387],{},"In “Template management”, “New template” starts from the default configuration; “New from selected” copies\nthe style currently being previewed. A primary border, soft background and check mark identify the selected card.\nUse the edit button at the top right of a card to modify that template. Built-in templates are read-only, so\nediting creates a copy with its provenance retained; editing a personal template saves a new revision of the same identity.\n“Currently used” marks the document's applied revision. Browsing, editing and saving alone do not apply a template;\n“Use this template” or “Save and use” updates the document's export settings.",[15,5389,5390],{},"Duplicating or editing a template keeps the window at a stable size. Categories replace only the scrollable\nfields; the template name, category tabs and save actions remain visible. Narrow screens use a compact\npreview, with limited-height screens prioritizing the editable fields.\nFields are grouped by appearance, text and paragraph settings, with units beside numeric values.\nClick a color swatch to choose a preset or open “More colors” for precise adjustment. Text colors can\nreturn to “Automatic” and backgrounds to “No fill”. Bold, italic and alignment use formatting buttons.",[458,5392,5394],{"id":5393},"custom-node-conversions-and-round-trips","Custom node conversions and round trips",[15,5396,5397,5398,528,5400,528,5402,654],{},"MD Editor registers containers and all three text-diagram conversions by default, following ",[24,5399,2074],{},[24,5401,2675],{},[24,5403,2678],{},[44,5405,5406,5419],{},[47,5407,5408],{},[50,5409,5410,5413,5416],{},[53,5411,5412],{},"Node",[53,5414,5415],{},"Word content",[53,5417,5418],{},"Reimport",[60,5420,5421,5432,5443,5454],{},[50,5422,5423,5426,5429],{},[65,5424,5425],{},"Single-paragraph container",[65,5427,5428],{},"Paragraph shading, four borders and border spacing",[65,5430,5431],{},"Restore container source after validation",[50,5433,5434,5437,5440],{},[65,5435,5436],{},"Container with a title, lists or nested blocks",[65,5438,5439],{},"Single-cell table shading, borders and cell margins; body remains editable",[65,5441,5442],{},"Restore the complete container after validation",[50,5444,5445,5448,5451],{},[65,5446,5447],{},"Highlight block",[65,5449,5450],{},"Emoji as the first line, borderless shading and optional text color",[65,5452,5453],{},"Restore the highlight source after validation",[50,5455,5456,5459,5462],{},[65,5457,5458],{},"Mermaid, PlantUML or Graphviz\u002FDOT",[65,5460,5461],{},"PNG rendered offscreen from source",[65,5463,5464],{},"Restore the original fence and source after validation",[15,5466,5467],{},"Rounded corners and disclosure interactions are approximated with diagnostics. The default container\nparser recognizes closed named fences at the root and inside container bodies; containers inside lists\nor blockquotes need a host parser extension. Failed image rendering retains code. Export does not depend\non previews being mounted in the current viewport.",[15,5469,5470],{},"Source metadata lives in a standard Custom XML part linked to content controls. Changes to visible\ncontent, image bytes, footnotes\u002Fendnotes or style\u002Fnumbering dependencies invalidate restoration: import keeps current Word\ncontent instead of overwriting edits with stale source. Missing metadata, duplicate identities, unknown\nversions or absent extensions also retain native content or images. QuireKit round trips are verified;\npreservation after saving through Word\u002FWPS or other producers is not yet guaranteed.",[15,5472,1777,5473,5476,5477,5479,5480,5482],{},[24,5474,5475],{},"\u003CMdEditor :docx=\"{ converter, preserveMetadata: false }\" \u002F>"," for native content and images only.\n",[24,5478,5022],{}," disables default node conversions while retaining conversions installed with ",[24,5481,4995],{},". Base MSFE packages\nhave no DOCX dependency.",[15,5484,5485],{},"Register these features explicitly in the standalone adapter. The host supplies image rendering;\nconversion does not implicitly fetch resources:",[231,5487,5489],{"className":302,"code":5488,"language":304,"meta":236,"style":236},"import {\n  createMarkdownDocxContainerExtension,\n  createMarkdownDocxCodeImageExtension,\n  exportMarkdownDocx,\n} from '@quirekit\u002Fmarkdown-docx'\n\n\u002F\u002F renderDiagram is an async host function returning a PNG\u002FJPEG data URI or null.\nconst extensions = [\n  createMarkdownDocxContainerExtension({ names: ['note', 'warning', 'decision'] }),\n  createMarkdownDocxCodeImageExtension({ languages: ['mermaid'], render: renderDiagram }),\n]\nconst result = await exportMarkdownDocx(markdown, { extensions })\n\u002F\u002F Pass the same extensions to importDocxMarkdown; import-only registration can omit render.\n",[24,5490,5491,5497,5502,5507,5512,5520,5524,5529,5540,5561,5575,5580,5595],{"__ignoreMap":236},[240,5492,5493,5495],{"class":242,"line":243},[240,5494,312],{"class":311},[240,5496,662],{"class":246},[240,5498,5499],{"class":242,"line":292},[240,5500,5501],{"class":246},"  createMarkdownDocxContainerExtension,\n",[240,5503,5504],{"class":242,"line":330},[240,5505,5506],{"class":246},"  createMarkdownDocxCodeImageExtension,\n",[240,5508,5509],{"class":242,"line":361},[240,5510,5511],{"class":246},"  exportMarkdownDocx,\n",[240,5513,5514,5516,5518],{"class":242,"line":383},[240,5515,4564],{"class":246},[240,5517,318],{"class":311},[240,5519,4870],{"class":264},[240,5521,5522],{"class":242,"line":404},[240,5523,327],{"emptyLinePlaceholder":326},[240,5525,5526],{"class":242,"line":425},[240,5527,5528],{"class":295},"\u002F\u002F renderDiagram is an async host function returning a PNG\u002FJPEG data URI or null.\n",[240,5530,5531,5533,5535,5537],{"class":242,"line":711},[240,5532,333],{"class":311},[240,5534,2287],{"class":336},[240,5536,340],{"class":311},[240,5538,5539],{"class":246}," [\n",[240,5541,5542,5545,5548,5550,5552,5554,5556,5558],{"class":242,"line":746},[240,5543,5544],{"class":257},"  createMarkdownDocxContainerExtension",[240,5546,5547],{"class":246},"({ names: [",[240,5549,2518],{"class":264},[240,5551,436],{"class":246},[240,5553,2523],{"class":264},[240,5555,436],{"class":246},[240,5557,2533],{"class":264},[240,5559,5560],{"class":246},"] }),\n",[240,5562,5563,5566,5569,5572],{"class":242,"line":774},[240,5564,5565],{"class":257},"  createMarkdownDocxCodeImageExtension",[240,5567,5568],{"class":246},"({ languages: [",[240,5570,5571],{"class":264},"'mermaid'",[240,5573,5574],{"class":246},"], render: renderDiagram }),\n",[240,5576,5577],{"class":242,"line":782},[240,5578,5579],{"class":246},"]\n",[240,5581,5582,5584,5586,5588,5590,5592],{"class":242,"line":788},[240,5583,333],{"class":311},[240,5585,366],{"class":336},[240,5587,340],{"class":311},[240,5589,2857],{"class":311},[240,5591,4888],{"class":257},[240,5593,5594],{"class":246},"(markdown, { extensions })\n",[240,5596,5597],{"class":242,"line":794},[240,5598,5599],{"class":295},"\u002F\u002F Pass the same extensions to importDocxMarkdown; import-only registration can omit render.\n",[15,5601,5602,5603,5606,5607,5610],{},"Custom features implement ",[24,5604,5605],{},"MarkdownDocxExtension.addDocx()"," using the same node contributions as Classic.\nWord\u002FPDF\u002FOFD share parsing, preparation, node codecs and template services. DOCX package passes and\nCustom XML recovery apply only to Word. See ",[18,5608,5609],{"href":5090},"Export custom nodes to Word, PDF and OFD","\nfor complete native-card and image recipes, composition, cancellation and failure handling.",[15,5612,5613,5614,5617],{},"Validate payload versions and fields and retain visible fallback. Metadata is limited to 64 KiB\nper record and 1 MiB \u002F 1000 records per document. ",[24,5615,5616],{},"preserveMetadata"," controls builtins; host extensions own their policy.",[10,5619,5621],{"id":5620},"share-the-prose-classes","Share the Prose classes",[15,5623,5624,5625,2080,5628,5630,5631,5634,5635,5638,5639,528,5642,5645,5646,436,5649,436,5652,566,5655,5658,5659,5662],{},"Live and locked modes use ",[24,5626,5627],{},"qk-prose qk-prose--compact",[24,5629,26],{}," shares the same compact density.\nCode blocks use ",[24,5632,5633],{},"qk-code-block qk-prose-source",". Task controls use the public Checkbox with\n",[24,5636,5637],{},"qk-prose-task-marker"," to preserve body line height and share their inline width with ",[24,5640,5641],{},"[x]",[24,5643,5644],{},"[ ]"," source.\nContainers\nuse ",[24,5647,5648],{},"qk-prose-container",[24,5650,5651],{},"qk-prose-container__header",[24,5653,5654],{},"qk-prose-container__body",[24,5656,5657],{},"data-tone",".\nThe adapter maps CodeMirror blocks to native elements or ",[24,5660,5661],{},"data-qk-prose"," roles that consume the\npublic Prose CSS. Reading and editing share the same style definitions.",[15,5664,5665,5666,5669],{},"Prefer the host's QuireKit theme for fonts, colors and spacing. For a business-specific container,\nscope an explicit variant to ",[24,5667,5668],{},".qk-prose-container[data-container=\"your-type\"]",". Avoid painting\nindividual lines or replacing CodeMirror-owned DOM. Retain the same container identifier when\nusing the variant in static reading.",[10,5671,5673],{"id":5672},"capture-a-reading-view-snapshot","Capture a Reading view snapshot",[231,5675,5677],{"className":233,"code":5676,"language":235,"meta":236,"style":236},"\u003Cscript setup lang=\"ts\">\nimport { shallowRef } from 'vue'\nimport type { EditorState } from '@quirekit\u002Fcm-state'\nimport { MdEditor, MdProse, type MdEditorInstance } from '@quirekit\u002Fmd-editor\u002Fvue'\nimport { QuireButton } from '@quirekit\u002Fui\u002Fvue'\nconst product = shallowRef\u003CMdEditorInstance | null>(null)\nconst snapshot = shallowRef\u003CEditorState>()\n\u003C\u002Fscript>\n\u003Ctemplate>\n  \u003CMdEditor ref=\"product\" markdown=\"# One document\" locale=\"en\" \u002F>\n  \u003CQuireButton @click=\"snapshot = product?.editor?.state\">Capture reading view\u003C\u002FQuireButton>\n  \u003CMdProse v-if=\"snapshot\" :state=\"snapshot\" locale=\"en\" \u002F>\n\u003C\u002Ftemplate>\n",[24,5678,5679,5695,5706,5720,5735,5745,5769,5788,5796,5804,5831,5862,5900],{"__ignoreMap":236},[240,5680,5681,5683,5685,5687,5689,5691,5693],{"class":242,"line":243},[240,5682,247],{"class":246},[240,5684,1390],{"class":250},[240,5686,1393],{"class":257},[240,5688,1396],{"class":257},[240,5690,261],{"class":246},[240,5692,1401],{"class":264},[240,5694,1404],{"class":246},[240,5696,5697,5699,5702,5704],{"class":242,"line":292},[240,5698,312],{"class":311},[240,5700,5701],{"class":246}," { shallowRef } ",[240,5703,318],{"class":311},[240,5705,1416],{"class":264},[240,5707,5708,5710,5712,5715,5717],{"class":242,"line":330},[240,5709,312],{"class":311},[240,5711,621],{"class":311},[240,5713,5714],{"class":246}," { EditorState } ",[240,5716,318],{"class":311},[240,5718,5719],{"class":264}," '@quirekit\u002Fcm-state'\n",[240,5721,5722,5724,5727,5729,5731,5733],{"class":242,"line":361},[240,5723,312],{"class":311},[240,5725,5726],{"class":246}," { MdEditor, MdProse, ",[240,5728,1426],{"class":311},[240,5730,1429],{"class":246},[240,5732,318],{"class":311},[240,5734,1434],{"class":264},[240,5736,5737,5739,5741,5743],{"class":242,"line":383},[240,5738,312],{"class":311},[240,5740,1448],{"class":246},[240,5742,318],{"class":311},[240,5744,1453],{"class":264},[240,5746,5747,5749,5751,5753,5755,5757,5759,5761,5763,5765,5767],{"class":242,"line":404},[240,5748,333],{"class":311},[240,5750,1460],{"class":336},[240,5752,340],{"class":311},[240,5754,1465],{"class":257},[240,5756,247],{"class":246},[240,5758,1470],{"class":257},[240,5760,1473],{"class":311},[240,5762,1476],{"class":336},[240,5764,1479],{"class":246},[240,5766,989],{"class":336},[240,5768,380],{"class":246},[240,5770,5771,5773,5776,5778,5780,5782,5785],{"class":242,"line":425},[240,5772,333],{"class":311},[240,5774,5775],{"class":336}," snapshot",[240,5777,340],{"class":311},[240,5779,1465],{"class":257},[240,5781,247],{"class":246},[240,5783,5784],{"class":257},"EditorState",[240,5786,5787],{"class":246},">()\n",[240,5789,5790,5792,5794],{"class":242,"line":711},[240,5791,1610],{"class":246},[240,5793,1390],{"class":250},[240,5795,1404],{"class":246},[240,5797,5798,5800,5802],{"class":242,"line":746},[240,5799,247],{"class":246},[240,5801,1621],{"class":250},[240,5803,1404],{"class":246},[240,5805,5806,5808,5810,5812,5814,5816,5818,5820,5823,5825,5827,5829],{"class":242,"line":774},[240,5807,1628],{"class":246},[240,5809,251],{"class":250},[240,5811,1495],{"class":257},[240,5813,261],{"class":246},[240,5815,1637],{"class":264},[240,5817,1575],{"class":257},[240,5819,261],{"class":246},[240,5821,5822],{"class":264},"\"# One document\"",[240,5824,281],{"class":257},[240,5826,261],{"class":246},[240,5828,286],{"class":264},[240,5830,289],{"class":246},[240,5832,5833,5835,5837,5839,5841,5843,5845,5848,5850,5853,5855,5858,5860],{"class":242,"line":782},[240,5834,1628],{"class":246},[240,5836,1684],{"class":250},[240,5838,1658],{"class":246},[240,5840,1705],{"class":257},[240,5842,261],{"class":246},[240,5844,265],{"class":264},[240,5846,5847],{"class":246},"snapshot ",[240,5849,261],{"class":311},[240,5851,5852],{"class":246}," product?.editor?.state",[240,5854,265],{"class":264},[240,5856,5857],{"class":246},">Capture reading view\u003C\u002F",[240,5859,1684],{"class":250},[240,5861,1404],{"class":246},[240,5863,5864,5866,5868,5871,5873,5875,5877,5879,5881,5884,5886,5888,5890,5892,5894,5896,5898],{"class":242,"line":788},[240,5865,1628],{"class":246},[240,5867,26],{"class":250},[240,5869,5870],{"class":311}," v-if",[240,5872,261],{"class":246},[240,5874,265],{"class":264},[240,5876,3342],{"class":246},[240,5878,265],{"class":264},[240,5880,254],{"class":246},[240,5882,5883],{"class":257},"state",[240,5885,261],{"class":246},[240,5887,265],{"class":264},[240,5889,3342],{"class":246},[240,5891,265],{"class":264},[240,5893,281],{"class":257},[240,5895,261],{"class":246},[240,5897,286],{"class":264},[240,5899,289],{"class":246},[240,5901,5902,5904,5906],{"class":242,"line":794},[240,5903,1610],{"class":246},[240,5905,1621],{"class":250},[240,5907,1404],{"class":246},[15,5909,5910,5912,5913,5916,5917,1240,5920,5922,5923,5927,5928,5931,5932,5935,5936,5940],{},[24,5911,26],{}," consumes immutable state and produces disposable semantic DOM. It does not create a\nsecond editable JSON document or serialize Markdown back. Registered container names are retained\nas ",[24,5914,5915],{},"data-container"," for shared variants. Reading supports core blocks, inline extensions, links,\nimages, formulas, Mermaid, PlantUML, Graphviz\u002FDOT, definition lists, footnotes and Frontmatter. Formulas and diagrams use\nthe same safe renderers; metadata retains source presentation. Disabled diagram languages stay an ordinary\ncode block. Third-party extensions can use ",[24,5918,5919],{},"withMdReading()",[24,5921,1298],{},", sharing\ntheir original codec validation and the reader's cancellation, cleanup and fallback lifecycle.\nSee ",[18,5924,5926],{"href":5925},"\u002Fen\u002Fextensions\u002Fcustom-node","Custom nodes",". Unknown nodes retain source text and source HTML\nis preserved as text by default. ",[24,5929,5930],{},"components"," and explicit ",[24,5933,5934],{},"html"," policies share the\n",[18,5937,5939],{"href":5938},"\u002Fen\u002Fguide\u002Fincremark","public reader's contract",". Reading contributions do not automatically provide Word\u002FPDF\u002FOFD export support.",[10,5942,5944],{"id":5943},"plain-text-and-streamed-ai-responses","Plain text and streamed AI responses",[15,5946,5947,5948,601,5951,5953,5954,5956],{},"Pass the ",[3574,5949,5950],{},"complete source received so far",[24,5952,2210],{}," without creating an editor. Update the same\nstring as chunks arrive; replacement, clearing and switching messages use this property too. Do not\npass ",[24,5955,5883],{}," at the same time.",[231,5958,5960],{"className":233,"code":5959,"language":235,"meta":236,"style":236},"\u003CMdProse\n  :content=\"message.content\"\n  :identity=\"message.id\"\n  :status=\"message.receiving ? 'receiving' : 'complete'\"\n  locale=\"en\"\n  @error=\"reportReadingError\"\n\u002F>\n",[24,5961,5962,5969,5984,6000,6024,6032,6048],{"__ignoreMap":236},[240,5963,5964,5966],{"class":242,"line":243},[240,5965,247],{"class":246},[240,5967,5968],{"class":250},"MdProse\n",[240,5970,5971,5973,5975,5977,5979,5982],{"class":242,"line":292},[240,5972,2481],{"class":246},[240,5974,2210],{"class":257},[240,5976,261],{"class":246},[240,5978,265],{"class":264},[240,5980,5981],{"class":246},"message.content",[240,5983,2492],{"class":264},[240,5985,5986,5988,5991,5993,5995,5998],{"class":242,"line":330},[240,5987,2481],{"class":246},[240,5989,5990],{"class":257},"identity",[240,5992,261],{"class":246},[240,5994,265],{"class":264},[240,5996,5997],{"class":246},"message.id",[240,5999,2492],{"class":264},[240,6001,6002,6004,6007,6009,6011,6014,6016,6019,6021],{"class":242,"line":361},[240,6003,2481],{"class":246},[240,6005,6006],{"class":257},"status",[240,6008,261],{"class":246},[240,6010,265],{"class":264},[240,6012,6013],{"class":246},"message.receiving ",[240,6015,2894],{"class":311},[240,6017,6018],{"class":264}," 'receiving'",[240,6020,254],{"class":311},[240,6022,6023],{"class":264}," 'complete'\"\n",[240,6025,6026,6028,6030],{"class":242,"line":383},[240,6027,2497],{"class":257},[240,6029,261],{"class":246},[240,6031,2502],{"class":264},[240,6033,6034,6037,6039,6041,6043,6046],{"class":242,"line":404},[240,6035,6036],{"class":246},"  @",[240,6038,398],{"class":257},[240,6040,261],{"class":246},[240,6042,265],{"class":264},[240,6044,6045],{"class":246},"reportReadingError",[240,6047,2492],{"class":264},[240,6049,6050],{"class":242,"line":425},[240,6051,2658],{"class":246},[15,6053,6054,5323,6056,436,6059,436,6062,566,6065,6067],{},[24,6055,6006],{},[24,6057,6058],{},"receiving",[24,6060,6061],{},"complete",[24,6063,6064],{},"stopped",[24,6066,398],{},". It describes transport only. Stopping\nor failing preserves source; late definitions may still correct earlier references. Blocks are never\nprematurely frozen. Open fences show code immediately; Mermaid and other previews start only after\nclosure. Repeated footnote references have distinct anchors; duplicate link definitions use the first.",[15,6069,6070,5323,6073,6076,6077,436,6079,566,6081,6083,6084,6087,6088,6091,6092,6095,6096,6099],{},[24,6071,6072],{},"options",[24,6074,6075],{},"MdEditorExtensionOptions",", including ",[24,6078,2091],{},[24,6080,2074],{},[24,6082,2134],{},".\nRegister reading contributions with ",[24,6085,6086],{},"withMdReading",". Replacing options or identity releases the old\nsession and resources. Configuration must be pure and independent of a mounted editor: initialization\ncannot use ",[24,6089,6090],{},"this.editor"," or install a source provider. Failures emit ",[24,6093,6094],{},"MdReadingError","; source setup or\nparse failures use ",[24,6097,6098],{},"phase: 'parse'"," and retain escaped source text.",[6101,6102],"msfe-demo",{"name":6103},"reading\u002Fstream",[15,6105,6106,6107,6109,6110,6112,6113,6116,6117,6119,6120,5931,6122,6124],{},"The example appends 20 UTF-16 code units every 30ms, with link and footnote definitions arriving last.\nStop, load everything, or restart. This executable example uses ",[24,6108,26],{},", which renders identical escaped\nsource on the server and first client frame, then parses after mount. Pass an accepted ",[24,6111,5883],{}," for\nsemantic SSR, or use the ",[18,6114,6115],{"href":5938},"public reading component",". ",[24,6118,26],{}," also shares its\n",[24,6121,5930],{},[24,6123,5934],{}," policies. Additional parsing yields cooperatively, without a hard real-time guarantee. Large documents\nand dense references still involve global work. Stable top-level blocks reuse their projection when\nsyntax identity, positions and dependencies are unchanged; growing blocks are projected again.",[15,6126,6127,6128,6131,6132,6135,6136,6139,6140,6142,6143,6145],{},"Framework-free hosts can use ",[24,6129,6130],{},"MdProseStream",": call ",[24,6133,6134],{},"update(content)",", advance parsing with\n",[24,6137,6138],{},"advance(budget)",", and consume ",[24,6141,5883],{},". A ",[24,6144,1500],{}," result requires another host-scheduled slice;\nthe class creates no timers. Incremark AST renderers, executable HTML and chart configurations are\nnot compatible input to this API.",[10,6147,6149],{"id":6148},"framework-neutral-assembly","Framework-neutral assembly",[15,6151,6152,6155,6156,6159,6160,6163,6164,6167,6168,6170,6171,528,6173,528,6175,6177,6178,6181],{},[24,6153,6154],{},"createMdEditor(options)"," returns the original ",[24,6157,6158],{},"MsfeEditor"," contract. Lifecycle, commands and\nsaving methods are unchanged. ",[24,6161,6162],{},"createMdEditorExtensions(options)"," returns the product extension\nset for an existing MSFE factory. ",[24,6165,6166],{},"vueMdEditorExtensions(locale, options, edit?)"," installs Vue task,\nimage, code-language and disclosure controls and requires the MSFE Vue component host. Its third\nargument can handle formula\u002Fdiagram editing. ",[24,6169,251],{}," already assembles these controls and the\nshared dialogs. The framework-neutral factory does not mount Vue toolbars or formula panels;\nprovide editing callbacks through ",[24,6172,2672],{},[24,6174,2675],{},[24,6176,2678],{},", or use ",[24,6179,6180],{},"view: 'preview'","\nto edit active-node source directly.",[10,6183,6185],{"id":6184},"highlight-blocks","Highlight blocks",[15,6187,6188,6189,6192,6193,6196],{},"A highlight block is a body block with an emoji icon on the left and a light background, useful for\ncalling out one reminder or conclusion. Type ",[24,6190,6191],{},"\u002Fhighlight"," (or ",[24,6194,6195],{},"\u002Fcallout",") in an empty paragraph, or create\none from the toolbar Insert menu or the block menu's Insert above \u002F Insert below. The body is ordinary\ncontent: keep typing, split paragraphs, add lists or nest other blocks.",[3920,6198,6199,6206,6209],{},[3923,6200,6201,6202,6205],{},"Click the icon to open the emoji picker; choosing one only replaces ",[24,6203,6204],{},"emoji"," on the opening line.",[3923,6207,6208],{},"Open the highlight's block menu and choose Color settings. Highlight color offers six backgrounds\n(light orange, red, green, blue, purple and gray); Text color offers Default or the same colors.\nEach change is one undoable source replacement.",[3923,6210,6211],{},"In read-only mode the icon is display-only. In Live preview, placing the caret inside the\nhighlight reveals its complete source.",[231,6213,6216],{"className":6214,"code":6215,"language":258,"meta":236,"style":236},"language-markdown shiki shiki-themes github-light github-light github-dark","::: highlight {emoji=📌 color=purple text=blue}\nThe body is ordinary Markdown, with **emphasis**, lists or several paragraphs.\n:::\n",[24,6217,6218,6223,6228],{"__ignoreMap":236},[240,6219,6220],{"class":242,"line":243},[240,6221,6222],{},"::: highlight {emoji=📌 color=purple text=blue}\n",[240,6224,6225],{"class":242,"line":292},[240,6226,6227],{},"The body is ordinary Markdown, with **emphasis**, lists or several paragraphs.\n",[240,6229,6230],{"class":242,"line":330},[240,6231,6232],{},":::\n",[15,6234,6235,6236,6239,6240,1103,6242,2080,6245,6248,6249,2080,6252,6255,6256,6259],{},"Attributes live in ",[24,6237,6238],{},"{}"," on the opening line: ",[24,6241,6204],{},[24,6243,6244],{},"📌",[24,6246,6247],{},"color"," names the background and\ndefaults to ",[24,6250,6251],{},"orange",[24,6253,6254],{},"text"," names the text color and is omitted for the default. Only color names are\nstored; editing and reading map them to the theme's semantic colors, so dark themes follow automatically.\nUnknown keys or names fall back to the defaults without rewriting the source. Renderers without ",[24,6257,6258],{},":::","\ncontainer support show the fence lines as plain text and the body as ordinary Markdown, so nothing is lost.",[15,6261,6262,6263,6265,6266,6268,6269,6272,6273,6275,6276,6278],{},"Highlights use the default ",[24,6264,2074],{}," name ",[24,6267,2121],{},". Setting ",[24,6270,6271],{},"containers.types"," replaces the whole\nlist, so include ",[24,6274,2121],{}," when you still need it. ",[24,6277,26],{},", Word, PDF and OFD export use the same\nsource: exports write the icon as the first line and fixed light approximations of the background and\ntext color, and Word import restores the original source.",[10,6280,6282],{"id":6281},"dates-emoji-and-mentions","Dates, emoji and mentions",[15,6284,6285],{},"The style field uses the same bordered Select as Classic. Text formatting stays directly visible,\nand the grouped Insert menu gives each action an icon from the shared registry.",[15,6287,6288,6291,6292,6295,6296,6299,6300,6303,6304,6306,6307,6309,6310,6313],{},[3574,6289,6290],{},"Insert → Date"," uses ",[24,6293,6294],{},"QuireCalendar",". Browsing months does not edit the document. Choosing a day or\nToday inserts an ISO ",[24,6297,6298],{},"YYYY-MM-DD"," calendar date without time-zone conversion. ",[3574,6301,6302],{},"Insert → Emoji"," uses\n",[24,6305,2366],{},". Common shortcuts and all categories share one continuously scrolling ",[24,6308,1187],{},"\nwith the component library's custom scrollbar. Search and category navigation remain fixed. Category buttons\nscroll to their section; scrolling updates the active category. Bilingual search deduplicates results, and\nrecent choices belong to the current editor session. Values are exact Unicode sequences, including composed emoji. Divider inserts an ordinary\n",[24,6311,6312],{},"---"," block. Each insertion uses the mapped source anchor captured when opening the menu and undoes once.",[15,6315,2661,6316,6318],{},[24,6317,1939],{}," to enable a contact picker. The standalone example uses fictional local contacts.\nA static array is filtered by label, description or id; an asynchronous provider owns search and access\nfiltering. The application implements the endpoint in this example:",[231,6320,6322],{"className":233,"code":6321,"language":235,"meta":236,"style":236},"\u003Cscript setup lang=\"ts\">\nimport { MdEditor } from '@quirekit\u002Fmd-editor\u002Fvue'\nimport type { MdMention, MdMentionSource } from '@quirekit\u002Fmd-editor'\n\nconst initialMarkdown = '# Project plan\\n\\n'\nconst contacts: readonly MdMention[] = [\n  { id: 'lin', label: 'Lin', url: '\u002Fpeople\u002Flin', description: 'Design' },\n  { id: 'chen', label: 'Chen', url: '\u002Fpeople\u002Fchen', description: 'Engineering' },\n]\n\n\u002F\u002F Use this provider instead of contacts for a host-owned remote directory.\nconst searchContacts: MdMentionSource = async ({ query, signal }) => {\n  const response = await fetch(`\u002Fapi\u002Fpeople?q=${encodeURIComponent(query)}`, { signal })\n  if (!response.ok) throw new Error('Contacts are unavailable')\n  return await response.json() as MdMention[]\n}\n\u003C\u002Fscript>\n\u003Ctemplate>\n  \u003CMdEditor :markdown=\"initialMarkdown\" :mentions=\"contacts\" locale=\"en\" \u002F>\n\u003C\u002Ftemplate>\n",[24,6323,6324,6340,6351,6364,6368,6383,6404,6430,6454,6458,6462,6467,6500,6530,6557,6577,6581,6589,6597,6636],{"__ignoreMap":236},[240,6325,6326,6328,6330,6332,6334,6336,6338],{"class":242,"line":243},[240,6327,247],{"class":246},[240,6329,1390],{"class":250},[240,6331,1393],{"class":257},[240,6333,1396],{"class":257},[240,6335,261],{"class":246},[240,6337,1401],{"class":264},[240,6339,1404],{"class":246},[240,6341,6342,6344,6347,6349],{"class":242,"line":292},[240,6343,312],{"class":311},[240,6345,6346],{"class":246}," { MdEditor } ",[240,6348,318],{"class":311},[240,6350,1434],{"class":264},[240,6352,6353,6355,6357,6360,6362],{"class":242,"line":330},[240,6354,312],{"class":311},[240,6356,621],{"class":311},[240,6358,6359],{"class":246}," { MdMention, MdMentionSource } ",[240,6361,318],{"class":311},[240,6363,321],{"class":264},[240,6365,6366],{"class":242,"line":361},[240,6367,327],{"emptyLinePlaceholder":326},[240,6369,6370,6372,6374,6376,6379,6381],{"class":242,"line":383},[240,6371,333],{"class":311},[240,6373,1509],{"class":336},[240,6375,340],{"class":311},[240,6377,6378],{"class":264}," '# Project plan",[240,6380,1517],{"class":336},[240,6382,1526],{"class":264},[240,6384,6385,6387,6390,6392,6395,6398,6400,6402],{"class":242,"line":404},[240,6386,333],{"class":311},[240,6388,6389],{"class":336}," contacts",[240,6391,654],{"class":311},[240,6393,6394],{"class":311}," readonly",[240,6396,6397],{"class":257}," MdMention",[240,6399,2914],{"class":246},[240,6401,261],{"class":311},[240,6403,5539],{"class":246},[240,6405,6406,6409,6411,6414,6416,6419,6422,6425,6428],{"class":242,"line":425},[240,6407,6408],{"class":246},"  { id: ",[240,6410,3273],{"class":264},[240,6412,6413],{"class":246},", label: ",[240,6415,3279],{"class":264},[240,6417,6418],{"class":246},", url: ",[240,6420,6421],{"class":264},"'\u002Fpeople\u002Flin'",[240,6423,6424],{"class":246},", description: ",[240,6426,6427],{"class":264},"'Design'",[240,6429,3628],{"class":246},[240,6431,6432,6434,6437,6439,6442,6444,6447,6449,6452],{"class":242,"line":711},[240,6433,6408],{"class":246},[240,6435,6436],{"class":264},"'chen'",[240,6438,6413],{"class":246},[240,6440,6441],{"class":264},"'Chen'",[240,6443,6418],{"class":246},[240,6445,6446],{"class":264},"'\u002Fpeople\u002Fchen'",[240,6448,6424],{"class":246},[240,6450,6451],{"class":264},"'Engineering'",[240,6453,3628],{"class":246},[240,6455,6456],{"class":242,"line":746},[240,6457,5579],{"class":246},[240,6459,6460],{"class":242,"line":774},[240,6461,327],{"emptyLinePlaceholder":326},[240,6463,6464],{"class":242,"line":782},[240,6465,6466],{"class":295},"\u002F\u002F Use this provider instead of contacts for a host-owned remote directory.\n",[240,6468,6469,6471,6474,6476,6479,6481,6484,6487,6490,6492,6494,6496,6498],{"class":242,"line":788},[240,6470,333],{"class":311},[240,6472,6473],{"class":257}," searchContacts",[240,6475,654],{"class":311},[240,6477,6478],{"class":257}," MdMentionSource",[240,6480,340],{"class":311},[240,6482,6483],{"class":311}," async",[240,6485,6486],{"class":246}," ({ ",[240,6488,6489],{"class":704},"query",[240,6491,436],{"class":246},[240,6493,2839],{"class":704},[240,6495,4439],{"class":246},[240,6497,2610],{"class":311},[240,6499,662],{"class":246},[240,6501,6502,6504,6506,6508,6510,6512,6514,6517,6520,6522,6524,6526,6528],{"class":242,"line":794},[240,6503,1546],{"class":311},[240,6505,2852],{"class":336},[240,6507,340],{"class":311},[240,6509,2857],{"class":311},[240,6511,2860],{"class":257},[240,6513,413],{"class":246},[240,6515,6516],{"class":264},"`\u002Fapi\u002Fpeople?q=${",[240,6518,6519],{"class":257},"encodeURIComponent",[240,6521,413],{"class":264},[240,6523,6489],{"class":246},[240,6525,868],{"class":264},[240,6527,2812],{"class":264},[240,6529,2884],{"class":246},[240,6531,6532,6534,6536,6538,6541,6544,6547,6550,6552,6555],{"class":242,"line":817},[240,6533,1558],{"class":311},[240,6535,389],{"class":246},[240,6537,392],{"class":311},[240,6539,6540],{"class":246},"response.ok) ",[240,6542,6543],{"class":311},"throw",[240,6545,6546],{"class":311}," new",[240,6548,6549],{"class":257}," Error",[240,6551,413],{"class":246},[240,6553,6554],{"class":264},"'Contacts are unavailable'",[240,6556,380],{"class":246},[240,6558,6559,6562,6564,6566,6568,6570,6572,6574],{"class":242,"line":823},[240,6560,6561],{"class":311},"  return",[240,6563,2857],{"class":311},[240,6565,2899],{"class":246},[240,6567,2902],{"class":257},[240,6569,2905],{"class":246},[240,6571,2908],{"class":311},[240,6573,6397],{"class":257},[240,6575,6576],{"class":246},"[]\n",[240,6578,6579],{"class":242,"line":829},[240,6580,832],{"class":246},[240,6582,6583,6585,6587],{"class":242,"line":835},[240,6584,1610],{"class":246},[240,6586,1390],{"class":250},[240,6588,1404],{"class":246},[240,6590,6591,6593,6595],{"class":242,"line":840},[240,6592,247],{"class":246},[240,6594,1621],{"class":250},[240,6596,1404],{"class":246},[240,6598,6599,6601,6603,6605,6607,6609,6611,6613,6615,6617,6619,6621,6623,6626,6628,6630,6632,6634],{"class":242,"line":854},[240,6600,1628],{"class":246},[240,6602,251],{"class":250},[240,6604,254],{"class":246},[240,6606,258],{"class":257},[240,6608,261],{"class":246},[240,6610,265],{"class":264},[240,6612,268],{"class":246},[240,6614,265],{"class":264},[240,6616,254],{"class":246},[240,6618,1939],{"class":257},[240,6620,261],{"class":246},[240,6622,265],{"class":264},[240,6624,6625],{"class":246},"contacts",[240,6627,265],{"class":264},[240,6629,281],{"class":257},[240,6631,261],{"class":246},[240,6633,286],{"class":264},[240,6635,289],{"class":246},[240,6637,6638,6640,6642],{"class":242,"line":875},[240,6639,1610],{"class":246},[240,6641,1621],{"class":250},[240,6643,1404],{"class":246},[15,6645,6646,6647,6649,6650,6652,6653,6655,6656,6658],{},"Choose Insert → Mention, or type ",[24,6648,1945],{}," after whitespace or an opening bracket in text. Search inside the\npicker, then use the arrow keys and Enter, or click a contact. The typed trigger replaces only its ",[24,6651,1945],{},";\nthe menu action replaces the captured selection. Cancel preserves the typed ",[24,6654,1945],{},"; search drafts never\nenter the document. Pasted text, email addresses, code, formulas and links do not trigger suggestions. Configure\n",[24,6657,1939],{}," at mount to install the trigger. Replacing an installed provider updates its results;\nenabling the feature after an initially unconfigured mount requires a remount.",[15,6660,6661,6662,6665,6666,6669,6670,6672,6673,6675,6676,6679],{},"The shared ",[24,6663,6664],{},"SuggestionController"," correlates requests, aborts obsolete queries and suppresses queries\nduring composition. Failures offer Retry. A stale source anchor, document replacement or read-only\nstate rejects insertion. Each item needs a stable ",[24,6667,6668],{},"id",", a nonempty ",[24,6671,1830],{}," and a safe ",[24,6674,4470],{},".\nThe result is a portable ",[24,6677,6678],{},"[@Lin](\u003C\u002Fpeople\u002Flin>)"," Markdown link. No hidden identity document or notification\nservice is created; notifications, permissions and member profile pages belong to the application.",[15,6681,6682,6684,6685,6688,6689,6692,6693,6696,6697,389,6700,6702,6703,6706,6707,6710,6711,6714],{},[24,6683,2366],{}," is independently exported from ",[24,6686,6687],{},"@quirekit\u002Fui\u002Fvue",". Replace its catalog with ",[24,6690,6691],{},"items","\nand ",[24,6694,6695],{},"groups",", configure shortcut order with ",[24,6698,6699],{},"common",[24,6701,2150],{}," hides it), supply host-owned ",[24,6704,6705],{},"recent"," values,\nand handle ",[24,6708,6709],{},"select"," for the item and its exact Unicode\n",[24,6712,6713],{},"value",". The component has no editor dependency, overlay or persistent storage. Its default catalog is\ncurated rather than a complete Unicode catalog; a skin-tone selector is not included. Common shortcuts are\ncurated defaults rather than frequency-based rankings; recent choices appear in their own section.",[231,6716,6718],{"className":302,"code":6717,"language":304,"meta":236,"style":236},"import { insertMdDate, insertMdText, insertMdMention } from '@quirekit\u002Fmd-editor'\neditor.run(insertMdDate('2026-10-16'))\neditor.run(insertMdText('🎯'))\neditor.run(insertMdMention({ id: 'lin', label: 'Lin', url: '\u002Fpeople\u002Flin' }))\n",[24,6719,6720,6731,6750,6768],{"__ignoreMap":236},[240,6721,6722,6724,6727,6729],{"class":242,"line":243},[240,6723,312],{"class":311},[240,6725,6726],{"class":246}," { insertMdDate, insertMdText, insertMdMention } ",[240,6728,318],{"class":311},[240,6730,321],{"class":264},[240,6732,6733,6735,6737,6739,6742,6744,6747],{"class":242,"line":292},[240,6734,4577],{"class":246},[240,6736,4580],{"class":257},[240,6738,413],{"class":246},[240,6740,6741],{"class":257},"insertMdDate",[240,6743,413],{"class":246},[240,6745,6746],{"class":264},"'2026-10-16'",[240,6748,6749],{"class":246},"))\n",[240,6751,6752,6754,6756,6758,6761,6763,6766],{"class":242,"line":330},[240,6753,4577],{"class":246},[240,6755,4580],{"class":257},[240,6757,413],{"class":246},[240,6759,6760],{"class":257},"insertMdText",[240,6762,413],{"class":246},[240,6764,6765],{"class":264},"'🎯'",[240,6767,6749],{"class":246},[240,6769,6770,6772,6774,6776,6779,6782,6784,6786,6788,6790,6792],{"class":242,"line":361},[240,6771,4577],{"class":246},[240,6773,4580],{"class":257},[240,6775,413],{"class":246},[240,6777,6778],{"class":257},"insertMdMention",[240,6780,6781],{"class":246},"({ id: ",[240,6783,3273],{"class":264},[240,6785,6413],{"class":246},[240,6787,3279],{"class":264},[240,6789,6418],{"class":246},[240,6791,6421],{"class":264},[240,6793,6794],{"class":246}," }))\n",[6796,6797,6798],"style",{},"html pre.shiki code .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su0ou, html code.shiki .su0ou{--shiki-default:#22863A;--shiki-light:#22863A;--shiki-dark:#85E89D}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 pre.shiki code .sqmzS, html code.shiki .sqmzS{--shiki-default:#6A737D;--shiki-light:#6A737D;--shiki-dark:#6A737D}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 .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 .sde8i, html code.shiki .sde8i{--shiki-default:#E36209;--shiki-light:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sAPpe, html code.shiki .sAPpe{--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#DBEDFF}",{"title":236,"searchDepth":292,"depth":292,"links":6800},[6801,6802,6803,6806,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6823,6824,6825,6826,6827,6832,6833,6834,6835,6836,6837],{"id":12,"depth":292,"text":13},{"id":41,"depth":292,"text":42},{"id":129,"depth":292,"text":130,"children":6804},[6805],{"id":460,"depth":330,"text":461},{"id":572,"depth":292,"text":573,"children":6807},[6808,6809],{"id":590,"depth":330,"text":591},{"id":993,"depth":330,"text":994},{"id":1138,"depth":292,"text":1139},{"id":1170,"depth":292,"text":1171},{"id":1306,"depth":292,"text":1307},{"id":1377,"depth":292,"text":1378},{"id":1756,"depth":292,"text":1757},{"id":1792,"depth":292,"text":1793},{"id":2699,"depth":292,"text":2700},{"id":3093,"depth":292,"text":3094},{"id":3686,"depth":292,"text":3687},{"id":3752,"depth":292,"text":3753,"children":6820},[6821,6822],{"id":3955,"depth":330,"text":3956},{"id":4173,"depth":330,"text":4174},{"id":4255,"depth":292,"text":4256},{"id":4326,"depth":292,"text":4327},{"id":4534,"depth":292,"text":4535},{"id":4738,"depth":292,"text":4739},{"id":4767,"depth":292,"text":4768,"children":6828},[6829,6830,6831],{"id":5026,"depth":330,"text":5027},{"id":5159,"depth":330,"text":5160},{"id":5393,"depth":330,"text":5394},{"id":5620,"depth":292,"text":5621},{"id":5672,"depth":292,"text":5673},{"id":5943,"depth":292,"text":5944},{"id":6148,"depth":292,"text":6149},{"id":6184,"depth":292,"text":6185},{"id":6281,"depth":292,"text":6282},"Integrate a Markdown document editor that shares QuireKit Prose styles.","md",[251,26,1871,6841,6842,6843,2106,6844],"formula editor","Mermaid","tables","nested containers",{},"\u002Fen\u002Fguide\u002Fmd-editor","Integration",{"title":5,"description":6838},"guide\u002Fmd-editor.en","NcE83b7yieOZU035rRK0ybDH7pa1ZW_9hYDf2CF5E2U",1793046311195]