@keenmate/svelte-treeview 4.6.0 → 4.8.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.
@@ -13,6 +13,8 @@ declare function $$render<T>(): {
13
13
  isSelectedMember?: string | null | undefined;
14
14
  isDraggableMember?: string | null | undefined;
15
15
  isDropAllowedMember?: string | null | undefined;
16
+ allowedDropPositionsMember?: string | null | undefined;
17
+ getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => DropPosition[] | null | undefined;
16
18
  hasChildrenMember?: string | null | undefined;
17
19
  isSorted?: boolean | null | undefined;
18
20
  displayValueMember?: string | null | undefined;
@@ -54,13 +56,19 @@ declare function $$render<T>(): {
54
56
  /**
55
57
  * Use flat/centralized rendering instead of recursive node rendering.
56
58
  * This significantly improves performance for large trees by:
57
- * - Removing the {#key changeTracker} block that destroys all nodes on any change
58
59
  * - Using a single flat loop instead of recursive component instantiation
59
60
  * - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
61
+ * - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
60
62
  */
61
63
  useFlatRendering?: boolean;
62
- /** Indentation per level in flat rendering mode (CSS value, default: '1.5rem') */
63
- flatIndentSize?: string;
64
+ /** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
65
+ virtualScroll?: boolean;
66
+ /** Explicit row height in px. Auto-measured from first row if not set. */
67
+ virtualRowHeight?: number;
68
+ /** Extra rows above/below viewport (default: 5) */
69
+ virtualOverscan?: number;
70
+ /** CSS height for scroll container. Auto-detected from parent if not set, fallback 400px. */
71
+ virtualContainerHeight?: string;
64
72
  dragDropMode?: DragDropMode;
65
73
  dropZoneMode?: "floating" | "glow";
66
74
  dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
@@ -129,7 +137,7 @@ declare function $$render<T>(): {
129
137
  error?: string;
130
138
  };
131
139
  applyChanges: (changes: import("../ltree/types").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
132
- copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T) => {
140
+ copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "above" | "below") => {
133
141
  success: boolean;
134
142
  rootNode?: LTreeNode<T>;
135
143
  count: number;
@@ -158,6 +166,8 @@ declare function $$render<T>(): {
158
166
  isSelectedMember?: string | null | undefined;
159
167
  isDraggableMember?: string | null | undefined;
160
168
  isDropAllowedMember?: string | null | undefined;
169
+ allowedDropPositionsMember?: string | null | undefined;
170
+ getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => DropPosition[] | null | undefined;
161
171
  hasChildrenMember?: string | null | undefined;
162
172
  isSorted?: boolean | null | undefined;
163
173
  displayValueMember?: string | null | undefined;
@@ -199,13 +209,19 @@ declare function $$render<T>(): {
199
209
  /**
200
210
  * Use flat/centralized rendering instead of recursive node rendering.
201
211
  * This significantly improves performance for large trees by:
202
- * - Removing the {#key changeTracker} block that destroys all nodes on any change
203
212
  * - Using a single flat loop instead of recursive component instantiation
204
213
  * - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
214
+ * - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
205
215
  */
206
216
  useFlatRendering?: boolean;
207
- /** Indentation per level in flat rendering mode (CSS value, default: '1.5rem') */
208
- flatIndentSize?: string;
217
+ /** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
218
+ virtualScroll?: boolean;
219
+ /** Explicit row height in px. Auto-measured from first row if not set. */
220
+ virtualRowHeight?: number;
221
+ /** Extra rows above/below viewport (default: 5) */
222
+ virtualOverscan?: number;
223
+ /** CSS height for scroll container. Auto-detected from parent if not set, fallback 400px. */
224
+ virtualContainerHeight?: string;
209
225
  dragDropMode?: DragDropMode;
210
226
  dropZoneMode?: "floating" | "glow";
211
227
  dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
@@ -241,7 +257,7 @@ declare function $$render<T>(): {
241
257
  scrollHighlightClass?: string | null | undefined;
242
258
  contextMenuXOffset?: number | null | undefined;
243
259
  contextMenuYOffset?: number | null | undefined;
244
- }, "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">>) => void;
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;
245
261
  };
246
262
  bindings: "data" | "selectedNode" | "insertResult" | "searchText" | "isRendering";
247
263
  slots: {};
@@ -284,7 +300,7 @@ declare class __sveltets_Render<T> {
284
300
  error?: string;
285
301
  };
286
302
  applyChanges: (changes: import("../ltree/types.js").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
287
- copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T) => {
303
+ copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "above" | "below") => {
288
304
  success: boolean;
289
305
  rootNode?: LTreeNode<T> | undefined;
290
306
  count: number;
@@ -313,6 +329,8 @@ declare class __sveltets_Render<T> {
313
329
  isSelectedMember?: string | null | undefined;
314
330
  isDraggableMember?: string | null | undefined;
315
331
  isDropAllowedMember?: string | null | undefined;
332
+ allowedDropPositionsMember?: string | null | undefined;
333
+ getAllowedDropPositionsCallback?: ((node: LTreeNode<T>) => DropPosition[] | null | undefined) | undefined;
316
334
  hasChildrenMember?: string | null | undefined;
317
335
  isSorted?: boolean | null | undefined;
318
336
  displayValueMember?: string | null | undefined;
@@ -354,13 +372,19 @@ declare class __sveltets_Render<T> {
354
372
  /**
355
373
  * Use flat/centralized rendering instead of recursive node rendering.
356
374
  * This significantly improves performance for large trees by:
357
- * - Removing the {#key changeTracker} block that destroys all nodes on any change
358
375
  * - Using a single flat loop instead of recursive component instantiation
359
376
  * - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
377
+ * - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
360
378
  */
361
379
  useFlatRendering?: boolean;
362
- /** Indentation per level in flat rendering mode (CSS value, default: '1.5rem') */
363
- flatIndentSize?: string;
380
+ /** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
381
+ virtualScroll?: boolean;
382
+ /** Explicit row height in px. Auto-measured from first row if not set. */
383
+ virtualRowHeight?: number;
384
+ /** Extra rows above/below viewport (default: 5) */
385
+ virtualOverscan?: number;
386
+ /** CSS height for scroll container. Auto-detected from parent if not set, fallback 400px. */
387
+ virtualContainerHeight?: string;
364
388
  dragDropMode?: DragDropMode;
365
389
  dropZoneMode?: "floating" | "glow";
366
390
  dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
@@ -396,7 +420,7 @@ declare class __sveltets_Render<T> {
396
420
  scrollHighlightClass?: string | null | undefined;
397
421
  contextMenuXOffset?: number | null | undefined;
398
422
  contextMenuYOffset?: number | null | undefined;
399
- }, "treeId" | "data" | "shouldToggleOnNodeClick" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "dropZoneMode" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "orderMember" | "isSorted" | "sortCallback" | "isDraggableMember" | "isDropAllowedMember" | "shouldDisplayDebugInformation" | "isSelectedMember" | "selectedNode" | "expandLevel" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayContextMenuInDebugMode" | "dragDropMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "bodyClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
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;
400
424
  };
401
425
  }
402
426
  interface $$IsomorphicComponent {
@@ -1,4 +1,4 @@
1
- export declare const VERSION = "4.6.0";
1
+ export declare const VERSION = "4.8.0";
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.6.0";
3
+ export const VERSION = "4.8.0";
4
4
  export const PACKAGE_NAME = "@keenmate/svelte-treeview";
5
5
  export const AUTHOR = "KeenMate";
6
6
  export const LICENSE = "MIT";
@@ -26,7 +26,8 @@ export class Indexer {
26
26
  }
27
27
  // Add items to the processing queue
28
28
  addToQueue(items) {
29
- this.processingQueue.push(...items);
29
+ // Use concat instead of push(...items) to avoid stack overflow with large arrays
30
+ this.processingQueue = this.processingQueue.concat(items);
30
31
  this.totalItemsAdded += items.length;
31
32
  indexLogger.debug(`[${this.treeId}] Added ${items.length} items to queue. Queue size: ${this.processingQueue.length}`);
32
33
  // Start processing if not already running
@@ -137,7 +138,9 @@ export class Indexer {
137
138
  this.isProcessing = false;
138
139
  indexLogger.info(`[${this.treeId}] Indexing complete. Processed ${this.totalItemsProcessed} items.`);
139
140
  if (this.onCompleteCallback) {
140
- this.onCompleteCallback();
141
+ const cb = this.onCompleteCallback;
142
+ this.onCompleteCallback = undefined;
143
+ cb();
141
144
  }
142
145
  }
143
146
  // Get current indexer status
@@ -1,4 +1,5 @@
1
1
  export type NodeId = string | number;
2
+ export type DropPosition = 'above' | 'below' | 'child';
2
3
  export declare enum VisualState {
3
4
  indeterminate = "indeterminate",
4
5
  selected = "true",
@@ -18,6 +19,7 @@ export interface LTreeNode<T> {
18
19
  priority: number | null | undefined;
19
20
  isDraggable: boolean;
20
21
  isDropAllowed: boolean;
22
+ allowedDropPositions: DropPosition[] | null | undefined;
21
23
  isInsertAllowed: boolean;
22
24
  isNestAllowed: boolean;
23
25
  isCheckboxVisible: boolean | null | undefined;
@@ -25,5 +27,6 @@ export interface LTreeNode<T> {
25
27
  isExpanded: boolean;
26
28
  isSelected: boolean;
27
29
  isSelectable: boolean;
30
+ _rev: number;
28
31
  }
29
32
  export declare function createLTreeNode<T>(data?: Partial<LTreeNode<T>>): LTreeNode<T>;
@@ -19,6 +19,7 @@ export function createLTreeNode(data) {
19
19
  priority: undefined,
20
20
  isDraggable: true,
21
21
  isDropAllowed: true,
22
+ allowedDropPositions: undefined,
22
23
  isInsertAllowed: true,
23
24
  isNestAllowed: true,
24
25
  isCheckboxVisible: false,
@@ -26,6 +27,7 @@ export function createLTreeNode(data) {
26
27
  isExpanded: false,
27
28
  isSelected: false,
28
29
  isSelectable: true,
30
+ _rev: 0,
29
31
  ...data
30
32
  };
31
33
  }
@@ -1,4 +1,4 @@
1
1
  import { Index } from 'flexsearch';
2
2
  import { type LTreeNode } from './ltree-node.svelte';
3
3
  import type { Ltree } from './types.js';
4
- export declare function createLTree<T>(_idMember: string, _pathMember: string, _parentPathMember?: string | null | undefined, _levelMember?: string | null | undefined, _hasChildrenMember?: string | null | undefined, _isExpandedMember?: string | null | undefined, _isSelectableMember?: string | null | undefined, _isDraggableMember?: string | null | undefined, _isDropAllowedMember?: string | null | undefined, _displayValueMember?: string | null | undefined, _getDisplayValueCallback?: (node: LTreeNode<T>) => string, _searchValueMember?: string | null | undefined, _getSearchValueCallback?: (node: LTreeNode<T>) => string, _orderMember?: string | null | undefined, _treeId?: string, _treePathSeparator?: string | null | undefined, _expandLevel?: number | null | undefined, _shouldUseInternalSearchIndex?: boolean | null | undefined, _initializeIndexCallback?: () => Index, _indexerBatchSize?: number | null | undefined, _indexerTimeout?: number | null | undefined, opts?: Partial<Ltree<T>>): Ltree<T>;
4
+ export declare function createLTree<T>(_idMember: string, _pathMember: string, _parentPathMember?: string | null | undefined, _levelMember?: string | null | undefined, _hasChildrenMember?: string | null | undefined, _isExpandedMember?: string | null | undefined, _isSelectableMember?: string | null | undefined, _isDraggableMember?: string | null | undefined, _isDropAllowedMember?: string | null | undefined, _allowedDropPositionsMember?: string | null | undefined, _displayValueMember?: string | null | undefined, _getDisplayValueCallback?: (node: LTreeNode<T>) => string, _searchValueMember?: string | null | undefined, _getSearchValueCallback?: (node: LTreeNode<T>) => string, _getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => import('./types').DropPosition[] | null | undefined, _orderMember?: string | null | undefined, _treeId?: string, _treePathSeparator?: string | null | undefined, _expandLevel?: number | null | undefined, _shouldUseInternalSearchIndex?: boolean | null | undefined, _initializeIndexCallback?: () => Index, _indexerBatchSize?: number | null | undefined, _indexerTimeout?: number | null | undefined, opts?: Partial<Ltree<T>>): Ltree<T>;