@base44/vite-plugin 0.2.25 → 0.2.27

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 (58) hide show
  1. package/dist/capabilities/inline-edit/controller.d.ts +3 -0
  2. package/dist/capabilities/inline-edit/controller.d.ts.map +1 -0
  3. package/dist/capabilities/inline-edit/controller.js +194 -0
  4. package/dist/capabilities/inline-edit/controller.js.map +1 -0
  5. package/dist/capabilities/inline-edit/dom-utils.d.ts +6 -0
  6. package/dist/capabilities/inline-edit/dom-utils.d.ts.map +1 -0
  7. package/dist/capabilities/inline-edit/dom-utils.js +49 -0
  8. package/dist/capabilities/inline-edit/dom-utils.js.map +1 -0
  9. package/dist/capabilities/inline-edit/index.d.ts +3 -0
  10. package/dist/capabilities/inline-edit/index.d.ts.map +1 -0
  11. package/dist/capabilities/inline-edit/index.js +2 -0
  12. package/dist/capabilities/inline-edit/index.js.map +1 -0
  13. package/dist/capabilities/inline-edit/types.d.ts +25 -0
  14. package/dist/capabilities/inline-edit/types.d.ts.map +1 -0
  15. package/dist/capabilities/inline-edit/types.js +2 -0
  16. package/dist/capabilities/inline-edit/types.js.map +1 -0
  17. package/dist/injections/layer-dropdown/consts.d.ts +19 -0
  18. package/dist/injections/layer-dropdown/consts.d.ts.map +1 -0
  19. package/dist/injections/layer-dropdown/consts.js +40 -0
  20. package/dist/injections/layer-dropdown/consts.js.map +1 -0
  21. package/dist/injections/layer-dropdown/controller.d.ts +4 -0
  22. package/dist/injections/layer-dropdown/controller.d.ts.map +1 -0
  23. package/dist/injections/layer-dropdown/controller.js +88 -0
  24. package/dist/injections/layer-dropdown/controller.js.map +1 -0
  25. package/dist/injections/layer-dropdown/dropdown-ui.d.ts +13 -0
  26. package/dist/injections/layer-dropdown/dropdown-ui.d.ts.map +1 -0
  27. package/dist/injections/layer-dropdown/dropdown-ui.js +176 -0
  28. package/dist/injections/layer-dropdown/dropdown-ui.js.map +1 -0
  29. package/dist/injections/layer-dropdown/types.d.ts +26 -0
  30. package/dist/injections/layer-dropdown/types.d.ts.map +1 -0
  31. package/dist/injections/layer-dropdown/types.js +3 -0
  32. package/dist/injections/layer-dropdown/types.js.map +1 -0
  33. package/dist/injections/layer-dropdown/utils.d.ts +25 -0
  34. package/dist/injections/layer-dropdown/utils.d.ts.map +1 -0
  35. package/dist/injections/layer-dropdown/utils.js +143 -0
  36. package/dist/injections/layer-dropdown/utils.js.map +1 -0
  37. package/dist/injections/utils.d.ts +4 -0
  38. package/dist/injections/utils.d.ts.map +1 -1
  39. package/dist/injections/utils.js +12 -0
  40. package/dist/injections/utils.js.map +1 -1
  41. package/dist/injections/visual-edit-agent.d.ts.map +1 -1
  42. package/dist/injections/visual-edit-agent.js +151 -76
  43. package/dist/injections/visual-edit-agent.js.map +1 -1
  44. package/dist/statics/index.mjs +5 -1
  45. package/dist/statics/index.mjs.map +1 -1
  46. package/package.json +1 -1
  47. package/src/capabilities/inline-edit/controller.ts +245 -0
  48. package/src/capabilities/inline-edit/dom-utils.ts +48 -0
  49. package/src/capabilities/inline-edit/index.ts +2 -0
  50. package/src/capabilities/inline-edit/types.ts +30 -0
  51. package/src/injections/layer-dropdown/LAYERS.md +258 -0
  52. package/src/injections/layer-dropdown/consts.ts +49 -0
  53. package/src/injections/layer-dropdown/controller.ts +109 -0
  54. package/src/injections/layer-dropdown/dropdown-ui.ts +230 -0
  55. package/src/injections/layer-dropdown/types.ts +30 -0
  56. package/src/injections/layer-dropdown/utils.ts +175 -0
  57. package/src/injections/utils.ts +18 -0
  58. package/src/injections/visual-edit-agent.ts +170 -82
