gridstack 12.3.1 → 12.3.3

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 (124) hide show
  1. package/dist/angular/esm2020/lib/base-widget.mjs +2 -2
  2. package/dist/angular/esm2020/lib/gridstack-item.component.mjs +2 -2
  3. package/dist/angular/esm2020/lib/gridstack.component.mjs +2 -2
  4. package/dist/angular/esm2020/lib/gridstack.module.mjs +2 -2
  5. package/dist/angular/esm2020/lib/types.mjs +2 -2
  6. package/dist/angular/fesm2015/gridstack-angular.mjs +4 -4
  7. package/dist/angular/fesm2015/gridstack-angular.mjs.map +1 -1
  8. package/dist/angular/fesm2020/gridstack-angular.mjs +5 -5
  9. package/dist/angular/fesm2020/gridstack-angular.mjs.map +1 -1
  10. package/dist/angular/lib/gridstack-item.component.d.ts +1 -1
  11. package/dist/angular/lib/gridstack.component.d.ts +1 -1
  12. package/dist/angular/lib/types.d.ts +1 -1
  13. package/dist/angular/package.json +1 -1
  14. package/dist/angular/src/base-widget.ts +1 -1
  15. package/dist/angular/src/gridstack-item.component.ts +1 -1
  16. package/dist/angular/src/gridstack.component.ts +1 -1
  17. package/dist/angular/src/gridstack.module.ts +1 -1
  18. package/dist/angular/src/types.ts +1 -1
  19. package/dist/dd-base-impl.d.ts +1 -1
  20. package/dist/dd-base-impl.js +1 -1
  21. package/dist/dd-base-impl.js.map +1 -1
  22. package/dist/dd-draggable.d.ts +1 -1
  23. package/dist/dd-draggable.js +1 -1
  24. package/dist/dd-draggable.js.map +1 -1
  25. package/dist/dd-droppable.d.ts +1 -1
  26. package/dist/dd-droppable.js +1 -1
  27. package/dist/dd-droppable.js.map +1 -1
  28. package/dist/dd-element.d.ts +1 -1
  29. package/dist/dd-element.js +1 -1
  30. package/dist/dd-element.js.map +1 -1
  31. package/dist/dd-gridstack.d.ts +1 -1
  32. package/dist/dd-gridstack.js +1 -1
  33. package/dist/dd-gridstack.js.map +1 -1
  34. package/dist/dd-manager.d.ts +1 -1
  35. package/dist/dd-manager.js +1 -1
  36. package/dist/dd-manager.js.map +1 -1
  37. package/dist/dd-resizable-handle.d.ts +1 -1
  38. package/dist/dd-resizable-handle.js +1 -1
  39. package/dist/dd-resizable-handle.js.map +1 -1
  40. package/dist/dd-resizable.d.ts +1 -1
  41. package/dist/dd-resizable.js +1 -1
  42. package/dist/dd-resizable.js.map +1 -1
  43. package/dist/dd-touch.d.ts +1 -1
  44. package/dist/dd-touch.js +1 -1
  45. package/dist/dd-touch.js.map +1 -1
  46. package/dist/gridstack-all.js +1 -1
  47. package/dist/gridstack-all.js.LICENSE.txt +1 -1
  48. package/dist/gridstack-all.js.map +1 -1
  49. package/dist/gridstack-engine.d.ts +8 -7
  50. package/dist/gridstack-engine.js +20 -10
  51. package/dist/gridstack-engine.js.map +1 -1
  52. package/dist/gridstack.css +1 -1
  53. package/dist/gridstack.d.ts +5 -4
  54. package/dist/gridstack.js +9 -7
  55. package/dist/gridstack.js.map +1 -1
  56. package/dist/spec/gridstack-engine-spec.d.ts +1 -0
  57. package/dist/spec/gridstack-engine-spec.js +358 -0
  58. package/dist/spec/gridstack-engine-spec.js.map +1 -0
  59. package/dist/spec/gridstack-spec.d.ts +1 -0
  60. package/dist/spec/gridstack-spec.js +1780 -0
  61. package/dist/spec/gridstack-spec.js.map +1 -0
  62. package/dist/spec/integration/gridstack-integration.spec.d.ts +1 -0
  63. package/dist/spec/integration/gridstack-integration.spec.js +171 -0
  64. package/dist/spec/integration/gridstack-integration.spec.js.map +1 -0
  65. package/dist/spec/regression-spec.d.ts +1 -0
  66. package/dist/spec/regression-spec.js +100 -0
  67. package/dist/spec/regression-spec.js.map +1 -0
  68. package/dist/spec/utils-spec.d.ts +1 -0
  69. package/dist/spec/utils-spec.js +243 -0
  70. package/dist/spec/utils-spec.js.map +1 -0
  71. package/dist/src/dd-base-impl.d.ts +69 -0
  72. package/dist/src/dd-base-impl.js +70 -0
  73. package/dist/src/dd-base-impl.js.map +1 -0
  74. package/dist/src/dd-draggable.d.ts +20 -0
  75. package/dist/src/dd-draggable.js +364 -0
  76. package/dist/src/dd-draggable.js.map +1 -0
  77. package/dist/src/dd-droppable.d.ts +26 -0
  78. package/dist/src/dd-droppable.js +149 -0
  79. package/dist/src/dd-droppable.js.map +1 -0
  80. package/dist/src/dd-element.d.ts +27 -0
  81. package/dist/src/dd-element.js +91 -0
  82. package/dist/src/dd-element.js.map +1 -0
  83. package/dist/src/dd-gridstack.d.ts +82 -0
  84. package/dist/src/dd-gridstack.js +165 -0
  85. package/dist/src/dd-gridstack.js.map +1 -0
  86. package/dist/src/dd-manager.d.ts +43 -0
  87. package/dist/src/dd-manager.js +14 -0
  88. package/dist/src/dd-manager.js.map +1 -0
  89. package/dist/src/dd-resizable-handle.d.ts +18 -0
  90. package/dist/src/dd-resizable-handle.js +113 -0
  91. package/dist/src/dd-resizable-handle.js.map +1 -0
  92. package/dist/src/dd-resizable.d.ts +30 -0
  93. package/dist/src/dd-resizable.js +304 -0
  94. package/dist/src/dd-resizable.js.map +1 -0
  95. package/dist/src/dd-touch.d.ts +33 -0
  96. package/dist/src/dd-touch.js +145 -0
  97. package/dist/src/dd-touch.js.map +1 -0
  98. package/dist/src/gridstack-engine.d.ts +321 -0
  99. package/dist/src/gridstack-engine.js +1272 -0
  100. package/dist/src/gridstack-engine.js.map +1 -0
  101. package/dist/src/gridstack.d.ts +802 -0
  102. package/dist/src/gridstack.js +2872 -0
  103. package/dist/src/gridstack.js.map +1 -0
  104. package/dist/src/gridstack.scss +1 -1
  105. package/dist/src/types.d.ts +427 -0
  106. package/dist/src/types.js +38 -0
  107. package/dist/src/types.js.map +1 -0
  108. package/dist/src/utils.d.ts +283 -0
  109. package/dist/src/utils.js +790 -0
  110. package/dist/src/utils.js.map +1 -0
  111. package/dist/types.d.ts +1 -1
  112. package/dist/types.js +1 -1
  113. package/dist/types.js.map +1 -1
  114. package/dist/utils.d.ts +1 -1
  115. package/dist/utils.js +5 -4
  116. package/dist/utils.js.map +1 -1
  117. package/dist/vitest.config.d.ts +2 -0
  118. package/dist/vitest.config.js +74 -0
  119. package/dist/vitest.config.js.map +1 -0
  120. package/dist/vitest.setup.d.ts +1 -0
  121. package/dist/vitest.setup.js +90 -0
  122. package/dist/vitest.setup.js.map +1 -0
  123. package/doc/API.md +87 -87
  124. package/package.json +21 -9
