@headless-tree/core 1.2.1 → 1.4.0

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