@base44-preview/vite-plugin 0.2.22-pr.37.fd9cb1a → 0.2.22-pr.39.4150ff4

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.
Files changed (113) hide show
  1. package/dist/injections/visual-edit-agent.d.ts +1 -1
  2. package/dist/injections/visual-edit-agent.d.ts.map +1 -1
  3. package/dist/injections/visual-edit-agent.js +458 -1
  4. package/dist/injections/visual-edit-agent.js.map +1 -1
  5. package/dist/jsx-processor.d.ts +15 -0
  6. package/dist/jsx-processor.d.ts.map +1 -0
  7. package/dist/jsx-processor.js +106 -0
  8. package/dist/jsx-processor.js.map +1 -0
  9. package/dist/jsx-utils.d.ts +7 -0
  10. package/dist/jsx-utils.d.ts.map +1 -0
  11. package/dist/jsx-utils.js +12 -0
  12. package/dist/jsx-utils.js.map +1 -0
  13. package/dist/processors/shared-utils.d.ts +19 -0
  14. package/dist/processors/shared-utils.d.ts.map +1 -0
  15. package/dist/processors/shared-utils.js +77 -0
  16. package/dist/processors/shared-utils.js.map +1 -0
  17. package/dist/processors/static-array-processor.d.ts +31 -0
  18. package/dist/processors/static-array-processor.d.ts.map +1 -0
  19. package/dist/processors/static-array-processor.js +175 -0
  20. package/dist/processors/static-array-processor.js.map +1 -0
  21. package/dist/statics/index.mjs +1 -5
  22. package/dist/statics/index.mjs.map +1 -1
  23. package/dist/visual-edit-plugin.d.ts.map +1 -1
  24. package/dist/visual-edit-plugin.js +5 -0
  25. package/dist/visual-edit-plugin.js.map +1 -1
  26. package/package.json +2 -1
  27. package/src/injections/visual-edit-agent.ts +561 -1
  28. package/src/jsx-processor.ts +147 -0
  29. package/src/jsx-utils.ts +15 -0
  30. package/src/processors/shared-utils.ts +116 -0
  31. package/src/processors/static-array-processor.ts +257 -0
  32. package/src/visual-edit-plugin.ts +6 -0
  33. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.d.ts +0 -25
  34. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.d.ts.map +0 -1
  35. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.js +0 -95
  36. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.js.map +0 -1
  37. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.d.ts +0 -4
  38. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.d.ts.map +0 -1
  39. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.js +0 -4
  40. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.js.map +0 -1
  41. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.d.ts +0 -9
  42. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.d.ts.map +0 -1
  43. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.js +0 -26
  44. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.js.map +0 -1
  45. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.d.ts +0 -10
  46. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.d.ts.map +0 -1
  47. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.js +0 -60
  48. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.js.map +0 -1
  49. package/dist/injections/visual-edit-agent/constants.d.ts +0 -10
  50. package/dist/injections/visual-edit-agent/constants.d.ts.map +0 -1
  51. package/dist/injections/visual-edit-agent/constants.js +0 -10
  52. package/dist/injections/visual-edit-agent/constants.js.map +0 -1
  53. package/dist/injections/visual-edit-agent/handlers/click-handlers.d.ts +0 -10
  54. package/dist/injections/visual-edit-agent/handlers/click-handlers.d.ts.map +0 -1
  55. package/dist/injections/visual-edit-agent/handlers/click-handlers.js +0 -108
  56. package/dist/injections/visual-edit-agent/handlers/click-handlers.js.map +0 -1
  57. package/dist/injections/visual-edit-agent/handlers/hover-handlers.d.ts +0 -14
  58. package/dist/injections/visual-edit-agent/handlers/hover-handlers.d.ts.map +0 -1
  59. package/dist/injections/visual-edit-agent/handlers/hover-handlers.js +0 -64
  60. package/dist/injections/visual-edit-agent/handlers/hover-handlers.js.map +0 -1
  61. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.d.ts +0 -14
  62. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.d.ts.map +0 -1
  63. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.js +0 -109
  64. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.js.map +0 -1
  65. package/dist/injections/visual-edit-agent/handlers/message-handlers.d.ts +0 -26
  66. package/dist/injections/visual-edit-agent/handlers/message-handlers.d.ts.map +0 -1
  67. package/dist/injections/visual-edit-agent/handlers/message-handlers.js +0 -145
  68. package/dist/injections/visual-edit-agent/handlers/message-handlers.js.map +0 -1
  69. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.d.ts +0 -7
  70. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.d.ts.map +0 -1
  71. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.js +0 -54
  72. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.js.map +0 -1
  73. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.d.ts +0 -11
  74. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.d.ts.map +0 -1
  75. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.js +0 -32
  76. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.js.map +0 -1
  77. package/dist/injections/visual-edit-agent/handlers/messages/types.d.ts +0 -86
  78. package/dist/injections/visual-edit-agent/handlers/messages/types.d.ts.map +0 -1
  79. package/dist/injections/visual-edit-agent/handlers/messages/types.js +0 -28
  80. package/dist/injections/visual-edit-agent/handlers/messages/types.js.map +0 -1
  81. package/dist/injections/visual-edit-agent/index.d.ts +0 -5
  82. package/dist/injections/visual-edit-agent/index.d.ts.map +0 -1
  83. package/dist/injections/visual-edit-agent/index.js +0 -95
  84. package/dist/injections/visual-edit-agent/index.js.map +0 -1
  85. package/dist/injections/visual-edit-agent/state/agent-state.d.ts +0 -17
  86. package/dist/injections/visual-edit-agent/state/agent-state.d.ts.map +0 -1
  87. package/dist/injections/visual-edit-agent/state/agent-state.js +0 -18
  88. package/dist/injections/visual-edit-agent/state/agent-state.js.map +0 -1
  89. package/dist/injections/visual-edit-agent/ui/overlay.d.ts +0 -26
  90. package/dist/injections/visual-edit-agent/ui/overlay.d.ts.map +0 -1
  91. package/dist/injections/visual-edit-agent/ui/overlay.js +0 -104
  92. package/dist/injections/visual-edit-agent/ui/overlay.js.map +0 -1
  93. package/dist/injections/visual-edit-agent/utils/dom-utils.d.ts +0 -14
  94. package/dist/injections/visual-edit-agent/utils/dom-utils.d.ts.map +0 -1
  95. package/dist/injections/visual-edit-agent/utils/dom-utils.js +0 -34
  96. package/dist/injections/visual-edit-agent/utils/dom-utils.js.map +0 -1
  97. package/src/injections/visual-edit-agent/README.md +0 -222
  98. package/src/injections/visual-edit-agent/capabilities/inline-editing/core.ts +0 -120
  99. package/src/injections/visual-edit-agent/capabilities/inline-editing/index.ts +0 -10
  100. package/src/injections/visual-edit-agent/capabilities/inline-editing/styles.ts +0 -26
  101. package/src/injections/visual-edit-agent/capabilities/inline-editing/validation.ts +0 -67
  102. package/src/injections/visual-edit-agent/constants.ts +0 -9
  103. package/src/injections/visual-edit-agent/handlers/click-handlers.ts +0 -135
  104. package/src/injections/visual-edit-agent/handlers/hover-handlers.ts +0 -78
  105. package/src/injections/visual-edit-agent/handlers/inline-edit-handlers.ts +0 -141
  106. package/src/injections/visual-edit-agent/handlers/message-handlers.ts +0 -191
  107. package/src/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.ts +0 -65
  108. package/src/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.ts +0 -40
  109. package/src/injections/visual-edit-agent/handlers/messages/types.ts +0 -112
  110. package/src/injections/visual-edit-agent/index.ts +0 -108
  111. package/src/injections/visual-edit-agent/state/agent-state.ts +0 -31
  112. package/src/injections/visual-edit-agent/ui/overlay.ts +0 -126
  113. package/src/injections/visual-edit-agent/utils/dom-utils.ts +0 -39
