tree-element 0.4.0 → 0.4.1

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 (74) hide show
  1. package/README.md +22 -20
  2. package/lib/dataLoader.d.ts.map +1 -1
  3. package/lib/dataLoader.js +4 -1
  4. package/lib/dataLoader.js.map +1 -1
  5. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
  6. package/lib/dragAndDropHandler/generateHitAreas.js +3 -2
  7. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
  8. package/lib/dragAndDropHandler/index.d.ts +2 -4
  9. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  10. package/lib/dragAndDropHandler/index.js +2 -9
  11. package/lib/dragAndDropHandler/index.js.map +1 -1
  12. package/lib/elementsRenderer.d.ts +7 -2
  13. package/lib/elementsRenderer.d.ts.map +1 -1
  14. package/lib/elementsRenderer.js +70 -23
  15. package/lib/elementsRenderer.js.map +1 -1
  16. package/lib/events.d.ts +13 -7
  17. package/lib/events.d.ts.map +1 -1
  18. package/lib/folderOpenState.d.ts +8 -0
  19. package/lib/folderOpenState.d.ts.map +1 -0
  20. package/lib/folderOpenState.js +22 -0
  21. package/lib/folderOpenState.js.map +1 -0
  22. package/lib/index.d.ts +17 -16
  23. package/lib/index.d.ts.map +1 -1
  24. package/lib/index.js +93 -49
  25. package/lib/index.js.map +1 -1
  26. package/lib/keyHandler.d.ts +2 -0
  27. package/lib/keyHandler.d.ts.map +1 -1
  28. package/lib/keyHandler.js +18 -0
  29. package/lib/keyHandler.js.map +1 -1
  30. package/lib/mouseHandler.d.ts.map +1 -1
  31. package/lib/mouseHandler.js +12 -12
  32. package/lib/mouseHandler.js.map +1 -1
  33. package/lib/node.d.ts +12 -10
  34. package/lib/node.d.ts.map +1 -1
  35. package/lib/node.js +12 -10
  36. package/lib/node.js.map +1 -1
  37. package/lib/nodeElement/folderElement.d.ts +7 -5
  38. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  39. package/lib/nodeElement/folderElement.js +33 -53
  40. package/lib/nodeElement/folderElement.js.map +1 -1
  41. package/lib/options.d.ts +19 -17
  42. package/lib/options.d.ts.map +1 -1
  43. package/lib/options.js +12 -0
  44. package/lib/options.js.map +1 -0
  45. package/lib/saveStateHandler.d.ts.map +1 -1
  46. package/lib/saveStateHandler.js +6 -6
  47. package/lib/saveStateHandler.js.map +1 -1
  48. package/lib/selectNodeHandler.d.ts.map +1 -1
  49. package/lib/selectNodeHandler.js +13 -1
  50. package/lib/selectNodeHandler.js.map +1 -1
  51. package/lib/version.d.ts +1 -1
  52. package/lib/version.js +1 -1
  53. package/lib/version.js.map +1 -1
  54. package/package.json +35 -29
  55. package/src/dataLoader.ts +3 -1
  56. package/src/dragAndDropHandler/generateHitAreas.ts +3 -2
  57. package/src/dragAndDropHandler/index.ts +3 -17
  58. package/src/elementsRenderer.ts +84 -33
  59. package/src/events.ts +13 -7
  60. package/src/folderOpenState.ts +38 -0
  61. package/src/index.ts +109 -59
  62. package/src/keyHandler.ts +20 -0
  63. package/src/mouseHandler.ts +15 -13
  64. package/src/node.ts +12 -10
  65. package/src/nodeElement/folderElement.ts +45 -70
  66. package/src/options.ts +36 -17
  67. package/src/saveStateHandler.ts +5 -8
  68. package/src/selectNodeHandler.ts +12 -1
  69. package/src/version.ts +1 -1
  70. package/tree_element.css +32 -5
  71. package/tree_element.debug.js +291 -165
  72. package/tree_element.debug.js.map +1 -1
  73. package/tree_element.js +2 -2
  74. package/tree_element.js.map +1 -1
package/lib/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- Tree-element 0.4.0
2
+ Tree-element 0.4.1
3
3
 
4
4
  Copyright 2026 Marco Braak
5
5
 
@@ -26,6 +26,7 @@ import MouseHandler from './mouseHandler.js';
26
26
  import { Node } from './node.js';
27
27
  import NodeElement from './nodeElement/index.js';
28
28
  import FolderElement from './nodeElement/folderElement.js';
29
+ import { changeableOptions } from './options.js';
29
30
  import { getOffsetTop } from './positionUtils.js';
30
31
  import RequestUrl from './requestUrl.js';
31
32
  import SaveStateHandler from './saveStateHandler.js';
@@ -100,7 +101,6 @@ class TreeElement {
100
101
  rtl,
101
102
  saveState: saveStateOption,
102
103
  showEmptyFolder,
103
- slide,
104
104
  tabIndex
105
105
  } = this._options;
106
106
  let classNames = this._classNames;
@@ -189,7 +189,6 @@ class TreeElement {
189
189
  _openFolderDelay: openFolderDelay,
190
190
  _openNode: openNode,
191
191
  _refreshElements: refreshElements,
192
- _slide: slide,
193
192
  _treeElement: treeElement,
194
193
  _triggerEvent: triggerEvent
195
194
  });
@@ -288,8 +287,9 @@ class TreeElement {
288
287
  }
289
288
 
290
289
  /**
291
- * Inserts a new node between a node and its parent, taking the node as its
292
- * child.
290
+ * Inserts a new node between a node and its parent. The siblings of the node
291
+ * move along: the new node takes all children of the parent, and becomes its
292
+ * only child.
293
293
  *
294
294
  * @returns The new node, or `null` when the node has no parent.
295
295
  * @group Changing the tree
@@ -459,7 +459,7 @@ class TreeElement {
459
459
  }
460
460
 
461
461
  /**
462
- * Returns the current state — `open_nodes` and `selected_node` — whether or
462
+ * Returns the current state—`open_nodes` and `selected_node`—whether or
463
463
  * not `saveState` is enabled.
464
464
  *
465
465
  * @group State
@@ -478,7 +478,7 @@ class TreeElement {
478
478
  }
479
479
 
480
480
  /**
481
- * Returns the root node. It is not rendered; its `children` are the
481
+ * Returns the root node. It is not rendered, and its `children` are the
482
482
  * top-level nodes. Also available as the `tree` property.
483
483
  *
484
484
  * @group Finding nodes
@@ -589,7 +589,7 @@ class TreeElement {
589
589
  }
590
590
 
591
591
  /**
592
- * Opens a folder, and the folders above it. A node marked `load_on_demand`
592
+ * Opens a folder, and the folders that contain it. A node marked `load_on_demand`
593
593
  * is fetched first, so await the promise when you need to know it is really
594
594
  * open.
595
595
  *
@@ -605,7 +605,7 @@ class TreeElement {
605
605
  async openNode(node, slide) {
606
606
  let mustSlide = slide ?? this._options.slide;
607
607
  let doOpenNode = async (openedNode, slideOption) => {
608
- if (!node.children.length) {
608
+ if (!openedNode.children.length) {
609
609
  return;
610
610
  }
611
611
  let folderElement = this._createFolderElement(openedNode);
@@ -724,13 +724,43 @@ class TreeElement {
724
724
  }
725
725
 
726
726
  /**
727
- * Changes an option after construction. See
728
- * [Options](/reference/options#changing-an-option-later) for the caveats.
727
+ * Changes an option after construction. Only some options can be changed:
728
+ * the others throw an error. See
729
+ * [Options](/reference/options#changing-an-option-later).
729
730
  *
730
731
  * @group Other
731
732
  */
732
733
  setOption(option, value) {
734
+ if (!changeableOptions.includes(option)) {
735
+ throw new Error(`The option ${option} can only be set in the constructor`);
736
+ }
733
737
  this._options[option] = value;
738
+ switch (option) {
739
+ case "dragAndDrop":
740
+ {
741
+ this._renderer._setDragAndDrop(Boolean(value));
742
+ break;
743
+ }
744
+ case "keyboardSupport":
745
+ {
746
+ this._keyHandler._setKeyboardSupport(Boolean(value));
747
+ break;
748
+ }
749
+ case "multiSelect":
750
+ {
751
+ this._setMultiSelect(Boolean(value));
752
+ break;
753
+ }
754
+ case "tabIndex":
755
+ {
756
+ this._options.tabIndex = value ?? undefined;
757
+ this._renderer._setTabIndex(this._options.tabIndex);
758
+ this._fallbackTabStop = null;
759
+ this._updateTabStop();
760
+ break;
761
+ }
762
+ // No default
763
+ }
734
764
  }
735
765
 
736
766
  /**
@@ -763,8 +793,8 @@ class TreeElement {
763
793
  }
764
794
 
765
795
  /**
766
- * Returns the tree as a json string, including changes made through the
767
- * api.
796
+ * Returns the tree as a JSON string, including changes made through the
797
+ * API.
768
798
  *
769
799
  * @group Other
770
800
  */
