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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,7 +54,7 @@ export type SiteEditBootstrapClient = SiteEditBridgeClient & {
54
54
  subscribeConnectionStatus?: (listener: (status: SiteEditBridgeConnectionStatus) => void) => () => void;
55
55
  };
56
56
  type BridgeFrameRuntimeRequestBody = Extract<SiteEditFrameRuntimeRequestBody, {
57
- kind: "bridge-get-document" | "bridge-ensure-document-version" | "bridge-get-object-summary" | "bridge-get-object-edit-context" | "bridge-get-class-name-source" | "bridge-get-source-tree" | "bridge-get-source-file" | "bridge-resolve-source-location" | "bridge-execute" | "bridge-undo" | "bridge-redo" | "bridge-subscribe" | "bridge-unsubscribe";
57
+ kind: "bridge-initialize-session" | "bridge-get-document" | "bridge-get-history-status" | "bridge-get-style-context" | "bridge-ensure-document-version" | "bridge-acknowledge-document-version" | "bridge-get-object-edit-context" | "bridge-get-class-name-source" | "bridge-get-source-tree" | "bridge-get-source-file" | "bridge-resolve-source-location" | "bridge-execute" | "bridge-undo" | "bridge-redo" | "bridge-subscribe" | "bridge-unsubscribe";
58
58
  }>;
59
59
  export declare function resolveSiteEditRouteId(pathname: string, basePath?: string): string;
