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