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

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 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};
1
+ function Fe(e){if(!Ft(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(e.dynamicDataSummaries??[]),i=o=>{let s=t.get(o);if(s)return s;let c=e.nodes[o];if(!c)throw new Error(`Missing compact document node ${o}`);let[a,u]=c,m=e.tokens[u];if(typeof m!="string")throw new Error(`Missing compact document token ${u}`);let g=`${a===null?"":i(a)}${m}`;return t.set(o,g),g};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((o,s)=>{let[c,a,u]=o,m=u===void 0?void 0:n[u];if(u!==void 0&&!m)throw new Error(`Missing page composition unit ${u}`);return{key:i(c),...m?{pageCompositionUnitKey:m}:{},operationSummary:Ot(a),...r.get(s)?{dynamicDataSummary:r.get(s)}:{}}})}}function Ot(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function Ft(e){if(typeof e!="object"||e===null)return!1;let t=e;if(t.encoding!=="segment-trie-v1"||typeof t.siteId!="string"||typeof t.snapshotId!="string"||typeof t.routeId!="string"||!Number.isInteger(t.version)||t.version<0||!Xe(t.pageComposition)||!Array.isArray(t.tokens)||!t.tokens.every(i=>typeof i=="string")||!Array.isArray(t.nodes)||!Array.isArray(t.entries))return!1;let n=t.nodes;if(!n.every((i,o)=>Array.isArray(i)&&i.length===2&&(i[0]===null||re(i[0])&&i[0]<o)&&re(i[1])&&i[1]<t.tokens.length)||!t.entries.every(i=>Array.isArray(i)&&(i.length===2||i.length===3)&&re(i[0])&&i[0]<n.length&&re(i[1])&&i[1]<=15&&(i.length===2||re(i[2]))))return!1;let r=t.dynamicDataSummaries;return r===void 0||Array.isArray(r)&&r.every(i=>Array.isArray(i)&&i.length===2&&re(i[0])&&i[0]<t.entries.length&&Xe(i[1]))}function Xe(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function re(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0}var L=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!U(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?U(t.payload)&&typeof t.payload.id=="string":t.type==="event"?U(t.payload)&&U(t.payload.event):t.type==="auth"?U(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?U(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!U(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||Be(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 Bt(t.request)&&(t.request.mutationContext===void 0||Be(t.request.mutationContext))&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return t.mutationContext===void 0||Be(t.mutationContext)}}};function U(e){return typeof e=="object"&&e!==null}function Bt(e){return U(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"&&U(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&U(e.params)}function Be(e){return Mt(e)}function Mt(e){return U(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 qt="vcp:designer:trace",Kt="designer_trace",Je="__VCP_DESIGNER_TRACE__";var Vt=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function Ut(e=globalThis){let t=e;try{if(t.localStorage?.getItem(qt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(Kt)==="1"}catch{return!1}}function J(e,t={},n=globalThis){if(!Ut(n))return;let r={type:e,timestamp:Date.now(),payload:wt(t)},i=n,o=i[Je]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[Je]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function wt(e){return Me(e,0)}function Me(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>Me(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Vt.test(r)){n[r]="[redacted]";continue}n[r]=Me(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===qe&&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(c){let a=le(c,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",a.message),n(a);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=(c,a)=>{this.cleanupSocket(r,c,a)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(L.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(c){s(le(c,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=c=>{if(this.socket!==r)return;let a=le(c,"WebSocket failed");s(a,"failed")},r.onmessage=c=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(c.data,r,i,()=>{o()});return}this.handleMessage(c.data)}},r.onclose=c=>{if(this.socket!==r)return;let a=this.intentionalClose,u=new Error(zt(c,{intentional:a}));s(u,a?"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!==qe||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=Yt(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:Qe(n.request,"kind"),documentVersion:Qe(n.request,"documentVersion")}),new Promise((s,c)=>{let a=this.resolveRequestTimeoutMs(t),u=a>0?setTimeout(()=>{let m=this.pending.get(i);m&&(this.pending.delete(i),J("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),m.reject(new Error(`Bridge request timed out after ${a}ms: ${t}`)))},a):null;u?.unref?.(),this.pending.set(i,{kind:t,timeout:u,resolve:m=>s(m),reject:c});try{r.send(L.stringifyMessage(o))}catch(m){let g=le(m,"WebSocket send failed");this.clearPendingRequest(i),c(g),this.cleanupSocket(r,g,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(L.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=le(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=L.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:Ht(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Fe(n.payload.result.data)}:r.kind==="initialize-session"?Gt(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]??jt}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===Wt||t.readyState===qe)&&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)}},Wt=0,qe=1,jt=15e3,$t={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function le(e,t){return e instanceof Error?e:new Error(t)}function zt(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 Qe(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Ht(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 Le(e){return new Ke(e)}var Ke=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=!Ze(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=Ze(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,c=this.params.client.getObjectEditContext(t,n??this.params.routeId).then(a=>(this.objectGeneration===s&&this.editContextCache.set(r,a.data),a)).finally(()=>{this.editContextInFlight.get(r)===c&&this.editContextInFlight.delete(r)});return this.editContextInFlight.set(r,c),c}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,c=this.params.client.getClassNameSource(t,n??this.params.routeId).then(a=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,a),a)).finally(()=>{this.classNameSourceInFlight.get(r)===c&&this.classNameSourceInFlight.delete(r)});return this.classNameSourceInFlight.set(r,c),c}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 Ze(e){return e.version===0&&e.entries.length===0}function Gt(e){let t=e;return{...t,data:{...t.data,document:Fe(t.data.document)}}}function Yt(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 et="vcp-window-message";function Xt(e){return{source:et,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function Jt(e){try{return I(e)?G(e,"source",et)&&G(e,"version",1)&&P(e,"namespace")&&P(e,"channel")&&W(e,"body")&&(!ee(e,"sessionKey")||P(e,"sessionKey")):!1}catch{return!1}}var tt="site-edit",nt="frame-runtime";function fe(e,t={}){return Xt({namespace:tt,channel:nt,sessionKey:t.sessionKey,body:e})}function rt(e){try{return!Jt(e)||e.namespace!==tt||e.channel!==nt?!1:ln(e.body)}catch{return!1}}var ee=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function W(e,t){let n=Object.getOwnPropertyDescriptor(e,t);return n!==void 0&&"value"in n}function h(e,t){return Object.getOwnPropertyDescriptor(e,t)?.value}function G(e,t,n){return W(e,t)&&h(e,t)===n}function P(e,t){return W(e,t)&&typeof h(e,t)=="string"}function it(e,t){return W(e,t)&&typeof h(e,t)=="boolean"}function q(e,t){let n=h(e,t);return W(e,t)&&typeof n=="number"&&Number.isFinite(n)}function de(e,t){return!ee(e,t)||h(e,t)===void 0||P(e,t)}function ie(e,t){return!ee(e,t)||h(e,t)===void 0||q(e,t)}function Ee(e,t){let n=h(e,t);return!ee(e,t)||n===void 0||W(e,t)&&typeof n=="number"&&Number.isInteger(n)&&n>=0}function w(e,t){return!ee(e,t)||h(e,t)===void 0}function I(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Qt(e){return I(e)&&Reflect.ownKeys(e).length===0}function ot(e){if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t+=1){let n=Object.getOwnPropertyDescriptor(e,String(t));if(n===void 0||!("value"in n)||typeof n.value!="string")return!1}return!0}function pe(e){return I(e)&&P(e,"key")&&Ee(e,"instanceIndex")&&Ee(e,"instanceCount")&&Ee(e,"textSegmentIndex")}function Zt(e){return I(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&W(e,t)&&(typeof h(e,t)=="string"||h(e,t)===null))}function st(e){return e==null||typeof e=="string"||typeof e=="number"&&Number.isFinite(e)}function Lt(e){return I(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&W(e,t)&&st(h(e,t)))}function en(e){if(!I(e))return!1;let t=h(e,"priority");return P(e,"property")&&W(e,"value")&&st(h(e,"value"))&&(!ee(e,"priority")||t===void 0||t==="important")}function tn(e){return I(e)?(w(e,"attributes")||Zt(h(e,"attributes")))&&de(e,"className")&&(w(e,"style")||Lt(h(e,"style")))&&(w(e,"styleDeclarations")||Array.isArray(h(e,"styleDeclarations"))&&h(e,"styleDeclarations").every(en)):!1}function nn(e){return I(e)&&q(e,"x")&&q(e,"y")&&(w(e,"detailLevel")||G(e,"detailLevel","summary")||G(e,"detailLevel","full"))}function rn(e){return I(e)&&pe(h(e,"ref"))}function on(e){if(!I(e)||!I(h(e,"variables")))return!1;let t=h(e,"variables");return Reflect.ownKeys(t).every(n=>typeof n=="string"&&P(t,n))?w(e,"stylesheets")||ot(h(e,"stylesheets")):!1}function sn(e){if(!G(e,"type","request")||!P(e,"id")||!P(e,"kind")||!W(e,"payload"))return!1;let t=h(e,"kind"),n=h(e,"payload");switch(t){case"hit-test-at-point":case"start-text-edit-at-point":return nn(n);case"bridge-get-source-tree":case"get-scroll-metrics":case"clear-theme-override":case"bridge-get-history-status":case"bridge-undo":case"bridge-redo":return Qt(n);case"bridge-get-source-file":return I(n)&&P(n,"path");case"bridge-resolve-source-location":case"bridge-get-object-edit-context":case"bridge-get-class-name-source":return I(n)&&P(n,"key")&&de(n,"routeId");case"scroll-to":return I(n)&&q(n,"x")&&q(n,"y");case"scroll-by":return I(n)&&q(n,"deltaX")&&q(n,"deltaY");case"set-interaction-mode":return I(n)&&it(n,"enabled");case"set-theme-override":return on(n);case"get-theme-variables":return I(n)&&ot(h(n,"names"));case"compute-drop-target-at-point":return I(n)&&q(n,"x")&&q(n,"y")&&(G(n,"dragKind","insert")||G(n,"dragKind","move"))&&(w(n,"movingRef")||pe(h(n,"movingRef")));case"observe-node-bounds":case"clear-node-bounds-observer":return I(n)&&(w(n,"ref")||pe(h(n,"ref")));case"apply-node-patch":return I(n)&&pe(h(n,"ref"))&&tn(h(n,"patch"))&&(w(n,"preview")||I(h(n,"preview"))&&P(h(n,"preview"),"sessionId")&&Ee(h(n,"preview"),"revision")&&ee(h(n,"preview"),"revision"));case"get-hit-by-ref":case"get-path-by-ref":case"restore-text-edit":case"clear-text-edit-rollback":return rn(n);case"bridge-initialize-session":case"bridge-get-style-context":return I(n)&&P(n,"routeId");case"bridge-get-document":case"bridge-ensure-document-version":case"bridge-acknowledge-document-version":return I(n)&&P(n,"routeId")&&ie(n,"minVersion")&&ie(n,"version");case"bridge-execute":return I(n)&&I(h(n,"request"));case"bridge-subscribe":case"bridge-unsubscribe":return I(n)&&P(n,"subscriptionId");default:return!1}}function cn(e){return G(e,"type","response")&&P(e,"id")&&it(e,"ok")&&(w(e,"error")||P(e,"error"))}var an=new Set(["pointer-down","pointer-move","pointer-up","pointer-cancel","pointer-click","pointer-double-click"]);function un(e){if(!G(e,"type","event")||!P(e,"kind")||!I(h(e,"payload")))return!1;let t=h(e,"kind"),n=h(e,"payload");switch(t){case"text-edit-commit":case"text-edit-cancel":case"text-edit-exit":case"text-edit-input":return pe(h(n,"ref"))&&de(n,"value")&&(w(n,"hit")||I(h(n,"hit")));case"node-bounds-change":return I(h(n,"hit"));case"bridge-event":return P(n,"subscriptionId")&&I(h(n,"event"));case"route-ready":return P(n,"routeId")&&ie(n,"version");case"bridge-status":{let r=h(n,"state");return(r==="connecting"||r==="ready"||r==="reconnecting"||r==="failed"||r==="reload-required")&&de(n,"routeId")&&ie(n,"attempt")&&ie(n,"retryInMs")&&de(n,"messageKey")}case"scroll":{let r=h(n,"metrics");return I(r)&&["scrollX","scrollY","scrollWidth","scrollHeight","viewportWidth","viewportHeight"].every(i=>q(r,i))}default:return an.has(t)&&q(n,"clientX")&&q(n,"clientY")&&ie(n,"buttons")&&(h(n,"hit")===null||I(h(n,"hit")))}}function ln(e){if(!I(e))return!1;switch(h(e,"type")){case"request":return sn(e);case"response":return cn(e);case"event":return un(e);default:return!1}}var we="vcp-site-edit:route-ready",We="vcp-site-edit:bridge-status",dn=1e3,pn="data-vcp-ui-component",ft="data-vcp-theme-preview",ct="::repeat-item#",Ie="components/ui",fn=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),mn=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function hn(e,t=""){let n=bt(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function gn(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 yn(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 Vr(e=window,t={}){let n=yn(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=bn({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(Sn(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,c=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,a=t.create_client??(p=>new Se({url:p,authKey:t.bridge_session_key})),u=t.schedule_after_navigation??Nn,m=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},g=()=>hn(e.location.pathname,t.basePath||""),D=!!e.parent&&e.parent!==e,C=p=>{An(e,p)},v=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(y=>[y.key,y]))},R=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},O=(p,y)=>!o.disposed&&y===o.routeSequence&&p===g(),k=async(p,y)=>{let T=o.activeBridge;if(!T)return null;let d=await T.getDocument(p);return O(p,y)&&v(d.data),d.data},B=()=>{R(),v(null);let p=o.activeBridge;o.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let y=o.activeClient;o.activeClient=null,y?.disconnect()},Ne=p=>p===s.routeId&&!!o.activeBridge&&(D||!!(o.currentDocument&&On(o.currentDocument,p)))&&Pn(o.activeClient),Ae=p=>Math.min(dn*2**Math.max(0,p),8e3),te=(p,y,T)=>{if(o.disposed)return;m();let d=Ae(T);C({state:"reconnecting",routeId:p,attempt:T,retryInMs:d,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||y!==o.routeSequence)&&ge(T+1).catch(f=>{let l=g();if(p===l){if(oe(f)){C({state:"reload-required",routeId:p,attempt:T,messageKey:"studio.errors.previewBridgeReloadRequired"});return}te(p,o.routeSequence,T+1)}})},d)},se=(p,y,T)=>{if(!O(p,y)||o.activeClient===null)return;if(oe(T.message)){B(),m(),C({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let d=o.activeClient;R(),v(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,d?.disconnect(),te(p,y,0)},Pe=p=>{let y=g(),T=o.routeSequence;if(!(!O(y,T)||o.activeClient===null)){if(oe(p)){B(),m(),C({state:"reload-required",routeId:y,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}yt(p)&&se(y,T,{state:"failed",message:ze(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=vn(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:v,onBridgeRequestError:p=>{Pe(p)}});let ce=async()=>ge(0),ge=async p=>{if(o.disposed)return;let y=g();if(Ne(y))return;let T=o.syncInFlight;if(T?.routeId===y)return T.promise;let d=o.routeSequence+1,f=Oe(y,d,p);o.syncInFlight={routeId:y,sequence:d,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},Oe=async(p,y,T)=>{o.routeSequence=y,m(),B(),C({state:T>0?"reconnecting":"connecting",routeId:p,attempt:T,messageKey:T>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let d=a(n),f=!1;o.activeClient=d,o.unsubscribeConnectionStatus=d.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&se(p,y,l)});try{if(await d.connect(),!O(p,y)){d.disconnect();return}let l=Le({routeId:p,client:d,initialDocument:xn(p)});o.activeBridge=l,c()&&(e.__VCP_SITE_EDIT__=l),o.activeClient=d,o.unsubscribeDocument=l.subscribe(N=>{N.type==="site-edit.document.changed"&&N.routeId===p&&o.currentDocument&&N.version>o.currentDocument.version&&k(p,y).catch(()=>{})}),c()&&(s.routeId=p);let _=(D?null:await l.initializeSession({routeId:p}))?.data.document??null;if(_&&v(_),!O(p,y)){d.disconnect();return}f=!0,C({state:"ready",routeId:p,attempt:T,messageKey:"studio.status.previewReady"}),gn(e,{documentVersion:_?.version??0,routeId:p,versions:t.runtime_versions}),_&&gt(e,{routeId:p,version:_.version})}catch(l){if(R(),o.activeClient===d&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,d.disconnect(),v(null),!O(p,y))return;throw C({state:oe(l)?"reload-required":"failed",routeId:p,attempt:T,messageKey:oe(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},Y=p=>{if(o.disposed)return;let y=g();if(oe(p)){m(),C({state:"reload-required",routeId:y,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}te(y,o.routeSequence,0)},z=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,u(()=>{o.syncScheduled=!1,!o.disposed&&ce().catch(p=>Y(p))}))},ye=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,m(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),B(),c()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:ce,cleanup:ye},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=In(e,ye),o.unbindRouteChange=kn(e,z,g),t.defer_initial_sync){z();return}await ce()}function bn(e){return{basePath:bt(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:En(e.options.bridge_session_key)}}function Sn(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function En(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 In(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),Cn(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function Cn(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function xn(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function vn(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,c=null,a=null,u=null,m=null,g=new Map,D=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,C=()=>{n?.(),n=null,r=null},v=()=>{i?.(),i=null,o?.(),o=null},R=(d,f,l)=>{let A=s?.sessionKey!==d||s?.sourceWindow!==f||s?.targetOrigin!==l;s={sessionKey:d,sourceWindow:f,targetOrigin:l},A&&(u=null,m=null)},O=(d,f)=>{let l=e.parent&&e.parent!==e?e.parent:null;return!l||f!==l?!1:!D||d===D},k=()=>{for(let d of g.values())d();g.clear()},B=d=>JSON.stringify([d.routeId,d.version]),Ne=()=>!a||a.state==="ready",Ae=d=>JSON.stringify([d.state,d.routeId??null,d.attempt??null,d.retryInMs??null,d.messageKey??null]),te=d=>{if(!Ne())return;let f=B(d);u!==f&&(o?.(),o=null,Y({kind:"route-ready",payload:{routeId:d.routeId,version:d.version}}),s&&(u=f))},se=d=>{let f=Ae(d);m!==f&&(d.state!=="ready"&&(u=null,c=null),Y({kind:"bridge-status",payload:d}),s&&(m=f))},Pe=d=>{c=d,te(d)},ce=d=>{a=d,se(d)},ge=()=>{c&&te(c)},Oe=()=>{a&&se(a)},Y=d=>{s&&s.sourceWindow.postMessage(fe({type:"event",...d},{sessionKey:s.sessionKey}),s.targetOrigin)},z=(d,f,l,A)=>{let _=_e(e.document,f.clientX,f.clientY,t.getCurrentDocument?.()??null),N=_?K(_,l==="full"?$(e.document,_,t.getCurrentDocument?.()??null):lt(e.document,_,t.getCurrentDocument?.()??null),t.getDocumentEntry,l):null;A&&N&&(d==="pointer-click"||d==="pointer-double-click")&&(A.preventDefault(),A.stopPropagation(),typeof A.stopImmediatePropagation=="function"&&A.stopImmediatePropagation()),Y({kind:d,payload:{clientX:f.clientX,clientY:f.clientY,buttons:Number(f.buttons??0),hit:N}})},ye=(d,f,l)=>{v(),s={sessionKey:d,sourceWindow:f,targetOrigin:l};let A=vr(e.document),_=null,N=null,b=()=>{N=null;let S=_;_=null,S&&z("pointer-move",S,"summary")},V=S=>{_={clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},N===null&&(N=mt(e,b))},X=S=>{z("pointer-down",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"full",S)},ne=S=>{z("pointer-up",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"summary",S)},H=S=>{z("pointer-cancel",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"summary",S)},Z=S=>{z("pointer-click",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"full",S)},ae=S=>{z("pointer-double-click",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"full",S)},ue=()=>{Y({kind:"scroll",payload:{metrics:ve(e)}})};e.document.addEventListener("pointerdown",X,!0),e.document.addEventListener("pointermove",V,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",ne,!0),e.document.addEventListener("pointercancel",H,!0),e.document.addEventListener("click",Z,!0),e.document.addEventListener("dblclick",ae,!0),e.addEventListener("scroll",ue,{passive:!0}),i=()=>{N!==null&&(ht(e,N),N=null),_=null,A(),e.document.removeEventListener("pointerdown",X,!0),e.document.removeEventListener("pointermove",V,!0),e.document.removeEventListener("pointerup",ne,!0),e.document.removeEventListener("pointercancel",H,!0),e.document.removeEventListener("click",Z,!0),e.document.removeEventListener("dblclick",ae,!0),e.removeEventListener("scroll",ue)}},p=d=>{let f=d.detail;f?.routeId&&Pe(f)},y=d=>{let f=d.detail;f?.state&&ce(f)},T=d=>{let f=d.data;if(!rt(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"&&!at(f.body))return;let l=f.body,A=typeof f.sessionKey=="string"?f.sessionKey:null,_=d.source,N=d.origin;if(!A||!N||!_||typeof _.postMessage!="function"||!O(A,_))return;if(s){if(s.sourceWindow!==_||s.targetOrigin!==N)return;s.sessionKey!==A&&(C(),v(),k(),s=null)}R(A,_,N),Oe(),ge();let b=V=>{let X=typeof l.id=="string"?l.id:"unknown";_.postMessage(fe({id:X,...V},{sessionKey:A}),N)};try{if(at(l)){_n({message:l,sendEvent:E=>{_.postMessage(fe({type:"event",...E},{sessionKey:A}),N)},sendResponse:b,subscriptions:g,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let E=Q(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!E){b({type:"response",ok:!1,error:"No editable element found for patch target"});return}let x=l.payload.preview,M=x?lr(x.sessionId,l.payload.ref):null;if(M&&x){let be=me.get(M)??-1;if(x.revision<be){b({type:"response",ok:!0,result:{applied:!1,appliedRevision:x.revision,stale:!0,latestRevision:be}});return}if(x.revision===be){b({type:"response",ok:!0,result:{applied:!1,appliedRevision:x.revision,duplicate:!0,latestRevision:be}});return}}if(ar(E,l.payload.patch),M&&x&&dr(M,x.revision),x?.responseDetail==="none"){b({type:"response",ok:!0,result:{applied:!0,appliedRevision:x.revision}});return}b({type:"response",ok:!0,result:K(E,$(e.document,E,t.getCurrentDocument?.()??null),t.getDocumentEntry,x?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let E=Q(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!E){b({type:"response",ok:!1,error:"No editable element found for hit target"});return}b({type:"response",ok:!0,result:K(E,$(e.document,E,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let E=Q(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!E){b({type:"response",ok:!1,error:"No editable element found for path target"});return}let x=[],M=E;for(;M;)M.getAttribute("data-vcp-edit-key")&&x.push(K(M,$(e.document,M,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),M=M.parentElement;b({type:"response",ok:!0,result:x.reverse()});return}if(l.kind==="restore-text-edit"||l.kind==="clear-text-edit-rollback"){let E=l.payload.ref;if(l.kind==="clear-text-edit-rollback"){r&&ut(r.ref,E)&&(r=null),b({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!ut(r.ref,E)){b({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let x=Mn(e.document,r,t.getCurrentDocument?.()??null);r=null,b(x?{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"){b({type:"response",ok:!0,result:ve(e)});return}if(l.kind==="scroll-to"){let E=Number(l.payload.x),x=Number(l.payload.y);if(!Number.isFinite(E)||!Number.isFinite(x)){b({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:E,top:x}),b({type:"response",ok:!0,result:ve(e)});return}if(l.kind==="scroll-by"){let E=Number(l.payload.deltaX),x=Number(l.payload.deltaY);if(!Number.isFinite(E)||!Number.isFinite(x)){b({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:E,top:x}),b({type:"response",ok:!0,result:{...ve(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?ye(A,_,N):s?.sourceWindow===_&&s.targetOrigin===N&&s.sessionKey===A&&v(),b({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){pr(e.document,l.payload),b({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){fr(e.document),b({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){b({type:"response",ok:!0,result:mr(e.document,l.payload.names)});return}if(l.kind==="compute-drop-target-at-point"){let E=Number(l.payload?.x),x=Number(l.payload?.y);if(!Number.isFinite(E)||!Number.isFinite(x)){b({type:"response",ok:!1,error:"Invalid drop target point"});return}b({type:"response",ok:!0,result:nr(e,E,x,l.payload.dragKind,l.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(l.kind==="observe-node-bounds"){let E=l.payload.ref;if(!E){b({type:"response",ok:!1,error:"Missing bounds observer target"});return}let x=Q(e.document,E,t.getCurrentDocument?.()??null);if(!x){b({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=Qn(e,x,E,t.getCurrentDocument,t.getDocumentEntry,M=>Y({kind:"node-bounds-change",payload:{hit:M}})),b({type:"response",ok:!0,result:{observing:!0}}),Y({kind:"node-bounds-change",payload:{hit:K(x,E,t.getDocumentEntry,"summary")}});return}if(l.kind==="clear-node-bounds-observer"){o?.(),o=null,b({type:"response",ok:!0,result:{cleared:!0}});return}if(l.kind!=="hit-test-at-point"&&l.kind!=="start-text-edit-at-point")return;let V=Number(l.payload?.x),X=Number(l.payload?.y);if(!Number.isFinite(V)||!Number.isFinite(X)){b({type:"response",ok:!1,error:"Invalid text edit point"});return}let ne=l.kind==="hit-test-at-point"?_e(e.document,V,X,t.getCurrentDocument?.()??null):Kn(e.document,V,X,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!ne){b({type:"response",ok:!1,error:l.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let H=l.kind==="start-text-edit-at-point"?ne:null,Z=l.kind==="hit-test-at-point"?ne:H.element,ae=l.payload.detailLevel??"full",ue=ae==="full"?$(e.document,Z,t.getCurrentDocument?.()??null):lt(e.document,Z,t.getCurrentDocument?.()??null),S=H&&typeof H.textSegmentIndex=="number"?{...ue,textSegmentIndex:H.textSegmentIndex}:ue,Pt=K(Z,S,t.getDocumentEntry,ae);if(l.kind==="hit-test-at-point"){b({type:"response",ok:!0,result:Pt});return}C(),n=br(e,Z,S,E=>{_.postMessage(fe({type:"event",...E},{sessionKey:A}),N)},{...H?.textNode?{textNode:H.textNode}:{},onCommitSnapshot:E=>{r=E}}),b({type:"response",ok:!0,result:{ref:S}})}catch(V){b({type:"response",ok:!1,error:V instanceof Error?V.message:"Failed to start text edit"})}};return e.addEventListener("message",T),e.addEventListener(we,p),e.addEventListener(We,y),()=>{C(),v(),s=null,k(),e.removeEventListener("message",T),e.removeEventListener(we,p),e.removeEventListener(We,y)}}function at(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 Rn(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 _n({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,windowLike:c}){let a=c.__VCP_SITE_EDIT__;if(!a){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 u=await a.initializeSession({routeId:e.payload.routeId});o?.(u.data.document),gt(c,{routeId:u.data.document.routeId,version:u.data.document.version}),n({type:"response",ok:!0,result:u});return}case"bridge-get-document":{let u=await a.getDocument(e.payload.routeId);o?.(u.data),n({type:"response",ok:!0,result:u});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await a.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await a.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 u=a.ensureDocumentVersion?await a.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await a.getDocument(e.payload.routeId);o?.(u.data),n({type:"response",ok:!0,result:u});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let u=a.acknowledgeDocumentVersion?await a.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await a.getDocument(e.payload.routeId);o?.(u.data),n({type:"response",ok:!0,result:u});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await a.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let u=await a.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Tn(u,e.payload.key,c.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await a.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await a.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await a.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let u=await a.execute(e.payload.request),m=i?.()?.routeId;if(u.ok&&m&&a.acknowledgeDocumentVersion&&Rn(e.payload.request)){let g=await a.acknowledgeDocumentVersion(m,u.data.resultVersion);o?.(g.data)}n({type:"response",ok:!0,result:u});return}case"bridge-undo":n({type:"response",ok:!0,result:await a.undo()});return;case"bridge-redo":n({type:"response",ok:!0,result:await a.redo()});return;case"bridge-subscribe":{let u=e.payload.subscriptionId;r.get(u)?.();let m=a.subscribe(g=>{t({kind:"bridge-event",payload:{event:g,subscriptionId:u}})});r.set(u,m),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let u=e.payload.subscriptionId;r.get(u)?.(),r.delete(u),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(u){s?.(u,e),n({type:"response",ok:!1,error:Fn(u)})}}function Tn(e,t,n,r){if(!e.ok)return e;let i=Q(n,{key:t},r),o=i?Dn(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Dn(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 kn(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let u=n();u!==o&&(o=u,t())},c=()=>s(),a=()=>s();return e.history.pushState=function(...m){let g=r.apply(this,m);return s(),g},e.history.replaceState=function(...m){let g=i.apply(this,m);return s(),g},e.addEventListener("popstate",c),e.addEventListener("hashchange",a),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",c),e.removeEventListener("hashchange",a)}}function Nn(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function mt(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function ht(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function gt(e,t){e.dispatchEvent(new CustomEvent(we,{detail:t}))}function An(e,t){e.dispatchEvent(new CustomEvent(We,{detail:t}))}function Pn(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function On(e,t){return e.routeId===t}function ze(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function yt(e){let t=ze(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function Fn(e){let t=ze(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":yt(t)?"Site edit bridge disconnected":t}function oe(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 bt(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function He(e){return fn.has(Et(e))}function Bn(e){return mn.has(Et(e))}function St(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:Bn(e.tagName),canInsertChild:He(e.tagName),canMove:!1,canRemove:!1}}function Et(e){return e?.trim().toLowerCase()??""}function ut(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 Mn(e,t,n){let r=Q(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=qn(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 qn(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Re(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function Kn(e,t,n,r,i){let o=_e(e,t,n,r),s=It(o);if(!s)return null;let c=s.getAttribute("data-vcp-edit-key")??"",a=$(e,s,r),u=i?.(a.key)??i?.(c);if(!St({operationSummary:u?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let g=Vn(e,t,n,s);if(g){let D=wn(s,g);if(D!==null)return{element:s,textNode:g,textSegmentIndex:D}}return ke(s)?null:{element:s}}function Vn(e,t,n,r){let i=Un(e,t,n);return!i||i.parentElement!==r?null:i}function Un(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(Re(o))return o;let c=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return Re(c)?c:null}function wn(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Re(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function Re(e){return e?.nodeType===3}function _e(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=It(o),c=s?.getAttribute("data-vcp-edit-key")??"";if(s&&Hn(s,r,c))return s}return null}function It(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Ge(t))return n??t;!Wn(r)&&!n&&(n=t)}t=t.parentElement}return n}function Ge(e){return e.getAttribute(pn)!==null}function Wn(e){return jn(e.split("::")[0]??"")}function jn(e){if(!e)return!1;let t=$n(e);return t===Ie||t.startsWith(`${Ie}/`)||t.includes(`/${Ie}/`)||t.endsWith(`/${Ie}`)}function $n(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 $(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=xt(Rt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${At(r)}"]`))),n,r);if(i.length<=1)return{key:dt(n,r,0)};let o=i.indexOf(t);return o>=0?{key:dt(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function lt(e,t,n){return $(e,t,n)}function Q(e,t,n){let r=Te(t.key)??t.key,i=xt(Rt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${At(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=(Te(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let c=zn(n,t.key);return c!==null&&c>=0&&c<i.length?i[c]??null:o!==null?i[o]??null:i[0]??null}function dt(e,t,n){return Ct(e,t)[n]?.key??t}function zn(e,t){let n=Te(t);if(!n)return null;let i=Ct(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function Ct(e,t){return(e?.entries??[]).filter(n=>(Te(n.key)??n.key)===t)}function xt(e,t,n){let r=vt(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function Hn(e,t,n){let r=vt(t,n);return!r||e.tagName.toLowerCase()===r}function vt(e,t){return null}var Gn=2,Yn=4;function Rt(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&Yn)!==0?-1:(r&Gn)!==0?1:0})}function Te(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(ct);if(n<0)break;let r=Number(t.slice(n+ct.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function Xn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e);return{..._t(n),paddingTop:F(n?.paddingTop),paddingRight:F(n?.paddingRight),paddingBottom:F(n?.paddingBottom),paddingLeft:F(n?.paddingLeft),borderTopWidth:F(n?.borderTopWidth),borderRightWidth:F(n?.borderRightWidth),borderBottomWidth:F(n?.borderBottomWidth),borderLeftWidth:F(n?.borderLeftWidth),columnGap:F(n?.columnGap),rowGap:F(n?.rowGap)}}function _t(e){return{marginTop:F(e?.marginTop,!0),marginRight:F(e?.marginRight,!0),marginBottom:F(e?.marginBottom,!0),marginLeft:F(e?.marginLeft,!0)}}function F(e,t=!1){let n=Number.parseFloat(e??"");return Number.isFinite(n)?t?n:Math.max(0,n):0}function Jn(e){let t=e.ownerDocument?.defaultView;return Array.from(e.children).filter(n=>typeof n.getBoundingClientRect=="function").map(n=>({rect:tr(n.getBoundingClientRect()),margin:_t(t?.getComputedStyle(n))})).filter(({rect:n})=>n.width>0&&n.height>0)}function K(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),c=De(e),a=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([v,R])=>[v,R??""])),attributes:Object.fromEntries(e.getAttributeNames().map(v=>[v,e.getAttribute(v)??""]))}:{},u=St({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),m=Ge(e),g=!0,D=Tt(e)?.getAttribute("data-vcp-edit-key")??null,C=Jn(e);return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},...D?{parentKey:D}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...a,runtimeFlags:{selectable:!0,movable:u.canMove,removable:u.canRemove,textEditable:u.canUpdateText,container:m?!1:!!ke(e)||u.canInsertChild||g&&He(s)},layout:c,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childBoxes:C,childRects:C.map(({rect:v})=>v),spacing:Xn(e)}}function Qn(e,t,n,r,i,o){let s=t,c=K(s,n,i,"summary"),a=null,u=()=>{a===null&&(a=mt(e,m))},m=()=>{a=null;let O=Q(e.document,n,r?.()??null);if(!O)return;O!==s&&(D?.unobserve(s),s=O,D?.observe(s));let k=K(s,n,i,"summary");k.rect.width<=0||k.rect.height<=0||Zn(c,k)&&(c=k,o(k))},g=e.ResizeObserver,D=typeof g=="function"?new g(u):null;D?.observe(s);let C=e.MutationObserver,v=typeof C=="function"?new C(u):null;v?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",u,{passive:!0});let R=e.visualViewport;return R?.addEventListener?.("resize",u,{passive:!0}),e.document.addEventListener("load",u,!0),()=>{a!==null&&(ht(e,a),a=null),D?.disconnect(),v?.disconnect(),e.removeEventListener("resize",u),R?.removeEventListener?.("resize",u),e.document.removeEventListener("load",u,!0)}}function Zn(e,t){return Ye(e.rect,t.rect)||Ln(e.childBoxes,t.childBoxes)||er(e.childRects,t.childRects)||je(e.spacing,t.spacing)||je(e.layout,t.layout)}function Ln(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>{let s=r[o];return!s||Ye(i.rect,s.rect)||je(i.margin,s.margin)})}function er(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>Ye(i,r[o]??i))}function je(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 tr(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function Ye(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 nr(e,t,n,r,i,o,s){let c=e.document,a=_e(c,t,n,o);if(!a)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let u=i?Q(c,i,o):null;if(u&&$e(a,u))return Ce(c,a,"self-or-descendant",o,s);if(r==="move"&&u){let R=sr(c,a,u,o,s);if(R){let O=Ve(R.child,R.targetParent,t,n,"nearest");if(O)return xe(c,R.child,R.targetParent,O,o,s)}}let m=null,g=!1,D=a,C=a.parentElement;for(;C;){if(C.getAttribute("data-vcp-edit-key")){if(u&&$e(C,u))return Ce(c,a,"self-or-descendant",o,s);let R=pt(C,r,s);if(R==="accept"){m={child:D,targetParent:C};break}R==="blocked"&&(g=!0),D=C}C=C.parentElement}let v=pt(a,r,s);if(v==="accept"){if(m){let R=Ve(m.child,m.targetParent,t,n,"edge");if(R)return xe(c,m.child,m.targetParent,R,o,s)}return xe(c,a,a,rr(a,t,n),o,s)}if(m){let R=Ve(m.child,m.targetParent,t,n,"nearest");return xe(c,m.child,m.targetParent,R??"after",o,s)}return v==="blocked"||g?Ce(c,a,"operation-boundary-blocked",o,s):Ce(c,a,"no-accepting-parent",o,s)}function Ce(e,t,n,r,i){return{anchorHit:K(t,$(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function xe(e,t,n,r,i,o){let s=K(t,$(e,t,i),o,"summary"),c=K(n,$(e,n,i),o,"summary"),a=De(n).indicatorOrientation,u=r==="append"||r==="prepend"?ir(n.getBoundingClientRect(),a,r):or(t.getBoundingClientRect(),a,r);return{anchorHit:s,targetParentHit:c,relation:r,indicatorOrientation:a,indicatorBounds:u}}function pt(e,t,n){if(Ge(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":ke(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return He(o)?"accept":"not-container"}function Ve(e,t,n,r,i){let o=De(t).indicatorOrientation,s=e.getBoundingClientRect(),c=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&c>=.25&&c<=.75?null:c<.5?"before":"after"}function rr(e,t,n){let r=De(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 De(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 ir(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 or(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 $e(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function sr(e,t,n,r,i){let o=cr(e,t,n,r,i);if(o)return o;let s=Tt(n);if(!s||t===s)return null;let c=t,a=t.getAttribute("data-vcp-edit-key")?t:null;for(;c&&c!==s;)c.getAttribute("data-vcp-edit-key")&&(a=c),c=c.parentElement;return c!==s||!a||a===s||a===n||$e(a,n)?null:{child:a,targetParent:s}}function cr(e,t,n,r,i){return null}function Tt(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function ke(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=ke(n);if(r)return r}return null}function ve(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:j(e.scrollX),scrollY:j(e.scrollY),scrollWidth:Math.max(j(t?.scrollWidth),j(n?.scrollWidth),j(e.innerWidth)),scrollHeight:Math.max(j(t?.scrollHeight),j(n?.scrollHeight),j(e.innerHeight)),viewportWidth:j(e.innerWidth),viewportHeight:j(e.innerHeight)}}function ar(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,c=>`-${c.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,c=>`-${c.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var ur=500,me=new Map;function lr(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function dr(e,t){if(me.size>=ur){let n=me.keys().next().value;n&&me.delete(n)}me.set(e,t)}var he=new Set;function pr(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 he)r.has(i)||n?.removeProperty(i);he.clear();for(let i of r)he.add(i);yr(e,t.stylesheets??[])}function fr(e){let t=e.documentElement?.style;for(let n of he)t?.removeProperty(n);he.clear();for(let n of Nt(e))n.remove()}function mr(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 c=Dt(i,s);c&&(o[s]=c)}return o}function Dt(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return kt(e,r,n)}function kt(e,t,n){if(!t)return null;let r=hr(t);if(!r)return t;let i=Dt(e,r.name,n);return i||(r.fallback?kt(e,r.fallback,n)??r.fallback:null)}function hr(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=gr(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 gr(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 yr(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of Nt(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(ft,"true"),s.setAttribute("href",o),i.appendChild(s)}}function Nt(e){return Array.from(e.querySelectorAll(`link[${ft}]`))}function br(e,t,n,r,i={}){let o=i.textNode?Sr(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,c=s.textContent??"",a=o?void 0:t.innerHTML,u=Er(s),m=!1,g=()=>{e.document.removeEventListener("pointerdown",C,!0),s.removeEventListener("keydown",v),s.removeEventListener("blur",R),s.removeEventListener("input",O),Cr(s,u)},D=k=>{if(m)return;m=!0;let B=s.textContent??"";if(g(),k==="cancel"){o?.restore(c),o||(t.textContent=c),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(B),k==="commit"&&B!==c){i.onCommitSnapshot?.({ref:n,initialText:c,...a!==void 0?{initialHtml:a}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:B}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function C(k){let B=k.target;B&&s.contains(B)||D("commit")}function v(k){if(k.key==="Escape"){k.preventDefault(),D("cancel");return}k.key==="Enter"&&(k.metaKey||k.ctrlKey)&&(k.preventDefault(),D("commit"))}function R(){D("commit")}function O(){r({kind:"text-edit-input",payload:{ref:n,hit:K(t,n,void 0,"full")}})}return Ir(s),e.document.addEventListener("pointerdown",C,!0),s.addEventListener("keydown",v),s.addEventListener("blur",R),s.addEventListener("input",O),Rr(s),_r(s,e.document),g}function Sr(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 Er(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 Ir(e){xr(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 Cr(e,t){Ue(e,"contenteditable",t.contentEditable),Ue(e,"spellcheck",t.spellcheck),Ue(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function xr(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 Ue(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function vr(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 Rr(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function _r(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function At(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function j(e){let t=Number(e);return Number.isFinite(t)?t:0}export{We as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,we as VCP_SITE_EDIT_ROUTE_READY_EVENT,hn as resolveSiteEditRouteId,yn as resolveSiteEditWebSocketUrl,Vr as startSiteEditAutoBootstrap,vn as startSiteEditFrameRuntime};
package/dist/client.d.ts CHANGED
@@ -80,6 +80,13 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
80
80
  canRemove: boolean;
81
81
  };
82
82
  pageCompositionUnitKey?: string | undefined;
83
+ dynamicDataSummary?: {
84
+ hasDynamicData: boolean;
85
+ sourceKinds: ("vcp-cms-collection" | "vcp-cms-form" | "vcp-cms-settings" | "vcp-cms-navigation" | "site-api-route" | "external-api" | "unknown-api")[];
86
+ primaryEndpoint?: string | undefined;
87
+ primaryCollection?: string | undefined;
88
+ primaryFieldPath?: string | undefined;
89
+ } | undefined;
83
90
  }[];
84
91
  pageComposition: {
85
92
  status: "supported";
@@ -184,6 +191,27 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
184
191
  message: string;
185
192
  }[];
186
193
  } | undefined;
194
+ dynamicData?: {
195
+ hasDynamicData: boolean;
196
+ bindings: {
197
+ sourceKind: "vcp-cms-collection" | "vcp-cms-form" | "vcp-cms-settings" | "vcp-cms-navigation" | "site-api-route" | "external-api" | "unknown-api";
198
+ sourceType: "cms-field" | "api-field";
199
+ targetKind: "text" | "repeat-region" | "richtext" | "attribute" | "component-prop";
200
+ targetName: string;
201
+ confidence: "unknown" | "exact" | "safe-derived" | "partial";
202
+ readonly: true;
203
+ evidence: {
204
+ file: string;
205
+ reason: string;
206
+ symbol?: string | undefined;
207
+ }[];
208
+ endpointPattern?: string | undefined;
209
+ operation?: string | undefined;
210
+ collection?: string | undefined;
211
+ fieldPath?: string | undefined;
212
+ valuePath?: string | undefined;
213
+ }[];
214
+ } | undefined;
187
215
  }>>;
188
216
  getClassNameSource(key: string, routeId?: string): Promise<SiteEditGetClassNameSourceCommandResult>;
189
217
  getSourceTree(): Promise<SiteEditCommandSuccess<{
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)&&(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};
1
+ function y(n){if(!M(n))return n;let e=new Map,t=n.pageComposition.status==="supported"?n.pageComposition.placementUnitKeys:[],s=new Map(n.dynamicDataSummaries??[]),r=o=>{let a=e.get(o);if(a)return a;let i=n.nodes[o];if(!i)throw new Error(`Missing compact document node ${o}`);let[c,d]=i,u=n.tokens[d];if(typeof u!="string")throw new Error(`Missing compact document token ${d}`);let f=`${c===null?"":r(c)}${u}`;return e.set(o,f),f};return{siteId:n.siteId,snapshotId:n.snapshotId,routeId:n.routeId,version:n.version,pageComposition:n.pageComposition,entries:n.entries.map((o,a)=>{let[i,c,d]=o,u=d===void 0?void 0:t[d];if(d!==void 0&&!u)throw new Error(`Missing page composition unit ${d}`);return{key:r(i),...u?{pageCompositionUnitKey:u}:{},operationSummary:D(c),...s.get(a)?{dynamicDataSummary:s.get(a)}:{}}})}}function D(n){return{canUpdateText:(n&1)!==0,canInsertChild:(n&2)!==0,canMove:(n&4)!==0,canRemove:(n&8)!==0}}function M(n){if(typeof n!="object"||n===null)return!1;let e=n;if(e.encoding!=="segment-trie-v1"||typeof e.siteId!="string"||typeof e.snapshotId!="string"||typeof e.routeId!="string"||!Number.isInteger(e.version)||e.version<0||!x(e.pageComposition)||!Array.isArray(e.tokens)||!e.tokens.every(r=>typeof r=="string")||!Array.isArray(e.nodes)||!Array.isArray(e.entries))return!1;let t=e.nodes;if(!t.every((r,o)=>Array.isArray(r)&&r.length===2&&(r[0]===null||g(r[0])&&r[0]<o)&&g(r[1])&&r[1]<e.tokens.length)||!e.entries.every(r=>Array.isArray(r)&&(r.length===2||r.length===3)&&g(r[0])&&r[0]<t.length&&g(r[1])&&r[1]<=15&&(r.length===2||g(r[2]))))return!1;let s=e.dynamicDataSummaries;return s===void 0||Array.isArray(s)&&s.every(r=>Array.isArray(r)&&r.length===2&&g(r[0])&&r[0]<e.entries.length&&x(r[1]))}function x(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function g(n){return typeof n=="number"&&Number.isInteger(n)&&n>=0}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!h(e)||typeof e.type!="string"?!1:e.type==="request"?n.isRequestPayload(e.payload,t):e.type==="response"||e.type==="error"?h(e.payload)&&typeof e.payload.id=="string":e.type==="event"?h(e.payload)&&h(e.payload.event):e.type==="auth"?h(e.payload)&&typeof e.payload.key=="string":e.type==="auth-ok"?h(e.payload)&&e.payload.ok===!0:!1}static isRequestPayload(e,t={}){if(!h(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||I(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 R(e.request)&&(e.request.mutationContext===void 0||I(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return e.mutationContext===void 0||I(e.mutationContext)}}};function h(n){return typeof n=="object"&&n!==null}function R(n){return h(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"&&h(n.target)&&typeof n.documentVersion=="number"&&Number.isInteger(n.documentVersion)&&n.documentVersion>=0&&h(n.params)}function I(n){return T(n)}function T(n){return h(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 A="vcp:designer:trace",_="designer_trace",k="__VCP_DESIGNER_TRACE__";var F=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function K(n=globalThis){let e=n;try{if(e.localStorage?.getItem(A)==="1")return!0}catch{}try{let t=e.location?.search??"";return new URLSearchParams(t).get(_)==="1"}catch{return!1}}function l(n,e={},t=globalThis){if(!K(t))return;let s={type:n,timestamp:Date.now(),payload:j(e)},r=t,o=r[k]??[];o.push(s),o.length>200&&o.splice(0,o.length-200),r[k]=o;let a=t.console?.debug;typeof a=="function"&&a.call(t.console,"[designer-trace]",s)}function j(n){return S(n,0)}function S(n,e){if(e>4)return"[truncated]";if(Array.isArray(n))return n.map(s=>S(s,e+1));if(!n||typeof n!="object")return n;let t={};for(let[s,r]of Object.entries(n)){if(F.test(s)){t[s]="[redacted]";continue}t[s]=S(r,e+1)}return t}var w=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===C&&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(i){let c=m(i,"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 o=()=>{this.socket!==s||this.connectAttempt!==r||(r.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),e())},a=(i,c)=>{this.cleanupSocket(s,i,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(i){a(m(i,"WebSocket auth failed"),"failed")}return}o()}},s.onerror=i=>{if(this.socket!==s)return;let c=m(i,"WebSocket failed");a(c,"failed")},s.onmessage=i=>{if(this.socket===s){if(this.options.authKey&&this.connectAttempt===r&&!r.settled){this.handleAuthHandshakeMessage(i.data,s,r,()=>{o()});return}this.handleMessage(i.data)}},s.onclose=i=>{if(this.socket!==s)return;let c=this.intentionalClose,d=new Error($(i,{intentional:c}));a(d,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!==C||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}`,o=v(r,e,t);return l("bridge.request",{id:r,kind:e,routeId:typeof t.routeId=="string"?t.routeId:null,key:typeof t.key=="string"?t.key:null,operationKind:E(t.request,"kind"),documentVersion:E(t.request,"documentVersion")}),new Promise((a,i)=>{let c=this.resolveRequestTimeoutMs(e),d=c>0?setTimeout(()=>{let u=this.pending.get(r);u&&(this.pending.delete(r),l("bridge.response",{id:r,kind:e,ok:!1,timedOut:!0}),u.reject(new Error(`Bridge request timed out after ${c}ms: ${e}`)))},c):null;d?.unref?.(),this.pending.set(r,{kind:e,timeout:d,resolve:u=>a(u),reject:i});try{s.send(p.stringifyMessage(o))}catch(u){let f=m(u,"WebSocket send failed");this.clearPendingRequest(r),i(f),this.cleanupSocket(s,f,"failed")}})}handleAuthHandshakeMessage(e,t,s,r){try{if(p.parseMessage(e).type==="auth-ok"){r();return}throw new Error("Bridge authentication failed")}catch(o){let a=m(o,"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"){l("bridge.response",{id:t.payload.id,kind:s.kind,ok:!1}),s.reject(new Error(t.payload.message));return}l("bridge.response",{id:t.payload.id,kind:s.kind,ok:!0,resultVersion:P(t.payload.result)}),s.resolve(s.kind==="get-document"?{...t.payload.result,data:y(t.payload.result.data)}:s.kind==="initialize-session"?B(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):U[e]??N}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===O||e.readyState===C)&&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)}},O=0,C=1,N=15e3,U={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function m(n,e){return n instanceof Error?n:new Error(e)}function $(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 E(n,e){if(!n||typeof n!="object")return null;let s=n[e];return typeof s=="string"||typeof s=="number"?s:null}function P(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 Y(n){return new b(n)}var b=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=!q(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=q(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,o=this.params.client.getStyleContext(e).then(a=>(this.styleGeneration===r&&(this.styleContextCache={generation:r,value:a.data}),a)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:r,request:o},o}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 o=this.editContextInFlight.get(s);if(o)return o;let a=this.objectGeneration,i=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)===i&&this.editContextInFlight.delete(s)});return this.editContextInFlight.set(s,i),i}async getClassNameSource(e,t){let s=this.objectCacheKey(e,t),r=this.classNameSourceCache.get(s);if(r)return r;let o=this.classNameSourceInFlight.get(s);if(o)return o;let a=this.objectGeneration,i=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)===i&&this.classNameSourceInFlight.delete(s)});return this.classNameSourceInFlight.set(s,i),i}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 l("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:t}),this.currentDocument;if(this.refreshInFlight){l("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}l("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 q(n){return n.version===0&&n.entries.length===0}function B(n){let e=n;return{...e,data:{...e.data,document:y(e.data.document)}}}function v(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{w as SiteEditWebSocketClient,Y as createSiteEditBridge};
@@ -1,4 +1,4 @@
1
- import type { SiteEditRenderDocument } from "@vcp-dev/contracts";
1
+ import type { SiteEditDynamicDataSummary, SiteEditRenderDocument } from "@vcp-dev/contracts";
2
2
  export type CompactRenderDocument = {
3
3
  encoding: "segment-trie-v1";
4
4
  siteId: string;
@@ -9,6 +9,10 @@ export type CompactRenderDocument = {
9
9
  tokens: string[];
10
10
  nodes: CompactRenderDocumentNode[];
11
11
  entries: CompactRenderDocumentEntry[];
12
+ dynamicDataSummaries?: Array<[
13
+ entryIndex: number,
14
+ summary: SiteEditDynamicDataSummary
15
+ ]>;
12
16
  };
13
17
  /** [parentNodeId, tokenId] */
14
18
  export type CompactRenderDocumentNode = [
@@ -23,4 +27,4 @@ export type CompactRenderDocumentEntry = [
23
27
  ];
24
28
  export declare function encodeRenderDocument(document: SiteEditRenderDocument): CompactRenderDocument;
25
29
  export declare function decodeRenderDocument(document: CompactRenderDocument | SiteEditRenderDocument): SiteEditRenderDocument;
26
- export declare function isCompactRenderDocument(value: CompactRenderDocument | SiteEditRenderDocument): value is CompactRenderDocument;
30
+ export declare function isCompactRenderDocument(value: unknown): value is CompactRenderDocument;
@@ -1 +1 @@
1
- function x(e){let s=new Map,t=[],o=new Map,r=[],c=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],u=new Map(c.map((n,i)=>[n,i])),p=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(n=>({placementKey:n.placementKey,placementUnitKey:n.placementUnitKey,relation:n.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},a=n=>{let i=s.get(n);if(typeof i=="number")return i;let g=t.length;return t.push(n),s.set(n,g),g},d=n=>{let i=null;for(let g of K(n)){let m=`${i??"root"}\0${g}`,l=o.get(m);if(typeof l=="number"){i=l;continue}let f=r.length;r.push([i,a(g)]),o.set(m,f),i=f}if(i===null)throw new Error("Document key must not be empty");return i};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:p,tokens:t,nodes:r,entries:e.entries.map(n=>{let i=n.pageCompositionUnitKey?u.get(n.pageCompositionUnitKey)??-1:-1;if(n.pageCompositionUnitKey&&i<0)throw new Error(`Render entry ${n.key} references unknown page composition unit ${n.pageCompositionUnitKey}`);return[d(n.key),C(n.operationSummary),...i>=0?[i]:[]]})}}function U(e){if(!I(e))return e;let s=new Map,t=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],o=r=>{let c=s.get(r);if(c)return c;let u=e.nodes[r];if(!u)throw new Error(`Missing compact document node ${r}`);let[p,a]=u,d=e.tokens[a];if(typeof d!="string")throw new Error(`Missing compact document token ${a}`);let n=`${p===null?"":o(p)}${d}`;return s.set(r,n),n};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map(r=>{let[c,u,p]=r,a=p===void 0?void 0:t[p];if(p!==void 0&&!a)throw new Error(`Missing page composition unit ${p}`);return{key:o(c),...a?{pageCompositionUnitKey:a}:{},operationSummary:y(u)}})}}function C(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function y(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function I(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}function K(e){if(!e)return[];let s=[],t=0,o=h(e,t);if(o<0)return s.push(e),s;for(s.push(e.slice(0,o)),t=o;t<e.length;){if(o=h(e,t+(e.startsWith("::",t)?2:1)),o<0){s.push(e.slice(t));break}s.push(e.slice(t,o)),t=o}return s}function h(e,s){let t=e.indexOf("/",s),o=e.indexOf("::",s);return t<0?o:o<0?t:Math.min(t,o)}export{U as decodeRenderDocument,x as encodeRenderDocument,I as isCompactRenderDocument};
1
+ function A(e){let n=new Map,o=[],i=new Map,t=[],a=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],u=new Map(a.map((s,r)=>[s,r])),g=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(s=>({placementKey:s.placementKey,placementUnitKey:s.placementUnitKey,relation:s.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},m=e.entries.flatMap((s,r)=>s.dynamicDataSummary?[[r,s.dynamicDataSummary]]:[]),p=s=>{let r=n.get(s);if(typeof r=="number")return r;let d=o.length;return o.push(s),n.set(s,d),d},c=s=>{let r=null;for(let d of x(s)){let l=`${r??"root"}\0${d}`,y=i.get(l);if(typeof y=="number"){r=y;continue}let h=t.length;t.push([r,p(d)]),i.set(l,h),r=h}if(r===null)throw new Error("Document key must not be empty");return r};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:g,tokens:o,nodes:t,entries:e.entries.map(s=>{let r=s.pageCompositionUnitKey?u.get(s.pageCompositionUnitKey)??-1:-1;if(s.pageCompositionUnitKey&&r<0)throw new Error(`Render entry ${s.key} references unknown page composition unit ${s.pageCompositionUnitKey}`);return[c(s.key),K(s.operationSummary),...r>=0?[r]:[]]}),...m.length>0?{dynamicDataSummaries:m}:{}}}function M(e){if(!w(e))return e;let n=new Map,o=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],i=new Map(e.dynamicDataSummaries??[]),t=a=>{let u=n.get(a);if(u)return u;let g=e.nodes[a];if(!g)throw new Error(`Missing compact document node ${a}`);let[m,p]=g,c=e.tokens[p];if(typeof c!="string")throw new Error(`Missing compact document token ${p}`);let s=`${m===null?"":t(m)}${c}`;return n.set(a,s),s};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((a,u)=>{let[g,m,p]=a,c=p===void 0?void 0:o[p];if(p!==void 0&&!c)throw new Error(`Missing page composition unit ${p}`);return{key:t(g),...c?{pageCompositionUnitKey:c}:{},operationSummary:U(m),...i.get(u)?{dynamicDataSummary:i.get(u)}:{}}})}}function K(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function U(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function w(e){if(typeof e!="object"||e===null)return!1;let n=e;if(n.encoding!=="segment-trie-v1"||typeof n.siteId!="string"||typeof n.snapshotId!="string"||typeof n.routeId!="string"||!Number.isInteger(n.version)||n.version<0||!I(n.pageComposition)||!Array.isArray(n.tokens)||!n.tokens.every(t=>typeof t=="string")||!Array.isArray(n.nodes)||!Array.isArray(n.entries))return!1;let o=n.nodes;if(!o.every((t,a)=>Array.isArray(t)&&t.length===2&&(t[0]===null||f(t[0])&&t[0]<a)&&f(t[1])&&t[1]<n.tokens.length)||!n.entries.every(t=>Array.isArray(t)&&(t.length===2||t.length===3)&&f(t[0])&&t[0]<o.length&&f(t[1])&&t[1]<=15&&(t.length===2||f(t[2]))))return!1;let i=n.dynamicDataSummaries;return i===void 0||Array.isArray(i)&&i.every(t=>Array.isArray(t)&&t.length===2&&f(t[0])&&t[0]<n.entries.length&&I(t[1]))}function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function f(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0}function x(e){if(!e)return[];let n=[],o=0,i=C(e,o);if(i<0)return n.push(e),n;for(n.push(e.slice(0,i)),o=i;o<e.length;){if(i=C(e,o+(e.startsWith("::",o)?2:1)),i<0){n.push(e.slice(o));break}n.push(e.slice(o,i)),o=i}return n}function C(e,n){let o=e.indexOf("/",n),i=e.indexOf("::",n);return o<0?i:i<0?o:Math.min(o,i)}export{M as decodeRenderDocument,A as encodeRenderDocument,w as isCompactRenderDocument};