@@ -0,0 +1,3 @@
1
+ import type { InlineEditHost, InlineEditController } from "./types.js";
2
+ export declare function createInlineEditController(host: InlineEditHost): InlineEditController;
3
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAUvE,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,cAAc,GACnB,oBAAoB,CAwOtB"}
@@ -0,0 +1,194 @@
1
+ import { injectFocusOutlineCSS, removeFocusOutlineCSS, selectText, shouldEnterInlineEditingMode, } from "./dom-utils.js";
2
+ const DEBOUNCE_MS = 500;
3
+ export function createInlineEditController(host) {
4
+ let currentEditingElement = null;
5
+ let debouncedSendTimeout = null;
6
+ let enabled = false;
7
+ const listenerAbortControllers = new WeakMap();
8
+ // --- Private helpers ---
9
+ const repositionOverlays = () => {
10
+ const selectedId = host.getSelectedElementId();
11
+ if (!selectedId)
12
+ return;
13
+ const elements = host.findElementsById(selectedId);
14
+ const overlays = host.getSelectedOverlays();
15
+ overlays.forEach((overlay, i) => {
16
+ if (i < elements.length && elements[i]) {
17
+ host.positionOverlay(overlay, elements[i]);
18
+ }
19
+ });
20
+ };
21
+ const reportEdit = (element) => {
22
+ const originalContent = element.dataset.originalTextContent;
23
+ const newContent = element.textContent;
24
+ const svgElement = element;
25
+ const rect = element.getBoundingClientRect();
26
+ window.parent.postMessage({
27
+ type: "inline-edit",
28
+ elementInfo: {
29
+ tagName: element.tagName,
30
+ classes: svgElement.className?.baseVal ||
31
+ element.className ||
32
+ "",
33
+ visualSelectorId: host.getSelectedElementId(),
34
+ content: newContent,
35
+ dataSourceLocation: element.dataset.sourceLocation,
36
+ isDynamicContent: element.dataset.dynamicContent === "true",
37
+ linenumber: element.dataset.linenumber,
38
+ filename: element.dataset.filename,
39
+ position: {
40
+ top: rect.top,
41
+ left: rect.left,
42
+ right: rect.right,
43
+ bottom: rect.bottom,
44
+ width: rect.width,
45
+ height: rect.height,
46
+ centerX: rect.left + rect.width / 2,
47
+ centerY: rect.top + rect.height / 2,
48
+ },
49
+ },
50
+ originalContent,
51
+ newContent,
52
+ }, "*");
53
+ element.dataset.originalTextContent = newContent || "";
54
+ };
55
+ const debouncedReport = (element) => {
56
+ if (debouncedSendTimeout)
57
+ clearTimeout(debouncedSendTimeout);
58
+ debouncedSendTimeout = setTimeout(() => reportEdit(element), DEBOUNCE_MS);
59
+ };
60
+ const onTextInput = (element) => {
61
+ repositionOverlays();
62
+ debouncedReport(element);
63
+ };
64
+ const handleInputEvent = function () {
65
+ onTextInput(this);
66
+ };
67
+ const makeEditable = (element) => {
68
+ injectFocusOutlineCSS();
69
+ element.dataset.originalTextContent = element.textContent || "";
70
+ element.dataset.originalCursor = element.style.cursor;
71
+ element.contentEditable = "true";
72
+ const abortController = new AbortController();
73
+ listenerAbortControllers.set(element, abortController);
74
+ element.addEventListener("input", handleInputEvent, {
75
+ signal: abortController.signal,
76
+ });
77
+ element.style.cursor = "text";
78
+ selectText(element);
79
+ setTimeout(() => {
80
+ if (element.isConnected) {
81
+ element.focus();
82
+ }
83
+ }, 0);
84
+ };
85
+ const makeNonEditable = (element) => {
86
+ const abortController = listenerAbortControllers.get(element);
87
+ if (abortController) {
88
+ abortController.abort();
89
+ listenerAbortControllers.delete(element);
90
+ }
91
+ if (!element.isConnected)
92
+ return;
93
+ removeFocusOutlineCSS();
94
+ element.contentEditable = "false";
95
+ delete element.dataset.originalTextContent;
96
+ if (element.dataset.originalCursor !== undefined) {
97
+ element.style.cursor = element.dataset.originalCursor;
98
+ delete element.dataset.originalCursor;
99
+ }
100
+ };
101
+ // --- Public API ---
102
+ return {
103
+ get enabled() {
104
+ return enabled;
105
+ },
106
+ set enabled(value) {
107
+ enabled = value;
108
+ },
109
+ isEditing() {
110
+ return currentEditingElement !== null;
111
+ },
112
+ getCurrentElement() {
113
+ return currentEditingElement;
114
+ },
115
+ canEdit(element) {
116
+ return shouldEnterInlineEditingMode(element);
117
+ },
118
+ startEditing(element) {
119
+ currentEditingElement = element;
120
+ host.getSelectedOverlays().forEach((o) => {
121
+ o.style.display = "none";
122
+ });
123
+ makeEditable(element);
124
+ window.parent.postMessage({
125
+ type: "content-editing-started",
126
+ visualSelectorId: host.getSelectedElementId(),
127
+ }, "*");
128
+ },
129
+ stopEditing() {
130
+ if (!currentEditingElement)
131
+ return;
132
+ if (debouncedSendTimeout) {
133
+ clearTimeout(debouncedSendTimeout);
134
+ debouncedSendTimeout = null;
135
+ }
136
+ const element = currentEditingElement;
137
+ makeNonEditable(element);
138
+ host.getSelectedOverlays().forEach((o) => {
139
+ o.style.display = "";
140
+ });
141
+ repositionOverlays();
142
+ window.parent.postMessage({
143
+ type: "content-editing-ended",
144
+ visualSelectorId: host.getSelectedElementId(),
145
+ }, "*");
146
+ currentEditingElement = null;
147
+ },
148
+ markElementsSelected(elements) {
149
+ elements.forEach((el) => {
150
+ if (el instanceof HTMLElement) {
151
+ el.dataset.selected = "true";
152
+ }
153
+ });
154
+ },
155
+ clearSelectedMarks(elementId) {
156
+ if (!elementId)
157
+ return;
158
+ host.findElementsById(elementId).forEach((el) => {
159
+ if (el instanceof HTMLElement) {
160
+ delete el.dataset.selected;
161
+ }
162
+ });
163
+ },
164
+ handleToggleMessage(data) {
165
+ if (!enabled)
166
+ return;
167
+ const elements = host.findElementsById(data.dataSourceLocation);
168
+ if (elements.length === 0 || !(elements[0] instanceof HTMLElement))
169
+ return;
170
+ const element = elements[0];
171
+ if (data.inlineEditingMode) {
172
+ if (!shouldEnterInlineEditingMode(element))
173
+ return;
174
+ // Select the element first if not already selected
175
+ if (host.getSelectedElementId() !== data.dataSourceLocation) {
176
+ this.stopEditing();
177
+ host.clearSelection();
178
+ this.markElementsSelected(elements);
179
+ host.createSelectionOverlays(elements, data.dataSourceLocation);
180
+ }
181
+ this.startEditing(element);
182
+ }
183
+ else {
184
+ if (currentEditingElement === element) {
185
+ this.stopEditing();
186
+ }
187
+ }
188
+ },
189
+ cleanup() {
190
+ this.stopEditing();
191
+ },
192
+ };
193
+ }
194
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const injectFocusOutlineCSS: () => void;
2
+ export declare const removeFocusOutlineCSS: () => void;
3
+ export declare const selectText: (element: HTMLElement) => void;
4
+ export declare const isEditableTextElement: (element: Element) => boolean;
5
+ export declare const shouldEnterInlineEditingMode: (element: Element) => boolean;
6
+ //# sourceMappingURL=dom-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-utils.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/dom-utils.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,qBAAqB,YAWjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAEjC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,SAAS,WAAW,SAM9C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,KAAG,OAQxD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,SAAS,OAAO,KAAG,OAK/D,CAAC"}
@@ -0,0 +1,49 @@
1
+ const FOCUS_STYLE_ID = "visual-edit-focus-styles";
2
+ const EDITABLE_TAGS = [
3
+ "div", "p", "h1", "h2", "h3", "h4", "h5", "h6",
4
+ "span", "li", "td", "a", "button", "label",
5
+ ];
6
+ export const injectFocusOutlineCSS = () => {
7
+ if (document.getElementById(FOCUS_STYLE_ID))
8
+ return;
9
+ const style = document.createElement("style");
10
+ style.id = FOCUS_STYLE_ID;
11
+ style.textContent = `
12
+ [data-selected="true"][contenteditable="true"]:focus {
13
+ outline: none !important;
14
+ }
15
+ `;
16
+ document.head.appendChild(style);
17
+ };
18
+ export const removeFocusOutlineCSS = () => {
19
+ document.getElementById(FOCUS_STYLE_ID)?.remove();
20
+ };
21
+ export const selectText = (element) => {
22
+ const range = document.createRange();
23
+ range.selectNodeContents(element);
24
+ const selection = window.getSelection();
25
+ selection?.removeAllRanges();
26
+ selection?.addRange(range);
27
+ };
28
+ export const isEditableTextElement = (element) => {
29
+ if (!(element instanceof HTMLElement))
30
+ return false;
31
+ if (!EDITABLE_TAGS.includes(element.tagName.toLowerCase()))
32
+ return false;
33
+ if (!element.textContent?.trim())
34
+ return false;
35
+ if (element.querySelector("img, video, canvas, svg"))
36
+ return false;
37
+ if (element.children?.length > 0)
38
+ return false;
39
+ if (element.dataset.dynamicContent === "true")
40
+ return false;
41
+ return true;
42
+ };
43
+ export const shouldEnterInlineEditingMode = (element) => {
44
+ if (!(element instanceof HTMLElement) || element.dataset.selected !== "true") {
45
+ return false;
46
+ }
47
+ return isEditableTextElement(element);
48
+ };
49
+ //# sourceMappingURL=dom-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-utils.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/dom-utils.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAElD,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACxC,IAAI,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;QAAE,OAAO;IAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,cAAc,CAAC;IAC1B,KAAK,CAAC,WAAW,GAAG;;;;GAInB,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACxC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAE,EAAE;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACxC,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAW,EAAE;IACjE,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,OAAO,CAAC,aAAa,CAAC,yBAAyB,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,OAAgB,EAAW,EAAE;IACxE,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createInlineEditController } from "./controller.js";
2
+ export type { InlineEditController, InlineEditHost } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createInlineEditController } from "./controller.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface InlineEditHost {
2
+ findElementsById(id: string | null): Element[];
3
+ getSelectedElementId(): string | null;
4
+ getSelectedOverlays(): HTMLDivElement[];
5
+ positionOverlay(overlay: HTMLDivElement, element: Element, isSelected?: boolean): void;
6
+ clearSelection(): void;
7
+ createSelectionOverlays(elements: Element[], elementId: string): void;
8
+ }
9
+ export interface ToggleInlineEditData {
10
+ dataSourceLocation: string;
11
+ inlineEditingMode: boolean;
12
+ }
13
+ export interface InlineEditController {
14
+ enabled: boolean;
15
+ isEditing(): boolean;
16
+ getCurrentElement(): HTMLElement | null;
17
+ canEdit(element: Element): boolean;
18
+ startEditing(element: HTMLElement): void;
19
+ stopEditing(): void;
20
+ markElementsSelected(elements: Element[]): void;
21
+ clearSelectedMarks(elementId: string | null): void;
22
+ handleToggleMessage(data: ToggleInlineEditData): void;
23
+ cleanup(): void;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,EAAE,CAAC;IAC/C,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAAC;IACtC,mBAAmB,IAAI,cAAc,EAAE,CAAC;IACxC,eAAe,CACb,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,OAAO,GACnB,IAAI,CAAC;IACR,cAAc,IAAI,IAAI,CAAC;IACvB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACvE;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,IAAI,OAAO,CAAC;IACrB,iBAAiB,IAAI,WAAW,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACzC,WAAW,IAAI,IAAI,CAAC;IACpB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACnD,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtD,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/capabilities/inline-edit/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ /** Style constants for the layer dropdown UI */
2
+ export declare const DROPDOWN_CONTAINER_STYLES: Record<string, string>;
3
+ export declare const DROPDOWN_ITEM_BASE_STYLES: Record<string, string>;
4
+ export declare const DROPDOWN_ITEM_ACTIVE_COLOR = "#526cff";
5
+ export declare const DROPDOWN_ITEM_ACTIVE_BG = "#DBEAFE";
6
+ export declare const DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT = "600";
7
+ export declare const DROPDOWN_ITEM_HOVER_BG = "#f1f5f9";
8
+ export declare const DEPTH_INDENT_PX = 10;
9
+ /** Chevron shown when dropdown is collapsed (click to expand) */
10
+ export declare const CHEVRON_COLLAPSED = " \u25BE";
11
+ /** Chevron shown when dropdown is expanded (click to collapse) */
12
+ export declare const CHEVRON_EXPANDED = " \u25B4";
13
+ export declare const BASE_PADDING_PX = 12;
14
+ export declare const LAYER_DROPDOWN_ATTR = "data-layer-dropdown";
15
+ /** Max instrumented ancestors to show above the selected element */
16
+ export declare const MAX_PARENT_DEPTH = 2;
17
+ /** Max instrumented depth levels to show below the selected element */
18
+ export declare const MAX_CHILD_DEPTH = 2;
19
+ //# sourceMappingURL=consts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../../src/injections/layer-dropdown/consts.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa5D,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ5D,CAAC;AAEF,eAAO,MAAM,0BAA0B,YAAY,CAAC;AACpD,eAAO,MAAM,uBAAuB,YAAY,CAAC;AACjD,eAAO,MAAM,gCAAgC,QAAQ,CAAC;AAEtD,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAEhD,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,uEAAuE;AACvE,eAAO,MAAM,eAAe,IAAI,CAAC"}
@@ -0,0 +1,40 @@
1
+ /** Style constants for the layer dropdown UI */
2
+ export const DROPDOWN_CONTAINER_STYLES = {
3
+ position: "absolute",
4
+ backgroundColor: "#ffffff",
5
+ border: "1px solid #e2e8f0",
6
+ borderRadius: "6px",
7
+ boxShadow: "0 4px 12px rgba(0, 0, 0, 0.15)",
8
+ fontSize: "12px",
9
+ minWidth: "120px",
10
+ maxHeight: "200px",
11
+ overflowY: "auto",
12
+ zIndex: "10001",
13
+ padding: "4px 0",
14
+ pointerEvents: "auto",
15
+ };
16
+ export const DROPDOWN_ITEM_BASE_STYLES = {
17
+ padding: "4px 12px",
18
+ cursor: "pointer",
19
+ color: "#334155",
20
+ backgroundColor: "transparent",
21
+ whiteSpace: "nowrap",
22
+ lineHeight: "1.5",
23
+ fontWeight: "400",
24
+ };
25
+ export const DROPDOWN_ITEM_ACTIVE_COLOR = "#526cff";
26
+ export const DROPDOWN_ITEM_ACTIVE_BG = "#DBEAFE";
27
+ export const DROPDOWN_ITEM_ACTIVE_FONT_WEIGHT = "600";
28
+ export const DROPDOWN_ITEM_HOVER_BG = "#f1f5f9";
29
+ export const DEPTH_INDENT_PX = 10;
30
+ /** Chevron shown when dropdown is collapsed (click to expand) */
31
+ export const CHEVRON_COLLAPSED = " \u25BE";
32
+ /** Chevron shown when dropdown is expanded (click to collapse) */
33
+ export const CHEVRON_EXPANDED = " \u25B4";
34
+ export const BASE_PADDING_PX = 12;
35
+ export const LAYER_DROPDOWN_ATTR = "data-layer-dropdown";
36
+ /** Max instrumented ancestors to show above the selected element */
37
+ export const MAX_PARENT_DEPTH = 2;
38
+ /** Max instrumented depth levels to show below the selected element */
39
+ export const MAX_CHILD_DEPTH = 2;
40
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../../src/injections/layer-dropdown/consts.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAC/D,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,SAAS;IAC1B,MAAM,EAAE,mBAAmB;IAC3B,YAAY,EAAE,KAAK;IACnB,SAAS,EAAE,gCAAgC;IAC3C,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,OAAO;IAChB,aAAa,EAAE,MAAM;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAC/D,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,eAAe,EAAE,aAAa;IAC9B,UAAU,EAAE,QAAQ;IACpB,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,SAAS,CAAC;AACpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AACjD,MAAM,CAAC,MAAM,gCAAgC,GAAG,KAAK,CAAC;AAEtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAEhD,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAC3C,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,uEAAuE;AACvE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Controller that encapsulates layer-dropdown integration logic */
2
+ import type { LayerControllerConfig, LayerController } from "./types.js";
3
+ export declare function createLayerController(config: LayerControllerConfig): LayerController;
4
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/injections/layer-dropdown/controller.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAUpE,OAAO,KAAK,EAAa,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAgGpF"}
@@ -0,0 +1,88 @@
1
+ /** Controller that encapsulates layer-dropdown integration logic */
2
+ import { getElementSelectorId } from "../utils.js";
3
+ import { buildLayerChain } from "./utils.js";
4
+ import { enhanceLabelWithChevron, showDropdown, closeDropdown, isDropdownOpen, } from "./dropdown-ui.js";
5
+ export function createLayerController(config) {
6
+ let layerPreviewOverlay = null;
7
+ let escapeHandler = null;
8
+ let dropdownSourceLayer = null;
9
+ const clearLayerPreview = () => {
10
+ if (layerPreviewOverlay && layerPreviewOverlay.parentNode) {
11
+ layerPreviewOverlay.remove();
12
+ }
13
+ layerPreviewOverlay = null;
14
+ };
15
+ const showLayerPreview = (layer) => {
16
+ clearLayerPreview();
17
+ if (getElementSelectorId(layer.element) === config.getSelectedElementId())
18
+ return;
19
+ layerPreviewOverlay = config.createPreviewOverlay(layer.element);
20
+ };
21
+ const selectLayer = (layer) => {
22
+ clearLayerPreview();
23
+ closeDropdown();
24
+ if (escapeHandler) {
25
+ document.removeEventListener("keydown", escapeHandler, true);
26
+ escapeHandler = null;
27
+ }
28
+ dropdownSourceLayer = null;
29
+ const firstOverlay = config.selectElement(layer.element);
30
+ attachToOverlay(firstOverlay, layer.element);
31
+ };
32
+ const restoreSelection = () => {
33
+ if (escapeHandler) {
34
+ document.removeEventListener("keydown", escapeHandler, true);
35
+ escapeHandler = null;
36
+ }
37
+ if (dropdownSourceLayer) {
38
+ selectLayer(dropdownSourceLayer);
39
+ dropdownSourceLayer = null;
40
+ }
41
+ };
42
+ const handleLabelClick = (e, label, element, layers, currentId) => {
43
+ e.stopPropagation();
44
+ e.preventDefault();
45
+ if (isDropdownOpen()) {
46
+ closeDropdown();
47
+ restoreSelection();
48
+ }
49
+ else {
50
+ dropdownSourceLayer = {
51
+ element,
52
+ tagName: element.tagName.toLowerCase(),
53
+ selectorId: currentId,
54
+ };
55
+ config.onDeselect();
56
+ escapeHandler = (ev) => {
57
+ if (ev.key === "Escape") {
58
+ ev.stopPropagation();
59
+ closeDropdown();
60
+ restoreSelection();
61
+ }
62
+ };
63
+ document.addEventListener("keydown", escapeHandler, true);
64
+ showDropdown(label, layers, element, { onSelect: selectLayer, onHover: showLayerPreview, onHoverEnd: clearLayerPreview });
65
+ }
66
+ };
67
+ const attachToOverlay = (overlay, element) => {
68
+ if (!overlay)
69
+ return;
70
+ const label = overlay.querySelector("div");
71
+ if (!label)
72
+ return;
73
+ const layers = buildLayerChain(element);
74
+ if (layers.length <= 1)
75
+ return;
76
+ const currentId = getElementSelectorId(element);
77
+ enhanceLabelWithChevron(label);
78
+ label.addEventListener("click", (e) => {
79
+ handleLabelClick(e, label, element, layers, currentId);
80
+ });
81
+ };
82
+ const cleanup = () => {
83
+ clearLayerPreview();
84
+ closeDropdown();
85
+ };
86
+ return { attachToOverlay, cleanup };
87
+ }
88
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/injections/layer-dropdown/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Dropdown UI component for layer navigation */
2
+ import type { LayerInfo, DropdownCallbacks } from "./types.js";
3
+ /** Create the dropdown DOM element with layer items */
4
+ export declare function createDropdownElement(layers: LayerInfo[], currentElement: Element | null, callbacks: DropdownCallbacks): HTMLDivElement;
5
+ /** Add chevron indicator and pointer-events to the label */
6
+ export declare function enhanceLabelWithChevron(label: HTMLDivElement): void;
7
+ /** Show the dropdown below the label element */
8
+ export declare function showDropdown(label: HTMLDivElement, layers: LayerInfo[], currentElement: Element | null, callbacks: DropdownCallbacks): void;
9
+ /** Close the active dropdown and clean up listeners */
10
+ export declare function closeDropdown(): void;
11
+ /** Check if a dropdown is currently visible */
12
+ export declare function isDropdownOpen(): boolean;
13
+ //# sourceMappingURL=dropdown-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-ui.d.ts","sourceRoot":"","sources":["../../../src/injections/layer-dropdown/dropdown-ui.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAgBjD,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA+C/D,uDAAuD;AACvD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EAAE,EACnB,cAAc,EAAE,OAAO,GAAG,IAAI,EAC9B,SAAS,EAAE,iBAAiB,GAC3B,cAAc,CAWhB;AAED,4DAA4D;AAC5D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAUnE;AAkED,gDAAgD;AAChD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,SAAS,EAAE,EACnB,cAAc,EAAE,OAAO,GAAG,IAAI,EAC9B,SAAS,EAAE,iBAAiB,GAC3B,IAAI,CAgCN;AAED,uDAAuD;AACvD,wBAAgB,aAAa,IAAI,IAAI,CAyBpC;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,IAAI,OAAO,CAExC"}