60
60
  export declare function resolveSiteEditWebSocketUrl(windowLike: Pick<Window, "location">, options?: {
@@ -68,6 +68,7 @@ export declare function startSiteEditFrameRuntime(windowLike?: Window & typeof g
68
68
  expectedSessionKey?: string;
69
69
  getCurrentDocument?: () => SiteEditRenderDocument | null;
70
70
  getDocumentEntry?: (key: string) => SiteEditRenderEntry | null;
71
+ setCurrentDocument?: (document: SiteEditRenderDocument) => void;
71
72
  onBridgeRequestError?: (error: unknown, request: BridgeFrameRuntimeRequestBody) => void;
72
73
  }): () => void;
73
74
  export {};
@@ -1 +1 @@
1
- function Pe(e){if(!at(e))return e;let t=new Map,n=r=>{let s=t.get(r);if(s)return s;let o=e.nodes[r];if(!o)throw new Error(`Missing compact document node ${r}`);let i=e.tokens[o.token];if(typeof i!="string")throw new Error(`Missing compact document token ${o.token}`);let c=`${o.parent===null?"":n(o.parent)}${i}`;return t.set(r,c),c};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,rootKeys:e.rootKeyNodeIds.map(n),entries:e.entries.map(r=>({key:n(r.keyNodeId),tag:r.tag,label:r.label,parentKey:r.parentKeyNodeId===null?null:n(r.parentKeyNodeId),childKeys:r.childKeyNodeIds.map(n),operationSummary:r.operationSummary}))}}function at(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}var G=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",s=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:s}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="get-document"||t==="get-object-summary"||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!K(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?K(t.payload)&&typeof t.payload.id=="string":t.type==="event"?K(t.payload)&&K(t.payload.event):t.type==="auth"?K(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?K(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!K(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"get-document":return typeof t.routeId=="string";case"get-object-summary":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-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return lt(t.request)&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return!0}}};function K(e){return typeof e=="object"&&e!==null}function lt(e){return K(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"&&K(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&K(e.params)}var dt="vcp:designer:trace",ft="designer_trace",Ae="__VCP_DESIGNER_TRACE__";var pt=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function mt(e=globalThis){let t=e;try{if(t.localStorage?.getItem(dt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(ft)==="1"}catch{return!1}}function H(e,t={},n=globalThis){if(!mt(n))return;let r={type:e,timestamp:Date.now(),payload:ht(t)},s=n,o=s[Ae]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),s[Ae]=o;let i=n.console?.debug;typeof i=="function"&&i.call(n.console,"[designer-trace]",r)}function ht(e){return Se(e,0)}function Se(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>Se(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,s]of Object.entries(e)){if(pt.test(r)){n[r]="[redacted]";continue}n[r]=Se(s,t+1)}return n}var ue=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===Ee&&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 u=ee(c,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",u.message),n(u);return}let s={socket:r,settled:!1,reject:n};this.connectAttempt=s,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==s||(s.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},i=(c,u)=>{this.cleanupSocket(r,c,u)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==s)){if(this.options.authKey){try{r.send(G.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(c){i(ee(c,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=c=>{if(this.socket!==r)return;let u=ee(c,"WebSocket failed");i(u,"failed")},r.onmessage=c=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===s&&!s.settled){this.handleAuthHandshakeMessage(c.data,r,s,()=>{o()});return}this.handleMessage(c.data)}},r.onclose=c=>{if(this.socket!==r)return;let u=this.intentionalClose,m=new Error(St(c,{intentional:u}));i(m,u?"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})}getObjectSummary(t,n){return this.request("get-object-summary",{key:t,routeId:n})}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){return this.request("execute",{request:t})}undo(){return this.request("undo",{})}redo(){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!==Ee||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${r?.readyState??"none"})`));let s=`${t}-${this.sequence+=1}`,o=It(s,t,n);return H("bridge.request",{id:s,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:Oe(n.request,"kind"),documentVersion:Oe(n.request,"documentVersion")}),new Promise((i,c)=>{let u=this.resolveRequestTimeoutMs(t),m=u>0?setTimeout(()=>{let p=this.pending.get(s);p&&(this.pending.delete(s),H("bridge.response",{id:s,kind:t,ok:!1,timedOut:!0}),p.reject(new Error(`Bridge request timed out after ${u}ms: ${t}`)))},u):null;m?.unref?.(),this.pending.set(s,{kind:t,timeout:m,resolve:p=>i(p),reject:c});try{r.send(G.stringifyMessage(o))}catch(p){let h=ee(p,"WebSocket send failed");this.clearPendingRequest(s),c(h),this.cleanupSocket(r,h,"failed")}})}handleAuthHandshakeMessage(t,n,r,s){try{if(G.parseMessage(t).type==="auth-ok"){s();return}throw new Error("Bridge authentication failed")}catch(o){let i=ee(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,i,"failed")}}handleMessage(t){let n=G.parseMessage(t);if(n.type==="event"){for(let s of this.listeners)s(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"){H("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}H("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Et(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Pe(n.payload.result.data)}: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):bt[t]??yt}cleanupSocket(t,n,r){if(this.socket===t&&(this.socket=null),this.connectAttempt?.socket===t){let s=this.connectAttempt;this.connectAttempt=null,s.settled||(s.settled=!0,s.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===gt||t.readyState===Ee)&&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 s of this.connectionStatusListeners)s(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)}},gt=0,Ee=1,yt=15e3,bt={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function ee(e,t){return e instanceof Error?e:new Error(t)}function St(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 Oe(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Et(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 Be(e){return new ve(e)}var ve=class{constructor(t){this.params=t,this.refreshInFlight=null,this.currentDocument=t.initialDocument,this.summaryCache=new Map(Object.entries(t.initialDetails??{}).map(([n,r])=>[n,Rt(r)])),this.editContextCache=new Map(Object.entries(t.initialDetails??{}).map(([n,r])=>[n,Ct(r)]))}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return vt(this.currentDocument)&&(this.currentDocument=await this.refreshSnapshot(void 0,"get-document")),{ok:!0,data:this.currentDocument}}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 getObjectSummary(t,n){let r=this.summaryCache.get(t);if(r)return{ok:!0,data:r};let s=await this.params.client.getObjectSummary(t,n??this.params.routeId);return this.summaryCache.set(t,s.data),s}async getObjectEditContext(t,n){let r=this.editContextCache.get(t);if(r)return{ok:!0,data:r};let s=await this.params.client.getObjectEditContext(t,n??this.params.routeId);return this.editContextCache.set(t,s.data),s}async getClassNameSource(t,n){return this.params.client.getClassNameSource(t,n??this.params.routeId)}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){return this.params.client.execute(t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t)}async undo(){return this.params.client.undo()}async redo(){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.refreshSnapshot(n.version,"event").catch(()=>{}).finally(()=>t(n));return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return H("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){H("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let s=await this.refreshInFlight;if(typeof t!="number"||s.version>=t||this.currentDocument.version>=t)return this.currentDocument}H("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(s=>(this.currentDocument=s.data,this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(){this.summaryCache.clear(),this.editContextCache.clear()}};function vt(e){return e.version===0&&e.rootKeys.length===0}function It(e,t,n){switch(t){case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-summary":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};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}}}}function Rt(e){return{key:e.key,tag:e.tag,label:e.label,capabilities:{constraints:e.capabilities.constraints},isOpaque:e.isOpaque,provenanceChain:e.provenanceChain?{editMode:e.provenanceChain.editMode,diagnostics:e.provenanceChain.diagnostics}:void 0,ancestors:e.ancestors}}function Ct(e){return{key:e.key,componentName:e.componentName,sourceFile:e.sourceFile,capabilities:e.capabilities,writeTarget:e.writeTarget,effectiveWriteTarget:e.effectiveWriteTarget,provenanceChain:e.provenanceChain,componentSemantic:e.componentSemantic,textSegments:e.textSegments,boundaryKind:e.boundaryKind,children:e.children,siblings:e.siblings}}var Fe="vcp-window-message";function _t(e){return{source:Fe,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function xt(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===Fe&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var Me="site-edit",Ke="frame-runtime";function te(e,t={}){return _t({namespace:Me,channel:Ke,sessionKey:t.sessionKey,body:e})}function qe(e){return!xt(e)||e.namespace!==Me||e.channel!==Ke?!1:typeof e.body?.type=="string"}var Ce="vcp-site-edit:route-ready",_e="vcp-site-edit:bridge-status",Tt=1e3,kt="data-vcp-ui-component",Ge="data-vcp-theme-preview",We="::repeat-item#",ae="components/ui",Nt=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),Dt=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function Pt(e,t=""){let n=Xe(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,s=r.startsWith("/")?r:`/${r}`;return s==="/"?"/":s.replace(/\/+$/,"")}function At(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 Ot(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 rr(e=window,t={}){let n=Ot(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Bt({bridgeUrl:n,options:t}),s=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(s?.started){if(Ft(s.signature,r)){await s.syncRoute?.();return}s.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},i,c=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===i,u=t.create_client??(d=>new ue({url:d,authKey:t.bridge_session_key})),m=t.schedule_after_navigation??Yt,p=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},h=()=>Pt(e.location.pathname,t.basePath||""),E=d=>{wt(e,d)},I=d=>{o.currentDocument=d,o.currentEntriesByKey=new Map((d?.entries??[]).map(g=>[g.key,g]))},T=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},R=(d,g)=>!o.disposed&&g===o.routeSequence&&d===h(),F=async(d,g)=>{let C=o.activeBridge;if(!C)return null;let _=await C.getDocument(d);return R(d,g)&&I(_.data),_.data},N=()=>{T(),I(null);let d=o.activeBridge;o.activeBridge=null,d&&e.__VCP_SITE_EDIT__===d&&delete e.__VCP_SITE_EDIT__;let g=o.activeClient;o.activeClient=null,g?.disconnect()},M=d=>d===i.routeId&&!!o.activeBridge&&!!(o.currentDocument&&Jt(o.currentDocument,d))&&zt(o.activeClient),ge=d=>Math.min(Tt*2**Math.max(0,d),8e3),J=(d,g,C)=>{if(o.disposed)return;p();let _=ge(C);E({state:"reconnecting",routeId:d,attempt:C,retryInMs:_,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||g!==o.routeSequence)&&ie(C+1).catch(f=>{let l=h();if(d===l){if(z(f)){E({state:"reload-required",routeId:d,attempt:C,messageKey:"studio.errors.previewBridgeReloadRequired"});return}J(d,o.routeSequence,C+1)}})},_)},X=(d,g,C)=>{if(!R(d,g)||o.activeClient===null)return;if(z(C.message)){N(),p(),E({state:"reload-required",routeId:d,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let _=o.activeClient;T(),I(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,_?.disconnect(),J(d,g,0)},se=d=>{let g=h(),C=o.routeSequence;if(!(!R(g,C)||o.activeClient===null)){if(z(d)){N(),p(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Je(d)&&X(g,C,{state:"failed",message:Te(d,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=Vt(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:d=>o.currentEntriesByKey.get(d)??null,onBridgeRequestError:d=>{se(d)}});let Q=async()=>ie(0),ie=async d=>{if(o.disposed)return;let g=h();if(M(g))return;let C=o.syncInFlight;if(C?.routeId===g)return C.promise;let _=o.routeSequence+1,f=ye(g,_,d);o.syncInFlight={routeId:g,sequence:_,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},ye=async(d,g,C)=>{o.routeSequence=g,p(),N(),E({state:C>0?"reconnecting":"connecting",routeId:d,attempt:C,messageKey:C>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let _=u(n),f=!1;o.activeClient=_,o.unsubscribeConnectionStatus=_.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&X(d,g,l)});try{if(await _.connect(),!R(d,g)){_.disconnect();return}let l=Be({routeId:d,client:_,initialDocument:Wt(d)});o.activeBridge=l,c()&&(e.__VCP_SITE_EDIT__=l),o.activeClient=_,o.unsubscribeDocument=l.subscribe(x=>{x.type==="site-edit.document.changed"&&x.routeId===d&&F(d,g).catch(()=>{})}),c()&&(i.routeId=d);let a=await F(d,g);if(!R(d,g)){_.disconnect();return}f=!0,E({state:"ready",routeId:d,attempt:C,messageKey:"studio.status.previewReady"}),At(e,{documentVersion:a?.version??0,routeId:d,versions:t.runtime_versions}),Gt(e,{routeId:d,version:a?.version??0})}catch(l){if(T(),o.activeClient===_&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,_.disconnect(),I(null),!R(d,g))return;throw E({state:z(l)?"reload-required":"failed",routeId:d,attempt:C,messageKey:z(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},be=d=>{if(o.disposed)return;let g=h();if(z(d)){p(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}J(g,o.routeSequence,0)},W=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,m(()=>{o.syncScheduled=!1,!o.disposed&&Q().catch(d=>be(d))}))},V=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,p(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),N(),c()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(i={started:!0,signature:r,syncRoute:Q,cleanup:V},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=i,o.unbindBootstrapLifecycle=Kt(e,V),o.unbindRouteChange=Ht(e,W,h),t.defer_initial_sync){W();return}await Q()}function Bt(e){return{basePath:Xe(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:Mt(e.options.bridge_session_key)}}function Ft(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Mt(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 Kt(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),qt(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function qt(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function Wt(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,rootKeys:[],entries:[]}}function Vt(e=window,t={}){let n=null,r=null,s=null,o=null,i=null,c=null,u=null,m=null,p=null,h=new Map,E=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,I=()=>{n?.(),n=null,r=null},T=()=>{s?.(),s=null,o?.(),o=null},R=(f,l,a)=>{let x=i?.sessionKey!==f||i?.sourceWindow!==l||i?.targetOrigin!==a;i={sessionKey:f,sourceWindow:l,targetOrigin:a},x&&(m=null,p=null)},F=(f,l)=>{let a=e.parent&&e.parent!==e?e.parent:null;return!a||l!==a?!1:!E||f===E},N=()=>{for(let f of h.values())f();h.clear()},M=f=>JSON.stringify([f.routeId,f.version]),ge=()=>!u||u.state==="ready",J=f=>JSON.stringify([f.state,f.routeId??null,f.attempt??null,f.retryInMs??null,f.messageKey??null]),X=f=>{if(!ge())return;let l=M(f);m!==l&&(o?.(),o=null,W({kind:"route-ready",payload:{routeId:f.routeId,version:f.version}}),i&&(m=l))},se=f=>{let l=J(f);p!==l&&(f.state!=="ready"&&(m=null,c=null),W({kind:"bridge-status",payload:f}),i&&(p=l))},Q=f=>{c=f,X(f)},ie=f=>{u=f,se(f)},ye=()=>{c&&X(c)},be=()=>{u&&se(u)},W=f=>{i&&i.sourceWindow.postMessage(te({type:"event",...f},{sessionKey:i.sessionKey}),i.targetOrigin)},V=(f,l,a,x)=>{let k=me(e.document,l.clientX,l.clientY,t.getCurrentDocument?.()??null),D=k?A(k,a==="full"?O(e.document,k,t.getCurrentDocument?.()??null):Ue(e.document,k,t.getCurrentDocument?.()??null),t.getDocumentEntry,a):null;x&&D&&(f==="pointer-click"||f==="pointer-double-click")&&(x.preventDefault(),x.stopPropagation(),typeof x.stopImmediatePropagation=="function"&&x.stopImmediatePropagation()),W({kind:f,payload:{clientX:l.clientX,clientY:l.clientY,buttons:Number(l.buttons??0),hit:D}})},d=(f,l,a)=>{T(),i={sessionKey:f,sourceWindow:l,targetOrigin:a};let x=Un(e.document),k=null,D=null,y=()=>{D=null;let b=k;k=null,b&&V("pointer-move",b,"summary")},B=b=>{k={clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},D===null&&(D=we(e,y))},$=b=>{V("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},w=b=>{V("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},j=b=>{V("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},Y=b=>{V("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Z=b=>{V("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},L=()=>{W({kind:"scroll",payload:{metrics:fe(e)}})};e.document.addEventListener("pointerdown",$,!0),e.document.addEventListener("pointermove",B,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",w,!0),e.document.addEventListener("pointercancel",j,!0),e.document.addEventListener("click",Y,!0),e.document.addEventListener("dblclick",Z,!0),e.addEventListener("scroll",L,{passive:!0}),s=()=>{D!==null&&(ze(e,D),D=null),k=null,x(),e.document.removeEventListener("pointerdown",$,!0),e.document.removeEventListener("pointermove",B,!0),e.document.removeEventListener("pointerup",w,!0),e.document.removeEventListener("pointercancel",j,!0),e.document.removeEventListener("click",Y,!0),e.document.removeEventListener("dblclick",Z,!0),e.removeEventListener("scroll",L)}},g=f=>{let l=f.detail;l?.routeId&&Q(l)},C=f=>{let l=f.detail;l?.state&&ie(l)},_=f=>{let l=f.data;if(!qe(l)||l.body.type!=="request"||l.body.kind!=="apply-node-patch"&&l.body.kind!=="get-hit-by-ref"&&l.body.kind!=="get-path-by-ref"&&l.body.kind!=="get-scroll-metrics"&&l.body.kind!=="scroll-to"&&l.body.kind!=="scroll-by"&&l.body.kind!=="set-interaction-mode"&&l.body.kind!=="set-theme-override"&&l.body.kind!=="clear-theme-override"&&l.body.kind!=="get-theme-variables"&&l.body.kind!=="compute-drop-target-at-point"&&l.body.kind!=="observe-node-bounds"&&l.body.kind!=="clear-node-bounds-observer"&&l.body.kind!=="restore-text-edit"&&l.body.kind!=="clear-text-edit-rollback"&&l.body.kind!=="start-text-edit-at-point"&&l.body.kind!=="hit-test-at-point"&&!Ve(l.body))return;let a=l.body,x=typeof l.sessionKey=="string"?l.sessionKey:null,k=f.source,D=f.origin;if(!x||!D||!k||typeof k.postMessage!="function"||!F(x,k))return;if(i){if(i.sourceWindow!==k||i.targetOrigin!==D)return;i.sessionKey!==x&&(I(),T(),N(),i=null)}R(x,k,D),be(),ye();let y=B=>{let $=typeof a.id=="string"?a.id:"unknown";k.postMessage(te({id:$,...B},{sessionKey:x}),D)};try{if(Ve(a)){jt({message:a,sendEvent:S=>{k.postMessage(te({type:"event",...S},{sessionKey:x}),D)},sendResponse:y,subscriptions:h,getCurrentDocument:t.getCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(a.kind==="apply-node-patch"){let S=U(e.document,a.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for patch target"});return}let v=a.payload.preview,P=v?kn(v.sessionId,a.payload.ref):null;if(P&&v){let ce=ne.get(P)??-1;if(v.revision<ce){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:v.revision,stale:!0,latestRevision:ce}});return}if(v.revision===ce){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:v.revision,duplicate:!0,latestRevision:ce}});return}}if(xn(S,a.payload.patch),P&&v&&Nn(P,v.revision),v?.responseDetail==="none"){y({type:"response",ok:!0,result:{applied:!0,appliedRevision:v.revision}});return}y({type:"response",ok:!0,result:A(S,O(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,v?.responseDetail??"full")});return}if(a.kind==="get-hit-by-ref"){let S=U(e.document,a.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:A(S,O(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(a.kind==="get-path-by-ref"){let S=U(e.document,a.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for path target"});return}let v=[],P=S;for(;P;)P.getAttribute("data-vcp-edit-key")&&v.push(A(P,O(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),P=P.parentElement;y({type:"response",ok:!0,result:v.reverse()});return}if(a.kind==="restore-text-edit"||a.kind==="clear-text-edit-rollback"){let S=a.payload.ref;if(a.kind==="clear-text-edit-rollback"){r&&je(r.ref,S)&&(r=null),y({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!je(r.ref,S)){y({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let v=Zt(e.document,r,t.getCurrentDocument?.()??null);r=null,y(v?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(a.kind==="get-scroll-metrics"){y({type:"response",ok:!0,result:fe(e)});return}if(a.kind==="scroll-to"){let S=Number(a.payload.x),v=Number(a.payload.y);if(!Number.isFinite(S)||!Number.isFinite(v)){y({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:S,top:v}),y({type:"response",ok:!0,result:fe(e)});return}if(a.kind==="scroll-by"){let S=Number(a.payload.deltaX),v=Number(a.payload.deltaY);if(!Number.isFinite(S)||!Number.isFinite(v)){y({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:S,top:v}),y({type:"response",ok:!0,result:{...fe(e),scrolled:!0}});return}if(a.kind==="set-interaction-mode"){a.payload.enabled?d(x,k,D):i?.sourceWindow===k&&i.targetOrigin===D&&i.sessionKey===x&&T(),y({type:"response",ok:!0,result:{interactionEnabled:a.payload.enabled}});return}if(a.kind==="set-theme-override"){Dn(e.document,a.payload),y({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(a.kind==="clear-theme-override"){Pn(e.document),y({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(a.kind==="get-theme-variables"){y({type:"response",ok:!0,result:An(e.document,a.payload.names)});return}if(a.kind==="compute-drop-target-at-point"){let S=Number(a.payload?.x),v=Number(a.payload?.y);if(!Number.isFinite(S)||!Number.isFinite(v)){y({type:"response",ok:!1,error:"Invalid drop target point"});return}y({type:"response",ok:!0,result:bn(e,S,v,a.payload.dragKind,a.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(a.kind==="observe-node-bounds"){let S=a.payload.ref;if(!S){y({type:"response",ok:!1,error:"Missing bounds observer target"});return}let v=U(e.document,S,t.getCurrentDocument?.()??null);if(!v){y({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=mn(e,v,S,t.getDocumentEntry,P=>W({kind:"node-bounds-change",payload:{hit:P}})),y({type:"response",ok:!0,result:{observing:!0}}),W({kind:"node-bounds-change",payload:{hit:A(v,S,t.getDocumentEntry,"summary")}});return}if(a.kind==="clear-node-bounds-observer"){o?.(),o=null,y({type:"response",ok:!0,result:{cleared:!0}});return}if(a.kind!=="hit-test-at-point"&&a.kind!=="start-text-edit-at-point")return;let B=Number(a.payload?.x),$=Number(a.payload?.y);if(!Number.isFinite(B)||!Number.isFinite($)){y({type:"response",ok:!1,error:"Invalid text edit point"});return}let w=a.kind==="hit-test-at-point"?me(e.document,B,$,t.getCurrentDocument?.()??null):en(e.document,B,$,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!w){y({type:"response",ok:!1,error:a.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let j=a.kind==="start-text-edit-at-point"?w:null,Y=a.kind==="hit-test-at-point"?w:j.element,Z=a.payload.detailLevel??"full",L=Z==="full"?O(e.document,Y,t.getCurrentDocument?.()??null):Ue(e.document,Y,t.getCurrentDocument?.()??null),b=j&&typeof j.textSegmentIndex=="number"?{...L,textSegmentIndex:j.textSegmentIndex}:L,ut=A(Y,b,t.getDocumentEntry,Z);if(a.kind==="hit-test-at-point"){y({type:"response",ok:!0,result:ut});return}I(),n=Mn(e,Y,b,S=>{k.postMessage(te({type:"event",...S},{sessionKey:x}),D)},{...j?.textNode?{textNode:j.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",_),e.addEventListener(Ce,g),e.addEventListener(_e,C),()=>{I(),T(),i=null,N(),e.removeEventListener("message",_),e.removeEventListener(Ce,g),e.removeEventListener(_e,C)}}function Ve(e){let t=e.kind;return t==="bridge-get-document"||t==="bridge-ensure-document-version"||t==="bridge-get-object-summary"||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"}async function jt({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:s,onBridgeRequestError:o,windowLike:i}){let c=i.__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-get-document":n({type:"response",ok:!0,result:await c.getDocument(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}n({type:"response",ok:!0,result:c.ensureDocumentVersion?await c.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await c.getDocument(e.payload.routeId)});return;case"bridge-get-object-summary":n({type:"response",ok:!0,result:await c.getObjectSummary(e.payload.key,e.payload.routeId)});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 u=await c.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Ut(u,e.payload.key,i.document,s?.()??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":n({type:"response",ok:!0,result:await c.execute(e.payload.request)});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 u=e.payload.subscriptionId;r.get(u)?.();let m=c.subscribe(p=>{t({kind:"bridge-event",payload:{event:p,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){o?.(u,e),n({type:"response",ok:!1,error:Xt(u)})}}function Ut(e,t,n,r){if(!e.ok||!e.data.styleContext)return e;let s=U(n,{key:t},r),o=s?$t(s):null;return o?{...e,data:{...e.data,styleContext:{...e.data.styleContext,computedStyle:{...e.data.styleContext.computedStyle??{},...o}}}}:e}function $t(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 Ht(e,t,n=()=>e.location.pathname){let r=e.history.pushState,s=e.history.replaceState,o=n(),i=()=>{let m=n();m!==o&&(o=m,t())},c=()=>i(),u=()=>i();return e.history.pushState=function(...p){let h=r.apply(this,p);return i(),h},e.history.replaceState=function(...p){let h=s.apply(this,p);return i(),h},e.addEventListener("popstate",c),e.addEventListener("hashchange",u),()=>{e.history.pushState=r,e.history.replaceState=s,e.removeEventListener("popstate",c),e.removeEventListener("hashchange",u)}}function Yt(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function we(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function ze(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function Gt(e,t){e.dispatchEvent(new CustomEvent(Ce,{detail:t}))}function wt(e,t){e.dispatchEvent(new CustomEvent(_e,{detail:t}))}function zt(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function Jt(e,t){return e.routeId===t}function Te(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Je(e){let t=Te(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function Xt(e){let t=Te(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Je(t)?"Site edit bridge disconnected":t}function z(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 Xe(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function ke(e){return Nt.has(Ze(e))}function Qt(e){return Dt.has(Ze(e))}function Qe(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:Qt(e.tagName),canInsertChild:ke(e.tagName),canMove:!1,canRemove:!1}}function Ze(e){return e?.trim().toLowerCase()??""}function je(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 Zt(e,t,n){let r=U(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let s=Lt(r,t.ref.textSegmentIndex);return s?(s.nodeValue=t.initialText,!0):!1}return typeof t.initialHtml=="string"?(r.innerHTML=t.initialHtml,!0):(r.textContent=t.initialText,!0)}function Lt(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!pe(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function en(e,t,n,r,s){let o=me(e,t,n,r),i=Le(o);if(!i)return null;let c=i.getAttribute("data-vcp-edit-key")??"",u=O(e,i,r),m=s?.(u.key)??s?.(c);if(!Qe({operationSummary:m?.operationSummary,tagName:i.tagName,fallbackMode:"preview"}).canUpdateText)return null;let h=tn(e,t,n,i);if(h){let E=rn(i,h);if(E!==null)return{element:i,textNode:h,textSegmentIndex:E}}return(m?.childKeys.length??0)===0?{element:i}:null}function tn(e,t,n,r){let s=nn(e,t,n);return!s||s.parentElement!==r?null:s}function nn(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(pe(o))return o;let c=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return pe(c)?c:null}function rn(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!pe(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function pe(e){return e?.nodeType===3}function me(e,t,n,r=null){let s=typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean);for(let o of s){let i=Le(o),c=i?.getAttribute("data-vcp-edit-key")??"";if(i&&an(i,r,c))return i}return null}function Le(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Ne(t))return n??t;!on(r)&&!n&&(n=t)}t=t.parentElement}return n}function Ne(e){return e.getAttribute(kt)!==null}function on(e){return sn(e.split("::")[0]??"")}function sn(e){if(!e)return!1;let t=cn(e);return t===ae||t.startsWith(`${ae}/`)||t.includes(`/${ae}/`)||t.endsWith(`/${ae}`)}function cn(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let s of n.split("/"))if(!(!s||s===".")){if(s===".."){r.pop();continue}r.push(s)}return r.join("/")}function O(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",s=et(nt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${ct(r)}"]`))),n,r);if(s.length<=1)return{key:$e(n,r,0)};let o=s.indexOf(t);return o>=0?{key:$e(n,r,o),instanceIndex:o,instanceCount:s.length}:{key:r}}function Ue(e,t,n){return O(e,t,n)}function U(e,t,n){let r=oe(t.key)??t.key,s=et(nt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${ct(r)}"]`))),n,t.key);if(s.length===0)return null;let o=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<s.length?t.instanceIndex:null,i=(oe(t.key)??t.key)!==t.key;if(o!==null&&!i)return s[o]??null;let c=un(n,t.key);return c!==null&&c>=0&&c<s.length?s[c]??null:o!==null?s[o]??null:s[0]??null}function $e(e,t,n){return De(e,t)[n]?.key??t}function un(e,t){let n=oe(t);if(!n)return null;let s=De(e,n).findIndex(o=>o.key===t);return s>=0?s:null}function De(e,t){return(e?.entries??[]).filter(n=>(oe(n.key)??n.key)===t)}function et(e,t,n){let r=tt(t,n);return r?e.filter(s=>s.tagName.toLowerCase()===r):e}function an(e,t,n){let r=tt(t,n);return!r||e.tagName.toLowerCase()===r}function tt(e,t){let n=oe(t)??t,s=(e?.entries.find(o=>o.key===t)??De(e,n)[0])?.tag.trim();return!s||s!==s.toLowerCase()?null:s}var ln=2,dn=4;function nt(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&dn)!==0?-1:(r&ln)!==0?1:0})}function oe(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 fn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=s=>{let o=Number.parseFloat(s??"");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 pn(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>yn(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}function A(e,t,n,r="full"){let s=e.getBoundingClientRect(),o=n?.(t.key)??null,i=e.tagName.toLowerCase(),c=he(e),u=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([I,T])=>[I,T??""])),attributes:Object.fromEntries(e.getAttributeNames().map(I=>[I,e.getAttribute(I)??""]))}:{},m=Qe({operationSummary:o?.operationSummary,tagName:i,fallbackMode:"preview"}),p=Ne(e),h=!!(o&&/^[A-Z]/.test(o.tag)),E=!o||!h;return{ref:t,key:t.key,detailLevel:r,tagName:i,...o?{sourceKind:h?"component-call":"jsx"}:{},...h&&o?.tag?{componentName:o.tag}:{},...o?.parentKey?{parentKey:o.parentKey}:{},...u,runtimeFlags:{selectable:!0,movable:m.canMove,removable:m.canRemove,textEditable:m.canUpdateText,container:p?!1:(o?.childKeys.length??0)>0||m.canInsertChild||E&&ke(i)},layout:c,rect:{top:s.top,left:s.left,width:s.width,height:s.height},childRects:pn(e),spacing:fn(e)}}function mn(e,t,n,r,s){let o=A(t,n,r,"summary"),i=null,c=()=>{i===null&&(i=we(e,u))},u=()=>{if(i=null,"isConnected"in t&&!t.isConnected)return;let T=A(t,n,r,"summary");hn(o,T)&&(o=T,s(T))},m=e.ResizeObserver,p=typeof m=="function"?new m(c):null;p?.observe(t);let h=e.MutationObserver,E=typeof h=="function"?new h(c):null;E?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",c,{passive:!0});let I=e.visualViewport;return I?.addEventListener?.("resize",c,{passive:!0}),e.document.addEventListener("load",c,!0),()=>{i!==null&&(ze(e,i),i=null),p?.disconnect(),E?.disconnect(),e.removeEventListener("resize",c),I?.removeEventListener?.("resize",c),e.document.removeEventListener("load",c,!0)}}function hn(e,t){return rt(e.rect,t.rect)||gn(e.childRects,t.childRects)||He(e.spacing,t.spacing)||He(e.layout,t.layout)}function gn(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((s,o)=>rt(s,r[o]??s))}function He(e,t){let n=e??{},r=t??{},s=new Set([...Object.keys(n),...Object.keys(r)]);return Array.from(s).some(o=>n[o]!==r[o])}function yn(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function rt(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 bn(e,t,n,r,s,o,i){let c=e.document,u=me(c,t,n,o);if(!u)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let m=s?U(c,s,o):null;if(m&&xe(u,m))return le(c,u,"self-or-descendant",o,i);if(r==="move"&&m){let R=In(c,u,m,o,i);if(R){let F=Ie(R.child,R.targetParent,t,n,"nearest");if(F)return de(c,R.child,R.targetParent,F,o,i)}}let p=null,h=!1,E=u,I=u.parentElement;for(;I;){if(I.getAttribute("data-vcp-edit-key")){if(m&&xe(I,m))return le(c,u,"self-or-descendant",o,i);let R=Ye(I,r,i);if(R==="accept"){p={child:E,targetParent:I};break}R==="blocked"&&(h=!0),E=I}I=I.parentElement}let T=Ye(u,r,i);if(T==="accept"){if(p){let R=Ie(p.child,p.targetParent,t,n,"edge");if(R)return de(c,p.child,p.targetParent,R,o,i)}return de(c,u,u,Sn(u,t,n),o,i)}if(p){let R=Ie(p.child,p.targetParent,t,n,"nearest");return de(c,p.child,p.targetParent,R??"after",o,i)}return T==="blocked"||h?le(c,u,"operation-boundary-blocked",o,i):le(c,u,"no-accepting-parent",o,i)}function le(e,t,n,r,s){return{anchorHit:A(t,O(e,t,r),s,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function de(e,t,n,r,s,o){let i=A(t,O(e,t,s),o,"summary"),c=A(n,O(e,n,s),o,"summary"),u=he(n).indicatorOrientation,m=r==="append"||r==="prepend"?En(n.getBoundingClientRect(),u,r):vn(t.getBoundingClientRect(),u,r);return{anchorHit:i,targetParentHit:c,relation:r,indicatorOrientation:u,indicatorBounds:m}}function Ye(e,t,n){if(Ne(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",s=n?.(r)??null;if(s)return s.operationSummary.canInsertChild===!0?"accept":s.childKeys.length>0?"blocked":"not-container";let o=e.tagName.toLowerCase();return ke(o)?"accept":"not-container"}function Ie(e,t,n,r,s){let o=he(t).indicatorOrientation,i=e.getBoundingClientRect(),c=o==="vertical"?i.width>0?(n-i.left)/i.width:.5:i.height>0?(r-i.top)/i.height:.5;return s==="edge"&&c>=.25&&c<=.75?null:c<.5?"before":"after"}function Sn(e,t,n){let r=he(e).indicatorOrientation,s=e.getBoundingClientRect();return(r==="vertical"?s.width>0?(t-s.left)/s.width:.5:s.height>0?(n-s.top)/s.height:.5)<.5?"prepend":"append"}function he(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=n?.display??"",s=n?.flexDirection,o=n?.gridAutoFlow,i="horizontal";return r==="flex"||r==="inline-flex"?i=(s??"row").startsWith("row")?"vertical":"horizontal":(r==="grid"||r==="inline-grid")&&(i=(o??"row").includes("column")?"vertical":"horizontal"),{display:r,...s?{flexDirection:s}:{},...o?{gridAutoFlow:o}:{},indicatorOrientation:i}}function En(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 vn(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 xe(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function In(e,t,n,r,s){let o=Rn(e,t,n,r,s);if(o)return o;let i=_n(n);if(!i||t===i)return null;let c=t,u=t.getAttribute("data-vcp-edit-key")?t:null;for(;c&&c!==i;)c.getAttribute("data-vcp-edit-key")&&(u=c),c=c.parentElement;return c!==i||!u||u===i||u===n||xe(u,n)?null:{child:u,targetParent:i}}function Rn(e,t,n,r,s){if(!s)return null;let o=O(e,n,r),c=s(o.key)?.parentKey??null;if(!c)return null;let m=O(e,t,r).key;for(;m;){let p=s(m);if(!p?.parentKey)return null;if(p.parentKey===c){if(m===o.key||Cn(m,o.key,s))return null;let h=U(e,{key:m},r),E=U(e,{key:c},r);return h&&E?{child:h,targetParent:E}:null}m=p.parentKey}return null}function Cn(e,t,n){let r=e;for(;r;){if(r===t)return!0;r=n(r)?.parentKey}return!1}function _n(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function fe(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:q(e.scrollX),scrollY:q(e.scrollY),scrollWidth:Math.max(q(t?.scrollWidth),q(n?.scrollWidth),q(e.innerWidth)),scrollHeight:Math.max(q(t?.scrollHeight),q(n?.scrollHeight),q(e.innerHeight)),viewportWidth:q(e.innerWidth),viewportHeight:q(e.innerHeight)}}function xn(e,t){Object.entries(t.attributes??{}).forEach(([r,s])=>{if(s===null){e.removeAttribute(r);return}e.setAttribute(r,s)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,s])=>{if(n.has(r))return;let o=e.style,i=r.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`);if(s==null||s===""){o.removeProperty(i);return}o.setProperty(i,String(s))}),t.styleDeclarations?.forEach(r=>{let s=e.style,o=r.property.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`),i=r.value;if(i==null||i===""){s.removeProperty(o);return}s.setProperty(o,String(i),r.priority)})}var Tn=500,ne=new Map;function kn(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Nn(e,t){if(ne.size>=Tn){let n=ne.keys().next().value;n&&ne.delete(n)}ne.set(e,t)}var re=new Set;function Dn(e,t){let n=e.documentElement?.style,r=new Set;for(let[s,o]of Object.entries(t.variables??{}))s.startsWith("--")&&(r.add(s),n?.setProperty(s,o));for(let s of re)r.has(s)||n?.removeProperty(s);re.clear();for(let s of r)re.add(s);Fn(e,t.stylesheets??[])}function Pn(e){let t=e.documentElement?.style;for(let n of re)t?.removeProperty(n);re.clear();for(let n of it(e))n.remove()}function An(e,t){let n=Array.from(new Set(t.filter(i=>typeof i=="string"&&i.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,s=r?e.defaultView?.getComputedStyle(r):null,o={};for(let i of n){let c=ot(s,i);c&&(o[i]=c)}return o}function ot(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return st(e,r,n)}function st(e,t,n){if(!t)return null;let r=On(t);if(!r)return t;let s=ot(e,r.name,n);return s||(r.fallback?st(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=Bn(n),s=r>=0?n.slice(0,r).trim():n;if(!s.startsWith("--"))return null;let o=r>=0?n.slice(r+1).trim():null;return{name:s,fallback:o||null}}function Bn(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 Fn(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of it(e)){let i=o.getAttribute("href")??"";if(!n.has(i)||r.has(i)){o.remove();continue}r.set(i,o)}let s=e.head;if(s)for(let o of n){if(r.has(o))continue;let i=e.createElement("link");i.setAttribute("rel","stylesheet"),i.setAttribute(Ge,"true"),i.setAttribute("href",o),s.appendChild(i)}}function it(e){return Array.from(e.querySelectorAll(`link[${Ge}]`))}function Mn(e,t,n,r,s={}){let o=s.textNode?Kn(e.document,s.textNode):null;if(s.textNode&&!o)throw new Error("Failed to prepare text segment editor");let i=o?.element??t,c=i.textContent??"",u=o?void 0:t.innerHTML,m=qn(i),p=!1,h=()=>{e.document.removeEventListener("pointerdown",I,!0),i.removeEventListener("keydown",T),i.removeEventListener("blur",R),i.removeEventListener("input",F),Vn(i,m)},E=N=>{if(p)return;p=!0;let M=i.textContent??"";if(h(),N==="cancel"){o?.restore(c),o||(t.textContent=c),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(M),N==="commit"&&M!==c){s.onCommitSnapshot?.({ref:n,initialText:c,...u!==void 0?{initialHtml:u}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:M}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function I(N){let M=N.target;M&&i.contains(M)||E("commit")}function T(N){if(N.key==="Escape"){N.preventDefault(),E("cancel");return}N.key==="Enter"&&(N.metaKey||N.ctrlKey)&&(N.preventDefault(),E("commit"))}function R(){E("commit")}function F(){r({kind:"text-edit-input",payload:{ref:n,hit:A(t,n,void 0,"full")}})}return Wn(i),e.document.addEventListener("pointerdown",I,!0),i.addEventListener("keydown",T),i.addEventListener("blur",R),i.addEventListener("input",F),$n(i),Hn(i,e.document),h}function Kn(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(s){t.nodeValue=s,r.parentNode&&r.parentNode.replaceChild(t,r)}}}function qn(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 Wn(e){jn(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 Vn(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 jn(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 Un(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 $n(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 ct(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function q(e){let t=Number(e);return Number.isFinite(t)?t:0}export{_e as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,Ce as VCP_SITE_EDIT_ROUTE_READY_EVENT,Pt as resolveSiteEditRouteId,Ot as resolveSiteEditWebSocketUrl,rr as startSiteEditAutoBootstrap,Vt as startSiteEditFrameRuntime};
1
+ function Ee(e){if(!mt(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=i=>{let o=t.get(i);if(o)return o;let s=e.nodes[i];if(!s)throw new Error(`Missing compact document node ${i}`);let[u,c]=s,a=e.tokens[c];if(typeof a!="string")throw new Error(`Missing compact document token ${c}`);let h=`${u===null?"":r(u)}${a}`;return t.set(i,h),h};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map(i=>{let[o,s,u]=i,c=u===void 0?void 0:n[u];if(u!==void 0&&!c)throw new Error(`Missing page composition unit ${u}`);return{key:r(o),...c?{pageCompositionUnitKey:c}:{},operationSummary:ht(s)}})}}function ht(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function mt(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}var w=class e{constructor(){}static parseMessage(t,n={}){let r=JSON.parse(t);if(!e.isMessage(r,n))throw new Error("Invalid site edit bridge message");return r}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(typeof t=="object"&&t!==null&&"payload"in t&&typeof t.payload=="object"&&t.payload!==null){let n=t.payload,r=typeof n.id=="string"?n.id:"unknown",i=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:i}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="initialize-session"||t==="get-document"||t==="get-history-status"||t==="get-style-context"||t==="get-object-edit-context"||t==="get-class-name-source"||t==="get-source-tree"||t==="get-source-file"||t==="resolve-source-location"||t==="execute"||t==="undo"||t==="redo"}static isMessage(t,n={}){return!M(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?M(t.payload)&&typeof t.payload.id=="string":t.type==="event"?M(t.payload)&&M(t.payload.event):t.type==="auth"?M(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?M(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!M(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"initialize-session":return typeof t.routeId=="string"&&(t.mutationContext===void 0||Ie(t.mutationContext));case"get-document":case"get-style-context":return typeof t.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof t.key=="string"&&(t.routeId===void 0||typeof t.routeId=="string");case"get-history-status":return t.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return gt(t.request)&&(t.request.mutationContext===void 0||Ie(t.request.mutationContext))&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return t.mutationContext===void 0||Ie(t.mutationContext)}}};function M(e){return typeof e=="object"&&e!==null}function gt(e){return M(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&(e.routeId===void 0||typeof e.routeId=="string")&&typeof e.kind=="string"&&M(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&M(e.params)}function Ie(e){return yt(e)}function yt(e){return M(e)?typeof e.editingSessionId=="string"&&e.editingSessionId.length>0&&typeof e.lockId=="string"&&e.lockId.length>0&&typeof e.ownerId=="string"&&e.ownerId.length>0&&typeof e.leaseAssertion=="string"&&e.leaseAssertion.length>0:!1}var bt="vcp:designer:trace",St="designer_trace",Fe="__VCP_DESIGNER_TRACE__";var Et=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function It(e=globalThis){let t=e;try{if(t.localStorage?.getItem(bt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(St)==="1"}catch{return!1}}function j(e,t={},n=globalThis){if(!It(n))return;let r={type:e,timestamp:Date.now(),payload:vt(t)},i=n,o=i[Fe]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[Fe]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function vt(e){return ve(e,0)}function ve(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>ve(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Et.test(r)){n[r]="[redacted]";continue}n[r]=ve(i,t+1)}return n}var se=class{constructor(t){this.options=t,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===Ce&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((t,n)=>{let r;try{r=this.createSocket(this.options.url)}catch(u){let c=L(u,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),n(c);return}let i={socket:r,settled:!1,reject:n};this.connectAttempt=i,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==i||(i.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},s=(u,c)=>{this.cleanupSocket(r,u,c)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(w.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(u){s(L(u,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=u=>{if(this.socket!==r)return;let c=L(u,"WebSocket failed");s(c,"failed")},r.onmessage=u=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(u.data,r,i,()=>{o()});return}this.handleMessage(u.data)}},r.onclose=u=>{if(this.socket!==r)return;let c=this.intentionalClose,a=new Error(Rt(u,{intentional:c}));s(a,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){return this.request("get-document",{routeId:t})}initializeSession(t){return this.request("initialize-session",t)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(t){return this.request("get-style-context",{routeId:t})}getObjectEditContext(t,n){return this.request("get-object-edit-context",{key:t,routeId:n})}getClassNameSource(t,n){return this.request("get-class-name-source",{key:t,routeId:n})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(t){return this.request("get-source-file",t)}resolveSourceLocation(t){return this.request("resolve-source-location",t)}execute(t,n){return this.request("execute",{request:t})}undo(t){return this.request("undo",{})}redo(t){return this.request("redo",{})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==Ce||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${r?.readyState??"none"})`));let i=`${t}-${this.sequence+=1}`,o=Dt(i,t,n);return j("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:Be(n.request,"kind"),documentVersion:Be(n.request,"documentVersion")}),new Promise((s,u)=>{let c=this.resolveRequestTimeoutMs(t),a=c>0?setTimeout(()=>{let h=this.pending.get(i);h&&(this.pending.delete(i),j("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),h.reject(new Error(`Bridge request timed out after ${c}ms: ${t}`)))},c):null;a?.unref?.(),this.pending.set(i,{kind:t,timeout:a,resolve:h=>s(h),reject:u});try{r.send(w.stringifyMessage(o))}catch(h){let m=L(h,"WebSocket send failed");this.clearPendingRequest(i),u(m),this.cleanupSocket(r,m,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(w.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=L(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=w.parseMessage(t);if(n.type==="event"){for(let i of this.listeners)i(n.payload.event);return}if(n.type!=="response"&&n.type!=="error")return;let r=this.pending.get(n.payload.id);if(r){if(this.clearPendingRequest(n.payload.id),n.type==="error"){j("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}j("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Tt(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Ee(n.payload.result.data)}:r.kind==="initialize-session"?kt(n.payload.result):n.payload.result)}}rejectAll(t){for(let[n,r]of[...this.pending])this.clearPendingRequest(n),r.reject(t)}clearPendingRequest(t){let n=this.pending.get(t);n&&(n.timeout&&clearTimeout(n.timeout),this.pending.delete(t))}resolveRequestTimeoutMs(t){let n=this.options.requestTimeoutMsByKind?.[t];return typeof n=="number"?Math.max(0,n):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):_t[t]??xt}cleanupSocket(t,n,r){if(this.socket===t&&(this.socket=null),this.connectAttempt?.socket===t){let i=this.connectAttempt;this.connectAttempt=null,i.settled||(i.settled=!0,i.reject(n))}this.connectPromise=null,this.rejectAll(n),this.setConnectionState(r,n.message),t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null;try{(t.readyState===Ct||t.readyState===Ce)&&t.close()}catch{}}setConnectionState(t,n){if(this.connectionState===t&&!n)return;this.connectionState=t;let r={state:t,...n?{message:n}:{}};this.options.onConnectionStatus?.(r);for(let i of this.connectionStatusListeners)i(r)}createSocket(t){if(this.options.createSocket)return this.options.createSocket(t);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(t)}},Ct=0,Ce=1,xt=15e3,_t={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function L(e,t){return e instanceof Error?e:new Error(t)}function Rt(e,t){return t.intentional?"WebSocket disconnected":e?.code===1008?e.reason?`Bridge session authentication failed: ${e.reason}`:"Bridge session authentication failed":e?.reason?`WebSocket closed: ${e.reason}`:typeof e?.code=="number"&&e.code!==1005?`WebSocket closed with code ${e.code}`:"WebSocket closed"}function Be(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Tt(e){if(!e||typeof e!="object")return null;let t=e,n=t.data?.resultVersion??t.data?.version??null;return typeof n=="number"?n:null}function Oe(e){return new xe(e)}var xe=class{constructor(t){this.params=t,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!Me(t.initialDocument)}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=Me(this.currentDocument);return(n||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(n?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(t){if(t.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let n=await this.params.client.initializeSession(t);return this.currentDocument=n.data.document,this.observedDocumentVersion=n.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),n}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=this.styleContextCache;if(n?.generation===this.styleGeneration)return{ok:!0,data:n.value};let r=this.styleContextInFlight;if(r?.generation===this.styleGeneration)return r.request;let i=this.styleGeneration,o=this.params.client.getStyleContext(t).then(s=>(this.styleGeneration===i&&(this.styleContextCache={generation:i,value:s.data}),s)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:i,request:o},o}async ensureDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let r=await this.refreshSnapshot(n,"ensure-version");if(r.version<n)throw new Error(`Document refresh returned version ${r.version}, expected at least ${n}`);return{ok:!0,data:r}}async acknowledgeDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return n>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.objectCacheKey(t,n),i=this.editContextCache.get(r);if(i)return{ok:!0,data:i};let o=this.editContextInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getObjectEditContext(t,n??this.params.routeId).then(c=>(this.objectGeneration===s&&this.editContextCache.set(r,c.data),c)).finally(()=>{this.editContextInFlight.get(r)===u&&this.editContextInFlight.delete(r)});return this.editContextInFlight.set(r,u),u}async getClassNameSource(t,n){let r=this.objectCacheKey(t,n),i=this.classNameSourceCache.get(r);if(i)return i;let o=this.classNameSourceInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getClassNameSource(t,n??this.params.routeId).then(c=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,c),c)).finally(()=>{this.classNameSourceInFlight.get(r)===u&&this.classNameSourceInFlight.delete(r)});return this.classNameSourceInFlight.set(r,u),u}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(t){return this.params.client.getSourceFile(t)}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({...t,routeId:t.routeId??this.params.routeId})}async execute(t,n){let r=t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t;return this.params.client.execute(r)}async undo(t){return this.params.client.undo()}async redo(t){return this.params.client.redo()}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&n.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n.version),n.version>this.currentDocument.version&&this.clearObjectCaches(),t(n);return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let i=await this.refreshInFlight;if(typeof t!="number"||i.version>=t||this.currentDocument.version>=t)return this.currentDocument}j("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let r=this.params.client.getDocument(this.params.routeId).then(i=>(this.currentDocument=i.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,i.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(t){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!t?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(t,n){return`${n??this.params.routeId}\0${t}`}};function Me(e){return e.version===0&&e.entries.length===0}function kt(e){let t=e;return{...t,data:{...t.data,document:Ee(t.data.document)}}}function Dt(e,t,n){switch(t){case"initialize-session":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId),...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-history-status":return{type:"request",payload:{id:e,kind:t}};case"get-style-context":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:e,kind:t}};case"get-source-file":return{type:"request",payload:{id:e,kind:t,path:String(n.path)}};case"resolve-source-location":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"execute":return{type:"request",payload:{id:e,kind:t,request:n.request}};case"undo":case"redo":return{type:"request",payload:{id:e,kind:t,mutationContext:n.mutationContext}}}}var qe="vcp-window-message";function Nt(e){return{source:qe,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function At(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===qe&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var Ke="site-edit",Ve="frame-runtime";function ee(e,t={}){return Nt({namespace:Ke,channel:Ve,sessionKey:t.sessionKey,body:e})}function Ue(e){return!At(e)||e.namespace!==Ke||e.channel!==Ve?!1:typeof e.body?.type=="string"}var Te="vcp-site-edit:route-ready",ke="vcp-site-edit:bridge-status",Pt=1e3,Ft="data-vcp-ui-component",Ye="data-vcp-theme-preview",We="::repeat-item#",ue="components/ui",Bt=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),Mt=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function Ot(e,t=""){let n=Le(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function qt(e,t){if(e.__VCP_SITE_EDIT_VERSION_LOGGED__)return;let n=e.console?.info;typeof n=="function"&&(e.__VCP_SITE_EDIT_VERSION_LOGGED__=!0,n.call(e.console,"[VCP Site Edit] runtime loaded",{bridge:t.versions?.bridge??"unknown",contracts:t.versions?.contracts??"unknown",documentVersion:t.documentVersion,engine:t.versions?.engine??"unknown",routeId:t.routeId}))}function Kt(e,t={}){if(t.explicit_ws_url)return t.explicit_ws_url.startsWith("/")?`${e.location.protocol==="https:"?"wss:":"ws:"}//${e.location.host}${t.explicit_ws_url}`:t.explicit_ws_url;let n=e.location.protocol==="https:"?"wss:":"ws:",r=t.port?`${e.location.hostname}:${t.port}`:e.location.host;return`${n}//${r}${t.path??"/__vcp/site-edit/bridge"}`}async function sr(e=window,t={}){let n=Kt(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Vt({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(Ut(i.signature,r)){await i.syncRoute?.();return}i.cleanup?.()}let o={activeClient:null,activeBridge:null,cleanupFrameRuntime:(()=>{}),retryTimer:void 0,routeSequence:0,syncInFlight:null,syncScheduled:!1,disposed:!1,currentDocument:null,currentEntriesByKey:new Map,unsubscribeDocument:void 0,unsubscribeConnectionStatus:void 0,unbindBootstrapLifecycle:void 0,unbindRouteChange:void 0},s,u=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,c=t.create_client??(p=>new se({url:p,authKey:t.bridge_session_key})),a=t.schedule_after_navigation??Qt,h=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},m=()=>Ot(e.location.pathname,t.basePath||""),_=!!e.parent&&e.parent!==e,E=p=>{Zt(e,p)},R=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(g=>[g.key,g]))},C=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},N=(p,g)=>!o.disposed&&g===o.routeSequence&&p===m(),T=async(p,g)=>{let x=o.activeBridge;if(!x)return null;let d=await x.getDocument(p);return N(p,g)&&R(d.data),d.data},A=()=>{C(),R(null);let p=o.activeBridge;o.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let g=o.activeClient;o.activeClient=null,g?.disconnect()},ge=p=>p===s.routeId&&!!o.activeBridge&&(_||!!(o.currentDocument&&en(o.currentDocument,p)))&&Lt(o.activeClient),ye=p=>Math.min(Pt*2**Math.max(0,p),8e3),G=(p,g,x)=>{if(o.disposed)return;h();let d=ye(x);E({state:"reconnecting",routeId:p,attempt:x,retryInMs:d,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||g!==o.routeSequence)&&re(x+1).catch(f=>{let l=m();if(p===l){if(Y(f)){E({state:"reload-required",routeId:p,attempt:x,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(p,o.routeSequence,x+1)}})},d)},J=(p,g,x)=>{if(!N(p,g)||o.activeClient===null)return;if(Y(x.message)){A(),h(),E({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let d=o.activeClient;C(),R(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,d?.disconnect(),G(p,g,0)},be=p=>{let g=m(),x=o.routeSequence;if(!(!N(g,x)||o.activeClient===null)){if(Y(p)){A(),h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Ze(p)&&J(g,x,{state:"failed",message:Ne(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=wt(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:R,onBridgeRequestError:p=>{be(p)}});let X=async()=>re(0),re=async p=>{if(o.disposed)return;let g=m();if(ge(g))return;let x=o.syncInFlight;if(x?.routeId===g)return x.promise;let d=o.routeSequence+1,f=Se(g,d,p);o.syncInFlight={routeId:g,sequence:d,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},Se=async(p,g,x)=>{o.routeSequence=g,h(),A(),E({state:x>0?"reconnecting":"connecting",routeId:p,attempt:x,messageKey:x>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let d=c(n),f=!1;o.activeClient=d,o.unsubscribeConnectionStatus=d.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&J(p,g,l)});try{if(await d.connect(),!N(p,g)){d.disconnect();return}let l=Oe({routeId:p,client:d,initialDocument:zt(p)});o.activeBridge=l,u()&&(e.__VCP_SITE_EDIT__=l),o.activeClient=d,o.unsubscribeDocument=l.subscribe(k=>{k.type==="site-edit.document.changed"&&k.routeId===p&&o.currentDocument&&k.version>o.currentDocument.version&&T(p,g).catch(()=>{})}),u()&&(s.routeId=p);let v=(_?null:await l.initializeSession({routeId:p}))?.data.document??null;if(v&&R(v),!N(p,g)){d.disconnect();return}f=!0,E({state:"ready",routeId:p,attempt:x,messageKey:"studio.status.previewReady"}),qt(e,{documentVersion:v?.version??0,routeId:p,versions:t.runtime_versions}),v&&Qe(e,{routeId:p,version:v.version})}catch(l){if(C(),o.activeClient===d&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,d.disconnect(),R(null),!N(p,g))return;throw E({state:Y(l)?"reload-required":"failed",routeId:p,attempt:x,messageKey:Y(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},U=p=>{if(o.disposed)return;let g=m();if(Y(p)){h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(g,o.routeSequence,0)},K=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,a(()=>{o.syncScheduled=!1,!o.disposed&&X().catch(p=>U(p))}))},oe=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,h(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),A(),u()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:X,cleanup:oe},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=jt(e,oe),o.unbindRouteChange=Xt(e,K,m),t.defer_initial_sync){K();return}await X()}function Vt(e){return{basePath:Le(e.options.basePath??""),bridgeUrl:e.bridgeUrl,runtimeVersions:{bridge:e.options.runtime_versions?.bridge??null,contracts:e.options.runtime_versions?.contracts??null,engine:e.options.runtime_versions?.engine??null},sessionKeyFingerprint:Wt(e.options.bridge_session_key)}}function Ut(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Wt(e){if(!e)return null;let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return`${e.length}:${t.toString(36)}`}function jt(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),$t(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function $t(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function zt(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function wt(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,u=null,c=null,a=null,h=null,m=new Map,_=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,E=()=>{n?.(),n=null,r=null},R=()=>{i?.(),i=null,o?.(),o=null},C=(d,f,l)=>{let D=s?.sessionKey!==d||s?.sourceWindow!==f||s?.targetOrigin!==l;s={sessionKey:d,sourceWindow:f,targetOrigin:l},D&&(a=null,h=null)},N=(d,f)=>{let l=e.parent&&e.parent!==e?e.parent:null;return!l||f!==l?!1:!_||d===_},T=()=>{for(let d of m.values())d();m.clear()},A=d=>JSON.stringify([d.routeId,d.version]),ge=()=>!c||c.state==="ready",ye=d=>JSON.stringify([d.state,d.routeId??null,d.attempt??null,d.retryInMs??null,d.messageKey??null]),G=d=>{if(!ge())return;let f=A(d);a!==f&&(o?.(),o=null,U({kind:"route-ready",payload:{routeId:d.routeId,version:d.version}}),s&&(a=f))},J=d=>{let f=ye(d);h!==f&&(d.state!=="ready"&&(a=null,u=null),U({kind:"bridge-status",payload:d}),s&&(h=f))},be=d=>{u=d,G(d)},X=d=>{c=d,J(d)},re=()=>{u&&G(u)},Se=()=>{c&&J(c)},U=d=>{s&&s.sourceWindow.postMessage(ee({type:"event",...d},{sessionKey:s.sessionKey}),s.targetOrigin)},K=(d,f,l,D)=>{let v=pe(e.document,f.clientX,f.clientY,t.getCurrentDocument?.()??null),k=v?F(v,l==="full"?q(e.document,v,t.getCurrentDocument?.()??null):ze(e.document,v,t.getCurrentDocument?.()??null),t.getDocumentEntry,l):null;D&&k&&(d==="pointer-click"||d==="pointer-double-click")&&(D.preventDefault(),D.stopPropagation(),typeof D.stopImmediatePropagation=="function"&&D.stopImmediatePropagation()),U({kind:d,payload:{clientX:f.clientX,clientY:f.clientY,buttons:Number(f.buttons??0),hit:k}})},oe=(d,f,l)=>{R(),s={sessionKey:d,sourceWindow:f,targetOrigin:l};let D=wn(e.document),v=null,k=null,y=()=>{k=null;let b=v;v=null,b&&K("pointer-move",b,"summary")},B=b=>{v={clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},k===null&&(k=Je(e,y))},W=b=>{K("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},H=b=>{K("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},V=b=>{K("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},z=b=>{K("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Q=b=>{K("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Z=()=>{U({kind:"scroll",payload:{metrics:le(e)}})};e.document.addEventListener("pointerdown",W,!0),e.document.addEventListener("pointermove",B,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",H,!0),e.document.addEventListener("pointercancel",V,!0),e.document.addEventListener("click",z,!0),e.document.addEventListener("dblclick",Q,!0),e.addEventListener("scroll",Z,{passive:!0}),i=()=>{k!==null&&(Xe(e,k),k=null),v=null,D(),e.document.removeEventListener("pointerdown",W,!0),e.document.removeEventListener("pointermove",B,!0),e.document.removeEventListener("pointerup",H,!0),e.document.removeEventListener("pointercancel",V,!0),e.document.removeEventListener("click",z,!0),e.document.removeEventListener("dblclick",Q,!0),e.removeEventListener("scroll",Z)}},p=d=>{let f=d.detail;f?.routeId&&be(f)},g=d=>{let f=d.detail;f?.state&&X(f)},x=d=>{let f=d.data;if(!Ue(f)||f.body.type!=="request"||f.body.kind!=="apply-node-patch"&&f.body.kind!=="get-hit-by-ref"&&f.body.kind!=="get-path-by-ref"&&f.body.kind!=="get-scroll-metrics"&&f.body.kind!=="scroll-to"&&f.body.kind!=="scroll-by"&&f.body.kind!=="set-interaction-mode"&&f.body.kind!=="set-theme-override"&&f.body.kind!=="clear-theme-override"&&f.body.kind!=="get-theme-variables"&&f.body.kind!=="compute-drop-target-at-point"&&f.body.kind!=="observe-node-bounds"&&f.body.kind!=="clear-node-bounds-observer"&&f.body.kind!=="restore-text-edit"&&f.body.kind!=="clear-text-edit-rollback"&&f.body.kind!=="start-text-edit-at-point"&&f.body.kind!=="hit-test-at-point"&&!je(f.body))return;let l=f.body,D=typeof f.sessionKey=="string"?f.sessionKey:null,v=d.source,k=d.origin;if(!D||!k||!v||typeof v.postMessage!="function"||!N(D,v))return;if(s){if(s.sourceWindow!==v||s.targetOrigin!==k)return;s.sessionKey!==D&&(E(),R(),T(),s=null)}C(D,v,k),Se(),re();let y=B=>{let W=typeof l.id=="string"?l.id:"unknown";v.postMessage(ee({id:W,...B},{sessionKey:D}),k)};try{if(je(l)){Ht({message:l,sendEvent:S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},sendResponse:y,subscriptions:m,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for patch target"});return}let I=l.payload.preview,P=I?An(I.sessionId,l.payload.ref):null;if(P&&I){let ie=te.get(P)??-1;if(I.revision<ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,stale:!0,latestRevision:ie}});return}if(I.revision===ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,duplicate:!0,latestRevision:ie}});return}}if(Dn(S,l.payload.patch),P&&I&&Pn(P,I.revision),I?.responseDetail==="none"){y({type:"response",ok:!0,result:{applied:!0,appliedRevision:I.revision}});return}y({type:"response",ok:!0,result:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,I?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for hit target"});return}y({type:"response",ok:!0,result:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let S=$(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for path target"});return}let I=[],P=S;for(;P;)P.getAttribute("data-vcp-edit-key")&&I.push(F(P,q(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),P=P.parentElement;y({type:"response",ok:!0,result:I.reverse()});return}if(l.kind==="restore-text-edit"||l.kind==="clear-text-edit-rollback"){let S=l.payload.ref;if(l.kind==="clear-text-edit-rollback"){r&&$e(r.ref,S)&&(r=null),y({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!$e(r.ref,S)){y({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let I=rn(e.document,r,t.getCurrentDocument?.()??null);r=null,y(I?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(l.kind==="get-scroll-metrics"){y({type:"response",ok:!0,result:le(e)});return}if(l.kind==="scroll-to"){let S=Number(l.payload.x),I=Number(l.payload.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:S,top:I}),y({type:"response",ok:!0,result:le(e)});return}if(l.kind==="scroll-by"){let S=Number(l.payload.deltaX),I=Number(l.payload.deltaY);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:S,top:I}),y({type:"response",ok:!0,result:{...le(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?oe(D,v,k):s?.sourceWindow===v&&s.targetOrigin===k&&s.sessionKey===D&&R(),y({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){Fn(e.document,l.payload),y({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){Bn(e.document),y({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){y({type:"response",ok:!0,result:Mn(e.document,l.payload.names)});return}if(l.kind==="compute-drop-target-at-point"){let S=Number(l.payload?.x),I=Number(l.payload?.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid drop target point"});return}y({type:"response",ok:!0,result:Cn(e,S,I,l.payload.dragKind,l.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(l.kind==="observe-node-bounds"){let S=l.payload.ref;if(!S){y({type:"response",ok:!1,error:"Missing bounds observer target"});return}let I=$(e.document,S,t.getCurrentDocument?.()??null);if(!I){y({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=Sn(e,I,S,t.getCurrentDocument,t.getDocumentEntry,P=>U({kind:"node-bounds-change",payload:{hit:P}})),y({type:"response",ok:!0,result:{observing:!0}}),U({kind:"node-bounds-change",payload:{hit:F(I,S,t.getDocumentEntry,"summary")}});return}if(l.kind==="clear-node-bounds-observer"){o?.(),o=null,y({type:"response",ok:!0,result:{cleared:!0}});return}if(l.kind!=="hit-test-at-point"&&l.kind!=="start-text-edit-at-point")return;let B=Number(l.payload?.x),W=Number(l.payload?.y);if(!Number.isFinite(B)||!Number.isFinite(W)){y({type:"response",ok:!1,error:"Invalid text edit point"});return}let H=l.kind==="hit-test-at-point"?pe(e.document,B,W,t.getCurrentDocument?.()??null):sn(e.document,B,W,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!H){y({type:"response",ok:!1,error:l.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let V=l.kind==="start-text-edit-at-point"?H:null,z=l.kind==="hit-test-at-point"?H:V.element,Q=l.payload.detailLevel??"full",Z=Q==="full"?q(e.document,z,t.getCurrentDocument?.()??null):ze(e.document,z,t.getCurrentDocument?.()??null),b=V&&typeof V.textSegmentIndex=="number"?{...Z,textSegmentIndex:V.textSegmentIndex}:Z,ft=F(z,b,t.getDocumentEntry,Q);if(l.kind==="hit-test-at-point"){y({type:"response",ok:!0,result:ft});return}E(),n=Vn(e,z,b,S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},{...V?.textNode?{textNode:V.textNode}:{},onCommitSnapshot:S=>{r=S}}),y({type:"response",ok:!0,result:{ref:b}})}catch(B){y({type:"response",ok:!1,error:B instanceof Error?B.message:"Failed to start text edit"})}};return e.addEventListener("message",x),e.addEventListener(Te,p),e.addEventListener(ke,g),()=>{E(),R(),s=null,T(),e.removeEventListener("message",x),e.removeEventListener(Te,p),e.removeEventListener(ke,g)}}function je(e){let t=e.kind;return t==="bridge-initialize-session"||t==="bridge-get-document"||t==="bridge-get-history-status"||t==="bridge-get-style-context"||t==="bridge-ensure-document-version"||t==="bridge-acknowledge-document-version"||t==="bridge-get-object-edit-context"||t==="bridge-get-class-name-source"||t==="bridge-get-source-tree"||t==="bridge-get-source-file"||t==="bridge-resolve-source-location"||t==="bridge-execute"||t==="bridge-undo"||t==="bridge-redo"||t==="bridge-subscribe"||t==="bridge-unsubscribe"}function Gt(e){return e.kind==="update-text"||e.kind==="update-array-item"||e.kind==="set-class-name-source"||e.kind==="set-props"||e.kind==="apply-style-draft"}async function Ht({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,windowLike:u}){let c=u.__VCP_SITE_EDIT__;if(!c){n({type:"response",ok:!1,error:"Site edit bridge is not ready in preview frame"});return}try{switch(e.kind){case"bridge-initialize-session":{let a=await c.initializeSession({routeId:e.payload.routeId});o?.(a.data.document),Qe(u,{routeId:a.data.document.routeId,version:a.data.document.version}),n({type:"response",ok:!0,result:a});return}case"bridge-get-document":{let a=await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await c.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await c.getStyleContext(e.payload.routeId)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let a=c.ensureDocumentVersion?await c.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let a=c.acknowledgeDocumentVersion?await c.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await c.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let a=await c.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Yt(a,e.payload.key,u.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await c.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await c.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await c.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let a=await c.execute(e.payload.request),h=i?.()?.routeId;if(a.ok&&h&&c.acknowledgeDocumentVersion&&Gt(e.payload.request)){let m=await c.acknowledgeDocumentVersion(h,a.data.resultVersion);o?.(m.data)}n({type:"response",ok:!0,result:a});return}case"bridge-undo":n({type:"response",ok:!0,result:await c.undo()});return;case"bridge-redo":n({type:"response",ok:!0,result:await c.redo()});return;case"bridge-subscribe":{let a=e.payload.subscriptionId;r.get(a)?.();let h=c.subscribe(m=>{t({kind:"bridge-event",payload:{event:m,subscriptionId:a}})});r.set(a,h),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let a=e.payload.subscriptionId;r.get(a)?.(),r.delete(a),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(a){s?.(a,e),n({type:"response",ok:!1,error:tn(a)})}}function Yt(e,t,n,r){if(!e.ok)return e;let i=$(n,{key:t},r),o=i?Jt(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Jt(e){let t=e.ownerDocument.defaultView;if(!t)return null;let n=t.getComputedStyle(e);return{color:n.color,backgroundColor:n.backgroundColor,borderColor:n.borderColor}}function Xt(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let a=n();a!==o&&(o=a,t())},u=()=>s(),c=()=>s();return e.history.pushState=function(...h){let m=r.apply(this,h);return s(),m},e.history.replaceState=function(...h){let m=i.apply(this,h);return s(),m},e.addEventListener("popstate",u),e.addEventListener("hashchange",c),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",u),e.removeEventListener("hashchange",c)}}function Qt(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function Je(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function Xe(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function Qe(e,t){e.dispatchEvent(new CustomEvent(Te,{detail:t}))}function Zt(e,t){e.dispatchEvent(new CustomEvent(ke,{detail:t}))}function Lt(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function en(e,t){return e.routeId===t}function Ne(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Ze(e){let t=Ne(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function tn(e){let t=Ne(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Ze(t)?"Site edit bridge disconnected":t}function Y(e){let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/authentication|auth failed|auth rejected|bridge key|session|unauthorized|forbidden|expired/i.test(t)}function Le(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function Ae(e){return Bt.has(tt(e))}function nn(e){return Mt.has(tt(e))}function et(e){return e.operationSummary?{canUpdateText:e.operationSummary.canUpdateText,canInsertChild:e.operationSummary.canInsertChild,canMove:e.operationSummary.canMove,canRemove:e.operationSummary.canRemove}:e.fallbackMode!=="preview"?{canUpdateText:!1,canInsertChild:!1,canMove:!1,canRemove:!1}:{canUpdateText:nn(e.tagName),canInsertChild:Ae(e.tagName),canMove:!1,canRemove:!1}}function tt(e){return e?.trim().toLowerCase()??""}function $e(e,t){return e.key!==t.key||e.instanceIndex!==t.instanceIndex||e.instanceCount!==t.instanceCount?!1:typeof e.textSegmentIndex=="number"&&typeof t.textSegmentIndex=="number"?e.textSegmentIndex===t.textSegmentIndex:!0}function rn(e,t,n){let r=$(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=on(r,t.ref.textSegmentIndex);return i?(i.nodeValue=t.initialText,!0):!1}return typeof t.initialHtml=="string"?(r.innerHTML=t.initialHtml,!0):(r.textContent=t.initialText,!0)}function on(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function sn(e,t,n,r,i){let o=pe(e,t,n,r),s=nt(o);if(!s)return null;let u=s.getAttribute("data-vcp-edit-key")??"",c=q(e,s,r),a=i?.(c.key)??i?.(u);if(!et({operationSummary:a?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let m=un(e,t,n,s);if(m){let _=an(s,m);if(_!==null)return{element:s,textNode:m,textSegmentIndex:_}}return me(s)?null:{element:s}}function un(e,t,n,r){let i=cn(e,t,n);return!i||i.parentElement!==r?null:i}function cn(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(de(o))return o;let u=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return de(u)?u:null}function an(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function de(e){return e?.nodeType===3}function pe(e,t,n,r=null){let i=typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean);for(let o of i){let s=nt(o),u=s?.getAttribute("data-vcp-edit-key")??"";if(s&&hn(s,r,u))return s}return null}function nt(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Pe(t))return n??t;!ln(r)&&!n&&(n=t)}t=t.parentElement}return n}function Pe(e){return e.getAttribute(Ft)!==null}function ln(e){return dn(e.split("::")[0]??"")}function dn(e){if(!e)return!1;let t=pn(e);return t===ue||t.startsWith(`${ue}/`)||t.includes(`/${ue}/`)||t.endsWith(`/${ue}`)}function pn(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let i of n.split("/"))if(!(!i||i===".")){if(i===".."){r.pop();continue}r.push(i)}return r.join("/")}function q(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(r)}"]`))),n,r);if(i.length<=1)return{key:we(n,r,0)};let o=i.indexOf(t);return o>=0?{key:we(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function ze(e,t,n){return q(e,t,n)}function $(e,t,n){let r=fe(t.key)??t.key,i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(r)}"]`))),n,t.key);if(i.length===0)return null;let o=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<i.length?t.instanceIndex:null,s=(fe(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let u=fn(n,t.key);return u!==null&&u>=0&&u<i.length?i[u]??null:o!==null?i[o]??null:i[0]??null}function we(e,t,n){return rt(e,t)[n]?.key??t}function fn(e,t){let n=fe(t);if(!n)return null;let i=rt(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function rt(e,t){return(e?.entries??[]).filter(n=>(fe(n.key)??n.key)===t)}function ot(e,t,n){let r=it(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function hn(e,t,n){let r=it(t,n);return!r||e.tagName.toLowerCase()===r}function it(e,t){return null}var mn=2,gn=4;function st(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&gn)!==0?-1:(r&mn)!==0?1:0})}function fe(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(We);if(n<0)break;let r=Number(t.slice(n+We.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function yn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=i=>{let o=Number.parseFloat(i??"");return Number.isFinite(o)&&o>0?o:0};return{marginTop:r(n?.marginTop),marginRight:r(n?.marginRight),marginBottom:r(n?.marginBottom),marginLeft:r(n?.marginLeft),paddingTop:r(n?.paddingTop),paddingRight:r(n?.paddingRight),paddingBottom:r(n?.paddingBottom),paddingLeft:r(n?.paddingLeft),borderTopWidth:r(n?.borderTopWidth),borderRightWidth:r(n?.borderRightWidth),borderBottomWidth:r(n?.borderBottomWidth),borderLeftWidth:r(n?.borderLeftWidth),columnGap:r(n?.columnGap),rowGap:r(n?.rowGap)}}function bn(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>vn(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}function F(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),u=he(e),c=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([E,R])=>[E,R??""])),attributes:Object.fromEntries(e.getAttributeNames().map(E=>[E,e.getAttribute(E)??""]))}:{},a=et({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),h=Pe(e),m=!0,_=ct(e)?.getAttribute("data-vcp-edit-key")??null;return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},..._?{parentKey:_}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...c,runtimeFlags:{selectable:!0,movable:a.canMove,removable:a.canRemove,textEditable:a.canUpdateText,container:h?!1:!!me(e)||a.canInsertChild||m&&Ae(s)},layout:u,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childRects:bn(e),spacing:yn(e)}}function Sn(e,t,n,r,i,o){let s=t,u=F(s,n,i,"summary"),c=null,a=()=>{c===null&&(c=Je(e,h))},h=()=>{c=null;let N=$(e.document,n,r?.()??null);if(!N)return;N!==s&&(_?.unobserve(s),s=N,_?.observe(s));let T=F(s,n,i,"summary");T.rect.width<=0||T.rect.height<=0||En(u,T)&&(u=T,o(T))},m=e.ResizeObserver,_=typeof m=="function"?new m(a):null;_?.observe(s);let E=e.MutationObserver,R=typeof E=="function"?new E(a):null;R?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",a,{passive:!0});let C=e.visualViewport;return C?.addEventListener?.("resize",a,{passive:!0}),e.document.addEventListener("load",a,!0),()=>{c!==null&&(Xe(e,c),c=null),_?.disconnect(),R?.disconnect(),e.removeEventListener("resize",a),C?.removeEventListener?.("resize",a),e.document.removeEventListener("load",a,!0)}}function En(e,t){return ut(e.rect,t.rect)||In(e.childRects,t.childRects)||Ge(e.spacing,t.spacing)||Ge(e.layout,t.layout)}function In(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>ut(i,r[o]??i))}function Ge(e,t){let n=e??{},r=t??{},i=new Set([...Object.keys(n),...Object.keys(r)]);return Array.from(i).some(o=>n[o]!==r[o])}function vn(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function ut(e,t){return Math.abs(e.top-t.top)>.5||Math.abs(e.left-t.left)>.5||Math.abs(e.width-t.width)>.5||Math.abs(e.height-t.height)>.5}function Cn(e,t,n,r,i,o,s){let u=e.document,c=pe(u,t,n,o);if(!c)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let a=i?$(u,i,o):null;if(a&&De(c,a))return ce(u,c,"self-or-descendant",o,s);if(r==="move"&&a){let C=Tn(u,c,a,o,s);if(C){let N=_e(C.child,C.targetParent,t,n,"nearest");if(N)return ae(u,C.child,C.targetParent,N,o,s)}}let h=null,m=!1,_=c,E=c.parentElement;for(;E;){if(E.getAttribute("data-vcp-edit-key")){if(a&&De(E,a))return ce(u,c,"self-or-descendant",o,s);let C=He(E,r,s);if(C==="accept"){h={child:_,targetParent:E};break}C==="blocked"&&(m=!0),_=E}E=E.parentElement}let R=He(c,r,s);if(R==="accept"){if(h){let C=_e(h.child,h.targetParent,t,n,"edge");if(C)return ae(u,h.child,h.targetParent,C,o,s)}return ae(u,c,c,xn(c,t,n),o,s)}if(h){let C=_e(h.child,h.targetParent,t,n,"nearest");return ae(u,h.child,h.targetParent,C??"after",o,s)}return R==="blocked"||m?ce(u,c,"operation-boundary-blocked",o,s):ce(u,c,"no-accepting-parent",o,s)}function ce(e,t,n,r,i){return{anchorHit:F(t,q(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function ae(e,t,n,r,i,o){let s=F(t,q(e,t,i),o,"summary"),u=F(n,q(e,n,i),o,"summary"),c=he(n).indicatorOrientation,a=r==="append"||r==="prepend"?_n(n.getBoundingClientRect(),c,r):Rn(t.getBoundingClientRect(),c,r);return{anchorHit:s,targetParentHit:u,relation:r,indicatorOrientation:c,indicatorBounds:a}}function He(e,t,n){if(Pe(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":me(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return Ae(o)?"accept":"not-container"}function _e(e,t,n,r,i){let o=he(t).indicatorOrientation,s=e.getBoundingClientRect(),u=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&u>=.25&&u<=.75?null:u<.5?"before":"after"}function xn(e,t,n){let r=he(e).indicatorOrientation,i=e.getBoundingClientRect();return(r==="vertical"?i.width>0?(t-i.left)/i.width:.5:i.height>0?(n-i.top)/i.height:.5)<.5?"prepend":"append"}function he(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=n?.display??"",i=n?.flexDirection,o=n?.gridAutoFlow,s="horizontal";return r==="flex"||r==="inline-flex"?s=(i??"row").startsWith("row")?"vertical":"horizontal":(r==="grid"||r==="inline-grid")&&(s=(o??"row").includes("column")?"vertical":"horizontal"),{display:r,...i?{flexDirection:i}:{},...o?{gridAutoFlow:o}:{},indicatorOrientation:s}}function _n(e,t,n){if(t==="vertical")return{left:n==="prepend"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="prepend"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function Rn(e,t,n){if(t==="vertical")return{left:n==="before"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="before"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function De(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function Tn(e,t,n,r,i){let o=kn(e,t,n,r,i);if(o)return o;let s=ct(n);if(!s||t===s)return null;let u=t,c=t.getAttribute("data-vcp-edit-key")?t:null;for(;u&&u!==s;)u.getAttribute("data-vcp-edit-key")&&(c=u),u=u.parentElement;return u!==s||!c||c===s||c===n||De(c,n)?null:{child:c,targetParent:s}}function kn(e,t,n,r,i){return null}function ct(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function me(e){for(let t of Array.from(e.childNodes)){if(typeof t.getAttribute!="function")continue;let n=t;if(n.getAttribute("data-vcp-edit-key"))return n;let r=me(n);if(r)return r}return null}function le(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:O(e.scrollX),scrollY:O(e.scrollY),scrollWidth:Math.max(O(t?.scrollWidth),O(n?.scrollWidth),O(e.innerWidth)),scrollHeight:Math.max(O(t?.scrollHeight),O(n?.scrollHeight),O(e.innerHeight)),viewportWidth:O(e.innerWidth),viewportHeight:O(e.innerHeight)}}function Dn(e,t){Object.entries(t.attributes??{}).forEach(([r,i])=>{if(i===null){e.removeAttribute(r);return}e.setAttribute(r,i)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,i])=>{if(n.has(r))return;let o=e.style,s=r.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`);if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i))}),t.styleDeclarations?.forEach(r=>{let i=e.style,o=r.property.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var Nn=500,te=new Map;function An(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Pn(e,t){if(te.size>=Nn){let n=te.keys().next().value;n&&te.delete(n)}te.set(e,t)}var ne=new Set;function Fn(e,t){let n=e.documentElement?.style,r=new Set;for(let[i,o]of Object.entries(t.variables??{}))i.startsWith("--")&&(r.add(i),n?.setProperty(i,o));for(let i of ne)r.has(i)||n?.removeProperty(i);ne.clear();for(let i of r)ne.add(i);Kn(e,t.stylesheets??[])}function Bn(e){let t=e.documentElement?.style;for(let n of ne)t?.removeProperty(n);ne.clear();for(let n of dt(e))n.remove()}function Mn(e,t){let n=Array.from(new Set(t.filter(s=>typeof s=="string"&&s.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,i=r?e.defaultView?.getComputedStyle(r):null,o={};for(let s of n){let u=at(i,s);u&&(o[s]=u)}return o}function at(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return lt(e,r,n)}function lt(e,t,n){if(!t)return null;let r=On(t);if(!r)return t;let i=at(e,r.name,n);return i||(r.fallback?lt(e,r.fallback,n)??r.fallback:null)}function On(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=qn(n),i=r>=0?n.slice(0,r).trim():n;if(!i.startsWith("--"))return null;let o=r>=0?n.slice(r+1).trim():null;return{name:i,fallback:o||null}}function qn(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="("){t+=1;continue}if(r===")"){t=Math.max(0,t-1);continue}if(r===","&&t===0)return n}return-1}function Kn(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of dt(e)){let s=o.getAttribute("href")??"";if(!n.has(s)||r.has(s)){o.remove();continue}r.set(s,o)}let i=e.head;if(i)for(let o of n){if(r.has(o))continue;let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute(Ye,"true"),s.setAttribute("href",o),i.appendChild(s)}}function dt(e){return Array.from(e.querySelectorAll(`link[${Ye}]`))}function Vn(e,t,n,r,i={}){let o=i.textNode?Un(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,u=s.textContent??"",c=o?void 0:t.innerHTML,a=Wn(s),h=!1,m=()=>{e.document.removeEventListener("pointerdown",E,!0),s.removeEventListener("keydown",R),s.removeEventListener("blur",C),s.removeEventListener("input",N),$n(s,a)},_=T=>{if(h)return;h=!0;let A=s.textContent??"";if(m(),T==="cancel"){o?.restore(u),o||(t.textContent=u),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(A),T==="commit"&&A!==u){i.onCommitSnapshot?.({ref:n,initialText:u,...c!==void 0?{initialHtml:c}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:A}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function E(T){let A=T.target;A&&s.contains(A)||_("commit")}function R(T){if(T.key==="Escape"){T.preventDefault(),_("cancel");return}T.key==="Enter"&&(T.metaKey||T.ctrlKey)&&(T.preventDefault(),_("commit"))}function C(){_("commit")}function N(){r({kind:"text-edit-input",payload:{ref:n,hit:F(t,n,void 0,"full")}})}return jn(s),e.document.addEventListener("pointerdown",E,!0),s.addEventListener("keydown",R),s.addEventListener("blur",C),s.addEventListener("input",N),Gn(s),Hn(s,e.document),m}function Un(e,t){let n=t.parentNode;if(!n)return null;let r=e.createElement("span");return r.setAttribute("data-vcp-text-segment-editor","true"),r.textContent=t.textContent??"",n.replaceChild(r,t),{element:r,restore(i){t.nodeValue=i,r.parentNode&&r.parentNode.replaceChild(t,r)}}}function Wn(e){return{contentEditable:e.getAttribute("contenteditable"),spellcheck:e.getAttribute("spellcheck"),marker:e.getAttribute("data-vcp-edit-text-editing"),cursor:e.style.cursor,userSelect:e.style.userSelect}}function jn(e){zn(e.ownerDocument),e.setAttribute("contenteditable","plaintext-only"),e.setAttribute("spellcheck","false"),e.setAttribute("data-vcp-edit-text-editing","true"),e.style.cursor="text",e.style.userSelect="text"}function $n(e,t){Re(e,"contenteditable",t.contentEditable),Re(e,"spellcheck",t.spellcheck),Re(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function zn(e){if(e.getElementById("vcp-text-edit-base-style"))return;let t=e.createElement("style");t.id="vcp-text-edit-base-style",t.textContent='[data-vcp-edit-text-editing="true"]{outline:0!important;outline-offset:0!important;}',e.head.appendChild(t)}function Re(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function wn(e){let t=[e.documentElement,e.body].filter(r=>!!r?.style),n=t.map(r=>({element:r,userSelect:r.style.userSelect}));for(let r of t)r.style.userSelect="none";return()=>{for(let r of n)r.element.style.userSelect=r.userSelect}}function Gn(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Hn(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function pt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function O(e){let t=Number(e);return Number.isFinite(t)?t:0}export{ke as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,Te as VCP_SITE_EDIT_ROUTE_READY_EVENT,Ot as resolveSiteEditRouteId,Kt as resolveSiteEditWebSocketUrl,sr as startSiteEditAutoBootstrap,wt as startSiteEditFrameRuntime};
package/dist/client.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import type { SiteEditCommandSuccess, SiteEditEvent, SiteEditGetClassNameSourceCommandResult, SiteEditObjectDetail, SiteEditObjectEditContext, SiteEditObjectSummary, SiteEditOperationCommandResult, SiteEditOperationRequest, SiteEditRenderDocument, SiteEditResolveSourceLocationInput, SiteEditSourceFileResponse, SiteEditSourceLocation, SiteEditSourceTreeResponse } from "@vcp-dev/contracts";
2
- import { type SiteEditBridgeRequestKind } from "./protocol.js";
1
+ import type { SiteEditCommandSuccess, SiteEditClassNameSourceStyleContext, SiteEditEvent, SiteEditGetClassNameSourceCommandResult, SiteEditObjectEditContext, SiteEditMutationContext, SiteEditInitializeSessionInput, SiteEditOperationCommandResult, SiteEditOperationRequest, SiteEditRenderDocument, SiteEditResolveSourceLocationInput, SiteEditSourceFileResponse, SiteEditSourceLocation, SiteEditSourceTreeResponse } from "@vcp-dev/contracts";
2
+ import { type SiteEditHistoryStatus, type SiteEditBridgeRequestKind } from "./protocol.js";
3
+ export type { SiteEditHistoryStatus } from "./protocol.js";
3
4
  export type SiteEditBrowserSocketLike = {
4
5
  readonly readyState: number;
5
6
  onopen: (() => void) | null;
@@ -22,9 +23,15 @@ export type SiteEditBridgeConnectionStatus = {
22
23
  message?: string;
23
24
  };
24
25
  export type SiteEditBridgeClient = {
26
+ initializeSession?(input: SiteEditInitializeSessionInput): Promise<SiteEditCommandSuccess<{
27
+ document: SiteEditRenderDocument;
28
+ historyStatus: SiteEditHistoryStatus;
29
+ }>>;
25
30
  getDocument(routeId: string): Promise<SiteEditCommandSuccess<SiteEditRenderDocument>>;
31
+ getHistoryStatus(): Promise<SiteEditCommandSuccess<SiteEditHistoryStatus>>;
32
+ getStyleContext(routeId: string): Promise<SiteEditCommandSuccess<SiteEditClassNameSourceStyleContext | null>>;
26
33
  ensureDocumentVersion?(routeId: string, minVersion: number): Promise<SiteEditCommandSuccess<SiteEditRenderDocument>>;
27
- getObjectSummary(key: string, routeId?: string): Promise<SiteEditCommandSuccess<SiteEditObjectSummary>>;
34
+ acknowledgeDocumentVersion?(routeId: string, version: number): Promise<SiteEditCommandSuccess<SiteEditRenderDocument>>;
28
35
  getObjectEditContext(key: string, routeId?: string): Promise<SiteEditCommandSuccess<SiteEditObjectEditContext>>;
29
36
  getClassNameSource(key: string, routeId?: string): Promise<SiteEditGetClassNameSourceCommandResult>;
30
37
  getSourceTree(): Promise<SiteEditCommandSuccess<SiteEditSourceTreeResponse>>;
@@ -32,9 +39,9 @@ export type SiteEditBridgeClient = {
32
39
  path: string;
33
40
  }): Promise<SiteEditCommandSuccess<SiteEditSourceFileResponse>>;
34
41
  resolveSourceLocation(input: SiteEditResolveSourceLocationInput): Promise<SiteEditCommandSuccess<SiteEditSourceLocation>>;
35
- execute(request: SiteEditOperationRequest): Promise<SiteEditOperationCommandResult>;
36
- undo(): Promise<SiteEditOperationCommandResult>;
37
- redo(): Promise<SiteEditOperationCommandResult>;
42
+ execute(request: SiteEditOperationRequest, mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
43
+ undo(mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
44
+ redo(mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
38
45
  subscribe(listener: (event: SiteEditEvent) => void): () => void;
39
46
  };
40
47
  export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
@@ -64,59 +71,63 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
64
71
  snapshotId: string;
65
72
  routeId: string;
66
73
  version: number;
67
- rootKeys: string[];
68
74
  entries: {
69
75
  key: string;
70
- tag: string;
71
- label: string;
72
- parentKey: string | null;
73
- childKeys: string[];
74
76
  operationSummary: {
75
77
  canUpdateText: boolean;
76
78
  canInsertChild: boolean;
77
79
  canMove: boolean;
78
80
  canRemove: boolean;
79
81
  };
82
+ pageCompositionUnitKey?: string | undefined;
80
83
  }[];
84
+ pageComposition: {
85
+ status: "supported";
86
+ containerKey: string;
87
+ hasBusinessMembers: boolean;
88
+ placementUnitKeys: string[];
89
+ placements: {
90
+ placementKey: string;
91
+ placementUnitKey: string;
92
+ relation: "before" | "after" | "prepend" | "append";
93
+ }[];
94
+ } | {
95
+ status: "unsupported";
96
+ reason: "VERSION_STALE" | "RECOVERY_REQUIRED" | "MULTIPLE_PAGE_RETURNS" | "INDIRECT_RETURN_ONLY" | "PAGE_CONTAINER_AMBIGUOUS" | "NO_SAFE_PAGE_PLACEMENT" | "MEMBER_NOT_INDEPENDENT" | "UNSUPPORTED_ROUTE_STRUCTURE" | "RUNTIME_ANCHOR_UNRESOLVED" | "ROUTE_RETURN_NOT_FOUND";
97
+ diagnostics: {
98
+ code: string;
99
+ message: string;
100
+ }[];
101
+ };
81
102
  }>>;
82
- getObjectSummary(key: string, routeId?: string): Promise<SiteEditCommandSuccess<{
103
+ initializeSession(input: SiteEditInitializeSessionInput): Promise<SiteEditCommandSuccess<{
104
+ document: SiteEditRenderDocument;
105
+ historyStatus: SiteEditHistoryStatus;
106
+ }>>;
107
+ getHistoryStatus(): Promise<SiteEditCommandSuccess<SiteEditHistoryStatus>>;
108
+ getStyleContext(routeId: string): Promise<SiteEditCommandSuccess<{
109
+ revision: string;
110
+ entryCss: {
111
+ path: string;
112
+ content: string;
113
+ hash?: string | undefined;
114
+ };
115
+ stylesheets: {
116
+ path: string;
117
+ content: string;
118
+ hash?: string | undefined;
119
+ }[];
120
+ } | null>>;
121
+ getObjectEditContext(key: string, routeId?: string): Promise<SiteEditCommandSuccess<{
83
122
  key: string;
84
123
  tag: string;
85
124
  label: string;
86
- capabilities: {
87
- constraints: {
88
- kind: "component-boundary" | "repeat-region" | "conditional-region" | "opaque-region" | "void-element" | "read-only" | "cross-file-required" | "import-required";
89
- message: string;
90
- }[];
91
- };
92
125
  isOpaque: boolean;
93
126
  ancestors: {
94
127
  key: string;
95
128
  label: string;
96
129
  tag: string;
97
130
  }[];
98
- sourceLocator?: {
99
- sourceFile: string;
100
- componentName: string;
101
- openingElementRange: {
102
- startLine: number;
103
- startColumn: number;
104
- endLine: number;
105
- endColumn: number;
106
- };
107
- structuralPath: string;
108
- textPreview?: string | undefined;
109
- } | undefined;
110
- provenanceChain?: {
111
- editMode: "readonly" | "direct" | "proxy" | "upstream" | "unsupported";
112
- diagnostics: {
113
- code: string;
114
- message: string;
115
- }[];
116
- } | undefined;
117
- }>>;
118
- getObjectEditContext(key: string, routeId?: string): Promise<SiteEditCommandSuccess<{
119
- key: string;
120
131
  componentName: string;
121
132
  sourceFile: string;
122
133
  capabilities: {
@@ -131,85 +142,48 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
131
142
  }[];
132
143
  editModes?: {
133
144
  updateText?: {
134
- mode: "readonly" | "direct" | "proxy" | "upstream" | "unsupported";
145
+ mode: "unsupported" | "readonly" | "direct" | "proxy" | "upstream";
135
146
  reasonCode?: string | undefined;
136
147
  } | undefined;
137
148
  insertChild?: {
138
- mode: "readonly" | "direct" | "proxy" | "upstream" | "unsupported";
149
+ mode: "unsupported" | "readonly" | "direct" | "proxy" | "upstream";
139
150
  reasonCode?: string | undefined;
140
151
  } | undefined;
141
152
  move?: {
142
- mode: "readonly" | "direct" | "proxy" | "upstream" | "unsupported";
153
+ mode: "unsupported" | "readonly" | "direct" | "proxy" | "upstream";
143
154
  reasonCode?: string | undefined;
144
155
  } | undefined;
145
156
  remove?: {
146
- mode: "readonly" | "direct" | "proxy" | "upstream" | "unsupported";
157
+ mode: "unsupported" | "readonly" | "direct" | "proxy" | "upstream";
147
158
  reasonCode?: string | undefined;
148
159
  } | undefined;
149
160
  } | undefined;
150
161
  };
151
- writeTarget: {
152
- kind: "jsx-node" | "route-export" | "component-proxy" | "value-binding";
153
- file: string;
154
- componentName: string;
155
- isProxy: boolean;
156
- };
157
162
  textSegments: {
158
163
  index: number;
159
- value: string;
160
164
  editable: boolean;
161
- source: {
162
- kind: "binding" | "imported-binding" | "repeat-template" | "literal";
163
- file: string;
164
- expression: string;
165
- bindingName?: string | undefined;
166
- path?: (string | number)[] | undefined;
167
- } | null;
165
+ sourceKind: "literal" | "binding" | "imported-binding" | "repeat-template" | null;
168
166
  }[];
169
167
  boundaryKind: "component-boundary" | "repeat-region" | "conditional-region" | "fragment-region" | "opaque-region" | null;
170
- children: {
171
- key: string;
172
- label: string;
173
- tag: string;
174
- }[];
175
- siblings: {
176
- key: string;
177
- label: string;
178
- tag: string;
179
- }[];
180
- effectiveWriteTarget?: {
181
- kind: "jsx-node" | "route-export" | "value-path" | "external-entry";
182
- isProxy: boolean;
183
- file?: string | undefined;
184
- displayPath?: string | undefined;
185
- sourceType?: "api-field" | "cms-field" | "i18n-message" | "config-entry" | undefined;
186
- sourceId?: string | undefined;
168
+ sourceLocator?: {
169
+ sourceFile: string;
170
+ componentName: string;
171
+ openingElementRange: {
172
+ startLine: number;
173
+ startColumn: number;
174
+ endLine: number;
175
+ endColumn: number;
176
+ };
177
+ structuralPath: string;
178
+ textPreview?: string | undefined;
187
179
  } | undefined;
188
180
  provenanceChain?: {
189
- finalSource: {
190
- kind: "api-field" | "cms-field" | "i18n-message" | "config-entry" | "binding" | "imported-binding" | "repeat-template" | "jsx-literal" | "component-prop" | "object-field" | "array-item" | "conditional-branch";
191
- file: string;
192
- displayPath: string;
193
- externalSource?: {
194
- sourceType: "api-field" | "cms-field" | "i18n-message" | "config-entry";
195
- sourceId: string;
196
- adapterId?: string | undefined;
197
- } | undefined;
198
- } | null;
199
- chain: {
200
- kind: "api-field" | "cms-field" | "i18n-message" | "config-entry" | "binding" | "imported-binding" | "repeat-template" | "jsx-literal" | "component-prop" | "object-field" | "array-item" | "conditional-branch";
201
- file: string;
202
- displayName: string;
203
- canEditHere: boolean;
204
- }[];
205
- confidence: "unknown" | "exact" | "safe-derived" | "partial";
206
- editMode: "readonly" | "direct" | "proxy" | "upstream" | "unsupported";
181
+ editMode: "unsupported" | "readonly" | "direct" | "proxy" | "upstream";
207
182
  diagnostics: {
208
183
  code: string;
209
184
  message: string;
210
185
  }[];
211
186
  } | undefined;
212
- componentSemantic?: Record<string, unknown> | undefined;
213
187
  }>>;
214
188
  getClassNameSource(key: string, routeId?: string): Promise<SiteEditGetClassNameSourceCommandResult>;
215
189
  getSourceTree(): Promise<SiteEditCommandSuccess<{
@@ -258,9 +232,9 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
258
232
  routeId?: string | undefined;
259
233
  textPreview?: string | undefined;
260
234
  }>>;
261
- execute(request: SiteEditOperationRequest): Promise<SiteEditOperationCommandResult>;
262
- undo(): Promise<SiteEditOperationCommandResult>;
263
- redo(): Promise<SiteEditOperationCommandResult>;
235
+ execute(request: SiteEditOperationRequest, _mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
236
+ undo(_mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
237
+ redo(_mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
264
238
  subscribe(listener: (event: SiteEditEvent) => void): () => void;
265
239
  private request;
266
240
  private handleAuthHandshakeMessage;
@@ -273,10 +247,14 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
273
247
  private setConnectionState;
274
248
  private createSocket;
275
249
  }
276
- export type SiteEditBridge = SiteEditBridgeClient;
250
+ export type SiteEditBridge = SiteEditBridgeClient & {
251
+ initializeSession(input: SiteEditInitializeSessionInput): Promise<SiteEditCommandSuccess<{
252
+ document: SiteEditRenderDocument;
253
+ historyStatus: SiteEditHistoryStatus;
254
+ }>>;
255
+ };
277
256
  export declare function createSiteEditBridge(params: {
278
257
  routeId: string;
279
258
  initialDocument: SiteEditRenderDocument;
280
- initialDetails?: Record<string, SiteEditObjectDetail>;
281
259
  client: SiteEditBridgeClient;
282
260
  }): SiteEditBridge;