[{"data":1,"prerenderedAt":1683},["ShallowReactive",2],{"msfe-doc:\u002Fen\u002Fguide\u002Fcollaboration":3,"msfe-source:collaboration\u002Fsession.ts":916,"mdc--w6zcm2-key":917},{"id":4,"title":5,"body":6,"description":900,"extension":901,"keywords":902,"locale":909,"meta":910,"navigation":113,"order":497,"path":911,"section":912,"seo":913,"stem":914,"__hash__":915},"docs\u002Fguide\u002Fcollaboration.en.md","Optional source collaboration",{"type":7,"value":8,"toc":888},"minimark",[9,14,18,22,36,40,48,53,56,73,76,80,83,188,202,206,213,254,269,272,276,287,329,359,363,369,501,531,549,553,563,642,688,695,827,831,834,881,884],[10,11,13],"h2",{"id":12},"try-it-together","Try it together",[15,16,17],"p",{},"Type or select text on either side and watch the other. Try independent undo, read-only mode, and reconnecting after offline edits.",[19,20],"msfe-demo",{"name":21},"collaboration\u002Feditor",[15,23,24,25,30,31,35],{},"This example runs real Yjs through an in-memory channel. Refreshing or leaving clears the content; “Synced” does not mean saved. Open “Integration code” for the complete example.\nThe Activity list below is confirmed by the server extension running in the same-page relay: authors come from the\nconnection, typing merges into one entry and operations such as undo get their own; only the newest 200 entries are kept,\nwith changes for one day. Versions are taken by the server while storing, at most one every 20 seconds, and named versions\ncan be saved too; restoring as participant A updates B's document and records \"Restored a version\". See\n",[26,27,29],"a",{"href":28},"\u002Fen\u002Fguide\u002Fmd-editor#with-collaboration","MD Editor activity"," and ",[26,32,34],{"href":33},"\u002Fen\u002Fguide\u002Fmd-editor#versions","versions"," for the integration.",[10,37,39],{"id":38},"connect-an-application","Connect an application",[15,41,42,43,47],{},"Collaboration is ",[44,45,46],"strong",{},"experimental"," and opt-in. Core, StarterKit, Vue, React, and MD Editor do not include collaboration dependencies by default.",[49,50,52],"h3",{"id":51},"_1-install-the-packages","1. Install the packages",[15,54,55],{},"Install both packages for Hocuspocus, or only the first for a custom transport.",[57,58,63],"pre",{"className":59,"code":60,"language":61,"meta":62,"style":62},"language-sh shiki shiki-themes github-light github-light github-dark","pnpm add @quirekit\u002Fmsfe-collaboration @quirekit\u002Fmsfe-collaboration-hocuspocus\n","sh","",[64,65,66],"code",{"__ignoreMap":62},[67,68,71],"span",{"class":69,"line":70},"line",1,[67,72,60],{},[15,74,75],{},"Markdown source is shared. Display mode, theme, and scrolling stay local; your application supplies stable URLs for uploaded images.",[49,77,79],{"id":78},"_2-create-a-session","2. Create a session",[15,81,82],{},"Provide a document ID, service endpoints, and application credentials:",[57,84,89],{"className":85,"code":86,"filename":87,"language":88,"meta":62,"style":62},"language-ts shiki shiki-themes github-light github-light github-dark","import { sharedSource, mountSharedSource } from '.\u002Fcollaboration\u002Fsession'\n\nconst session = sharedSource('document-123', {\n  url: 'wss:\u002F\u002Fyour-service.example\u002Fcollaboration',\n  sessionEndpoint: 'https:\u002F\u002Fyour-service.example\u002Fapi\u002Fcollaboration\u002Fopen',\n  token: () => applicationAccessToken(),\n})\n","collaboration.ts","ts",[64,90,91,108,115,141,153,164,182],{"__ignoreMap":62},[67,92,93,97,101,104],{"class":69,"line":70},[67,94,96],{"class":95},"sDD9d","import",[67,98,100],{"class":99},"sVPnS"," { sharedSource, mountSharedSource } ",[67,102,103],{"class":95},"from",[67,105,107],{"class":106},"s-HEn"," '.\u002Fcollaboration\u002Fsession'\n",[67,109,111],{"class":69,"line":110},2,[67,112,114],{"emptyLinePlaceholder":113},true,"\n",[67,116,118,121,125,128,132,135,138],{"class":69,"line":117},3,[67,119,120],{"class":95},"const",[67,122,124],{"class":123},"sUNQB"," session",[67,126,127],{"class":95}," =",[67,129,131],{"class":130},"sgQzM"," sharedSource",[67,133,134],{"class":99},"(",[67,136,137],{"class":106},"'document-123'",[67,139,140],{"class":99},", {\n",[67,142,144,147,150],{"class":69,"line":143},4,[67,145,146],{"class":99},"  url: ",[67,148,149],{"class":106},"'wss:\u002F\u002Fyour-service.example\u002Fcollaboration'",[67,151,152],{"class":99},",\n",[67,154,156,159,162],{"class":69,"line":155},5,[67,157,158],{"class":99},"  sessionEndpoint: ",[67,160,161],{"class":106},"'https:\u002F\u002Fyour-service.example\u002Fapi\u002Fcollaboration\u002Fopen'",[67,163,152],{"class":99},[67,165,167,170,173,176,179],{"class":69,"line":166},6,[67,168,169],{"class":130},"  token",[67,171,172],{"class":99},": () ",[67,174,175],{"class":95},"=>",[67,177,178],{"class":130}," applicationAccessToken",[67,180,181],{"class":99},"(),\n",[67,183,185],{"class":69,"line":184},7,[67,186,187],{"class":99},"})\n",[15,189,190,193,194,197,198,201],{},[64,191,192],{},"url"," carries WebSocket synchronization. Your ",[64,195,196],{},"sessionEndpoint"," returns document identity, epoch, format, and permissions. ",[44,199,200],{},"A WebSocket URL alone is not enough."," Replace the example URLs and credential function.",[49,203,205],{"id":204},"_3-prepare-and-mount","3. Prepare and mount",[15,207,208,209,212],{},"Continue in the same file to mount the editor; ",[64,210,211],{},"parent"," is the mount element. The helper prepares the session first, with an abort signal to cancel preparation when the route exits.",[57,214,216],{"className":85,"code":215,"filename":87,"language":88,"meta":62,"style":62},"const controller = new AbortController()\nconst editor = await mountSharedSource(parent, session, controller.signal)\n",[64,217,218,236],{"__ignoreMap":62},[67,219,220,222,225,227,230,233],{"class":69,"line":70},[67,221,120],{"class":95},[67,223,224],{"class":123}," controller",[67,226,127],{"class":95},[67,228,229],{"class":95}," new",[67,231,232],{"class":130}," AbortController",[67,234,235],{"class":99},"()\n",[67,237,238,240,243,245,248,251],{"class":69,"line":110},[67,239,120],{"class":95},[67,241,242],{"class":123}," editor",[67,244,127],{"class":95},[67,246,247],{"class":95}," await",[67,249,250],{"class":130}," mountSharedSource",[67,252,253],{"class":99},"(parent, session, controller.signal)\n",[255,256,258,265],"msfe-details",{"title":257},"View the complete integration module",[15,259,260,261,264],{},"Save this file as ",[64,262,263],{},"collaboration\u002Fsession.ts"," alongside the calling code above.",[266,267],"msfe-recipe",{"name":268},"collaboration\u002Fsession",[15,270,271],{},"The service creates new documents and seeds their initial content. Do not reinsert initial Markdown on every connection; existing empty documents must stay empty.",[10,273,275],{"id":274},"use-the-existing-extensions-option","Use the existing extensions option",[15,277,278,279,282,283,286],{},"Add ",[64,280,281],{},"Collaboration.configure({ session })"," and omit initial ",[64,284,285],{},"markdown",". MD Editor, Vue, and React use their existing extension entry points:",[57,288,292],{"className":289,"code":290,"language":291,"meta":62,"style":62},"language-vue shiki shiki-themes github-light github-light github-dark","\u003CMdEditor :extensions=\"[Collaboration.configure({ session })]\" \u002F>\n","vue",[64,293,294],{"__ignoreMap":62},[67,295,296,299,303,306,309,312,315,318,321,324,326],{"class":69,"line":70},[67,297,298],{"class":99},"\u003C",[67,300,302],{"class":301},"su0ou","MdEditor",[67,304,305],{"class":99}," :",[67,307,308],{"class":130},"extensions",[67,310,311],{"class":99},"=",[67,313,314],{"class":106},"\"",[67,316,317],{"class":99},"[Collaboration.",[67,319,320],{"class":130},"configure",[67,322,323],{"class":99},"({ session })]",[67,325,314],{"class":106},[67,327,328],{"class":99}," \u002F>\n",[330,331,332,339,345],"ul",{},[333,334,335,338],"li",{},[44,336,337],{},"Prepare before mounting."," Render the component after the session is ready. One session binds to one editor at a time.",[333,340,341,344],{},[44,342,343],{},"Retain the session."," Unmounting releases the editor binding; remounting can reuse its source and local undo history.",[333,346,347,350,351,354,355,358],{},[44,348,349],{},"Avoid deep reactivity."," In Vue, keep the session in a plain variable, ",[64,352,353],{},"shallowRef",", or ",[64,356,357],{},"markRaw",".",[10,360,362],{"id":361},"optional-cursors-and-collaborators","Optional cursors and collaborators",[15,364,278,365,368],{},[64,366,367],{},"CollaborationPresence"," for named cursors, selections, and online members. Both extensions use the same session:",[57,370,373],{"className":85,"code":371,"filename":372,"language":88,"meta":62,"style":62},"import { Collaboration } from '@quirekit\u002Fmsfe-collaboration'\nimport { CollaborationPresence } from '@quirekit\u002Fmsfe-collaboration\u002Fpresence'\n\nconst extensions = [\n  Collaboration.configure({ session }),\n  CollaborationPresence.configure({\n    session,\n    user: { id: 'alice', name: 'Alice', color: '#2563eb' },\n    onParticipants: peers => { \u002F* Update your collaborator list. *\u002F },\n  }),\n]\n","presence.ts",[64,374,375,387,399,403,415,425,435,440,464,489,495],{"__ignoreMap":62},[67,376,377,379,382,384],{"class":69,"line":70},[67,378,96],{"class":95},[67,380,381],{"class":99}," { Collaboration } ",[67,383,103],{"class":95},[67,385,386],{"class":106}," '@quirekit\u002Fmsfe-collaboration'\n",[67,388,389,391,394,396],{"class":69,"line":110},[67,390,96],{"class":95},[67,392,393],{"class":99}," { CollaborationPresence } ",[67,395,103],{"class":95},[67,397,398],{"class":106}," '@quirekit\u002Fmsfe-collaboration\u002Fpresence'\n",[67,400,401],{"class":69,"line":117},[67,402,114],{"emptyLinePlaceholder":113},[67,404,405,407,410,412],{"class":69,"line":143},[67,406,120],{"class":95},[67,408,409],{"class":123}," extensions",[67,411,127],{"class":95},[67,413,414],{"class":99}," [\n",[67,416,417,420,422],{"class":69,"line":155},[67,418,419],{"class":99},"  Collaboration.",[67,421,320],{"class":130},[67,423,424],{"class":99},"({ session }),\n",[67,426,427,430,432],{"class":69,"line":166},[67,428,429],{"class":99},"  CollaborationPresence.",[67,431,320],{"class":130},[67,433,434],{"class":99},"({\n",[67,436,437],{"class":69,"line":184},[67,438,439],{"class":99},"    session,\n",[67,441,443,446,449,452,455,458,461],{"class":69,"line":442},8,[67,444,445],{"class":99},"    user: { id: ",[67,447,448],{"class":106},"'alice'",[67,450,451],{"class":99},", name: ",[67,453,454],{"class":106},"'Alice'",[67,456,457],{"class":99},", color: ",[67,459,460],{"class":106},"'#2563eb'",[67,462,463],{"class":99}," },\n",[67,465,467,470,473,477,480,483,487],{"class":69,"line":466},9,[67,468,469],{"class":130},"    onParticipants",[67,471,472],{"class":99},": ",[67,474,476],{"class":475},"sde8i","peers",[67,478,479],{"class":95}," =>",[67,481,482],{"class":99}," { ",[67,484,486],{"class":485},"sqmzS","\u002F* Update your collaborator list. *\u002F",[67,488,463],{"class":99},[67,490,492],{"class":69,"line":491},10,[67,493,494],{"class":99},"  }),\n",[67,496,498],{"class":69,"line":497},11,[67,499,500],{"class":99},"]\n",[15,502,503,506,507,510,511,514,515,518,519,522,523,526,527,530],{},[64,504,505],{},"onParticipants"," returns each remote connection's ",[64,508,509],{},"id",", ",[64,512,513],{},"user",", and ",[64,516,517],{},"activity"," (",[64,520,521],{},"editing"," \u002F ",[64,524,525],{},"viewing","). Use ",[64,528,529],{},"QuireAvatar"," as in the example, or your own member UI. Cursor movement does not refresh the roster; multiple connections from one user remain separate.",[330,532,533,543,546],{},[333,534,535,536,539,540,358],{},"Only the ",[44,537,538],{},"primary selection"," is broadcast. Positions inside hidden syntax or widgets use a dashed boundary cursor marked with ",[64,541,542],{},"◇",[333,544,545],{},"Blurring keeps the member online. Disconnecting clears presence; reconnecting rejoins. Remote updates do not move local focus, selection, or scrolling, or reveal source syntax.",[333,547,548],{},"Presence stays out of source, undo, and saved checkpoints. Source-only collaboration allocates no Awareness instance or cursor layer.",[10,550,552],{"id":551},"sync-save-and-recover","Sync, save, and recover",[15,554,555,558,559,562],{},[44,556,557],{},"Synced and saved are separate states."," When the service supports checkpoints, call ",[64,560,561],{},"await session.save()"," and show “Saved” only after the durable receipt arrives.",[564,565,566,579],"table",{},[567,568,569],"thead",{},[570,571,572,576],"tr",{},[573,574,575],"th",{},"Task",[573,577,578],{},"API",[580,581,582,598,610,622,634],"tbody",{},[570,583,584,588],{},[585,586,587],"td",{},"Show connection and save status",[585,589,590,591,594,595,358],{},"Read ",[64,592,593],{},"session.state"," and update UI through ",[64,596,597],{},"session.subscribe()",[570,599,600,603],{},[585,601,602],{},"Reconnect",[585,604,605,606,609],{},"Call ",[64,607,608],{},"session.prepare()"," to refresh identity and permissions.",[570,611,612,615],{},[585,613,614],{},"Disable offline editing",[585,616,617,618,621],{},"Set ",[64,619,620],{},"offlineEditing: 'readonly'","; the default allows in-memory edits.",[570,623,624,627],{},[585,625,626],{},"Undo local changes",[585,628,629,630,633],{},"Use ",[64,631,632],{},"editor.history","; remote edits stay out of the local undo stack.",[570,635,636,639],{},[585,637,638],{},"Leave a document",[585,640,641],{},"Cancel unfinished preparation, destroy the editor, then close the session.",[57,643,646],{"className":85,"code":644,"filename":645,"language":88,"meta":62,"style":62},"controller.abort()\neditor.destroy()\nawait session.close({ mode: 'persist' })\n","cleanup.ts",[64,647,648,658,668],{"__ignoreMap":62},[67,649,650,653,656],{"class":69,"line":70},[67,651,652],{"class":99},"controller.",[67,654,655],{"class":130},"abort",[67,657,235],{"class":99},[67,659,660,663,666],{"class":69,"line":110},[67,661,662],{"class":99},"editor.",[67,664,665],{"class":130},"destroy",[67,667,235],{"class":99},[67,669,670,673,676,679,682,685],{"class":69,"line":117},[67,671,672],{"class":95},"await",[67,674,675],{"class":99}," session.",[67,677,678],{"class":130},"close",[67,680,681],{"class":99},"({ mode: ",[67,683,684],{"class":106},"'persist'",[67,686,687],{"class":99}," })\n",[15,689,690,691,694],{},"Keep the session after a failed save or close and offer retry or recovery. Without a persistence service, use checkpoint closing; use ",[64,692,693],{},"discard"," only when the user explicitly abandons the content.",[255,696,698,766],{"title":697},"State fields and recovery handling",[564,699,700,710],{},[567,701,702],{},[570,703,704,707],{},[573,705,706],{},"Field",[573,708,709],{},"Meaning",[580,711,712,722,732,742,752],{},[570,713,714,719],{},[585,715,716],{},[64,717,718],{},"lifecycle",[585,720,721],{},"Preparing, ready, failed, recovery, or closed.",[570,723,724,729],{},[585,725,726],{},[64,727,728],{},"connection",[585,730,731],{},"Connecting, connected, or disconnected.",[570,733,734,739],{},[585,735,736],{},[64,737,738],{},"permission",[585,740,741],{},"Service-granted read\u002Fwrite permission.",[570,743,744,749],{},[585,745,746],{},[64,747,748],{},"synced",[585,750,751],{},"The transport has acknowledged pending updates.",[570,753,754,759],{},[585,755,756],{},[64,757,758],{},"durability",[585,760,761,762,765],{},"Persistence state of local edits; ",[64,763,764],{},"unsupported"," without save support.",[330,767,768,771,778,784,798,813],{},[333,769,770],{},"Typing during a save preserves dirty state; deletions also need saving. Do not substitute sync events or timers for a durable receipt.",[333,772,773,774,777],{},"An epoch change or revoked write permission on an unsaved branch enters recovery. Retain ",[64,775,776],{},"session.checkpoint()"," before deciding how to compare or import it. Persistent browser offline storage is not installed.",[333,779,780,783],{},[64,781,782],{},"close({ mode: 'checkpoint', persistRecovery })"," waits for the application to save a recovery copy containing binary identity and source. Unmounting does not discard content.",[333,785,786,787,30,790,793,794,797],{},"Toolbars can read ",[64,788,789],{},"editor.history.canUndo",[64,791,792],{},"canRedo",", and observe changes with ",[64,795,796],{},"subscribe()",". Commands, shortcuts, and browser undo share one history.",[333,799,800,801,804,805,808,809,812],{},"Remount for a different document. An explicit ",[64,802,803],{},"documentId"," must match the session. ",[64,806,807],{},"replaceDocument()"," returns ",[64,810,811],{},"source-provider-locked","; normal commands can still insert content.",[333,814,815,818,819,822,823,826],{},[64,816,817],{},"defineState().invert"," currently reports ",[64,820,821],{},"unsupported-history-effect"," with collaboration history. Do not wire ",[64,824,825],{},"onChange"," to a full-source overwrite or another Yjs binding.",[10,828,830],{"id":829},"custom-transports-and-current-limits","Custom transports and current limits",[15,832,833],{},"The service owns authentication, write permissions, room limits, and persistence. The example's read-only switch, member names, and colors are client UI; they do not replace server checks.",[255,835,837,848,875],{"title":836},"Custom providers and existing Y.Doc instances",[15,838,839,840,843,844,847],{},"Implement ",[64,841,842],{},"CollaborationProviderFactory"," to open an authoritative manifest, synchronize the session's Y.Doc, report connection and permission changes, and remove listeners on disconnect. ",[64,845,846],{},"saveCheckpoint"," is optional.",[15,849,850,851,808,854,472,857,510,860,510,863,510,866,514,868,871,872,874],{},"For cursors, ",[64,852,853],{},"acquirePresence()",[64,855,856],{},"CollaborationPresenceTransport",[64,858,859],{},"clientId",[64,861,862],{},"getStates()",[64,864,865],{},"publish()",[64,867,796],{},[64,869,870],{},"release()",". Install presence only when the provider supports it. The example's ",[64,873,372],{}," supplies a complete in-memory channel; Hocuspocus acquires and withdraws its channel on mount and destruction, cleaning up timers.",[15,876,877,880],{},[64,878,879],{},"adoptCollaborationSession()"," borrows a prepared Y.Doc with a static manifest. The host owns initialization, connections, permissions, and disposal; the session does not destroy the borrowed document. Use a provider factory for dynamic connection reports and durable receipts.",[15,882,883],{},"Two-person editing and remote presence have been verified in Chromium. System IMEs, Safari\u002FFirefox, larger participant groups, and production database recovery still need release acceptance.",[885,886,887],"style",{},"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 .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s-HEn, html code.shiki .s-HEn{--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sUNQB, html code.shiki .sUNQB{--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su0ou, html code.shiki .su0ou{--shiki-default:#22863A;--shiki-light:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sde8i, html code.shiki .sde8i{--shiki-default:#E36209;--shiki-light:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sqmzS, html code.shiki .sqmzS{--shiki-default:#6A737D;--shiki-light:#6A737D;--shiki-dark:#6A737D}",{"title":62,"searchDepth":110,"depth":110,"links":889},[890,891,896,897,898,899],{"id":12,"depth":110,"text":13},{"id":38,"depth":110,"text":39,"children":892},[893,894,895],{"id":51,"depth":117,"text":52},{"id":78,"depth":117,"text":79},{"id":204,"depth":117,"text":205},{"id":274,"depth":110,"text":275},{"id":361,"depth":110,"text":362},{"id":551,"depth":110,"text":552},{"id":829,"depth":110,"text":830},"Add shared editing, remote cursors, and a collaborator list when you need them.","md",[903,904,905,906,907,908],"collaboration","Yjs","Hocuspocus","session","history","saving","en",{},"\u002Fen\u002Fguide\u002Fcollaboration","Integration",{"title":5,"description":900},"guide\u002Fcollaboration.en","goPOYCDhgl29WLOwka8dRu7lf9eNKNHRkWzx9phpj68","import { createMsfeEditor, type MsfeEditor } from \"@quirekit\u002Fmsfe-core\";\nimport { StarterKit } from \"@quirekit\u002Fmsfe-starter-kit\";\nimport {\n  Collaboration,\n  createCollaborationSession,\n  type CollaborationSession,\n} from \"@quirekit\u002Fmsfe-collaboration\";\nimport {\n  hocuspocusProvider,\n  type HocuspocusProviderOptions,\n} from \"@quirekit\u002Fmsfe-collaboration-hocuspocus\";\n\n\u002F**\n * @param documentId - Existing application document.\n * @param service - Application admission and transport endpoints.\n * @returns Host-owned session, retained even if preparation fails.\n *\u002F\nexport function sharedSource(\n  documentId: string,\n  service: HocuspocusProviderOptions,\n): CollaborationSession {\n  return createCollaborationSession({ documentId, provider: hocuspocusProvider(service) });\n}\n\n\u002F**\n * @param parent - Editor mount.\n * @param session - Host-owned source and history.\n * @param signal - Route cancellation.\n * @returns Mounted editor after authoritative preparation.\n *\u002F\nexport async function mountSharedSource(\n  parent: HTMLElement,\n  session: CollaborationSession,\n  signal: AbortSignal,\n): Promise\u003CMsfeEditor> {\n  \u002F\u002F Finish admission and loading before allocating an editor.\n  await session.prepare({ signal });\n  signal.throwIfAborted();\n  \u002F\u002F Session owns initial content and identity; extensions keep planning source edits.\n  return createMsfeEditor({\n    parent,\n    extensions: [StarterKit, Collaboration.configure({ session })],\n  });\n}\n",{"data":918,"body":919},{},{"type":920,"children":921},"root",[922,1678],{"type":923,"tag":57,"props":924,"children":926},"element",{"className":85,"code":925,"language":88,"meta":62,"style":62},"import { createMsfeEditor, type MsfeEditor } from \"@quirekit\u002Fmsfe-core\";\nimport { StarterKit } from \"@quirekit\u002Fmsfe-starter-kit\";\nimport {\n  Collaboration,\n  createCollaborationSession,\n  type CollaborationSession,\n} from \"@quirekit\u002Fmsfe-collaboration\";\nimport {\n  hocuspocusProvider,\n  type HocuspocusProviderOptions,\n} from \"@quirekit\u002Fmsfe-collaboration-hocuspocus\";\n\n\u002F**\n * @param documentId - Existing application document.\n * @param service - Application admission and transport endpoints.\n * @returns Host-owned session, retained even if preparation fails.\n *\u002F\nexport function sharedSource(\n  documentId: string,\n  service: HocuspocusProviderOptions,\n): CollaborationSession {\n  return createCollaborationSession({ documentId, provider: hocuspocusProvider(service) });\n}\n\n\u002F**\n * @param parent - Editor mount.\n * @param session - Host-owned source and history.\n * @param signal - Route cancellation.\n * @returns Mounted editor after authoritative preparation.\n *\u002F\nexport async function mountSharedSource(\n  parent: HTMLElement,\n  session: CollaborationSession,\n  signal: AbortSignal,\n): Promise\u003CMsfeEditor> {\n  \u002F\u002F Finish admission and loading before allocating an editor.\n  await session.prepare({ signal });\n  signal.throwIfAborted();\n  \u002F\u002F Session owns initial content and identity; extensions keep planning source edits.\n  return createMsfeEditor({\n    parent,\n    extensions: [StarterKit, Collaboration.configure({ session })],\n  });\n}\n\n",[927],{"type":923,"tag":64,"props":928,"children":929},{"__ignoreMap":62},[930,970,995,1007,1015,1023,1036,1057,1068,1076,1088,1108,1116,1126,1150,1172,1190,1199,1223,1248,1270,1292,1321,1330,1338,1346,1368,1389,1411,1428,1436,1461,1483,1504,1526,1557,1566,1589,1608,1617,1634,1643,1661,1670],{"type":923,"tag":67,"props":931,"children":932},{"class":69,"line":70},[933,939,945,950,955,959,965],{"type":923,"tag":67,"props":934,"children":936},{"style":935},"--shiki-default:#D73A49;--shiki-light:#D73A49;--shiki-dark:#F97583",[937],{"type":938,"value":96},"text",{"type":923,"tag":67,"props":940,"children":942},{"style":941},"--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8",[943],{"type":938,"value":944}," { createMsfeEditor, ",{"type":923,"tag":67,"props":946,"children":947},{"style":935},[948],{"type":938,"value":949},"type",{"type":923,"tag":67,"props":951,"children":952},{"style":941},[953],{"type":938,"value":954}," MsfeEditor } ",{"type":923,"tag":67,"props":956,"children":957},{"style":935},[958],{"type":938,"value":103},{"type":923,"tag":67,"props":960,"children":962},{"style":961},"--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#9ECBFF",[963],{"type":938,"value":964}," \"@quirekit\u002Fmsfe-core\"",{"type":923,"tag":67,"props":966,"children":967},{"style":941},[968],{"type":938,"value":969},";\n",{"type":923,"tag":67,"props":971,"children":972},{"class":69,"line":110},[973,977,982,986,991],{"type":923,"tag":67,"props":974,"children":975},{"style":935},[976],{"type":938,"value":96},{"type":923,"tag":67,"props":978,"children":979},{"style":941},[980],{"type":938,"value":981}," { StarterKit } ",{"type":923,"tag":67,"props":983,"children":984},{"style":935},[985],{"type":938,"value":103},{"type":923,"tag":67,"props":987,"children":988},{"style":961},[989],{"type":938,"value":990}," \"@quirekit\u002Fmsfe-starter-kit\"",{"type":923,"tag":67,"props":992,"children":993},{"style":941},[994],{"type":938,"value":969},{"type":923,"tag":67,"props":996,"children":997},{"class":69,"line":117},[998,1002],{"type":923,"tag":67,"props":999,"children":1000},{"style":935},[1001],{"type":938,"value":96},{"type":923,"tag":67,"props":1003,"children":1004},{"style":941},[1005],{"type":938,"value":1006}," {\n",{"type":923,"tag":67,"props":1008,"children":1009},{"class":69,"line":143},[1010],{"type":923,"tag":67,"props":1011,"children":1012},{"style":941},[1013],{"type":938,"value":1014},"  Collaboration,\n",{"type":923,"tag":67,"props":1016,"children":1017},{"class":69,"line":155},[1018],{"type":923,"tag":67,"props":1019,"children":1020},{"style":941},[1021],{"type":938,"value":1022},"  createCollaborationSession,\n",{"type":923,"tag":67,"props":1024,"children":1025},{"class":69,"line":166},[1026,1031],{"type":923,"tag":67,"props":1027,"children":1028},{"style":935},[1029],{"type":938,"value":1030},"  type",{"type":923,"tag":67,"props":1032,"children":1033},{"style":941},[1034],{"type":938,"value":1035}," CollaborationSession,\n",{"type":923,"tag":67,"props":1037,"children":1038},{"class":69,"line":184},[1039,1044,1048,1053],{"type":923,"tag":67,"props":1040,"children":1041},{"style":941},[1042],{"type":938,"value":1043},"} ",{"type":923,"tag":67,"props":1045,"children":1046},{"style":935},[1047],{"type":938,"value":103},{"type":923,"tag":67,"props":1049,"children":1050},{"style":961},[1051],{"type":938,"value":1052}," \"@quirekit\u002Fmsfe-collaboration\"",{"type":923,"tag":67,"props":1054,"children":1055},{"style":941},[1056],{"type":938,"value":969},{"type":923,"tag":67,"props":1058,"children":1059},{"class":69,"line":442},[1060,1064],{"type":923,"tag":67,"props":1061,"children":1062},{"style":935},[1063],{"type":938,"value":96},{"type":923,"tag":67,"props":1065,"children":1066},{"style":941},[1067],{"type":938,"value":1006},{"type":923,"tag":67,"props":1069,"children":1070},{"class":69,"line":466},[1071],{"type":923,"tag":67,"props":1072,"children":1073},{"style":941},[1074],{"type":938,"value":1075},"  hocuspocusProvider,\n",{"type":923,"tag":67,"props":1077,"children":1078},{"class":69,"line":491},[1079,1083],{"type":923,"tag":67,"props":1080,"children":1081},{"style":935},[1082],{"type":938,"value":1030},{"type":923,"tag":67,"props":1084,"children":1085},{"style":941},[1086],{"type":938,"value":1087}," HocuspocusProviderOptions,\n",{"type":923,"tag":67,"props":1089,"children":1090},{"class":69,"line":497},[1091,1095,1099,1104],{"type":923,"tag":67,"props":1092,"children":1093},{"style":941},[1094],{"type":938,"value":1043},{"type":923,"tag":67,"props":1096,"children":1097},{"style":935},[1098],{"type":938,"value":103},{"type":923,"tag":67,"props":1100,"children":1101},{"style":961},[1102],{"type":938,"value":1103}," \"@quirekit\u002Fmsfe-collaboration-hocuspocus\"",{"type":923,"tag":67,"props":1105,"children":1106},{"style":941},[1107],{"type":938,"value":969},{"type":923,"tag":67,"props":1109,"children":1111},{"class":69,"line":1110},12,[1112],{"type":923,"tag":67,"props":1113,"children":1114},{"emptyLinePlaceholder":113},[1115],{"type":938,"value":114},{"type":923,"tag":67,"props":1117,"children":1119},{"class":69,"line":1118},13,[1120],{"type":923,"tag":67,"props":1121,"children":1123},{"style":1122},"--shiki-default:#6A737D;--shiki-light:#6A737D;--shiki-dark:#6A737D",[1124],{"type":938,"value":1125},"\u002F**\n",{"type":923,"tag":67,"props":1127,"children":1129},{"class":69,"line":1128},14,[1130,1135,1140,1145],{"type":923,"tag":67,"props":1131,"children":1132},{"style":1122},[1133],{"type":938,"value":1134}," * ",{"type":923,"tag":67,"props":1136,"children":1137},{"style":935},[1138],{"type":938,"value":1139},"@param",{"type":923,"tag":67,"props":1141,"children":1142},{"style":941},[1143],{"type":938,"value":1144}," documentId",{"type":923,"tag":67,"props":1146,"children":1147},{"style":1122},[1148],{"type":938,"value":1149}," - Existing application document.\n",{"type":923,"tag":67,"props":1151,"children":1153},{"class":69,"line":1152},15,[1154,1158,1162,1167],{"type":923,"tag":67,"props":1155,"children":1156},{"style":1122},[1157],{"type":938,"value":1134},{"type":923,"tag":67,"props":1159,"children":1160},{"style":935},[1161],{"type":938,"value":1139},{"type":923,"tag":67,"props":1163,"children":1164},{"style":941},[1165],{"type":938,"value":1166}," service",{"type":923,"tag":67,"props":1168,"children":1169},{"style":1122},[1170],{"type":938,"value":1171}," - Application admission and transport endpoints.\n",{"type":923,"tag":67,"props":1173,"children":1175},{"class":69,"line":1174},16,[1176,1180,1185],{"type":923,"tag":67,"props":1177,"children":1178},{"style":1122},[1179],{"type":938,"value":1134},{"type":923,"tag":67,"props":1181,"children":1182},{"style":935},[1183],{"type":938,"value":1184},"@returns",{"type":923,"tag":67,"props":1186,"children":1187},{"style":1122},[1188],{"type":938,"value":1189}," Host-owned session, retained even if preparation fails.\n",{"type":923,"tag":67,"props":1191,"children":1193},{"class":69,"line":1192},17,[1194],{"type":923,"tag":67,"props":1195,"children":1196},{"style":1122},[1197],{"type":938,"value":1198}," *\u002F\n",{"type":923,"tag":67,"props":1200,"children":1202},{"class":69,"line":1201},18,[1203,1208,1213,1218],{"type":923,"tag":67,"props":1204,"children":1205},{"style":935},[1206],{"type":938,"value":1207},"export",{"type":923,"tag":67,"props":1209,"children":1210},{"style":935},[1211],{"type":938,"value":1212}," function",{"type":923,"tag":67,"props":1214,"children":1216},{"style":1215},"--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0",[1217],{"type":938,"value":131},{"type":923,"tag":67,"props":1219,"children":1220},{"style":941},[1221],{"type":938,"value":1222},"(\n",{"type":923,"tag":67,"props":1224,"children":1226},{"class":69,"line":1225},19,[1227,1233,1238,1244],{"type":923,"tag":67,"props":1228,"children":1230},{"style":1229},"--shiki-default:#E36209;--shiki-light:#E36209;--shiki-dark:#FFAB70",[1231],{"type":938,"value":1232},"  documentId",{"type":923,"tag":67,"props":1234,"children":1235},{"style":935},[1236],{"type":938,"value":1237},":",{"type":923,"tag":67,"props":1239,"children":1241},{"style":1240},"--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF",[1242],{"type":938,"value":1243}," string",{"type":923,"tag":67,"props":1245,"children":1246},{"style":941},[1247],{"type":938,"value":152},{"type":923,"tag":67,"props":1249,"children":1251},{"class":69,"line":1250},20,[1252,1257,1261,1266],{"type":923,"tag":67,"props":1253,"children":1254},{"style":1229},[1255],{"type":938,"value":1256},"  service",{"type":923,"tag":67,"props":1258,"children":1259},{"style":935},[1260],{"type":938,"value":1237},{"type":923,"tag":67,"props":1262,"children":1263},{"style":1215},[1264],{"type":938,"value":1265}," HocuspocusProviderOptions",{"type":923,"tag":67,"props":1267,"children":1268},{"style":941},[1269],{"type":938,"value":152},{"type":923,"tag":67,"props":1271,"children":1273},{"class":69,"line":1272},21,[1274,1279,1283,1288],{"type":923,"tag":67,"props":1275,"children":1276},{"style":941},[1277],{"type":938,"value":1278},")",{"type":923,"tag":67,"props":1280,"children":1281},{"style":935},[1282],{"type":938,"value":1237},{"type":923,"tag":67,"props":1284,"children":1285},{"style":1215},[1286],{"type":938,"value":1287}," CollaborationSession",{"type":923,"tag":67,"props":1289,"children":1290},{"style":941},[1291],{"type":938,"value":1006},{"type":923,"tag":67,"props":1293,"children":1295},{"class":69,"line":1294},22,[1296,1301,1306,1311,1316],{"type":923,"tag":67,"props":1297,"children":1298},{"style":935},[1299],{"type":938,"value":1300},"  return",{"type":923,"tag":67,"props":1302,"children":1303},{"style":1215},[1304],{"type":938,"value":1305}," createCollaborationSession",{"type":923,"tag":67,"props":1307,"children":1308},{"style":941},[1309],{"type":938,"value":1310},"({ documentId, provider: ",{"type":923,"tag":67,"props":1312,"children":1313},{"style":1215},[1314],{"type":938,"value":1315},"hocuspocusProvider",{"type":923,"tag":67,"props":1317,"children":1318},{"style":941},[1319],{"type":938,"value":1320},"(service) });\n",{"type":923,"tag":67,"props":1322,"children":1324},{"class":69,"line":1323},23,[1325],{"type":923,"tag":67,"props":1326,"children":1327},{"style":941},[1328],{"type":938,"value":1329},"}\n",{"type":923,"tag":67,"props":1331,"children":1333},{"class":69,"line":1332},24,[1334],{"type":923,"tag":67,"props":1335,"children":1336},{"emptyLinePlaceholder":113},[1337],{"type":938,"value":114},{"type":923,"tag":67,"props":1339,"children":1341},{"class":69,"line":1340},25,[1342],{"type":923,"tag":67,"props":1343,"children":1344},{"style":1122},[1345],{"type":938,"value":1125},{"type":923,"tag":67,"props":1347,"children":1349},{"class":69,"line":1348},26,[1350,1354,1358,1363],{"type":923,"tag":67,"props":1351,"children":1352},{"style":1122},[1353],{"type":938,"value":1134},{"type":923,"tag":67,"props":1355,"children":1356},{"style":935},[1357],{"type":938,"value":1139},{"type":923,"tag":67,"props":1359,"children":1360},{"style":941},[1361],{"type":938,"value":1362}," parent",{"type":923,"tag":67,"props":1364,"children":1365},{"style":1122},[1366],{"type":938,"value":1367}," - Editor mount.\n",{"type":923,"tag":67,"props":1369,"children":1371},{"class":69,"line":1370},27,[1372,1376,1380,1384],{"type":923,"tag":67,"props":1373,"children":1374},{"style":1122},[1375],{"type":938,"value":1134},{"type":923,"tag":67,"props":1377,"children":1378},{"style":935},[1379],{"type":938,"value":1139},{"type":923,"tag":67,"props":1381,"children":1382},{"style":941},[1383],{"type":938,"value":124},{"type":923,"tag":67,"props":1385,"children":1386},{"style":1122},[1387],{"type":938,"value":1388}," - Host-owned source and history.\n",{"type":923,"tag":67,"props":1390,"children":1392},{"class":69,"line":1391},28,[1393,1397,1401,1406],{"type":923,"tag":67,"props":1394,"children":1395},{"style":1122},[1396],{"type":938,"value":1134},{"type":923,"tag":67,"props":1398,"children":1399},{"style":935},[1400],{"type":938,"value":1139},{"type":923,"tag":67,"props":1402,"children":1403},{"style":941},[1404],{"type":938,"value":1405}," signal",{"type":923,"tag":67,"props":1407,"children":1408},{"style":1122},[1409],{"type":938,"value":1410}," - Route cancellation.\n",{"type":923,"tag":67,"props":1412,"children":1414},{"class":69,"line":1413},29,[1415,1419,1423],{"type":923,"tag":67,"props":1416,"children":1417},{"style":1122},[1418],{"type":938,"value":1134},{"type":923,"tag":67,"props":1420,"children":1421},{"style":935},[1422],{"type":938,"value":1184},{"type":923,"tag":67,"props":1424,"children":1425},{"style":1122},[1426],{"type":938,"value":1427}," Mounted editor after authoritative preparation.\n",{"type":923,"tag":67,"props":1429,"children":1431},{"class":69,"line":1430},30,[1432],{"type":923,"tag":67,"props":1433,"children":1434},{"style":1122},[1435],{"type":938,"value":1198},{"type":923,"tag":67,"props":1437,"children":1439},{"class":69,"line":1438},31,[1440,1444,1449,1453,1457],{"type":923,"tag":67,"props":1441,"children":1442},{"style":935},[1443],{"type":938,"value":1207},{"type":923,"tag":67,"props":1445,"children":1446},{"style":935},[1447],{"type":938,"value":1448}," async",{"type":923,"tag":67,"props":1450,"children":1451},{"style":935},[1452],{"type":938,"value":1212},{"type":923,"tag":67,"props":1454,"children":1455},{"style":1215},[1456],{"type":938,"value":250},{"type":923,"tag":67,"props":1458,"children":1459},{"style":941},[1460],{"type":938,"value":1222},{"type":923,"tag":67,"props":1462,"children":1464},{"class":69,"line":1463},32,[1465,1470,1474,1479],{"type":923,"tag":67,"props":1466,"children":1467},{"style":1229},[1468],{"type":938,"value":1469},"  parent",{"type":923,"tag":67,"props":1471,"children":1472},{"style":935},[1473],{"type":938,"value":1237},{"type":923,"tag":67,"props":1475,"children":1476},{"style":1215},[1477],{"type":938,"value":1478}," HTMLElement",{"type":923,"tag":67,"props":1480,"children":1481},{"style":941},[1482],{"type":938,"value":152},{"type":923,"tag":67,"props":1484,"children":1486},{"class":69,"line":1485},33,[1487,1492,1496,1500],{"type":923,"tag":67,"props":1488,"children":1489},{"style":1229},[1490],{"type":938,"value":1491},"  session",{"type":923,"tag":67,"props":1493,"children":1494},{"style":935},[1495],{"type":938,"value":1237},{"type":923,"tag":67,"props":1497,"children":1498},{"style":1215},[1499],{"type":938,"value":1287},{"type":923,"tag":67,"props":1501,"children":1502},{"style":941},[1503],{"type":938,"value":152},{"type":923,"tag":67,"props":1505,"children":1507},{"class":69,"line":1506},34,[1508,1513,1517,1522],{"type":923,"tag":67,"props":1509,"children":1510},{"style":1229},[1511],{"type":938,"value":1512},"  signal",{"type":923,"tag":67,"props":1514,"children":1515},{"style":935},[1516],{"type":938,"value":1237},{"type":923,"tag":67,"props":1518,"children":1519},{"style":1215},[1520],{"type":938,"value":1521}," AbortSignal",{"type":923,"tag":67,"props":1523,"children":1524},{"style":941},[1525],{"type":938,"value":152},{"type":923,"tag":67,"props":1527,"children":1529},{"class":69,"line":1528},35,[1530,1534,1538,1543,1547,1552],{"type":923,"tag":67,"props":1531,"children":1532},{"style":941},[1533],{"type":938,"value":1278},{"type":923,"tag":67,"props":1535,"children":1536},{"style":935},[1537],{"type":938,"value":1237},{"type":923,"tag":67,"props":1539,"children":1540},{"style":1215},[1541],{"type":938,"value":1542}," Promise",{"type":923,"tag":67,"props":1544,"children":1545},{"style":941},[1546],{"type":938,"value":298},{"type":923,"tag":67,"props":1548,"children":1549},{"style":1215},[1550],{"type":938,"value":1551},"MsfeEditor",{"type":923,"tag":67,"props":1553,"children":1554},{"style":941},[1555],{"type":938,"value":1556},"> {\n",{"type":923,"tag":67,"props":1558,"children":1560},{"class":69,"line":1559},36,[1561],{"type":923,"tag":67,"props":1562,"children":1563},{"style":1122},[1564],{"type":938,"value":1565},"  \u002F\u002F Finish admission and loading before allocating an editor.\n",{"type":923,"tag":67,"props":1567,"children":1569},{"class":69,"line":1568},37,[1570,1575,1579,1584],{"type":923,"tag":67,"props":1571,"children":1572},{"style":935},[1573],{"type":938,"value":1574},"  await",{"type":923,"tag":67,"props":1576,"children":1577},{"style":941},[1578],{"type":938,"value":675},{"type":923,"tag":67,"props":1580,"children":1581},{"style":1215},[1582],{"type":938,"value":1583},"prepare",{"type":923,"tag":67,"props":1585,"children":1586},{"style":941},[1587],{"type":938,"value":1588},"({ signal });\n",{"type":923,"tag":67,"props":1590,"children":1592},{"class":69,"line":1591},38,[1593,1598,1603],{"type":923,"tag":67,"props":1594,"children":1595},{"style":941},[1596],{"type":938,"value":1597},"  signal.",{"type":923,"tag":67,"props":1599,"children":1600},{"style":1215},[1601],{"type":938,"value":1602},"throwIfAborted",{"type":923,"tag":67,"props":1604,"children":1605},{"style":941},[1606],{"type":938,"value":1607},"();\n",{"type":923,"tag":67,"props":1609,"children":1611},{"class":69,"line":1610},39,[1612],{"type":923,"tag":67,"props":1613,"children":1614},{"style":1122},[1615],{"type":938,"value":1616},"  \u002F\u002F Session owns initial content and identity; extensions keep planning source edits.\n",{"type":923,"tag":67,"props":1618,"children":1620},{"class":69,"line":1619},40,[1621,1625,1630],{"type":923,"tag":67,"props":1622,"children":1623},{"style":935},[1624],{"type":938,"value":1300},{"type":923,"tag":67,"props":1626,"children":1627},{"style":1215},[1628],{"type":938,"value":1629}," createMsfeEditor",{"type":923,"tag":67,"props":1631,"children":1632},{"style":941},[1633],{"type":938,"value":434},{"type":923,"tag":67,"props":1635,"children":1637},{"class":69,"line":1636},41,[1638],{"type":923,"tag":67,"props":1639,"children":1640},{"style":941},[1641],{"type":938,"value":1642},"    parent,\n",{"type":923,"tag":67,"props":1644,"children":1646},{"class":69,"line":1645},42,[1647,1652,1656],{"type":923,"tag":67,"props":1648,"children":1649},{"style":941},[1650],{"type":938,"value":1651},"    extensions: [StarterKit, Collaboration.",{"type":923,"tag":67,"props":1653,"children":1654},{"style":1215},[1655],{"type":938,"value":320},{"type":923,"tag":67,"props":1657,"children":1658},{"style":941},[1659],{"type":938,"value":1660},"({ session })],\n",{"type":923,"tag":67,"props":1662,"children":1664},{"class":69,"line":1663},43,[1665],{"type":923,"tag":67,"props":1666,"children":1667},{"style":941},[1668],{"type":938,"value":1669},"  });\n",{"type":923,"tag":67,"props":1671,"children":1673},{"class":69,"line":1672},44,[1674],{"type":923,"tag":67,"props":1675,"children":1676},{"style":941},[1677],{"type":938,"value":1329},{"type":923,"tag":885,"props":1679,"children":1680},{},[1681],{"type":938,"value":1682},"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);}",1793046311993]