@base44-preview/vite-plugin 0.2.27-pr.41.77be9cb → 0.2.27-pr.43.93e5e43

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 (149) hide show
  1. package/dist/consts.d.ts +12 -0
  2. package/dist/consts.d.ts.map +1 -0
  3. package/dist/consts.js +12 -0
  4. package/dist/consts.js.map +1 -0
  5. package/dist/injections/visual-edit-agent.d.ts +1 -1
  6. package/dist/injections/visual-edit-agent.d.ts.map +1 -1
  7. package/dist/injections/visual-edit-agent.js +566 -1
  8. package/dist/injections/visual-edit-agent.js.map +1 -1
  9. package/dist/jsx-processor.d.ts +4 -1
  10. package/dist/jsx-processor.d.ts.map +1 -1
  11. package/dist/jsx-processor.js +33 -6
  12. package/dist/jsx-processor.js.map +1 -1
  13. package/dist/jsx-utils.d.ts +9 -0
  14. package/dist/jsx-utils.d.ts.map +1 -1
  15. package/dist/jsx-utils.js +86 -0
  16. package/dist/jsx-utils.js.map +1 -1
  17. package/dist/processors/collection-id-processor.d.ts +20 -0
  18. package/dist/processors/collection-id-processor.d.ts.map +1 -0
  19. package/dist/processors/collection-id-processor.js +182 -0
  20. package/dist/processors/collection-id-processor.js.map +1 -0
  21. package/dist/processors/collection-item-field-processor.d.ts +39 -0
  22. package/dist/processors/collection-item-field-processor.d.ts.map +1 -0
  23. package/dist/processors/collection-item-field-processor.js +281 -0
  24. package/dist/processors/collection-item-field-processor.js.map +1 -0
  25. package/dist/processors/collection-item-id-processor.d.ts +12 -0
  26. package/dist/processors/collection-item-id-processor.d.ts.map +1 -0
  27. package/dist/processors/collection-item-id-processor.js +50 -0
  28. package/dist/processors/collection-item-id-processor.js.map +1 -0
  29. package/dist/processors/collection-reference-field-processor.d.ts +31 -0
  30. package/dist/processors/collection-reference-field-processor.d.ts.map +1 -0
  31. package/dist/processors/collection-reference-field-processor.js +174 -0
  32. package/dist/processors/collection-reference-field-processor.js.map +1 -0
  33. package/dist/processors/collection-tracing-utils.d.ts +36 -0
  34. package/dist/processors/collection-tracing-utils.d.ts.map +1 -0
  35. package/dist/processors/collection-tracing-utils.js +390 -0
  36. package/dist/processors/collection-tracing-utils.js.map +1 -0
  37. package/dist/processors/shared-utils.d.ts +77 -0
  38. package/dist/processors/shared-utils.d.ts.map +1 -1
  39. package/dist/processors/shared-utils.js +525 -0
  40. package/dist/processors/shared-utils.js.map +1 -1
  41. package/dist/processors/static-array-processor.d.ts +2 -3
  42. package/dist/processors/static-array-processor.d.ts.map +1 -1
  43. package/dist/processors/static-array-processor.js +2 -3
  44. package/dist/processors/static-array-processor.js.map +1 -1
  45. package/dist/statics/index.mjs +2 -2
  46. package/dist/statics/index.mjs.map +1 -1
  47. package/dist/types.d.ts +5 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/visual-edit-plugin.d.ts +0 -1
  52. package/dist/visual-edit-plugin.d.ts.map +1 -1
  53. package/dist/visual-edit-plugin.js +29 -178
  54. package/dist/visual-edit-plugin.js.map +1 -1
  55. package/package.json +1 -1
  56. package/src/consts.ts +12 -0
  57. package/src/injections/visual-edit-agent.ts +698 -1
  58. package/src/jsx-processor.ts +41 -14
  59. package/src/jsx-utils.ts +116 -0
  60. package/src/processors/collection-id-processor.ts +261 -0
  61. package/src/processors/collection-item-field-processor.ts +433 -0
  62. package/src/processors/collection-item-id-processor.ts +69 -0
  63. package/src/processors/collection-reference-field-processor.ts +225 -0
  64. package/src/processors/collection-tracing-utils.ts +507 -0
  65. package/src/processors/shared-utils.ts +671 -0
  66. package/src/processors/static-array-processor.ts +6 -3
  67. package/src/types.ts +4 -0
  68. package/src/visual-edit-plugin.ts +34 -215
  69. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.d.ts +0 -25
  70. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.d.ts.map +0 -1
  71. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.js +0 -95
  72. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.js.map +0 -1
  73. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.d.ts +0 -4
  74. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.d.ts.map +0 -1
  75. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.js +0 -4
  76. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.js.map +0 -1
  77. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.d.ts +0 -9
  78. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.d.ts.map +0 -1
  79. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.js +0 -26
  80. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.js.map +0 -1
  81. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.d.ts +0 -17
  82. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.d.ts.map +0 -1
  83. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.js +0 -76
  84. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.js.map +0 -1
  85. package/dist/injections/visual-edit-agent/constants.d.ts +0 -10
  86. package/dist/injections/visual-edit-agent/constants.d.ts.map +0 -1
  87. package/dist/injections/visual-edit-agent/constants.js +0 -10
  88. package/dist/injections/visual-edit-agent/constants.js.map +0 -1
  89. package/dist/injections/visual-edit-agent/handlers/click-handlers.d.ts +0 -10
  90. package/dist/injections/visual-edit-agent/handlers/click-handlers.d.ts.map +0 -1
  91. package/dist/injections/visual-edit-agent/handlers/click-handlers.js +0 -117
  92. package/dist/injections/visual-edit-agent/handlers/click-handlers.js.map +0 -1
  93. package/dist/injections/visual-edit-agent/handlers/hover-handlers.d.ts +0 -14
  94. package/dist/injections/visual-edit-agent/handlers/hover-handlers.d.ts.map +0 -1
  95. package/dist/injections/visual-edit-agent/handlers/hover-handlers.js +0 -64
  96. package/dist/injections/visual-edit-agent/handlers/hover-handlers.js.map +0 -1
  97. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.d.ts +0 -14
  98. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.d.ts.map +0 -1
  99. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.js +0 -114
  100. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.js.map +0 -1
  101. package/dist/injections/visual-edit-agent/handlers/message-handlers.d.ts +0 -26
  102. package/dist/injections/visual-edit-agent/handlers/message-handlers.d.ts.map +0 -1
  103. package/dist/injections/visual-edit-agent/handlers/message-handlers.js +0 -148
  104. package/dist/injections/visual-edit-agent/handlers/message-handlers.js.map +0 -1
  105. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.d.ts +0 -7
  106. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.d.ts.map +0 -1
  107. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.js +0 -54
  108. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.js.map +0 -1
  109. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.d.ts +0 -11
  110. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.d.ts.map +0 -1
  111. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.js +0 -32
  112. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.js.map +0 -1
  113. package/dist/injections/visual-edit-agent/handlers/messages/types.d.ts +0 -105
  114. package/dist/injections/visual-edit-agent/handlers/messages/types.d.ts.map +0 -1
  115. package/dist/injections/visual-edit-agent/handlers/messages/types.js +0 -28
  116. package/dist/injections/visual-edit-agent/handlers/messages/types.js.map +0 -1
  117. package/dist/injections/visual-edit-agent/index.d.ts +0 -6
  118. package/dist/injections/visual-edit-agent/index.d.ts.map +0 -1
  119. package/dist/injections/visual-edit-agent/index.js +0 -109
  120. package/dist/injections/visual-edit-agent/index.js.map +0 -1
  121. package/dist/injections/visual-edit-agent/state/agent-state.d.ts +0 -17
  122. package/dist/injections/visual-edit-agent/state/agent-state.d.ts.map +0 -1
  123. package/dist/injections/visual-edit-agent/state/agent-state.js +0 -18
  124. package/dist/injections/visual-edit-agent/state/agent-state.js.map +0 -1
  125. package/dist/injections/visual-edit-agent/ui/overlay.d.ts +0 -26
  126. package/dist/injections/visual-edit-agent/ui/overlay.d.ts.map +0 -1
  127. package/dist/injections/visual-edit-agent/ui/overlay.js +0 -104
  128. package/dist/injections/visual-edit-agent/ui/overlay.js.map +0 -1
  129. package/dist/injections/visual-edit-agent/utils/dom-utils.d.ts +0 -14
  130. package/dist/injections/visual-edit-agent/utils/dom-utils.d.ts.map +0 -1
  131. package/dist/injections/visual-edit-agent/utils/dom-utils.js +0 -34
  132. package/dist/injections/visual-edit-agent/utils/dom-utils.js.map +0 -1
  133. package/src/injections/visual-edit-agent/README.md +0 -222
  134. package/src/injections/visual-edit-agent/capabilities/inline-editing/core.ts +0 -120
  135. package/src/injections/visual-edit-agent/capabilities/inline-editing/index.ts +0 -10
  136. package/src/injections/visual-edit-agent/capabilities/inline-editing/styles.ts +0 -26
  137. package/src/injections/visual-edit-agent/capabilities/inline-editing/validation.ts +0 -87
  138. package/src/injections/visual-edit-agent/constants.ts +0 -9
  139. package/src/injections/visual-edit-agent/handlers/click-handlers.ts +0 -146
  140. package/src/injections/visual-edit-agent/handlers/hover-handlers.ts +0 -78
  141. package/src/injections/visual-edit-agent/handlers/inline-edit-handlers.ts +0 -146
  142. package/src/injections/visual-edit-agent/handlers/message-handlers.ts +0 -201
  143. package/src/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.ts +0 -65
  144. package/src/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.ts +0 -40
  145. package/src/injections/visual-edit-agent/handlers/messages/types.ts +0 -134
  146. package/src/injections/visual-edit-agent/index.ts +0 -121
  147. package/src/injections/visual-edit-agent/state/agent-state.ts +0 -31
  148. package/src/injections/visual-edit-agent/ui/overlay.ts +0 -126
  149. package/src/injections/visual-edit-agent/utils/dom-utils.ts +0 -39
