@vcp-dev/site-edit-bridge 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- function Ee(e){if(!mt(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=i=>{let o=t.get(i);if(o)return o;let s=e.nodes[i];if(!s)throw new Error(`Missing compact document node ${i}`);let[u,c]=s,a=e.tokens[c];if(typeof a!="string")throw new Error(`Missing compact document token ${c}`);let h=`${u===null?"":r(u)}${a}`;return t.set(i,h),h};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map(i=>{let[o,s,u]=i,c=u===void 0?void 0:n[u];if(u!==void 0&&!c)throw new Error(`Missing page composition unit ${u}`);return{key:r(o),...c?{pageCompositionUnitKey:c}:{},operationSummary:ht(s)}})}}function ht(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function mt(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}var z=class e{constructor(){}static parseMessage(t,n={}){let r=JSON.parse(t);if(!e.isMessage(r,n))throw new Error("Invalid site edit bridge message");return r}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(typeof t=="object"&&t!==null&&"payload"in t&&typeof t.payload=="object"&&t.payload!==null){let n=t.payload,r=typeof n.id=="string"?n.id:"unknown",i=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:i}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="initialize-session"||t==="get-document"||t==="get-history-status"||t==="get-style-context"||t==="get-object-edit-context"||t==="get-class-name-source"||t==="get-source-tree"||t==="get-source-file"||t==="resolve-source-location"||t==="execute"||t==="undo"||t==="redo"}static isMessage(t,n={}){return!M(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?M(t.payload)&&typeof t.payload.id=="string":t.type==="event"?M(t.payload)&&M(t.payload.event):t.type==="auth"?M(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?M(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!M(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"initialize-session":return typeof t.routeId=="string"&&(t.mutationContext===void 0||Ie(t.mutationContext));case"get-document":case"get-style-context":return typeof t.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof t.key=="string"&&(t.routeId===void 0||typeof t.routeId=="string");case"get-history-status":return t.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return gt(t.request)&&Ie(t.request.mutationContext)&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return Ie(t.mutationContext)}}};function M(e){return typeof e=="object"&&e!==null}function gt(e){return M(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&(e.routeId===void 0||typeof e.routeId=="string")&&typeof e.kind=="string"&&M(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&M(e.params)}function Ie(e){return yt(e)}function yt(e){return M(e)?typeof e.editingSessionId=="string"&&e.editingSessionId.length>0&&typeof e.lockId=="string"&&e.lockId.length>0&&typeof e.ownerId=="string"&&e.ownerId.length>0&&typeof e.leaseAssertion=="string"&&e.leaseAssertion.length>0:!1}var bt="vcp:designer:trace",St="designer_trace",Fe="__VCP_DESIGNER_TRACE__";var Et=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function It(e=globalThis){let t=e;try{if(t.localStorage?.getItem(bt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(St)==="1"}catch{return!1}}function j(e,t={},n=globalThis){if(!It(n))return;let r={type:e,timestamp:Date.now(),payload:vt(t)},i=n,o=i[Fe]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[Fe]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function vt(e){return ve(e,0)}function ve(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>ve(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Et.test(r)){n[r]="[redacted]";continue}n[r]=ve(i,t+1)}return n}var se=class{constructor(t){this.options=t,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===Ce&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((t,n)=>{let r;try{r=this.createSocket(this.options.url)}catch(u){let c=L(u,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),n(c);return}let i={socket:r,settled:!1,reject:n};this.connectAttempt=i,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==i||(i.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},s=(u,c)=>{this.cleanupSocket(r,u,c)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(z.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(u){s(L(u,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=u=>{if(this.socket!==r)return;let c=L(u,"WebSocket failed");s(c,"failed")},r.onmessage=u=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(u.data,r,i,()=>{o()});return}this.handleMessage(u.data)}},r.onclose=u=>{if(this.socket!==r)return;let c=this.intentionalClose,a=new Error(_t(u,{intentional:c}));s(a,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){return this.request("get-document",{routeId:t})}initializeSession(t){return this.request("initialize-session",t)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(t){return this.request("get-style-context",{routeId:t})}getObjectEditContext(t,n){return this.request("get-object-edit-context",{key:t,routeId:n})}getClassNameSource(t,n){return this.request("get-class-name-source",{key:t,routeId:n})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(t){return this.request("get-source-file",t)}resolveSourceLocation(t){return this.request("resolve-source-location",t)}execute(t,n){return this.request("execute",{request:{...t,mutationContext:n}})}undo(t){return this.request("undo",{mutationContext:t})}redo(t){return this.request("redo",{mutationContext:t})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==Ce||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${r?.readyState??"none"})`));let i=`${t}-${this.sequence+=1}`,o=Dt(i,t,n);return j("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:Be(n.request,"kind"),documentVersion:Be(n.request,"documentVersion")}),new Promise((s,u)=>{let c=this.resolveRequestTimeoutMs(t),a=c>0?setTimeout(()=>{let h=this.pending.get(i);h&&(this.pending.delete(i),j("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),h.reject(new Error(`Bridge request timed out after ${c}ms: ${t}`)))},c):null;a?.unref?.(),this.pending.set(i,{kind:t,timeout:a,resolve:h=>s(h),reject:u});try{r.send(z.stringifyMessage(o))}catch(h){let m=L(h,"WebSocket send failed");this.clearPendingRequest(i),u(m),this.cleanupSocket(r,m,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(z.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=L(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=z.parseMessage(t);if(n.type==="event"){for(let i of this.listeners)i(n.payload.event);return}if(n.type!=="response"&&n.type!=="error")return;let r=this.pending.get(n.payload.id);if(r){if(this.clearPendingRequest(n.payload.id),n.type==="error"){j("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}j("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Tt(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Ee(n.payload.result.data)}:r.kind==="initialize-session"?kt(n.payload.result):n.payload.result)}}rejectAll(t){for(let[n,r]of[...this.pending])this.clearPendingRequest(n),r.reject(t)}clearPendingRequest(t){let n=this.pending.get(t);n&&(n.timeout&&clearTimeout(n.timeout),this.pending.delete(t))}resolveRequestTimeoutMs(t){let n=this.options.requestTimeoutMsByKind?.[t];return typeof n=="number"?Math.max(0,n):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):Rt[t]??xt}cleanupSocket(t,n,r){if(this.socket===t&&(this.socket=null),this.connectAttempt?.socket===t){let i=this.connectAttempt;this.connectAttempt=null,i.settled||(i.settled=!0,i.reject(n))}this.connectPromise=null,this.rejectAll(n),this.setConnectionState(r,n.message),t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null;try{(t.readyState===Ct||t.readyState===Ce)&&t.close()}catch{}}setConnectionState(t,n){if(this.connectionState===t&&!n)return;this.connectionState=t;let r={state:t,...n?{message:n}:{}};this.options.onConnectionStatus?.(r);for(let i of this.connectionStatusListeners)i(r)}createSocket(t){if(this.options.createSocket)return this.options.createSocket(t);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(t)}},Ct=0,Ce=1,xt=15e3,Rt={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function L(e,t){return e instanceof Error?e:new Error(t)}function _t(e,t){return t.intentional?"WebSocket disconnected":e?.code===1008?e.reason?`Bridge session authentication failed: ${e.reason}`:"Bridge session authentication failed":e?.reason?`WebSocket closed: ${e.reason}`:typeof e?.code=="number"&&e.code!==1005?`WebSocket closed with code ${e.code}`:"WebSocket closed"}function Be(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Tt(e){if(!e||typeof e!="object")return null;let t=e,n=t.data?.resultVersion??t.data?.version??null;return typeof n=="number"?n:null}function Oe(e){return new xe(e)}var xe=class{constructor(t){this.params=t,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!Me(t.initialDocument)}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=Me(this.currentDocument);return(n||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(n?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(t){if(t.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let n=await this.params.client.initializeSession(t);return this.currentDocument=n.data.document,this.observedDocumentVersion=n.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),n}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=this.styleContextCache;if(n?.generation===this.styleGeneration)return{ok:!0,data:n.value};let r=this.styleContextInFlight;if(r?.generation===this.styleGeneration)return r.request;let i=this.styleGeneration,o=this.params.client.getStyleContext(t).then(s=>(this.styleGeneration===i&&(this.styleContextCache={generation:i,value:s.data}),s)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:i,request:o},o}async ensureDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let r=await this.refreshSnapshot(n,"ensure-version");if(r.version<n)throw new Error(`Document refresh returned version ${r.version}, expected at least ${n}`);return{ok:!0,data:r}}async acknowledgeDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return n>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.objectCacheKey(t,n),i=this.editContextCache.get(r);if(i)return{ok:!0,data:i};let o=this.editContextInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getObjectEditContext(t,n??this.params.routeId).then(c=>(this.objectGeneration===s&&this.editContextCache.set(r,c.data),c)).finally(()=>{this.editContextInFlight.get(r)===u&&this.editContextInFlight.delete(r)});return this.editContextInFlight.set(r,u),u}async getClassNameSource(t,n){let r=this.objectCacheKey(t,n),i=this.classNameSourceCache.get(r);if(i)return i;let o=this.classNameSourceInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getClassNameSource(t,n??this.params.routeId).then(c=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,c),c)).finally(()=>{this.classNameSourceInFlight.get(r)===u&&this.classNameSourceInFlight.delete(r)});return this.classNameSourceInFlight.set(r,u),u}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(t){return this.params.client.getSourceFile(t)}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({...t,routeId:t.routeId??this.params.routeId})}async execute(t,n){let r=t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t;return this.params.client.execute({...r,mutationContext:n},n)}async undo(t){return this.params.client.undo(t)}async redo(t){return this.params.client.redo(t)}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&n.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n.version),n.version>this.currentDocument.version&&this.clearObjectCaches(),t(n);return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let i=await this.refreshInFlight;if(typeof t!="number"||i.version>=t||this.currentDocument.version>=t)return this.currentDocument}j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let r=this.params.client.getDocument(this.params.routeId).then(i=>(this.currentDocument=i.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,i.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(t){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!t?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(t,n){return`${n??this.params.routeId}\0${t}`}};function Me(e){return e.version===0&&e.entries.length===0}function kt(e){let t=e;return{...t,data:{...t.data,document:Ee(t.data.document)}}}function Dt(e,t,n){switch(t){case"initialize-session":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId),...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-history-status":return{type:"request",payload:{id:e,kind:t}};case"get-style-context":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:e,kind:t}};case"get-source-file":return{type:"request",payload:{id:e,kind:t,path:String(n.path)}};case"resolve-source-location":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"execute":return{type:"request",payload:{id:e,kind:t,request:n.request}};case"undo":case"redo":return{type:"request",payload:{id:e,kind:t,mutationContext:n.mutationContext}}}}var qe="vcp-window-message";function Nt(e){return{source:qe,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function At(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===qe&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var Ke="site-edit",Ve="frame-runtime";function ee(e,t={}){return Nt({namespace:Ke,channel:Ve,sessionKey:t.sessionKey,body:e})}function Ue(e){return!At(e)||e.namespace!==Ke||e.channel!==Ve?!1:typeof e.body?.type=="string"}var Te="vcp-site-edit:route-ready",ke="vcp-site-edit:bridge-status",Pt=1e3,Ft="data-vcp-ui-component",Ye="data-vcp-theme-preview",We="::repeat-item#",ue="components/ui",Bt=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),Mt=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function Ot(e,t=""){let n=Le(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function qt(e,t){if(e.__VCP_SITE_EDIT_VERSION_LOGGED__)return;let n=e.console?.info;typeof n=="function"&&(e.__VCP_SITE_EDIT_VERSION_LOGGED__=!0,n.call(e.console,"[VCP Site Edit] runtime loaded",{bridge:t.versions?.bridge??"unknown",contracts:t.versions?.contracts??"unknown",documentVersion:t.documentVersion,engine:t.versions?.engine??"unknown",routeId:t.routeId}))}function Kt(e,t={}){if(t.explicit_ws_url)return t.explicit_ws_url.startsWith("/")?`${e.location.protocol==="https:"?"wss:":"ws:"}//${e.location.host}${t.explicit_ws_url}`:t.explicit_ws_url;let n=e.location.protocol==="https:"?"wss:":"ws:",r=t.port?`${e.location.hostname}:${t.port}`:e.location.host;return`${n}//${r}${t.path??"/__vcp/site-edit/bridge"}`}async function sr(e=window,t={}){let n=Kt(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Vt({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(Ut(i.signature,r)){await i.syncRoute?.();return}i.cleanup?.()}let o={activeClient:null,activeBridge:null,cleanupFrameRuntime:(()=>{}),retryTimer:void 0,routeSequence:0,syncInFlight:null,syncScheduled:!1,disposed:!1,currentDocument:null,currentEntriesByKey:new Map,unsubscribeDocument:void 0,unsubscribeConnectionStatus:void 0,unbindBootstrapLifecycle:void 0,unbindRouteChange:void 0},s,u=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,c=t.create_client??(p=>new se({url:p,authKey:t.bridge_session_key})),a=t.schedule_after_navigation??Qt,h=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},m=()=>Ot(e.location.pathname,t.basePath||""),R=!!e.parent&&e.parent!==e,E=p=>{Zt(e,p)},_=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(g=>[g.key,g]))},C=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},N=(p,g)=>!o.disposed&&g===o.routeSequence&&p===m(),T=async(p,g)=>{let x=o.activeBridge;if(!x)return null;let d=await x.getDocument(p);return N(p,g)&&_(d.data),d.data},A=()=>{C(),_(null);let p=o.activeBridge;o.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let g=o.activeClient;o.activeClient=null,g?.disconnect()},ge=p=>p===s.routeId&&!!o.activeBridge&&(R||!!(o.currentDocument&&en(o.currentDocument,p)))&&Lt(o.activeClient),ye=p=>Math.min(Pt*2**Math.max(0,p),8e3),G=(p,g,x)=>{if(o.disposed)return;h();let d=ye(x);E({state:"reconnecting",routeId:p,attempt:x,retryInMs:d,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||g!==o.routeSequence)&&re(x+1).catch(f=>{let l=m();if(p===l){if(Y(f)){E({state:"reload-required",routeId:p,attempt:x,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(p,o.routeSequence,x+1)}})},d)},J=(p,g,x)=>{if(!N(p,g)||o.activeClient===null)return;if(Y(x.message)){A(),h(),E({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let d=o.activeClient;C(),_(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,d?.disconnect(),G(p,g,0)},be=p=>{let g=m(),x=o.routeSequence;if(!(!N(g,x)||o.activeClient===null)){if(Y(p)){A(),h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Ze(p)&&J(g,x,{state:"failed",message:Ne(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=zt(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:_,onBridgeRequestError:p=>{be(p)}});let X=async()=>re(0),re=async p=>{if(o.disposed)return;let g=m();if(ge(g))return;let x=o.syncInFlight;if(x?.routeId===g)return x.promise;let d=o.routeSequence+1,f=Se(g,d,p);o.syncInFlight={routeId:g,sequence:d,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},Se=async(p,g,x)=>{o.routeSequence=g,h(),A(),E({state:x>0?"reconnecting":"connecting",routeId:p,attempt:x,messageKey:x>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let d=c(n),f=!1;o.activeClient=d,o.unsubscribeConnectionStatus=d.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&J(p,g,l)});try{if(await d.connect(),!N(p,g)){d.disconnect();return}let l=Oe({routeId:p,client:d,initialDocument:wt(p)});o.activeBridge=l,u()&&(e.__VCP_SITE_EDIT__=l),o.activeClient=d,o.unsubscribeDocument=l.subscribe(k=>{k.type==="site-edit.document.changed"&&k.routeId===p&&o.currentDocument&&k.version>o.currentDocument.version&&T(p,g).catch(()=>{})}),u()&&(s.routeId=p);let v=(R?null:await l.initializeSession({routeId:p}))?.data.document??null;if(v&&_(v),!N(p,g)){d.disconnect();return}f=!0,E({state:"ready",routeId:p,attempt:x,messageKey:"studio.status.previewReady"}),qt(e,{documentVersion:v?.version??0,routeId:p,versions:t.runtime_versions}),v&&Qe(e,{routeId:p,version:v.version})}catch(l){if(C(),o.activeClient===d&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,d.disconnect(),_(null),!N(p,g))return;throw E({state:Y(l)?"reload-required":"failed",routeId:p,attempt:x,messageKey:Y(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},U=p=>{if(o.disposed)return;let g=m();if(Y(p)){h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(g,o.routeSequence,0)},K=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,a(()=>{o.syncScheduled=!1,!o.disposed&&X().catch(p=>U(p))}))},oe=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,h(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),A(),u()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:X,cleanup:oe},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=jt(e,oe),o.unbindRouteChange=Xt(e,K,m),t.defer_initial_sync){K();return}await X()}function Vt(e){return{basePath:Le(e.options.basePath??""),bridgeUrl:e.bridgeUrl,runtimeVersions:{bridge:e.options.runtime_versions?.bridge??null,contracts:e.options.runtime_versions?.contracts??null,engine:e.options.runtime_versions?.engine??null},sessionKeyFingerprint:Wt(e.options.bridge_session_key)}}function Ut(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Wt(e){if(!e)return null;let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return`${e.length}:${t.toString(36)}`}function jt(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),$t(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function $t(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function wt(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function zt(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,u=null,c=null,a=null,h=null,m=new Map,R=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,E=()=>{n?.(),n=null,r=null},_=()=>{i?.(),i=null,o?.(),o=null},C=(d,f,l)=>{let D=s?.sessionKey!==d||s?.sourceWindow!==f||s?.targetOrigin!==l;s={sessionKey:d,sourceWindow:f,targetOrigin:l},D&&(a=null,h=null)},N=(d,f)=>{let l=e.parent&&e.parent!==e?e.parent:null;return!l||f!==l?!1:!R||d===R},T=()=>{for(let d of m.values())d();m.clear()},A=d=>JSON.stringify([d.routeId,d.version]),ge=()=>!c||c.state==="ready",ye=d=>JSON.stringify([d.state,d.routeId??null,d.attempt??null,d.retryInMs??null,d.messageKey??null]),G=d=>{if(!ge())return;let f=A(d);a!==f&&(o?.(),o=null,U({kind:"route-ready",payload:{routeId:d.routeId,version:d.version}}),s&&(a=f))},J=d=>{let f=ye(d);h!==f&&(d.state!=="ready"&&(a=null,u=null),U({kind:"bridge-status",payload:d}),s&&(h=f))},be=d=>{u=d,G(d)},X=d=>{c=d,J(d)},re=()=>{u&&G(u)},Se=()=>{c&&J(c)},U=d=>{s&&s.sourceWindow.postMessage(ee({type:"event",...d},{sessionKey:s.sessionKey}),s.targetOrigin)},K=(d,f,l,D)=>{let v=pe(e.document,f.clientX,f.clientY,t.getCurrentDocument?.()??null),k=v?F(v,l==="full"?q(e.document,v,t.getCurrentDocument?.()??null):we(e.document,v,t.getCurrentDocument?.()??null),t.getDocumentEntry,l):null;D&&k&&(d==="pointer-click"||d==="pointer-double-click")&&(D.preventDefault(),D.stopPropagation(),typeof D.stopImmediatePropagation=="function"&&D.stopImmediatePropagation()),U({kind:d,payload:{clientX:f.clientX,clientY:f.clientY,buttons:Number(f.buttons??0),hit:k}})},oe=(d,f,l)=>{_(),s={sessionKey:d,sourceWindow:f,targetOrigin:l};let D=zn(e.document),v=null,k=null,y=()=>{k=null;let b=v;v=null,b&&K("pointer-move",b,"summary")},B=b=>{v={clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},k===null&&(k=Je(e,y))},W=b=>{K("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},H=b=>{K("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},V=b=>{K("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},w=b=>{K("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Q=b=>{K("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Z=()=>{U({kind:"scroll",payload:{metrics:le(e)}})};e.document.addEventListener("pointerdown",W,!0),e.document.addEventListener("pointermove",B,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",H,!0),e.document.addEventListener("pointercancel",V,!0),e.document.addEventListener("click",w,!0),e.document.addEventListener("dblclick",Q,!0),e.addEventListener("scroll",Z,{passive:!0}),i=()=>{k!==null&&(Xe(e,k),k=null),v=null,D(),e.document.removeEventListener("pointerdown",W,!0),e.document.removeEventListener("pointermove",B,!0),e.document.removeEventListener("pointerup",H,!0),e.document.removeEventListener("pointercancel",V,!0),e.document.removeEventListener("click",w,!0),e.document.removeEventListener("dblclick",Q,!0),e.removeEventListener("scroll",Z)}},p=d=>{let f=d.detail;f?.routeId&&be(f)},g=d=>{let f=d.detail;f?.state&&X(f)},x=d=>{let f=d.data;if(!Ue(f)||f.body.type!=="request"||f.body.kind!=="apply-node-patch"&&f.body.kind!=="get-hit-by-ref"&&f.body.kind!=="get-path-by-ref"&&f.body.kind!=="get-scroll-metrics"&&f.body.kind!=="scroll-to"&&f.body.kind!=="scroll-by"&&f.body.kind!=="set-interaction-mode"&&f.body.kind!=="set-theme-override"&&f.body.kind!=="clear-theme-override"&&f.body.kind!=="get-theme-variables"&&f.body.kind!=="compute-drop-target-at-point"&&f.body.kind!=="observe-node-bounds"&&f.body.kind!=="clear-node-bounds-observer"&&f.body.kind!=="restore-text-edit"&&f.body.kind!=="clear-text-edit-rollback"&&f.body.kind!=="start-text-edit-at-point"&&f.body.kind!=="hit-test-at-point"&&!je(f.body))return;let l=f.body,D=typeof f.sessionKey=="string"?f.sessionKey:null,v=d.source,k=d.origin;if(!D||!k||!v||typeof v.postMessage!="function"||!N(D,v))return;if(s){if(s.sourceWindow!==v||s.targetOrigin!==k)return;s.sessionKey!==D&&(E(),_(),T(),s=null)}C(D,v,k),Se(),re();let y=B=>{let W=typeof l.id=="string"?l.id:"unknown";v.postMessage(ee({id:W,...B},{sessionKey:D}),k)};try{if(je(l)){Ht({message:l,sendEvent:S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},sendResponse:y,subscriptions:m,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for patch target"});return}let I=l.payload.preview,P=I?An(I.sessionId,l.payload.ref):null;if(P&&I){let ie=te.get(P)??-1;if(I.revision<ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,stale:!0,latestRevision:ie}});return}if(I.revision===ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,duplicate:!0,latestRevision:ie}});return}}if(Dn(S,l.payload.patch),P&&I&&Pn(P,I.revision),I?.responseDetail==="none"){y({type:"response",ok:!0,result:{applied:!0,appliedRevision:I.revision}});return}y({type:"response",ok:!0,result:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,I?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for hit target"});return}y({type:"response",ok:!0,result:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for path target"});return}let I=[],P=S;for(;P;)P.getAttribute("data-vcp-edit-key")&&I.push(F(P,q(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),P=P.parentElement;y({type:"response",ok:!0,result:I.reverse()});return}if(l.kind==="restore-text-edit"||l.kind==="clear-text-edit-rollback"){let S=l.payload.ref;if(l.kind==="clear-text-edit-rollback"){r&&$e(r.ref,S)&&(r=null),y({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!$e(r.ref,S)){y({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let I=rn(e.document,r,t.getCurrentDocument?.()??null);r=null,y(I?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(l.kind==="get-scroll-metrics"){y({type:"response",ok:!0,result:le(e)});return}if(l.kind==="scroll-to"){let S=Number(l.payload.x),I=Number(l.payload.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:S,top:I}),y({type:"response",ok:!0,result:le(e)});return}if(l.kind==="scroll-by"){let S=Number(l.payload.deltaX),I=Number(l.payload.deltaY);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:S,top:I}),y({type:"response",ok:!0,result:{...le(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?oe(D,v,k):s?.sourceWindow===v&&s.targetOrigin===k&&s.sessionKey===D&&_(),y({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){Fn(e.document,l.payload),y({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){Bn(e.document),y({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){y({type:"response",ok:!0,result:Mn(e.document,l.payload.names)});return}if(l.kind==="compute-drop-target-at-point"){let S=Number(l.payload?.x),I=Number(l.payload?.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid drop target point"});return}y({type:"response",ok:!0,result:Cn(e,S,I,l.payload.dragKind,l.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(l.kind==="observe-node-bounds"){let S=l.payload.ref;if(!S){y({type:"response",ok:!1,error:"Missing bounds observer target"});return}let I=$(e.document,S,t.getCurrentDocument?.()??null);if(!I){y({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=Sn(e,I,S,t.getCurrentDocument,t.getDocumentEntry,P=>U({kind:"node-bounds-change",payload:{hit:P}})),y({type:"response",ok:!0,result:{observing:!0}}),U({kind:"node-bounds-change",payload:{hit:F(I,S,t.getDocumentEntry,"summary")}});return}if(l.kind==="clear-node-bounds-observer"){o?.(),o=null,y({type:"response",ok:!0,result:{cleared:!0}});return}if(l.kind!=="hit-test-at-point"&&l.kind!=="start-text-edit-at-point")return;let B=Number(l.payload?.x),W=Number(l.payload?.y);if(!Number.isFinite(B)||!Number.isFinite(W)){y({type:"response",ok:!1,error:"Invalid text edit point"});return}let H=l.kind==="hit-test-at-point"?pe(e.document,B,W,t.getCurrentDocument?.()??null):sn(e.document,B,W,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!H){y({type:"response",ok:!1,error:l.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let V=l.kind==="start-text-edit-at-point"?H:null,w=l.kind==="hit-test-at-point"?H:V.element,Q=l.payload.detailLevel??"full",Z=Q==="full"?q(e.document,w,t.getCurrentDocument?.()??null):we(e.document,w,t.getCurrentDocument?.()??null),b=V&&typeof V.textSegmentIndex=="number"?{...Z,textSegmentIndex:V.textSegmentIndex}:Z,ft=F(w,b,t.getDocumentEntry,Q);if(l.kind==="hit-test-at-point"){y({type:"response",ok:!0,result:ft});return}E(),n=Vn(e,w,b,S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},{...V?.textNode?{textNode:V.textNode}:{},onCommitSnapshot:S=>{r=S}}),y({type:"response",ok:!0,result:{ref:b}})}catch(B){y({type:"response",ok:!1,error:B instanceof Error?B.message:"Failed to start text edit"})}};return e.addEventListener("message",x),e.addEventListener(Te,p),e.addEventListener(ke,g),()=>{E(),_(),s=null,T(),e.removeEventListener("message",x),e.removeEventListener(Te,p),e.removeEventListener(ke,g)}}function je(e){let t=e.kind;return t==="bridge-initialize-session"||t==="bridge-get-document"||t==="bridge-get-history-status"||t==="bridge-get-style-context"||t==="bridge-ensure-document-version"||t==="bridge-acknowledge-document-version"||t==="bridge-get-object-edit-context"||t==="bridge-get-class-name-source"||t==="bridge-get-source-tree"||t==="bridge-get-source-file"||t==="bridge-resolve-source-location"||t==="bridge-execute"||t==="bridge-undo"||t==="bridge-redo"||t==="bridge-subscribe"||t==="bridge-unsubscribe"}function Gt(e){return e.kind==="update-text"||e.kind==="update-array-item"||e.kind==="set-class-name-source"||e.kind==="set-props"||e.kind==="apply-style-draft"}async function Ht({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,windowLike:u}){let c=u.__VCP_SITE_EDIT__;if(!c){n({type:"response",ok:!1,error:"Site edit bridge is not ready in preview frame"});return}try{switch(e.kind){case"bridge-initialize-session":{let a=await c.initializeSession({routeId:e.payload.routeId,...e.payload.mutationContext?{mutationContext:e.payload.mutationContext}:{}});o?.(a.data.document),Qe(u,{routeId:a.data.document.routeId,version:a.data.document.version}),n({type:"response",ok:!0,result:a});return}case"bridge-get-document":{let a=await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await c.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await c.getStyleContext(e.payload.routeId)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let a=c.ensureDocumentVersion?await c.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let a=c.acknowledgeDocumentVersion?await c.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await c.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let a=await c.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Yt(a,e.payload.key,u.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await c.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await c.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await c.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let a=await c.execute(e.payload.request,e.payload.mutationContext),h=i?.()?.routeId;if(a.ok&&h&&c.acknowledgeDocumentVersion&&Gt(e.payload.request)){let m=await c.acknowledgeDocumentVersion(h,a.data.resultVersion);o?.(m.data)}n({type:"response",ok:!0,result:a});return}case"bridge-undo":n({type:"response",ok:!0,result:await c.undo(e.payload.mutationContext)});return;case"bridge-redo":n({type:"response",ok:!0,result:await c.redo(e.payload.mutationContext)});return;case"bridge-subscribe":{let a=e.payload.subscriptionId;r.get(a)?.();let h=c.subscribe(m=>{t({kind:"bridge-event",payload:{event:m,subscriptionId:a}})});r.set(a,h),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let a=e.payload.subscriptionId;r.get(a)?.(),r.delete(a),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(a){s?.(a,e),n({type:"response",ok:!1,error:tn(a)})}}function Yt(e,t,n,r){if(!e.ok)return e;let i=$(n,{key:t},r),o=i?Jt(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Jt(e){let t=e.ownerDocument.defaultView;if(!t)return null;let n=t.getComputedStyle(e);return{color:n.color,backgroundColor:n.backgroundColor,borderColor:n.borderColor}}function Xt(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let a=n();a!==o&&(o=a,t())},u=()=>s(),c=()=>s();return e.history.pushState=function(...h){let m=r.apply(this,h);return s(),m},e.history.replaceState=function(...h){let m=i.apply(this,h);return s(),m},e.addEventListener("popstate",u),e.addEventListener("hashchange",c),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",u),e.removeEventListener("hashchange",c)}}function Qt(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function Je(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function Xe(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function Qe(e,t){e.dispatchEvent(new CustomEvent(Te,{detail:t}))}function Zt(e,t){e.dispatchEvent(new CustomEvent(ke,{detail:t}))}function Lt(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function en(e,t){return e.routeId===t}function Ne(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Ze(e){let t=Ne(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function tn(e){let t=Ne(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Ze(t)?"Site edit bridge disconnected":t}function Y(e){let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/authentication|auth failed|auth rejected|bridge key|session|unauthorized|forbidden|expired/i.test(t)}function Le(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function Ae(e){return Bt.has(tt(e))}function nn(e){return Mt.has(tt(e))}function et(e){return e.operationSummary?{canUpdateText:e.operationSummary.canUpdateText,canInsertChild:e.operationSummary.canInsertChild,canMove:e.operationSummary.canMove,canRemove:e.operationSummary.canRemove}:e.fallbackMode!=="preview"?{canUpdateText:!1,canInsertChild:!1,canMove:!1,canRemove:!1}:{canUpdateText:nn(e.tagName),canInsertChild:Ae(e.tagName),canMove:!1,canRemove:!1}}function tt(e){return e?.trim().toLowerCase()??""}function $e(e,t){return e.key!==t.key||e.instanceIndex!==t.instanceIndex||e.instanceCount!==t.instanceCount?!1:typeof e.textSegmentIndex=="number"&&typeof t.textSegmentIndex=="number"?e.textSegmentIndex===t.textSegmentIndex:!0}function rn(e,t,n){let r=$(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=on(r,t.ref.textSegmentIndex);return i?(i.nodeValue=t.initialText,!0):!1}return typeof t.initialHtml=="string"?(r.innerHTML=t.initialHtml,!0):(r.textContent=t.initialText,!0)}function on(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function sn(e,t,n,r,i){let o=pe(e,t,n,r),s=nt(o);if(!s)return null;let u=s.getAttribute("data-vcp-edit-key")??"",c=q(e,s,r),a=i?.(c.key)??i?.(u);if(!et({operationSummary:a?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let m=un(e,t,n,s);if(m){let R=an(s,m);if(R!==null)return{element:s,textNode:m,textSegmentIndex:R}}return me(s)?null:{element:s}}function un(e,t,n,r){let i=cn(e,t,n);return!i||i.parentElement!==r?null:i}function cn(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(de(o))return o;let u=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return de(u)?u:null}function an(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function de(e){return e?.nodeType===3}function pe(e,t,n,r=null){let i=typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean);for(let o of i){let s=nt(o),u=s?.getAttribute("data-vcp-edit-key")??"";if(s&&hn(s,r,u))return s}return null}function nt(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Pe(t))return n??t;!ln(r)&&!n&&(n=t)}t=t.parentElement}return n}function Pe(e){return e.getAttribute(Ft)!==null}function ln(e){return dn(e.split("::")[0]??"")}function dn(e){if(!e)return!1;let t=pn(e);return t===ue||t.startsWith(`${ue}/`)||t.includes(`/${ue}/`)||t.endsWith(`/${ue}`)}function pn(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let i of n.split("/"))if(!(!i||i===".")){if(i===".."){r.pop();continue}r.push(i)}return r.join("/")}function q(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(r)}"]`))),n,r);if(i.length<=1)return{key:ze(n,r,0)};let o=i.indexOf(t);return o>=0?{key:ze(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function we(e,t,n){return q(e,t,n)}function $(e,t,n){let r=fe(t.key)??t.key,i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(r)}"]`))),n,t.key);if(i.length===0)return null;let o=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<i.length?t.instanceIndex:null,s=(fe(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let u=fn(n,t.key);return u!==null&&u>=0&&u<i.length?i[u]??null:o!==null?i[o]??null:i[0]??null}function ze(e,t,n){return rt(e,t)[n]?.key??t}function fn(e,t){let n=fe(t);if(!n)return null;let i=rt(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function rt(e,t){return(e?.entries??[]).filter(n=>(fe(n.key)??n.key)===t)}function ot(e,t,n){let r=it(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function hn(e,t,n){let r=it(t,n);return!r||e.tagName.toLowerCase()===r}function it(e,t){return null}var mn=2,gn=4;function st(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&gn)!==0?-1:(r&mn)!==0?1:0})}function fe(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(We);if(n<0)break;let r=Number(t.slice(n+We.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function yn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=i=>{let o=Number.parseFloat(i??"");return Number.isFinite(o)&&o>0?o:0};return{marginTop:r(n?.marginTop),marginRight:r(n?.marginRight),marginBottom:r(n?.marginBottom),marginLeft:r(n?.marginLeft),paddingTop:r(n?.paddingTop),paddingRight:r(n?.paddingRight),paddingBottom:r(n?.paddingBottom),paddingLeft:r(n?.paddingLeft),borderTopWidth:r(n?.borderTopWidth),borderRightWidth:r(n?.borderRightWidth),borderBottomWidth:r(n?.borderBottomWidth),borderLeftWidth:r(n?.borderLeftWidth),columnGap:r(n?.columnGap),rowGap:r(n?.rowGap)}}function bn(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>vn(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}function F(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),u=he(e),c=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([E,_])=>[E,_??""])),attributes:Object.fromEntries(e.getAttributeNames().map(E=>[E,e.getAttribute(E)??""]))}:{},a=et({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),h=Pe(e),m=!0,R=ct(e)?.getAttribute("data-vcp-edit-key")??null;return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},...R?{parentKey:R}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...c,runtimeFlags:{selectable:!0,movable:a.canMove,removable:a.canRemove,textEditable:a.canUpdateText,container:h?!1:!!me(e)||a.canInsertChild||m&&Ae(s)},layout:u,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childRects:bn(e),spacing:yn(e)}}function Sn(e,t,n,r,i,o){let s=t,u=F(s,n,i,"summary"),c=null,a=()=>{c===null&&(c=Je(e,h))},h=()=>{c=null;let N=$(e.document,n,r?.()??null);if(!N)return;N!==s&&(R?.unobserve(s),s=N,R?.observe(s));let T=F(s,n,i,"summary");T.rect.width<=0||T.rect.height<=0||En(u,T)&&(u=T,o(T))},m=e.ResizeObserver,R=typeof m=="function"?new m(a):null;R?.observe(s);let E=e.MutationObserver,_=typeof E=="function"?new E(a):null;_?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",a,{passive:!0});let C=e.visualViewport;return C?.addEventListener?.("resize",a,{passive:!0}),e.document.addEventListener("load",a,!0),()=>{c!==null&&(Xe(e,c),c=null),R?.disconnect(),_?.disconnect(),e.removeEventListener("resize",a),C?.removeEventListener?.("resize",a),e.document.removeEventListener("load",a,!0)}}function En(e,t){return ut(e.rect,t.rect)||In(e.childRects,t.childRects)||Ge(e.spacing,t.spacing)||Ge(e.layout,t.layout)}function In(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>ut(i,r[o]??i))}function Ge(e,t){let n=e??{},r=t??{},i=new Set([...Object.keys(n),...Object.keys(r)]);return Array.from(i).some(o=>n[o]!==r[o])}function vn(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function ut(e,t){return Math.abs(e.top-t.top)>.5||Math.abs(e.left-t.left)>.5||Math.abs(e.width-t.width)>.5||Math.abs(e.height-t.height)>.5}function Cn(e,t,n,r,i,o,s){let u=e.document,c=pe(u,t,n,o);if(!c)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let a=i?$(u,i,o):null;if(a&&De(c,a))return ce(u,c,"self-or-descendant",o,s);if(r==="move"&&a){let C=Tn(u,c,a,o,s);if(C){let N=Re(C.child,C.targetParent,t,n,"nearest");if(N)return ae(u,C.child,C.targetParent,N,o,s)}}let h=null,m=!1,R=c,E=c.parentElement;for(;E;){if(E.getAttribute("data-vcp-edit-key")){if(a&&De(E,a))return ce(u,c,"self-or-descendant",o,s);let C=He(E,r,s);if(C==="accept"){h={child:R,targetParent:E};break}C==="blocked"&&(m=!0),R=E}E=E.parentElement}let _=He(c,r,s);if(_==="accept"){if(h){let C=Re(h.child,h.targetParent,t,n,"edge");if(C)return ae(u,h.child,h.targetParent,C,o,s)}return ae(u,c,c,xn(c,t,n),o,s)}if(h){let C=Re(h.child,h.targetParent,t,n,"nearest");return ae(u,h.child,h.targetParent,C??"after",o,s)}return _==="blocked"||m?ce(u,c,"operation-boundary-blocked",o,s):ce(u,c,"no-accepting-parent",o,s)}function ce(e,t,n,r,i){return{anchorHit:F(t,q(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function ae(e,t,n,r,i,o){let s=F(t,q(e,t,i),o,"summary"),u=F(n,q(e,n,i),o,"summary"),c=he(n).indicatorOrientation,a=r==="append"||r==="prepend"?Rn(n.getBoundingClientRect(),c,r):_n(t.getBoundingClientRect(),c,r);return{anchorHit:s,targetParentHit:u,relation:r,indicatorOrientation:c,indicatorBounds:a}}function He(e,t,n){if(Pe(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":me(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return Ae(o)?"accept":"not-container"}function Re(e,t,n,r,i){let o=he(t).indicatorOrientation,s=e.getBoundingClientRect(),u=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&u>=.25&&u<=.75?null:u<.5?"before":"after"}function xn(e,t,n){let r=he(e).indicatorOrientation,i=e.getBoundingClientRect();return(r==="vertical"?i.width>0?(t-i.left)/i.width:.5:i.height>0?(n-i.top)/i.height:.5)<.5?"prepend":"append"}function he(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=n?.display??"",i=n?.flexDirection,o=n?.gridAutoFlow,s="horizontal";return r==="flex"||r==="inline-flex"?s=(i??"row").startsWith("row")?"vertical":"horizontal":(r==="grid"||r==="inline-grid")&&(s=(o??"row").includes("column")?"vertical":"horizontal"),{display:r,...i?{flexDirection:i}:{},...o?{gridAutoFlow:o}:{},indicatorOrientation:s}}function Rn(e,t,n){if(t==="vertical")return{left:n==="prepend"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="prepend"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function _n(e,t,n){if(t==="vertical")return{left:n==="before"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="before"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function De(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function Tn(e,t,n,r,i){let o=kn(e,t,n,r,i);if(o)return o;let s=ct(n);if(!s||t===s)return null;let u=t,c=t.getAttribute("data-vcp-edit-key")?t:null;for(;u&&u!==s;)u.getAttribute("data-vcp-edit-key")&&(c=u),u=u.parentElement;return u!==s||!c||c===s||c===n||De(c,n)?null:{child:c,targetParent:s}}function kn(e,t,n,r,i){return null}function ct(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function me(e){for(let t of Array.from(e.childNodes)){if(typeof t.getAttribute!="function")continue;let n=t;if(n.getAttribute("data-vcp-edit-key"))return n;let r=me(n);if(r)return r}return null}function le(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:O(e.scrollX),scrollY:O(e.scrollY),scrollWidth:Math.max(O(t?.scrollWidth),O(n?.scrollWidth),O(e.innerWidth)),scrollHeight:Math.max(O(t?.scrollHeight),O(n?.scrollHeight),O(e.innerHeight)),viewportWidth:O(e.innerWidth),viewportHeight:O(e.innerHeight)}}function Dn(e,t){Object.entries(t.attributes??{}).forEach(([r,i])=>{if(i===null){e.removeAttribute(r);return}e.setAttribute(r,i)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,i])=>{if(n.has(r))return;let o=e.style,s=r.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`);if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i))}),t.styleDeclarations?.forEach(r=>{let i=e.style,o=r.property.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var Nn=500,te=new Map;function An(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Pn(e,t){if(te.size>=Nn){let n=te.keys().next().value;n&&te.delete(n)}te.set(e,t)}var ne=new Set;function Fn(e,t){let n=e.documentElement?.style,r=new Set;for(let[i,o]of Object.entries(t.variables??{}))i.startsWith("--")&&(r.add(i),n?.setProperty(i,o));for(let i of ne)r.has(i)||n?.removeProperty(i);ne.clear();for(let i of r)ne.add(i);Kn(e,t.stylesheets??[])}function Bn(e){let t=e.documentElement?.style;for(let n of ne)t?.removeProperty(n);ne.clear();for(let n of dt(e))n.remove()}function Mn(e,t){let n=Array.from(new Set(t.filter(s=>typeof s=="string"&&s.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,i=r?e.defaultView?.getComputedStyle(r):null,o={};for(let s of n){let u=at(i,s);u&&(o[s]=u)}return o}function at(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return lt(e,r,n)}function lt(e,t,n){if(!t)return null;let r=On(t);if(!r)return t;let i=at(e,r.name,n);return i||(r.fallback?lt(e,r.fallback,n)??r.fallback:null)}function On(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=qn(n),i=r>=0?n.slice(0,r).trim():n;if(!i.startsWith("--"))return null;let o=r>=0?n.slice(r+1).trim():null;return{name:i,fallback:o||null}}function qn(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="("){t+=1;continue}if(r===")"){t=Math.max(0,t-1);continue}if(r===","&&t===0)return n}return-1}function Kn(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of dt(e)){let s=o.getAttribute("href")??"";if(!n.has(s)||r.has(s)){o.remove();continue}r.set(s,o)}let i=e.head;if(i)for(let o of n){if(r.has(o))continue;let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute(Ye,"true"),s.setAttribute("href",o),i.appendChild(s)}}function dt(e){return Array.from(e.querySelectorAll(`link[${Ye}]`))}function Vn(e,t,n,r,i={}){let o=i.textNode?Un(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,u=s.textContent??"",c=o?void 0:t.innerHTML,a=Wn(s),h=!1,m=()=>{e.document.removeEventListener("pointerdown",E,!0),s.removeEventListener("keydown",_),s.removeEventListener("blur",C),s.removeEventListener("input",N),$n(s,a)},R=T=>{if(h)return;h=!0;let A=s.textContent??"";if(m(),T==="cancel"){o?.restore(u),o||(t.textContent=u),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(A),T==="commit"&&A!==u){i.onCommitSnapshot?.({ref:n,initialText:u,...c!==void 0?{initialHtml:c}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:A}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function E(T){let A=T.target;A&&s.contains(A)||R("commit")}function _(T){if(T.key==="Escape"){T.preventDefault(),R("cancel");return}T.key==="Enter"&&(T.metaKey||T.ctrlKey)&&(T.preventDefault(),R("commit"))}function C(){R("commit")}function N(){r({kind:"text-edit-input",payload:{ref:n,hit:F(t,n,void 0,"full")}})}return jn(s),e.document.addEventListener("pointerdown",E,!0),s.addEventListener("keydown",_),s.addEventListener("blur",C),s.addEventListener("input",N),Gn(s),Hn(s,e.document),m}function Un(e,t){let n=t.parentNode;if(!n)return null;let r=e.createElement("span");return r.setAttribute("data-vcp-text-segment-editor","true"),r.textContent=t.textContent??"",n.replaceChild(r,t),{element:r,restore(i){t.nodeValue=i,r.parentNode&&r.parentNode.replaceChild(t,r)}}}function Wn(e){return{contentEditable:e.getAttribute("contenteditable"),spellcheck:e.getAttribute("spellcheck"),marker:e.getAttribute("data-vcp-edit-text-editing"),cursor:e.style.cursor,userSelect:e.style.userSelect}}function jn(e){wn(e.ownerDocument),e.setAttribute("contenteditable","plaintext-only"),e.setAttribute("spellcheck","false"),e.setAttribute("data-vcp-edit-text-editing","true"),e.style.cursor="text",e.style.userSelect="text"}function $n(e,t){_e(e,"contenteditable",t.contentEditable),_e(e,"spellcheck",t.spellcheck),_e(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function wn(e){if(e.getElementById("vcp-text-edit-base-style"))return;let t=e.createElement("style");t.id="vcp-text-edit-base-style",t.textContent='[data-vcp-edit-text-editing="true"]{outline:0!important;outline-offset:0!important;}',e.head.appendChild(t)}function _e(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function zn(e){let t=[e.documentElement,e.body].filter(r=>!!r?.style),n=t.map(r=>({element:r,userSelect:r.style.userSelect}));for(let r of t)r.style.userSelect="none";return()=>{for(let r of n)r.element.style.userSelect=r.userSelect}}function Gn(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Hn(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function pt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function O(e){let t=Number(e);return Number.isFinite(t)?t:0}export{ke as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,Te as VCP_SITE_EDIT_ROUTE_READY_EVENT,Ot as resolveSiteEditRouteId,Kt as resolveSiteEditWebSocketUrl,sr as startSiteEditAutoBootstrap,zt as startSiteEditFrameRuntime};
1
+ function Ee(e){if(!mt(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=i=>{let o=t.get(i);if(o)return o;let s=e.nodes[i];if(!s)throw new Error(`Missing compact document node ${i}`);let[u,c]=s,a=e.tokens[c];if(typeof a!="string")throw new Error(`Missing compact document token ${c}`);let h=`${u===null?"":r(u)}${a}`;return t.set(i,h),h};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map(i=>{let[o,s,u]=i,c=u===void 0?void 0:n[u];if(u!==void 0&&!c)throw new Error(`Missing page composition unit ${u}`);return{key:r(o),...c?{pageCompositionUnitKey:c}:{},operationSummary:ht(s)}})}}function ht(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function mt(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}var w=class e{constructor(){}static parseMessage(t,n={}){let r=JSON.parse(t);if(!e.isMessage(r,n))throw new Error("Invalid site edit bridge message");return r}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(typeof t=="object"&&t!==null&&"payload"in t&&typeof t.payload=="object"&&t.payload!==null){let n=t.payload,r=typeof n.id=="string"?n.id:"unknown",i=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:i}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="initialize-session"||t==="get-document"||t==="get-history-status"||t==="get-style-context"||t==="get-object-edit-context"||t==="get-class-name-source"||t==="get-source-tree"||t==="get-source-file"||t==="resolve-source-location"||t==="execute"||t==="undo"||t==="redo"}static isMessage(t,n={}){return!M(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?M(t.payload)&&typeof t.payload.id=="string":t.type==="event"?M(t.payload)&&M(t.payload.event):t.type==="auth"?M(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?M(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!M(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"initialize-session":return typeof t.routeId=="string"&&(t.mutationContext===void 0||Ie(t.mutationContext));case"get-document":case"get-style-context":return typeof t.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof t.key=="string"&&(t.routeId===void 0||typeof t.routeId=="string");case"get-history-status":return t.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return gt(t.request)&&(t.request.mutationContext===void 0||Ie(t.request.mutationContext))&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return t.mutationContext===void 0||Ie(t.mutationContext)}}};function M(e){return typeof e=="object"&&e!==null}function gt(e){return M(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&(e.routeId===void 0||typeof e.routeId=="string")&&typeof e.kind=="string"&&M(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&M(e.params)}function Ie(e){return yt(e)}function yt(e){return M(e)?typeof e.editingSessionId=="string"&&e.editingSessionId.length>0&&typeof e.lockId=="string"&&e.lockId.length>0&&typeof e.ownerId=="string"&&e.ownerId.length>0&&typeof e.leaseAssertion=="string"&&e.leaseAssertion.length>0:!1}var bt="vcp:designer:trace",St="designer_trace",Fe="__VCP_DESIGNER_TRACE__";var Et=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function It(e=globalThis){let t=e;try{if(t.localStorage?.getItem(bt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(St)==="1"}catch{return!1}}function j(e,t={},n=globalThis){if(!It(n))return;let r={type:e,timestamp:Date.now(),payload:vt(t)},i=n,o=i[Fe]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[Fe]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function vt(e){return ve(e,0)}function ve(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>ve(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Et.test(r)){n[r]="[redacted]";continue}n[r]=ve(i,t+1)}return n}var se=class{constructor(t){this.options=t,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===Ce&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((t,n)=>{let r;try{r=this.createSocket(this.options.url)}catch(u){let c=L(u,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),n(c);return}let i={socket:r,settled:!1,reject:n};this.connectAttempt=i,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==i||(i.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},s=(u,c)=>{this.cleanupSocket(r,u,c)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(w.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(u){s(L(u,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=u=>{if(this.socket!==r)return;let c=L(u,"WebSocket failed");s(c,"failed")},r.onmessage=u=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(u.data,r,i,()=>{o()});return}this.handleMessage(u.data)}},r.onclose=u=>{if(this.socket!==r)return;let c=this.intentionalClose,a=new Error(Rt(u,{intentional:c}));s(a,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){return this.request("get-document",{routeId:t})}initializeSession(t){return this.request("initialize-session",t)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(t){return this.request("get-style-context",{routeId:t})}getObjectEditContext(t,n){return this.request("get-object-edit-context",{key:t,routeId:n})}getClassNameSource(t,n){return this.request("get-class-name-source",{key:t,routeId:n})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(t){return this.request("get-source-file",t)}resolveSourceLocation(t){return this.request("resolve-source-location",t)}execute(t,n){return this.request("execute",{request:t})}undo(t){return this.request("undo",{})}redo(t){return this.request("redo",{})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==Ce||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${r?.readyState??"none"})`));let i=`${t}-${this.sequence+=1}`,o=Dt(i,t,n);return j("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:Be(n.request,"kind"),documentVersion:Be(n.request,"documentVersion")}),new Promise((s,u)=>{let c=this.resolveRequestTimeoutMs(t),a=c>0?setTimeout(()=>{let h=this.pending.get(i);h&&(this.pending.delete(i),j("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),h.reject(new Error(`Bridge request timed out after ${c}ms: ${t}`)))},c):null;a?.unref?.(),this.pending.set(i,{kind:t,timeout:a,resolve:h=>s(h),reject:u});try{r.send(w.stringifyMessage(o))}catch(h){let m=L(h,"WebSocket send failed");this.clearPendingRequest(i),u(m),this.cleanupSocket(r,m,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(w.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=L(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=w.parseMessage(t);if(n.type==="event"){for(let i of this.listeners)i(n.payload.event);return}if(n.type!=="response"&&n.type!=="error")return;let r=this.pending.get(n.payload.id);if(r){if(this.clearPendingRequest(n.payload.id),n.type==="error"){j("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}j("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Tt(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Ee(n.payload.result.data)}:r.kind==="initialize-session"?kt(n.payload.result):n.payload.result)}}rejectAll(t){for(let[n,r]of[...this.pending])this.clearPendingRequest(n),r.reject(t)}clearPendingRequest(t){let n=this.pending.get(t);n&&(n.timeout&&clearTimeout(n.timeout),this.pending.delete(t))}resolveRequestTimeoutMs(t){let n=this.options.requestTimeoutMsByKind?.[t];return typeof n=="number"?Math.max(0,n):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):_t[t]??xt}cleanupSocket(t,n,r){if(this.socket===t&&(this.socket=null),this.connectAttempt?.socket===t){let i=this.connectAttempt;this.connectAttempt=null,i.settled||(i.settled=!0,i.reject(n))}this.connectPromise=null,this.rejectAll(n),this.setConnectionState(r,n.message),t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null;try{(t.readyState===Ct||t.readyState===Ce)&&t.close()}catch{}}setConnectionState(t,n){if(this.connectionState===t&&!n)return;this.connectionState=t;let r={state:t,...n?{message:n}:{}};this.options.onConnectionStatus?.(r);for(let i of this.connectionStatusListeners)i(r)}createSocket(t){if(this.options.createSocket)return this.options.createSocket(t);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(t)}},Ct=0,Ce=1,xt=15e3,_t={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function L(e,t){return e instanceof Error?e:new Error(t)}function Rt(e,t){return t.intentional?"WebSocket disconnected":e?.code===1008?e.reason?`Bridge session authentication failed: ${e.reason}`:"Bridge session authentication failed":e?.reason?`WebSocket closed: ${e.reason}`:typeof e?.code=="number"&&e.code!==1005?`WebSocket closed with code ${e.code}`:"WebSocket closed"}function Be(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Tt(e){if(!e||typeof e!="object")return null;let t=e,n=t.data?.resultVersion??t.data?.version??null;return typeof n=="number"?n:null}function Oe(e){return new xe(e)}var xe=class{constructor(t){this.params=t,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!Me(t.initialDocument)}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=Me(this.currentDocument);return(n||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(n?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(t){if(t.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let n=await this.params.client.initializeSession(t);return this.currentDocument=n.data.document,this.observedDocumentVersion=n.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),n}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=this.styleContextCache;if(n?.generation===this.styleGeneration)return{ok:!0,data:n.value};let r=this.styleContextInFlight;if(r?.generation===this.styleGeneration)return r.request;let i=this.styleGeneration,o=this.params.client.getStyleContext(t).then(s=>(this.styleGeneration===i&&(this.styleContextCache={generation:i,value:s.data}),s)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:i,request:o},o}async ensureDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let r=await this.refreshSnapshot(n,"ensure-version");if(r.version<n)throw new Error(`Document refresh returned version ${r.version}, expected at least ${n}`);return{ok:!0,data:r}}async acknowledgeDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return n>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.objectCacheKey(t,n),i=this.editContextCache.get(r);if(i)return{ok:!0,data:i};let o=this.editContextInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getObjectEditContext(t,n??this.params.routeId).then(c=>(this.objectGeneration===s&&this.editContextCache.set(r,c.data),c)).finally(()=>{this.editContextInFlight.get(r)===u&&this.editContextInFlight.delete(r)});return this.editContextInFlight.set(r,u),u}async getClassNameSource(t,n){let r=this.objectCacheKey(t,n),i=this.classNameSourceCache.get(r);if(i)return i;let o=this.classNameSourceInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getClassNameSource(t,n??this.params.routeId).then(c=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,c),c)).finally(()=>{this.classNameSourceInFlight.get(r)===u&&this.classNameSourceInFlight.delete(r)});return this.classNameSourceInFlight.set(r,u),u}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(t){return this.params.client.getSourceFile(t)}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({...t,routeId:t.routeId??this.params.routeId})}async execute(t,n){let r=t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t;return this.params.client.execute(r)}async undo(t){return this.params.client.undo()}async redo(t){return this.params.client.redo()}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&n.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n.version),n.version>this.currentDocument.version&&this.clearObjectCaches(),t(n);return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let i=await this.refreshInFlight;if(typeof t!="number"||i.version>=t||this.currentDocument.version>=t)return this.currentDocument}j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let r=this.params.client.getDocument(this.params.routeId).then(i=>(this.currentDocument=i.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,i.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(t){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!t?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(t,n){return`${n??this.params.routeId}\0${t}`}};function Me(e){return e.version===0&&e.entries.length===0}function kt(e){let t=e;return{...t,data:{...t.data,document:Ee(t.data.document)}}}function Dt(e,t,n){switch(t){case"initialize-session":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId),...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-history-status":return{type:"request",payload:{id:e,kind:t}};case"get-style-context":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:e,kind:t}};case"get-source-file":return{type:"request",payload:{id:e,kind:t,path:String(n.path)}};case"resolve-source-location":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"execute":return{type:"request",payload:{id:e,kind:t,request:n.request}};case"undo":case"redo":return{type:"request",payload:{id:e,kind:t,mutationContext:n.mutationContext}}}}var qe="vcp-window-message";function Nt(e){return{source:qe,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function At(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===qe&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var Ke="site-edit",Ve="frame-runtime";function ee(e,t={}){return Nt({namespace:Ke,channel:Ve,sessionKey:t.sessionKey,body:e})}function Ue(e){return!At(e)||e.namespace!==Ke||e.channel!==Ve?!1:typeof e.body?.type=="string"}var Te="vcp-site-edit:route-ready",ke="vcp-site-edit:bridge-status",Pt=1e3,Ft="data-vcp-ui-component",Ye="data-vcp-theme-preview",We="::repeat-item#",ue="components/ui",Bt=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),Mt=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function Ot(e,t=""){let n=Le(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function qt(e,t){if(e.__VCP_SITE_EDIT_VERSION_LOGGED__)return;let n=e.console?.info;typeof n=="function"&&(e.__VCP_SITE_EDIT_VERSION_LOGGED__=!0,n.call(e.console,"[VCP Site Edit] runtime loaded",{bridge:t.versions?.bridge??"unknown",contracts:t.versions?.contracts??"unknown",documentVersion:t.documentVersion,engine:t.versions?.engine??"unknown",routeId:t.routeId}))}function Kt(e,t={}){if(t.explicit_ws_url)return t.explicit_ws_url.startsWith("/")?`${e.location.protocol==="https:"?"wss:":"ws:"}//${e.location.host}${t.explicit_ws_url}`:t.explicit_ws_url;let n=e.location.protocol==="https:"?"wss:":"ws:",r=t.port?`${e.location.hostname}:${t.port}`:e.location.host;return`${n}//${r}${t.path??"/__vcp/site-edit/bridge"}`}async function sr(e=window,t={}){let n=Kt(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Vt({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(Ut(i.signature,r)){await i.syncRoute?.();return}i.cleanup?.()}let o={activeClient:null,activeBridge:null,cleanupFrameRuntime:(()=>{}),retryTimer:void 0,routeSequence:0,syncInFlight:null,syncScheduled:!1,disposed:!1,currentDocument:null,currentEntriesByKey:new Map,unsubscribeDocument:void 0,unsubscribeConnectionStatus:void 0,unbindBootstrapLifecycle:void 0,unbindRouteChange:void 0},s,u=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,c=t.create_client??(p=>new se({url:p,authKey:t.bridge_session_key})),a=t.schedule_after_navigation??Qt,h=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},m=()=>Ot(e.location.pathname,t.basePath||""),_=!!e.parent&&e.parent!==e,E=p=>{Zt(e,p)},R=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(g=>[g.key,g]))},C=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},N=(p,g)=>!o.disposed&&g===o.routeSequence&&p===m(),T=async(p,g)=>{let x=o.activeBridge;if(!x)return null;let d=await x.getDocument(p);return N(p,g)&&R(d.data),d.data},A=()=>{C(),R(null);let p=o.activeBridge;o.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let g=o.activeClient;o.activeClient=null,g?.disconnect()},ge=p=>p===s.routeId&&!!o.activeBridge&&(_||!!(o.currentDocument&&en(o.currentDocument,p)))&&Lt(o.activeClient),ye=p=>Math.min(Pt*2**Math.max(0,p),8e3),G=(p,g,x)=>{if(o.disposed)return;h();let d=ye(x);E({state:"reconnecting",routeId:p,attempt:x,retryInMs:d,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||g!==o.routeSequence)&&re(x+1).catch(f=>{let l=m();if(p===l){if(Y(f)){E({state:"reload-required",routeId:p,attempt:x,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(p,o.routeSequence,x+1)}})},d)},J=(p,g,x)=>{if(!N(p,g)||o.activeClient===null)return;if(Y(x.message)){A(),h(),E({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let d=o.activeClient;C(),R(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,d?.disconnect(),G(p,g,0)},be=p=>{let g=m(),x=o.routeSequence;if(!(!N(g,x)||o.activeClient===null)){if(Y(p)){A(),h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Ze(p)&&J(g,x,{state:"failed",message:Ne(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=wt(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:R,onBridgeRequestError:p=>{be(p)}});let X=async()=>re(0),re=async p=>{if(o.disposed)return;let g=m();if(ge(g))return;let x=o.syncInFlight;if(x?.routeId===g)return x.promise;let d=o.routeSequence+1,f=Se(g,d,p);o.syncInFlight={routeId:g,sequence:d,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},Se=async(p,g,x)=>{o.routeSequence=g,h(),A(),E({state:x>0?"reconnecting":"connecting",routeId:p,attempt:x,messageKey:x>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let d=c(n),f=!1;o.activeClient=d,o.unsubscribeConnectionStatus=d.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&J(p,g,l)});try{if(await d.connect(),!N(p,g)){d.disconnect();return}let l=Oe({routeId:p,client:d,initialDocument:zt(p)});o.activeBridge=l,u()&&(e.__VCP_SITE_EDIT__=l),o.activeClient=d,o.unsubscribeDocument=l.subscribe(k=>{k.type==="site-edit.document.changed"&&k.routeId===p&&o.currentDocument&&k.version>o.currentDocument.version&&T(p,g).catch(()=>{})}),u()&&(s.routeId=p);let v=(_?null:await l.initializeSession({routeId:p}))?.data.document??null;if(v&&R(v),!N(p,g)){d.disconnect();return}f=!0,E({state:"ready",routeId:p,attempt:x,messageKey:"studio.status.previewReady"}),qt(e,{documentVersion:v?.version??0,routeId:p,versions:t.runtime_versions}),v&&Qe(e,{routeId:p,version:v.version})}catch(l){if(C(),o.activeClient===d&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,d.disconnect(),R(null),!N(p,g))return;throw E({state:Y(l)?"reload-required":"failed",routeId:p,attempt:x,messageKey:Y(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},U=p=>{if(o.disposed)return;let g=m();if(Y(p)){h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(g,o.routeSequence,0)},K=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,a(()=>{o.syncScheduled=!1,!o.disposed&&X().catch(p=>U(p))}))},oe=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,h(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),A(),u()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:X,cleanup:oe},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=jt(e,oe),o.unbindRouteChange=Xt(e,K,m),t.defer_initial_sync){K();return}await X()}function Vt(e){return{basePath:Le(e.options.basePath??""),bridgeUrl:e.bridgeUrl,runtimeVersions:{bridge:e.options.runtime_versions?.bridge??null,contracts:e.options.runtime_versions?.contracts??null,engine:e.options.runtime_versions?.engine??null},sessionKeyFingerprint:Wt(e.options.bridge_session_key)}}function Ut(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Wt(e){if(!e)return null;let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return`${e.length}:${t.toString(36)}`}function jt(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),$t(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function $t(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function zt(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function wt(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,u=null,c=null,a=null,h=null,m=new Map,_=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,E=()=>{n?.(),n=null,r=null},R=()=>{i?.(),i=null,o?.(),o=null},C=(d,f,l)=>{let D=s?.sessionKey!==d||s?.sourceWindow!==f||s?.targetOrigin!==l;s={sessionKey:d,sourceWindow:f,targetOrigin:l},D&&(a=null,h=null)},N=(d,f)=>{let l=e.parent&&e.parent!==e?e.parent:null;return!l||f!==l?!1:!_||d===_},T=()=>{for(let d of m.values())d();m.clear()},A=d=>JSON.stringify([d.routeId,d.version]),ge=()=>!c||c.state==="ready",ye=d=>JSON.stringify([d.state,d.routeId??null,d.attempt??null,d.retryInMs??null,d.messageKey??null]),G=d=>{if(!ge())return;let f=A(d);a!==f&&(o?.(),o=null,U({kind:"route-ready",payload:{routeId:d.routeId,version:d.version}}),s&&(a=f))},J=d=>{let f=ye(d);h!==f&&(d.state!=="ready"&&(a=null,u=null),U({kind:"bridge-status",payload:d}),s&&(h=f))},be=d=>{u=d,G(d)},X=d=>{c=d,J(d)},re=()=>{u&&G(u)},Se=()=>{c&&J(c)},U=d=>{s&&s.sourceWindow.postMessage(ee({type:"event",...d},{sessionKey:s.sessionKey}),s.targetOrigin)},K=(d,f,l,D)=>{let v=pe(e.document,f.clientX,f.clientY,t.getCurrentDocument?.()??null),k=v?F(v,l==="full"?q(e.document,v,t.getCurrentDocument?.()??null):ze(e.document,v,t.getCurrentDocument?.()??null),t.getDocumentEntry,l):null;D&&k&&(d==="pointer-click"||d==="pointer-double-click")&&(D.preventDefault(),D.stopPropagation(),typeof D.stopImmediatePropagation=="function"&&D.stopImmediatePropagation()),U({kind:d,payload:{clientX:f.clientX,clientY:f.clientY,buttons:Number(f.buttons??0),hit:k}})},oe=(d,f,l)=>{R(),s={sessionKey:d,sourceWindow:f,targetOrigin:l};let D=wn(e.document),v=null,k=null,y=()=>{k=null;let b=v;v=null,b&&K("pointer-move",b,"summary")},B=b=>{v={clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},k===null&&(k=Je(e,y))},W=b=>{K("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},H=b=>{K("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},V=b=>{K("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},z=b=>{K("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Q=b=>{K("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Z=()=>{U({kind:"scroll",payload:{metrics:le(e)}})};e.document.addEventListener("pointerdown",W,!0),e.document.addEventListener("pointermove",B,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",H,!0),e.document.addEventListener("pointercancel",V,!0),e.document.addEventListener("click",z,!0),e.document.addEventListener("dblclick",Q,!0),e.addEventListener("scroll",Z,{passive:!0}),i=()=>{k!==null&&(Xe(e,k),k=null),v=null,D(),e.document.removeEventListener("pointerdown",W,!0),e.document.removeEventListener("pointermove",B,!0),e.document.removeEventListener("pointerup",H,!0),e.document.removeEventListener("pointercancel",V,!0),e.document.removeEventListener("click",z,!0),e.document.removeEventListener("dblclick",Q,!0),e.removeEventListener("scroll",Z)}},p=d=>{let f=d.detail;f?.routeId&&be(f)},g=d=>{let f=d.detail;f?.state&&X(f)},x=d=>{let f=d.data;if(!Ue(f)||f.body.type!=="request"||f.body.kind!=="apply-node-patch"&&f.body.kind!=="get-hit-by-ref"&&f.body.kind!=="get-path-by-ref"&&f.body.kind!=="get-scroll-metrics"&&f.body.kind!=="scroll-to"&&f.body.kind!=="scroll-by"&&f.body.kind!=="set-interaction-mode"&&f.body.kind!=="set-theme-override"&&f.body.kind!=="clear-theme-override"&&f.body.kind!=="get-theme-variables"&&f.body.kind!=="compute-drop-target-at-point"&&f.body.kind!=="observe-node-bounds"&&f.body.kind!=="clear-node-bounds-observer"&&f.body.kind!=="restore-text-edit"&&f.body.kind!=="clear-text-edit-rollback"&&f.body.kind!=="start-text-edit-at-point"&&f.body.kind!=="hit-test-at-point"&&!je(f.body))return;let l=f.body,D=typeof f.sessionKey=="string"?f.sessionKey:null,v=d.source,k=d.origin;if(!D||!k||!v||typeof v.postMessage!="function"||!N(D,v))return;if(s){if(s.sourceWindow!==v||s.targetOrigin!==k)return;s.sessionKey!==D&&(E(),R(),T(),s=null)}C(D,v,k),Se(),re();let y=B=>{let W=typeof l.id=="string"?l.id:"unknown";v.postMessage(ee({id:W,...B},{sessionKey:D}),k)};try{if(je(l)){Ht({message:l,sendEvent:S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},sendResponse:y,subscriptions:m,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for patch target"});return}let I=l.payload.preview,P=I?An(I.sessionId,l.payload.ref):null;if(P&&I){let ie=te.get(P)??-1;if(I.revision<ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,stale:!0,latestRevision:ie}});return}if(I.revision===ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,duplicate:!0,latestRevision:ie}});return}}if(Dn(S,l.payload.patch),P&&I&&Pn(P,I.revision),I?.responseDetail==="none"){y({type:"response",ok:!0,result:{applied:!0,appliedRevision:I.revision}});return}y({type:"response",ok:!0,result:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,I?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for hit target"});return}y({type:"response",ok:!0,result:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for path target"});return}let I=[],P=S;for(;P;)P.getAttribute("data-vcp-edit-key")&&I.push(F(P,q(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),P=P.parentElement;y({type:"response",ok:!0,result:I.reverse()});return}if(l.kind==="restore-text-edit"||l.kind==="clear-text-edit-rollback"){let S=l.payload.ref;if(l.kind==="clear-text-edit-rollback"){r&&$e(r.ref,S)&&(r=null),y({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!$e(r.ref,S)){y({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let I=rn(e.document,r,t.getCurrentDocument?.()??null);r=null,y(I?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(l.kind==="get-scroll-metrics"){y({type:"response",ok:!0,result:le(e)});return}if(l.kind==="scroll-to"){let S=Number(l.payload.x),I=Number(l.payload.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:S,top:I}),y({type:"response",ok:!0,result:le(e)});return}if(l.kind==="scroll-by"){let S=Number(l.payload.deltaX),I=Number(l.payload.deltaY);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:S,top:I}),y({type:"response",ok:!0,result:{...le(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?oe(D,v,k):s?.sourceWindow===v&&s.targetOrigin===k&&s.sessionKey===D&&R(),y({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){Fn(e.document,l.payload),y({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){Bn(e.document),y({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){y({type:"response",ok:!0,result:Mn(e.document,l.payload.names)});return}if(l.kind==="compute-drop-target-at-point"){let S=Number(l.payload?.x),I=Number(l.payload?.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid drop target point"});return}y({type:"response",ok:!0,result:Cn(e,S,I,l.payload.dragKind,l.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(l.kind==="observe-node-bounds"){let S=l.payload.ref;if(!S){y({type:"response",ok:!1,error:"Missing bounds observer target"});return}let I=$(e.document,S,t.getCurrentDocument?.()??null);if(!I){y({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=Sn(e,I,S,t.getCurrentDocument,t.getDocumentEntry,P=>U({kind:"node-bounds-change",payload:{hit:P}})),y({type:"response",ok:!0,result:{observing:!0}}),U({kind:"node-bounds-change",payload:{hit:F(I,S,t.getDocumentEntry,"summary")}});return}if(l.kind==="clear-node-bounds-observer"){o?.(),o=null,y({type:"response",ok:!0,result:{cleared:!0}});return}if(l.kind!=="hit-test-at-point"&&l.kind!=="start-text-edit-at-point")return;let B=Number(l.payload?.x),W=Number(l.payload?.y);if(!Number.isFinite(B)||!Number.isFinite(W)){y({type:"response",ok:!1,error:"Invalid text edit point"});return}let H=l.kind==="hit-test-at-point"?pe(e.document,B,W,t.getCurrentDocument?.()??null):sn(e.document,B,W,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!H){y({type:"response",ok:!1,error:l.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let V=l.kind==="start-text-edit-at-point"?H:null,z=l.kind==="hit-test-at-point"?H:V.element,Q=l.payload.detailLevel??"full",Z=Q==="full"?q(e.document,z,t.getCurrentDocument?.()??null):ze(e.document,z,t.getCurrentDocument?.()??null),b=V&&typeof V.textSegmentIndex=="number"?{...Z,textSegmentIndex:V.textSegmentIndex}:Z,ft=F(z,b,t.getDocumentEntry,Q);if(l.kind==="hit-test-at-point"){y({type:"response",ok:!0,result:ft});return}E(),n=Vn(e,z,b,S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},{...V?.textNode?{textNode:V.textNode}:{},onCommitSnapshot:S=>{r=S}}),y({type:"response",ok:!0,result:{ref:b}})}catch(B){y({type:"response",ok:!1,error:B instanceof Error?B.message:"Failed to start text edit"})}};return e.addEventListener("message",x),e.addEventListener(Te,p),e.addEventListener(ke,g),()=>{E(),R(),s=null,T(),e.removeEventListener("message",x),e.removeEventListener(Te,p),e.removeEventListener(ke,g)}}function je(e){let t=e.kind;return t==="bridge-initialize-session"||t==="bridge-get-document"||t==="bridge-get-history-status"||t==="bridge-get-style-context"||t==="bridge-ensure-document-version"||t==="bridge-acknowledge-document-version"||t==="bridge-get-object-edit-context"||t==="bridge-get-class-name-source"||t==="bridge-get-source-tree"||t==="bridge-get-source-file"||t==="bridge-resolve-source-location"||t==="bridge-execute"||t==="bridge-undo"||t==="bridge-redo"||t==="bridge-subscribe"||t==="bridge-unsubscribe"}function Gt(e){return e.kind==="update-text"||e.kind==="update-array-item"||e.kind==="set-class-name-source"||e.kind==="set-props"||e.kind==="apply-style-draft"}async function Ht({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,windowLike:u}){let c=u.__VCP_SITE_EDIT__;if(!c){n({type:"response",ok:!1,error:"Site edit bridge is not ready in preview frame"});return}try{switch(e.kind){case"bridge-initialize-session":{let a=await c.initializeSession({routeId:e.payload.routeId});o?.(a.data.document),Qe(u,{routeId:a.data.document.routeId,version:a.data.document.version}),n({type:"response",ok:!0,result:a});return}case"bridge-get-document":{let a=await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await c.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await c.getStyleContext(e.payload.routeId)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let a=c.ensureDocumentVersion?await c.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let a=c.acknowledgeDocumentVersion?await c.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await c.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let a=await c.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Yt(a,e.payload.key,u.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await c.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await c.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await c.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let a=await c.execute(e.payload.request),h=i?.()?.routeId;if(a.ok&&h&&c.acknowledgeDocumentVersion&&Gt(e.payload.request)){let m=await c.acknowledgeDocumentVersion(h,a.data.resultVersion);o?.(m.data)}n({type:"response",ok:!0,result:a});return}case"bridge-undo":n({type:"response",ok:!0,result:await c.undo()});return;case"bridge-redo":n({type:"response",ok:!0,result:await c.redo()});return;case"bridge-subscribe":{let a=e.payload.subscriptionId;r.get(a)?.();let h=c.subscribe(m=>{t({kind:"bridge-event",payload:{event:m,subscriptionId:a}})});r.set(a,h),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let a=e.payload.subscriptionId;r.get(a)?.(),r.delete(a),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(a){s?.(a,e),n({type:"response",ok:!1,error:tn(a)})}}function Yt(e,t,n,r){if(!e.ok)return e;let i=$(n,{key:t},r),o=i?Jt(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Jt(e){let t=e.ownerDocument.defaultView;if(!t)return null;let n=t.getComputedStyle(e);return{color:n.color,backgroundColor:n.backgroundColor,borderColor:n.borderColor}}function Xt(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let a=n();a!==o&&(o=a,t())},u=()=>s(),c=()=>s();return e.history.pushState=function(...h){let m=r.apply(this,h);return s(),m},e.history.replaceState=function(...h){let m=i.apply(this,h);return s(),m},e.addEventListener("popstate",u),e.addEventListener("hashchange",c),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",u),e.removeEventListener("hashchange",c)}}function Qt(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function Je(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function Xe(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function Qe(e,t){e.dispatchEvent(new CustomEvent(Te,{detail:t}))}function Zt(e,t){e.dispatchEvent(new CustomEvent(ke,{detail:t}))}function Lt(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function en(e,t){return e.routeId===t}function Ne(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Ze(e){let t=Ne(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function tn(e){let t=Ne(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Ze(t)?"Site edit bridge disconnected":t}function Y(e){let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/authentication|auth failed|auth rejected|bridge key|session|unauthorized|forbidden|expired/i.test(t)}function Le(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function Ae(e){return Bt.has(tt(e))}function nn(e){return Mt.has(tt(e))}function et(e){return e.operationSummary?{canUpdateText:e.operationSummary.canUpdateText,canInsertChild:e.operationSummary.canInsertChild,canMove:e.operationSummary.canMove,canRemove:e.operationSummary.canRemove}:e.fallbackMode!=="preview"?{canUpdateText:!1,canInsertChild:!1,canMove:!1,canRemove:!1}:{canUpdateText:nn(e.tagName),canInsertChild:Ae(e.tagName),canMove:!1,canRemove:!1}}function tt(e){return e?.trim().toLowerCase()??""}function $e(e,t){return e.key!==t.key||e.instanceIndex!==t.instanceIndex||e.instanceCount!==t.instanceCount?!1:typeof e.textSegmentIndex=="number"&&typeof t.textSegmentIndex=="number"?e.textSegmentIndex===t.textSegmentIndex:!0}function rn(e,t,n){let r=$(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=on(r,t.ref.textSegmentIndex);return i?(i.nodeValue=t.initialText,!0):!1}return typeof t.initialHtml=="string"?(r.innerHTML=t.initialHtml,!0):(r.textContent=t.initialText,!0)}function on(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function sn(e,t,n,r,i){let o=pe(e,t,n,r),s=nt(o);if(!s)return null;let u=s.getAttribute("data-vcp-edit-key")??"",c=q(e,s,r),a=i?.(c.key)??i?.(u);if(!et({operationSummary:a?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let m=un(e,t,n,s);if(m){let _=an(s,m);if(_!==null)return{element:s,textNode:m,textSegmentIndex:_}}return me(s)?null:{element:s}}function un(e,t,n,r){let i=cn(e,t,n);return!i||i.parentElement!==r?null:i}function cn(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(de(o))return o;let u=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return de(u)?u:null}function an(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function de(e){return e?.nodeType===3}function pe(e,t,n,r=null){let i=typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean);for(let o of i){let s=nt(o),u=s?.getAttribute("data-vcp-edit-key")??"";if(s&&hn(s,r,u))return s}return null}function nt(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Pe(t))return n??t;!ln(r)&&!n&&(n=t)}t=t.parentElement}return n}function Pe(e){return e.getAttribute(Ft)!==null}function ln(e){return dn(e.split("::")[0]??"")}function dn(e){if(!e)return!1;let t=pn(e);return t===ue||t.startsWith(`${ue}/`)||t.includes(`/${ue}/`)||t.endsWith(`/${ue}`)}function pn(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let i of n.split("/"))if(!(!i||i===".")){if(i===".."){r.pop();continue}r.push(i)}return r.join("/")}function q(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(r)}"]`))),n,r);if(i.length<=1)return{key:we(n,r,0)};let o=i.indexOf(t);return o>=0?{key:we(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function ze(e,t,n){return q(e,t,n)}function $(e,t,n){let r=fe(t.key)??t.key,i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(r)}"]`))),n,t.key);if(i.length===0)return null;let o=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<i.length?t.instanceIndex:null,s=(fe(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let u=fn(n,t.key);return u!==null&&u>=0&&u<i.length?i[u]??null:o!==null?i[o]??null:i[0]??null}function we(e,t,n){return rt(e,t)[n]?.key??t}function fn(e,t){let n=fe(t);if(!n)return null;let i=rt(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function rt(e,t){return(e?.entries??[]).filter(n=>(fe(n.key)??n.key)===t)}function ot(e,t,n){let r=it(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function hn(e,t,n){let r=it(t,n);return!r||e.tagName.toLowerCase()===r}function it(e,t){return null}var mn=2,gn=4;function st(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&gn)!==0?-1:(r&mn)!==0?1:0})}function fe(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(We);if(n<0)break;let r=Number(t.slice(n+We.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function yn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=i=>{let o=Number.parseFloat(i??"");return Number.isFinite(o)&&o>0?o:0};return{marginTop:r(n?.marginTop),marginRight:r(n?.marginRight),marginBottom:r(n?.marginBottom),marginLeft:r(n?.marginLeft),paddingTop:r(n?.paddingTop),paddingRight:r(n?.paddingRight),paddingBottom:r(n?.paddingBottom),paddingLeft:r(n?.paddingLeft),borderTopWidth:r(n?.borderTopWidth),borderRightWidth:r(n?.borderRightWidth),borderBottomWidth:r(n?.borderBottomWidth),borderLeftWidth:r(n?.borderLeftWidth),columnGap:r(n?.columnGap),rowGap:r(n?.rowGap)}}function bn(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>vn(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}function F(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),u=he(e),c=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([E,R])=>[E,R??""])),attributes:Object.fromEntries(e.getAttributeNames().map(E=>[E,e.getAttribute(E)??""]))}:{},a=et({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),h=Pe(e),m=!0,_=ct(e)?.getAttribute("data-vcp-edit-key")??null;return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},..._?{parentKey:_}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...c,runtimeFlags:{selectable:!0,movable:a.canMove,removable:a.canRemove,textEditable:a.canUpdateText,container:h?!1:!!me(e)||a.canInsertChild||m&&Ae(s)},layout:u,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childRects:bn(e),spacing:yn(e)}}function Sn(e,t,n,r,i,o){let s=t,u=F(s,n,i,"summary"),c=null,a=()=>{c===null&&(c=Je(e,h))},h=()=>{c=null;let N=$(e.document,n,r?.()??null);if(!N)return;N!==s&&(_?.unobserve(s),s=N,_?.observe(s));let T=F(s,n,i,"summary");T.rect.width<=0||T.rect.height<=0||En(u,T)&&(u=T,o(T))},m=e.ResizeObserver,_=typeof m=="function"?new m(a):null;_?.observe(s);let E=e.MutationObserver,R=typeof E=="function"?new E(a):null;R?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",a,{passive:!0});let C=e.visualViewport;return C?.addEventListener?.("resize",a,{passive:!0}),e.document.addEventListener("load",a,!0),()=>{c!==null&&(Xe(e,c),c=null),_?.disconnect(),R?.disconnect(),e.removeEventListener("resize",a),C?.removeEventListener?.("resize",a),e.document.removeEventListener("load",a,!0)}}function En(e,t){return ut(e.rect,t.rect)||In(e.childRects,t.childRects)||Ge(e.spacing,t.spacing)||Ge(e.layout,t.layout)}function In(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>ut(i,r[o]??i))}function Ge(e,t){let n=e??{},r=t??{},i=new Set([...Object.keys(n),...Object.keys(r)]);return Array.from(i).some(o=>n[o]!==r[o])}function vn(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function ut(e,t){return Math.abs(e.top-t.top)>.5||Math.abs(e.left-t.left)>.5||Math.abs(e.width-t.width)>.5||Math.abs(e.height-t.height)>.5}function Cn(e,t,n,r,i,o,s){let u=e.document,c=pe(u,t,n,o);if(!c)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let a=i?$(u,i,o):null;if(a&&De(c,a))return ce(u,c,"self-or-descendant",o,s);if(r==="move"&&a){let C=Tn(u,c,a,o,s);if(C){let N=_e(C.child,C.targetParent,t,n,"nearest");if(N)return ae(u,C.child,C.targetParent,N,o,s)}}let h=null,m=!1,_=c,E=c.parentElement;for(;E;){if(E.getAttribute("data-vcp-edit-key")){if(a&&De(E,a))return ce(u,c,"self-or-descendant",o,s);let C=He(E,r,s);if(C==="accept"){h={child:_,targetParent:E};break}C==="blocked"&&(m=!0),_=E}E=E.parentElement}let R=He(c,r,s);if(R==="accept"){if(h){let C=_e(h.child,h.targetParent,t,n,"edge");if(C)return ae(u,h.child,h.targetParent,C,o,s)}return ae(u,c,c,xn(c,t,n),o,s)}if(h){let C=_e(h.child,h.targetParent,t,n,"nearest");return ae(u,h.child,h.targetParent,C??"after",o,s)}return R==="blocked"||m?ce(u,c,"operation-boundary-blocked",o,s):ce(u,c,"no-accepting-parent",o,s)}function ce(e,t,n,r,i){return{anchorHit:F(t,q(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function ae(e,t,n,r,i,o){let s=F(t,q(e,t,i),o,"summary"),u=F(n,q(e,n,i),o,"summary"),c=he(n).indicatorOrientation,a=r==="append"||r==="prepend"?_n(n.getBoundingClientRect(),c,r):Rn(t.getBoundingClientRect(),c,r);return{anchorHit:s,targetParentHit:u,relation:r,indicatorOrientation:c,indicatorBounds:a}}function He(e,t,n){if(Pe(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":me(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return Ae(o)?"accept":"not-container"}function _e(e,t,n,r,i){let o=he(t).indicatorOrientation,s=e.getBoundingClientRect(),u=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&u>=.25&&u<=.75?null:u<.5?"before":"after"}function xn(e,t,n){let r=he(e).indicatorOrientation,i=e.getBoundingClientRect();return(r==="vertical"?i.width>0?(t-i.left)/i.width:.5:i.height>0?(n-i.top)/i.height:.5)<.5?"prepend":"append"}function he(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=n?.display??"",i=n?.flexDirection,o=n?.gridAutoFlow,s="horizontal";return r==="flex"||r==="inline-flex"?s=(i??"row").startsWith("row")?"vertical":"horizontal":(r==="grid"||r==="inline-grid")&&(s=(o??"row").includes("column")?"vertical":"horizontal"),{display:r,...i?{flexDirection:i}:{},...o?{gridAutoFlow:o}:{},indicatorOrientation:s}}function _n(e,t,n){if(t==="vertical")return{left:n==="prepend"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="prepend"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function Rn(e,t,n){if(t==="vertical")return{left:n==="before"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="before"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function De(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function Tn(e,t,n,r,i){let o=kn(e,t,n,r,i);if(o)return o;let s=ct(n);if(!s||t===s)return null;let u=t,c=t.getAttribute("data-vcp-edit-key")?t:null;for(;u&&u!==s;)u.getAttribute("data-vcp-edit-key")&&(c=u),u=u.parentElement;return u!==s||!c||c===s||c===n||De(c,n)?null:{child:c,targetParent:s}}function kn(e,t,n,r,i){return null}function ct(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function me(e){for(let t of Array.from(e.childNodes)){if(typeof t.getAttribute!="function")continue;let n=t;if(n.getAttribute("data-vcp-edit-key"))return n;let r=me(n);if(r)return r}return null}function le(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:O(e.scrollX),scrollY:O(e.scrollY),scrollWidth:Math.max(O(t?.scrollWidth),O(n?.scrollWidth),O(e.innerWidth)),scrollHeight:Math.max(O(t?.scrollHeight),O(n?.scrollHeight),O(e.innerHeight)),viewportWidth:O(e.innerWidth),viewportHeight:O(e.innerHeight)}}function Dn(e,t){Object.entries(t.attributes??{}).forEach(([r,i])=>{if(i===null){e.removeAttribute(r);return}e.setAttribute(r,i)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,i])=>{if(n.has(r))return;let o=e.style,s=r.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`);if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i))}),t.styleDeclarations?.forEach(r=>{let i=e.style,o=r.property.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var Nn=500,te=new Map;function An(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Pn(e,t){if(te.size>=Nn){let n=te.keys().next().value;n&&te.delete(n)}te.set(e,t)}var ne=new Set;function Fn(e,t){let n=e.documentElement?.style,r=new Set;for(let[i,o]of Object.entries(t.variables??{}))i.startsWith("--")&&(r.add(i),n?.setProperty(i,o));for(let i of ne)r.has(i)||n?.removeProperty(i);ne.clear();for(let i of r)ne.add(i);Kn(e,t.stylesheets??[])}function Bn(e){let t=e.documentElement?.style;for(let n of ne)t?.removeProperty(n);ne.clear();for(let n of dt(e))n.remove()}function Mn(e,t){let n=Array.from(new Set(t.filter(s=>typeof s=="string"&&s.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,i=r?e.defaultView?.getComputedStyle(r):null,o={};for(let s of n){let u=at(i,s);u&&(o[s]=u)}return o}function at(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return lt(e,r,n)}function lt(e,t,n){if(!t)return null;let r=On(t);if(!r)return t;let i=at(e,r.name,n);return i||(r.fallback?lt(e,r.fallback,n)??r.fallback:null)}function On(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=qn(n),i=r>=0?n.slice(0,r).trim():n;if(!i.startsWith("--"))return null;let o=r>=0?n.slice(r+1).trim():null;return{name:i,fallback:o||null}}function qn(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="("){t+=1;continue}if(r===")"){t=Math.max(0,t-1);continue}if(r===","&&t===0)return n}return-1}function Kn(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of dt(e)){let s=o.getAttribute("href")??"";if(!n.has(s)||r.has(s)){o.remove();continue}r.set(s,o)}let i=e.head;if(i)for(let o of n){if(r.has(o))continue;let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute(Ye,"true"),s.setAttribute("href",o),i.appendChild(s)}}function dt(e){return Array.from(e.querySelectorAll(`link[${Ye}]`))}function Vn(e,t,n,r,i={}){let o=i.textNode?Un(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,u=s.textContent??"",c=o?void 0:t.innerHTML,a=Wn(s),h=!1,m=()=>{e.document.removeEventListener("pointerdown",E,!0),s.removeEventListener("keydown",R),s.removeEventListener("blur",C),s.removeEventListener("input",N),$n(s,a)},_=T=>{if(h)return;h=!0;let A=s.textContent??"";if(m(),T==="cancel"){o?.restore(u),o||(t.textContent=u),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(A),T==="commit"&&A!==u){i.onCommitSnapshot?.({ref:n,initialText:u,...c!==void 0?{initialHtml:c}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:A}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function E(T){let A=T.target;A&&s.contains(A)||_("commit")}function R(T){if(T.key==="Escape"){T.preventDefault(),_("cancel");return}T.key==="Enter"&&(T.metaKey||T.ctrlKey)&&(T.preventDefault(),_("commit"))}function C(){_("commit")}function N(){r({kind:"text-edit-input",payload:{ref:n,hit:F(t,n,void 0,"full")}})}return jn(s),e.document.addEventListener("pointerdown",E,!0),s.addEventListener("keydown",R),s.addEventListener("blur",C),s.addEventListener("input",N),Gn(s),Hn(s,e.document),m}function Un(e,t){let n=t.parentNode;if(!n)return null;let r=e.createElement("span");return r.setAttribute("data-vcp-text-segment-editor","true"),r.textContent=t.textContent??"",n.replaceChild(r,t),{element:r,restore(i){t.nodeValue=i,r.parentNode&&r.parentNode.replaceChild(t,r)}}}function Wn(e){return{contentEditable:e.getAttribute("contenteditable"),spellcheck:e.getAttribute("spellcheck"),marker:e.getAttribute("data-vcp-edit-text-editing"),cursor:e.style.cursor,userSelect:e.style.userSelect}}function jn(e){zn(e.ownerDocument),e.setAttribute("contenteditable","plaintext-only"),e.setAttribute("spellcheck","false"),e.setAttribute("data-vcp-edit-text-editing","true"),e.style.cursor="text",e.style.userSelect="text"}function $n(e,t){Re(e,"contenteditable",t.contentEditable),Re(e,"spellcheck",t.spellcheck),Re(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function zn(e){if(e.getElementById("vcp-text-edit-base-style"))return;let t=e.createElement("style");t.id="vcp-text-edit-base-style",t.textContent='[data-vcp-edit-text-editing="true"]{outline:0!important;outline-offset:0!important;}',e.head.appendChild(t)}function Re(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function wn(e){let t=[e.documentElement,e.body].filter(r=>!!r?.style),n=t.map(r=>({element:r,userSelect:r.style.userSelect}));for(let r of t)r.style.userSelect="none";return()=>{for(let r of n)r.element.style.userSelect=r.userSelect}}function Gn(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Hn(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function pt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function O(e){let t=Number(e);return Number.isFinite(t)?t:0}export{ke as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,Te as VCP_SITE_EDIT_ROUTE_READY_EVENT,Ot as resolveSiteEditRouteId,Kt as resolveSiteEditWebSocketUrl,sr as startSiteEditAutoBootstrap,wt as startSiteEditFrameRuntime};
package/dist/client.d.ts CHANGED
@@ -39,9 +39,9 @@ export type SiteEditBridgeClient = {
39
39
  path: string;
40
40
  }): Promise<SiteEditCommandSuccess<SiteEditSourceFileResponse>>;
41
41
  resolveSourceLocation(input: SiteEditResolveSourceLocationInput): Promise<SiteEditCommandSuccess<SiteEditSourceLocation>>;
42
- execute(request: SiteEditOperationRequest, mutationContext: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
43
- undo(mutationContext: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
44
- redo(mutationContext: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
42
+ execute(request: SiteEditOperationRequest, mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
43
+ undo(mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
44
+ redo(mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
45
45
  subscribe(listener: (event: SiteEditEvent) => void): () => void;
46
46
  };
47
47
  export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
@@ -232,9 +232,9 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
232
232
  routeId?: string | undefined;
233
233
  textPreview?: string | undefined;
234
234
  }>>;
235
- execute(request: SiteEditOperationRequest, mutationContext: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
236
- undo(mutationContext: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
237
- redo(mutationContext: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
235
+ execute(request: SiteEditOperationRequest, _mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
236
+ undo(_mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
237
+ redo(_mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
238
238
  subscribe(listener: (event: SiteEditEvent) => void): () => void;
239
239
  private request;
240
240
  private handleAuthHandshakeMessage;
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- function f(n){if(!q(n))return n;let e=new Map,t=n.pageComposition.status==="supported"?n.pageComposition.placementUnitKeys:[],s=r=>{let i=e.get(r);if(i)return i;let a=n.nodes[r];if(!a)throw new Error(`Missing compact document node ${r}`);let[o,c]=a,l=n.tokens[c];if(typeof l!="string")throw new Error(`Missing compact document token ${c}`);let d=`${o===null?"":s(o)}${l}`;return e.set(r,d),d};return{siteId:n.siteId,snapshotId:n.snapshotId,routeId:n.routeId,version:n.version,pageComposition:n.pageComposition,entries:n.entries.map(r=>{let[i,a,o]=r,c=o===void 0?void 0:t[o];if(o!==void 0&&!c)throw new Error(`Missing page composition unit ${o}`);return{key:s(i),...c?{pageCompositionUnitKey:c}:{},operationSummary:E(a)}})}}function E(n){return{canUpdateText:(n&1)!==0,canInsertChild:(n&2)!==0,canMove:(n&4)!==0,canRemove:(n&8)!==0}}function q(n){return typeof n=="object"&&n!==null&&"encoding"in n&&n.encoding==="segment-trie-v1"}var p=class n{constructor(){}static parseMessage(e,t={}){let s=JSON.parse(e);if(!n.isMessage(s,t))throw new Error("Invalid site edit bridge message");return s}static stringifyMessage(e){return JSON.stringify(e)}static extractRequestInfo(e){if(typeof e=="object"&&e!==null&&"payload"in e&&typeof e.payload=="object"&&e.payload!==null){let t=e.payload,s=typeof t.id=="string"?t.id:"unknown",r=n.isRequestKind(t.kind)?t.kind:"get-document";return{id:s,kind:r}}return{id:"unknown",kind:"get-document"}}static isRequestKind(e){return e==="initialize-session"||e==="get-document"||e==="get-history-status"||e==="get-style-context"||e==="get-object-edit-context"||e==="get-class-name-source"||e==="get-source-tree"||e==="get-source-file"||e==="resolve-source-location"||e==="execute"||e==="undo"||e==="redo"}static isMessage(e,t={}){return!u(e)||typeof e.type!="string"?!1:e.type==="request"?n.isRequestPayload(e.payload,t):e.type==="response"||e.type==="error"?u(e.payload)&&typeof e.payload.id=="string":e.type==="event"?u(e.payload)&&u(e.payload.event):e.type==="auth"?u(e.payload)&&typeof e.payload.key=="string":e.type==="auth-ok"?u(e.payload)&&e.payload.ok===!0:!1}static isRequestPayload(e,t={}){if(!u(e)||typeof e.id!="string"||!n.isRequestKind(e.kind))return!1;switch(e.kind){case"initialize-session":return typeof e.routeId=="string"&&(e.mutationContext===void 0||m(e.mutationContext));case"get-document":case"get-style-context":return typeof e.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&(e.routeId===void 0||typeof e.routeId=="string");case"get-history-status":return e.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof e.path=="string";case"execute":return D(e.request)&&m(e.request.mutationContext)&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return m(e.mutationContext)}}};function u(n){return typeof n=="object"&&n!==null}function D(n){return u(n)&&typeof n.id=="string"&&typeof n.siteId=="string"&&typeof n.baseSnapshotId=="string"&&(n.routeId===void 0||typeof n.routeId=="string")&&typeof n.kind=="string"&&u(n.target)&&typeof n.documentVersion=="number"&&Number.isInteger(n.documentVersion)&&n.documentVersion>=0&&u(n.params)}function m(n){return R(n)}function R(n){return u(n)?typeof n.editingSessionId=="string"&&n.editingSessionId.length>0&&typeof n.lockId=="string"&&n.lockId.length>0&&typeof n.ownerId=="string"&&n.ownerId.length>0&&typeof n.leaseAssertion=="string"&&n.leaseAssertion.length>0:!1}var M="vcp:designer:trace",T="designer_trace",C="__VCP_DESIGNER_TRACE__";var _=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function F(n=globalThis){let e=n;try{if(e.localStorage?.getItem(M)==="1")return!0}catch{}try{let t=e.location?.search??"";return new URLSearchParams(t).get(T)==="1"}catch{return!1}}function h(n,e={},t=globalThis){if(!F(t))return;let s={type:n,timestamp:Date.now(),payload:K(e)},r=t,i=r[C]??[];i.push(s),i.length>200&&i.splice(0,i.length-200),r[C]=i;let a=t.console?.debug;typeof a=="function"&&a.call(t.console,"[designer-trace]",s)}function K(n){return y(n,0)}function y(n,e){if(e>4)return"[truncated]";if(Array.isArray(n))return n.map(s=>y(s,e+1));if(!n||typeof n!="object")return n;let t={};for(let[s,r]of Object.entries(n)){if(_.test(s)){t[s]="[redacted]";continue}t[s]=y(r,e+1)}return t}var x=class{constructor(e){this.options=e,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===I&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((e,t)=>{let s;try{s=this.createSocket(this.options.url)}catch(o){let c=g(o,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),t(c);return}let r={socket:s,settled:!1,reject:t};this.connectAttempt=r,this.socket=s;let i=()=>{this.socket!==s||this.connectAttempt!==r||(r.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),e())},a=(o,c)=>{this.cleanupSocket(s,o,c)};s.onopen=()=>{if(!(this.socket!==s||this.connectAttempt!==r)){if(this.options.authKey){try{s.send(p.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(o){a(g(o,"WebSocket auth failed"),"failed")}return}i()}},s.onerror=o=>{if(this.socket!==s)return;let c=g(o,"WebSocket failed");a(c,"failed")},s.onmessage=o=>{if(this.socket===s){if(this.options.authKey&&this.connectAttempt===r&&!r.settled){this.handleAuthHandshakeMessage(o.data,s,r,()=>{i()});return}this.handleMessage(o.data)}},s.onclose=o=>{if(this.socket!==s)return;let c=this.intentionalClose,l=new Error(U(o,{intentional:c}));a(l,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let e=this.socket;if(!e){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(e,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(e){return this.connectionStatusListeners.add(e),e({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(e)}}getDocument(e){return this.request("get-document",{routeId:e})}initializeSession(e){return this.request("initialize-session",e)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(e){return this.request("get-style-context",{routeId:e})}getObjectEditContext(e,t){return this.request("get-object-edit-context",{key:e,routeId:t})}getClassNameSource(e,t){return this.request("get-class-name-source",{key:e,routeId:t})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(e){return this.request("get-source-file",e)}resolveSourceLocation(e){return this.request("resolve-source-location",e)}execute(e,t){return this.request("execute",{request:{...e,mutationContext:t}})}undo(e){return this.request("undo",{mutationContext:e})}redo(e){return this.request("redo",{mutationContext:e})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}request(e,t){let s=this.socket;if(!s||s.readyState!==I||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${s?.readyState??"none"})`));let r=`${e}-${this.sequence+=1}`,i=P(r,e,t);return h("bridge.request",{id:r,kind:e,routeId:typeof t.routeId=="string"?t.routeId:null,key:typeof t.key=="string"?t.key:null,operationKind:k(t.request,"kind"),documentVersion:k(t.request,"documentVersion")}),new Promise((a,o)=>{let c=this.resolveRequestTimeoutMs(e),l=c>0?setTimeout(()=>{let d=this.pending.get(r);d&&(this.pending.delete(r),h("bridge.response",{id:r,kind:e,ok:!1,timedOut:!0}),d.reject(new Error(`Bridge request timed out after ${c}ms: ${e}`)))},c):null;l?.unref?.(),this.pending.set(r,{kind:e,timeout:l,resolve:d=>a(d),reject:o});try{s.send(p.stringifyMessage(i))}catch(d){let b=g(d,"WebSocket send failed");this.clearPendingRequest(r),o(b),this.cleanupSocket(s,b,"failed")}})}handleAuthHandshakeMessage(e,t,s,r){try{if(p.parseMessage(e).type==="auth-ok"){r();return}throw new Error("Bridge authentication failed")}catch(i){let a=g(i,"Bridge authentication failed");this.connectAttempt===s&&this.cleanupSocket(t,a,"failed")}}handleMessage(e){let t=p.parseMessage(e);if(t.type==="event"){for(let r of this.listeners)r(t.payload.event);return}if(t.type!=="response"&&t.type!=="error")return;let s=this.pending.get(t.payload.id);if(s){if(this.clearPendingRequest(t.payload.id),t.type==="error"){h("bridge.response",{id:t.payload.id,kind:s.kind,ok:!1}),s.reject(new Error(t.payload.message));return}h("bridge.response",{id:t.payload.id,kind:s.kind,ok:!0,resultVersion:$(t.payload.result)}),s.resolve(s.kind==="get-document"?{...t.payload.result,data:f(t.payload.result.data)}:s.kind==="initialize-session"?N(t.payload.result):t.payload.result)}}rejectAll(e){for(let[t,s]of[...this.pending])this.clearPendingRequest(t),s.reject(e)}clearPendingRequest(e){let t=this.pending.get(e);t&&(t.timeout&&clearTimeout(t.timeout),this.pending.delete(e))}resolveRequestTimeoutMs(e){let t=this.options.requestTimeoutMsByKind?.[e];return typeof t=="number"?Math.max(0,t):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):O[e]??A}cleanupSocket(e,t,s){if(this.socket===e&&(this.socket=null),this.connectAttempt?.socket===e){let r=this.connectAttempt;this.connectAttempt=null,r.settled||(r.settled=!0,r.reject(t))}this.connectPromise=null,this.rejectAll(t),this.setConnectionState(s,t.message),e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null;try{(e.readyState===j||e.readyState===I)&&e.close()}catch{}}setConnectionState(e,t){if(this.connectionState===e&&!t)return;this.connectionState=e;let s={state:e,...t?{message:t}:{}};this.options.onConnectionStatus?.(s);for(let r of this.connectionStatusListeners)r(s)}createSocket(e){if(this.options.createSocket)return this.options.createSocket(e);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(e)}},j=0,I=1,A=15e3,O={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function g(n,e){return n instanceof Error?n:new Error(e)}function U(n,e){return e.intentional?"WebSocket disconnected":n?.code===1008?n.reason?`Bridge session authentication failed: ${n.reason}`:"Bridge session authentication failed":n?.reason?`WebSocket closed: ${n.reason}`:typeof n?.code=="number"&&n.code!==1005?`WebSocket closed with code ${n.code}`:"WebSocket closed"}function k(n,e){if(!n||typeof n!="object")return null;let s=n[e];return typeof s=="string"||typeof s=="number"?s:null}function $(n){if(!n||typeof n!="object")return null;let e=n,t=e.data?.resultVersion??e.data?.version??null;return typeof t=="number"?t:null}function H(n){return new S(n)}var S=class{constructor(e){this.params=e,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=e.initialDocument,this.observedDocumentVersion=e.initialDocument.version,this.sessionInitialized=!w(e.initialDocument)}async getDocument(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=w(this.currentDocument);return(t||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(t?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(e){if(e.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let t=await this.params.client.initializeSession(e);return this.currentDocument=t.data.document,this.observedDocumentVersion=t.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),t}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=this.styleContextCache;if(t?.generation===this.styleGeneration)return{ok:!0,data:t.value};let s=this.styleContextInFlight;if(s?.generation===this.styleGeneration)return s.request;let r=this.styleGeneration,i=this.params.client.getStyleContext(e).then(a=>(this.styleGeneration===r&&(this.styleContextCache={generation:r,value:a.data}),a)).finally(()=>{this.styleContextInFlight?.request===i&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:r,request:i},i}async ensureDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let s=await this.refreshSnapshot(t,"ensure-version");if(s.version<t)throw new Error(`Document refresh returned version ${s.version}, expected at least ${t}`);return{ok:!0,data:s}}async acknowledgeDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);return t>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:t},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t),{ok:!0,data:this.currentDocument}}async getObjectEditContext(e,t){let s=this.objectCacheKey(e,t),r=this.editContextCache.get(s);if(r)return{ok:!0,data:r};let i=this.editContextInFlight.get(s);if(i)return i;let a=this.objectGeneration,o=this.params.client.getObjectEditContext(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.editContextCache.set(s,c.data),c)).finally(()=>{this.editContextInFlight.get(s)===o&&this.editContextInFlight.delete(s)});return this.editContextInFlight.set(s,o),o}async getClassNameSource(e,t){let s=this.objectCacheKey(e,t),r=this.classNameSourceCache.get(s);if(r)return r;let i=this.classNameSourceInFlight.get(s);if(i)return i;let a=this.objectGeneration,o=this.params.client.getClassNameSource(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.classNameSourceCache.set(s,c),c)).finally(()=>{this.classNameSourceInFlight.get(s)===o&&this.classNameSourceInFlight.delete(s)});return this.classNameSourceInFlight.set(s,o),o}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(e){return this.params.client.getSourceFile(e)}async resolveSourceLocation(e){return this.params.client.resolveSourceLocation({...e,routeId:e.routeId??this.params.routeId})}async execute(e,t){let s=e.target.kind==="node"&&!e.routeId?{...e,routeId:this.params.routeId}:e;return this.params.client.execute({...s,mutationContext:t},t)}async undo(e){return this.params.client.undo(e)}async redo(e){return this.params.client.redo(e)}subscribe(e){return this.params.client.subscribe(t=>{if(t.type==="site-edit.document.changed"&&t.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t.version),t.version>this.currentDocument.version&&this.clearObjectCaches(),e(t);return}e(t)})}async refreshSnapshot(e,t="ensure-version"){if(typeof e=="number"&&this.currentDocument.version>=e)return h("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:t}),this.currentDocument;if(this.refreshInFlight){h("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,source:t});let r=await this.refreshInFlight;if(typeof e!="number"||r.version>=e||this.currentDocument.version>=e)return this.currentDocument}h("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!1,source:t});let s=this.params.client.getDocument(this.params.routeId).then(r=>(this.currentDocument=r.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,r.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=s;try{return await s}finally{this.refreshInFlight===s&&(this.refreshInFlight=null)}}clearObjectCaches(e){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!e?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(e,t){return`${t??this.params.routeId}\0${e}`}};function w(n){return n.version===0&&n.entries.length===0}function N(n){let e=n;return{...e,data:{...e.data,document:f(e.data.document)}}}function P(n,e,t){switch(e){case"initialize-session":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId),...t.mutationContext?{mutationContext:t.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-history-status":return{type:"request",payload:{id:n,kind:e}};case"get-style-context":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:n,kind:e}};case"get-source-file":return{type:"request",payload:{id:n,kind:e,path:String(t.path)}};case"resolve-source-location":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"execute":return{type:"request",payload:{id:n,kind:e,request:t.request}};case"undo":case"redo":return{type:"request",payload:{id:n,kind:e,mutationContext:t.mutationContext}}}}export{x as SiteEditWebSocketClient,H as createSiteEditBridge};
1
+ function f(n){if(!q(n))return n;let e=new Map,t=n.pageComposition.status==="supported"?n.pageComposition.placementUnitKeys:[],s=r=>{let i=e.get(r);if(i)return i;let a=n.nodes[r];if(!a)throw new Error(`Missing compact document node ${r}`);let[o,c]=a,l=n.tokens[c];if(typeof l!="string")throw new Error(`Missing compact document token ${c}`);let d=`${o===null?"":s(o)}${l}`;return e.set(r,d),d};return{siteId:n.siteId,snapshotId:n.snapshotId,routeId:n.routeId,version:n.version,pageComposition:n.pageComposition,entries:n.entries.map(r=>{let[i,a,o]=r,c=o===void 0?void 0:t[o];if(o!==void 0&&!c)throw new Error(`Missing page composition unit ${o}`);return{key:s(i),...c?{pageCompositionUnitKey:c}:{},operationSummary:E(a)}})}}function E(n){return{canUpdateText:(n&1)!==0,canInsertChild:(n&2)!==0,canMove:(n&4)!==0,canRemove:(n&8)!==0}}function q(n){return typeof n=="object"&&n!==null&&"encoding"in n&&n.encoding==="segment-trie-v1"}var p=class n{constructor(){}static parseMessage(e,t={}){let s=JSON.parse(e);if(!n.isMessage(s,t))throw new Error("Invalid site edit bridge message");return s}static stringifyMessage(e){return JSON.stringify(e)}static extractRequestInfo(e){if(typeof e=="object"&&e!==null&&"payload"in e&&typeof e.payload=="object"&&e.payload!==null){let t=e.payload,s=typeof t.id=="string"?t.id:"unknown",r=n.isRequestKind(t.kind)?t.kind:"get-document";return{id:s,kind:r}}return{id:"unknown",kind:"get-document"}}static isRequestKind(e){return e==="initialize-session"||e==="get-document"||e==="get-history-status"||e==="get-style-context"||e==="get-object-edit-context"||e==="get-class-name-source"||e==="get-source-tree"||e==="get-source-file"||e==="resolve-source-location"||e==="execute"||e==="undo"||e==="redo"}static isMessage(e,t={}){return!u(e)||typeof e.type!="string"?!1:e.type==="request"?n.isRequestPayload(e.payload,t):e.type==="response"||e.type==="error"?u(e.payload)&&typeof e.payload.id=="string":e.type==="event"?u(e.payload)&&u(e.payload.event):e.type==="auth"?u(e.payload)&&typeof e.payload.key=="string":e.type==="auth-ok"?u(e.payload)&&e.payload.ok===!0:!1}static isRequestPayload(e,t={}){if(!u(e)||typeof e.id!="string"||!n.isRequestKind(e.kind))return!1;switch(e.kind){case"initialize-session":return typeof e.routeId=="string"&&(e.mutationContext===void 0||m(e.mutationContext));case"get-document":case"get-style-context":return typeof e.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&(e.routeId===void 0||typeof e.routeId=="string");case"get-history-status":return e.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof e.path=="string";case"execute":return D(e.request)&&(e.request.mutationContext===void 0||m(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return e.mutationContext===void 0||m(e.mutationContext)}}};function u(n){return typeof n=="object"&&n!==null}function D(n){return u(n)&&typeof n.id=="string"&&typeof n.siteId=="string"&&typeof n.baseSnapshotId=="string"&&(n.routeId===void 0||typeof n.routeId=="string")&&typeof n.kind=="string"&&u(n.target)&&typeof n.documentVersion=="number"&&Number.isInteger(n.documentVersion)&&n.documentVersion>=0&&u(n.params)}function m(n){return R(n)}function R(n){return u(n)?typeof n.editingSessionId=="string"&&n.editingSessionId.length>0&&typeof n.lockId=="string"&&n.lockId.length>0&&typeof n.ownerId=="string"&&n.ownerId.length>0&&typeof n.leaseAssertion=="string"&&n.leaseAssertion.length>0:!1}var M="vcp:designer:trace",T="designer_trace",b="__VCP_DESIGNER_TRACE__";var _=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function F(n=globalThis){let e=n;try{if(e.localStorage?.getItem(M)==="1")return!0}catch{}try{let t=e.location?.search??"";return new URLSearchParams(t).get(T)==="1"}catch{return!1}}function h(n,e={},t=globalThis){if(!F(t))return;let s={type:n,timestamp:Date.now(),payload:K(e)},r=t,i=r[b]??[];i.push(s),i.length>200&&i.splice(0,i.length-200),r[b]=i;let a=t.console?.debug;typeof a=="function"&&a.call(t.console,"[designer-trace]",s)}function K(n){return y(n,0)}function y(n,e){if(e>4)return"[truncated]";if(Array.isArray(n))return n.map(s=>y(s,e+1));if(!n||typeof n!="object")return n;let t={};for(let[s,r]of Object.entries(n)){if(_.test(s)){t[s]="[redacted]";continue}t[s]=y(r,e+1)}return t}var x=class{constructor(e){this.options=e,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===I&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((e,t)=>{let s;try{s=this.createSocket(this.options.url)}catch(o){let c=g(o,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),t(c);return}let r={socket:s,settled:!1,reject:t};this.connectAttempt=r,this.socket=s;let i=()=>{this.socket!==s||this.connectAttempt!==r||(r.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),e())},a=(o,c)=>{this.cleanupSocket(s,o,c)};s.onopen=()=>{if(!(this.socket!==s||this.connectAttempt!==r)){if(this.options.authKey){try{s.send(p.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(o){a(g(o,"WebSocket auth failed"),"failed")}return}i()}},s.onerror=o=>{if(this.socket!==s)return;let c=g(o,"WebSocket failed");a(c,"failed")},s.onmessage=o=>{if(this.socket===s){if(this.options.authKey&&this.connectAttempt===r&&!r.settled){this.handleAuthHandshakeMessage(o.data,s,r,()=>{i()});return}this.handleMessage(o.data)}},s.onclose=o=>{if(this.socket!==s)return;let c=this.intentionalClose,l=new Error(U(o,{intentional:c}));a(l,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let e=this.socket;if(!e){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(e,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(e){return this.connectionStatusListeners.add(e),e({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(e)}}getDocument(e){return this.request("get-document",{routeId:e})}initializeSession(e){return this.request("initialize-session",e)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(e){return this.request("get-style-context",{routeId:e})}getObjectEditContext(e,t){return this.request("get-object-edit-context",{key:e,routeId:t})}getClassNameSource(e,t){return this.request("get-class-name-source",{key:e,routeId:t})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(e){return this.request("get-source-file",e)}resolveSourceLocation(e){return this.request("resolve-source-location",e)}execute(e,t){return this.request("execute",{request:e})}undo(e){return this.request("undo",{})}redo(e){return this.request("redo",{})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}request(e,t){let s=this.socket;if(!s||s.readyState!==I||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${s?.readyState??"none"})`));let r=`${e}-${this.sequence+=1}`,i=P(r,e,t);return h("bridge.request",{id:r,kind:e,routeId:typeof t.routeId=="string"?t.routeId:null,key:typeof t.key=="string"?t.key:null,operationKind:k(t.request,"kind"),documentVersion:k(t.request,"documentVersion")}),new Promise((a,o)=>{let c=this.resolveRequestTimeoutMs(e),l=c>0?setTimeout(()=>{let d=this.pending.get(r);d&&(this.pending.delete(r),h("bridge.response",{id:r,kind:e,ok:!1,timedOut:!0}),d.reject(new Error(`Bridge request timed out after ${c}ms: ${e}`)))},c):null;l?.unref?.(),this.pending.set(r,{kind:e,timeout:l,resolve:d=>a(d),reject:o});try{s.send(p.stringifyMessage(i))}catch(d){let C=g(d,"WebSocket send failed");this.clearPendingRequest(r),o(C),this.cleanupSocket(s,C,"failed")}})}handleAuthHandshakeMessage(e,t,s,r){try{if(p.parseMessage(e).type==="auth-ok"){r();return}throw new Error("Bridge authentication failed")}catch(i){let a=g(i,"Bridge authentication failed");this.connectAttempt===s&&this.cleanupSocket(t,a,"failed")}}handleMessage(e){let t=p.parseMessage(e);if(t.type==="event"){for(let r of this.listeners)r(t.payload.event);return}if(t.type!=="response"&&t.type!=="error")return;let s=this.pending.get(t.payload.id);if(s){if(this.clearPendingRequest(t.payload.id),t.type==="error"){h("bridge.response",{id:t.payload.id,kind:s.kind,ok:!1}),s.reject(new Error(t.payload.message));return}h("bridge.response",{id:t.payload.id,kind:s.kind,ok:!0,resultVersion:$(t.payload.result)}),s.resolve(s.kind==="get-document"?{...t.payload.result,data:f(t.payload.result.data)}:s.kind==="initialize-session"?N(t.payload.result):t.payload.result)}}rejectAll(e){for(let[t,s]of[...this.pending])this.clearPendingRequest(t),s.reject(e)}clearPendingRequest(e){let t=this.pending.get(e);t&&(t.timeout&&clearTimeout(t.timeout),this.pending.delete(e))}resolveRequestTimeoutMs(e){let t=this.options.requestTimeoutMsByKind?.[e];return typeof t=="number"?Math.max(0,t):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):O[e]??A}cleanupSocket(e,t,s){if(this.socket===e&&(this.socket=null),this.connectAttempt?.socket===e){let r=this.connectAttempt;this.connectAttempt=null,r.settled||(r.settled=!0,r.reject(t))}this.connectPromise=null,this.rejectAll(t),this.setConnectionState(s,t.message),e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null;try{(e.readyState===j||e.readyState===I)&&e.close()}catch{}}setConnectionState(e,t){if(this.connectionState===e&&!t)return;this.connectionState=e;let s={state:e,...t?{message:t}:{}};this.options.onConnectionStatus?.(s);for(let r of this.connectionStatusListeners)r(s)}createSocket(e){if(this.options.createSocket)return this.options.createSocket(e);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(e)}},j=0,I=1,A=15e3,O={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function g(n,e){return n instanceof Error?n:new Error(e)}function U(n,e){return e.intentional?"WebSocket disconnected":n?.code===1008?n.reason?`Bridge session authentication failed: ${n.reason}`:"Bridge session authentication failed":n?.reason?`WebSocket closed: ${n.reason}`:typeof n?.code=="number"&&n.code!==1005?`WebSocket closed with code ${n.code}`:"WebSocket closed"}function k(n,e){if(!n||typeof n!="object")return null;let s=n[e];return typeof s=="string"||typeof s=="number"?s:null}function $(n){if(!n||typeof n!="object")return null;let e=n,t=e.data?.resultVersion??e.data?.version??null;return typeof t=="number"?t:null}function H(n){return new S(n)}var S=class{constructor(e){this.params=e,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=e.initialDocument,this.observedDocumentVersion=e.initialDocument.version,this.sessionInitialized=!w(e.initialDocument)}async getDocument(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=w(this.currentDocument);return(t||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(t?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(e){if(e.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let t=await this.params.client.initializeSession(e);return this.currentDocument=t.data.document,this.observedDocumentVersion=t.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),t}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=this.styleContextCache;if(t?.generation===this.styleGeneration)return{ok:!0,data:t.value};let s=this.styleContextInFlight;if(s?.generation===this.styleGeneration)return s.request;let r=this.styleGeneration,i=this.params.client.getStyleContext(e).then(a=>(this.styleGeneration===r&&(this.styleContextCache={generation:r,value:a.data}),a)).finally(()=>{this.styleContextInFlight?.request===i&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:r,request:i},i}async ensureDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let s=await this.refreshSnapshot(t,"ensure-version");if(s.version<t)throw new Error(`Document refresh returned version ${s.version}, expected at least ${t}`);return{ok:!0,data:s}}async acknowledgeDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);return t>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:t},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t),{ok:!0,data:this.currentDocument}}async getObjectEditContext(e,t){let s=this.objectCacheKey(e,t),r=this.editContextCache.get(s);if(r)return{ok:!0,data:r};let i=this.editContextInFlight.get(s);if(i)return i;let a=this.objectGeneration,o=this.params.client.getObjectEditContext(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.editContextCache.set(s,c.data),c)).finally(()=>{this.editContextInFlight.get(s)===o&&this.editContextInFlight.delete(s)});return this.editContextInFlight.set(s,o),o}async getClassNameSource(e,t){let s=this.objectCacheKey(e,t),r=this.classNameSourceCache.get(s);if(r)return r;let i=this.classNameSourceInFlight.get(s);if(i)return i;let a=this.objectGeneration,o=this.params.client.getClassNameSource(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.classNameSourceCache.set(s,c),c)).finally(()=>{this.classNameSourceInFlight.get(s)===o&&this.classNameSourceInFlight.delete(s)});return this.classNameSourceInFlight.set(s,o),o}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(e){return this.params.client.getSourceFile(e)}async resolveSourceLocation(e){return this.params.client.resolveSourceLocation({...e,routeId:e.routeId??this.params.routeId})}async execute(e,t){let s=e.target.kind==="node"&&!e.routeId?{...e,routeId:this.params.routeId}:e;return this.params.client.execute(s)}async undo(e){return this.params.client.undo()}async redo(e){return this.params.client.redo()}subscribe(e){return this.params.client.subscribe(t=>{if(t.type==="site-edit.document.changed"&&t.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t.version),t.version>this.currentDocument.version&&this.clearObjectCaches(),e(t);return}e(t)})}async refreshSnapshot(e,t="ensure-version"){if(typeof e=="number"&&this.currentDocument.version>=e)return h("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:t}),this.currentDocument;if(this.refreshInFlight){h("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,source:t});let r=await this.refreshInFlight;if(typeof e!="number"||r.version>=e||this.currentDocument.version>=e)return this.currentDocument}h("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!1,source:t});let s=this.params.client.getDocument(this.params.routeId).then(r=>(this.currentDocument=r.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,r.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=s;try{return await s}finally{this.refreshInFlight===s&&(this.refreshInFlight=null)}}clearObjectCaches(e){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!e?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(e,t){return`${t??this.params.routeId}\0${e}`}};function w(n){return n.version===0&&n.entries.length===0}function N(n){let e=n;return{...e,data:{...e.data,document:f(e.data.document)}}}function P(n,e,t){switch(e){case"initialize-session":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId),...t.mutationContext?{mutationContext:t.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-history-status":return{type:"request",payload:{id:n,kind:e}};case"get-style-context":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:n,kind:e}};case"get-source-file":return{type:"request",payload:{id:n,kind:e,path:String(t.path)}};case"resolve-source-location":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"execute":return{type:"request",payload:{id:n,kind:e,request:t.request}};case"undo":case"redo":return{type:"request",payload:{id:n,kind:e,mutationContext:t.mutationContext}}}}export{x as SiteEditWebSocketClient,H as createSiteEditBridge};