@@ -0,0 +1,321 @@
1
+ /**
2
+ * gridstack-engine.ts 12.3.3
3
+ * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license
4
+ */
5
+ import { GridStackNode, GridStackPosition, GridStackMoveOpts, SaveFcn, CompactOptions } from './types';
6
+ /** callback to update the DOM attributes since this class is generic (no HTML or other info) for items that changed - see _notify() */
7
+ type OnChangeCB = (nodes: GridStackNode[]) => void;
8
+ /** options used during creation - similar to GridStackOptions */
9
+ export interface GridStackEngineOptions {
10
+ column?: number;
11
+ maxRow?: number;
12
+ float?: boolean;
13
+ nodes?: GridStackNode[];
14
+ onChange?: OnChangeCB;
15
+ }
16
+ /**
17
+ * Defines the GridStack engine that handles all grid layout calculations and node positioning.
18
+ * This is the core engine that performs grid manipulation without any DOM operations.
19
+ *
20
+ * The engine manages:
21
+ * - Node positioning and collision detection
22
+ * - Layout algorithms (compact, float, etc.)
23
+ * - Grid resizing and column changes
24
+ * - Widget movement and resizing logic
25
+ *
26
+ * NOTE: Values should not be modified directly - use the main GridStack API instead
27
+ * to ensure proper DOM updates and event triggers.
28
+ */
29
+ export declare class GridStackEngine {
30
+ column: number;
31
+ maxRow: number;
32
+ nodes: GridStackNode[];
33
+ addedNodes: GridStackNode[];
34
+ removedNodes: GridStackNode[];
35
+ batchMode: boolean;
36
+ defaultColumn: number;
37
+ /** true when grid.load() already cached the layout and can skip out of bound caching info */
38
+ skipCacheUpdate?: boolean;
39
+ constructor(opts?: GridStackEngineOptions);
40
+ /**
41
+ * Enable/disable batch mode for multiple operations to optimize performance.
42
+ * When enabled, layout updates are deferred until batch mode is disabled.
43
+ *
44
+ * @param flag true to enable batch mode, false to disable and apply changes
45
+ * @param doPack if true (default), pack/compact nodes when disabling batch mode
46
+ * @returns the engine instance for chaining
47
+ *
48
+ * @example
49
+ * // Start batch mode for multiple operations
50
+ * engine.batchUpdate(true);
51
+ * engine.addNode(node1);
52
+ * engine.addNode(node2);
53
+ * engine.batchUpdate(false); // Apply all changes at once
54
+ */
55
+ batchUpdate(flag?: boolean, doPack?: boolean): GridStackEngine;
56
+ protected _useEntireRowArea(node: GridStackNode, nn: GridStackPosition): boolean;
57
+ /**
58
+ * Return the first node that intercepts/collides with the given node or area.
59
+ * Used for collision detection during drag and drop operations.
60
+ *
61
+ * @param skip the node to skip in collision detection (usually the node being moved)
62
+ * @param area the area to check for collisions (defaults to skip node's area)
63
+ * @param skip2 optional second node to skip in collision detection
64
+ * @returns the first colliding node, or undefined if no collision
65
+ *
66
+ * @example
67
+ * const colliding = engine.collide(draggedNode, {x: 2, y: 1, w: 2, h: 1});
68
+ * if (colliding) {
69
+ * console.log('Would collide with:', colliding.id);
70
+ * }
71
+ */
72
+ collide(skip: GridStackNode, area?: GridStackNode, skip2?: GridStackNode): GridStackNode | undefined;
73
+ /**
74
+ * Return all nodes that intercept/collide with the given node or area.
75
+ * Similar to collide() but returns all colliding nodes instead of just the first.
76
+ *
77
+ * @param skip the node to skip in collision detection
78
+ * @param area the area to check for collisions (defaults to skip node's area)
79
+ * @param skip2 optional second node to skip in collision detection
80
+ * @returns array of all colliding nodes
81
+ *
82
+ * @example
83
+ * const allCollisions = engine.collideAll(draggedNode);
84
+ * console.log('Colliding with', allCollisions.length, 'nodes');
85
+ */
86
+ collideAll(skip: GridStackNode, area?: GridStackNode, skip2?: GridStackNode): GridStackNode[];
87
+ /** does a pixel coverage collision based on where we started, returning the node that has the most coverage that is >50% mid line */
88
+ protected directionCollideCoverage(node: GridStackNode, o: GridStackMoveOpts, collides: GridStackNode[]): GridStackNode | undefined;
89
+ /**
90
+ * Attempt to swap the positions of two nodes if they meet swapping criteria.
91
+ * Nodes can swap if they are the same size or in the same column/row, not locked, and touching.
92
+ *
93
+ * @param a first node to swap
94
+ * @param b second node to swap
95
+ * @returns true if swap was successful, false if not possible, undefined if not applicable
96
+ *
97
+ * @example
98
+ * const swapped = engine.swap(nodeA, nodeB);
99
+ * if (swapped) {
100
+ * console.log('Nodes swapped successfully');
101
+ * }
102
+ */
103
+ swap(a: GridStackNode, b: GridStackNode): boolean | undefined;
104
+ /**
105
+ * Check if the specified rectangular area is empty (no nodes occupy any part of it).
106
+ *
107
+ * @param x the x coordinate (column) of the area to check
108
+ * @param y the y coordinate (row) of the area to check
109
+ * @param w the width in columns of the area to check
110
+ * @param h the height in rows of the area to check
111
+ * @returns true if the area is completely empty, false if any node overlaps
112
+ *
113
+ * @example
114
+ * if (engine.isAreaEmpty(2, 1, 3, 2)) {
115
+ * console.log('Area is available for placement');
116
+ * }
117
+ */
118
+ isAreaEmpty(x: number, y: number, w: number, h: number): boolean;
119
+ /**
120
+ * Re-layout grid items to reclaim any empty space.
121
+ * This optimizes the grid layout by moving items to fill gaps.
122
+ *
123
+ * @param layout layout algorithm to use:
124
+ * - 'compact' (default): find truly empty spaces, may reorder items
125
+ * - 'list': keep the sort order exactly the same, move items up sequentially
126
+ * @param doSort if true (default), sort nodes by position before compacting
127
+ * @returns the engine instance for chaining
128
+ *
129
+ * @example
130
+ * // Compact to fill empty spaces
131
+ * engine.compact();
132
+ *
133
+ * // Compact preserving item order
134
+ * engine.compact('list');
135
+ */
136
+ compact(layout?: CompactOptions, doSort?: boolean): GridStackEngine;
137
+ /**
138
+ * Enable/disable floating widgets (default: `false`).
139
+ * When floating is enabled, widgets can move up to fill empty spaces.
140
+ * See [example](http://gridstackjs.com/demo/float.html)
141
+ *
142
+ * @param val true to enable floating, false to disable
143
+ *
144
+ * @example
145
+ * engine.float = true; // Enable floating
146
+ * engine.float = false; // Disable floating (default)
147
+ */
148
+ set float(val: boolean);
149
+ /**
150
+ * Get the current floating mode setting.
151
+ *
152
+ * @returns true if floating is enabled, false otherwise
153
+ *
154
+ * @example
155
+ * const isFloating = engine.float;
156
+ * console.log('Floating enabled:', isFloating);
157
+ */
158
+ get float(): boolean;
159
+ /**
160
+ * Sort the nodes array from first to last, or reverse.
161
+ * This is called during collision/placement operations to enforce a specific order.
162
+ *
163
+ * @param dir sort direction: 1 for ascending (first to last), -1 for descending (last to first)
164
+ * @returns the engine instance for chaining
165
+ *
166
+ * @example
167
+ * engine.sortNodes(); // Sort ascending (default)
168
+ * engine.sortNodes(-1); // Sort descending
169
+ */
170
+ sortNodes(dir?: 1 | -1): GridStackEngine;
171
+ /**
172
+ * Prepare and validate a node's coordinates and values for the current grid.
173
+ * This ensures the node has valid position, size, and properties before being added to the grid.
174
+ *
175
+ * @param node the node to prepare and validate
176
+ * @param resizing if true, resize the node down if it's out of bounds; if false, move it to fit
177
+ * @returns the prepared node with valid coordinates
178
+ *
179
+ * @example
180
+ * const node = { w: 3, h: 2, content: 'Hello' };
181
+ * const prepared = engine.prepareNode(node);
182
+ * console.log('Node prepared at:', prepared.x, prepared.y);
183
+ */
184
+ prepareNode(node: GridStackNode, resizing?: boolean): GridStackNode;
185
+ /**
186
+ * Part 2 of preparing a node to fit inside the grid - validates and fixes coordinates and dimensions.
187
+ * This ensures the node fits within grid boundaries and respects min/max constraints.
188
+ *
189
+ * @param node the node to validate and fix
190
+ * @param resizing if true, resize the node to fit; if false, move the node to fit
191
+ * @returns the engine instance for chaining
192
+ *
193
+ * @example
194
+ * // Fix a node that might be out of bounds
195
+ * engine.nodeBoundFix(node, true); // Resize to fit
196
+ * engine.nodeBoundFix(node, false); // Move to fit
197
+ */
198
+ nodeBoundFix(node: GridStackNode, resizing?: boolean): GridStackEngine;
199
+ /**
200
+ * Returns a list of nodes that have been modified from their original values.
201
+ * This is used to track which nodes need DOM updates.
202
+ *
203
+ * @param verify if true, performs additional verification by comparing current vs original positions
204
+ * @returns array of nodes that have been modified
205
+ *
206
+ * @example
207
+ * const changed = engine.getDirtyNodes();
208
+ * console.log('Modified nodes:', changed.length);
209
+ *
210
+ * // Get verified dirty nodes
211
+ * const verified = engine.getDirtyNodes(true);
212
+ */
213
+ getDirtyNodes(verify?: boolean): GridStackNode[];
214
+ /**
215
+ * Find the first available empty spot for the given node dimensions.
216
+ * Updates the node's x,y attributes with the found position.
217
+ *
218
+ * @param node the node to find a position for (w,h must be set)
219
+ * @param nodeList optional list of nodes to check against (defaults to engine nodes)
220
+ * @param column optional column count (defaults to engine column count)
221
+ * @param after optional node to start search after (maintains order)
222
+ * @returns true if an empty position was found and node was updated
223
+ *
224
+ * @example
225
+ * const node = { w: 2, h: 1 };
226
+ * if (engine.findEmptyPosition(node)) {
227
+ * console.log('Found position at:', node.x, node.y);
228
+ * }
229
+ */
230
+ findEmptyPosition(node: GridStackNode, nodeList?: GridStackNode[], column?: number, after?: GridStackNode): boolean;
231
+ /**
232
+ * Add the given node to the grid, handling collision detection and re-packing.
233
+ * This is the main method for adding new widgets to the engine.
234
+ *
235
+ * @param node the node to add to the grid
236
+ * @param triggerAddEvent if true, adds node to addedNodes list for event triggering
237
+ * @param after optional node to place this node after (for ordering)
238
+ * @returns the added node (or existing node if duplicate)
239
+ *
240
+ * @example
241
+ * const node = { x: 0, y: 0, w: 2, h: 1, content: 'Hello' };
242
+ * const added = engine.addNode(node, true);
243
+ */
244
+ addNode(node: GridStackNode, triggerAddEvent?: boolean, after?: GridStackNode): GridStackNode;
245
+ /**
246
+ * Remove the given node from the grid.
247
+ *
248
+ * @param node the node to remove
249
+ * @param removeDOM if true (default), marks node for DOM removal
250
+ * @param triggerEvent if true, adds node to removedNodes list for event triggering
251
+ * @returns the engine instance for chaining
252
+ *
253
+ * @example
254
+ * engine.removeNode(node, true, true);
255
+ */
256
+ removeNode(node: GridStackNode, removeDOM?: boolean, triggerEvent?: boolean): GridStackEngine;
257
+ /**
258
+ * Remove all nodes from the grid.
259
+ *
260
+ * @param removeDOM if true (default), marks all nodes for DOM removal
261
+ * @param triggerEvent if true (default), triggers removal events
262
+ * @returns the engine instance for chaining
263
+ *
264
+ * @example
265
+ * engine.removeAll(); // Remove all nodes
266
+ */
267
+ removeAll(removeDOM?: boolean, triggerEvent?: boolean): GridStackEngine;
268
+ /**
269
+ * Check if a node can be moved to a new position, considering layout constraints.
270
+ * This is a safer version of moveNode() that validates the move first.
271
+ *
272
+ * For complex cases (like maxRow constraints), it simulates the move in a clone first,
273
+ * then applies the changes only if they meet all specifications.
274
+ *
275
+ * @param node the node to move
276
+ * @param o move options including target position
277
+ * @returns true if the node was successfully moved
278
+ *
279
+ * @example
280
+ * const canMove = engine.moveNodeCheck(node, { x: 2, y: 1 });
281
+ * if (canMove) {
282
+ * console.log('Node moved successfully');
283
+ * }
284
+ */
285
+ moveNodeCheck(node: GridStackNode, o: GridStackMoveOpts): boolean;
286
+ /** return true if can fit in grid height constrain only (always true if no maxRow) */
287
+ willItFit(node: GridStackNode): boolean;
288
+ /** true if x,y or w,h are different after clamping to min/max */
289
+ changedPosConstrain(node: GridStackNode, p: GridStackPosition): boolean;
290
+ /** return true if the passed in node was actually moved (checks for no-op and locked) */
291
+ moveNode(node: GridStackNode, o: GridStackMoveOpts): boolean;
292
+ getRow(): number;
293
+ beginUpdate(node: GridStackNode): GridStackEngine;
294
+ endUpdate(): GridStackEngine;
295
+ /** saves a copy of the largest column layout (eg 12 even when rendering 1 column) so we don't loose orig layout, unless explicity column
296
+ * count to use is given. returning a list of widgets for serialization
297
+ * @param saveElement if true (default), the element will be saved to GridStackWidget.el field, else it will be removed.
298
+ * @param saveCB callback for each node -> widget, so application can insert additional data to be saved into the widget data structure.
299
+ * @param column if provided, the grid will be saved for the given column count (IFF we have matching internal saved layout, or current layout).
300
+ * Note: nested grids will ALWAYS save the container w to match overall layouts (parent + child) to be consistent.
301
+ */
302
+ save(saveElement?: boolean, saveCB?: SaveFcn, column?: number): GridStackNode[];
303
+ /**
304
+ * call to cache the given layout internally to the given location so we can restore back when column changes size
305
+ * @param nodes list of nodes
306
+ * @param column corresponding column index to save it under
307
+ * @param clear if true, will force other caches to be removed (default false)
308
+ */
309
+ cacheLayout(nodes: GridStackNode[], column: number, clear?: boolean): GridStackEngine;
310
+ /**
311
+ * call to cache the given node layout internally to the given location so we can restore back when column changes size
312
+ * @param node single node to cache
313
+ * @param column corresponding column index to save it under
314
+ */
315
+ cacheOneLayout(n: GridStackNode, column: number): GridStackEngine;
316
+ protected findCacheLayout(n: GridStackNode, column: number): number | undefined;
317
+ removeNodeFromLayoutCache(n: GridStackNode): void;
318
+ /** called to remove all internal values but the _id */
319
+ cleanupNode(node: GridStackNode): GridStackEngine;
320
+ }
321
+ export {};