tree-element 0.3.1 → 0.4.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 (59) hide show
  1. package/README.md +1 -0
  2. package/lib/classNames.js +4 -4
  3. package/lib/classNames.js.map +1 -1
  4. package/lib/dataLoader.d.ts +0 -1
  5. package/lib/dataLoader.d.ts.map +1 -1
  6. package/lib/dataLoader.js +6 -6
  7. package/lib/dataLoader.js.map +1 -1
  8. package/lib/elementsRenderer.d.ts +4 -2
  9. package/lib/elementsRenderer.d.ts.map +1 -1
  10. package/lib/elementsRenderer.js +35 -21
  11. package/lib/elementsRenderer.js.map +1 -1
  12. package/lib/index.d.ts +10 -4
  13. package/lib/index.d.ts.map +1 -1
  14. package/lib/index.js +75 -18
  15. package/lib/index.js.map +1 -1
  16. package/lib/keyHandler.d.ts +14 -3
  17. package/lib/keyHandler.d.ts.map +1 -1
  18. package/lib/keyHandler.js +61 -32
  19. package/lib/keyHandler.js.map +1 -1
  20. package/lib/methodTypes.d.ts +3 -0
  21. package/lib/methodTypes.d.ts.map +1 -1
  22. package/lib/nodeElement/folderElement.d.ts +1 -1
  23. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  24. package/lib/nodeElement/folderElement.js +4 -4
  25. package/lib/nodeElement/folderElement.js.map +1 -1
  26. package/lib/nodeElement/index.d.ts +3 -2
  27. package/lib/nodeElement/index.d.ts.map +1 -1
  28. package/lib/nodeElement/index.js +15 -12
  29. package/lib/nodeElement/index.js.map +1 -1
  30. package/lib/options.d.ts +13 -0
  31. package/lib/options.d.ts.map +1 -1
  32. package/lib/selectNodeHandler.d.ts +3 -0
  33. package/lib/selectNodeHandler.d.ts.map +1 -1
  34. package/lib/selectNodeHandler.js +54 -22
  35. package/lib/selectNodeHandler.js.map +1 -1
  36. package/lib/setDefaultOptions.d.ts.map +1 -1
  37. package/lib/setDefaultOptions.js +5 -4
  38. package/lib/setDefaultOptions.js.map +1 -1
  39. package/lib/version.d.ts +1 -1
  40. package/lib/version.js +1 -1
  41. package/lib/version.js.map +1 -1
  42. package/package.json +19 -19
  43. package/src/classNames.ts +4 -4
  44. package/src/dataLoader.ts +6 -9
  45. package/src/elementsRenderer.ts +42 -24
  46. package/src/index.ts +83 -24
  47. package/src/keyHandler.ts +84 -34
  48. package/src/methodTypes.ts +6 -0
  49. package/src/nodeElement/folderElement.ts +4 -4
  50. package/src/nodeElement/index.ts +20 -17
  51. package/src/options.ts +13 -0
  52. package/src/selectNodeHandler.ts +58 -25
  53. package/src/setDefaultOptions.ts +5 -4
  54. package/src/version.ts +1 -1
  55. package/tree_element.css +16 -0
  56. package/tree_element.debug.js +260 -124
  57. package/tree_element.debug.js.map +1 -1
  58. package/tree_element.js +2 -2
  59. package/tree_element.js.map +1 -1
package/lib/keyHandler.js CHANGED
@@ -1,21 +1,34 @@
1
+ /* The keys move from the selected node and select the node they move to.
2
+ * With multiSelect they move from the focused node and only move the focus;
3
+ * Space adds the focused node to the selection or removes it.
4
+ */
5
+
1
6
  class KeyHandler {
2
7
  constructor({
3
8
  _closeNode: closeNode,
9
+ _focusNode: focusNode,
10
+ _getActiveNode: getActiveNode,
4
11
  _getFocusedNode: getFocusedNode,
5
12
  _getSelectedNode: getSelectedNode,
6
13
  _getTree: getTree,
7
14
  _keyboardSupport: keyboardSupport,
15
+ _multiSelect: multiSelect,
8
16
  _openNode: openNode,
9
17
  _selectNode: selectNode,
18
+ _toggleNodeInSelection: toggleNodeInSelection,
10
19
  _triggerEvent: triggerEvent
11
20
  }) {
12
21
  this._closeNode = closeNode;
22
+ this._focusNode = focusNode;
23
+ this._getActiveNode = getActiveNode;
13
24
  this._getFocusedNode = getFocusedNode;
14
25
  this._getSelectedNode = getSelectedNode;
15
26
  this._getTree = getTree;
16
27
  this._keyboardSupport = keyboardSupport;
28
+ this._multiSelect = multiSelect;
17
29
  this._openNode = openNode;
18
30
  this._originalSelectNode = selectNode;
31
+ this._toggleNodeInSelection = toggleNodeInSelection;
19
32
  this._triggerEvent = triggerEvent;
20
33
  if (keyboardSupport) {
21
34
  document.addEventListener("keydown", this._handleKeyDown);
@@ -27,10 +40,10 @@ class KeyHandler {
27
40
  }
28
41
  }
29
42
  _moveDown() {
30
- return this._selectNode(this._getSelectedNode()?.getNextVisibleNode());
43
+ return this._goToNode(this._getCurrentNode()?.getNextVisibleNode());
31
44
  }
32
45
  _moveUp() {
33
- return this._selectNode(this._getSelectedNode()?.getPreviousVisibleNode());
46
+ return this._goToNode(this._getCurrentNode()?.getPreviousVisibleNode());
34
47
  }
35
48
 
36
49
  // Activate the node, for example to open its edit page.
@@ -41,6 +54,26 @@ class KeyHandler {
41
54
  });
42
55
  return true;
43
56
  }
57
+
58
+ // No node is selected. These keys select the focused node, which is
59
+ // usually the first node, see TreeElement.updateTabStop.
60
+ _getCurrentNode() {
61
+ return this._multiSelect ? this._getActiveNode() : this._getSelectedNode();
62
+ }
63
+
64
+ // Move to the node: select it, or with multiSelect focus it.
65
+ // Result: there was a node to move to.
66
+ _goToNode(node) {
67
+ if (!node) {
68
+ return false;
69
+ }
70
+ if (this._multiSelect) {
71
+ this._focusNode(node);
72
+ } else {
73
+ this._originalSelectNode(node);
74
+ }
75
+ return true;
76
+ }
44
77
  _handleArrowKey(key) {
45
78
  switch (key) {
46
79
  case "ArrowDown":
@@ -65,49 +98,53 @@ class KeyHandler {
65
98
  }
66
99
  }
67
100
  }