@@ -1,78 +0,0 @@
1
- import type { AgentState } from "../state/agent-state.js";
2
- import { findElementsById } from "../../utils.js";
3
- import { createOverlay, positionOverlay, clearOverlays } from "../ui/overlay.js";
4
-
5
- /**
6
- * Clear hover overlays
7
- */
8
- export function clearHoverOverlays(state: AgentState): void {
9
- clearOverlays(state.hoverOverlays);
10
- state.hoverOverlays = [];
11
- state.currentHighlightedElements = [];
12
- }
13
-
14
- /**
15
- * Handle mouse over event
16
- */
17
- export function handleMouseOver(state: AgentState, e: MouseEvent): void {
18
- if (!state.isVisualEditMode || state.isPopoverDragging || state.currentEditingElement) return;
19
-
20
- const target = e.target as Element;
21
-
22
- // Prevent hover effects when a dropdown is open
23
- if (state.isDropdownOpen) {
24
- clearHoverOverlays(state);
25
- return;
26
- }
27
-
28
- // Prevent hover effects on SVG path elements
29
- if (target.tagName.toLowerCase() === "path") {
30
- clearHoverOverlays(state);
31
- return;
32
- }
33
-
34
- // Support both data-source-location and data-visual-selector-id
35
- const element = target.closest(
36
- "[data-source-location], [data-visual-selector-id]"
37
- );
38
- if (!element) {
39
- clearHoverOverlays(state);
40
- return;
41
- }
42
-
43
- // Prefer data-source-location, fallback to data-visual-selector-id
44
- const htmlElement = element as HTMLElement;
45
- const selectorId =
46
- htmlElement.dataset.sourceLocation ||
47
- htmlElement.dataset.visualSelectorId;
48
-
49
- // Skip if this element is already selected
50
- if (state.selectedElementId === selectorId) {
51
- clearHoverOverlays(state);
52
- return;
53
- }
54
-
55
- // Find all elements with the same ID
56
- const elements = findElementsById(selectorId || null);
57
-
58
- // Clear previous hover overlays
59
- clearHoverOverlays(state);
60
-
61
- // Create overlays for all matching elements
62
- elements.forEach((el) => {
63
- const overlay = createOverlay(false);
64
- document.body.appendChild(overlay);
65
- state.hoverOverlays.push(overlay);
66
- positionOverlay(overlay, el, false, state.isVisualEditMode);
67
- });
68
-
69
- state.currentHighlightedElements = elements;
70
- }
71
-
72
- /**
73
- * Handle mouse out event
74
- */
75
- export function handleMouseOut(state: AgentState): void {
76
- if (state.isPopoverDragging || state.currentEditingElement) return;
77
- clearHoverOverlays(state);
78
- }
@@ -1,146 +0,0 @@
1
- import type { AgentState } from "../state/agent-state.js";
2
- import { OutgoingMessageType } from "./messages/types.js";
3
- import { repositionSelectedOverlays } from "../ui/overlay.js";
4
- import {
5
- enterInlineEditingMode,
6
- clearInlineEditingMode,
7
- setInlineEditCallback,
8
- isStaticArrayTextElement,
9
- } from "../capabilities/inline-editing/index.js";
10
- import { INLINE_EDIT_DEBOUNCE_MS } from "../constants.js";
11
- import { getElementPosition, getElementClasses } from "../utils/dom-utils.js";
12
-
13
- /**
14
- * Enter inline editing mode
15
- */
16
- export function handleEnterInlineEditingMode(state: AgentState, element: HTMLElement): void {
17
- state.currentEditingElement = element;
18
-
19
- // Hide overlays during editing
20
- state.selectedOverlays.forEach((overlay) => {
21
- overlay.style.display = "none";
22
- });
23
-
24
- // Enter inline editing mode (from capabilities/inline-editing)
25
- enterInlineEditingMode(element);
26
-
27
- // Notify parent
28
- window.parent.postMessage(
29
- {
30
- type: OutgoingMessageType.CONTENT_EDITING_STARTED,
31
- visualSelectorId: state.selectedElementId,
32
- },
33
- "*"
34
- );
35
- }
36
-
37
- /**
38
- * Clear inline editing mode
39
- */
40
- export function handleClearInlineEditingMode(state: AgentState): void {
41
- if (!state.currentEditingElement) return;
42
-
43
- // Cancel any pending debounced edit — originalTextContent will be deleted below
44
- if (state.debouncedSendTimeout) {
45
- clearTimeout(state.debouncedSendTimeout);
46
- state.debouncedSendTimeout = null;
47
- }
48
-
49
- const element = state.currentEditingElement;
50
-
51
- // Clear inline editing mode (from capabilities/inline-editing)
52
- clearInlineEditingMode(element);
53
-
54
- // Show overlays again
55
- state.selectedOverlays.forEach((overlay) => {
56
- overlay.style.display = "";
57
- });
58
-
59
- repositionSelectedOverlays(state);
60
-
61
- // Notify parent that editing ended
62
- window.parent.postMessage(
63
- {
64
- type: OutgoingMessageType.CONTENT_EDITING_ENDED,
65
- visualSelectorId: state.selectedElementId,
66
- },
67
- "*"
68
- );
69
-
70
- state.currentEditingElement = null;
71
- }
72
-
73
- /**
74
- * Report inline edit to parent
75
- */
76
- function reportInlineEdit(state: AgentState, element: HTMLElement): void {
77
- const originalContent = element.dataset.originalTextContent;
78
- const newContent = element.textContent;
79
-
80
- const elementInfo = {
81
- tagName: element.tagName,
82
- classes: getElementClasses(element),
83
- visualSelectorId: state.selectedElementId,
84
- content: newContent,
85
- dataSourceLocation: element.dataset.sourceLocation,
86
- isDynamicContent: element.dataset.dynamicContent === "true",
87
- linenumber: element.dataset.linenumber,
88
- filename: element.dataset.filename,
89
- position: getElementPosition(element.getBoundingClientRect()),
90
- };
91
-
92
- const message: Record<string, unknown> = {
93
- type: OutgoingMessageType.INLINE_EDIT,
94
- elementInfo,
95
- originalContent,
96
- newContent,
97
- };
98
-
99
- if (isStaticArrayTextElement(element)) {
100
- message.arrIndex = element.dataset.arrIndex;
101
- message.arrVariableName = element.dataset.arrVariableName;
102
- message.arrField = element.dataset.arrField;
103
- }
104
-
105
- window.parent.postMessage(message, "*");
106
-
107
- // Update baseline for next edit
108
- element.dataset.originalTextContent = newContent || "";
109
- }
110
-
111
- /**
112
- * Debounced function to send inline edit messages
113
- *
114
- * Intentionally overwrites the previous timeout on each keystroke — this is the
115
- * correct debounce behavior. We only send ONE message 500ms after the user stops
116
- * typing, containing the final text. Intermediate keystrokes are not sent to avoid
117
- * flooding the parent with dozens of messages per second.
118
- */
119
- function debouncedSendInlineEditMessage(state: AgentState, element: HTMLElement): void {
120
- // Clear any existing timeout
121
- if (state.debouncedSendTimeout) {
122
- clearTimeout(state.debouncedSendTimeout);
123
- }
124
-
125
- // Set new timeout
126
- state.debouncedSendTimeout = setTimeout(() => {
127
- reportInlineEdit(state, element);
128
- }, INLINE_EDIT_DEBOUNCE_MS);
129
- }
130
-
131
- /**
132
- * Callback for text input changes (combines updatePosition and reportInlineEdit)
133
- */
134
- function createTextInputChangeCallback(state: AgentState) {
135
- return (element: HTMLElement) => {
136
- repositionSelectedOverlays(state);
137
- debouncedSendInlineEditMessage(state, element);
138
- };
139
- }
140
-
141
- /**
142
- * Setup inline edit callback
143
- */
144
- export function setupInlineEditCallback(state: AgentState): void {
145
- setInlineEditCallback(createTextInputChangeCallback(state));
146
- }
@@ -1,201 +0,0 @@
1
- import type { AgentState } from "../state/agent-state.js";
2
- import { IncomingMessageType, OutgoingMessageType } from "./messages/types.js";
3
- import { findElementsById, updateElementClasses } from "../../utils.js";
4
- import { clearSelection, repositionSelectedOverlays, repositionHoverOverlays } from "../ui/overlay.js";
5
- import { clearHoverOverlays } from "./hover-handlers.js";
6
- import { handleClearInlineEditingMode } from "./inline-edit-handlers.js";
7
- import { REPOSITION_DELAY_MS } from "../constants.js";
8
- import { handleToggleVisualEditMode } from "./messages/toggle-visual-edit-mode.js";
9
- import { handleToggleInlineEditMode } from "./messages/toggle-inline-edit-mode.js";
10
- import { getElementPosition, isElementInViewport } from "../utils/dom-utils.js";
11
-
12
- /**
13
- * Send element position update to parent
14
- */
15
- function sendElementPositionUpdate(state: AgentState): void {
16
- if (!state.selectedElementId) return;
17
-
18
- const elements = findElementsById(state.selectedElementId);
19
- const [element] = elements;
20
- if (!element) return;
21
-
22
- const rect = element.getBoundingClientRect();
23
-
24
- window.parent.postMessage(
25
- {
26
- type: OutgoingMessageType.ELEMENT_POSITION_UPDATE,
27
- position: getElementPosition(rect),
28
- isInViewport: isElementInViewport(rect),
29
- visualSelectorId: state.selectedElementId,
30
- },
31
- "*"
32
- );
33
- }
34
-
35
- /**
36
- * Unselect the current element
37
- */
38
- export function unselectElement(state: AgentState): void {
39
- if (state.currentEditingElement) {
40
- handleClearInlineEditingMode(state);
41
- }
42
- clearSelection(state);
43
- }
44
-
45
- /**
46
- * Update element classes and reposition overlays
47
- */
48
- export function updateElementClassesAndReposition(
49
- state: AgentState,
50
- visualSelectorId: string,
51
- classes: string
52
- ): void {
53
- const elements = findElementsById(visualSelectorId);
54
- if (elements.length === 0) return;
55
-
56
- updateElementClasses(elements, classes);
57
-
58
- // Use a small delay to allow the browser to recalculate layout before repositioning
59
- setTimeout(() => {
60
- if (state.selectedElementId === visualSelectorId) {
61
- repositionSelectedOverlays(state);
62
- }
63
-
64
- const hoveredElement = state.currentHighlightedElements[0];
65
- if (
66
- hoveredElement instanceof HTMLElement &&
67
- hoveredElement.dataset.visualSelectorId === visualSelectorId
68
- ) {
69
- repositionHoverOverlays(state);
70
- }
71
- }, REPOSITION_DELAY_MS);
72
- }
73
-
74
- /**
75
- * Update element content by visual selector ID
76
- */
77
- export function updateElementContent(
78
- state: AgentState,
79
- visualSelectorId: string,
80
- content: string,
81
- arrIndex?: number
82
- ): void {
83
- let elements = findElementsById(visualSelectorId);
84
-
85
- if (elements.length === 0) {
86
- return;
87
- }
88
-
89
- // If arrIndex is provided, only update the element at that array position
90
- if (arrIndex != null) {
91
- elements = elements.filter(
92
- (el) => (el as HTMLElement).dataset.arrIndex === String(arrIndex)
93
- );
94
- }
95
-
96
- elements.forEach((element) => {
97
- (element as HTMLElement).innerText = content;
98
- });
99
-
100
- setTimeout(() => {
101
- if (state.selectedElementId === visualSelectorId) {
102
- repositionSelectedOverlays(state);
103
- }
104
- }, REPOSITION_DELAY_MS);
105
- }
106
-
107
- /**
108
- * Handle scroll events to update popover position
109
- */
110
- export function handleScroll(state: AgentState): void {
111
- sendElementPositionUpdate(state);
112
- }
113
-
114
- /**
115
- * Handle window resize to reposition overlays
116
- */
117
- export function handleResize(state: AgentState): void {
118
- repositionSelectedOverlays(state);
119
- repositionHoverOverlays(state);
120
- }
121
-
122
- /**
123
- * Handle messages from parent window
124
- */
125
- export function handleMessage(state: AgentState, event: MessageEvent): void {
126
- const message = event.data;
127
-
128
- switch (message.type as IncomingMessageType) {
129
- case IncomingMessageType.TOGGLE_VISUAL_EDIT_MODE:
130
- handleToggleVisualEditMode(state, message);
131
- break;
132
-
133
- case IncomingMessageType.UPDATE_CLASSES:
134
- if (message.data && message.data.classes !== undefined) {
135
- updateElementClassesAndReposition(
136
- state,
137
- message.data.visualSelectorId,
138
- message.data.classes
139
- );
140
- } else {
141
- console.warn(
142
- "[VisualEditAgent] Invalid update-classes message:",
143
- message
144
- );
145
- }
146
- break;
147
-
148
- case IncomingMessageType.UNSELECT_ELEMENT:
149
- unselectElement(state);
150
- break;
151
-
152
- case IncomingMessageType.REFRESH_PAGE:
153
- window.location.reload();
154
- break;
155
-
156
- case IncomingMessageType.UPDATE_CONTENT:
157
- if (message.data && message.data.content !== undefined) {
158
- updateElementContent(
159
- state,
160
- message.data.visualSelectorId,
161
- message.data.content,
162
- message.data.arrIndex
163
- );
164
- } else {
165
- console.warn(
166
- "[VisualEditAgent] Invalid update-content message:",
167
- message
168
- );
169
- }
170
- break;
171
-
172
- case IncomingMessageType.TOGGLE_INLINE_EDIT_MODE:
173
- handleToggleInlineEditMode(state, message);
174
- break;
175
-
176
- case IncomingMessageType.REQUEST_ELEMENT_POSITION:
177
- sendElementPositionUpdate(state);
178
- break;
179
-
180
- case IncomingMessageType.POPOVER_DRAG_STATE:
181
- if (message.data && message.data.isDragging !== undefined) {
182
- state.isPopoverDragging = message.data.isDragging;
183
- if (message.data.isDragging) {
184
- clearHoverOverlays(state);
185
- }
186
- }
187
- break;
188
-
189
- case IncomingMessageType.DROPDOWN_STATE:
190
- if (message.data && message.data.isOpen !== undefined) {
191
- state.isDropdownOpen = message.data.isOpen;
192
- if (message.data.isOpen) {
193
- clearHoverOverlays(state);
194
- }
195
- }
196
- break;
197
-
198
- default:
199
- break;
200
- }
201
- }
@@ -1,65 +0,0 @@
1
- import type { AgentState } from "../../state/agent-state.js";
2
- import type { ToggleInlineEditModeMessage } from "./types.js";
3
- import { findElementsById } from "../../../utils.js";
4
- import { shouldEnterInlineEditingMode } from "../../capabilities/inline-editing/index.js";
5
- import { handleEnterInlineEditingMode, handleClearInlineEditingMode } from "../inline-edit-handlers.js";
6
- import { clearSelection } from "../../ui/overlay.js";
7
- import { createOverlay, positionOverlay } from "../../ui/overlay.js";
8
-
9
- /**
10
- * Handle toggle-inline-edit-mode message (parent-initiated)
11
- */
12
- export function handleToggleInlineEditMode(
13
- state: AgentState,
14
- message: ToggleInlineEditModeMessage
15
- ): void {
16
- if (!state.isInlineEditExperimentEnabled) {
17
- return;
18
- }
19
-
20
- if (!message.data || !message.data.dataSourceLocation) {
21
- return;
22
- }
23
-
24
- const elements = findElementsById(message.data.dataSourceLocation);
25
- if (elements.length === 0 || !(elements[0] instanceof HTMLElement)) {
26
- return;
27
- }
28
-
29
- const element = elements[0];
30
-
31
- if (message.data.inlineEditingMode) {
32
- // Enable inline editing (only for non-dynamic text elements)
33
- if (shouldEnterInlineEditingMode(element)) {
34
- // Select the element first if not already selected
35
- if (state.selectedElementId !== message.data.dataSourceLocation) {
36
- // Clear any existing selection
37
- if (state.currentEditingElement) {
38
- handleClearInlineEditingMode(state);
39
- }
40
- clearSelection(state);
41
-
42
- elements.forEach((el) => {
43
- if (el instanceof HTMLElement) {
44
- el.dataset.selected = "true";
45
- }
46
- });
47
-
48
- elements.forEach((el) => {
49
- const overlay = createOverlay(true);
50
- document.body.appendChild(overlay);
51
- state.selectedOverlays.push(overlay);
52
- positionOverlay(overlay, el, true, state.isVisualEditMode);
53
- });
54
-
55
- state.selectedElementId = message.data.dataSourceLocation;
56
- }
57
- handleEnterInlineEditingMode(state, element);
58
- }
59
- } else {
60
- // Disable inline editing
61
- if (state.currentEditingElement === element) {
62
- handleClearInlineEditingMode(state);
63
- }
64
- }
65
- }
@@ -1,40 +0,0 @@
1
- import type { AgentState } from "../../state/agent-state.js";
2
- import type { ToggleVisualEditModeMessage } from "./types.js";
3
- import { clearSelection } from "../../ui/overlay.js";
4
- import { clearHoverOverlays } from "../hover-handlers.js";
5
- import { handleClearInlineEditingMode } from "../inline-edit-handlers.js";
6
-
7
- /**
8
- * Toggle visual edit mode on/off
9
- */
10
- export function toggleVisualEditMode(state: AgentState, isEnabled: boolean): void {
11
- state.isVisualEditMode = isEnabled;
12
-
13
- if (!isEnabled) {
14
- if (state.currentEditingElement) {
15
- handleClearInlineEditingMode(state);
16
- }
17
-
18
- clearHoverOverlays(state);
19
- clearSelection(state);
20
- state.currentHighlightedElements = [];
21
- document.body.style.cursor = "default";
22
- } else {
23
- document.body.style.cursor = "crosshair";
24
- }
25
- }
26
-
27
- /**
28
- * Handle toggle-visual-edit-mode message
29
- */
30
- export function handleToggleVisualEditMode(
31
- state: AgentState,
32
- message: ToggleVisualEditModeMessage
33
- ): void {
34
- toggleVisualEditMode(state, message.data.enabled);
35
-
36
- // Update inline edit experiment flag if provided
37
- if (message.data.specs?.newInlineEditEnabled !== undefined) {
38
- state.isInlineEditExperimentEnabled = true;
39
- }
40
- }
@@ -1,134 +0,0 @@
1
- /**
2
- * Message types and interfaces for parent-iframe communication
3
- */
4
-
5
- // Incoming message types (from parent)
6
- export enum IncomingMessageType {
7
- TOGGLE_VISUAL_EDIT_MODE = "toggle-visual-edit-mode",
8
- UPDATE_CLASSES = "update-classes",
9
- UPDATE_CONTENT = "update-content",
10
- UNSELECT_ELEMENT = "unselect-element",
11
- REFRESH_PAGE = "refresh-page",
12
- TOGGLE_INLINE_EDIT_MODE = "toggle-inline-edit-mode",
13
- REQUEST_ELEMENT_POSITION = "request-element-position",
14
- POPOVER_DRAG_STATE = "popover-drag-state",
15
- DROPDOWN_STATE = "dropdown-state",
16
- }
17
-
18
- // Outgoing message types (to parent)
19
- export enum OutgoingMessageType {
20
- VISUAL_EDIT_AGENT_READY = "visual-edit-agent-ready",
21
- ELEMENT_SELECTED = "element-selected",
22
- ELEMENT_POSITION_UPDATE = "element-position-update",
23
- CONTENT_EDITING_STARTED = "content-editing-started",
24
- INLINE_EDIT = "inline-edit",
25
- CONTENT_EDITING_ENDED = "content-editing-ended",
26
- CLOSE_DROPDOWNS = "close-dropdowns",
27
- }
28
-
29
- // Message interfaces
30
- export interface ToggleVisualEditModeMessage {
31
- type: IncomingMessageType.TOGGLE_VISUAL_EDIT_MODE;
32
- data: {
33
- enabled: boolean;
34
- specs?: {
35
- newInlineEditEnabled?: boolean;
36
- };
37
- };
38
- }
39
-
40
- export interface UpdateClassesMessage {
41
- type: IncomingMessageType.UPDATE_CLASSES;
42
- data: {
43
- visualSelectorId: string;
44
- classes: string;
45
- };
46
- }
47
-
48
- export interface UpdateContentMessage {
49
- type: IncomingMessageType.UPDATE_CONTENT;
50
- data: {
51
- visualSelectorId: string;
52
- content: string;
53
- };
54
- }
55
-
56
- export interface UnselectElementMessage {
57
- type: IncomingMessageType.UNSELECT_ELEMENT;
58
- }
59
-
60
- export interface RefreshPageMessage {
61
- type: IncomingMessageType.REFRESH_PAGE;
62
- }
63
-
64
- export interface ToggleInlineEditModeMessage {
65
- type: IncomingMessageType.TOGGLE_INLINE_EDIT_MODE;
66
- data: {
67
- dataSourceLocation: string;
68
- inlineEditingMode: boolean;
69
- };
70
- }
71
-
72
- export interface RequestElementPositionMessage {
73
- type: IncomingMessageType.REQUEST_ELEMENT_POSITION;
74
- }
75
-
76
- export interface PopoverDragStateMessage {
77
- type: IncomingMessageType.POPOVER_DRAG_STATE;
78
- data: {
79
- isDragging: boolean;
80
- };
81
- }
82
-
83
- export interface DropdownStateMessage {
84
- type: IncomingMessageType.DROPDOWN_STATE;
85
- data: {
86
- isOpen: boolean;
87
- };
88
- }
89
-
90
- // Union type for all incoming messages
91
- export type IncomingMessage =
92
- | ToggleVisualEditModeMessage
93
- | UpdateClassesMessage
94
- | UpdateContentMessage
95
- | UnselectElementMessage
96
- | RefreshPageMessage
97
- | ToggleInlineEditModeMessage
98
- | RequestElementPositionMessage
99
- | PopoverDragStateMessage
100
- | DropdownStateMessage;
101
-
102
- // Outgoing message interfaces
103
-
104
- export interface InlineEditMessage {
105
- type: OutgoingMessageType.INLINE_EDIT;
106
- elementInfo: {
107
- tagName: string;
108
- classes: string;
109
- visualSelectorId: string | null;
110
- content: string | null;
111
- dataSourceLocation: string | undefined;
112
- isDynamicContent: boolean;
113
- linenumber: string | undefined;
114
- filename: string | undefined;
115
- position: ElementPosition;
116
- };
117
- originalContent: string | undefined;
118
- newContent: string | null;
119
- arrIndex?: string;
120
- arrVariableName?: string;
121
- arrField?: string;
122
- }
123
-
124
- // Element position interface (used in multiple messages)
125
- export interface ElementPosition {
126
- top: number;
127
- left: number;
128
- right: number;
129
- bottom: number;
130
- width: number;
131
- height: number;
132
- centerX: number;
133
- centerY: number;
134
- }