@base44-preview/vite-plugin 0.2.22-pr.37.eb62313 → 0.2.22-pr.38.2655a87

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 (89) 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 +466 -1
  4. package/dist/injections/visual-edit-agent.js.map +1 -1
  5. package/dist/statics/index.mjs +1 -5
  6. package/dist/statics/index.mjs.map +1 -1
  7. package/package.json +1 -1
  8. package/src/injections/visual-edit-agent.ts +570 -1
  9. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.d.ts +0 -25
  10. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.d.ts.map +0 -1
  11. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.js +0 -95
  12. package/dist/injections/visual-edit-agent/capabilities/inline-editing/core.js.map +0 -1
  13. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.d.ts +0 -4
  14. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.d.ts.map +0 -1
  15. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.js +0 -4
  16. package/dist/injections/visual-edit-agent/capabilities/inline-editing/index.js.map +0 -1
  17. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.d.ts +0 -9
  18. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.d.ts.map +0 -1
  19. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.js +0 -26
  20. package/dist/injections/visual-edit-agent/capabilities/inline-editing/styles.js.map +0 -1
  21. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.d.ts +0 -10
  22. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.d.ts.map +0 -1
  23. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.js +0 -60
  24. package/dist/injections/visual-edit-agent/capabilities/inline-editing/validation.js.map +0 -1
  25. package/dist/injections/visual-edit-agent/constants.d.ts +0 -10
  26. package/dist/injections/visual-edit-agent/constants.d.ts.map +0 -1
  27. package/dist/injections/visual-edit-agent/constants.js +0 -10
  28. package/dist/injections/visual-edit-agent/constants.js.map +0 -1
  29. package/dist/injections/visual-edit-agent/handlers/click-handlers.d.ts +0 -10
  30. package/dist/injections/visual-edit-agent/handlers/click-handlers.d.ts.map +0 -1
  31. package/dist/injections/visual-edit-agent/handlers/click-handlers.js +0 -108
  32. package/dist/injections/visual-edit-agent/handlers/click-handlers.js.map +0 -1
  33. package/dist/injections/visual-edit-agent/handlers/hover-handlers.d.ts +0 -14
  34. package/dist/injections/visual-edit-agent/handlers/hover-handlers.d.ts.map +0 -1
  35. package/dist/injections/visual-edit-agent/handlers/hover-handlers.js +0 -64
  36. package/dist/injections/visual-edit-agent/handlers/hover-handlers.js.map +0 -1
  37. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.d.ts +0 -14
  38. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.d.ts.map +0 -1
  39. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.js +0 -109
  40. package/dist/injections/visual-edit-agent/handlers/inline-edit-handlers.js.map +0 -1
  41. package/dist/injections/visual-edit-agent/handlers/message-handlers.d.ts +0 -26
  42. package/dist/injections/visual-edit-agent/handlers/message-handlers.d.ts.map +0 -1
  43. package/dist/injections/visual-edit-agent/handlers/message-handlers.js +0 -145
  44. package/dist/injections/visual-edit-agent/handlers/message-handlers.js.map +0 -1
  45. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.d.ts +0 -7
  46. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.d.ts.map +0 -1
  47. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.js +0 -58
  48. package/dist/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.js.map +0 -1
  49. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.d.ts +0 -11
  50. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.d.ts.map +0 -1
  51. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.js +0 -32
  52. package/dist/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.js.map +0 -1
  53. package/dist/injections/visual-edit-agent/handlers/messages/types.d.ts +0 -86
  54. package/dist/injections/visual-edit-agent/handlers/messages/types.d.ts.map +0 -1
  55. package/dist/injections/visual-edit-agent/handlers/messages/types.js +0 -28
  56. package/dist/injections/visual-edit-agent/handlers/messages/types.js.map +0 -1
  57. package/dist/injections/visual-edit-agent/index.d.ts +0 -5
  58. package/dist/injections/visual-edit-agent/index.d.ts.map +0 -1
  59. package/dist/injections/visual-edit-agent/index.js +0 -95
  60. package/dist/injections/visual-edit-agent/index.js.map +0 -1
  61. package/dist/injections/visual-edit-agent/state/agent-state.d.ts +0 -17
  62. package/dist/injections/visual-edit-agent/state/agent-state.d.ts.map +0 -1
  63. package/dist/injections/visual-edit-agent/state/agent-state.js +0 -18
  64. package/dist/injections/visual-edit-agent/state/agent-state.js.map +0 -1
  65. package/dist/injections/visual-edit-agent/ui/overlay.d.ts +0 -26
  66. package/dist/injections/visual-edit-agent/ui/overlay.d.ts.map +0 -1
  67. package/dist/injections/visual-edit-agent/ui/overlay.js +0 -104
  68. package/dist/injections/visual-edit-agent/ui/overlay.js.map +0 -1
  69. package/dist/injections/visual-edit-agent/utils/dom-utils.d.ts +0 -14
  70. package/dist/injections/visual-edit-agent/utils/dom-utils.d.ts.map +0 -1
  71. package/dist/injections/visual-edit-agent/utils/dom-utils.js +0 -34
  72. package/dist/injections/visual-edit-agent/utils/dom-utils.js.map +0 -1
  73. package/src/injections/visual-edit-agent/README.md +0 -222
  74. package/src/injections/visual-edit-agent/capabilities/inline-editing/core.ts +0 -120
  75. package/src/injections/visual-edit-agent/capabilities/inline-editing/index.ts +0 -10
  76. package/src/injections/visual-edit-agent/capabilities/inline-editing/styles.ts +0 -26
  77. package/src/injections/visual-edit-agent/capabilities/inline-editing/validation.ts +0 -67
  78. package/src/injections/visual-edit-agent/constants.ts +0 -9
  79. package/src/injections/visual-edit-agent/handlers/click-handlers.ts +0 -135
  80. package/src/injections/visual-edit-agent/handlers/hover-handlers.ts +0 -78
  81. package/src/injections/visual-edit-agent/handlers/inline-edit-handlers.ts +0 -141
  82. package/src/injections/visual-edit-agent/handlers/message-handlers.ts +0 -191
  83. package/src/injections/visual-edit-agent/handlers/messages/toggle-inline-edit-mode.ts +0 -70
  84. package/src/injections/visual-edit-agent/handlers/messages/toggle-visual-edit-mode.ts +0 -40
  85. package/src/injections/visual-edit-agent/handlers/messages/types.ts +0 -112
  86. package/src/injections/visual-edit-agent/index.ts +0 -108
  87. package/src/injections/visual-edit-agent/state/agent-state.ts +0 -31
  88. package/src/injections/visual-edit-agent/ui/overlay.ts +0 -126
  89. package/src/injections/visual-edit-agent/utils/dom-utils.ts +0 -39
