@headless-tree/core 1.2.1 → 1.3.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 (189) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/index.d.mts +577 -0
  3. package/dist/index.d.ts +577 -0
  4. package/dist/index.js +2321 -0
  5. package/dist/index.mjs +2276 -0
  6. package/package.json +18 -10
  7. package/src/core/create-tree.ts +26 -15
  8. package/src/features/async-data-loader/feature.ts +5 -0
  9. package/src/features/async-data-loader/types.ts +2 -0
  10. package/src/features/checkboxes/checkboxes.spec.ts +20 -5
  11. package/src/features/checkboxes/feature.ts +31 -16
  12. package/src/features/checkboxes/types.ts +1 -0
  13. package/src/features/drag-and-drop/drag-and-drop.spec.ts +11 -2
  14. package/src/features/drag-and-drop/feature.ts +51 -16
  15. package/src/features/drag-and-drop/types.ts +17 -0
  16. package/src/features/keyboard-drag-and-drop/feature.ts +8 -1
  17. package/src/features/keyboard-drag-and-drop/keyboard-drag-and-drop.spec.ts +34 -3
  18. package/src/features/main/types.ts +0 -2
  19. package/src/features/sync-data-loader/feature.ts +5 -1
  20. package/src/features/tree/feature.ts +4 -3
  21. package/src/features/tree/tree.spec.ts +14 -4
  22. package/src/test-utils/test-tree-do.ts +2 -0
  23. package/src/test-utils/test-tree.ts +1 -0
  24. package/tsconfig.json +1 -4
  25. package/vitest.config.ts +3 -1
  26. package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
  27. package/lib/cjs/core/build-proxified-instance.js +0 -58
  28. package/lib/cjs/core/build-static-instance.d.ts +0 -2
  29. package/lib/cjs/core/build-static-instance.js +0 -26
  30. package/lib/cjs/core/create-tree.d.ts +0 -2
  31. package/lib/cjs/core/create-tree.js +0 -191
  32. package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
  33. package/lib/cjs/features/async-data-loader/feature.js +0 -135
  34. package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
  35. package/lib/cjs/features/async-data-loader/types.js +0 -2
  36. package/lib/cjs/features/checkboxes/feature.d.ts +0 -2
  37. package/lib/cjs/features/checkboxes/feature.js +0 -94
  38. package/lib/cjs/features/checkboxes/types.d.ts +0 -26
  39. package/lib/cjs/features/checkboxes/types.js +0 -9
  40. package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
  41. package/lib/cjs/features/drag-and-drop/feature.js +0 -205
  42. package/lib/cjs/features/drag-and-drop/types.d.ts +0 -71
  43. package/lib/cjs/features/drag-and-drop/types.js +0 -9
  44. package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
  45. package/lib/cjs/features/drag-and-drop/utils.js +0 -182
  46. package/lib/cjs/features/expand-all/feature.d.ts +0 -2
  47. package/lib/cjs/features/expand-all/feature.js +0 -70
  48. package/lib/cjs/features/expand-all/types.d.ts +0 -19
  49. package/lib/cjs/features/expand-all/types.js +0 -2
  50. package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
  51. package/lib/cjs/features/hotkeys-core/feature.js +0 -107
  52. package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
  53. package/lib/cjs/features/hotkeys-core/types.js +0 -2
  54. package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  55. package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
  56. package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
  57. package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
  58. package/lib/cjs/features/main/types.d.ts +0 -47
  59. package/lib/cjs/features/main/types.js +0 -2
  60. package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
  61. package/lib/cjs/features/prop-memoization/feature.js +0 -70
  62. package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
  63. package/lib/cjs/features/prop-memoization/types.js +0 -2
  64. package/lib/cjs/features/renaming/feature.d.ts +0 -2
  65. package/lib/cjs/features/renaming/feature.js +0 -86
  66. package/lib/cjs/features/renaming/types.d.ts +0 -27
  67. package/lib/cjs/features/renaming/types.js +0 -2
  68. package/lib/cjs/features/search/feature.d.ts +0 -2
  69. package/lib/cjs/features/search/feature.js +0 -119
  70. package/lib/cjs/features/search/types.d.ts +0 -32
  71. package/lib/cjs/features/search/types.js +0 -2
  72. package/lib/cjs/features/selection/feature.d.ts +0 -2
  73. package/lib/cjs/features/selection/feature.js +0 -132
  74. package/lib/cjs/features/selection/types.d.ts +0 -21
  75. package/lib/cjs/features/selection/types.js +0 -2
  76. package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
  77. package/lib/cjs/features/sync-data-loader/feature.js +0 -49
  78. package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
  79. package/lib/cjs/features/sync-data-loader/types.js +0 -2
  80. package/lib/cjs/features/tree/feature.d.ts +0 -2
  81. package/lib/cjs/features/tree/feature.js +0 -244
  82. package/lib/cjs/features/tree/types.d.ts +0 -63
  83. package/lib/cjs/features/tree/types.js +0 -2
  84. package/lib/cjs/index.d.ts +0 -33
  85. package/lib/cjs/index.js +0 -51
  86. package/lib/cjs/mddocs-entry.d.ts +0 -121
  87. package/lib/cjs/mddocs-entry.js +0 -17
  88. package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
  89. package/lib/cjs/test-utils/test-tree-do.js +0 -112
  90. package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
  91. package/lib/cjs/test-utils/test-tree-expect.js +0 -66
  92. package/lib/cjs/test-utils/test-tree.d.ts +0 -48
  93. package/lib/cjs/test-utils/test-tree.js +0 -207
  94. package/lib/cjs/types/core.d.ts +0 -84
  95. package/lib/cjs/types/core.js +0 -2
  96. package/lib/cjs/types/deep-merge.d.ts +0 -13
  97. package/lib/cjs/types/deep-merge.js +0 -2
  98. package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
  99. package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
  100. package/lib/cjs/utilities/errors.d.ts +0 -2
  101. package/lib/cjs/utilities/errors.js +0 -9
  102. package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
  103. package/lib/cjs/utilities/insert-items-at-target.js +0 -40
  104. package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
  105. package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
  106. package/lib/cjs/utils.d.ts +0 -6
  107. package/lib/cjs/utils.js +0 -53
  108. package/lib/esm/core/build-proxified-instance.d.ts +0 -2
  109. package/lib/esm/core/build-proxified-instance.js +0 -54
  110. package/lib/esm/core/build-static-instance.d.ts +0 -2
  111. package/lib/esm/core/build-static-instance.js +0 -22
  112. package/lib/esm/core/create-tree.d.ts +0 -2
  113. package/lib/esm/core/create-tree.js +0 -187
  114. package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
  115. package/lib/esm/features/async-data-loader/feature.js +0 -132
  116. package/lib/esm/features/async-data-loader/types.d.ts +0 -47
  117. package/lib/esm/features/async-data-loader/types.js +0 -1
  118. package/lib/esm/features/checkboxes/feature.d.ts +0 -2
  119. package/lib/esm/features/checkboxes/feature.js +0 -91
  120. package/lib/esm/features/checkboxes/types.d.ts +0 -26
  121. package/lib/esm/features/checkboxes/types.js +0 -6
  122. package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
  123. package/lib/esm/features/drag-and-drop/feature.js +0 -202
  124. package/lib/esm/features/drag-and-drop/types.d.ts +0 -71
  125. package/lib/esm/features/drag-and-drop/types.js +0 -6
  126. package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
  127. package/lib/esm/features/drag-and-drop/utils.js +0 -172
  128. package/lib/esm/features/expand-all/feature.d.ts +0 -2
  129. package/lib/esm/features/expand-all/feature.js +0 -67
  130. package/lib/esm/features/expand-all/types.d.ts +0 -19
  131. package/lib/esm/features/expand-all/types.js +0 -1
  132. package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
  133. package/lib/esm/features/hotkeys-core/feature.js +0 -104
  134. package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
  135. package/lib/esm/features/hotkeys-core/types.js +0 -1
  136. package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  137. package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
  138. package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
  139. package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
  140. package/lib/esm/features/main/types.d.ts +0 -47
  141. package/lib/esm/features/main/types.js +0 -1
  142. package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
  143. package/lib/esm/features/prop-memoization/feature.js +0 -67
  144. package/lib/esm/features/prop-memoization/types.d.ts +0 -15
  145. package/lib/esm/features/prop-memoization/types.js +0 -1
  146. package/lib/esm/features/renaming/feature.d.ts +0 -2
  147. package/lib/esm/features/renaming/feature.js +0 -83
  148. package/lib/esm/features/renaming/types.d.ts +0 -27
  149. package/lib/esm/features/renaming/types.js +0 -1
  150. package/lib/esm/features/search/feature.d.ts +0 -2
  151. package/lib/esm/features/search/feature.js +0 -116
  152. package/lib/esm/features/search/types.d.ts +0 -32
  153. package/lib/esm/features/search/types.js +0 -1
  154. package/lib/esm/features/selection/feature.d.ts +0 -2
  155. package/lib/esm/features/selection/feature.js +0 -129
  156. package/lib/esm/features/selection/types.d.ts +0 -21
  157. package/lib/esm/features/selection/types.js +0 -1
  158. package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
  159. package/lib/esm/features/sync-data-loader/feature.js +0 -46
  160. package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
  161. package/lib/esm/features/sync-data-loader/types.js +0 -1
  162. package/lib/esm/features/tree/feature.d.ts +0 -2
  163. package/lib/esm/features/tree/feature.js +0 -241
  164. package/lib/esm/features/tree/types.d.ts +0 -63
  165. package/lib/esm/features/tree/types.js +0 -1
  166. package/lib/esm/index.d.ts +0 -33
  167. package/lib/esm/index.js +0 -32
  168. package/lib/esm/mddocs-entry.d.ts +0 -121
  169. package/lib/esm/mddocs-entry.js +0 -1
  170. package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
  171. package/lib/esm/test-utils/test-tree-do.js +0 -108
  172. package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
  173. package/lib/esm/test-utils/test-tree-expect.js +0 -62
  174. package/lib/esm/test-utils/test-tree.d.ts +0 -48
  175. package/lib/esm/test-utils/test-tree.js +0 -203
  176. package/lib/esm/types/core.d.ts +0 -84
  177. package/lib/esm/types/core.js +0 -1
  178. package/lib/esm/types/deep-merge.d.ts +0 -13
  179. package/lib/esm/types/deep-merge.js +0 -1
  180. package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
  181. package/lib/esm/utilities/create-on-drop-handler.js +0 -16
  182. package/lib/esm/utilities/errors.d.ts +0 -2
  183. package/lib/esm/utilities/errors.js +0 -4
  184. package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
  185. package/lib/esm/utilities/insert-items-at-target.js +0 -36
  186. package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
  187. package/lib/esm/utilities/remove-items-from-parents.js +0 -28
  188. package/lib/esm/utils.d.ts +0 -6
  189. package/lib/esm/utils.js +0 -46
