@headless-tree/core 0.0.0-20250725212154 → 0.0.0-20250726130412

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 (171) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/dist/index.d.mts +568 -0
  3. package/dist/index.d.ts +568 -0
  4. package/dist/index.js +2284 -0
  5. package/dist/index.mjs +2239 -0
  6. package/package.json +18 -10
  7. package/tsconfig.json +1 -4
  8. package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
  9. package/lib/cjs/core/build-proxified-instance.js +0 -58
  10. package/lib/cjs/core/build-static-instance.d.ts +0 -2
  11. package/lib/cjs/core/build-static-instance.js +0 -26
  12. package/lib/cjs/core/create-tree.d.ts +0 -2
  13. package/lib/cjs/core/create-tree.js +0 -191
  14. package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
  15. package/lib/cjs/features/async-data-loader/feature.js +0 -135
  16. package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
  17. package/lib/cjs/features/async-data-loader/types.js +0 -2
  18. package/lib/cjs/features/checkboxes/feature.d.ts +0 -2
  19. package/lib/cjs/features/checkboxes/feature.js +0 -102
  20. package/lib/cjs/features/checkboxes/types.d.ts +0 -27
  21. package/lib/cjs/features/checkboxes/types.js +0 -9
  22. package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
  23. package/lib/cjs/features/drag-and-drop/feature.js +0 -215
  24. package/lib/cjs/features/drag-and-drop/types.d.ts +0 -72
  25. package/lib/cjs/features/drag-and-drop/types.js +0 -9
  26. package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
  27. package/lib/cjs/features/drag-and-drop/utils.js +0 -182
  28. package/lib/cjs/features/expand-all/feature.d.ts +0 -2
  29. package/lib/cjs/features/expand-all/feature.js +0 -70
  30. package/lib/cjs/features/expand-all/types.d.ts +0 -19
  31. package/lib/cjs/features/expand-all/types.js +0 -2
  32. package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
  33. package/lib/cjs/features/hotkeys-core/feature.js +0 -107
  34. package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
  35. package/lib/cjs/features/hotkeys-core/types.js +0 -2
  36. package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  37. package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
  38. package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
  39. package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
  40. package/lib/cjs/features/main/types.d.ts +0 -47
  41. package/lib/cjs/features/main/types.js +0 -2
  42. package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
  43. package/lib/cjs/features/prop-memoization/feature.js +0 -70
  44. package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
  45. package/lib/cjs/features/prop-memoization/types.js +0 -2
  46. package/lib/cjs/features/renaming/feature.d.ts +0 -2
  47. package/lib/cjs/features/renaming/feature.js +0 -86
  48. package/lib/cjs/features/renaming/types.d.ts +0 -27
  49. package/lib/cjs/features/renaming/types.js +0 -2
  50. package/lib/cjs/features/search/feature.d.ts +0 -2
  51. package/lib/cjs/features/search/feature.js +0 -119
  52. package/lib/cjs/features/search/types.d.ts +0 -32
  53. package/lib/cjs/features/search/types.js +0 -2
  54. package/lib/cjs/features/selection/feature.d.ts +0 -2
  55. package/lib/cjs/features/selection/feature.js +0 -132
  56. package/lib/cjs/features/selection/types.d.ts +0 -21
  57. package/lib/cjs/features/selection/types.js +0 -2
  58. package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
  59. package/lib/cjs/features/sync-data-loader/feature.js +0 -53
  60. package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
  61. package/lib/cjs/features/sync-data-loader/types.js +0 -2
  62. package/lib/cjs/features/tree/feature.d.ts +0 -2
  63. package/lib/cjs/features/tree/feature.js +0 -245
  64. package/lib/cjs/features/tree/types.d.ts +0 -63
  65. package/lib/cjs/features/tree/types.js +0 -2
  66. package/lib/cjs/index.d.ts +0 -33
  67. package/lib/cjs/index.js +0 -51
  68. package/lib/cjs/mddocs-entry.d.ts +0 -121
  69. package/lib/cjs/mddocs-entry.js +0 -17
  70. package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
  71. package/lib/cjs/test-utils/test-tree-do.js +0 -114
  72. package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
  73. package/lib/cjs/test-utils/test-tree-expect.js +0 -66
  74. package/lib/cjs/test-utils/test-tree.d.ts +0 -48
  75. package/lib/cjs/test-utils/test-tree.js +0 -208
  76. package/lib/cjs/types/core.d.ts +0 -84
  77. package/lib/cjs/types/core.js +0 -2
  78. package/lib/cjs/types/deep-merge.d.ts +0 -13
  79. package/lib/cjs/types/deep-merge.js +0 -2
  80. package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
  81. package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
  82. package/lib/cjs/utilities/errors.d.ts +0 -2
  83. package/lib/cjs/utilities/errors.js +0 -9
  84. package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
  85. package/lib/cjs/utilities/insert-items-at-target.js +0 -40
  86. package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
  87. package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
  88. package/lib/cjs/utils.d.ts +0 -6
  89. package/lib/cjs/utils.js +0 -53
  90. package/lib/esm/core/build-proxified-instance.d.ts +0 -2
  91. package/lib/esm/core/build-proxified-instance.js +0 -54
  92. package/lib/esm/core/build-static-instance.d.ts +0 -2
  93. package/lib/esm/core/build-static-instance.js +0 -22
  94. package/lib/esm/core/create-tree.d.ts +0 -2
  95. package/lib/esm/core/create-tree.js +0 -187
  96. package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
  97. package/lib/esm/features/async-data-loader/feature.js +0 -132
  98. package/lib/esm/features/async-data-loader/types.d.ts +0 -47
  99. package/lib/esm/features/async-data-loader/types.js +0 -1
  100. package/lib/esm/features/checkboxes/feature.d.ts +0 -2
  101. package/lib/esm/features/checkboxes/feature.js +0 -99
  102. package/lib/esm/features/checkboxes/types.d.ts +0 -27
  103. package/lib/esm/features/checkboxes/types.js +0 -6
  104. package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
  105. package/lib/esm/features/drag-and-drop/feature.js +0 -212
  106. package/lib/esm/features/drag-and-drop/types.d.ts +0 -72
  107. package/lib/esm/features/drag-and-drop/types.js +0 -6
  108. package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
  109. package/lib/esm/features/drag-and-drop/utils.js +0 -172
  110. package/lib/esm/features/expand-all/feature.d.ts +0 -2
  111. package/lib/esm/features/expand-all/feature.js +0 -67
  112. package/lib/esm/features/expand-all/types.d.ts +0 -19
  113. package/lib/esm/features/expand-all/types.js +0 -1
  114. package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
  115. package/lib/esm/features/hotkeys-core/feature.js +0 -104
  116. package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
  117. package/lib/esm/features/hotkeys-core/types.js +0 -1
  118. package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  119. package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
  120. package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
  121. package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
  122. package/lib/esm/features/main/types.d.ts +0 -47
  123. package/lib/esm/features/main/types.js +0 -1
  124. package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
  125. package/lib/esm/features/prop-memoization/feature.js +0 -67
  126. package/lib/esm/features/prop-memoization/types.d.ts +0 -15
  127. package/lib/esm/features/prop-memoization/types.js +0 -1
  128. package/lib/esm/features/renaming/feature.d.ts +0 -2
  129. package/lib/esm/features/renaming/feature.js +0 -83
  130. package/lib/esm/features/renaming/types.d.ts +0 -27
  131. package/lib/esm/features/renaming/types.js +0 -1
  132. package/lib/esm/features/search/feature.d.ts +0 -2
  133. package/lib/esm/features/search/feature.js +0 -116
  134. package/lib/esm/features/search/types.d.ts +0 -32
  135. package/lib/esm/features/search/types.js +0 -1
  136. package/lib/esm/features/selection/feature.d.ts +0 -2
  137. package/lib/esm/features/selection/feature.js +0 -129
  138. package/lib/esm/features/selection/types.d.ts +0 -21
  139. package/lib/esm/features/selection/types.js +0 -1
  140. package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
  141. package/lib/esm/features/sync-data-loader/feature.js +0 -50
  142. package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
  143. package/lib/esm/features/sync-data-loader/types.js +0 -1
  144. package/lib/esm/features/tree/feature.d.ts +0 -2
  145. package/lib/esm/features/tree/feature.js +0 -242
  146. package/lib/esm/features/tree/types.d.ts +0 -63
  147. package/lib/esm/features/tree/types.js +0 -1
  148. package/lib/esm/index.d.ts +0 -33
  149. package/lib/esm/index.js +0 -32
  150. package/lib/esm/mddocs-entry.d.ts +0 -121
  151. package/lib/esm/mddocs-entry.js +0 -1
  152. package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
  153. package/lib/esm/test-utils/test-tree-do.js +0 -110
  154. package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
  155. package/lib/esm/test-utils/test-tree-expect.js +0 -62
  156. package/lib/esm/test-utils/test-tree.d.ts +0 -48
  157. package/lib/esm/test-utils/test-tree.js +0 -204
  158. package/lib/esm/types/core.d.ts +0 -84
  159. package/lib/esm/types/core.js +0 -1
  160. package/lib/esm/types/deep-merge.d.ts +0 -13
  161. package/lib/esm/types/deep-merge.js +0 -1
  162. package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
  163. package/lib/esm/utilities/create-on-drop-handler.js +0 -16
  164. package/lib/esm/utilities/errors.d.ts +0 -2
  165. package/lib/esm/utilities/errors.js +0 -4
  166. package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
  167. package/lib/esm/utilities/insert-items-at-target.js +0 -36
  168. package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
  169. package/lib/esm/utilities/remove-items-from-parents.js +0 -28
  170. package/lib/esm/utils.d.ts +0 -6
  171. package/lib/esm/utils.js +0 -46