@@ -1,135 +0,0 @@
1
- import type { AgentState } from "../state/agent-state.js";
2
- import { OutgoingMessageType } from "./messages/types.js";
3
- import { findElementsById } from "../../utils.js";
4
- import { createOverlay, positionOverlay, clearSelection } from "../ui/overlay.js";
5
- import { clearHoverOverlays } from "./hover-handlers.js";
6
- import { shouldEnterInlineEditingMode } from "../capabilities/inline-editing/index.js";
7
- import { handleClearInlineEditingMode, handleEnterInlineEditingMode } from "./inline-edit-handlers.js";
8
- import { getElementPosition, getElementClasses } from "../utils/dom-utils.js";
9
-
10
- /**
11
- * Handle element selection (first click)
12
- */
13
- export function handleElementSelection(
14
- state: AgentState,
15
- element: Element,
16
- visualSelectorId: string | null
17
- ): void {
18
- if (state.currentEditingElement) {
19
- handleClearInlineEditingMode(state);
20
- }
21
- clearSelection(state);
22
-
23
- // Find all elements with the same ID
24
- const elements = findElementsById(visualSelectorId);
25
-
26
- if (state.isInlineEditExperimentEnabled) {
27
- elements.forEach((el) => {
28
- if (el instanceof HTMLElement) {
29
- el.dataset.selected = "true";
30
- }
31
- });
32
- }
33
-
34
- // Create selected overlays for all matching elements
35
- elements.forEach((el) => {
36
- const overlay = createOverlay(true);
37
- document.body.appendChild(overlay);
38
- state.selectedOverlays.push(overlay);
39
- positionOverlay(overlay, el, true, state.isVisualEditMode);
40
- });
41
-
42
- state.selectedElementId = visualSelectorId;
43
-
44
- // Clear hover overlays
45
- clearHoverOverlays(state);
46
-
47
- // Send message to parent window with element info
48
- const htmlElement = element as HTMLElement;
49
- const elementData = {
50
- type: OutgoingMessageType.ELEMENT_SELECTED,
51
- tagName: element.tagName,
52
- classes: getElementClasses(element),
53
- visualSelectorId: visualSelectorId,
54
- content: htmlElement.innerText,
55
- dataSourceLocation: htmlElement.dataset.sourceLocation,
56
- isDynamicContent: htmlElement.dataset.dynamicContent === "true",
57
- linenumber: htmlElement.dataset.linenumber,
58
- filename: htmlElement.dataset.filename,
59
- position: getElementPosition(element.getBoundingClientRect()),
60
- };
61
- window.parent.postMessage(elementData, "*");
62
- }
63
-
64
- /**
65
- * Handle element click
66
- */
67
- export function handleElementClick(state: AgentState, e: MouseEvent): void {
68
- if (!state.isVisualEditMode) return;
69
-
70
- const target = e.target as Element;
71
-
72
- // Bail out early if clicking on a contentEditable element (allow normal editing)
73
- if (state.isInlineEditExperimentEnabled && target instanceof HTMLElement && target.contentEditable === "true") {
74
- return;
75
- }
76
-
77
- // If currently editing, clicking outside should exit editing mode
78
- if (state.currentEditingElement) {
79
- e.preventDefault();
80
- e.stopPropagation();
81
- e.stopImmediatePropagation();
82
- handleClearInlineEditingMode(state);
83
- return;
84
- }
85
-
86
- // Close dropdowns when clicking anywhere in iframe if a dropdown is open
87
- if (state.isDropdownOpen) {
88
- e.preventDefault();
89
- e.stopPropagation();
90
- e.stopImmediatePropagation();
91
-
92
- window.parent.postMessage({ type: OutgoingMessageType.CLOSE_DROPDOWNS }, "*");
93
- return;
94
- }
95
-
96
- // Prevent clicking on SVG path elements
97
- if (target.tagName.toLowerCase() === "path") {
98
- return;
99
- }
100
-
101
- // Prevent default behavior immediately when in visual edit mode
102
- e.preventDefault();
103
- e.stopPropagation();
104
- e.stopImmediatePropagation();
105
-
106
- // Support both data-source-location and data-visual-selector-id
107
- const element = target.closest(
108
- "[data-source-location], [data-visual-selector-id]"
109
- );
110
- if (!element) {
111
- return;
112
- }
113
-
114
- const htmlElement = element as HTMLElement;
115
- const visualSelectorId =
116
- htmlElement.dataset.sourceLocation ||
117
- htmlElement.dataset.visualSelectorId;
118
-
119
- // Check if this element is already selected (second click scenario)
120
- const isAlreadySelected =
121
- state.selectedElementId === visualSelectorId &&
122
- htmlElement.dataset.selected === "true";
123
-
124
- if (isAlreadySelected) {
125
- // Second click on already-selected element: check if it should enter inline editing
126
- // Only if the experiment is enabled
127
- if (state.isInlineEditExperimentEnabled && shouldEnterInlineEditingMode(htmlElement)) {
128
- handleEnterInlineEditingMode(state, htmlElement);
129
- return;
130
- }
131
- }
132
-
133
- // First click: select the element
134
- handleElementSelection(state, element, visualSelectorId || null);
135
- }
@@ -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,141 +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
- } from "../capabilities/inline-editing/index.js";
9
- import { INLINE_EDIT_DEBOUNCE_MS } from "../constants.js";
10
- import { getElementPosition, getElementClasses } from "../utils/dom-utils.js";
11
-
12
- /**
13
- * Enter inline editing mode
14
- */
15
- export function handleEnterInlineEditingMode(state: AgentState, element: HTMLElement): void {
16
- state.currentEditingElement = element;
17
-
18
- // Hide overlays during editing
19
- state.selectedOverlays.forEach((overlay) => {
20
- overlay.style.display = "none";
21
- });
22
-
23
- // Enter inline editing mode (from capabilities/inline-editing)
24
- enterInlineEditingMode(element);
25
-
26
- // Notify parent
27
- window.parent.postMessage(
28
- {
29
- type: OutgoingMessageType.CONTENT_EDITING_STARTED,
30
- visualSelectorId: state.selectedElementId,
31
- },
32
- "*"
33
- );
34
- }
35
-
36
- /**
37
- * Clear inline editing mode
38
- */
39
- export function handleClearInlineEditingMode(state: AgentState): void {
40
- if (!state.currentEditingElement) return;
41
-
42
- // Cancel any pending debounced edit — originalTextContent will be deleted below
43
- if (state.debouncedSendTimeout) {
44
- clearTimeout(state.debouncedSendTimeout);
45
- state.debouncedSendTimeout = null;
46
- }
47
-
48
- const element = state.currentEditingElement;
49
-
50
- // Clear inline editing mode (from capabilities/inline-editing)
51
- clearInlineEditingMode(element);
52
-
53
- // Show overlays again
54
- state.selectedOverlays.forEach((overlay) => {
55
- overlay.style.display = "";
56
- });
57
-
58
- repositionSelectedOverlays(state);
59
-
60
- // Notify parent that editing ended
61
- window.parent.postMessage(
62
- {
63
- type: OutgoingMessageType.CONTENT_EDITING_ENDED,
64
- visualSelectorId: state.selectedElementId,
65
- },
66
- "*"
67
- );
68
-
69
- state.currentEditingElement = null;
70
- }
71
-
72
- /**
73
- * Report inline edit to parent
74
- */
75
- function reportInlineEdit(state: AgentState, element: HTMLElement): void {
76
- const originalContent = element.dataset.originalTextContent;
77
- const newContent = element.textContent;
78
-
79
- const elementInfo = {
80
- tagName: element.tagName,
81
- classes: getElementClasses(element),
82
- visualSelectorId: state.selectedElementId,
83
- content: newContent,
84
- dataSourceLocation: element.dataset.sourceLocation,
85
- isDynamicContent: element.dataset.dynamicContent === "true",
86
- linenumber: element.dataset.linenumber,
87
- filename: element.dataset.filename,
88
- position: getElementPosition(element.getBoundingClientRect()),
89
- };
90
-
91
- // Send inline edit message
92
- window.parent.postMessage(
93
- {
94
- type: OutgoingMessageType.INLINE_EDIT,
95
- elementInfo,
96
- originalContent,
97
- newContent,
98
- },
99
- "*"
100
- );
101
-
102
- // Update baseline for next edit
103
- element.dataset.originalTextContent = newContent || "";
104
- }
105
-
106
- /**
107
- * Debounced function to send inline edit messages
108
- *
109
- * Intentionally overwrites the previous timeout on each keystroke — this is the
110
- * correct debounce behavior. We only send ONE message 500ms after the user stops
111
- * typing, containing the final text. Intermediate keystrokes are not sent to avoid
112
- * flooding the parent with dozens of messages per second.
113
- */
114
- function debouncedSendInlineEditMessage(state: AgentState, element: HTMLElement): void {
115
- // Clear any existing timeout
116
- if (state.debouncedSendTimeout) {
117
- clearTimeout(state.debouncedSendTimeout);
118
- }
119
-
120
- // Set new timeout
121
- state.debouncedSendTimeout = setTimeout(() => {
122
- reportInlineEdit(state, element);
123
- }, INLINE_EDIT_DEBOUNCE_MS);
124
- }
125
-
126
- /**
127
- * Callback for text input changes (combines updatePosition and reportInlineEdit)
128
- */
129
- function createTextInputChangeCallback(state: AgentState) {
130
- return (element: HTMLElement) => {
131
- repositionSelectedOverlays(state);
132
- debouncedSendInlineEditMessage(state, element);
133
- };
134
- }
135
-
136
- /**
137
- * Setup inline edit callback
138
- */
139
- export function setupInlineEditCallback(state: AgentState): void {
140
- setInlineEditCallback(createTextInputChangeCallback(state));
141
- }
@@ -1,191 +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
- if (state.currentHighlightedElements.length > 0) {
65
- const hoveredElement = state.currentHighlightedElements[0] as HTMLElement;
66
- if (hoveredElement?.dataset?.visualSelectorId === visualSelectorId) {
67
- repositionHoverOverlays(state);
68
- }
69
- }
70
- }, REPOSITION_DELAY_MS);
71
- }
72
-
73
- /**
74
- * Update element content by visual selector ID
75
- */
76
- export function updateElementContent(
77
- state: AgentState,
78
- visualSelectorId: string,
79
- content: string
80
- ): void {
81
- const elements = findElementsById(visualSelectorId);
82
-
83
- if (elements.length === 0) {
84
- return;
85
- }
86
-
87
- elements.forEach((element) => {
88
- (element as HTMLElement).innerText = content;
89
- });
90
-
91
- setTimeout(() => {
92
- if (state.selectedElementId === visualSelectorId) {
93
- repositionSelectedOverlays(state);
94
- }
95
- }, REPOSITION_DELAY_MS);
96
- }
97
-
98
- /**
99
- * Handle scroll events to update popover position
100
- */
101
- export function handleScroll(state: AgentState): void {
102
- sendElementPositionUpdate(state);
103
- }
104
-
105
- /**
106
- * Handle window resize to reposition overlays
107
- */
108
- export function handleResize(state: AgentState): void {
109
- repositionSelectedOverlays(state);
110
- repositionHoverOverlays(state);
111
- }
112
-
113
- /**
114
- * Handle messages from parent window
115
- */
116
- export function handleMessage(state: AgentState, event: MessageEvent): void {
117
- const message = event.data;
118
-
119
- switch (message.type as IncomingMessageType) {
120
- case IncomingMessageType.TOGGLE_VISUAL_EDIT_MODE:
121
- handleToggleVisualEditMode(state, message);
122
- break;
123
-
124
- case IncomingMessageType.UPDATE_CLASSES:
125
- if (message.data && message.data.classes !== undefined) {
126
- updateElementClassesAndReposition(
127
- state,
128
- message.data.visualSelectorId,
129
- message.data.classes
130
- );
131
- } else {
132
- console.warn(
133
- "[VisualEditAgent] Invalid update-classes message:",
134
- message
135
- );
136
- }
137
- break;
138
-
139
- case IncomingMessageType.UNSELECT_ELEMENT:
140
- unselectElement(state);
141
- break;
142
-
143
- case IncomingMessageType.REFRESH_PAGE:
144
- window.location.reload();
145
- break;
146
-
147
- case IncomingMessageType.UPDATE_CONTENT:
148
- if (message.data && message.data.content !== undefined) {
149
- updateElementContent(
150
- state,
151
- message.data.visualSelectorId,
152
- message.data.content
153
- );
154
- } else {
155
- console.warn(
156
- "[VisualEditAgent] Invalid update-content message:",
157
- message
158
- );
159
- }
160
- break;
161
-
162
- case IncomingMessageType.TOGGLE_INLINE_EDIT_MODE:
163
- handleToggleInlineEditMode(state, message);
164
- break;
165
-
166
- case IncomingMessageType.REQUEST_ELEMENT_POSITION:
167
- sendElementPositionUpdate(state);
168
- break;
169
-
170
- case IncomingMessageType.POPOVER_DRAG_STATE:
171
- if (message.data && message.data.isDragging !== undefined) {
172
- state.isPopoverDragging = message.data.isDragging;
173
- if (message.data.isDragging) {
174
- clearHoverOverlays(state);
175
- }
176
- }
177
- break;
178
-
179
- case IncomingMessageType.DROPDOWN_STATE:
180
- if (message.data && message.data.isOpen !== undefined) {
181
- state.isDropdownOpen = message.data.isOpen;
182
- if (message.data.isOpen) {
183
- clearHoverOverlays(state);
184
- }
185
- }
186
- break;
187
-
188
- default:
189
- break;
190
- }
191
- }
@@ -1,70 +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
- // Find all elements with the same ID
43
- const elements = findElementsById(message.data.dataSourceLocation);
44
-
45
- // Mark elements as selected
46
- elements.forEach((el) => {
47
- if (el instanceof HTMLElement) {
48
- el.dataset.selected = "true";
49
- }
50
- });
51
-
52
- // Create selected overlays for all matching elements
53
- elements.forEach((el) => {
54
- const overlay = createOverlay(true);
55
- document.body.appendChild(overlay);
56
- state.selectedOverlays.push(overlay);
57
- positionOverlay(overlay, el, true, state.isVisualEditMode);
58
- });
59
-
60
- state.selectedElementId = message.data.dataSourceLocation;
61
- }
62
- handleEnterInlineEditingMode(state, element);
63
- }
64
- } else {
65
- // Disable inline editing
66
- if (state.currentEditingElement === element) {
67
- handleClearInlineEditingMode(state);
68
- }
69
- }
70
- }
@@ -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 = message.data.specs.newInlineEditEnabled;
39
- }
40
- }