101
+ _handleKey(key, focusedNode) {
102
+ return this._getCurrentNode() ? this._handleArrowKey(key) : this._handleKeyWithoutSelection(key, focusedNode);
103
+ }
68
104
  _handleKeyDown = e => {
69
105
  let focusedNode = this._getFocusedNode();
70
106
  if (!focusedNode) {
71
107
  return;
72
108
  }
73
109
  let isKeyHandled;
74
- let selectedNode = this._getSelectedNode();
75
110
  switch (e.key) {
111
+ case " ":
112
+ {
113
+ isKeyHandled = this._multiSelect ? this._toggle(focusedNode) : this._handleKey(e.key, focusedNode);
114
+ break;
115
+ }
76
116
  case "End":
77
117
  {
78
- isKeyHandled = this._selectNode(this._getTree()?.getLastChild());
118
+ isKeyHandled = this._goToNode(this._getTree()?.getLastChild());
79
119
  break;
80
120
  }
81
121
  case "Enter":
82
122
  {
83
123
  // Without a selected node, activate the focused node
84
- isKeyHandled = this._activate(selectedNode ?? focusedNode, e);
124
+ isKeyHandled = this._activate(this._multiSelect ? focusedNode : this._getSelectedNode() ?? focusedNode, e);
85
125
  break;
86
126
  }
87
127
  case "Home":
88
128
  {
89
- isKeyHandled = this._selectNode(this._getTree()?.children[0]);
129
+ isKeyHandled = this._goToNode(this._getTree()?.children[0]);
90
130
  break;
91
131
  }
92
132
  default:
93
133
  {
94
- isKeyHandled = selectedNode ? this._handleArrowKey(e.key) : this._handleKeyWithoutSelection(e.key, focusedNode);
134
+ isKeyHandled = this._handleKey(e.key, focusedNode);
95
135
  }
96
136
  }
97
137
  if (isKeyHandled) {
98
138
  e.preventDefault();
99
139
  }
100
140
  };