@@ -2,6 +2,8 @@ import { parse } from "@babel/parser";
2
2
  import { default as traverse } from "@babel/traverse";
3
3
  import { default as generate } from "@babel/generator";
4
4
  import * as t from "@babel/types";
5
+ import { StaticArrayProcessor } from "./processors/static-array-processor.js";
6
+ import { JSXUtils } from "./jsx-utils.js";
5
7
  // Helper function to check if JSX element contains dynamic content
6
8
  export function checkIfElementHasDynamicContent(jsxElement) {
7
9
  let hasDynamicContent = false;
@@ -190,6 +192,8 @@ export function visualEditPlugin() {
190
192
  ],
191
193
  });
192
194
  // Traverse the AST and add source location and dynamic content attributes to JSX elements
195
+ JSXUtils.init(t);
196
+ const staticArrayProcessor = new StaticArrayProcessor(t);
193
197
  let elementsProcessed = 0;
194
198
  traverse.default(ast, {
195
199
  JSXElement(path) {
@@ -217,6 +221,7 @@ export function visualEditPlugin() {
217
221
  const dynamicContentAttr = t.jsxAttribute(t.jsxIdentifier("data-dynamic-content"), t.stringLiteral(isDynamic ? "true" : "false"));
218
222
  // Add both attributes to the beginning of the attributes array
219
223
  openingElement.attributes.unshift(sourceLocationAttr, dynamicContentAttr);
224
+ staticArrayProcessor.process(path.get("openingElement"));
220
225
  elementsProcessed++;
221
226
  },
222
227
  });
@@ -1 +1 @@
1
- {"version":3,"file":"visual-edit-plugin.js","sourceRoot":"","sources":["../src/visual-edit-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visual-edit-plugin.js","sourceRoot":"","sources":["../src/visual-edit-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,mEAAmE;AACnE,MAAM,UAAU,+BAA+B,CAAC,UAAe;IAC7D,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,iEAAiE;IACjE,SAAS,0BAA0B,CAAC,IAAS;QAC3C,wDAAwD;QACxD,IAAI,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAEnC,4BAA4B;YAC5B,IAAI,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,mDAAmD;YACnD,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wDAAwD;QACxD,IAAI,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,6BAA6B;YAC7B,MAAM,YAAY,GAAG;gBACnB,OAAO;gBACP,OAAO;gBACP,MAAM;gBACN,MAAM;gBACN,OAAO;gBACP,MAAM;gBACN,SAAS;aACV,CAAC;YACF,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uCAAuC;IACvC,SAAS,YAAY,CAAC,IAAS;QAC7B,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,iBAAiB,GAAG,IAAI,CAAC;YACzB,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAExB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACtB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBACrD,YAAY,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC5D,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,EAAE,UAAU,IAAI,EAAE,CAAC;IAC/D,UAAU,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;QAC/B,IAAI,iBAAiB;YAAE,OAAO,CAAC,8CAA8C;QAE7E,uDAAuD;QACvD,IAAI,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,iBAAiB,GAAG,IAAI,CAAC;YACzB,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACzC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,wCAAwC;IACxC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;QACzC,IAAI,iBAAiB;YAAE,OAAO,CAAC,8CAA8C;QAC7E,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa;QAChD,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,sDAAsD;QACtD,kBAAkB,CAAC,IAAS;YAC1B,0EAA0E;YAC1E,MAAM,cAAc,GAAG,+GAA+G,CAAC;YACvI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;QAC7D,CAAC;QACD,SAAS,CAAC,IAAS,EAAE,EAAO;YAC1B,iDAAiD;YACjD,IAAI,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACpE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,8BAA8B;YAC9B,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,yEAAyE;YACzE,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,QAAQ,CAAC;YAEb,8CAA8C;YAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBACxE,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzD,sEAAsE;oBACtE,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;oBACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACzD,2CAA2C;oBAC3C,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAC9D,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACxB,CAAC,CAAC,QAAQ,CAAC;oBACb,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC3C,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,MAAM,eAAe,GAAG,SAAS,CAAC,SAAS,CACzC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,YAAY,CACrC,CAAC;gBACF,IAAI,eAAe,IAAI,CAAC,IAAI,eAAe,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnE,2EAA2E;oBAC3E,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CACnC,eAAe,EACf,SAAS,CAAC,MAAM,CACjB,CAAC;oBACF,MAAM,QAAQ,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACzD,2CAA2C;oBAC3C,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAC9D,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACxB,CAAC,CAAC,QAAQ,CAAC;oBACb,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC3C,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,uDAAuD;gBACvD,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC3C,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YAED,IAAI,CAAC;gBACH,6BAA6B;gBAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE;oBACtB,UAAU,EAAE,QAAQ;oBACpB,OAAO,EAAE;wBACP,KAAK;wBACL,YAAY;wBACZ,mBAAmB;wBACnB,iBAAiB;wBACjB,kBAAkB;wBAClB,cAAc;wBACd,mBAAmB;wBACnB,qBAAqB;wBACrB,eAAe;wBACf,2BAA2B;wBAC3B,kBAAkB;wBAClB,iBAAiB;wBACjB,QAAQ;wBACR,sBAAsB;wBACtB,kBAAkB;qBACnB;iBACF,CAAC,CAAC;gBAEH,0FAA0F;gBAC1F,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACjB,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;gBACzD,IAAI,iBAAiB,GAAG,CAAC,CAAC;gBAC1B,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE;oBACpB,UAAU,CAAC,IAAI;wBACb,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;wBAC7B,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC;wBAEjD,iBAAiB;wBACjB,IAAI,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC;4BAAE,OAAO;wBAExC,gDAAgD;wBAChD,MAAM,iBAAiB,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CACtD,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;4BACtB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;4BAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAsB,CAC5C,CAAC;wBAEF,IAAI,iBAAiB;4BAAE,OAAO;wBAE9B,6CAA6C;wBAC7C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,IAAI;4BACpD,IAAI,EAAE,CAAC;4BACP,MAAM,EAAE,CAAC;yBACV,CAAC;wBAEF,uCAAuC;wBACvC,MAAM,kBAAkB,GAAG,CAAC,CAAC,YAAY,CACvC,CAAC,CAAC,aAAa,CAAC,sBAAsB,CAAC,EACvC,CAAC,CAAC,aAAa,CAAC,GAAG,QAAQ,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC,CACjD,CAAC;wBAEF,uCAAuC;wBACvC,MAAM,SAAS,GAAG,+BAA+B,CAAC,UAAU,CAAC,CAAC;wBAE9D,uCAAuC;wBACvC,MAAM,kBAAkB,GAAG,CAAC,CAAC,YAAY,CACvC,CAAC,CAAC,aAAa,CAAC,sBAAsB,CAAC,EACvC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAC9C,CAAC;wBAEF,+DAA+D;wBAC/D,cAAc,CAAC,UAAU,CAAC,OAAO,CAC/B,kBAAkB,EAClB,kBAAkB,CACnB,CAAC;wBAEF,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;wBACzD,iBAAiB,EAAE,CAAC;oBACtB,CAAC;iBACF,CAAC,CAAC;gBAEH,sCAAsC;gBACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE;oBACnC,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,IAAI;iBAClB,CAAC,CAAC;gBAEH,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,GAAG,EAAE,IAAI;iBACV,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;gBAC9D,OAAO;oBACL,IAAI,EAAE,IAAI,EAAE,kCAAkC;oBAC9C,GAAG,EAAE,IAAI;iBACV,CAAC;YACJ,CAAC;QACH,CAAC;KACQ,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/vite-plugin",
3
- "version": "0.2.22-pr.37.fd9cb1a",
3
+ "version": "0.2.22-pr.39.4150ff4",
4
4
  "description": "The Vite plugin for base44 based applications",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,6 +23,7 @@
23
23
  "test:unit": "vitest run"
24
24
  },
25
25
  "devDependencies": {
26
+ "@babel/core": "^7.29.0",
26
27
  "@types/babel__generator": "^7.27.0",
27
28
  "@types/babel__traverse": "^7.28.0",
28
29
  "@types/node": "^24.6.2",
@@ -1 +1,561 @@
1
- export { setupVisualEditAgent } from "./visual-edit-agent/index.js";
1
+ import { findElementsById, updateElementClasses } from "./utils.js";
2
+
3
+ export function setupVisualEditAgent() {
4
+ // State variables (replacing React useState/useRef)
5
+ let isVisualEditMode = false;
6
+ let isPopoverDragging = false;
7
+ let isDropdownOpen = false;
8
+ let hoverOverlays: HTMLDivElement[] = [];
9
+ let selectedOverlays: HTMLDivElement[] = [];
10
+ let currentHighlightedElements: Element[] = [];
11
+ let selectedElementId: string | null = null;
12
+
13
+ // Create overlay element
14
+ const createOverlay = (isSelected = false): HTMLDivElement => {
15
+ const overlay = document.createElement("div");
16
+ overlay.style.position = "absolute";
17
+ overlay.style.pointerEvents = "none";
18
+ overlay.style.transition = "all 0.1s ease-in-out";
19
+ overlay.style.zIndex = "9999";
20
+
21
+ if (isSelected) {
22
+ overlay.style.border = "2px solid #2563EB";
23
+ } else {
24
+ overlay.style.border = "2px solid #95a5fc";
25
+ overlay.style.backgroundColor = "rgba(99, 102, 241, 0.05)";
26
+ }
27
+
28
+ return overlay;
29
+ };
30
+
31
+ // Position overlay relative to element
32
+ const positionOverlay = (
33
+ overlay: HTMLDivElement,
34
+ element: Element,
35
+ isSelected = false
36
+ ) => {
37
+ if (!element || !isVisualEditMode) return;
38
+
39
+ const htmlElement = element as HTMLElement;
40
+ // Force layout recalculation
41
+ void htmlElement.offsetWidth;
42
+
43
+ const rect = element.getBoundingClientRect();
44
+ overlay.style.top = `${rect.top + window.scrollY}px`;
45
+ overlay.style.left = `${rect.left + window.scrollX}px`;
46
+ overlay.style.width = `${rect.width}px`;
47
+ overlay.style.height = `${rect.height}px`;
48
+
49
+ // Check if label already exists in overlay
50
+ let label = overlay.querySelector("div") as HTMLDivElement | null;
51
+
52
+ if (!label) {
53
+ label = document.createElement("div");
54
+ label.textContent = element.tagName.toLowerCase();
55
+ label.style.position = "absolute";
56
+ label.style.top = "-27px";
57
+ label.style.left = "-2px";
58
+ label.style.padding = "2px 8px";
59
+ label.style.fontSize = "11px";
60
+ label.style.fontWeight = isSelected ? "500" : "400";
61
+ label.style.color = isSelected ? "#ffffff" : "#526cff";
62
+ label.style.backgroundColor = isSelected ? "#526cff" : "#DBEAFE";
63
+ label.style.borderRadius = "3px";
64
+ label.style.minWidth = "24px";
65
+ label.style.textAlign = "center";
66
+ overlay.appendChild(label);
67
+ }
68
+ };
69
+
70
+ // Clear hover overlays
71
+ const clearHoverOverlays = () => {
72
+ hoverOverlays.forEach((overlay) => {
73
+ if (overlay && overlay.parentNode) {
74
+ overlay.remove();
75
+ }
76
+ });
77
+ hoverOverlays = [];
78
+ currentHighlightedElements = [];
79
+ };
80
+
81
+ // Handle mouse over event
82
+ const handleMouseOver = (e: MouseEvent) => {
83
+ if (!isVisualEditMode || isPopoverDragging) return;
84
+
85
+ const target = e.target as Element;
86
+
87
+ // Prevent hover effects when a dropdown is open
88
+ if (isDropdownOpen) {
89
+ clearHoverOverlays();
90
+ return;
91
+ }
92
+
93
+ // Prevent hover effects on SVG path elements
94
+ if (target.tagName.toLowerCase() === "path") {
95
+ clearHoverOverlays();
96
+ return;
97
+ }
98
+
99
+ // Support both data-source-location and data-visual-selector-id
100
+ const element = target.closest(
101
+ "[data-source-location], [data-visual-selector-id]"
102
+ );
103
+ if (!element) {
104
+ clearHoverOverlays();
105
+ return;
106
+ }
107
+
108
+ // Prefer data-source-location, fallback to data-visual-selector-id
109
+ const htmlElement = element as HTMLElement;
110
+ const selectorId =
111
+ htmlElement.dataset.sourceLocation ||
112
+ htmlElement.dataset.visualSelectorId;
113
+
114
+ // Skip if this element is already selected
115
+ if (selectedElementId === selectorId) {
116
+ clearHoverOverlays();
117
+ return;
118
+ }
119
+
120
+ // Find all elements with the same ID
121
+ const elements = findElementsById(selectorId || null);
122
+
123
+ // Clear previous hover overlays
124
+ clearHoverOverlays();
125
+
126
+ // Create overlays for all matching elements
127
+ elements.forEach((el) => {
128
+ const overlay = createOverlay(false);
129
+ document.body.appendChild(overlay);
130
+ hoverOverlays.push(overlay);
131
+ positionOverlay(overlay, el);
132
+ });
133
+
134
+ currentHighlightedElements = elements;
135
+ };
136
+
137
+ // Handle mouse out event
138
+ const handleMouseOut = () => {
139
+ if (isPopoverDragging) return;
140
+ clearHoverOverlays();
141
+ };
142
+
143
+ // Handle element click
144
+ const handleElementClick = (e: MouseEvent) => {
145
+ if (!isVisualEditMode) return;
146
+
147
+ const target = e.target as Element;
148
+
149
+ // Close dropdowns when clicking anywhere in iframe if a dropdown is open
150
+ if (isDropdownOpen) {
151
+ e.preventDefault();
152
+ e.stopPropagation();
153
+ e.stopImmediatePropagation();
154
+
155
+ window.parent.postMessage({ type: "close-dropdowns" }, "*");
156
+ return;
157
+ }
158
+
159
+ // Prevent clicking on SVG path elements
160
+ if (target.tagName.toLowerCase() === "path") {
161
+ return;
162
+ }
163
+
164
+ // Prevent default behavior immediately when in visual edit mode
165
+ e.preventDefault();
166
+ e.stopPropagation();
167
+ e.stopImmediatePropagation();
168
+
169
+ // Support both data-source-location and data-visual-selector-id
170
+ const element = target.closest(
171
+ "[data-source-location], [data-visual-selector-id]"
172
+ );
173
+ if (!element) {
174
+ return;
175
+ }
176
+
177
+ const htmlElement = element as HTMLElement;
178
+ const visualSelectorId =
179
+ htmlElement.dataset.sourceLocation ||
180
+ htmlElement.dataset.visualSelectorId;
181
+
182
+ // Clear any existing selected overlays
183
+ selectedOverlays.forEach((overlay) => {
184
+ if (overlay && overlay.parentNode) {
185
+ overlay.remove();
186
+ }
187
+ });
188
+ selectedOverlays = [];
189
+
190
+ // Find all elements with the same ID
191
+ const elements = findElementsById(visualSelectorId || null);
192
+
193
+ // Create selected overlays for all matching elements
194
+ elements.forEach((el) => {
195
+ const overlay = createOverlay(true);
196
+ document.body.appendChild(overlay);
197
+ selectedOverlays.push(overlay);
198
+ positionOverlay(overlay, el, true);
199
+ });
200
+
201
+ selectedElementId = visualSelectorId || null;
202
+
203
+ // Clear hover overlays
204
+ clearHoverOverlays();
205
+
206
+ // Calculate element position for popover positioning
207
+ const rect = element.getBoundingClientRect();
208
+ const elementPosition = {
209
+ top: rect.top,
210
+ left: rect.left,
211
+ right: rect.right,
212
+ bottom: rect.bottom,
213
+ width: rect.width,
214
+ height: rect.height,
215
+ centerX: rect.left + rect.width / 2,
216
+ centerY: rect.top + rect.height / 2,
217
+ };
218
+
219
+ // Send message to parent window with element info including position
220
+ const svgElement = element as SVGElement;
221
+ const elementData = {
222
+ type: "element-selected",
223
+ tagName: element.tagName,
224
+ classes:
225
+ (svgElement.className as unknown as SVGAnimatedString)?.baseVal ||
226
+ element.className ||
227
+ "",
228
+ visualSelectorId: visualSelectorId,
229
+ content: (element as HTMLElement).innerText,
230
+ dataSourceLocation: htmlElement.dataset.sourceLocation,
231
+ isDynamicContent: htmlElement.dataset.dynamicContent === "true",
232
+ linenumber: htmlElement.dataset.linenumber,
233
+ filename: htmlElement.dataset.filename,
234
+ position: elementPosition,
235
+ };
236
+ window.parent.postMessage(elementData, "*");
237
+ };
238
+
239
+ // Unselect the current element
240
+ const unselectElement = () => {
241
+ selectedOverlays.forEach((overlay) => {
242
+ if (overlay && overlay.parentNode) {
243
+ overlay.remove();
244
+ }
245
+ });
246
+ selectedOverlays = [];
247
+ selectedElementId = null;
248
+ };
249
+
250
+ const updateElementClassesAndReposition = (visualSelectorId: string, classes: string) => {
251
+ const elements = findElementsById(visualSelectorId);
252
+ if (elements.length === 0) return;
253
+
254
+ updateElementClasses(elements, classes);
255
+
256
+ // Use a small delay to allow the browser to recalculate layout before repositioning
257
+ setTimeout(() => {
258
+ // Reposition selected overlays
259
+ if (selectedElementId === visualSelectorId) {
260
+ selectedOverlays.forEach((overlay, index) => {
261
+ if (index < elements.length) {
262
+ positionOverlay(overlay, elements[index]!);
263
+ }
264
+ });
265
+ }
266
+
267
+ // Reposition hover overlays if needed
268
+ if (currentHighlightedElements.length > 0) {
269
+ const hoveredElement = currentHighlightedElements[0] as HTMLElement;
270
+ const hoveredId = hoveredElement?.dataset?.visualSelectorId;
271
+ if (hoveredId === visualSelectorId) {
272
+ hoverOverlays.forEach((overlay, index) => {
273
+ if (index < currentHighlightedElements.length) {
274
+ positionOverlay(overlay, currentHighlightedElements[index]!);
275
+ }
276
+ });
277
+ }
278
+ }
279
+ }, 50);
280
+ };
281
+
282
+ // Update element content by visual selector ID
283
+ const updateElementContent = (visualSelectorId: string, content: string) => {
284
+ const elements = findElementsById(visualSelectorId);
285
+
286
+ if (elements.length === 0) {
287
+ return;
288
+ }
289
+
290
+ elements.forEach((element) => {
291
+ (element as HTMLElement).innerText = content;
292
+ });
293
+
294
+ setTimeout(() => {
295
+ if (selectedElementId === visualSelectorId) {
296
+ selectedOverlays.forEach((overlay, index) => {
297
+ if (index < elements.length) {
298
+ positionOverlay(overlay, elements[index]!);
299
+ }
300
+ });
301
+ }
302
+ }, 50);
303
+ };
304
+
305
+ // Toggle visual edit mode
306
+ const toggleVisualEditMode = (isEnabled: boolean) => {
307
+ isVisualEditMode = isEnabled;
308
+
309
+ if (!isEnabled) {
310
+ clearHoverOverlays();
311
+
312
+ selectedOverlays.forEach((overlay) => {
313
+ if (overlay && overlay.parentNode) {
314
+ overlay.remove();
315
+ }
316
+ });
317
+ selectedOverlays = [];
318
+
319
+ currentHighlightedElements = [];
320
+ selectedElementId = null;
321
+ document.body.style.cursor = "default";
322
+
323
+ document.removeEventListener("mouseover", handleMouseOver);
324
+ document.removeEventListener("mouseout", handleMouseOut);
325
+ document.removeEventListener("click", handleElementClick, true);
326
+ } else {
327
+ document.body.style.cursor = "crosshair";
328
+ document.addEventListener("mouseover", handleMouseOver);
329
+ document.addEventListener("mouseout", handleMouseOut);
330
+ document.addEventListener("click", handleElementClick, true);
331
+ }
332
+ };
333
+
334
+ // Handle scroll events to update popover position
335
+ const handleScroll = () => {
336
+ if (selectedElementId) {
337
+ const elements = findElementsById(selectedElementId);
338
+ if (elements.length > 0) {
339
+ const element = elements[0];
340
+ const rect = element!.getBoundingClientRect();
341
+
342
+ const viewportHeight = window.innerHeight;
343
+ const viewportWidth = window.innerWidth;
344
+ const isInViewport =
345
+ rect.top < viewportHeight &&
346
+ rect.bottom > 0 &&
347
+ rect.left < viewportWidth &&
348
+ rect.right > 0;
349
+
350
+ const elementPosition = {
351
+ top: rect.top,
352
+ left: rect.left,
353
+ right: rect.right,
354
+ bottom: rect.bottom,
355
+ width: rect.width,
356
+ height: rect.height,
357
+ centerX: rect.left + rect.width / 2,
358
+ centerY: rect.top + rect.height / 2,
359
+ };
360
+
361
+ window.parent.postMessage(
362
+ {
363
+ type: "element-position-update",
364
+ position: elementPosition,
365
+ isInViewport: isInViewport,
366
+ visualSelectorId: selectedElementId,
367
+ },
368
+ "*"
369
+ );
370
+ }
371
+ }
372
+ };
373
+
374
+ // Handle messages from parent window
375
+ const handleMessage = (event: MessageEvent) => {
376
+ const message = event.data;
377
+
378
+ switch (message.type) {
379
+ case "toggle-visual-edit-mode":
380
+ toggleVisualEditMode(message.data.enabled);
381
+ break;
382
+
383
+ case "update-classes":
384
+ if (message.data && message.data.classes !== undefined) {
385
+ updateElementClassesAndReposition(
386
+ message.data.visualSelectorId,
387
+ message.data.classes
388
+ );
389
+ } else {
390
+ console.warn(
391
+ "[VisualEditAgent] Invalid update-classes message:",
392
+ message
393
+ );
394
+ }
395
+ break;
396
+
397
+ case "unselect-element":
398
+ unselectElement();
399
+ break;
400
+
401
+ case "refresh-page":
402
+ window.location.reload();
403
+ break;
404
+
405
+ case "update-content":
406
+ if (message.data && message.data.content !== undefined) {
407
+ updateElementContent(
408
+ message.data.visualSelectorId,
409
+ message.data.content
410
+ );
411
+ } else {
412
+ console.warn(
413
+ "[VisualEditAgent] Invalid update-content message:",
414
+ message
415
+ );
416
+ }
417
+ break;
418
+
419
+ case "request-element-position":
420
+ if (selectedElementId) {
421
+ const elements = findElementsById(selectedElementId);
422
+ if (elements.length > 0) {
423
+ const element = elements[0];
424
+ const rect = element!.getBoundingClientRect();
425
+
426
+ const viewportHeight = window.innerHeight;
427
+ const viewportWidth = window.innerWidth;
428
+ const isInViewport =
429
+ rect.top < viewportHeight &&
430
+ rect.bottom > 0 &&
431
+ rect.left < viewportWidth &&
432
+ rect.right > 0;
433
+
434
+ const elementPosition = {
435
+ top: rect.top,
436
+ left: rect.left,
437
+ right: rect.right,
438
+ bottom: rect.bottom,
439
+ width: rect.width,
440
+ height: rect.height,
441
+ centerX: rect.left + rect.width / 2,
442
+ centerY: rect.top + rect.height / 2,
443
+ };
444
+
445
+ window.parent.postMessage(
446
+ {
447
+ type: "element-position-update",
448
+ position: elementPosition,
449
+ isInViewport: isInViewport,
450
+ visualSelectorId: selectedElementId,
451
+ },
452
+ "*"
453
+ );
454
+ }
455
+ }
456
+ break;
457
+
458
+ case "popover-drag-state":
459
+ if (message.data && message.data.isDragging !== undefined) {
460
+ isPopoverDragging = message.data.isDragging;
461
+ if (message.data.isDragging) {
462
+ clearHoverOverlays();
463
+ }
464
+ }
465
+ break;
466
+
467
+ case "dropdown-state":
468
+ if (message.data && message.data.isOpen !== undefined) {
469
+ isDropdownOpen = message.data.isOpen;
470
+ if (message.data.isOpen) {
471
+ clearHoverOverlays();
472
+ }
473
+ }
474
+ break;
475
+
476
+ default:
477
+ break;
478
+ }
479
+ };
480
+
481
+ // Handle window resize to reposition overlays
482
+ const handleResize = () => {
483
+ if (selectedElementId) {
484
+ const elements = findElementsById(selectedElementId);
485
+ selectedOverlays.forEach((overlay, index) => {
486
+ if (index < elements.length) {
487
+ positionOverlay(overlay, elements[index]!);
488
+ }
489
+ });
490
+ }
491
+
492
+ if (currentHighlightedElements.length > 0) {
493
+ hoverOverlays.forEach((overlay, index) => {
494
+ if (index < currentHighlightedElements.length) {
495
+ positionOverlay(overlay, currentHighlightedElements[index]!);
496
+ }
497
+ });
498
+ }
499
+ };
500
+
501
+ // Initialize: Add IDs to elements that don't have them but have linenumbers
502
+ const elementsWithLineNumber = document.querySelectorAll(
503
+ "[data-linenumber]:not([data-visual-selector-id])"
504
+ );
505
+ elementsWithLineNumber.forEach((el, index) => {
506
+ const htmlEl = el as HTMLElement;
507
+ const id = `visual-id-${htmlEl.dataset.filename}-${htmlEl.dataset.linenumber}-${index}`;
508
+ htmlEl.dataset.visualSelectorId = id;
509
+ });
510
+
511
+ // Create mutation observer to detect layout changes
512
+ const mutationObserver = new MutationObserver((mutations) => {
513
+ const needsUpdate = mutations.some((mutation) => {
514
+ const hasVisualId = (node: Node): boolean => {
515
+ if (node.nodeType === Node.ELEMENT_NODE) {
516
+ const el = node as HTMLElement;
517
+ if (el.dataset && el.dataset.visualSelectorId) {
518
+ return true;
519
+ }
520
+ for (let i = 0; i < el.children.length; i++) {
521
+ if (hasVisualId(el.children[i]!)) {
522
+ return true;
523
+ }
524
+ }
525
+ }
526
+ return false;
527
+ };
528
+
529
+ const isLayoutChange =
530
+ mutation.type === "attributes" &&
531
+ (mutation.attributeName === "style" ||
532
+ mutation.attributeName === "class" ||
533
+ mutation.attributeName === "width" ||
534
+ mutation.attributeName === "height");
535
+
536
+ return isLayoutChange && hasVisualId(mutation.target);
537
+ });
538
+
539
+ if (needsUpdate) {
540
+ setTimeout(handleResize, 50);
541
+ }
542
+ });
543
+
544
+ // Set up event listeners
545
+ window.addEventListener("message", handleMessage);
546
+ window.addEventListener("scroll", handleScroll, true);
547
+ document.addEventListener("scroll", handleScroll, true);
548
+ window.addEventListener("resize", handleResize);
549
+ window.addEventListener("scroll", handleResize);
550
+
551
+ // Start observing DOM mutations
552
+ mutationObserver.observe(document.body, {
553
+ attributes: true,
554
+ childList: true,
555
+ subtree: true,
556
+ attributeFilter: ["style", "class", "width", "height"],
557
+ });
558
+
559
+ // Send ready message to parent
560
+ window.parent.postMessage({ type: "visual-edit-agent-ready" }, "*");
561
+ }