package/CHANGELOG.md CHANGED
@@ -1,12 +1,15 @@
1
1
  # @headless-tree/core
2
2
 
3
- ## 0.0.0-20250725212154
3
+ ## 0.0.0-20250726130412
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - 662e2a8: Added stories and documentation on how to use nested DOM rendering for tree structures instead of flat lists
7
8
  - b41e1d2: fixed a bug where ending drag without successful drop doesn't properly reset drag line (#132)
8
9
  - b413f74: Fix `aria-posinset` and `aria-level` to be 1-based indexing
9
10
  - a250b3b: Fix a bug where expand from the initial keyboard focus fails when rootItemId is an empty string
11
+ - 662e2a8: Improved customizability of checkboxes feature (still alpha state), allowing you to customize `propagateCheckedState` and `canCheckFolders` independently
12
+ - 662e2a8: Changed to new buildtool in core packages (now using tsup) to hopefully fix some ESM/CJS integrations
10
13
 
11
14
  ## 1.2.1
12
15
 
@@ -0,0 +1,568 @@
1
+ interface DndDataRef {
2
+ lastDragCode?: string;
3
+ lastAllowDrop?: boolean;
4
+ windowDragEndListener?: () => void;
5
+ }
6
+ interface DndState<T> {
7
+ draggedItems?: ItemInstance<T>[];
8
+ draggingOverItem?: ItemInstance<T>;
9
+ dragTarget?: DragTarget<T>;
10
+ }
11
+ interface DragLineData {
12
+ indent: number;
13
+ top: number;
14
+ left: number;
15
+ width: number;
16
+ }
17
+ type DragTarget<T> = {
18
+ item: ItemInstance<T>;
19
+ childIndex: number;
20
+ insertionIndex: number;
21
+ dragLineIndex: number;
22
+ dragLineLevel: number;
23
+ } | {
24
+ item: ItemInstance<T>;
25
+ };
26
+ declare enum DragTargetPosition {
27
+ Top = "top",
28
+ Bottom = "bottom",
29
+ Item = "item"
30
+ }
31
+ type DragAndDropFeatureDef<T> = {
32
+ state: {
33
+ dnd?: DndState<T> | null;
34
+ };
35
+ config: {
36
+ setDndState?: SetStateFn<DndState<T> | undefined | null>;
37
+ /** Defines the size of the area at the top and bottom of an item where, when an item is dropped, the item willö
38
+ * be placed above or below the item within the same parent, as opposed to being placed inside the item.
39
+ * If `canReorder` is `false`, this is ignored. */
40
+ reorderAreaPercentage?: number;
41
+ canReorder?: boolean;
42
+ canDrag?: (items: ItemInstance<T>[]) => boolean;
43
+ canDrop?: (items: ItemInstance<T>[], target: DragTarget<T>) => boolean;
44
+ indent?: number;
45
+ createForeignDragObject?: (items: ItemInstance<T>[]) => {
46
+ format: string;
47
+ data: any;
48
+ };
49
+ setDragImage?: (items: ItemInstance<T>[]) => {
50
+ imgElement: Element;
51
+ xOffset?: number;
52
+ yOffset?: number;
53
+ };
54
+ canDropForeignDragObject?: (dataTransfer: DataTransfer, target: DragTarget<T>) => boolean;
55
+ onDrop?: (items: ItemInstance<T>[], target: DragTarget<T>) => void | Promise<void>;
56
+ onDropForeignDragObject?: (dataTransfer: DataTransfer, target: DragTarget<T>) => void | Promise<void>;
57
+ onCompleteForeignDrop?: (items: ItemInstance<T>[]) => void;
58
+ };
59
+ treeInstance: {
60
+ getDragTarget: () => DragTarget<T> | null;
61
+ getDragLineData: () => DragLineData | null;
62
+ getDragLineStyle: (topOffset?: number, leftOffset?: number) => Record<string, any>;
63
+ };
64
+ itemInstance: {
65
+ isDragTarget: () => boolean;
66
+ isDragTargetAbove: () => boolean;
67
+ isDragTargetBelow: () => boolean;
68
+ isDraggingOver: () => boolean;
69
+ };
70
+ hotkeys: never;
71
+ };
72
+
73
+ interface ItemMeta {
74
+ itemId: string;
75
+ parentId: string;
76
+ level: number;
77
+ index: number;
78
+ setSize: number;
79
+ posInSet: number;
80
+ }
81
+ interface TreeItemDataRef {
82
+ memoizedValues: Record<string, any>;
83
+ memoizedDeps: Record<string, any[] | undefined>;
84
+ }
85
+ type TreeFeatureDef<T> = {
86
+ state: {
87
+ expandedItems: string[];
88
+ focusedItem: string | null;
89
+ };
90
+ config: {
91
+ isItemFolder: (item: ItemInstance<T>) => boolean;
92
+ getItemName: (item: ItemInstance<T>) => string;
93
+ onPrimaryAction?: (item: ItemInstance<T>) => void;
94
+ scrollToItem?: (item: ItemInstance<T>) => void;
95
+ setExpandedItems?: SetStateFn<string[]>;
96
+ setFocusedItem?: SetStateFn<string | null>;
97
+ };
98
+ treeInstance: {
99
+ /** @internal */
100
+ getItemsMeta: () => ItemMeta[];
101
+ getFocusedItem: () => ItemInstance<T>;
102
+ getRootItem: () => ItemInstance<T>;
103
+ focusNextItem: () => void;
104
+ focusPreviousItem: () => void;
105
+ updateDomFocus: () => void;
106
+ /** Pass to the container rendering the tree children. The `treeLabel` parameter
107
+ * will be passed as `aria-label` parameter, and is recommended to be set. */
108
+ getContainerProps: (treeLabel?: string) => Record<string, any>;
109
+ };
110
+ itemInstance: {
111
+ getId: () => string;
112
+ getKey: () => string;
113
+ getProps: () => Record<string, any>;
114
+ getItemName: () => string;
115
+ getItemData: () => T;
116
+ equals: (other?: ItemInstance<any> | null) => boolean;
117
+ expand: () => void;
118
+ collapse: () => void;
119
+ isExpanded: () => boolean;
120
+ isDescendentOf: (parentId: string) => boolean;
121
+ isFocused: () => boolean;
122
+ isFolder: () => boolean;
123
+ setFocused: () => void;
124
+ getParent: () => ItemInstance<T> | undefined;
125
+ getChildren: () => ItemInstance<T>[];
126
+ getIndexInParent: () => number;
127
+ primaryAction: () => void;
128
+ getTree: () => TreeInstance<T>;
129
+ getItemAbove: () => ItemInstance<T> | undefined;
130
+ getItemBelow: () => ItemInstance<T> | undefined;
131
+ scrollTo: (scrollIntoViewArg?: boolean | ScrollIntoViewOptions) => Promise<void>;
132
+ };
133
+ hotkeys: "focusNextItem" | "focusPreviousItem" | "expandOrDown" | "collapseOrUp" | "focusFirstItem" | "focusLastItem";
134
+ };
135
+
136
+ type InstanceTypeMap = {
137
+ itemInstance: ItemInstance<any>;
138
+ treeInstance: TreeInstance<any>;
139
+ };
140
+ type InstanceBuilder = <T extends keyof InstanceTypeMap>(features: FeatureImplementation[], instanceType: T, buildOpts: (self: any) => any) => [instance: InstanceTypeMap[T], finalize: () => void];
141
+ type MainFeatureDef<T = any> = {
142
+ state: {};
143
+ config: {
144
+ features?: FeatureImplementation<any>[];
145
+ initialState?: Partial<TreeState<T>>;
146
+ state?: Partial<TreeState<T>>;
147
+ setState?: SetStateFn<Partial<TreeState<T>>>;
148
+ instanceBuilder?: InstanceBuilder;
149
+ };
150
+ treeInstance: {
151
+ /** @internal */
152
+ applySubStateUpdate: <K extends keyof TreeState<any>>(stateName: K, updater: Updater<TreeState<T>[K]>) => void;
153
+ /** @internal */
154
+ buildItemInstance: (itemId: string) => ItemInstance<T>;
155
+ setState: SetStateFn<TreeState<T>>;
156
+ getState: () => TreeState<T>;
157
+ setConfig: SetStateFn<TreeConfig<T>>;
158
+ getConfig: () => TreeConfig<T>;
159
+ getItemInstance: (itemId: string) => ItemInstance<T>;
160
+ getItems: () => ItemInstance<T>[];
161
+ registerElement: (element: HTMLElement | null) => void;
162
+ getElement: () => HTMLElement | undefined | null;
163
+ /** @internal */
164
+ getDataRef: <D>() => {
165
+ current: D;
166
+ };
167
+ getHotkeyPresets: () => HotkeysConfig<T>;
168
+ rebuildTree: () => void;
169
+ };
170
+ itemInstance: {
171
+ registerElement: (element: HTMLElement | null) => void;
172
+ getItemMeta: () => ItemMeta;
173
+ getElement: () => HTMLElement | undefined | null;
174
+ /** @internal */
175
+ getDataRef: <D>() => {
176
+ current: D;
177
+ };
178
+ };
179
+ hotkeys: never;
180
+ };
181
+
182
+ type SelectionFeatureDef<T> = {
183
+ state: {
184
+ selectedItems: string[];
185
+ };
186
+ config: {
187
+ setSelectedItems?: SetStateFn<string[]>;
188
+ };
189
+ treeInstance: {
190
+ setSelectedItems: (selectedItems: string[]) => void;
191
+ getSelectedItems: () => ItemInstance<T>[];
192
+ };
193
+ itemInstance: {
194
+ select: () => void;
195
+ deselect: () => void;
196
+ toggleSelect: () => void;
197
+ isSelected: () => boolean;
198
+ selectUpTo: (ctrl: boolean) => void;
199
+ };
200
+ hotkeys: "toggleSelectedItem" | "selectUpwards" | "selectDownwards" | "selectAll";
201
+ };
202
+
203
+ interface HotkeyConfig<T> {
204
+ hotkey: string;
205
+ canRepeat?: boolean;
206
+ allowWhenInputFocused?: boolean;
207
+ isEnabled?: (tree: TreeInstance<T>) => boolean;
208
+ preventDefault?: boolean;
209
+ handler: (e: KeyboardEvent, tree: TreeInstance<T>) => void;
210
+ }
211
+ interface HotkeysCoreDataRef {
212
+ keydownHandler?: (e: KeyboardEvent) => void;
213
+ keyupHandler?: (e: KeyboardEvent) => void;
214
+ resetHandler?: (e: FocusEvent) => void;
215
+ pressedKeys: Set<string>;
216
+ }
217
+ type HotkeysCoreFeatureDef<T> = {
218
+ state: {};
219
+ config: {
220
+ hotkeys?: CustomHotkeysConfig<T>;
221
+ onTreeHotkey?: (name: string, e: KeyboardEvent) => void;
222
+ /** Do not handle key inputs while an HTML input element is focused */
223
+ ignoreHotkeysOnInputs?: boolean;
224
+ };
225
+ treeInstance: {};
226
+ itemInstance: {};
227
+ hotkeys: never;
228
+ };
229
+
230
+ type TreeDataLoader<T> = {
231
+ getItem: (itemId: string) => T | Promise<T>;
232
+ getChildren: (itemId: string) => string[] | Promise<string[]>;
233
+ } | {
234
+ getItem: (itemId: string) => T | Promise<T>;
235
+ getChildrenWithData: (itemId: string) => {
236
+ id: string;
237
+ data: T;
238
+ }[] | Promise<{
239
+ id: string;
240
+ data: T;
241
+ }[]>;
242
+ };
243
+ type SyncDataLoaderFeatureDef<T> = {
244
+ state: {};
245
+ config: {
246
+ rootItemId: string;
247
+ dataLoader: TreeDataLoader<T>;
248
+ };
249
+ treeInstance: {
250
+ retrieveItemData: (itemId: string) => T;
251
+ retrieveChildrenIds: (itemId: string) => string[];
252
+ };
253
+ itemInstance: {
254
+ isLoading: () => boolean;
255
+ };
256
+ hotkeys: never;
257
+ };
258
+
259
+ interface AsyncDataLoaderDataRef<T = any> {
260
+ itemData: Record<string, T>;
261
+ childrenIds: Record<string, string[]>;
262
+ }
263
+ /**
264
+ * @category Async Data Loader/General
265
+ * */
266
+ type AsyncDataLoaderFeatureDef<T> = {
267
+ state: {
268
+ loadingItemData: string[];
269
+ loadingItemChildrens: string[];
270
+ };
271
+ config: {
272
+ rootItemId: string;
273
+ /** Will be called when HT retrieves item data for an item whose item data is asynchronously being loaded.
274
+ * Can be used to create placeholder data to use for rendering the tree item while it is loaded. If not defined,
275
+ * the tree item data will be null. */
276
+ createLoadingItemData?: () => T;
277
+ setLoadingItemData?: SetStateFn<string[]>;
278
+ setLoadingItemChildrens?: SetStateFn<string[]>;
279
+ onLoadedItem?: (itemId: string, item: T) => void;
280
+ onLoadedChildren?: (itemId: string, childrenIds: string[]) => void;
281
+ };
282
+ treeInstance: SyncDataLoaderFeatureDef<T>["treeInstance"] & {
283
+ /** @deprecated use loadItemData instead */
284
+ waitForItemDataLoaded: (itemId: string) => Promise<void>;
285
+ /** @deprecated use loadChildrenIds instead */
286
+ waitForItemChildrenLoaded: (itemId: string) => Promise<void>;
287
+ loadItemData: (itemId: string) => Promise<T>;
288
+ loadChildrenIds: (itemId: string) => Promise<string[]>;
289
+ };
290
+ itemInstance: SyncDataLoaderFeatureDef<T>["itemInstance"] & {
291
+ /** Invalidate fetched data for item, and triggers a refetch and subsequent rerender if the item is visible
292
+ * @param optimistic If true, the item will not trigger a state update on `loadingItemData`, and
293
+ * the tree will continue to display the old data until the new data has loaded. */
294
+ invalidateItemData: (optimistic?: boolean) => Promise<void>;
295
+ /** Invalidate fetched children ids for item, and triggers a refetch and subsequent rerender if the item is visible
296
+ * @param optimistic If true, the item will not trigger a state update on `loadingItemChildrens`, and
297
+ * the tree will continue to display the old data until the new data has loaded. */
298
+ invalidateChildrenIds: (optimistic?: boolean) => Promise<void>;
299
+ updateCachedChildrenIds: (childrenIds: string[]) => void;
300
+ isLoading: () => boolean;
301
+ };
302
+ hotkeys: SyncDataLoaderFeatureDef<T>["hotkeys"];
303
+ };
304
+
305
+ interface SearchFeatureDataRef<T = any> extends HotkeysCoreDataRef {
306
+ matchingItems: ItemInstance<T>[];
307
+ searchInput: HTMLInputElement | null;
308
+ }
309
+ type SearchFeatureDef<T> = {
310
+ state: {
311
+ search: string | null;
312
+ };
313
+ config: {
314
+ setSearch?: SetStateFn<string | null>;
315
+ onOpenSearch?: () => void;
316
+ onCloseSearch?: () => void;
317
+ isSearchMatchingItem?: (search: string, item: ItemInstance<T>) => boolean;
318
+ };
319
+ treeInstance: {
320
+ setSearch: (search: string | null) => void;
321
+ openSearch: (initialValue?: string) => void;
322
+ closeSearch: () => void;
323
+ isSearchOpen: () => boolean;
324
+ getSearchValue: () => string;
325
+ registerSearchInputElement: (element: HTMLInputElement | null) => void;
326
+ getSearchInputElement: () => HTMLInputElement | null;
327
+ getSearchInputElementProps: () => any;
328
+ getSearchMatchingItems: () => ItemInstance<T>[];
329
+ };
330
+ itemInstance: {
331
+ isMatchingSearch: () => boolean;
332
+ };
333
+ hotkeys: "openSearch" | "closeSearch" | "submitSearch" | "nextSearchItem" | "previousSearchItem";
334
+ };
335
+
336
+ type RenamingFeatureDef<T> = {
337
+ state: {
338
+ renamingItem?: string | null;
339
+ renamingValue?: string;
340
+ };
341
+ config: {
342
+ setRenamingItem?: SetStateFn<string | null | undefined>;
343
+ setRenamingValue?: SetStateFn<string | undefined>;
344
+ canRename?: (item: ItemInstance<T>) => boolean;
345
+ onRename?: (item: ItemInstance<T>, value: string) => void;
346
+ };
347
+ treeInstance: {
348
+ getRenamingItem: () => ItemInstance<T> | null;
349
+ getRenamingValue: () => string;
350
+ abortRenaming: () => void;
351
+ completeRenaming: () => void;
352
+ isRenamingItem: () => boolean;
353
+ };
354
+ itemInstance: {
355
+ getRenameInputProps: () => any;
356
+ canRename: () => boolean;
357
+ isRenaming: () => boolean;
358
+ startRenaming: () => void;
359
+ };
360
+ hotkeys: "renameItem" | "abortRenaming" | "completeRenaming";
361
+ };
362
+
363
+ interface ExpandAllDataRef {
364
+ }
365
+ type ExpandAllFeatureDef = {
366
+ state: {};
367
+ config: {};
368
+ treeInstance: {
369
+ expandAll: (cancelToken?: {
370
+ current: boolean;
371
+ }) => Promise<void>;
372
+ collapseAll: () => void;
373
+ };
374
+ itemInstance: {
375
+ expandAll: (cancelToken?: {
376
+ current: boolean;
377
+ }) => Promise<void>;
378
+ collapseAll: () => void;
379
+ };
380
+ hotkeys: "expandSelected" | "collapseSelected";
381
+ };
382
+
383
+ interface PropMemoizationDataRef {
384
+ memo?: {
385
+ tree?: Record<string, any>;
386
+ item?: Record<string, any>;
387
+ search?: Record<string, any>;
388
+ rename?: Record<string, any>;
389
+ };
390
+ }
391
+ type PropMemoizationFeatureDef = {
392
+ state: {};
393
+ config: {};
394
+ treeInstance: {};
395
+ itemInstance: {};
396
+ hotkeys: never;
397
+ };
398
+
399
+ interface KDndDataRef {
400
+ kDndDataTransfer: DataTransfer | undefined;
401
+ }
402
+ declare enum AssistiveDndState {
403
+ None = 0,
404
+ Started = 1,
405
+ Dragging = 2,
406
+ Completed = 3,
407
+ Aborted = 4
408
+ }
409
+ type KeyboardDragAndDropFeatureDef<T> = {
410
+ state: {
411
+ assistiveDndState?: AssistiveDndState | null;
412
+ };
413
+ config: {
414
+ setAssistiveDndState?: SetStateFn<AssistiveDndState | undefined | null>;
415
+ onStartKeyboardDrag?: (items: ItemInstance<T>[]) => void;
416
+ };
417
+ treeInstance: {
418
+ startKeyboardDrag: (items: ItemInstance<T>[]) => void;
419
+ startKeyboardDragOnForeignObject: (dataTransfer: DataTransfer) => void;
420
+ stopKeyboardDrag: () => void;
421
+ };
422
+ itemInstance: {};
423
+ hotkeys: "startDrag" | "cancelDrag" | "completeDrag" | "dragUp" | "dragDown";
424
+ };
425
+
426
+ declare enum CheckedState {
427
+ Checked = "checked",
428
+ Unchecked = "unchecked",
429
+ Indeterminate = "indeterminate"
430
+ }
431
+ type CheckboxesFeatureDef<T> = {
432
+ state: {
433
+ checkedItems: string[];
434
+ };
435
+ config: {
436
+ setCheckedItems?: SetStateFn<string[]>;
437
+ canCheckFolders?: boolean;
438
+ propagateCheckedState?: boolean;
439
+ };
440
+ treeInstance: {
441
+ setCheckedItems: (checkedItems: string[]) => void;
442
+ };
443
+ itemInstance: {
444
+ setChecked: () => void;
445
+ setUnchecked: () => void;
446
+ toggleCheckedState: () => void;
447
+ getCheckedState: () => CheckedState;
448
+ getCheckboxProps: () => Record<string, any>;
449
+ };
450
+ hotkeys: never;
451
+ };
452
+
453
+ type Updater<T> = T | ((old: T) => T);
454
+ type SetStateFn<T> = (updaterOrValue: Updater<T>) => void;
455
+ type FeatureDef = {
456
+ state: any;
457
+ config: any;
458
+ treeInstance: any;
459
+ itemInstance: any;
460
+ hotkeys: string;
461
+ };
462
+ type EmptyFeatureDef = {
463
+ state: {};
464
+ config: {};
465
+ treeInstance: {};
466
+ itemInstance: {};
467
+ hotkeys: never;
468
+ };
469
+ type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
470
+ type MergedFeatures<F extends FeatureDef> = {
471
+ state: UnionToIntersection<F["state"]>;
472
+ config: UnionToIntersection<F["config"]>;
473
+ treeInstance: UnionToIntersection<F["treeInstance"]>;
474
+ itemInstance: UnionToIntersection<F["itemInstance"]>;
475
+ hotkeys: F["hotkeys"];
476
+ };
477
+ type RegisteredFeatures<T> = MainFeatureDef<T> | TreeFeatureDef<T> | SelectionFeatureDef<T> | CheckboxesFeatureDef<T> | DragAndDropFeatureDef<T> | KeyboardDragAndDropFeatureDef<T> | HotkeysCoreFeatureDef<T> | SyncDataLoaderFeatureDef<T> | AsyncDataLoaderFeatureDef<T> | SearchFeatureDef<T> | RenamingFeatureDef<T> | ExpandAllFeatureDef | PropMemoizationFeatureDef;
478
+ type TreeStateType<T> = MergedFeatures<RegisteredFeatures<T>>["state"];
479
+ interface TreeState<T> extends TreeStateType<T> {
480
+ }
481
+ type TreeConfigType<T> = MergedFeatures<RegisteredFeatures<T>>["config"];
482
+ interface TreeConfig<T> extends TreeConfigType<T> {
483
+ }
484
+ type TreeInstanceType<T> = MergedFeatures<RegisteredFeatures<T>>["treeInstance"];
485
+ interface TreeInstance<T> extends TreeInstanceType<T> {
486
+ }
487
+ type ItemInstanceType<T> = MergedFeatures<RegisteredFeatures<T>>["itemInstance"];
488
+ interface ItemInstance<T> extends ItemInstanceType<T> {
489
+ }
490
+ type HotkeyName = MergedFeatures<RegisteredFeatures<any>>["hotkeys"];
491
+ type HotkeysConfig<T> = Record<HotkeyName, HotkeyConfig<T>>;
492
+ type CustomHotkeysConfig<T> = Partial<Record<HotkeyName | `custom${string}`, Partial<HotkeyConfig<T>>>>;
493
+ type MayReturnNull<T extends (...x: any[]) => any> = (...args: Parameters<T>) => ReturnType<T> | null;
494
+ type ItemInstanceOpts<Key extends keyof ItemInstance<any>> = {
495
+ item: ItemInstance<any>;
496
+ tree: TreeInstance<any>;
497
+ itemId: string;
498
+ prev?: MayReturnNull<ItemInstance<any>[Key]>;
499
+ };
500
+ type TreeInstanceOpts<Key extends keyof TreeInstance<any>> = {
501
+ tree: TreeInstance<any>;
502
+ prev?: MayReturnNull<TreeInstance<any>[Key]>;
503
+ };
504
+ type FeatureImplementation<T = any> = {
505
+ key?: string;
506
+ deps?: string[];
507
+ overwrites?: string[];
508
+ stateHandlerNames?: Partial<Record<keyof TreeState<T>, keyof TreeConfig<T>>>;
509
+ getInitialState?: (initialState: Partial<TreeState<T>>, tree: TreeInstance<T>) => Partial<TreeState<T>>;
510
+ getDefaultConfig?: (defaultConfig: Partial<TreeConfig<T>>, tree: TreeInstance<T>) => Partial<TreeConfig<T>>;
511
+ treeInstance?: {
512
+ [key in keyof TreeInstance<T>]?: (opts: TreeInstanceOpts<key>, ...args: Parameters<TreeInstance<T>[key]>) => void;
513
+ };
514
+ itemInstance?: {
515
+ [key in keyof ItemInstance<T>]?: (opts: ItemInstanceOpts<key>, ...args: Parameters<ItemInstance<T>[key]>) => void;
516
+ };
517
+ onTreeMount?: (instance: TreeInstance<T>, treeElement: HTMLElement) => void;
518
+ onTreeUnmount?: (instance: TreeInstance<T>, treeElement: HTMLElement) => void;
519
+ onItemMount?: (instance: ItemInstance<T>, itemElement: HTMLElement, tree: TreeInstance<T>) => void;
520
+ onItemUnmount?: (instance: ItemInstance<T>, itemElement: HTMLElement, tree: TreeInstance<T>) => void;
521
+ hotkeys?: Partial<HotkeysConfig<T>>;
522
+ };
523
+
524
+ declare const createTree: <T>(initialConfig: TreeConfig<T>) => TreeInstance<T>;
525
+
526
+ declare const selectionFeature: FeatureImplementation;
527
+
528
+ declare const checkboxesFeature: FeatureImplementation;
529
+
530
+ declare const hotkeysCoreFeature: FeatureImplementation;
531
+
532
+ declare const asyncDataLoaderFeature: FeatureImplementation;
533
+
534
+ declare const syncDataLoaderFeature: FeatureImplementation;
535
+
536
+ declare const dragAndDropFeature: FeatureImplementation;
537
+
538
+ declare const keyboardDragAndDropFeature: FeatureImplementation;
539
+
540
+ declare const searchFeature: FeatureImplementation;
541
+
542
+ declare const renamingFeature: FeatureImplementation;
543
+
544
+ declare const expandAllFeature: FeatureImplementation;
545
+
546
+ declare const propMemoizationFeature: FeatureImplementation;
547
+
548
+ declare const createOnDropHandler: <T>(onChangeChildren: (item: ItemInstance<T>, newChildren: string[]) => void) => (items: ItemInstance<T>[], target: DragTarget<T>) => Promise<void>;
549
+
550
+ declare const insertItemsAtTarget: <T>(itemIds: string[], target: DragTarget<T>, onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => Promise<void> | void) => Promise<void>;
551
+
552
+ declare const removeItemsFromParents: <T>(movedItems: ItemInstance<T>[], onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void | Promise<void>) => Promise<void>;
553
+
554
+ declare const buildProxiedInstance: InstanceBuilder;
555
+
556
+ declare const buildStaticInstance: InstanceBuilder;
557
+
558
+ declare function makeStateUpdater<K extends keyof TreeState<any>>(key: K, instance: unknown): SetStateFn<TreeState<any>[K]>;
559
+
560
+ declare const isOrderedDragTarget: <T>(dragTarget: DragTarget<T>) => dragTarget is {
561
+ item: ItemInstance<T>;
562
+ childIndex: number;
563
+ insertionIndex: number;
564
+ dragLineIndex: number;
565
+ dragLineLevel: number;
566
+ };
567
+
568
+ export { AssistiveDndState, type AsyncDataLoaderDataRef, type AsyncDataLoaderFeatureDef, type CheckboxesFeatureDef, CheckedState, type CustomHotkeysConfig, type DndDataRef, type DndState, type DragAndDropFeatureDef, type DragLineData, type DragTarget, DragTargetPosition, type EmptyFeatureDef, type ExpandAllDataRef, type ExpandAllFeatureDef, type FeatureDef, type FeatureImplementation, type HotkeyConfig, type HotkeyName, type HotkeysConfig, type HotkeysCoreDataRef, type HotkeysCoreFeatureDef, type InstanceBuilder, type ItemInstance, type ItemInstanceOpts, type ItemMeta, type KDndDataRef, type KeyboardDragAndDropFeatureDef, type MainFeatureDef, type PropMemoizationDataRef, type PropMemoizationFeatureDef, type RegisteredFeatures, type RenamingFeatureDef, type SearchFeatureDataRef, type SearchFeatureDef, type SelectionFeatureDef, type SetStateFn, type SyncDataLoaderFeatureDef, type TreeConfig, type TreeDataLoader, type TreeFeatureDef, type TreeInstance, type TreeInstanceOpts, type TreeItemDataRef, type TreeState, type Updater, asyncDataLoaderFeature, buildProxiedInstance, buildStaticInstance, checkboxesFeature, createOnDropHandler, createTree, dragAndDropFeature, expandAllFeature, hotkeysCoreFeature, insertItemsAtTarget, isOrderedDragTarget, keyboardDragAndDropFeature, makeStateUpdater, propMemoizationFeature, removeItemsFromParents, renamingFeature, searchFeature, selectionFeature, syncDataLoaderFeature };