@keenmate/svelte-treeview 4.4.0 → 4.5.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 (37) hide show
  1. package/README.md +39 -4
  2. package/dist/components/Node.svelte +249 -12
  3. package/dist/components/Node.svelte.d.ts +17 -0
  4. package/dist/components/RenderCoordinator.svelte.d.ts +29 -0
  5. package/dist/components/RenderCoordinator.svelte.js +115 -0
  6. package/dist/components/Tree.svelte +855 -38
  7. package/dist/components/Tree.svelte.d.ts +160 -8
  8. package/dist/constants.generated.d.ts +6 -0
  9. package/dist/constants.generated.js +8 -0
  10. package/dist/global-api.d.ts +35 -0
  11. package/dist/global-api.js +36 -0
  12. package/dist/index.d.ts +6 -1
  13. package/dist/index.js +5 -0
  14. package/dist/logger.d.ts +56 -0
  15. package/dist/logger.js +159 -0
  16. package/dist/ltree/indexer.d.ts +0 -1
  17. package/dist/ltree/indexer.js +23 -19
  18. package/dist/ltree/ltree.svelte.d.ts +1 -1
  19. package/dist/ltree/ltree.svelte.js +593 -30
  20. package/dist/ltree/types.d.ts +62 -0
  21. package/dist/perf-logger.d.ts +70 -0
  22. package/dist/perf-logger.js +196 -0
  23. package/dist/styles/main.scss +437 -4
  24. package/dist/styles.css +329 -3
  25. package/dist/styles.css.map +1 -1
  26. package/dist/vendor/loglevel/index.d.ts +2 -0
  27. package/dist/vendor/loglevel/index.js +9 -0
  28. package/dist/vendor/loglevel/loglevel-esm.d.ts +2 -0
  29. package/dist/vendor/loglevel/loglevel-esm.js +349 -0
  30. package/dist/vendor/loglevel/loglevel-plugin-prefix-esm.d.ts +7 -0
  31. package/dist/vendor/loglevel/loglevel-plugin-prefix-esm.js +132 -0
  32. package/dist/vendor/loglevel/loglevel-plugin-prefix.d.ts +2 -0
  33. package/dist/vendor/loglevel/loglevel-plugin-prefix.js +149 -0
  34. package/dist/vendor/loglevel/loglevel.js +357 -0
  35. package/dist/vendor/loglevel/prefix.d.ts +2 -0
  36. package/dist/vendor/loglevel/prefix.js +9 -0
  37. package/package.json +3 -2
