tree-element 0.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.
Files changed (182) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +221 -0
  3. package/lib/animation.d.ts +5 -0
  4. package/lib/animation.d.ts.map +1 -0
  5. package/lib/animation.js +39 -0
  6. package/lib/animation.js.map +1 -0
  7. package/lib/classNames.d.ts +34 -0
  8. package/lib/classNames.d.ts.map +1 -0
  9. package/lib/classNames.js +39 -0
  10. package/lib/classNames.js.map +1 -0
  11. package/lib/dataLoader.d.ts +25 -0
  12. package/lib/dataLoader.d.ts.map +1 -0
  13. package/lib/dataLoader.js +69 -0
  14. package/lib/dataLoader.js.map +1 -0
  15. package/lib/dragAndDropHandler/binarySearch.d.ts +3 -0
  16. package/lib/dragAndDropHandler/binarySearch.d.ts.map +1 -0
  17. package/lib/dragAndDropHandler/binarySearch.js +23 -0
  18. package/lib/dragAndDropHandler/binarySearch.js.map +1 -0
  19. package/lib/dragAndDropHandler/dragElement.d.ts +20 -0
  20. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -0
  21. package/lib/dragAndDropHandler/dragElement.js +39 -0
  22. package/lib/dragAndDropHandler/dragElement.js.map +1 -0
  23. package/lib/dragAndDropHandler/generateHitAreas.d.ts +13 -0
  24. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -0
  25. package/lib/dragAndDropHandler/generateHitAreas.js +130 -0
  26. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -0
  27. package/lib/dragAndDropHandler/index.d.ts +76 -0
  28. package/lib/dragAndDropHandler/index.d.ts.map +1 -0
  29. package/lib/dragAndDropHandler/index.js +311 -0
  30. package/lib/dragAndDropHandler/index.js.map +1 -0
  31. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts +11 -0
  32. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -0
  33. package/lib/dragAndDropHandler/iterateVisibleNodes.js +54 -0
  34. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -0
  35. package/lib/dragAndDropHandler/types.d.ts +11 -0
  36. package/lib/dragAndDropHandler/types.d.ts.map +1 -0
  37. package/lib/elementsRenderer.d.ts +53 -0
  38. package/lib/elementsRenderer.d.ts.map +1 -0
  39. package/lib/elementsRenderer.js +251 -0
  40. package/lib/elementsRenderer.js.map +1 -0
  41. package/lib/events.d.ts +224 -0
  42. package/lib/events.d.ts.map +1 -0
  43. package/lib/index.d.ts +367 -0
  44. package/lib/index.d.ts.map +1 -0
  45. package/lib/index.js +1098 -0
  46. package/lib/index.js.map +1 -0
  47. package/lib/keyHandler.d.ts +29 -0
  48. package/lib/keyHandler.d.ts.map +1 -0
  49. package/lib/keyHandler.js +107 -0
  50. package/lib/keyHandler.js.map +1 -0
  51. package/lib/methodTypes.d.ts +21 -0
  52. package/lib/methodTypes.d.ts.map +1 -0
  53. package/lib/mouseHandler.d.ts +60 -0
  54. package/lib/mouseHandler.d.ts.map +1 -0
  55. package/lib/mouseHandler.js +283 -0
  56. package/lib/mouseHandler.js.map +1 -0
  57. package/lib/mouseUtils.d.ts +9 -0
  58. package/lib/mouseUtils.d.ts.map +1 -0
  59. package/lib/mouseUtils.js +15 -0
  60. package/lib/mouseUtils.js.map +1 -0
  61. package/lib/node.d.ts +320 -0
  62. package/lib/node.d.ts.map +1 -0
  63. package/lib/node.js +737 -0
  64. package/lib/node.js.map +1 -0
  65. package/lib/nodeElement/borderDropHint.d.ts +9 -0
  66. package/lib/nodeElement/borderDropHint.d.ts.map +1 -0
  67. package/lib/nodeElement/borderDropHint.js +24 -0
  68. package/lib/nodeElement/borderDropHint.js.map +1 -0
  69. package/lib/nodeElement/folderElement.d.ts +22 -0
  70. package/lib/nodeElement/folderElement.d.ts.map +1 -0
  71. package/lib/nodeElement/folderElement.js +100 -0
  72. package/lib/nodeElement/folderElement.js.map +1 -0
  73. package/lib/nodeElement/ghostDropHint.d.ts +18 -0
  74. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -0
  75. package/lib/nodeElement/ghostDropHint.js +67 -0
  76. package/lib/nodeElement/ghostDropHint.js.map +1 -0
  77. package/lib/nodeElement/index.d.ts +28 -0
  78. package/lib/nodeElement/index.d.ts.map +1 -0
  79. package/lib/nodeElement/index.js +66 -0
  80. package/lib/nodeElement/index.js.map +1 -0
  81. package/lib/nodeUtils.d.ts +7 -0
  82. package/lib/nodeUtils.d.ts.map +1 -0
  83. package/lib/nodeUtils.js +4 -0
  84. package/lib/nodeUtils.js.map +1 -0
  85. package/lib/options.d.ts +310 -0
  86. package/lib/options.d.ts.map +1 -0
  87. package/lib/package.json +3 -0
  88. package/lib/positionUtils.d.ts +8 -0
  89. package/lib/positionUtils.d.ts.map +1 -0
  90. package/lib/positionUtils.js +14 -0
  91. package/lib/positionUtils.js.map +1 -0
  92. package/lib/requestUrl.d.ts +9 -0
  93. package/lib/requestUrl.d.ts.map +1 -0
  94. package/lib/requestUrl.js +37 -0
  95. package/lib/requestUrl.js.map +1 -0
  96. package/lib/saveStateHandler.d.ts +46 -0
  97. package/lib/saveStateHandler.d.ts.map +1 -0
  98. package/lib/saveStateHandler.js +204 -0
  99. package/lib/saveStateHandler.js.map +1 -0
  100. package/lib/scrollHandler/containerScrollParent.d.ts +12 -0
  101. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -0
  102. package/lib/scrollHandler/containerScrollParent.js +49 -0
  103. package/lib/scrollHandler/containerScrollParent.js.map +1 -0
  104. package/lib/scrollHandler/createScrollParent.d.ts +4 -0
  105. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -0
  106. package/lib/scrollHandler/createScrollParent.js +38 -0
  107. package/lib/scrollHandler/createScrollParent.js.map +1 -0
  108. package/lib/scrollHandler/documentScrollParent.d.ts +22 -0
  109. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -0
  110. package/lib/scrollHandler/documentScrollParent.js +71 -0
  111. package/lib/scrollHandler/documentScrollParent.js.map +1 -0
  112. package/lib/scrollHandler/scrollParent.d.ts +26 -0
  113. package/lib/scrollHandler/scrollParent.d.ts.map +1 -0
  114. package/lib/scrollHandler/scrollParent.js +79 -0
  115. package/lib/scrollHandler/scrollParent.js.map +1 -0
  116. package/lib/scrollHandler.d.ts +20 -0
  117. package/lib/scrollHandler.d.ts.map +1 -0
  118. package/lib/scrollHandler.js +41 -0
  119. package/lib/scrollHandler.js.map +1 -0
  120. package/lib/selectNodeHandler.d.ts +38 -0
  121. package/lib/selectNodeHandler.d.ts.map +1 -0
  122. package/lib/selectNodeHandler.js +166 -0
  123. package/lib/selectNodeHandler.js.map +1 -0
  124. package/lib/setDefaultOptions.d.ts +4 -0
  125. package/lib/setDefaultOptions.d.ts.map +1 -0
  126. package/lib/setDefaultOptions.js +86 -0
  127. package/lib/setDefaultOptions.js.map +1 -0
  128. package/lib/triggerCustomEvent.d.ts +3 -0
  129. package/lib/triggerCustomEvent.d.ts.map +1 -0
  130. package/lib/triggerCustomEvent.js +13 -0
  131. package/lib/triggerCustomEvent.js.map +1 -0
  132. package/lib/util.d.ts +3 -0
  133. package/lib/util.d.ts.map +1 -0
  134. package/lib/util.js +5 -0
  135. package/lib/util.js.map +1 -0
  136. package/lib/version.d.ts +3 -0
  137. package/lib/version.d.ts.map +1 -0
  138. package/lib/version.js +5 -0
  139. package/lib/version.js.map +1 -0
  140. package/package.json +110 -0
  141. package/src/animation.ts +48 -0
  142. package/src/classNames.ts +70 -0
  143. package/src/dataLoader.ts +92 -0
  144. package/src/dragAndDropHandler/binarySearch.ts +27 -0
  145. package/src/dragAndDropHandler/dragElement.ts +62 -0
  146. package/src/dragAndDropHandler/generateHitAreas.ts +195 -0
  147. package/src/dragAndDropHandler/index.ts +442 -0
  148. package/src/dragAndDropHandler/iterateVisibleNodes.ts +91 -0
  149. package/src/dragAndDropHandler/types.ts +12 -0
  150. package/src/elementsRenderer.ts +367 -0
  151. package/src/events.ts +237 -0
  152. package/src/header.txt +16 -0
  153. package/src/index.ts +1290 -0
  154. package/src/keyHandler.ts +139 -0
  155. package/src/methodTypes.ts +44 -0
  156. package/src/mouseHandler.ts +391 -0
  157. package/src/mouseUtils.ts +23 -0
  158. package/src/node.ts +831 -0
  159. package/src/nodeElement/borderDropHint.ts +37 -0
  160. package/src/nodeElement/folderElement.ts +140 -0
  161. package/src/nodeElement/ghostDropHint.ts +84 -0
  162. package/src/nodeElement/index.ts +103 -0
  163. package/src/nodeUtils.ts +12 -0
  164. package/src/options.ts +325 -0
  165. package/src/positionUtils.ts +18 -0
  166. package/src/requestUrl.ts +41 -0
  167. package/src/saveStateHandler.ts +279 -0
  168. package/src/scrollHandler/containerScrollParent.ts +71 -0
  169. package/src/scrollHandler/createScrollParent.ts +51 -0
  170. package/src/scrollHandler/documentScrollParent.ts +104 -0
  171. package/src/scrollHandler/scrollParent.ts +117 -0
  172. package/src/scrollHandler.ts +55 -0
  173. package/src/selectNodeHandler.ts +192 -0
  174. package/src/setDefaultOptions.ts +79 -0
  175. package/src/triggerCustomEvent.ts +14 -0
  176. package/src/util.ts +5 -0
  177. package/src/version.ts +4 -0
  178. package/tree_element.css +195 -0
  179. package/tree_element.debug.js +4153 -0
  180. package/tree_element.debug.js.map +1 -0
  181. package/tree_element.js +21 -0
  182. package/tree_element.js.map +1 -0
