@base44/vite-plugin 0.2.27 → 0.2.28
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/capabilities/inline-edit/controller.d.ts.map +1 -1
- package/dist/capabilities/inline-edit/controller.js +9 -3
- package/dist/capabilities/inline-edit/controller.js.map +1 -1
- package/dist/capabilities/inline-edit/dom-utils.d.ts +1 -0
- package/dist/capabilities/inline-edit/dom-utils.d.ts.map +1 -1
- package/dist/capabilities/inline-edit/dom-utils.js +17 -7
- package/dist/capabilities/inline-edit/dom-utils.js.map +1 -1
- package/dist/injections/visual-edit-agent.d.ts.map +1 -1
- package/dist/injections/visual-edit-agent.js +14 -4
- package/dist/injections/visual-edit-agent.js.map +1 -1
- package/dist/statics/index.mjs +2 -2
- package/dist/statics/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/capabilities/inline-edit/controller.ts +35 -29
- package/src/capabilities/inline-edit/dom-utils.ts +14 -4
- package/src/injections/visual-edit-agent.ts +20 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAWvE,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,cAAc,GACnB,oBAAoB,CA6OtB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { injectFocusOutlineCSS, removeFocusOutlineCSS, selectText, shouldEnterInlineEditingMode, } from "./dom-utils.js";
|
|
1
|
+
import { injectFocusOutlineCSS, removeFocusOutlineCSS, selectText, shouldEnterInlineEditingMode, isStaticArrayTextElement, } from "./dom-utils.js";
|
|
2
2
|
const DEBOUNCE_MS = 500;
|
|
3
3
|
export function createInlineEditController(host) {
|
|
4
4
|
let currentEditingElement = null;
|
|
@@ -23,7 +23,7 @@ export function createInlineEditController(host) {
|
|
|
23
23
|
const newContent = element.textContent;
|
|
24
24
|
const svgElement = element;
|
|
25
25
|
const rect = element.getBoundingClientRect();
|
|
26
|
-
|
|
26
|
+
const message = {
|
|
27
27
|
type: "inline-edit",
|
|
28
28
|
elementInfo: {
|
|
29
29
|
tagName: element.tagName,
|
|
@@ -49,7 +49,13 @@ export function createInlineEditController(host) {
|
|
|
49
49
|
},
|
|
50
50
|
originalContent,
|
|
51
51
|
newContent,
|
|
52
|
-
}
|
|
52
|
+
};
|
|
53
|
+
if (isStaticArrayTextElement(element)) {
|
|
54
|
+
message.arrIndex = element.dataset.arrIndex;
|
|
55
|
+
message.arrVariableName = element.dataset.arrVariableName;
|
|
56
|
+
message.arrField = element.dataset.arrField;
|
|
57
|
+
}
|
|
58
|
+
window.parent.postMessage(message, "*");
|
|
53
59
|
element.dataset.originalTextContent = newContent || "";
|
|
54
60
|
};
|
|
55
61
|
const debouncedReport = (element) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/controller.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,4BAA4B,
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-utils.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/dom-utils.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,qBAAqB,YAWjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAEjC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,SAAS,WAAW,SAM9C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,KAAG,
|
|
1
|
+
{"version":3,"file":"dom-utils.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/dom-utils.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,wBAAwB,GAAI,SAAS,WAAW,KAAG,OAE/D,CAAC;AAUF,eAAO,MAAM,qBAAqB,YAWjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAEjC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,SAAS,WAAW,SAM9C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,KAAG,OAMxD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,SAAS,OAAO,KAAG,OAK/D,CAAC"}
|
|
@@ -3,6 +3,20 @@ const EDITABLE_TAGS = [
|
|
|
3
3
|
"div", "p", "h1", "h2", "h3", "h4", "h5", "h6",
|
|
4
4
|
"span", "li", "td", "a", "button", "label",
|
|
5
5
|
];
|
|
6
|
+
export const isStaticArrayTextElement = (element) => {
|
|
7
|
+
return !!element.dataset.arrField;
|
|
8
|
+
};
|
|
9
|
+
const passesStructuralChecks = (element) => {
|
|
10
|
+
if (!EDITABLE_TAGS.includes(element.tagName.toLowerCase()))
|
|
11
|
+
return false;
|
|
12
|
+
if (!element.textContent?.trim())
|
|
13
|
+
return false;
|
|
14
|
+
if (element.querySelector("img, video, canvas, svg"))
|
|
15
|
+
return false;
|
|
16
|
+
if (element.children?.length > 0)
|
|
17
|
+
return false;
|
|
18
|
+
return true;
|
|
19
|
+
};
|
|
6
20
|
export const injectFocusOutlineCSS = () => {
|
|
7
21
|
if (document.getElementById(FOCUS_STYLE_ID))
|
|
8
22
|
return;
|
|
@@ -28,14 +42,10 @@ export const selectText = (element) => {
|
|
|
28
42
|
export const isEditableTextElement = (element) => {
|
|
29
43
|
if (!(element instanceof HTMLElement))
|
|
30
44
|
return false;
|
|
31
|
-
if (!
|
|
32
|
-
return false;
|
|
33
|
-
if (!element.textContent?.trim())
|
|
34
|
-
return false;
|
|
35
|
-
if (element.querySelector("img, video, canvas, svg"))
|
|
36
|
-
return false;
|
|
37
|
-
if (element.children?.length > 0)
|
|
45
|
+
if (!passesStructuralChecks(element))
|
|
38
46
|
return false;
|
|
47
|
+
if (isStaticArrayTextElement(element))
|
|
48
|
+
return true;
|
|
39
49
|
if (element.dataset.dynamicContent === "true")
|
|
40
50
|
return false;
|
|
41
51
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-utils.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/dom-utils.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAElD,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACxC,IAAI,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;QAAE,OAAO;IAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,cAAc,CAAC;IAC1B,KAAK,CAAC,WAAW,GAAG;;;;GAInB,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACxC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAE,EAAE;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACxC,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAW,EAAE;IACjE,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"dom-utils.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/dom-utils.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAElD,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAoB,EAAW,EAAE;IACxE,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,OAAoB,EAAW,EAAE;IAC/D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,OAAO,CAAC,aAAa,CAAC,yBAAyB,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACxC,IAAI,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;QAAE,OAAO;IAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,cAAc,CAAC;IAC1B,KAAK,CAAC,WAAW,GAAG;;;;GAInB,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACxC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAE,EAAE;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACxC,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAW,EAAE;IACjE,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,wBAAwB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,OAAgB,EAAW,EAAE;IACxE,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visual-edit-agent.d.ts","sourceRoot":"","sources":["../../src/injections/visual-edit-agent.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"visual-edit-agent.d.ts","sourceRoot":"","sources":["../../src/injections/visual-edit-agent.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,SAosBnC"}
|
|
@@ -109,6 +109,11 @@ export function setupVisualEditAgent() {
|
|
|
109
109
|
const rect = element.getBoundingClientRect();
|
|
110
110
|
const svgElement = element;
|
|
111
111
|
const isTextElement = TEXT_TAGS.includes(element.tagName?.toLowerCase());
|
|
112
|
+
const arrEl = htmlElement.closest("[data-arr-variable-name]");
|
|
113
|
+
const staticArrayName = arrEl?.dataset?.arrVariableName || null;
|
|
114
|
+
const rawIdx = arrEl?.dataset?.arrIndex;
|
|
115
|
+
const staticArrayIndex = rawIdx != null ? parseInt(rawIdx, 10) : null;
|
|
116
|
+
const staticArrayField = htmlElement.dataset?.arrField || null;
|
|
112
117
|
window.parent.postMessage({
|
|
113
118
|
type: "element-selected",
|
|
114
119
|
tagName: element.tagName,
|
|
@@ -133,6 +138,9 @@ export function setupVisualEditAgent() {
|
|
|
133
138
|
},
|
|
134
139
|
attributes: collectAllowedAttributes(element, ALLOWED_ATTRIBUTES),
|
|
135
140
|
isTextElement,
|
|
141
|
+
staticArrayName,
|
|
142
|
+
staticArrayIndex,
|
|
143
|
+
staticArrayField,
|
|
136
144
|
}, "*");
|
|
137
145
|
};
|
|
138
146
|
// Select an element: create overlays, update state, notify parent
|
|
@@ -311,12 +319,14 @@ export function setupVisualEditAgent() {
|
|
|
311
319
|
}
|
|
312
320
|
}, REPOSITION_DELAY_MS);
|
|
313
321
|
};
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const elements = findElementsById(visualSelectorId);
|
|
322
|
+
const updateElementContent = (visualSelectorId, content, arrIndex) => {
|
|
323
|
+
let elements = findElementsById(visualSelectorId);
|
|
317
324
|
if (elements.length === 0) {
|
|
318
325
|
return;
|
|
319
326
|
}
|
|
327
|
+
if (arrIndex != null) {
|
|
328
|
+
elements = elements.filter((el) => el.dataset.arrIndex === String(arrIndex));
|
|
329
|
+
}
|
|
320
330
|
elements.forEach((element) => {
|
|
321
331
|
element.innerText = content;
|
|
322
332
|
});
|
|
@@ -433,7 +443,7 @@ export function setupVisualEditAgent() {
|
|
|
433
443
|
break;
|
|
434
444
|
case "update-content":
|
|
435
445
|
if (message.data && message.data.content !== undefined) {
|
|
436
|
-
updateElementContent(message.data.visualSelectorId, message.data.content);
|
|
446
|
+
updateElementContent(message.data.visualSelectorId, message.data.content, message.data.arrIndex);
|
|
437
447
|
}
|
|
438
448
|
else {
|
|
439
449
|
console.warn("[VisualEditAgent] Invalid update-content message:", message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visual-edit-agent.js","sourceRoot":"","sources":["../../src/injections/visual-edit-agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"visual-edit-agent.js","sourceRoot":"","sources":["../../src/injections/visual-edit-agent.ts"],"names":[],"mappings":"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"}
|
package/dist/statics/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
function
|
|
1
|
+
function B(e){let n=e;return!!(n.dataset?.sourceLocation||n.dataset?.visualSelectorId)}function T(e){let n=e;return n.dataset?.sourceLocation||n.dataset?.visualSelectorId||null}var F=["src"];function C(e){if(!e)return[];let n=Array.from(document.querySelectorAll(`[data-source-location="${e}"]`));return n.length>0?n:Array.from(document.querySelectorAll(`[data-visual-selector-id="${e}"]`))}function ee(e,n){e.forEach(r=>{r.setAttribute("class",n)})}function te(e,n,r){F.includes(n)&&e.forEach(l=>{l.setAttribute(n,r)})}function ne(e,n){let r={};for(let l of n){let a=e.getAttribute(l);a!==null&&(r[l]=a)}return r}var oe={position:"absolute",backgroundColor:"#ffffff",border:"1px solid #e2e8f0",borderRadius:"6px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",fontSize:"12px",minWidth:"120px",maxHeight:"200px",overflowY:"auto",zIndex:"10001",padding:"4px 0",pointerEvents:"auto"},re={padding:"4px 12px",cursor:"pointer",color:"#334155",backgroundColor:"transparent",whiteSpace:"nowrap",lineHeight:"1.5",fontWeight:"400"},R="#526cff",se="#DBEAFE",ie="600",X="#f1f5f9",le=10,M=" \u25BE",H=" \u25B4",ae=12,A="data-layer-dropdown",de=2,ce=2;function Y(e,n){for(let r of Object.keys(n))e.style.setProperty(r.replace(/[A-Z]/g,l=>`-${l.toLowerCase()}`),n[r])}function ue(e){return e.tagName}function G(e,n){let r={element:e,tagName:e.tagName.toLowerCase(),selectorId:T(e)};return n!==void 0&&(r.depth=n),r}function fe(e,n,r){let l=[];function a(u,d){if(!(d>n))for(let p=0;p<u.children.length;p++){let v=u.children[p];if(B(v)){let g={element:v,tagName:v.tagName.toLowerCase(),selectorId:T(v)};r!==void 0&&(g.depth=r+d-1),l.push(g),a(v,d+1)}else a(v,d)}}return a(e,1),l}function Oe(e){let n=[],r=e.parentElement;for(;r&&r!==document.documentElement&&r!==document.body&&n.length<de;)B(r)&&n.push(G(r)),r=r.parentElement;return n.reverse(),n}function He(e,n){return n.forEach((r,l)=>{e.push({...r,depth:l})}),n.length}function pe(e,n,r){e.push(G(n,r));let l=fe(n,ce,r+1);e.push(...l)}function Ae(e){return e.at(-1)?.element??null}function Ne(e,n){let r=fe(e,1);return r.some(l=>l.element===n)||r.push(G(n)),r}function _e(e,n,r,l){let a=T(r),u=new Set;for(let d of n)if(d.element===r)pe(e,r,l),a&&u.add(a);else{let p=d.selectorId;if(p!=null){if(p===a||u.has(p))continue;u.add(p)}e.push({...d,depth:l})}}function me(e){let n=Oe(e),r=[],l=He(r,n),a=Ae(n);if(a){let u=Ne(a,e);_e(r,u,e,l)}else pe(r,e,l);return r}var O=null,N=null,_=null,k=null,P=null;function Pe(e,n,{onSelect:r,onHover:l,onHoverEnd:a}){let u=document.createElement("div");u.textContent=ue(e),Y(u,re);let d=e.depth??0;return d>0&&(u.style.paddingLeft=`${ae+d*le}px`),n&&(u.style.color=R,u.style.backgroundColor=se,u.style.fontWeight=ie),u.addEventListener("mouseenter",()=>{n||(u.style.backgroundColor=X),l&&l(e)}),u.addEventListener("mouseleave",()=>{n||(u.style.backgroundColor="transparent"),a&&a()}),u.addEventListener("click",p=>{p.stopPropagation(),p.preventDefault(),r(e)}),u}function Re(e,n,r){let l=document.createElement("div");return l.setAttribute(A,"true"),Y(l,oe),e.forEach(a=>{let u=a.element===n;l.appendChild(Pe(a,u,r))}),l}function Ee(e){let n=e.textContent??"";n.endsWith(M)||n.endsWith(H)||(e.textContent=n+M,e.style.cursor="pointer",e.style.userSelect="none",e.style.whiteSpace="nowrap",e.style.pointerEvents="auto",e.setAttribute(A,"true"))}function ke(e,n,r,{onSelect:l,onHover:a,onHoverEnd:u}){let d=Array.from(e.children),p=n.findIndex(g=>g.element===r),v=g=>{if(p>=0&&p<d.length){let h=d[p];h.style.color!==R&&(h.style.backgroundColor="transparent")}if(p=g,p>=0&&p<d.length){let h=d[p];h.style.color!==R&&(h.style.backgroundColor=X),h.scrollIntoView({block:"nearest"}),a&&p>=0&&p<n.length&&a(n[p])}};P=g=>{g.key==="ArrowDown"?(g.preventDefault(),g.stopPropagation(),v(p<d.length-1?p+1:0)):g.key==="ArrowUp"?(g.preventDefault(),g.stopPropagation(),v(p>0?p-1:d.length-1)):g.key==="Enter"&&p>=0&&p<n.length&&(g.preventDefault(),g.stopPropagation(),u&&u(),l(n[p]),D())},document.addEventListener("keydown",P,!0)}function We(e,n){let r=!0;_=l=>{if(r){r=!1;return}let a=l.target;!e.contains(a)&&a!==n&&D()},document.addEventListener("mousedown",_,!0)}function ge(e,n,r,l){D();let a=Re(n,r,{...l,onSelect:d=>{l.onHoverEnd&&l.onHoverEnd(),l.onSelect(d),D()}}),u=e.parentElement;u&&(a.style.top=`${e.offsetTop+e.offsetHeight+2}px`,a.style.left=`${e.offsetLeft}px`,u.appendChild(a),O=a,N=e,e.textContent?.endsWith(M.trim())&&(e.textContent=e.textContent.slice(0,-M.length)+H),k=l.onHoverEnd??null,ke(a,n,r,l),We(a,e))}function D(){N?.textContent?.includes(H)&&(N.textContent=N.textContent.replace(H,M)),N=null,k&&(k(),k=null),O&&O.parentNode&&O.remove(),O=null,_&&(document.removeEventListener("mousedown",_,!0),_=null),P&&(document.removeEventListener("keydown",P,!0),P=null)}function he(){return O!==null}function ye(e){let n=null,r=null,l=null,a=()=>{n&&n.parentNode&&n.remove(),n=null},u=I=>{a(),T(I.element)!==e.getSelectedElementId()&&(n=e.createPreviewOverlay(I.element))},d=I=>{a(),D(),r&&(document.removeEventListener("keydown",r,!0),r=null),l=null;let o=e.selectElement(I.element);g(o,I.element)},p=()=>{r&&(document.removeEventListener("keydown",r,!0),r=null),l&&(d(l),l=null)},v=(I,o,f,b,S)=>{I.stopPropagation(),I.preventDefault(),he()?(D(),p()):(l={element:f,tagName:f.tagName.toLowerCase(),selectorId:S},e.onDeselect(),r=y=>{y.key==="Escape"&&(y.stopPropagation(),D(),p())},document.addEventListener("keydown",r,!0),ge(o,b,f,{onSelect:d,onHover:u,onHoverEnd:a}))},g=(I,o)=>{if(!I)return;let f=I.querySelector("div");if(!f)return;let b=me(o);if(b.length<=1)return;let S=T(o);Ee(f),f.addEventListener("click",y=>{v(y,f,o,b,S)})};return{attachToOverlay:g,cleanup:()=>{a(),D()}}}var $="visual-edit-focus-styles",Ve=["div","p","h1","h2","h3","h4","h5","h6","span","li","td","a","button","label"],j=e=>!!e.dataset.arrField,Be=e=>!(!Ve.includes(e.tagName.toLowerCase())||!e.textContent?.trim()||e.querySelector("img, video, canvas, svg")||e.children?.length>0),ve=()=>{if(document.getElementById($))return;let e=document.createElement("style");e.id=$,e.textContent=`
|
|
2
2
|
[data-selected="true"][contenteditable="true"]:focus {
|
|
3
3
|
outline: none !important;
|
|
4
4
|
}
|
|
5
|
-
`,document.head.appendChild(e)},he=()=>{document.getElementById(G)?.remove()},ve=e=>{let n=document.createRange();n.selectNodeContents(e);let r=window.getSelection();r?.removeAllRanges(),r?.addRange(n)},We=e=>!(!(e instanceof HTMLElement)||!ke.includes(e.tagName.toLowerCase())||!e.textContent?.trim()||e.querySelector("img, video, canvas, svg")||e.children?.length>0||e.dataset.dynamicContent==="true"),$=e=>!(e instanceof HTMLElement)||e.dataset.selected!=="true"?!1:We(e);var Ve=500;function F(e){let n=null,r=null,l=!1,a=new WeakMap,c=()=>{let o=e.getSelectedElementId();if(!o)return;let f=e.findElementsById(o);e.getSelectedOverlays().forEach((C,v)=>{v<f.length&&f[v]&&e.positionOverlay(C,f[v])})},d=o=>{let f=o.dataset.originalTextContent,I=o.textContent,C=o,v=o.getBoundingClientRect();window.parent.postMessage({type:"inline-edit",elementInfo:{tagName:o.tagName,classes:C.className?.baseVal||o.className||"",visualSelectorId:e.getSelectedElementId(),content:I,dataSourceLocation:o.dataset.sourceLocation,isDynamicContent:o.dataset.dynamicContent==="true",linenumber:o.dataset.linenumber,filename:o.dataset.filename,position:{top:v.top,left:v.left,right:v.right,bottom:v.bottom,width:v.width,height:v.height,centerX:v.left+v.width/2,centerY:v.top+v.height/2}},originalContent:f,newContent:I},"*"),o.dataset.originalTextContent=I||""},p=o=>{r&&clearTimeout(r),r=setTimeout(()=>d(o),Ve)},y=o=>{c(),p(o)},E=function(){y(this)},h=o=>{ge(),o.dataset.originalTextContent=o.textContent||"",o.dataset.originalCursor=o.style.cursor,o.contentEditable="true";let f=new AbortController;a.set(o,f),o.addEventListener("input",E,{signal:f.signal}),o.style.cursor="text",ve(o),setTimeout(()=>{o.isConnected&&o.focus()},0)},L=o=>{let f=a.get(o);f&&(f.abort(),a.delete(o)),o.isConnected&&(he(),o.contentEditable="false",delete o.dataset.originalTextContent,o.dataset.originalCursor!==void 0&&(o.style.cursor=o.dataset.originalCursor,delete o.dataset.originalCursor))};return{get enabled(){return l},set enabled(o){l=o},isEditing(){return n!==null},getCurrentElement(){return n},canEdit(o){return $(o)},startEditing(o){n=o,e.getSelectedOverlays().forEach(f=>{f.style.display="none"}),h(o),window.parent.postMessage({type:"content-editing-started",visualSelectorId:e.getSelectedElementId()},"*")},stopEditing(){if(!n)return;r&&(clearTimeout(r),r=null),L(n),e.getSelectedOverlays().forEach(f=>{f.style.display=""}),c(),window.parent.postMessage({type:"content-editing-ended",visualSelectorId:e.getSelectedElementId()},"*"),n=null},markElementsSelected(o){o.forEach(f=>{f instanceof HTMLElement&&(f.dataset.selected="true")})},clearSelectedMarks(o){o&&e.findElementsById(o).forEach(f=>{f instanceof HTMLElement&&delete f.dataset.selected})},handleToggleMessage(o){if(!l)return;let f=e.findElementsById(o.dataSourceLocation);if(f.length===0||!(f[0]instanceof HTMLElement))return;let I=f[0];if(o.inlineEditingMode){if(!$(I))return;e.getSelectedElementId()!==o.dataSourceLocation&&(this.stopEditing(),e.clearSelection(),this.markElementsSelected(f),e.createSelectionOverlays(f,o.dataSourceLocation)),this.startEditing(I)}else n===I&&this.stopEditing()},cleanup(){this.stopEditing()}}}function Be(){let e=!1,n=!1,r=!1,l=[],a=[],c=[],d=null,p=50,y=(s=!1)=>{let t=document.createElement("div");return t.style.position="absolute",t.style.pointerEvents="none",t.style.transition="all 0.1s ease-in-out",t.style.zIndex="9999",s?t.style.border="2px solid #2563EB":(t.style.border="2px solid #95a5fc",t.style.backgroundColor="rgba(99, 102, 241, 0.05)"),t},E=(s,t,i=!1)=>{if(!t||!e)return;t.offsetWidth;let u=t.getBoundingClientRect();s.style.top=`${u.top+window.scrollY}px`,s.style.left=`${u.left+window.scrollX}px`,s.style.width=`${u.width}px`,s.style.height=`${u.height}px`;let g=s.querySelector("div");g||(g=document.createElement("div"),g.textContent=t.tagName.toLowerCase(),g.style.position="absolute",g.style.top="-27px",g.style.left="-2px",g.style.padding="2px 8px",g.style.fontSize="11px",g.style.fontWeight=i?"500":"400",g.style.color=i?"#ffffff":"#526cff",g.style.backgroundColor=i?"#526cff":"#DBEAFE",g.style.borderRadius="3px",g.style.minWidth="24px",g.style.textAlign="center",s.appendChild(g))},h=F({findElementsById:T,getSelectedElementId:()=>d,getSelectedOverlays:()=>a,positionOverlay:E,clearSelection:()=>{h.clearSelectedMarks(d),f(),d=null},createSelectionOverlays:(s,t)=>{s.forEach(i=>{let m=y(!0);document.body.appendChild(m),a.push(m),E(m,i,!0)}),d=t}}),L=()=>{h.clearSelectedMarks(d),f(),d=null},o=()=>{l.forEach(s=>{s&&s.parentNode&&s.remove()}),l=[],c=[]},f=()=>{a.forEach(s=>{s&&s.parentNode&&s.remove()}),a=[]},I=["p","h1","h2","h3","h4","h5","h6","span","a","label"],C=s=>{let t=s,i=s.getBoundingClientRect(),m=s,u=I.includes(s.tagName?.toLowerCase());window.parent.postMessage({type:"element-selected",tagName:s.tagName,classes:m.className?.baseVal||s.className||"",visualSelectorId:b(s),content:u?t.innerText:void 0,dataSourceLocation:t.dataset.sourceLocation,isDynamicContent:t.dataset.dynamicContent==="true",linenumber:t.dataset.linenumber,filename:t.dataset.filename,position:{top:i.top,left:i.left,right:i.right,bottom:i.bottom,width:i.width,height:i.height,centerX:i.left+i.width/2,centerY:i.top+i.height/2},attributes:Q(s,V),isTextElement:u},"*")},v=s=>{let t=b(s);return f(),T(t||null).forEach(m=>{let u=y(!0);document.body.appendChild(u),a.push(u),E(u,m,!0)}),d=t||null,o(),C(s),a[0]},ye=()=>{d=null,window.parent.postMessage({type:"unselect-element"},"*")},j=s=>{if(!e||n||h.isEditing())return;let t=s.target;if(r){o();return}if(t.tagName.toLowerCase()==="path"){o();return}let i=t.closest("[data-source-location], [data-visual-selector-id]");if(!i){o();return}let m=i,u=m.dataset.sourceLocation||m.dataset.visualSelectorId;if(d===u){o();return}let g=T(u||null);o(),g.forEach(w=>{let S=y(!1);document.body.appendChild(S),l.push(S),E(S,w)}),c=g},q=()=>{n||o()},z=s=>{if(!e)return;let t=s.target;if(t.closest(`[${H}]`)||h.enabled&&t instanceof HTMLElement&&t.contentEditable==="true")return;if(h.isEditing()){s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation(),h.stopEditing();return}if(r){s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation(),window.parent.postMessage({type:"close-dropdowns"},"*");return}if(t.tagName.toLowerCase()==="path")return;s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation();let i=t.closest("[data-source-location], [data-visual-selector-id]");if(!i)return;let m=i,u=b(i);if(d===u&&m.dataset.selected==="true"&&h.enabled&&h.canEdit(m)){h.startEditing(m);return}h.stopEditing(),h.enabled&&h.markElementsSelected(T(u));let w=v(i);U.attachToOverlay(w,i)},Le=()=>{h.stopEditing(),L()},Ie=(s,t)=>{let i=T(s);i.length!==0&&(Z(i,t),setTimeout(()=>{d===s&&a.forEach((m,u)=>{u<i.length&&E(m,i[u])}),c.length>0&&c[0]?.dataset?.visualSelectorId===s&&l.forEach((g,w)=>{w<c.length&&E(g,c[w])})},p))},we=(s,t,i)=>{let m=T(s);m.length!==0&&(J(m,t,i),setTimeout(()=>{d===s&&a.forEach((u,g)=>{g<m.length&&E(u,m[g])})},p))},be=(s,t)=>{let i=T(s);i.length!==0&&(i.forEach(m=>{m.innerText=t}),setTimeout(()=>{d===s&&a.forEach((m,u)=>{u<i.length&&E(m,i[u])})},p))},U=Ee({createPreviewOverlay:s=>{let t=y(!1);return t.style.zIndex="9998",document.body.appendChild(t),E(t,s),t},getSelectedElementId:()=>d,selectElement:v,onDeselect:ye}),Te=s=>{e=s,s?(document.body.style.cursor="crosshair",document.addEventListener("mouseover",j),document.addEventListener("mouseout",q),document.addEventListener("click",z,!0)):(h.stopEditing(),L(),U.cleanup(),o(),c=[],document.body.style.cursor="default",document.removeEventListener("mouseover",j),document.removeEventListener("mouseout",q),document.removeEventListener("click",z,!0))},K=()=>{if(d){let s=T(d);if(s.length>0){let i=s[0].getBoundingClientRect(),m=window.innerHeight,u=window.innerWidth,g=i.top<m&&i.bottom>0&&i.left<u&&i.right>0,w={top:i.top,left:i.left,right:i.right,bottom:i.bottom,width:i.width,height:i.height,centerX:i.left+i.width/2,centerY:i.top+i.height/2};window.parent.postMessage({type:"element-position-update",position:w,isInViewport:g,visualSelectorId:d},"*")}}},Ce=s=>{let t=s.data;switch(t.type){case"toggle-visual-edit-mode":Te(t.data.enabled),t.data.specs?.newInlineEditEnabled!==void 0&&(h.enabled=t.data.specs.newInlineEditEnabled);break;case"update-classes":t.data&&t.data.classes!==void 0?Ie(t.data.visualSelectorId,t.data.classes):console.warn("[VisualEditAgent] Invalid update-classes message:",t);break;case"update-attribute":t.data&&t.data.visualSelectorId&&t.data.attribute!==void 0&&t.data.value!==void 0?we(t.data.visualSelectorId,t.data.attribute,t.data.value):console.warn("[VisualEditAgent] Invalid update-attribute message:",t);break;case"unselect-element":Le();break;case"refresh-page":window.location.reload();break;case"update-content":t.data&&t.data.content!==void 0?be(t.data.visualSelectorId,t.data.content):console.warn("[VisualEditAgent] Invalid update-content message:",t);break;case"request-element-position":if(d){let i=T(d);if(i.length>0){let u=i[0].getBoundingClientRect(),g=window.innerHeight,w=window.innerWidth,S=u.top<g&&u.bottom>0&&u.left<w&&u.right>0,De={top:u.top,left:u.left,right:u.right,bottom:u.bottom,width:u.width,height:u.height,centerX:u.left+u.width/2,centerY:u.top+u.height/2};window.parent.postMessage({type:"element-position-update",position:De,isInViewport:S,visualSelectorId:d},"*")}}break;case"popover-drag-state":t.data&&t.data.isDragging!==void 0&&(n=t.data.isDragging,t.data.isDragging&&o());break;case"dropdown-state":t.data&&t.data.isOpen!==void 0&&(r=t.data.isOpen,t.data.isOpen&&o());break;case"toggle-inline-edit-mode":t.data&&h.handleToggleMessage(t.data);break;default:break}},k=()=>{if(d){let s=T(d);a.forEach((t,i)=>{i<s.length&&E(t,s[i])})}c.length>0&&l.forEach((s,t)=>{t<c.length&&E(s,c[t])})};document.querySelectorAll("[data-linenumber]:not([data-visual-selector-id])").forEach((s,t)=>{let i=s,m=`visual-id-${i.dataset.filename}-${i.dataset.linenumber}-${t}`;i.dataset.visualSelectorId=m});let Se=new MutationObserver(s=>{s.some(i=>{let m=g=>{if(g.nodeType===Node.ELEMENT_NODE){let w=g;if(w.dataset&&w.dataset.visualSelectorId)return!0;for(let S=0;S<w.children.length;S++)if(m(w.children[S]))return!0}return!1};return i.type==="attributes"&&(i.attributeName==="style"||i.attributeName==="class"||i.attributeName==="width"||i.attributeName==="height")&&m(i.target)})&&setTimeout(k,p)});window.addEventListener("message",Ce),window.addEventListener("scroll",K,!0),document.addEventListener("scroll",K,!0),window.addEventListener("resize",k),window.addEventListener("scroll",k),Se.observe(document.body,{attributes:!0,childList:!0,subtree:!0,attributeFilter:["style","class","width","height"]}),window.parent.postMessage({type:"visual-edit-agent-ready"},"*")}export{Be as setupVisualEditAgent};
|
|
5
|
+
`,document.head.appendChild(e)},Le=()=>{document.getElementById($)?.remove()},Ie=e=>{let n=document.createRange();n.selectNodeContents(e);let r=window.getSelection();r?.removeAllRanges(),r?.addRange(n)},Fe=e=>!(e instanceof HTMLElement)||!Be(e)?!1:j(e)?!0:e.dataset.dynamicContent!=="true",q=e=>!(e instanceof HTMLElement)||e.dataset.selected!=="true"?!1:Fe(e);var Xe=500;function z(e){let n=null,r=null,l=!1,a=new WeakMap,u=()=>{let o=e.getSelectedElementId();if(!o)return;let f=e.findElementsById(o);e.getSelectedOverlays().forEach((S,y)=>{y<f.length&&f[y]&&e.positionOverlay(S,f[y])})},d=o=>{let f=o.dataset.originalTextContent,b=o.textContent,S=o,y=o.getBoundingClientRect(),x={type:"inline-edit",elementInfo:{tagName:o.tagName,classes:S.className?.baseVal||o.className||"",visualSelectorId:e.getSelectedElementId(),content:b,dataSourceLocation:o.dataset.sourceLocation,isDynamicContent:o.dataset.dynamicContent==="true",linenumber:o.dataset.linenumber,filename:o.dataset.filename,position:{top:y.top,left:y.left,right:y.right,bottom:y.bottom,width:y.width,height:y.height,centerX:y.left+y.width/2,centerY:y.top+y.height/2}},originalContent:f,newContent:b};j(o)&&(x.arrIndex=o.dataset.arrIndex,x.arrVariableName=o.dataset.arrVariableName,x.arrField=o.dataset.arrField),window.parent.postMessage(x,"*"),o.dataset.originalTextContent=b||""},p=o=>{r&&clearTimeout(r),r=setTimeout(()=>d(o),Xe)},v=o=>{u(),p(o)},g=function(){v(this)},h=o=>{ve(),o.dataset.originalTextContent=o.textContent||"",o.dataset.originalCursor=o.style.cursor,o.contentEditable="true";let f=new AbortController;a.set(o,f),o.addEventListener("input",g,{signal:f.signal}),o.style.cursor="text",Ie(o),setTimeout(()=>{o.isConnected&&o.focus()},0)},I=o=>{let f=a.get(o);f&&(f.abort(),a.delete(o)),o.isConnected&&(Le(),o.contentEditable="false",delete o.dataset.originalTextContent,o.dataset.originalCursor!==void 0&&(o.style.cursor=o.dataset.originalCursor,delete o.dataset.originalCursor))};return{get enabled(){return l},set enabled(o){l=o},isEditing(){return n!==null},getCurrentElement(){return n},canEdit(o){return q(o)},startEditing(o){n=o,e.getSelectedOverlays().forEach(f=>{f.style.display="none"}),h(o),window.parent.postMessage({type:"content-editing-started",visualSelectorId:e.getSelectedElementId()},"*")},stopEditing(){if(!n)return;r&&(clearTimeout(r),r=null),I(n),e.getSelectedOverlays().forEach(f=>{f.style.display=""}),u(),window.parent.postMessage({type:"content-editing-ended",visualSelectorId:e.getSelectedElementId()},"*"),n=null},markElementsSelected(o){o.forEach(f=>{f instanceof HTMLElement&&(f.dataset.selected="true")})},clearSelectedMarks(o){o&&e.findElementsById(o).forEach(f=>{f instanceof HTMLElement&&delete f.dataset.selected})},handleToggleMessage(o){if(!l)return;let f=e.findElementsById(o.dataSourceLocation);if(f.length===0||!(f[0]instanceof HTMLElement))return;let b=f[0];if(o.inlineEditingMode){if(!q(b))return;e.getSelectedElementId()!==o.dataSourceLocation&&(this.stopEditing(),e.clearSelection(),this.markElementsSelected(f),e.createSelectionOverlays(f,o.dataSourceLocation)),this.startEditing(b)}else n===b&&this.stopEditing()},cleanup(){this.stopEditing()}}}function Ye(){let e=!1,n=!1,r=!1,l=[],a=[],u=[],d=null,p=50,v=(s=!1)=>{let t=document.createElement("div");return t.style.position="absolute",t.style.pointerEvents="none",t.style.transition="all 0.1s ease-in-out",t.style.zIndex="9999",s?t.style.border="2px solid #2563EB":(t.style.border="2px solid #95a5fc",t.style.backgroundColor="rgba(99, 102, 241, 0.05)"),t},g=(s,t,i=!1)=>{if(!t||!e)return;t.offsetWidth;let c=t.getBoundingClientRect();s.style.top=`${c.top+window.scrollY}px`,s.style.left=`${c.left+window.scrollX}px`,s.style.width=`${c.width}px`,s.style.height=`${c.height}px`;let E=s.querySelector("div");E||(E=document.createElement("div"),E.textContent=t.tagName.toLowerCase(),E.style.position="absolute",E.style.top="-27px",E.style.left="-2px",E.style.padding="2px 8px",E.style.fontSize="11px",E.style.fontWeight=i?"500":"400",E.style.color=i?"#ffffff":"#526cff",E.style.backgroundColor=i?"#526cff":"#DBEAFE",E.style.borderRadius="3px",E.style.minWidth="24px",E.style.textAlign="center",s.appendChild(E))},h=z({findElementsById:C,getSelectedElementId:()=>d,getSelectedOverlays:()=>a,positionOverlay:g,clearSelection:()=>{h.clearSelectedMarks(d),f(),d=null},createSelectionOverlays:(s,t)=>{s.forEach(i=>{let m=v(!0);document.body.appendChild(m),a.push(m),g(m,i,!0)}),d=t}}),I=()=>{h.clearSelectedMarks(d),f(),d=null},o=()=>{l.forEach(s=>{s&&s.parentNode&&s.remove()}),l=[],u=[]},f=()=>{a.forEach(s=>{s&&s.parentNode&&s.remove()}),a=[]},b=["p","h1","h2","h3","h4","h5","h6","span","a","label"],S=s=>{let t=s,i=s.getBoundingClientRect(),m=s,c=b.includes(s.tagName?.toLowerCase()),E=t.closest("[data-arr-variable-name]"),L=E?.dataset?.arrVariableName||null,w=E?.dataset?.arrIndex,V=w!=null?parseInt(w,10):null,Me=t.dataset?.arrField||null;window.parent.postMessage({type:"element-selected",tagName:s.tagName,classes:m.className?.baseVal||s.className||"",visualSelectorId:T(s),content:c?t.innerText:void 0,dataSourceLocation:t.dataset.sourceLocation,isDynamicContent:t.dataset.dynamicContent==="true",linenumber:t.dataset.linenumber,filename:t.dataset.filename,position:{top:i.top,left:i.left,right:i.right,bottom:i.bottom,width:i.width,height:i.height,centerX:i.left+i.width/2,centerY:i.top+i.height/2},attributes:ne(s,F),isTextElement:c,staticArrayName:L,staticArrayIndex:V,staticArrayField:Me},"*")},y=s=>{let t=T(s);return f(),C(t||null).forEach(m=>{let c=v(!0);document.body.appendChild(c),a.push(c),g(c,m,!0)}),d=t||null,o(),S(s),a[0]},x=()=>{d=null,window.parent.postMessage({type:"unselect-element"},"*")},U=s=>{if(!e||n||h.isEditing())return;let t=s.target;if(r){o();return}if(t.tagName.toLowerCase()==="path"){o();return}let i=t.closest("[data-source-location], [data-visual-selector-id]");if(!i){o();return}let m=i,c=m.dataset.sourceLocation||m.dataset.visualSelectorId;if(d===c){o();return}let E=C(c||null);o(),E.forEach(L=>{let w=v(!1);document.body.appendChild(w),l.push(w),g(w,L)}),u=E},K=()=>{n||o()},Z=s=>{if(!e)return;let t=s.target;if(t.closest(`[${A}]`)||h.enabled&&t instanceof HTMLElement&&t.contentEditable==="true")return;if(h.isEditing()){s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation(),h.stopEditing();return}if(r){s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation(),window.parent.postMessage({type:"close-dropdowns"},"*");return}if(t.tagName.toLowerCase()==="path")return;s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation();let i=t.closest("[data-source-location], [data-visual-selector-id]");if(!i)return;let m=i,c=T(i);if(d===c&&m.dataset.selected==="true"&&h.enabled&&h.canEdit(m)){h.startEditing(m);return}h.stopEditing(),h.enabled&&h.markElementsSelected(C(c));let L=y(i);J.attachToOverlay(L,i)},be=()=>{h.stopEditing(),I()},we=(s,t)=>{let i=C(s);i.length!==0&&(ee(i,t),setTimeout(()=>{d===s&&a.forEach((m,c)=>{c<i.length&&g(m,i[c])}),u.length>0&&u[0]?.dataset?.visualSelectorId===s&&l.forEach((E,L)=>{L<u.length&&g(E,u[L])})},p))},Te=(s,t,i)=>{let m=C(s);m.length!==0&&(te(m,t,i),setTimeout(()=>{d===s&&a.forEach((c,E)=>{E<m.length&&g(c,m[E])})},p))},Ce=(s,t,i)=>{let m=C(s);m.length!==0&&(i!=null&&(m=m.filter(c=>c.dataset.arrIndex===String(i))),m.forEach(c=>{c.innerText=t}),setTimeout(()=>{d===s&&a.forEach((c,E)=>{E<m.length&&g(c,m[E])})},p))},J=ye({createPreviewOverlay:s=>{let t=v(!1);return t.style.zIndex="9998",document.body.appendChild(t),g(t,s),t},getSelectedElementId:()=>d,selectElement:y,onDeselect:x}),Se=s=>{e=s,s?(document.body.style.cursor="crosshair",document.addEventListener("mouseover",U),document.addEventListener("mouseout",K),document.addEventListener("click",Z,!0)):(h.stopEditing(),I(),J.cleanup(),o(),u=[],document.body.style.cursor="default",document.removeEventListener("mouseover",U),document.removeEventListener("mouseout",K),document.removeEventListener("click",Z,!0))},Q=()=>{if(d){let s=C(d);if(s.length>0){let i=s[0].getBoundingClientRect(),m=window.innerHeight,c=window.innerWidth,E=i.top<m&&i.bottom>0&&i.left<c&&i.right>0,L={top:i.top,left:i.left,right:i.right,bottom:i.bottom,width:i.width,height:i.height,centerX:i.left+i.width/2,centerY:i.top+i.height/2};window.parent.postMessage({type:"element-position-update",position:L,isInViewport:E,visualSelectorId:d},"*")}}},De=s=>{let t=s.data;switch(t.type){case"toggle-visual-edit-mode":Se(t.data.enabled),t.data.specs?.newInlineEditEnabled!==void 0&&(h.enabled=t.data.specs.newInlineEditEnabled);break;case"update-classes":t.data&&t.data.classes!==void 0?we(t.data.visualSelectorId,t.data.classes):console.warn("[VisualEditAgent] Invalid update-classes message:",t);break;case"update-attribute":t.data&&t.data.visualSelectorId&&t.data.attribute!==void 0&&t.data.value!==void 0?Te(t.data.visualSelectorId,t.data.attribute,t.data.value):console.warn("[VisualEditAgent] Invalid update-attribute message:",t);break;case"unselect-element":be();break;case"refresh-page":window.location.reload();break;case"update-content":t.data&&t.data.content!==void 0?Ce(t.data.visualSelectorId,t.data.content,t.data.arrIndex):console.warn("[VisualEditAgent] Invalid update-content message:",t);break;case"request-element-position":if(d){let i=C(d);if(i.length>0){let c=i[0].getBoundingClientRect(),E=window.innerHeight,L=window.innerWidth,w=c.top<E&&c.bottom>0&&c.left<L&&c.right>0,V={top:c.top,left:c.left,right:c.right,bottom:c.bottom,width:c.width,height:c.height,centerX:c.left+c.width/2,centerY:c.top+c.height/2};window.parent.postMessage({type:"element-position-update",position:V,isInViewport:w,visualSelectorId:d},"*")}}break;case"popover-drag-state":t.data&&t.data.isDragging!==void 0&&(n=t.data.isDragging,t.data.isDragging&&o());break;case"dropdown-state":t.data&&t.data.isOpen!==void 0&&(r=t.data.isOpen,t.data.isOpen&&o());break;case"toggle-inline-edit-mode":t.data&&h.handleToggleMessage(t.data);break;default:break}},W=()=>{if(d){let s=C(d);a.forEach((t,i)=>{i<s.length&&g(t,s[i])})}u.length>0&&l.forEach((s,t)=>{t<u.length&&g(s,u[t])})};document.querySelectorAll("[data-linenumber]:not([data-visual-selector-id])").forEach((s,t)=>{let i=s,m=`visual-id-${i.dataset.filename}-${i.dataset.linenumber}-${t}`;i.dataset.visualSelectorId=m});let xe=new MutationObserver(s=>{s.some(i=>{let m=E=>{if(E.nodeType===Node.ELEMENT_NODE){let L=E;if(L.dataset&&L.dataset.visualSelectorId)return!0;for(let w=0;w<L.children.length;w++)if(m(L.children[w]))return!0}return!1};return i.type==="attributes"&&(i.attributeName==="style"||i.attributeName==="class"||i.attributeName==="width"||i.attributeName==="height")&&m(i.target)})&&setTimeout(W,p)});window.addEventListener("message",De),window.addEventListener("scroll",Q,!0),document.addEventListener("scroll",Q,!0),window.addEventListener("resize",W),window.addEventListener("scroll",W),xe.observe(document.body,{attributes:!0,childList:!0,subtree:!0,attributeFilter:["style","class","width","height"]}),window.parent.postMessage({type:"visual-edit-agent-ready"},"*")}export{Ye as setupVisualEditAgent};
|
|
6
6
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/injections/utils.ts","../../src/injections/layer-dropdown/consts.ts","../../src/injections/layer-dropdown/utils.ts","../../src/injections/layer-dropdown/dropdown-ui.ts","../../src/injections/layer-dropdown/controller.ts","../../src/capabilities/inline-edit/dom-utils.ts","../../src/capabilities/inline-edit/controller.ts","../../src/injections/visual-edit-agent.ts"],"sourcesContent":["/** Check if an element has instrumentation attributes */\nexport function isInstrumentedElement(element: Element): boolean {\n const htmlEl = element as HTMLElement;\n return !!(\n htmlEl.dataset?.sourceLocation || htmlEl.dataset?.visualSelectorId\n );\n}\n\n/** Get the selector ID from an element's data attributes (prefers source-location) */\nexport function getElementSelectorId(element: Element): string | null {\n const htmlEl = element as HTMLElement;\n return (\n htmlEl.dataset?.sourceLocation ||\n htmlEl.dataset?.visualSelectorId ||\n null\n );\n}\n\nexport const ALLOWED_ATTRIBUTES: string[] = [\"src\"];\n\n/** Find elements by ID - first try data-source-location, fallback to data-visual-selector-id */\nexport function findElementsById(id: string | null): Element[] {\n if (!id) return [];\n const sourceElements = Array.from(\n document.querySelectorAll(`[data-source-location=\"${id}\"]`)\n );\n if (sourceElements.length > 0) {\n return sourceElements;\n }\n return Array.from(\n document.querySelectorAll(`[data-visual-selector-id=\"${id}\"]`)\n );\n}\n\n/**\n * Update element classes by visual selector ID.\n * Uses setAttribute instead of className to support both HTML and SVG elements.\n */\nexport function updateElementClasses(elements: Element[], classes: string): void {\n elements.forEach((element) => {\n element.setAttribute(\"class\", classes);\n });\n}\n\n/** Set a single attribute on all provided elements. */\nexport function updateElementAttribute(elements: Element[], attribute: string, value: string): void {\n if (!ALLOWED_ATTRIBUTES.includes(attribute)) {\n return;\n }\n\n elements.forEach((element) => {\n element.setAttribute(attribute, value);\n });\n}\n\n/** Collect attribute values from an element for a given allowlist. */\nexport function collectAllowedAttributes(element: Element, allowedAttributes: string[]): Record<string, string> {\n const attributes: Record<string, string> = {};\n for (const attr of allowedAttributes) {\n const val = element.getAttribute(attr);\n if (val !== null) {\n attributes[attr] = val;\n }\n }\n return attributes;\n}\n","/** Style constants for the layer dropdown UI */\n\nexport const DROPDOWN_CONTAINER_STYLES: Record<string, string> = {\n position: \"absolute\",\n backgroundColor: \"#ffffff\",\n border: \"1px solid #e2e8f0\",\n borderRadius: \"6px\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n fontSize: \"12px\",\n minWidth: \"120px\",\n maxHeight: \"200px\",\n overflowY: \"auto\",\n zIndex: \"10001\",\n padding: \"4px 0\",\n pointerEvents: \"auto\",\n};\n\nexport const DROPDOWN_ITEM_BASE_STYLES: Record<string, string> = {\n padding: \"4px 12px\",\n cursor: \"pointer\",\n color: \"#334155\",\n backgroundColor: \"transparent\",\n whiteSpace: \"nowrap\",\n lineHeight: \"1.5\",\n fontWeight: \"400\",\n};\n\nexport const DROPDOWN_ITEM_ACTIVE_COLOR = \"#526cff\";\nexport const DROPDOWN_ITEM_ACTIVE_BG = \"#DBEAFE\";\nexport const DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT = \"600\";\n\nexport const DROPDOWN_ITEM_HOVER_BG = \"#f1f5f9\";\n\nexport const DEPTH_INDENT_PX = 10;\n\n/** Chevron shown when dropdown is collapsed (click to expand) */\nexport const CHEVRON_COLLAPSED = \" \\u25BE\";\n/** Chevron shown when dropdown is expanded (click to collapse) */\nexport const CHEVRON_EXPANDED = \" \\u25B4\";\n\nexport const BASE_PADDING_PX = 12;\n\nexport const LAYER_DROPDOWN_ATTR = \"data-layer-dropdown\";\n\n/** Max instrumented ancestors to show above the selected element */\nexport const MAX_PARENT_DEPTH = 2;\n\n/** Max instrumented depth levels to show below the selected element */\nexport const MAX_CHILD_DEPTH = 2;\n","/** DOM utilities for the layer-dropdown module */\n\nimport { isInstrumentedElement, getElementSelectorId } from \"../utils.js\";\nimport { MAX_PARENT_DEPTH, MAX_CHILD_DEPTH } from \"./consts.js\";\n\nimport type { LayerInfo } from \"./types.js\";\n\n/** Apply a style map to an element */\nexport function applyStyles(element: HTMLElement, styles: Record<string, string>): void {\n for (const key of Object.keys(styles)) {\n element.style.setProperty(\n key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n styles[key]!\n );\n }\n}\n\n/** Display name for a layer — just the real tag name */\nexport function getLayerDisplayName(layer: LayerInfo): string {\n return layer.tagName;\n}\n\nfunction toLayerInfo(element: Element, depth?: number): LayerInfo {\n const info: LayerInfo = {\n element,\n tagName: element.tagName.toLowerCase(),\n selectorId: getElementSelectorId(element),\n };\n if (depth !== undefined) info.depth = depth;\n return info;\n}\n\n/**\n * Collect instrumented descendants up to `maxDepth` instrumented nesting levels.\n * Non-instrumented wrappers are walked through without counting toward depth.\n * Results are in DOM order.\n * When `startDepth` is provided, assigns `depth` to each item during collection.\n */\nexport function getInstrumentedDescendants(\n parent: Element,\n maxDepth: number,\n startDepth?: number\n): LayerInfo[] {\n const result: LayerInfo[] = [];\n\n function walk(el: Element, instrDepth: number): void {\n if (instrDepth > maxDepth) return;\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i]!;\n if (isInstrumentedElement(child)) {\n const info: LayerInfo = {\n element: child,\n tagName: child.tagName.toLowerCase(),\n selectorId: getElementSelectorId(child),\n };\n if (startDepth !== undefined) {\n info.depth = startDepth + instrDepth - 1;\n }\n result.push(info);\n walk(child, instrDepth + 1);\n } else {\n walk(child, instrDepth);\n }\n }\n }\n\n walk(parent, 1);\n return result;\n}\n\n/** Collect instrumented ancestors from selected element up to MAX_PARENT_DEPTH (outermost first). */\nfunction collectInstrumentedParents(selectedElement: Element): LayerInfo[] {\n const parents: LayerInfo[] = [];\n let current = selectedElement.parentElement;\n while (\n current &&\n current !== document.documentElement &&\n current !== document.body &&\n parents.length < MAX_PARENT_DEPTH\n ) {\n if (isInstrumentedElement(current)) {\n parents.push(toLayerInfo(current));\n }\n current = current.parentElement;\n }\n parents.reverse();\n return parents;\n}\n\n/** Add parents to chain with depth 0, 1, …; returns depth of selected (parents.length). */\nfunction addParentsToChain(chain: LayerInfo[], parents: LayerInfo[]): number {\n parents.forEach((p, i) => {\n chain.push({ ...p, depth: i });\n });\n return parents.length;\n}\n\n/** Add selected element and its descendants at the given depth. */\nfunction addSelfAndDescendantsToChain(\n chain: LayerInfo[],\n selectedElement: Element,\n selfDepth: number\n): void {\n chain.push(toLayerInfo(selectedElement, selfDepth));\n const descendants = getInstrumentedDescendants(\n selectedElement,\n MAX_CHILD_DEPTH,\n selfDepth + 1\n );\n chain.push(...descendants);\n}\n\n/** Get the innermost instrumented parent's DOM element, or null if none. */\nfunction getImmediateInstrParent(parents: LayerInfo[]): Element | null {\n return parents.at(-1)?.element ?? null;\n}\n\n/** Collect instrumented siblings of the selected element from its parent (DOM order). */\nfunction collectSiblings(parent: Element, selectedElement: Element): LayerInfo[] {\n const siblings = getInstrumentedDescendants(parent, 1);\n if (!siblings.some((s) => s.element === selectedElement)) {\n siblings.push(toLayerInfo(selectedElement));\n }\n return siblings;\n}\n\n/** Add siblings at selfDepth, expanding children only for the selected element. */\nfunction appendSiblingsWithSelected(\n chain: LayerInfo[],\n siblings: LayerInfo[],\n selectedElement: Element,\n selfDepth: number\n): void {\n const selectedSelectorId = getElementSelectorId(selectedElement);\n const seen = new Set<string>();\n for (const sibling of siblings) {\n if (sibling.element === selectedElement) {\n addSelfAndDescendantsToChain(chain, selectedElement, selfDepth);\n if (selectedSelectorId) seen.add(selectedSelectorId);\n } else {\n const id = sibling.selectorId;\n if (id != null) {\n if (id === selectedSelectorId || seen.has(id)) continue;\n seen.add(id);\n }\n chain.push({ ...sibling, depth: selfDepth });\n }\n }\n}\n\n/**\n * Build the layer chain for the dropdown:\n *\n * Parents – up to MAX_PARENT_DEPTH instrumented ancestors, outer → inner.\n * Siblings – instrumented children of the immediate parent, at the same depth.\n * Current – the selected element (highlighted), with children expanded.\n * Children – instrumented descendants within MAX_CHILD_DEPTH levels, DOM order.\n *\n * Each item carries a `depth` for visual indentation.\n */\nexport function buildLayerChain(selectedElement: Element): LayerInfo[] {\n const parents = collectInstrumentedParents(selectedElement);\n const chain: LayerInfo[] = [];\n const selfDepth = addParentsToChain(chain, parents);\n\n const instrParent = getImmediateInstrParent(parents);\n if (instrParent) {\n const siblings = collectSiblings(instrParent, selectedElement);\n appendSiblingsWithSelected(chain, siblings, selectedElement, selfDepth);\n } else {\n addSelfAndDescendantsToChain(chain, selectedElement, selfDepth);\n }\n\n return chain;\n}\n","/** Dropdown UI component for layer navigation */\n\nimport {\n DROPDOWN_CONTAINER_STYLES,\n DROPDOWN_ITEM_BASE_STYLES,\n DROPDOWN_ITEM_ACTIVE_COLOR,\n DROPDOWN_ITEM_ACTIVE_BG,\n DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT,\n DROPDOWN_ITEM_HOVER_BG,\n DEPTH_INDENT_PX,\n BASE_PADDING_PX,\n CHEVRON_COLLAPSED,\n CHEVRON_EXPANDED,\n LAYER_DROPDOWN_ATTR,\n} from \"./consts.js\";\nimport { applyStyles, getLayerDisplayName } from \"./utils.js\";\nimport type { LayerInfo, DropdownCallbacks } from \"./types.js\";\n\nlet activeDropdown: HTMLDivElement | null = null;\nlet activeLabel: HTMLDivElement | null = null;\nlet outsideMousedownHandler: ((e: MouseEvent) => void) | null = null;\nlet activeOnHoverEnd: (() => void) | null = null;\nlet activeKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n\nfunction createDropdownItem(\n layer: LayerInfo,\n isActive: boolean,\n { onSelect, onHover, onHoverEnd }: DropdownCallbacks\n): HTMLDivElement {\n const item = document.createElement(\"div\");\n item.textContent = getLayerDisplayName(layer);\n applyStyles(item, DROPDOWN_ITEM_BASE_STYLES);\n\n const depth = layer.depth ?? 0;\n if (depth > 0) {\n item.style.paddingLeft = `${BASE_PADDING_PX + depth * DEPTH_INDENT_PX}px`;\n }\n\n if (isActive) {\n item.style.color = DROPDOWN_ITEM_ACTIVE_COLOR;\n item.style.backgroundColor = DROPDOWN_ITEM_ACTIVE_BG;\n item.style.fontWeight = DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT;\n }\n\n item.addEventListener(\"mouseenter\", () => {\n if (!isActive) item.style.backgroundColor = DROPDOWN_ITEM_HOVER_BG;\n if (onHover) onHover(layer);\n });\n\n item.addEventListener(\"mouseleave\", () => {\n if (!isActive) item.style.backgroundColor = \"transparent\";\n if (onHoverEnd) onHoverEnd();\n });\n\n item.addEventListener(\"click\", (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n onSelect(layer);\n });\n\n return item;\n}\n\n/** Create the dropdown DOM element with layer items */\nexport function createDropdownElement(\n layers: LayerInfo[],\n currentElement: Element | null,\n callbacks: DropdownCallbacks\n): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.setAttribute(LAYER_DROPDOWN_ATTR, \"true\");\n applyStyles(container, DROPDOWN_CONTAINER_STYLES);\n\n layers.forEach((layer) => {\n const isActive = layer.element === currentElement;\n container.appendChild(createDropdownItem(layer, isActive, callbacks));\n });\n\n return container;\n}\n\n/** Add chevron indicator and pointer-events to the label */\nexport function enhanceLabelWithChevron(label: HTMLDivElement): void {\n const t = label.textContent ?? \"\";\n if (t.endsWith(CHEVRON_COLLAPSED) || t.endsWith(CHEVRON_EXPANDED)) return;\n\n label.textContent = t + CHEVRON_COLLAPSED;\n label.style.cursor = \"pointer\";\n label.style.userSelect = \"none\";\n label.style.whiteSpace = \"nowrap\";\n label.style.pointerEvents = \"auto\";\n label.setAttribute(LAYER_DROPDOWN_ATTR, \"true\");\n}\n\nfunction setupKeyboardNavigation(\n dropdown: HTMLDivElement,\n layers: LayerInfo[],\n currentElement: Element | null,\n { onSelect, onHover, onHoverEnd }: DropdownCallbacks\n): void {\n const items = Array.from(dropdown.children) as HTMLDivElement[];\n let focusedIndex = layers.findIndex((l) => l.element === currentElement);\n\n const setFocusedItem = (index: number) => {\n if (focusedIndex >= 0 && focusedIndex < items.length) {\n const prev = items[focusedIndex]!;\n if (prev.style.color !== DROPDOWN_ITEM_ACTIVE_COLOR) {\n prev.style.backgroundColor = \"transparent\";\n }\n }\n focusedIndex = index;\n if (focusedIndex >= 0 && focusedIndex < items.length) {\n const cur = items[focusedIndex]!;\n if (cur.style.color !== DROPDOWN_ITEM_ACTIVE_COLOR) {\n cur.style.backgroundColor = DROPDOWN_ITEM_HOVER_BG;\n }\n cur.scrollIntoView({ block: \"nearest\" });\n if (onHover && focusedIndex >= 0 && focusedIndex < layers.length) {\n onHover(layers[focusedIndex]!);\n }\n }\n };\n\n activeKeydownHandler = (e: KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n setFocusedItem(focusedIndex < items.length - 1 ? focusedIndex + 1 : 0);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n e.stopPropagation();\n setFocusedItem(focusedIndex > 0 ? focusedIndex - 1 : items.length - 1);\n } else if (e.key === \"Enter\" && focusedIndex >= 0 && focusedIndex < layers.length) {\n e.preventDefault();\n e.stopPropagation();\n if (onHoverEnd) onHoverEnd();\n onSelect(layers[focusedIndex]!);\n closeDropdown();\n }\n };\n document.addEventListener(\"keydown\", activeKeydownHandler, true);\n}\n\nfunction setupOutsideClickHandler(\n dropdown: HTMLDivElement,\n label: HTMLDivElement\n): void {\n let skipFirst = true;\n outsideMousedownHandler = (e: MouseEvent) => {\n if (skipFirst) { skipFirst = false; return; }\n const target = e.target as Node;\n if (!dropdown.contains(target) && target !== label) {\n closeDropdown();\n }\n };\n document.addEventListener(\"mousedown\", outsideMousedownHandler, true);\n}\n\n/** Show the dropdown below the label element */\nexport function showDropdown(\n label: HTMLDivElement,\n layers: LayerInfo[],\n currentElement: Element | null,\n callbacks: DropdownCallbacks\n): void {\n closeDropdown();\n\n const dropdown = createDropdownElement(\n layers,\n currentElement,\n {\n ...callbacks,\n onSelect: (layer) => {\n if (callbacks.onHoverEnd) callbacks.onHoverEnd();\n callbacks.onSelect(layer);\n closeDropdown();\n },\n }\n );\n\n const overlay = label.parentElement;\n if (!overlay) return;\n\n dropdown.style.top = `${label.offsetTop + label.offsetHeight + 2}px`;\n dropdown.style.left = `${label.offsetLeft}px`;\n\n overlay.appendChild(dropdown);\n activeDropdown = dropdown;\n activeLabel = label;\n if (label.textContent?.endsWith(CHEVRON_COLLAPSED.trim())) {\n label.textContent = label.textContent.slice(0, -CHEVRON_COLLAPSED.length) + CHEVRON_EXPANDED;\n }\n activeOnHoverEnd = callbacks.onHoverEnd ?? null;\n\n setupKeyboardNavigation(dropdown, layers, currentElement, callbacks);\n setupOutsideClickHandler(dropdown, label);\n}\n\n/** Close the active dropdown and clean up listeners */\nexport function closeDropdown(): void {\n if (activeLabel?.textContent?.includes(CHEVRON_EXPANDED)) {\n activeLabel.textContent = activeLabel.textContent.replace(CHEVRON_EXPANDED, CHEVRON_COLLAPSED);\n }\n activeLabel = null;\n\n if (activeOnHoverEnd) {\n activeOnHoverEnd();\n activeOnHoverEnd = null;\n }\n\n if (activeDropdown && activeDropdown.parentNode) {\n activeDropdown.remove();\n }\n activeDropdown = null;\n\n if (outsideMousedownHandler) {\n document.removeEventListener(\"mousedown\", outsideMousedownHandler, true);\n outsideMousedownHandler = null;\n }\n\n if (activeKeydownHandler) {\n document.removeEventListener(\"keydown\", activeKeydownHandler, true);\n activeKeydownHandler = null;\n }\n}\n\n/** Check if a dropdown is currently visible */\nexport function isDropdownOpen(): boolean {\n return activeDropdown !== null;\n}\n","/** Controller that encapsulates layer-dropdown integration logic */\n\nimport { getElementSelectorId } from \"../utils.js\";\nimport { buildLayerChain } from \"./utils.js\";\nimport {\n enhanceLabelWithChevron,\n showDropdown,\n closeDropdown,\n isDropdownOpen,\n} from \"./dropdown-ui.js\";\nimport type { LayerInfo, LayerControllerConfig, LayerController } from \"./types.js\";\n\nexport function createLayerController(config: LayerControllerConfig): LayerController {\n let layerPreviewOverlay: HTMLDivElement | null = null;\n let escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n let dropdownSourceLayer: LayerInfo | null = null;\n\n const clearLayerPreview = () => {\n if (layerPreviewOverlay && layerPreviewOverlay.parentNode) {\n layerPreviewOverlay.remove();\n }\n layerPreviewOverlay = null;\n };\n\n const showLayerPreview = (layer: LayerInfo) => {\n clearLayerPreview();\n if (getElementSelectorId(layer.element) === config.getSelectedElementId()) return;\n\n layerPreviewOverlay = config.createPreviewOverlay(layer.element);\n };\n\n const selectLayer = (layer: LayerInfo) => {\n clearLayerPreview();\n closeDropdown();\n if (escapeHandler) {\n document.removeEventListener(\"keydown\", escapeHandler, true);\n escapeHandler = null;\n }\n dropdownSourceLayer = null;\n\n const firstOverlay = config.selectElement(layer.element);\n attachToOverlay(firstOverlay, layer.element);\n };\n\n const restoreSelection = () => {\n if (escapeHandler) {\n document.removeEventListener(\"keydown\", escapeHandler, true);\n escapeHandler = null;\n }\n if (dropdownSourceLayer) {\n selectLayer(dropdownSourceLayer);\n dropdownSourceLayer = null;\n }\n };\n\n const handleLabelClick = (e: MouseEvent, label: HTMLDivElement, element: Element, layers: LayerInfo[], currentId: string | null) => {\n e.stopPropagation();\n e.preventDefault();\n if (isDropdownOpen()) {\n closeDropdown();\n restoreSelection();\n } else {\n dropdownSourceLayer = {\n element,\n tagName: element.tagName.toLowerCase(),\n selectorId: currentId,\n };\n config.onDeselect();\n\n escapeHandler = (ev: KeyboardEvent) => {\n if (ev.key === \"Escape\") {\n ev.stopPropagation();\n closeDropdown();\n restoreSelection();\n }\n };\n document.addEventListener(\"keydown\", escapeHandler, true);\n\n showDropdown(label, layers, element, { onSelect: selectLayer, onHover: showLayerPreview, onHoverEnd: clearLayerPreview });\n }\n };\n\n const attachToOverlay = (\n overlay: HTMLDivElement | undefined,\n element: Element\n ) => {\n if (!overlay) return;\n\n const label = overlay.querySelector(\"div\") as HTMLDivElement | null;\n if (!label) return;\n\n const layers = buildLayerChain(element);\n if (layers.length <= 1) return;\n\n const currentId = getElementSelectorId(element);\n enhanceLabelWithChevron(label);\n\n label.addEventListener(\"click\", (e: MouseEvent) => {\n handleLabelClick(e, label, element, layers, currentId);\n });\n };\n\n const cleanup = () => {\n clearLayerPreview();\n closeDropdown();\n };\n\n return { attachToOverlay, cleanup };\n}\n","const FOCUS_STYLE_ID = \"visual-edit-focus-styles\";\n\nconst EDITABLE_TAGS = [\n \"div\", \"p\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"span\", \"li\", \"td\", \"a\", \"button\", \"label\",\n];\n\nexport const injectFocusOutlineCSS = () => {\n if (document.getElementById(FOCUS_STYLE_ID)) return;\n\n const style = document.createElement(\"style\");\n style.id = FOCUS_STYLE_ID;\n style.textContent = `\n [data-selected=\"true\"][contenteditable=\"true\"]:focus {\n outline: none !important;\n }\n `;\n document.head.appendChild(style);\n};\n\nexport const removeFocusOutlineCSS = () => {\n document.getElementById(FOCUS_STYLE_ID)?.remove();\n};\n\nexport const selectText = (element: HTMLElement) => {\n const range = document.createRange();\n range.selectNodeContents(element);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n};\n\nexport const isEditableTextElement = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) return false;\n if (!EDITABLE_TAGS.includes(element.tagName.toLowerCase())) return false;\n if (!element.textContent?.trim()) return false;\n if (element.querySelector(\"img, video, canvas, svg\")) return false;\n if (element.children?.length > 0) return false;\n if (element.dataset.dynamicContent === \"true\") return false;\n return true;\n};\n\nexport const shouldEnterInlineEditingMode = (element: Element): boolean => {\n if (!(element instanceof HTMLElement) || element.dataset.selected !== \"true\") {\n return false;\n }\n return isEditableTextElement(element);\n};\n","import type { InlineEditHost, InlineEditController } from \"./types.js\";\nimport {\n injectFocusOutlineCSS,\n removeFocusOutlineCSS,\n selectText,\n shouldEnterInlineEditingMode,\n} from \"./dom-utils.js\";\n\nconst DEBOUNCE_MS = 500;\n\nexport function createInlineEditController(\n host: InlineEditHost\n): InlineEditController {\n let currentEditingElement: HTMLElement | null = null;\n let debouncedSendTimeout: ReturnType<typeof setTimeout> | null = null;\n let enabled = false;\n const listenerAbortControllers = new WeakMap<HTMLElement, AbortController>();\n\n // --- Private helpers ---\n\n const repositionOverlays = () => {\n const selectedId = host.getSelectedElementId();\n if (!selectedId) return;\n const elements = host.findElementsById(selectedId);\n const overlays = host.getSelectedOverlays();\n overlays.forEach((overlay, i) => {\n if (i < elements.length && elements[i]) {\n host.positionOverlay(overlay, elements[i]);\n }\n });\n };\n\n const reportEdit = (element: HTMLElement) => {\n const originalContent = element.dataset.originalTextContent;\n const newContent = element.textContent;\n\n const svgElement = element as unknown as SVGElement;\n const rect = element.getBoundingClientRect();\n\n window.parent.postMessage(\n {\n type: \"inline-edit\",\n elementInfo: {\n tagName: element.tagName,\n classes:\n (svgElement.className as unknown as SVGAnimatedString)?.baseVal ||\n element.className ||\n \"\",\n visualSelectorId: host.getSelectedElementId(),\n content: newContent,\n dataSourceLocation: element.dataset.sourceLocation,\n isDynamicContent: element.dataset.dynamicContent === \"true\",\n linenumber: element.dataset.linenumber,\n filename: element.dataset.filename,\n position: {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n },\n },\n originalContent,\n newContent,\n },\n \"*\"\n );\n\n element.dataset.originalTextContent = newContent || \"\";\n };\n\n const debouncedReport = (element: HTMLElement) => {\n if (debouncedSendTimeout) clearTimeout(debouncedSendTimeout);\n debouncedSendTimeout = setTimeout(() => reportEdit(element), DEBOUNCE_MS);\n };\n\n const onTextInput = (element: HTMLElement) => {\n repositionOverlays();\n debouncedReport(element);\n };\n\n const handleInputEvent = function (this: HTMLElement) {\n onTextInput(this);\n };\n\n const makeEditable = (element: HTMLElement) => {\n injectFocusOutlineCSS();\n\n element.dataset.originalTextContent = element.textContent || \"\";\n element.dataset.originalCursor = element.style.cursor;\n element.contentEditable = \"true\";\n\n const abortController = new AbortController();\n listenerAbortControllers.set(element, abortController);\n element.addEventListener(\"input\", handleInputEvent, {\n signal: abortController.signal,\n });\n\n element.style.cursor = \"text\";\n selectText(element);\n setTimeout(() => {\n if (element.isConnected) {\n element.focus();\n }\n }, 0);\n };\n\n const makeNonEditable = (element: HTMLElement) => {\n const abortController = listenerAbortControllers.get(element);\n if (abortController) {\n abortController.abort();\n listenerAbortControllers.delete(element);\n }\n\n if (!element.isConnected) return;\n\n removeFocusOutlineCSS();\n element.contentEditable = \"false\";\n delete element.dataset.originalTextContent;\n\n if (element.dataset.originalCursor !== undefined) {\n element.style.cursor = element.dataset.originalCursor;\n delete element.dataset.originalCursor;\n }\n };\n\n // --- Public API ---\n\n return {\n get enabled() {\n return enabled;\n },\n set enabled(value: boolean) {\n enabled = value;\n },\n\n isEditing() {\n return currentEditingElement !== null;\n },\n\n getCurrentElement() {\n return currentEditingElement;\n },\n\n canEdit(element: Element) {\n return shouldEnterInlineEditingMode(element);\n },\n\n startEditing(element: HTMLElement) {\n currentEditingElement = element;\n\n host.getSelectedOverlays().forEach((o) => {\n o.style.display = \"none\";\n });\n\n makeEditable(element);\n\n window.parent.postMessage(\n {\n type: \"content-editing-started\",\n visualSelectorId: host.getSelectedElementId(),\n },\n \"*\"\n );\n },\n\n stopEditing() {\n if (!currentEditingElement) return;\n\n if (debouncedSendTimeout) {\n clearTimeout(debouncedSendTimeout);\n debouncedSendTimeout = null;\n }\n\n const element = currentEditingElement;\n makeNonEditable(element);\n\n host.getSelectedOverlays().forEach((o) => {\n o.style.display = \"\";\n });\n\n repositionOverlays();\n\n window.parent.postMessage(\n {\n type: \"content-editing-ended\",\n visualSelectorId: host.getSelectedElementId(),\n },\n \"*\"\n );\n\n currentEditingElement = null;\n },\n\n markElementsSelected(elements: Element[]) {\n elements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.dataset.selected = \"true\";\n }\n });\n },\n\n clearSelectedMarks(elementId: string | null) {\n if (!elementId) return;\n host.findElementsById(elementId).forEach((el) => {\n if (el instanceof HTMLElement) {\n delete el.dataset.selected;\n }\n });\n },\n\n handleToggleMessage(data: { dataSourceLocation: string; inlineEditingMode: boolean }) {\n if (!enabled) return;\n\n const elements = host.findElementsById(data.dataSourceLocation);\n if (elements.length === 0 || !(elements[0] instanceof HTMLElement)) return;\n\n const element = elements[0];\n\n if (data.inlineEditingMode) {\n if (!shouldEnterInlineEditingMode(element)) return;\n\n // Select the element first if not already selected\n if (host.getSelectedElementId() !== data.dataSourceLocation) {\n this.stopEditing();\n host.clearSelection();\n this.markElementsSelected(elements);\n host.createSelectionOverlays(elements, data.dataSourceLocation);\n }\n this.startEditing(element);\n } else {\n if (currentEditingElement === element) {\n this.stopEditing();\n }\n }\n },\n\n cleanup() {\n this.stopEditing();\n },\n };\n}\n","import { findElementsById, updateElementClasses, updateElementAttribute, collectAllowedAttributes, ALLOWED_ATTRIBUTES, getElementSelectorId } from \"./utils.js\";\nimport { createLayerController } from \"./layer-dropdown/controller.js\";\nimport { LAYER_DROPDOWN_ATTR } from \"./layer-dropdown/consts.js\";\nimport { createInlineEditController } from \"../capabilities/inline-edit/index.js\";\n\nexport function setupVisualEditAgent() {\n // State variables (replacing React useState/useRef)\n let isVisualEditMode = false;\n let isPopoverDragging = false;\n let isDropdownOpen = false;\n let hoverOverlays: HTMLDivElement[] = [];\n let selectedOverlays: HTMLDivElement[] = [];\n let currentHighlightedElements: Element[] = [];\n let selectedElementId: string | null = null;\n\n const REPOSITION_DELAY_MS = 50;\n\n // Create overlay element\n const createOverlay = (isSelected = false): HTMLDivElement => {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.transition = \"all 0.1s ease-in-out\";\n overlay.style.zIndex = \"9999\";\n\n if (isSelected) {\n overlay.style.border = \"2px solid #2563EB\";\n } else {\n overlay.style.border = \"2px solid #95a5fc\";\n overlay.style.backgroundColor = \"rgba(99, 102, 241, 0.05)\";\n }\n\n return overlay;\n };\n\n // Position overlay relative to element\n const positionOverlay = (\n overlay: HTMLDivElement,\n element: Element,\n isSelected = false\n ) => {\n if (!element || !isVisualEditMode) return;\n\n const htmlElement = element as HTMLElement;\n // Force layout recalculation\n void htmlElement.offsetWidth;\n\n const rect = element.getBoundingClientRect();\n overlay.style.top = `${rect.top + window.scrollY}px`;\n overlay.style.left = `${rect.left + window.scrollX}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n\n // Check if label already exists in overlay\n let label = overlay.querySelector(\"div\") as HTMLDivElement | null;\n\n if (!label) {\n label = document.createElement(\"div\");\n label.textContent = element.tagName.toLowerCase();\n label.style.position = \"absolute\";\n label.style.top = \"-27px\";\n label.style.left = \"-2px\";\n label.style.padding = \"2px 8px\";\n label.style.fontSize = \"11px\";\n label.style.fontWeight = isSelected ? \"500\" : \"400\";\n label.style.color = isSelected ? \"#ffffff\" : \"#526cff\";\n label.style.backgroundColor = isSelected ? \"#526cff\" : \"#DBEAFE\";\n label.style.borderRadius = \"3px\";\n label.style.minWidth = \"24px\";\n label.style.textAlign = \"center\";\n overlay.appendChild(label);\n }\n };\n\n // --- Inline edit controller ---\n const inlineEdit = createInlineEditController({\n findElementsById,\n getSelectedElementId: () => selectedElementId,\n getSelectedOverlays: () => selectedOverlays,\n positionOverlay,\n clearSelection: () => {\n inlineEdit.clearSelectedMarks(selectedElementId);\n clearSelectedOverlays();\n selectedElementId = null;\n },\n createSelectionOverlays: (elements, elementId) => {\n elements.forEach((el) => {\n const overlay = createOverlay(true);\n document.body.appendChild(overlay);\n selectedOverlays.push(overlay);\n positionOverlay(overlay, el, true);\n });\n selectedElementId = elementId;\n },\n });\n\n const clearSelection = () => {\n inlineEdit.clearSelectedMarks(selectedElementId);\n clearSelectedOverlays();\n selectedElementId = null;\n };\n\n // Clear hover overlays\n const clearHoverOverlays = () => {\n hoverOverlays.forEach((overlay) => {\n if (overlay && overlay.parentNode) {\n overlay.remove();\n }\n });\n hoverOverlays = [];\n currentHighlightedElements = [];\n };\n\n const clearSelectedOverlays = () => {\n selectedOverlays.forEach((overlay) => {\n if (overlay && overlay.parentNode) {\n overlay.remove();\n }\n });\n selectedOverlays = [];\n };\n\n const TEXT_TAGS = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'span', 'a', 'label'];\n\n const notifyElementSelected = (element: Element) => {\n const htmlElement = element as HTMLElement;\n const rect = element.getBoundingClientRect();\n const svgElement = element as SVGElement;\n const isTextElement = TEXT_TAGS.includes(element.tagName?.toLowerCase());\n window.parent.postMessage({\n type: \"element-selected\",\n tagName: element.tagName,\n classes:\n (svgElement.className as unknown as SVGAnimatedString)?.baseVal ||\n element.className ||\n \"\",\n visualSelectorId: getElementSelectorId(element),\n content: isTextElement ? htmlElement.innerText : undefined,\n dataSourceLocation: htmlElement.dataset.sourceLocation,\n isDynamicContent: htmlElement.dataset.dynamicContent === \"true\",\n linenumber: htmlElement.dataset.linenumber,\n filename: htmlElement.dataset.filename,\n position: {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n },\n attributes: collectAllowedAttributes(element, ALLOWED_ATTRIBUTES),\n isTextElement,\n }, \"*\");\n };\n\n // Select an element: create overlays, update state, notify parent\n const selectElement = (element: Element): HTMLDivElement | undefined => {\n const visualSelectorId = getElementSelectorId(element);\n\n clearSelectedOverlays();\n\n const elements = findElementsById(visualSelectorId || null);\n elements.forEach((el) => {\n const overlay = createOverlay(true);\n document.body.appendChild(overlay);\n selectedOverlays.push(overlay);\n positionOverlay(overlay, el, true);\n });\n\n selectedElementId = visualSelectorId || null;\n clearHoverOverlays();\n notifyElementSelected(element);\n\n return selectedOverlays[0];\n };\n\n const notifyDeselection = (): void => {\n selectedElementId = null;\n window.parent.postMessage({ type: \"unselect-element\" }, \"*\");\n };\n\n // Handle mouse over event\n const handleMouseOver = (e: MouseEvent) => {\n if (!isVisualEditMode || isPopoverDragging || inlineEdit.isEditing()) return;\n\n\n const target = e.target as Element;\n\n // Prevent hover effects when a dropdown is open\n if (isDropdownOpen) {\n clearHoverOverlays();\n return;\n }\n\n // Prevent hover effects on SVG path elements\n if (target.tagName.toLowerCase() === \"path\") {\n clearHoverOverlays();\n return;\n }\n\n // Support both data-source-location and data-visual-selector-id\n const element = target.closest(\n \"[data-source-location], [data-visual-selector-id]\"\n );\n if (!element) {\n clearHoverOverlays();\n return;\n }\n\n // Prefer data-source-location, fallback to data-visual-selector-id\n const htmlElement = element as HTMLElement;\n const selectorId =\n htmlElement.dataset.sourceLocation ||\n htmlElement.dataset.visualSelectorId;\n\n // Skip if this element is already selected\n if (selectedElementId === selectorId) {\n clearHoverOverlays();\n return;\n }\n\n // Find all elements with the same ID\n const elements = findElementsById(selectorId || null);\n\n // Clear previous hover overlays\n clearHoverOverlays();\n\n // Create overlays for all matching elements\n elements.forEach((el) => {\n const overlay = createOverlay(false);\n document.body.appendChild(overlay);\n hoverOverlays.push(overlay);\n positionOverlay(overlay, el);\n });\n\n currentHighlightedElements = elements;\n };\n\n // Handle mouse out event\n const handleMouseOut = () => {\n if (isPopoverDragging) return;\n clearHoverOverlays();\n };\n\n // Handle element click\n const handleElementClick = (e: MouseEvent) => {\n if (!isVisualEditMode) return;\n\n const target = e.target as Element;\n\n // Let layer dropdown clicks pass through without interference\n if (target.closest(`[${LAYER_DROPDOWN_ATTR}]`)) return;\n\n // Let clicks inside the editable element pass through to the browser\n // so the user can reposition the cursor and select text naturally.\n if (inlineEdit.enabled && target instanceof HTMLElement && target.contentEditable === \"true\") {\n return;\n }\n\n // Clicking outside the editable element exits inline editing mode.\n if (inlineEdit.isEditing()) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n inlineEdit.stopEditing();\n return;\n }\n\n // Close dropdowns when clicking anywhere in iframe if a dropdown is open\n if (isDropdownOpen) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n window.parent.postMessage({ type: \"close-dropdowns\" }, \"*\");\n return;\n }\n\n // Prevent clicking on SVG path elements\n if (target.tagName.toLowerCase() === \"path\") {\n return;\n }\n\n // Prevent default behavior immediately when in visual edit mode\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n // Support both data-source-location and data-visual-selector-id\n const element = target.closest(\n \"[data-source-location], [data-visual-selector-id]\"\n );\n if (!element) {\n return;\n }\n\n const htmlElement = element as HTMLElement;\n const visualSelectorId = getElementSelectorId(element);\n\n const isAlreadySelected =\n selectedElementId === visualSelectorId &&\n htmlElement.dataset.selected === \"true\";\n\n if (isAlreadySelected && inlineEdit.enabled && inlineEdit.canEdit(htmlElement)) {\n inlineEdit.startEditing(htmlElement);\n return;\n }\n\n inlineEdit.stopEditing();\n\n if (inlineEdit.enabled) {\n inlineEdit.markElementsSelected(findElementsById(visualSelectorId));\n }\n\n const selectedOverlay = selectElement(element);\n layerController.attachToOverlay(selectedOverlay, element);\n };\n\n const unselectElement = () => {\n inlineEdit.stopEditing();\n clearSelection();\n };\n\n const updateElementClassesAndReposition = (visualSelectorId: string, classes: string) => {\n const elements = findElementsById(visualSelectorId);\n if (elements.length === 0) return;\n\n updateElementClasses(elements, classes);\n\n // Use a small delay to allow the browser to recalculate layout before repositioning\n setTimeout(() => {\n // Reposition selected overlays\n if (selectedElementId === visualSelectorId) {\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n\n // Reposition hover overlays if needed\n if (currentHighlightedElements.length > 0) {\n const hoveredElement = currentHighlightedElements[0] as HTMLElement;\n const hoveredId = hoveredElement?.dataset?.visualSelectorId;\n if (hoveredId === visualSelectorId) {\n hoverOverlays.forEach((overlay, index) => {\n if (index < currentHighlightedElements.length) {\n positionOverlay(overlay, currentHighlightedElements[index]!);\n }\n });\n }\n }\n }, REPOSITION_DELAY_MS);\n };\n\n // Update element attribute by visual selector ID\n const updateElementAttributeAndReposition = (\n visualSelectorId: string,\n attribute: string,\n value: string\n ) => {\n const elements = findElementsById(visualSelectorId);\n if (elements.length === 0) return;\n\n updateElementAttribute(elements, attribute, value);\n\n // Reposition overlays after attribute change (e.g. image src swap can affect layout)\n setTimeout(() => {\n if (selectedElementId === visualSelectorId) {\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n }, REPOSITION_DELAY_MS);\n };\n\n // Update element content by visual selector ID\n const updateElementContent = (visualSelectorId: string, content: string) => {\n const elements = findElementsById(visualSelectorId);\n\n if (elements.length === 0) {\n return;\n }\n\n elements.forEach((element) => {\n (element as HTMLElement).innerText = content;\n });\n\n setTimeout(() => {\n if (selectedElementId === visualSelectorId) {\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n }, REPOSITION_DELAY_MS);\n };\n\n // --- Layer dropdown controller ---\n const layerController = createLayerController({\n createPreviewOverlay: (element: Element) => {\n const overlay = createOverlay(false);\n overlay.style.zIndex = \"9998\";\n document.body.appendChild(overlay);\n positionOverlay(overlay, element);\n return overlay;\n },\n getSelectedElementId: () => selectedElementId,\n selectElement,\n onDeselect: notifyDeselection,\n });\n\n // Toggle visual edit mode\n const toggleVisualEditMode = (isEnabled: boolean) => {\n isVisualEditMode = isEnabled;\n\n if (!isEnabled) {\n inlineEdit.stopEditing();\n clearSelection();\n layerController.cleanup();\n clearHoverOverlays();\n\n currentHighlightedElements = [];\n document.body.style.cursor = \"default\";\n\n document.removeEventListener(\"mouseover\", handleMouseOver);\n document.removeEventListener(\"mouseout\", handleMouseOut);\n document.removeEventListener(\"click\", handleElementClick, true);\n } else {\n document.body.style.cursor = \"crosshair\";\n document.addEventListener(\"mouseover\", handleMouseOver);\n document.addEventListener(\"mouseout\", handleMouseOut);\n document.addEventListener(\"click\", handleElementClick, true);\n }\n };\n\n // Handle scroll events to update popover position\n const handleScroll = () => {\n if (selectedElementId) {\n const elements = findElementsById(selectedElementId);\n if (elements.length > 0) {\n const element = elements[0];\n const rect = element!.getBoundingClientRect();\n\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const isInViewport =\n rect.top < viewportHeight &&\n rect.bottom > 0 &&\n rect.left < viewportWidth &&\n rect.right > 0;\n\n const elementPosition = {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n };\n\n window.parent.postMessage(\n {\n type: \"element-position-update\",\n position: elementPosition,\n isInViewport: isInViewport,\n visualSelectorId: selectedElementId,\n },\n \"*\"\n );\n }\n }\n };\n\n // Handle messages from parent window\n const handleMessage = (event: MessageEvent) => {\n const message = event.data;\n\n switch (message.type) {\n case \"toggle-visual-edit-mode\":\n toggleVisualEditMode(message.data.enabled);\n if (message.data.specs?.newInlineEditEnabled !== undefined) {\n inlineEdit.enabled = message.data.specs.newInlineEditEnabled;\n }\n break;\n\n case \"update-classes\":\n if (message.data && message.data.classes !== undefined) {\n updateElementClassesAndReposition(\n message.data.visualSelectorId,\n message.data.classes\n );\n } else {\n console.warn(\n \"[VisualEditAgent] Invalid update-classes message:\",\n message\n );\n }\n break;\n\n case \"update-attribute\":\n if (\n message.data &&\n message.data.visualSelectorId &&\n message.data.attribute !== undefined &&\n message.data.value !== undefined\n ) {\n updateElementAttributeAndReposition(\n message.data.visualSelectorId,\n message.data.attribute,\n message.data.value\n );\n } else {\n console.warn(\n \"[VisualEditAgent] Invalid update-attribute message:\",\n message\n );\n }\n break;\n\n case \"unselect-element\":\n unselectElement();\n break;\n\n case \"refresh-page\":\n window.location.reload();\n break;\n\n case \"update-content\":\n if (message.data && message.data.content !== undefined) {\n updateElementContent(\n message.data.visualSelectorId,\n message.data.content\n );\n } else {\n console.warn(\n \"[VisualEditAgent] Invalid update-content message:\",\n message\n );\n }\n break;\n\n case \"request-element-position\":\n if (selectedElementId) {\n const elements = findElementsById(selectedElementId);\n if (elements.length > 0) {\n const element = elements[0];\n const rect = element!.getBoundingClientRect();\n\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const isInViewport =\n rect.top < viewportHeight &&\n rect.bottom > 0 &&\n rect.left < viewportWidth &&\n rect.right > 0;\n\n const elementPosition = {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n };\n\n window.parent.postMessage(\n {\n type: \"element-position-update\",\n position: elementPosition,\n isInViewport: isInViewport,\n visualSelectorId: selectedElementId,\n },\n \"*\"\n );\n }\n }\n break;\n\n case \"popover-drag-state\":\n if (message.data && message.data.isDragging !== undefined) {\n isPopoverDragging = message.data.isDragging;\n if (message.data.isDragging) {\n clearHoverOverlays();\n }\n }\n break;\n\n case \"dropdown-state\":\n if (message.data && message.data.isOpen !== undefined) {\n isDropdownOpen = message.data.isOpen;\n if (message.data.isOpen) {\n clearHoverOverlays();\n }\n }\n break;\n\n case \"toggle-inline-edit-mode\":\n if (message.data) {\n inlineEdit.handleToggleMessage(message.data);\n }\n break;\n\n default:\n break;\n }\n };\n\n // Handle window resize to reposition overlays\n const handleResize = () => {\n if (selectedElementId) {\n const elements = findElementsById(selectedElementId);\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n\n if (currentHighlightedElements.length > 0) {\n hoverOverlays.forEach((overlay, index) => {\n if (index < currentHighlightedElements.length) {\n positionOverlay(overlay, currentHighlightedElements[index]!);\n }\n });\n }\n };\n\n // Initialize: Add IDs to elements that don't have them but have linenumbers\n const elementsWithLineNumber = document.querySelectorAll(\n \"[data-linenumber]:not([data-visual-selector-id])\"\n );\n elementsWithLineNumber.forEach((el, index) => {\n const htmlEl = el as HTMLElement;\n const id = `visual-id-${htmlEl.dataset.filename}-${htmlEl.dataset.linenumber}-${index}`;\n htmlEl.dataset.visualSelectorId = id;\n });\n\n // Create mutation observer to detect layout changes\n const mutationObserver = new MutationObserver((mutations) => {\n const needsUpdate = mutations.some((mutation) => {\n const hasVisualId = (node: Node): boolean => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (el.dataset && el.dataset.visualSelectorId) {\n return true;\n }\n for (let i = 0; i < el.children.length; i++) {\n if (hasVisualId(el.children[i]!)) {\n return true;\n }\n }\n }\n return false;\n };\n\n const isLayoutChange =\n mutation.type === \"attributes\" &&\n (mutation.attributeName === \"style\" ||\n mutation.attributeName === \"class\" ||\n mutation.attributeName === \"width\" ||\n mutation.attributeName === \"height\");\n\n return isLayoutChange && hasVisualId(mutation.target);\n });\n\n if (needsUpdate) {\n setTimeout(handleResize, REPOSITION_DELAY_MS);\n }\n });\n\n // Set up event listeners\n window.addEventListener(\"message\", handleMessage);\n window.addEventListener(\"scroll\", handleScroll, true);\n document.addEventListener(\"scroll\", handleScroll, true);\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleResize);\n\n // Start observing DOM mutations\n mutationObserver.observe(document.body, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\"style\", \"class\", \"width\", \"height\"],\n });\n\n // Send ready message to parent\n window.parent.postMessage({ type: \"visual-edit-agent-ready\" }, \"*\");\n}"],"mappings":"AACO,SAASA,EAAsBC,EAA2B,CAC/D,IAAMC,EAASD,EACf,MAAO,CAAC,EACNC,EAAO,SAAS,gBAAkBA,EAAO,SAAS,iBAEtD,CAGO,SAASC,EAAqBF,EAAiC,CACpE,IAAMC,EAASD,EACf,OACEC,EAAO,SAAS,gBAChBA,EAAO,SAAS,kBAChB,IAEJ,CAEO,IAAME,EAA+B,CAAC,KAAK,EAG3C,SAASC,EAAiBC,EAA8B,CAC7D,GAAI,CAACA,EAAI,MAAO,CAAC,EACjB,IAAMC,EAAiB,MAAM,KAC3B,SAAS,iBAAiB,0BAA0BD,CAAE,IAAI,CAC5D,EACA,OAAIC,EAAe,OAAS,EACnBA,EAEF,MAAM,KACX,SAAS,iBAAiB,6BAA6BD,CAAE,IAAI,CAC/D,CACF,CAMO,SAASE,EAAqBC,EAAqBC,EAAuB,CAC/ED,EAAS,QAASR,GAAY,CAC5BA,EAAQ,aAAa,QAASS,CAAO,CACvC,CAAC,CACH,CAGO,SAASC,EAAuBF,EAAqBG,EAAmBC,EAAqB,CAC7FT,EAAmB,SAASQ,CAAS,GAI1CH,EAAS,QAASR,GAAY,CAC5BA,EAAQ,aAAaW,EAAWC,CAAK,CACvC,CAAC,CACH,CAGO,SAASC,EAAyBb,EAAkBc,EAAqD,CAC9G,IAAMC,EAAqC,CAAC,EAC5C,QAAWC,KAAQF,EAAmB,CACpC,IAAMG,EAAMjB,EAAQ,aAAagB,CAAI,EACjCC,IAAQ,OACVF,EAAWC,CAAI,EAAIC,EAEvB,CACA,OAAOF,CACT,CC/DO,IAAMG,GAAoD,CAC/D,SAAU,WACV,gBAAiB,UACjB,OAAQ,oBACR,aAAc,MACd,UAAW,iCACX,SAAU,OACV,SAAU,QACV,UAAW,QACX,UAAW,OACX,OAAQ,QACR,QAAS,QACT,cAAe,MACjB,EAEaC,GAAoD,CAC/D,QAAS,WACT,OAAQ,UACR,MAAO,UACP,gBAAiB,cACjB,WAAY,SACZ,WAAY,MACZ,WAAY,KACd,EAEaC,EAA6B,UAC7BC,GAA0B,UAC1BC,GAAmC,MAEnCC,EAAyB,UAEzBC,GAAkB,GAGlBC,EAAoB,UAEpBC,EAAmB,UAEnBC,GAAkB,GAElBC,EAAsB,sBAGtBC,GAAmB,EAGnBC,GAAkB,ECxCxB,SAASC,EAAYC,EAAsBC,EAAsC,CACtF,QAAWC,KAAO,OAAO,KAAKD,CAAM,EAClCD,EAAQ,MAAM,YACZE,EAAI,QAAQ,SAAWC,GAAM,IAAIA,EAAE,YAAY,CAAC,EAAE,EAClDF,EAAOC,CAAG,CACZ,CAEJ,CAGO,SAASE,GAAoBC,EAA0B,CAC5D,OAAOA,EAAM,OACf,CAEA,SAASC,EAAYN,EAAkBO,EAA2B,CAChE,IAAMC,EAAkB,CACtB,QAAAR,EACA,QAASA,EAAQ,QAAQ,YAAY,EACrC,WAAYS,EAAqBT,CAAO,CAC1C,EACA,OAAIO,IAAU,SAAWC,EAAK,MAAQD,GAC/BC,CACT,CAQO,SAASE,GACdC,EACAC,EACAC,EACa,CACb,IAAMC,EAAsB,CAAC,EAE7B,SAASC,EAAKC,EAAaC,EAA0B,CACnD,GAAI,EAAAA,EAAaL,GACjB,QAASM,EAAI,EAAGA,EAAIF,EAAG,SAAS,OAAQE,IAAK,CAC3C,IAAMC,EAAQH,EAAG,SAASE,CAAC,EAC3B,GAAIE,EAAsBD,CAAK,EAAG,CAChC,IAAMX,EAAkB,CACtB,QAASW,EACT,QAASA,EAAM,QAAQ,YAAY,EACnC,WAAYV,EAAqBU,CAAK,CACxC,EACIN,IAAe,SACjBL,EAAK,MAAQK,EAAaI,EAAa,GAEzCH,EAAO,KAAKN,CAAI,EAChBO,EAAKI,EAAOF,EAAa,CAAC,CAC5B,MACEF,EAAKI,EAAOF,CAAU,CAE1B,CACF,CAEA,OAAAF,EAAKJ,EAAQ,CAAC,EACPG,CACT,CAGA,SAASO,GAA2BC,EAAuC,CACzE,IAAMC,EAAuB,CAAC,EAC1BC,EAAUF,EAAgB,cAC9B,KACEE,GACAA,IAAY,SAAS,iBACrBA,IAAY,SAAS,MACrBD,EAAQ,OAASE,IAEbL,EAAsBI,CAAO,GAC/BD,EAAQ,KAAKjB,EAAYkB,CAAO,CAAC,EAEnCA,EAAUA,EAAQ,cAEpB,OAAAD,EAAQ,QAAQ,EACTA,CACT,CAGA,SAASG,GAAkBC,EAAoBJ,EAA8B,CAC3E,OAAAA,EAAQ,QAAQ,CAACK,EAAGV,IAAM,CACxBS,EAAM,KAAK,CAAE,GAAGC,EAAG,MAAOV,CAAE,CAAC,CAC/B,CAAC,EACMK,EAAQ,MACjB,CAGA,SAASM,GACPF,EACAL,EACAQ,EACM,CACNH,EAAM,KAAKrB,EAAYgB,EAAiBQ,CAAS,CAAC,EAClD,IAAMC,EAAcrB,GAClBY,EACAU,GACAF,EAAY,CACd,EACAH,EAAM,KAAK,GAAGI,CAAW,CAC3B,CAGA,SAASE,GAAwBV,EAAsC,CACrE,OAAOA,EAAQ,GAAG,EAAE,GAAG,SAAW,IACpC,CAGA,SAASW,GAAgBvB,EAAiBW,EAAuC,CAC/E,IAAMa,EAAWzB,GAA2BC,EAAQ,CAAC,EACrD,OAAKwB,EAAS,KAAMC,GAAMA,EAAE,UAAYd,CAAe,GACrDa,EAAS,KAAK7B,EAAYgB,CAAe,CAAC,EAErCa,CACT,CAGA,SAASE,GACPV,EACAQ,EACAb,EACAQ,EACM,CACN,IAAMQ,EAAqB7B,EAAqBa,CAAe,EACzDiB,EAAO,IAAI,IACjB,QAAWC,KAAWL,EACpB,GAAIK,EAAQ,UAAYlB,EACtBO,GAA6BF,EAAOL,EAAiBQ,CAAS,EAC1DQ,GAAoBC,EAAK,IAAID,CAAkB,MAC9C,CACL,IAAMG,EAAKD,EAAQ,WACnB,GAAIC,GAAM,KAAM,CACd,GAAIA,IAAOH,GAAsBC,EAAK,IAAIE,CAAE,EAAG,SAC/CF,EAAK,IAAIE,CAAE,CACb,CACAd,EAAM,KAAK,CAAE,GAAGa,EAAS,MAAOV,CAAU,CAAC,CAC7C,CAEJ,CAYO,SAASY,GAAgBpB,EAAuC,CACrE,IAAMC,EAAUF,GAA2BC,CAAe,EACpDK,EAAqB,CAAC,EACtBG,EAAYJ,GAAkBC,EAAOJ,CAAO,EAE5CoB,EAAcV,GAAwBV,CAAO,EACnD,GAAIoB,EAAa,CACf,IAAMR,EAAWD,GAAgBS,EAAarB,CAAe,EAC7De,GAA2BV,EAAOQ,EAAUb,EAAiBQ,CAAS,CACxE,MACED,GAA6BF,EAAOL,EAAiBQ,CAAS,EAGhE,OAAOH,CACT,CC5JA,IAAIiB,EAAwC,KACxCC,EAAqC,KACrCC,EAA4D,KAC5DC,EAAwC,KACxCC,EAA4D,KAEhE,SAASC,GACPC,EACAC,EACA,CAAE,SAAAC,EAAU,QAAAC,EAAS,WAAAC,CAAW,EAChB,CAChB,IAAMC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,YAAcC,GAAoBN,CAAK,EAC5CO,EAAYF,EAAMG,EAAyB,EAE3C,IAAMC,EAAQT,EAAM,OAAS,EAC7B,OAAIS,EAAQ,IACVJ,EAAK,MAAM,YAAc,GAAGK,GAAkBD,EAAQE,EAAe,MAGnEV,IACFI,EAAK,MAAM,MAAQO,EACnBP,EAAK,MAAM,gBAAkBQ,GAC7BR,EAAK,MAAM,WAAaS,IAG1BT,EAAK,iBAAiB,aAAc,IAAM,CACnCJ,IAAUI,EAAK,MAAM,gBAAkBU,GACxCZ,GAASA,EAAQH,CAAK,CAC5B,CAAC,EAEDK,EAAK,iBAAiB,aAAc,IAAM,CACnCJ,IAAUI,EAAK,MAAM,gBAAkB,eACxCD,GAAYA,EAAW,CAC7B,CAAC,EAEDC,EAAK,iBAAiB,QAAUW,GAAkB,CAChDA,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjBd,EAASF,CAAK,CAChB,CAAC,EAEMK,CACT,CAGO,SAASY,GACdC,EACAC,EACAC,EACgB,CAChB,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,aAAaC,EAAqB,MAAM,EAClDf,EAAYc,EAAWE,EAAyB,EAEhDL,EAAO,QAASlB,GAAU,CACxB,IAAMC,EAAWD,EAAM,UAAYmB,EACnCE,EAAU,YAAYtB,GAAmBC,EAAOC,EAAUmB,CAAS,CAAC,CACtE,CAAC,EAEMC,CACT,CAGO,SAASG,GAAwBC,EAA6B,CACnE,IAAMC,EAAID,EAAM,aAAe,GAC3BC,EAAE,SAASC,CAAiB,GAAKD,EAAE,SAASE,CAAgB,IAEhEH,EAAM,YAAcC,EAAIC,EACxBF,EAAM,MAAM,OAAS,UACrBA,EAAM,MAAM,WAAa,OACzBA,EAAM,MAAM,WAAa,SACzBA,EAAM,MAAM,cAAgB,OAC5BA,EAAM,aAAaH,EAAqB,MAAM,EAChD,CAEA,SAASO,GACPC,EACAZ,EACAC,EACA,CAAE,SAAAjB,EAAU,QAAAC,EAAS,WAAAC,CAAW,EAC1B,CACN,IAAM2B,EAAQ,MAAM,KAAKD,EAAS,QAAQ,EACtCE,EAAed,EAAO,UAAWe,GAAMA,EAAE,UAAYd,CAAc,EAEjEe,EAAkBC,GAAkB,CACxC,GAAIH,GAAgB,GAAKA,EAAeD,EAAM,OAAQ,CACpD,IAAMK,EAAOL,EAAMC,CAAY,EAC3BI,EAAK,MAAM,QAAUxB,IACvBwB,EAAK,MAAM,gBAAkB,cAEjC,CAEA,GADAJ,EAAeG,EACXH,GAAgB,GAAKA,EAAeD,EAAM,OAAQ,CACpD,IAAMM,EAAMN,EAAMC,CAAY,EAC1BK,EAAI,MAAM,QAAUzB,IACtByB,EAAI,MAAM,gBAAkBtB,GAE9BsB,EAAI,eAAe,CAAE,MAAO,SAAU,CAAC,EACnClC,GAAW6B,GAAgB,GAAKA,EAAed,EAAO,QACxDf,EAAQe,EAAOc,CAAY,CAAE,CAEjC,CACF,EAEAlC,EAAwBkB,GAAqB,CACvCA,EAAE,MAAQ,aACZA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBkB,EAAeF,EAAeD,EAAM,OAAS,EAAIC,EAAe,EAAI,CAAC,GAC5DhB,EAAE,MAAQ,WACnBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBkB,EAAeF,EAAe,EAAIA,EAAe,EAAID,EAAM,OAAS,CAAC,GAC5Df,EAAE,MAAQ,SAAWgB,GAAgB,GAAKA,EAAed,EAAO,SACzEF,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EACdZ,GAAYA,EAAW,EAC3BF,EAASgB,EAAOc,CAAY,CAAE,EAC9BM,EAAc,EAElB,EACA,SAAS,iBAAiB,UAAWxC,EAAsB,EAAI,CACjE,CAEA,SAASyC,GACPT,EACAL,EACM,CACN,IAAIe,EAAY,GAChB5C,EAA2BoB,GAAkB,CAC3C,GAAIwB,EAAW,CAAEA,EAAY,GAAO,MAAQ,CAC5C,IAAMC,EAASzB,EAAE,OACb,CAACc,EAAS,SAASW,CAAM,GAAKA,IAAWhB,GAC3Ca,EAAc,CAElB,EACA,SAAS,iBAAiB,YAAa1C,EAAyB,EAAI,CACtE,CAGO,SAAS8C,GACdjB,EACAP,EACAC,EACAC,EACM,CACNkB,EAAc,EAEd,IAAMR,EAAWb,GACfC,EACAC,EACA,CACE,GAAGC,EACH,SAAWpB,GAAU,CACfoB,EAAU,YAAYA,EAAU,WAAW,EAC/CA,EAAU,SAASpB,CAAK,EACxBsC,EAAc,CAChB,CACF,CACF,EAEMK,EAAUlB,EAAM,cACjBkB,IAELb,EAAS,MAAM,IAAM,GAAGL,EAAM,UAAYA,EAAM,aAAe,CAAC,KAChEK,EAAS,MAAM,KAAO,GAAGL,EAAM,UAAU,KAEzCkB,EAAQ,YAAYb,CAAQ,EAC5BpC,EAAiBoC,EACjBnC,EAAc8B,EACVA,EAAM,aAAa,SAASE,EAAkB,KAAK,CAAC,IACtDF,EAAM,YAAcA,EAAM,YAAY,MAAM,EAAG,CAACE,EAAkB,MAAM,EAAIC,GAE9E/B,EAAmBuB,EAAU,YAAc,KAE3CS,GAAwBC,EAAUZ,EAAQC,EAAgBC,CAAS,EACnEmB,GAAyBT,EAAUL,CAAK,EAC1C,CAGO,SAASa,GAAsB,CAChC3C,GAAa,aAAa,SAASiC,CAAgB,IACrDjC,EAAY,YAAcA,EAAY,YAAY,QAAQiC,EAAkBD,CAAiB,GAE/FhC,EAAc,KAEVE,IACFA,EAAiB,EACjBA,EAAmB,MAGjBH,GAAkBA,EAAe,YACnCA,EAAe,OAAO,EAExBA,EAAiB,KAEbE,IACF,SAAS,oBAAoB,YAAaA,EAAyB,EAAI,EACvEA,EAA0B,MAGxBE,IACF,SAAS,oBAAoB,UAAWA,EAAsB,EAAI,EAClEA,EAAuB,KAE3B,CAGO,SAAS8C,IAA0B,CACxC,OAAOlD,IAAmB,IAC5B,CCzNO,SAASmD,GAAsBC,EAAgD,CACpF,IAAIC,EAA6C,KAC7CC,EAAqD,KACrDC,EAAwC,KAEtCC,EAAoB,IAAM,CAC1BH,GAAuBA,EAAoB,YAC7CA,EAAoB,OAAO,EAE7BA,EAAsB,IACxB,EAEMI,EAAoBC,GAAqB,CAC7CF,EAAkB,EACdG,EAAqBD,EAAM,OAAO,IAAMN,EAAO,qBAAqB,IAExEC,EAAsBD,EAAO,qBAAqBM,EAAM,OAAO,EACjE,EAEME,EAAeF,GAAqB,CACxCF,EAAkB,EAClBK,EAAc,EACVP,IACF,SAAS,oBAAoB,UAAWA,EAAe,EAAI,EAC3DA,EAAgB,MAElBC,EAAsB,KAEtB,IAAMO,EAAeV,EAAO,cAAcM,EAAM,OAAO,EACvDK,EAAgBD,EAAcJ,EAAM,OAAO,CAC7C,EAEMM,EAAmB,IAAM,CACzBV,IACF,SAAS,oBAAoB,UAAWA,EAAe,EAAI,EAC3DA,EAAgB,MAEdC,IACFK,EAAYL,CAAmB,EAC/BA,EAAsB,KAE1B,EAEMU,EAAmB,CAACC,EAAeC,EAAuBC,EAAkBC,EAAqBC,IAA6B,CAClIJ,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACbK,GAAe,GACjBV,EAAc,EACdG,EAAiB,IAEjBT,EAAsB,CACpB,QAAAa,EACA,QAASA,EAAQ,QAAQ,YAAY,EACrC,WAAYE,CACd,EACAlB,EAAO,WAAW,EAElBE,EAAiBkB,GAAsB,CACjCA,EAAG,MAAQ,WACbA,EAAG,gBAAgB,EACnBX,EAAc,EACdG,EAAiB,EAErB,EACA,SAAS,iBAAiB,UAAWV,EAAe,EAAI,EAExDmB,GAAaN,EAAOE,EAAQD,EAAS,CAAE,SAAUR,EAAa,QAASH,EAAkB,WAAYD,CAAkB,CAAC,EAE5H,EAEMO,EAAkB,CACtBW,EACAN,IACG,CACH,GAAI,CAACM,EAAS,OAEd,IAAMP,EAAQO,EAAQ,cAAc,KAAK,EACzC,GAAI,CAACP,EAAO,OAEZ,IAAME,EAASM,GAAgBP,CAAO,EACtC,GAAIC,EAAO,QAAU,EAAG,OAExB,IAAMC,EAAYX,EAAqBS,CAAO,EAC9CQ,GAAwBT,CAAK,EAE7BA,EAAM,iBAAiB,QAAUD,GAAkB,CACjDD,EAAiBC,EAAGC,EAAOC,EAASC,EAAQC,CAAS,CACvD,CAAC,CACH,EAOA,MAAO,CAAE,gBAAAP,EAAiB,QALV,IAAM,CACpBP,EAAkB,EAClBK,EAAc,CAChB,CAEkC,CACpC,CC5GA,IAAMgB,EAAiB,2BAEjBC,GAAgB,CACpB,MAAO,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,OAAQ,KAAM,KAAM,IAAK,SAAU,OACrC,EAEaC,GAAwB,IAAM,CACzC,GAAI,SAAS,eAAeF,CAAc,EAAG,OAE7C,IAAMG,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAKH,EACXG,EAAM,YAAc;AAAA;AAAA;AAAA;AAAA,IAKpB,SAAS,KAAK,YAAYA,CAAK,CACjC,EAEaC,GAAwB,IAAM,CACzC,SAAS,eAAeJ,CAAc,GAAG,OAAO,CAClD,EAEaK,GAAcC,GAAyB,CAClD,IAAMC,EAAQ,SAAS,YAAY,EACnCA,EAAM,mBAAmBD,CAAO,EAChC,IAAME,EAAY,OAAO,aAAa,EACtCA,GAAW,gBAAgB,EAC3BA,GAAW,SAASD,CAAK,CAC3B,EAEaE,GAAyBH,GAChC,IAAEA,aAAmB,cACrB,CAACL,GAAc,SAASK,EAAQ,QAAQ,YAAY,CAAC,GACrD,CAACA,EAAQ,aAAa,KAAK,GAC3BA,EAAQ,cAAc,yBAAyB,GAC/CA,EAAQ,UAAU,OAAS,GAC3BA,EAAQ,QAAQ,iBAAmB,QAI5BI,EAAgCJ,GACvC,EAAEA,aAAmB,cAAgBA,EAAQ,QAAQ,WAAa,OAC7D,GAEFG,GAAsBH,CAAO,ECtCtC,IAAMK,GAAc,IAEb,SAASC,EACdC,EACsB,CACtB,IAAIC,EAA4C,KAC5CC,EAA6D,KAC7DC,EAAU,GACRC,EAA2B,IAAI,QAI/BC,EAAqB,IAAM,CAC/B,IAAMC,EAAaN,EAAK,qBAAqB,EAC7C,GAAI,CAACM,EAAY,OACjB,IAAMC,EAAWP,EAAK,iBAAiBM,CAAU,EAChCN,EAAK,oBAAoB,EACjC,QAAQ,CAACQ,EAASC,IAAM,CAC3BA,EAAIF,EAAS,QAAUA,EAASE,CAAC,GACnCT,EAAK,gBAAgBQ,EAASD,EAASE,CAAC,CAAC,CAE7C,CAAC,CACH,EAEMC,EAAcC,GAAyB,CAC3C,IAAMC,EAAkBD,EAAQ,QAAQ,oBAClCE,EAAaF,EAAQ,YAErBG,EAAaH,EACbI,EAAOJ,EAAQ,sBAAsB,EAE3C,OAAO,OAAO,YACZ,CACE,KAAM,cACN,YAAa,CACX,QAASA,EAAQ,QACjB,QACGG,EAAW,WAA4C,SACxDH,EAAQ,WACR,GACF,iBAAkBX,EAAK,qBAAqB,EAC5C,QAASa,EACT,mBAAoBF,EAAQ,QAAQ,eACpC,iBAAkBA,EAAQ,QAAQ,iBAAmB,OACrD,WAAYA,EAAQ,QAAQ,WAC5B,SAAUA,EAAQ,QAAQ,SAC1B,SAAU,CACR,IAAKI,EAAK,IACV,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,QAASA,EAAK,KAAOA,EAAK,MAAQ,EAClC,QAASA,EAAK,IAAMA,EAAK,OAAS,CACpC,CACF,EACA,gBAAAH,EACA,WAAAC,CACF,EACA,GACF,EAEAF,EAAQ,QAAQ,oBAAsBE,GAAc,EACtD,EAEMG,EAAmBL,GAAyB,CAC5CT,GAAsB,aAAaA,CAAoB,EAC3DA,EAAuB,WAAW,IAAMQ,EAAWC,CAAO,EAAGb,EAAW,CAC1E,EAEMmB,EAAeN,GAAyB,CAC5CN,EAAmB,EACnBW,EAAgBL,CAAO,CACzB,EAEMO,EAAmB,UAA6B,CACpDD,EAAY,IAAI,CAClB,EAEME,EAAgBR,GAAyB,CAC7CS,GAAsB,EAEtBT,EAAQ,QAAQ,oBAAsBA,EAAQ,aAAe,GAC7DA,EAAQ,QAAQ,eAAiBA,EAAQ,MAAM,OAC/CA,EAAQ,gBAAkB,OAE1B,IAAMU,EAAkB,IAAI,gBAC5BjB,EAAyB,IAAIO,EAASU,CAAe,EACrDV,EAAQ,iBAAiB,QAASO,EAAkB,CAClD,OAAQG,EAAgB,MAC1B,CAAC,EAEDV,EAAQ,MAAM,OAAS,OACvBW,GAAWX,CAAO,EAClB,WAAW,IAAM,CACXA,EAAQ,aACVA,EAAQ,MAAM,CAElB,EAAG,CAAC,CACN,EAEMY,EAAmBZ,GAAyB,CAChD,IAAMU,EAAkBjB,EAAyB,IAAIO,CAAO,EACxDU,IACFA,EAAgB,MAAM,EACtBjB,EAAyB,OAAOO,CAAO,GAGpCA,EAAQ,cAEba,GAAsB,EACtBb,EAAQ,gBAAkB,QAC1B,OAAOA,EAAQ,QAAQ,oBAEnBA,EAAQ,QAAQ,iBAAmB,SACrCA,EAAQ,MAAM,OAASA,EAAQ,QAAQ,eACvC,OAAOA,EAAQ,QAAQ,gBAE3B,EAIA,MAAO,CACL,IAAI,SAAU,CACZ,OAAOR,CACT,EACA,IAAI,QAAQsB,EAAgB,CAC1BtB,EAAUsB,CACZ,EAEA,WAAY,CACV,OAAOxB,IAA0B,IACnC,EAEA,mBAAoB,CAClB,OAAOA,CACT,EAEA,QAAQU,EAAkB,CACxB,OAAOe,EAA6Bf,CAAO,CAC7C,EAEA,aAAaA,EAAsB,CACjCV,EAAwBU,EAExBX,EAAK,oBAAoB,EAAE,QAAS2B,GAAM,CACxCA,EAAE,MAAM,QAAU,MACpB,CAAC,EAEDR,EAAaR,CAAO,EAEpB,OAAO,OAAO,YACZ,CACE,KAAM,0BACN,iBAAkBX,EAAK,qBAAqB,CAC9C,EACA,GACF,CACF,EAEA,aAAc,CACZ,GAAI,CAACC,EAAuB,OAExBC,IACF,aAAaA,CAAoB,EACjCA,EAAuB,MAIzBqB,EADgBtB,CACO,EAEvBD,EAAK,oBAAoB,EAAE,QAAS2B,GAAM,CACxCA,EAAE,MAAM,QAAU,EACpB,CAAC,EAEDtB,EAAmB,EAEnB,OAAO,OAAO,YACZ,CACE,KAAM,wBACN,iBAAkBL,EAAK,qBAAqB,CAC9C,EACA,GACF,EAEAC,EAAwB,IAC1B,EAEA,qBAAqBM,EAAqB,CACxCA,EAAS,QAASqB,GAAO,CACnBA,aAAc,cAChBA,EAAG,QAAQ,SAAW,OAE1B,CAAC,CACH,EAEA,mBAAmBC,EAA0B,CACtCA,GACL7B,EAAK,iBAAiB6B,CAAS,EAAE,QAASD,GAAO,CAC3CA,aAAc,aAChB,OAAOA,EAAG,QAAQ,QAEtB,CAAC,CACH,EAEA,oBAAoBE,EAAkE,CACpF,GAAI,CAAC3B,EAAS,OAEd,IAAMI,EAAWP,EAAK,iBAAiB8B,EAAK,kBAAkB,EAC9D,GAAIvB,EAAS,SAAW,GAAK,EAAEA,EAAS,CAAC,YAAa,aAAc,OAEpE,IAAMI,EAAUJ,EAAS,CAAC,EAE1B,GAAIuB,EAAK,kBAAmB,CAC1B,GAAI,CAACJ,EAA6Bf,CAAO,EAAG,OAGxCX,EAAK,qBAAqB,IAAM8B,EAAK,qBACvC,KAAK,YAAY,EACjB9B,EAAK,eAAe,EACpB,KAAK,qBAAqBO,CAAQ,EAClCP,EAAK,wBAAwBO,EAAUuB,EAAK,kBAAkB,GAEhE,KAAK,aAAanB,CAAO,CAC3B,MACMV,IAA0BU,GAC5B,KAAK,YAAY,CAGvB,EAEA,SAAU,CACR,KAAK,YAAY,CACnB,CACF,CACF,CC/OO,SAASoB,IAAuB,CAErC,IAAIC,EAAmB,GACnBC,EAAoB,GACpBC,EAAiB,GACjBC,EAAkC,CAAC,EACnCC,EAAqC,CAAC,EACtCC,EAAwC,CAAC,EACzCC,EAAmC,KAEjCC,EAAsB,GAGtBC,EAAgB,CAACC,EAAa,KAA0B,CAC5D,IAAMC,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,MAAM,SAAW,WACzBA,EAAQ,MAAM,cAAgB,OAC9BA,EAAQ,MAAM,WAAa,uBAC3BA,EAAQ,MAAM,OAAS,OAEnBD,EACFC,EAAQ,MAAM,OAAS,qBAEvBA,EAAQ,MAAM,OAAS,oBACvBA,EAAQ,MAAM,gBAAkB,4BAG3BA,CACT,EAGMC,EAAkB,CACtBD,EACAE,EACAH,EAAa,KACV,CACH,GAAI,CAACG,GAAW,CAACZ,EAAkB,OAEfY,EAEH,YAEjB,IAAMC,EAAOD,EAAQ,sBAAsB,EAC3CF,EAAQ,MAAM,IAAM,GAAGG,EAAK,IAAM,OAAO,OAAO,KAChDH,EAAQ,MAAM,KAAO,GAAGG,EAAK,KAAO,OAAO,OAAO,KAClDH,EAAQ,MAAM,MAAQ,GAAGG,EAAK,KAAK,KACnCH,EAAQ,MAAM,OAAS,GAAGG,EAAK,MAAM,KAGrC,IAAIC,EAAQJ,EAAQ,cAAc,KAAK,EAElCI,IACHA,EAAQ,SAAS,cAAc,KAAK,EACpCA,EAAM,YAAcF,EAAQ,QAAQ,YAAY,EAChDE,EAAM,MAAM,SAAW,WACvBA,EAAM,MAAM,IAAM,QAClBA,EAAM,MAAM,KAAO,OACnBA,EAAM,MAAM,QAAU,UACtBA,EAAM,MAAM,SAAW,OACvBA,EAAM,MAAM,WAAaL,EAAa,MAAQ,MAC9CK,EAAM,MAAM,MAAQL,EAAa,UAAY,UAC7CK,EAAM,MAAM,gBAAkBL,EAAa,UAAY,UACvDK,EAAM,MAAM,aAAe,MAC3BA,EAAM,MAAM,SAAW,OACvBA,EAAM,MAAM,UAAY,SACxBJ,EAAQ,YAAYI,CAAK,EAE7B,EAGMC,EAAaC,EAA2B,CAC5C,iBAAAC,EACA,qBAAsB,IAAMX,EAC5B,oBAAqB,IAAMF,EAC3B,gBAAAO,EACA,eAAgB,IAAM,CACpBI,EAAW,mBAAmBT,CAAiB,EAC/CY,EAAsB,EACtBZ,EAAoB,IACtB,EACA,wBAAyB,CAACa,EAAUC,IAAc,CAChDD,EAAS,QAASE,GAAO,CACvB,IAAMX,EAAUF,EAAc,EAAI,EAClC,SAAS,KAAK,YAAYE,CAAO,EACjCN,EAAiB,KAAKM,CAAO,EAC7BC,EAAgBD,EAASW,EAAI,EAAI,CACnC,CAAC,EACDf,EAAoBc,CACtB,CACF,CAAC,EAEKE,EAAiB,IAAM,CAC3BP,EAAW,mBAAmBT,CAAiB,EAC/CY,EAAsB,EACtBZ,EAAoB,IACtB,EAGMiB,EAAqB,IAAM,CAC/BpB,EAAc,QAASO,GAAY,CAC7BA,GAAWA,EAAQ,YACrBA,EAAQ,OAAO,CAEnB,CAAC,EACDP,EAAgB,CAAC,EACjBE,EAA6B,CAAC,CAChC,EAEMa,EAAwB,IAAM,CAClCd,EAAiB,QAASM,GAAY,CAChCA,GAAWA,EAAQ,YACrBA,EAAQ,OAAO,CAEnB,CAAC,EACDN,EAAmB,CAAC,CACtB,EAEMoB,EAAY,CAAC,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAAQ,IAAK,OAAO,EAE1EC,EAAyBb,GAAqB,CAClD,IAAMc,EAAcd,EACdC,EAAOD,EAAQ,sBAAsB,EACrCe,EAAaf,EACbgB,EAAgBJ,EAAU,SAASZ,EAAQ,SAAS,YAAY,CAAC,EACvE,OAAO,OAAO,YAAY,CACxB,KAAM,mBACN,QAASA,EAAQ,QACjB,QACGe,EAAW,WAA4C,SACxDf,EAAQ,WACR,GACF,iBAAkBiB,EAAqBjB,CAAO,EAC9C,QAASgB,EAAgBF,EAAY,UAAY,OACjD,mBAAoBA,EAAY,QAAQ,eACxC,iBAAkBA,EAAY,QAAQ,iBAAmB,OACzD,WAAYA,EAAY,QAAQ,WAChC,SAAUA,EAAY,QAAQ,SAC9B,SAAU,CACR,IAAKb,EAAK,IACV,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,QAASA,EAAK,KAAOA,EAAK,MAAQ,EAClC,QAASA,EAAK,IAAMA,EAAK,OAAS,CACpC,EACA,WAAYiB,EAAyBlB,EAASmB,CAAkB,EAChE,cAAAH,CACF,EAAG,GAAG,CACR,EAGMI,EAAiBpB,GAAiD,CACtE,IAAMqB,EAAmBJ,EAAqBjB,CAAO,EAErD,OAAAM,EAAsB,EAELD,EAAiBgB,GAAoB,IAAI,EACjD,QAASZ,GAAO,CACvB,IAAMX,EAAUF,EAAc,EAAI,EAClC,SAAS,KAAK,YAAYE,CAAO,EACjCN,EAAiB,KAAKM,CAAO,EAC7BC,EAAgBD,EAASW,EAAI,EAAI,CACnC,CAAC,EAEDf,EAAoB2B,GAAoB,KACxCV,EAAmB,EACnBE,EAAsBb,CAAO,EAEtBR,EAAiB,CAAC,CAC3B,EAEM8B,GAAoB,IAAY,CACpC5B,EAAoB,KACpB,OAAO,OAAO,YAAY,CAAE,KAAM,kBAAmB,EAAG,GAAG,CAC7D,EAGM6B,EAAmBC,GAAkB,CACzC,GAAI,CAACpC,GAAoBC,GAAqBc,EAAW,UAAU,EAAG,OAGtE,IAAMsB,EAASD,EAAE,OAGjB,GAAIlC,EAAgB,CAClBqB,EAAmB,EACnB,MACF,CAGA,GAAIc,EAAO,QAAQ,YAAY,IAAM,OAAQ,CAC3Cd,EAAmB,EACnB,MACF,CAGA,IAAMX,EAAUyB,EAAO,QACrB,mDACF,EACA,GAAI,CAACzB,EAAS,CACZW,EAAmB,EACnB,MACF,CAGA,IAAMG,EAAcd,EACd0B,EACJZ,EAAY,QAAQ,gBACpBA,EAAY,QAAQ,iBAGtB,GAAIpB,IAAsBgC,EAAY,CACpCf,EAAmB,EACnB,MACF,CAGA,IAAMJ,EAAWF,EAAiBqB,GAAc,IAAI,EAGpDf,EAAmB,EAGnBJ,EAAS,QAASE,GAAO,CACvB,IAAMX,EAAUF,EAAc,EAAK,EACnC,SAAS,KAAK,YAAYE,CAAO,EACjCP,EAAc,KAAKO,CAAO,EAC1BC,EAAgBD,EAASW,CAAE,CAC7B,CAAC,EAEDhB,EAA6Bc,CAC/B,EAGMoB,EAAiB,IAAM,CACvBtC,GACJsB,EAAmB,CACrB,EAGMiB,EAAsBJ,GAAkB,CAC5C,GAAI,CAACpC,EAAkB,OAEvB,IAAMqC,EAASD,EAAE,OAOjB,GAJIC,EAAO,QAAQ,IAAII,CAAmB,GAAG,GAIzC1B,EAAW,SAAWsB,aAAkB,aAAeA,EAAO,kBAAoB,OACpF,OAIF,GAAItB,EAAW,UAAU,EAAG,CAC1BqB,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBA,EAAE,yBAAyB,EAC3BrB,EAAW,YAAY,EACvB,MACF,CAGA,GAAIb,EAAgB,CAClBkC,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBA,EAAE,yBAAyB,EAE3B,OAAO,OAAO,YAAY,CAAE,KAAM,iBAAkB,EAAG,GAAG,EAC1D,MACF,CAGA,GAAIC,EAAO,QAAQ,YAAY,IAAM,OACnC,OAIFD,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBA,EAAE,yBAAyB,EAG3B,IAAMxB,EAAUyB,EAAO,QACrB,mDACF,EACA,GAAI,CAACzB,EACH,OAGF,IAAMc,EAAcd,EACdqB,EAAmBJ,EAAqBjB,CAAO,EAMrD,GAHEN,IAAsB2B,GACtBP,EAAY,QAAQ,WAAa,QAEVX,EAAW,SAAWA,EAAW,QAAQW,CAAW,EAAG,CAC9EX,EAAW,aAAaW,CAAW,EACnC,MACF,CAEAX,EAAW,YAAY,EAEnBA,EAAW,SACbA,EAAW,qBAAqBE,EAAiBgB,CAAgB,CAAC,EAGpE,IAAMS,EAAkBV,EAAcpB,CAAO,EAC7C+B,EAAgB,gBAAgBD,EAAiB9B,CAAO,CAC1D,EAEMgC,GAAkB,IAAM,CAC5B7B,EAAW,YAAY,EACvBO,EAAe,CACjB,EAEMuB,GAAoC,CAACZ,EAA0Ba,IAAoB,CACvF,IAAM3B,EAAWF,EAAiBgB,CAAgB,EAC9Cd,EAAS,SAAW,IAExB4B,EAAqB5B,EAAU2B,CAAO,EAGtC,WAAW,IAAM,CAEXxC,IAAsB2B,GACxB7B,EAAiB,QAAQ,CAACM,EAASsC,IAAU,CACvCA,EAAQ7B,EAAS,QACnBR,EAAgBD,EAASS,EAAS6B,CAAK,CAAE,CAE7C,CAAC,EAIC3C,EAA2B,OAAS,GACfA,EAA2B,CAAC,GACjB,SAAS,mBACzB4B,GAChB9B,EAAc,QAAQ,CAACO,EAASsC,IAAU,CACpCA,EAAQ3C,EAA2B,QACrCM,EAAgBD,EAASL,EAA2B2C,CAAK,CAAE,CAE/D,CAAC,CAGP,EAAGzC,CAAmB,EACxB,EAGM0C,GAAsC,CAC1ChB,EACAiB,EACAC,IACG,CACH,IAAMhC,EAAWF,EAAiBgB,CAAgB,EAC9Cd,EAAS,SAAW,IAExBiC,EAAuBjC,EAAU+B,EAAWC,CAAK,EAGjD,WAAW,IAAM,CACX7C,IAAsB2B,GACxB7B,EAAiB,QAAQ,CAACM,EAASsC,IAAU,CACvCA,EAAQ7B,EAAS,QACnBR,EAAgBD,EAASS,EAAS6B,CAAK,CAAE,CAE7C,CAAC,CAEL,EAAGzC,CAAmB,EACxB,EAGM8C,GAAuB,CAACpB,EAA0BqB,IAAoB,CAC1E,IAAMnC,EAAWF,EAAiBgB,CAAgB,EAE9Cd,EAAS,SAAW,IAIxBA,EAAS,QAASP,GAAY,CAC3BA,EAAwB,UAAY0C,CACvC,CAAC,EAED,WAAW,IAAM,CACXhD,IAAsB2B,GACxB7B,EAAiB,QAAQ,CAACM,EAASsC,IAAU,CACvCA,EAAQ7B,EAAS,QACnBR,EAAgBD,EAASS,EAAS6B,CAAK,CAAE,CAE7C,CAAC,CAEL,EAAGzC,CAAmB,EACxB,EAGMoC,EAAkBY,GAAsB,CAC5C,qBAAuB3C,GAAqB,CAC1C,IAAMF,EAAUF,EAAc,EAAK,EACnC,OAAAE,EAAQ,MAAM,OAAS,OACvB,SAAS,KAAK,YAAYA,CAAO,EACjCC,EAAgBD,EAASE,CAAO,EACzBF,CACT,EACA,qBAAsB,IAAMJ,EAC5B,cAAA0B,EACA,WAAYE,EACd,CAAC,EAGKsB,GAAwBC,GAAuB,CACnDzD,EAAmByD,EAEdA,GAaH,SAAS,KAAK,MAAM,OAAS,YAC7B,SAAS,iBAAiB,YAAatB,CAAe,EACtD,SAAS,iBAAiB,WAAYI,CAAc,EACpD,SAAS,iBAAiB,QAASC,EAAoB,EAAI,IAf3DzB,EAAW,YAAY,EACvBO,EAAe,EACfqB,EAAgB,QAAQ,EACxBpB,EAAmB,EAEnBlB,EAA6B,CAAC,EAC9B,SAAS,KAAK,MAAM,OAAS,UAE7B,SAAS,oBAAoB,YAAa8B,CAAe,EACzD,SAAS,oBAAoB,WAAYI,CAAc,EACvD,SAAS,oBAAoB,QAASC,EAAoB,EAAI,EAOlE,EAGMkB,EAAe,IAAM,CACzB,GAAIpD,EAAmB,CACrB,IAAMa,EAAWF,EAAiBX,CAAiB,EACnD,GAAIa,EAAS,OAAS,EAAG,CAEvB,IAAMN,EADUM,EAAS,CAAC,EACJ,sBAAsB,EAEtCwC,EAAiB,OAAO,YACxBC,EAAgB,OAAO,WACvBC,EACJhD,EAAK,IAAM8C,GACX9C,EAAK,OAAS,GACdA,EAAK,KAAO+C,GACZ/C,EAAK,MAAQ,EAETiD,EAAkB,CACtB,IAAKjD,EAAK,IACV,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,QAASA,EAAK,KAAOA,EAAK,MAAQ,EAClC,QAASA,EAAK,IAAMA,EAAK,OAAS,CACpC,EAEA,OAAO,OAAO,YACZ,CACE,KAAM,0BACN,SAAUiD,EACV,aAAcD,EACd,iBAAkBvD,CACpB,EACA,GACF,CACF,CACF,CACF,EAGMyD,GAAiBC,GAAwB,CAC7C,IAAMC,EAAUD,EAAM,KAEtB,OAAQC,EAAQ,KAAM,CACpB,IAAK,0BACHT,GAAqBS,EAAQ,KAAK,OAAO,EACrCA,EAAQ,KAAK,OAAO,uBAAyB,SAC/ClD,EAAW,QAAUkD,EAAQ,KAAK,MAAM,sBAE1C,MAEF,IAAK,iBACCA,EAAQ,MAAQA,EAAQ,KAAK,UAAY,OAC3CpB,GACEoB,EAAQ,KAAK,iBACbA,EAAQ,KAAK,OACf,EAEA,QAAQ,KACN,oDACAA,CACF,EAEF,MAEF,IAAK,mBAEDA,EAAQ,MACRA,EAAQ,KAAK,kBACbA,EAAQ,KAAK,YAAc,QAC3BA,EAAQ,KAAK,QAAU,OAEvBhB,GACEgB,EAAQ,KAAK,iBACbA,EAAQ,KAAK,UACbA,EAAQ,KAAK,KACf,EAEA,QAAQ,KACN,sDACAA,CACF,EAEF,MAEF,IAAK,mBACHrB,GAAgB,EAChB,MAEF,IAAK,eACH,OAAO,SAAS,OAAO,EACvB,MAEF,IAAK,iBACCqB,EAAQ,MAAQA,EAAQ,KAAK,UAAY,OAC3CZ,GACEY,EAAQ,KAAK,iBACbA,EAAQ,KAAK,OACf,EAEA,QAAQ,KACN,oDACAA,CACF,EAEF,MAEF,IAAK,2BACH,GAAI3D,EAAmB,CACrB,IAAMa,EAAWF,EAAiBX,CAAiB,EACnD,GAAIa,EAAS,OAAS,EAAG,CAEvB,IAAMN,EADUM,EAAS,CAAC,EACJ,sBAAsB,EAEtCwC,EAAiB,OAAO,YACxBC,EAAgB,OAAO,WACvBC,EACJhD,EAAK,IAAM8C,GACX9C,EAAK,OAAS,GACdA,EAAK,KAAO+C,GACZ/C,EAAK,MAAQ,EAETiD,GAAkB,CACtB,IAAKjD,EAAK,IACV,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,QAASA,EAAK,KAAOA,EAAK,MAAQ,EAClC,QAASA,EAAK,IAAMA,EAAK,OAAS,CACpC,EAEA,OAAO,OAAO,YACZ,CACE,KAAM,0BACN,SAAUiD,GACV,aAAcD,EACd,iBAAkBvD,CACpB,EACA,GACF,CACF,CACF,CACA,MAEF,IAAK,qBACC2D,EAAQ,MAAQA,EAAQ,KAAK,aAAe,SAC9ChE,EAAoBgE,EAAQ,KAAK,WAC7BA,EAAQ,KAAK,YACf1C,EAAmB,GAGvB,MAEF,IAAK,iBACC0C,EAAQ,MAAQA,EAAQ,KAAK,SAAW,SAC1C/D,EAAiB+D,EAAQ,KAAK,OAC1BA,EAAQ,KAAK,QACf1C,EAAmB,GAGvB,MAEF,IAAK,0BACC0C,EAAQ,MACVlD,EAAW,oBAAoBkD,EAAQ,IAAI,EAE7C,MAEF,QACE,KACJ,CACF,EAGMC,EAAe,IAAM,CACzB,GAAI5D,EAAmB,CACrB,IAAMa,EAAWF,EAAiBX,CAAiB,EACnDF,EAAiB,QAAQ,CAACM,EAASsC,IAAU,CACvCA,EAAQ7B,EAAS,QACnBR,EAAgBD,EAASS,EAAS6B,CAAK,CAAE,CAE7C,CAAC,CACH,CAEI3C,EAA2B,OAAS,GACtCF,EAAc,QAAQ,CAACO,EAASsC,IAAU,CACpCA,EAAQ3C,EAA2B,QACrCM,EAAgBD,EAASL,EAA2B2C,CAAK,CAAE,CAE/D,CAAC,CAEL,EAG+B,SAAS,iBACtC,kDACF,EACuB,QAAQ,CAAC3B,EAAI2B,IAAU,CAC5C,IAAMmB,EAAS9C,EACT+C,EAAK,aAAaD,EAAO,QAAQ,QAAQ,IAAIA,EAAO,QAAQ,UAAU,IAAInB,CAAK,GACrFmB,EAAO,QAAQ,iBAAmBC,CACpC,CAAC,EAGD,IAAMC,GAAmB,IAAI,iBAAkBC,GAAc,CACvCA,EAAU,KAAMC,GAAa,CAC/C,IAAMC,EAAeC,GAAwB,CAC3C,GAAIA,EAAK,WAAa,KAAK,aAAc,CACvC,IAAMpD,EAAKoD,EACX,GAAIpD,EAAG,SAAWA,EAAG,QAAQ,iBAC3B,MAAO,GAET,QAASqD,EAAI,EAAGA,EAAIrD,EAAG,SAAS,OAAQqD,IACtC,GAAIF,EAAYnD,EAAG,SAASqD,CAAC,CAAE,EAC7B,MAAO,EAGb,CACA,MAAO,EACT,EASA,OANEH,EAAS,OAAS,eACjBA,EAAS,gBAAkB,SAC1BA,EAAS,gBAAkB,SAC3BA,EAAS,gBAAkB,SAC3BA,EAAS,gBAAkB,WAENC,EAAYD,EAAS,MAAM,CACtD,CAAC,GAGC,WAAWL,EAAc3D,CAAmB,CAEhD,CAAC,EAGD,OAAO,iBAAiB,UAAWwD,EAAa,EAChD,OAAO,iBAAiB,SAAUL,EAAc,EAAI,EACpD,SAAS,iBAAiB,SAAUA,EAAc,EAAI,EACtD,OAAO,iBAAiB,SAAUQ,CAAY,EAC9C,OAAO,iBAAiB,SAAUA,CAAY,EAG9CG,GAAiB,QAAQ,SAAS,KAAM,CACtC,WAAY,GACZ,UAAW,GACX,QAAS,GACT,gBAAiB,CAAC,QAAS,QAAS,QAAS,QAAQ,CACvD,CAAC,EAGD,OAAO,OAAO,YAAY,CAAE,KAAM,yBAA0B,EAAG,GAAG,CACpE","names":["isInstrumentedElement","element","htmlEl","getElementSelectorId","ALLOWED_ATTRIBUTES","findElementsById","id","sourceElements","updateElementClasses","elements","classes","updateElementAttribute","attribute","value","collectAllowedAttributes","allowedAttributes","attributes","attr","val","DROPDOWN_CONTAINER_STYLES","DROPDOWN_ITEM_BASE_STYLES","DROPDOWN_ITEM_ACTIVE_COLOR","DROPDOWN_ITEM_ACTIVE_BG","DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT","DROPDOWN_ITEM_HOVER_BG","DEPTH_INDENT_PX","CHEVRON_COLLAPSED","CHEVRON_EXPANDED","BASE_PADDING_PX","LAYER_DROPDOWN_ATTR","MAX_PARENT_DEPTH","MAX_CHILD_DEPTH","applyStyles","element","styles","key","m","getLayerDisplayName","layer","toLayerInfo","depth","info","getElementSelectorId","getInstrumentedDescendants","parent","maxDepth","startDepth","result","walk","el","instrDepth","i","child","isInstrumentedElement","collectInstrumentedParents","selectedElement","parents","current","MAX_PARENT_DEPTH","addParentsToChain","chain","p","addSelfAndDescendantsToChain","selfDepth","descendants","MAX_CHILD_DEPTH","getImmediateInstrParent","collectSiblings","siblings","s","appendSiblingsWithSelected","selectedSelectorId","seen","sibling","id","buildLayerChain","instrParent","activeDropdown","activeLabel","outsideMousedownHandler","activeOnHoverEnd","activeKeydownHandler","createDropdownItem","layer","isActive","onSelect","onHover","onHoverEnd","item","getLayerDisplayName","applyStyles","DROPDOWN_ITEM_BASE_STYLES","depth","BASE_PADDING_PX","DEPTH_INDENT_PX","DROPDOWN_ITEM_ACTIVE_COLOR","DROPDOWN_ITEM_ACTIVE_BG","DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT","DROPDOWN_ITEM_HOVER_BG","e","createDropdownElement","layers","currentElement","callbacks","container","LAYER_DROPDOWN_ATTR","DROPDOWN_CONTAINER_STYLES","enhanceLabelWithChevron","label","t","CHEVRON_COLLAPSED","CHEVRON_EXPANDED","setupKeyboardNavigation","dropdown","items","focusedIndex","l","setFocusedItem","index","prev","cur","closeDropdown","setupOutsideClickHandler","skipFirst","target","showDropdown","overlay","isDropdownOpen","createLayerController","config","layerPreviewOverlay","escapeHandler","dropdownSourceLayer","clearLayerPreview","showLayerPreview","layer","getElementSelectorId","selectLayer","closeDropdown","firstOverlay","attachToOverlay","restoreSelection","handleLabelClick","e","label","element","layers","currentId","isDropdownOpen","ev","showDropdown","overlay","buildLayerChain","enhanceLabelWithChevron","FOCUS_STYLE_ID","EDITABLE_TAGS","injectFocusOutlineCSS","style","removeFocusOutlineCSS","selectText","element","range","selection","isEditableTextElement","shouldEnterInlineEditingMode","DEBOUNCE_MS","createInlineEditController","host","currentEditingElement","debouncedSendTimeout","enabled","listenerAbortControllers","repositionOverlays","selectedId","elements","overlay","i","reportEdit","element","originalContent","newContent","svgElement","rect","debouncedReport","onTextInput","handleInputEvent","makeEditable","injectFocusOutlineCSS","abortController","selectText","makeNonEditable","removeFocusOutlineCSS","value","shouldEnterInlineEditingMode","o","el","elementId","data","setupVisualEditAgent","isVisualEditMode","isPopoverDragging","isDropdownOpen","hoverOverlays","selectedOverlays","currentHighlightedElements","selectedElementId","REPOSITION_DELAY_MS","createOverlay","isSelected","overlay","positionOverlay","element","rect","label","inlineEdit","createInlineEditController","findElementsById","clearSelectedOverlays","elements","elementId","el","clearSelection","clearHoverOverlays","TEXT_TAGS","notifyElementSelected","htmlElement","svgElement","isTextElement","getElementSelectorId","collectAllowedAttributes","ALLOWED_ATTRIBUTES","selectElement","visualSelectorId","notifyDeselection","handleMouseOver","e","target","selectorId","handleMouseOut","handleElementClick","LAYER_DROPDOWN_ATTR","selectedOverlay","layerController","unselectElement","updateElementClassesAndReposition","classes","updateElementClasses","index","updateElementAttributeAndReposition","attribute","value","updateElementAttribute","updateElementContent","content","createLayerController","toggleVisualEditMode","isEnabled","handleScroll","viewportHeight","viewportWidth","isInViewport","elementPosition","handleMessage","event","message","handleResize","htmlEl","id","mutationObserver","mutations","mutation","hasVisualId","node","i"]}
|
|
1
|
+
{"version":3,"sources":["../../src/injections/utils.ts","../../src/injections/layer-dropdown/consts.ts","../../src/injections/layer-dropdown/utils.ts","../../src/injections/layer-dropdown/dropdown-ui.ts","../../src/injections/layer-dropdown/controller.ts","../../src/capabilities/inline-edit/dom-utils.ts","../../src/capabilities/inline-edit/controller.ts","../../src/injections/visual-edit-agent.ts"],"sourcesContent":["/** Check if an element has instrumentation attributes */\nexport function isInstrumentedElement(element: Element): boolean {\n const htmlEl = element as HTMLElement;\n return !!(\n htmlEl.dataset?.sourceLocation || htmlEl.dataset?.visualSelectorId\n );\n}\n\n/** Get the selector ID from an element's data attributes (prefers source-location) */\nexport function getElementSelectorId(element: Element): string | null {\n const htmlEl = element as HTMLElement;\n return (\n htmlEl.dataset?.sourceLocation ||\n htmlEl.dataset?.visualSelectorId ||\n null\n );\n}\n\nexport const ALLOWED_ATTRIBUTES: string[] = [\"src\"];\n\n/** Find elements by ID - first try data-source-location, fallback to data-visual-selector-id */\nexport function findElementsById(id: string | null): Element[] {\n if (!id) return [];\n const sourceElements = Array.from(\n document.querySelectorAll(`[data-source-location=\"${id}\"]`)\n );\n if (sourceElements.length > 0) {\n return sourceElements;\n }\n return Array.from(\n document.querySelectorAll(`[data-visual-selector-id=\"${id}\"]`)\n );\n}\n\n/**\n * Update element classes by visual selector ID.\n * Uses setAttribute instead of className to support both HTML and SVG elements.\n */\nexport function updateElementClasses(elements: Element[], classes: string): void {\n elements.forEach((element) => {\n element.setAttribute(\"class\", classes);\n });\n}\n\n/** Set a single attribute on all provided elements. */\nexport function updateElementAttribute(elements: Element[], attribute: string, value: string): void {\n if (!ALLOWED_ATTRIBUTES.includes(attribute)) {\n return;\n }\n\n elements.forEach((element) => {\n element.setAttribute(attribute, value);\n });\n}\n\n/** Collect attribute values from an element for a given allowlist. */\nexport function collectAllowedAttributes(element: Element, allowedAttributes: string[]): Record<string, string> {\n const attributes: Record<string, string> = {};\n for (const attr of allowedAttributes) {\n const val = element.getAttribute(attr);\n if (val !== null) {\n attributes[attr] = val;\n }\n }\n return attributes;\n}\n","/** Style constants for the layer dropdown UI */\n\nexport const DROPDOWN_CONTAINER_STYLES: Record<string, string> = {\n position: \"absolute\",\n backgroundColor: \"#ffffff\",\n border: \"1px solid #e2e8f0\",\n borderRadius: \"6px\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n fontSize: \"12px\",\n minWidth: \"120px\",\n maxHeight: \"200px\",\n overflowY: \"auto\",\n zIndex: \"10001\",\n padding: \"4px 0\",\n pointerEvents: \"auto\",\n};\n\nexport const DROPDOWN_ITEM_BASE_STYLES: Record<string, string> = {\n padding: \"4px 12px\",\n cursor: \"pointer\",\n color: \"#334155\",\n backgroundColor: \"transparent\",\n whiteSpace: \"nowrap\",\n lineHeight: \"1.5\",\n fontWeight: \"400\",\n};\n\nexport const DROPDOWN_ITEM_ACTIVE_COLOR = \"#526cff\";\nexport const DROPDOWN_ITEM_ACTIVE_BG = \"#DBEAFE\";\nexport const DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT = \"600\";\n\nexport const DROPDOWN_ITEM_HOVER_BG = \"#f1f5f9\";\n\nexport const DEPTH_INDENT_PX = 10;\n\n/** Chevron shown when dropdown is collapsed (click to expand) */\nexport const CHEVRON_COLLAPSED = \" \\u25BE\";\n/** Chevron shown when dropdown is expanded (click to collapse) */\nexport const CHEVRON_EXPANDED = \" \\u25B4\";\n\nexport const BASE_PADDING_PX = 12;\n\nexport const LAYER_DROPDOWN_ATTR = \"data-layer-dropdown\";\n\n/** Max instrumented ancestors to show above the selected element */\nexport const MAX_PARENT_DEPTH = 2;\n\n/** Max instrumented depth levels to show below the selected element */\nexport const MAX_CHILD_DEPTH = 2;\n","/** DOM utilities for the layer-dropdown module */\n\nimport { isInstrumentedElement, getElementSelectorId } from \"../utils.js\";\nimport { MAX_PARENT_DEPTH, MAX_CHILD_DEPTH } from \"./consts.js\";\n\nimport type { LayerInfo } from \"./types.js\";\n\n/** Apply a style map to an element */\nexport function applyStyles(element: HTMLElement, styles: Record<string, string>): void {\n for (const key of Object.keys(styles)) {\n element.style.setProperty(\n key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n styles[key]!\n );\n }\n}\n\n/** Display name for a layer — just the real tag name */\nexport function getLayerDisplayName(layer: LayerInfo): string {\n return layer.tagName;\n}\n\nfunction toLayerInfo(element: Element, depth?: number): LayerInfo {\n const info: LayerInfo = {\n element,\n tagName: element.tagName.toLowerCase(),\n selectorId: getElementSelectorId(element),\n };\n if (depth !== undefined) info.depth = depth;\n return info;\n}\n\n/**\n * Collect instrumented descendants up to `maxDepth` instrumented nesting levels.\n * Non-instrumented wrappers are walked through without counting toward depth.\n * Results are in DOM order.\n * When `startDepth` is provided, assigns `depth` to each item during collection.\n */\nexport function getInstrumentedDescendants(\n parent: Element,\n maxDepth: number,\n startDepth?: number\n): LayerInfo[] {\n const result: LayerInfo[] = [];\n\n function walk(el: Element, instrDepth: number): void {\n if (instrDepth > maxDepth) return;\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i]!;\n if (isInstrumentedElement(child)) {\n const info: LayerInfo = {\n element: child,\n tagName: child.tagName.toLowerCase(),\n selectorId: getElementSelectorId(child),\n };\n if (startDepth !== undefined) {\n info.depth = startDepth + instrDepth - 1;\n }\n result.push(info);\n walk(child, instrDepth + 1);\n } else {\n walk(child, instrDepth);\n }\n }\n }\n\n walk(parent, 1);\n return result;\n}\n\n/** Collect instrumented ancestors from selected element up to MAX_PARENT_DEPTH (outermost first). */\nfunction collectInstrumentedParents(selectedElement: Element): LayerInfo[] {\n const parents: LayerInfo[] = [];\n let current = selectedElement.parentElement;\n while (\n current &&\n current !== document.documentElement &&\n current !== document.body &&\n parents.length < MAX_PARENT_DEPTH\n ) {\n if (isInstrumentedElement(current)) {\n parents.push(toLayerInfo(current));\n }\n current = current.parentElement;\n }\n parents.reverse();\n return parents;\n}\n\n/** Add parents to chain with depth 0, 1, …; returns depth of selected (parents.length). */\nfunction addParentsToChain(chain: LayerInfo[], parents: LayerInfo[]): number {\n parents.forEach((p, i) => {\n chain.push({ ...p, depth: i });\n });\n return parents.length;\n}\n\n/** Add selected element and its descendants at the given depth. */\nfunction addSelfAndDescendantsToChain(\n chain: LayerInfo[],\n selectedElement: Element,\n selfDepth: number\n): void {\n chain.push(toLayerInfo(selectedElement, selfDepth));\n const descendants = getInstrumentedDescendants(\n selectedElement,\n MAX_CHILD_DEPTH,\n selfDepth + 1\n );\n chain.push(...descendants);\n}\n\n/** Get the innermost instrumented parent's DOM element, or null if none. */\nfunction getImmediateInstrParent(parents: LayerInfo[]): Element | null {\n return parents.at(-1)?.element ?? null;\n}\n\n/** Collect instrumented siblings of the selected element from its parent (DOM order). */\nfunction collectSiblings(parent: Element, selectedElement: Element): LayerInfo[] {\n const siblings = getInstrumentedDescendants(parent, 1);\n if (!siblings.some((s) => s.element === selectedElement)) {\n siblings.push(toLayerInfo(selectedElement));\n }\n return siblings;\n}\n\n/** Add siblings at selfDepth, expanding children only for the selected element. */\nfunction appendSiblingsWithSelected(\n chain: LayerInfo[],\n siblings: LayerInfo[],\n selectedElement: Element,\n selfDepth: number\n): void {\n const selectedSelectorId = getElementSelectorId(selectedElement);\n const seen = new Set<string>();\n for (const sibling of siblings) {\n if (sibling.element === selectedElement) {\n addSelfAndDescendantsToChain(chain, selectedElement, selfDepth);\n if (selectedSelectorId) seen.add(selectedSelectorId);\n } else {\n const id = sibling.selectorId;\n if (id != null) {\n if (id === selectedSelectorId || seen.has(id)) continue;\n seen.add(id);\n }\n chain.push({ ...sibling, depth: selfDepth });\n }\n }\n}\n\n/**\n * Build the layer chain for the dropdown:\n *\n * Parents – up to MAX_PARENT_DEPTH instrumented ancestors, outer → inner.\n * Siblings – instrumented children of the immediate parent, at the same depth.\n * Current – the selected element (highlighted), with children expanded.\n * Children – instrumented descendants within MAX_CHILD_DEPTH levels, DOM order.\n *\n * Each item carries a `depth` for visual indentation.\n */\nexport function buildLayerChain(selectedElement: Element): LayerInfo[] {\n const parents = collectInstrumentedParents(selectedElement);\n const chain: LayerInfo[] = [];\n const selfDepth = addParentsToChain(chain, parents);\n\n const instrParent = getImmediateInstrParent(parents);\n if (instrParent) {\n const siblings = collectSiblings(instrParent, selectedElement);\n appendSiblingsWithSelected(chain, siblings, selectedElement, selfDepth);\n } else {\n addSelfAndDescendantsToChain(chain, selectedElement, selfDepth);\n }\n\n return chain;\n}\n","/** Dropdown UI component for layer navigation */\n\nimport {\n DROPDOWN_CONTAINER_STYLES,\n DROPDOWN_ITEM_BASE_STYLES,\n DROPDOWN_ITEM_ACTIVE_COLOR,\n DROPDOWN_ITEM_ACTIVE_BG,\n DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT,\n DROPDOWN_ITEM_HOVER_BG,\n DEPTH_INDENT_PX,\n BASE_PADDING_PX,\n CHEVRON_COLLAPSED,\n CHEVRON_EXPANDED,\n LAYER_DROPDOWN_ATTR,\n} from \"./consts.js\";\nimport { applyStyles, getLayerDisplayName } from \"./utils.js\";\nimport type { LayerInfo, DropdownCallbacks } from \"./types.js\";\n\nlet activeDropdown: HTMLDivElement | null = null;\nlet activeLabel: HTMLDivElement | null = null;\nlet outsideMousedownHandler: ((e: MouseEvent) => void) | null = null;\nlet activeOnHoverEnd: (() => void) | null = null;\nlet activeKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n\nfunction createDropdownItem(\n layer: LayerInfo,\n isActive: boolean,\n { onSelect, onHover, onHoverEnd }: DropdownCallbacks\n): HTMLDivElement {\n const item = document.createElement(\"div\");\n item.textContent = getLayerDisplayName(layer);\n applyStyles(item, DROPDOWN_ITEM_BASE_STYLES);\n\n const depth = layer.depth ?? 0;\n if (depth > 0) {\n item.style.paddingLeft = `${BASE_PADDING_PX + depth * DEPTH_INDENT_PX}px`;\n }\n\n if (isActive) {\n item.style.color = DROPDOWN_ITEM_ACTIVE_COLOR;\n item.style.backgroundColor = DROPDOWN_ITEM_ACTIVE_BG;\n item.style.fontWeight = DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT;\n }\n\n item.addEventListener(\"mouseenter\", () => {\n if (!isActive) item.style.backgroundColor = DROPDOWN_ITEM_HOVER_BG;\n if (onHover) onHover(layer);\n });\n\n item.addEventListener(\"mouseleave\", () => {\n if (!isActive) item.style.backgroundColor = \"transparent\";\n if (onHoverEnd) onHoverEnd();\n });\n\n item.addEventListener(\"click\", (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n onSelect(layer);\n });\n\n return item;\n}\n\n/** Create the dropdown DOM element with layer items */\nexport function createDropdownElement(\n layers: LayerInfo[],\n currentElement: Element | null,\n callbacks: DropdownCallbacks\n): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.setAttribute(LAYER_DROPDOWN_ATTR, \"true\");\n applyStyles(container, DROPDOWN_CONTAINER_STYLES);\n\n layers.forEach((layer) => {\n const isActive = layer.element === currentElement;\n container.appendChild(createDropdownItem(layer, isActive, callbacks));\n });\n\n return container;\n}\n\n/** Add chevron indicator and pointer-events to the label */\nexport function enhanceLabelWithChevron(label: HTMLDivElement): void {\n const t = label.textContent ?? \"\";\n if (t.endsWith(CHEVRON_COLLAPSED) || t.endsWith(CHEVRON_EXPANDED)) return;\n\n label.textContent = t + CHEVRON_COLLAPSED;\n label.style.cursor = \"pointer\";\n label.style.userSelect = \"none\";\n label.style.whiteSpace = \"nowrap\";\n label.style.pointerEvents = \"auto\";\n label.setAttribute(LAYER_DROPDOWN_ATTR, \"true\");\n}\n\nfunction setupKeyboardNavigation(\n dropdown: HTMLDivElement,\n layers: LayerInfo[],\n currentElement: Element | null,\n { onSelect, onHover, onHoverEnd }: DropdownCallbacks\n): void {\n const items = Array.from(dropdown.children) as HTMLDivElement[];\n let focusedIndex = layers.findIndex((l) => l.element === currentElement);\n\n const setFocusedItem = (index: number) => {\n if (focusedIndex >= 0 && focusedIndex < items.length) {\n const prev = items[focusedIndex]!;\n if (prev.style.color !== DROPDOWN_ITEM_ACTIVE_COLOR) {\n prev.style.backgroundColor = \"transparent\";\n }\n }\n focusedIndex = index;\n if (focusedIndex >= 0 && focusedIndex < items.length) {\n const cur = items[focusedIndex]!;\n if (cur.style.color !== DROPDOWN_ITEM_ACTIVE_COLOR) {\n cur.style.backgroundColor = DROPDOWN_ITEM_HOVER_BG;\n }\n cur.scrollIntoView({ block: \"nearest\" });\n if (onHover && focusedIndex >= 0 && focusedIndex < layers.length) {\n onHover(layers[focusedIndex]!);\n }\n }\n };\n\n activeKeydownHandler = (e: KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n setFocusedItem(focusedIndex < items.length - 1 ? focusedIndex + 1 : 0);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n e.stopPropagation();\n setFocusedItem(focusedIndex > 0 ? focusedIndex - 1 : items.length - 1);\n } else if (e.key === \"Enter\" && focusedIndex >= 0 && focusedIndex < layers.length) {\n e.preventDefault();\n e.stopPropagation();\n if (onHoverEnd) onHoverEnd();\n onSelect(layers[focusedIndex]!);\n closeDropdown();\n }\n };\n document.addEventListener(\"keydown\", activeKeydownHandler, true);\n}\n\nfunction setupOutsideClickHandler(\n dropdown: HTMLDivElement,\n label: HTMLDivElement\n): void {\n let skipFirst = true;\n outsideMousedownHandler = (e: MouseEvent) => {\n if (skipFirst) { skipFirst = false; return; }\n const target = e.target as Node;\n if (!dropdown.contains(target) && target !== label) {\n closeDropdown();\n }\n };\n document.addEventListener(\"mousedown\", outsideMousedownHandler, true);\n}\n\n/** Show the dropdown below the label element */\nexport function showDropdown(\n label: HTMLDivElement,\n layers: LayerInfo[],\n currentElement: Element | null,\n callbacks: DropdownCallbacks\n): void {\n closeDropdown();\n\n const dropdown = createDropdownElement(\n layers,\n currentElement,\n {\n ...callbacks,\n onSelect: (layer) => {\n if (callbacks.onHoverEnd) callbacks.onHoverEnd();\n callbacks.onSelect(layer);\n closeDropdown();\n },\n }\n );\n\n const overlay = label.parentElement;\n if (!overlay) return;\n\n dropdown.style.top = `${label.offsetTop + label.offsetHeight + 2}px`;\n dropdown.style.left = `${label.offsetLeft}px`;\n\n overlay.appendChild(dropdown);\n activeDropdown = dropdown;\n activeLabel = label;\n if (label.textContent?.endsWith(CHEVRON_COLLAPSED.trim())) {\n label.textContent = label.textContent.slice(0, -CHEVRON_COLLAPSED.length) + CHEVRON_EXPANDED;\n }\n activeOnHoverEnd = callbacks.onHoverEnd ?? null;\n\n setupKeyboardNavigation(dropdown, layers, currentElement, callbacks);\n setupOutsideClickHandler(dropdown, label);\n}\n\n/** Close the active dropdown and clean up listeners */\nexport function closeDropdown(): void {\n if (activeLabel?.textContent?.includes(CHEVRON_EXPANDED)) {\n activeLabel.textContent = activeLabel.textContent.replace(CHEVRON_EXPANDED, CHEVRON_COLLAPSED);\n }\n activeLabel = null;\n\n if (activeOnHoverEnd) {\n activeOnHoverEnd();\n activeOnHoverEnd = null;\n }\n\n if (activeDropdown && activeDropdown.parentNode) {\n activeDropdown.remove();\n }\n activeDropdown = null;\n\n if (outsideMousedownHandler) {\n document.removeEventListener(\"mousedown\", outsideMousedownHandler, true);\n outsideMousedownHandler = null;\n }\n\n if (activeKeydownHandler) {\n document.removeEventListener(\"keydown\", activeKeydownHandler, true);\n activeKeydownHandler = null;\n }\n}\n\n/** Check if a dropdown is currently visible */\nexport function isDropdownOpen(): boolean {\n return activeDropdown !== null;\n}\n","/** Controller that encapsulates layer-dropdown integration logic */\n\nimport { getElementSelectorId } from \"../utils.js\";\nimport { buildLayerChain } from \"./utils.js\";\nimport {\n enhanceLabelWithChevron,\n showDropdown,\n closeDropdown,\n isDropdownOpen,\n} from \"./dropdown-ui.js\";\nimport type { LayerInfo, LayerControllerConfig, LayerController } from \"./types.js\";\n\nexport function createLayerController(config: LayerControllerConfig): LayerController {\n let layerPreviewOverlay: HTMLDivElement | null = null;\n let escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n let dropdownSourceLayer: LayerInfo | null = null;\n\n const clearLayerPreview = () => {\n if (layerPreviewOverlay && layerPreviewOverlay.parentNode) {\n layerPreviewOverlay.remove();\n }\n layerPreviewOverlay = null;\n };\n\n const showLayerPreview = (layer: LayerInfo) => {\n clearLayerPreview();\n if (getElementSelectorId(layer.element) === config.getSelectedElementId()) return;\n\n layerPreviewOverlay = config.createPreviewOverlay(layer.element);\n };\n\n const selectLayer = (layer: LayerInfo) => {\n clearLayerPreview();\n closeDropdown();\n if (escapeHandler) {\n document.removeEventListener(\"keydown\", escapeHandler, true);\n escapeHandler = null;\n }\n dropdownSourceLayer = null;\n\n const firstOverlay = config.selectElement(layer.element);\n attachToOverlay(firstOverlay, layer.element);\n };\n\n const restoreSelection = () => {\n if (escapeHandler) {\n document.removeEventListener(\"keydown\", escapeHandler, true);\n escapeHandler = null;\n }\n if (dropdownSourceLayer) {\n selectLayer(dropdownSourceLayer);\n dropdownSourceLayer = null;\n }\n };\n\n const handleLabelClick = (e: MouseEvent, label: HTMLDivElement, element: Element, layers: LayerInfo[], currentId: string | null) => {\n e.stopPropagation();\n e.preventDefault();\n if (isDropdownOpen()) {\n closeDropdown();\n restoreSelection();\n } else {\n dropdownSourceLayer = {\n element,\n tagName: element.tagName.toLowerCase(),\n selectorId: currentId,\n };\n config.onDeselect();\n\n escapeHandler = (ev: KeyboardEvent) => {\n if (ev.key === \"Escape\") {\n ev.stopPropagation();\n closeDropdown();\n restoreSelection();\n }\n };\n document.addEventListener(\"keydown\", escapeHandler, true);\n\n showDropdown(label, layers, element, { onSelect: selectLayer, onHover: showLayerPreview, onHoverEnd: clearLayerPreview });\n }\n };\n\n const attachToOverlay = (\n overlay: HTMLDivElement | undefined,\n element: Element\n ) => {\n if (!overlay) return;\n\n const label = overlay.querySelector(\"div\") as HTMLDivElement | null;\n if (!label) return;\n\n const layers = buildLayerChain(element);\n if (layers.length <= 1) return;\n\n const currentId = getElementSelectorId(element);\n enhanceLabelWithChevron(label);\n\n label.addEventListener(\"click\", (e: MouseEvent) => {\n handleLabelClick(e, label, element, layers, currentId);\n });\n };\n\n const cleanup = () => {\n clearLayerPreview();\n closeDropdown();\n };\n\n return { attachToOverlay, cleanup };\n}\n","const FOCUS_STYLE_ID = \"visual-edit-focus-styles\";\n\nconst EDITABLE_TAGS = [\n \"div\", \"p\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"span\", \"li\", \"td\", \"a\", \"button\", \"label\",\n];\n\nexport const isStaticArrayTextElement = (element: HTMLElement): boolean => {\n return !!element.dataset.arrField;\n};\n\nconst passesStructuralChecks = (element: HTMLElement): boolean => {\n if (!EDITABLE_TAGS.includes(element.tagName.toLowerCase())) return false;\n if (!element.textContent?.trim()) return false;\n if (element.querySelector(\"img, video, canvas, svg\")) return false;\n if (element.children?.length > 0) return false;\n return true;\n};\n\nexport const injectFocusOutlineCSS = () => {\n if (document.getElementById(FOCUS_STYLE_ID)) return;\n\n const style = document.createElement(\"style\");\n style.id = FOCUS_STYLE_ID;\n style.textContent = `\n [data-selected=\"true\"][contenteditable=\"true\"]:focus {\n outline: none !important;\n }\n `;\n document.head.appendChild(style);\n};\n\nexport const removeFocusOutlineCSS = () => {\n document.getElementById(FOCUS_STYLE_ID)?.remove();\n};\n\nexport const selectText = (element: HTMLElement) => {\n const range = document.createRange();\n range.selectNodeContents(element);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n};\n\nexport const isEditableTextElement = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) return false;\n if (!passesStructuralChecks(element)) return false;\n if (isStaticArrayTextElement(element)) return true;\n if (element.dataset.dynamicContent === \"true\") return false;\n return true;\n};\n\nexport const shouldEnterInlineEditingMode = (element: Element): boolean => {\n if (!(element instanceof HTMLElement) || element.dataset.selected !== \"true\") {\n return false;\n }\n return isEditableTextElement(element);\n};\n","import type { InlineEditHost, InlineEditController } from \"./types.js\";\nimport {\n injectFocusOutlineCSS,\n removeFocusOutlineCSS,\n selectText,\n shouldEnterInlineEditingMode,\n isStaticArrayTextElement,\n} from \"./dom-utils.js\";\n\nconst DEBOUNCE_MS = 500;\n\nexport function createInlineEditController(\n host: InlineEditHost\n): InlineEditController {\n let currentEditingElement: HTMLElement | null = null;\n let debouncedSendTimeout: ReturnType<typeof setTimeout> | null = null;\n let enabled = false;\n const listenerAbortControllers = new WeakMap<HTMLElement, AbortController>();\n\n // --- Private helpers ---\n\n const repositionOverlays = () => {\n const selectedId = host.getSelectedElementId();\n if (!selectedId) return;\n const elements = host.findElementsById(selectedId);\n const overlays = host.getSelectedOverlays();\n overlays.forEach((overlay, i) => {\n if (i < elements.length && elements[i]) {\n host.positionOverlay(overlay, elements[i]);\n }\n });\n };\n\n const reportEdit = (element: HTMLElement) => {\n const originalContent = element.dataset.originalTextContent;\n const newContent = element.textContent;\n\n const svgElement = element as unknown as SVGElement;\n const rect = element.getBoundingClientRect();\n\n const message: Record<string, unknown> = {\n type: \"inline-edit\",\n elementInfo: {\n tagName: element.tagName,\n classes:\n (svgElement.className as unknown as SVGAnimatedString)?.baseVal ||\n element.className ||\n \"\",\n visualSelectorId: host.getSelectedElementId(),\n content: newContent,\n dataSourceLocation: element.dataset.sourceLocation,\n isDynamicContent: element.dataset.dynamicContent === \"true\",\n linenumber: element.dataset.linenumber,\n filename: element.dataset.filename,\n position: {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n },\n },\n originalContent,\n newContent,\n };\n\n if (isStaticArrayTextElement(element)) {\n message.arrIndex = element.dataset.arrIndex;\n message.arrVariableName = element.dataset.arrVariableName;\n message.arrField = element.dataset.arrField;\n }\n\n window.parent.postMessage(message, \"*\");\n\n element.dataset.originalTextContent = newContent || \"\";\n };\n\n const debouncedReport = (element: HTMLElement) => {\n if (debouncedSendTimeout) clearTimeout(debouncedSendTimeout);\n debouncedSendTimeout = setTimeout(() => reportEdit(element), DEBOUNCE_MS);\n };\n\n const onTextInput = (element: HTMLElement) => {\n repositionOverlays();\n debouncedReport(element);\n };\n\n const handleInputEvent = function (this: HTMLElement) {\n onTextInput(this);\n };\n\n const makeEditable = (element: HTMLElement) => {\n injectFocusOutlineCSS();\n\n element.dataset.originalTextContent = element.textContent || \"\";\n element.dataset.originalCursor = element.style.cursor;\n element.contentEditable = \"true\";\n\n const abortController = new AbortController();\n listenerAbortControllers.set(element, abortController);\n element.addEventListener(\"input\", handleInputEvent, {\n signal: abortController.signal,\n });\n\n element.style.cursor = \"text\";\n selectText(element);\n setTimeout(() => {\n if (element.isConnected) {\n element.focus();\n }\n }, 0);\n };\n\n const makeNonEditable = (element: HTMLElement) => {\n const abortController = listenerAbortControllers.get(element);\n if (abortController) {\n abortController.abort();\n listenerAbortControllers.delete(element);\n }\n\n if (!element.isConnected) return;\n\n removeFocusOutlineCSS();\n element.contentEditable = \"false\";\n delete element.dataset.originalTextContent;\n\n if (element.dataset.originalCursor !== undefined) {\n element.style.cursor = element.dataset.originalCursor;\n delete element.dataset.originalCursor;\n }\n };\n\n // --- Public API ---\n\n return {\n get enabled() {\n return enabled;\n },\n set enabled(value: boolean) {\n enabled = value;\n },\n\n isEditing() {\n return currentEditingElement !== null;\n },\n\n getCurrentElement() {\n return currentEditingElement;\n },\n\n canEdit(element: Element) {\n return shouldEnterInlineEditingMode(element);\n },\n\n startEditing(element: HTMLElement) {\n currentEditingElement = element;\n\n host.getSelectedOverlays().forEach((o) => {\n o.style.display = \"none\";\n });\n\n makeEditable(element);\n\n window.parent.postMessage(\n {\n type: \"content-editing-started\",\n visualSelectorId: host.getSelectedElementId(),\n },\n \"*\"\n );\n },\n\n stopEditing() {\n if (!currentEditingElement) return;\n\n if (debouncedSendTimeout) {\n clearTimeout(debouncedSendTimeout);\n debouncedSendTimeout = null;\n }\n\n const element = currentEditingElement;\n makeNonEditable(element);\n\n host.getSelectedOverlays().forEach((o) => {\n o.style.display = \"\";\n });\n\n repositionOverlays();\n\n window.parent.postMessage(\n {\n type: \"content-editing-ended\",\n visualSelectorId: host.getSelectedElementId(),\n },\n \"*\"\n );\n\n currentEditingElement = null;\n },\n\n markElementsSelected(elements: Element[]) {\n elements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.dataset.selected = \"true\";\n }\n });\n },\n\n clearSelectedMarks(elementId: string | null) {\n if (!elementId) return;\n host.findElementsById(elementId).forEach((el) => {\n if (el instanceof HTMLElement) {\n delete el.dataset.selected;\n }\n });\n },\n\n handleToggleMessage(data: { dataSourceLocation: string; inlineEditingMode: boolean }) {\n if (!enabled) return;\n\n const elements = host.findElementsById(data.dataSourceLocation);\n if (elements.length === 0 || !(elements[0] instanceof HTMLElement)) return;\n\n const element = elements[0];\n\n if (data.inlineEditingMode) {\n if (!shouldEnterInlineEditingMode(element)) return;\n\n // Select the element first if not already selected\n if (host.getSelectedElementId() !== data.dataSourceLocation) {\n this.stopEditing();\n host.clearSelection();\n this.markElementsSelected(elements);\n host.createSelectionOverlays(elements, data.dataSourceLocation);\n }\n this.startEditing(element);\n } else {\n if (currentEditingElement === element) {\n this.stopEditing();\n }\n }\n },\n\n cleanup() {\n this.stopEditing();\n },\n };\n}\n","import { findElementsById, updateElementClasses, updateElementAttribute, collectAllowedAttributes, ALLOWED_ATTRIBUTES, getElementSelectorId } from \"./utils.js\";\nimport { createLayerController } from \"./layer-dropdown/controller.js\";\nimport { LAYER_DROPDOWN_ATTR } from \"./layer-dropdown/consts.js\";\nimport { createInlineEditController } from \"../capabilities/inline-edit/index.js\";\n\nexport function setupVisualEditAgent() {\n // State variables (replacing React useState/useRef)\n let isVisualEditMode = false;\n let isPopoverDragging = false;\n let isDropdownOpen = false;\n let hoverOverlays: HTMLDivElement[] = [];\n let selectedOverlays: HTMLDivElement[] = [];\n let currentHighlightedElements: Element[] = [];\n let selectedElementId: string | null = null;\n\n const REPOSITION_DELAY_MS = 50;\n\n // Create overlay element\n const createOverlay = (isSelected = false): HTMLDivElement => {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.transition = \"all 0.1s ease-in-out\";\n overlay.style.zIndex = \"9999\";\n\n if (isSelected) {\n overlay.style.border = \"2px solid #2563EB\";\n } else {\n overlay.style.border = \"2px solid #95a5fc\";\n overlay.style.backgroundColor = \"rgba(99, 102, 241, 0.05)\";\n }\n\n return overlay;\n };\n\n // Position overlay relative to element\n const positionOverlay = (\n overlay: HTMLDivElement,\n element: Element,\n isSelected = false\n ) => {\n if (!element || !isVisualEditMode) return;\n\n const htmlElement = element as HTMLElement;\n // Force layout recalculation\n void htmlElement.offsetWidth;\n\n const rect = element.getBoundingClientRect();\n overlay.style.top = `${rect.top + window.scrollY}px`;\n overlay.style.left = `${rect.left + window.scrollX}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n\n // Check if label already exists in overlay\n let label = overlay.querySelector(\"div\") as HTMLDivElement | null;\n\n if (!label) {\n label = document.createElement(\"div\");\n label.textContent = element.tagName.toLowerCase();\n label.style.position = \"absolute\";\n label.style.top = \"-27px\";\n label.style.left = \"-2px\";\n label.style.padding = \"2px 8px\";\n label.style.fontSize = \"11px\";\n label.style.fontWeight = isSelected ? \"500\" : \"400\";\n label.style.color = isSelected ? \"#ffffff\" : \"#526cff\";\n label.style.backgroundColor = isSelected ? \"#526cff\" : \"#DBEAFE\";\n label.style.borderRadius = \"3px\";\n label.style.minWidth = \"24px\";\n label.style.textAlign = \"center\";\n overlay.appendChild(label);\n }\n };\n\n // --- Inline edit controller ---\n const inlineEdit = createInlineEditController({\n findElementsById,\n getSelectedElementId: () => selectedElementId,\n getSelectedOverlays: () => selectedOverlays,\n positionOverlay,\n clearSelection: () => {\n inlineEdit.clearSelectedMarks(selectedElementId);\n clearSelectedOverlays();\n selectedElementId = null;\n },\n createSelectionOverlays: (elements, elementId) => {\n elements.forEach((el) => {\n const overlay = createOverlay(true);\n document.body.appendChild(overlay);\n selectedOverlays.push(overlay);\n positionOverlay(overlay, el, true);\n });\n selectedElementId = elementId;\n },\n });\n\n const clearSelection = () => {\n inlineEdit.clearSelectedMarks(selectedElementId);\n clearSelectedOverlays();\n selectedElementId = null;\n };\n\n // Clear hover overlays\n const clearHoverOverlays = () => {\n hoverOverlays.forEach((overlay) => {\n if (overlay && overlay.parentNode) {\n overlay.remove();\n }\n });\n hoverOverlays = [];\n currentHighlightedElements = [];\n };\n\n const clearSelectedOverlays = () => {\n selectedOverlays.forEach((overlay) => {\n if (overlay && overlay.parentNode) {\n overlay.remove();\n }\n });\n selectedOverlays = [];\n };\n\n const TEXT_TAGS = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'span', 'a', 'label'];\n\n const notifyElementSelected = (element: Element) => {\n const htmlElement = element as HTMLElement;\n const rect = element.getBoundingClientRect();\n const svgElement = element as SVGElement;\n const isTextElement = TEXT_TAGS.includes(element.tagName?.toLowerCase());\n\n const arrEl = htmlElement.closest(\"[data-arr-variable-name]\") as HTMLElement | null;\n const staticArrayName = arrEl?.dataset?.arrVariableName || null;\n const rawIdx = arrEl?.dataset?.arrIndex;\n const staticArrayIndex = rawIdx != null ? parseInt(rawIdx, 10) : null;\n const staticArrayField = htmlElement.dataset?.arrField || null;\n\n window.parent.postMessage({\n type: \"element-selected\",\n tagName: element.tagName,\n classes:\n (svgElement.className as unknown as SVGAnimatedString)?.baseVal ||\n element.className ||\n \"\",\n visualSelectorId: getElementSelectorId(element),\n content: isTextElement ? htmlElement.innerText : undefined,\n dataSourceLocation: htmlElement.dataset.sourceLocation,\n isDynamicContent: htmlElement.dataset.dynamicContent === \"true\",\n linenumber: htmlElement.dataset.linenumber,\n filename: htmlElement.dataset.filename,\n position: {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n },\n attributes: collectAllowedAttributes(element, ALLOWED_ATTRIBUTES),\n isTextElement,\n staticArrayName,\n staticArrayIndex,\n staticArrayField,\n }, \"*\");\n };\n\n // Select an element: create overlays, update state, notify parent\n const selectElement = (element: Element): HTMLDivElement | undefined => {\n const visualSelectorId = getElementSelectorId(element);\n\n clearSelectedOverlays();\n\n const elements = findElementsById(visualSelectorId || null);\n elements.forEach((el) => {\n const overlay = createOverlay(true);\n document.body.appendChild(overlay);\n selectedOverlays.push(overlay);\n positionOverlay(overlay, el, true);\n });\n\n selectedElementId = visualSelectorId || null;\n clearHoverOverlays();\n notifyElementSelected(element);\n\n return selectedOverlays[0];\n };\n\n const notifyDeselection = (): void => {\n selectedElementId = null;\n window.parent.postMessage({ type: \"unselect-element\" }, \"*\");\n };\n\n // Handle mouse over event\n const handleMouseOver = (e: MouseEvent) => {\n if (!isVisualEditMode || isPopoverDragging || inlineEdit.isEditing()) return;\n\n\n const target = e.target as Element;\n\n // Prevent hover effects when a dropdown is open\n if (isDropdownOpen) {\n clearHoverOverlays();\n return;\n }\n\n // Prevent hover effects on SVG path elements\n if (target.tagName.toLowerCase() === \"path\") {\n clearHoverOverlays();\n return;\n }\n\n // Support both data-source-location and data-visual-selector-id\n const element = target.closest(\n \"[data-source-location], [data-visual-selector-id]\"\n );\n if (!element) {\n clearHoverOverlays();\n return;\n }\n\n // Prefer data-source-location, fallback to data-visual-selector-id\n const htmlElement = element as HTMLElement;\n const selectorId =\n htmlElement.dataset.sourceLocation ||\n htmlElement.dataset.visualSelectorId;\n\n // Skip if this element is already selected\n if (selectedElementId === selectorId) {\n clearHoverOverlays();\n return;\n }\n\n // Find all elements with the same ID\n const elements = findElementsById(selectorId || null);\n\n // Clear previous hover overlays\n clearHoverOverlays();\n\n // Create overlays for all matching elements\n elements.forEach((el) => {\n const overlay = createOverlay(false);\n document.body.appendChild(overlay);\n hoverOverlays.push(overlay);\n positionOverlay(overlay, el);\n });\n\n currentHighlightedElements = elements;\n };\n\n // Handle mouse out event\n const handleMouseOut = () => {\n if (isPopoverDragging) return;\n clearHoverOverlays();\n };\n\n // Handle element click\n const handleElementClick = (e: MouseEvent) => {\n if (!isVisualEditMode) return;\n\n const target = e.target as Element;\n\n // Let layer dropdown clicks pass through without interference\n if (target.closest(`[${LAYER_DROPDOWN_ATTR}]`)) return;\n\n // Let clicks inside the editable element pass through to the browser\n // so the user can reposition the cursor and select text naturally.\n if (inlineEdit.enabled && target instanceof HTMLElement && target.contentEditable === \"true\") {\n return;\n }\n\n // Clicking outside the editable element exits inline editing mode.\n if (inlineEdit.isEditing()) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n inlineEdit.stopEditing();\n return;\n }\n\n // Close dropdowns when clicking anywhere in iframe if a dropdown is open\n if (isDropdownOpen) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n window.parent.postMessage({ type: \"close-dropdowns\" }, \"*\");\n return;\n }\n\n // Prevent clicking on SVG path elements\n if (target.tagName.toLowerCase() === \"path\") {\n return;\n }\n\n // Prevent default behavior immediately when in visual edit mode\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n // Support both data-source-location and data-visual-selector-id\n const element = target.closest(\n \"[data-source-location], [data-visual-selector-id]\"\n );\n if (!element) {\n return;\n }\n\n const htmlElement = element as HTMLElement;\n const visualSelectorId = getElementSelectorId(element);\n\n const isAlreadySelected =\n selectedElementId === visualSelectorId &&\n htmlElement.dataset.selected === \"true\";\n\n if (isAlreadySelected && inlineEdit.enabled && inlineEdit.canEdit(htmlElement)) {\n inlineEdit.startEditing(htmlElement);\n return;\n }\n\n inlineEdit.stopEditing();\n\n if (inlineEdit.enabled) {\n inlineEdit.markElementsSelected(findElementsById(visualSelectorId));\n }\n\n const selectedOverlay = selectElement(element);\n layerController.attachToOverlay(selectedOverlay, element);\n };\n\n const unselectElement = () => {\n inlineEdit.stopEditing();\n clearSelection();\n };\n\n const updateElementClassesAndReposition = (visualSelectorId: string, classes: string) => {\n const elements = findElementsById(visualSelectorId);\n if (elements.length === 0) return;\n\n updateElementClasses(elements, classes);\n\n // Use a small delay to allow the browser to recalculate layout before repositioning\n setTimeout(() => {\n // Reposition selected overlays\n if (selectedElementId === visualSelectorId) {\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n\n // Reposition hover overlays if needed\n if (currentHighlightedElements.length > 0) {\n const hoveredElement = currentHighlightedElements[0] as HTMLElement;\n const hoveredId = hoveredElement?.dataset?.visualSelectorId;\n if (hoveredId === visualSelectorId) {\n hoverOverlays.forEach((overlay, index) => {\n if (index < currentHighlightedElements.length) {\n positionOverlay(overlay, currentHighlightedElements[index]!);\n }\n });\n }\n }\n }, REPOSITION_DELAY_MS);\n };\n\n // Update element attribute by visual selector ID\n const updateElementAttributeAndReposition = (\n visualSelectorId: string,\n attribute: string,\n value: string\n ) => {\n const elements = findElementsById(visualSelectorId);\n if (elements.length === 0) return;\n\n updateElementAttribute(elements, attribute, value);\n\n // Reposition overlays after attribute change (e.g. image src swap can affect layout)\n setTimeout(() => {\n if (selectedElementId === visualSelectorId) {\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n }, REPOSITION_DELAY_MS);\n };\n\n const updateElementContent = (visualSelectorId: string, content: string, arrIndex?: number) => {\n let elements = findElementsById(visualSelectorId);\n\n if (elements.length === 0) {\n return;\n }\n\n if (arrIndex != null) {\n elements = elements.filter(\n (el) => (el as HTMLElement).dataset.arrIndex === String(arrIndex)\n );\n }\n\n elements.forEach((element) => {\n (element as HTMLElement).innerText = content;\n });\n\n setTimeout(() => {\n if (selectedElementId === visualSelectorId) {\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n }, REPOSITION_DELAY_MS);\n };\n\n // --- Layer dropdown controller ---\n const layerController = createLayerController({\n createPreviewOverlay: (element: Element) => {\n const overlay = createOverlay(false);\n overlay.style.zIndex = \"9998\";\n document.body.appendChild(overlay);\n positionOverlay(overlay, element);\n return overlay;\n },\n getSelectedElementId: () => selectedElementId,\n selectElement,\n onDeselect: notifyDeselection,\n });\n\n // Toggle visual edit mode\n const toggleVisualEditMode = (isEnabled: boolean) => {\n isVisualEditMode = isEnabled;\n\n if (!isEnabled) {\n inlineEdit.stopEditing();\n clearSelection();\n layerController.cleanup();\n clearHoverOverlays();\n\n currentHighlightedElements = [];\n document.body.style.cursor = \"default\";\n\n document.removeEventListener(\"mouseover\", handleMouseOver);\n document.removeEventListener(\"mouseout\", handleMouseOut);\n document.removeEventListener(\"click\", handleElementClick, true);\n } else {\n document.body.style.cursor = \"crosshair\";\n document.addEventListener(\"mouseover\", handleMouseOver);\n document.addEventListener(\"mouseout\", handleMouseOut);\n document.addEventListener(\"click\", handleElementClick, true);\n }\n };\n\n // Handle scroll events to update popover position\n const handleScroll = () => {\n if (selectedElementId) {\n const elements = findElementsById(selectedElementId);\n if (elements.length > 0) {\n const element = elements[0];\n const rect = element!.getBoundingClientRect();\n\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const isInViewport =\n rect.top < viewportHeight &&\n rect.bottom > 0 &&\n rect.left < viewportWidth &&\n rect.right > 0;\n\n const elementPosition = {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n };\n\n window.parent.postMessage(\n {\n type: \"element-position-update\",\n position: elementPosition,\n isInViewport: isInViewport,\n visualSelectorId: selectedElementId,\n },\n \"*\"\n );\n }\n }\n };\n\n // Handle messages from parent window\n const handleMessage = (event: MessageEvent) => {\n const message = event.data;\n\n switch (message.type) {\n case \"toggle-visual-edit-mode\":\n toggleVisualEditMode(message.data.enabled);\n if (message.data.specs?.newInlineEditEnabled !== undefined) {\n inlineEdit.enabled = message.data.specs.newInlineEditEnabled;\n }\n break;\n\n case \"update-classes\":\n if (message.data && message.data.classes !== undefined) {\n updateElementClassesAndReposition(\n message.data.visualSelectorId,\n message.data.classes\n );\n } else {\n console.warn(\n \"[VisualEditAgent] Invalid update-classes message:\",\n message\n );\n }\n break;\n\n case \"update-attribute\":\n if (\n message.data &&\n message.data.visualSelectorId &&\n message.data.attribute !== undefined &&\n message.data.value !== undefined\n ) {\n updateElementAttributeAndReposition(\n message.data.visualSelectorId,\n message.data.attribute,\n message.data.value\n );\n } else {\n console.warn(\n \"[VisualEditAgent] Invalid update-attribute message:\",\n message\n );\n }\n break;\n\n case \"unselect-element\":\n unselectElement();\n break;\n\n case \"refresh-page\":\n window.location.reload();\n break;\n\n case \"update-content\":\n if (message.data && message.data.content !== undefined) {\n updateElementContent(\n message.data.visualSelectorId,\n message.data.content,\n message.data.arrIndex\n );\n } else {\n console.warn(\n \"[VisualEditAgent] Invalid update-content message:\",\n message\n );\n }\n break;\n\n case \"request-element-position\":\n if (selectedElementId) {\n const elements = findElementsById(selectedElementId);\n if (elements.length > 0) {\n const element = elements[0];\n const rect = element!.getBoundingClientRect();\n\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const isInViewport =\n rect.top < viewportHeight &&\n rect.bottom > 0 &&\n rect.left < viewportWidth &&\n rect.right > 0;\n\n const elementPosition = {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n };\n\n window.parent.postMessage(\n {\n type: \"element-position-update\",\n position: elementPosition,\n isInViewport: isInViewport,\n visualSelectorId: selectedElementId,\n },\n \"*\"\n );\n }\n }\n break;\n\n case \"popover-drag-state\":\n if (message.data && message.data.isDragging !== undefined) {\n isPopoverDragging = message.data.isDragging;\n if (message.data.isDragging) {\n clearHoverOverlays();\n }\n }\n break;\n\n case \"dropdown-state\":\n if (message.data && message.data.isOpen !== undefined) {\n isDropdownOpen = message.data.isOpen;\n if (message.data.isOpen) {\n clearHoverOverlays();\n }\n }\n break;\n\n case \"toggle-inline-edit-mode\":\n if (message.data) {\n inlineEdit.handleToggleMessage(message.data);\n }\n break;\n\n default:\n break;\n }\n };\n\n // Handle window resize to reposition overlays\n const handleResize = () => {\n if (selectedElementId) {\n const elements = findElementsById(selectedElementId);\n selectedOverlays.forEach((overlay, index) => {\n if (index < elements.length) {\n positionOverlay(overlay, elements[index]!);\n }\n });\n }\n\n if (currentHighlightedElements.length > 0) {\n hoverOverlays.forEach((overlay, index) => {\n if (index < currentHighlightedElements.length) {\n positionOverlay(overlay, currentHighlightedElements[index]!);\n }\n });\n }\n };\n\n // Initialize: Add IDs to elements that don't have them but have linenumbers\n const elementsWithLineNumber = document.querySelectorAll(\n \"[data-linenumber]:not([data-visual-selector-id])\"\n );\n elementsWithLineNumber.forEach((el, index) => {\n const htmlEl = el as HTMLElement;\n const id = `visual-id-${htmlEl.dataset.filename}-${htmlEl.dataset.linenumber}-${index}`;\n htmlEl.dataset.visualSelectorId = id;\n });\n\n // Create mutation observer to detect layout changes\n const mutationObserver = new MutationObserver((mutations) => {\n const needsUpdate = mutations.some((mutation) => {\n const hasVisualId = (node: Node): boolean => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (el.dataset && el.dataset.visualSelectorId) {\n return true;\n }\n for (let i = 0; i < el.children.length; i++) {\n if (hasVisualId(el.children[i]!)) {\n return true;\n }\n }\n }\n return false;\n };\n\n const isLayoutChange =\n mutation.type === \"attributes\" &&\n (mutation.attributeName === \"style\" ||\n mutation.attributeName === \"class\" ||\n mutation.attributeName === \"width\" ||\n mutation.attributeName === \"height\");\n\n return isLayoutChange && hasVisualId(mutation.target);\n });\n\n if (needsUpdate) {\n setTimeout(handleResize, REPOSITION_DELAY_MS);\n }\n });\n\n // Set up event listeners\n window.addEventListener(\"message\", handleMessage);\n window.addEventListener(\"scroll\", handleScroll, true);\n document.addEventListener(\"scroll\", handleScroll, true);\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleResize);\n\n // Start observing DOM mutations\n mutationObserver.observe(document.body, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\"style\", \"class\", \"width\", \"height\"],\n });\n\n // Send ready message to parent\n window.parent.postMessage({ type: \"visual-edit-agent-ready\" }, \"*\");\n}"],"mappings":"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","names":["isInstrumentedElement","element","htmlEl","getElementSelectorId","ALLOWED_ATTRIBUTES","findElementsById","id","sourceElements","updateElementClasses","elements","classes","updateElementAttribute","attribute","value","collectAllowedAttributes","allowedAttributes","attributes","attr","val","DROPDOWN_CONTAINER_STYLES","DROPDOWN_ITEM_BASE_STYLES","DROPDOWN_ITEM_ACTIVE_COLOR","DROPDOWN_ITEM_ACTIVE_BG","DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT","DROPDOWN_ITEM_HOVER_BG","DEPTH_INDENT_PX","CHEVRON_COLLAPSED","CHEVRON_EXPANDED","BASE_PADDING_PX","LAYER_DROPDOWN_ATTR","MAX_PARENT_DEPTH","MAX_CHILD_DEPTH","applyStyles","element","styles","key","m","getLayerDisplayName","layer","toLayerInfo","depth","info","getElementSelectorId","getInstrumentedDescendants","parent","maxDepth","startDepth","result","walk","el","instrDepth","i","child","isInstrumentedElement","collectInstrumentedParents","selectedElement","parents","current","MAX_PARENT_DEPTH","addParentsToChain","chain","p","addSelfAndDescendantsToChain","selfDepth","descendants","MAX_CHILD_DEPTH","getImmediateInstrParent","collectSiblings","siblings","s","appendSiblingsWithSelected","selectedSelectorId","seen","sibling","id","buildLayerChain","instrParent","activeDropdown","activeLabel","outsideMousedownHandler","activeOnHoverEnd","activeKeydownHandler","createDropdownItem","layer","isActive","onSelect","onHover","onHoverEnd","item","getLayerDisplayName","applyStyles","DROPDOWN_ITEM_BASE_STYLES","depth","BASE_PADDING_PX","DEPTH_INDENT_PX","DROPDOWN_ITEM_ACTIVE_COLOR","DROPDOWN_ITEM_ACTIVE_BG","DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT","DROPDOWN_ITEM_HOVER_BG","e","createDropdownElement","layers","currentElement","callbacks","container","LAYER_DROPDOWN_ATTR","DROPDOWN_CONTAINER_STYLES","enhanceLabelWithChevron","label","t","CHEVRON_COLLAPSED","CHEVRON_EXPANDED","setupKeyboardNavigation","dropdown","items","focusedIndex","l","setFocusedItem","index","prev","cur","closeDropdown","setupOutsideClickHandler","skipFirst","target","showDropdown","overlay","isDropdownOpen","createLayerController","config","layerPreviewOverlay","escapeHandler","dropdownSourceLayer","clearLayerPreview","showLayerPreview","layer","getElementSelectorId","selectLayer","closeDropdown","firstOverlay","attachToOverlay","restoreSelection","handleLabelClick","e","label","element","layers","currentId","isDropdownOpen","ev","showDropdown","overlay","buildLayerChain","enhanceLabelWithChevron","FOCUS_STYLE_ID","EDITABLE_TAGS","isStaticArrayTextElement","element","passesStructuralChecks","injectFocusOutlineCSS","style","removeFocusOutlineCSS","selectText","range","selection","isEditableTextElement","shouldEnterInlineEditingMode","DEBOUNCE_MS","createInlineEditController","host","currentEditingElement","debouncedSendTimeout","enabled","listenerAbortControllers","repositionOverlays","selectedId","elements","overlay","i","reportEdit","element","originalContent","newContent","svgElement","rect","message","isStaticArrayTextElement","debouncedReport","onTextInput","handleInputEvent","makeEditable","injectFocusOutlineCSS","abortController","selectText","makeNonEditable","removeFocusOutlineCSS","value","shouldEnterInlineEditingMode","o","el","elementId","data","setupVisualEditAgent","isVisualEditMode","isPopoverDragging","isDropdownOpen","hoverOverlays","selectedOverlays","currentHighlightedElements","selectedElementId","REPOSITION_DELAY_MS","createOverlay","isSelected","overlay","positionOverlay","element","rect","label","inlineEdit","createInlineEditController","findElementsById","clearSelectedOverlays","elements","elementId","el","clearSelection","clearHoverOverlays","TEXT_TAGS","notifyElementSelected","htmlElement","svgElement","isTextElement","arrEl","staticArrayName","rawIdx","staticArrayIndex","staticArrayField","getElementSelectorId","collectAllowedAttributes","ALLOWED_ATTRIBUTES","selectElement","visualSelectorId","notifyDeselection","handleMouseOver","e","target","selectorId","handleMouseOut","handleElementClick","LAYER_DROPDOWN_ATTR","selectedOverlay","layerController","unselectElement","updateElementClassesAndReposition","classes","updateElementClasses","index","updateElementAttributeAndReposition","attribute","value","updateElementAttribute","updateElementContent","content","arrIndex","createLayerController","toggleVisualEditMode","isEnabled","handleScroll","viewportHeight","viewportWidth","isInViewport","elementPosition","handleMessage","event","message","handleResize","htmlEl","id","mutationObserver","mutations","mutation","hasVisualId","node","i"]}
|
package/package.json
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
removeFocusOutlineCSS,
|
|
5
5
|
selectText,
|
|
6
6
|
shouldEnterInlineEditingMode,
|
|
7
|
+
isStaticArrayTextElement,
|
|
7
8
|
} from "./dom-utils.js";
|
|
8
9
|
|
|
9
10
|
const DEBOUNCE_MS = 500;
|
|
@@ -37,37 +38,42 @@ export function createInlineEditController(
|
|
|
37
38
|
const svgElement = element as unknown as SVGElement;
|
|
38
39
|
const rect = element.getBoundingClientRect();
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
centerY: rect.top + rect.height / 2,
|
|
64
|
-
},
|
|
41
|
+
const message: Record<string, unknown> = {
|
|
42
|
+
type: "inline-edit",
|
|
43
|
+
elementInfo: {
|
|
44
|
+
tagName: element.tagName,
|
|
45
|
+
classes:
|
|
46
|
+
(svgElement.className as unknown as SVGAnimatedString)?.baseVal ||
|
|
47
|
+
element.className ||
|
|
48
|
+
"",
|
|
49
|
+
visualSelectorId: host.getSelectedElementId(),
|
|
50
|
+
content: newContent,
|
|
51
|
+
dataSourceLocation: element.dataset.sourceLocation,
|
|
52
|
+
isDynamicContent: element.dataset.dynamicContent === "true",
|
|
53
|
+
linenumber: element.dataset.linenumber,
|
|
54
|
+
filename: element.dataset.filename,
|
|
55
|
+
position: {
|
|
56
|
+
top: rect.top,
|
|
57
|
+
left: rect.left,
|
|
58
|
+
right: rect.right,
|
|
59
|
+
bottom: rect.bottom,
|
|
60
|
+
width: rect.width,
|
|
61
|
+
height: rect.height,
|
|
62
|
+
centerX: rect.left + rect.width / 2,
|
|
63
|
+
centerY: rect.top + rect.height / 2,
|
|
65
64
|
},
|
|
66
|
-
originalContent,
|
|
67
|
-
newContent,
|
|
68
65
|
},
|
|
69
|
-
|
|
70
|
-
|
|
66
|
+
originalContent,
|
|
67
|
+
newContent,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
if (isStaticArrayTextElement(element)) {
|
|
71
|
+
message.arrIndex = element.dataset.arrIndex;
|
|
72
|
+
message.arrVariableName = element.dataset.arrVariableName;
|
|
73
|
+
message.arrField = element.dataset.arrField;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
window.parent.postMessage(message, "*");
|
|
71
77
|
|
|
72
78
|
element.dataset.originalTextContent = newContent || "";
|
|
73
79
|
};
|
|
@@ -5,6 +5,18 @@ const EDITABLE_TAGS = [
|
|
|
5
5
|
"span", "li", "td", "a", "button", "label",
|
|
6
6
|
];
|
|
7
7
|
|
|
8
|
+
export const isStaticArrayTextElement = (element: HTMLElement): boolean => {
|
|
9
|
+
return !!element.dataset.arrField;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const passesStructuralChecks = (element: HTMLElement): boolean => {
|
|
13
|
+
if (!EDITABLE_TAGS.includes(element.tagName.toLowerCase())) return false;
|
|
14
|
+
if (!element.textContent?.trim()) return false;
|
|
15
|
+
if (element.querySelector("img, video, canvas, svg")) return false;
|
|
16
|
+
if (element.children?.length > 0) return false;
|
|
17
|
+
return true;
|
|
18
|
+
};
|
|
19
|
+
|
|
8
20
|
export const injectFocusOutlineCSS = () => {
|
|
9
21
|
if (document.getElementById(FOCUS_STYLE_ID)) return;
|
|
10
22
|
|
|
@@ -32,10 +44,8 @@ export const selectText = (element: HTMLElement) => {
|
|
|
32
44
|
|
|
33
45
|
export const isEditableTextElement = (element: Element): boolean => {
|
|
34
46
|
if (!(element instanceof HTMLElement)) return false;
|
|
35
|
-
if (!
|
|
36
|
-
if (
|
|
37
|
-
if (element.querySelector("img, video, canvas, svg")) return false;
|
|
38
|
-
if (element.children?.length > 0) return false;
|
|
47
|
+
if (!passesStructuralChecks(element)) return false;
|
|
48
|
+
if (isStaticArrayTextElement(element)) return true;
|
|
39
49
|
if (element.dataset.dynamicContent === "true") return false;
|
|
40
50
|
return true;
|
|
41
51
|
};
|
|
@@ -127,6 +127,13 @@ export function setupVisualEditAgent() {
|
|
|
127
127
|
const rect = element.getBoundingClientRect();
|
|
128
128
|
const svgElement = element as SVGElement;
|
|
129
129
|
const isTextElement = TEXT_TAGS.includes(element.tagName?.toLowerCase());
|
|
130
|
+
|
|
131
|
+
const arrEl = htmlElement.closest("[data-arr-variable-name]") as HTMLElement | null;
|
|
132
|
+
const staticArrayName = arrEl?.dataset?.arrVariableName || null;
|
|
133
|
+
const rawIdx = arrEl?.dataset?.arrIndex;
|
|
134
|
+
const staticArrayIndex = rawIdx != null ? parseInt(rawIdx, 10) : null;
|
|
135
|
+
const staticArrayField = htmlElement.dataset?.arrField || null;
|
|
136
|
+
|
|
130
137
|
window.parent.postMessage({
|
|
131
138
|
type: "element-selected",
|
|
132
139
|
tagName: element.tagName,
|
|
@@ -152,6 +159,9 @@ export function setupVisualEditAgent() {
|
|
|
152
159
|
},
|
|
153
160
|
attributes: collectAllowedAttributes(element, ALLOWED_ATTRIBUTES),
|
|
154
161
|
isTextElement,
|
|
162
|
+
staticArrayName,
|
|
163
|
+
staticArrayIndex,
|
|
164
|
+
staticArrayField,
|
|
155
165
|
}, "*");
|
|
156
166
|
};
|
|
157
167
|
|
|
@@ -378,14 +388,19 @@ export function setupVisualEditAgent() {
|
|
|
378
388
|
}, REPOSITION_DELAY_MS);
|
|
379
389
|
};
|
|
380
390
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
const elements = findElementsById(visualSelectorId);
|
|
391
|
+
const updateElementContent = (visualSelectorId: string, content: string, arrIndex?: number) => {
|
|
392
|
+
let elements = findElementsById(visualSelectorId);
|
|
384
393
|
|
|
385
394
|
if (elements.length === 0) {
|
|
386
395
|
return;
|
|
387
396
|
}
|
|
388
397
|
|
|
398
|
+
if (arrIndex != null) {
|
|
399
|
+
elements = elements.filter(
|
|
400
|
+
(el) => (el as HTMLElement).dataset.arrIndex === String(arrIndex)
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
|
|
389
404
|
elements.forEach((element) => {
|
|
390
405
|
(element as HTMLElement).innerText = content;
|
|
391
406
|
});
|
|
@@ -537,7 +552,8 @@ export function setupVisualEditAgent() {
|
|
|
537
552
|
if (message.data && message.data.content !== undefined) {
|
|
538
553
|
updateElementContent(
|
|
539
554
|
message.data.visualSelectorId,
|
|
540
|
-
message.data.content
|
|
555
|
+
message.data.content,
|
|
556
|
+
message.data.arrIndex
|
|
541
557
|
);
|
|
542
558
|
} else {
|
|
543
559
|
console.warn(
|