101
-
102
- // No node is selected. These keys select the focused node, which is
103
- // usually the first node, see TreeElement.updateTabStop.
104
141
  _handleKeyWithoutSelection(key, focusedNode) {
105
142
  switch (key) {
106
143
  case " ":
107
144
  case "ArrowDown":
108
145
  case "ArrowRight":
109
146
  {
110
- return this._selectNode(focusedNode);
147
+ return this._goToNode(focusedNode);
111
148
  }
112
149
  default:
113
150
  {
@@ -116,45 +153,37 @@ class KeyHandler {
116
153
  }
117
154
  }
118
155
  _moveLeft() {
119
- let selectedNode = this._getSelectedNode();
156
+ let currentNode = this._getCurrentNode();
120
157
 
121
158
  /* istanbul ignore if */
122
- if (!selectedNode) {
159
+ if (!currentNode) {
123
160
  return false;
124
161
  }
125
- if (selectedNode.isFolder() && selectedNode.is_open) {
162
+ if (currentNode.isFolder() && currentNode.is_open) {
126
163
  // Left on an open node closes the node
127
- void this._closeNode(selectedNode);
164
+ void this._closeNode(currentNode);
128
165
  return true;
129
166
  }
130
167
  // Left on a closed or end node moves focus to the node's parent
131
- return this._selectNode(selectedNode.getParent());
168
+ return this._goToNode(currentNode.getParent());
132
169
  }
133
170
  _moveRight() {
134
- let selectedNode = this._getSelectedNode();
135
- if (selectedNode?.isFolder()) {
171
+ let currentNode = this._getCurrentNode();
172
+ if (currentNode?.isFolder()) {
136
173
  // folder node
137
- if (selectedNode.is_open) {
174
+ if (currentNode.is_open) {
138
175
  // Right moves to the first child of an open node
139
- return this._selectNode(selectedNode.getNextVisibleNode());
176
+ return this._goToNode(currentNode.getNextVisibleNode());
140
177
  }
141
178
  // Right expands a closed node
142
- void this._openNode(selectedNode);
179
+ void this._openNode(currentNode);
143
180
  return true;
144
181
  }
145
182
  return false;
146
183
  }
147
-
148
- /* Select the node.
149
- * Don't do anything if the node is null.
150
- * Result: a different node was selected.
151
- */
152
- _selectNode(node) {
153
- if (node) {
154
- this._originalSelectNode(node);
155
- return true;
156
- }
157
- return false;
184
+ _toggle(node) {
185
+ this._toggleNodeInSelection(node);
186
+ return true;
158
187
  }
159
188
  }
160
189
 
@@ -1 +1 @@
1
- {"version":3,"file":"keyHandler.js","sources":["../src/keyHandler.ts"],"sourcesContent":["import type {\n CloseNode,\n GetFocusedNode,\n GetSelectedNode,\n GetTree,\n OpenNode,\n SelectNode,\n TriggerEvent,\n} from \"./methodTypes\";\nimport type { Node } from \"./node\";\n\ninterface KeyHandlerParams {\n closeNode: CloseNode;\n getFocusedNode: GetFocusedNode;\n getSelectedNode: GetSelectedNode;\n getTree: GetTree;\n keyboardSupport: boolean;\n openNode: OpenNode;\n selectNode: SelectNode;\n triggerEvent: TriggerEvent;\n}\n\nexport default class KeyHandler {\n private closeNode: CloseNode;\n private getFocusedNode: GetFocusedNode;\n private getSelectedNode: GetSelectedNode;\n private getTree: GetTree;\n\n private keyboardSupport: boolean;\n private openNode: OpenNode;\n private originalSelectNode: SelectNode;\n private triggerEvent: TriggerEvent;\n\n constructor({\n closeNode,\n getFocusedNode,\n getSelectedNode,\n getTree,\n keyboardSupport,\n openNode,\n selectNode,\n triggerEvent,\n }: KeyHandlerParams) {\n this.closeNode = closeNode;\n this.getFocusedNode = getFocusedNode;\n this.getSelectedNode = getSelectedNode;\n this.getTree = getTree;\n this.keyboardSupport = keyboardSupport;\n this.openNode = openNode;\n this.originalSelectNode = selectNode;\n this.triggerEvent = triggerEvent;\n\n if (keyboardSupport) {\n document.addEventListener(\"keydown\", this.handleKeyDown);\n }\n }\n\n public deinit(): void {\n if (this.keyboardSupport) {\n document.removeEventListener(\"keydown\", this.handleKeyDown);\n }\n }\n\n public moveDown(): boolean {\n return this.selectNode(this.getSelectedNode()?.getNextVisibleNode());\n }\n\n public moveUp(): boolean {\n return this.selectNode(this.getSelectedNode()?.getPreviousVisibleNode());\n }\n\n // Activate the node, for example to open its edit page.\n private activate(node: Node, originalEvent: KeyboardEvent): boolean {\n this.triggerEvent(\"tree.activate\", { node, originalEvent });\n return true;\n }\n\n private handleArrowKey(key: string): boolean {\n switch (key) {\n case \"ArrowDown\": {\n return this.moveDown();\n }\n\n case \"ArrowLeft\": {\n return this.moveLeft();\n }\n\n case \"ArrowRight\": {\n return this.moveRight();\n }\n\n case \"ArrowUp\": {\n return this.moveUp();\n }\n\n default: {\n return false;\n }\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n const focusedNode = this.getFocusedNode();\n\n if (!focusedNode) {\n return;\n }\n\n let isKeyHandled: boolean;\n\n const selectedNode = this.getSelectedNode();\n\n switch (e.key) {\n case \"End\": {\n isKeyHandled = this.selectNode(this.getTree()?.getLastChild());\n break;\n }\n\n case \"Enter\": {\n // Without a selected node, activate the focused node\n isKeyHandled = this.activate(selectedNode ?? focusedNode, e);\n break;\n }\n\n case \"Home\": {\n isKeyHandled = this.selectNode(this.getTree()?.children[0]);\n break;\n }\n\n default: {\n isKeyHandled = selectedNode\n ? this.handleArrowKey(e.key)\n : this.handleKeyWithoutSelection(e.key, focusedNode);\n }\n }\n\n if (isKeyHandled) {\n e.preventDefault();\n }\n };\n\n // No node is selected. These keys select the focused node, which is\n // usually the first node, see TreeElement.updateTabStop.\n private handleKeyWithoutSelection(key: string, focusedNode: Node): boolean {\n switch (key) {\n case \" \":\n case \"ArrowDown\":\n case \"ArrowRight\": {\n return this.selectNode(focusedNode);\n }\n\n default: {\n return false;\n }\n }\n }\n\n private moveLeft(): boolean {\n const selectedNode = this.getSelectedNode();\n\n /* istanbul ignore if */\n if (!selectedNode) {\n return false;\n }\n\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n void this.closeNode(selectedNode);\n return true;\n }\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n\n private moveRight(): boolean {\n const selectedNode = this.getSelectedNode();\n\n if (selectedNode?.isFolder()) {\n // folder node\n if (selectedNode.is_open) {\n // Right moves to the first child of an open node\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n // Right expands a closed node\n void this.openNode(selectedNode);\n return true;\n }\n return false;\n }\n\n /* Select the node.\n * Don't do anything if the node is null.\n * Result: a different node was selected.\n */\n private selectNode(node?: Node | null): boolean {\n if (node) {\n this.originalSelectNode(node);\n\n return true;\n }\n return false;\n }\n}\n"],"names":["closeNode","getFocusedNode","getSelectedNode","getTree","keyboardSupport","openNode","originalSelectNode","triggerEvent","handleKeyDown","deinit","moveDown","selectNode","moveUp","activate","handleArrowKey","moveLeft","moveRight","handleKeyWithoutSelection"],"mappings":"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"}
1
+ {"version":3,"file":"keyHandler.js","sources":["../src/keyHandler.ts"],"sourcesContent":["import type {\n CloseNode,\n FocusNode,\n GetActiveNode,\n GetFocusedNode,\n GetSelectedNode,\n GetTree,\n OpenNode,\n SelectNode,\n ToggleNodeInSelection,\n TriggerEvent,\n} from \"./methodTypes\";\nimport type { Node } from \"./node\";\n\ninterface KeyHandlerParams {\n closeNode: CloseNode;\n focusNode: FocusNode;\n getActiveNode: GetActiveNode;\n getFocusedNode: GetFocusedNode;\n getSelectedNode: GetSelectedNode;\n getTree: GetTree;\n keyboardSupport: boolean;\n multiSelect: boolean;\n openNode: OpenNode;\n selectNode: SelectNode;\n toggleNodeInSelection: ToggleNodeInSelection;\n triggerEvent: TriggerEvent;\n}\n\n/* The keys move from the selected node and select the node they move to.\n * With multiSelect they move from the focused node and only move the focus;\n * Space adds the focused node to the selection or removes it.\n */\n\nexport default class KeyHandler {\n private closeNode: CloseNode;\n private focusNode: FocusNode;\n private getActiveNode: GetActiveNode;\n private getFocusedNode: GetFocusedNode;\n private getSelectedNode: GetSelectedNode;\n private getTree: GetTree;\n\n private keyboardSupport: boolean;\n private multiSelect: boolean;\n private openNode: OpenNode;\n private originalSelectNode: SelectNode;\n private toggleNodeInSelection: ToggleNodeInSelection;\n private triggerEvent: TriggerEvent;\n\n constructor({\n closeNode,\n focusNode,\n getActiveNode,\n getFocusedNode,\n getSelectedNode,\n getTree,\n keyboardSupport,\n multiSelect,\n openNode,\n selectNode,\n toggleNodeInSelection,\n triggerEvent,\n }: KeyHandlerParams) {\n this.closeNode = closeNode;\n this.focusNode = focusNode;\n this.getActiveNode = getActiveNode;\n this.getFocusedNode = getFocusedNode;\n this.getSelectedNode = getSelectedNode;\n this.getTree = getTree;\n this.keyboardSupport = keyboardSupport;\n this.multiSelect = multiSelect;\n this.openNode = openNode;\n this.originalSelectNode = selectNode;\n this.toggleNodeInSelection = toggleNodeInSelection;\n this.triggerEvent = triggerEvent;\n\n if (keyboardSupport) {\n document.addEventListener(\"keydown\", this.handleKeyDown);\n }\n }\n\n public deinit(): void {\n if (this.keyboardSupport) {\n document.removeEventListener(\"keydown\", this.handleKeyDown);\n }\n }\n\n public moveDown(): boolean {\n return this.goToNode(this.getCurrentNode()?.getNextVisibleNode());\n }\n\n public moveUp(): boolean {\n return this.goToNode(this.getCurrentNode()?.getPreviousVisibleNode());\n }\n\n // Activate the node, for example to open its edit page.\n private activate(node: Node, originalEvent: KeyboardEvent): boolean {\n this.triggerEvent(\"tree.activate\", { node, originalEvent });\n return true;\n }\n\n // No node is selected. These keys select the focused node, which is\n // usually the first node, see TreeElement.updateTabStop.\n private getCurrentNode(): Node | null {\n return this.multiSelect ? this.getActiveNode() : this.getSelectedNode();\n }\n\n // Move to the node: select it, or with multiSelect focus it.\n // Result: there was a node to move to.\n private goToNode(node?: Node | null): boolean {\n if (!node) {\n return false;\n }\n\n if (this.multiSelect) {\n this.focusNode(node);\n } else {\n this.originalSelectNode(node);\n }\n\n return true;\n }\n\n private handleArrowKey(key: string): boolean {\n switch (key) {\n case \"ArrowDown\": {\n return this.moveDown();\n }\n\n case \"ArrowLeft\": {\n return this.moveLeft();\n }\n\n case \"ArrowRight\": {\n return this.moveRight();\n }\n\n case \"ArrowUp\": {\n return this.moveUp();\n }\n\n default: {\n return false;\n }\n }\n }\n\n private handleKey(key: string, focusedNode: Node): boolean {\n return this.getCurrentNode()\n ? this.handleArrowKey(key)\n : this.handleKeyWithoutSelection(key, focusedNode);\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n const focusedNode = this.getFocusedNode();\n\n if (!focusedNode) {\n return;\n }\n\n let isKeyHandled: boolean;\n\n switch (e.key) {\n case \" \": {\n isKeyHandled = this.multiSelect\n ? this.toggle(focusedNode)\n : this.handleKey(e.key, focusedNode);\n break;\n }\n\n case \"End\": {\n isKeyHandled = this.goToNode(this.getTree()?.getLastChild());\n break;\n }\n\n case \"Enter\": {\n // Without a selected node, activate the focused node\n isKeyHandled = this.activate(\n this.multiSelect\n ? focusedNode\n : (this.getSelectedNode() ?? focusedNode),\n e,\n );\n break;\n }\n\n case \"Home\": {\n isKeyHandled = this.goToNode(this.getTree()?.children[0]);\n break;\n }\n\n default: {\n isKeyHandled = this.handleKey(e.key, focusedNode);\n }\n }\n\n if (isKeyHandled) {\n e.preventDefault();\n }\n };\n\n private handleKeyWithoutSelection(key: string, focusedNode: Node): boolean {\n switch (key) {\n case \" \":\n case \"ArrowDown\":\n case \"ArrowRight\": {\n return this.goToNode(focusedNode);\n }\n\n default: {\n return false;\n }\n }\n }\n\n private moveLeft(): boolean {\n const currentNode = this.getCurrentNode();\n\n /* istanbul ignore if */\n if (!currentNode) {\n return false;\n }\n\n if (currentNode.isFolder() && currentNode.is_open) {\n // Left on an open node closes the node\n void this.closeNode(currentNode);\n return true;\n }\n // Left on a closed or end node moves focus to the node's parent\n return this.goToNode(currentNode.getParent());\n }\n\n private moveRight(): boolean {\n const currentNode = this.getCurrentNode();\n\n if (currentNode?.isFolder()) {\n // folder node\n if (currentNode.is_open) {\n // Right moves to the first child of an open node\n return this.goToNode(currentNode.getNextVisibleNode());\n }\n // Right expands a closed node\n void this.openNode(currentNode);\n return true;\n }\n return false;\n }\n\n private toggle(node: Node): boolean {\n this.toggleNodeInSelection(node);\n return true;\n }\n}\n"],"names":["closeNode","focusNode","getActiveNode","getFocusedNode","getSelectedNode","getTree","keyboardSupport","multiSelect","openNode","originalSelectNode","toggleNodeInSelection","triggerEvent","handleKeyDown","deinit","moveDown","goToNode","getCurrentNode","moveUp","activate","handleArrowKey","moveLeft","moveRight","handleKey","handleKeyWithoutSelection","toggle"],"mappings":"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"}
@@ -3,6 +3,8 @@ import type { Node, NodeData, NodeId } from "./node.js";
3
3
  import type NodeElement from "./nodeElement/index.js";
4
4
  export type AddToSelection = (node: Node) => void;
5
5
  export type CloseNode = (node: Node) => Promise<void>;
6
+ export type FocusNode = (node: Node) => void;
7
+ export type GetActiveNode = () => Node | null;
6
8
  export type GetFocusedNode = () => Node | null;
7
9
  export type GetNodeById = (nodeId: NodeId) => Node | null;
8
10
  export type GetNodeElementForNode = (node: Node) => NodeElement;
@@ -17,5 +19,6 @@ export type OpenParents = (node: Node) => void;
17
19
  export type RefreshElements = (fromNode: Node | null) => void;
18
20
  export type RemoveFromSelection = (node: Node) => void;
19
21
  export type SelectNode = (node: Node) => void;
22
+ export type ToggleNodeInSelection = (node: Node) => void;
20
23
  export type TriggerEvent = <Name extends TreeEventName>(eventName: Name, values?: TreeEvents[Name]) => boolean;
21
24
  //# sourceMappingURL=methodTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"methodTypes.d.ts","sourceRoot":"","sources":["../src/methodTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC;AAEzC,MAAM,MAAM,eAAe,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG,MAAM,IAAI,EAAE,CAAC;AAE5C,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;AAErE,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAG9C,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,SAAS,aAAa,EACpD,SAAS,EAAE,IAAI,EACf,MAAM,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,KACtB,OAAO,CAAC"}
1
+ {"version":3,"file":"methodTypes.d.ts","sourceRoot":"","sources":["../src/methodTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAE7C,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC;AAEzC,MAAM,MAAM,eAAe,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG,MAAM,IAAI,EAAE,CAAC;AAE5C,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;AAErE,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAGzD,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,SAAS,aAAa,EACpD,SAAS,EAAE,IAAI,EACf,MAAM,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,KACtB,OAAO,CAAC"}
@@ -15,7 +15,7 @@ declare class FolderElement extends NodeElement {
15
15
  private openedIconElement?;
16
16
  private renderChildren;
17
17
  private triggerEvent;
18
- constructor({ classNames, closedIconElement, getScrollLeft, node, openedIconElement, renderChildren, tabIndex, treeElement, triggerEvent, }: FolderElementParams);
18
+ constructor({ classNames, closedIconElement, getScrollLeft, multiSelect, node, openedIconElement, renderChildren, tabIndex, treeElement, triggerEvent, }: FolderElementParams);
19
19
  close(slide: boolean, animationSpeed: AnimationSpeed): Promise<void>;
20
20
  open(slide: boolean, animationSpeed: AnimationSpeed): Promise<void>;
21
21
  protected mustShowBorderDropHint(position: Position): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"folderElement.d.ts","sourceRoot":"","sources":["../../src/nodeElement/folderElement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,WAAW,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,gBAAgB,GAAG,IAAI,CAAC;AAErE,UAAU,mBAAoB,SAAQ,iBAAiB;IACrD,iBAAiB,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC;IACpC,iBAAiB,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC;IACpC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,cAAM,aAAc,SAAQ,WAAW;IACrC,OAAO,CAAC,iBAAiB,CAAC,CAAkB;IAC5C,OAAO,CAAC,iBAAiB,CAAC,CAAkB;IAC5C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,WAAW,EACX,YAAY,GACb,EAAE,mBAAmB;IAeT,KAAK,CAChB,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC;IA2CH,IAAI,CACf,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC;IA6ChB,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAI7D,OAAO,CAAC,SAAS;CAKlB;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"folderElement.d.ts","sourceRoot":"","sources":["../../src/nodeElement/folderElement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,WAAW,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,gBAAgB,GAAG,IAAI,CAAC;AAErE,UAAU,mBAAoB,SAAQ,iBAAiB;IACrD,iBAAiB,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC;IACpC,iBAAiB,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC;IACpC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,cAAM,aAAc,SAAQ,WAAW;IACrC,OAAO,CAAC,iBAAiB,CAAC,CAAkB;IAC5C,OAAO,CAAC,iBAAiB,CAAC,CAAkB;IAC5C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,WAAW,EACX,YAAY,GACb,EAAE,mBAAmB;IAgBT,KAAK,CAChB,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC;IA0CH,IAAI,CACf,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC;IA4ChB,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAI7D,OAAO,CAAC,SAAS;CAKlB;AAED,eAAe,aAAa,CAAC"}
@@ -6,6 +6,7 @@ class FolderElement extends NodeElement {
6
6
  _classNames: classNames,
7
7
  _closedIconElement: closedIconElement,
8
8
  _getScrollLeft: getScrollLeft,
9
+ _multiSelect: multiSelect,
9
10
  _node: node,
10
11
  _openedIconElement: openedIconElement,
11
12
  _renderChildren: renderChildren,
@@ -16,6 +17,7 @@ class FolderElement extends NodeElement {
16
17
  super({
17
18
  _classNames: classNames,
18
19
  _getScrollLeft: getScrollLeft,
20
+ _multiSelect: multiSelect,
19
21
  _node: node,
20
22
  _tabIndex: tabIndex,
21
23
  _treeElement: treeElement
@@ -53,8 +55,7 @@ class FolderElement extends NodeElement {
53
55
  }
54
56
  }
55
57
  this._element.classList.add(this._classNames.closed);
56
- let titleSpan = this._getTitleSpan();
57
- titleSpan.setAttribute("aria-expanded", "false");
58
+ this._element.setAttribute("aria-expanded", "false");
58
59
  this._triggerEvent("tree.close", {
59
60
  node: this._node
60
61
  });
@@ -90,8 +91,7 @@ class FolderElement extends NodeElement {
90
91
  }
91
92
  }
92
93
  this._element.classList.remove(this._classNames.closed);
93
- let titleSpan = this._getTitleSpan();
94
- titleSpan.setAttribute("aria-expanded", "true");
94
+ this._element.setAttribute("aria-expanded", "true");
95
95
  this._triggerEvent("tree.open", {
96
96
  node: this._node
97
97
  });
@@ -1 +1 @@
1
- {"version":3,"file":"folderElement.js","sources":["../../src/nodeElement/folderElement.ts"],"sourcesContent":["import type { AnimationSpeed } from \"../animation\";\nimport type { TriggerEvent } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\nimport type { NodeElementParams } from \"./index\";\n\nimport { slideDown, slideUp } from \"../animation\";\nimport NodeElement from \"./index\";\n\nexport type RenderChildren = (node: Node) => HTMLUListElement | null;\n\ninterface FolderElementParams extends NodeElementParams {\n closedIconElement?: globalThis.Node;\n openedIconElement?: globalThis.Node;\n renderChildren: RenderChildren;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private closedIconElement?: globalThis.Node;\n private openedIconElement?: globalThis.Node;\n private renderChildren: RenderChildren;\n private triggerEvent: TriggerEvent;\n\n constructor({\n classNames,\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n classNames,\n getScrollLeft,\n node,\n tabIndex,\n treeElement,\n });\n\n this.closedIconElement = closedIconElement;\n this.openedIconElement = openedIconElement;\n this.renderChildren = renderChildren;\n this.triggerEvent = triggerEvent;\n }\n\n public async close(\n slide: boolean,\n animationSpeed: AnimationSpeed,\n ): Promise<void> {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n if (!this.isRendered()) {\n this.triggerEvent(\"tree.close\", { node: this.node });\n return;\n }\n\n const button = this.getButton();\n button.classList.add(this.classNames.closed);\n button.replaceChildren();\n\n const closedIconElement = this.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.append(icon);\n }\n\n const ul = this.getUl();\n\n if (ul) {\n if (slide) {\n await slideUp(ul, animationSpeed);\n } else {\n ul.style.display = \"none\";\n }\n }\n\n this.element.classList.add(this.classNames.closed);\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.triggerEvent(\"tree.close\", {\n node: this.node,\n });\n }\n\n public async open(\n slide: boolean,\n animationSpeed: AnimationSpeed,\n ): Promise<void> {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n if (!this.isRendered()) {\n // The folder is rendered open when its parent is opened\n this.triggerEvent(\"tree.open\", { node: this.node });\n return;\n }\n\n const button = this.getButton();\n button.classList.remove(this.classNames.closed);\n button.replaceChildren();\n\n const openedIconElement = this.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.append(icon);\n }\n\n // The children are rendered the first time the folder is opened\n const ul = this.getUl() ?? this.renderChildren(this.node);\n\n if (ul) {\n if (slide) {\n await slideDown(ul, animationSpeed);\n } else {\n ul.style.display = \"block\";\n }\n }\n\n this.element.classList.remove(this.classNames.closed);\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n this.triggerEvent(\"tree.open\", {\n node: this.node,\n });\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === \"inside\";\n }\n\n private getButton(): HTMLElement {\n return this.element.querySelector(\n `:scope > .${this.classNames.element} > .${this.classNames.toggler}`,\n ) as HTMLElement;\n }\n}\n\nexport default FolderElement;\n"],"names":["closedIconElement","openedIconElement","renderChildren","triggerEvent","close","node","isRendered","getButton","classNames","getUl","element","getTitleSpan","open","mustShowBorderDropHint"],"mappings":"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"}
1
+ {"version":3,"file":"folderElement.js","sources":["../../src/nodeElement/folderElement.ts"],"sourcesContent":["import type { AnimationSpeed } from \"../animation\";\nimport type { TriggerEvent } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\nimport type { NodeElementParams } from \"./index\";\n\nimport { slideDown, slideUp } from \"../animation\";\nimport NodeElement from \"./index\";\n\nexport type RenderChildren = (node: Node) => HTMLUListElement | null;\n\ninterface FolderElementParams extends NodeElementParams {\n closedIconElement?: globalThis.Node;\n openedIconElement?: globalThis.Node;\n renderChildren: RenderChildren;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private closedIconElement?: globalThis.Node;\n private openedIconElement?: globalThis.Node;\n private renderChildren: RenderChildren;\n private triggerEvent: TriggerEvent;\n\n constructor({\n classNames,\n closedIconElement,\n getScrollLeft,\n multiSelect,\n node,\n openedIconElement,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n classNames,\n getScrollLeft,\n multiSelect,\n node,\n tabIndex,\n treeElement,\n });\n\n this.closedIconElement = closedIconElement;\n this.openedIconElement = openedIconElement;\n this.renderChildren = renderChildren;\n this.triggerEvent = triggerEvent;\n }\n\n public async close(\n slide: boolean,\n animationSpeed: AnimationSpeed,\n ): Promise<void> {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n if (!this.isRendered()) {\n this.triggerEvent(\"tree.close\", { node: this.node });\n return;\n }\n\n const button = this.getButton();\n button.classList.add(this.classNames.closed);\n button.replaceChildren();\n\n const closedIconElement = this.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.append(icon);\n }\n\n const ul = this.getUl();\n\n if (ul) {\n if (slide) {\n await slideUp(ul, animationSpeed);\n } else {\n ul.style.display = \"none\";\n }\n }\n\n this.element.classList.add(this.classNames.closed);\n\n this.element.setAttribute(\"aria-expanded\", \"false\");\n\n this.triggerEvent(\"tree.close\", {\n node: this.node,\n });\n }\n\n public async open(\n slide: boolean,\n animationSpeed: AnimationSpeed,\n ): Promise<void> {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n if (!this.isRendered()) {\n // The folder is rendered open when its parent is opened\n this.triggerEvent(\"tree.open\", { node: this.node });\n return;\n }\n\n const button = this.getButton();\n button.classList.remove(this.classNames.closed);\n button.replaceChildren();\n\n const openedIconElement = this.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.append(icon);\n }\n\n // The children are rendered the first time the folder is opened\n const ul = this.getUl() ?? this.renderChildren(this.node);\n\n if (ul) {\n if (slide) {\n await slideDown(ul, animationSpeed);\n } else {\n ul.style.display = \"block\";\n }\n }\n\n this.element.classList.remove(this.classNames.closed);\n\n this.element.setAttribute(\"aria-expanded\", \"true\");\n\n this.triggerEvent(\"tree.open\", {\n node: this.node,\n });\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === \"inside\";\n }\n\n private getButton(): HTMLElement {\n return this.element.querySelector(\n `:scope > .${this.classNames.element} > .${this.classNames.toggler}`,\n ) as HTMLElement;\n }\n}\n\nexport default FolderElement;\n"],"names":["closedIconElement","openedIconElement","renderChildren","triggerEvent","close","node","isRendered","getButton","classNames","getUl","element","open","mustShowBorderDropHint"],"mappings":"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"}
@@ -5,6 +5,7 @@ import type { Node, Position } from "../node.js";
5
5
  export interface NodeElementParams {
6
6
  classNames: ClassNames;
7
7
  getScrollLeft: GetScrollLeft;
8
+ multiSelect?: boolean;
8
9
  node: Node;
9
10
  tabIndex?: number;
10
11
  treeElement: HTMLElement;
@@ -14,13 +15,13 @@ declare class NodeElement {
14
15
  node: Node;
15
16
  protected classNames: ClassNames;
16
17
  private getScrollLeft;
18
+ private multiSelect;
17
19
  private tabIndex?;
18
20
  private treeElement;
19
- constructor({ classNames, getScrollLeft, node, tabIndex, treeElement, }: NodeElementParams);
21
+ constructor({ classNames, getScrollLeft, multiSelect, node, tabIndex, treeElement, }: NodeElementParams);
20
22
  addDropHint(position: Position): DropHint;
21
23
  deselect(): void;
22
24
  select(mustSetFocus: boolean): void;
23
- protected getTitleSpan(): HTMLSpanElement;
24
25
  protected getUl(): HTMLUListElement | null;
25
26
  protected isRendered(): boolean;
26
27
  protected mustShowBorderDropHint(position: Position): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nodeElement/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK9C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,cAAM,WAAW;IACR,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IAClB,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAc;gBAErB,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,WAAW,GACZ,EAAE,iBAAiB;IAWb,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAMzC,QAAQ,IAAI,IAAI;IAmBhB,MAAM,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI;IAsB1C,SAAS,CAAC,YAAY,IAAI,eAAe;IAMzC,SAAS,CAAC,KAAK,IAAI,gBAAgB,GAAG,IAAI;IAO1C,SAAS,CAAC,UAAU,IAAI,OAAO;IAI/B,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;CAG9D;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nodeElement/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK9C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAI7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,cAAM,WAAW;IACR,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IAClB,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAc;gBAErB,EACV,UAAU,EACV,aAAa,EACb,WAAmB,EACnB,IAAI,EACJ,QAAQ,EACR,WAAW,GACZ,EAAE,iBAAiB;IAYb,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAMzC,QAAQ,IAAI,IAAI;IAuBhB,MAAM,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI;IAoB1C,SAAS,CAAC,KAAK,IAAI,gBAAgB,GAAG,IAAI;IAO1C,SAAS,CAAC,UAAU,IAAI,OAAO;IAI/B,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;CAG9D;AAED,eAAe,WAAW,CAAC"}
@@ -5,12 +5,14 @@ class NodeElement {
5
5
  constructor({
6
6
  _classNames: classNames,
7
7
  _getScrollLeft: getScrollLeft,
8
+ _multiSelect: multiSelect = false,
8
9
  _node: node,
9
10
  _tabIndex: tabIndex,
10
11
  _treeElement: treeElement
11
12
  }) {
12
13
  this._classNames = classNames;
13
14
  this._getScrollLeft = getScrollLeft;
15
+ this._multiSelect = multiSelect;
14
16
  this._node = node;
15
17
  this._tabIndex = tabIndex;
16
18
  this._treeElement = treeElement;
@@ -26,35 +28,36 @@ class NodeElement {
26
28
  return;
27
29
  }
28
30
  this._element.classList.remove(this._classNames.selected);
29
- let titleSpan = this._getTitleSpan();
31
+
32
+ // Only a multiselect tree marks the nodes that are not selected
33
+ if (this._multiSelect) {
34
+ this._element.setAttribute("aria-selected", "false");
35
+ return;
36
+ }
37
+ this._element.removeAttribute("aria-selected");
30
38
 
31
39
  // Check for null or undefined
32
40
  if (this._tabIndex != null) {
33
- titleSpan.setAttribute("tabindex", "-1");
41
+ this._element.setAttribute("tabindex", "-1");
34
42
  }
35
- titleSpan.setAttribute("aria-selected", "false");
36
- titleSpan.blur();
43
+ this._element.blur();
37
44
  }
38
45
  _select(mustSetFocus) {
39
46
  if (!this._isRendered()) {
40
47
  return;
41
48
  }
42
49
  this._element.classList.add(this._classNames.selected);
43
- let titleSpan = this._getTitleSpan();
50
+ this._element.setAttribute("aria-selected", "true");
44
51
  let tabIndex = this._tabIndex;
45
52
 
46
53
  // Check for null or undefined
47
- if (tabIndex != null) {
48
- titleSpan.setAttribute("tabindex", tabIndex.toString());
54
+ if (tabIndex != null && !this._multiSelect) {
55
+ this._element.setAttribute("tabindex", tabIndex.toString());
49
56
  }
50
- titleSpan.setAttribute("aria-selected", "true");
51
57
  if (mustSetFocus) {
52
- titleSpan.focus();
58
+ this._element.focus();
53
59
  }
54
60
  }
55
- _getTitleSpan() {
56
- return this._element.querySelector(`:scope > .${this._classNames.element} > span.${this._classNames.title}`);
57
- }
58
61
  _getUl() {
59
62
  return this._element.querySelector(":scope > ul");
60
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/nodeElement/index.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\nimport type { DropHint } from \"../dragAndDropHandler/types\";\nimport type { GetScrollLeft } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\n\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\n\nexport interface NodeElementParams {\n classNames: ClassNames;\n getScrollLeft: GetScrollLeft;\n node: Node;\n tabIndex?: number;\n treeElement: HTMLElement;\n}\n\nclass NodeElement {\n public element: HTMLElement;\n public node: Node;\n protected classNames: ClassNames;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private treeElement: HTMLElement;\n\n constructor({\n classNames,\n getScrollLeft,\n node,\n tabIndex,\n treeElement,\n }: NodeElementParams) {\n this.classNames = classNames;\n this.getScrollLeft = getScrollLeft;\n this.node = node;\n this.tabIndex = tabIndex;\n this.treeElement = treeElement;\n\n // The root node has no element of its own; it uses the tree element.\n this.element = node.element ?? this.treeElement;\n }\n\n public addDropHint(position: Position): DropHint {\n return this.mustShowBorderDropHint(position)\n ? new BorderDropHint(this.element, this.getScrollLeft(), this.classNames)\n : new GhostDropHint(this.node, this.element, position, this.classNames);\n }\n\n public deselect(): void {\n if (!this.isRendered()) {\n return;\n }\n\n this.element.classList.remove(this.classNames.selected);\n\n const titleSpan = this.getTitleSpan();\n\n // Check for null or undefined\n if (this.tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", \"-1\");\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.blur();\n }\n\n public select(mustSetFocus: boolean): void {\n if (!this.isRendered()) {\n return;\n }\n\n this.element.classList.add(this.classNames.selected);\n\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n `:scope > .${this.classNames.element} > span.${this.classNames.title}`,\n ) as HTMLSpanElement;\n }\n\n protected getUl(): HTMLUListElement | null {\n return this.element.querySelector(\":scope > ul\");\n }\n\n /* A node inside a closed folder is not rendered. Its selected and open\n * state is applied when it is rendered.\n */\n protected isRendered(): boolean {\n return Boolean(this.node.element);\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === \"inside\";\n }\n}\n\nexport default NodeElement;\n"],"names":["classNames","getScrollLeft","node","tabIndex","treeElement","element","addDropHint","mustShowBorderDropHint","deselect","isRendered","getTitleSpan","select","getUl"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/nodeElement/index.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\nimport type { DropHint } from \"../dragAndDropHandler/types\";\nimport type { GetScrollLeft } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\n\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\n\nexport interface NodeElementParams {\n classNames: ClassNames;\n getScrollLeft: GetScrollLeft;\n /* With multiSelect the focus moves independently of the selection, so\n * selecting doesn't change the tabindex or the focus.\n */\n multiSelect?: boolean;\n node: Node;\n tabIndex?: number;\n treeElement: HTMLElement;\n}\n\nclass NodeElement {\n public element: HTMLElement;\n public node: Node;\n protected classNames: ClassNames;\n private getScrollLeft: GetScrollLeft;\n private multiSelect: boolean;\n private tabIndex?: number;\n private treeElement: HTMLElement;\n\n constructor({\n classNames,\n getScrollLeft,\n multiSelect = false,\n node,\n tabIndex,\n treeElement,\n }: NodeElementParams) {\n this.classNames = classNames;\n this.getScrollLeft = getScrollLeft;\n this.multiSelect = multiSelect;\n this.node = node;\n this.tabIndex = tabIndex;\n this.treeElement = treeElement;\n\n // The root node has no element of its own; it uses the tree element.\n this.element = node.element ?? this.treeElement;\n }\n\n public addDropHint(position: Position): DropHint {\n return this.mustShowBorderDropHint(position)\n ? new BorderDropHint(this.element, this.getScrollLeft(), this.classNames)\n : new GhostDropHint(this.node, this.element, position, this.classNames);\n }\n\n public deselect(): void {\n if (!this.isRendered()) {\n return;\n }\n\n this.element.classList.remove(this.classNames.selected);\n\n // Only a multiselect tree marks the nodes that are not selected\n if (this.multiSelect) {\n this.element.setAttribute(\"aria-selected\", \"false\");\n return;\n }\n\n this.element.removeAttribute(\"aria-selected\");\n\n // Check for null or undefined\n if (this.tabIndex != null) {\n this.element.setAttribute(\"tabindex\", \"-1\");\n }\n\n this.element.blur();\n }\n\n public select(mustSetFocus: boolean): void {\n if (!this.isRendered()) {\n return;\n }\n\n this.element.classList.add(this.classNames.selected);\n this.element.setAttribute(\"aria-selected\", \"true\");\n\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null && !this.multiSelect) {\n this.element.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n if (mustSetFocus) {\n this.element.focus();\n }\n }\n\n protected getUl(): HTMLUListElement | null {\n return this.element.querySelector(\":scope > ul\");\n }\n\n /* A node inside a closed folder is not rendered. Its selected and open\n * state is applied when it is rendered.\n */\n protected isRendered(): boolean {\n return Boolean(this.node.element);\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === \"inside\";\n }\n}\n\nexport default NodeElement;\n"],"names":["classNames","getScrollLeft","multiSelect","node","tabIndex","treeElement","element","addDropHint","mustShowBorderDropHint","deselect","isRendered","select","getUl"],"mappings":";;;AAoBA,MAAM,WAAW,CAAC;AAShB,EAAA,WAAW,CAAC;IACV,WAAA,EAAA,UAAU;IACV,cAAA,EAAA,aAAa;AACb,IAAA,YAAA,EAAA,WAAW,GAAG,KAAK;IACnB,KAAA,EAAA,IAAI;IACJ,SAAA,EAAA,QAAQ;AACR,IAAA,YAAA,EAAA;AACiB,GAAC,EAAE;IACpB,IAAI,CAACA,WAAU,GAAG,UAAU;IAC5B,IAAI,CAACC,cAAa,GAAG,aAAa;IAClC,IAAI,CAACC,YAAW,GAAG,WAAW;IAC9B,IAAI,CAACC,KAAI,GAAG,IAAI;IAChB,IAAI,CAACC,SAAQ,GAAG,QAAQ;IACxB,IAAI,CAACC,YAAW,GAAG,WAAW;;AAE9B;IACA,IAAI,CAACC,QAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAACD,YAAW;AACjD,EAAA;EAEOE,YAAWA,CAAC,QAAkB,EAAY;AAC/C,IAAA,OAAO,IAAI,CAACC,uBAAsB,CAAC,QAAQ,CAAC,GACxC,IAAI,cAAc,CAAC,IAAI,CAACF,QAAO,EAAE,IAAI,CAACL,cAAa,EAAE,EAAE,IAAI,CAACD,WAAU,CAAC,GACvE,IAAI,aAAa,CAAC,IAAI,CAACG,KAAI,EAAE,IAAI,CAACG,QAAO,EAAE,QAAQ,EAAE,IAAI,CAACN,WAAU,CAAC;AAC3E,EAAA;AAEOS,EAAAA,SAAQA,GAAS;AACtB,IAAA,IAAI,CAAC,IAAI,CAACC,WAAU,EAAE,EAAE;AACtB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACJ,QAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAACN,WAAU,CAAC,QAAQ,CAAC;;AAEvD;IACA,IAAI,IAAI,CAACE,YAAW,EAAE;MACpB,IAAI,CAACI,QAAO,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC;AACnD,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACA,QAAO,CAAC,eAAe,CAAC,eAAe,CAAC;;AAE7C;AACA,IAAA,IAAI,IAAI,CAACF,SAAQ,IAAI,IAAI,EAAE;MACzB,IAAI,CAACE,QAAO,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;AAC7C,IAAA;AAEA,IAAA,IAAI,CAACA,QAAO,CAAC,IAAI,EAAE;AACrB,EAAA;EAEOK,OAAMA,CAAC,YAAqB,EAAQ;AACzC,IAAA,IAAI,CAAC,IAAI,CAACD,WAAU,EAAE,EAAE;AACtB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACJ,QAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAACN,WAAU,CAAC,QAAQ,CAAC;IACpD,IAAI,CAACM,QAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC;AAElD,IAAA,IAAM,QAAQ,GAAG,IAAI,CAACF,SAAQ;;AAE9B;IACA,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,IAAI,CAACF,YAAW,EAAE;AACzC,MAAA,IAAI,CAACI,QAAO,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC5D,IAAA;AAEA,IAAA,IAAI,YAAY,EAAE;AAChB,MAAA,IAAI,CAACA,QAAO,CAAC,KAAK,EAAE;AACtB,IAAA;AACF,EAAA;AAEUM,EAAAA,MAAKA,GAA4B;AACzC,IAAA,OAAO,IAAI,CAACN,QAAO,CAAC,aAAa,CAAC,aAAa,CAAC;AAClD,EAAA;;AAEA;AACF;AACA;AACYI,EAAAA,WAAUA,GAAY;AAC9B,IAAA,OAAO,OAAO,CAAC,IAAI,CAACP,KAAI,CAAC,OAAO,CAAC;AACnC,EAAA;EAEUK,uBAAsBA,CAAC,QAAkB,EAAW;IAC5D,OAAO,QAAQ,KAAK,QAAQ;AAC9B,EAAA;AACF;;"}
package/lib/options.d.ts CHANGED
@@ -131,6 +131,19 @@ export interface TreeElementOptions {
131
131
  * @group Selection
132
132
  */
133
133
  keyboardSupport: boolean;
134
+ /**
135
+ * Let the user select multiple nodes: a click adds a node to the
136
+ * selection, or removes it when it is selected. The arrow keys move the
137
+ * focus instead of the selection, and `Space` adds the focused node or
138
+ * removes it. See [Selection](/guide/selection#multiple-nodes).
139
+ *
140
+ * Set it in the constructor; changing it with `setOption` is not
141
+ * supported.
142
+ *
143
+ * @defaultValue `false`
144
+ * @group Selection
145
+ */
146
+ multiSelect: boolean;
134
147
  /**
135
148
  * The class used to create nodes. Subclass [`Node`](/reference/node) to
136
149
  * add your own methods. The `Node` class is not exposed on the global
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,9 @@ export default class SelectNodeHandler {
35
35
  isNodeSelected(node: Node): boolean;
36
36
  removeFromSelection(node: Node, includeChildren?: boolean): void;
37
37
  selectSingleNode(node: Node, optionsParam?: SelectNodeOptions): void;
38
+ toggleNodeInSelection(node: Node, mustSetFocus?: boolean): void;
39
+ private canSelect;
40
+ private deselectNode;
38
41
  }
39
42
  export {};
40
43
  //# sourceMappingURL=selectNodeHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selectNodeHandler.d.ts","sourceRoot":"","sources":["../src/selectNodeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,WAAW,EACX,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,2BAA2B;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,kBAAkB,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IACtD,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAa;gBAEtB,EACV,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,GACd,EAAE,2BAA2B;IAavB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQhC,KAAK,IAAI,IAAI;IAKb,eAAe,IAAI,IAAI,GAAG,IAAI;IAM9B,gBAAgB,IAAI,IAAI,EAAE;IAiB1B,qBAAqB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE;IAmB3C,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAOnC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,UAAQ,GAAG,IAAI;IA6B9D,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,iBAAiB;CA+CrE"}
1
+ {"version":3,"file":"selectNodeHandler.d.ts","sourceRoot":"","sources":["../src/selectNodeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,WAAW,EACX,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,2BAA2B;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,kBAAkB,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IACtD,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAa;gBAEtB,EACV,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,GACd,EAAE,2BAA2B;IAavB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQhC,KAAK,IAAI,IAAI;IAKb,eAAe,IAAI,IAAI,GAAG,IAAI;IAM9B,gBAAgB,IAAI,IAAI,EAAE;IAiB1B,qBAAqB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE;IAmB3C,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAOnC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,UAAQ,GAAG,IAAI;IA6B9D,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,iBAAiB;IA+C7D,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,UAAO,GAAG,IAAI;IAoBnE,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,YAAY;CAIrB"}