@@ -0,0 +1,311 @@
1
+ import { getElementPosition } from '../positionUtils.js';
2
+ import binarySearch from './binarySearch.js';
3
+ import DragElement from './dragElement.js';
4
+ import generateHitAreas from './generateHitAreas.js';
5
+
6
+ class DragAndDropHandler {
7
+ currentItem;
8
+ hitAreas;
9
+ hoveredArea;
10
+ isDragging;
11
+ _autoEscape;
12
+ _classNames;
13
+ _dragElement;
14
+ _getNodeElement;
15
+ _getNodeElementForNode;
16
+ _getScrollLeft;
17
+ _getTree;
18
+ _onCanMove;
19
+ _onCanMoveTo;
20
+ _onDragMove;
21
+ _onDragStop;
22
+ _onIsMoveHandle;
23
+ _openFolderDelay;
24
+ _openFolderTimer;
25
+ _openNode;
26
+ _previousGhost;
27
+ _refreshElements;
28
+ _slide;
29
+ _treeElement;
30
+ _triggerEvent;
31
+ constructor({
32
+ autoEscape,
33
+ classNames,
34
+ getNodeElement,
35
+ getNodeElementForNode,
36
+ getScrollLeft,
37
+ getTree,
38
+ onCanMove,
39
+ onCanMoveTo,
40
+ onDragMove,
41
+ onDragStop,
42
+ onIsMoveHandle,
43
+ openFolderDelay,
44
+ openNode,
45
+ refreshElements,
46
+ slide,
47
+ treeElement,
48
+ triggerEvent
49
+ }) {
50
+ this._autoEscape = autoEscape;
51
+ this._classNames = classNames;
52
+ this._getNodeElement = getNodeElement;
53
+ this._getNodeElementForNode = getNodeElementForNode;
54
+ this._getScrollLeft = getScrollLeft;
55
+ this._getTree = getTree;
56
+ this._onCanMove = onCanMove;
57
+ this._onCanMoveTo = onCanMoveTo;
58
+ this._onDragMove = onDragMove;
59
+ this._onDragStop = onDragStop;
60
+ this._onIsMoveHandle = onIsMoveHandle;
61
+ this._openFolderDelay = openFolderDelay;
62
+ this._openNode = openNode;
63
+ this._refreshElements = refreshElements;
64
+ this._slide = slide;
65
+ this._treeElement = treeElement;
66
+ this._triggerEvent = triggerEvent;
67
+ this.hoveredArea = null;
68
+ this.hitAreas = [];
69
+ this.isDragging = false;
70
+ this.currentItem = null;
71
+ this._dragElement = null;
72
+ this._openFolderTimer = null;
73
+ this._previousGhost = null;
74
+ }
75
+ mouseCapture(positionInfo) {
76
+ const element = positionInfo.target;
77
+ if (!this._mustCaptureElement(element)) {
78
+ return null;
79
+ }
80
+ if (this._onIsMoveHandle && !this._onIsMoveHandle(element)) {
81
+ return null;
82
+ }
83
+ let nodeElement = this._getNodeElement(element);
84
+ if (nodeElement && this._onCanMove) {
85
+ if (!this._onCanMove(nodeElement.node)) {
86
+ nodeElement = null;
87
+ }
88
+ }
89
+ this.currentItem = nodeElement;
90
+ return this.currentItem != null;
91
+ }
92
+ mouseDrag(positionInfo) {
93
+ if (!this.currentItem || !this._dragElement) {
94
+ return false;
95
+ }
96
+ this._dragElement.move(positionInfo.pageX, positionInfo.pageY);
97
+ const area = this._findHoveredArea(positionInfo.pageX, positionInfo.pageY);
98
+ if (area && this._canMoveToArea(area, this.currentItem)) {
99
+ if (!area.node.isFolder()) {
100
+ this._stopOpenFolderTimer();
101
+ }
102
+ if (this.hoveredArea !== area) {
103
+ this.hoveredArea = area;
104
+
105
+ // If this is a closed folder, start timer to open it
106
+ if (this._mustOpenFolderTimer(area)) {
107
+ this._startOpenFolderTimer(area.node);
108
+ } else {
109
+ this._stopOpenFolderTimer();
110
+ }
111
+ this._updateDropHint();
112
+ }
113
+ } else {
114
+ this._removeDropHint();
115
+ this._stopOpenFolderTimer();
116
+ this.hoveredArea = area;
117
+ }
118
+ if (!area) {
119
+ if (this._onDragMove) {
120
+ this._onDragMove(this.currentItem.node, positionInfo.originalEvent);
121
+ }
122
+ }
123
+ return true;
124
+ }
125
+ mouseStart(positionInfo) {
126
+ if (!this.currentItem) {
127
+ return false;
128
+ }
129
+ this.refresh();
130
+ const {
131
+ left,
132
+ top
133
+ } = getElementPosition(positionInfo.target);
134
+ const node = this.currentItem.node;
135
+ this._dragElement = new DragElement({
136
+ autoEscape: this._autoEscape ?? true,
137
+ classNames: this._classNames,
138
+ nodeName: node.name,
139
+ offsetX: positionInfo.pageX - left,
140
+ offsetY: positionInfo.pageY - top,
141
+ treeElement: this._treeElement
142
+ });
143
+ this.isDragging = true;
144
+ this.currentItem.element.classList.add(this._classNames.moving);
145
+ return true;
146
+ }
147
+ mouseStop(positionInfo) {
148
+ this._moveItem(positionInfo);
149
+ this._clear();
150
+ this._removeHover();
151
+ this._removeDropHint();
152
+ this._removeHitAreas();
153
+ const currentItem = this.currentItem;
154
+ if (this.currentItem) {
155
+ this.currentItem.element.classList.remove(this._classNames.moving);
156
+ this.currentItem = null;
157
+ }
158
+ this.isDragging = false;
159
+ if (!this.hoveredArea && currentItem) {
160
+ if (this._onDragStop) {
161
+ this._onDragStop(currentItem.node, positionInfo.originalEvent);
162
+ }
163
+ }
164
+ return false;
165
+ }
166
+ refresh() {
167
+ this._removeHitAreas();
168
+ if (this.currentItem) {
169
+ const currentNode = this.currentItem.node;
170
+ this._generateHitAreas(currentNode);
171
+ this.currentItem = this._getNodeElementForNode(currentNode);
172
+ if (this.isDragging) {
173
+ this.currentItem.element.classList.add(this._classNames.moving);
174
+ }
175
+ }
176
+ }
177
+ _canMoveToArea(area, currentItem) {
178
+ if (!this._onCanMoveTo) {
179
+ return true;
180
+ }
181
+ return this._onCanMoveTo(currentItem.node, area.node, area.position);
182
+ }
183
+ _clear() {
184
+ if (this._dragElement) {
185
+ this._dragElement.remove();
186
+ this._dragElement = null;
187
+ }
188
+ }
189
+ _findHoveredArea(x, y) {
190
+ const dimensions = this._getTreeDimensions();
191
+ if (x < dimensions.left || y < dimensions.top || x > dimensions.right || y > dimensions.bottom) {
192
+ return null;
193
+ }
194
+ return binarySearch(this.hitAreas, area => {
195
+ if (y < area.top) {
196
+ return 1;
197
+ } else if (y > area.bottom) {
198
+ return -1;
199
+ } else {
200
+ return 0;
201
+ }
202
+ });
203
+ }
204
+ _generateHitAreas(currentNode) {
205
+ const tree = this._getTree();
206
+ if (!tree) {
207
+ this.hitAreas = [];
208
+ } else {
209
+ this.hitAreas = generateHitAreas(tree, currentNode, this._getTreeDimensions().bottom);
210
+ }
211
+ }
212
+ _getTreeDimensions() {
213
+ // Return the dimensions of the tree. Add a margin to the bottom to allow
214
+ // to drag-and-drop after the last element.
215
+ const treePosition = getElementPosition(this._treeElement);
216
+ const left = treePosition.left + this._getScrollLeft();
217
+ const top = treePosition.top;
218
+ return {
219
+ bottom: top + this._treeElement.clientHeight + 16,
220
+ left,
221
+ right: left + this._treeElement.clientWidth,
222
+ top
223
+ };
224
+ }
225
+
226
+ /* Move the dragged node to the selected position in the tree. */
227
+ _moveItem(positionInfo) {
228
+ if (this.currentItem && this.hoveredArea?.position && this._canMoveToArea(this.hoveredArea, this.currentItem)) {
229
+ const movedNode = this.currentItem.node;
230
+ const targetNode = this.hoveredArea.node;
231
+ const position = this.hoveredArea.position;
232
+ const previousParent = movedNode.parent;
233
+ if (position === "inside") {
234
+ this.hoveredArea.node.is_open = true;
235
+ }
236
+ const doMove = () => {
237
+ const tree = this._getTree();
238
+ if (tree) {
239
+ tree.moveNode(movedNode, targetNode, position);
240
+ this._treeElement.textContent = "";
241
+ this._refreshElements(null);
242
+ }
243
+ };
244
+ if (this._triggerEvent("tree.move", {
245
+ moveInfo: {
246
+ doMove,
247
+ movedNode,
248
+ originalEvent: positionInfo.originalEvent,
249
+ position,
250
+ previousParent,
251
+ targetNode
252
+ }
253
+ })) {
254
+ doMove();
255
+ }
256
+ }
257
+ }
258
+ _mustCaptureElement(element) {
259
+ const nodeName = element.nodeName;
260
+ return nodeName !== "INPUT" && nodeName !== "SELECT" && nodeName !== "TEXTAREA";
261
+ }
262
+ _mustOpenFolderTimer(area) {
263
+ const node = area.node;
264
+ return node.isFolder() && !node.is_open && area.position === "inside";
265
+ }
266
+ _removeDropHint() {
267
+ if (this._previousGhost) {
268
+ this._previousGhost.remove();
269
+ }
270
+ }
271
+ _removeHitAreas() {
272
+ this.hitAreas = [];
273
+ }
274
+ _removeHover() {
275
+ this.hoveredArea = null;
276
+ }
277
+ _startOpenFolderTimer(folder) {
278
+ const openFolder = () => {
279
+ void this._openNode(folder, this._slide).then(() => {
280
+ this.refresh();
281
+ this._updateDropHint();
282
+ });
283
+ };
284
+ this._stopOpenFolderTimer();
285
+ const openFolderDelay = this._openFolderDelay;
286
+ if (openFolderDelay !== false) {
287
+ this._openFolderTimer = window.setTimeout(openFolder, openFolderDelay);
288
+ }
289
+ }
290
+ _stopOpenFolderTimer() {
291
+ if (this._openFolderTimer) {
292
+ clearTimeout(this._openFolderTimer);
293
+ this._openFolderTimer = null;
294
+ }
295
+ }
296
+ _updateDropHint() {
297
+ if (!this.hoveredArea) {
298
+ return;
299
+ }
300
+
301
+ // remove previous drop hint
302
+ this._removeDropHint();
303
+
304
+ // add new drop hint
305
+ const nodeElement = this._getNodeElementForNode(this.hoveredArea.node);
306
+ this._previousGhost = nodeElement.addDropHint(this.hoveredArea.position);
307
+ }
308
+ }
309
+
310
+ export { DragAndDropHandler };
311
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/dragAndDropHandler/index.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\nimport type {\n GetScrollLeft,\n GetTree,\n OpenNode,\n RefreshElements,\n TriggerEvent,\n} from \"../methodTypes\";\nimport type { PositionInfo } from \"../mouseUtils\";\nimport type { Node } from \"../node\";\nimport type NodeElement from \"../nodeElement\";\nimport type {\n DragMethod,\n OnCanMove,\n OnCanMoveTo,\n OnIsMoveHandle,\n} from \"../options\";\nimport type { DropHint, HitArea } from \"./types\";\n\nimport { getElementPosition } from \"../positionUtils\";\nimport binarySearch from \"./binarySearch\";\nimport DragElement from \"./dragElement\";\nimport generateHitAreas from \"./generateHitAreas\";\n\ninterface Dimensions {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\ninterface DragAndDropHandlerParams {\n autoEscape?: boolean;\n classNames: ClassNames;\n getNodeElement: GetNodeElement;\n getNodeElementForNode: GetNodeElementForNode;\n getScrollLeft: GetScrollLeft;\n getTree: GetTree;\n onCanMove?: OnCanMove;\n onCanMoveTo?: OnCanMoveTo;\n onDragMove?: DragMethod;\n onDragStop?: DragMethod;\n onIsMoveHandle?: OnIsMoveHandle;\n openFolderDelay: false | number;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n slide: boolean;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\ntype GetNodeElement = (element: HTMLElement) => NodeElement | null;\n\ntype GetNodeElementForNode = (node: Node) => NodeElement;\n\nexport class DragAndDropHandler {\n public currentItem: NodeElement | null;\n public hitAreas: HitArea[];\n public hoveredArea: HitArea | null;\n public isDragging: boolean;\n\n private autoEscape?: boolean;\n private classNames: ClassNames;\n private dragElement: DragElement | null;\n private getNodeElement: GetNodeElement;\n private getNodeElementForNode: GetNodeElementForNode;\n private getScrollLeft: GetScrollLeft;\n private getTree: GetTree;\n private onCanMove?: OnCanMove;\n private onCanMoveTo?: OnCanMoveTo;\n private onDragMove?: DragMethod;\n private onDragStop?: DragMethod;\n private onIsMoveHandle?: OnIsMoveHandle;\n private openFolderDelay: false | number;\n private openFolderTimer: null | number;\n private openNode: OpenNode;\n private previousGhost: DropHint | null;\n private refreshElements: RefreshElements;\n private slide: boolean;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n autoEscape,\n classNames,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openFolderDelay,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n }: DragAndDropHandlerParams) {\n this.autoEscape = autoEscape;\n this.classNames = classNames;\n this.getNodeElement = getNodeElement;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getScrollLeft = getScrollLeft;\n this.getTree = getTree;\n this.onCanMove = onCanMove;\n this.onCanMoveTo = onCanMoveTo;\n this.onDragMove = onDragMove;\n this.onDragStop = onDragStop;\n this.onIsMoveHandle = onIsMoveHandle;\n this.openFolderDelay = openFolderDelay;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.slide = slide;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n\n this.dragElement = null;\n this.openFolderTimer = null;\n this.previousGhost = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (this.onIsMoveHandle && !this.onIsMoveHandle(element)) {\n return null;\n }\n\n let nodeElement = this.getNodeElement(element);\n\n if (nodeElement && this.onCanMove) {\n if (!this.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (!this.currentItem || !this.dragElement) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area, this.currentItem)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.onDragMove) {\n this.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (!this.currentItem) {\n return false;\n }\n\n this.refresh();\n\n const { left, top } = getElementPosition(positionInfo.target);\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement({\n autoEscape: this.autoEscape ?? true,\n classNames: this.classNames,\n nodeName: node.name,\n offsetX: positionInfo.pageX - left,\n offsetY: positionInfo.pageY - top,\n treeElement: this.treeElement,\n });\n\n this.isDragging = true;\n this.currentItem.element.classList.add(this.classNames.moving);\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(this.classNames.moving);\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.onDragStop) {\n this.onDragStop(currentItem.node, positionInfo.originalEvent);\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n const currentNode = this.currentItem.node;\n this.generateHitAreas(currentNode);\n this.currentItem = this.getNodeElementForNode(currentNode);\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(this.classNames.moving);\n }\n }\n }\n\n private canMoveToArea(area: HitArea, currentItem: NodeElement): boolean {\n if (!this.onCanMoveTo) {\n return true;\n }\n\n return this.onCanMoveTo(currentItem.node, area.node, area.position);\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n return binarySearch<HitArea>(this.hitAreas, (area) => {\n if (y < area.top) {\n return 1;\n } else if (y > area.bottom) {\n return -1;\n } else {\n return 0;\n }\n });\n }\n\n private generateHitAreas(currentNode: Node): void {\n const tree = this.getTree();\n\n if (!tree) {\n this.hitAreas = [];\n } else {\n this.hitAreas = generateHitAreas(\n tree,\n currentNode,\n this.getTreeDimensions().bottom,\n );\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const treePosition = getElementPosition(this.treeElement);\n const left = treePosition.left + this.getScrollLeft();\n const top = treePosition.top;\n\n return {\n bottom: top + this.treeElement.clientHeight + 16,\n left,\n right: left + this.treeElement.clientWidth,\n top,\n };\n }\n\n /* Move the dragged node to the selected position in the tree. */\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea?.position &&\n this.canMoveToArea(this.hoveredArea, this.currentItem)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === \"inside\") {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n const tree = this.getTree();\n\n if (tree) {\n tree.moveNode(movedNode, targetNode, position);\n\n this.treeElement.textContent = \"\";\n this.refreshElements(null);\n }\n };\n\n if (this.triggerEvent(\"tree.move\", {\n moveInfo: {\n doMove,\n movedNode,\n originalEvent: positionInfo.originalEvent,\n position,\n previousParent,\n targetNode,\n },\n })) {\n doMove();\n }\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" &&\n nodeName !== \"SELECT\" &&\n nodeName !== \"TEXTAREA\"\n );\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return node.isFolder() && !node.is_open && area.position === \"inside\";\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n void this.openNode(folder, this.slide).then(() => {\n this.refresh();\n this.updateDropHint();\n });\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n}\n"],"names":["autoEscape","classNames","dragElement","getNodeElement","getNodeElementForNode","getScrollLeft","getTree","onCanMove","onCanMoveTo","onDragMove","onDragStop","onIsMoveHandle","openFolderDelay","openFolderTimer","openNode","previousGhost","refreshElements","slide","treeElement","triggerEvent","mustCaptureElement","findHoveredArea","canMoveToArea","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","moveItem","clear","removeHover","removeHitAreas","generateHitAreas","getTreeDimensions"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Node } from "../node.js";
2
+ interface Options {
3
+ handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;
4
+ handleClosedFolder: (node: Node, nextNode: Node | null, element: HTMLElement) => void;
5
+ handleFirstNode: (node: Node) => void;
6
+ handleNode: (node: Node, nextNode: Node | null, element: HTMLElement) => void;
7
+ handleOpenFolder: (node: Node, element: HTMLElement) => boolean;
8
+ }
9
+ declare const iterateVisibleNodes: (tree: Node, { handleAfterOpenFolder, handleClosedFolder, handleFirstNode, handleNode, handleOpenFolder, }: Options) => void;
10
+ export default iterateVisibleNodes;
11
+ //# sourceMappingURL=iterateVisibleNodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterateVisibleNodes.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/iterateVisibleNodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,UAAU,OAAO;IACb,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACnE,kBAAkB,EAAE,CAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,IAAI,GAAG,IAAI,EACrB,OAAO,EAAE,WAAW,KACnB,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACtC,UAAU,EAAE,CACR,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,IAAI,GAAG,IAAI,EACrB,OAAO,EAAE,WAAW,KACnB,IAAI,CAAC;IAQV,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;CACnE;AAED,QAAA,MAAM,mBAAmB,GACrB,MAAM,IAAI,EACV,+FAMG,OAAO,SAuDb,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,54 @@
1
+ const iterateVisibleNodes = (tree, {
2
+ handleAfterOpenFolder,
3
+ handleClosedFolder,
4
+ handleFirstNode,
5
+ handleNode,
6
+ handleOpenFolder
7
+ }) => {
8
+ let isFirstNode = true;
9
+ const iterate = (node, nextNode) => {
10
+ let mustIterateInside = (node.is_open === true || !node.element) && node.hasChildren();
11
+ let element = null;
12
+
13
+ // Is the element visible?
14
+ if (node.element?.offsetParent) {
15
+ element = node.element;
16
+ if (isFirstNode) {
17
+ handleFirstNode(node);
18
+ isFirstNode = false;
19
+ }
20
+ if (!node.hasChildren()) {
21
+ handleNode(node, nextNode, node.element);
22
+ } else if (node.is_open) {
23
+ if (!handleOpenFolder(node, node.element)) {
24
+ mustIterateInside = false;
25
+ }
26
+ } else {
27
+ handleClosedFolder(node, nextNode, element);
28
+ }
29
+ }
30
+ if (mustIterateInside) {
31
+ const childrenLength = node.children.length;
32
+ node.children.forEach((_, i) => {
33
+ const child = node.children[i];
34
+ if (child) {
35
+ if (i === childrenLength - 1) {
36
+ iterate(child, null);
37
+ } else {
38
+ const nextChild = node.children[i + 1];
39
+ if (nextChild) {
40
+ iterate(child, nextChild);
41
+ }
42
+ }
43
+ }
44
+ });
45
+ if (node.is_open && element) {
46
+ handleAfterOpenFolder(node, nextNode);
47
+ }
48
+ }
49
+ };
50
+ iterate(tree, null);
51
+ };
52
+
53
+ export { iterateVisibleNodes as default };
54
+ //# sourceMappingURL=iterateVisibleNodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterateVisibleNodes.js","sources":["../../src/dragAndDropHandler/iterateVisibleNodes.ts"],"sourcesContent":["import type { Node } from \"../node\";\n\ninterface Options {\n handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;\n handleClosedFolder: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n handleFirstNode: (node: Node) => void;\n handleNode: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n handleOpenFolder: (node: Node, element: HTMLElement) => boolean;\n}\n\nconst iterateVisibleNodes = (\n tree: Node,\n {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n }: Options,\n) => {\n let isFirstNode = true;\n\n const iterate = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open === true || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n iterate(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n iterate(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n iterate(tree, null);\n};\n\nexport default iterateVisibleNodes;\n"],"names":[],"mappings":"AAyBA,MAAM,mBAAmB,GAAG,CACxB,IAAU,EACV;EACI,qBAAqB;EACrB,kBAAkB;EAClB,eAAe;EACf,UAAU;AACV,EAAA;AACK,CAAC,KACT;EACD,IAAI,WAAW,GAAG,IAAI;AAEtB,EAAA,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,QAAqB,KAAW;AACzD,IAAA,IAAI,iBAAiB,GACjB,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE;IAElE,IAAI,OAA2B,GAAG,IAAI;;AAEtC;AACA,IAAA,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE;MAC5B,OAAO,GAAG,IAAI,CAAC,OAAO;AAEtB,MAAA,IAAI,WAAW,EAAE;QACb,eAAe,CAAC,IAAI,CAAC;AACrB,QAAA,WAAW,GAAG,KAAK;AACvB,MAAA;AAEA,MAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;QACrB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;AAC5C,MAAA,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;QACrB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;AACvC,UAAA,iBAAiB,GAAG,KAAK;AAC7B,QAAA;AACJ,MAAA,CAAC,MAAM;AACH,QAAA,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC/C,MAAA;AACJ,IAAA;AAEA,IAAA,IAAI,iBAAiB,EAAE;AACnB,MAAA,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;MAC3C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE9B,QAAA,IAAI,KAAK,EAAE;AACP,UAAA,IAAI,CAAC,KAAK,cAAc,GAAG,CAAC,EAAE;AAC1B,YAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACxB,UAAA,CAAC,MAAM;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtC,YAAA,IAAI,SAAS,EAAE;AACX,cAAA,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AAC7B,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA,CAAC,CAAC;AAEF,MAAA,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE;AACzB,QAAA,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC;AACzC,MAAA;AACJ,IAAA;EACJ,CAAC;AAED,EAAA,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AACvB;;"}
@@ -0,0 +1,11 @@
1
+ import type { Node, Position } from "../node.js";
2
+ export interface DropHint {
3
+ remove: () => void;
4
+ }
5
+ export interface HitArea {
6
+ bottom: number;
7
+ node: Node;
8
+ position: Position;
9
+ top: number;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,53 @@
1
+ import type { ClassNames } from "./classNames.js";
2
+ import type { GetTree, IsNodeSelected } from "./methodTypes.js";
3
+ import type { Node } from "./node.js";
4
+ import type { IconElement, OnCreateLi } from "./options.js";
5
+ interface ElementsRendererParams {
6
+ autoEscape: boolean;
7
+ buttonLeft: boolean;
8
+ classNames: ClassNames;
9
+ closedIcon?: IconElement;
10
+ dragAndDrop: boolean;
11
+ getTree: GetTree;
12
+ htmlElement: HTMLElement;
13
+ isNodeSelected: IsNodeSelected;
14
+ onCreateLi?: OnCreateLi;
15
+ openedIcon?: IconElement;
16
+ rtl?: boolean;
17
+ setNodeElement: (element: HTMLElement, node: Node) => void;
18
+ showEmptyFolder: boolean;
19
+ tabIndex?: number;
20
+ }
21
+ export default class ElementsRenderer {
22
+ closedIconElement?: HTMLElement | Text;
23
+ openedIconElement?: HTMLElement | Text;
24
+ private autoEscape;
25
+ private buttonLeft;
26
+ private classNames;
27
+ private dragAndDrop;
28
+ private getTree;
29
+ private htmlElement;
30
+ private isNodeSelected;
31
+ private onCreateLi?;
32
+ private rtl?;
33
+ private setNodeElement;
34
+ private showEmptyFolder;
35
+ private tabIndex?;
36
+ constructor({ autoEscape, buttonLeft, classNames, closedIcon, dragAndDrop, getTree, htmlElement, isNodeSelected, onCreateLi, openedIcon, rtl, setNodeElement, showEmptyFolder, tabIndex, }: ElementsRendererParams);
37
+ render(fromNode: Node | null): void;
38
+ renderFromNode(node: Node): void;
39
+ renderFromRoot(): void;
40
+ private attachNodeData;
41
+ private createButtonElement;
42
+ private createDomElements;
43
+ private createFolderLi;
44
+ private createLi;
45
+ private createNodeLi;
46
+ private createTitleSpan;
47
+ private createUl;
48
+ private getButtonClasses;
49
+ private getFolderClasses;
50
+ private setTreeItemAriaAttributes;
51
+ }
52
+ export {};
53
+ //# sourceMappingURL=elementsRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementsRenderer.d.ts","sourceRoot":"","sources":["../src/elementsRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAIzD,UAAU,sBAAsB;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC3D,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAC1B,iBAAiB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9C,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,GAAG,CAAC,CAAU;IACtB,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,UAAU,EACV,GAAG,EACH,cAAc,EACd,eAAe,EACf,QAAQ,GACX,EAAE,sBAAsB;IAiBlB,MAAM,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;IAQnC,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAahC,cAAc,IAAI,IAAI;IAU7B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,cAAc;IAyDtB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,YAAY;IAqCpB,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,yBAAyB;CAWpC"}