@keenmate/svelte-treeview 4.8.0 → 5.0.0-rc02

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 (51) hide show
  1. package/README.md +106 -117
  2. package/ai/INDEX.txt +310 -0
  3. package/ai/advanced-patterns.txt +506 -0
  4. package/ai/basic-setup.txt +336 -0
  5. package/ai/context-menu.txt +349 -0
  6. package/ai/data-handling.txt +390 -0
  7. package/ai/drag-drop.txt +397 -0
  8. package/ai/events-callbacks.txt +382 -0
  9. package/ai/import-patterns.txt +271 -0
  10. package/ai/performance.txt +349 -0
  11. package/ai/search-features.txt +359 -0
  12. package/ai/styling-theming.txt +354 -0
  13. package/ai/tree-editing.txt +423 -0
  14. package/ai/typescript-types.txt +357 -0
  15. package/dist/components/Node.svelte +47 -40
  16. package/dist/components/Node.svelte.d.ts +1 -1
  17. package/dist/components/Tree.svelte +384 -1479
  18. package/dist/components/Tree.svelte.d.ts +30 -28
  19. package/dist/components/TreeProvider.svelte +28 -0
  20. package/dist/components/TreeProvider.svelte.d.ts +28 -0
  21. package/dist/constants.generated.d.ts +1 -1
  22. package/dist/constants.generated.js +1 -1
  23. package/dist/core/TreeController.svelte.d.ts +353 -0
  24. package/dist/core/TreeController.svelte.js +1503 -0
  25. package/dist/core/createTreeController.d.ts +9 -0
  26. package/dist/core/createTreeController.js +11 -0
  27. package/dist/global-api.d.ts +1 -1
  28. package/dist/global-api.js +5 -5
  29. package/dist/index.d.ts +10 -6
  30. package/dist/index.js +7 -3
  31. package/dist/logger.d.ts +7 -6
  32. package/dist/logger.js +0 -2
  33. package/dist/ltree/indexer.js +2 -4
  34. package/dist/ltree/ltree-node.svelte.d.ts +2 -1
  35. package/dist/ltree/ltree-node.svelte.js +1 -0
  36. package/dist/ltree/ltree.svelte.d.ts +1 -1
  37. package/dist/ltree/ltree.svelte.js +168 -175
  38. package/dist/ltree/types.d.ts +12 -8
  39. package/dist/perf-logger.d.ts +2 -1
  40. package/dist/perf-logger.js +0 -2
  41. package/dist/styles/main.scss +78 -78
  42. package/dist/styles.css +41 -41
  43. package/dist/styles.css.map +1 -1
  44. package/dist/vendor/loglevel/index.d.ts +55 -2
  45. package/dist/vendor/loglevel/prefix.d.ts +23 -2
  46. package/package.json +96 -95
  47. package/dist/ltree/ltree-demo.d.ts +0 -2
  48. package/dist/ltree/ltree-demo.js +0 -90
  49. package/dist/vendor/loglevel/loglevel-esm.d.ts +0 -2
  50. package/dist/vendor/loglevel/loglevel-plugin-prefix-esm.d.ts +0 -7
  51. package/dist/vendor/loglevel/loglevel-plugin-prefix.d.ts +0 -2
@@ -1,8 +1,7 @@
1
1
  import type { Index, SearchOptions } from 'flexsearch';
2
2
  import { type LTreeNode } from '../ltree/ltree-node.svelte.js';
