@lvce-editor/virtual-dom-worker 2.18.0 → 3.1.0
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/index.d.ts +2 -533
- package/dist/index.js +1 -1301
- package/dist/parts/AddPatch/AddPatch.js +1 -0
- package/dist/parts/ApplyPendingPatches/ApplyPendingPatches.js +17 -0
- package/dist/parts/AriaLive/AriaLive.js +1 -0
- package/dist/parts/AttributePatch/AttributePatch.js +1 -0
- package/dist/parts/DomEventListener/DomEventListener.js +1 -0
- package/dist/parts/GetKeys/GetKeys.js +5 -0
- package/dist/parts/GetTotalChildCount/GetTotalChildCount.js +11 -0
- package/dist/parts/InputEventType/InputEventType.js +8 -0
- package/dist/parts/IsKey/IsKey.js +3 -0
- package/dist/parts/Main/Main.js +6 -0
- package/dist/parts/MergeClassNames/MergeClassNames.js +3 -0
- package/dist/parts/MouseEventType/MouseEventType.js +2 -0
- package/dist/parts/NavigateChildPatch/NavigateChildPatch.js +1 -0
- package/dist/parts/NavigateParentPatch/NavigateParentPatch.js +1 -0
- package/dist/parts/NavigateSiblingPatch/NavigateSiblingPatch.js +1 -0
- package/dist/parts/Patch/Patch.js +1 -0
- package/dist/parts/PatchType/PatchType.js +10 -0
- package/dist/parts/Px/Px.js +6 -0
- package/dist/parts/RemoveAttributePatch/RemoveAttributePatch.js +1 -0
- package/dist/parts/RemoveChildPatch/RemoveChildPatch.js +1 -0
- package/dist/parts/RemovePatch/RemovePatch.js +1 -0
- package/dist/parts/ReplacePatch/ReplacePatch.js +1 -0
- package/dist/parts/Text/Text.js +8 -0
- package/dist/parts/TextPatch/TextPatch.js +1 -0
- package/dist/parts/VirtualDomDiff/VirtualDomDiff.js +176 -0
- package/dist/parts/VirtualDomNode/VirtualDomNode.js +1 -0
- package/dist/parts/WhenExpression/WhenExpression.js +54 -0
- package/package.json +4 -1
- package/src/index.ts +0 -1
- package/src/parts/AddPatch/AddPatch.ts +0 -6
- package/src/parts/ApplyPendingPatches/ApplyPendingPatches.ts +0 -22
- package/src/parts/AriaLive/AriaLive.ts +0 -1
- package/src/parts/AriaRoles/AriaRoles.ts +0 -18
- package/src/parts/AttributePatch/AttributePatch.ts +0 -5
- package/src/parts/ClassNames/ClassNames.ts +0 -233
- package/src/parts/DomEventListener/DomEventListener.ts +0 -6
- package/src/parts/GetKeys/GetKeys.ts +0 -7
- package/src/parts/GetTotalChildCount/GetTotalChildCount.ts +0 -16
- package/src/parts/InputEventType/InputEventType.ts +0 -15
- package/src/parts/IsKey/IsKey.ts +0 -3
- package/src/parts/KeyCode/KeyCode.ts +0 -149
- package/src/parts/KeyModifier/KeyModifier.ts +0 -4
- package/src/parts/Main/Main.ts +0 -14
- package/src/parts/MergeClassNames/MergeClassNames.ts +0 -3
- package/src/parts/MouseEventType/MouseEventType.ts +0 -3
- package/src/parts/NavigateChildPatch/NavigateChildPatch.ts +0 -4
- package/src/parts/NavigateParentPatch/NavigateParentPatch.ts +0 -3
- package/src/parts/NavigateSiblingPatch/NavigateSiblingPatch.ts +0 -4
- package/src/parts/Patch/Patch.ts +0 -22
- package/src/parts/PatchType/PatchType.ts +0 -10
- package/src/parts/Px/Px.ts +0 -7
- package/src/parts/RemoveAttributePatch/RemoveAttributePatch.ts +0 -4
- package/src/parts/RemoveChildPatch/RemoveChildPatch.ts +0 -4
- package/src/parts/RemovePatch/RemovePatch.ts +0 -4
- package/src/parts/ReplacePatch/ReplacePatch.ts +0 -7
- package/src/parts/Text/Text.ts +0 -10
- package/src/parts/TextPatch/TextPatch.ts +0 -4
- package/src/parts/VirtualDomDiff/VirtualDomDiff.ts +0 -202
- package/src/parts/VirtualDomElements/VirtualDomElements.ts +0 -57
- package/src/parts/VirtualDomNode/VirtualDomNode.ts +0 -4
- package/src/parts/WhenExpression/WhenExpression.ts +0 -53
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as PatchType from "../PatchType/PatchType.js";
|
|
2
|
+
export const applyPendingPatches = (patches, pendingPatches, skip) => {
|
|
3
|
+
for (let k = 0; k < pendingPatches.length - skip; k += 2) {
|
|
4
|
+
const type = pendingPatches[k];
|
|
5
|
+
const index = pendingPatches[k + 1];
|
|
6
|
+
if (type === PatchType.NavigateParent) {
|
|
7
|
+
patches.push({ type });
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
patches.push({
|
|
11
|
+
type,
|
|
12
|
+
index,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
pendingPatches.length = 0;
|
|
17
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const Polite = 'polite';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const InsertText = 'insertText';
|
|
2
|
+
export const DeleteContentBackward = 'deleteContentBackward';
|
|
3
|
+
export const DeleteContentForward = 'deleteContentForward';
|
|
4
|
+
export const DeleteWordForward = 'deleteWordForward';
|
|
5
|
+
export const DeleteWordBackward = 'deleteWordBackward';
|
|
6
|
+
export const InsertLineBreak = 'insertLineBreak';
|
|
7
|
+
export const InsertCompositionText = 'insertCompositionText';
|
|
8
|
+
export const InsertFromPaste = 'insertFromPaste';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AriaRoles, ClassNames, InputEventType, KeyCode, KeyModifier, MouseEventType, VirtualDomElements, WhenExpression, } from '@lvce-editor/constants';
|
|
2
|
+
export * as AriaLive from "../AriaLive/AriaLive.js";
|
|
3
|
+
export * from "../MergeClassNames/MergeClassNames.js";
|
|
4
|
+
export * from "../Px/Px.js";
|
|
5
|
+
export * from "../Text/Text.js";
|
|
6
|
+
export { diff } from "../VirtualDomDiff/VirtualDomDiff.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const SetText = 1;
|
|
2
|
+
export const Replace = 2;
|
|
3
|
+
export const SetAttribute = 3;
|
|
4
|
+
export const RemoveAttribute = 4;
|
|
5
|
+
export const Remove = 5;
|
|
6
|
+
export const Add = 6;
|
|
7
|
+
export const NavigateChild = 7;
|
|
8
|
+
export const NavigateParent = 8;
|
|
9
|
+
export const RemoveChild = 9;
|
|
10
|
+
export const NavigateSibling = 10;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { VirtualDomElements } from '@lvce-editor/constants';
|
|
2
|
+
import * as ApplyPendingPatches from "../ApplyPendingPatches/ApplyPendingPatches.js";
|
|
3
|
+
import * as GetKeys from "../GetKeys/GetKeys.js";
|
|
4
|
+
import * as GetTotalChildCount from "../GetTotalChildCount/GetTotalChildCount.js";
|
|
5
|
+
import * as PatchType from "../PatchType/PatchType.js";
|
|
6
|
+
export const diff = (oldNodes, newNodes) => {
|
|
7
|
+
const patches = [];
|
|
8
|
+
const pendingPatches = [];
|
|
9
|
+
let i = 0;
|
|
10
|
+
let j = 0;
|
|
11
|
+
let siblingOffset = 0;
|
|
12
|
+
let maxSiblingOffset = 1;
|
|
13
|
+
const indexStack = [0, 1];
|
|
14
|
+
while (i < oldNodes.length && j < newNodes.length) {
|
|
15
|
+
const oldNode = oldNodes[i];
|
|
16
|
+
const newNode = newNodes[j];
|
|
17
|
+
if (siblingOffset > 0) {
|
|
18
|
+
// pendingPatches.push(PatchType.NavigateSibling, siblingOffset)
|
|
19
|
+
}
|
|
20
|
+
// TODO maybe don't have the current element in indexstack
|
|
21
|
+
if (siblingOffset === maxSiblingOffset) {
|
|
22
|
+
indexStack.pop();
|
|
23
|
+
indexStack.pop();
|
|
24
|
+
pendingPatches.push(PatchType.NavigateParent, 0);
|
|
25
|
+
maxSiblingOffset = indexStack.pop();
|
|
26
|
+
siblingOffset = indexStack.pop() + 1;
|
|
27
|
+
}
|
|
28
|
+
while (siblingOffset === maxSiblingOffset) {
|
|
29
|
+
pendingPatches.push(PatchType.NavigateParent, 0);
|
|
30
|
+
maxSiblingOffset = indexStack.pop();
|
|
31
|
+
siblingOffset = indexStack.pop() + 1;
|
|
32
|
+
}
|
|
33
|
+
if (oldNode.type !== newNode.type) {
|
|
34
|
+
let skip = 0;
|
|
35
|
+
if (pendingPatches.length > 0 &&
|
|
36
|
+
pendingPatches.at(-2) === PatchType.NavigateChild) {
|
|
37
|
+
skip = 2;
|
|
38
|
+
}
|
|
39
|
+
ApplyPendingPatches.applyPendingPatches(patches, pendingPatches, skip);
|
|
40
|
+
const oldTotal = GetTotalChildCount.getTotalChildCount(oldNodes, i);
|
|
41
|
+
const newTotal = GetTotalChildCount.getTotalChildCount(newNodes, j);
|
|
42
|
+
patches.push({
|
|
43
|
+
type: PatchType.RemoveChild,
|
|
44
|
+
index: siblingOffset,
|
|
45
|
+
});
|
|
46
|
+
patches.push({
|
|
47
|
+
type: PatchType.Add,
|
|
48
|
+
nodes: newNodes.slice(j, j + newTotal),
|
|
49
|
+
});
|
|
50
|
+
siblingOffset++;
|
|
51
|
+
i += oldTotal;
|
|
52
|
+
j += newTotal;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (oldNode.type === VirtualDomElements.Text &&
|
|
56
|
+
newNode.type === VirtualDomElements.Text) {
|
|
57
|
+
if (oldNode.text !== newNode.text) {
|
|
58
|
+
if (siblingOffset !== 0) {
|
|
59
|
+
pendingPatches.push(PatchType.NavigateSibling, siblingOffset);
|
|
60
|
+
}
|
|
61
|
+
ApplyPendingPatches.applyPendingPatches(patches, pendingPatches, 0);
|
|
62
|
+
patches.push({
|
|
63
|
+
type: PatchType.SetText,
|
|
64
|
+
value: newNode.text,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
i++;
|
|
68
|
+
j++;
|
|
69
|
+
siblingOffset++;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const oldKeys = GetKeys.getKeys(oldNode);
|
|
73
|
+
const newKeys = GetKeys.getKeys(newNode);
|
|
74
|
+
let hasAttributeChanges = false;
|
|
75
|
+
for (const key of newKeys) {
|
|
76
|
+
if (oldNode[key] !== newNode[key]) {
|
|
77
|
+
hasAttributeChanges = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const key of oldKeys) {
|
|
82
|
+
if (!(key in newNode)) {
|
|
83
|
+
hasAttributeChanges = true;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (hasAttributeChanges) {
|
|
88
|
+
if (siblingOffset > 0) {
|
|
89
|
+
pendingPatches.push(PatchType.NavigateSibling, siblingOffset);
|
|
90
|
+
}
|
|
91
|
+
ApplyPendingPatches.applyPendingPatches(patches, pendingPatches, 0);
|
|
92
|
+
for (const key of newKeys) {
|
|
93
|
+
if (oldNode[key] !== newNode[key]) {
|
|
94
|
+
patches.push({
|
|
95
|
+
type: PatchType.SetAttribute,
|
|
96
|
+
key,
|
|
97
|
+
value: newNode[key],
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const key of oldKeys) {
|
|
102
|
+
if (!(key in newNode)) {
|
|
103
|
+
patches.push({
|
|
104
|
+
type: PatchType.RemoveAttribute,
|
|
105
|
+
key,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (oldNode.childCount && newNode.childCount) {
|
|
111
|
+
maxSiblingOffset = oldNode.childCount;
|
|
112
|
+
indexStack.push(0, maxSiblingOffset);
|
|
113
|
+
pendingPatches.push(PatchType.NavigateChild, 0);
|
|
114
|
+
i++;
|
|
115
|
+
j++;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (oldNode.childCount) {
|
|
119
|
+
ApplyPendingPatches.applyPendingPatches(patches, pendingPatches, 0);
|
|
120
|
+
for (let k = 0; k < oldNode.childCount; k++) {
|
|
121
|
+
patches.push({
|
|
122
|
+
type: PatchType.RemoveChild,
|
|
123
|
+
index: 0,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
i += GetTotalChildCount.getTotalChildCount(oldNodes, i);
|
|
127
|
+
j++;
|
|
128
|
+
siblingOffset++;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (newNode.childCount) {
|
|
132
|
+
ApplyPendingPatches.applyPendingPatches(patches, pendingPatches, 0);
|
|
133
|
+
const total = GetTotalChildCount.getTotalChildCount(newNodes, j);
|
|
134
|
+
patches.push({
|
|
135
|
+
type: PatchType.Add,
|
|
136
|
+
nodes: newNodes.slice(j + 1, j + total),
|
|
137
|
+
});
|
|
138
|
+
i++;
|
|
139
|
+
j += total;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
i++;
|
|
143
|
+
j++;
|
|
144
|
+
siblingOffset++;
|
|
145
|
+
}
|
|
146
|
+
while (i < oldNodes.length) {
|
|
147
|
+
if (indexStack.length !== 2) {
|
|
148
|
+
patches.push({
|
|
149
|
+
type: PatchType.NavigateParent,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
patches.push({
|
|
153
|
+
type: PatchType.RemoveChild,
|
|
154
|
+
index: siblingOffset,
|
|
155
|
+
});
|
|
156
|
+
i += GetTotalChildCount.getTotalChildCount(oldNodes, i);
|
|
157
|
+
indexStack.pop();
|
|
158
|
+
indexStack.pop();
|
|
159
|
+
}
|
|
160
|
+
while (j < newNodes.length) {
|
|
161
|
+
if (siblingOffset > 0) {
|
|
162
|
+
patches.push({
|
|
163
|
+
type: PatchType.NavigateSibling,
|
|
164
|
+
index: siblingOffset,
|
|
165
|
+
});
|
|
166
|
+
siblingOffset = 0;
|
|
167
|
+
}
|
|
168
|
+
const count = GetTotalChildCount.getTotalChildCount(newNodes, j);
|
|
169
|
+
patches.push({
|
|
170
|
+
type: PatchType.Add,
|
|
171
|
+
nodes: newNodes.slice(j, j + count),
|
|
172
|
+
});
|
|
173
|
+
j += count;
|
|
174
|
+
}
|
|
175
|
+
return patches;
|
|
176
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export const Empty = 0;
|
|
2
|
+
export const BrowserChromium = 1;
|
|
3
|
+
export const BrowserElectron = 2;
|
|
4
|
+
export const BrowserFirefox = 3;
|
|
5
|
+
export const FocusAbout = 4;
|
|
6
|
+
export const FocusActivityBar = 5;
|
|
7
|
+
export const FocusDebugInput = 6;
|
|
8
|
+
export const FocusDialog = 7;
|
|
9
|
+
export const FocusEditor = 12;
|
|
10
|
+
export const FocusEditorCompletions = 9;
|
|
11
|
+
export const FocusEditorImage = 10;
|
|
12
|
+
export const FocusEditorRename = 11;
|
|
13
|
+
export const FocusEditorText = 12;
|
|
14
|
+
export const FocusExplorer = 13;
|
|
15
|
+
export const FocusExplorerEditBox = 14;
|
|
16
|
+
export const FocusExtensions = 15;
|
|
17
|
+
export const FocusFindWidget = 16;
|
|
18
|
+
export const FocusLocationList = 17;
|
|
19
|
+
export const FocusMenu = 18;
|
|
20
|
+
export const FocusProblems = 19;
|
|
21
|
+
export const FocusQuickPickInput = 20;
|
|
22
|
+
export const FocusSearchInput = 21;
|
|
23
|
+
export const FocusSearchResults = 22;
|
|
24
|
+
export const FocusSimpleBrowserInput = 23;
|
|
25
|
+
export const FocusSourceControlInput = 24;
|
|
26
|
+
export const FocusTerminal = 25;
|
|
27
|
+
export const FocusTitleBarMenuBar = 26;
|
|
28
|
+
export const FocusViewletList = 27;
|
|
29
|
+
export const FocusOutput = 28;
|
|
30
|
+
export const FocusDebugConsoleInput = 29;
|
|
31
|
+
export const FocusDebugScope = 30;
|
|
32
|
+
export const FocusSearchReplaceInput = 31;
|
|
33
|
+
export const FocusSearchMatchCase = 32;
|
|
34
|
+
export const FocusSearchRegex = 33;
|
|
35
|
+
export const FocusSearchWholeWord = 34;
|
|
36
|
+
export const FocusSearchReplaceAll = 35;
|
|
37
|
+
export const FocusSearchPreserveCase = 36;
|
|
38
|
+
export const FocusSimpleBrowser = 37;
|
|
39
|
+
export const FocusSourceActions = 38;
|
|
40
|
+
export const FocusKeyBindingsTable = 39;
|
|
41
|
+
export const FocusConfirm = 40;
|
|
42
|
+
export const FocusColorPicker = 41;
|
|
43
|
+
export const FocusFindWidgetToggleReplace = 42;
|
|
44
|
+
export const FocusFindWidgetReplace = 43;
|
|
45
|
+
export const FocusFindWidgetRegex = 44;
|
|
46
|
+
export const FocusFindWidgetMatchCase = 45;
|
|
47
|
+
export const FocusFindWidgetReplaceButton = 46;
|
|
48
|
+
export const FocusFindWidgetReplaceAllButton = 47;
|
|
49
|
+
export const FocusFindWidgetCloseButton = 48;
|
|
50
|
+
export const FocusFindWidgetNextMatchButton = 49;
|
|
51
|
+
export const FocusFindWidgetPreviousMatchButton = 50;
|
|
52
|
+
export const FocusEditorHover = 51;
|
|
53
|
+
export const FocusEditorCodeGenerator = 52;
|
|
54
|
+
export const FocusKeyBindingsWhenExpression = 53;
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lvce-editor/virtual-dom-worker",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [],
|
|
7
7
|
"author": "",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"description": "",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@lvce-editor/constants": "^1.0.1"
|
|
12
|
+
},
|
|
10
13
|
"types": "dist/index.d.ts"
|
|
11
14
|
}
|
package/src/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './parts/Main/Main.ts'
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { Patch } from '../Patch/Patch.ts'
|
|
2
|
-
import * as PatchType from '../PatchType/PatchType.ts'
|
|
3
|
-
|
|
4
|
-
export const applyPendingPatches = (
|
|
5
|
-
patches: Patch[],
|
|
6
|
-
pendingPatches: number[],
|
|
7
|
-
skip: number,
|
|
8
|
-
): void => {
|
|
9
|
-
for (let k = 0; k < pendingPatches.length - skip; k += 2) {
|
|
10
|
-
const type = pendingPatches[k]
|
|
11
|
-
const index = pendingPatches[k + 1]
|
|
12
|
-
if (type === PatchType.NavigateParent) {
|
|
13
|
-
patches.push({ type })
|
|
14
|
-
} else {
|
|
15
|
-
patches.push({
|
|
16
|
-
type,
|
|
17
|
-
index,
|
|
18
|
-
} as Patch)
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
pendingPatches.length = 0
|
|
22
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const Polite = 'polite'
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export const Alert = 'alert'
|
|
2
|
-
export const Button = 'button'
|
|
3
|
-
export const CheckBox = 'checkbox'
|
|
4
|
-
export const ComboBox = 'combobox'
|
|
5
|
-
export const Document = 'document'
|
|
6
|
-
export const Group = 'group'
|
|
7
|
-
export const ListBox = 'listbox'
|
|
8
|
-
export const Log = 'log'
|
|
9
|
-
export const None = 'none'
|
|
10
|
-
export const Option = 'option'
|
|
11
|
-
export const Panel = 'panel'
|
|
12
|
-
export const ScrollBar = 'scrollbar'
|
|
13
|
-
export const Status = 'status'
|
|
14
|
-
export const Tab = 'tab'
|
|
15
|
-
export const TabList = 'tablist'
|
|
16
|
-
export const ToolBar = 'toolbar'
|
|
17
|
-
export const Tree = 'tree'
|
|
18
|
-
export const TreeItem = 'treeitem'
|