@@ -1,6 +1,8 @@
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 } from '../ltree/types.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';
4
6
  declare function $$render<T>(): {
5
7
  props: {
6
8
  idMember: string;
@@ -17,6 +19,7 @@ declare function $$render<T>(): {
17
19
  getDisplayValueCallback?: (node: LTreeNode<T>) => string;
18
20
  searchValueMember?: string | null | undefined;
19
21
  getSearchValueCallback?: (node: LTreeNode<T>) => string;
22
+ orderMember?: string | null | undefined;
20
23
  treeId?: string | null | undefined;
21
24
  treePathSeparator?: string | null | undefined;
22
25
  sortCallback?: (items: LTreeNode<T>[]) => LTreeNode<T>[];
@@ -29,6 +32,8 @@ declare function $$render<T>(): {
29
32
  treeFooter?: any;
30
33
  noDataFound?: any;
31
34
  contextMenu?: any;
35
+ dropPlaceholder?: any;
36
+ loadingPlaceholder?: any;
32
37
  expandLevel?: number | null | undefined;
33
38
  shouldToggleOnNodeClick?: boolean | null | undefined;
34
39
  initializeIndexCallback?: () => Index;
@@ -38,10 +43,33 @@ declare function $$render<T>(): {
38
43
  indexerTimeout?: number | null | undefined;
39
44
  shouldDisplayDebugInformation?: boolean;
40
45
  shouldDisplayContextMenuInDebugMode?: boolean;
46
+ isLoading?: boolean;
47
+ progressiveRender?: boolean;
48
+ renderBatchSize?: number;
49
+ isRendering?: boolean;
50
+ onRenderStart?: () => void;
51
+ onRenderProgress?: (stats: RenderStats) => void;
52
+ onRenderComplete?: (stats: RenderStats) => void;
53
+ dragDropMode?: DragDropMode;
54
+ dropZoneMode?: "floating" | "glow";
55
+ dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
56
+ dropZoneStart?: number | string;
57
+ dropZoneMaxWidth?: number;
58
+ allowCopy?: boolean;
59
+ autoHandleCopy?: boolean;
41
60
  onNodeClicked?: (node: LTreeNode<T>) => void;
42
61
  onNodeDragStart?: (node: LTreeNode<T>, event: DragEvent) => void;
43
62
  onNodeDragOver?: (node: LTreeNode<T>, event: DragEvent) => void;
44
- onNodeDrop?: (node: LTreeNode<T>, draggedNode: LTreeNode<T>, event: DragEvent) => void;
63
+ /**
64
+ * Called before a drop is processed. Return false to cancel the drop.
65
+ * Return { position, operation } to override the drop position or operation.
66
+ * Return true or undefined to proceed normally.
67
+ */
68
+ beforeDropCallback?: (dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => boolean | {
69
+ position?: DropPosition;
70
+ operation?: DropOperation;
71
+ } | void;
72
+ onNodeDrop?: (dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => void;
45
73
  contextMenuCallback?: (node: LTreeNode<T>, closeMenuCallback: () => void) => ContextMenuItem[];
46
74
  bodyClass?: string | null | undefined;
47
75
  selectedNodeClass?: string | null | undefined;
@@ -61,11 +89,47 @@ declare function $$render<T>(): {
61
89
  collapseAll: (nodePath?: string | null | undefined) => void;
62
90
  filterNodes: (searchText: string, searchOptions?: SearchOptions) => void;
63
91
  searchNodes: (searchText: string | null | undefined, searchOptions?: SearchOptions) => LTreeNode<T>[];
92
+ getChildren: (parentPath: string) => LTreeNode<T>[];
93
+ getSiblings: (path: string) => LTreeNode<T>[];
94
+ refreshSiblings: (parentPath: string) => void;
95
+ refreshNode: (path: string) => void;
96
+ getNodeByPath: (path: string) => LTreeNode<T> | null;
97
+ moveNode: (sourcePath: string, targetPath: string, position: "above" | "below" | "child") => {
98
+ success: boolean;
99
+ error?: string;
100
+ };
101
+ removeNode: (path: string, includeDescendants?: boolean) => {
102
+ success: boolean;
103
+ node?: LTreeNode<T>;
104
+ error?: string;
105
+ };
106
+ addNode: (parentPath: string, data: T, pathSegment?: string) => {
107
+ success: boolean;
108
+ node?: LTreeNode<T>;
109
+ error?: string;
110
+ };
111
+ updateNode: (path: string, dataUpdates: Partial<T>) => {
112
+ success: boolean;
113
+ node?: LTreeNode<T>;
114
+ error?: string;
115
+ };
116
+ applyChanges: (changes: import("../ltree/types").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
117
+ copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T) => {
118
+ success: boolean;
119
+ rootNode?: LTreeNode<T>;
120
+ count: number;
121
+ error?: string;
122
+ };
123
+ getExpandedPaths: () => string[];
124
+ setExpandedPaths: (paths: string[]) => void;
125
+ getAllData: () => T[];
64
126
  closeContextMenu: () => void;
65
127
  scrollToPath: (path: string, options?: {
66
128
  expand?: boolean;
67
129
  highlight?: boolean;
68
130
  scrollOptions?: ScrollIntoViewOptions;
131
+ /** Scroll only within the nearest scrollable container (prevents page scroll) */
132
+ containerScroll?: boolean;
69
133
  }) => Promise<boolean>;
70
134
  update: (updates: Partial<Pick<{
71
135
  idMember: string;
@@ -82,6 +146,7 @@ declare function $$render<T>(): {
82
146
  getDisplayValueCallback?: (node: LTreeNode<T>) => string;
83
147
  searchValueMember?: string | null | undefined;
84
148
  getSearchValueCallback?: (node: LTreeNode<T>) => string;
149
+ orderMember?: string | null | undefined;
85
150
  treeId?: string | null | undefined;
86
151
  treePathSeparator?: string | null | undefined;
87
152
  sortCallback?: (items: LTreeNode<T>[]) => LTreeNode<T>[];
@@ -94,6 +159,8 @@ declare function $$render<T>(): {
94
159
  treeFooter?: any;
95
160
  noDataFound?: any;
96
161
  contextMenu?: any;
162
+ dropPlaceholder?: any;
163
+ loadingPlaceholder?: any;
97
164
  expandLevel?: number | null | undefined;
98
165
  shouldToggleOnNodeClick?: boolean | null | undefined;
99
166
  initializeIndexCallback?: () => Index;
@@ -103,10 +170,33 @@ declare function $$render<T>(): {
103
170
  indexerTimeout?: number | null | undefined;
104
171
  shouldDisplayDebugInformation?: boolean;
105
172
  shouldDisplayContextMenuInDebugMode?: boolean;
173
+ isLoading?: boolean;
174
+ progressiveRender?: boolean;
175
+ renderBatchSize?: number;
176
+ isRendering?: boolean;
177
+ onRenderStart?: () => void;
178
+ onRenderProgress?: (stats: RenderStats) => void;
179
+ onRenderComplete?: (stats: RenderStats) => void;
180
+ dragDropMode?: DragDropMode;
181
+ dropZoneMode?: "floating" | "glow";
182
+ dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
183
+ dropZoneStart?: number | string;
184
+ dropZoneMaxWidth?: number;
185
+ allowCopy?: boolean;
186
+ autoHandleCopy?: boolean;
106
187
  onNodeClicked?: (node: LTreeNode<T>) => void;
107
188
  onNodeDragStart?: (node: LTreeNode<T>, event: DragEvent) => void;
108
189
  onNodeDragOver?: (node: LTreeNode<T>, event: DragEvent) => void;
109
- onNodeDrop?: (node: LTreeNode<T>, draggedNode: LTreeNode<T>, event: DragEvent) => void;
190
+ /**
191
+ * Called before a drop is processed. Return false to cancel the drop.
192
+ * Return { position, operation } to override the drop position or operation.
193
+ * Return true or undefined to proceed normally.
194
+ */
195
+ beforeDropCallback?: (dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => boolean | {
196
+ position?: DropPosition;
197
+ operation?: DropOperation;
198
+ } | void;
199
+ onNodeDrop?: (dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => void;
110
200
  contextMenuCallback?: (node: LTreeNode<T>, closeMenuCallback: () => void) => ContextMenuItem[];
111
201
  bodyClass?: string | null | undefined;
112
202
  selectedNodeClass?: string | null | undefined;
@@ -118,9 +208,9 @@ declare function $$render<T>(): {
118
208
  scrollHighlightClass?: string | null | undefined;
119
209
  contextMenuXOffset?: number | null | undefined;
120
210
  contextMenuYOffset?: number | null | undefined;
121
- }, "treeId" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "isSelectedMember" | "isDraggableMember" | "isDropAllowedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "isSorted" | "sortCallback" | "data" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayDebugInformation" | "shouldDisplayContextMenuInDebugMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "onNodeDrop" | "contextMenuCallback" | "bodyClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
211
+ }, "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;
122
212
  };
123
- bindings: "data" | "selectedNode" | "insertResult" | "searchText";
213
+ bindings: "data" | "selectedNode" | "insertResult" | "searchText" | "isRendering";
124
214
  slots: {};
125
215
  events: {};
126
216
  };
@@ -128,7 +218,7 @@ declare class __sveltets_Render<T> {
128
218
  props(): ReturnType<typeof $$render<T>>['props'];
129
219
  events(): ReturnType<typeof $$render<T>>['events'];
130
220
  slots(): ReturnType<typeof $$render<T>>['slots'];
131
- bindings(): "data" | "selectedNode" | "insertResult" | "searchText";
221
+ bindings(): "data" | "selectedNode" | "insertResult" | "searchText" | "isRendering";
132
222
  exports(): {
133
223
  expandNodes: (nodePath: string) => Promise<void>;
134
224
  collapseNodes: (nodePath: string) => Promise<void>;
@@ -136,11 +226,47 @@ declare class __sveltets_Render<T> {
136
226
  collapseAll: (nodePath?: string | null | undefined) => void;
137
227
  filterNodes: (searchText: string, searchOptions?: SearchOptions) => void;
138
228
  searchNodes: (searchText: string | null | undefined, searchOptions?: SearchOptions) => LTreeNode<T>[];
229
+ getChildren: (parentPath: string) => LTreeNode<T>[];
230
+ getSiblings: (path: string) => LTreeNode<T>[];
231
+ refreshSiblings: (parentPath: string) => void;
232
+ refreshNode: (path: string) => void;
233
+ getNodeByPath: (path: string) => LTreeNode<T> | null;
234
+ moveNode: (sourcePath: string, targetPath: string, position: "above" | "below" | "child") => {
235
+ success: boolean;
236
+ error?: string;
237
+ };
238
+ removeNode: (path: string, includeDescendants?: boolean) => {
239
+ success: boolean;
240
+ node?: LTreeNode<T> | undefined;
241
+ error?: string;
242
+ };
243
+ addNode: (parentPath: string, data: T, pathSegment?: string) => {
244
+ success: boolean;
245
+ node?: LTreeNode<T> | undefined;
246
+ error?: string;
247
+ };
248
+ updateNode: (path: string, dataUpdates: Partial<T>) => {
249
+ success: boolean;
250
+ node?: LTreeNode<T> | undefined;
251
+ error?: string;
252
+ };
253
+ applyChanges: (changes: import("../ltree/types.js").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
254
+ copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T) => {
255
+ success: boolean;
256
+ rootNode?: LTreeNode<T> | undefined;
257
+ count: number;
258
+ error?: string;
259
+ };
260
+ getExpandedPaths: () => string[];
261
+ setExpandedPaths: (paths: string[]) => void;
262
+ getAllData: () => T[];
139
263
  closeContextMenu: () => void;
140
264
  scrollToPath: (path: string, options?: {
141
265
  expand?: boolean;
142
266
  highlight?: boolean;
143
267
  scrollOptions?: ScrollIntoViewOptions;
268
+ /** Scroll only within the nearest scrollable container (prevents page scroll) */
269
+ containerScroll?: boolean;
144
270
  } | undefined) => Promise<boolean>;
145
271
  update: (updates: Partial<Pick<{
146
272
  idMember: string;
@@ -157,6 +283,7 @@ declare class __sveltets_Render<T> {
157
283
  getDisplayValueCallback?: ((node: LTreeNode<T>) => string) | undefined;
158
284
  searchValueMember?: string | null | undefined;
159
285
  getSearchValueCallback?: ((node: LTreeNode<T>) => string) | undefined;
286
+ orderMember?: string | null | undefined;
160
287
  treeId?: string | null | undefined;
161
288
  treePathSeparator?: string | null | undefined;
162
289
  sortCallback?: ((items: LTreeNode<T>[]) => LTreeNode<T>[]) | undefined;
@@ -169,6 +296,8 @@ declare class __sveltets_Render<T> {
169
296
  treeFooter?: any;
170
297
  noDataFound?: any;
171
298
  contextMenu?: any;
299
+ dropPlaceholder?: any;
300
+ loadingPlaceholder?: any;
172
301
  expandLevel?: number | null | undefined;
173
302
  shouldToggleOnNodeClick?: boolean | null | undefined;
174
303
  initializeIndexCallback?: (() => Index) | undefined;
@@ -178,10 +307,33 @@ declare class __sveltets_Render<T> {
178
307
  indexerTimeout?: number | null | undefined;
179
308
  shouldDisplayDebugInformation?: boolean;
180
309
  shouldDisplayContextMenuInDebugMode?: boolean;
310
+ isLoading?: boolean;
311
+ progressiveRender?: boolean;
312
+ renderBatchSize?: number;
313
+ isRendering?: boolean;
314
+ onRenderStart?: (() => void) | undefined;
315
+ onRenderProgress?: ((stats: RenderStats) => void) | undefined;
316
+ onRenderComplete?: ((stats: RenderStats) => void) | undefined;
317
+ dragDropMode?: DragDropMode;
318
+ dropZoneMode?: "floating" | "glow";
319
+ dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
320
+ dropZoneStart?: number | string;
321
+ dropZoneMaxWidth?: number;
322
+ allowCopy?: boolean;
323
+ autoHandleCopy?: boolean;
181
324
  onNodeClicked?: ((node: LTreeNode<T>) => void) | undefined;
182
325
  onNodeDragStart?: ((node: LTreeNode<T>, event: DragEvent) => void) | undefined;
183
326
  onNodeDragOver?: ((node: LTreeNode<T>, event: DragEvent) => void) | undefined;
184
- onNodeDrop?: ((node: LTreeNode<T>, draggedNode: LTreeNode<T>, event: DragEvent) => void) | undefined;
327
+ /**
328
+ * Called before a drop is processed. Return false to cancel the drop.
329
+ * Return { position, operation } to override the drop position or operation.
330
+ * Return true or undefined to proceed normally.
331
+ */
332
+ beforeDropCallback?: ((dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => boolean | void | {
333
+ position?: DropPosition;
334
+ operation?: DropOperation;
335
+ }) | undefined;
336
+ onNodeDrop?: ((dropNode: LTreeNode<T> | null, draggedNode: LTreeNode<T>, position: DropPosition, event: DragEvent | TouchEvent, operation: DropOperation) => void) | undefined;
185
337
  contextMenuCallback?: ((node: LTreeNode<T>, closeMenuCallback: () => void) => ContextMenuItem[]) | undefined;
186
338
  bodyClass?: string | null | undefined;
187
339
  selectedNodeClass?: string | null | undefined;
@@ -193,7 +345,7 @@ declare class __sveltets_Render<T> {
193
345
  scrollHighlightClass?: string | null | undefined;
194
346
  contextMenuXOffset?: number | null | undefined;
195
347
  contextMenuYOffset?: number | null | undefined;
196
- }, "treeId" | "data" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "onNodeDrop" | "shouldToggleOnNodeClick" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "isSorted" | "sortCallback" | "isDraggableMember" | "isDropAllowedMember" | "shouldDisplayDebugInformation" | "isSelectedMember" | "selectedNode" | "expandLevel" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayContextMenuInDebugMode" | "contextMenuCallback" | "bodyClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
348
+ }, "treeId" | "data" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "onNodeDrop" | "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" | "beforeDropCallback" | "contextMenuCallback" | "bodyClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
197
349
  };
198
350
  }
199
351
  interface $$IsomorphicComponent {
@@ -0,0 +1,6 @@
1
+ export declare const VERSION = "4.5.0";
2
+ export declare const PACKAGE_NAME = "@keenmate/svelte-treeview";
3
+ export declare const AUTHOR = "KeenMate";
4
+ export declare const LICENSE = "MIT";
5
+ export declare const REPOSITORY = "git+https://github.com/keenmate/svelte-treeview.git";
6
+ export declare const HOMEPAGE = "https://github.com/keenmate/svelte-treeview#readme";
@@ -0,0 +1,8 @@
1
+ // Auto-generated file - do not edit manually
2
+ // Generated by scripts/generate-constants.js
3
+ export const VERSION = "4.5.0";
4
+ export const PACKAGE_NAME = "@keenmate/svelte-treeview";
5
+ export const AUTHOR = "KeenMate";
6
+ export const LICENSE = "MIT";
7
+ export const REPOSITORY = "git+https://github.com/keenmate/svelte-treeview.git";
8
+ export const HOMEPAGE = "https://github.com/keenmate/svelte-treeview#readme";
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Global API registration for runtime logging control
3
+ * This file is imported by Tree.svelte to ensure it runs when the component is used
4
+ */
5
+ export interface GlobalTreeviewAPI {
6
+ version: () => string;
7
+ config: {
8
+ name: string;
9
+ version: string;
10
+ author: string;
11
+ license: string;
12
+ repository: string;
13
+ homepage: string;
14
+ };
15
+ logging: {
16
+ enableLogging: () => void;
17
+ disableLogging: () => void;
18
+ setLogLevel: (level: string) => void;
19
+ setCategoryLevel: (category: string, level: string) => void;
20
+ getCategories: () => string[];
21
+ };
22
+ perf: {
23
+ enable: () => void;
24
+ disable: () => void;
25
+ setThreshold: (ms: number) => void;
26
+ isEnabled: () => boolean;
27
+ };
28
+ }
29
+ declare global {
30
+ interface Window {
31
+ components?: {
32
+ 'svelte-treeview'?: GlobalTreeviewAPI;
33
+ };
34
+ }
35
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Global API registration for runtime logging control
3
+ * This file is imported by Tree.svelte to ensure it runs when the component is used
4
+ */
5
+ import { setLogLevel, enableLogging, disableLogging, setCategoryLevel, LOGGING_CATEGORIES } from './logger';
6
+ import { enablePerfLogging, disablePerfLogging, setPerfThreshold, isPerfLoggingEnabled } from './perf-logger';
7
+ // Import generated constants (created by scripts/generate-constants.js)
8
+ import { VERSION, PACKAGE_NAME, AUTHOR, LICENSE, REPOSITORY, HOMEPAGE } from './constants.generated';
9
+ // Initialize global API for runtime logging control
10
+ if (typeof window !== 'undefined') {
11
+ window.components = window.components || {};
12
+ window.components['svelte-treeview'] = {
13
+ version: () => VERSION,
14
+ config: {
15
+ name: PACKAGE_NAME,
16
+ version: VERSION,
17
+ author: AUTHOR,
18
+ license: LICENSE,
19
+ repository: REPOSITORY,
20
+ homepage: HOMEPAGE
21
+ },
22
+ logging: {
23
+ enableLogging,
24
+ disableLogging,
25
+ setLogLevel,
26
+ setCategoryLevel,
27
+ getCategories: () => [...LOGGING_CATEGORIES]
28
+ },
29
+ perf: {
30
+ enable: enablePerfLogging,
31
+ disable: disablePerfLogging,
32
+ setThreshold: setPerfThreshold,
33
+ isEnabled: isPerfLoggingEnabled
34
+ }
35
+ };
36
+ }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,8 @@
1
1
  export { default as Tree } from "./components/Tree.svelte";
2
2
  export type { LTreeNode, NodeId, VisualState } from "./ltree/ltree-node.svelte";
3
- export type { Ltree } from "./ltree/types";
3
+ export type { Ltree, DropPosition, DragDropMode, DropOperation, ContextMenuItem, InsertArrayResult, TreeChange, ApplyChangesResult } from "./ltree/types";
4
+ export type { RenderStats } from "./components/RenderCoordinator.svelte";
5
+ export { enableLogging, disableLogging, setLogLevel, setCategoryLevel, LOGGING_CATEGORIES } from "./logger";
6
+ export { enablePerfLogging, disablePerfLogging, setPerfThreshold, isPerfLoggingEnabled, perfStart, perfEnd, perfMeasure, perfSummary } from "./perf-logger";
7
+ export type { GlobalTreeviewAPI } from "./global-api";
8
+ import "./global-api";
package/dist/index.js CHANGED
@@ -1,2 +1,7 @@
1
1
  // Reexport your entry components here
2
2
  export { default as Tree } from "./components/Tree.svelte";
3
+ // Export logging utilities
4
+ export { enableLogging, disableLogging, setLogLevel, setCategoryLevel, LOGGING_CATEGORIES } from "./logger";
5
+ // Export performance logging utilities
6
+ export { enablePerfLogging, disablePerfLogging, setPerfThreshold, isPerfLoggingEnabled, perfStart, perfEnd, perfMeasure, perfSummary } from "./perf-logger";
7
+ import "./global-api";
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Logging configuration using loglevel with categorized loggers
3
+ *
4
+ * Categories:
5
+ * - LTREE:INIT: Tree initialization and configuration
6
+ * - LTREE:DATA: Data insertion, tree manipulation, node operations
7
+ * - LTREE:RENDER: Rendering, progressive rendering, coordinator
8
+ * - LTREE:INDEX: Search indexing operations
9
+ * - LTREE:DRAG: Drag and drop operations
10
+ *
11
+ * Usage:
12
+ * - By default, all logging is disabled (silent mode) for production
13
+ * - Enable logging in browser console:
14
+ * ```javascript
15
+ * import { enableLogging, setLogLevel, setCategoryLevel } from '@keenmate/svelte-treeview';
16
+ *
17
+ * // Enable all logging at debug level
18
+ * enableLogging();
19
+ *
20
+ * // Or set a specific log level for all categories
21
+ * setLogLevel('info'); // 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent'
22
+ *
23
+ * // Or enable/disable specific categories
24
+ * disableLogging(); // First disable all
25
+ * setCategoryLevel('LTREE:RENDER', 'debug'); // Enable only render logs
26
+ * setCategoryLevel('LTREE:INDEX', 'info'); // Enable only index logs at info level
27
+ * ```
28
+ */
29
+ import log from './vendor/loglevel/index.js';
30
+ export declare const initLogger: any;
31
+ export declare const dataLogger: any;
32
+ export declare const renderLogger: any;
33
+ export declare const indexLogger: any;
34
+ export declare const dragLogger: any;
35
+ export declare const uiLogger: any;
36
+ export default log;
37
+ /**
38
+ * List of all logging categories
39
+ */
40
+ export declare const LOGGING_CATEGORIES: string[];
41
+ /**
42
+ * Enable logging for all loggers
43
+ */
44
+ export declare const setLogLevel: (level: "trace" | "debug" | "info" | "warn" | "error" | "silent") => void;
45
+ /**
46
+ * Enable all logging (set to debug level)
47
+ */
48
+ export declare const enableLogging: () => void;
49
+ /**
50
+ * Disable all logging (set to silent level)
51
+ */
52
+ export declare const disableLogging: () => void;
53
+ /**
54
+ * Set log level for a specific category
55
+ */
56
+ export declare const setCategoryLevel: (category: "LTREE:INIT" | "LTREE:DATA" | "LTREE:RENDER" | "LTREE:INDEX" | "LTREE:DRAG" | "LTREE:UI", level?: "trace" | "debug" | "info" | "warn" | "error" | "silent") => void;
package/dist/logger.js ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Logging configuration using loglevel with categorized loggers
3
+ *
4
+ * Categories:
5
+ * - LTREE:INIT: Tree initialization and configuration
6
+ * - LTREE:DATA: Data insertion, tree manipulation, node operations
7
+ * - LTREE:RENDER: Rendering, progressive rendering, coordinator
8
+ * - LTREE:INDEX: Search indexing operations
9
+ * - LTREE:DRAG: Drag and drop operations
10
+ *
11
+ * Usage:
12
+ * - By default, all logging is disabled (silent mode) for production
13
+ * - Enable logging in browser console:
14
+ * ```javascript
15
+ * import { enableLogging, setLogLevel, setCategoryLevel } from '@keenmate/svelte-treeview';
16
+ *
17
+ * // Enable all logging at debug level
18
+ * enableLogging();
19
+ *
20
+ * // Or set a specific log level for all categories
21
+ * setLogLevel('info'); // 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent'
22
+ *
23
+ * // Or enable/disable specific categories
24
+ * disableLogging(); // First disable all
25
+ * setCategoryLevel('LTREE:RENDER', 'debug'); // Enable only render logs
26
+ * setCategoryLevel('LTREE:INDEX', 'info'); // Enable only index logs at info level
27
+ * ```
28
+ */
29
+ // Import vendored libraries via ES module wrappers
30
+ // @ts-ignore - Vendored library without type definitions
31
+ import log from './vendor/loglevel/index.js';
32
+ // @ts-ignore - Vendored library without type definitions
33
+ import prefix from './vendor/loglevel/prefix.js';
34
+ // Define color scheme
35
+ const COLORS = {
36
+ trace: '#9ca3af', // Gray
37
+ debug: '#0ea5e9', // Blue
38
+ info: '#10b981', // Green
39
+ warn: '#f59e0b', // Orange
40
+ error: '#ef4444' // Red
41
+ };
42
+ // Logger categories documentation:
43
+ // - LTREE:INIT: Tree initialization and configuration
44
+ // - LTREE:DATA: Data insertion, tree manipulation, node operations
45
+ // - LTREE:RENDER: Rendering, progressive rendering, coordinator
46
+ // - LTREE:INDEX: Search indexing operations
47
+ // - LTREE:DRAG: Drag and drop operations
48
+ // - LTREE:UI: User interactions (click, expand/collapse, selection)
49
+ // Register prefix plugin with the root logger
50
+ prefix.reg(log);
51
+ // Set default log level to silent (production mode)
52
+ log.setLevel('silent');
53
+ // Prefix format options that include %c markers
54
+ const prefixOptions = {
55
+ format(level, name, timestamp) {
56
+ return `%c[${timestamp}]%c %c[${level.toUpperCase()}]%c %c[${name}]%c`;
57
+ },
58
+ timestampFormatter(date) {
59
+ return date.toTimeString().split(' ')[0] + '.' + date.getMilliseconds().toString().padStart(3, '0');
60
+ }
61
+ };
62
+ /**
63
+ * Create a color-aware method factory that intercepts %c codes and adds CSS styles
64
+ */
65
+ function createColorMethodFactory(originalFactory) {
66
+ return function (methodName, logLevel, loggerName) {
67
+ const rawMethod = originalFactory(methodName, logLevel, loggerName);
68
+ return function (...args) {
69
+ // If first arg contains %c color codes, inject the color styles
70
+ if (args.length > 0 && typeof args[0] === 'string' && args[0].includes('%c')) {
71
+ const color = COLORS[methodName] || '#666';
72
+ // Count how many %c markers we have (should be 6 for our format)
73
+ const numMarkers = (args[0].match(/%c/g) || []).length;
74
+ const colorStyles = [];
75
+ for (let i = 0; i < numMarkers; i++) {
76
+ // Alternate between color and reset
77
+ colorStyles.push(i % 2 === 0 ? `color: ${color}; font-weight: bold;` : 'color: inherit;');
78
+ }
79
+ rawMethod(args[0], ...colorStyles, ...args.slice(1));
80
+ }
81
+ else {
82
+ rawMethod(...args);
83
+ }
84
+ };
85
+ };
86
+ }
87
+ // Create category-specific loggers
88
+ export const initLogger = log.getLogger('LTREE:INIT');
89
+ export const dataLogger = log.getLogger('LTREE:DATA');
90
+ export const renderLogger = log.getLogger('LTREE:RENDER');
91
+ export const indexLogger = log.getLogger('LTREE:INDEX');
92
+ export const dragLogger = log.getLogger('LTREE:DRAG');
93
+ export const uiLogger = log.getLogger('LTREE:UI');
94
+ // Apply prefix and color styling to all category loggers
95
+ const allLoggers = [
96
+ initLogger,
97
+ dataLogger,
98
+ renderLogger,
99
+ indexLogger,
100
+ dragLogger,
101
+ uiLogger
102
+ ];
103
+ allLoggers.forEach(logger => {
104
+ // First wrap the methodFactory with color injection
105
+ // This needs to happen BEFORE prefix.apply so the prefix plugin's
106
+ // output (which contains %c codes) goes through our color handler
107
+ const originalFactory = logger.methodFactory;
108
+ logger.methodFactory = createColorMethodFactory(originalFactory);
109
+ // Now apply prefix - it will wrap our color-aware methodFactory
110
+ prefix.apply(logger, prefixOptions);
111
+ // Set level to rebuild methods
112
+ logger.setLevel('silent');
113
+ });
114
+ // Export the default logger
115
+ export default log;
116
+ /**
117
+ * List of all logging categories
118
+ */
119
+ export const LOGGING_CATEGORIES = [
120
+ 'LTREE:INIT',
121
+ 'LTREE:DATA',
122
+ 'LTREE:RENDER',
123
+ 'LTREE:INDEX',
124
+ 'LTREE:DRAG',
125
+ 'LTREE:UI'
126
+ ];
127
+ /**
128
+ * Enable logging for all loggers
129
+ */
130
+ export const setLogLevel = (level) => {
131
+ log.setLevel(level);
132
+ allLoggers.forEach(logger => logger.setLevel(level));
133
+ };
134
+ /**
135
+ * Enable all logging (set to debug level)
136
+ */
137
+ export const enableLogging = () => {
138
+ setLogLevel('debug');
139
+ };
140
+ /**
141
+ * Disable all logging (set to silent level)
142
+ */
143
+ export const disableLogging = () => {
144
+ setLogLevel('silent');
145
+ };
146
+ /**
147
+ * Set log level for a specific category
148
+ */
149
+ export const setCategoryLevel = (category, level = 'debug') => {
150
+ const loggerMap = {
151
+ 'LTREE:INIT': initLogger,
152
+ 'LTREE:DATA': dataLogger,
153
+ 'LTREE:RENDER': renderLogger,
154
+ 'LTREE:INDEX': indexLogger,
155
+ 'LTREE:DRAG': dragLogger,
156
+ 'LTREE:UI': uiLogger
157
+ };
158
+ loggerMap[category]?.setLevel(level);
159
+ };
@@ -8,7 +8,6 @@ export declare class Indexer<T> {
8
8
  private searchIndex;
9
9
  private isProcessing;
10
10
  private shouldCalculateSearchValue;
11
- private shouldDisplayDebugInformation;
12
11
  private searchValueMember?;
13
12
  private getSearchValueCallback?;
14
13
  private onProgressCallback?;