3
- import { type InsertArrayResult, type ContextMenuItem, type DropPosition, type DragDropMode, type DropOperation } from '../ltree/types.js';
4
- import { type RenderStats } from './RenderCoordinator.svelte.js';
5
- import '../global-api.js';
3
+ import { type InsertArrayResult, type ContextMenuItem, type DropPosition, type DragDropMode, type DropOperation, type TreeChange, type ApplyChangesResult } from '../ltree/types.js';
4
+ import type { RenderStats } from './RenderCoordinator.svelte.js';
6
5
  declare function $$render<T>(): {
7
6
  props: {
8
7
  idMember: string;
@@ -12,9 +11,12 @@ declare function $$render<T>(): {
12
11
  isExpandedMember?: string | null | undefined;
13
12
  isSelectedMember?: string | null | undefined;
14
13
  isDraggableMember?: string | null | undefined;
14
+ getIsDraggableCallback?: (node: LTreeNode<T>) => boolean;
15
15
  isDropAllowedMember?: string | null | undefined;
16
16
  allowedDropPositionsMember?: string | null | undefined;
17
17
  getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => DropPosition[] | null | undefined;
18
+ isCollapsibleMember?: string | null | undefined;
19
+ getIsCollapsibleCallback?: (node: LTreeNode<T>) => boolean;
18
20
  hasChildrenMember?: string | null | undefined;
19
21
  isSorted?: boolean | null | undefined;
20
22
  displayValueMember?: string | null | undefined;
@@ -56,9 +58,9 @@ declare function $$render<T>(): {
56
58
  /**
57
59
  * Use flat/centralized rendering instead of recursive node rendering.
58
60
  * This significantly improves performance for large trees by:
61
+ * - Removing the {#key changeTracker} block that destroys all nodes on any change
59
62
  * - Using a single flat loop instead of recursive component instantiation
60
63
  * - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
61
- * - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
62
64
  */
63
65
  useFlatRendering?: boolean;
64
66
  /** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
@@ -110,14 +112,14 @@ declare function $$render<T>(): {
110
112
  collapseNodes: (nodePath: string) => Promise<void>;
111
113
  expandAll: (nodePath?: string | null | undefined) => void;
112
114
  collapseAll: (nodePath?: string | null | undefined) => void;
113
- filterNodes: (searchText: string, searchOptions?: SearchOptions) => void;
114
- searchNodes: (searchText: string | null | undefined, searchOptions?: SearchOptions) => LTreeNode<T>[];
115
+ filterNodes: (searchTextVal: string, searchOptions?: SearchOptions) => void;
116
+ searchNodes: (searchTextVal: string | null | undefined, searchOptions?: SearchOptions) => LTreeNode<T>[];
115
117
  getChildren: (parentPath: string) => LTreeNode<T>[];
116
118
  getSiblings: (path: string) => LTreeNode<T>[];
117
119
  refreshSiblings: (parentPath: string) => void;
118
120
  refreshNode: (path: string) => void;
119
121
  getNodeByPath: (path: string) => LTreeNode<T> | null;
120
- moveNode: (sourcePath: string, targetPath: string, position: "above" | "below" | "child") => {
122
+ moveNode: (sourcePath: string, targetPath: string, position: "before" | "after" | "child") => {
121
123
  success: boolean;
122
124
  error?: string;
123
125
  };
@@ -126,7 +128,7 @@ declare function $$render<T>(): {
126
128
  node?: LTreeNode<T>;
127
129
  error?: string;
128
130
  };
129
- addNode: (parentPath: string, data: T, pathSegment?: string) => {
131
+ addNode: (parentPath: string, nodeData: T, pathSegment?: string) => {
130
132
  success: boolean;
131
133
  node?: LTreeNode<T>;
132
134
  error?: string;
@@ -136,8 +138,8 @@ declare function $$render<T>(): {
136
138
  node?: LTreeNode<T>;
137
139
  error?: string;
138
140
  };
139
- applyChanges: (changes: import("../ltree/types").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
140
- copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "above" | "below") => {
141
+ applyChanges: (changes: TreeChange<T>[]) => ApplyChangesResult;
142
+ copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "before" | "after") => {
141
143
  success: boolean;
142
144
  rootNode?: LTreeNode<T>;
143
145
  count: number;
@@ -148,13 +150,10 @@ declare function $$render<T>(): {
148
150
  getAllData: () => T[];
149
151
  closeContextMenu: () => void;
150
152
  scrollToPath: (path: string, options?: {
151
- /** Expand ancestors to make the node visible (default: true) */
152
153
  expand?: boolean;
153
- /** Also expand the target node itself to show its children (default: false for performance) */
154
154
  expandTarget?: boolean;
155
155
  highlight?: boolean;
156
156
  scrollOptions?: ScrollIntoViewOptions;
157
- /** Scroll only within the nearest scrollable container (prevents page scroll) */
158
157
  containerScroll?: boolean;
159
158
  }) => Promise<boolean>;
160
159
  update: (updates: Partial<Pick<{
@@ -165,9 +164,12 @@ declare function $$render<T>(): {
165
164
  isExpandedMember?: string | null | undefined;
166
165
  isSelectedMember?: string | null | undefined;
167
166
  isDraggableMember?: string | null | undefined;
167
+ getIsDraggableCallback?: (node: LTreeNode<T>) => boolean;
168
168
  isDropAllowedMember?: string | null | undefined;
169
169
  allowedDropPositionsMember?: string | null | undefined;
170
170
  getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => DropPosition[] | null | undefined;
171
+ isCollapsibleMember?: string | null | undefined;
172
+ getIsCollapsibleCallback?: (node: LTreeNode<T>) => boolean;
171
173
  hasChildrenMember?: string | null | undefined;
172
174
  isSorted?: boolean | null | undefined;
173
175
  displayValueMember?: string | null | undefined;
@@ -209,9 +211,9 @@ declare function $$render<T>(): {
209
211
  /**
210
212
  * Use flat/centralized rendering instead of recursive node rendering.
211
213
  * This significantly improves performance for large trees by:
214
+ * - Removing the {#key changeTracker} block that destroys all nodes on any change
212
215
  * - Using a single flat loop instead of recursive component instantiation
213
216
  * - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
214
- * - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
215
217
  */
216
218
  useFlatRendering?: boolean;
217
219
  /** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
@@ -257,9 +259,9 @@ declare function $$render<T>(): {
257
259
  scrollHighlightClass?: string | null | undefined;
258
260
  contextMenuXOffset?: number | null | undefined;
259
261
  contextMenuYOffset?: number | null | undefined;
260
- }, "treeId" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "isSelectedMember" | "isDraggableMember" | "isDropAllowedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "orderMember" | "isSorted" | "sortCallback" | "data" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayDebugInformation" | "shouldDisplayContextMenuInDebugMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "dragDropMode" | "dropZoneMode" | "bodyClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset" | "virtualScroll" | "virtualRowHeight" | "virtualOverscan" | "virtualContainerHeight">>) => void;
262
+ }, "treeId" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "isSelectedMember" | "isDraggableMember" | "getIsDraggableCallback" | "isDropAllowedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "isCollapsibleMember" | "getIsCollapsibleCallback" | "orderMember" | "isSorted" | "sortCallback" | "data" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayDebugInformation" | "shouldDisplayContextMenuInDebugMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "virtualScroll" | "virtualRowHeight" | "virtualOverscan" | "virtualContainerHeight" | "dragDropMode" | "dropZoneMode" | "bodyClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
261
263
  };
262
- bindings: "data" | "selectedNode" | "insertResult" | "searchText" | "isRendering";
264
+ bindings: "data" | "selectedNode" | "searchText" | "insertResult" | "isRendering";
263
265
  slots: {};
264
266
  events: {};
265
267
  };
@@ -267,20 +269,20 @@ declare class __sveltets_Render<T> {
267
269
  props(): ReturnType<typeof $$render<T>>['props'];
268
270
  events(): ReturnType<typeof $$render<T>>['events'];
269
271
  slots(): ReturnType<typeof $$render<T>>['slots'];
270
- bindings(): "data" | "selectedNode" | "insertResult" | "searchText" | "isRendering";
272
+ bindings(): "data" | "selectedNode" | "searchText" | "insertResult" | "isRendering";
271
273
  exports(): {
272
274
  expandNodes: (nodePath: string) => Promise<void>;
273
275
  collapseNodes: (nodePath: string) => Promise<void>;
274
276
  expandAll: (nodePath?: string | null | undefined) => void;
275
277
  collapseAll: (nodePath?: string | null | undefined) => void;
276
- filterNodes: (searchText: string, searchOptions?: SearchOptions) => void;
277
- searchNodes: (searchText: string | null | undefined, searchOptions?: SearchOptions) => LTreeNode<T>[];
278
+ filterNodes: (searchTextVal: string, searchOptions?: SearchOptions) => void;
279
+ searchNodes: (searchTextVal: string | null | undefined, searchOptions?: SearchOptions) => LTreeNode<T>[];
278
280
  getChildren: (parentPath: string) => LTreeNode<T>[];
279
281
  getSiblings: (path: string) => LTreeNode<T>[];
280
282
  refreshSiblings: (parentPath: string) => void;
281
283
  refreshNode: (path: string) => void;
282
284
  getNodeByPath: (path: string) => LTreeNode<T> | null;
283
- moveNode: (sourcePath: string, targetPath: string, position: "above" | "below" | "child") => {
285
+ moveNode: (sourcePath: string, targetPath: string, position: "before" | "after" | "child") => {
284
286
  success: boolean;
285
287
  error?: string;
286
288
  };
@@ -289,7 +291,7 @@ declare class __sveltets_Render<T> {
289
291
  node?: LTreeNode<T> | undefined;
290
292
  error?: string;
291
293
  };
292
- addNode: (parentPath: string, data: T, pathSegment?: string) => {
294
+ addNode: (parentPath: string, nodeData: T, pathSegment?: string) => {
293
295
  success: boolean;
294
296
  node?: LTreeNode<T> | undefined;
295
297
  error?: string;
@@ -299,8 +301,8 @@ declare class __sveltets_Render<T> {
299
301
  node?: LTreeNode<T> | undefined;
300
302
  error?: string;
301
303
  };
302
- applyChanges: (changes: import("../ltree/types.js").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
303
- copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "above" | "below") => {
304
+ applyChanges: (changes: TreeChange<T>[]) => ApplyChangesResult;
305
+ copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "before" | "after") => {
304
306
  success: boolean;
305
307
  rootNode?: LTreeNode<T> | undefined;
306
308
  count: number;
@@ -311,13 +313,10 @@ declare class __sveltets_Render<T> {
311
313
  getAllData: () => T[];
312
314
  closeContextMenu: () => void;
313
315
  scrollToPath: (path: string, options?: {
314
- /** Expand ancestors to make the node visible (default: true) */
315
316
  expand?: boolean;
316
- /** Also expand the target node itself to show its children (default: false for performance) */
317
317
  expandTarget?: boolean;
318
318
  highlight?: boolean;
319
319
  scrollOptions?: ScrollIntoViewOptions;
320
- /** Scroll only within the nearest scrollable container (prevents page scroll) */
321
320
  containerScroll?: boolean;
322
321
  } | undefined) => Promise<boolean>;
323
322
  update: (updates: Partial<Pick<{
@@ -328,9 +327,12 @@ declare class __sveltets_Render<T> {
328
327
  isExpandedMember?: string | null | undefined;
329
328
  isSelectedMember?: string | null | undefined;
330
329
  isDraggableMember?: string | null | undefined;
330
+ getIsDraggableCallback?: ((node: LTreeNode<T>) => boolean) | undefined;
331
331
  isDropAllowedMember?: string | null | undefined;
332
332
  allowedDropPositionsMember?: string | null | undefined;
333
333
  getAllowedDropPositionsCallback?: ((node: LTreeNode<T>) => DropPosition[] | null | undefined) | undefined;
334
+ isCollapsibleMember?: string | null | undefined;
335
+ getIsCollapsibleCallback?: ((node: LTreeNode<T>) => boolean) | undefined;
334
336
  hasChildrenMember?: string | null | undefined;
335
337
  isSorted?: boolean | null | undefined;
336
338
  displayValueMember?: string | null | undefined;
@@ -372,9 +374,9 @@ declare class __sveltets_Render<T> {
372
374
  /**
373
375
  * Use flat/centralized rendering instead of recursive node rendering.
374
376
  * This significantly improves performance for large trees by:
377
+ * - Removing the {#key changeTracker} block that destroys all nodes on any change
375
378
  * - Using a single flat loop instead of recursive component instantiation
376
379
  * - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
377
- * - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
378
380
  */
379
381
  useFlatRendering?: boolean;
380
382
  /** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
@@ -420,7 +422,7 @@ declare class __sveltets_Render<T> {
420
422
  scrollHighlightClass?: string | null | undefined;
421
423
  contextMenuXOffset?: number | null | undefined;
422
424
  contextMenuYOffset?: number | null | undefined;
423
- }, "treeId" | "data" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "orderMember" | "isSorted" | "sortCallback" | "isDraggableMember" | "isDropAllowedMember" | "shouldDisplayDebugInformation" | "isSelectedMember" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayContextMenuInDebugMode" | "virtualScroll" | "virtualRowHeight" | "virtualOverscan" | "virtualContainerHeight" | "dragDropMode" | "dropZoneMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "bodyClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
425
+ }, "treeId" | "data" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "orderMember" | "isSorted" | "sortCallback" | "isDraggableMember" | "getIsDraggableCallback" | "isDropAllowedMember" | "isCollapsibleMember" | "getIsCollapsibleCallback" | "shouldDisplayDebugInformation" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "isSelectedMember" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "initializeIndexCallback" | "searchText" | "shouldUseInternalSearchIndex" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayContextMenuInDebugMode" | "virtualScroll" | "virtualRowHeight" | "virtualOverscan" | "virtualContainerHeight" | "dragDropMode" | "dropZoneMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "bodyClass" | "selectedNodeClass" | "dragOverNodeClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
424
426
  };
425
427
  }
426
428
  interface $$IsomorphicComponent {
@@ -0,0 +1,28 @@
1
+ <script lang="ts" generics="T">
2
+ import { setContext, onDestroy, type Snippet } from 'svelte';
3
+ import { createTreeController } from '../core/createTreeController.js';
4
+ import { TreeController, type TreeControllerProps } from '../core/TreeController.svelte.js';
5
+
6
+ interface Props extends TreeControllerProps<T> {
7
+ children?: Snippet<[TreeController<T>]>;
8
+ }
9
+
10
+ let {
11
+ children,
12
+ ...controllerProps
13
+ }: Props = $props();
14
+
15
+ const controller = createTreeController<T>(controllerProps as TreeControllerProps<T>);
16
+
17
+ // Set contexts that Node.svelte expects
18
+ setContext('Ltree', controller.tree);
19
+ setContext('NodeCallbacks', controller.nodeCallbacks);
20
+ setContext('NodeConfig', controller.nodeConfig);
21
+ if (controller.renderCoordinator) {
22
+ setContext('RenderCoordinator', controller.renderCoordinator);
23
+ }
24
+
25
+ onDestroy(() => controller.destroy());
26
+ </script>
27
+
28
+ {@render children?.(controller)}
@@ -0,0 +1,28 @@
1
+ import { type Snippet } from 'svelte';
2
+ import { TreeController, type TreeControllerProps } from '../core/TreeController.svelte.js';
3
+ declare function $$render<T>(): {
4
+ props: TreeControllerProps<T> & {
5
+ children?: Snippet<[TreeController<T>]>;
6
+ };
7
+ exports: {};
8
+ bindings: "";
9
+ slots: {};
10
+ events: {};
11
+ };
12
+ declare class __sveltets_Render<T> {
13
+ props(): ReturnType<typeof $$render<T>>['props'];
14
+ events(): ReturnType<typeof $$render<T>>['events'];
15
+ slots(): ReturnType<typeof $$render<T>>['slots'];
16
+ bindings(): "";
17
+ exports(): {};
18
+ }
19
+ interface $$IsomorphicComponent {
20
+ new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
21
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
22
+ } & ReturnType<__sveltets_Render<T>['exports']>;
23
+ <T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
24
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
25
+ }
26
+ declare const TreeProvider: $$IsomorphicComponent;
27
+ type TreeProvider<T> = InstanceType<typeof TreeProvider<T>>;
28
+ export default TreeProvider;
@@ -1,4 +1,4 @@
1
- export declare const VERSION = "4.8.0";
1
+ export declare const VERSION = "5.0.0-rc02";
2
2
  export declare const PACKAGE_NAME = "@keenmate/svelte-treeview";
3
3
  export declare const AUTHOR = "KeenMate";
4
4
  export declare const LICENSE = "MIT";
@@ -1,6 +1,6 @@
1
1
  // Auto-generated file - do not edit manually
2
2
  // Generated by scripts/generate-constants.js
3
- export const VERSION = "4.8.0";
3
+ export const VERSION = "5.0.0-rc02";
4
4
  export const PACKAGE_NAME = "@keenmate/svelte-treeview";
5
5
  export const AUTHOR = "KeenMate";
6
6
  export const LICENSE = "MIT";
@@ -0,0 +1,353 @@
1
+ import type { Index, SearchOptions } from 'flexsearch';
2
+ import { type LTreeNode } from '../ltree/ltree-node.svelte.js';
3
+ import { type Ltree, type InsertArrayResult, type ContextMenuItem, type DropPosition, type DragDropMode, type DropOperation, type TreeChange, type ApplyChangesResult } from '../ltree/types.js';
4
+ import { type RenderCoordinator, type RenderStats } from '../components/RenderCoordinator.svelte.js';
5
+ import '../global-api.js';
6
+ export interface NodeCallbacks<T> {
7
+ onNodeClicked: (node: LTreeNode<T>) => void;
8
+ onNodeRightClicked: (node: LTreeNode<T>, event: MouseEvent) => void;
9
+ onNodeDragStart: (node: LTreeNode<T>, event: DragEvent) => void;
10
+ onNodeDragOver: (node: LTreeNode<T>, event: DragEvent) => void;
11
+ onNodeDragLeave: (node: LTreeNode<T>, event: DragEvent) => void;
12
+ onNodeDrop: (node: LTreeNode<T>, event: DragEvent) => void;
13
+ onZoneDrop: (node: LTreeNode<T>, position: DropPosition, event: DragEvent) => void;
14
+ onTouchDragStart: (node: LTreeNode<T>, event: TouchEvent) => void;
15
+ onTouchDragMove: (node: LTreeNode<T>, event: TouchEvent) => void;
16
+ onTouchDragEnd: (node: LTreeNode<T>, event: TouchEvent) => void;
17
+ }
18
+ export interface NodeConfig {
19
+ shouldToggleOnNodeClick: boolean;
20
+ expandIconClass: string;
21
+ collapseIconClass: string;
22
+ leafIconClass: string;
23
+ selectedNodeClass: string | null | undefined;
24
+ dragOverNodeClass: string | null | undefined;
25
+ dropZoneMode: 'floating' | 'glow';
26
+ dropZoneLayout: 'around' | 'above' | 'below' | 'wave' | 'wave2';
27
+ dropZoneStart: number | string;
28
+ dropZoneMaxWidth: number;
29
+ allowCopy: boolean;
30
+ }
31
+ export interface TreeControllerProps<T> {
32
+ idMember: string;
33
+ pathMember: string;
34
+ parentPathMember?: string | null | undefined;
35
+ levelMember?: string | null | undefined;
36
+ isExpandedMember?: string | null | undefined;
37
+ isSelectedMember?: string | null | undefined;
38
+ isDraggableMember?: string | null | undefined;
39
+ getIsDraggableCallback?: (node: LTreeNode<T>) => boolean;
40
+ isDropAllowedMember?: string | null | undefined;
41
+ allowedDropPositionsMember?: string | null | undefined;
42
+ getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => DropPosition[] | null | undefined;
43
+ isCollapsibleMember?: string | null | undefined;
44
+ getIsCollapsibleCallback?: (node: LTreeNode<T>) => boolean;
45
+ hasChildrenMember?: string | null | undefined;
46
+ isSorted?: boolean | null | undefined;
47
+ displayValueMember?: string | null | undefined;
48
+ getDisplayValueCallback?: (node: LTreeNode<T>) => string;
49
+ searchValueMember?: string | null | undefined;
50
+ getSearchValueCallback?: (node: LTreeNode<T>) => string;
51
+ orderMember?: string | null | undefined;
52
+ treeId?: string | null | undefined;
53
+ treePathSeparator?: string | null | undefined;
54
+ sortCallback?: (items: LTreeNode<T>[]) => LTreeNode<T>[];
55
+ data: T[];
56
+ selectedNode?: LTreeNode<T> | null | undefined;
57
+ expandLevel?: number | null | undefined;
58
+ shouldToggleOnNodeClick?: boolean | null | undefined;
59
+ initializeIndexCallback?: () => Index;
60
+ searchText?: string | null | undefined;
61
+ shouldUseInternalSearchIndex?: boolean | null | undefined;
62
+ indexerBatchSize?: number | null | undefined;
63
+ indexerTimeout?: number | null | undefined;
64
+ shouldDisplayDebugInformation?: boolean;
65
+ shouldDisplayContextMenuInDebugMode?: boolean;
66
+ isLoading?: boolean;
67
+ progressiveRender?: boolean;
68
+ initialBatchSize?: number;
69
+ maxBatchSize?: number;
70
+ onRenderStart?: () => void;
71
+ onRenderProgress?: (stats: RenderStats) => void;
72
+ onRenderComplete?: (stats: RenderStats) => void;
73
+ useFlatRendering?: boolean;
74
+ /** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
75
+ virtualScroll?: boolean;
76
+ /** Explicit row height in px. Auto-measured from first row if not set. */
77
+ virtualRowHeight?: number;
78
+ /** Extra rows above/below viewport (default: 5) */
79
+ virtualOverscan?: number;
80
+ /** CSS height for scroll container. Auto-detected from parent if not set, fallback 400px. */
81
+ virtualContainerHeight?: string;
82
+ dragDropMode?: DragDropMode;
83
+ dropZoneMode?: 'floating' | 'glow';
84
+ dropZoneLayout?: 'around' | 'above' | 'below' | 'wave' | 'wave2';
85
+ dropZoneStart?: number | string;
86
+ dropZoneMaxWidth?: number;
87
+ allowCopy?: boolean;
88
+ autoHandleCopy?: boolean;
89
+ onNodeClicked?: (node: LTreeNode<T>) => void;
90
+ onNodeDragStart?: (node: LTreeNode<T>, event: DragEvent) => void;
91
+ onNodeDragOver?: (node: LTreeNode<T>, event: DragEvent) => void;
92
+ beforeDropCallback?: (dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => boolean | {
93
+ position?: DropPosition;
94
+ operation?: DropOperation;
95
+ } | void | Promise<boolean | {
96
+ position?: DropPosition;
97
+ operation?: DropOperation;
98
+ } | void>;
99
+ onNodeDrop?: (dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => void;
100
+ contextMenuCallback?: (node: LTreeNode<T>, closeMenuCallback: () => void) => ContextMenuItem[];
101
+ hasContextMenuSnippet?: boolean;
102
+ bodyClass?: string | null | undefined;
103
+ selectedNodeClass?: string | null | undefined;
104
+ dragOverNodeClass?: string | null | undefined;
105
+ expandIconClass?: string | null | undefined;
106
+ collapseIconClass?: string | null | undefined;
107
+ leafIconClass?: string | null | undefined;
108
+ scrollHighlightTimeout?: number | null | undefined;
109
+ scrollHighlightClass?: string | null | undefined;
110
+ contextMenuXOffset?: number | null | undefined;
111
+ contextMenuYOffset?: number | null | undefined;
112
+ }
113
+ export declare class TreeController<T> {
114
+ tree: Ltree<T>;
115
+ renderCoordinator: RenderCoordinator | null;
116
+ nodeCallbacks: NodeCallbacks<T>;
117
+ nodeConfig: NodeConfig;
118
+ treeId: string;
119
+ treePathSeparator: string;
120
+ data: T[];
121
+ selectedNode: LTreeNode<T> | null | undefined;
122
+ insertResult: InsertArrayResult<T> | null | undefined;
123
+ searchText: string | null | undefined;
124
+ isRendering: boolean;
125
+ shouldDisplayDebugInformation: boolean;
126
+ shouldDisplayContextMenuInDebugMode: boolean;
127
+ isLoading: boolean;
128
+ useFlatRendering: boolean;
129
+ progressiveRender: boolean;
130
+ initialBatchSize: number;
131
+ maxBatchSize: number;
132
+ bodyClass: string | null | undefined;
133
+ dragDropMode: DragDropMode;
134
+ allowCopy: boolean;
135
+ autoHandleCopy: boolean;
136
+ onNodeClickedCb: ((node: LTreeNode<T>) => void) | undefined;
137
+ onNodeDragStartCb: ((node: LTreeNode<T>, event: DragEvent) => void) | undefined;
138
+ onNodeDragOverCb: ((node: LTreeNode<T>, event: DragEvent) => void) | undefined;
139
+ beforeDropCallbackCb: TreeControllerProps<T>['beforeDropCallback'];
140
+ onNodeDropCb: TreeControllerProps<T>['onNodeDrop'];
141
+ contextMenuCallbackCb: TreeControllerProps<T>['contextMenuCallback'];
142
+ onRenderStartCb: (() => void) | undefined;
143
+ onRenderProgressCb: ((stats: RenderStats) => void) | undefined;
144
+ onRenderCompleteCb: ((stats: RenderStats) => void) | undefined;
145
+ shouldToggleOnNodeClick: boolean;
146
+ expandIconClass: string;
147
+ collapseIconClass: string;
148
+ leafIconClass: string;
149
+ selectedNodeClass: string | null | undefined;
150
+ dragOverNodeClass: string | null | undefined;
151
+ dropZoneMode: "floating" | "glow";
152
+ dropZoneLayout: "around" | "above" | "below" | "wave" | "wave2";
153
+ dropZoneStart: string | number;
154
+ dropZoneMaxWidth: number;
155
+ scrollHighlightTimeout: number;
156
+ scrollHighlightClass: string | null | undefined;
157
+ contextMenuXOffset: number;
158
+ contextMenuYOffset: number;
159
+ hasContextMenuSnippet: boolean;
160
+ virtualScroll: boolean;
161
+ virtualRowHeight: number | undefined;
162
+ virtualOverscan: number;
163
+ virtualContainerHeight: string | undefined;
164
+ contextMenuVisible: boolean;
165
+ contextMenuX: number;
166
+ contextMenuY: number;
167
+ contextMenuNode: LTreeNode<T> | null;
168
+ isDebugMenuActive: boolean;
169
+ currentHighlight: {
170
+ element: HTMLElement;
171
+ timeoutId: ReturnType<typeof setTimeout>;
172
+ } | null;
173
+ draggedNode: LTreeNode<any> | null;
174
+ isDragInProgress: boolean;
175
+ hoveredNodeForDrop: LTreeNode<any> | null;
176
+ activeDropPosition: DropPosition | null;
177
+ currentDropOperation: DropOperation;
178
+ floatingZoneRect: {
179
+ top: number;
180
+ left: number;
181
+ width: number;
182
+ height: number;
183
+ } | null;
184
+ floatingHoveredZone: "before" | "after" | "child" | null;
185
+ touchDragState: {
186
+ node: LTreeNode<any> | null;
187
+ startX: number;
188
+ startY: number;
189
+ isDragging: boolean;
190
+ ghostElement: HTMLElement | null;
191
+ currentDropTarget: LTreeNode<any> | null;
192
+ };
193
+ touchTimer: ReturnType<typeof setTimeout> | null;
194
+ flatRenderedIds: Set<string>;
195
+ flatRenderQueue: string[];
196
+ flatRenderAnimationFrame: number | null;
197
+ currentBatchSize: number;
198
+ vsScrollTop: number;
199
+ vsMeasuredRowHeight: number | null;
200
+ vsContainerRef: HTMLDivElement | undefined;
201
+ vsDetectedHeight: string | null;
202
+ private vsRafPending;
203
+ isDropPlaceholderActive: boolean;
204
+ _skipInsertArray: boolean;
205
+ private lastFlatNodesTracker;
206
+ containerElement: HTMLElement | null;
207
+ vsRowHeight: number;
208
+ vsActive: boolean;
209
+ vsContainerStyle: string;
210
+ allFlatNodes: LTreeNode<T>[];
211
+ vsTotalCount: number;
212
+ vsTotalHeight: number;
213
+ vsStartIndex: number;
214
+ vsEndIndex: number;
215
+ vsOffsetY: number;
216
+ flatNodesToRender: LTreeNode<T>[];
217
+ get statistics(): {
218
+ nodeCount: number;
219
+ maxLevel: number;
220
+ filteredNodeCount: number;
221
+ isIndexing: boolean;
222
+ pendingIndexCount: number;
223
+ };
224
+ constructor(props: TreeControllerProps<T>);
225
+ handleVirtualScroll: (event: Event) => void;
226
+ expandNodes(nodePath: string): Promise<void>;
227
+ collapseNodes(nodePath: string): Promise<void>;
228
+ expandAll(nodePath?: string | null | undefined): void;
229
+ collapseAll(nodePath?: string | null | undefined): void;
230
+ filterNodes(searchTextVal: string, searchOptions?: SearchOptions): void;
231
+ searchNodes(searchTextVal: string | null | undefined, searchOptions?: SearchOptions): LTreeNode<T>[];
232
+ getChildren(parentPath: string): LTreeNode<T>[];
233
+ getSiblings(path: string): LTreeNode<T>[];
234
+ refreshSiblings(parentPath: string): void;
235
+ refreshNode(path: string): void;
236
+ getNodeByPath(path: string): LTreeNode<T> | null;
237
+ moveNode(sourcePath: string, targetPath: string, position: 'before' | 'after' | 'child'): {
238
+ success: boolean;
239
+ error?: string;
240
+ };
241
+ removeNode(path: string, includeDescendants?: boolean): {
242
+ success: boolean;
243
+ node?: LTreeNode<T>;
244
+ error?: string;
245
+ };
246
+ addNode(parentPath: string, nodeData: T, pathSegment?: string): {
247
+ success: boolean;
248
+ node?: LTreeNode<T>;
249
+ error?: string;
250
+ };
251
+ updateNode(path: string, dataUpdates: Partial<T>): {
252
+ success: boolean;
253
+ node?: LTreeNode<T>;
254
+ error?: string;
255
+ };
256
+ applyChanges(changes: TreeChange<T>[]): ApplyChangesResult;
257
+ copyNodeWithDescendants(sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: 'before' | 'after'): {
258
+ success: boolean;
259
+ rootNode?: LTreeNode<T>;
260
+ count: number;
261
+ error?: string;
262
+ };
263
+ getExpandedPaths(): string[];
264
+ setExpandedPaths(paths: string[]): void;
265
+ getAllData(): T[];
266
+ /** Open the context menu at the given screen coordinates (offsets are applied automatically). */
267
+ openContextMenu(node: LTreeNode<T>, screenX: number, screenY: number): void;
268
+ closeContextMenu(): void;
269
+ /** Call from ondragstart. Sets up dataTransfer, stores drag state, fires callback. */
270
+ startDrag(node: LTreeNode<T>, event: DragEvent): void;
271
+ /** Call from ondragover. preventDefault, calculates drop position, updates hover state.
272
+ * Pass `element` for position calculation (before/after/child based on cursor). */
273
+ dragOver(node: LTreeNode<T>, event: DragEvent, element?: HTMLElement): void;
274
+ /** Call from ondragleave. Clears hover state when cursor leaves element bounds. */
275
+ dragLeave(_node: LTreeNode<T>, event: DragEvent): void;
276
+ /** Call from ondrop. Uses calculated position or defaults to 'child'. */
277
+ drop(node: LTreeNode<T>, event: DragEvent): void;
278
+ /** Drop with explicit position (for custom drop zones or floating-style UI). */
279
+ dropAt(node: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent): void;
280
+ /** Cancel current drag and reset all state. */
281
+ cancelDrag(): void;
282
+ /** Touch drag start — proxy to internal touch handler. */
283
+ touchStart(node: LTreeNode<T>, event: TouchEvent): void;
284
+ /** Touch drag move — proxy to internal touch handler. */
285
+ touchMove(node: LTreeNode<T>, event: TouchEvent): void;
286
+ /** Touch drag end — proxy to internal touch handler. */
287
+ touchEnd(node: LTreeNode<T>, event: TouchEvent): void;
288
+ /** Get allowed drop positions for a node (proxies LTree method). */
289
+ getNodeAllowedDropPositions(node: LTreeNode<T>): DropPosition[] | null;
290
+ /** Get whether a node is draggable (proxies LTree resolution: callback > member > node property). */
291
+ getNodeIsDraggable(node: LTreeNode<T>): boolean;
292
+ /** Get whether a node is collapsible (proxies LTree resolution: callback > member > node property). */
293
+ getNodeIsCollapsible(node: LTreeNode<T>): boolean;
294
+ /** Calculate drop position from cursor location within an element (before/after/child).
295
+ * Same logic as Node.svelte's calculateGlowPosition, respecting allowed positions. */
296
+ calculateDropPositionFromEvent(event: DragEvent | MouseEvent, element: HTMLElement, allowedPositions?: DropPosition[] | null): DropPosition;
297
+ scrollToPath(path: string, options?: {
298
+ expand?: boolean;
299
+ expandTarget?: boolean;
300
+ highlight?: boolean;
301
+ scrollOptions?: ScrollIntoViewOptions;
302
+ containerScroll?: boolean;
303
+ containerElement?: HTMLElement;
304
+ }): Promise<boolean>;
305
+ /**
306
+ * Apply scroll highlight to a node element by ID.
307
+ * Returns true if the element was found and highlighted, false otherwise.
308
+ */
309
+ private applyHighlight;
310
+ updateProps(updates: Partial<TreeControllerProps<T>>): void;
311
+ private _onNodeClicked;
312
+ private _onNodeRightClicked;
313
+ private isDropAllowedByMode;
314
+ private calculateDropPosition;
315
+ private _onNodeDragStart;
316
+ _onNodeDragEnd: (event: DragEvent) => void;
317
+ private _resetDragState;
318
+ private _handleDrop;
319
+ private _onNodeDragOver;
320
+ private _onNodeDragLeave;
321
+ private _onNodeDrop;
322
+ private _onZoneDrop;
323
+ isFloatingPositionAllowed(position: DropPosition): boolean;
324
+ handleFloatingZoneDragOver(position: 'before' | 'after' | 'child', event: DragEvent): void;
325
+ handleFloatingZoneDragLeave(): void;
326
+ handleFloatingZoneDrop(position: DropPosition, event: DragEvent): void;
327
+ private _onTouchStart;
328
+ private _onTouchMove;
329
+ private _onTouchEnd;
330
+ private _boundDocTouchMove;
331
+ private _boundDocTouchEnd;
332
+ private _addDocumentTouchListeners;
333
+ private _removeDocumentTouchListeners;
334
+ private _docTouchMove;
335
+ private _docTouchEnd;
336
+ private _resetTouchState;
337
+ private createGhostElement;
338
+ private removeGhostElement;
339
+ /** Clean up document-level listeners and ghost elements. Called on component destroy. */
340
+ destroy(): void;
341
+ private findNodeFromElement;
342
+ private updateDropTarget;
343
+ private clearDropTargetHighlight;
344
+ handleEmptyTreeDragOver: (event: DragEvent) => void;
345
+ handleEmptyTreeDragLeave: (event: DragEvent) => void;
346
+ handleEmptyTreeDrop: (event: DragEvent) => void;
347
+ handleEmptyTreeTouchEnd: (event: TouchEvent) => void;
348
+ handleTreeDragEnter: (event: DragEvent) => void;
349
+ handleTreeDragLeave: (event: DragEvent) => void;
350
+ scheduleFlatRenderBatch(): void;
351
+ private generateTreeId;
352
+ findScrollableAncestor(element: HTMLElement): HTMLElement | null;
353
+ }