@@ -777,7 +807,7 @@ class TreeElement {
777
807
  * name.
778
808
  *
779
809
  * Changing the `id` re-indexes the node. `children` and `parent` are
780
- * ignored — use `loadData` or `moveNode` for those.
810
+ * ignored—use `loadData` or `moveNode` for those.
781
811
  *
782
812
  * @example
783
813
  * ```js
@@ -828,9 +858,7 @@ class TreeElement {
828
858
  }
829
859
  _createFolderElement(node) {
830
860
  let classNames = this._classNames;
831
- let closedIconElement = this._renderer._closedIconElement;
832
861
  let getScrollLeft = this._scrollHandler._getScrollLeft.bind(this._scrollHandler);
833
- let openedIconElement = this._renderer._openedIconElement;
834
862
  let tabIndex = this._options.tabIndex;
835
863
  let treeElement = this._htmlElement;
836
864
  let triggerEvent = this._triggerEvent.bind(this);
@@ -845,11 +873,10 @@ class TreeElement {
845
873
  };
846
874
  return new FolderElement({
847
875
  _classNames: classNames,
848
- _closedIconElement: closedIconElement,
849
876
  _getScrollLeft: getScrollLeft,
877
+ _icons: this._renderer._icons,
850
878
  _multiSelect: this._options.multiSelect,
851
879
  _node: node,
852
- _openedIconElement: openedIconElement,
853
880
  _renderChildren: renderChildren,
854
881
  _tabIndex: tabIndex,
855
882
  _treeElement: treeElement,
@@ -945,14 +972,8 @@ class TreeElement {
945
972
  _getFocusedNode() {
946
973
  let activeElement = document.activeElement;
947
974
 
948
- /* istanbul ignore if */
949
- if (!activeElement) {
950
- return null;
951
- }
952
-
953
- // The keyboard must still work for input elements.
954
- let tagName = activeElement.tagName;
955
- if (tagName !== "A" && tagName !== "LI" && tagName !== "SPAN") {
975
+ // An active element must exist and the keyboard must still work for input elements.
976
+ if (!activeElement || !["A", "LI", "SPAN"].includes(activeElement.tagName)) {
956
977
  return null;
957
978
  }
958
979
  let node = this.getNode(activeElement);
@@ -1001,11 +1022,17 @@ class TreeElement {
1001
1022
  this._isInitialized = true;
1002
1023
  this._triggerEvent("tree.init");
1003
1024
  };
1025
+
1026
+ // Before the tree is replaced: then the focused node is no longer in it
1027
+ let focusedNode = this._getFocusedNode();
1004
1028
  this._tree = new this._options.nodeClass(null, true, this._options.nodeClass);
1005
1029
  this._selectNodeHandler._clear();
1006
1030
  this._tree.loadFromData(data);
1007
1031
  let mustLoadOnDemand = this._setInitialState();
1008
1032
  this._refreshElements(null);
1033
+ if (focusedNode) {
1034
+ this._restoreFocus(focusedNode);
1035
+ }
1009
1036
  if (mustLoadOnDemand) {
1010
1037
  // Load data on demand and then init the tree
1011
1038
  void this._setInitialStateOnDemand().then(doInit);
@@ -1013,15 +1040,6 @@ class TreeElement {
1013
1040
  doInit();
1014
1041
  }
1015
1042
  }
1016
-
1017
- // Does an HTML element of the tree have the focus?
1018
- _isFocusOnTree() {
1019
- return this._getFocusedNode() !== null;
1020
- }
1021
- _isSelectedNodeInSubtree(subtree) {
1022
- let selectedNode = this.getSelectedNode();
1023
- return selectedNode ? subtree === selectedNode || subtree.isParentOf(selectedNode) : false;
1024
- }
1025
1043
  async _loadFolderOnDemand(node, slide) {
1026
1044
  node.is_loading = true;
1027
1045
  await this.loadDataFromUrl(undefined, node);
@@ -1062,10 +1080,10 @@ class TreeElement {
1062
1080
  _mouseStop(positionInfo) {
1063
1081
  /* istanbul ignore if */
1064
1082
  if (!this._options.dragAndDrop) {
1065
- return false;
1083
+ return;
1066
1084
  }
1067
1085
  this._scrollHandler._stopScrolling();
1068
- return this._dndHandler._mouseStop(positionInfo);
1086
+ this._dndHandler._mouseStop(positionInfo);
1069
1087
  }
1070
1088
  _openParents(node) {
1071
1089
  let parent = node.parent;
@@ -1079,25 +1097,32 @@ class TreeElement {
1079
1097
  from_node: redraw this subtree
1080
1098
  */
1081
1099
  _refreshElements(fromNode) {
1082
- let mustSetFocus = this._isFocusOnTree();
1083
- let mustSelect = fromNode ? this._isSelectedNodeInSubtree(fromNode) : false;
1100
+ let focusedNode = this._getFocusedNode();
1101
+
1102
+ // The renderer marks the selected nodes, so only the focus needs restoring
1084
1103
  this._renderer._render(fromNode);
1085
- if (mustSelect) {
1086
- this._selectCurrentNode(mustSetFocus);
1104
+ if (focusedNode) {
1105
+ this._restoreFocus(focusedNode);
1087
1106
  }
1088
1107
  this._updateTabStop();
1089
1108
  this._triggerEvent("tree.refresh");
1090
1109
  }
1091
- _saveState() {
1092
- this._saveStateHandler._saveState();
1093
- }
1094
- _selectCurrentNode(mustSetFocus) {
1095
- let node = this.getSelectedNode();
1096
- if (!node) {
1110
+
1111
+ // Rendering replaces the elements of the nodes, so a focused element can be
1112
+ // gone. Then move the focus to the new element of the same node. After
1113
+ // loadData the nodes are new objects, so look the node up by its id.
1114
+ _restoreFocus(focusedNode) {
1115
+ if (this._htmlElement.contains(document.activeElement)) {
1097
1116
  return;
1098
1117
  }
1099
- let nodeElement = this._getNodeElementForNode(node);
1100
- nodeElement._select(mustSetFocus);
1118
+ let node = (focusedNode.id == null ? null : this.getNodeById(focusedNode.id)) ?? focusedNode;
1119
+ let element = node.element;
1120
+ if (element && this._htmlElement.contains(element)) {
1121
+ element.focus();
1122
+ }
1123
+ }
1124
+ _saveState() {
1125
+ this._saveStateHandler._saveState();
1101
1126
  }
1102
1127
 
1103
1128
  // Set initial state, either by restoring the state or auto-opening nodes
@@ -1152,6 +1177,25 @@ class TreeElement {
1152
1177
  }
1153
1178
  }
1154
1179
 
1180
+ /* Change multiSelect after construction. The attributes of the nodes
1181
+ * depend on it, so the tree is rendered again. The selection is kept: a
1182
+ * tree without multiSelect can also have several selected nodes, see
1183
+ * addToSelection.
1184
+ */
1185
+ _setMultiSelect(multiSelect) {
1186
+ let focusedNode = this._getFocusedNode();
1187
+ this._keyHandler._setMultiSelect(multiSelect);
1188
+ this._renderer._setMultiSelect(multiSelect);
1189
+ if (multiSelect) {
1190
+ this._htmlElement.addEventListener("focusin", this._handleFocusIn);
1191
+ } else {
1192
+ this._htmlElement.removeEventListener("focusin", this._handleFocusIn);
1193
+ }
1194
+ this._activeNode = multiSelect ? focusedNode : null;
1195
+ this._fallbackTabStop = null;
1196
+ this._refreshElements(null);
1197
+ }
1198
+
1155
1199
  // Set this HTML element to this node in the node map.
1156
1200
  _setNodeElement(element, node) {
1157
1201
  this._nodeMap.set(element, node);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { ClassNames } from \"./classNames\";\nimport type { TreeEventName, TreeEvents } from \"./events\";\nimport type { PositionInfo } from \"./mouseUtils\";\nimport type { NodeData, NodeId, Position } from \"./node\";\nimport type { TreeElementOptions } from \"./options\";\nimport type { SavedState } from \"./saveStateHandler\";\nimport type { SelectNodeOptions } from \"./selectNodeHandler\";\n\nimport createClassNames from \"./classNames\";\nimport DataLoader from \"./dataLoader\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { Node } from \"./node\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { getOffsetTop } from \"./positionUtils\";\nimport RequestUrl from \"./requestUrl\";\nimport SaveStateHandler from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport setDefaultOptions from \"./setDefaultOptions\";\nimport triggerCustomEvent from \"./triggerCustomEvent\";\nimport __version__ from \"./version\";\n\n// The types that appear in the public api. Consumers cannot import them from\n// the submodules directly, because those are not exposed in package.json.\n// Type only, so that the iife build keeps exposing the TreeElement class itself\n// as its global, instead of an object of named exports.\n\nexport type TriggerEventProvider = (\n element: HTMLElement,\n eventName: TreeEventName,\n values?: TreeEvents[TreeEventName],\n) => boolean;\n\ninterface TreeElementParams extends Partial<TreeElementOptions> {\n /**\n The element the tree is rendered into. Its content is replaced.\n */\n htmlElement: HTMLElement;\n /** Replaces how events are dispatched. It must return whether the event\n * was not cancelled. This exists for tests and for integrating with\n * another event system. */\n overrideTriggerEventProvider?: TriggerEventProvider;\n}\n\nexport default class TreeElement {\n // With multiSelect: the node that is the tab stop, see updateTabStop\n private activeNode: Node | null;\n private classNames: ClassNames;\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private fallbackTabStop: HTMLElement | null;\n private htmlElement: HTMLElement;\n private isInitialized: boolean;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private nodeMap: WeakMap<HTMLElement, Node>;\n private options: TreeElementOptions;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n private tree: Node;\n private triggerEventProvider: TriggerEventProvider;\n\n /**\n @hidden\n */\n constructor({\n htmlElement,\n overrideTriggerEventProvider,\n ...options\n }: TreeElementParams) {\n this.htmlElement = htmlElement;\n this.options = setDefaultOptions(htmlElement, options);\n this.classNames = createClassNames(this.options);\n this.triggerEventProvider =\n overrideTriggerEventProvider ?? triggerCustomEvent;\n\n this.isInitialized = false;\n this.tree = new Node({}, true);\n this.nodeMap = new WeakMap();\n this.fallbackTabStop = null;\n this.activeNode = null;\n\n const {\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n multiSelect,\n onCanMove,\n onCanMoveTo,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState: saveStateOption,\n showEmptyFolder,\n slide,\n tabIndex,\n } = this.options;\n\n const classNames = this.classNames;\n const closeNode = this.closeNode.bind(this);\n const getNodeElement = this.getNodeElement.bind(this);\n const getNodeElementForNode = this.getNodeElementForNode.bind(this);\n const getFocusedNode = this.getFocusedNode.bind(this);\n const getNodeById = this.getNodeById.bind(this);\n const getSelectedNode = this.getSelectedNode.bind(this);\n const getTree = this.getTree.bind(this);\n const loadData = this.loadData.bind(this);\n const openNode = this.openNode.bind(this);\n const openParents = this.openParents.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const setNodeElement = this.setNodeElement.bind(this);\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n const updateTabStop = this.updateTabStop.bind(this);\n\n const saveState = () => {\n saveStateHandler.saveState();\n };\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\n getNodeElementForNode,\n getOnCanSelectNode: () => this.options.onCanSelectNode,\n getSelectable: () => this.options.selectable,\n openParents,\n saveState,\n triggerEvent,\n updateTabStop,\n });\n\n const addToSelection =\n selectNodeHandler.addToSelection.bind(selectNodeHandler);\n const getSelectedNodes =\n selectNodeHandler.getSelectedNodes.bind(selectNodeHandler);\n const isNodeSelected =\n selectNodeHandler.isNodeSelected.bind(selectNodeHandler);\n const removeFromSelection =\n selectNodeHandler.removeFromSelection.bind(selectNodeHandler);\n const selectNode =\n selectNodeHandler.selectSingleNode.bind(selectNodeHandler);\n\n const toggleNodeInSelection =\n selectNodeHandler.toggleNodeInSelection.bind(selectNodeHandler);\n\n // With multiSelect, a click adds a node to the selection or removes it\n const onClickTitle = (node: Node) => {\n if (this.options.multiSelect) {\n toggleNodeInSelection(node, false);\n this.focusNode(node);\n } else {\n selectNode(node);\n }\n };\n\n const getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n classNames,\n dataFilter,\n loadData,\n treeElement,\n triggerEvent,\n });\n\n const saveStateHandler = new SaveStateHandler({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState: saveStateOption,\n });\n\n const scrollHandler = new ScrollHandler({\n refreshHitAreas,\n treeElement,\n });\n\n const getScrollLeft = scrollHandler.getScrollLeft.bind(scrollHandler);\n\n const dndHandler = new DragAndDropHandler({\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 });\n\n const keyHandler = new KeyHandler({\n closeNode,\n focusNode: this.focusNode.bind(this),\n getActiveNode: this.getActiveNode.bind(this),\n getFocusedNode,\n getSelectedNode,\n getTree,\n keyboardSupport,\n multiSelect,\n openNode,\n selectNode,\n toggleNodeInSelection,\n triggerEvent,\n });\n\n const renderer = new ElementsRenderer({\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n classNames,\n closedIcon,\n dragAndDrop,\n getTree,\n htmlElement: treeElement,\n isNodeSelected,\n multiSelect,\n onCreateLi,\n openedIcon,\n rtl,\n setNodeElement,\n showEmptyFolder,\n tabIndex,\n });\n\n const getNode = this.getNode.bind(this);\n const onMouseCapture = this.mouseCapture.bind(this);\n const onMouseDrag = this.mouseDrag.bind(this);\n const onMouseStart = this.mouseStart.bind(this);\n const onMouseStop = this.mouseStop.bind(this);\n\n const mouseHandler = new MouseHandler({\n classNames,\n element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu: this.options.useContextMenu,\n });\n\n this.dataLoader = dataLoader;\n this.dndHandler = dndHandler;\n this.keyHandler = keyHandler;\n this.mouseHandler = mouseHandler;\n this.renderer = renderer;\n this.saveStateHandler = saveStateHandler;\n this.scrollHandler = scrollHandler;\n this.selectNodeHandler = selectNodeHandler;\n\n if (multiSelect) {\n treeElement.addEventListener(\"focusin\", this.handleFocusIn);\n }\n\n this.initData();\n }\n\n /**\n * Adds a sibling after a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeAfter(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addAfter(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a sibling before a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeBefore(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addBefore(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Inserts a new node between a node and its parent, taking the node as its\n * child.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addParentNode(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addParent(nodeData);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a node to the selection instead of replacing it.\n *\n * @param mustSetFocus - Move the focus to the node. Default `true`.\n * @group Selection\n */\n public addToSelection(node: Node, mustSetFocus = true) {\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(mustSetFocus);\n\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Adds a node as the last child of a parent.\n *\n * @example\n * ```js\n * tree.appendNode({ name: \"child\", id: 5 }, tree.getNodeById(1));\n * ```\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public appendNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.append(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Closes a folder. Await the promise when you need to know the closing\n * animation has finished.\n *\n * @example\n * ```js\n * await tree.closeNode(node);\n * console.log(\"closed\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async closeNode(node: Node, slide?: boolean): Promise<void> {\n if (!(node.isFolder() || node.isEmptyFolder)) {\n return;\n }\n\n await this.createFolderElement(node).close(\n slide ?? this.options.slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n /**\n * Empties the element and removes the tree's document-level keyboard\n * listener. Call it when you remove the tree from the page.\n *\n * @group Other\n */\n public deinit(): void {\n this.htmlElement.textContent = \"\";\n\n this.dataLoader.deinit();\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n this.htmlElement.removeEventListener(\"focusin\", this.handleFocusIn);\n\n this.tree = new Node({}, true);\n }\n\n /**\n * Returns the node that belongs to a `li` element the tree rendered.\n *\n * @group Finding nodes\n */\n public getNode(element: HTMLElement): Node | null {\n const liElement = element.closest<HTMLElement>(\n `li.${this.classNames.common}`,\n );\n\n return liElement ? (this.nodeMap.get(liElement) ?? null) : null;\n }\n\n /**\n * Returns the first node for which the callback returns `true`.\n *\n * @example\n * ```js\n * const node = tree.getNodeByCallback((node) => node.children.length > 3);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n /**\n * Returns the node with this id.\n *\n * @example\n * ```js\n * const node = tree.getNodeById(1);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeById(id: NodeId): Node | null {\n return this.tree.getNodeById(id);\n }\n\n /**\n * Returns the first node with this name.\n *\n * @group Finding nodes\n */\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n /**\n * Like `getNodeByName`, but throws when there is no such node. Convenient\n * in tests and when a missing node is a bug.\n *\n * @group Finding nodes\n */\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n /**\n * Returns all nodes with this property value.\n *\n * @example\n * ```js\n * tree.getNodesByProperty(\"color\", \"green\");\n * ```\n *\n * @group Finding nodes\n */\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n /**\n * Returns the selected node, or `null` when nothing is selected.\n *\n * @group Selection\n */\n public getSelectedNode(): Node | null {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n /**\n * Returns the selected nodes.\n *\n * @group Selection\n */\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n /**\n * Returns the current state — `open_nodes` and `selected_node` — whether or\n * not `saveState` is enabled.\n *\n * @group State\n */\n public getState(): null | SavedState {\n return this.saveStateHandler.getState();\n }\n\n /**\n * Returns the state as it is stored.\n *\n * @group State\n */\n public getStateFromStorage(): null | SavedState {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n /**\n * Returns the root node. It is not rendered; its `children` are the\n * top-level nodes. Also available as the `tree` property.\n *\n * @group Finding nodes\n */\n public getTree(): Node {\n return this.tree;\n }\n\n /**\n * Returns the version of tree-element.\n *\n * @group Other\n */\n public getVersion(): string {\n return __version__;\n }\n\n /**\n * Returns whether the user is dragging a node.\n *\n * @group Other\n */\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n /**\n * Returns whether the node is selected.\n *\n * @group Selection\n */\n public isNodeSelected(node: Node): boolean {\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n /**\n * Loads data into the tree.\n *\n * @param parentNode - Replace this node's children instead of the whole\n * tree.\n * @group Loading data\n */\n public loadData(data: NodeData[] | null, parentNode?: Node): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this.triggerEvent(\"tree.set_data\", {\n node: parentNode,\n treeData: data ?? undefined,\n });\n }\n\n /**\n * Fetches data and loads it into the tree, or into `parentNode`.\n *\n * @param url - Defaults to the `dataUrl` option.\n * @group Loading data\n */\n public async loadDataFromUrl(url?: string, parentNode?: Node): Promise<void> {\n const requestUrl = url\n ? new RequestUrl(url)\n : this.createRequestUrl(parentNode);\n\n if (requestUrl) {\n await this.dataLoader.loadFromUrl(requestUrl, parentNode);\n }\n }\n\n /**\n * Selects the next visible node, like the down arrow key. With\n * `multiSelect` it moves the focus instead.\n *\n * @group Selection\n */\n public moveDown() {\n this.keyHandler.moveDown();\n }\n\n /**\n * Moves a node inside the tree.\n *\n * @example\n * ```js\n * tree.moveNode(tree.getNodeById(2), tree.getNodeById(1), \"inside\");\n * ```\n *\n * @param position - `\"before\"`, `\"after\"` or `\"inside\"`.\n * @group Changing the tree\n */\n public moveNode(node: Node, targetNode: Node, position: Position): void {\n this.tree.moveNode(node, targetNode, position);\n this.refreshElements(null);\n }\n\n /**\n * Selects the previous visible node, like the up arrow key. With\n * `multiSelect` it moves the focus instead.\n *\n * @group Selection\n */\n public moveUp() {\n this.keyHandler.moveUp();\n }\n\n /**\n * Opens a folder, and the folders above it. A node marked `load_on_demand`\n * is fetched first, so await the promise when you need to know it is really\n * open.\n *\n * @example\n * ```js\n * await tree.openNode(node);\n * console.log(\"open\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async openNode(node: Node, slide?: boolean): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n const doOpenNode = async (\n openedNode: Node,\n slideOption: boolean,\n ): Promise<void> => {\n if (!node.children.length) {\n return;\n }\n\n const folderElement = this.createFolderElement(openedNode);\n\n await folderElement.open(slideOption, this.options.animationSpeed);\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n await this.loadFolderOnDemand(node, mustSlide);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n await doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n await doOpenNode(node, mustSlide);\n\n this.saveState();\n }\n }\n }\n\n /**\n * Adds a node as the first child of a parent.\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public prependNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.prepend(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Re-renders the whole tree. Needed after changing node data directly\n * instead of through these methods.\n *\n * @group Changing the tree\n */\n public refresh() {\n this.refreshElements(null);\n }\n\n /**\n * Recomputes the drop targets. Call this if the layout changes during a\n * drag.\n *\n * @group Other\n */\n public refreshHitAreas() {\n this.dndHandler.refresh();\n }\n\n /**\n * Removes a node from the selection.\n *\n * @group Selection\n */\n public removeFromSelection(node: Node) {\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Removes a node and its children.\n *\n * @group Changing the tree\n */\n public removeNode(node: Node): void {\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n }\n\n /**\n * Scrolls the node into view.\n *\n * @group Selection\n */\n public scrollToNode(node: Node) {\n if (!node.element) {\n return;\n }\n\n const top = getOffsetTop(node.element) - getOffsetTop(this.htmlElement);\n\n this.scrollHandler.scrollToY(top);\n }\n\n /**\n * Replaces the selection, and opens the parents of the node.\n *\n * @param node - `null` clears the selection.\n * @param options - `mustSetFocus`: move focus to the node, default `true`.\n * `mustToggle`: deselect the node if it is already selected, default\n * `false`.\n * @group Selection\n */\n public selectNode(node: Node | null, options?: SelectNodeOptions): void {\n if (!node) {\n // Called with empty node -> deselect all nodes\n this.deselectAllNodes();\n this.saveStateHandler.saveState();\n return;\n }\n\n // Unlike a click, selecting the selected node again keeps it selected\n this.selectNodeHandler.selectSingleNode(node, {\n mustToggle: false,\n ...options,\n });\n }\n\n /**\n * Changes an option after construction. See\n * [Options](/reference/options#changing-an-option-later) for the caveats.\n *\n * @group Other\n */\n public setOption(option: string, value: unknown) {\n (this.options as unknown as Record<string, unknown>)[option] = value;\n }\n\n /**\n * Applies a state to the tree, and saves it to storage when `saveState` is\n * enabled.\n *\n * @group State\n */\n public setState(state: SavedState) {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n this.saveState();\n }\n\n /**\n * Closes an open node and opens a closed one. Await the promise when you\n * need to know the node is really open or closed, like with `openNode` and\n * `closeNode`.\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async toggle(node: Node, slide: boolean | null = null): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n if (node.is_open) {\n await this.closeNode(node, mustSlide);\n } else {\n await this.openNode(node, mustSlide);\n }\n }\n\n /**\n * Returns the tree as a json string, including changes made through the\n * api.\n *\n * @group Other\n */\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n /**\n * Updates the data of a node and re-renders it. A string updates just the\n * name.\n *\n * Changing the `id` re-indexes the node. `children` and `parent` are\n * ignored — use `loadData` or `moveNode` for those.\n *\n * @example\n * ```js\n * tree.updateNode(node, \"new name\");\n * tree.updateNode(node, { name: \"new name\", color: \"red\" });\n * ```\n *\n * @group Changing the tree\n */\n public updateNode(node: Node, data: NodeData): void {\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data.children &&\n Array.isArray(data.children)\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children);\n }\n }\n\n this.refreshElements(node);\n }\n\n // Open the nodes up to the autoOpen level. A folder that is loaded on\n // demand is fetched first, and its children are opened when the data has\n // arrived.\n private async autoOpenNodesOnDemand(): Promise<void> {\n const maxLevel = this.getAutoOpenMaxLevel();\n\n const openNodes = async (): Promise<void> => {\n const loading: Promise<void>[] = [];\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loading.push(this.openNode(node, false).then(openNodes));\n }\n\n return false;\n }\n void this.openNode(node, false);\n\n return level !== maxLevel;\n });\n\n await Promise.all(loading);\n };\n\n await openNodes();\n }\n\n private createFolderElement(node: Node) {\n const classNames = this.classNames;\n const closedIconElement = this.renderer.closedIconElement;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const openedIconElement = this.renderer.openedIconElement;\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n // A selected node in a closed folder is rendered when the folder is\n // opened, which can be after it was selected. It becomes the tab stop\n // then, so the fallback tab stop must go.\n const renderChildren = (folder: Node) => {\n const ul = this.renderer.renderChildren(folder);\n this.updateTabStop();\n return ul;\n };\n\n return new FolderElement({\n classNames,\n closedIconElement,\n getScrollLeft,\n multiSelect: this.options.multiSelect,\n node,\n openedIconElement,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const classNames = this.classNames;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n\n return new NodeElement({\n classNames,\n getScrollLeft,\n multiSelect: this.options.multiSelect,\n node,\n tabIndex,\n treeElement,\n });\n }\n\n /* Create a RequestUrl based on the url in the options.\n * Add a 'node' query parameter for loading on demand\n * Add a 'selected_node' query parameter if a node is selected.\n */\n private createRequestUrl(node?: Node): null | RequestUrl {\n const dataUrl = this.options.dataUrl;\n\n const url = typeof dataUrl === \"function\" ? dataUrl(node) : dataUrl;\n\n if (!url) {\n return null;\n }\n\n const requestUrl = new RequestUrl(url);\n\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n requestUrl.setSearchParam(\"node\", node.id.toString());\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n requestUrl.setSearchParam(\"selected_node\", selectedNodeId.toString());\n }\n }\n\n return requestUrl;\n }\n\n private deselectAllNodes(): void {\n for (const node of this.getSelectedNodes()) {\n this.removeFromSelection(node);\n }\n }\n\n // Deselect the children of the node.\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n // The treeitem of the first node, or null when the tree is empty\n // Move the focus to a node, without selecting it\n private focusNode(node: Node): void {\n this.activeNode = node;\n this.updateTabStop();\n node.element?.focus();\n }\n\n // With multiSelect: the active node, if it is still rendered in the tree\n private getActiveNode(): Node | null {\n const element = this.activeNode?.element;\n\n return element && this.htmlElement.contains(element)\n ? this.activeNode\n : null;\n }\n\n // Get the maximum level for auto open\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n }\n if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n }\n if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n }\n\n /* istanbul ignore next @preserve */\n return 0;\n }\n\n private getFirstTreeItem(): HTMLElement | null {\n return this.tree.children[0]?.element ?? null;\n }\n\n // The node of the HTML element that has the focus, if it is in this tree\n private getFocusedNode(): Node | null {\n const activeElement = document.activeElement;\n\n /* istanbul ignore if */\n if (!activeElement) {\n return null;\n }\n\n // The keyboard must still work for input elements.\n const tagName = activeElement.tagName;\n if (tagName !== \"A\" && tagName !== \"LI\" && tagName !== \"SPAN\") {\n return null;\n }\n\n const node = this.getNode(activeElement as HTMLElement);\n return node?.tree === this.tree ? node : null;\n }\n\n private getNodeElement(element: HTMLElement): NodeElement | null {\n const node = this.getNode(element);\n return node ? this.getNodeElementForNode(node) : null;\n }\n\n private getNodeElementForNode(node: Node): NodeElement {\n return node.isFolder()\n ? this.createFolderElement(node)\n : this.createNodeElement(node);\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n return this.saveStateHandler.getNodeIdToBeSelected();\n }\n\n // With multiSelect, the focused node becomes the tab stop\n private handleFocusIn = (): void => {\n const node = this.getFocusedNode();\n\n if (!node || node === this.activeNode) {\n return;\n }\n\n this.activeNode = node;\n this.updateTabStop();\n };\n\n private hasRenderedSelectedNode(): boolean {\n return this.getSelectedNodes().some((node) => Boolean(node.element));\n }\n\n private initData(): void {\n if (this.options.data) {\n this.loadData(this.options.data);\n } else {\n const dataUrl = this.createRequestUrl();\n\n if (dataUrl) {\n void this.loadDataFromUrl();\n } else {\n this.loadData([]);\n }\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (this.isInitialized) {\n return;\n }\n\n this.isInitialized = true;\n this.triggerEvent(\"tree.init\");\n };\n\n this.tree = new this.options.nodeClass(null, true, this.options.nodeClass);\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this.refreshElements(null);\n\n if (mustLoadOnDemand) {\n // Load data on demand and then init the tree\n void this.setInitialStateOnDemand().then(doInit);\n } else {\n doInit();\n }\n }\n\n // Does an HTML element of the tree have the focus?\n private isFocusOnTree(): boolean {\n return this.getFocusedNode() !== null;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n return selectedNode\n ? subtree === selectedNode || subtree.isParentOf(selectedNode)\n : false;\n }\n\n private async loadFolderOnDemand(node: Node, slide: boolean): Promise<void> {\n node.is_loading = true;\n\n await this.loadDataFromUrl(undefined, node);\n\n // Loading failed, or there is no url. Opening the node now would load it\n // again, without end. Leave it closed so the user can try again.\n if (node.load_on_demand) {\n node.is_loading = false;\n return;\n }\n\n await this.openNode(node, slide);\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this.refreshElements(parentNode);\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n return this.options.dragAndDrop\n ? this.dndHandler.mouseCapture(positionInfo)\n : false;\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n const result = this.dndHandler.mouseDrag(positionInfo);\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n return this.dndHandler.mouseStart(positionInfo);\n }\n\n private mouseStop(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent?.parent && !parent.is_open) {\n void this.openNode(parent, false);\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n private refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.isFocusOnTree();\n const mustSelect = fromNode\n ? this.isSelectedNodeInSubtree(fromNode)\n : false;\n\n this.renderer.render(fromNode);\n\n if (mustSelect) {\n this.selectCurrentNode(mustSetFocus);\n }\n\n this.updateTabStop();\n\n this.triggerEvent(\"tree.refresh\");\n }\n\n private saveState(): void {\n this.saveStateHandler.saveState();\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (!node) {\n return;\n }\n\n const nodeElement = this.getNodeElementForNode(node);\n nodeElement.select(mustSetFocus);\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n const mustLoadOnDemand = this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n return [false, false];\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n }\n if (node.hasChildren()) {\n node.is_open = true;\n return level !== maxLevel;\n }\n return false;\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n private async setInitialStateOnDemand(): Promise<void> {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n await this.saveStateHandler.setInitialStateOnDemand(state);\n } else {\n await this.autoOpenNodesOnDemand();\n }\n }\n\n // Set this HTML element to this node in the node map.\n private setNodeElement(element: HTMLElement, node: Node) {\n this.nodeMap.set(element, node);\n }\n\n private triggerEvent<Name extends TreeEventName>(\n eventName: Name,\n values?: TreeEvents[Name],\n ): boolean {\n return this.triggerEventProvider(this.htmlElement, eventName, values);\n }\n\n /* Keyboard users reach the tree through the tab stop. The selected node is\n * the tab stop, see NodeElement.select. Without a selected node, the first\n * node is the tab stop, so the tree can always be reached.\n * With multiSelect the tab stop is the active node: the node that was\n * focused last. Without one, it is the first node.\n */\n private updateTabStop(): void {\n const tabIndex = this.options.tabIndex;\n const multiSelect = this.options.multiSelect;\n const previousTabStop = this.fallbackTabStop;\n let tabStop: HTMLElement | null;\n\n if (tabIndex == null) {\n tabStop = null;\n } else if (multiSelect) {\n tabStop = this.getActiveNode()?.element ?? this.getFirstTreeItem();\n } else {\n tabStop = this.hasRenderedSelectedNode() ? null : this.getFirstTreeItem();\n }\n\n if (\n previousTabStop &&\n previousTabStop !== tabStop &&\n (multiSelect || previousTabStop.getAttribute(\"aria-selected\") !== \"true\")\n ) {\n previousTabStop.setAttribute(\"tabindex\", \"-1\");\n }\n\n if (tabStop && tabIndex != null) {\n tabStop.setAttribute(\"tabindex\", String(tabIndex));\n }\n\n this.fallbackTabStop = tabStop;\n }\n}\n\nexport {\n type MoveInfo,\n type TreeEvent,\n type TreeEventName,\n type TreeEvents,\n} from \"./events\";\nexport { type Node, type NodeData, type NodeId, type Position } from \"./node\";\nexport { type TreeElementOptions } from \"./options\";\nexport { type SavedState } from \"./saveStateHandler\";\nexport { type SelectNodeOptions } from \"./selectNodeHandler\";\n"],"names":["activeNode","classNames","dataLoader","dndHandler","fallbackTabStop","htmlElement","isInitialized","keyHandler","mouseHandler","nodeMap","options","renderer","saveStateHandler","scrollHandler","selectNodeHandler","tree","triggerEventProvider","getNodeElement","getNodeElementForNode","getFocusedNode","openParents","refreshElements","setNodeElement","triggerEvent","updateTabStop","saveState","addToSelection","getSelectedNodes","isNodeSelected","removeFromSelection","selectSingleNode","toggleNodeInSelection","focusNode","getScrollLeft","getActiveNode","mouseCapture","mouseDrag","mouseStart","mouseStop","handleFocusIn","initData","select","createFolderElement","close","deinit","getSelectedNode","getState","getStateFromStorage","__version__","isDragging","deselectNodes","loadSubtree","initTree","refresh","createRequestUrl","loadFromUrl","moveDown","moveUp","open","loadFolderOnDemand","deselect","scrollToY","deselectAllNodes","setInitialState","autoOpenNodesOnDemand","getAutoOpenMaxLevel","closedIconElement","openedIconElement","renderChildren","createNodeElement","setSearchParam","getNodeIdToBeSelected","getSelectedNodesUnder","getFirstTreeItem","hasRenderedSelectedNode","clear","setInitialStateOnDemand","isFocusOnTree","isSelectedNodeInSubtree","checkScrolling","stopScrolling","render","selectCurrentNode"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { ClassNames } from \"./classNames\";\nimport type { TreeEventName, TreeEvents } from \"./events\";\nimport type { PositionInfo } from \"./mouseUtils\";\nimport type { NodeData, NodeId, Position } from \"./node\";\nimport type { ChangeableOption, TreeElementOptions } from \"./options\";\nimport type { SavedState } from \"./saveStateHandler\";\nimport type { SelectNodeOptions } from \"./selectNodeHandler\";\n\nimport createClassNames from \"./classNames\";\nimport DataLoader from \"./dataLoader\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { Node } from \"./node\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { changeableOptions } from \"./options\";\nimport { getOffsetTop } from \"./positionUtils\";\nimport RequestUrl from \"./requestUrl\";\nimport SaveStateHandler from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport setDefaultOptions from \"./setDefaultOptions\";\nimport triggerCustomEvent from \"./triggerCustomEvent\";\nimport __version__ from \"./version\";\n\n// The types that appear in the public api. Consumers cannot import them from\n// the submodules directly, because those are not exposed in package.json.\n// Type only, so that the iife build keeps exposing the TreeElement class itself\n// as its global, instead of an object of named exports.\n\nexport type TriggerEventProvider = (\n element: HTMLElement,\n eventName: TreeEventName,\n values?: TreeEvents[TreeEventName],\n) => boolean;\n\ninterface TreeElementParams extends Partial<TreeElementOptions> {\n /**\n The element the tree is rendered into. Its content is replaced.\n */\n htmlElement: HTMLElement;\n /** Replaces how events are dispatched. It must return whether the event\n * was not cancelled. This exists for tests and for integrating with\n * another event system. */\n overrideTriggerEventProvider?: TriggerEventProvider;\n}\n\nexport default class TreeElement {\n // With multiSelect: the node that is the tab stop, see updateTabStop\n private activeNode: Node | null;\n private classNames: ClassNames;\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private fallbackTabStop: HTMLElement | null;\n private htmlElement: HTMLElement;\n private isInitialized: boolean;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private nodeMap: WeakMap<HTMLElement, Node>;\n private options: TreeElementOptions;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n private tree: Node;\n private triggerEventProvider: TriggerEventProvider;\n\n /**\n @hidden\n */\n constructor({\n htmlElement,\n overrideTriggerEventProvider,\n ...options\n }: TreeElementParams) {\n this.htmlElement = htmlElement;\n this.options = setDefaultOptions(htmlElement, options);\n this.classNames = createClassNames(this.options);\n this.triggerEventProvider =\n overrideTriggerEventProvider ?? triggerCustomEvent;\n\n this.isInitialized = false;\n this.tree = new Node({}, true);\n this.nodeMap = new WeakMap();\n this.fallbackTabStop = null;\n this.activeNode = null;\n\n const {\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n multiSelect,\n onCanMove,\n onCanMoveTo,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState: saveStateOption,\n showEmptyFolder,\n tabIndex,\n } = this.options;\n\n const classNames = this.classNames;\n const closeNode = this.closeNode.bind(this);\n const getNodeElement = this.getNodeElement.bind(this);\n const getNodeElementForNode = this.getNodeElementForNode.bind(this);\n const getFocusedNode = this.getFocusedNode.bind(this);\n const getNodeById = this.getNodeById.bind(this);\n const getSelectedNode = this.getSelectedNode.bind(this);\n const getTree = this.getTree.bind(this);\n const loadData = this.loadData.bind(this);\n const openNode = this.openNode.bind(this);\n const openParents = this.openParents.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const setNodeElement = this.setNodeElement.bind(this);\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n const updateTabStop = this.updateTabStop.bind(this);\n\n const saveState = () => {\n saveStateHandler.saveState();\n };\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\n getNodeElementForNode,\n getOnCanSelectNode: () => this.options.onCanSelectNode,\n getSelectable: () => this.options.selectable,\n openParents,\n saveState,\n triggerEvent,\n updateTabStop,\n });\n\n const addToSelection =\n selectNodeHandler.addToSelection.bind(selectNodeHandler);\n const getSelectedNodes =\n selectNodeHandler.getSelectedNodes.bind(selectNodeHandler);\n const isNodeSelected =\n selectNodeHandler.isNodeSelected.bind(selectNodeHandler);\n const removeFromSelection =\n selectNodeHandler.removeFromSelection.bind(selectNodeHandler);\n const selectNode =\n selectNodeHandler.selectSingleNode.bind(selectNodeHandler);\n\n const toggleNodeInSelection =\n selectNodeHandler.toggleNodeInSelection.bind(selectNodeHandler);\n\n // With multiSelect, a click adds a node to the selection or removes it\n const onClickTitle = (node: Node) => {\n if (this.options.multiSelect) {\n toggleNodeInSelection(node, false);\n this.focusNode(node);\n } else {\n selectNode(node);\n }\n };\n\n const getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n classNames,\n dataFilter,\n loadData,\n treeElement,\n triggerEvent,\n });\n\n const saveStateHandler = new SaveStateHandler({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState: saveStateOption,\n });\n\n const scrollHandler = new ScrollHandler({\n refreshHitAreas,\n treeElement,\n });\n\n const getScrollLeft = scrollHandler.getScrollLeft.bind(scrollHandler);\n\n const dndHandler = new DragAndDropHandler({\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 treeElement,\n triggerEvent,\n });\n\n const keyHandler = new KeyHandler({\n closeNode,\n focusNode: this.focusNode.bind(this),\n getActiveNode: this.getActiveNode.bind(this),\n getFocusedNode,\n getSelectedNode,\n getTree,\n keyboardSupport,\n multiSelect,\n openNode,\n selectNode,\n toggleNodeInSelection,\n triggerEvent,\n });\n\n const renderer = new ElementsRenderer({\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n classNames,\n closedIcon,\n dragAndDrop,\n getTree,\n htmlElement: treeElement,\n isNodeSelected,\n multiSelect,\n onCreateLi,\n openedIcon,\n rtl,\n setNodeElement,\n showEmptyFolder,\n tabIndex,\n });\n\n const getNode = this.getNode.bind(this);\n const onMouseCapture = this.mouseCapture.bind(this);\n const onMouseDrag = this.mouseDrag.bind(this);\n const onMouseStart = this.mouseStart.bind(this);\n const onMouseStop = this.mouseStop.bind(this);\n\n const mouseHandler = new MouseHandler({\n classNames,\n element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu: this.options.useContextMenu,\n });\n\n this.dataLoader = dataLoader;\n this.dndHandler = dndHandler;\n this.keyHandler = keyHandler;\n this.mouseHandler = mouseHandler;\n this.renderer = renderer;\n this.saveStateHandler = saveStateHandler;\n this.scrollHandler = scrollHandler;\n this.selectNodeHandler = selectNodeHandler;\n\n if (multiSelect) {\n treeElement.addEventListener(\"focusin\", this.handleFocusIn);\n }\n\n this.initData();\n }\n\n /**\n * Adds a sibling after a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeAfter(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addAfter(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a sibling before a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeBefore(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addBefore(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Inserts a new node between a node and its parent. The siblings of the node\n * move along: the new node takes all children of the parent, and becomes its\n * only child.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addParentNode(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addParent(nodeData);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a node to the selection instead of replacing it.\n *\n * @param mustSetFocus - Move the focus to the node. Default `true`.\n * @group Selection\n */\n public addToSelection(node: Node, mustSetFocus = true) {\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(mustSetFocus);\n\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Adds a node as the last child of a parent.\n *\n * @example\n * ```js\n * tree.appendNode({ name: \"child\", id: 5 }, tree.getNodeById(1));\n * ```\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public appendNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.append(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Closes a folder. Await the promise when you need to know the closing\n * animation has finished.\n *\n * @example\n * ```js\n * await tree.closeNode(node);\n * console.log(\"closed\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async closeNode(node: Node, slide?: boolean): Promise<void> {\n if (!(node.isFolder() || node.isEmptyFolder)) {\n return;\n }\n\n await this.createFolderElement(node).close(\n slide ?? this.options.slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n /**\n * Empties the element and removes the tree's document-level keyboard\n * listener. Call it when you remove the tree from the page.\n *\n * @group Other\n */\n public deinit(): void {\n this.htmlElement.textContent = \"\";\n\n this.dataLoader.deinit();\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n this.htmlElement.removeEventListener(\"focusin\", this.handleFocusIn);\n\n this.tree = new Node({}, true);\n }\n\n /**\n * Returns the node that belongs to a `li` element the tree rendered.\n *\n * @group Finding nodes\n */\n public getNode(element: HTMLElement): Node | null {\n const liElement = element.closest<HTMLElement>(\n `li.${this.classNames.common}`,\n );\n\n return liElement ? (this.nodeMap.get(liElement) ?? null) : null;\n }\n\n /**\n * Returns the first node for which the callback returns `true`.\n *\n * @example\n * ```js\n * const node = tree.getNodeByCallback((node) => node.children.length > 3);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n /**\n * Returns the node with this id.\n *\n * @example\n * ```js\n * const node = tree.getNodeById(1);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeById(id: NodeId): Node | null {\n return this.tree.getNodeById(id);\n }\n\n /**\n * Returns the first node with this name.\n *\n * @group Finding nodes\n */\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n /**\n * Like `getNodeByName`, but throws when there is no such node. Convenient\n * in tests and when a missing node is a bug.\n *\n * @group Finding nodes\n */\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n /**\n * Returns all nodes with this property value.\n *\n * @example\n * ```js\n * tree.getNodesByProperty(\"color\", \"green\");\n * ```\n *\n * @group Finding nodes\n */\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n /**\n * Returns the selected node, or `null` when nothing is selected.\n *\n * @group Selection\n */\n public getSelectedNode(): Node | null {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n /**\n * Returns the selected nodes.\n *\n * @group Selection\n */\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n /**\n * Returns the current state—`open_nodes` and `selected_node`—whether or\n * not `saveState` is enabled.\n *\n * @group State\n */\n public getState(): null | SavedState {\n return this.saveStateHandler.getState();\n }\n\n /**\n * Returns the state as it is stored.\n *\n * @group State\n */\n public getStateFromStorage(): null | SavedState {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n /**\n * Returns the root node. It is not rendered, and its `children` are the\n * top-level nodes. Also available as the `tree` property.\n *\n * @group Finding nodes\n */\n public getTree(): Node {\n return this.tree;\n }\n\n /**\n * Returns the version of tree-element.\n *\n * @group Other\n */\n public getVersion(): string {\n return __version__;\n }\n\n /**\n * Returns whether the user is dragging a node.\n *\n * @group Other\n */\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n /**\n * Returns whether the node is selected.\n *\n * @group Selection\n */\n public isNodeSelected(node: Node): boolean {\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n /**\n * Loads data into the tree.\n *\n * @param parentNode - Replace this node's children instead of the whole\n * tree.\n * @group Loading data\n */\n public loadData(data: NodeData[] | null, parentNode?: Node): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this.triggerEvent(\"tree.set_data\", {\n node: parentNode,\n treeData: data ?? undefined,\n });\n }\n\n /**\n * Fetches data and loads it into the tree, or into `parentNode`.\n *\n * @param url - Defaults to the `dataUrl` option.\n * @group Loading data\n */\n public async loadDataFromUrl(url?: string, parentNode?: Node): Promise<void> {\n const requestUrl = url\n ? new RequestUrl(url)\n : this.createRequestUrl(parentNode);\n\n if (requestUrl) {\n await this.dataLoader.loadFromUrl(requestUrl, parentNode);\n }\n }\n\n /**\n * Selects the next visible node, like the down arrow key. With\n * `multiSelect` it moves the focus instead.\n *\n * @group Selection\n */\n public moveDown() {\n this.keyHandler.moveDown();\n }\n\n /**\n * Moves a node inside the tree.\n *\n * @example\n * ```js\n * tree.moveNode(tree.getNodeById(2), tree.getNodeById(1), \"inside\");\n * ```\n *\n * @param position - `\"before\"`, `\"after\"` or `\"inside\"`.\n * @group Changing the tree\n */\n public moveNode(node: Node, targetNode: Node, position: Position): void {\n this.tree.moveNode(node, targetNode, position);\n this.refreshElements(null);\n }\n\n /**\n * Selects the previous visible node, like the up arrow key. With\n * `multiSelect` it moves the focus instead.\n *\n * @group Selection\n */\n public moveUp() {\n this.keyHandler.moveUp();\n }\n\n /**\n * Opens a folder, and the folders that contain it. A node marked `load_on_demand`\n * is fetched first, so await the promise when you need to know it is really\n * open.\n *\n * @example\n * ```js\n * await tree.openNode(node);\n * console.log(\"open\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async openNode(node: Node, slide?: boolean): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n const doOpenNode = async (\n openedNode: Node,\n slideOption: boolean,\n ): Promise<void> => {\n if (!openedNode.children.length) {\n return;\n }\n\n const folderElement = this.createFolderElement(openedNode);\n\n await folderElement.open(slideOption, this.options.animationSpeed);\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n await this.loadFolderOnDemand(node, mustSlide);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n await doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n await doOpenNode(node, mustSlide);\n\n this.saveState();\n }\n }\n }\n\n /**\n * Adds a node as the first child of a parent.\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public prependNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.prepend(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Re-renders the whole tree. Needed after changing node data directly\n * instead of through these methods.\n *\n * @group Changing the tree\n */\n public refresh() {\n this.refreshElements(null);\n }\n\n /**\n * Recomputes the drop targets. Call this if the layout changes during a\n * drag.\n *\n * @group Other\n */\n public refreshHitAreas() {\n this.dndHandler.refresh();\n }\n\n /**\n * Removes a node from the selection.\n *\n * @group Selection\n */\n public removeFromSelection(node: Node) {\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Removes a node and its children.\n *\n * @group Changing the tree\n */\n public removeNode(node: Node): void {\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n }\n\n /**\n * Scrolls the node into view.\n *\n * @group Selection\n */\n public scrollToNode(node: Node) {\n if (!node.element) {\n return;\n }\n\n const top = getOffsetTop(node.element) - getOffsetTop(this.htmlElement);\n\n this.scrollHandler.scrollToY(top);\n }\n\n /**\n * Replaces the selection, and opens the parents of the node.\n *\n * @param node - `null` clears the selection.\n * @param options - `mustSetFocus`: move focus to the node, default `true`.\n * `mustToggle`: deselect the node if it is already selected, default\n * `false`.\n * @group Selection\n */\n public selectNode(node: Node | null, options?: SelectNodeOptions): void {\n if (!node) {\n // Called with empty node -> deselect all nodes\n this.deselectAllNodes();\n this.saveStateHandler.saveState();\n return;\n }\n\n // Unlike a click, selecting the selected node again keeps it selected\n this.selectNodeHandler.selectSingleNode(node, {\n mustToggle: false,\n ...options,\n });\n }\n\n /**\n * Changes an option after construction. Only some options can be changed:\n * the others throw an error. See\n * [Options](/reference/options#changing-an-option-later).\n *\n * @group Other\n */\n public setOption(option: ChangeableOption, value: unknown) {\n if (!(changeableOptions as readonly string[]).includes(option)) {\n throw new Error(\n `The option ${option} can only be set in the constructor`,\n );\n }\n\n (this.options as unknown as Record<string, unknown>)[option] = value;\n\n switch (option) {\n case \"dragAndDrop\": {\n this.renderer.setDragAndDrop(Boolean(value));\n\n break;\n }\n case \"keyboardSupport\": {\n this.keyHandler.setKeyboardSupport(Boolean(value));\n\n break;\n }\n case \"multiSelect\": {\n this.setMultiSelect(Boolean(value));\n\n break;\n }\n case \"tabIndex\": {\n this.options.tabIndex = (value as null | number) ?? undefined;\n this.renderer.setTabIndex(this.options.tabIndex);\n this.fallbackTabStop = null;\n this.updateTabStop();\n\n break;\n }\n // No default\n }\n }\n\n /**\n * Applies a state to the tree, and saves it to storage when `saveState` is\n * enabled.\n *\n * @group State\n */\n public setState(state: SavedState) {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n this.saveState();\n }\n\n /**\n * Closes an open node and opens a closed one. Await the promise when you\n * need to know the node is really open or closed, like with `openNode` and\n * `closeNode`.\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async toggle(node: Node, slide: boolean | null = null): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n if (node.is_open) {\n await this.closeNode(node, mustSlide);\n } else {\n await this.openNode(node, mustSlide);\n }\n }\n\n /**\n * Returns the tree as a JSON string, including changes made through the\n * API.\n *\n * @group Other\n */\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n /**\n * Updates the data of a node and re-renders it. A string updates just the\n * name.\n *\n * Changing the `id` re-indexes the node. `children` and `parent` are\n * ignored—use `loadData` or `moveNode` for those.\n *\n * @example\n * ```js\n * tree.updateNode(node, \"new name\");\n * tree.updateNode(node, { name: \"new name\", color: \"red\" });\n * ```\n *\n * @group Changing the tree\n */\n public updateNode(node: Node, data: NodeData): void {\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data.children &&\n Array.isArray(data.children)\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children);\n }\n }\n\n this.refreshElements(node);\n }\n\n // Open the nodes up to the autoOpen level. A folder that is loaded on\n // demand is fetched first, and its children are opened when the data has\n // arrived.\n private async autoOpenNodesOnDemand(): Promise<void> {\n const maxLevel = this.getAutoOpenMaxLevel();\n\n const openNodes = async (): Promise<void> => {\n const loading: Promise<void>[] = [];\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loading.push(this.openNode(node, false).then(openNodes));\n }\n\n return false;\n }\n void this.openNode(node, false);\n\n return level !== maxLevel;\n });\n\n await Promise.all(loading);\n };\n\n await openNodes();\n }\n\n private createFolderElement(node: Node) {\n const classNames = this.classNames;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n // A selected node in a closed folder is rendered when the folder is\n // opened, which can be after it was selected. It becomes the tab stop\n // then, so the fallback tab stop must go.\n const renderChildren = (folder: Node) => {\n const ul = this.renderer.renderChildren(folder);\n this.updateTabStop();\n return ul;\n };\n\n return new FolderElement({\n classNames,\n getScrollLeft,\n icons: this.renderer.icons,\n multiSelect: this.options.multiSelect,\n node,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const classNames = this.classNames;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n\n return new NodeElement({\n classNames,\n getScrollLeft,\n multiSelect: this.options.multiSelect,\n node,\n tabIndex,\n treeElement,\n });\n }\n\n /* Create a RequestUrl based on the url in the options.\n * Add a 'node' query parameter for loading on demand\n * Add a 'selected_node' query parameter if a node is selected.\n */\n private createRequestUrl(node?: Node): null | RequestUrl {\n const dataUrl = this.options.dataUrl;\n\n const url = typeof dataUrl === \"function\" ? dataUrl(node) : dataUrl;\n\n if (!url) {\n return null;\n }\n\n const requestUrl = new RequestUrl(url);\n\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n requestUrl.setSearchParam(\"node\", node.id.toString());\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n requestUrl.setSearchParam(\"selected_node\", selectedNodeId.toString());\n }\n }\n\n return requestUrl;\n }\n\n private deselectAllNodes(): void {\n for (const node of this.getSelectedNodes()) {\n this.removeFromSelection(node);\n }\n }\n\n // Deselect the children of the node.\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n // The treeitem of the first node, or null when the tree is empty\n // Move the focus to a node, without selecting it\n private focusNode(node: Node): void {\n this.activeNode = node;\n this.updateTabStop();\n node.element?.focus();\n }\n\n // With multiSelect: the active node, if it is still rendered in the tree\n private getActiveNode(): Node | null {\n const element = this.activeNode?.element;\n\n return element && this.htmlElement.contains(element)\n ? this.activeNode\n : null;\n }\n\n // Get the maximum level for auto open\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n }\n if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n }\n if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n }\n\n /* istanbul ignore next @preserve */\n return 0;\n }\n\n private getFirstTreeItem(): HTMLElement | null {\n return this.tree.children[0]?.element ?? null;\n }\n\n // The node of the HTML element that has the focus, if it is in this tree\n private getFocusedNode(): Node | null {\n const activeElement = document.activeElement;\n\n // An active element must exist and the keyboard must still work for input elements.\n if (\n !activeElement ||\n ![\"A\", \"LI\", \"SPAN\"].includes(activeElement.tagName)\n ) {\n return null;\n }\n\n const node = this.getNode(activeElement as HTMLElement);\n return node?.tree === this.tree ? node : null;\n }\n\n private getNodeElement(element: HTMLElement): NodeElement | null {\n const node = this.getNode(element);\n return node ? this.getNodeElementForNode(node) : null;\n }\n\n private getNodeElementForNode(node: Node): NodeElement {\n return node.isFolder()\n ? this.createFolderElement(node)\n : this.createNodeElement(node);\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n return this.saveStateHandler.getNodeIdToBeSelected();\n }\n\n // With multiSelect, the focused node becomes the tab stop\n private handleFocusIn = (): void => {\n const node = this.getFocusedNode();\n\n if (!node || node === this.activeNode) {\n return;\n }\n\n this.activeNode = node;\n this.updateTabStop();\n };\n\n private hasRenderedSelectedNode(): boolean {\n return this.getSelectedNodes().some((node) => Boolean(node.element));\n }\n\n private initData(): void {\n if (this.options.data) {\n this.loadData(this.options.data);\n } else {\n const dataUrl = this.createRequestUrl();\n\n if (dataUrl) {\n void this.loadDataFromUrl();\n } else {\n this.loadData([]);\n }\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (this.isInitialized) {\n return;\n }\n\n this.isInitialized = true;\n this.triggerEvent(\"tree.init\");\n };\n\n // Before the tree is replaced: then the focused node is no longer in it\n const focusedNode = this.getFocusedNode();\n\n this.tree = new this.options.nodeClass(null, true, this.options.nodeClass);\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this.refreshElements(null);\n\n if (focusedNode) {\n this.restoreFocus(focusedNode);\n }\n\n if (mustLoadOnDemand) {\n // Load data on demand and then init the tree\n void this.setInitialStateOnDemand().then(doInit);\n } else {\n doInit();\n }\n }\n\n private async loadFolderOnDemand(node: Node, slide: boolean): Promise<void> {\n node.is_loading = true;\n\n await this.loadDataFromUrl(undefined, node);\n\n // Loading failed, or there is no url. Opening the node now would load it\n // again, without end. Leave it closed so the user can try again.\n if (node.load_on_demand) {\n node.is_loading = false;\n return;\n }\n\n await this.openNode(node, slide);\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this.refreshElements(parentNode);\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n return this.options.dragAndDrop\n ? this.dndHandler.mouseCapture(positionInfo)\n : false;\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n const result = this.dndHandler.mouseDrag(positionInfo);\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n return this.dndHandler.mouseStart(positionInfo);\n }\n\n private mouseStop(positionInfo: PositionInfo): void {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return;\n }\n\n this.scrollHandler.stopScrolling();\n this.dndHandler.mouseStop(positionInfo);\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent?.parent && !parent.is_open) {\n void this.openNode(parent, false);\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n private refreshElements(fromNode: Node | null): void {\n const focusedNode = this.getFocusedNode();\n\n // The renderer marks the selected nodes, so only the focus needs restoring\n this.renderer.render(fromNode);\n\n if (focusedNode) {\n this.restoreFocus(focusedNode);\n }\n\n this.updateTabStop();\n\n this.triggerEvent(\"tree.refresh\");\n }\n\n // Rendering replaces the elements of the nodes, so a focused element can be\n // gone. Then move the focus to the new element of the same node. After\n // loadData the nodes are new objects, so look the node up by its id.\n private restoreFocus(focusedNode: Node): void {\n if (this.htmlElement.contains(document.activeElement)) {\n return;\n }\n\n const node =\n (focusedNode.id == null ? null : this.getNodeById(focusedNode.id)) ??\n focusedNode;\n const element = node.element;\n\n if (element && this.htmlElement.contains(element)) {\n element.focus();\n }\n }\n\n private saveState(): void {\n this.saveStateHandler.saveState();\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n const mustLoadOnDemand = this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n return [false, false];\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n }\n if (node.hasChildren()) {\n node.is_open = true;\n return level !== maxLevel;\n }\n return false;\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n private async setInitialStateOnDemand(): Promise<void> {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n await this.saveStateHandler.setInitialStateOnDemand(state);\n } else {\n await this.autoOpenNodesOnDemand();\n }\n }\n\n /* Change multiSelect after construction. The attributes of the nodes\n * depend on it, so the tree is rendered again. The selection is kept: a\n * tree without multiSelect can also have several selected nodes, see\n * addToSelection.\n */\n private setMultiSelect(multiSelect: boolean): void {\n const focusedNode = this.getFocusedNode();\n\n this.keyHandler.setMultiSelect(multiSelect);\n this.renderer.setMultiSelect(multiSelect);\n\n if (multiSelect) {\n this.htmlElement.addEventListener(\"focusin\", this.handleFocusIn);\n } else {\n this.htmlElement.removeEventListener(\"focusin\", this.handleFocusIn);\n }\n\n this.activeNode = multiSelect ? focusedNode : null;\n this.fallbackTabStop = null;\n this.refreshElements(null);\n }\n\n // Set this HTML element to this node in the node map.\n private setNodeElement(element: HTMLElement, node: Node) {\n this.nodeMap.set(element, node);\n }\n\n private triggerEvent<Name extends TreeEventName>(\n eventName: Name,\n values?: TreeEvents[Name],\n ): boolean {\n return this.triggerEventProvider(this.htmlElement, eventName, values);\n }\n\n /* Keyboard users reach the tree through the tab stop. The selected node is\n * the tab stop, see NodeElement.select. Without a selected node, the first\n * node is the tab stop, so the tree can always be reached.\n * With multiSelect the tab stop is the active node: the node that was\n * focused last. Without one, it is the first node.\n */\n private updateTabStop(): void {\n const tabIndex = this.options.tabIndex;\n const multiSelect = this.options.multiSelect;\n const previousTabStop = this.fallbackTabStop;\n let tabStop: HTMLElement | null;\n\n if (tabIndex == null) {\n tabStop = null;\n } else if (multiSelect) {\n tabStop = this.getActiveNode()?.element ?? this.getFirstTreeItem();\n } else {\n tabStop = this.hasRenderedSelectedNode() ? null : this.getFirstTreeItem();\n }\n\n if (\n previousTabStop &&\n previousTabStop !== tabStop &&\n (multiSelect || previousTabStop.getAttribute(\"aria-selected\") !== \"true\")\n ) {\n previousTabStop.setAttribute(\"tabindex\", \"-1\");\n }\n\n if (tabStop && tabIndex != null) {\n tabStop.setAttribute(\"tabindex\", String(tabIndex));\n }\n\n this.fallbackTabStop = tabStop;\n }\n}\n\nexport {\n type MoveInfo,\n type TreeEvent,\n type TreeEventName,\n type TreeEvents,\n} from \"./events\";\nexport { type Node, type NodeData, type NodeId, type Position } from \"./node\";\nexport { type ChangeableOption, type TreeElementOptions } from \"./options\";\nexport { type SavedState } from \"./saveStateHandler\";\nexport { type SelectNodeOptions } from \"./selectNodeHandler\";\n"],"names":["activeNode","classNames","dataLoader","dndHandler","fallbackTabStop","htmlElement","isInitialized","keyHandler","mouseHandler","nodeMap","options","renderer","saveStateHandler","scrollHandler","selectNodeHandler","tree","triggerEventProvider","getNodeElement","getNodeElementForNode","getFocusedNode","openParents","refreshElements","setNodeElement","triggerEvent","updateTabStop","saveState","addToSelection","getSelectedNodes","isNodeSelected","removeFromSelection","selectSingleNode","toggleNodeInSelection","focusNode","getScrollLeft","getActiveNode","mouseCapture","mouseDrag","mouseStart","mouseStop","handleFocusIn","initData","select","createFolderElement","close","deinit","getSelectedNode","getState","getStateFromStorage","__version__","isDragging","deselectNodes","loadSubtree","initTree","refresh","createRequestUrl","loadFromUrl","moveDown","moveUp","open","loadFolderOnDemand","deselect","scrollToY","deselectAllNodes","setDragAndDrop","setKeyboardSupport","setMultiSelect","setTabIndex","setInitialState","autoOpenNodesOnDemand","getAutoOpenMaxLevel","renderChildren","icons","createNodeElement","setSearchParam","getNodeIdToBeSelected","getSelectedNodesUnder","getFirstTreeItem","hasRenderedSelectedNode","clear","restoreFocus","setInitialStateOnDemand","checkScrolling","stopScrolling","render"],"mappings":"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"}
@@ -30,6 +30,8 @@ export default class KeyHandler {
30
30
  deinit(): void;
31
31
  moveDown(): boolean;
32
32
  moveUp(): boolean;
33
+ setKeyboardSupport(keyboardSupport: boolean): void;
34
+ setMultiSelect(multiSelect: boolean): void;
33
35
  private activate;
34
36
  private getCurrentNode;
35
37
  private goToNode;
@@ -1 +1 @@
1
- {"version":3,"file":"keyHandler.d.ts","sourceRoot":"","sources":["../src/keyHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,OAAO,EACP,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,eAAe,CAAC;AAGvB,UAAU,gBAAgB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAOD,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,OAAO,EACP,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,YAAY,GACb,EAAE,gBAAgB;IAmBZ,MAAM,IAAI,IAAI;IAMd,QAAQ,IAAI,OAAO;IAInB,MAAM,IAAI,OAAO;IAKxB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa,CA8CnB;IAEF,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,MAAM;CAIf"}
1
+ {"version":3,"file":"keyHandler.d.ts","sourceRoot":"","sources":["../src/keyHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,OAAO,EACP,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,eAAe,CAAC;AAGvB,UAAU,gBAAgB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAOD,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,OAAO,EACP,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,YAAY,GACb,EAAE,gBAAgB;IAmBZ,MAAM,IAAI,IAAI;IAMd,QAAQ,IAAI,OAAO;IAInB,MAAM,IAAI,OAAO;IAKjB,kBAAkB,CAAC,eAAe,EAAE,OAAO,GAAG,IAAI;IAelD,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAKjD,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa,CA8CnB;IAEF,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,MAAM;CAIf"}