package/dist/index.js ADDED
@@ -0,0 +1,2321 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __export = (target, all) => {
24
+ for (var name in all)
25
+ __defProp(target, name, { get: all[name], enumerable: true });
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+ var __async = (__this, __arguments, generator) => {
37
+ return new Promise((resolve, reject) => {
38
+ var fulfilled = (value) => {
39
+ try {
40
+ step(generator.next(value));
41
+ } catch (e) {
42
+ reject(e);
43
+ }
44
+ };
45
+ var rejected = (value) => {
46
+ try {
47
+ step(generator.throw(value));
48
+ } catch (e) {
49
+ reject(e);
50
+ }
51
+ };
52
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
53
+ step((generator = generator.apply(__this, __arguments)).next());
54
+ });
55
+ };
56
+
57
+ // src/index.ts
58
+ var index_exports = {};
59
+ __export(index_exports, {
60
+ AssistiveDndState: () => AssistiveDndState,
61
+ CheckedState: () => CheckedState,
62
+ DragTargetPosition: () => DragTargetPosition,
63
+ asyncDataLoaderFeature: () => asyncDataLoaderFeature,
64
+ buildProxiedInstance: () => buildProxiedInstance,
65
+ buildStaticInstance: () => buildStaticInstance,
66
+ checkboxesFeature: () => checkboxesFeature,
67
+ createOnDropHandler: () => createOnDropHandler,
68
+ createTree: () => createTree,
69
+ dragAndDropFeature: () => dragAndDropFeature,
70
+ expandAllFeature: () => expandAllFeature,
71
+ hotkeysCoreFeature: () => hotkeysCoreFeature,
72
+ insertItemsAtTarget: () => insertItemsAtTarget,
73
+ isOrderedDragTarget: () => isOrderedDragTarget,
74
+ keyboardDragAndDropFeature: () => keyboardDragAndDropFeature,
75
+ makeStateUpdater: () => makeStateUpdater,
76
+ propMemoizationFeature: () => propMemoizationFeature,
77
+ removeItemsFromParents: () => removeItemsFromParents,
78
+ renamingFeature: () => renamingFeature,
79
+ searchFeature: () => searchFeature,
80
+ selectionFeature: () => selectionFeature,
81
+ syncDataLoaderFeature: () => syncDataLoaderFeature
82
+ });
83
+ module.exports = __toCommonJS(index_exports);
84
+
85
+ // src/utils.ts
86
+ var memo = (deps, fn) => {
87
+ let value;
88
+ let oldDeps = null;
89
+ return (...a) => {
90
+ const newDeps = deps(...a);
91
+ if (!value) {
92
+ value = fn(...newDeps);
93
+ oldDeps = newDeps;
94
+ return value;
95
+ }
96
+ const match = oldDeps && oldDeps.length === newDeps.length && !oldDeps.some((dep, i) => dep !== newDeps[i]);
97
+ if (match) {
98
+ return value;
99
+ }
100
+ value = fn(...newDeps);
101
+ oldDeps = newDeps;
102
+ return value;
103
+ };
104
+ };
105
+ function functionalUpdate(updater, input) {
106
+ return typeof updater === "function" ? updater(input) : updater;
107
+ }
108
+ function makeStateUpdater(key, instance) {
109
+ return (updater) => {
110
+ instance.setState((old) => {
111
+ return __spreadProps(__spreadValues({}, old), {
112
+ [key]: functionalUpdate(updater, old[key])
113
+ });
114
+ });
115
+ };
116
+ }
117
+ var poll = (fn, interval = 100, timeout = 1e3) => new Promise((resolve) => {
118
+ let clear;
119
+ const i = setInterval(() => {
120
+ if (fn()) {
121
+ resolve();
122
+ clearInterval(i);
123
+ clearTimeout(clear);
124
+ }
125
+ }, interval);
126
+ clear = setTimeout(() => {
127
+ clearInterval(i);
128
+ }, timeout);
129
+ });
130
+
131
+ // src/utilities/errors.ts
132
+ var prefix = "Headless Tree: ";
133
+ var throwError = (message) => Error(prefix + message);
134
+ var logWarning = (message) => console.warn(prefix + message);
135
+
136
+ // src/features/tree/feature.ts
137
+ var treeFeature = {
138
+ key: "tree",
139
+ getInitialState: (initialState) => __spreadValues({
140
+ expandedItems: [],
141
+ focusedItem: null
142
+ }, initialState),
143
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
144
+ setExpandedItems: makeStateUpdater("expandedItems", tree),
145
+ setFocusedItem: makeStateUpdater("focusedItem", tree)
146
+ }, defaultConfig),
147
+ stateHandlerNames: {
148
+ expandedItems: "setExpandedItems",
149
+ focusedItem: "setFocusedItem"
150
+ },
151
+ treeInstance: {
152
+ getItemsMeta: ({ tree }) => {
153
+ const { rootItemId } = tree.getConfig();
154
+ const { expandedItems } = tree.getState();
155
+ const flatItems = [];
156
+ const expandedItemsSet = new Set(expandedItems);
157
+ const recursiveAdd = (itemId, path, level, setSize, posInSet) => {
158
+ var _a;
159
+ if (path.includes(itemId)) {
160
+ logWarning(`Circular reference for ${path.join(".")}`);
161
+ return;
162
+ }
163
+ flatItems.push({
164
+ itemId,
165
+ level,
166
+ index: flatItems.length,
167
+ parentId: path.at(-1),
168
+ setSize,
169
+ posInSet
170
+ });
171
+ if (expandedItemsSet.has(itemId)) {
172
+ const children2 = (_a = tree.retrieveChildrenIds(itemId)) != null ? _a : [];
173
+ let i2 = 0;
174
+ for (const childId of children2) {
175
+ recursiveAdd(
176
+ childId,
177
+ path.concat(itemId),
178
+ level + 1,
179
+ children2.length,
180
+ i2++
181
+ );
182
+ }
183
+ }
184
+ };
185
+ const children = tree.retrieveChildrenIds(rootItemId);
186
+ let i = 0;
187
+ for (const itemId of children) {
188
+ recursiveAdd(itemId, [rootItemId], 0, children.length, i++);
189
+ }
190
+ return flatItems;
191
+ },
192
+ getFocusedItem: ({ tree }) => {
193
+ var _a;
194
+ const focusedItemId = tree.getState().focusedItem;
195
+ return (_a = focusedItemId !== null ? tree.getItemInstance(focusedItemId) : null) != null ? _a : tree.getItems()[0];
196
+ },
197
+ getRootItem: ({ tree }) => {
198
+ const { rootItemId } = tree.getConfig();
199
+ return tree.getItemInstance(rootItemId);
200
+ },
201
+ focusNextItem: ({ tree }) => {
202
+ var _a;
203
+ const focused = tree.getFocusedItem().getItemMeta();
204
+ if (!focused) return;
205
+ const nextIndex = Math.min(focused.index + 1, tree.getItems().length - 1);
206
+ (_a = tree.getItems()[nextIndex]) == null ? void 0 : _a.setFocused();
207
+ },
208
+ focusPreviousItem: ({ tree }) => {
209
+ var _a;
210
+ const focused = tree.getFocusedItem().getItemMeta();
211
+ if (!focused) return;
212
+ const nextIndex = Math.max(focused.index - 1, 0);
213
+ (_a = tree.getItems()[nextIndex]) == null ? void 0 : _a.setFocused();
214
+ },
215
+ updateDomFocus: ({ tree }) => {
216
+ setTimeout(() => __async(null, null, function* () {
217
+ var _a, _b;
218
+ const focusedItem = tree.getFocusedItem();
219
+ (_b = (_a = tree.getConfig()).scrollToItem) == null ? void 0 : _b.call(_a, focusedItem);
220
+ yield poll(() => focusedItem.getElement() !== null, 20);
221
+ const focusedElement = focusedItem.getElement();
222
+ if (!focusedElement) return;
223
+ focusedElement.focus();
224
+ }));
225
+ },
226
+ getContainerProps: ({ prev, tree }, treeLabel) => __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
227
+ role: "tree",
228
+ "aria-label": treeLabel != null ? treeLabel : "",
229
+ ref: tree.registerElement
230
+ }),
231
+ // relevant for hotkeys of this feature
232
+ isSearchOpen: () => false
233
+ },
234
+ itemInstance: {
235
+ scrollTo: (_0, _1) => __async(null, [_0, _1], function* ({ tree, item }, scrollIntoViewArg) {
236
+ var _a, _b, _c;
237
+ (_b = (_a = tree.getConfig()).scrollToItem) == null ? void 0 : _b.call(_a, item);
238
+ yield poll(() => item.getElement() !== null, 20);
239
+ (_c = item.getElement()) == null ? void 0 : _c.scrollIntoView(scrollIntoViewArg);
240
+ }),
241
+ getId: ({ itemId }) => itemId,
242
+ getKey: ({ itemId }) => itemId,
243
+ // TODO apply to all stories to use
244
+ getProps: ({ item, prev }) => {
245
+ const itemMeta = item.getItemMeta();
246
+ return __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
247
+ ref: item.registerElement,
248
+ role: "treeitem",
249
+ "aria-setsize": itemMeta.setSize,
250
+ "aria-posinset": itemMeta.posInSet + 1,
251
+ "aria-selected": "false",
252
+ "aria-label": item.getItemName(),
253
+ "aria-level": itemMeta.level + 1,
254
+ tabIndex: item.isFocused() ? 0 : -1,
255
+ onClick: (e) => {
256
+ item.setFocused();
257
+ item.primaryAction();
258
+ if (e.ctrlKey || e.shiftKey || e.metaKey) {
259
+ return;
260
+ }
261
+ if (!item.isFolder()) {
262
+ return;
263
+ }
264
+ if (item.isExpanded()) {
265
+ item.collapse();
266
+ } else {
267
+ item.expand();
268
+ }
269
+ }
270
+ });
271
+ },
272
+ expand: ({ tree, item, itemId }) => {
273
+ var _a;
274
+ if (!item.isFolder()) {
275
+ return;
276
+ }
277
+ if ((_a = tree.getState().loadingItemChildrens) == null ? void 0 : _a.includes(itemId)) {
278
+ return;
279
+ }
280
+ tree.applySubStateUpdate("expandedItems", (expandedItems) => [
281
+ ...expandedItems,
282
+ itemId
283
+ ]);
284
+ tree.rebuildTree();
285
+ },
286
+ collapse: ({ tree, item, itemId }) => {
287
+ if (!item.isFolder()) {
288
+ return;
289
+ }
290
+ tree.applySubStateUpdate(
291
+ "expandedItems",
292
+ (expandedItems) => expandedItems.filter((id) => id !== itemId)
293
+ );
294
+ tree.rebuildTree();
295
+ },
296
+ getItemData: ({ tree, itemId }) => tree.retrieveItemData(itemId),
297
+ equals: ({ item }, other) => item.getId() === (other == null ? void 0 : other.getId()),
298
+ isExpanded: ({ tree, itemId }) => tree.getState().expandedItems.includes(itemId),
299
+ isDescendentOf: ({ item }, parentId) => {
300
+ const parent = item.getParent();
301
+ return Boolean(
302
+ (parent == null ? void 0 : parent.getId()) === parentId || (parent == null ? void 0 : parent.isDescendentOf(parentId))
303
+ );
304
+ },
305
+ isFocused: ({ tree, item, itemId }) => tree.getState().focusedItem === itemId || tree.getState().focusedItem === null && item.getItemMeta().index === 0,
306
+ isFolder: ({ tree, item }) => item.getItemMeta().level === -1 || tree.getConfig().isItemFolder(item),
307
+ getItemName: ({ tree, item }) => {
308
+ const config = tree.getConfig();
309
+ return config.getItemName(item);
310
+ },
311
+ setFocused: ({ tree, itemId }) => {
312
+ tree.applySubStateUpdate("focusedItem", itemId);
313
+ },
314
+ primaryAction: ({ tree, item }) => {
315
+ var _a, _b;
316
+ return (_b = (_a = tree.getConfig()).onPrimaryAction) == null ? void 0 : _b.call(_a, item);
317
+ },
318
+ getParent: ({ tree, item }) => item.getItemMeta().parentId ? tree.getItemInstance(item.getItemMeta().parentId) : void 0,
319
+ getIndexInParent: ({ item }) => item.getItemMeta().posInSet,
320
+ getChildren: ({ tree, itemId }) => tree.retrieveChildrenIds(itemId).map((id) => tree.getItemInstance(id)),
321
+ getTree: ({ tree }) => tree,
322
+ getItemAbove: ({ tree, item }) => tree.getItems()[item.getItemMeta().index - 1],
323
+ getItemBelow: ({ tree, item }) => tree.getItems()[item.getItemMeta().index + 1]
324
+ },
325
+ hotkeys: {
326
+ focusNextItem: {
327
+ hotkey: "ArrowDown",
328
+ canRepeat: true,
329
+ preventDefault: true,
330
+ isEnabled: (tree) => {
331
+ var _a, _b;
332
+ return !((_b = (_a = tree.isSearchOpen) == null ? void 0 : _a.call(tree)) != null ? _b : false) && !tree.getState().dnd;
333
+ },
334
+ // TODO what happens when the feature doesnt exist? proxy method still claims to exist
335
+ handler: (e, tree) => {
336
+ tree.focusNextItem();
337
+ tree.updateDomFocus();
338
+ }
339
+ },
340
+ focusPreviousItem: {
341
+ hotkey: "ArrowUp",
342
+ canRepeat: true,
343
+ preventDefault: true,
344
+ isEnabled: (tree) => {
345
+ var _a, _b;
346
+ return !((_b = (_a = tree.isSearchOpen) == null ? void 0 : _a.call(tree)) != null ? _b : false) && !tree.getState().dnd;
347
+ },
348
+ handler: (e, tree) => {
349
+ tree.focusPreviousItem();
350
+ tree.updateDomFocus();
351
+ }
352
+ },
353
+ expandOrDown: {
354
+ hotkey: "ArrowRight",
355
+ canRepeat: true,
356
+ handler: (e, tree) => {
357
+ const item = tree.getFocusedItem();
358
+ if (item.isExpanded() || !item.isFolder()) {
359
+ tree.focusNextItem();
360
+ tree.updateDomFocus();
361
+ } else {
362
+ item.expand();
363
+ }
364
+ }
365
+ },
366
+ collapseOrUp: {
367
+ hotkey: "ArrowLeft",
368
+ canRepeat: true,
369
+ handler: (e, tree) => {
370
+ var _a;
371
+ const item = tree.getFocusedItem();
372
+ if ((!item.isExpanded() || !item.isFolder()) && item.getItemMeta().level !== 0) {
373
+ (_a = item.getParent()) == null ? void 0 : _a.setFocused();
374
+ tree.updateDomFocus();
375
+ } else {
376
+ item.collapse();
377
+ }
378
+ }
379
+ },
380
+ focusFirstItem: {
381
+ hotkey: "Home",
382
+ handler: (e, tree) => {
383
+ var _a;
384
+ (_a = tree.getItems()[0]) == null ? void 0 : _a.setFocused();
385
+ tree.updateDomFocus();
386
+ }
387
+ },
388
+ focusLastItem: {
389
+ hotkey: "End",
390
+ handler: (e, tree) => {
391
+ var _a;
392
+ (_a = tree.getItems()[tree.getItems().length - 1]) == null ? void 0 : _a.setFocused();
393
+ tree.updateDomFocus();
394
+ }
395
+ }
396
+ }
397
+ };
398
+
399
+ // src/core/build-static-instance.ts
400
+ var buildStaticInstance = (features, instanceType, buildOpts) => {
401
+ const instance = {};
402
+ const finalize = () => {
403
+ const opts = buildOpts(instance);
404
+ featureLoop: for (let i = 0; i < features.length; i++) {
405
+ const definition = features[i][instanceType];
406
+ if (!definition) continue featureLoop;
407
+ methodLoop: for (const [key, method] of Object.entries(definition)) {
408
+ if (!method) continue methodLoop;
409
+ const prev = instance[key];
410
+ instance[key] = (...args) => {
411
+ return method(__spreadProps(__spreadValues({}, opts), { prev }), ...args);
412
+ };
413
+ }
414
+ }
415
+ };
416
+ return [instance, finalize];
417
+ };
418
+
419
+ // src/core/create-tree.ts
420
+ var verifyFeatures = (features) => {
421
+ var _a;
422
+ const loadedFeatures = features == null ? void 0 : features.map((feature) => feature.key);
423
+ for (const feature of features != null ? features : []) {
424
+ const missingDependency = (_a = feature.deps) == null ? void 0 : _a.find(
425
+ (dep) => !(loadedFeatures == null ? void 0 : loadedFeatures.includes(dep))
426
+ );
427
+ if (missingDependency) {
428
+ throw throwError(`${feature.key} needs ${missingDependency}`);
429
+ }
430
+ }
431
+ };
432
+ var exhaustiveSort = (arr, compareFn) => {
433
+ const n = arr.length;
434
+ for (let i = 0; i < n; i++) {
435
+ for (let j = i + 1; j < n; j++) {
436
+ if (compareFn(arr[j], arr[i]) < 0) {
437
+ [arr[i], arr[j]] = [arr[j], arr[i]];
438
+ }
439
+ }
440
+ }
441
+ return arr;
442
+ };
443
+ var compareFeatures = (originalOrder) => (feature1, feature2) => {
444
+ var _a, _b;
445
+ if (feature2.key && ((_a = feature1.overwrites) == null ? void 0 : _a.includes(feature2.key))) {
446
+ return 1;
447
+ }
448
+ if (feature1.key && ((_b = feature2.overwrites) == null ? void 0 : _b.includes(feature1.key))) {
449
+ return -1;
450
+ }
451
+ return originalOrder.indexOf(feature1) - originalOrder.indexOf(feature2);
452
+ };
453
+ var sortFeatures = (features = []) => exhaustiveSort(features, compareFeatures(features));
454
+ var createTree = (initialConfig) => {
455
+ var _a, _b, _c, _d;
456
+ const buildInstance = (_a = initialConfig.instanceBuilder) != null ? _a : buildStaticInstance;
457
+ const additionalFeatures = [
458
+ treeFeature,
459
+ ...sortFeatures(initialConfig.features)
460
+ ];
461
+ verifyFeatures(additionalFeatures);
462
+ const features = [...additionalFeatures];
463
+ const [treeInstance, finalizeTree] = buildInstance(
464
+ features,
465
+ "treeInstance",
466
+ (tree) => ({ tree })
467
+ );
468
+ let state = additionalFeatures.reduce(
469
+ (acc, feature) => {
470
+ var _a2, _b2;
471
+ return (_b2 = (_a2 = feature.getInitialState) == null ? void 0 : _a2.call(feature, acc, treeInstance)) != null ? _b2 : acc;
472
+ },
473
+ (_c = (_b = initialConfig.initialState) != null ? _b : initialConfig.state) != null ? _c : {}
474
+ );
475
+ let config = additionalFeatures.reduce(
476
+ (acc, feature) => {
477
+ var _a2, _b2;
478
+ return (_b2 = (_a2 = feature.getDefaultConfig) == null ? void 0 : _a2.call(feature, acc, treeInstance)) != null ? _b2 : acc;
479
+ },
480
+ initialConfig
481
+ );
482
+ const stateHandlerNames = additionalFeatures.reduce(
483
+ (acc, feature) => __spreadValues(__spreadValues({}, acc), feature.stateHandlerNames),
484
+ {}
485
+ );
486
+ let treeElement;
487
+ const treeDataRef = { current: {} };
488
+ const itemInstancesMap = {};
489
+ let itemInstances = [];
490
+ const itemElementsMap = {};
491
+ const itemDataRefs = {};
492
+ let itemMetaMap = {};
493
+ const hotkeyPresets = {};
494
+ const rebuildItemMeta = () => {
495
+ itemInstances = [];
496
+ itemMetaMap = {};
497
+ const [rootInstance, finalizeRootInstance] = buildInstance(
498
+ features,
499
+ "itemInstance",
500
+ (item) => ({ item, tree: treeInstance, itemId: config.rootItemId })
501
+ );
502
+ finalizeRootInstance();
503
+ itemInstancesMap[config.rootItemId] = rootInstance;
504
+ itemMetaMap[config.rootItemId] = {
505
+ itemId: config.rootItemId,
506
+ index: -1,
507
+ parentId: null,
508
+ level: -1,
509
+ posInSet: 0,
510
+ setSize: 1
511
+ };
512
+ for (const item of treeInstance.getItemsMeta()) {
513
+ itemMetaMap[item.itemId] = item;
514
+ if (!itemInstancesMap[item.itemId]) {
515
+ const [instance, finalizeInstance] = buildInstance(
516
+ features,
517
+ "itemInstance",
518
+ (instance2) => ({
519
+ item: instance2,
520
+ tree: treeInstance,
521
+ itemId: item.itemId
522
+ })
523
+ );
524
+ finalizeInstance();
525
+ itemInstancesMap[item.itemId] = instance;
526
+ itemInstances.push(instance);
527
+ } else {
528
+ itemInstances.push(itemInstancesMap[item.itemId]);
529
+ }
530
+ }
531
+ };
532
+ const eachFeature = (fn) => {
533
+ for (const feature of additionalFeatures) {
534
+ fn(feature);
535
+ }
536
+ };
537
+ const mainFeature = {
538
+ key: "main",
539
+ treeInstance: {
540
+ getState: () => state,
541
+ setState: ({}, updater) => {
542
+ var _a2;
543
+ (_a2 = config.setState) == null ? void 0 : _a2.call(config, state);
544
+ },
545
+ applySubStateUpdate: ({}, stateName, updater) => {
546
+ state[stateName] = typeof updater === "function" ? updater(state[stateName]) : updater;
547
+ const externalStateSetter = config[stateHandlerNames[stateName]];
548
+ externalStateSetter == null ? void 0 : externalStateSetter(state[stateName]);
549
+ },
550
+ // TODO rebuildSubTree: (itemId: string) => void;
551
+ rebuildTree: () => {
552
+ var _a2;
553
+ rebuildItemMeta();
554
+ (_a2 = config.setState) == null ? void 0 : _a2.call(config, state);
555
+ },
556
+ getConfig: () => config,
557
+ setConfig: (_, updater) => {
558
+ var _a2, _b2, _c2;
559
+ const newConfig = typeof updater === "function" ? updater(config) : updater;
560
+ const hasChangedExpandedItems = ((_a2 = newConfig.state) == null ? void 0 : _a2.expandedItems) && ((_b2 = newConfig.state) == null ? void 0 : _b2.expandedItems) !== state.expandedItems;
561
+ config = newConfig;
562
+ if (newConfig.state) {
563
+ state = __spreadValues(__spreadValues({}, state), newConfig.state);
564
+ }
565
+ if (hasChangedExpandedItems) {
566
+ rebuildItemMeta();
567
+ (_c2 = config.setState) == null ? void 0 : _c2.call(config, state);
568
+ }
569
+ },
570
+ getItemInstance: ({}, itemId) => {
571
+ const existingInstance = itemInstancesMap[itemId];
572
+ if (!existingInstance) {
573
+ const [instance, finalizeInstance] = buildInstance(
574
+ features,
575
+ "itemInstance",
576
+ (instance2) => ({
577
+ item: instance2,
578
+ tree: treeInstance,
579
+ itemId
580
+ })
581
+ );
582
+ finalizeInstance();
583
+ return instance;
584
+ }
585
+ return existingInstance;
586
+ },
587
+ getItems: () => itemInstances,
588
+ registerElement: ({}, element) => {
589
+ if (treeElement === element) {
590
+ return;
591
+ }
592
+ if (treeElement && !element) {
593
+ eachFeature(
594
+ (feature) => {
595
+ var _a2;
596
+ return (_a2 = feature.onTreeUnmount) == null ? void 0 : _a2.call(feature, treeInstance, treeElement);
597
+ }
598
+ );
599
+ } else if (!treeElement && element) {
600
+ eachFeature(
601
+ (feature) => {
602
+ var _a2;
603
+ return (_a2 = feature.onTreeMount) == null ? void 0 : _a2.call(feature, treeInstance, element);
604
+ }
605
+ );
606
+ }
607
+ treeElement = element;
608
+ },
609
+ getElement: () => treeElement,
610
+ getDataRef: () => treeDataRef,
611
+ getHotkeyPresets: () => hotkeyPresets
612
+ },
613
+ itemInstance: {
614
+ registerElement: ({ itemId, item }, element) => {
615
+ if (itemElementsMap[itemId] === element) {
616
+ return;
617
+ }
618
+ const oldElement = itemElementsMap[itemId];
619
+ if (oldElement && !element) {
620
+ eachFeature(
621
+ (feature) => {
622
+ var _a2;
623
+ return (_a2 = feature.onItemUnmount) == null ? void 0 : _a2.call(feature, item, oldElement, treeInstance);
624
+ }
625
+ );
626
+ } else if (!oldElement && element) {
627
+ eachFeature(
628
+ (feature) => {
629
+ var _a2;
630
+ return (_a2 = feature.onItemMount) == null ? void 0 : _a2.call(feature, item, element, treeInstance);
631
+ }
632
+ );
633
+ }
634
+ itemElementsMap[itemId] = element;
635
+ },
636
+ getElement: ({ itemId }) => itemElementsMap[itemId],
637
+ // eslint-disable-next-line no-return-assign
638
+ getDataRef: ({ itemId }) => {
639
+ var _a2;
640
+ return (_a2 = itemDataRefs[itemId]) != null ? _a2 : itemDataRefs[itemId] = { current: {} };
641
+ },
642
+ getItemMeta: ({ itemId }) => {
643
+ var _a2;
644
+ return (_a2 = itemMetaMap[itemId]) != null ? _a2 : {
645
+ itemId,
646
+ parentId: null,
647
+ level: -1,
648
+ index: -1,
649
+ posInSet: 0,
650
+ setSize: 1
651
+ };
652
+ }
653
+ }
654
+ };
655
+ features.unshift(mainFeature);
656
+ for (const feature of features) {
657
+ Object.assign(hotkeyPresets, (_d = feature.hotkeys) != null ? _d : {});
658
+ }
659
+ finalizeTree();
660
+ return treeInstance;
661
+ };
662
+
663
+ // src/features/drag-and-drop/types.ts
664
+ var DragTargetPosition = /* @__PURE__ */ ((DragTargetPosition2) => {
665
+ DragTargetPosition2["Top"] = "top";
666
+ DragTargetPosition2["Bottom"] = "bottom";
667
+ DragTargetPosition2["Item"] = "item";
668
+ return DragTargetPosition2;
669
+ })(DragTargetPosition || {});
670
+
671
+ // src/features/keyboard-drag-and-drop/types.ts
672
+ var AssistiveDndState = /* @__PURE__ */ ((AssistiveDndState2) => {
673
+ AssistiveDndState2[AssistiveDndState2["None"] = 0] = "None";
674
+ AssistiveDndState2[AssistiveDndState2["Started"] = 1] = "Started";
675
+ AssistiveDndState2[AssistiveDndState2["Dragging"] = 2] = "Dragging";
676
+ AssistiveDndState2[AssistiveDndState2["Completed"] = 3] = "Completed";
677
+ AssistiveDndState2[AssistiveDndState2["Aborted"] = 4] = "Aborted";
678
+ return AssistiveDndState2;
679
+ })(AssistiveDndState || {});
680
+
681
+ // src/features/checkboxes/types.ts
682
+ var CheckedState = /* @__PURE__ */ ((CheckedState2) => {
683
+ CheckedState2["Checked"] = "checked";
684
+ CheckedState2["Unchecked"] = "unchecked";
685
+ CheckedState2["Indeterminate"] = "indeterminate";
686
+ return CheckedState2;
687
+ })(CheckedState || {});
688
+
689
+ // src/features/selection/feature.ts
690
+ var selectionFeature = {
691
+ key: "selection",
692
+ getInitialState: (initialState) => __spreadValues({
693
+ selectedItems: []
694
+ }, initialState),
695
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
696
+ setSelectedItems: makeStateUpdater("selectedItems", tree)
697
+ }, defaultConfig),
698
+ stateHandlerNames: {
699
+ selectedItems: "setSelectedItems"
700
+ },
701
+ treeInstance: {
702
+ setSelectedItems: ({ tree }, selectedItems) => {
703
+ tree.applySubStateUpdate("selectedItems", selectedItems);
704
+ },
705
+ getSelectedItems: ({ tree }) => {
706
+ return tree.getState().selectedItems.map(tree.getItemInstance);
707
+ }
708
+ },
709
+ itemInstance: {
710
+ select: ({ tree, itemId }) => {
711
+ const { selectedItems } = tree.getState();
712
+ tree.setSelectedItems(
713
+ selectedItems.includes(itemId) ? selectedItems : [...selectedItems, itemId]
714
+ );
715
+ },
716
+ deselect: ({ tree, itemId }) => {
717
+ const { selectedItems } = tree.getState();
718
+ tree.setSelectedItems(selectedItems.filter((id) => id !== itemId));
719
+ },
720
+ isSelected: ({ tree, itemId }) => {
721
+ const { selectedItems } = tree.getState();
722
+ return selectedItems.includes(itemId);
723
+ },
724
+ selectUpTo: ({ tree, item }, ctrl) => {
725
+ const indexA = item.getItemMeta().index;
726
+ const indexB = tree.getFocusedItem().getItemMeta().index;
727
+ const [a, b] = indexA < indexB ? [indexA, indexB] : [indexB, indexA];
728
+ const newSelectedItems = tree.getItems().slice(a, b + 1).map((treeItem) => treeItem.getItemMeta().itemId);
729
+ if (!ctrl) {
730
+ tree.setSelectedItems(newSelectedItems);
731
+ return;
732
+ }
733
+ const { selectedItems } = tree.getState();
734
+ const uniqueSelectedItems = [
735
+ .../* @__PURE__ */ new Set([...selectedItems, ...newSelectedItems])
736
+ ];
737
+ tree.setSelectedItems(uniqueSelectedItems);
738
+ },
739
+ toggleSelect: ({ item }) => {
740
+ if (item.isSelected()) {
741
+ item.deselect();
742
+ } else {
743
+ item.select();
744
+ }
745
+ },
746
+ getProps: ({ tree, item, prev }) => __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
747
+ "aria-selected": item.isSelected() ? "true" : "false",
748
+ onClick: (e) => {
749
+ var _a, _b;
750
+ if (e.shiftKey) {
751
+ item.selectUpTo(e.ctrlKey || e.metaKey);
752
+ } else if (e.ctrlKey || e.metaKey) {
753
+ item.toggleSelect();
754
+ } else {
755
+ tree.setSelectedItems([item.getItemMeta().itemId]);
756
+ }
757
+ (_b = (_a = prev == null ? void 0 : prev()) == null ? void 0 : _a.onClick) == null ? void 0 : _b.call(_a, e);
758
+ }
759
+ })
760
+ },
761
+ hotkeys: {
762
+ // setSelectedItem: {
763
+ // hotkey: "space",
764
+ // handler: (e, tree) => {
765
+ // tree.setSelectedItems([tree.getFocusedItem().getId()]);
766
+ // },
767
+ // },
768
+ toggleSelectedItem: {
769
+ hotkey: "Control+Space",
770
+ preventDefault: true,
771
+ handler: (_, tree) => {
772
+ tree.getFocusedItem().toggleSelect();
773
+ }
774
+ },
775
+ selectUpwards: {
776
+ hotkey: "Shift+ArrowUp",
777
+ handler: (e, tree) => {
778
+ const focused = tree.getFocusedItem();
779
+ const above = focused.getItemAbove();
780
+ if (!above) return;
781
+ if (focused.isSelected() && above.isSelected()) {
782
+ focused.deselect();
783
+ } else {
784
+ above.select();
785
+ }
786
+ above.setFocused();
787
+ tree.updateDomFocus();
788
+ }
789
+ },
790
+ selectDownwards: {
791
+ hotkey: "Shift+ArrowDown",
792
+ handler: (e, tree) => {
793
+ const focused = tree.getFocusedItem();
794
+ const below = focused.getItemBelow();
795
+ if (!below) return;
796
+ if (focused.isSelected() && below.isSelected()) {
797
+ focused.deselect();
798
+ } else {
799
+ below.select();
800
+ }
801
+ below.setFocused();
802
+ tree.updateDomFocus();
803
+ }
804
+ },
805
+ selectAll: {
806
+ hotkey: "Control+KeyA",
807
+ preventDefault: true,
808
+ handler: (e, tree) => {
809
+ tree.setSelectedItems(tree.getItems().map((item) => item.getId()));
810
+ }
811
+ }
812
+ }
813
+ };
814
+
815
+ // src/features/checkboxes/feature.ts
816
+ var getAllLoadedDescendants = (tree, itemId, includeFolders = false) => {
817
+ if (!tree.getConfig().isItemFolder(tree.getItemInstance(itemId))) {
818
+ return [itemId];
819
+ }
820
+ const descendants = tree.retrieveChildrenIds(itemId).map((child) => getAllLoadedDescendants(tree, child, includeFolders)).flat();
821
+ return includeFolders ? [itemId, ...descendants] : descendants;
822
+ };
823
+ var checkboxesFeature = {
824
+ key: "checkboxes",
825
+ overwrites: ["selection"],
826
+ getInitialState: (initialState) => __spreadValues({
827
+ checkedItems: []
828
+ }, initialState),
829
+ getDefaultConfig: (defaultConfig, tree) => {
830
+ var _a, _b, _c;
831
+ const hasAsyncLoader = (_a = defaultConfig.features) == null ? void 0 : _a.some(
832
+ (f) => f.key === "async-data-loader"
833
+ );
834
+ if (hasAsyncLoader && defaultConfig.propagateCheckedState) {
835
+ throwError(`propagateCheckedState not supported with async trees`);
836
+ }
837
+ const propagateCheckedState = (_b = defaultConfig.propagateCheckedState) != null ? _b : !hasAsyncLoader;
838
+ const canCheckFolders = (_c = defaultConfig.canCheckFolders) != null ? _c : !propagateCheckedState;
839
+ return __spreadValues({
840
+ setCheckedItems: makeStateUpdater("checkedItems", tree),
841
+ propagateCheckedState,
842
+ canCheckFolders
843
+ }, defaultConfig);
844
+ },
845
+ stateHandlerNames: {
846
+ checkedItems: "setCheckedItems"
847
+ },
848
+ treeInstance: {
849
+ setCheckedItems: ({ tree }, checkedItems) => {
850
+ tree.applySubStateUpdate("checkedItems", checkedItems);
851
+ }
852
+ },
853
+ itemInstance: {
854
+ getCheckboxProps: ({ item }) => {
855
+ const checkedState = item.getCheckedState();
856
+ return {
857
+ onChange: item.toggleCheckedState,
858
+ checked: checkedState === "checked" /* Checked */,
859
+ ref: (r) => {
860
+ if (r) {
861
+ r.indeterminate = checkedState === "indeterminate" /* Indeterminate */;
862
+ }
863
+ }
864
+ };
865
+ },
866
+ toggleCheckedState: ({ item }) => {
867
+ if (item.getCheckedState() === "checked" /* Checked */) {
868
+ item.setUnchecked();
869
+ } else {
870
+ item.setChecked();
871
+ }
872
+ },
873
+ getCheckedState: ({ item, tree }) => {
874
+ const { checkedItems } = tree.getState();
875
+ const { propagateCheckedState } = tree.getConfig();
876
+ const itemId = item.getId();
877
+ if (checkedItems.includes(itemId)) {
878
+ return "checked" /* Checked */;
879
+ }
880
+ if (item.isFolder() && propagateCheckedState) {
881
+ const descendants = getAllLoadedDescendants(tree, itemId);
882
+ if (descendants.every((d) => checkedItems.includes(d))) {
883
+ return "checked" /* Checked */;
884
+ }
885
+ if (descendants.some((d) => checkedItems.includes(d))) {
886
+ return "indeterminate" /* Indeterminate */;
887
+ }
888
+ }
889
+ return "unchecked" /* Unchecked */;
890
+ },
891
+ setChecked: ({ item, tree, itemId }) => {
892
+ const { propagateCheckedState, canCheckFolders } = tree.getConfig();
893
+ if (item.isFolder() && propagateCheckedState) {
894
+ tree.applySubStateUpdate("checkedItems", (items) => [
895
+ ...items,
896
+ ...getAllLoadedDescendants(tree, itemId, canCheckFolders)
897
+ ]);
898
+ } else if (!item.isFolder() || canCheckFolders) {
899
+ tree.applySubStateUpdate("checkedItems", (items) => [...items, itemId]);
900
+ }
901
+ },
902
+ setUnchecked: ({ item, tree, itemId }) => {
903
+ const { propagateCheckedState, canCheckFolders } = tree.getConfig();
904
+ if (item.isFolder() && propagateCheckedState) {
905
+ const descendants = getAllLoadedDescendants(
906
+ tree,
907
+ itemId,
908
+ canCheckFolders
909
+ );
910
+ tree.applySubStateUpdate(
911
+ "checkedItems",
912
+ (items) => items.filter((id) => !descendants.includes(id) && id !== itemId)
913
+ );
914
+ } else {
915
+ tree.applySubStateUpdate(
916
+ "checkedItems",
917
+ (items) => items.filter((id) => id !== itemId)
918
+ );
919
+ }
920
+ }
921
+ }
922
+ };
923
+
924
+ // src/features/hotkeys-core/feature.ts
925
+ var specialKeys = {
926
+ // TODO:breaking deprecate auto-lowercase
927
+ letter: /^Key[A-Z]$/,
928
+ letterornumber: /^(Key[A-Z]|Digit[0-9])$/,
929
+ plus: /^(NumpadAdd|Plus)$/,
930
+ minus: /^(NumpadSubtract|Minus)$/,
931
+ control: /^(ControlLeft|ControlRight)$/,
932
+ shift: /^(ShiftLeft|ShiftRight)$/
933
+ };
934
+ var testHotkeyMatch = (pressedKeys, tree, hotkey) => {
935
+ const supposedKeys = hotkey.hotkey.toLowerCase().split("+");
936
+ const doKeysMatch = supposedKeys.every((key) => {
937
+ if (key in specialKeys) {
938
+ return [...pressedKeys].some(
939
+ (pressedKey) => specialKeys[key].test(pressedKey)
940
+ );
941
+ }
942
+ const pressedKeysLowerCase = [...pressedKeys].map((k) => k.toLowerCase());
943
+ if (pressedKeysLowerCase.includes(key.toLowerCase())) {
944
+ return true;
945
+ }
946
+ if (pressedKeysLowerCase.includes(`key${key.toLowerCase()}`)) {
947
+ return true;
948
+ }
949
+ return false;
950
+ });
951
+ const isEnabled = !hotkey.isEnabled || hotkey.isEnabled(tree);
952
+ const equalCounts = pressedKeys.size === supposedKeys.length;
953
+ return doKeysMatch && isEnabled && equalCounts;
954
+ };
955
+ var findHotkeyMatch = (pressedKeys, tree, config1, config2) => {
956
+ var _a;
957
+ return (_a = Object.entries(__spreadValues(__spreadValues({}, config1), config2)).find(
958
+ ([, hotkey]) => testHotkeyMatch(pressedKeys, tree, hotkey)
959
+ )) == null ? void 0 : _a[0];
960
+ };
961
+ var hotkeysCoreFeature = {
962
+ key: "hotkeys-core",
963
+ onTreeMount: (tree, element) => {
964
+ const data = tree.getDataRef();
965
+ const keydown = (e) => {
966
+ var _a, _b;
967
+ const { ignoreHotkeysOnInputs, onTreeHotkey, hotkeys } = tree.getConfig();
968
+ if (e.target instanceof HTMLInputElement && ignoreHotkeysOnInputs) {
969
+ return;
970
+ }
971
+ (_b = (_a = data.current).pressedKeys) != null ? _b : _a.pressedKeys = /* @__PURE__ */ new Set();
972
+ const newMatch = !data.current.pressedKeys.has(e.code);
973
+ data.current.pressedKeys.add(e.code);
974
+ const hotkeyName = findHotkeyMatch(
975
+ data.current.pressedKeys,
976
+ tree,
977
+ tree.getHotkeyPresets(),
978
+ hotkeys
979
+ );
980
+ if (e.target instanceof HTMLInputElement) {
981
+ data.current.pressedKeys.delete(e.code);
982
+ }
983
+ if (!hotkeyName) return;
984
+ const hotkeyConfig = __spreadValues(__spreadValues({}, tree.getHotkeyPresets()[hotkeyName]), hotkeys == null ? void 0 : hotkeys[hotkeyName]);
985
+ if (!hotkeyConfig) return;
986
+ if (!hotkeyConfig.allowWhenInputFocused && e.target instanceof HTMLInputElement)
987
+ return;
988
+ if (!hotkeyConfig.canRepeat && !newMatch) return;
989
+ if (hotkeyConfig.preventDefault) e.preventDefault();
990
+ hotkeyConfig.handler(e, tree);
991
+ onTreeHotkey == null ? void 0 : onTreeHotkey(hotkeyName, e);
992
+ };
993
+ const keyup = (e) => {
994
+ var _a, _b;
995
+ (_b = (_a = data.current).pressedKeys) != null ? _b : _a.pressedKeys = /* @__PURE__ */ new Set();
996
+ data.current.pressedKeys.delete(e.code);
997
+ };
998
+ const reset = () => {
999
+ data.current.pressedKeys = /* @__PURE__ */ new Set();
1000
+ };
1001
+ element.addEventListener("keydown", keydown);
1002
+ document.addEventListener("keyup", keyup);
1003
+ window.addEventListener("focus", reset);
1004
+ data.current.keydownHandler = keydown;
1005
+ data.current.keyupHandler = keyup;
1006
+ data.current.resetHandler = reset;
1007
+ },
1008
+ onTreeUnmount: (tree, element) => {
1009
+ const data = tree.getDataRef();
1010
+ if (data.current.keyupHandler) {
1011
+ document.removeEventListener("keyup", data.current.keyupHandler);
1012
+ delete data.current.keyupHandler;
1013
+ }
1014
+ if (data.current.keydownHandler) {
1015
+ element.removeEventListener("keydown", data.current.keydownHandler);
1016
+ delete data.current.keydownHandler;
1017
+ }
1018
+ if (data.current.resetHandler) {
1019
+ window.removeEventListener("focus", data.current.resetHandler);
1020
+ delete data.current.resetHandler;
1021
+ }
1022
+ }
1023
+ };
1024
+
1025
+ // src/features/async-data-loader/feature.ts
1026
+ var getDataRef = (tree) => {
1027
+ var _a, _b, _c, _d;
1028
+ const dataRef = tree.getDataRef();
1029
+ (_b = (_a = dataRef.current).itemData) != null ? _b : _a.itemData = {};
1030
+ (_d = (_c = dataRef.current).childrenIds) != null ? _d : _c.childrenIds = {};
1031
+ return dataRef;
1032
+ };
1033
+ var loadItemData = (tree, itemId) => __async(null, null, function* () {
1034
+ var _a;
1035
+ const config = tree.getConfig();
1036
+ const dataRef = getDataRef(tree);
1037
+ const item = yield config.dataLoader.getItem(itemId);
1038
+ dataRef.current.itemData[itemId] = item;
1039
+ (_a = config.onLoadedItem) == null ? void 0 : _a.call(config, itemId, item);
1040
+ tree.applySubStateUpdate(
1041
+ "loadingItemData",
1042
+ (loadingItemData) => loadingItemData.filter((id) => id !== itemId)
1043
+ );
1044
+ return item;
1045
+ });
1046
+ var loadChildrenIds = (tree, itemId) => __async(null, null, function* () {
1047
+ var _a, _b;
1048
+ const config = tree.getConfig();
1049
+ const dataRef = getDataRef(tree);
1050
+ let childrenIds;
1051
+ if ("getChildrenWithData" in config.dataLoader) {
1052
+ const children = yield config.dataLoader.getChildrenWithData(itemId);
1053
+ childrenIds = children.map((c) => c.id);
1054
+ dataRef.current.childrenIds[itemId] = childrenIds;
1055
+ children.forEach(({ id, data }) => {
1056
+ var _a2;
1057
+ dataRef.current.itemData[id] = data;
1058
+ (_a2 = config.onLoadedItem) == null ? void 0 : _a2.call(config, id, data);
1059
+ });
1060
+ (_a = config.onLoadedChildren) == null ? void 0 : _a.call(config, itemId, childrenIds);
1061
+ tree.rebuildTree();
1062
+ tree.applySubStateUpdate(
1063
+ "loadingItemData",
1064
+ (loadingItemData) => loadingItemData.filter((id) => !childrenIds.includes(id))
1065
+ );
1066
+ } else {
1067
+ childrenIds = yield config.dataLoader.getChildren(itemId);
1068
+ dataRef.current.childrenIds[itemId] = childrenIds;
1069
+ (_b = config.onLoadedChildren) == null ? void 0 : _b.call(config, itemId, childrenIds);
1070
+ tree.rebuildTree();
1071
+ }
1072
+ tree.applySubStateUpdate(
1073
+ "loadingItemChildrens",
1074
+ (loadingItemChildrens) => loadingItemChildrens.filter((id) => id !== itemId)
1075
+ );
1076
+ return childrenIds;
1077
+ });
1078
+ var asyncDataLoaderFeature = {
1079
+ key: "async-data-loader",
1080
+ getInitialState: (initialState) => __spreadValues({
1081
+ loadingItemData: [],
1082
+ loadingItemChildrens: []
1083
+ }, initialState),
1084
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1085
+ setLoadingItemData: makeStateUpdater("loadingItemData", tree),
1086
+ setLoadingItemChildrens: makeStateUpdater("loadingItemChildrens", tree)
1087
+ }, defaultConfig),
1088
+ stateHandlerNames: {
1089
+ loadingItemData: "setLoadingItemData",
1090
+ loadingItemChildrens: "setLoadingItemChildrens"
1091
+ },
1092
+ treeInstance: {
1093
+ waitForItemDataLoaded: ({ tree }, itemId) => tree.loadItemData(itemId),
1094
+ waitForItemChildrenLoaded: ({ tree }, itemId) => tree.loadChildrenIds(itemId),
1095
+ loadItemData: (_0, _1) => __async(null, [_0, _1], function* ({ tree }, itemId) {
1096
+ var _a;
1097
+ return (_a = getDataRef(tree).current.itemData[itemId]) != null ? _a : yield loadItemData(tree, itemId);
1098
+ }),
1099
+ loadChildrenIds: (_0, _1) => __async(null, [_0, _1], function* ({ tree }, itemId) {
1100
+ var _a;
1101
+ return (_a = getDataRef(tree).current.childrenIds[itemId]) != null ? _a : yield loadChildrenIds(tree, itemId);
1102
+ }),
1103
+ retrieveItemData: ({ tree }, itemId, skipFetch = false) => {
1104
+ var _a, _b;
1105
+ const config = tree.getConfig();
1106
+ const dataRef = getDataRef(tree);
1107
+ if (dataRef.current.itemData[itemId]) {
1108
+ return dataRef.current.itemData[itemId];
1109
+ }
1110
+ if (!tree.getState().loadingItemData.includes(itemId) && !skipFetch) {
1111
+ tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
1112
+ ...loadingItemData,
1113
+ itemId
1114
+ ]);
1115
+ loadItemData(tree, itemId);
1116
+ }
1117
+ return (_b = (_a = config.createLoadingItemData) == null ? void 0 : _a.call(config)) != null ? _b : null;
1118
+ },
1119
+ retrieveChildrenIds: ({ tree }, itemId, skipFetch = false) => {
1120
+ const dataRef = getDataRef(tree);
1121
+ if (dataRef.current.childrenIds[itemId]) {
1122
+ return dataRef.current.childrenIds[itemId];
1123
+ }
1124
+ if (tree.getState().loadingItemChildrens.includes(itemId) || skipFetch) {
1125
+ return [];
1126
+ }
1127
+ tree.applySubStateUpdate(
1128
+ "loadingItemChildrens",
1129
+ (loadingItemChildrens) => [...loadingItemChildrens, itemId]
1130
+ );
1131
+ loadChildrenIds(tree, itemId);
1132
+ return [];
1133
+ }
1134
+ },
1135
+ itemInstance: {
1136
+ isLoading: ({ tree, item }) => tree.getState().loadingItemData.includes(item.getItemMeta().itemId) || tree.getState().loadingItemChildrens.includes(item.getItemMeta().itemId),
1137
+ invalidateItemData: (_0, _1) => __async(null, [_0, _1], function* ({ tree, itemId }, optimistic) {
1138
+ var _a;
1139
+ if (!optimistic) {
1140
+ (_a = getDataRef(tree).current.itemData) == null ? true : delete _a[itemId];
1141
+ tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
1142
+ ...loadingItemData,
1143
+ itemId
1144
+ ]);
1145
+ }
1146
+ yield loadItemData(tree, itemId);
1147
+ }),
1148
+ invalidateChildrenIds: (_0, _1) => __async(null, [_0, _1], function* ({ tree, itemId }, optimistic) {
1149
+ var _a;
1150
+ if (!optimistic) {
1151
+ (_a = getDataRef(tree).current.childrenIds) == null ? true : delete _a[itemId];
1152
+ tree.applySubStateUpdate(
1153
+ "loadingItemChildrens",
1154
+ (loadingItemChildrens) => [...loadingItemChildrens, itemId]
1155
+ );
1156
+ }
1157
+ yield loadChildrenIds(tree, itemId);
1158
+ }),
1159
+ updateCachedChildrenIds: ({ tree, itemId }, childrenIds) => {
1160
+ const dataRef = tree.getDataRef();
1161
+ dataRef.current.childrenIds[itemId] = childrenIds;
1162
+ tree.rebuildTree();
1163
+ },
1164
+ updateCachedData: ({ tree, itemId }, data) => {
1165
+ const dataRef = tree.getDataRef();
1166
+ dataRef.current.itemData[itemId] = data;
1167
+ tree.rebuildTree();
1168
+ }
1169
+ }
1170
+ };
1171
+
1172
+ // src/features/sync-data-loader/feature.ts
1173
+ var undefErrorMessage = "sync dataLoader returned undefined";
1174
+ var promiseErrorMessage = "sync dataLoader returned promise";
1175
+ var unpromise = (data) => {
1176
+ if (!data) {
1177
+ throw throwError(undefErrorMessage);
1178
+ }
1179
+ if (typeof data === "object" && "then" in data) {
1180
+ throw throwError(promiseErrorMessage);
1181
+ }
1182
+ return data;
1183
+ };
1184
+ var syncDataLoaderFeature = {
1185
+ key: "sync-data-loader",
1186
+ getInitialState: (initialState) => __spreadValues({
1187
+ loadingItemData: [],
1188
+ loadingItemChildrens: []
1189
+ }, initialState),
1190
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1191
+ setLoadingItemData: makeStateUpdater("loadingItemData", tree),
1192
+ setLoadingItemChildrens: makeStateUpdater("loadingItemChildrens", tree)
1193
+ }, defaultConfig),
1194
+ stateHandlerNames: {
1195
+ loadingItemData: "setLoadingItemData",
1196
+ loadingItemChildrens: "setLoadingItemChildrens"
1197
+ },
1198
+ treeInstance: {
1199
+ waitForItemDataLoaded: () => __async(null, null, function* () {
1200
+ }),
1201
+ waitForItemChildrenLoaded: () => __async(null, null, function* () {
1202
+ }),
1203
+ retrieveItemData: ({ tree }, itemId) => {
1204
+ return unpromise(tree.getConfig().dataLoader.getItem(itemId));
1205
+ },
1206
+ retrieveChildrenIds: ({ tree }, itemId) => {
1207
+ const { dataLoader } = tree.getConfig();
1208
+ if ("getChildren" in dataLoader) {
1209
+ return unpromise(dataLoader.getChildren(itemId));
1210
+ }
1211
+ return unpromise(dataLoader.getChildrenWithData(itemId)).map(
1212
+ (c) => c.data
1213
+ );
1214
+ },
1215
+ loadItemData: ({ tree }, itemId) => tree.retrieveItemData(itemId),
1216
+ loadChildrenIds: ({ tree }, itemId) => tree.retrieveChildrenIds(itemId)
1217
+ },
1218
+ itemInstance: {
1219
+ isLoading: () => false
1220
+ }
1221
+ };
1222
+
1223
+ // src/features/drag-and-drop/utils.ts
1224
+ var isOrderedDragTarget = (dragTarget) => "childIndex" in dragTarget;
1225
+ var canDrop = (dataTransfer, target, tree) => {
1226
+ var _a, _b, _c;
1227
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1228
+ const config = tree.getConfig();
1229
+ if (draggedItems && !((_c = (_b = config.canDrop) == null ? void 0 : _b.call(config, draggedItems, target)) != null ? _c : true)) {
1230
+ return false;
1231
+ }
1232
+ if (draggedItems && draggedItems.some(
1233
+ (draggedItem) => target.item.getId() === draggedItem.getId() || target.item.isDescendentOf(draggedItem.getId())
1234
+ )) {
1235
+ return false;
1236
+ }
1237
+ if (!draggedItems && dataTransfer && config.canDropForeignDragObject && !config.canDropForeignDragObject(dataTransfer, target)) {
1238
+ return false;
1239
+ }
1240
+ return true;
1241
+ };
1242
+ var getItemDropCategory = (item) => {
1243
+ if (item.isExpanded()) {
1244
+ return 1 /* ExpandedFolder */;
1245
+ }
1246
+ const parent = item.getParent();
1247
+ if (parent && item.getIndexInParent() === item.getItemMeta().setSize - 1) {
1248
+ return 2 /* LastInGroup */;
1249
+ }
1250
+ return 0 /* Item */;
1251
+ };
1252
+ var getInsertionIndex = (children, childIndex, draggedItems) => {
1253
+ var _a;
1254
+ const numberOfDragItemsBeforeTarget = (_a = children.slice(0, childIndex).reduce(
1255
+ (counter, child) => child && (draggedItems == null ? void 0 : draggedItems.some((i) => i.getId() === child.getId())) ? ++counter : counter,
1256
+ 0
1257
+ )) != null ? _a : 0;
1258
+ return childIndex - numberOfDragItemsBeforeTarget;
1259
+ };
1260
+ var getTargetPlacement = (e, item, tree, canMakeChild) => {
1261
+ var _a, _b, _c, _d, _e;
1262
+ const config = tree.getConfig();
1263
+ if (!config.canReorder) {
1264
+ return canMakeChild ? { type: 2 /* MakeChild */ } : { type: 1 /* ReorderBelow */ };
1265
+ }
1266
+ const bb = (_a = item.getElement()) == null ? void 0 : _a.getBoundingClientRect();
1267
+ const topPercent = bb ? (e.clientY - bb.top) / bb.height : 0.5;
1268
+ const leftPixels = bb ? e.clientX - bb.left : 0;
1269
+ const targetDropCategory = getItemDropCategory(item);
1270
+ const reorderAreaPercentage = !canMakeChild ? 0.5 : (_b = config.reorderAreaPercentage) != null ? _b : 0.3;
1271
+ const indent = (_c = config.indent) != null ? _c : 20;
1272
+ const makeChildType = canMakeChild ? 2 /* MakeChild */ : 1 /* ReorderBelow */;
1273
+ if (targetDropCategory === 1 /* ExpandedFolder */) {
1274
+ if (topPercent < reorderAreaPercentage) {
1275
+ return { type: 0 /* ReorderAbove */ };
1276
+ }
1277
+ return { type: makeChildType };
1278
+ }
1279
+ if (targetDropCategory === 2 /* LastInGroup */) {
1280
+ if (leftPixels < item.getItemMeta().level * indent) {
1281
+ if (topPercent < 0.5) {
1282
+ return { type: 0 /* ReorderAbove */ };
1283
+ }
1284
+ const minLevel = (_e = (_d = item.getItemBelow()) == null ? void 0 : _d.getItemMeta().level) != null ? _e : 0;
1285
+ return {
1286
+ type: 3 /* Reparent */,
1287
+ reparentLevel: Math.max(minLevel, Math.floor(leftPixels / indent))
1288
+ };
1289
+ }
1290
+ }
1291
+ if (topPercent < reorderAreaPercentage) {
1292
+ return { type: 0 /* ReorderAbove */ };
1293
+ }
1294
+ if (topPercent > 1 - reorderAreaPercentage) {
1295
+ return { type: 1 /* ReorderBelow */ };
1296
+ }
1297
+ return { type: makeChildType };
1298
+ };
1299
+ var getDragCode = (e, item, tree) => {
1300
+ const placement = getTargetPlacement(e, item, tree, true);
1301
+ return [
1302
+ item.getId(),
1303
+ placement.type,
1304
+ placement.type === 3 /* Reparent */ ? placement.reparentLevel : 0
1305
+ ].join("__");
1306
+ };
1307
+ var getNthParent = (item, n) => {
1308
+ if (n === item.getItemMeta().level) {
1309
+ return item;
1310
+ }
1311
+ return getNthParent(item.getParent(), n);
1312
+ };
1313
+ var getReparentTarget = (item, reparentLevel, draggedItems) => {
1314
+ const itemMeta = item.getItemMeta();
1315
+ const reparentedTarget = getNthParent(item, reparentLevel - 1);
1316
+ const targetItemAbove = getNthParent(item, reparentLevel);
1317
+ const targetIndex = targetItemAbove.getIndexInParent() + 1;
1318
+ return {
1319
+ item: reparentedTarget,
1320
+ childIndex: targetIndex,
1321
+ insertionIndex: getInsertionIndex(
1322
+ reparentedTarget.getChildren(),
1323
+ targetIndex,
1324
+ draggedItems
1325
+ ),
1326
+ dragLineIndex: itemMeta.index + 1,
1327
+ dragLineLevel: reparentLevel
1328
+ };
1329
+ };
1330
+ var getDragTarget = (e, item, tree, canReorder = tree.getConfig().canReorder) => {
1331
+ var _a;
1332
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1333
+ const itemMeta = item.getItemMeta();
1334
+ const parent = item.getParent();
1335
+ const itemTarget = { item };
1336
+ const parentTarget = parent ? { item: parent } : null;
1337
+ const canBecomeSibling = parentTarget && canDrop(e.dataTransfer, parentTarget, tree);
1338
+ const canMakeChild = canDrop(e.dataTransfer, itemTarget, tree);
1339
+ const placement = getTargetPlacement(e, item, tree, canMakeChild);
1340
+ if (!canReorder && parent && canBecomeSibling && placement.type !== 2 /* MakeChild */) {
1341
+ return parentTarget;
1342
+ }
1343
+ if (!canReorder && parent && !canBecomeSibling) {
1344
+ return getDragTarget(e, parent, tree, false);
1345
+ }
1346
+ if (!parent) {
1347
+ return itemTarget;
1348
+ }
1349
+ if (placement.type === 2 /* MakeChild */) {
1350
+ return itemTarget;
1351
+ }
1352
+ if (!canBecomeSibling) {
1353
+ return getDragTarget(e, parent, tree, false);
1354
+ }
1355
+ if (placement.type === 3 /* Reparent */) {
1356
+ return getReparentTarget(item, placement.reparentLevel, draggedItems);
1357
+ }
1358
+ const maybeAddOneForBelow = placement.type === 0 /* ReorderAbove */ ? 0 : 1;
1359
+ const childIndex = item.getIndexInParent() + maybeAddOneForBelow;
1360
+ return {
1361
+ item: parent,
1362
+ dragLineIndex: itemMeta.index + maybeAddOneForBelow,
1363
+ dragLineLevel: itemMeta.level,
1364
+ childIndex,
1365
+ // TODO performance could be improved by computing this only when dragcode changed
1366
+ insertionIndex: getInsertionIndex(
1367
+ parent.getChildren(),
1368
+ childIndex,
1369
+ draggedItems
1370
+ )
1371
+ };
1372
+ };
1373
+
1374
+ // src/features/drag-and-drop/feature.ts
1375
+ var defaultCanDropForeignDragObject = () => false;
1376
+ var dragAndDropFeature = {
1377
+ key: "drag-and-drop",
1378
+ deps: ["selection"],
1379
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1380
+ canDrop: (_, target) => target.item.isFolder(),
1381
+ canDropForeignDragObject: defaultCanDropForeignDragObject,
1382
+ canDragForeignDragObjectOver: defaultConfig.canDropForeignDragObject !== defaultCanDropForeignDragObject ? (dataTransfer) => dataTransfer.effectAllowed !== "none" : () => false,
1383
+ setDndState: makeStateUpdater("dnd", tree),
1384
+ canReorder: true
1385
+ }, defaultConfig),
1386
+ stateHandlerNames: {
1387
+ dnd: "setDndState"
1388
+ },
1389
+ onTreeMount: (tree) => {
1390
+ const listener = () => {
1391
+ tree.applySubStateUpdate("dnd", null);
1392
+ };
1393
+ tree.getDataRef().current.windowDragEndListener = listener;
1394
+ window.addEventListener("dragend", listener);
1395
+ },
1396
+ onTreeUnmount: (tree) => {
1397
+ const { windowDragEndListener } = tree.getDataRef().current;
1398
+ if (!windowDragEndListener) return;
1399
+ window.removeEventListener("dragend", windowDragEndListener);
1400
+ },
1401
+ treeInstance: {
1402
+ getDragTarget: ({ tree }) => {
1403
+ var _a, _b;
1404
+ return (_b = (_a = tree.getState().dnd) == null ? void 0 : _a.dragTarget) != null ? _b : null;
1405
+ },
1406
+ getDragLineData: ({ tree }) => {
1407
+ var _a, _b, _c, _d, _e, _f;
1408
+ const target = tree.getDragTarget();
1409
+ const indent = ((_a = target == null ? void 0 : target.item.getItemMeta().level) != null ? _a : 0) + 1;
1410
+ const treeBb = (_b = tree.getElement()) == null ? void 0 : _b.getBoundingClientRect();
1411
+ if (!target || !treeBb || !isOrderedDragTarget(target)) return null;
1412
+ const leftOffset = target.dragLineLevel * ((_c = tree.getConfig().indent) != null ? _c : 1);
1413
+ const targetItem = tree.getItems()[target.dragLineIndex];
1414
+ if (!targetItem) {
1415
+ const bb2 = (_e = (_d = tree.getItems()[target.dragLineIndex - 1]) == null ? void 0 : _d.getElement()) == null ? void 0 : _e.getBoundingClientRect();
1416
+ if (bb2) {
1417
+ return {
1418
+ indent,
1419
+ top: bb2.bottom - treeBb.top,
1420
+ left: bb2.left + leftOffset - treeBb.left,
1421
+ width: bb2.width - leftOffset
1422
+ };
1423
+ }
1424
+ }
1425
+ const bb = (_f = targetItem.getElement()) == null ? void 0 : _f.getBoundingClientRect();
1426
+ if (bb) {
1427
+ return {
1428
+ indent,
1429
+ top: bb.top - treeBb.top,
1430
+ left: bb.left + leftOffset - treeBb.left,
1431
+ width: bb.width - leftOffset
1432
+ };
1433
+ }
1434
+ return null;
1435
+ },
1436
+ getDragLineStyle: ({ tree }, topOffset = -1, leftOffset = -8) => {
1437
+ const dragLine = tree.getDragLineData();
1438
+ return dragLine ? {
1439
+ position: "absolute",
1440
+ top: `${dragLine.top + topOffset}px`,
1441
+ left: `${dragLine.left + leftOffset}px`,
1442
+ width: `${dragLine.width - leftOffset}px`,
1443
+ pointerEvents: "none"
1444
+ // important to prevent capturing drag events
1445
+ } : { display: "none" };
1446
+ },
1447
+ getContainerProps: ({ prev, tree }, treeLabel) => {
1448
+ const prevProps = prev == null ? void 0 : prev(treeLabel);
1449
+ return __spreadProps(__spreadValues({}, prevProps), {
1450
+ onDragOver: (e) => {
1451
+ e.preventDefault();
1452
+ },
1453
+ onDrop: (e) => __async(null, null, function* () {
1454
+ var _a, _b, _c;
1455
+ const dataRef = tree.getDataRef();
1456
+ const target = { item: tree.getRootItem() };
1457
+ if (!canDrop(e.dataTransfer, target, tree)) {
1458
+ return;
1459
+ }
1460
+ e.preventDefault();
1461
+ const config = tree.getConfig();
1462
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1463
+ dataRef.current.lastDragCode = void 0;
1464
+ if (draggedItems) {
1465
+ yield (_b = config.onDrop) == null ? void 0 : _b.call(config, draggedItems, target);
1466
+ } else if (e.dataTransfer) {
1467
+ yield (_c = config.onDropForeignDragObject) == null ? void 0 : _c.call(config, e.dataTransfer, target);
1468
+ }
1469
+ }),
1470
+ style: __spreadProps(__spreadValues({}, prevProps == null ? void 0 : prevProps.style), {
1471
+ position: "relative"
1472
+ })
1473
+ });
1474
+ }
1475
+ },
1476
+ itemInstance: {
1477
+ getProps: ({ tree, item, prev }) => __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
1478
+ draggable: true,
1479
+ onDragEnter: (e) => e.preventDefault(),
1480
+ onDragStart: (e) => {
1481
+ var _a, _b, _c;
1482
+ const selectedItems = tree.getSelectedItems();
1483
+ const items = selectedItems.includes(item) ? selectedItems : [item];
1484
+ const config = tree.getConfig();
1485
+ if (!selectedItems.includes(item)) {
1486
+ tree.setSelectedItems([item.getItemMeta().itemId]);
1487
+ }
1488
+ if (!((_b = (_a = config.canDrag) == null ? void 0 : _a.call(config, items)) != null ? _b : true)) {
1489
+ e.preventDefault();
1490
+ return;
1491
+ }
1492
+ if (config.setDragImage) {
1493
+ const { imgElement, xOffset, yOffset } = config.setDragImage(items);
1494
+ (_c = e.dataTransfer) == null ? void 0 : _c.setDragImage(imgElement, xOffset != null ? xOffset : 0, yOffset != null ? yOffset : 0);
1495
+ }
1496
+ if (config.createForeignDragObject && e.dataTransfer) {
1497
+ const { format, data, dropEffect, effectAllowed } = config.createForeignDragObject(items);
1498
+ e.dataTransfer.setData(format, data);
1499
+ if (dropEffect) e.dataTransfer.dropEffect = dropEffect;
1500
+ if (effectAllowed) e.dataTransfer.effectAllowed = effectAllowed;
1501
+ }
1502
+ tree.applySubStateUpdate("dnd", {
1503
+ draggedItems: items,
1504
+ draggingOverItem: tree.getFocusedItem()
1505
+ });
1506
+ },
1507
+ onDragOver: (e) => {
1508
+ var _a, _b, _c;
1509
+ e.stopPropagation();
1510
+ const dataRef = tree.getDataRef();
1511
+ const nextDragCode = getDragCode(e, item, tree);
1512
+ if (nextDragCode === dataRef.current.lastDragCode) {
1513
+ if (dataRef.current.lastAllowDrop) {
1514
+ e.preventDefault();
1515
+ }
1516
+ return;
1517
+ }
1518
+ dataRef.current.lastDragCode = nextDragCode;
1519
+ dataRef.current.lastDragEnter = Date.now();
1520
+ const target = getDragTarget(e, item, tree);
1521
+ if (!((_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems) && (!e.dataTransfer || !((_c = (_b = tree.getConfig()).canDragForeignDragObjectOver) == null ? void 0 : _c.call(_b, e.dataTransfer, target)))) {
1522
+ dataRef.current.lastAllowDrop = false;
1523
+ return;
1524
+ }
1525
+ if (!canDrop(e.dataTransfer, target, tree)) {
1526
+ dataRef.current.lastAllowDrop = false;
1527
+ return;
1528
+ }
1529
+ tree.applySubStateUpdate("dnd", (state) => __spreadProps(__spreadValues({}, state), {
1530
+ dragTarget: target,
1531
+ draggingOverItem: item
1532
+ }));
1533
+ dataRef.current.lastAllowDrop = true;
1534
+ e.preventDefault();
1535
+ },
1536
+ onDragLeave: () => {
1537
+ setTimeout(() => {
1538
+ var _a;
1539
+ const dataRef = tree.getDataRef();
1540
+ if (((_a = dataRef.current.lastDragEnter) != null ? _a : 0) + 100 >= Date.now()) return;
1541
+ dataRef.current.lastDragCode = "no-drag";
1542
+ tree.applySubStateUpdate("dnd", (state) => __spreadProps(__spreadValues({}, state), {
1543
+ draggingOverItem: void 0,
1544
+ dragTarget: void 0
1545
+ }));
1546
+ }, 100);
1547
+ },
1548
+ onDragEnd: (e) => {
1549
+ var _a, _b;
1550
+ const { onCompleteForeignDrop, canDragForeignDragObjectOver } = tree.getConfig();
1551
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1552
+ if (((_b = e.dataTransfer) == null ? void 0 : _b.dropEffect) === "none" || !draggedItems) {
1553
+ return;
1554
+ }
1555
+ const target = getDragTarget(e, item, tree);
1556
+ if (canDragForeignDragObjectOver && e.dataTransfer && !canDragForeignDragObjectOver(e.dataTransfer, target)) {
1557
+ return;
1558
+ }
1559
+ onCompleteForeignDrop == null ? void 0 : onCompleteForeignDrop(draggedItems);
1560
+ },
1561
+ onDrop: (e) => __async(null, null, function* () {
1562
+ var _a, _b, _c;
1563
+ e.stopPropagation();
1564
+ const dataRef = tree.getDataRef();
1565
+ const target = getDragTarget(e, item, tree);
1566
+ if (!canDrop(e.dataTransfer, target, tree)) {
1567
+ return;
1568
+ }
1569
+ e.preventDefault();
1570
+ const config = tree.getConfig();
1571
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1572
+ dataRef.current.lastDragCode = void 0;
1573
+ if (draggedItems) {
1574
+ yield (_b = config.onDrop) == null ? void 0 : _b.call(config, draggedItems, target);
1575
+ } else if (e.dataTransfer) {
1576
+ yield (_c = config.onDropForeignDragObject) == null ? void 0 : _c.call(config, e.dataTransfer, target);
1577
+ }
1578
+ })
1579
+ }),
1580
+ isDragTarget: ({ tree, item }) => {
1581
+ const target = tree.getDragTarget();
1582
+ return target ? target.item.getId() === item.getId() : false;
1583
+ },
1584
+ isDragTargetAbove: ({ tree, item }) => {
1585
+ const target = tree.getDragTarget();
1586
+ if (!target || !isOrderedDragTarget(target) || target.item !== item.getParent())
1587
+ return false;
1588
+ return target.childIndex === item.getItemMeta().posInSet;
1589
+ },
1590
+ isDragTargetBelow: ({ tree, item }) => {
1591
+ const target = tree.getDragTarget();
1592
+ if (!target || !isOrderedDragTarget(target) || target.item !== item.getParent())
1593
+ return false;
1594
+ return target.childIndex - 1 === item.getItemMeta().posInSet;
1595
+ },
1596
+ isDraggingOver: ({ tree, item }) => {
1597
+ var _a, _b;
1598
+ return ((_b = (_a = tree.getState().dnd) == null ? void 0 : _a.draggingOverItem) == null ? void 0 : _b.getId()) === item.getId();
1599
+ }
1600
+ }
1601
+ };
1602
+
1603
+ // src/features/keyboard-drag-and-drop/feature.ts
1604
+ var getNextDragTarget = (tree, isUp, dragTarget) => {
1605
+ var _a, _b, _c, _d;
1606
+ const direction = isUp ? 0 : 1;
1607
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1608
+ if (isOrderedDragTarget(dragTarget)) {
1609
+ const parent = dragTarget.item.getParent();
1610
+ const targetedItem = tree.getItems()[dragTarget.dragLineIndex - 1];
1611
+ const targetCategory = targetedItem ? getItemDropCategory(targetedItem) : 0 /* Item */;
1612
+ const maxLevel = (_b = targetedItem == null ? void 0 : targetedItem.getItemMeta().level) != null ? _b : 0;
1613
+ const minLevel = (_d = (_c = targetedItem == null ? void 0 : targetedItem.getItemBelow()) == null ? void 0 : _c.getItemMeta().level) != null ? _d : 0;
1614
+ if (targetCategory === 2 /* LastInGroup */) {
1615
+ if (isUp && dragTarget.dragLineLevel < maxLevel) {
1616
+ return getReparentTarget(
1617
+ targetedItem,
1618
+ dragTarget.dragLineLevel + 1,
1619
+ draggedItems
1620
+ );
1621
+ }
1622
+ if (!isUp && dragTarget.dragLineLevel > minLevel && parent) {
1623
+ return getReparentTarget(
1624
+ targetedItem,
1625
+ dragTarget.dragLineLevel - 1,
1626
+ draggedItems
1627
+ );
1628
+ }
1629
+ }
1630
+ const newIndex = dragTarget.dragLineIndex - 1 + direction;
1631
+ const item = tree.getItems()[newIndex];
1632
+ return item ? { item } : void 0;
1633
+ }
1634
+ const targetingExpandedFolder = getItemDropCategory(dragTarget.item) === 1 /* ExpandedFolder */;
1635
+ if (targetingExpandedFolder && !isUp) {
1636
+ return {
1637
+ item: dragTarget.item,
1638
+ childIndex: 0,
1639
+ insertionIndex: getInsertionIndex(
1640
+ dragTarget.item.getChildren(),
1641
+ 0,
1642
+ draggedItems
1643
+ ),
1644
+ dragLineIndex: dragTarget.item.getItemMeta().index + direction,
1645
+ dragLineLevel: dragTarget.item.getItemMeta().level + 1
1646
+ };
1647
+ }
1648
+ const childIndex = dragTarget.item.getIndexInParent() + direction;
1649
+ return {
1650
+ item: dragTarget.item.getParent(),
1651
+ childIndex,
1652
+ insertionIndex: getInsertionIndex(
1653
+ dragTarget.item.getParent().getChildren(),
1654
+ childIndex,
1655
+ draggedItems
1656
+ ),
1657
+ dragLineIndex: dragTarget.item.getItemMeta().index + direction,
1658
+ dragLineLevel: dragTarget.item.getItemMeta().level
1659
+ };
1660
+ };
1661
+ var getNextValidDragTarget = (tree, isUp, previousTarget = ((_a) => (_a = tree.getState().dnd) == null ? void 0 : _a.dragTarget)()) => {
1662
+ var _a2;
1663
+ if (!previousTarget) return void 0;
1664
+ const nextTarget = getNextDragTarget(tree, isUp, previousTarget);
1665
+ const dataTransfer = (_a2 = tree.getDataRef().current.kDndDataTransfer) != null ? _a2 : null;
1666
+ if (!nextTarget) return void 0;
1667
+ if (canDrop(dataTransfer, nextTarget, tree)) {
1668
+ return nextTarget;
1669
+ }
1670
+ return getNextValidDragTarget(tree, isUp, nextTarget);
1671
+ };
1672
+ var updateScroll = (tree) => {
1673
+ const state = tree.getState().dnd;
1674
+ if (!(state == null ? void 0 : state.dragTarget) || isOrderedDragTarget(state.dragTarget)) return;
1675
+ state.dragTarget.item.scrollTo({ block: "nearest", inline: "nearest" });
1676
+ };
1677
+ var initiateDrag = (tree, draggedItems, dataTransfer) => {
1678
+ var _a, _b;
1679
+ const focusedItem = tree.getFocusedItem();
1680
+ const { canDrag } = tree.getConfig();
1681
+ if (draggedItems && canDrag && !canDrag(draggedItems)) {
1682
+ return;
1683
+ }
1684
+ if (draggedItems) {
1685
+ tree.applySubStateUpdate("dnd", { draggedItems });
1686
+ (_b = (_a = tree.getConfig()).onStartKeyboardDrag) == null ? void 0 : _b.call(_a, draggedItems);
1687
+ } else if (dataTransfer) {
1688
+ tree.getDataRef().current.kDndDataTransfer = dataTransfer;
1689
+ }
1690
+ const dragTarget = getNextValidDragTarget(tree, false, {
1691
+ item: focusedItem
1692
+ });
1693
+ if (!dragTarget) return;
1694
+ tree.applySubStateUpdate("dnd", {
1695
+ draggedItems,
1696
+ dragTarget
1697
+ });
1698
+ tree.applySubStateUpdate("assistiveDndState", 1 /* Started */);
1699
+ updateScroll(tree);
1700
+ };
1701
+ var moveDragPosition = (tree, isUp) => {
1702
+ var _a;
1703
+ const dragTarget = getNextValidDragTarget(tree, isUp);
1704
+ if (!dragTarget) return;
1705
+ tree.applySubStateUpdate("dnd", {
1706
+ draggedItems: (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems,
1707
+ dragTarget
1708
+ });
1709
+ tree.applySubStateUpdate("assistiveDndState", 2 /* Dragging */);
1710
+ if (!isOrderedDragTarget(dragTarget)) {
1711
+ dragTarget.item.setFocused();
1712
+ }
1713
+ updateScroll(tree);
1714
+ };
1715
+ var keyboardDragAndDropFeature = {
1716
+ key: "keyboard-drag-and-drop",
1717
+ deps: ["drag-and-drop"],
1718
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1719
+ setAssistiveDndState: makeStateUpdater("assistiveDndState", tree)
1720
+ }, defaultConfig),
1721
+ stateHandlerNames: {
1722
+ assistiveDndState: "setAssistiveDndState"
1723
+ },
1724
+ treeInstance: {
1725
+ startKeyboardDrag: ({ tree }, draggedItems) => {
1726
+ initiateDrag(tree, draggedItems, void 0);
1727
+ },
1728
+ startKeyboardDragOnForeignObject: ({ tree }, dataTransfer) => {
1729
+ initiateDrag(tree, void 0, dataTransfer);
1730
+ },
1731
+ stopKeyboardDrag: ({ tree }) => {
1732
+ tree.getDataRef().current.kDndDataTransfer = void 0;
1733
+ tree.applySubStateUpdate("dnd", null);
1734
+ tree.applySubStateUpdate("assistiveDndState", 0 /* None */);
1735
+ }
1736
+ },
1737
+ hotkeys: {
1738
+ startDrag: {
1739
+ hotkey: "Control+Shift+KeyD",
1740
+ preventDefault: true,
1741
+ isEnabled: (tree) => !tree.getState().dnd,
1742
+ handler: (_, tree) => {
1743
+ const selectedItems = tree.getSelectedItems();
1744
+ const focusedItem = tree.getFocusedItem();
1745
+ tree.startKeyboardDrag(
1746
+ selectedItems.includes(focusedItem) ? selectedItems : selectedItems.concat(focusedItem)
1747
+ );
1748
+ }
1749
+ },
1750
+ dragUp: {
1751
+ hotkey: "ArrowUp",
1752
+ preventDefault: true,
1753
+ isEnabled: (tree) => !!tree.getState().dnd,
1754
+ handler: (_, tree) => {
1755
+ moveDragPosition(tree, true);
1756
+ }
1757
+ },
1758
+ dragDown: {
1759
+ hotkey: "ArrowDown",
1760
+ preventDefault: true,
1761
+ isEnabled: (tree) => !!tree.getState().dnd,
1762
+ handler: (_, tree) => {
1763
+ moveDragPosition(tree, false);
1764
+ }
1765
+ },
1766
+ cancelDrag: {
1767
+ hotkey: "Escape",
1768
+ isEnabled: (tree) => !!tree.getState().dnd,
1769
+ handler: (_, tree) => {
1770
+ tree.stopKeyboardDrag();
1771
+ }
1772
+ },
1773
+ completeDrag: {
1774
+ hotkey: "Enter",
1775
+ preventDefault: true,
1776
+ isEnabled: (tree) => !!tree.getState().dnd,
1777
+ handler: (e, tree) => __async(null, null, function* () {
1778
+ var _a, _b, _c, _d;
1779
+ e.stopPropagation();
1780
+ const dataRef = tree.getDataRef();
1781
+ const target = tree.getDragTarget();
1782
+ const dataTransfer = (_a = dataRef.current.kDndDataTransfer) != null ? _a : null;
1783
+ if (!target || !canDrop(dataTransfer, target, tree)) {
1784
+ return;
1785
+ }
1786
+ const config = tree.getConfig();
1787
+ const draggedItems = (_b = tree.getState().dnd) == null ? void 0 : _b.draggedItems;
1788
+ dataRef.current.lastDragCode = void 0;
1789
+ tree.applySubStateUpdate("dnd", null);
1790
+ if (draggedItems) {
1791
+ yield (_c = config.onDrop) == null ? void 0 : _c.call(config, draggedItems, target);
1792
+ tree.getItemInstance(draggedItems[0].getId()).setFocused();
1793
+ } else if (dataTransfer) {
1794
+ yield (_d = config.onDropForeignDragObject) == null ? void 0 : _d.call(config, dataTransfer, target);
1795
+ }
1796
+ tree.applySubStateUpdate(
1797
+ "assistiveDndState",
1798
+ 3 /* Completed */
1799
+ );
1800
+ })
1801
+ }
1802
+ }
1803
+ };
1804
+
1805
+ // src/features/search/feature.ts
1806
+ var searchFeature = {
1807
+ key: "search",
1808
+ getInitialState: (initialState) => __spreadValues({
1809
+ search: null
1810
+ }, initialState),
1811
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1812
+ setSearch: makeStateUpdater("search", tree),
1813
+ isSearchMatchingItem: (search, item) => search.length > 0 && item.getItemName().toLowerCase().includes(search.toLowerCase())
1814
+ }, defaultConfig),
1815
+ stateHandlerNames: {
1816
+ search: "setSearch"
1817
+ },
1818
+ treeInstance: {
1819
+ setSearch: ({ tree }, search) => {
1820
+ var _a;
1821
+ tree.applySubStateUpdate("search", search);
1822
+ (_a = tree.getItems().find(
1823
+ (item) => {
1824
+ var _a2, _b;
1825
+ return (_b = (_a2 = tree.getConfig()).isSearchMatchingItem) == null ? void 0 : _b.call(_a2, tree.getSearchValue(), item);
1826
+ }
1827
+ )) == null ? void 0 : _a.setFocused();
1828
+ },
1829
+ openSearch: ({ tree }, initialValue = "") => {
1830
+ var _a, _b;
1831
+ tree.setSearch(initialValue);
1832
+ (_b = (_a = tree.getConfig()).onOpenSearch) == null ? void 0 : _b.call(_a);
1833
+ setTimeout(() => {
1834
+ var _a2;
1835
+ (_a2 = tree.getDataRef().current.searchInput) == null ? void 0 : _a2.focus();
1836
+ });
1837
+ },
1838
+ closeSearch: ({ tree }) => {
1839
+ var _a, _b;
1840
+ tree.setSearch(null);
1841
+ (_b = (_a = tree.getConfig()).onCloseSearch) == null ? void 0 : _b.call(_a);
1842
+ tree.updateDomFocus();
1843
+ },
1844
+ isSearchOpen: ({ tree }) => tree.getState().search !== null,
1845
+ getSearchValue: ({ tree }) => tree.getState().search || "",
1846
+ registerSearchInputElement: ({ tree }, element) => {
1847
+ const dataRef = tree.getDataRef();
1848
+ dataRef.current.searchInput = element;
1849
+ if (element && dataRef.current.keydownHandler) {
1850
+ element.addEventListener("keydown", dataRef.current.keydownHandler);
1851
+ }
1852
+ },
1853
+ getSearchInputElement: ({ tree }) => {
1854
+ var _a;
1855
+ return (_a = tree.getDataRef().current.searchInput) != null ? _a : null;
1856
+ },
1857
+ // TODO memoize with propMemoizationFeature
1858
+ getSearchInputElementProps: ({ tree }) => ({
1859
+ value: tree.getSearchValue(),
1860
+ onChange: (e) => tree.setSearch(e.target.value),
1861
+ onBlur: () => tree.closeSearch(),
1862
+ ref: tree.registerSearchInputElement
1863
+ }),
1864
+ getSearchMatchingItems: memo(
1865
+ ({ tree }) => [
1866
+ tree.getSearchValue(),
1867
+ tree.getItems(),
1868
+ tree.getConfig().isSearchMatchingItem
1869
+ ],
1870
+ (search, items, isSearchMatchingItem) => items.filter((item) => search && (isSearchMatchingItem == null ? void 0 : isSearchMatchingItem(search, item)))
1871
+ )
1872
+ },
1873
+ itemInstance: {
1874
+ isMatchingSearch: ({ tree, item }) => tree.getSearchMatchingItems().some((i) => i.getId() === item.getId())
1875
+ },
1876
+ hotkeys: {
1877
+ openSearch: {
1878
+ hotkey: "LetterOrNumber",
1879
+ preventDefault: true,
1880
+ // TODO make true default
1881
+ isEnabled: (tree) => !tree.isSearchOpen(),
1882
+ handler: (e, tree) => {
1883
+ e.stopPropagation();
1884
+ tree.openSearch(e.key);
1885
+ }
1886
+ },
1887
+ closeSearch: {
1888
+ // TODO allow multiple, i.e. Enter
1889
+ hotkey: "Escape",
1890
+ allowWhenInputFocused: true,
1891
+ isEnabled: (tree) => tree.isSearchOpen(),
1892
+ handler: (e, tree) => {
1893
+ tree.closeSearch();
1894
+ }
1895
+ },
1896
+ submitSearch: {
1897
+ hotkey: "Enter",
1898
+ allowWhenInputFocused: true,
1899
+ isEnabled: (tree) => tree.isSearchOpen(),
1900
+ handler: (e, tree) => {
1901
+ tree.closeSearch();
1902
+ tree.setSelectedItems([tree.getFocusedItem().getId()]);
1903
+ }
1904
+ },
1905
+ nextSearchItem: {
1906
+ hotkey: "ArrowDown",
1907
+ allowWhenInputFocused: true,
1908
+ canRepeat: true,
1909
+ isEnabled: (tree) => tree.isSearchOpen(),
1910
+ handler: (e, tree) => {
1911
+ const focusItem = tree.getSearchMatchingItems().find(
1912
+ (item) => item.getItemMeta().index > tree.getFocusedItem().getItemMeta().index
1913
+ );
1914
+ focusItem == null ? void 0 : focusItem.setFocused();
1915
+ focusItem == null ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
1916
+ }
1917
+ },
1918
+ previousSearchItem: {
1919
+ hotkey: "ArrowUp",
1920
+ allowWhenInputFocused: true,
1921
+ canRepeat: true,
1922
+ isEnabled: (tree) => tree.isSearchOpen(),
1923
+ handler: (e, tree) => {
1924
+ const focusItem = [...tree.getSearchMatchingItems()].reverse().find(
1925
+ (item) => item.getItemMeta().index < tree.getFocusedItem().getItemMeta().index
1926
+ );
1927
+ focusItem == null ? void 0 : focusItem.setFocused();
1928
+ focusItem == null ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
1929
+ }
1930
+ }
1931
+ }
1932
+ };
1933
+
1934
+ // src/features/renaming/feature.ts
1935
+ var renamingFeature = {
1936
+ key: "renaming",
1937
+ overwrites: ["drag-and-drop"],
1938
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1939
+ setRenamingItem: makeStateUpdater("renamingItem", tree),
1940
+ setRenamingValue: makeStateUpdater("renamingValue", tree),
1941
+ canRename: () => true
1942
+ }, defaultConfig),
1943
+ stateHandlerNames: {
1944
+ renamingItem: "setRenamingItem",
1945
+ renamingValue: "setRenamingValue"
1946
+ },
1947
+ treeInstance: {
1948
+ getRenamingItem: ({ tree }) => {
1949
+ const itemId = tree.getState().renamingItem;
1950
+ return itemId ? tree.getItemInstance(itemId) : null;
1951
+ },
1952
+ getRenamingValue: ({ tree }) => tree.getState().renamingValue || "",
1953
+ abortRenaming: ({ tree }) => {
1954
+ tree.applySubStateUpdate("renamingItem", null);
1955
+ tree.updateDomFocus();
1956
+ },
1957
+ completeRenaming: ({ tree }) => {
1958
+ var _a;
1959
+ const config = tree.getConfig();
1960
+ const item = tree.getRenamingItem();
1961
+ if (item) {
1962
+ (_a = config.onRename) == null ? void 0 : _a.call(config, item, tree.getState().renamingValue || "");
1963
+ }
1964
+ tree.applySubStateUpdate("renamingItem", null);
1965
+ tree.updateDomFocus();
1966
+ },
1967
+ isRenamingItem: ({ tree }) => !!tree.getState().renamingItem
1968
+ },
1969
+ itemInstance: {
1970
+ startRenaming: ({ tree, item, itemId }) => {
1971
+ if (!item.canRename()) {
1972
+ return;
1973
+ }
1974
+ tree.applySubStateUpdate("renamingItem", itemId);
1975
+ tree.applySubStateUpdate("renamingValue", item.getItemName());
1976
+ },
1977
+ getRenameInputProps: ({ tree }) => ({
1978
+ ref: (r) => r == null ? void 0 : r.focus(),
1979
+ onBlur: () => tree.abortRenaming(),
1980
+ value: tree.getRenamingValue(),
1981
+ onChange: (e) => {
1982
+ var _a;
1983
+ tree.applySubStateUpdate("renamingValue", (_a = e.target) == null ? void 0 : _a.value);
1984
+ }
1985
+ }),
1986
+ canRename: ({ tree, item }) => {
1987
+ var _a, _b, _c;
1988
+ return (_c = (_b = (_a = tree.getConfig()).canRename) == null ? void 0 : _b.call(_a, item)) != null ? _c : true;
1989
+ },
1990
+ isRenaming: ({ tree, item }) => item.getId() === tree.getState().renamingItem,
1991
+ getProps: ({ prev, item }) => {
1992
+ var _a;
1993
+ const isRenaming = item.isRenaming();
1994
+ const prevProps = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
1995
+ return isRenaming ? __spreadProps(__spreadValues({}, prevProps), {
1996
+ draggable: false,
1997
+ onDragStart: () => {
1998
+ }
1999
+ }) : prevProps;
2000
+ }
2001
+ },
2002
+ hotkeys: {
2003
+ renameItem: {
2004
+ hotkey: "F2",
2005
+ handler: (e, tree) => {
2006
+ tree.getFocusedItem().startRenaming();
2007
+ }
2008
+ },
2009
+ abortRenaming: {
2010
+ hotkey: "Escape",
2011
+ allowWhenInputFocused: true,
2012
+ isEnabled: (tree) => tree.isRenamingItem(),
2013
+ handler: (e, tree) => {
2014
+ tree.abortRenaming();
2015
+ }
2016
+ },
2017
+ completeRenaming: {
2018
+ hotkey: "Enter",
2019
+ allowWhenInputFocused: true,
2020
+ isEnabled: (tree) => tree.isRenamingItem(),
2021
+ handler: (e, tree) => {
2022
+ tree.completeRenaming();
2023
+ }
2024
+ }
2025
+ }
2026
+ };
2027
+
2028
+ // src/features/expand-all/feature.ts
2029
+ var expandAllFeature = {
2030
+ key: "expand-all",
2031
+ treeInstance: {
2032
+ expandAll: (_0, _1) => __async(null, [_0, _1], function* ({ tree }, cancelToken) {
2033
+ yield Promise.all(
2034
+ tree.getItems().map((item) => item.expandAll(cancelToken))
2035
+ );
2036
+ }),
2037
+ collapseAll: ({ tree }) => {
2038
+ tree.applySubStateUpdate("expandedItems", []);
2039
+ tree.rebuildTree();
2040
+ }
2041
+ },
2042
+ itemInstance: {
2043
+ expandAll: (_0, _1) => __async(null, [_0, _1], function* ({ tree, item }, cancelToken) {
2044
+ if (cancelToken == null ? void 0 : cancelToken.current) {
2045
+ return;
2046
+ }
2047
+ if (!item.isFolder()) {
2048
+ return;
2049
+ }
2050
+ item.expand();
2051
+ yield tree.waitForItemChildrenLoaded(item.getId());
2052
+ yield Promise.all(
2053
+ item.getChildren().map((child) => __async(null, null, function* () {
2054
+ yield tree.waitForItemChildrenLoaded(item.getId());
2055
+ yield child == null ? void 0 : child.expandAll(cancelToken);
2056
+ }))
2057
+ );
2058
+ }),
2059
+ collapseAll: ({ item }) => {
2060
+ if (!item.isExpanded()) return;
2061
+ for (const child of item.getChildren()) {
2062
+ child == null ? void 0 : child.collapseAll();
2063
+ }
2064
+ item.collapse();
2065
+ }
2066
+ },
2067
+ hotkeys: {
2068
+ expandSelected: {
2069
+ hotkey: "Control+Shift+Plus",
2070
+ handler: (_, tree) => __async(null, null, function* () {
2071
+ const cancelToken = { current: false };
2072
+ const cancelHandler = (e) => {
2073
+ if (e.code === "Escape") {
2074
+ cancelToken.current = true;
2075
+ }
2076
+ };
2077
+ document.addEventListener("keydown", cancelHandler);
2078
+ yield Promise.all(
2079
+ tree.getSelectedItems().map((item) => item.expandAll(cancelToken))
2080
+ );
2081
+ document.removeEventListener("keydown", cancelHandler);
2082
+ })
2083
+ },
2084
+ collapseSelected: {
2085
+ hotkey: "Control+Shift+Minus",
2086
+ handler: (_, tree) => {
2087
+ tree.getSelectedItems().forEach((item) => item.collapseAll());
2088
+ }
2089
+ }
2090
+ }
2091
+ };
2092
+
2093
+ // src/features/prop-memoization/feature.ts
2094
+ var memoize = (props, memoizedProps) => {
2095
+ for (const key in props) {
2096
+ if (typeof props[key] === "function") {
2097
+ if (memoizedProps && key in memoizedProps) {
2098
+ props[key] = memoizedProps[key];
2099
+ } else {
2100
+ memoizedProps[key] = props[key];
2101
+ }
2102
+ }
2103
+ }
2104
+ return props;
2105
+ };
2106
+ var propMemoizationFeature = {
2107
+ key: "prop-memoization",
2108
+ overwrites: [
2109
+ "main",
2110
+ "async-data-loader",
2111
+ "sync-data-loader",
2112
+ "drag-and-drop",
2113
+ "expand-all",
2114
+ "hotkeys-core",
2115
+ "renaming",
2116
+ "search",
2117
+ "selection"
2118
+ ],
2119
+ treeInstance: {
2120
+ getContainerProps: ({ tree, prev }, treeLabel) => {
2121
+ var _a, _b, _c, _d, _e;
2122
+ const dataRef = tree.getDataRef();
2123
+ const props = (_a = prev == null ? void 0 : prev(treeLabel)) != null ? _a : {};
2124
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2125
+ (_e = (_d = dataRef.current.memo).tree) != null ? _e : _d.tree = {};
2126
+ return memoize(props, dataRef.current.memo.tree);
2127
+ },
2128
+ getSearchInputElementProps: ({ tree, prev }) => {
2129
+ var _a, _b, _c, _d, _e;
2130
+ const dataRef = tree.getDataRef();
2131
+ const props = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
2132
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2133
+ (_e = (_d = dataRef.current.memo).search) != null ? _e : _d.search = {};
2134
+ return memoize(props, dataRef.current.memo.search);
2135
+ }
2136
+ },
2137
+ itemInstance: {
2138
+ getProps: ({ item, prev }) => {
2139
+ var _a, _b, _c, _d, _e;
2140
+ const dataRef = item.getDataRef();
2141
+ const props = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
2142
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2143
+ (_e = (_d = dataRef.current.memo).item) != null ? _e : _d.item = {};
2144
+ return memoize(props, dataRef.current.memo.item);
2145
+ },
2146
+ getRenameInputProps: ({ item, prev }) => {
2147
+ var _a, _b, _c, _d, _e;
2148
+ const dataRef = item.getDataRef();
2149
+ const props = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
2150
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2151
+ (_e = (_d = dataRef.current.memo).rename) != null ? _e : _d.rename = {};
2152
+ return memoize(props, dataRef.current.memo.rename);
2153
+ }
2154
+ }
2155
+ };
2156
+
2157
+ // src/utilities/remove-items-from-parents.ts
2158
+ var removeItemsFromParents = (movedItems, onChangeChildren) => __async(null, null, function* () {
2159
+ const movedItemsIds = movedItems.map((item) => item.getId());
2160
+ const uniqueParents = [
2161
+ ...new Set(movedItems.map((item) => item.getParent()))
2162
+ ];
2163
+ for (const parent of uniqueParents) {
2164
+ const siblings = parent == null ? void 0 : parent.getChildren();
2165
+ if (siblings && parent) {
2166
+ const newChildren = siblings.filter((sibling) => !movedItemsIds.includes(sibling.getId())).map((i) => i.getId());
2167
+ yield onChangeChildren(parent, newChildren);
2168
+ if (parent && "updateCachedChildrenIds" in parent) {
2169
+ parent == null ? void 0 : parent.updateCachedChildrenIds(newChildren);
2170
+ }
2171
+ }
2172
+ }
2173
+ movedItems[0].getTree().rebuildTree();
2174
+ });
2175
+
2176
+ // src/utilities/insert-items-at-target.ts
2177
+ var insertItemsAtTarget = (itemIds, target, onChangeChildren) => __async(null, null, function* () {
2178
+ yield target.item.getTree().waitForItemChildrenLoaded(target.item.getId());
2179
+ const oldChildrenIds = target.item.getTree().retrieveChildrenIds(target.item.getId());
2180
+ if (!("childIndex" in target)) {
2181
+ const newChildren2 = [...oldChildrenIds, ...itemIds];
2182
+ yield onChangeChildren(target.item, newChildren2);
2183
+ if (target.item && "updateCachedChildrenIds" in target.item) {
2184
+ target.item.updateCachedChildrenIds(newChildren2);
2185
+ }
2186
+ target.item.getTree().rebuildTree();
2187
+ return;
2188
+ }
2189
+ const newChildren = [
2190
+ ...oldChildrenIds.slice(0, target.insertionIndex),
2191
+ ...itemIds,
2192
+ ...oldChildrenIds.slice(target.insertionIndex)
2193
+ ];
2194
+ yield onChangeChildren(target.item, newChildren);
2195
+ if (target.item && "updateCachedChildrenIds" in target.item) {
2196
+ target.item.updateCachedChildrenIds(newChildren);
2197
+ }
2198
+ target.item.getTree().rebuildTree();
2199
+ });
2200
+
2201
+ // src/utilities/create-on-drop-handler.ts
2202
+ var createOnDropHandler = (onChangeChildren) => (items, target) => __async(null, null, function* () {
2203
+ const itemIds = items.map((item) => item.getId());
2204
+ yield removeItemsFromParents(items, onChangeChildren);
2205
+ yield insertItemsAtTarget(itemIds, target, onChangeChildren);
2206
+ });
2207
+
2208
+ // src/core/build-proxified-instance.ts
2209
+ var noop = () => {
2210
+ };
2211
+ var findPrevInstanceMethod = (features, instanceType, methodKey, featureSearchIndex) => {
2212
+ var _a;
2213
+ for (let i = featureSearchIndex; i >= 0; i--) {
2214
+ const feature = features[i];
2215
+ const itemInstanceMethod = (_a = feature[instanceType]) == null ? void 0 : _a[methodKey];
2216
+ if (itemInstanceMethod) {
2217
+ return i;
2218
+ }
2219
+ }
2220
+ return null;
2221
+ };
2222
+ var invokeInstanceMethod = (features, instanceType, opts, methodKey, featureIndex, args) => {
2223
+ var _a;
2224
+ const prevIndex = findPrevInstanceMethod(
2225
+ features,
2226
+ instanceType,
2227
+ methodKey,
2228
+ featureIndex - 1
2229
+ );
2230
+ const itemInstanceMethod = (_a = features[featureIndex][instanceType]) == null ? void 0 : _a[methodKey];
2231
+ return itemInstanceMethod(
2232
+ __spreadProps(__spreadValues({}, opts), {
2233
+ prev: prevIndex !== null ? (...newArgs) => invokeInstanceMethod(
2234
+ features,
2235
+ instanceType,
2236
+ opts,
2237
+ methodKey,
2238
+ prevIndex,
2239
+ newArgs
2240
+ ) : null
2241
+ }),
2242
+ ...args
2243
+ );
2244
+ };
2245
+ var buildProxiedInstance = (features, instanceType, buildOpts) => {
2246
+ const opts = {};
2247
+ const item = new Proxy(
2248
+ {},
2249
+ {
2250
+ has(target, key) {
2251
+ if (typeof key === "symbol") {
2252
+ return false;
2253
+ }
2254
+ if (key === "toJSON") {
2255
+ return false;
2256
+ }
2257
+ const hasInstanceMethod = findPrevInstanceMethod(
2258
+ features,
2259
+ instanceType,
2260
+ key,
2261
+ features.length - 1
2262
+ );
2263
+ return Boolean(hasInstanceMethod);
2264
+ },
2265
+ get(target, key) {
2266
+ if (typeof key === "symbol") {
2267
+ return void 0;
2268
+ }
2269
+ if (key === "toJSON") {
2270
+ return {};
2271
+ }
2272
+ return (...args) => {
2273
+ const featureIndex = findPrevInstanceMethod(
2274
+ features,
2275
+ instanceType,
2276
+ key,
2277
+ features.length - 1
2278
+ );
2279
+ if (featureIndex === null) {
2280
+ throw throwError(`feature missing for method ${key}`);
2281
+ }
2282
+ return invokeInstanceMethod(
2283
+ features,
2284
+ instanceType,
2285
+ opts,
2286
+ key,
2287
+ featureIndex,
2288
+ args
2289
+ );
2290
+ };
2291
+ }
2292
+ }
2293
+ );
2294
+ Object.assign(opts, buildOpts(item));
2295
+ return [item, noop];
2296
+ };
2297
+ // Annotate the CommonJS export names for ESM import in node:
2298
+ 0 && (module.exports = {
2299
+ AssistiveDndState,
2300
+ CheckedState,
2301
+ DragTargetPosition,
2302
+ asyncDataLoaderFeature,
2303
+ buildProxiedInstance,
2304
+ buildStaticInstance,
2305
+ checkboxesFeature,
2306
+ createOnDropHandler,
2307
+ createTree,
2308
+ dragAndDropFeature,
2309
+ expandAllFeature,
2310
+ hotkeysCoreFeature,
2311
+ insertItemsAtTarget,
2312
+ isOrderedDragTarget,
2313
+ keyboardDragAndDropFeature,
2314
+ makeStateUpdater,
2315
+ propMemoizationFeature,
2316
+ removeItemsFromParents,
2317
+ renamingFeature,
2318
+ searchFeature,
2319
+ selectionFeature,
2320
+ syncDataLoaderFeature
2321
+ });