@node-edit-utils/core 2.3.2 → 2.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/canvas/helpers/getCanvasContainerOrBody.d.ts +1 -0
- package/dist/lib/canvas/helpers/getCanvasWindowValue.d.ts +1 -1
- package/dist/lib/helpers/adjustForZoom.d.ts +1 -0
- package/dist/lib/helpers/createDragHandler.d.ts +69 -0
- package/dist/lib/helpers/getNodeProvider.d.ts +1 -0
- package/dist/lib/helpers/getNodeTools.d.ts +2 -0
- package/dist/lib/helpers/getViewportDimensions.d.ts +4 -0
- package/dist/lib/helpers/index.d.ts +9 -1
- package/dist/lib/helpers/parseTransform.d.ts +8 -0
- package/dist/lib/helpers/toggleClass.d.ts +1 -0
- package/dist/lib/viewport/label/getViewportLabelOverlay.d.ts +1 -0
- package/dist/lib/viewport/label/helpers/selectFirstViewportNode.d.ts +5 -0
- package/dist/lib/viewport/label/index.d.ts +5 -3
- package/dist/lib/viewport/label/isViewportDragging.d.ts +2 -0
- package/dist/lib/viewport/label/refreshViewportLabel.d.ts +8 -0
- package/dist/lib/viewport/label/removeViewportLabel.d.ts +5 -0
- package/dist/lib/viewport/label/setupViewportDrag.d.ts +1 -0
- package/dist/node-edit-utils.cjs.js +342 -280
- package/dist/node-edit-utils.esm.js +342 -280
- package/dist/node-edit-utils.umd.js +342 -280
- package/dist/node-edit-utils.umd.min.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +7 -2
- package/src/lib/canvas/createCanvasObserver.test.ts +242 -0
- package/src/lib/canvas/createCanvasObserver.ts +2 -2
- package/src/lib/canvas/disableCanvasKeyboard.test.ts +53 -0
- package/src/lib/canvas/disableCanvasKeyboard.ts +1 -1
- package/src/lib/canvas/disableCanvasTextMode.test.ts +53 -0
- package/src/lib/canvas/disableCanvasTextMode.ts +1 -1
- package/src/lib/canvas/enableCanvasKeyboard.test.ts +53 -0
- package/src/lib/canvas/enableCanvasKeyboard.ts +1 -1
- package/src/lib/canvas/enableCanvasTextMode.test.ts +53 -0
- package/src/lib/canvas/enableCanvasTextMode.ts +1 -1
- package/src/lib/canvas/helpers/applyCanvasState.test.ts +119 -0
- package/src/lib/canvas/helpers/applyCanvasState.ts +1 -1
- package/src/lib/canvas/helpers/getCanvasContainer.test.ts +62 -0
- package/src/lib/canvas/helpers/getCanvasContainerOrBody.test.ts +51 -0
- package/src/lib/canvas/helpers/getCanvasContainerOrBody.ts +6 -0
- package/src/lib/canvas/helpers/getCanvasWindowValue.test.ts +116 -0
- package/src/lib/canvas/helpers/getCanvasWindowValue.ts +2 -3
- package/src/lib/helpers/adjustForZoom.test.ts +65 -0
- package/src/lib/helpers/adjustForZoom.ts +4 -0
- package/src/lib/helpers/createDragHandler.test.ts +325 -0
- package/src/lib/helpers/createDragHandler.ts +171 -0
- package/src/lib/helpers/getNodeProvider.test.ts +71 -0
- package/src/lib/helpers/getNodeProvider.ts +4 -0
- package/src/lib/helpers/getNodeTools.test.ts +50 -0
- package/src/lib/helpers/getNodeTools.ts +6 -0
- package/src/lib/helpers/getViewportDimensions.test.ts +93 -0
- package/src/lib/helpers/getViewportDimensions.ts +7 -0
- package/src/lib/helpers/index.ts +9 -1
- package/src/lib/helpers/observer/connectMutationObserver.test.ts +127 -0
- package/src/lib/helpers/observer/connectResizeObserver.test.ts +147 -0
- package/src/lib/helpers/parseTransform.test.ts +117 -0
- package/src/lib/helpers/parseTransform.ts +9 -0
- package/src/lib/helpers/toggleClass.test.ts +71 -0
- package/src/lib/helpers/toggleClass.ts +9 -0
- package/src/lib/helpers/withRAF.test.ts +439 -0
- package/src/lib/node-tools/createNodeTools.test.ts +373 -0
- package/src/lib/node-tools/createNodeTools.ts +0 -1
- package/src/lib/node-tools/events/click/handleNodeClick.test.ts +109 -0
- package/src/lib/node-tools/events/setupEventListener.test.ts +136 -0
- package/src/lib/node-tools/highlight/clearHighlightFrame.test.ts +88 -0
- package/src/lib/node-tools/highlight/clearHighlightFrame.ts +2 -3
- package/src/lib/node-tools/highlight/createCornerHandles.test.ts +150 -0
- package/src/lib/node-tools/highlight/createHighlightFrame.test.ts +237 -0
- package/src/lib/node-tools/highlight/createHighlightFrame.ts +5 -9
- package/src/lib/node-tools/highlight/createTagLabel.test.ts +135 -0
- package/src/lib/node-tools/highlight/createToolsContainer.test.ts +97 -0
- package/src/lib/node-tools/highlight/createToolsContainer.ts +3 -6
- package/src/lib/node-tools/highlight/helpers/getElementBounds.test.ts +158 -0
- package/src/lib/node-tools/highlight/helpers/getElementBounds.ts +6 -5
- package/src/lib/node-tools/highlight/helpers/getHighlightFrameElement.test.ts +78 -0
- package/src/lib/node-tools/highlight/helpers/getHighlightFrameElement.ts +2 -3
- package/src/lib/node-tools/highlight/helpers/getScreenBounds.test.ts +133 -0
- package/src/lib/node-tools/highlight/highlightNode.test.ts +213 -0
- package/src/lib/node-tools/highlight/highlightNode.ts +7 -15
- package/src/lib/node-tools/highlight/refreshHighlightFrame.test.ts +323 -0
- package/src/lib/node-tools/highlight/refreshHighlightFrame.ts +12 -42
- package/src/lib/node-tools/highlight/updateHighlightFrameVisibility.test.ts +110 -0
- package/src/lib/node-tools/highlight/updateHighlightFrameVisibility.ts +2 -3
- package/src/lib/node-tools/select/helpers/getElementsFromPoint.test.ts +109 -0
- package/src/lib/node-tools/select/helpers/isInsideComponent.test.ts +81 -0
- package/src/lib/node-tools/select/helpers/isInsideViewport.test.ts +82 -0
- package/src/lib/node-tools/select/helpers/targetSameCandidates.test.ts +81 -0
- package/src/lib/node-tools/select/selectNode.test.ts +238 -0
- package/src/lib/node-tools/text/events/setupKeydownHandler.test.ts +91 -0
- package/src/lib/node-tools/text/events/setupMutationObserver.test.ts +213 -0
- package/src/lib/node-tools/text/events/setupNodeListeners.test.ts +133 -0
- package/src/lib/node-tools/text/helpers/enterTextEditMode.test.ts +50 -0
- package/src/lib/node-tools/text/helpers/handleTextChange.test.ts +201 -0
- package/src/lib/node-tools/text/helpers/hasTextContent.test.ts +101 -0
- package/src/lib/node-tools/text/helpers/insertLineBreak.test.ts +96 -0
- package/src/lib/node-tools/text/helpers/makeNodeEditable.test.ts +56 -0
- package/src/lib/node-tools/text/helpers/makeNodeNonEditable.test.ts +57 -0
- package/src/lib/node-tools/text/helpers/shouldEnterTextEditMode.test.ts +61 -0
- package/src/lib/node-tools/text/nodeText.test.ts +233 -0
- package/src/lib/post-message/processPostMessage.test.ts +218 -0
- package/src/lib/post-message/sendPostMessage.test.ts +120 -0
- package/src/lib/styles/styles.css +3 -3
- package/src/lib/viewport/createViewport.test.ts +267 -0
- package/src/lib/viewport/createViewport.ts +51 -51
- package/src/lib/viewport/events/setupEventListener.test.ts +103 -0
- package/src/lib/viewport/label/getViewportLabelOverlay.test.ts +77 -0
- package/src/lib/viewport/label/{getViewportLabelsOverlay.ts → getViewportLabelOverlay.ts} +6 -6
- package/src/lib/viewport/label/helpers/getLabelPosition.test.ts +51 -0
- package/src/lib/viewport/label/helpers/getLabelPosition.ts +3 -5
- package/src/lib/viewport/label/helpers/getTransformValues.test.ts +59 -0
- package/src/lib/viewport/label/helpers/getTransformValues.ts +3 -5
- package/src/lib/viewport/label/helpers/getZoomValue.test.ts +53 -0
- package/src/lib/viewport/label/helpers/selectFirstViewportNode.test.ts +105 -0
- package/src/lib/viewport/label/helpers/selectFirstViewportNode.ts +26 -0
- package/src/lib/viewport/label/index.ts +5 -3
- package/src/lib/viewport/label/isViewportDragging.test.ts +35 -0
- package/src/lib/viewport/label/isViewportDragging.ts +9 -0
- package/src/lib/viewport/label/refreshViewportLabel.test.ts +105 -0
- package/src/lib/viewport/label/refreshViewportLabel.ts +50 -0
- package/src/lib/viewport/label/refreshViewportLabels.test.ts +107 -0
- package/src/lib/viewport/label/refreshViewportLabels.ts +19 -52
- package/src/lib/viewport/label/removeViewportLabel.test.ts +67 -0
- package/src/lib/viewport/label/removeViewportLabel.ts +20 -0
- package/src/lib/viewport/label/setupViewportDrag.test.ts +249 -0
- package/src/lib/viewport/label/setupViewportDrag.ts +70 -0
- package/src/lib/viewport/resize/createResizeHandle.test.ts +37 -0
- package/src/lib/viewport/resize/createResizePresets.test.ts +75 -0
- package/src/lib/viewport/resize/updateActivePreset.test.ts +92 -0
- package/src/lib/viewport/width/calcConstrainedWidth.test.ts +47 -0
- package/src/lib/viewport/width/calcWidth.test.ts +68 -0
- package/src/lib/viewport/width/updateWidth.test.ts +78 -0
- package/src/lib/window/bindToWindow.test.ts +166 -0
- package/src/lib/window/bindToWindow.ts +1 -2
- package/dist/lib/viewport/label/getViewportLabelsOverlay.d.ts +0 -1
- package/dist/lib/viewport/label/isViewportLabelDragging.d.ts +0 -2
- package/dist/lib/viewport/label/setupViewportLabelDrag.d.ts +0 -1
- package/src/lib/viewport/label/isViewportLabelDragging.ts +0 -9
- package/src/lib/viewport/label/setupViewportLabelDrag.ts +0 -98
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import * as getCanvasContainerOrBodyModule from "@/lib/canvas/helpers/getCanvasContainerOrBody";
|
|
3
|
+
import * as getHighlightFrameElementModule from "./helpers/getHighlightFrameElement";
|
|
4
|
+
import { updateHighlightFrameVisibility } from "./updateHighlightFrameVisibility";
|
|
5
|
+
|
|
6
|
+
vi.mock("@/lib/canvas/helpers/getCanvasContainerOrBody");
|
|
7
|
+
vi.mock("./helpers/getHighlightFrameElement");
|
|
8
|
+
|
|
9
|
+
describe("updateHighlightFrameVisibility", () => {
|
|
10
|
+
let container: HTMLElement;
|
|
11
|
+
let frame: SVGSVGElement;
|
|
12
|
+
let toolsWrapper: HTMLElement;
|
|
13
|
+
let node: HTMLElement;
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
container = document.createElement("div");
|
|
17
|
+
document.body.appendChild(container);
|
|
18
|
+
|
|
19
|
+
frame = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
20
|
+
frame.classList.add("highlight-frame-overlay");
|
|
21
|
+
container.appendChild(frame);
|
|
22
|
+
|
|
23
|
+
toolsWrapper = document.createElement("div");
|
|
24
|
+
toolsWrapper.classList.add("highlight-frame-tools-wrapper");
|
|
25
|
+
container.appendChild(toolsWrapper);
|
|
26
|
+
|
|
27
|
+
node = document.createElement("div");
|
|
28
|
+
document.body.appendChild(node);
|
|
29
|
+
|
|
30
|
+
vi.mocked(getCanvasContainerOrBodyModule.getCanvasContainerOrBody).mockReturnValue(container);
|
|
31
|
+
vi.mocked(getHighlightFrameElementModule.getHighlightFrameElement).mockReturnValue(frame);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
if (document.body.contains(container)) {
|
|
36
|
+
document.body.removeChild(container);
|
|
37
|
+
}
|
|
38
|
+
if (document.body.contains(node)) {
|
|
39
|
+
document.body.removeChild(node);
|
|
40
|
+
}
|
|
41
|
+
vi.clearAllMocks();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should set display to empty string when node is visible", () => {
|
|
45
|
+
updateHighlightFrameVisibility(node);
|
|
46
|
+
|
|
47
|
+
expect(frame.style.display).toBe("");
|
|
48
|
+
expect(toolsWrapper.style.display).toBe("");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should set display to none when node has hidden class", () => {
|
|
52
|
+
node.classList.add("hidden");
|
|
53
|
+
|
|
54
|
+
updateHighlightFrameVisibility(node);
|
|
55
|
+
|
|
56
|
+
expect(frame.style.display).toBe("none");
|
|
57
|
+
expect(toolsWrapper.style.display).toBe("none");
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("should set display to none when node has select-none class", () => {
|
|
61
|
+
node.classList.add("select-none");
|
|
62
|
+
|
|
63
|
+
updateHighlightFrameVisibility(node);
|
|
64
|
+
|
|
65
|
+
expect(frame.style.display).toBe("none");
|
|
66
|
+
expect(toolsWrapper.style.display).toBe("none");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("should set display to none when node has both hidden and select-none classes", () => {
|
|
70
|
+
node.classList.add("hidden");
|
|
71
|
+
node.classList.add("select-none");
|
|
72
|
+
|
|
73
|
+
updateHighlightFrameVisibility(node);
|
|
74
|
+
|
|
75
|
+
expect(frame.style.display).toBe("none");
|
|
76
|
+
expect(toolsWrapper.style.display).toBe("none");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("should not update when frame does not exist", () => {
|
|
80
|
+
vi.mocked(getHighlightFrameElementModule.getHighlightFrameElement).mockReturnValue(null);
|
|
81
|
+
|
|
82
|
+
expect(() => {
|
|
83
|
+
updateHighlightFrameVisibility(node);
|
|
84
|
+
}).not.toThrow();
|
|
85
|
+
|
|
86
|
+
expect(toolsWrapper.style.display).toBe("");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("should not update tools wrapper when it does not exist", () => {
|
|
90
|
+
container.removeChild(toolsWrapper);
|
|
91
|
+
|
|
92
|
+
updateHighlightFrameVisibility(node);
|
|
93
|
+
|
|
94
|
+
expect(frame.style.display).toBe("");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("should toggle visibility when classes change", () => {
|
|
98
|
+
updateHighlightFrameVisibility(node);
|
|
99
|
+
expect(frame.style.display).toBe("");
|
|
100
|
+
|
|
101
|
+
node.classList.add("hidden");
|
|
102
|
+
updateHighlightFrameVisibility(node);
|
|
103
|
+
expect(frame.style.display).toBe("none");
|
|
104
|
+
|
|
105
|
+
node.classList.remove("hidden");
|
|
106
|
+
updateHighlightFrameVisibility(node);
|
|
107
|
+
expect(frame.style.display).toBe("");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getCanvasContainerOrBody } from "@/lib/canvas/helpers/getCanvasContainerOrBody";
|
|
2
2
|
import { getHighlightFrameElement } from "./helpers/getHighlightFrameElement";
|
|
3
3
|
|
|
4
4
|
export const updateHighlightFrameVisibility = (node: HTMLElement): void => {
|
|
@@ -12,8 +12,7 @@ export const updateHighlightFrameVisibility = (node: HTMLElement): void => {
|
|
|
12
12
|
// Batch DOM writes
|
|
13
13
|
frame.style.display = displayValue;
|
|
14
14
|
|
|
15
|
-
const
|
|
16
|
-
const container = canvasContainer || document.body;
|
|
15
|
+
const container = getCanvasContainerOrBody();
|
|
17
16
|
const toolsWrapper = container.querySelector(".highlight-frame-tools-wrapper") as HTMLElement | null;
|
|
18
17
|
if (toolsWrapper) {
|
|
19
18
|
toolsWrapper.style.display = displayValue;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { getElementsFromPoint } from "./getElementsFromPoint";
|
|
3
|
+
|
|
4
|
+
describe("getElementsFromPoint", () => {
|
|
5
|
+
let nodeProvider: HTMLElement;
|
|
6
|
+
let element1: HTMLElement;
|
|
7
|
+
let element2: HTMLElement;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
nodeProvider = document.createElement("div");
|
|
11
|
+
nodeProvider.setAttribute("data-role", "node-provider");
|
|
12
|
+
document.body.appendChild(nodeProvider);
|
|
13
|
+
|
|
14
|
+
element1 = document.createElement("div");
|
|
15
|
+
element1.setAttribute("data-node-id", "node-1");
|
|
16
|
+
nodeProvider.appendChild(element1);
|
|
17
|
+
|
|
18
|
+
element2 = document.createElement("div");
|
|
19
|
+
element2.setAttribute("data-node-id", "node-2");
|
|
20
|
+
element1.appendChild(element2);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
if (document.body.contains(nodeProvider)) {
|
|
25
|
+
document.body.removeChild(nodeProvider);
|
|
26
|
+
}
|
|
27
|
+
vi.clearAllMocks();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("should return elements up to node-provider", () => {
|
|
31
|
+
const mockElements = [element2, element1, nodeProvider];
|
|
32
|
+
Object.defineProperty(document, "elementsFromPoint", {
|
|
33
|
+
value: vi.fn().mockReturnValue(mockElements),
|
|
34
|
+
writable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const result = getElementsFromPoint(100, 200);
|
|
39
|
+
|
|
40
|
+
expect(result).toEqual([element2, element1]);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should return empty array when node-provider is first element", () => {
|
|
44
|
+
const mockElements = [nodeProvider, element1, element2];
|
|
45
|
+
Object.defineProperty(document, "elementsFromPoint", {
|
|
46
|
+
value: vi.fn().mockReturnValue(mockElements),
|
|
47
|
+
writable: true,
|
|
48
|
+
configurable: true,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const result = getElementsFromPoint(100, 200);
|
|
52
|
+
|
|
53
|
+
expect(result).toEqual([]);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should return all elements before node-provider", () => {
|
|
57
|
+
const element3 = document.createElement("div");
|
|
58
|
+
const mockElements = [element3, element2, element1, nodeProvider];
|
|
59
|
+
Object.defineProperty(document, "elementsFromPoint", {
|
|
60
|
+
value: vi.fn().mockReturnValue(mockElements),
|
|
61
|
+
writable: true,
|
|
62
|
+
configurable: true,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const result = getElementsFromPoint(100, 200);
|
|
66
|
+
|
|
67
|
+
expect(result).toEqual([element3, element2, element1]);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("should return empty array when no elements", () => {
|
|
71
|
+
Object.defineProperty(document, "elementsFromPoint", {
|
|
72
|
+
value: vi.fn().mockReturnValue([]),
|
|
73
|
+
writable: true,
|
|
74
|
+
configurable: true,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const result = getElementsFromPoint(100, 200);
|
|
78
|
+
|
|
79
|
+
expect(result).toEqual([]);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("should return all elements when node-provider is not present", () => {
|
|
83
|
+
const mockElements = [element2, element1];
|
|
84
|
+
Object.defineProperty(document, "elementsFromPoint", {
|
|
85
|
+
value: vi.fn().mockReturnValue(mockElements),
|
|
86
|
+
writable: true,
|
|
87
|
+
configurable: true,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const result = getElementsFromPoint(100, 200);
|
|
91
|
+
|
|
92
|
+
expect(result).toEqual([element2, element1]);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("should handle node-provider in middle of elements", () => {
|
|
96
|
+
const element3 = document.createElement("div");
|
|
97
|
+
const mockElements = [element3, nodeProvider, element2, element1];
|
|
98
|
+
Object.defineProperty(document, "elementsFromPoint", {
|
|
99
|
+
value: vi.fn().mockReturnValue(mockElements),
|
|
100
|
+
writable: true,
|
|
101
|
+
configurable: true,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const result = getElementsFromPoint(100, 200);
|
|
105
|
+
|
|
106
|
+
expect(result).toEqual([element3]);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { isInsideComponent } from "./isInsideComponent";
|
|
3
|
+
|
|
4
|
+
describe("isInsideComponent", () => {
|
|
5
|
+
let nodeProvider: HTMLElement;
|
|
6
|
+
let component: HTMLElement;
|
|
7
|
+
let element: HTMLElement;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
nodeProvider = document.createElement("div");
|
|
11
|
+
nodeProvider.setAttribute("data-role", "node-provider");
|
|
12
|
+
document.body.appendChild(nodeProvider);
|
|
13
|
+
|
|
14
|
+
component = document.createElement("div");
|
|
15
|
+
component.setAttribute("data-instance", "true");
|
|
16
|
+
nodeProvider.appendChild(component);
|
|
17
|
+
|
|
18
|
+
element = document.createElement("div");
|
|
19
|
+
component.appendChild(element);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
if (document.body.contains(nodeProvider)) {
|
|
24
|
+
document.body.removeChild(nodeProvider);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should return true when element is inside component", () => {
|
|
29
|
+
const result = isInsideComponent(element);
|
|
30
|
+
|
|
31
|
+
expect(result).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should return true when element is nested inside component", () => {
|
|
35
|
+
const nested = document.createElement("div");
|
|
36
|
+
element.appendChild(nested);
|
|
37
|
+
|
|
38
|
+
const result = isInsideComponent(nested);
|
|
39
|
+
|
|
40
|
+
expect(result).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should return false when element is not inside component", () => {
|
|
44
|
+
const outsideElement = document.createElement("div");
|
|
45
|
+
nodeProvider.appendChild(outsideElement);
|
|
46
|
+
|
|
47
|
+
const result = isInsideComponent(outsideElement);
|
|
48
|
+
|
|
49
|
+
expect(result).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should stop at node-provider", () => {
|
|
53
|
+
const elementOutsideComponent = document.createElement("div");
|
|
54
|
+
nodeProvider.appendChild(elementOutsideComponent);
|
|
55
|
+
|
|
56
|
+
const result = isInsideComponent(elementOutsideComponent);
|
|
57
|
+
|
|
58
|
+
expect(result).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("should return false when element is direct child of node-provider", () => {
|
|
62
|
+
const directChild = document.createElement("div");
|
|
63
|
+
nodeProvider.appendChild(directChild);
|
|
64
|
+
|
|
65
|
+
const result = isInsideComponent(directChild);
|
|
66
|
+
|
|
67
|
+
expect(result).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("should handle component without data-instance attribute", () => {
|
|
71
|
+
const nonComponent = document.createElement("div");
|
|
72
|
+
nodeProvider.appendChild(nonComponent);
|
|
73
|
+
const child = document.createElement("div");
|
|
74
|
+
nonComponent.appendChild(child);
|
|
75
|
+
|
|
76
|
+
const result = isInsideComponent(child);
|
|
77
|
+
|
|
78
|
+
expect(result).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { isInsideViewport } from "./isInsideViewport";
|
|
3
|
+
|
|
4
|
+
describe("isInsideViewport", () => {
|
|
5
|
+
let nodeProvider: HTMLElement;
|
|
6
|
+
let viewport: HTMLElement;
|
|
7
|
+
let element: HTMLElement;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
nodeProvider = document.createElement("div");
|
|
11
|
+
nodeProvider.setAttribute("data-role", "node-provider");
|
|
12
|
+
document.body.appendChild(nodeProvider);
|
|
13
|
+
|
|
14
|
+
viewport = document.createElement("div");
|
|
15
|
+
viewport.classList.add("viewport");
|
|
16
|
+
nodeProvider.appendChild(viewport);
|
|
17
|
+
|
|
18
|
+
element = document.createElement("div");
|
|
19
|
+
viewport.appendChild(element);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
if (document.body.contains(nodeProvider)) {
|
|
24
|
+
document.body.removeChild(nodeProvider);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should return true when element is inside viewport", () => {
|
|
29
|
+
const result = isInsideViewport(element);
|
|
30
|
+
|
|
31
|
+
expect(result).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should return true when element is nested inside viewport", () => {
|
|
35
|
+
const nested = document.createElement("div");
|
|
36
|
+
element.appendChild(nested);
|
|
37
|
+
|
|
38
|
+
const result = isInsideViewport(nested);
|
|
39
|
+
|
|
40
|
+
expect(result).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should return false when element is not inside viewport", () => {
|
|
44
|
+
const outsideElement = document.createElement("div");
|
|
45
|
+
document.body.appendChild(outsideElement);
|
|
46
|
+
|
|
47
|
+
const result = isInsideViewport(outsideElement);
|
|
48
|
+
|
|
49
|
+
expect(result).toBe(false);
|
|
50
|
+
document.body.removeChild(outsideElement);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("should stop at node-provider", () => {
|
|
54
|
+
const elementOutsideViewport = document.createElement("div");
|
|
55
|
+
nodeProvider.appendChild(elementOutsideViewport);
|
|
56
|
+
|
|
57
|
+
const result = isInsideViewport(elementOutsideViewport);
|
|
58
|
+
|
|
59
|
+
expect(result).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("should return false when element is direct child of node-provider", () => {
|
|
63
|
+
const directChild = document.createElement("div");
|
|
64
|
+
nodeProvider.appendChild(directChild);
|
|
65
|
+
|
|
66
|
+
const result = isInsideViewport(directChild);
|
|
67
|
+
|
|
68
|
+
expect(result).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("should handle multiple viewports", () => {
|
|
72
|
+
const viewport2 = document.createElement("div");
|
|
73
|
+
viewport2.classList.add("viewport");
|
|
74
|
+
nodeProvider.appendChild(viewport2);
|
|
75
|
+
const element2 = document.createElement("div");
|
|
76
|
+
viewport2.appendChild(element2);
|
|
77
|
+
|
|
78
|
+
expect(isInsideViewport(element)).toBe(true);
|
|
79
|
+
expect(isInsideViewport(element2)).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { targetSameCandidates } from "./targetSameCandidates";
|
|
3
|
+
|
|
4
|
+
describe("targetSameCandidates", () => {
|
|
5
|
+
const element1 = document.createElement("div");
|
|
6
|
+
const element2 = document.createElement("div");
|
|
7
|
+
const element3 = document.createElement("div");
|
|
8
|
+
|
|
9
|
+
it("should return true when arrays are identical", () => {
|
|
10
|
+
const cache = [element1, element2, element3];
|
|
11
|
+
const current = [element1, element2, element3];
|
|
12
|
+
|
|
13
|
+
const result = targetSameCandidates(cache, current);
|
|
14
|
+
|
|
15
|
+
expect(result).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should return false when arrays have different lengths", () => {
|
|
19
|
+
const cache = [element1, element2];
|
|
20
|
+
const current = [element1, element2, element3];
|
|
21
|
+
|
|
22
|
+
const result = targetSameCandidates(cache, current);
|
|
23
|
+
|
|
24
|
+
expect(result).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("should return false when arrays have same length but different elements", () => {
|
|
28
|
+
const cache = [element1, element2];
|
|
29
|
+
const current = [element2, element3];
|
|
30
|
+
|
|
31
|
+
const result = targetSameCandidates(cache, current);
|
|
32
|
+
|
|
33
|
+
expect(result).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("should return false when arrays have same elements in different order", () => {
|
|
37
|
+
const cache = [element1, element2];
|
|
38
|
+
const current = [element2, element1];
|
|
39
|
+
|
|
40
|
+
const result = targetSameCandidates(cache, current);
|
|
41
|
+
|
|
42
|
+
expect(result).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should return true for empty arrays", () => {
|
|
46
|
+
const cache: Element[] = [];
|
|
47
|
+
const current: Element[] = [];
|
|
48
|
+
|
|
49
|
+
const result = targetSameCandidates(cache, current);
|
|
50
|
+
|
|
51
|
+
expect(result).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should return false when one array is empty", () => {
|
|
55
|
+
const cache: Element[] = [];
|
|
56
|
+
const current = [element1];
|
|
57
|
+
|
|
58
|
+
const result = targetSameCandidates(cache, current);
|
|
59
|
+
|
|
60
|
+
expect(result).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should return true for single element arrays with same element", () => {
|
|
64
|
+
const cache = [element1];
|
|
65
|
+
const current = [element1];
|
|
66
|
+
|
|
67
|
+
const result = targetSameCandidates(cache, current);
|
|
68
|
+
|
|
69
|
+
expect(result).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("should return false for single element arrays with different elements", () => {
|
|
73
|
+
const cache = [element1];
|
|
74
|
+
const current = [element2];
|
|
75
|
+
|
|
76
|
+
const result = targetSameCandidates(cache, current);
|
|
77
|
+
|
|
78
|
+
expect(result).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|