diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 9a6f709c3..af6e4d211 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -186,6 +186,22 @@ "delegate": "^3.1.2" } }, + "node_modules/gridstack": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/gridstack/-/gridstack-12.4.2.tgz", + "integrity": "sha512-aXbJrQpi3LwpYXYOr4UriPM5uc/dPcjK01SdOE5PDpx2vi8tnLhU7yBg/1i4T59UhNkG/RBfabdFUObuN+gMnw==", + "funding": [ + { + "type": "paypal", + "url": "https://www.paypal.me/alaind831" + }, + { + "type": "venmo", + "url": "https://www.venmo.com/adumesny" + } + ], + "license": "MIT" + }, "node_modules/jquery": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", diff --git a/node_modules/gridstack/dist/angular/README.md b/node_modules/gridstack/dist/angular/README.md deleted file mode 100644 index 79abfc0ff..000000000 --- a/node_modules/gridstack/dist/angular/README.md +++ /dev/null @@ -1,211 +0,0 @@ -# Angular wrapper - -The Angular [wrapper component](projects/lib/src/lib/gridstack.component.ts) is a better way to use Gridstack, but alternative raw [ngFor](projects/demo/src/app/ngFor.ts) or [simple](projects/demo/src/app/simple.ts) demos are also given. - -Running version can be seen here https://stackblitz.com/edit/gridstack-angular - -# Dynamic grid items - -this is the recommended way if you are going to have multiple grids (alow drag&drop between) or drag from toolbar to create items, or drag to remove items, etc... - -I.E. don't use Angular templating to create grid items as that is harder to sync when gridstack will also add/remove items. - -MyComponent HTML - -```html - -``` - -MyComponent CSS - -```css -@import "gridstack/dist/gridstack.min.css"; - -.grid-stack { - background: #fafad2; -} -.grid-stack-item-content { - text-align: center; - background-color: #18bc9c; -} -``` - - -Standalone MyComponent Code - -```ts -import { GridStackOptions } from 'gridstack'; -import { GridstackComponent, GridstackItemComponent } from 'gridstack/dist/angular'; - -@Component({ - imports: [ // SKIP if doing module import instead (next) - GridstackComponent, - GridstackItemComponent - ] - ... - }) -export class MyComponent { - // sample grid options + items to load... - public gridOptions: GridStackOptions = { - margin: 5, - children: [ // or call load(children) or addWidget(children[0]) with same data - {x:0, y:0, minW:2, content:'Item 1'}, - {x:1, y:0, content:'Item 2'}, - {x:0, y:1, content:'Item 3'}, - ] - } - -} -``` - -IF doing module import instead of standalone, you will also need this: - -```ts -import { GridstackModule } from 'gridstack/dist/angular'; - -@NgModule({ - imports: [GridstackModule, ...] - ... - bootstrap: [AppComponent] -}) -export class AppModule { } -``` - -# More Complete example - -In this example (build on previous one) will use your actual custom angular components inside each grid item (instead of dummy html content) and have per component saved settings as well (using BaseWidget). - -HTML - -```html - -
message when grid is empty
-
-``` - -Code - -```ts -import { Component } from '@angular/core'; -import { GridStack, GridStackOptions } from 'gridstack'; -import { GridstackComponent, gsCreateNgComponents, NgGridStackWidget, nodesCB, BaseWidget } from 'gridstack/dist/angular'; - -// some custom components -@Component({ - selector: 'app-a', - template: 'Comp A {{text}}', -}) -export class AComponent extends BaseWidget implements OnDestroy { - @Input() text: string = 'foo'; // test custom input data - public override serialize(): NgCompInputs | undefined { return this.text ? {text: this.text} : undefined; } - ngOnDestroy() { - console.log('Comp A destroyed'); // test to make sure cleanup happens - } -} - -@Component({ - selector: 'app-b', - template: 'Comp B', -}) -export class BComponent extends BaseWidget { -} - -// ...in your module (classic), OR your ng19 app.config provideEnvironmentInitializer call this: -constructor() { - // register all our dynamic components types created by the grid - GridstackComponent.addComponentToSelectorType([AComponent, BComponent]) ; -} - -// now our content will use Components instead of dummy html content -public gridOptions: NgGridStackOptions = { - margin: 5, - minRow: 1, // make space for empty message - children: [ // or call load()/addWidget() with same data - {x:0, y:0, minW:2, selector:'app-a'}, - {x:1, y:0, minW:2, selector:'app-a', input: { text: 'bar' }}, // custom input that works using BaseWidget.deserialize() Object.assign(this, w.input) - {x:2, y:0, selector:'app-b'}, - {x:3, y:0, content:'plain html'}, - ] -} - -// called whenever items change size/position/etc.. see other events -public onChange(data: nodesCB) { - console.log('change ', data.nodes.length > 1 ? data.nodes : data.nodes[0]); -} -``` - -# ngFor with wrapper - -For simple case where you control the children creation (gridstack doesn't do create or re-parenting) - -HTML - -```html - - - @for (n of items; track n.id) { - Item {{n.id}} - } - - Item {{n.id}} - -``` - -Code - -```javascript -import { GridStackOptions, GridStackWidget } from 'gridstack'; -import { nodesCB } from 'gridstack/dist/angular'; - -/** sample grid options and items to load... */ -public gridOptions: GridStackOptions = { margin: 5 } -public items: GridStackWidget[] = [ - {x:0, y:0, minW:2, id:'1'}, // must have unique id used for trackBy - {x:1, y:0, id:'2'}, - {x:0, y:1, id:'3'}, -]; - -// called whenever items change size/position/etc.. -public onChange(data: nodesCB) { - console.log('change ', data.nodes.length > 1 ? data.nodes : data.nodes[0]); -} - -// ngFor unique node id to have correct match between our items used and GS -public identify(index: number, w: GridStackWidget) { - return w.id; // or use index if no id is set and you only modify at the end... -} -``` - -## Demo - -You can see a fuller example at [app.component.ts](projects/demo/src/app/app.component.ts) - -to build the demo, go to [angular/projects/demo](projects/demo/) and run `yarn` + `yarn start` and navigate to `http://localhost:4200/` - -Code started shipping with v8.1.2+ in `dist/angular` for people to use directly and is an angular module! (source code under `dist/angular/src`) - -## Caveats - -- This wrapper needs: - - gridstack v8+ to run as it needs the latest changes (use older version that matches GS versions) - - Angular 14+ for dynamic `createComponent()` API and Standalone Components (verified against 19+) - -NOTE: if you are on Angular 13 or below: copy the wrapper code over (or patch it - see main page example) and change `createComponent()` calls to use old API instead: -NOTE2: now that we're using standalone, you will also need to remove `standalone: true` and `imports` on each component so you will to copy those locally (or use <11.1.2 version) -```ts -protected resolver: ComponentFactoryResolver, -... -const factory = this.resolver.resolveComponentFactory(GridItemComponent); -const gridItemRef = grid.container.createComponent(factory) as ComponentRef; -// ...do the same for widget selector... -``` - -## ngFor Caveats - -- This wrapper handles well ngFor loops, but if you're using a trackBy function (as I would recommend) and no element id change after an update, - you must manually update the `GridstackItemComponent.option` directly - see [modifyNgFor()](./projects/demo/src/app/app.component.ts#L202) example. -- The original client list of items is not updated to match **content** changes made by gridstack (TBD later), but adding new item or removing (as shown in demo) will update those new items. Client could use change/added/removed events to sync that list if they wish to do so. - -Would appreciate getting help doing the same for React and Vue (2 other popular frameworks) - --Alain diff --git a/node_modules/gridstack/dist/angular/esm2020/gridstack-angular.mjs b/node_modules/gridstack/dist/angular/esm2020/gridstack-angular.mjs deleted file mode 100644 index d468a8234..000000000 --- a/node_modules/gridstack/dist/angular/esm2020/gridstack-angular.mjs +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './index'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvZ3JpZHN0YWNrLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0= \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/esm2020/index.mjs b/node_modules/gridstack/dist/angular/esm2020/index.mjs deleted file mode 100644 index 6760a86f3..000000000 --- a/node_modules/gridstack/dist/angular/esm2020/index.mjs +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Public API Surface of gridstack-angular - */ -export * from './lib/types'; -export * from './lib/base-widget'; -export * from './lib/gridstack-item.component'; -export * from './lib/gridstack.component'; -export * from './lib/gridstack.module'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBncmlkc3RhY2stYW5ndWxhclxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Jhc2Utd2lkZ2V0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWRzdGFjay1pdGVtLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ncmlkc3RhY2suY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWRzdGFjay5tb2R1bGUnO1xuIl19 \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/esm2020/lib/base-widget.mjs b/node_modules/gridstack/dist/angular/esm2020/lib/base-widget.mjs deleted file mode 100644 index ebc09ba53..000000000 --- a/node_modules/gridstack/dist/angular/esm2020/lib/base-widget.mjs +++ /dev/null @@ -1,90 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Abstract base class that all custom widgets should extend. - * - * This class provides the interface needed for GridstackItemComponent to: - * - Serialize/deserialize widget data - * - Save/restore widget state - * - Integrate with Angular lifecycle - * - * Extend this class when creating custom widgets for dynamic grids. - * - * @example - * ```typescript - * @Component({ - * selector: 'my-custom-widget', - * template: '
{{data}}
' - * }) - * export class MyCustomWidget extends BaseWidget { - * @Input() data: string = ''; - * - * serialize() { - * return { data: this.data }; - * } - * } - * ``` - */ -import { Injectable } from '@angular/core'; -import * as i0 from "@angular/core"; -/** - * Base widget class for GridStack Angular integration. - */ -export class BaseWidget { - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize() { return; } - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w) { - // save full description for meta data - this.widgetItem = w; - if (!w) - return; - if (w.input) - Object.assign(this, w.input); - } -} -BaseWidget.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); -BaseWidget.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, decorators: [{ - type: Injectable - }] }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS13aWRnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvbGliL2Jhc2Utd2lkZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQzs7R0FFRztBQUVILE1BQU0sT0FBZ0IsVUFBVTtJQVE5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0ksU0FBUyxLQUFnQyxPQUFPLENBQUMsQ0FBQztJQUV6RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNJLFdBQVcsQ0FBQyxDQUFvQjtRQUNyQyxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRWYsSUFBSSxDQUFDLENBQUMsS0FBSztZQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDOzt1R0F2RG1CLFVBQVU7MkdBQVYsVUFBVTsyRkFBVixVQUFVO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIGdyaWRzdGFjay1pdGVtLmNvbXBvbmVudC50cyAxMi4zLjNcclxuICogQ29weXJpZ2h0IChjKSAyMDIyLTIwMjQgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBhbGwgY3VzdG9tIHdpZGdldHMgc2hvdWxkIGV4dGVuZC5cclxuICogXHJcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBuZWVkZWQgZm9yIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgdG86XHJcbiAqIC0gU2VyaWFsaXplL2Rlc2VyaWFsaXplIHdpZGdldCBkYXRhXHJcbiAqIC0gU2F2ZS9yZXN0b3JlIHdpZGdldCBzdGF0ZVxyXG4gKiAtIEludGVncmF0ZSB3aXRoIEFuZ3VsYXIgbGlmZWN5Y2xlXHJcbiAqIFxyXG4gKiBFeHRlbmQgdGhpcyBjbGFzcyB3aGVuIGNyZWF0aW5nIGN1c3RvbSB3aWRnZXRzIGZvciBkeW5hbWljIGdyaWRzLlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBAQ29tcG9uZW50KHtcclxuICogICBzZWxlY3RvcjogJ215LWN1c3RvbS13aWRnZXQnLFxyXG4gKiAgIHRlbXBsYXRlOiAnPGRpdj57e2RhdGF9fTwvZGl2PidcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIE15Q3VzdG9tV2lkZ2V0IGV4dGVuZHMgQmFzZVdpZGdldCB7XHJcbiAqICAgQElucHV0KCkgZGF0YTogc3RyaW5nID0gJyc7XHJcbiAqICAgXHJcbiAqICAgc2VyaWFsaXplKCkge1xyXG4gKiAgICAgcmV0dXJuIHsgZGF0YTogdGhpcy5kYXRhIH07XHJcbiAqICAgfVxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb21wSW5wdXRzLCBOZ0dyaWRTdGFja1dpZGdldCB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2Ugd2lkZ2V0IGNsYXNzIGZvciBHcmlkU3RhY2sgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXaWRnZXQge1xyXG5cclxuICAvKipcclxuICAgKiBDb21wbGV0ZSB3aWRnZXQgZGVmaW5pdGlvbiBpbmNsdWRpbmcgcG9zaXRpb24sIHNpemUsIGFuZCBBbmd1bGFyLXNwZWNpZmljIGRhdGEuXHJcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgd2lkZ2V0IGlzIGxvYWRlZCBvciBzYXZlZC5cclxuICAgKi9cclxuICBwdWJsaWMgd2lkZ2V0SXRlbT86IE5nR3JpZFN0YWNrV2lkZ2V0O1xyXG5cclxuICAvKipcclxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gc2VyaWFsaXphYmxlIGRhdGEgZm9yIHRoaXMgd2lkZ2V0LlxyXG4gICAqIFxyXG4gICAqIFJldHVybiBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRoYXQgbWFwIHRvIHlvdXIgY29tcG9uZW50J3MgQElucHV0KCkgZmllbGRzLlxyXG4gICAqIFRoZSBzZWxlY3RvciBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHksIHNvIG9ubHkgaW5jbHVkZSBjb21wb25lbnQtc3BlY2lmaWMgZGF0YS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBzZXJpYWxpemFibGUgY29tcG9uZW50IGRhdGFcclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBzZXJpYWxpemUoKSB7XHJcbiAgICogICByZXR1cm4ge1xyXG4gICAqICAgICB0aXRsZTogdGhpcy50aXRsZSxcclxuICAgKiAgICAgdmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICogICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzXHJcbiAgICogICB9O1xyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKi9cclxuICBwdWJsaWMgc2VyaWFsaXplKCk6IE5nQ29tcElucHV0cyB8IHVuZGVmaW5lZCAgeyByZXR1cm47IH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHdpZGdldCByZXN0b3JhdGlvbiBmcm9tIHNhdmVkIGRhdGEuXHJcbiAgICogXHJcbiAgICogVXNlIHRoaXMgZm9yIGNvbXBsZXggaW5pdGlhbGl6YXRpb24gdGhhdCBnb2VzIGJleW9uZCBzaW1wbGUgQElucHV0KCkgbWFwcGluZy5cclxuICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhdXRvbWF0aWNhbGx5IGFzc2lnbnMgaW5wdXQgZGF0YSB0byBjb21wb25lbnQgcHJvcGVydGllcy5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gdyBUaGUgc2F2ZWQgd2lkZ2V0IGRhdGEgaW5jbHVkaW5nIGlucHV0IHByb3BlcnRpZXNcclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBkZXNlcmlhbGl6ZSh3OiBOZ0dyaWRTdGFja1dpZGdldCkge1xyXG4gICAqICAgc3VwZXIuZGVzZXJpYWxpemUodyk7IC8vIENhbGwgcGFyZW50IGZvciBiYXNpYyBzZXR1cFxyXG4gICAqICAgXHJcbiAgICogICAvLyBDdXN0b20gaW5pdGlhbGl6YXRpb24gbG9naWNcclxuICAgKiAgIGlmICh3LmlucHV0Py5jb21wbGV4RGF0YSkge1xyXG4gICAqICAgICB0aGlzLnByb2Nlc3NDb21wbGV4RGF0YSh3LmlucHV0LmNvbXBsZXhEYXRhKTtcclxuICAgKiAgIH1cclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgcHVibGljIGRlc2VyaWFsaXplKHc6IE5nR3JpZFN0YWNrV2lkZ2V0KSAge1xyXG4gICAgLy8gc2F2ZSBmdWxsIGRlc2NyaXB0aW9uIGZvciBtZXRhIGRhdGFcclxuICAgIHRoaXMud2lkZ2V0SXRlbSA9IHc7XHJcbiAgICBpZiAoIXcpIHJldHVybjtcclxuXHJcbiAgICBpZiAody5pbnB1dCkgIE9iamVjdC5hc3NpZ24odGhpcywgdy5pbnB1dCk7XHJcbiAgfVxyXG4gfVxyXG4iXX0= \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/esm2020/lib/gridstack-item.component.mjs b/node_modules/gridstack/dist/angular/esm2020/lib/gridstack-item.component.mjs deleted file mode 100644 index da5e052c9..000000000 --- a/node_modules/gridstack/dist/angular/esm2020/lib/gridstack-item.component.mjs +++ /dev/null @@ -1,101 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core'; -import * as i0 from "@angular/core"; -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -export class GridstackItemComponent { - constructor(elementRef) { - this.elementRef = elementRef; - this.el._gridItemComp = this; - } - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val) { - const grid = this.el.gridstackNode?.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } - else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = { ...val, el: this.el }; - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options() { - return this.el.gridstackNode || this._options || { el: this.el }; - } - /** return the native element that contains grid specific fields as well */ - get el() { return this.elementRef.nativeElement; } - /** clears the initial options now that we've built */ - clearOptions() { - delete this._options; - } - ngOnDestroy() { - this.clearOptions(); - delete this.childWidget; - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} -GridstackItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackItemComponent, isStandalone: true, selector: "gridstack-item", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` -
- - - - - - {{options.content}} -
`, isInline: true, styles: [":host{display:block}\n"] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack-item', template: ` -
- - - - - - {{options.content}} -
`, standalone: true, styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }] } }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYW5ndWxhci9wcm9qZWN0cy9saWIvc3JjL2xpYi9ncmlkc3RhY2staXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUEyQixNQUFNLGVBQWUsQ0FBQzs7QUFhbkg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFrQkgsTUFBTSxPQUFPLHNCQUFzQjtJQTBEakMsWUFBK0IsVUFBK0M7UUFBL0MsZUFBVSxHQUFWLFVBQVUsQ0FBcUM7UUFDNUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUF4Q0Q7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsSUFBb0IsT0FBTyxDQUFDLEdBQWtCO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQztRQUN6QyxJQUFJLElBQUksRUFBRTtZQUNSLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDM0I7YUFBTTtZQUNMLDJGQUEyRjtZQUMzRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFDRCxvRkFBb0Y7SUFDcEYsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUM7SUFDakUsQ0FBQztJQUlELDJFQUEyRTtJQUMzRSxJQUFXLEVBQUUsS0FBOEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsc0RBQXNEO0lBQy9DLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFNTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7O21IQXBFVSxzQkFBc0I7dUdBQXRCLHNCQUFzQiw2TEFNRCxnQkFBZ0IsMkNBckJ0Qzs7Ozs7Ozs7V0FRRDsyRkFPRSxzQkFBc0I7a0JBakJsQyxTQUFTOytCQUNFLGdCQUFnQixZQUNoQjs7Ozs7Ozs7V0FRRCxjQUlHLElBQUk7aUdBU3dELFNBQVM7c0JBQWhGLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBMkIzQyxPQUFPO3NCQUExQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBncmlkc3RhY2staXRlbS5jb21wb25lbnQudHMgMTIuMy4zXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uRGVzdHJveSwgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHcmlkSXRlbUhUTUxFbGVtZW50LCBHcmlkU3RhY2tOb2RlIH0gZnJvbSAnZ3JpZHN0YWNrJztcbmltcG9ydCB7IEJhc2VXaWRnZXQgfSBmcm9tICcuL2Jhc2Utd2lkZ2V0JztcblxuLyoqXG4gKiBFeHRlbmRlZCBIVE1MRWxlbWVudCBpbnRlcmZhY2UgZm9yIGdyaWQgaXRlbXMuXG4gKiBTdG9yZXMgYSBiYWNrLXJlZmVyZW5jZSB0byB0aGUgQW5ndWxhciBjb21wb25lbnQgZm9yIGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50IGV4dGVuZHMgR3JpZEl0ZW1IVE1MRWxlbWVudCB7XG4gIC8qKiBCYWNrLXJlZmVyZW5jZSB0byB0aGUgQW5ndWxhciBHcmlkU3RhY2tJdGVtIGNvbXBvbmVudCAqL1xuICBfZ3JpZEl0ZW1Db21wPzogR3JpZHN0YWNrSXRlbUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBbmd1bGFyIGNvbXBvbmVudCB3cmFwcGVyIGZvciBpbmRpdmlkdWFsIEdyaWRTdGFjayBpdGVtcy5cbiAqIFxuICogVGhpcyBjb21wb25lbnQgcmVwcmVzZW50cyBhIHNpbmdsZSBncmlkIGl0ZW0gYW5kIGhhbmRsZXM6XG4gKiAtIER5bmFtaWMgY29udGVudCBjcmVhdGlvbiBhbmQgbWFuYWdlbWVudFxuICogLSBJbnRlZ3JhdGlvbiB3aXRoIHBhcmVudCBHcmlkU3RhY2sgY29tcG9uZW50XG4gKiAtIENvbXBvbmVudCBsaWZlY3ljbGUgYW5kIGNsZWFudXBcbiAqIC0gV2lkZ2V0IG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb25cbiAqIFxuICogVXNlIGluIGNvbWJpbmF0aW9uIHdpdGggR3JpZHN0YWNrQ29tcG9uZW50IGZvciB0aGUgcGFyZW50IGdyaWQuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8Z3JpZHN0YWNrPlxuICogICA8Z3JpZHN0YWNrLWl0ZW0gW29wdGlvbnNdPVwie3g6IDAsIHk6IDAsIHc6IDIsIGg6IDF9XCI+XG4gKiAgICAgPG15LXdpZGdldC1jb21wb25lbnQ+PC9teS13aWRnZXQtY29tcG9uZW50PlxuICogICA8L2dyaWRzdGFjay1pdGVtPlxuICogPC9ncmlkc3RhY2s+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3JpZHN0YWNrLWl0ZW0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW0tY29udGVudFwiPlxuICAgICAgPCEtLSB3aGVyZSBkeW5hbWljIGl0ZW1zIGdvIGJhc2VkIG9uIGNvbXBvbmVudCBzZWxlY3RvciAocmVjb21tZW5kZWQgd2F5KSwgb3Igc3ViLWdyaWRzLCBldGMuLi4pIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlICNjb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwhLS0gYW55IHN0YXRpYyAoZGVmaW5lZCBpbiBET00gLSBub3QgcmVjb21tZW5kZWQpIGNvbnRlbnQgZ29lcyBoZXJlIC0tPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPCEtLSBmYWxsYmFjayBIVE1MIGNvbnRlbnQgZnJvbSBHcmlkU3RhY2tXaWRnZXQuY29udGVudCBpZiB1c2VkIGluc3RlYWQgKG5vdCByZWNvbW1lbmRlZCkgLS0+XG4gICAgICB7e29wdGlvbnMuY29udGVudH19XG4gICAgPC9kaXY+YCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAgYF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLCAvLyBJRkYgeW91IHdhbnQgdG8gb3B0aW1pemUgYW5kIGNvbnRyb2wgd2hlbiBDaGFuZ2VEZXRlY3Rpb24gbmVlZHMgdG8gaGFwcGVuLi4uXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgZm9yIGR5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uIHdpdGhpbiB0aGlzIGdyaWQgaXRlbS5cbiAgICogVXNlZCB0byBhcHBlbmQgY2hpbGQgY29tcG9uZW50cyBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKi9cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWV9KSBwdWJsaWMgY29udGFpbmVyPzogVmlld0NvbnRhaW5lclJlZjtcblxuICAvKipcbiAgICogQ29tcG9uZW50IHJlZmVyZW5jZSBmb3IgZHluYW1pYyBjb21wb25lbnQgcmVtb3ZhbC5cbiAgICogVXNlZCBpbnRlcm5hbGx5IHdoZW4gdGhpcyBjb21wb25lbnQgaXMgY3JlYXRlZCBkeW5hbWljYWxseS5cbiAgICovXG4gIHB1YmxpYyByZWY6IENvbXBvbmVudFJlZjxHcmlkc3RhY2tJdGVtQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIGNoaWxkIHdpZGdldCBjb21wb25lbnQgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAqIFVzZWQgdG8gc2F2ZS9yZXN0b3JlIGFkZGl0aW9uYWwgZGF0YSBhbG9uZyB3aXRoIGdyaWQgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgY2hpbGRXaWRnZXQ6IEJhc2VXaWRnZXQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEdyaWQgaXRlbSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIERlZmluZXMgcG9zaXRpb24sIHNpemUsIGFuZCBiZWhhdmlvciBvZiB0aGlzIGdyaWQgaXRlbS5cbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaXRlbU9wdGlvbnM6IEdyaWRTdGFja05vZGUgPSB7XG4gICAqICAgeDogMCwgeTogMCwgdzogMiwgaDogMSxcbiAgICogICBub1Jlc2l6ZTogdHJ1ZSxcbiAgICogICBjb250ZW50OiAnSXRlbSBjb250ZW50J1xuICAgKiB9O1xuICAgKiBgYGBcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgb3B0aW9ucyh2YWw6IEdyaWRTdGFja05vZGUpIHtcbiAgICBjb25zdCBncmlkID0gdGhpcy5lbC5ncmlkc3RhY2tOb2RlPy5ncmlkO1xuICAgIGlmIChncmlkKSB7XG4gICAgICAvLyBhbHJlYWR5IGJ1aWx0LCBkbyBhbiB1cGRhdGUuLi5cbiAgICAgIGdyaWQudXBkYXRlKHRoaXMuZWwsIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN0b3JlIG91ciBjdXN0b20gZWxlbWVudCBpbiBvcHRpb25zIHNvIHdlIGNhbiB1cGRhdGUgaXQgYW5kIG5vdCByZS1jcmVhdGUgYSBnZW5lcmljIGRpdiFcbiAgICAgIHRoaXMuX29wdGlvbnMgPSB7Li4udmFsLCBlbDogdGhpcy5lbH07XG4gICAgfVxuICB9XG4gIC8qKiByZXR1cm4gdGhlIGxhdGVzdCBncmlkIG9wdGlvbnMgKGZyb20gR1Mgb25jZSBidWlsdCwgb3RoZXJ3aXNlIGluaXRpYWwgdmFsdWVzKSAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogR3JpZFN0YWNrTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuZ3JpZHN0YWNrTm9kZSB8fCB0aGlzLl9vcHRpb25zIHx8IHtlbDogdGhpcy5lbH07XG4gIH1cblxuICBwcm90ZWN0ZWQgX29wdGlvbnM/OiBHcmlkU3RhY2tOb2RlO1xuXG4gIC8qKiByZXR1cm4gdGhlIG5hdGl2ZSBlbGVtZW50IHRoYXQgY29udGFpbnMgZ3JpZCBzcGVjaWZpYyBmaWVsZHMgYXMgd2VsbCAqL1xuICBwdWJsaWMgZ2V0IGVsKCk6IEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OyB9XG5cbiAgLyoqIGNsZWFycyB0aGUgaW5pdGlhbCBvcHRpb25zIG5vdyB0aGF0IHdlJ3ZlIGJ1aWx0ICovXG4gIHB1YmxpYyBjbGVhck9wdGlvbnMoKSB7XG4gICAgZGVsZXRlIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxHcmlkSXRlbUNvbXBIVE1MRWxlbWVudD4pIHtcbiAgICB0aGlzLmVsLl9ncmlkSXRlbUNvbXAgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJPcHRpb25zKCk7XG4gICAgZGVsZXRlIHRoaXMuY2hpbGRXaWRnZXRcbiAgICBkZWxldGUgdGhpcy5lbC5fZ3JpZEl0ZW1Db21wO1xuICAgIGRlbGV0ZSB0aGlzLmNvbnRhaW5lcjtcbiAgICBkZWxldGUgdGhpcy5yZWY7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/esm2020/lib/gridstack.component.mjs b/node_modules/gridstack/dist/angular/esm2020/lib/gridstack.component.mjs deleted file mode 100644 index 05f0d6ec1..000000000 --- a/node_modules/gridstack/dist/angular/esm2020/lib/gridstack.component.mjs +++ /dev/null @@ -1,414 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild, ViewContainerRef, reflectComponentType } from '@angular/core'; -import { NgIf } from '@angular/common'; -import { GridStack } from 'gridstack'; -import { GridstackItemComponent } from './gridstack-item.component'; -import * as i0 from "@angular/core"; -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -export class GridstackComponent { - constructor(elementRef) { - this.elementRef = elementRef; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - this.addedCB = new EventEmitter(); - /** Emitted when grid layout changes */ - this.changeCB = new EventEmitter(); - /** Emitted when grid is disabled */ - this.disableCB = new EventEmitter(); - /** Emitted during widget drag operations */ - this.dragCB = new EventEmitter(); - /** Emitted when widget drag starts */ - this.dragStartCB = new EventEmitter(); - /** Emitted when widget drag stops */ - this.dragStopCB = new EventEmitter(); - /** Emitted when widget is dropped */ - this.droppedCB = new EventEmitter(); - /** Emitted when grid is enabled */ - this.enableCB = new EventEmitter(); - /** Emitted when widgets are removed from the grid */ - this.removedCB = new EventEmitter(); - /** Emitted during widget resize operations */ - this.resizeCB = new EventEmitter(); - /** Emitted when widget resize starts */ - this.resizeStartCB = new EventEmitter(); - /** Emitted when widget resize stops */ - this.resizeStopCB = new EventEmitter(); - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o) { - if (this._grid) { - this._grid.updateOptions(o); - } - else { - this._options = o; - } - } - /** Get the current running grid options */ - get options() { return this._grid?.opts || this._options || {}; } - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el() { return this.elementRef.nativeElement; } - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid() { return this._grid; } - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList) { - typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type) { - return reflectComponentType(type).selector; - } - ngOnInit() { - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!this.options?.children?.length; - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - this.checkEmpty(); - } - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit() { - // track whenever the children list changes and update the layout... - this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) - this.updateAll(); - this.hookEvents(this.grid); - } - ngOnDestroy() { - this.unhookEvents(this._grid); - this._sub?.unsubscribe(); - this._grid?.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll() { - if (!this.grid) - return; - const layout = []; - this.gridstackItems?.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - /** check if the grid is empty, if so show alternative content */ - checkEmpty() { - if (!this.grid) - return; - this.isEmpty = !this.grid.engine.nodes.length; - } - /** get all known events as easy to use Outputs for convenience */ - hookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid - .on('added', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.addedCB.emit({ event, nodes }); - }) - .on('change', (event, nodes) => this.changeCB.emit({ event, nodes })) - .on('disable', (event) => this.disableCB.emit({ event })) - .on('drag', (event, el) => this.dragCB.emit({ event, el })) - .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el })) - .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el })) - .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode })) - .on('enable', (event) => this.enableCB.emit({ event })) - .on('removed', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.removedCB.emit({ event, nodes }); - }) - .on('resize', (event, el) => this.resizeCB.emit({ event, el })) - .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el })) - .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el })); - } - unhookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} -/** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ -GridstackComponent.selectorToType = {}; -GridstackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackComponent, isStandalone: true, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` - - - - - - - `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack', template: ` - - - - - - - `, standalone: true, imports: [NgIf], styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { gridstackItems: [{ - type: ContentChildren, - args: [GridstackItemComponent] - }], container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }], isEmpty: [{ - type: Input - }], addedCB: [{ - type: Output - }], changeCB: [{ - type: Output - }], disableCB: [{ - type: Output - }], dragCB: [{ - type: Output - }], dragStartCB: [{ - type: Output - }], dragStopCB: [{ - type: Output - }], droppedCB: [{ - type: Output - }], enableCB: [{ - type: Output - }], removedCB: [{ - type: Output - }], resizeCB: [{ - type: Output - }], resizeStartCB: [{ - type: Output - }], resizeStopCB: [{ - type: Output - }] } }); -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -export function gsCreateNgComponents(host, n, add, isGrid) { - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) - return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - const gridItemComp = host.parentElement?._gridItemComp; - if (!gridItemComp) - return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = gridItemComp.childWidget?.container || gridItemComp.container; - const gridRef = container?.createComponent(GridstackComponent); - const grid = gridRef?.instance; - if (!grid) - return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } - else { - const gridComp = host._gridComp; - const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent); - const gridItem = gridItemRef?.instance; - if (!gridItem) - return; - gridItem.ref = gridItemRef; - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - const childWidget = gridItem.container?.createComponent(type)?.instance; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - }; - const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { - if (entry.isIntersecting) { - n.visibleObservable?.disconnect(); - delete n.visibleObservable; - createComp(); - } - }); - window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes - } - } - else - createComp(); - } - return gridItem.el; - } - } - else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = n.el?._gridComp; - if (grid?.ref) - grid.ref.destroy(); - else - grid?.ngOnDestroy(); - } - else { - const gridItem = n.el?._gridItemComp; - if (gridItem?.ref) - gridItem.ref.destroy(); - else - gridItem?.ngOnDestroy(); - } - } - return; -} -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -export function gsSaveAdditionalNgInfo(n, w) { - const gridItem = n.el?._gridItemComp; - if (gridItem) { - const input = gridItem.childWidget?.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = n.el?._gridComp; - if (grid) { - //.... save any custom data - } -} -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -export function gsUpdateNgComponents(n) { - const w = n; - const gridItem = n.el?._gridItemComp; - if (gridItem?.childWidget && w.input) - gridItem.childWidget.deserialize(w); -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQ2UsU0FBUyxFQUFFLGVBQWUsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUMxRCxNQUFNLEVBQW1CLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFDaEcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBd0MsU0FBUyxFQUFvRCxNQUFNLFdBQVcsQ0FBQztBQUk5SCxPQUFPLEVBQTJCLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBa0M3Rjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFrQkgsTUFBTSxPQUFPLGtCQUFrQjtJQXVLN0IsWUFBK0IsVUFBMkM7UUFBM0MsZUFBVSxHQUFWLFVBQVUsQ0FBaUM7UUFySDFFOzs7Ozs7Ozs7Ozs7O1dBYUc7UUFFSCxpREFBaUQ7UUFDaEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdkQsdUNBQXVDO1FBQ3RCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXhELG9DQUFvQztRQUNuQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUV6RCw0Q0FBNEM7UUFDM0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFFeEQsc0NBQXNDO1FBQ3JCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUU3RCxxQ0FBcUM7UUFDcEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFFNUQscUNBQXFDO1FBQ3BCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRTNELG1DQUFt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SSxFQUFFO1FBQ1IsMkJBQTJCO0tBQzVCO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLENBQWtCO0lBQ3JELE1BQU0sQ0FBQyxHQUFzQixDQUFDLENBQUM7SUFDL0IsTUFBTSxRQUFRLEdBQUksQ0FBQyxDQUFDLEVBQThCLEVBQUUsYUFBYSxDQUFDO0lBQ2xFLElBQUksUUFBUSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSztRQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGdyaWRzdGFjay5jb21wb25lbnQudHMgMTIuMy4zXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LFxuICAgIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVHlwZSwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCByZWZsZWN0Q29tcG9uZW50VHlwZSwgQ29tcG9uZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEdyaWRIVE1MRWxlbWVudCwgR3JpZEl0ZW1IVE1MRWxlbWVudCwgR3JpZFN0YWNrLCBHcmlkU3RhY2tOb2RlLCBHcmlkU3RhY2tPcHRpb25zLCBHcmlkU3RhY2tXaWRnZXQgfSBmcm9tICdncmlkc3RhY2snO1xuXG5pbXBvcnQgeyBOZ0dyaWRTdGFja05vZGUsIE5nR3JpZFN0YWNrV2lkZ2V0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBCYXNlV2lkZ2V0IH0gZnJvbSAnLi9iYXNlLXdpZGdldCc7XG5pbXBvcnQgeyBHcmlkSXRlbUNvbXBIVE1MRWxlbWVudCwgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50JztcblxuLyoqXG4gKiBFdmVudCBoYW5kbGVyIGNhbGxiYWNrIHNpZ25hdHVyZXMgZm9yIGRpZmZlcmVudCBHcmlkU3RhY2sgZXZlbnRzLlxuICogVGhlc2UgdHlwZXMgZGVmaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgZGF0YSBwYXNzZWQgdG8gQW5ndWxhciBldmVudCBlbWl0dGVycy5cbiAqL1xuXG4vKiogQ2FsbGJhY2sgZm9yIGdlbmVyYWwgZXZlbnRzIChlbmFibGUsIGRpc2FibGUsIGV0Yy4pICovXG5leHBvcnQgdHlwZSBldmVudENCID0ge2V2ZW50OiBFdmVudH07XG5cbi8qKiBDYWxsYmFjayBmb3IgZWxlbWVudC1zcGVjaWZpYyBldmVudHMgKHJlc2l6ZSwgZHJhZywgZXRjLikgKi9cbmV4cG9ydCB0eXBlIGVsZW1lbnRDQiA9IHtldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50fTtcblxuLyoqIENhbGxiYWNrIGZvciBldmVudHMgYWZmZWN0aW5nIG11bHRpcGxlIG5vZGVzIChjaGFuZ2UsIGV0Yy4pICovXG5leHBvcnQgdHlwZSBub2Rlc0NCID0ge2V2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXX07XG5cbi8qKiBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgd2l0aCBiZWZvcmUvYWZ0ZXIgbm9kZSBzdGF0ZSAqL1xuZXhwb3J0IHR5cGUgZHJvcHBlZENCID0ge2V2ZW50OiBFdmVudCwgcHJldmlvdXNOb2RlOiBHcmlkU3RhY2tOb2RlLCBuZXdOb2RlOiBHcmlkU3RhY2tOb2RlfTtcblxuLyoqXG4gKiBFeHRlbmRlZCBIVE1MRWxlbWVudCBpbnRlcmZhY2UgZm9yIHRoZSBncmlkIGNvbnRhaW5lci5cbiAqIFN0b3JlcyBhIGJhY2stcmVmZXJlbmNlIHRvIHRoZSBBbmd1bGFyIGNvbXBvbmVudCBmb3IgaW50ZWdyYXRpb24gcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZENvbXBIVE1MRWxlbWVudCBleHRlbmRzIEdyaWRIVE1MRWxlbWVudCB7XG4gIC8qKiBCYWNrLXJlZmVyZW5jZSB0byB0aGUgQW5ndWxhciBHcmlkU3RhY2sgY29tcG9uZW50ICovXG4gIF9ncmlkQ29tcD86IEdyaWRzdGFja0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBNYXBwaW5nIG9mIHNlbGVjdG9yIHN0cmluZ3MgdG8gQW5ndWxhciBjb21wb25lbnQgdHlwZXMuXG4gKiBVc2VkIGZvciBkeW5hbWljIGNvbXBvbmVudCBjcmVhdGlvbiBiYXNlZCBvbiB3aWRnZXQgc2VsZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBTZWxlY3RvclRvVHlwZSA9IHtba2V5OiBzdHJpbmddOiBUeXBlPE9iamVjdD59O1xuXG4vKipcbiAqIEFuZ3VsYXIgY29tcG9uZW50IHdyYXBwZXIgZm9yIEdyaWRTdGFjay5cbiAqIFxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgQW5ndWxhciBpbnRlZ3JhdGlvbiBmb3IgR3JpZFN0YWNrIGdyaWRzLCBoYW5kbGluZzpcbiAqIC0gR3JpZCBpbml0aWFsaXphdGlvbiBhbmQgbGlmZWN5Y2xlXG4gKiAtIER5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uIGFuZCBtYW5hZ2VtZW50XG4gKiAtIEV2ZW50IGJpbmRpbmcgYW5kIGVtaXNzaW9uXG4gKiAtIEludGVncmF0aW9uIHdpdGggQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiBcbiAqIFVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgZm9yIGluZGl2aWR1YWwgZ3JpZCBpdGVtcy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxncmlkc3RhY2sgW29wdGlvbnNdPVwiZ3JpZE9wdGlvbnNcIiAoY2hhbmdlKT1cIm9uR3JpZENoYW5nZSgkZXZlbnQpXCI+XG4gKiAgIDxkaXYgZW1wdHktY29udGVudD5EcmFnIHdpZGdldHMgaGVyZTwvZGl2PlxuICogPC9ncmlkc3RhY2s+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3JpZHN0YWNrJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIGNvbnRlbnQgdG8gc2hvdyB3aGVuIHdoZW4gZ3JpZCBpcyBlbXB0eSwgbGlrZSBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGFkZCB3aWRnZXRzIC0tPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltlbXB0eS1jb250ZW50XVwiICpuZ0lmPVwiaXNFbXB0eVwiPjwvbmctY29udGVudD5cbiAgICA8IS0tIHdoZXJlIGR5bmFtaWMgaXRlbXMgZ28gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNjb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8IS0tIHdoZXJlIHRlbXBsYXRlIGl0ZW1zIGdvIC0tPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAgYF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmXVxuICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwgLy8gSUZGIHlvdSB3YW50IHRvIG9wdGltaXplIGFuZCBjb250cm9sIHdoZW4gQ2hhbmdlRGV0ZWN0aW9uIG5lZWRzIHRvIGhhcHBlbi4uLlxufSlcbmV4cG9ydCBjbGFzcyBHcmlkc3RhY2tDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgdGVtcGxhdGUtYmFzZWQgZ3JpZCBpdGVtcyAobm90IHJlY29tbWVuZGVkIGFwcHJvYWNoKS5cbiAgICogVXNlZCB0byBzeW5jIGJldHdlZW4gRE9NIGFuZCBHcmlkU3RhY2sgaW50ZXJuYWxzIHdoZW4gaXRlbXMgYXJlIGRlZmluZWQgaW4gdGVtcGxhdGVzLlxuICAgKiBQcmVmZXIgZHluYW1pYyBjb21wb25lbnQgY3JlYXRpb24gaW5zdGVhZC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oR3JpZHN0YWNrSXRlbUNvbXBvbmVudCkgcHVibGljIGdyaWRzdGFja0l0ZW1zPzogUXVlcnlMaXN0PEdyaWRzdGFja0l0ZW1Db21wb25lbnQ+O1xuICAvKipcbiAgICogQ29udGFpbmVyIGZvciBkeW5hbWljIGNvbXBvbmVudCBjcmVhdGlvbiAocmVjb21tZW5kZWQgYXBwcm9hY2gpLlxuICAgKiBVc2VkIHRvIGFwcGVuZCBncmlkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgYXQgcnVudGltZS5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlfSkgcHVibGljIGNvbnRhaW5lcj86IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEdyaWQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBDYW4gYmUgc2V0IGJlZm9yZSBncmlkIGluaXRpYWxpemF0aW9uIG9yIHVwZGF0ZWQgYWZ0ZXIgZ3JpZCBpcyBjcmVhdGVkLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBncmlkT3B0aW9uczogR3JpZFN0YWNrT3B0aW9ucyA9IHtcbiAgICogICBjb2x1bW46IDEyLFxuICAgKiAgIGNlbGxIZWlnaHQ6ICdhdXRvJyxcbiAgICogICBhbmltYXRlOiB0cnVlXG4gICAqIH07XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNldCBvcHRpb25zKG86IEdyaWRTdGFja09wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5fZ3JpZCkge1xuICAgICAgdGhpcy5fZ3JpZC51cGRhdGVPcHRpb25zKG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcHRpb25zID0gbztcbiAgICB9XG4gIH1cbiAgLyoqIEdldCB0aGUgY3VycmVudCBydW5uaW5nIGdyaWQgb3B0aW9ucyAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogR3JpZFN0YWNrT3B0aW9ucyB7IHJldHVybiB0aGlzLl9ncmlkPy5vcHRzIHx8IHRoaXMuX29wdGlvbnMgfHwge307IH1cblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBlbXB0eSBjb250ZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqIFNldCB0byB0cnVlIHRvIHNob3cgbmctY29udGVudCB3aXRoICdlbXB0eS1jb250ZW50JyBzZWxlY3RvciB3aGVuIGdyaWQgaGFzIG5vIGl0ZW1zLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgaHRtbFxuICAgKiA8Z3JpZHN0YWNrIFtpc0VtcHR5XT1cImdyaWRJdGVtcy5sZW5ndGggPT09IDBcIj5cbiAgICogICA8ZGl2IGVtcHR5LWNvbnRlbnQ+RHJhZyB3aWRnZXRzIGhlcmUgdG8gZ2V0IHN0YXJ0ZWQ8L2Rpdj5cbiAgICogPC9ncmlkc3RhY2s+XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGlzRW1wdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHcmlkU3RhY2sgZXZlbnQgZW1pdHRlcnMgZm9yIEFuZ3VsYXIgaW50ZWdyYXRpb24uXG4gICAqIFxuICAgKiBUaGVzZSBwcm92aWRlIEFuZ3VsYXItc3R5bGUgZXZlbnQgaGFuZGxpbmcgZm9yIEdyaWRTdGFjayBldmVudHMuXG4gICAqIEFsdGVybmF0aXZlbHksIHVzZSBgdGhpcy5ncmlkLm9uKCdldmVudDEgZXZlbnQyJywgY2FsbGJhY2spYCBmb3IgbXVsdGlwbGUgZXZlbnRzLlxuICAgKiBcbiAgICogTm90ZTogJ0NCJyBzdWZmaXggcHJldmVudHMgY29uZmxpY3RzIHdpdGggbmF0aXZlIERPTSBldmVudHMuXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxncmlkc3RhY2sgKGNoYW5nZUNCKT1cIm9uR3JpZENoYW5nZSgkZXZlbnQpXCIgKGRyb3BwZWRDQik9XCJvbkl0ZW1Ecm9wcGVkKCRldmVudClcIj5cbiAgICogPC9ncmlkc3RhY2s+XG4gICAqIGBgYFxuICAgKi9cbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gd2lkZ2V0cyBhcmUgYWRkZWQgdG8gdGhlIGdyaWQgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBhZGRlZENCID0gbmV3IEV2ZW50RW1pdHRlcjxub2Rlc0NCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiBncmlkIGxheW91dCBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPG5vZGVzQ0I+KCk7XG4gIFxuICAvKiogRW1pdHRlZCB3aGVuIGdyaWQgaXMgZGlzYWJsZWQgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBkaXNhYmxlQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGV2ZW50Q0I+KCk7XG4gIFxuICAvKiogRW1pdHRlZCBkdXJpbmcgd2lkZ2V0IGRyYWcgb3BlcmF0aW9ucyAqL1xuICBAT3V0cHV0KCkgcHVibGljIGRyYWdDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiB3aWRnZXQgZHJhZyBzdGFydHMgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBkcmFnU3RhcnRDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiB3aWRnZXQgZHJhZyBzdG9wcyAqL1xuICBAT3V0cHV0KCkgcHVibGljIGRyYWdTdG9wQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gd2lkZ2V0IGlzIGRyb3BwZWQgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBkcm9wcGVkQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGRyb3BwZWRDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gZ3JpZCBpcyBlbmFibGVkICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgZW5hYmxlQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGV2ZW50Q0I+KCk7XG4gIFxuICAvKiogRW1pdHRlZCB3aGVuIHdpZGdldHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZ3JpZCAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlbW92ZWRDQiA9IG5ldyBFdmVudEVtaXR0ZXI8bm9kZXNDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIGR1cmluZyB3aWRnZXQgcmVzaXplIG9wZXJhdGlvbnMgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZXNpemVDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiB3aWRnZXQgcmVzaXplIHN0YXJ0cyAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlc2l6ZVN0YXJ0Q0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gd2lkZ2V0IHJlc2l6ZSBzdG9wcyAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlc2l6ZVN0b3BDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5hdGl2ZSBET00gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGdyaWQtc3BlY2lmaWMgZmllbGRzLlxuICAgKiBUaGlzIGVsZW1lbnQgaGFzIEdyaWRTdGFjayBwcm9wZXJ0aWVzIGF0dGFjaGVkIHRvIGl0LlxuICAgKi9cbiAgcHVibGljIGdldCBlbCgpOiBHcmlkQ29tcEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OyB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBHcmlkU3RhY2sgaW5zdGFuY2UuXG4gICAqIFVzZSB0aGlzIHRvIGFjY2VzcyBHcmlkU3RhY2sgQVBJIG1ldGhvZHMgZGlyZWN0bHkuXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuZ3JpZENvbXBvbmVudC5ncmlkLmFkZFdpZGdldCh7eDogMCwgeTogMCwgdzogMiwgaDogMX0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZXQgZ3JpZCgpOiBHcmlkU3RhY2sgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZ3JpZDsgfVxuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgcmVmZXJlbmNlIGZvciBkeW5hbWljIGNvbXBvbmVudCByZW1vdmFsLlxuICAgKiBVc2VkIGludGVybmFsbHkgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBjcmVhdGVkIGR5bmFtaWNhbGx5LlxuICAgKi9cbiAgcHVibGljIHJlZjogQ29tcG9uZW50UmVmPEdyaWRzdGFja0NvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgY29tcG9uZW50IHNlbGVjdG9ycyB0byB0aGVpciB0eXBlcyBmb3IgZHluYW1pYyBjcmVhdGlvbi5cbiAgICogXG4gICAqIFRoaXMgZW5hYmxlcyBkeW5hbWljIGNvbXBvbmVudCBpbnN0YW50aWF0aW9uIGZyb20gc3RyaW5nIHNlbGVjdG9ycy5cbiAgICogQW5ndWxhciBkb2Vzbid0IHByb3ZpZGUgcHVibGljIGFjY2VzcyB0byB0aGlzIG1hcHBpbmcsIHNvIHdlIG1haW50YWluIG91ciBvd24uXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEdyaWRzdGFja0NvbXBvbmVudC5hZGRDb21wb25lbnRUb1NlbGVjdG9yVHlwZShbTXlXaWRnZXRDb21wb25lbnRdKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlbGVjdG9yVG9UeXBlOiBTZWxlY3RvclRvVHlwZSA9IHt9O1xuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0IG9mIEFuZ3VsYXIgY29tcG9uZW50cyBmb3IgZHluYW1pYyBjcmVhdGlvbi5cbiAgICogXG4gICAqIEBwYXJhbSB0eXBlTGlzdCBBcnJheSBvZiBjb21wb25lbnQgdHlwZXMgdG8gcmVnaXN0ZXJcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogR3JpZHN0YWNrQ29tcG9uZW50LmFkZENvbXBvbmVudFRvU2VsZWN0b3JUeXBlKFtcbiAgICogICBNeVdpZGdldENvbXBvbmVudCxcbiAgICogICBBbm90aGVyV2lkZ2V0Q29tcG9uZW50XG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWRkQ29tcG9uZW50VG9TZWxlY3RvclR5cGUodHlwZUxpc3Q6IEFycmF5PFR5cGU8T2JqZWN0Pj4pIHtcbiAgICB0eXBlTGlzdC5mb3JFYWNoKHR5cGUgPT4gR3JpZHN0YWNrQ29tcG9uZW50LnNlbGVjdG9yVG9UeXBlWyBHcmlkc3RhY2tDb21wb25lbnQuZ2V0U2VsZWN0b3IodHlwZSkgXSA9IHR5cGUpO1xuICB9XG4gIC8qKlxuICAgKiBFeHRyYWN0IHRoZSBzZWxlY3RvciBzdHJpbmcgZnJvbSBhbiBBbmd1bGFyIGNvbXBvbmVudCB0eXBlLlxuICAgKiBcbiAgICogQHBhcmFtIHR5cGUgVGhlIGNvbXBvbmVudCB0eXBlIHRvIGdldCBzZWxlY3RvciBmcm9tXG4gICAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQncyBzZWxlY3RvciBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U2VsZWN0b3IodHlwZTogVHlwZTxPYmplY3Q+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVmbGVjdENvbXBvbmVudFR5cGUodHlwZSkhLnNlbGVjdG9yO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vcHRpb25zPzogR3JpZFN0YWNrT3B0aW9ucztcbiAgcHJvdGVjdGVkIF9ncmlkPzogR3JpZFN0YWNrO1xuICBwcm90ZWN0ZWQgX3N1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgbG9hZGVkPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxHcmlkQ29tcEhUTUxFbGVtZW50Pikge1xuICAgIC8vIHNldCBnbG9iYWxseSBvdXIgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmlnaHQgd2lkZ2V0IHR5cGVcbiAgICBpZiAoIUdyaWRTdGFjay5hZGRSZW1vdmVDQikge1xuICAgICAgR3JpZFN0YWNrLmFkZFJlbW92ZUNCID0gZ3NDcmVhdGVOZ0NvbXBvbmVudHM7XG4gICAgfVxuICAgIGlmICghR3JpZFN0YWNrLnNhdmVDQikge1xuICAgICAgR3JpZFN0YWNrLnNhdmVDQiA9IGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm87XG4gICAgfVxuICAgIGlmICghR3JpZFN0YWNrLnVwZGF0ZUNCKSB7XG4gICAgICBHcmlkU3RhY2sudXBkYXRlQ0IgPSBnc1VwZGF0ZU5nQ29tcG9uZW50cztcbiAgICB9XG4gICAgdGhpcy5lbC5fZ3JpZENvbXAgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGluaXQgb3Vyc2VsZiBiZWZvcmUgYW55IHRlbXBsYXRlIGNoaWxkcmVuIGFyZSBjcmVhdGVkIHNpbmNlIHdlIHRyYWNrIHRoZW0gYmVsb3cgYW55d2F5IC0gbm8gbmVlZCB0byBkb3VibGUgY3JlYXRlK3VwZGF0ZSB3aWRnZXRzXG4gICAgdGhpcy5sb2FkZWQgPSAhIXRoaXMub3B0aW9ucz8uY2hpbGRyZW4/Lmxlbmd0aDtcbiAgICB0aGlzLl9ncmlkID0gR3JpZFN0YWNrLmluaXQodGhpcy5fb3B0aW9ucywgdGhpcy5lbCk7XG4gICAgZGVsZXRlIHRoaXMuX29wdGlvbnM7IC8vIEdTIGhhcyBpdCBub3dcblxuICAgIHRoaXMuY2hlY2tFbXB0eSgpO1xuICB9XG5cbiAgLyoqIHdhaXQgdW50aWwgYWZ0ZXIgYWxsIERPTSBpcyByZWFkeSB0byBpbml0IGdyaWRzdGFjayBjaGlsZHJlbiAoYWZ0ZXIgYW5ndWxhciBuZ0ZvciBhbmQgc3ViLWNvbXBvbmVudHMgcnVuIGZpcnN0KSAqL1xuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIC8vIHRyYWNrIHdoZW5ldmVyIHRoZSBjaGlsZHJlbiBsaXN0IGNoYW5nZXMgYW5kIHVwZGF0ZSB0aGUgbGF5b3V0Li4uXG4gICAgdGhpcy5fc3ViID0gdGhpcy5ncmlkc3RhY2tJdGVtcz8uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVBbGwoKSk7XG4gICAgLy8gLi4uYW5kIGRvIHRoaXMgb25jZSBhdCBsZWFzdCB1bmxlc3Mgd2UgbG9hZGVkIGNoaWxkcmVuIGFscmVhZHlcbiAgICBpZiAoIXRoaXMubG9hZGVkKSB0aGlzLnVwZGF0ZUFsbCgpO1xuICAgIHRoaXMuaG9va0V2ZW50cyh0aGlzLmdyaWQpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5ob29rRXZlbnRzKHRoaXMuX2dyaWQpO1xuICAgIHRoaXMuX3N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9ncmlkPy5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuX2dyaWQ7XG4gICAgZGVsZXRlIHRoaXMuZWwuX2dyaWRDb21wO1xuICAgIGRlbGV0ZSB0aGlzLmNvbnRhaW5lcjtcbiAgICBkZWxldGUgdGhpcy5yZWY7XG4gIH1cblxuICAvKipcbiAgICogY2FsbGVkIHdoZW4gdGhlIFRFTVBMQVRFIChub3QgcmVjb21tZW5kZWQpIGxpc3Qgb2YgaXRlbXMgY2hhbmdlcyAtIGdldCBhIGxpc3Qgb2Ygbm9kZXMgYW5kXG4gICAqIHVwZGF0ZSB0aGUgbGF5b3V0IGFjY29yZGluZ2x5ICh3aGljaCB3aWxsIHRha2UgY2FyZSBvZiBhZGRpbmcvcmVtb3ZpbmcgaXRlbXMgY2hhbmdlZCBieSBBbmd1bGFyKVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFsbCgpIHtcbiAgICBpZiAoIXRoaXMuZ3JpZCkgcmV0dXJuO1xuICAgIGNvbnN0IGxheW91dDogR3JpZFN0YWNrV2lkZ2V0W10gPSBbXTtcbiAgICB0aGlzLmdyaWRzdGFja0l0ZW1zPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGF5b3V0LnB1c2goaXRlbS5vcHRpb25zKTtcbiAgICAgIGl0ZW0uY2xlYXJPcHRpb25zKCk7XG4gICAgfSk7XG4gICAgdGhpcy5ncmlkLmxvYWQobGF5b3V0KTsgLy8gZWZmaWNpZW50IHRoYXQgZG9lcyBkaWZmcyBvbmx5XG4gIH1cblxuICAvKiogY2hlY2sgaWYgdGhlIGdyaWQgaXMgZW1wdHksIGlmIHNvIHNob3cgYWx0ZXJuYXRpdmUgY29udGVudCAqL1xuICBwdWJsaWMgY2hlY2tFbXB0eSgpIHtcbiAgICBpZiAoIXRoaXMuZ3JpZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNFbXB0eSA9ICF0aGlzLmdyaWQuZW5naW5lLm5vZGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBnZXQgYWxsIGtub3duIGV2ZW50cyBhcyBlYXN5IHRvIHVzZSBPdXRwdXRzIGZvciBjb252ZW5pZW5jZSAqL1xuICBwcm90ZWN0ZWQgaG9va0V2ZW50cyhncmlkPzogR3JpZFN0YWNrKSB7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgLy8gbmVzdGVkIGdyaWRzIGRvbid0IGhhdmUgZXZlbnRzIGluIHYxMi4xKyBzbyBza2lwXG4gICAgaWYgKGdyaWQucGFyZW50R3JpZE5vZGUpIHJldHVybjtcbiAgICBncmlkXG4gICAgICAub24oJ2FkZGVkJywgKGV2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXSkgPT4ge1xuICAgICAgICBjb25zdCBncmlkQ29tcCA9IChub2Rlc1swXS5ncmlkPy5lbCBhcyBHcmlkQ29tcEhUTUxFbGVtZW50KS5fZ3JpZENvbXAgfHwgdGhpcztcbiAgICAgICAgZ3JpZENvbXAuY2hlY2tFbXB0eSgpO1xuICAgICAgICB0aGlzLmFkZGVkQ0IuZW1pdCh7ZXZlbnQsIG5vZGVzfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdjaGFuZ2UnLCAoZXZlbnQ6IEV2ZW50LCBub2RlczogR3JpZFN0YWNrTm9kZVtdKSA9PiB0aGlzLmNoYW5nZUNCLmVtaXQoe2V2ZW50LCBub2Rlc30pKVxuICAgICAgLm9uKCdkaXNhYmxlJywgKGV2ZW50OiBFdmVudCkgPT4gdGhpcy5kaXNhYmxlQ0IuZW1pdCh7ZXZlbnR9KSlcbiAgICAgIC5vbignZHJhZycsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLmRyYWdDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgICAgIC5vbignZHJhZ3N0YXJ0JywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMuZHJhZ1N0YXJ0Q0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgICAub24oJ2RyYWdzdG9wJywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMuZHJhZ1N0b3BDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgICAgIC5vbignZHJvcHBlZCcsIChldmVudDogRXZlbnQsIHByZXZpb3VzTm9kZTogR3JpZFN0YWNrTm9kZSwgbmV3Tm9kZTogR3JpZFN0YWNrTm9kZSkgPT4gdGhpcy5kcm9wcGVkQ0IuZW1pdCh7ZXZlbnQsIHByZXZpb3VzTm9kZSwgbmV3Tm9kZX0pKVxuICAgICAgLm9uKCdlbmFibGUnLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLmVuYWJsZUNCLmVtaXQoe2V2ZW50fSkpXG4gICAgICAub24oJ3JlbW92ZWQnLCAoZXZlbnQ6IEV2ZW50LCBub2RlczogR3JpZFN0YWNrTm9kZVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyaWRDb21wID0gKG5vZGVzWzBdLmdyaWQ/LmVsIGFzIEdyaWRDb21wSFRNTEVsZW1lbnQpLl9ncmlkQ29tcCB8fCB0aGlzO1xuICAgICAgICBncmlkQ29tcC5jaGVja0VtcHR5KCk7XG4gICAgICAgIHRoaXMucmVtb3ZlZENCLmVtaXQoe2V2ZW50LCBub2Rlc30pO1xuICAgICAgfSlcbiAgICAgIC5vbigncmVzaXplJywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMucmVzaXplQ0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgICAub24oJ3Jlc2l6ZXN0YXJ0JywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMucmVzaXplU3RhcnRDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgICAgIC5vbigncmVzaXplc3RvcCcsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLnJlc2l6ZVN0b3BDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgfVxuXG4gIHByb3RlY3RlZCB1bmhvb2tFdmVudHMoZ3JpZD86IEdyaWRTdGFjaykge1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIC8vIG5lc3RlZCBncmlkcyBkb24ndCBoYXZlIGV2ZW50cyBpbiB2MTIuMSsgc28gc2tpcFxuICAgIGlmIChncmlkLnBhcmVudEdyaWROb2RlKSByZXR1cm47XG4gICAgZ3JpZC5vZmYoJ2FkZGVkIGNoYW5nZSBkaXNhYmxlIGRyYWcgZHJhZ3N0YXJ0IGRyYWdzdG9wIGRyb3BwZWQgZW5hYmxlIHJlbW92ZWQgcmVzaXplIHJlc2l6ZXN0YXJ0IHJlc2l6ZXN0b3AnKTtcbiAgfVxufVxuXG4vKipcbiAqIGNhbiBiZSB1c2VkIHdoZW4gYSBuZXcgaXRlbSBuZWVkcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3ZSBkbyBhcyBhIEFuZ3VsYXIgY29tcG9uZW50LCBvciBkZWxldGVkIChza2lwKVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdzQ3JlYXRlTmdDb21wb25lbnRzKGhvc3Q6IEdyaWRDb21wSFRNTEVsZW1lbnQgfCBIVE1MRWxlbWVudCwgbjogTmdHcmlkU3RhY2tOb2RlLCBhZGQ6IGJvb2xlYW4sIGlzR3JpZDogYm9vbGVhbik6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFkZCkge1xuICAgIC8vXG4gICAgLy8gY3JlYXRlIHRoZSBjb21wb25lbnQgZHluYW1pY2FsbHkgLSBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2RvY3MvdHMvbGF0ZXN0L2Nvb2tib29rL2R5bmFtaWMtY29tcG9uZW50LWxvYWRlci5odG1sXG4gICAgLy9cbiAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICBpZiAoaXNHcmlkKSB7XG4gICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyB0byBjcmVhdGUgbmcgY29tcG9uZW50IGluc2lkZSByZWd1bGFyIERpdi4gbmVlZCB0byBhY2Nlc3MgYXBwIGluamVjdG9ycy4uLlxuICAgICAgLy8gaWYgKCFjb250YWluZXIpIHtcbiAgICAgIC8vICAgY29uc3QgaG9zdEVsZW1lbnQ6IEVsZW1lbnQgPSBob3N0O1xuICAgICAgLy8gICBjb25zdCBlbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yO1xuICAgICAgLy8gICBncmlkID0gY3JlYXRlQ29tcG9uZW50KEdyaWRzdGFja0NvbXBvbmVudCwge2Vudmlyb25tZW50SW5qZWN0b3IsIGhvc3RFbGVtZW50fSk/Lmluc3RhbmNlO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBncmlkSXRlbUNvbXAgPSAoaG9zdC5wYXJlbnRFbGVtZW50IGFzIEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50KT8uX2dyaWRJdGVtQ29tcDtcbiAgICAgIGlmICghZ3JpZEl0ZW1Db21wKSByZXR1cm47XG4gICAgICAvLyBjaGVjayBpZiBncmlkSXRlbSBoYXMgYSBjaGlsZCBjb21wb25lbnQgd2l0aCAnY29udGFpbmVyJyBleHBvc2VkIHRvIGNyZWF0ZSB1bmRlci4uXG4gICAgICBjb25zdCBjb250YWluZXIgPSAoZ3JpZEl0ZW1Db21wLmNoaWxkV2lkZ2V0IGFzIGFueSk/LmNvbnRhaW5lciB8fCBncmlkSXRlbUNvbXAuY29udGFpbmVyO1xuICAgICAgY29uc3QgZ3JpZFJlZiA9IGNvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KEdyaWRzdGFja0NvbXBvbmVudCk7XG4gICAgICBjb25zdCBncmlkID0gZ3JpZFJlZj8uaW5zdGFuY2U7XG4gICAgICBpZiAoIWdyaWQpIHJldHVybjtcbiAgICAgIGdyaWQucmVmID0gZ3JpZFJlZjtcbiAgICAgIGdyaWQub3B0aW9ucyA9IG47XG4gICAgICByZXR1cm4gZ3JpZC5lbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JpZENvbXAgPSAoaG9zdCBhcyBHcmlkQ29tcEhUTUxFbGVtZW50KS5fZ3JpZENvbXA7XG4gICAgICBjb25zdCBncmlkSXRlbVJlZiA9IGdyaWRDb21wPy5jb250YWluZXI/LmNyZWF0ZUNvbXBvbmVudChHcmlkc3RhY2tJdGVtQ29tcG9uZW50KTtcbiAgICAgIGNvbnN0IGdyaWRJdGVtID0gZ3JpZEl0ZW1SZWY/Lmluc3RhbmNlO1xuICAgICAgaWYgKCFncmlkSXRlbSkgcmV0dXJuO1xuICAgICAgZ3JpZEl0ZW0ucmVmID0gZ3JpZEl0ZW1SZWZcblxuICAgICAgLy8gZGVmaW5lIHdoYXQgdHlwZSBvZiBjb21wb25lbnQgdG8gY3JlYXRlIGFzIGNoaWxkLCBPUiB5b3UgY2FuIGRvIGl0IEdyaWRzdGFja0l0ZW1Db21wb25lbnQgdGVtcGxhdGUsIGJ1dCB0aGlzIGlzIG1vcmUgZ2VuZXJpY1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBuLnNlbGVjdG9yO1xuICAgICAgY29uc3QgdHlwZSA9IHNlbGVjdG9yID8gR3JpZHN0YWNrQ29tcG9uZW50LnNlbGVjdG9yVG9UeXBlW3NlbGVjdG9yXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIC8vIHNoYXJlZCBjb2RlIHRvIGNyZWF0ZSBvdXIgc2VsZWN0b3IgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGNyZWF0ZUNvbXAgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRXaWRnZXQgPSBncmlkSXRlbS5jb250YWluZXI/LmNyZWF0ZUNvbXBvbmVudCh0eXBlKT8uaW5zdGFuY2UgYXMgQmFzZVdpZGdldDtcbiAgICAgICAgICAvLyBpZiBwcm9wZXIgQmFzZVdpZGdldCBzdWJjbGFzcywgc2F2ZSBpdCBhbmQgbG9hZCBhZGRpdGlvbmFsIGRhdGFcbiAgICAgICAgICBpZiAoY2hpbGRXaWRnZXQgJiYgdHlwZW9mIGNoaWxkV2lkZ2V0LnNlcmlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY2hpbGRXaWRnZXQuZGVzZXJpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGdyaWRJdGVtLmNoaWxkV2lkZ2V0ID0gY2hpbGRXaWRnZXQ7XG4gICAgICAgICAgICBjaGlsZFdpZGdldC5kZXNlcmlhbGl6ZShuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXp5TG9hZCA9IG4ubGF6eUxvYWQgfHwgbi5ncmlkPy5vcHRzPy5sYXp5TG9hZCAmJiBuLmxhenlMb2FkICE9PSBmYWxzZTtcbiAgICAgICAgaWYgKGxhenlMb2FkKSB7XG4gICAgICAgICAgaWYgKCFuLnZpc2libGVPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICBuLnZpc2libGVPYnNlcnZhYmxlID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChbZW50cnldKSA9PiB7IGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICBuLnZpc2libGVPYnNlcnZhYmxlPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgIGRlbGV0ZSBuLnZpc2libGVPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICBjcmVhdGVDb21wKCk7XG4gICAgICAgICAgICB9fSk7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBuLnZpc2libGVPYnNlcnZhYmxlPy5vYnNlcnZlKGdyaWRJdGVtLmVsKSk7IC8vIHdhaXQgdW50aWwgY2FsbGVlIHNldHMgcG9zaXRpb24gYXR0cmlidXRlc1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGNyZWF0ZUNvbXAoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGdyaWRJdGVtLmVsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vIFJFTU9WRSAtIGhhdmUgdG8gY2FsbCBDb21wb25lbnRSZWY6ZGVzdHJveSgpIGZvciBkeW5hbWljIG9iamVjdHMgdG8gY29ycmVjdGx5IHJlbW92ZSB0aGVtc2VsdmVzXG4gICAgLy8gTm90ZTogdGhpcyB3aWxsIGRlc3Ryb3kgYWxsIGNoaWxkcmVuIGR5bmFtaWMgY29tcG9uZW50cyBhcyB3ZWxsOiBncmlkSXRlbSAtPiBjaGlsZFdpZGdldFxuICAgIC8vXG4gICAgaWYgKGlzR3JpZCkge1xuICAgICAgY29uc3QgZ3JpZCA9IChuLmVsIGFzIEdyaWRDb21wSFRNTEVsZW1lbnQpPy5fZ3JpZENvbXA7XG4gICAgICBpZiAoZ3JpZD8ucmVmKSBncmlkLnJlZi5kZXN0cm95KCk7XG4gICAgICBlbHNlIGdyaWQ/Lm5nT25EZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyaWRJdGVtID0gKG4uZWwgYXMgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQpPy5fZ3JpZEl0ZW1Db21wO1xuICAgICAgaWYgKGdyaWRJdGVtPy5yZWYpIGdyaWRJdGVtLnJlZi5kZXN0cm95KCk7XG4gICAgICBlbHNlIGdyaWRJdGVtPy5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogY2FsbGVkIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGdyaWQgLSBjaGVjayBpZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHNhdmVkLlxuICogTm90ZTogc2luY2UgdGhpcyBpcyBvcHRpb25zIG1pbnVzIGdyaWRzdGFjayBwcm90ZWN0ZWQgbWVtYmVycyB1c2luZyBVdGlscy5yZW1vdmVJbnRlcm5hbEZvclNhdmUoKSxcbiAqIHRoaXMgdHlwaWNhbGx5IGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gSG93ZXZlciB5b3VyIGN1c3RvbSBDb21wb25lbnQgQElucHV0KCkgYXJlIG5vdyBzdXBwb3J0ZWRcbiAqIHVzaW5nIEJhc2VXaWRnZXQuc2VyaWFsaXplKClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm8objogTmdHcmlkU3RhY2tOb2RlLCB3OiBOZ0dyaWRTdGFja1dpZGdldCkge1xuICBjb25zdCBncmlkSXRlbSA9IChuLmVsIGFzIEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50KT8uX2dyaWRJdGVtQ29tcDtcbiAgaWYgKGdyaWRJdGVtKSB7XG4gICAgY29uc3QgaW5wdXQgPSBncmlkSXRlbS5jaGlsZFdpZGdldD8uc2VyaWFsaXplKCk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICB3LmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICAvLyBlbHNlIGNoZWNrIGlmIEdyaWRcbiAgY29uc3QgZ3JpZCA9IChuLmVsIGFzIEdyaWRDb21wSFRNTEVsZW1lbnQpPy5fZ3JpZENvbXA7XG4gIGlmIChncmlkKSB7XG4gICAgLy8uLi4uIHNhdmUgYW55IGN1c3RvbSBkYXRhXG4gIH1cbn1cblxuLyoqXG4gKiB0cmFjayB3aGVuIHdpZGdldGEgcmUgdXBkYXRlZCAocmF0aGVyIHRoYW4gY3JlYXRlZCkgdG8gbWFrZSBzdXJlIHdlIGRlLXNlcmlhbGl6ZSB0aGVtIGFzIHdlbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdzVXBkYXRlTmdDb21wb25lbnRzKG46IE5nR3JpZFN0YWNrTm9kZSkge1xuICBjb25zdCB3OiBOZ0dyaWRTdGFja1dpZGdldCA9IG47XG4gIGNvbnN0IGdyaWRJdGVtID0gKG4uZWwgYXMgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQpPy5fZ3JpZEl0ZW1Db21wO1xuICBpZiAoZ3JpZEl0ZW0/LmNoaWxkV2lkZ2V0ICYmIHcuaW5wdXQpIGdyaWRJdGVtLmNoaWxkV2lkZ2V0LmRlc2VyaWFsaXplKHcpO1xufSJdfQ== \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/esm2020/lib/gridstack.module.mjs b/node_modules/gridstack/dist/angular/esm2020/lib/gridstack.module.mjs deleted file mode 100644 index 0068bbd1d..000000000 --- a/node_modules/gridstack/dist/angular/esm2020/lib/gridstack.module.mjs +++ /dev/null @@ -1,53 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { NgModule } from "@angular/core"; -import { GridstackItemComponent } from "./gridstack-item.component"; -import { GridstackComponent } from "./gridstack.component"; -import * as i0 from "@angular/core"; -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -export class GridstackModule { -} -GridstackModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); -GridstackModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent], exports: [GridstackItemComponent, - GridstackComponent] }); -GridstackModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, decorators: [{ - type: NgModule, - args: [{ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], - }] - }] }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUUzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQVdILE1BQU0sT0FBTyxlQUFlOzs0R0FBZixlQUFlOzZHQUFmLGVBQWUsWUFSeEIsc0JBQXNCO1FBQ3RCLGtCQUFrQixhQUdsQixzQkFBc0I7UUFDdEIsa0JBQWtCOzZHQUdULGVBQWUsWUFSeEIsc0JBQXNCO1FBQ3RCLGtCQUFrQjsyRkFPVCxlQUFlO2tCQVYzQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxzQkFBc0I7d0JBQ3RCLGtCQUFrQjtxQkFDbkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3FCQUNuQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBncmlkc3RhY2suY29tcG9uZW50LnRzIDEyLjMuM1xyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQgeyBHcmlkc3RhY2tJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4vZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdyaWRzdGFja0NvbXBvbmVudCB9IGZyb20gXCIuL2dyaWRzdGFjay5jb21wb25lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBAZGVwcmVjYXRlZCBVc2UgR3JpZHN0YWNrQ29tcG9uZW50IGFuZCBHcmlkc3RhY2tJdGVtQ29tcG9uZW50IGFzIHN0YW5kYWxvbmUgY29tcG9uZW50cyBpbnN0ZWFkLlxyXG4gKiBcclxuICogVGhpcyBOZ01vZHVsZSBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXMgbm8gbG9uZ2VyIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaC5cclxuICogSW1wb3J0IGNvbXBvbmVudHMgZGlyZWN0bHkgaW4geW91ciBzdGFuZGFsb25lIGNvbXBvbmVudHMgb3IgdXNlIHRoZSBuZXcgQW5ndWxhciBtb2R1bGUgc3RydWN0dXJlLlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiAvLyBQcmVmZXJyZWQgYXBwcm9hY2ggLSBzdGFuZGFsb25lIGNvbXBvbmVudHNcclxuICogQENvbXBvbmVudCh7XHJcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxyXG4gKiAgIGltcG9ydHM6IFtHcmlkc3RhY2tDb21wb25lbnQsIEdyaWRzdGFja0l0ZW1Db21wb25lbnRdLFxyXG4gKiAgIHRlbXBsYXRlOiAnPGdyaWRzdGFjaz48L2dyaWRzdGFjaz4nXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge31cclxuICogXHJcbiAqIC8vIExlZ2FjeSBhcHByb2FjaCAoZGVwcmVjYXRlZClcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbR3JpZHN0YWNrTW9kdWxlXVxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XHJcbiAqIGBgYFxyXG4gKi9cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbXHJcbiAgICBHcmlkc3RhY2tJdGVtQ29tcG9uZW50LFxyXG4gICAgR3JpZHN0YWNrQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCxcclxuICAgIEdyaWRzdGFja0NvbXBvbmVudCxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JpZHN0YWNrTW9kdWxlIHt9XHJcbiJdfQ== \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/esm2020/lib/types.mjs b/node_modules/gridstack/dist/angular/esm2020/lib/types.mjs deleted file mode 100644 index 0d0bf9f07..000000000 --- a/node_modules/gridstack/dist/angular/esm2020/lib/types.mjs +++ /dev/null @@ -1,6 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ -export {}; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBncmlkc3RhY2staXRlbS5jb21wb25lbnQudHMgMTIuMy4zXHJcbiAqIENvcHlyaWdodCAoYykgMjAyNSBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG5pbXBvcnQgeyBHcmlkU3RhY2tOb2RlLCBHcmlkU3RhY2tPcHRpb25zLCBHcmlkU3RhY2tXaWRnZXQgfSBmcm9tIFwiZ3JpZHN0YWNrXCI7XHJcblxyXG4vKipcclxuICogRXh0ZW5kZWQgR3JpZFN0YWNrV2lkZ2V0IGludGVyZmFjZSBmb3IgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICogQWRkcyBBbmd1bGFyLXNwZWNpZmljIHByb3BlcnRpZXMgZm9yIGR5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBOZ0dyaWRTdGFja1dpZGdldCBleHRlbmRzIEdyaWRTdGFja1dpZGdldCB7XHJcbiAgLyoqIEFuZ3VsYXIgY29tcG9uZW50IHNlbGVjdG9yIGZvciBkeW5hbWljIGNyZWF0aW9uIChlLmcuLCAnbXktd2lkZ2V0JykgKi9cclxuICBzZWxlY3Rvcj86IHN0cmluZztcclxuICAvKiogU2VyaWFsaXplZCBkYXRhIGZvciBjb21wb25lbnQgQElucHV0KCkgcHJvcGVydGllcyAqL1xyXG4gIGlucHV0PzogTmdDb21wSW5wdXRzO1xyXG4gIC8qKiBDb25maWd1cmF0aW9uIGZvciBuZXN0ZWQgc3ViLWdyaWRzICovXHJcbiAgc3ViR3JpZE9wdHM/OiBOZ0dyaWRTdGFja09wdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRlbmRlZCBHcmlkU3RhY2tOb2RlIGludGVyZmFjZSBmb3IgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICogQWRkcyBjb21wb25lbnQgc2VsZWN0b3IgZm9yIGR5bmFtaWMgY29udGVudCBjcmVhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdHcmlkU3RhY2tOb2RlIGV4dGVuZHMgR3JpZFN0YWNrTm9kZSB7XHJcbiAgLyoqIEFuZ3VsYXIgY29tcG9uZW50IHNlbGVjdG9yIGZvciB0aGlzIG5vZGUncyBjb250ZW50ICovXHJcbiAgc2VsZWN0b3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRlbmRlZCBHcmlkU3RhY2tPcHRpb25zIGludGVyZmFjZSBmb3IgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICogU3VwcG9ydHMgQW5ndWxhci1zcGVjaWZpYyB3aWRnZXQgZGVmaW5pdGlvbnMgYW5kIG5lc3RlZCBncmlkcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdHcmlkU3RhY2tPcHRpb25zIGV4dGVuZHMgR3JpZFN0YWNrT3B0aW9ucyB7XHJcbiAgLyoqIEFycmF5IG9mIEFuZ3VsYXIgd2lkZ2V0IGRlZmluaXRpb25zIGZvciBpbml0aWFsIGdyaWQgc2V0dXAgKi9cclxuICBjaGlsZHJlbj86IE5nR3JpZFN0YWNrV2lkZ2V0W107XHJcbiAgLyoqIENvbmZpZ3VyYXRpb24gZm9yIG5lc3RlZCBzdWItZ3JpZHMgKEFuZ3VsYXItYXdhcmUpICovXHJcbiAgc3ViR3JpZE9wdHM/OiBOZ0dyaWRTdGFja09wdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUeXBlIGZvciBjb21wb25lbnQgaW5wdXQgZGF0YSBzZXJpYWxpemF0aW9uLlxyXG4gKiBNYXBzIEBJbnB1dCgpIHByb3BlcnR5IG5hbWVzIHRvIHRoZWlyIHZhbHVlcyBmb3Igd2lkZ2V0IHBlcnNpc3RlbmNlLlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBpbnB1dHM6IE5nQ29tcElucHV0cyA9IHtcclxuICogICB0aXRsZTogJ015IFdpZGdldCcsXHJcbiAqICAgdmFsdWU6IDQyLFxyXG4gKiAgIGNvbmZpZzogeyBlbmFibGVkOiB0cnVlIH1cclxuICogfTtcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBOZ0NvbXBJbnB1dHMgPSB7W2tleTogc3RyaW5nXTogYW55fTtcclxuIl19 \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/fesm2015/gridstack-angular.mjs b/node_modules/gridstack/dist/angular/fesm2015/gridstack-angular.mjs deleted file mode 100644 index 809d509b8..000000000 --- a/node_modules/gridstack/dist/angular/fesm2015/gridstack-angular.mjs +++ /dev/null @@ -1,647 +0,0 @@ -import * as i0 from '@angular/core'; -import { Injectable, ViewContainerRef, Component, ViewChild, Input, EventEmitter, reflectComponentType, ContentChildren, Output, NgModule } from '@angular/core'; -import { NgIf } from '@angular/common'; -import { GridStack } from 'gridstack'; - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Base widget class for GridStack Angular integration. - */ -class BaseWidget { - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize() { return; } - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w) { - // save full description for meta data - this.widgetItem = w; - if (!w) - return; - if (w.input) - Object.assign(this, w.input); - } -} -BaseWidget.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); -BaseWidget.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, decorators: [{ - type: Injectable - }] }); - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -class GridstackItemComponent { - constructor(elementRef) { - this.elementRef = elementRef; - this.el._gridItemComp = this; - } - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val) { - var _a; - const grid = (_a = this.el.gridstackNode) === null || _a === void 0 ? void 0 : _a.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } - else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = Object.assign(Object.assign({}, val), { el: this.el }); - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options() { - return this.el.gridstackNode || this._options || { el: this.el }; - } - /** return the native element that contains grid specific fields as well */ - get el() { return this.elementRef.nativeElement; } - /** clears the initial options now that we've built */ - clearOptions() { - delete this._options; - } - ngOnDestroy() { - this.clearOptions(); - delete this.childWidget; - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} -GridstackItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackItemComponent, isStandalone: true, selector: "gridstack-item", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` -
- - - - - - {{options.content}} -
`, isInline: true, styles: [":host{display:block}\n"] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack-item', template: ` -
- - - - - - {{options.content}} -
`, standalone: true, styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }] } }); - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -class GridstackComponent { - constructor(elementRef) { - this.elementRef = elementRef; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - this.addedCB = new EventEmitter(); - /** Emitted when grid layout changes */ - this.changeCB = new EventEmitter(); - /** Emitted when grid is disabled */ - this.disableCB = new EventEmitter(); - /** Emitted during widget drag operations */ - this.dragCB = new EventEmitter(); - /** Emitted when widget drag starts */ - this.dragStartCB = new EventEmitter(); - /** Emitted when widget drag stops */ - this.dragStopCB = new EventEmitter(); - /** Emitted when widget is dropped */ - this.droppedCB = new EventEmitter(); - /** Emitted when grid is enabled */ - this.enableCB = new EventEmitter(); - /** Emitted when widgets are removed from the grid */ - this.removedCB = new EventEmitter(); - /** Emitted during widget resize operations */ - this.resizeCB = new EventEmitter(); - /** Emitted when widget resize starts */ - this.resizeStartCB = new EventEmitter(); - /** Emitted when widget resize stops */ - this.resizeStopCB = new EventEmitter(); - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o) { - if (this._grid) { - this._grid.updateOptions(o); - } - else { - this._options = o; - } - } - /** Get the current running grid options */ - get options() { var _a; return ((_a = this._grid) === null || _a === void 0 ? void 0 : _a.opts) || this._options || {}; } - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el() { return this.elementRef.nativeElement; } - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid() { return this._grid; } - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList) { - typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type) { - return reflectComponentType(type).selector; - } - ngOnInit() { - var _a, _b; - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.length); - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - this.checkEmpty(); - } - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit() { - var _a; - // track whenever the children list changes and update the layout... - this._sub = (_a = this.gridstackItems) === null || _a === void 0 ? void 0 : _a.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) - this.updateAll(); - this.hookEvents(this.grid); - } - ngOnDestroy() { - var _a, _b; - this.unhookEvents(this._grid); - (_a = this._sub) === null || _a === void 0 ? void 0 : _a.unsubscribe(); - (_b = this._grid) === null || _b === void 0 ? void 0 : _b.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll() { - var _a; - if (!this.grid) - return; - const layout = []; - (_a = this.gridstackItems) === null || _a === void 0 ? void 0 : _a.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - /** check if the grid is empty, if so show alternative content */ - checkEmpty() { - if (!this.grid) - return; - this.isEmpty = !this.grid.engine.nodes.length; - } - /** get all known events as easy to use Outputs for convenience */ - hookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid - .on('added', (event, nodes) => { - var _a; - const gridComp = ((_a = nodes[0].grid) === null || _a === void 0 ? void 0 : _a.el._gridComp) || this; - gridComp.checkEmpty(); - this.addedCB.emit({ event, nodes }); - }) - .on('change', (event, nodes) => this.changeCB.emit({ event, nodes })) - .on('disable', (event) => this.disableCB.emit({ event })) - .on('drag', (event, el) => this.dragCB.emit({ event, el })) - .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el })) - .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el })) - .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode })) - .on('enable', (event) => this.enableCB.emit({ event })) - .on('removed', (event, nodes) => { - var _a; - const gridComp = ((_a = nodes[0].grid) === null || _a === void 0 ? void 0 : _a.el._gridComp) || this; - gridComp.checkEmpty(); - this.removedCB.emit({ event, nodes }); - }) - .on('resize', (event, el) => this.resizeCB.emit({ event, el })) - .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el })) - .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el })); - } - unhookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} -/** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ -GridstackComponent.selectorToType = {}; -GridstackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackComponent, isStandalone: true, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` - - - - - - - `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack', template: ` - - - - - - - `, standalone: true, imports: [NgIf], styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { gridstackItems: [{ - type: ContentChildren, - args: [GridstackItemComponent] - }], container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }], isEmpty: [{ - type: Input - }], addedCB: [{ - type: Output - }], changeCB: [{ - type: Output - }], disableCB: [{ - type: Output - }], dragCB: [{ - type: Output - }], dragStartCB: [{ - type: Output - }], dragStopCB: [{ - type: Output - }], droppedCB: [{ - type: Output - }], enableCB: [{ - type: Output - }], removedCB: [{ - type: Output - }], resizeCB: [{ - type: Output - }], resizeStartCB: [{ - type: Output - }], resizeStopCB: [{ - type: Output - }] } }); -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -function gsCreateNgComponents(host, n, add, isGrid) { - var _a, _b, _c, _d, _e, _f, _g; - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) - return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - const gridItemComp = (_a = host.parentElement) === null || _a === void 0 ? void 0 : _a._gridItemComp; - if (!gridItemComp) - return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = ((_b = gridItemComp.childWidget) === null || _b === void 0 ? void 0 : _b.container) || gridItemComp.container; - const gridRef = container === null || container === void 0 ? void 0 : container.createComponent(GridstackComponent); - const grid = gridRef === null || gridRef === void 0 ? void 0 : gridRef.instance; - if (!grid) - return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } - else { - const gridComp = host._gridComp; - const gridItemRef = (_c = gridComp === null || gridComp === void 0 ? void 0 : gridComp.container) === null || _c === void 0 ? void 0 : _c.createComponent(GridstackItemComponent); - const gridItem = gridItemRef === null || gridItemRef === void 0 ? void 0 : gridItemRef.instance; - if (!gridItem) - return; - gridItem.ref = gridItemRef; - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - var _a, _b; - const childWidget = (_b = (_a = gridItem.container) === null || _a === void 0 ? void 0 : _a.createComponent(type)) === null || _b === void 0 ? void 0 : _b.instance; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - }; - const lazyLoad = n.lazyLoad || ((_e = (_d = n.grid) === null || _d === void 0 ? void 0 : _d.opts) === null || _e === void 0 ? void 0 : _e.lazyLoad) && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { - var _a; - if (entry.isIntersecting) { - (_a = n.visibleObservable) === null || _a === void 0 ? void 0 : _a.disconnect(); - delete n.visibleObservable; - createComp(); - } - }); - window.setTimeout(() => { var _a; return (_a = n.visibleObservable) === null || _a === void 0 ? void 0 : _a.observe(gridItem.el); }); // wait until callee sets position attributes - } - } - else - createComp(); - } - return gridItem.el; - } - } - else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = (_f = n.el) === null || _f === void 0 ? void 0 : _f._gridComp; - if (grid === null || grid === void 0 ? void 0 : grid.ref) - grid.ref.destroy(); - else - grid === null || grid === void 0 ? void 0 : grid.ngOnDestroy(); - } - else { - const gridItem = (_g = n.el) === null || _g === void 0 ? void 0 : _g._gridItemComp; - if (gridItem === null || gridItem === void 0 ? void 0 : gridItem.ref) - gridItem.ref.destroy(); - else - gridItem === null || gridItem === void 0 ? void 0 : gridItem.ngOnDestroy(); - } - } - return; -} -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -function gsSaveAdditionalNgInfo(n, w) { - var _a, _b, _c; - const gridItem = (_a = n.el) === null || _a === void 0 ? void 0 : _a._gridItemComp; - if (gridItem) { - const input = (_b = gridItem.childWidget) === null || _b === void 0 ? void 0 : _b.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = (_c = n.el) === null || _c === void 0 ? void 0 : _c._gridComp; - if (grid) { - //.... save any custom data - } -} -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -function gsUpdateNgComponents(n) { - var _a; - const w = n; - const gridItem = (_a = n.el) === null || _a === void 0 ? void 0 : _a._gridItemComp; - if ((gridItem === null || gridItem === void 0 ? void 0 : gridItem.childWidget) && w.input) - gridItem.childWidget.deserialize(w); -} - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -class GridstackModule { -} -GridstackModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); -GridstackModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent], exports: [GridstackItemComponent, - GridstackComponent] }); -GridstackModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, decorators: [{ - type: NgModule, - args: [{ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], - }] - }] }); - -/* - * Public API Surface of gridstack-angular - */ - -/** - * Generated bundle index. Do not edit. - */ - -export { BaseWidget, GridstackComponent, GridstackItemComponent, GridstackModule, gsCreateNgComponents, gsSaveAdditionalNgInfo, gsUpdateNgComponents }; -//# sourceMappingURL=gridstack-angular.mjs.map diff --git a/node_modules/gridstack/dist/angular/fesm2015/gridstack-angular.mjs.map b/node_modules/gridstack/dist/angular/fesm2015/gridstack-angular.mjs.map deleted file mode 100644 index 308a7890f..000000000 --- a/node_modules/gridstack/dist/angular/fesm2015/gridstack-angular.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gridstack-angular.mjs","sources":["../../../angular/projects/lib/src/lib/base-widget.ts","../../../angular/projects/lib/src/lib/gridstack-item.component.ts","../../../angular/projects/lib/src/lib/gridstack.component.ts","../../../angular/projects/lib/src/lib/gridstack.module.ts","../../../angular/projects/lib/src/index.ts","../../../angular/projects/lib/src/gridstack-angular.ts"],"sourcesContent":["/**\r\n * gridstack-item.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\n/**\r\n * Abstract base class that all custom widgets should extend.\r\n * \r\n * This class provides the interface needed for GridstackItemComponent to:\r\n * - Serialize/deserialize widget data\r\n * - Save/restore widget state\r\n * - Integrate with Angular lifecycle\r\n * \r\n * Extend this class when creating custom widgets for dynamic grids.\r\n * \r\n * @example\r\n * ```typescript\r\n * @Component({\r\n * selector: 'my-custom-widget',\r\n * template: '
{{data}}
'\r\n * })\r\n * export class MyCustomWidget extends BaseWidget {\r\n * @Input() data: string = '';\r\n * \r\n * serialize() {\r\n * return { data: this.data };\r\n * }\r\n * }\r\n * ```\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NgCompInputs, NgGridStackWidget } from './types';\r\n\r\n/**\r\n * Base widget class for GridStack Angular integration.\r\n */\r\n@Injectable()\r\nexport abstract class BaseWidget {\r\n\r\n /**\r\n * Complete widget definition including position, size, and Angular-specific data.\r\n * Populated automatically when the widget is loaded or saved.\r\n */\r\n public widgetItem?: NgGridStackWidget;\r\n\r\n /**\r\n * Override this method to return serializable data for this widget.\r\n * \r\n * Return an object with properties that map to your component's @Input() fields.\r\n * The selector is handled automatically, so only include component-specific data.\r\n * \r\n * @returns Object containing serializable component data\r\n * \r\n * @example\r\n * ```typescript\r\n * serialize() {\r\n * return {\r\n * title: this.title,\r\n * value: this.value,\r\n * settings: this.settings\r\n * };\r\n * }\r\n * ```\r\n */\r\n public serialize(): NgCompInputs | undefined { return; }\r\n\r\n /**\r\n * Override this method to handle widget restoration from saved data.\r\n * \r\n * Use this for complex initialization that goes beyond simple @Input() mapping.\r\n * The default implementation automatically assigns input data to component properties.\r\n * \r\n * @param w The saved widget data including input properties\r\n * \r\n * @example\r\n * ```typescript\r\n * deserialize(w: NgGridStackWidget) {\r\n * super.deserialize(w); // Call parent for basic setup\r\n * \r\n * // Custom initialization logic\r\n * if (w.input?.complexData) {\r\n * this.processComplexData(w.input.complexData);\r\n * }\r\n * }\r\n * ```\r\n */\r\n public deserialize(w: NgGridStackWidget) {\r\n // save full description for meta data\r\n this.widgetItem = w;\r\n if (!w) return;\r\n\r\n if (w.input) Object.assign(this, w.input);\r\n }\r\n }\r\n","/**\n * gridstack-item.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport { Component, ElementRef, Input, ViewChild, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core';\nimport { GridItemHTMLElement, GridStackNode } from 'gridstack';\nimport { BaseWidget } from './base-widget';\n\n/**\n * Extended HTMLElement interface for grid items.\n * Stores a back-reference to the Angular component for integration.\n */\nexport interface GridItemCompHTMLElement extends GridItemHTMLElement {\n /** Back-reference to the Angular GridStackItem component */\n _gridItemComp?: GridstackItemComponent;\n}\n\n/**\n * Angular component wrapper for individual GridStack items.\n * \n * This component represents a single grid item and handles:\n * - Dynamic content creation and management\n * - Integration with parent GridStack component\n * - Component lifecycle and cleanup\n * - Widget options and configuration\n * \n * Use in combination with GridstackComponent for the parent grid.\n * \n * @example\n * ```html\n * \n * \n * \n * \n * \n * ```\n */\n@Component({\n selector: 'gridstack-item',\n template: `\n
\n \n \n \n \n \n {{options.content}}\n
`,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackItemComponent implements OnDestroy {\n\n /**\n * Container for dynamic component creation within this grid item.\n * Used to append child components programmatically.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Reference to child widget component for serialization.\n * Used to save/restore additional data along with grid position.\n */\n public childWidget: BaseWidget | undefined;\n\n /**\n * Grid item configuration options.\n * Defines position, size, and behavior of this grid item.\n * \n * @example\n * ```typescript\n * itemOptions: GridStackNode = {\n * x: 0, y: 0, w: 2, h: 1,\n * noResize: true,\n * content: 'Item content'\n * };\n * ```\n */\n @Input() public set options(val: GridStackNode) {\n const grid = this.el.gridstackNode?.grid;\n if (grid) {\n // already built, do an update...\n grid.update(this.el, val);\n } else {\n // store our custom element in options so we can update it and not re-create a generic div!\n this._options = {...val, el: this.el};\n }\n }\n /** return the latest grid options (from GS once built, otherwise initial values) */\n public get options(): GridStackNode {\n return this.el.gridstackNode || this._options || {el: this.el};\n }\n\n protected _options?: GridStackNode;\n\n /** return the native element that contains grid specific fields as well */\n public get el(): GridItemCompHTMLElement { return this.elementRef.nativeElement; }\n\n /** clears the initial options now that we've built */\n public clearOptions() {\n delete this._options;\n }\n\n constructor(protected readonly elementRef: ElementRef) {\n this.el._gridItemComp = this;\n }\n\n public ngOnDestroy(): void {\n this.clearOptions();\n delete this.childWidget\n delete this.el._gridItemComp;\n delete this.container;\n delete this.ref;\n }\n}\n","/**\n * gridstack.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport {\n AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, Input,\n OnDestroy, OnInit, Output, QueryList, Type, ViewChild, ViewContainerRef, reflectComponentType, ComponentRef\n} from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions, GridStackWidget } from 'gridstack';\n\nimport { NgGridStackNode, NgGridStackWidget } from './types';\nimport { BaseWidget } from './base-widget';\nimport { GridItemCompHTMLElement, GridstackItemComponent } from './gridstack-item.component';\n\n/**\n * Event handler callback signatures for different GridStack events.\n * These types define the structure of data passed to Angular event emitters.\n */\n\n/** Callback for general events (enable, disable, etc.) */\nexport type eventCB = {event: Event};\n\n/** Callback for element-specific events (resize, drag, etc.) */\nexport type elementCB = {event: Event, el: GridItemHTMLElement};\n\n/** Callback for events affecting multiple nodes (change, etc.) */\nexport type nodesCB = {event: Event, nodes: GridStackNode[]};\n\n/** Callback for drop events with before/after node state */\nexport type droppedCB = {event: Event, previousNode: GridStackNode, newNode: GridStackNode};\n\n/**\n * Extended HTMLElement interface for the grid container.\n * Stores a back-reference to the Angular component for integration purposes.\n */\nexport interface GridCompHTMLElement extends GridHTMLElement {\n /** Back-reference to the Angular GridStack component */\n _gridComp?: GridstackComponent;\n}\n\n/**\n * Mapping of selector strings to Angular component types.\n * Used for dynamic component creation based on widget selectors.\n */\nexport type SelectorToType = {[key: string]: Type};\n\n/**\n * Angular component wrapper for GridStack.\n * \n * This component provides Angular integration for GridStack grids, handling:\n * - Grid initialization and lifecycle\n * - Dynamic component creation and management\n * - Event binding and emission\n * - Integration with Angular change detection\n * \n * Use in combination with GridstackItemComponent for individual grid items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here
\n *
\n * ```\n */\n@Component({\n selector: 'gridstack',\n template: `\n \n \n \n \n \n \n `,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n imports: [NgIf]\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackComponent implements OnInit, AfterContentInit, OnDestroy {\n\n /**\n * List of template-based grid items (not recommended approach).\n * Used to sync between DOM and GridStack internals when items are defined in templates.\n * Prefer dynamic component creation instead.\n */\n @ContentChildren(GridstackItemComponent) public gridstackItems?: QueryList;\n /**\n * Container for dynamic component creation (recommended approach).\n * Used to append grid items programmatically at runtime.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Grid configuration options.\n * Can be set before grid initialization or updated after grid is created.\n * \n * @example\n * ```typescript\n * gridOptions: GridStackOptions = {\n * column: 12,\n * cellHeight: 'auto',\n * animate: true\n * };\n * ```\n */\n @Input() public set options(o: GridStackOptions) {\n if (this._grid) {\n this._grid.updateOptions(o);\n } else {\n this._options = o;\n }\n }\n /** Get the current running grid options */\n public get options(): GridStackOptions { return this._grid?.opts || this._options || {}; }\n\n /**\n * Controls whether empty content should be displayed.\n * Set to true to show ng-content with 'empty-content' selector when grid has no items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here to get started
\n *
\n * ```\n */\n @Input() public isEmpty?: boolean;\n\n /**\n * GridStack event emitters for Angular integration.\n * \n * These provide Angular-style event handling for GridStack events.\n * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events.\n * \n * Note: 'CB' suffix prevents conflicts with native DOM events.\n * \n * @example\n * ```html\n * \n * \n * ```\n */\n \n /** Emitted when widgets are added to the grid */\n @Output() public addedCB = new EventEmitter();\n \n /** Emitted when grid layout changes */\n @Output() public changeCB = new EventEmitter();\n \n /** Emitted when grid is disabled */\n @Output() public disableCB = new EventEmitter();\n \n /** Emitted during widget drag operations */\n @Output() public dragCB = new EventEmitter();\n \n /** Emitted when widget drag starts */\n @Output() public dragStartCB = new EventEmitter();\n \n /** Emitted when widget drag stops */\n @Output() public dragStopCB = new EventEmitter();\n \n /** Emitted when widget is dropped */\n @Output() public droppedCB = new EventEmitter();\n \n /** Emitted when grid is enabled */\n @Output() public enableCB = new EventEmitter();\n \n /** Emitted when widgets are removed from the grid */\n @Output() public removedCB = new EventEmitter();\n \n /** Emitted during widget resize operations */\n @Output() public resizeCB = new EventEmitter();\n \n /** Emitted when widget resize starts */\n @Output() public resizeStartCB = new EventEmitter();\n \n /** Emitted when widget resize stops */\n @Output() public resizeStopCB = new EventEmitter();\n\n /**\n * Get the native DOM element that contains grid-specific fields.\n * This element has GridStack properties attached to it.\n */\n public get el(): GridCompHTMLElement { return this.elementRef.nativeElement; }\n\n /**\n * Get the underlying GridStack instance.\n * Use this to access GridStack API methods directly.\n * \n * @example\n * ```typescript\n * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1});\n * ```\n */\n public get grid(): GridStack | undefined { return this._grid; }\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Mapping of component selectors to their types for dynamic creation.\n * \n * This enables dynamic component instantiation from string selectors.\n * Angular doesn't provide public access to this mapping, so we maintain our own.\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]);\n * ```\n */\n public static selectorToType: SelectorToType = {};\n /**\n * Register a list of Angular components for dynamic creation.\n * \n * @param typeList Array of component types to register\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([\n * MyWidgetComponent,\n * AnotherWidgetComponent\n * ]);\n * ```\n */\n public static addComponentToSelectorType(typeList: Array>) {\n typeList.forEach(type => GridstackComponent.selectorToType[ GridstackComponent.getSelector(type) ] = type);\n }\n /**\n * Extract the selector string from an Angular component type.\n * \n * @param type The component type to get selector from\n * @returns The component's selector string\n */\n public static getSelector(type: Type): string {\n return reflectComponentType(type)!.selector;\n }\n\n protected _options?: GridStackOptions;\n protected _grid?: GridStack;\n protected _sub: Subscription | undefined;\n protected loaded?: boolean;\n\n constructor(protected readonly elementRef: ElementRef) {\n // set globally our method to create the right widget type\n if (!GridStack.addRemoveCB) {\n GridStack.addRemoveCB = gsCreateNgComponents;\n }\n if (!GridStack.saveCB) {\n GridStack.saveCB = gsSaveAdditionalNgInfo;\n }\n if (!GridStack.updateCB) {\n GridStack.updateCB = gsUpdateNgComponents;\n }\n this.el._gridComp = this;\n }\n\n public ngOnInit(): void {\n // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets\n this.loaded = !!this.options?.children?.length;\n this._grid = GridStack.init(this._options, this.el);\n delete this._options; // GS has it now\n\n this.checkEmpty();\n }\n\n /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */\n public ngAfterContentInit(): void {\n // track whenever the children list changes and update the layout...\n this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll());\n // ...and do this once at least unless we loaded children already\n if (!this.loaded) this.updateAll();\n this.hookEvents(this.grid);\n }\n\n public ngOnDestroy(): void {\n this.unhookEvents(this._grid);\n this._sub?.unsubscribe();\n this._grid?.destroy();\n delete this._grid;\n delete this.el._gridComp;\n delete this.container;\n delete this.ref;\n }\n\n /**\n * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and\n * update the layout accordingly (which will take care of adding/removing items changed by Angular)\n */\n public updateAll() {\n if (!this.grid) return;\n const layout: GridStackWidget[] = [];\n this.gridstackItems?.forEach(item => {\n layout.push(item.options);\n item.clearOptions();\n });\n this.grid.load(layout); // efficient that does diffs only\n }\n\n /** check if the grid is empty, if so show alternative content */\n public checkEmpty() {\n if (!this.grid) return;\n this.isEmpty = !this.grid.engine.nodes.length;\n }\n\n /** get all known events as easy to use Outputs for convenience */\n protected hookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid\n .on('added', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.addedCB.emit({event, nodes});\n })\n .on('change', (event: Event, nodes: GridStackNode[]) => this.changeCB.emit({event, nodes}))\n .on('disable', (event: Event) => this.disableCB.emit({event}))\n .on('drag', (event: Event, el: GridItemHTMLElement) => this.dragCB.emit({event, el}))\n .on('dragstart', (event: Event, el: GridItemHTMLElement) => this.dragStartCB.emit({event, el}))\n .on('dragstop', (event: Event, el: GridItemHTMLElement) => this.dragStopCB.emit({event, el}))\n .on('dropped', (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => this.droppedCB.emit({event, previousNode, newNode}))\n .on('enable', (event: Event) => this.enableCB.emit({event}))\n .on('removed', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.removedCB.emit({event, nodes});\n })\n .on('resize', (event: Event, el: GridItemHTMLElement) => this.resizeCB.emit({event, el}))\n .on('resizestart', (event: Event, el: GridItemHTMLElement) => this.resizeStartCB.emit({event, el}))\n .on('resizestop', (event: Event, el: GridItemHTMLElement) => this.resizeStopCB.emit({event, el}))\n }\n\n protected unhookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop');\n }\n}\n\n/**\n * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip)\n **/\nexport function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined {\n if (add) {\n //\n // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html\n //\n if (!host) return;\n if (isGrid) {\n // TODO: figure out how to create ng component inside regular Div. need to access app injectors...\n // if (!container) {\n // const hostElement: Element = host;\n // const environmentInjector: EnvironmentInjector;\n // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance;\n // }\n\n const gridItemComp = (host.parentElement as GridItemCompHTMLElement)?._gridItemComp;\n if (!gridItemComp) return;\n // check if gridItem has a child component with 'container' exposed to create under..\n const container = (gridItemComp.childWidget as any)?.container || gridItemComp.container;\n const gridRef = container?.createComponent(GridstackComponent);\n const grid = gridRef?.instance;\n if (!grid) return;\n grid.ref = gridRef;\n grid.options = n;\n return grid.el;\n } else {\n const gridComp = (host as GridCompHTMLElement)._gridComp;\n const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent);\n const gridItem = gridItemRef?.instance;\n if (!gridItem) return;\n gridItem.ref = gridItemRef\n\n // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic\n const selector = n.selector;\n const type = selector ? GridstackComponent.selectorToType[selector] : undefined;\n if (type) {\n // shared code to create our selector component\n const createComp = () => {\n const childWidget = gridItem.container?.createComponent(type)?.instance as BaseWidget;\n // if proper BaseWidget subclass, save it and load additional data\n if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') {\n gridItem.childWidget = childWidget;\n childWidget.deserialize(n);\n }\n }\n\n const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false;\n if (lazyLoad) {\n if (!n.visibleObservable) {\n n.visibleObservable = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) {\n n.visibleObservable?.disconnect();\n delete n.visibleObservable;\n createComp();\n }});\n window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes\n }\n } else createComp();\n }\n\n return gridItem.el;\n }\n } else {\n //\n // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves\n // Note: this will destroy all children dynamic components as well: gridItem -> childWidget\n //\n if (isGrid) {\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid?.ref) grid.ref.destroy();\n else grid?.ngOnDestroy();\n } else {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.ref) gridItem.ref.destroy();\n else gridItem?.ngOnDestroy();\n }\n }\n return;\n}\n\n/**\n * called for each item in the grid - check if additional information needs to be saved.\n * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(),\n * this typically doesn't need to do anything. However your custom Component @Input() are now supported\n * using BaseWidget.serialize()\n */\nexport function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget) {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem) {\n const input = gridItem.childWidget?.serialize();\n if (input) {\n w.input = input;\n }\n return;\n }\n // else check if Grid\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid) {\n //.... save any custom data\n }\n}\n\n/**\n * track when widgeta re updated (rather than created) to make sure we de-serialize them as well\n */\nexport function gsUpdateNgComponents(n: NgGridStackNode) {\n const w: NgGridStackWidget = n;\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.childWidget && w.input) gridItem.childWidget.deserialize(w);\n}","/**\r\n * gridstack.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { NgModule } from \"@angular/core\";\r\n\r\nimport { GridstackItemComponent } from \"./gridstack-item.component\";\r\nimport { GridstackComponent } from \"./gridstack.component\";\r\n\r\n/**\r\n * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead.\r\n * \r\n * This NgModule is provided for backward compatibility but is no longer the recommended approach.\r\n * Import components directly in your standalone components or use the new Angular module structure.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Preferred approach - standalone components\r\n * @Component({\r\n * selector: 'my-app',\r\n * imports: [GridstackComponent, GridstackItemComponent],\r\n * template: ''\r\n * })\r\n * export class AppComponent {}\r\n * \r\n * // Legacy approach (deprecated)\r\n * @NgModule({\r\n * imports: [GridstackModule]\r\n * })\r\n * export class AppModule {}\r\n * ```\r\n */\r\n@NgModule({\r\n imports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n exports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n})\r\nexport class GridstackModule {}\r\n","/*\n * Public API Surface of gridstack-angular\n */\n\nexport * from './lib/types';\nexport * from './lib/base-widget';\nexport * from './lib/gridstack-item.component';\nexport * from './lib/gridstack.component';\nexport * from './lib/gridstack.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/fesm2020/gridstack-angular.mjs b/node_modules/gridstack/dist/angular/fesm2020/gridstack-angular.mjs deleted file mode 100644 index fc13dc804..000000000 --- a/node_modules/gridstack/dist/angular/fesm2020/gridstack-angular.mjs +++ /dev/null @@ -1,640 +0,0 @@ -import * as i0 from '@angular/core'; -import { Injectable, ViewContainerRef, Component, ViewChild, Input, EventEmitter, reflectComponentType, ContentChildren, Output, NgModule } from '@angular/core'; -import { NgIf } from '@angular/common'; -import { GridStack } from 'gridstack'; - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Base widget class for GridStack Angular integration. - */ -class BaseWidget { - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize() { return; } - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w) { - // save full description for meta data - this.widgetItem = w; - if (!w) - return; - if (w.input) - Object.assign(this, w.input); - } -} -BaseWidget.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); -BaseWidget.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, decorators: [{ - type: Injectable - }] }); - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -class GridstackItemComponent { - constructor(elementRef) { - this.elementRef = elementRef; - this.el._gridItemComp = this; - } - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val) { - const grid = this.el.gridstackNode?.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } - else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = { ...val, el: this.el }; - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options() { - return this.el.gridstackNode || this._options || { el: this.el }; - } - /** return the native element that contains grid specific fields as well */ - get el() { return this.elementRef.nativeElement; } - /** clears the initial options now that we've built */ - clearOptions() { - delete this._options; - } - ngOnDestroy() { - this.clearOptions(); - delete this.childWidget; - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} -GridstackItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackItemComponent, isStandalone: true, selector: "gridstack-item", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` -
- - - - - - {{options.content}} -
`, isInline: true, styles: [":host{display:block}\n"] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack-item', template: ` -
- - - - - - {{options.content}} -
`, standalone: true, styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }] } }); - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -class GridstackComponent { - constructor(elementRef) { - this.elementRef = elementRef; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - this.addedCB = new EventEmitter(); - /** Emitted when grid layout changes */ - this.changeCB = new EventEmitter(); - /** Emitted when grid is disabled */ - this.disableCB = new EventEmitter(); - /** Emitted during widget drag operations */ - this.dragCB = new EventEmitter(); - /** Emitted when widget drag starts */ - this.dragStartCB = new EventEmitter(); - /** Emitted when widget drag stops */ - this.dragStopCB = new EventEmitter(); - /** Emitted when widget is dropped */ - this.droppedCB = new EventEmitter(); - /** Emitted when grid is enabled */ - this.enableCB = new EventEmitter(); - /** Emitted when widgets are removed from the grid */ - this.removedCB = new EventEmitter(); - /** Emitted during widget resize operations */ - this.resizeCB = new EventEmitter(); - /** Emitted when widget resize starts */ - this.resizeStartCB = new EventEmitter(); - /** Emitted when widget resize stops */ - this.resizeStopCB = new EventEmitter(); - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o) { - if (this._grid) { - this._grid.updateOptions(o); - } - else { - this._options = o; - } - } - /** Get the current running grid options */ - get options() { return this._grid?.opts || this._options || {}; } - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el() { return this.elementRef.nativeElement; } - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid() { return this._grid; } - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList) { - typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type) { - return reflectComponentType(type).selector; - } - ngOnInit() { - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!this.options?.children?.length; - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - this.checkEmpty(); - } - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit() { - // track whenever the children list changes and update the layout... - this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) - this.updateAll(); - this.hookEvents(this.grid); - } - ngOnDestroy() { - this.unhookEvents(this._grid); - this._sub?.unsubscribe(); - this._grid?.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll() { - if (!this.grid) - return; - const layout = []; - this.gridstackItems?.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - /** check if the grid is empty, if so show alternative content */ - checkEmpty() { - if (!this.grid) - return; - this.isEmpty = !this.grid.engine.nodes.length; - } - /** get all known events as easy to use Outputs for convenience */ - hookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid - .on('added', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.addedCB.emit({ event, nodes }); - }) - .on('change', (event, nodes) => this.changeCB.emit({ event, nodes })) - .on('disable', (event) => this.disableCB.emit({ event })) - .on('drag', (event, el) => this.dragCB.emit({ event, el })) - .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el })) - .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el })) - .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode })) - .on('enable', (event) => this.enableCB.emit({ event })) - .on('removed', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.removedCB.emit({ event, nodes }); - }) - .on('resize', (event, el) => this.resizeCB.emit({ event, el })) - .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el })) - .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el })); - } - unhookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} -/** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ -GridstackComponent.selectorToType = {}; -GridstackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackComponent, isStandalone: true, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` - - - - - - - `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack', template: ` - - - - - - - `, standalone: true, imports: [NgIf], styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { gridstackItems: [{ - type: ContentChildren, - args: [GridstackItemComponent] - }], container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }], isEmpty: [{ - type: Input - }], addedCB: [{ - type: Output - }], changeCB: [{ - type: Output - }], disableCB: [{ - type: Output - }], dragCB: [{ - type: Output - }], dragStartCB: [{ - type: Output - }], dragStopCB: [{ - type: Output - }], droppedCB: [{ - type: Output - }], enableCB: [{ - type: Output - }], removedCB: [{ - type: Output - }], resizeCB: [{ - type: Output - }], resizeStartCB: [{ - type: Output - }], resizeStopCB: [{ - type: Output - }] } }); -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -function gsCreateNgComponents(host, n, add, isGrid) { - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) - return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - const gridItemComp = host.parentElement?._gridItemComp; - if (!gridItemComp) - return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = gridItemComp.childWidget?.container || gridItemComp.container; - const gridRef = container?.createComponent(GridstackComponent); - const grid = gridRef?.instance; - if (!grid) - return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } - else { - const gridComp = host._gridComp; - const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent); - const gridItem = gridItemRef?.instance; - if (!gridItem) - return; - gridItem.ref = gridItemRef; - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - const childWidget = gridItem.container?.createComponent(type)?.instance; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - }; - const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { - if (entry.isIntersecting) { - n.visibleObservable?.disconnect(); - delete n.visibleObservable; - createComp(); - } - }); - window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes - } - } - else - createComp(); - } - return gridItem.el; - } - } - else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = n.el?._gridComp; - if (grid?.ref) - grid.ref.destroy(); - else - grid?.ngOnDestroy(); - } - else { - const gridItem = n.el?._gridItemComp; - if (gridItem?.ref) - gridItem.ref.destroy(); - else - gridItem?.ngOnDestroy(); - } - } - return; -} -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -function gsSaveAdditionalNgInfo(n, w) { - const gridItem = n.el?._gridItemComp; - if (gridItem) { - const input = gridItem.childWidget?.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = n.el?._gridComp; - if (grid) { - //.... save any custom data - } -} -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -function gsUpdateNgComponents(n) { - const w = n; - const gridItem = n.el?._gridItemComp; - if (gridItem?.childWidget && w.input) - gridItem.childWidget.deserialize(w); -} - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -class GridstackModule { -} -GridstackModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); -GridstackModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent], exports: [GridstackItemComponent, - GridstackComponent] }); -GridstackModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, decorators: [{ - type: NgModule, - args: [{ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], - }] - }] }); - -/* - * Public API Surface of gridstack-angular - */ - -/** - * Generated bundle index. Do not edit. - */ - -export { BaseWidget, GridstackComponent, GridstackItemComponent, GridstackModule, gsCreateNgComponents, gsSaveAdditionalNgInfo, gsUpdateNgComponents }; -//# sourceMappingURL=gridstack-angular.mjs.map diff --git a/node_modules/gridstack/dist/angular/fesm2020/gridstack-angular.mjs.map b/node_modules/gridstack/dist/angular/fesm2020/gridstack-angular.mjs.map deleted file mode 100644 index f854cb17d..000000000 --- a/node_modules/gridstack/dist/angular/fesm2020/gridstack-angular.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gridstack-angular.mjs","sources":["../../../angular/projects/lib/src/lib/types.ts","../../../angular/projects/lib/src/lib/base-widget.ts","../../../angular/projects/lib/src/lib/gridstack-item.component.ts","../../../angular/projects/lib/src/lib/gridstack.component.ts","../../../angular/projects/lib/src/lib/gridstack.module.ts","../../../angular/projects/lib/src/index.ts","../../../angular/projects/lib/src/gridstack-angular.ts"],"sourcesContent":["/**\r\n * gridstack-item.component.ts 12.3.3\r\n * Copyright (c) 2025 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { GridStackNode, GridStackOptions, GridStackWidget } from \"gridstack\";\r\n\r\n/**\r\n * Extended GridStackWidget interface for Angular integration.\r\n * Adds Angular-specific properties for dynamic component creation.\r\n */\r\nexport interface NgGridStackWidget extends GridStackWidget {\r\n /** Angular component selector for dynamic creation (e.g., 'my-widget') */\r\n selector?: string;\r\n /** Serialized data for component @Input() properties */\r\n input?: NgCompInputs;\r\n /** Configuration for nested sub-grids */\r\n subGridOpts?: NgGridStackOptions;\r\n}\r\n\r\n/**\r\n * Extended GridStackNode interface for Angular integration.\r\n * Adds component selector for dynamic content creation.\r\n */\r\nexport interface NgGridStackNode extends GridStackNode {\r\n /** Angular component selector for this node's content */\r\n selector?: string;\r\n}\r\n\r\n/**\r\n * Extended GridStackOptions interface for Angular integration.\r\n * Supports Angular-specific widget definitions and nested grids.\r\n */\r\nexport interface NgGridStackOptions extends GridStackOptions {\r\n /** Array of Angular widget definitions for initial grid setup */\r\n children?: NgGridStackWidget[];\r\n /** Configuration for nested sub-grids (Angular-aware) */\r\n subGridOpts?: NgGridStackOptions;\r\n}\r\n\r\n/**\r\n * Type for component input data serialization.\r\n * Maps @Input() property names to their values for widget persistence.\r\n * \r\n * @example\r\n * ```typescript\r\n * const inputs: NgCompInputs = {\r\n * title: 'My Widget',\r\n * value: 42,\r\n * config: { enabled: true }\r\n * };\r\n * ```\r\n */\r\nexport type NgCompInputs = {[key: string]: any};\r\n","/**\r\n * gridstack-item.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\n/**\r\n * Abstract base class that all custom widgets should extend.\r\n * \r\n * This class provides the interface needed for GridstackItemComponent to:\r\n * - Serialize/deserialize widget data\r\n * - Save/restore widget state\r\n * - Integrate with Angular lifecycle\r\n * \r\n * Extend this class when creating custom widgets for dynamic grids.\r\n * \r\n * @example\r\n * ```typescript\r\n * @Component({\r\n * selector: 'my-custom-widget',\r\n * template: '
{{data}}
'\r\n * })\r\n * export class MyCustomWidget extends BaseWidget {\r\n * @Input() data: string = '';\r\n * \r\n * serialize() {\r\n * return { data: this.data };\r\n * }\r\n * }\r\n * ```\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NgCompInputs, NgGridStackWidget } from './types';\r\n\r\n/**\r\n * Base widget class for GridStack Angular integration.\r\n */\r\n@Injectable()\r\nexport abstract class BaseWidget {\r\n\r\n /**\r\n * Complete widget definition including position, size, and Angular-specific data.\r\n * Populated automatically when the widget is loaded or saved.\r\n */\r\n public widgetItem?: NgGridStackWidget;\r\n\r\n /**\r\n * Override this method to return serializable data for this widget.\r\n * \r\n * Return an object with properties that map to your component's @Input() fields.\r\n * The selector is handled automatically, so only include component-specific data.\r\n * \r\n * @returns Object containing serializable component data\r\n * \r\n * @example\r\n * ```typescript\r\n * serialize() {\r\n * return {\r\n * title: this.title,\r\n * value: this.value,\r\n * settings: this.settings\r\n * };\r\n * }\r\n * ```\r\n */\r\n public serialize(): NgCompInputs | undefined { return; }\r\n\r\n /**\r\n * Override this method to handle widget restoration from saved data.\r\n * \r\n * Use this for complex initialization that goes beyond simple @Input() mapping.\r\n * The default implementation automatically assigns input data to component properties.\r\n * \r\n * @param w The saved widget data including input properties\r\n * \r\n * @example\r\n * ```typescript\r\n * deserialize(w: NgGridStackWidget) {\r\n * super.deserialize(w); // Call parent for basic setup\r\n * \r\n * // Custom initialization logic\r\n * if (w.input?.complexData) {\r\n * this.processComplexData(w.input.complexData);\r\n * }\r\n * }\r\n * ```\r\n */\r\n public deserialize(w: NgGridStackWidget) {\r\n // save full description for meta data\r\n this.widgetItem = w;\r\n if (!w) return;\r\n\r\n if (w.input) Object.assign(this, w.input);\r\n }\r\n }\r\n","/**\n * gridstack-item.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport { Component, ElementRef, Input, ViewChild, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core';\nimport { GridItemHTMLElement, GridStackNode } from 'gridstack';\nimport { BaseWidget } from './base-widget';\n\n/**\n * Extended HTMLElement interface for grid items.\n * Stores a back-reference to the Angular component for integration.\n */\nexport interface GridItemCompHTMLElement extends GridItemHTMLElement {\n /** Back-reference to the Angular GridStackItem component */\n _gridItemComp?: GridstackItemComponent;\n}\n\n/**\n * Angular component wrapper for individual GridStack items.\n * \n * This component represents a single grid item and handles:\n * - Dynamic content creation and management\n * - Integration with parent GridStack component\n * - Component lifecycle and cleanup\n * - Widget options and configuration\n * \n * Use in combination with GridstackComponent for the parent grid.\n * \n * @example\n * ```html\n * \n * \n * \n * \n * \n * ```\n */\n@Component({\n selector: 'gridstack-item',\n template: `\n
\n \n \n \n \n \n {{options.content}}\n
`,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackItemComponent implements OnDestroy {\n\n /**\n * Container for dynamic component creation within this grid item.\n * Used to append child components programmatically.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Reference to child widget component for serialization.\n * Used to save/restore additional data along with grid position.\n */\n public childWidget: BaseWidget | undefined;\n\n /**\n * Grid item configuration options.\n * Defines position, size, and behavior of this grid item.\n * \n * @example\n * ```typescript\n * itemOptions: GridStackNode = {\n * x: 0, y: 0, w: 2, h: 1,\n * noResize: true,\n * content: 'Item content'\n * };\n * ```\n */\n @Input() public set options(val: GridStackNode) {\n const grid = this.el.gridstackNode?.grid;\n if (grid) {\n // already built, do an update...\n grid.update(this.el, val);\n } else {\n // store our custom element in options so we can update it and not re-create a generic div!\n this._options = {...val, el: this.el};\n }\n }\n /** return the latest grid options (from GS once built, otherwise initial values) */\n public get options(): GridStackNode {\n return this.el.gridstackNode || this._options || {el: this.el};\n }\n\n protected _options?: GridStackNode;\n\n /** return the native element that contains grid specific fields as well */\n public get el(): GridItemCompHTMLElement { return this.elementRef.nativeElement; }\n\n /** clears the initial options now that we've built */\n public clearOptions() {\n delete this._options;\n }\n\n constructor(protected readonly elementRef: ElementRef) {\n this.el._gridItemComp = this;\n }\n\n public ngOnDestroy(): void {\n this.clearOptions();\n delete this.childWidget\n delete this.el._gridItemComp;\n delete this.container;\n delete this.ref;\n }\n}\n","/**\n * gridstack.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport {\n AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, Input,\n OnDestroy, OnInit, Output, QueryList, Type, ViewChild, ViewContainerRef, reflectComponentType, ComponentRef\n} from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions, GridStackWidget } from 'gridstack';\n\nimport { NgGridStackNode, NgGridStackWidget } from './types';\nimport { BaseWidget } from './base-widget';\nimport { GridItemCompHTMLElement, GridstackItemComponent } from './gridstack-item.component';\n\n/**\n * Event handler callback signatures for different GridStack events.\n * These types define the structure of data passed to Angular event emitters.\n */\n\n/** Callback for general events (enable, disable, etc.) */\nexport type eventCB = {event: Event};\n\n/** Callback for element-specific events (resize, drag, etc.) */\nexport type elementCB = {event: Event, el: GridItemHTMLElement};\n\n/** Callback for events affecting multiple nodes (change, etc.) */\nexport type nodesCB = {event: Event, nodes: GridStackNode[]};\n\n/** Callback for drop events with before/after node state */\nexport type droppedCB = {event: Event, previousNode: GridStackNode, newNode: GridStackNode};\n\n/**\n * Extended HTMLElement interface for the grid container.\n * Stores a back-reference to the Angular component for integration purposes.\n */\nexport interface GridCompHTMLElement extends GridHTMLElement {\n /** Back-reference to the Angular GridStack component */\n _gridComp?: GridstackComponent;\n}\n\n/**\n * Mapping of selector strings to Angular component types.\n * Used for dynamic component creation based on widget selectors.\n */\nexport type SelectorToType = {[key: string]: Type};\n\n/**\n * Angular component wrapper for GridStack.\n * \n * This component provides Angular integration for GridStack grids, handling:\n * - Grid initialization and lifecycle\n * - Dynamic component creation and management\n * - Event binding and emission\n * - Integration with Angular change detection\n * \n * Use in combination with GridstackItemComponent for individual grid items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here
\n *
\n * ```\n */\n@Component({\n selector: 'gridstack',\n template: `\n \n \n \n \n \n \n `,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n imports: [NgIf]\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackComponent implements OnInit, AfterContentInit, OnDestroy {\n\n /**\n * List of template-based grid items (not recommended approach).\n * Used to sync between DOM and GridStack internals when items are defined in templates.\n * Prefer dynamic component creation instead.\n */\n @ContentChildren(GridstackItemComponent) public gridstackItems?: QueryList;\n /**\n * Container for dynamic component creation (recommended approach).\n * Used to append grid items programmatically at runtime.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Grid configuration options.\n * Can be set before grid initialization or updated after grid is created.\n * \n * @example\n * ```typescript\n * gridOptions: GridStackOptions = {\n * column: 12,\n * cellHeight: 'auto',\n * animate: true\n * };\n * ```\n */\n @Input() public set options(o: GridStackOptions) {\n if (this._grid) {\n this._grid.updateOptions(o);\n } else {\n this._options = o;\n }\n }\n /** Get the current running grid options */\n public get options(): GridStackOptions { return this._grid?.opts || this._options || {}; }\n\n /**\n * Controls whether empty content should be displayed.\n * Set to true to show ng-content with 'empty-content' selector when grid has no items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here to get started
\n *
\n * ```\n */\n @Input() public isEmpty?: boolean;\n\n /**\n * GridStack event emitters for Angular integration.\n * \n * These provide Angular-style event handling for GridStack events.\n * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events.\n * \n * Note: 'CB' suffix prevents conflicts with native DOM events.\n * \n * @example\n * ```html\n * \n * \n * ```\n */\n \n /** Emitted when widgets are added to the grid */\n @Output() public addedCB = new EventEmitter();\n \n /** Emitted when grid layout changes */\n @Output() public changeCB = new EventEmitter();\n \n /** Emitted when grid is disabled */\n @Output() public disableCB = new EventEmitter();\n \n /** Emitted during widget drag operations */\n @Output() public dragCB = new EventEmitter();\n \n /** Emitted when widget drag starts */\n @Output() public dragStartCB = new EventEmitter();\n \n /** Emitted when widget drag stops */\n @Output() public dragStopCB = new EventEmitter();\n \n /** Emitted when widget is dropped */\n @Output() public droppedCB = new EventEmitter();\n \n /** Emitted when grid is enabled */\n @Output() public enableCB = new EventEmitter();\n \n /** Emitted when widgets are removed from the grid */\n @Output() public removedCB = new EventEmitter();\n \n /** Emitted during widget resize operations */\n @Output() public resizeCB = new EventEmitter();\n \n /** Emitted when widget resize starts */\n @Output() public resizeStartCB = new EventEmitter();\n \n /** Emitted when widget resize stops */\n @Output() public resizeStopCB = new EventEmitter();\n\n /**\n * Get the native DOM element that contains grid-specific fields.\n * This element has GridStack properties attached to it.\n */\n public get el(): GridCompHTMLElement { return this.elementRef.nativeElement; }\n\n /**\n * Get the underlying GridStack instance.\n * Use this to access GridStack API methods directly.\n * \n * @example\n * ```typescript\n * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1});\n * ```\n */\n public get grid(): GridStack | undefined { return this._grid; }\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Mapping of component selectors to their types for dynamic creation.\n * \n * This enables dynamic component instantiation from string selectors.\n * Angular doesn't provide public access to this mapping, so we maintain our own.\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]);\n * ```\n */\n public static selectorToType: SelectorToType = {};\n /**\n * Register a list of Angular components for dynamic creation.\n * \n * @param typeList Array of component types to register\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([\n * MyWidgetComponent,\n * AnotherWidgetComponent\n * ]);\n * ```\n */\n public static addComponentToSelectorType(typeList: Array>) {\n typeList.forEach(type => GridstackComponent.selectorToType[ GridstackComponent.getSelector(type) ] = type);\n }\n /**\n * Extract the selector string from an Angular component type.\n * \n * @param type The component type to get selector from\n * @returns The component's selector string\n */\n public static getSelector(type: Type): string {\n return reflectComponentType(type)!.selector;\n }\n\n protected _options?: GridStackOptions;\n protected _grid?: GridStack;\n protected _sub: Subscription | undefined;\n protected loaded?: boolean;\n\n constructor(protected readonly elementRef: ElementRef) {\n // set globally our method to create the right widget type\n if (!GridStack.addRemoveCB) {\n GridStack.addRemoveCB = gsCreateNgComponents;\n }\n if (!GridStack.saveCB) {\n GridStack.saveCB = gsSaveAdditionalNgInfo;\n }\n if (!GridStack.updateCB) {\n GridStack.updateCB = gsUpdateNgComponents;\n }\n this.el._gridComp = this;\n }\n\n public ngOnInit(): void {\n // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets\n this.loaded = !!this.options?.children?.length;\n this._grid = GridStack.init(this._options, this.el);\n delete this._options; // GS has it now\n\n this.checkEmpty();\n }\n\n /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */\n public ngAfterContentInit(): void {\n // track whenever the children list changes and update the layout...\n this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll());\n // ...and do this once at least unless we loaded children already\n if (!this.loaded) this.updateAll();\n this.hookEvents(this.grid);\n }\n\n public ngOnDestroy(): void {\n this.unhookEvents(this._grid);\n this._sub?.unsubscribe();\n this._grid?.destroy();\n delete this._grid;\n delete this.el._gridComp;\n delete this.container;\n delete this.ref;\n }\n\n /**\n * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and\n * update the layout accordingly (which will take care of adding/removing items changed by Angular)\n */\n public updateAll() {\n if (!this.grid) return;\n const layout: GridStackWidget[] = [];\n this.gridstackItems?.forEach(item => {\n layout.push(item.options);\n item.clearOptions();\n });\n this.grid.load(layout); // efficient that does diffs only\n }\n\n /** check if the grid is empty, if so show alternative content */\n public checkEmpty() {\n if (!this.grid) return;\n this.isEmpty = !this.grid.engine.nodes.length;\n }\n\n /** get all known events as easy to use Outputs for convenience */\n protected hookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid\n .on('added', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.addedCB.emit({event, nodes});\n })\n .on('change', (event: Event, nodes: GridStackNode[]) => this.changeCB.emit({event, nodes}))\n .on('disable', (event: Event) => this.disableCB.emit({event}))\n .on('drag', (event: Event, el: GridItemHTMLElement) => this.dragCB.emit({event, el}))\n .on('dragstart', (event: Event, el: GridItemHTMLElement) => this.dragStartCB.emit({event, el}))\n .on('dragstop', (event: Event, el: GridItemHTMLElement) => this.dragStopCB.emit({event, el}))\n .on('dropped', (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => this.droppedCB.emit({event, previousNode, newNode}))\n .on('enable', (event: Event) => this.enableCB.emit({event}))\n .on('removed', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.removedCB.emit({event, nodes});\n })\n .on('resize', (event: Event, el: GridItemHTMLElement) => this.resizeCB.emit({event, el}))\n .on('resizestart', (event: Event, el: GridItemHTMLElement) => this.resizeStartCB.emit({event, el}))\n .on('resizestop', (event: Event, el: GridItemHTMLElement) => this.resizeStopCB.emit({event, el}))\n }\n\n protected unhookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop');\n }\n}\n\n/**\n * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip)\n **/\nexport function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined {\n if (add) {\n //\n // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html\n //\n if (!host) return;\n if (isGrid) {\n // TODO: figure out how to create ng component inside regular Div. need to access app injectors...\n // if (!container) {\n // const hostElement: Element = host;\n // const environmentInjector: EnvironmentInjector;\n // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance;\n // }\n\n const gridItemComp = (host.parentElement as GridItemCompHTMLElement)?._gridItemComp;\n if (!gridItemComp) return;\n // check if gridItem has a child component with 'container' exposed to create under..\n const container = (gridItemComp.childWidget as any)?.container || gridItemComp.container;\n const gridRef = container?.createComponent(GridstackComponent);\n const grid = gridRef?.instance;\n if (!grid) return;\n grid.ref = gridRef;\n grid.options = n;\n return grid.el;\n } else {\n const gridComp = (host as GridCompHTMLElement)._gridComp;\n const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent);\n const gridItem = gridItemRef?.instance;\n if (!gridItem) return;\n gridItem.ref = gridItemRef\n\n // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic\n const selector = n.selector;\n const type = selector ? GridstackComponent.selectorToType[selector] : undefined;\n if (type) {\n // shared code to create our selector component\n const createComp = () => {\n const childWidget = gridItem.container?.createComponent(type)?.instance as BaseWidget;\n // if proper BaseWidget subclass, save it and load additional data\n if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') {\n gridItem.childWidget = childWidget;\n childWidget.deserialize(n);\n }\n }\n\n const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false;\n if (lazyLoad) {\n if (!n.visibleObservable) {\n n.visibleObservable = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) {\n n.visibleObservable?.disconnect();\n delete n.visibleObservable;\n createComp();\n }});\n window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes\n }\n } else createComp();\n }\n\n return gridItem.el;\n }\n } else {\n //\n // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves\n // Note: this will destroy all children dynamic components as well: gridItem -> childWidget\n //\n if (isGrid) {\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid?.ref) grid.ref.destroy();\n else grid?.ngOnDestroy();\n } else {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.ref) gridItem.ref.destroy();\n else gridItem?.ngOnDestroy();\n }\n }\n return;\n}\n\n/**\n * called for each item in the grid - check if additional information needs to be saved.\n * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(),\n * this typically doesn't need to do anything. However your custom Component @Input() are now supported\n * using BaseWidget.serialize()\n */\nexport function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget) {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem) {\n const input = gridItem.childWidget?.serialize();\n if (input) {\n w.input = input;\n }\n return;\n }\n // else check if Grid\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid) {\n //.... save any custom data\n }\n}\n\n/**\n * track when widgeta re updated (rather than created) to make sure we de-serialize them as well\n */\nexport function gsUpdateNgComponents(n: NgGridStackNode) {\n const w: NgGridStackWidget = n;\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.childWidget && w.input) gridItem.childWidget.deserialize(w);\n}","/**\r\n * gridstack.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { NgModule } from \"@angular/core\";\r\n\r\nimport { GridstackItemComponent } from \"./gridstack-item.component\";\r\nimport { GridstackComponent } from \"./gridstack.component\";\r\n\r\n/**\r\n * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead.\r\n * \r\n * This NgModule is provided for backward compatibility but is no longer the recommended approach.\r\n * Import components directly in your standalone components or use the new Angular module structure.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Preferred approach - standalone components\r\n * @Component({\r\n * selector: 'my-app',\r\n * imports: [GridstackComponent, GridstackItemComponent],\r\n * template: ''\r\n * })\r\n * export class AppComponent {}\r\n * \r\n * // Legacy approach (deprecated)\r\n * @NgModule({\r\n * imports: [GridstackModule]\r\n * })\r\n * export class AppModule {}\r\n * ```\r\n */\r\n@NgModule({\r\n imports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n exports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n})\r\nexport class GridstackModule {}\r\n","/*\n * Public API Surface of gridstack-angular\n */\n\nexport * from './lib/types';\nexport * from './lib/base-widget';\nexport * from './lib/gridstack-item.component';\nexport * from './lib/gridstack.component';\nexport * from './lib/gridstack.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/index.d.ts b/node_modules/gridstack/dist/angular/index.d.ts deleted file mode 100644 index 0af54a2fb..000000000 --- a/node_modules/gridstack/dist/angular/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './lib/types'; -export * from './lib/base-widget'; -export * from './lib/gridstack-item.component'; -export * from './lib/gridstack.component'; -export * from './lib/gridstack.module'; diff --git a/node_modules/gridstack/dist/angular/lib/base-widget.d.ts b/node_modules/gridstack/dist/angular/lib/base-widget.d.ts deleted file mode 100644 index dbed2eaf2..000000000 --- a/node_modules/gridstack/dist/angular/lib/base-widget.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { NgCompInputs, NgGridStackWidget } from './types'; -import * as i0 from "@angular/core"; -/** - * Base widget class for GridStack Angular integration. - */ -export declare abstract class BaseWidget { - /** - * Complete widget definition including position, size, and Angular-specific data. - * Populated automatically when the widget is loaded or saved. - */ - widgetItem?: NgGridStackWidget; - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize(): NgCompInputs | undefined; - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w: NgGridStackWidget): void; - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵprov: i0.ɵɵInjectableDeclaration; -} diff --git a/node_modules/gridstack/dist/angular/lib/gridstack-item.component.d.ts b/node_modules/gridstack/dist/angular/lib/gridstack-item.component.d.ts deleted file mode 100644 index 2997be124..000000000 --- a/node_modules/gridstack/dist/angular/lib/gridstack-item.component.d.ts +++ /dev/null @@ -1,79 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { ElementRef, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core'; -import { GridItemHTMLElement, GridStackNode } from 'gridstack'; -import { BaseWidget } from './base-widget'; -import * as i0 from "@angular/core"; -/** - * Extended HTMLElement interface for grid items. - * Stores a back-reference to the Angular component for integration. - */ -export interface GridItemCompHTMLElement extends GridItemHTMLElement { - /** Back-reference to the Angular GridStackItem component */ - _gridItemComp?: GridstackItemComponent; -} -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -export declare class GridstackItemComponent implements OnDestroy { - protected readonly elementRef: ElementRef; - /** - * Container for dynamic component creation within this grid item. - * Used to append child components programmatically. - */ - container?: ViewContainerRef; - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - ref: ComponentRef | undefined; - /** - * Reference to child widget component for serialization. - * Used to save/restore additional data along with grid position. - */ - childWidget: BaseWidget | undefined; - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val: GridStackNode); - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options(): GridStackNode; - protected _options?: GridStackNode; - /** return the native element that contains grid specific fields as well */ - get el(): GridItemCompHTMLElement; - /** clears the initial options now that we've built */ - clearOptions(): void; - constructor(elementRef: ElementRef); - ngOnDestroy(): void; - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵcmp: i0.ɵɵComponentDeclaration; -} diff --git a/node_modules/gridstack/dist/angular/lib/gridstack.component.d.ts b/node_modules/gridstack/dist/angular/lib/gridstack.component.d.ts deleted file mode 100644 index 9e33f7fa8..000000000 --- a/node_modules/gridstack/dist/angular/lib/gridstack.component.d.ts +++ /dev/null @@ -1,236 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { AfterContentInit, ElementRef, EventEmitter, OnDestroy, OnInit, QueryList, Type, ViewContainerRef, ComponentRef } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions } from 'gridstack'; -import { NgGridStackNode, NgGridStackWidget } from './types'; -import { GridstackItemComponent } from './gridstack-item.component'; -import * as i0 from "@angular/core"; -/** - * Event handler callback signatures for different GridStack events. - * These types define the structure of data passed to Angular event emitters. - */ -/** Callback for general events (enable, disable, etc.) */ -export declare type eventCB = { - event: Event; -}; -/** Callback for element-specific events (resize, drag, etc.) */ -export declare type elementCB = { - event: Event; - el: GridItemHTMLElement; -}; -/** Callback for events affecting multiple nodes (change, etc.) */ -export declare type nodesCB = { - event: Event; - nodes: GridStackNode[]; -}; -/** Callback for drop events with before/after node state */ -export declare type droppedCB = { - event: Event; - previousNode: GridStackNode; - newNode: GridStackNode; -}; -/** - * Extended HTMLElement interface for the grid container. - * Stores a back-reference to the Angular component for integration purposes. - */ -export interface GridCompHTMLElement extends GridHTMLElement { - /** Back-reference to the Angular GridStack component */ - _gridComp?: GridstackComponent; -} -/** - * Mapping of selector strings to Angular component types. - * Used for dynamic component creation based on widget selectors. - */ -export declare type SelectorToType = { - [key: string]: Type; -}; -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -export declare class GridstackComponent implements OnInit, AfterContentInit, OnDestroy { - protected readonly elementRef: ElementRef; - /** - * List of template-based grid items (not recommended approach). - * Used to sync between DOM and GridStack internals when items are defined in templates. - * Prefer dynamic component creation instead. - */ - gridstackItems?: QueryList; - /** - * Container for dynamic component creation (recommended approach). - * Used to append grid items programmatically at runtime. - */ - container?: ViewContainerRef; - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o: GridStackOptions); - /** Get the current running grid options */ - get options(): GridStackOptions; - /** - * Controls whether empty content should be displayed. - * Set to true to show ng-content with 'empty-content' selector when grid has no items. - * - * @example - * ```html - * - *
Drag widgets here to get started
- *
- * ``` - */ - isEmpty?: boolean; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - addedCB: EventEmitter; - /** Emitted when grid layout changes */ - changeCB: EventEmitter; - /** Emitted when grid is disabled */ - disableCB: EventEmitter; - /** Emitted during widget drag operations */ - dragCB: EventEmitter; - /** Emitted when widget drag starts */ - dragStartCB: EventEmitter; - /** Emitted when widget drag stops */ - dragStopCB: EventEmitter; - /** Emitted when widget is dropped */ - droppedCB: EventEmitter; - /** Emitted when grid is enabled */ - enableCB: EventEmitter; - /** Emitted when widgets are removed from the grid */ - removedCB: EventEmitter; - /** Emitted during widget resize operations */ - resizeCB: EventEmitter; - /** Emitted when widget resize starts */ - resizeStartCB: EventEmitter; - /** Emitted when widget resize stops */ - resizeStopCB: EventEmitter; - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el(): GridCompHTMLElement; - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid(): GridStack | undefined; - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - ref: ComponentRef | undefined; - /** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ - static selectorToType: SelectorToType; - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList: Array>): void; - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type: Type): string; - protected _options?: GridStackOptions; - protected _grid?: GridStack; - protected _sub: Subscription | undefined; - protected loaded?: boolean; - constructor(elementRef: ElementRef); - ngOnInit(): void; - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit(): void; - ngOnDestroy(): void; - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll(): void; - /** check if the grid is empty, if so show alternative content */ - checkEmpty(): void; - /** get all known events as easy to use Outputs for convenience */ - protected hookEvents(grid?: GridStack): void; - protected unhookEvents(grid?: GridStack): void; - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵcmp: i0.ɵɵComponentDeclaration; -} -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -export declare function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined; -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -export declare function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget): void; -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -export declare function gsUpdateNgComponents(n: NgGridStackNode): void; diff --git a/node_modules/gridstack/dist/angular/lib/gridstack.module.d.ts b/node_modules/gridstack/dist/angular/lib/gridstack.module.d.ts deleted file mode 100644 index 0bb7599a3..000000000 --- a/node_modules/gridstack/dist/angular/lib/gridstack.module.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as i0 from "@angular/core"; -import * as i1 from "./gridstack-item.component"; -import * as i2 from "./gridstack.component"; -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -export declare class GridstackModule { - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵmod: i0.ɵɵNgModuleDeclaration; - static ɵinj: i0.ɵɵInjectorDeclaration; -} diff --git a/node_modules/gridstack/dist/angular/lib/types.d.ts b/node_modules/gridstack/dist/angular/lib/types.d.ts deleted file mode 100644 index 677d41c3c..000000000 --- a/node_modules/gridstack/dist/angular/lib/types.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ -import { GridStackNode, GridStackOptions, GridStackWidget } from "gridstack"; -/** - * Extended GridStackWidget interface for Angular integration. - * Adds Angular-specific properties for dynamic component creation. - */ -export interface NgGridStackWidget extends GridStackWidget { - /** Angular component selector for dynamic creation (e.g., 'my-widget') */ - selector?: string; - /** Serialized data for component @Input() properties */ - input?: NgCompInputs; - /** Configuration for nested sub-grids */ - subGridOpts?: NgGridStackOptions; -} -/** - * Extended GridStackNode interface for Angular integration. - * Adds component selector for dynamic content creation. - */ -export interface NgGridStackNode extends GridStackNode { - /** Angular component selector for this node's content */ - selector?: string; -} -/** - * Extended GridStackOptions interface for Angular integration. - * Supports Angular-specific widget definitions and nested grids. - */ -export interface NgGridStackOptions extends GridStackOptions { - /** Array of Angular widget definitions for initial grid setup */ - children?: NgGridStackWidget[]; - /** Configuration for nested sub-grids (Angular-aware) */ - subGridOpts?: NgGridStackOptions; -} -/** - * Type for component input data serialization. - * Maps @Input() property names to their values for widget persistence. - * - * @example - * ```typescript - * const inputs: NgCompInputs = { - * title: 'My Widget', - * value: 42, - * config: { enabled: true } - * }; - * ``` - */ -export declare type NgCompInputs = { - [key: string]: any; -}; diff --git a/node_modules/gridstack/dist/angular/package.json b/node_modules/gridstack/dist/angular/package.json deleted file mode 100644 index 6ef546eb7..000000000 --- a/node_modules/gridstack/dist/angular/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "gridstack-angular", - "version": "12.3.3", - "peerDependencies": { - "@angular/common": ">=14", - "@angular/core": ">=14" - }, - "dependencies": { - "tslib": "^2.3.0" - }, - "module": "fesm2015/gridstack-angular.mjs", - "es2020": "fesm2020/gridstack-angular.mjs", - "esm2020": "esm2020/gridstack-angular.mjs", - "fesm2020": "fesm2020/gridstack-angular.mjs", - "fesm2015": "fesm2015/gridstack-angular.mjs", - "typings": "index.d.ts", - "exports": { - "./package.json": { - "default": "./package.json" - }, - ".": { - "types": "./index.d.ts", - "esm2020": "./esm2020/gridstack-angular.mjs", - "es2020": "./fesm2020/gridstack-angular.mjs", - "es2015": "./fesm2015/gridstack-angular.mjs", - "node": "./fesm2015/gridstack-angular.mjs", - "default": "./fesm2020/gridstack-angular.mjs" - } - }, - "sideEffects": false -} \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/src/base-widget.ts b/node_modules/gridstack/dist/angular/src/base-widget.ts deleted file mode 100644 index 31123039f..000000000 --- a/node_modules/gridstack/dist/angular/src/base-widget.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -/** - * Abstract base class that all custom widgets should extend. - * - * This class provides the interface needed for GridstackItemComponent to: - * - Serialize/deserialize widget data - * - Save/restore widget state - * - Integrate with Angular lifecycle - * - * Extend this class when creating custom widgets for dynamic grids. - * - * @example - * ```typescript - * @Component({ - * selector: 'my-custom-widget', - * template: '
{{data}}
' - * }) - * export class MyCustomWidget extends BaseWidget { - * @Input() data: string = ''; - * - * serialize() { - * return { data: this.data }; - * } - * } - * ``` - */ - -import { Injectable } from '@angular/core'; -import { NgCompInputs, NgGridStackWidget } from './types'; - -/** - * Base widget class for GridStack Angular integration. - */ -@Injectable() -export abstract class BaseWidget { - - /** - * Complete widget definition including position, size, and Angular-specific data. - * Populated automatically when the widget is loaded or saved. - */ - public widgetItem?: NgGridStackWidget; - - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - public serialize(): NgCompInputs | undefined { return; } - - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - public deserialize(w: NgGridStackWidget) { - // save full description for meta data - this.widgetItem = w; - if (!w) return; - - if (w.input) Object.assign(this, w.input); - } - } diff --git a/node_modules/gridstack/dist/angular/src/gridstack-item.component.ts b/node_modules/gridstack/dist/angular/src/gridstack-item.component.ts deleted file mode 100644 index 18653a917..000000000 --- a/node_modules/gridstack/dist/angular/src/gridstack-item.component.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -import { Component, ElementRef, Input, ViewChild, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core'; -import { GridItemHTMLElement, GridStackNode } from 'gridstack'; -import { BaseWidget } from './base-widget'; - -/** - * Extended HTMLElement interface for grid items. - * Stores a back-reference to the Angular component for integration. - */ -export interface GridItemCompHTMLElement extends GridItemHTMLElement { - /** Back-reference to the Angular GridStackItem component */ - _gridItemComp?: GridstackItemComponent; -} - -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -@Component({ - selector: 'gridstack-item', - template: ` -
- - - - - - {{options.content}} -
`, - styles: [` - :host { display: block; } - `], - standalone: true, - // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen... -}) -export class GridstackItemComponent implements OnDestroy { - - /** - * Container for dynamic component creation within this grid item. - * Used to append child components programmatically. - */ - @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef; - - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - public ref: ComponentRef | undefined; - - /** - * Reference to child widget component for serialization. - * Used to save/restore additional data along with grid position. - */ - public childWidget: BaseWidget | undefined; - - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - @Input() public set options(val: GridStackNode) { - const grid = this.el.gridstackNode?.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = {...val, el: this.el}; - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - public get options(): GridStackNode { - return this.el.gridstackNode || this._options || {el: this.el}; - } - - protected _options?: GridStackNode; - - /** return the native element that contains grid specific fields as well */ - public get el(): GridItemCompHTMLElement { return this.elementRef.nativeElement; } - - /** clears the initial options now that we've built */ - public clearOptions() { - delete this._options; - } - - constructor(protected readonly elementRef: ElementRef) { - this.el._gridItemComp = this; - } - - public ngOnDestroy(): void { - this.clearOptions(); - delete this.childWidget - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} diff --git a/node_modules/gridstack/dist/angular/src/gridstack.component.ts b/node_modules/gridstack/dist/angular/src/gridstack.component.ts deleted file mode 100644 index f129aab40..000000000 --- a/node_modules/gridstack/dist/angular/src/gridstack.component.ts +++ /dev/null @@ -1,460 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -import { - AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, Input, - OnDestroy, OnInit, Output, QueryList, Type, ViewChild, ViewContainerRef, reflectComponentType, ComponentRef -} from '@angular/core'; -import { NgIf } from '@angular/common'; -import { Subscription } from 'rxjs'; -import { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions, GridStackWidget } from 'gridstack'; - -import { NgGridStackNode, NgGridStackWidget } from './types'; -import { BaseWidget } from './base-widget'; -import { GridItemCompHTMLElement, GridstackItemComponent } from './gridstack-item.component'; - -/** - * Event handler callback signatures for different GridStack events. - * These types define the structure of data passed to Angular event emitters. - */ - -/** Callback for general events (enable, disable, etc.) */ -export type eventCB = {event: Event}; - -/** Callback for element-specific events (resize, drag, etc.) */ -export type elementCB = {event: Event, el: GridItemHTMLElement}; - -/** Callback for events affecting multiple nodes (change, etc.) */ -export type nodesCB = {event: Event, nodes: GridStackNode[]}; - -/** Callback for drop events with before/after node state */ -export type droppedCB = {event: Event, previousNode: GridStackNode, newNode: GridStackNode}; - -/** - * Extended HTMLElement interface for the grid container. - * Stores a back-reference to the Angular component for integration purposes. - */ -export interface GridCompHTMLElement extends GridHTMLElement { - /** Back-reference to the Angular GridStack component */ - _gridComp?: GridstackComponent; -} - -/** - * Mapping of selector strings to Angular component types. - * Used for dynamic component creation based on widget selectors. - */ -export type SelectorToType = {[key: string]: Type}; - -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -@Component({ - selector: 'gridstack', - template: ` - - - - - - - `, - styles: [` - :host { display: block; } - `], - standalone: true, - imports: [NgIf] - // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen... -}) -export class GridstackComponent implements OnInit, AfterContentInit, OnDestroy { - - /** - * List of template-based grid items (not recommended approach). - * Used to sync between DOM and GridStack internals when items are defined in templates. - * Prefer dynamic component creation instead. - */ - @ContentChildren(GridstackItemComponent) public gridstackItems?: QueryList; - /** - * Container for dynamic component creation (recommended approach). - * Used to append grid items programmatically at runtime. - */ - @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef; - - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - @Input() public set options(o: GridStackOptions) { - if (this._grid) { - this._grid.updateOptions(o); - } else { - this._options = o; - } - } - /** Get the current running grid options */ - public get options(): GridStackOptions { return this._grid?.opts || this._options || {}; } - - /** - * Controls whether empty content should be displayed. - * Set to true to show ng-content with 'empty-content' selector when grid has no items. - * - * @example - * ```html - * - *
Drag widgets here to get started
- *
- * ``` - */ - @Input() public isEmpty?: boolean; - - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - - /** Emitted when widgets are added to the grid */ - @Output() public addedCB = new EventEmitter(); - - /** Emitted when grid layout changes */ - @Output() public changeCB = new EventEmitter(); - - /** Emitted when grid is disabled */ - @Output() public disableCB = new EventEmitter(); - - /** Emitted during widget drag operations */ - @Output() public dragCB = new EventEmitter(); - - /** Emitted when widget drag starts */ - @Output() public dragStartCB = new EventEmitter(); - - /** Emitted when widget drag stops */ - @Output() public dragStopCB = new EventEmitter(); - - /** Emitted when widget is dropped */ - @Output() public droppedCB = new EventEmitter(); - - /** Emitted when grid is enabled */ - @Output() public enableCB = new EventEmitter(); - - /** Emitted when widgets are removed from the grid */ - @Output() public removedCB = new EventEmitter(); - - /** Emitted during widget resize operations */ - @Output() public resizeCB = new EventEmitter(); - - /** Emitted when widget resize starts */ - @Output() public resizeStartCB = new EventEmitter(); - - /** Emitted when widget resize stops */ - @Output() public resizeStopCB = new EventEmitter(); - - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - public get el(): GridCompHTMLElement { return this.elementRef.nativeElement; } - - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - public get grid(): GridStack | undefined { return this._grid; } - - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - public ref: ComponentRef | undefined; - - /** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ - public static selectorToType: SelectorToType = {}; - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - public static addComponentToSelectorType(typeList: Array>) { - typeList.forEach(type => GridstackComponent.selectorToType[ GridstackComponent.getSelector(type) ] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - public static getSelector(type: Type): string { - return reflectComponentType(type)!.selector; - } - - protected _options?: GridStackOptions; - protected _grid?: GridStack; - protected _sub: Subscription | undefined; - protected loaded?: boolean; - - constructor(protected readonly elementRef: ElementRef) { - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - - public ngOnInit(): void { - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!this.options?.children?.length; - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - - this.checkEmpty(); - } - - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - public ngAfterContentInit(): void { - // track whenever the children list changes and update the layout... - this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) this.updateAll(); - this.hookEvents(this.grid); - } - - public ngOnDestroy(): void { - this.unhookEvents(this._grid); - this._sub?.unsubscribe(); - this._grid?.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - public updateAll() { - if (!this.grid) return; - const layout: GridStackWidget[] = []; - this.gridstackItems?.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - - /** check if the grid is empty, if so show alternative content */ - public checkEmpty() { - if (!this.grid) return; - this.isEmpty = !this.grid.engine.nodes.length; - } - - /** get all known events as easy to use Outputs for convenience */ - protected hookEvents(grid?: GridStack) { - if (!grid) return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) return; - grid - .on('added', (event: Event, nodes: GridStackNode[]) => { - const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this; - gridComp.checkEmpty(); - this.addedCB.emit({event, nodes}); - }) - .on('change', (event: Event, nodes: GridStackNode[]) => this.changeCB.emit({event, nodes})) - .on('disable', (event: Event) => this.disableCB.emit({event})) - .on('drag', (event: Event, el: GridItemHTMLElement) => this.dragCB.emit({event, el})) - .on('dragstart', (event: Event, el: GridItemHTMLElement) => this.dragStartCB.emit({event, el})) - .on('dragstop', (event: Event, el: GridItemHTMLElement) => this.dragStopCB.emit({event, el})) - .on('dropped', (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => this.droppedCB.emit({event, previousNode, newNode})) - .on('enable', (event: Event) => this.enableCB.emit({event})) - .on('removed', (event: Event, nodes: GridStackNode[]) => { - const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this; - gridComp.checkEmpty(); - this.removedCB.emit({event, nodes}); - }) - .on('resize', (event: Event, el: GridItemHTMLElement) => this.resizeCB.emit({event, el})) - .on('resizestart', (event: Event, el: GridItemHTMLElement) => this.resizeStartCB.emit({event, el})) - .on('resizestop', (event: Event, el: GridItemHTMLElement) => this.resizeStopCB.emit({event, el})) - } - - protected unhookEvents(grid?: GridStack) { - if (!grid) return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} - -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -export function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined { - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - - const gridItemComp = (host.parentElement as GridItemCompHTMLElement)?._gridItemComp; - if (!gridItemComp) return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = (gridItemComp.childWidget as any)?.container || gridItemComp.container; - const gridRef = container?.createComponent(GridstackComponent); - const grid = gridRef?.instance; - if (!grid) return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } else { - const gridComp = (host as GridCompHTMLElement)._gridComp; - const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent); - const gridItem = gridItemRef?.instance; - if (!gridItem) return; - gridItem.ref = gridItemRef - - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - const childWidget = gridItem.container?.createComponent(type)?.instance as BaseWidget; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - } - - const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { - n.visibleObservable?.disconnect(); - delete n.visibleObservable; - createComp(); - }}); - window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes - } - } else createComp(); - } - - return gridItem.el; - } - } else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = (n.el as GridCompHTMLElement)?._gridComp; - if (grid?.ref) grid.ref.destroy(); - else grid?.ngOnDestroy(); - } else { - const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp; - if (gridItem?.ref) gridItem.ref.destroy(); - else gridItem?.ngOnDestroy(); - } - } - return; -} - -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -export function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget) { - const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp; - if (gridItem) { - const input = gridItem.childWidget?.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = (n.el as GridCompHTMLElement)?._gridComp; - if (grid) { - //.... save any custom data - } -} - -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -export function gsUpdateNgComponents(n: NgGridStackNode) { - const w: NgGridStackWidget = n; - const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp; - if (gridItem?.childWidget && w.input) gridItem.childWidget.deserialize(w); -} \ No newline at end of file diff --git a/node_modules/gridstack/dist/angular/src/gridstack.module.ts b/node_modules/gridstack/dist/angular/src/gridstack.module.ts deleted file mode 100644 index 015ef0fe1..000000000 --- a/node_modules/gridstack/dist/angular/src/gridstack.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -import { NgModule } from "@angular/core"; - -import { GridstackItemComponent } from "./gridstack-item.component"; -import { GridstackComponent } from "./gridstack.component"; - -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -@NgModule({ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], -}) -export class GridstackModule {} diff --git a/node_modules/gridstack/dist/angular/src/types.ts b/node_modules/gridstack/dist/angular/src/types.ts deleted file mode 100644 index 71967ceea..000000000 --- a/node_modules/gridstack/dist/angular/src/types.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ - -import { GridStackNode, GridStackOptions, GridStackWidget } from "gridstack"; - -/** - * Extended GridStackWidget interface for Angular integration. - * Adds Angular-specific properties for dynamic component creation. - */ -export interface NgGridStackWidget extends GridStackWidget { - /** Angular component selector for dynamic creation (e.g., 'my-widget') */ - selector?: string; - /** Serialized data for component @Input() properties */ - input?: NgCompInputs; - /** Configuration for nested sub-grids */ - subGridOpts?: NgGridStackOptions; -} - -/** - * Extended GridStackNode interface for Angular integration. - * Adds component selector for dynamic content creation. - */ -export interface NgGridStackNode extends GridStackNode { - /** Angular component selector for this node's content */ - selector?: string; -} - -/** - * Extended GridStackOptions interface for Angular integration. - * Supports Angular-specific widget definitions and nested grids. - */ -export interface NgGridStackOptions extends GridStackOptions { - /** Array of Angular widget definitions for initial grid setup */ - children?: NgGridStackWidget[]; - /** Configuration for nested sub-grids (Angular-aware) */ - subGridOpts?: NgGridStackOptions; -} - -/** - * Type for component input data serialization. - * Maps @Input() property names to their values for widget persistence. - * - * @example - * ```typescript - * const inputs: NgCompInputs = { - * title: 'My Widget', - * value: 42, - * config: { enabled: true } - * }; - * ``` - */ -export type NgCompInputs = {[key: string]: any}; diff --git a/node_modules/gridstack/dist/dd-base-impl.d.ts b/node_modules/gridstack/dist/dd-base-impl.d.ts index e607f4099..88f406f1e 100644 --- a/node_modules/gridstack/dist/dd-base-impl.d.ts +++ b/node_modules/gridstack/dist/dd-base-impl.d.ts @@ -1,5 +1,5 @@ /** - * dd-base-impl.ts 12.3.2 + * dd-base-impl.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ /** diff --git a/node_modules/gridstack/dist/dd-base-impl.js b/node_modules/gridstack/dist/dd-base-impl.js index 2c31698ac..f3b960152 100644 --- a/node_modules/gridstack/dist/dd-base-impl.js +++ b/node_modules/gridstack/dist/dd-base-impl.js @@ -1,5 +1,5 @@ /** - * dd-base-impl.ts 12.3.2 + * dd-base-impl.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ /** diff --git a/node_modules/gridstack/dist/dd-base-impl.js.map b/node_modules/gridstack/dist/dd-base-impl.js.map index c3d19ba78..db929a813 100644 --- a/node_modules/gridstack/dist/dd-base-impl.js.map +++ b/node_modules/gridstack/dist/dd-base-impl.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-base-impl.js","sourceRoot":"","sources":["../src/dd-base-impl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;;GAIG;AACH,MAAM,OAAgB,eAAe;IAArC;QASE,gBAAgB;QACN,mBAAc,GAEpB,EAAE,CAAC;IAwDT,CAAC;IAnEC;;;OAGG;IACH,IAAW,QAAQ,KAAgB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAS3D;;;;;OAKG;IACI,EAAE,CAAC,KAAa,EAAE,QAAuB;QAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM;QACX,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACI,YAAY,CAAC,SAAiB,EAAE,KAAY;QACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;YACzE,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;CACF","sourcesContent":["/**\n * dd-base-impl.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\n/**\n * Type for event callback functions used in drag & drop operations.\n * Can return boolean to indicate if the event should continue propagation.\n */\nexport type EventCallback = (event: Event) => boolean|void;\n\n/**\n * Abstract base class for all drag & drop implementations.\n * Provides common functionality for event handling, enable/disable state,\n * and lifecycle management used by draggable, droppable, and resizable implementations.\n */\nexport abstract class DDBaseImplement {\n /**\n * Returns the current disabled state.\n * Note: Use enable()/disable() methods to change state as other operations need to happen.\n */\n public get disabled(): boolean { return this._disabled; }\n\n /** @internal */\n protected _disabled: boolean; // initial state to differentiate from false\n /** @internal */\n protected _eventRegister: {\n [eventName: string]: EventCallback;\n } = {};\n\n /**\n * Register an event callback for the specified event.\n * \n * @param event - Event name to listen for\n * @param callback - Function to call when event occurs\n */\n public on(event: string, callback: EventCallback): void {\n this._eventRegister[event] = callback;\n }\n\n /**\n * Unregister an event callback for the specified event.\n * \n * @param event - Event name to stop listening for\n */\n public off(event: string): void {\n delete this._eventRegister[event];\n }\n\n /**\n * Enable this drag & drop implementation.\n * Subclasses should override to perform additional setup.\n */\n public enable(): void {\n this._disabled = false;\n }\n\n /**\n * Disable this drag & drop implementation.\n * Subclasses should override to perform additional cleanup.\n */\n public disable(): void {\n this._disabled = true;\n }\n\n /**\n * Destroy this drag & drop implementation and clean up resources.\n * Removes all event handlers and clears internal state.\n */\n public destroy(): void {\n delete this._eventRegister;\n }\n\n /**\n * Trigger a registered event callback if one exists and the implementation is enabled.\n * \n * @param eventName - Name of the event to trigger\n * @param event - DOM event object to pass to the callback\n * @returns Result from the callback function, if any\n */\n public triggerEvent(eventName: string, event: Event): boolean|void {\n if (!this.disabled && this._eventRegister && this._eventRegister[eventName])\n return this._eventRegister[eventName](event);\n }\n}\n\n/**\n * Interface for HTML elements extended with drag & drop options.\n * Used to associate DD configuration with DOM elements.\n */\nexport interface HTMLElementExtendOpt {\n /** The HTML element being extended */\n el: HTMLElement;\n /** The drag & drop options/configuration */\n option: T;\n /** Method to update the options and return the DD implementation */\n updateOption(T): DDBaseImplement;\n}\n"]} \ No newline at end of file +{"version":3,"file":"dd-base-impl.js","sourceRoot":"","sources":["../src/dd-base-impl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;;GAIG;AACH,MAAM,OAAgB,eAAe;IAArC;QASE,gBAAgB;QACN,mBAAc,GAEpB,EAAE,CAAC;IAwDT,CAAC;IAnEC;;;OAGG;IACH,IAAW,QAAQ,KAAgB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAS3D;;;;;OAKG;IACI,EAAE,CAAC,KAAa,EAAE,QAAuB;QAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM;QACX,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACI,YAAY,CAAC,SAAiB,EAAE,KAAY;QACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;YACzE,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;CACF","sourcesContent":["/**\n * dd-base-impl.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\n/**\n * Type for event callback functions used in drag & drop operations.\n * Can return boolean to indicate if the event should continue propagation.\n */\nexport type EventCallback = (event: Event) => boolean|void;\n\n/**\n * Abstract base class for all drag & drop implementations.\n * Provides common functionality for event handling, enable/disable state,\n * and lifecycle management used by draggable, droppable, and resizable implementations.\n */\nexport abstract class DDBaseImplement {\n /**\n * Returns the current disabled state.\n * Note: Use enable()/disable() methods to change state as other operations need to happen.\n */\n public get disabled(): boolean { return this._disabled; }\n\n /** @internal */\n protected _disabled: boolean; // initial state to differentiate from false\n /** @internal */\n protected _eventRegister: {\n [eventName: string]: EventCallback;\n } = {};\n\n /**\n * Register an event callback for the specified event.\n *\n * @param event - Event name to listen for\n * @param callback - Function to call when event occurs\n */\n public on(event: string, callback: EventCallback): void {\n this._eventRegister[event] = callback;\n }\n\n /**\n * Unregister an event callback for the specified event.\n *\n * @param event - Event name to stop listening for\n */\n public off(event: string): void {\n delete this._eventRegister[event];\n }\n\n /**\n * Enable this drag & drop implementation.\n * Subclasses should override to perform additional setup.\n */\n public enable(): void {\n this._disabled = false;\n }\n\n /**\n * Disable this drag & drop implementation.\n * Subclasses should override to perform additional cleanup.\n */\n public disable(): void {\n this._disabled = true;\n }\n\n /**\n * Destroy this drag & drop implementation and clean up resources.\n * Removes all event handlers and clears internal state.\n */\n public destroy(): void {\n delete this._eventRegister;\n }\n\n /**\n * Trigger a registered event callback if one exists and the implementation is enabled.\n *\n * @param eventName - Name of the event to trigger\n * @param event - DOM event object to pass to the callback\n * @returns Result from the callback function, if any\n */\n public triggerEvent(eventName: string, event: Event): boolean|void {\n if (!this.disabled && this._eventRegister && this._eventRegister[eventName])\n return this._eventRegister[eventName](event);\n }\n}\n\n/**\n * Interface for HTML elements extended with drag & drop options.\n * Used to associate DD configuration with DOM elements.\n */\nexport interface HTMLElementExtendOpt {\n /** The HTML element being extended */\n el: HTMLElement;\n /** The drag & drop options/configuration */\n option: T;\n /** Method to update the options and return the DD implementation */\n updateOption(T): DDBaseImplement;\n}\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-draggable.d.ts b/node_modules/gridstack/dist/dd-draggable.d.ts index 064054d34..b7ae3f5cc 100644 --- a/node_modules/gridstack/dist/dd-draggable.d.ts +++ b/node_modules/gridstack/dist/dd-draggable.d.ts @@ -1,5 +1,5 @@ /** - * dd-draggable.ts 12.3.2 + * dd-draggable.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl'; diff --git a/node_modules/gridstack/dist/dd-draggable.js b/node_modules/gridstack/dist/dd-draggable.js index 73c7eb9a9..64913f080 100644 --- a/node_modules/gridstack/dist/dd-draggable.js +++ b/node_modules/gridstack/dist/dd-draggable.js @@ -1,11 +1,11 @@ /** - * dd-draggable.ts 12.3.2 + * dd-draggable.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDManager } from './dd-manager'; import { Utils } from './utils'; import { DDBaseImplement } from './dd-base-impl'; -import { isTouch, touchend, touchmove, touchstart, pointerdown } from './dd-touch'; +import { isTouch, touchend, touchmove, touchstart, pointerdown, DDTouch } from './dd-touch'; // make sure we are not clicking on known object that handles mouseDown const skipMouseDown = 'input,textarea,button,select,option,[contenteditable="true"],.ui-resizable-handle'; // let count = 0; // TEST @@ -87,6 +87,9 @@ class DDDraggable extends DDBaseImplement { } /** @internal call when mouse goes down before a dragstart happens */ _mouseDown(e) { + // if real brower event (trusted:true vs false for our simulated ones) and we didn't correctly clear the last touch event, clear things up + if (DDTouch.touchHandled && e.isTrusted) + DDTouch.touchHandled = false; // don't let more than one widget handle mouseStart if (DDManager.mouseHandled) return; diff --git a/node_modules/gridstack/dist/dd-draggable.js.map b/node_modules/gridstack/dist/dd-draggable.js.map index f6741b7da..5e54d5ab6 100644 --- a/node_modules/gridstack/dist/dd-draggable.js.map +++ b/node_modules/gridstack/dist/dd-draggable.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-draggable.js","sourceRoot":"","sources":["../src/dd-draggable.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-draggable.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDManager } from './dd-manager';\nimport { DragTransform, Utils } from './utils';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { GridItemHTMLElement, DDUIData, GridStackNode, GridStackPosition, DDDragOpt } from './types';\nimport { DDElementHost } from './dd-element';\nimport { isTouch, touchend, touchmove, touchstart, pointerdown } from './dd-touch';\nimport { GridHTMLElement } from './gridstack';\n\ninterface DragOffset {\n left: number;\n top: number;\n width: number;\n height: number;\n offsetLeft: number;\n offsetTop: number;\n}\n\ninterface GridStackNodeRotate extends GridStackNode {\n _origRotate?: GridStackPosition;\n}\n\ntype DDDragEvent = 'drag' | 'dragstart' | 'dragstop';\n\n// make sure we are not clicking on known object that handles mouseDown\nconst skipMouseDown = 'input,textarea,button,select,option,[contenteditable=\"true\"],.ui-resizable-handle';\n\n// let count = 0; // TEST\n\nexport class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt {\n public helper: HTMLElement; // used by GridStackDDNative\n\n /** @internal */\n protected mouseDownEvent: MouseEvent;\n /** @internal */\n protected dragOffset: DragOffset;\n /** @internal */\n protected dragElementOriginStyle: Array;\n /** @internal */\n protected dragEls: HTMLElement[];\n /** @internal true while we are dragging an item around */\n protected dragging: boolean;\n /** @internal last drag event */\n protected lastDrag: DragEvent;\n /** @internal */\n protected parentOriginStylePosition: string;\n /** @internal */\n protected helperContainment: HTMLElement;\n /** @internal properties we change during dragging, and restore back */\n protected static originStyleProp = ['width', 'height', 'transform', 'transform-origin', 'transition', 'pointerEvents', 'position', 'left', 'top', 'minWidth', 'willChange'];\n /** @internal pause before we call the actual drag hit collision code */\n protected dragTimeout: number;\n /** @internal */\n protected dragTransform: DragTransform = {\n xScale: 1,\n yScale: 1,\n xOffset: 0,\n yOffset: 0\n };\n\n constructor(public el: GridItemHTMLElement, public option: DDDragOpt = {}) {\n super();\n\n // get the element that is actually supposed to be dragged by\n const handleName = option?.handle?.substring(1);\n const n = el.gridstackNode;\n this.dragEls = !handleName || el.classList.contains(handleName) ? [el] : (n?.subGrid ? [el.querySelector(option.handle) || el] : Array.from(el.querySelectorAll(option.handle)));\n if (this.dragEls.length === 0) {\n this.dragEls = [el];\n }\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._keyEvent = this._keyEvent.bind(this);\n this.enable();\n }\n\n public on(event: DDDragEvent, callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: DDDragEvent): void {\n super.off(event);\n }\n\n public enable(): void {\n if (this.disabled === false) return;\n super.enable();\n this.dragEls.forEach(dragEl => {\n dragEl.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n dragEl.addEventListener('touchstart', touchstart);\n dragEl.addEventListener('pointerdown', pointerdown);\n // dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n });\n this.el.classList.remove('ui-draggable-disabled');\n }\n\n public disable(forDestroy = false): void {\n if (this.disabled === true) return;\n super.disable();\n this.dragEls.forEach(dragEl => {\n dragEl.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n dragEl.removeEventListener('touchstart', touchstart);\n dragEl.removeEventListener('pointerdown', pointerdown);\n }\n });\n if (!forDestroy) this.el.classList.add('ui-draggable-disabled');\n }\n\n public destroy(): void {\n if (this.dragTimeout) window.clearTimeout(this.dragTimeout);\n delete this.dragTimeout;\n if (this.mouseDownEvent) this._mouseUp(this.mouseDownEvent);\n this.disable(true);\n delete this.el;\n delete this.helper;\n delete this.option;\n super.destroy();\n }\n\n public updateOption(opts: DDDragOpt): DDDraggable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n return this;\n }\n\n /** @internal call when mouse goes down before a dragstart happens */\n protected _mouseDown(e: MouseEvent): boolean {\n // don't let more than one widget handle mouseStart\n if (DDManager.mouseHandled) return;\n if (e.button !== 0) return true; // only left click\n\n // make sure we are not clicking on known object that handles mouseDown, or ones supplied by the user\n if (!this.dragEls.find(el => el === e.target) && (e.target as HTMLElement).closest(skipMouseDown)) return true;\n if (this.option.cancel) {\n if ((e.target as HTMLElement).closest(this.option.cancel)) return true;\n }\n\n this.mouseDownEvent = e;\n delete this.dragging;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n // document handler so we can continue receiving moves as the item is 'fixed' position, and capture=true so WE get a first crack\n document.addEventListener('mousemove', this._mouseMove, { capture: true, passive: true }); // true=capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n e.currentTarget.addEventListener('touchmove', touchmove);\n e.currentTarget.addEventListener('touchend', touchend);\n }\n\n e.preventDefault();\n // preventDefault() prevents blur event which occurs just after mousedown event.\n // if an editable content has focus, then blur must be call\n if (document.activeElement) (document.activeElement as HTMLElement).blur();\n\n DDManager.mouseHandled = true;\n return true;\n }\n\n /** @internal method to call actual drag event */\n protected _callDrag(e: DragEvent): void {\n if (!this.dragging) return;\n const ev = Utils.initEvent(e, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n }\n\n /** @internal called when the main page (after successful mousedown) receives a move event to drag the item around the screen */\n protected _mouseMove(e: DragEvent): boolean {\n // console.log(`${count++} move ${e.x},${e.y}`)\n const s = this.mouseDownEvent;\n this.lastDrag = e;\n\n if (this.dragging) {\n this._dragFollow(e);\n // delay actual grid handling drag until we pause for a while if set\n if (DDManager.pauseDrag) {\n const pause = Number.isInteger(DDManager.pauseDrag) ? DDManager.pauseDrag as number : 100;\n if (this.dragTimeout) window.clearTimeout(this.dragTimeout);\n this.dragTimeout = window.setTimeout(() => this._callDrag(e), pause);\n } else {\n this._callDrag(e);\n }\n } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 3) {\n /**\n * don't start unless we've moved at least 3 pixels\n */\n this.dragging = true;\n DDManager.dragElement = this;\n // if we're dragging an actual grid item, set the current drop as the grid (to detect enter/leave)\n const grid = this.el.gridstackNode?.grid;\n if (grid) {\n DDManager.dropElement = (grid.el as DDElementHost).ddElement.ddDroppable;\n } else {\n delete DDManager.dropElement;\n }\n this.helper = this._createHelper();\n this._setupHelperContainmentStyle();\n this.dragTransform = Utils.getValuesFromTransformedElement(this.helperContainment);\n this.dragOffset = this._getDragOffset(e, this.el, this.helperContainment);\n this._setupHelperStyle(e);\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstart' });\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.triggerEvent('dragstart', ev);\n // now track keyboard events to cancel or rotate\n document.addEventListener('keydown', this._keyEvent);\n }\n // e.preventDefault(); // passive = true. OLD: was needed otherwise we get text sweep text selection as we drag around\n return true;\n }\n\n /** @internal call when the mouse gets released to drop the item at current location */\n protected _mouseUp(e: MouseEvent): void {\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch && e.currentTarget) { // destroy() during nested grid call us again wit fake _mouseUp\n e.currentTarget.removeEventListener('touchmove', touchmove, true);\n e.currentTarget.removeEventListener('touchend', touchend, true);\n }\n if (this.dragging) {\n delete this.dragging;\n delete (this.el.gridstackNode as GridStackNodeRotate)?._origRotate;\n document.removeEventListener('keydown', this._keyEvent);\n\n // reset the drop target if dragging over ourself (already parented, just moving during stop callback below)\n if (DDManager.dropElement?.el === this.el.parentElement) {\n delete DDManager.dropElement;\n }\n\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper !== this.el) this.helper.remove(); // hide now\n this._removeHelperStyle();\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // NOTE: destroy() will be called when removing item, so expect NULL ptr after!\n }\n this.triggerEvent('dragstop', ev);\n\n // call the droppable method to receive the item\n if (DDManager.dropElement) {\n DDManager.dropElement.drop(e);\n }\n }\n delete this.helper;\n delete this.mouseDownEvent;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n delete DDManager.mouseHandled;\n e.preventDefault();\n }\n\n /** @internal call when keys are being pressed - use Esc to cancel, R to rotate */\n protected _keyEvent(e: KeyboardEvent): void {\n const n = this.el.gridstackNode as GridStackNodeRotate;\n const grid = n?.grid || (DDManager.dropElement?.el as GridHTMLElement)?.gridstack;\n\n if (e.key === 'Escape') {\n if (n && n._origRotate) {\n n._orig = n._origRotate;\n delete n._origRotate;\n }\n grid?.cancelDrag();\n this._mouseUp(this.mouseDownEvent);\n } else if (n && grid && (e.key === 'r' || e.key === 'R')) {\n if (!Utils.canBeRotated(n)) return;\n n._origRotate = n._origRotate || { ...n._orig }; // store the real orig size in case we Esc after doing rotation\n delete n._moving; // force rotate to happen (move waits for >50% coverage otherwise)\n grid.setAnimation(false) // immediate rotate so _getDragOffset() gets the right dom size below\n .rotate(n.el, { top: -this.dragOffset.offsetTop, left: -this.dragOffset.offsetLeft })\n .setAnimation();\n n._moving = true;\n this.dragOffset = this._getDragOffset(this.lastDrag, n.el, this.helperContainment);\n this.helper.style.width = this.dragOffset.width + 'px';\n this.helper.style.height = this.dragOffset.height + 'px';\n Utils.swap(n._orig, 'w', 'h');\n delete n._rect;\n this._mouseMove(this.lastDrag);\n }\n }\n\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\n protected _createHelper(): HTMLElement {\n let helper = this.el;\n if (typeof this.option.helper === 'function') {\n helper = this.option.helper(this.el);\n } else if (this.option.helper === 'clone') {\n helper = Utils.cloneNode(this.el);\n }\n if (!helper.parentElement) {\n Utils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentElement : this.option.appendTo);\n }\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\n return helper;\n }\n\n /** @internal set the fix position of the dragged item */\n protected _setupHelperStyle(e: DragEvent): DDDraggable {\n this.helper.classList.add('ui-draggable-dragging');\n this.el.gridstackNode?.grid?.el.classList.add('grid-stack-dragging');\n // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593\n const style = this.helper.style;\n style.pointerEvents = 'none'; // needed for over items to get enter/leave\n // style.cursor = 'move'; // TODO: can't set with pointerEvents=none ! (no longer in CSS either as no-op)\n style.width = this.dragOffset.width + 'px';\n style.height = this.dragOffset.height + 'px';\n style.willChange = 'left, top';\n style.position = 'fixed'; // let us drag between grids by not clipping as parent .grid-stack is position: 'relative'\n this._dragFollow(e); // now position it\n style.transition = 'none'; // show up instantly\n setTimeout(() => {\n if (this.helper) {\n style.transition = null; // recover animation\n }\n }, 0);\n return this;\n }\n\n /** @internal restore back the original style before dragging */\n protected _removeHelperStyle(): DDDraggable {\n this.helper.classList.remove('ui-draggable-dragging');\n this.el.gridstackNode?.grid?.el.classList.remove('grid-stack-dragging');\n const node = (this.helper as GridItemHTMLElement)?.gridstackNode;\n // don't bother restoring styles if we're gonna remove anyway...\n if (!node?._isAboutToRemove && this.dragElementOriginStyle) {\n const helper = this.helper;\n // don't animate, otherwise we animate offseted when switching back to 'absolute' from 'fixed'.\n // TODO: this also removes resizing animation which doesn't have this issue, but others.\n // Ideally both would animate ('move' would immediately restore 'absolute' and adjust coordinate to match,\n // then trigger a delay (repaint) to restore to final dest with animate) but then we need to make sure 'resizestop'\n // is called AFTER 'transitionend' event is received (see https://github.com/gridstack/gridstack.js/issues/2033)\n const transition = this.dragElementOriginStyle['transition'] || null;\n helper.style.transition = this.dragElementOriginStyle['transition'] = 'none'; // can't be NULL #1973\n DDDraggable.originStyleProp.forEach(prop => helper.style[prop] = this.dragElementOriginStyle[prop] || null);\n setTimeout(() => helper.style.transition = transition, 50); // recover animation from saved vars after a pause (0 isn't enough #1973)\n }\n delete this.dragElementOriginStyle;\n return this;\n }\n\n /** @internal updates the top/left position to follow the mouse */\n protected _dragFollow(e: DragEvent): void {\n const containmentRect = { left: 0, top: 0 };\n // if (this.helper.style.position === 'absolute') { // we use 'fixed'\n // const { left, top } = this.helperContainment.getBoundingClientRect();\n // containmentRect = { left, top };\n // }\n const style = this.helper.style;\n const offset = this.dragOffset;\n style.left = (e.clientX + offset.offsetLeft - containmentRect.left) * this.dragTransform.xScale + 'px';\n style.top = (e.clientY + offset.offsetTop - containmentRect.top) * this.dragTransform.yScale + 'px';\n }\n\n /** @internal */\n protected _setupHelperContainmentStyle(): DDDraggable {\n this.helperContainment = this.helper.parentElement;\n if (this.helper.style.position !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n }\n\n /** @internal */\n protected _getDragOffset(event: DragEvent, el: HTMLElement, parent: HTMLElement): DragOffset {\n\n // in case ancestor has transform/perspective css properties that change the viewpoint\n let xformOffsetX = 0;\n let xformOffsetY = 0;\n if (parent) {\n xformOffsetX = this.dragTransform.xOffset;\n xformOffsetY = this.dragTransform.yOffset;\n }\n\n const targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: - event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: - event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width * this.dragTransform.xScale,\n height: targetOffset.height * this.dragTransform.yScale\n };\n }\n\n /** @internal TODO: set to public as called by DDDroppable! */\n public ui(): DDUIData {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const offset = this.helper.getBoundingClientRect();\n return {\n position: { //Current CSS position of the helper as { top, left } object\n top: (offset.top - containmentRect.top) * this.dragTransform.yScale,\n left: (offset.left - containmentRect.left) * this.dragTransform.xScale\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"dd-draggable.js","sourceRoot":"","sources":["../src/dd-draggable.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-draggable.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDManager } from './dd-manager';\nimport { DragTransform, Utils } from './utils';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { GridItemHTMLElement, DDUIData, GridStackNode, GridStackPosition, DDDragOpt } from './types';\nimport { DDElementHost } from './dd-element';\nimport { isTouch, touchend, touchmove, touchstart, pointerdown, DDTouch } from './dd-touch';\nimport { GridHTMLElement } from './gridstack';\n\ninterface DragOffset {\n left: number;\n top: number;\n width: number;\n height: number;\n offsetLeft: number;\n offsetTop: number;\n}\n\ninterface GridStackNodeRotate extends GridStackNode {\n _origRotate?: GridStackPosition;\n}\n\ntype DDDragEvent = 'drag' | 'dragstart' | 'dragstop';\n\n// make sure we are not clicking on known object that handles mouseDown\nconst skipMouseDown = 'input,textarea,button,select,option,[contenteditable=\"true\"],.ui-resizable-handle';\n\n// let count = 0; // TEST\n\nexport class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt {\n public helper: HTMLElement; // used by GridStackDDNative\n\n /** @internal */\n protected mouseDownEvent: MouseEvent;\n /** @internal */\n protected dragOffset: DragOffset;\n /** @internal */\n protected dragElementOriginStyle: Array;\n /** @internal */\n protected dragEls: HTMLElement[];\n /** @internal true while we are dragging an item around */\n protected dragging: boolean;\n /** @internal last drag event */\n protected lastDrag: DragEvent;\n /** @internal */\n protected parentOriginStylePosition: string;\n /** @internal */\n protected helperContainment: HTMLElement;\n /** @internal properties we change during dragging, and restore back */\n protected static originStyleProp = ['width', 'height', 'transform', 'transform-origin', 'transition', 'pointerEvents', 'position', 'left', 'top', 'minWidth', 'willChange'];\n /** @internal pause before we call the actual drag hit collision code */\n protected dragTimeout: number;\n /** @internal */\n protected dragTransform: DragTransform = {\n xScale: 1,\n yScale: 1,\n xOffset: 0,\n yOffset: 0\n };\n\n constructor(public el: GridItemHTMLElement, public option: DDDragOpt = {}) {\n super();\n\n // get the element that is actually supposed to be dragged by\n const handleName = option?.handle?.substring(1);\n const n = el.gridstackNode;\n this.dragEls = !handleName || el.classList.contains(handleName) ? [el] : (n?.subGrid ? [el.querySelector(option.handle) || el] : Array.from(el.querySelectorAll(option.handle)));\n if (this.dragEls.length === 0) {\n this.dragEls = [el];\n }\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._keyEvent = this._keyEvent.bind(this);\n this.enable();\n }\n\n public on(event: DDDragEvent, callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: DDDragEvent): void {\n super.off(event);\n }\n\n public enable(): void {\n if (this.disabled === false) return;\n super.enable();\n this.dragEls.forEach(dragEl => {\n dragEl.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n dragEl.addEventListener('touchstart', touchstart);\n dragEl.addEventListener('pointerdown', pointerdown);\n // dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n });\n this.el.classList.remove('ui-draggable-disabled');\n }\n\n public disable(forDestroy = false): void {\n if (this.disabled === true) return;\n super.disable();\n this.dragEls.forEach(dragEl => {\n dragEl.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n dragEl.removeEventListener('touchstart', touchstart);\n dragEl.removeEventListener('pointerdown', pointerdown);\n }\n });\n if (!forDestroy) this.el.classList.add('ui-draggable-disabled');\n }\n\n public destroy(): void {\n if (this.dragTimeout) window.clearTimeout(this.dragTimeout);\n delete this.dragTimeout;\n if (this.mouseDownEvent) this._mouseUp(this.mouseDownEvent);\n this.disable(true);\n delete this.el;\n delete this.helper;\n delete this.option;\n super.destroy();\n }\n\n public updateOption(opts: DDDragOpt): DDDraggable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n return this;\n }\n\n /** @internal call when mouse goes down before a dragstart happens */\n protected _mouseDown(e: MouseEvent): boolean {\n // if real brower event (trusted:true vs false for our simulated ones) and we didn't correctly clear the last touch event, clear things up\n if (DDTouch.touchHandled && e.isTrusted) DDTouch.touchHandled = false;\n\n // don't let more than one widget handle mouseStart\n if (DDManager.mouseHandled) return;\n if (e.button !== 0) return true; // only left click\n\n // make sure we are not clicking on known object that handles mouseDown, or ones supplied by the user\n if (!this.dragEls.find(el => el === e.target) && (e.target as HTMLElement).closest(skipMouseDown)) return true;\n if (this.option.cancel) {\n if ((e.target as HTMLElement).closest(this.option.cancel)) return true;\n }\n\n this.mouseDownEvent = e;\n delete this.dragging;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n // document handler so we can continue receiving moves as the item is 'fixed' position, and capture=true so WE get a first crack\n document.addEventListener('mousemove', this._mouseMove, { capture: true, passive: true }); // true=capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n e.currentTarget.addEventListener('touchmove', touchmove);\n e.currentTarget.addEventListener('touchend', touchend);\n }\n\n e.preventDefault();\n // preventDefault() prevents blur event which occurs just after mousedown event.\n // if an editable content has focus, then blur must be call\n if (document.activeElement) (document.activeElement as HTMLElement).blur();\n\n DDManager.mouseHandled = true;\n return true;\n }\n\n /** @internal method to call actual drag event */\n protected _callDrag(e: DragEvent): void {\n if (!this.dragging) return;\n const ev = Utils.initEvent(e, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n }\n\n /** @internal called when the main page (after successful mousedown) receives a move event to drag the item around the screen */\n protected _mouseMove(e: DragEvent): boolean {\n // console.log(`${count++} move ${e.x},${e.y}`)\n const s = this.mouseDownEvent;\n this.lastDrag = e;\n\n if (this.dragging) {\n this._dragFollow(e);\n // delay actual grid handling drag until we pause for a while if set\n if (DDManager.pauseDrag) {\n const pause = Number.isInteger(DDManager.pauseDrag) ? DDManager.pauseDrag as number : 100;\n if (this.dragTimeout) window.clearTimeout(this.dragTimeout);\n this.dragTimeout = window.setTimeout(() => this._callDrag(e), pause);\n } else {\n this._callDrag(e);\n }\n } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 3) {\n /**\n * don't start unless we've moved at least 3 pixels\n */\n this.dragging = true;\n DDManager.dragElement = this;\n // if we're dragging an actual grid item, set the current drop as the grid (to detect enter/leave)\n const grid = this.el.gridstackNode?.grid;\n if (grid) {\n DDManager.dropElement = (grid.el as DDElementHost).ddElement.ddDroppable;\n } else {\n delete DDManager.dropElement;\n }\n this.helper = this._createHelper();\n this._setupHelperContainmentStyle();\n this.dragTransform = Utils.getValuesFromTransformedElement(this.helperContainment);\n this.dragOffset = this._getDragOffset(e, this.el, this.helperContainment);\n this._setupHelperStyle(e);\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstart' });\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.triggerEvent('dragstart', ev);\n // now track keyboard events to cancel or rotate\n document.addEventListener('keydown', this._keyEvent);\n }\n // e.preventDefault(); // passive = true. OLD: was needed otherwise we get text sweep text selection as we drag around\n return true;\n }\n\n /** @internal call when the mouse gets released to drop the item at current location */\n protected _mouseUp(e: MouseEvent): void {\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch && e.currentTarget) { // destroy() during nested grid call us again wit fake _mouseUp\n e.currentTarget.removeEventListener('touchmove', touchmove, true);\n e.currentTarget.removeEventListener('touchend', touchend, true);\n }\n if (this.dragging) {\n delete this.dragging;\n delete (this.el.gridstackNode as GridStackNodeRotate)?._origRotate;\n document.removeEventListener('keydown', this._keyEvent);\n\n // reset the drop target if dragging over ourself (already parented, just moving during stop callback below)\n if (DDManager.dropElement?.el === this.el.parentElement) {\n delete DDManager.dropElement;\n }\n\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper !== this.el) this.helper.remove(); // hide now\n this._removeHelperStyle();\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // NOTE: destroy() will be called when removing item, so expect NULL ptr after!\n }\n this.triggerEvent('dragstop', ev);\n\n // call the droppable method to receive the item\n if (DDManager.dropElement) {\n DDManager.dropElement.drop(e);\n }\n }\n delete this.helper;\n delete this.mouseDownEvent;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n delete DDManager.mouseHandled;\n e.preventDefault();\n }\n\n /** @internal call when keys are being pressed - use Esc to cancel, R to rotate */\n protected _keyEvent(e: KeyboardEvent): void {\n const n = this.el.gridstackNode as GridStackNodeRotate;\n const grid = n?.grid || (DDManager.dropElement?.el as GridHTMLElement)?.gridstack;\n\n if (e.key === 'Escape') {\n if (n && n._origRotate) {\n n._orig = n._origRotate;\n delete n._origRotate;\n }\n grid?.cancelDrag();\n this._mouseUp(this.mouseDownEvent);\n } else if (n && grid && (e.key === 'r' || e.key === 'R')) {\n if (!Utils.canBeRotated(n)) return;\n n._origRotate = n._origRotate || { ...n._orig }; // store the real orig size in case we Esc after doing rotation\n delete n._moving; // force rotate to happen (move waits for >50% coverage otherwise)\n grid.setAnimation(false) // immediate rotate so _getDragOffset() gets the right dom size below\n .rotate(n.el, { top: -this.dragOffset.offsetTop, left: -this.dragOffset.offsetLeft })\n .setAnimation();\n n._moving = true;\n this.dragOffset = this._getDragOffset(this.lastDrag, n.el, this.helperContainment);\n this.helper.style.width = this.dragOffset.width + 'px';\n this.helper.style.height = this.dragOffset.height + 'px';\n Utils.swap(n._orig, 'w', 'h');\n delete n._rect;\n this._mouseMove(this.lastDrag);\n }\n }\n\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\n protected _createHelper(): HTMLElement {\n let helper = this.el;\n if (typeof this.option.helper === 'function') {\n helper = this.option.helper(this.el);\n } else if (this.option.helper === 'clone') {\n helper = Utils.cloneNode(this.el);\n }\n if (!helper.parentElement) {\n Utils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentElement : this.option.appendTo);\n }\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\n return helper;\n }\n\n /** @internal set the fix position of the dragged item */\n protected _setupHelperStyle(e: DragEvent): DDDraggable {\n this.helper.classList.add('ui-draggable-dragging');\n this.el.gridstackNode?.grid?.el.classList.add('grid-stack-dragging');\n // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593\n const style = this.helper.style;\n style.pointerEvents = 'none'; // needed for over items to get enter/leave\n // style.cursor = 'move'; // TODO: can't set with pointerEvents=none ! (no longer in CSS either as no-op)\n style.width = this.dragOffset.width + 'px';\n style.height = this.dragOffset.height + 'px';\n style.willChange = 'left, top';\n style.position = 'fixed'; // let us drag between grids by not clipping as parent .grid-stack is position: 'relative'\n this._dragFollow(e); // now position it\n style.transition = 'none'; // show up instantly\n setTimeout(() => {\n if (this.helper) {\n style.transition = null; // recover animation\n }\n }, 0);\n return this;\n }\n\n /** @internal restore back the original style before dragging */\n protected _removeHelperStyle(): DDDraggable {\n this.helper.classList.remove('ui-draggable-dragging');\n this.el.gridstackNode?.grid?.el.classList.remove('grid-stack-dragging');\n const node = (this.helper as GridItemHTMLElement)?.gridstackNode;\n // don't bother restoring styles if we're gonna remove anyway...\n if (!node?._isAboutToRemove && this.dragElementOriginStyle) {\n const helper = this.helper;\n // don't animate, otherwise we animate offseted when switching back to 'absolute' from 'fixed'.\n // TODO: this also removes resizing animation which doesn't have this issue, but others.\n // Ideally both would animate ('move' would immediately restore 'absolute' and adjust coordinate to match,\n // then trigger a delay (repaint) to restore to final dest with animate) but then we need to make sure 'resizestop'\n // is called AFTER 'transitionend' event is received (see https://github.com/gridstack/gridstack.js/issues/2033)\n const transition = this.dragElementOriginStyle['transition'] || null;\n helper.style.transition = this.dragElementOriginStyle['transition'] = 'none'; // can't be NULL #1973\n DDDraggable.originStyleProp.forEach(prop => helper.style[prop] = this.dragElementOriginStyle[prop] || null);\n setTimeout(() => helper.style.transition = transition, 50); // recover animation from saved vars after a pause (0 isn't enough #1973)\n }\n delete this.dragElementOriginStyle;\n return this;\n }\n\n /** @internal updates the top/left position to follow the mouse */\n protected _dragFollow(e: DragEvent): void {\n const containmentRect = { left: 0, top: 0 };\n // if (this.helper.style.position === 'absolute') { // we use 'fixed'\n // const { left, top } = this.helperContainment.getBoundingClientRect();\n // containmentRect = { left, top };\n // }\n const style = this.helper.style;\n const offset = this.dragOffset;\n style.left = (e.clientX + offset.offsetLeft - containmentRect.left) * this.dragTransform.xScale + 'px';\n style.top = (e.clientY + offset.offsetTop - containmentRect.top) * this.dragTransform.yScale + 'px';\n }\n\n /** @internal */\n protected _setupHelperContainmentStyle(): DDDraggable {\n this.helperContainment = this.helper.parentElement;\n if (this.helper.style.position !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n }\n\n /** @internal */\n protected _getDragOffset(event: DragEvent, el: HTMLElement, parent: HTMLElement): DragOffset {\n\n // in case ancestor has transform/perspective css properties that change the viewpoint\n let xformOffsetX = 0;\n let xformOffsetY = 0;\n if (parent) {\n xformOffsetX = this.dragTransform.xOffset;\n xformOffsetY = this.dragTransform.yOffset;\n }\n\n const targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: - event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: - event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width * this.dragTransform.xScale,\n height: targetOffset.height * this.dragTransform.yScale\n };\n }\n\n /** @internal TODO: set to public as called by DDDroppable! */\n public ui(): DDUIData {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const offset = this.helper.getBoundingClientRect();\n return {\n position: { //Current CSS position of the helper as { top, left } object\n top: (offset.top - containmentRect.top) * this.dragTransform.yScale,\n left: (offset.left - containmentRect.left) * this.dragTransform.xScale\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-droppable.d.ts b/node_modules/gridstack/dist/dd-droppable.d.ts index 2bb3e6aba..2079f1d5c 100644 --- a/node_modules/gridstack/dist/dd-droppable.d.ts +++ b/node_modules/gridstack/dist/dd-droppable.d.ts @@ -1,5 +1,5 @@ /** - * dd-droppable.ts 12.3.2 + * dd-droppable.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl'; diff --git a/node_modules/gridstack/dist/dd-droppable.js b/node_modules/gridstack/dist/dd-droppable.js index 42d120f21..4433baede 100644 --- a/node_modules/gridstack/dist/dd-droppable.js +++ b/node_modules/gridstack/dist/dd-droppable.js @@ -1,11 +1,11 @@ /** - * dd-droppable.ts 12.3.2 + * dd-droppable.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDManager } from './dd-manager'; import { DDBaseImplement } from './dd-base-impl'; import { Utils } from './utils'; -import { isTouch, pointerenter, pointerleave } from './dd-touch'; +import { DDTouch, isTouch, pointerenter, pointerleave } from './dd-touch'; // let count = 0; // TEST export class DDDroppable extends DDBaseImplement { constructor(el, option = {}) { @@ -67,6 +67,10 @@ export class DDDroppable extends DDBaseImplement { // console.log(`${count++} Enter ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST if (!DDManager.dragElement) return; + // During touch drag operations, ignore real browser-generated mouseenter events (isTrusted:true) vs our simulated ones (isTrusted:false). + // The browser can fire spurious mouseenter events when we dispatch simulated mousemove events. + if (DDTouch.touchHandled && e.isTrusted) + return; if (!this._canDrop(DDManager.dragElement.el)) return; e.preventDefault(); diff --git a/node_modules/gridstack/dist/dd-droppable.js.map b/node_modules/gridstack/dist/dd-droppable.js.map index 345384b2b..0caac59fc 100644 --- a/node_modules/gridstack/dist/dd-droppable.js.map +++ b/node_modules/gridstack/dist/dd-droppable.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-droppable.js","sourceRoot":"","sources":["../src/dd-droppable.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-droppable.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDDraggable } from './dd-draggable';\nimport { DDManager } from './dd-manager';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDElementHost } from './dd-element';\nimport { isTouch, pointerenter, pointerleave } from './dd-touch';\nimport { DDUIData } from './types';\n\nexport interface DDDroppableOpt {\n accept?: string | ((el: HTMLElement) => boolean);\n drop?: (event: DragEvent, ui: DDUIData) => void;\n over?: (event: DragEvent, ui: DDUIData) => void;\n out?: (event: DragEvent, ui: DDUIData) => void;\n}\n\n// let count = 0; // TEST\n\nexport class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n public accept: (el: HTMLElement) => boolean;\n\n constructor(public el: HTMLElement, public option: DDDroppableOpt = {}) {\n super();\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseEnter = this._mouseEnter.bind(this);\n this._mouseLeave = this._mouseLeave.bind(this);\n this.enable();\n this._setupAccept();\n }\n\n public on(event: 'drop' | 'dropover' | 'dropout', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drop' | 'dropover' | 'dropout'): void {\n super.off(event);\n }\n\n public enable(): void {\n if (this.disabled === false) return;\n super.enable();\n this.el.classList.add('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('mouseenter', this._mouseEnter);\n this.el.addEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.addEventListener('pointerenter', pointerenter);\n this.el.addEventListener('pointerleave', pointerleave);\n }\n }\n\n public disable(forDestroy = false): void {\n if (this.disabled === true) return;\n super.disable();\n this.el.classList.remove('ui-droppable');\n if (!forDestroy) this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('mouseenter', this._mouseEnter);\n this.el.removeEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.removeEventListener('pointerenter', pointerenter);\n this.el.removeEventListener('pointerleave', pointerleave);\n }\n }\n\n public destroy(): void {\n this.disable(true);\n this.el.classList.remove('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n super.destroy();\n }\n\n public updateOption(opts: DDDroppableOpt): DDDroppable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n this._setupAccept();\n return this;\n }\n\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n protected _mouseEnter(e: MouseEvent): void {\n // console.log(`${count++} Enter ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement) return;\n if (!this._canDrop(DDManager.dragElement.el)) return;\n e.preventDefault();\n e.stopPropagation();\n\n // make sure when we enter this, that the last one gets a leave FIRST to correctly cleanup as we don't always do\n if (DDManager.dropElement && DDManager.dropElement !== this) {\n DDManager.dropElement._mouseLeave(e as DragEvent, true); // calledByEnter = true\n }\n DDManager.dropElement = this;\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropover', ev);\n this.el.classList.add('ui-droppable-over');\n // console.log('tracking'); // TEST\n }\n\n /** @internal called when the item is leaving our area, stop tracking if we had moving item */\n protected _mouseLeave(e: MouseEvent, calledByEnter = false): void {\n // console.log(`${count++} Leave ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement || DDManager.dropElement !== this) return;\n e.preventDefault();\n e.stopPropagation();\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropout', ev);\n\n if (DDManager.dropElement === this) {\n delete DDManager.dropElement;\n // console.log('not tracking'); // TEST\n\n // if we're still over a parent droppable, send it an enter as we don't get one from leaving nested children\n if (!calledByEnter) {\n let parentDrop: DDDroppable;\n let parent: DDElementHost = this.el.parentElement;\n while (!parentDrop && parent) {\n parentDrop = parent.ddElement?.ddDroppable;\n parent = parent.parentElement;\n }\n if (parentDrop) {\n parentDrop._mouseEnter(e);\n }\n }\n }\n }\n\n /** item is being dropped on us - called by the drag mouseup handler - this calls the client drop event */\n public drop(e: MouseEvent): void {\n e.preventDefault();\n const ev = Utils.initEvent(e, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('drop', ev);\n }\n\n /** @internal true if element matches the string/method accept option */\n protected _canDrop(el: HTMLElement): boolean {\n return el && (!this.accept || this.accept(el));\n }\n\n /** @internal */\n protected _setupAccept(): DDDroppable {\n if (!this.option.accept) return this;\n if (typeof this.option.accept === 'string') {\n this.accept = (el: HTMLElement) => el.classList.contains(this.option.accept as string) || el.matches(this.option.accept as string);\n } else {\n this.accept = this.option.accept;\n }\n return this;\n }\n\n /** @internal */\n protected _ui(drag: DDDraggable): DDUIData {\n return {\n draggable: drag.el,\n ...drag.ui()\n };\n }\n}\n\n"]} \ No newline at end of file +{"version":3,"file":"dd-droppable.js","sourceRoot":"","sources":["../src/dd-droppable.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-droppable.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDDraggable } from './dd-draggable';\nimport { DDManager } from './dd-manager';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDElementHost } from './dd-element';\nimport { DDTouch, isTouch, pointerenter, pointerleave } from './dd-touch';\nimport { DDUIData } from './types';\n\nexport interface DDDroppableOpt {\n accept?: string | ((el: HTMLElement) => boolean);\n drop?: (event: DragEvent, ui: DDUIData) => void;\n over?: (event: DragEvent, ui: DDUIData) => void;\n out?: (event: DragEvent, ui: DDUIData) => void;\n}\n\n// let count = 0; // TEST\n\nexport class DDDroppable extends DDBaseImplement implements HTMLElementExtendOpt {\n\n public accept: (el: HTMLElement) => boolean;\n\n constructor(public el: HTMLElement, public option: DDDroppableOpt = {}) {\n super();\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseEnter = this._mouseEnter.bind(this);\n this._mouseLeave = this._mouseLeave.bind(this);\n this.enable();\n this._setupAccept();\n }\n\n public on(event: 'drop' | 'dropover' | 'dropout', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'drop' | 'dropover' | 'dropout'): void {\n super.off(event);\n }\n\n public enable(): void {\n if (this.disabled === false) return;\n super.enable();\n this.el.classList.add('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('mouseenter', this._mouseEnter);\n this.el.addEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.addEventListener('pointerenter', pointerenter);\n this.el.addEventListener('pointerleave', pointerleave);\n }\n }\n\n public disable(forDestroy = false): void {\n if (this.disabled === true) return;\n super.disable();\n this.el.classList.remove('ui-droppable');\n if (!forDestroy) this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('mouseenter', this._mouseEnter);\n this.el.removeEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.removeEventListener('pointerenter', pointerenter);\n this.el.removeEventListener('pointerleave', pointerleave);\n }\n }\n\n public destroy(): void {\n this.disable(true);\n this.el.classList.remove('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n super.destroy();\n }\n\n public updateOption(opts: DDDroppableOpt): DDDroppable {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n this._setupAccept();\n return this;\n }\n\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n protected _mouseEnter(e: MouseEvent): void {\n // console.log(`${count++} Enter ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement) return;\n // During touch drag operations, ignore real browser-generated mouseenter events (isTrusted:true) vs our simulated ones (isTrusted:false).\n // The browser can fire spurious mouseenter events when we dispatch simulated mousemove events.\n if (DDTouch.touchHandled && e.isTrusted) return\n\n if (!this._canDrop(DDManager.dragElement.el)) return;\n e.preventDefault();\n e.stopPropagation();\n\n // make sure when we enter this, that the last one gets a leave FIRST to correctly cleanup as we don't always do\n if (DDManager.dropElement && DDManager.dropElement !== this) {\n DDManager.dropElement._mouseLeave(e as DragEvent, true); // calledByEnter = true\n }\n DDManager.dropElement = this;\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropover', ev);\n this.el.classList.add('ui-droppable-over');\n // console.log('tracking'); // TEST\n }\n\n /** @internal called when the item is leaving our area, stop tracking if we had moving item */\n protected _mouseLeave(e: MouseEvent, calledByEnter = false): void {\n // console.log(`${count++} Leave ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement || DDManager.dropElement !== this) return;\n e.preventDefault();\n e.stopPropagation();\n\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('dropout', ev);\n\n if (DDManager.dropElement === this) {\n delete DDManager.dropElement;\n // console.log('not tracking'); // TEST\n\n // if we're still over a parent droppable, send it an enter as we don't get one from leaving nested children\n if (!calledByEnter) {\n let parentDrop: DDDroppable;\n let parent: DDElementHost = this.el.parentElement;\n while (!parentDrop && parent) {\n parentDrop = parent.ddElement?.ddDroppable;\n parent = parent.parentElement;\n }\n if (parentDrop) {\n parentDrop._mouseEnter(e);\n }\n }\n }\n }\n\n /** item is being dropped on us - called by the drag mouseup handler - this calls the client drop event */\n public drop(e: MouseEvent): void {\n e.preventDefault();\n const ev = Utils.initEvent(e, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(DDManager.dragElement))\n }\n this.triggerEvent('drop', ev);\n }\n\n /** @internal true if element matches the string/method accept option */\n protected _canDrop(el: HTMLElement): boolean {\n return el && (!this.accept || this.accept(el));\n }\n\n /** @internal */\n protected _setupAccept(): DDDroppable {\n if (!this.option.accept) return this;\n if (typeof this.option.accept === 'string') {\n this.accept = (el: HTMLElement) => el.classList.contains(this.option.accept as string) || el.matches(this.option.accept as string);\n } else {\n this.accept = this.option.accept;\n }\n return this;\n }\n\n /** @internal */\n protected _ui(drag: DDDraggable): DDUIData {\n return {\n draggable: drag.el,\n ...drag.ui()\n };\n }\n}\n\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-element.d.ts b/node_modules/gridstack/dist/dd-element.d.ts index ddf849968..3e49c976f 100644 --- a/node_modules/gridstack/dist/dd-element.d.ts +++ b/node_modules/gridstack/dist/dd-element.d.ts @@ -1,5 +1,5 @@ /** - * dd-elements.ts 12.3.2 + * dd-elements.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDResizable, DDResizableOpt } from './dd-resizable'; diff --git a/node_modules/gridstack/dist/dd-element.js b/node_modules/gridstack/dist/dd-element.js index af8589fac..be5e22ab2 100644 --- a/node_modules/gridstack/dist/dd-element.js +++ b/node_modules/gridstack/dist/dd-element.js @@ -1,5 +1,5 @@ /** - * dd-elements.ts 12.3.2 + * dd-elements.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDResizable } from './dd-resizable'; diff --git a/node_modules/gridstack/dist/dd-element.js.map b/node_modules/gridstack/dist/dd-element.js.map index b28dffa56..e48584229 100644 --- a/node_modules/gridstack/dist/dd-element.js.map +++ b/node_modules/gridstack/dist/dd-element.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-element.js","sourceRoot":"","sources":["../src/dd-element.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-elements.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDResizable, DDResizableOpt } from './dd-resizable';\nimport { DDDragOpt, GridItemHTMLElement } from './types';\nimport { DDDraggable } from './dd-draggable';\nimport { DDDroppable, DDDroppableOpt } from './dd-droppable';\n\nexport interface DDElementHost extends GridItemHTMLElement {\n ddElement?: DDElement;\n}\n\nexport class DDElement {\n\n static init(el: DDElementHost): DDElement {\n if (!el.ddElement) { el.ddElement = new DDElement(el); }\n return el.ddElement;\n }\n\n public ddDraggable?: DDDraggable;\n public ddDroppable?: DDDroppable;\n public ddResizable?: DDResizable;\n\n constructor(public el: DDElementHost) {}\n\n public on(eventName: string, callback: (event: MouseEvent) => void): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName as 'drag' | 'dragstart' | 'dragstop', callback);\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName as 'drop' | 'dropover' | 'dropout', callback);\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName as 'resizestart' | 'resize' | 'resizestop', callback);\n }\n return this;\n }\n\n public off(eventName: string): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName as 'drag' | 'dragstart' | 'dragstop');\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName as 'drop' | 'dropover' | 'dropout');\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName as 'resizestart' | 'resize' | 'resizestop');\n }\n return this;\n }\n\n public setupDraggable(opts: DDDragOpt): DDElement {\n if (!this.ddDraggable) {\n this.ddDraggable = new DDDraggable(this.el, opts);\n } else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDraggable(): DDElement {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n }\n\n public setupResizable(opts: DDResizableOpt): DDElement {\n if (!this.ddResizable) {\n this.ddResizable = new DDResizable(this.el, opts);\n } else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n }\n\n public cleanResizable(): DDElement {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n }\n\n public setupDroppable(opts: DDDroppableOpt): DDElement {\n if (!this.ddDroppable) {\n this.ddDroppable = new DDDroppable(this.el, opts);\n } else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDroppable(): DDElement {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"dd-element.js","sourceRoot":"","sources":["../src/dd-element.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAM7D,MAAM,OAAO,SAAS;IAEpB,MAAM,CAAC,IAAI,CAAC,EAAiB;QAC3B,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE;YAAE,EAAE,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;SAAE;QACxD,OAAO,EAAE,CAAC,SAAS,CAAC;IACtB,CAAC;IAMD,YAAmB,EAAiB;QAAjB,OAAE,GAAF,EAAE,CAAe;IAAG,CAAC;IAEjC,EAAE,CAAC,SAAiB,EAAE,QAAqC;QAChE,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;YACjF,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,SAA8C,EAAE,QAAQ,CAAC,CAAC;SAC/E;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;YACtF,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,SAA4C,EAAE,QAAQ,CAAC,CAAC;SAC7E;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;YAC9F,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,SAAoD,EAAE,QAAQ,CAAC,CAAC;SACrF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,GAAG,CAAC,SAAiB;QAC1B,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;YACjF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAA8C,CAAC,CAAC;SACtE;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;YACtF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAA4C,CAAC,CAAC;SACpE;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;YAC9F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAoD,CAAC,CAAC;SAC5E;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc,CAAC,IAAe;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SACnD;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACrC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc,CAAC,IAAoB;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SACnD;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACrC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc,CAAC,IAAoB;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SACnD;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACrC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["/**\n * dd-elements.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDResizable, DDResizableOpt } from './dd-resizable';\nimport { DDDragOpt, GridItemHTMLElement } from './types';\nimport { DDDraggable } from './dd-draggable';\nimport { DDDroppable, DDDroppableOpt } from './dd-droppable';\n\nexport interface DDElementHost extends GridItemHTMLElement {\n ddElement?: DDElement;\n}\n\nexport class DDElement {\n\n static init(el: DDElementHost): DDElement {\n if (!el.ddElement) { el.ddElement = new DDElement(el); }\n return el.ddElement;\n }\n\n public ddDraggable?: DDDraggable;\n public ddDroppable?: DDDroppable;\n public ddResizable?: DDResizable;\n\n constructor(public el: DDElementHost) {}\n\n public on(eventName: string, callback: (event: MouseEvent) => void): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName as 'drag' | 'dragstart' | 'dragstop', callback);\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName as 'drop' | 'dropover' | 'dropout', callback);\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName as 'resizestart' | 'resize' | 'resizestop', callback);\n }\n return this;\n }\n\n public off(eventName: string): DDElement {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName as 'drag' | 'dragstart' | 'dragstop');\n } else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName as 'drop' | 'dropover' | 'dropout');\n } else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName as 'resizestart' | 'resize' | 'resizestop');\n }\n return this;\n }\n\n public setupDraggable(opts: DDDragOpt): DDElement {\n if (!this.ddDraggable) {\n this.ddDraggable = new DDDraggable(this.el, opts);\n } else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDraggable(): DDElement {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n }\n\n public setupResizable(opts: DDResizableOpt): DDElement {\n if (!this.ddResizable) {\n this.ddResizable = new DDResizable(this.el, opts);\n } else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n }\n\n public cleanResizable(): DDElement {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n }\n\n public setupDroppable(opts: DDDroppableOpt): DDElement {\n if (!this.ddDroppable) {\n this.ddDroppable = new DDDroppable(this.el, opts);\n } else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n }\n\n public cleanDroppable(): DDElement {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-gridstack.d.ts b/node_modules/gridstack/dist/dd-gridstack.d.ts index d8d6a7204..c7e3a441c 100644 --- a/node_modules/gridstack/dist/dd-gridstack.d.ts +++ b/node_modules/gridstack/dist/dd-gridstack.d.ts @@ -1,5 +1,5 @@ /** - * dd-gridstack.ts 12.3.2 + * dd-gridstack.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { GridItemHTMLElement, GridStackElement, DDDragOpt } from './types'; diff --git a/node_modules/gridstack/dist/dd-gridstack.js b/node_modules/gridstack/dist/dd-gridstack.js index 0d5232803..6c5cc561f 100644 --- a/node_modules/gridstack/dist/dd-gridstack.js +++ b/node_modules/gridstack/dist/dd-gridstack.js @@ -1,5 +1,5 @@ /** - * dd-gridstack.ts 12.3.2 + * dd-gridstack.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { Utils } from './utils'; diff --git a/node_modules/gridstack/dist/dd-gridstack.js.map b/node_modules/gridstack/dist/dd-gridstack.js.map index cd24bbb94..34682a948 100644 --- a/node_modules/gridstack/dist/dd-gridstack.js.map +++ b/node_modules/gridstack/dist/dd-gridstack.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-gridstack.js","sourceRoot":"","sources":["../src/dd-gridstack.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * dd-gridstack.ts 12.3.2\r\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\r\n */\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { GridItemHTMLElement, GridStackElement, DDDragOpt } from './types';\r\nimport { Utils } from './utils';\r\nimport { DDManager } from './dd-manager';\r\nimport { DDElement, DDElementHost } from './dd-element';\r\nimport { GridHTMLElement } from './gridstack';\r\n\r\n/**\r\n * Drag & Drop options for drop targets.\r\n * Configures which elements can be dropped onto a grid.\r\n */\r\nexport type DDDropOpt = {\r\n /** Function to determine if an element can be dropped (see GridStackOptions.acceptWidgets) */\r\n accept?: (el: GridItemHTMLElement) => boolean;\r\n}\r\n\r\n/**\r\n * Drag & Drop operation types used throughout the DD system.\r\n * Can be control commands or configuration objects.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type DDOpts = 'enable' | 'disable' | 'destroy' | 'option' | string | any;\r\n\r\n/**\r\n * Keys for DD configuration options that can be set via the 'option' command.\r\n */\r\nexport type DDKey = 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight' | 'maxHeightMoveUp' | 'maxWidthMoveLeft';\r\n\r\n/**\r\n * Values for DD configuration options (numbers or strings with units).\r\n */\r\nexport type DDValue = number | string;\r\n\r\n/**\r\n * Callback function type for drag & drop events.\r\n * \r\n * @param event - The DOM event that triggered the callback\r\n * @param arg2 - The grid item element being dragged/dropped\r\n * @param helper - Optional helper element used during drag operations\r\n */\r\nexport type DDCallback = (event: Event, arg2: GridItemHTMLElement, helper?: GridItemHTMLElement) => void;\r\n\r\n// let count = 0; // TEST\r\n\r\n/**\r\n * HTML Native Mouse and Touch Events Drag and Drop functionality.\r\n * \r\n * This class provides the main drag & drop implementation for GridStack,\r\n * handling resizing, dragging, and dropping of grid items using native HTML5 events.\r\n * It manages the interaction between different DD components and the grid system.\r\n */\r\nexport class DDGridStack {\r\n\r\n /**\r\n * Enable/disable/configure resizing for grid elements.\r\n * \r\n * @param el - Grid item element(s) to configure\r\n * @param opts - Resize options or command ('enable', 'disable', 'destroy', 'option', or config object)\r\n * @param key - Option key when using 'option' command\r\n * @param value - Option value when using 'option' command\r\n * @returns this instance for chaining\r\n * \r\n * @example\r\n * dd.resizable(element, 'enable'); // Enable resizing\r\n * dd.resizable(element, 'option', 'minWidth', 100); // Set minimum width\r\n */\r\n public resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): DDGridStack {\r\n this._getDDElements(el, opts).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\r\n } else if (opts === 'destroy') {\r\n dEl.ddResizable && dEl.cleanResizable();\r\n } else if (opts === 'option') {\r\n dEl.setupResizable({ [key]: value });\r\n } else {\r\n const n = dEl.el.gridstackNode;\r\n const grid = n.grid;\r\n let handles = dEl.el.getAttribute('gs-resize-handles') || grid.opts.resizable.handles || 'e,s,se';\r\n if (handles === 'all') handles = 'n,e,s,w,se,sw,ne,nw';\r\n // NOTE: keep the resize handles as e,w don't have enough space (10px) to show resize corners anyway. limit during drag instead\r\n // restrict vertical resize if height is done to match content anyway... odd to have it spring back\r\n // if (Utils.shouldSizeToContent(n, true)) {\r\n // const doE = handles.indexOf('e') !== -1;\r\n // const doW = handles.indexOf('w') !== -1;\r\n // handles = doE ? (doW ? 'e,w' : 'e') : (doW ? 'w' : '');\r\n // }\r\n const autoHide = !grid.opts.alwaysShowResizeHandle;\r\n dEl.setupResizable({\r\n ...grid.opts.resizable,\r\n ...{ handles, autoHide },\r\n ...{\r\n start: opts.start,\r\n stop: opts.stop,\r\n resize: opts.resize\r\n }\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Enable/disable/configure dragging for grid elements.\r\n * \r\n * @param el - Grid item element(s) to configure\r\n * @param opts - Drag options or command ('enable', 'disable', 'destroy', 'option', or config object)\r\n * @param key - Option key when using 'option' command\r\n * @param value - Option value when using 'option' command\r\n * @returns this instance for chaining\r\n * \r\n * @example\r\n * dd.draggable(element, 'enable'); // Enable dragging\r\n * dd.draggable(element, {handle: '.drag-handle'}); // Configure drag handle\r\n */\r\n public draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): DDGridStack {\r\n this._getDDElements(el, opts).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\r\n } else if (opts === 'destroy') {\r\n dEl.ddDraggable && dEl.cleanDraggable();\r\n } else if (opts === 'option') {\r\n dEl.setupDraggable({ [key]: value });\r\n } else {\r\n const grid = dEl.el.gridstackNode.grid;\r\n dEl.setupDraggable({\r\n ...grid.opts.draggable,\r\n ...{\r\n // containment: (grid.parentGridNode && grid.opts.dragOut === false) ? grid.el.parentElement : (grid.opts.draggable.containment || null),\r\n start: opts.start,\r\n stop: opts.stop,\r\n drag: opts.drag\r\n }\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n public dragIn(el: GridStackElement, opts: DDDragOpt): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\r\n return this;\r\n }\r\n\r\n public droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): DDGridStack {\r\n if (typeof opts.accept === 'function' && !opts._accept) {\r\n opts._accept = opts.accept;\r\n opts.accept = (el) => opts._accept(el);\r\n }\r\n this._getDDElements(el, opts).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDroppable && dEl.ddDroppable[opts]();\r\n } else if (opts === 'destroy') {\r\n dEl.ddDroppable && dEl.cleanDroppable();\r\n } else if (opts === 'option') {\r\n dEl.setupDroppable({ [key]: value });\r\n } else {\r\n dEl.setupDroppable(opts);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /** true if element is droppable */\r\n public isDroppable(el: DDElementHost): boolean {\r\n return !!(el?.ddElement?.ddDroppable && !el.ddElement.ddDroppable.disabled);\r\n }\r\n\r\n /** true if element is draggable */\r\n public isDraggable(el: DDElementHost): boolean {\r\n return !!(el?.ddElement?.ddDraggable && !el.ddElement.ddDraggable.disabled);\r\n }\r\n\r\n /** true if element is draggable */\r\n public isResizable(el: DDElementHost): boolean {\r\n return !!(el?.ddElement?.ddResizable && !el.ddElement.ddResizable.disabled);\r\n }\r\n\r\n public on(el: GridItemHTMLElement, name: string, callback: DDCallback): DDGridStack {\r\n this._getDDElements(el).forEach(dEl =>\r\n dEl.on(name, (event: Event) => {\r\n callback(\r\n event,\r\n DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement,\r\n DDManager.dragElement ? DDManager.dragElement.helper : null)\r\n })\r\n );\r\n return this;\r\n }\r\n\r\n public off(el: GridItemHTMLElement, name: string): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => dEl.off(name));\r\n return this;\r\n }\r\n\r\n /** @internal returns a list of DD elements, creating them on the fly by default unless option is to destroy or disable */\r\n protected _getDDElements(els: GridStackElement, opts?: DDOpts): DDElement[] {\r\n // don't force create if we're going to destroy it, unless it's a grid which is used as drop target for it's children\r\n const create = (els as GridHTMLElement).gridstack || opts !== 'destroy' && opts !== 'disable';\r\n const hosts = Utils.getElements(els) as DDElementHost[];\r\n if (!hosts.length) return [];\r\n const list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null)).filter(d => d); // remove nulls\r\n return list;\r\n }\r\n}\r\n"]} \ No newline at end of file +{"version":3,"file":"dd-gridstack.js","sourceRoot":"","sources":["../src/dd-gridstack.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * dd-gridstack.ts 12.4.2\r\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\r\n */\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { GridItemHTMLElement, GridStackElement, DDDragOpt } from './types';\r\nimport { Utils } from './utils';\r\nimport { DDManager } from './dd-manager';\r\nimport { DDElement, DDElementHost } from './dd-element';\r\nimport { GridHTMLElement } from './gridstack';\r\n\r\n/**\r\n * Drag & Drop options for drop targets.\r\n * Configures which elements can be dropped onto a grid.\r\n */\r\nexport type DDDropOpt = {\r\n /** Function to determine if an element can be dropped (see GridStackOptions.acceptWidgets) */\r\n accept?: (el: GridItemHTMLElement) => boolean;\r\n}\r\n\r\n/**\r\n * Drag & Drop operation types used throughout the DD system.\r\n * Can be control commands or configuration objects.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type DDOpts = 'enable' | 'disable' | 'destroy' | 'option' | string | any;\r\n\r\n/**\r\n * Keys for DD configuration options that can be set via the 'option' command.\r\n */\r\nexport type DDKey = 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight' | 'maxHeightMoveUp' | 'maxWidthMoveLeft';\r\n\r\n/**\r\n * Values for DD configuration options (numbers or strings with units).\r\n */\r\nexport type DDValue = number | string;\r\n\r\n/**\r\n * Callback function type for drag & drop events.\r\n *\r\n * @param event - The DOM event that triggered the callback\r\n * @param arg2 - The grid item element being dragged/dropped\r\n * @param helper - Optional helper element used during drag operations\r\n */\r\nexport type DDCallback = (event: Event, arg2: GridItemHTMLElement, helper?: GridItemHTMLElement) => void;\r\n\r\n// let count = 0; // TEST\r\n\r\n/**\r\n * HTML Native Mouse and Touch Events Drag and Drop functionality.\r\n *\r\n * This class provides the main drag & drop implementation for GridStack,\r\n * handling resizing, dragging, and dropping of grid items using native HTML5 events.\r\n * It manages the interaction between different DD components and the grid system.\r\n */\r\nexport class DDGridStack {\r\n\r\n /**\r\n * Enable/disable/configure resizing for grid elements.\r\n *\r\n * @param el - Grid item element(s) to configure\r\n * @param opts - Resize options or command ('enable', 'disable', 'destroy', 'option', or config object)\r\n * @param key - Option key when using 'option' command\r\n * @param value - Option value when using 'option' command\r\n * @returns this instance for chaining\r\n *\r\n * @example\r\n * dd.resizable(element, 'enable'); // Enable resizing\r\n * dd.resizable(element, 'option', 'minWidth', 100); // Set minimum width\r\n */\r\n public resizable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): DDGridStack {\r\n this._getDDElements(el, opts).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\r\n } else if (opts === 'destroy') {\r\n dEl.ddResizable && dEl.cleanResizable();\r\n } else if (opts === 'option') {\r\n dEl.setupResizable({ [key]: value });\r\n } else {\r\n const n = dEl.el.gridstackNode;\r\n const grid = n.grid;\r\n let handles = dEl.el.getAttribute('gs-resize-handles') || grid.opts.resizable.handles || 'e,s,se';\r\n if (handles === 'all') handles = 'n,e,s,w,se,sw,ne,nw';\r\n // NOTE: keep the resize handles as e,w don't have enough space (10px) to show resize corners anyway. limit during drag instead\r\n // restrict vertical resize if height is done to match content anyway... odd to have it spring back\r\n // if (Utils.shouldSizeToContent(n, true)) {\r\n // const doE = handles.indexOf('e') !== -1;\r\n // const doW = handles.indexOf('w') !== -1;\r\n // handles = doE ? (doW ? 'e,w' : 'e') : (doW ? 'w' : '');\r\n // }\r\n const autoHide = !grid.opts.alwaysShowResizeHandle;\r\n dEl.setupResizable({\r\n ...grid.opts.resizable,\r\n ...{ handles, autoHide },\r\n ...{\r\n start: opts.start,\r\n stop: opts.stop,\r\n resize: opts.resize\r\n }\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Enable/disable/configure dragging for grid elements.\r\n *\r\n * @param el - Grid item element(s) to configure\r\n * @param opts - Drag options or command ('enable', 'disable', 'destroy', 'option', or config object)\r\n * @param key - Option key when using 'option' command\r\n * @param value - Option value when using 'option' command\r\n * @returns this instance for chaining\r\n *\r\n * @example\r\n * dd.draggable(element, 'enable'); // Enable dragging\r\n * dd.draggable(element, {handle: '.drag-handle'}); // Configure drag handle\r\n */\r\n public draggable(el: GridItemHTMLElement, opts: DDOpts, key?: DDKey, value?: DDValue): DDGridStack {\r\n this._getDDElements(el, opts).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\r\n } else if (opts === 'destroy') {\r\n dEl.ddDraggable && dEl.cleanDraggable();\r\n } else if (opts === 'option') {\r\n dEl.setupDraggable({ [key]: value });\r\n } else {\r\n const grid = dEl.el.gridstackNode.grid;\r\n dEl.setupDraggable({\r\n ...grid.opts.draggable,\r\n ...{\r\n // containment: (grid.parentGridNode && grid.opts.dragOut === false) ? grid.el.parentElement : (grid.opts.draggable.containment || null),\r\n start: opts.start,\r\n stop: opts.stop,\r\n drag: opts.drag\r\n }\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n public dragIn(el: GridStackElement, opts: DDDragOpt): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\r\n return this;\r\n }\r\n\r\n public droppable(el: GridItemHTMLElement, opts: DDOpts | DDDropOpt, key?: DDKey, value?: DDValue): DDGridStack {\r\n if (typeof opts.accept === 'function' && !opts._accept) {\r\n opts._accept = opts.accept;\r\n opts.accept = (el) => opts._accept(el);\r\n }\r\n this._getDDElements(el, opts).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDroppable && dEl.ddDroppable[opts]();\r\n } else if (opts === 'destroy') {\r\n dEl.ddDroppable && dEl.cleanDroppable();\r\n } else if (opts === 'option') {\r\n dEl.setupDroppable({ [key]: value });\r\n } else {\r\n dEl.setupDroppable(opts);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /** true if element is droppable */\r\n public isDroppable(el: DDElementHost): boolean {\r\n return !!(el?.ddElement?.ddDroppable && !el.ddElement.ddDroppable.disabled);\r\n }\r\n\r\n /** true if element is draggable */\r\n public isDraggable(el: DDElementHost): boolean {\r\n return !!(el?.ddElement?.ddDraggable && !el.ddElement.ddDraggable.disabled);\r\n }\r\n\r\n /** true if element is draggable */\r\n public isResizable(el: DDElementHost): boolean {\r\n return !!(el?.ddElement?.ddResizable && !el.ddElement.ddResizable.disabled);\r\n }\r\n\r\n public on(el: GridItemHTMLElement, name: string, callback: DDCallback): DDGridStack {\r\n this._getDDElements(el).forEach(dEl =>\r\n dEl.on(name, (event: Event) => {\r\n callback(\r\n event,\r\n DDManager.dragElement ? DDManager.dragElement.el : event.target as GridItemHTMLElement,\r\n DDManager.dragElement ? DDManager.dragElement.helper : null)\r\n })\r\n );\r\n return this;\r\n }\r\n\r\n public off(el: GridItemHTMLElement, name: string): DDGridStack {\r\n this._getDDElements(el).forEach(dEl => dEl.off(name));\r\n return this;\r\n }\r\n\r\n /** @internal returns a list of DD elements, creating them on the fly by default unless option is to destroy or disable */\r\n protected _getDDElements(els: GridStackElement, opts?: DDOpts): DDElement[] {\r\n // don't force create if we're going to destroy it, unless it's a grid which is used as drop target for it's children\r\n const create = (els as GridHTMLElement).gridstack || opts !== 'destroy' && opts !== 'disable';\r\n const hosts = Utils.getElements(els) as DDElementHost[];\r\n if (!hosts.length) return [];\r\n const list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null)).filter(d => d); // remove nulls\r\n return list;\r\n }\r\n}\r\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-manager.d.ts b/node_modules/gridstack/dist/dd-manager.d.ts index ef61563c2..7c3627cb0 100644 --- a/node_modules/gridstack/dist/dd-manager.d.ts +++ b/node_modules/gridstack/dist/dd-manager.d.ts @@ -1,5 +1,5 @@ /** - * dd-manager.ts 12.3.2 + * dd-manager.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDDraggable } from './dd-draggable'; diff --git a/node_modules/gridstack/dist/dd-manager.js b/node_modules/gridstack/dist/dd-manager.js index 1099fa5df..0b204676c 100644 --- a/node_modules/gridstack/dist/dd-manager.js +++ b/node_modules/gridstack/dist/dd-manager.js @@ -1,5 +1,5 @@ /** - * dd-manager.ts 12.3.2 + * dd-manager.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ /** diff --git a/node_modules/gridstack/dist/dd-manager.js.map b/node_modules/gridstack/dist/dd-manager.js.map index acb519a06..d31e82588 100644 --- a/node_modules/gridstack/dist/dd-manager.js.map +++ b/node_modules/gridstack/dist/dd-manager.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-manager.js","sourceRoot":"","sources":["../src/dd-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;CAiCrB","sourcesContent":["/**\n * dd-manager.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDDraggable } from './dd-draggable';\nimport { DDDroppable } from './dd-droppable';\nimport { DDResizable } from './dd-resizable';\n\n/**\n * Global state manager for all Drag & Drop instances.\n * \n * This class maintains shared state across all drag & drop operations,\n * ensuring proper coordination between multiple grids and drag/drop elements.\n * All properties are static to provide global access throughout the DD system.\n */\nexport class DDManager {\n /**\n * Controls drag operation pausing behavior.\n * If set to true or a number (milliseconds), dragging placement and collision\n * detection will only happen after the user pauses movement.\n * This improves performance during rapid mouse movements.\n */\n public static pauseDrag: boolean | number;\n\n /**\n * Flag indicating if a mouse down event was already handled.\n * Prevents multiple handlers from processing the same mouse event.\n */\n public static mouseHandled: boolean;\n\n /**\n * Reference to the element currently being dragged.\n * Used to track the active drag operation across the system.\n */\n public static dragElement: DDDraggable;\n\n /**\n * Reference to the drop target element currently under the cursor.\n * Used to handle drop operations and hover effects.\n */\n public static dropElement: DDDroppable;\n\n /**\n * Reference to the element currently being resized.\n * Helps ignore nested grid resize handles during resize operations.\n */\n public static overResizeElement: DDResizable;\n\n}\n"]} \ No newline at end of file +{"version":3,"file":"dd-manager.js","sourceRoot":"","sources":["../src/dd-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;CAiCrB","sourcesContent":["/**\n * dd-manager.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDDraggable } from './dd-draggable';\nimport { DDDroppable } from './dd-droppable';\nimport { DDResizable } from './dd-resizable';\n\n/**\n * Global state manager for all Drag & Drop instances.\n *\n * This class maintains shared state across all drag & drop operations,\n * ensuring proper coordination between multiple grids and drag/drop elements.\n * All properties are static to provide global access throughout the DD system.\n */\nexport class DDManager {\n /**\n * Controls drag operation pausing behavior.\n * If set to true or a number (milliseconds), dragging placement and collision\n * detection will only happen after the user pauses movement.\n * This improves performance during rapid mouse movements.\n */\n public static pauseDrag: boolean | number;\n\n /**\n * Flag indicating if a mouse down event was already handled.\n * Prevents multiple handlers from processing the same mouse event.\n */\n public static mouseHandled: boolean;\n\n /**\n * Reference to the element currently being dragged.\n * Used to track the active drag operation across the system.\n */\n public static dragElement: DDDraggable;\n\n /**\n * Reference to the drop target element currently under the cursor.\n * Used to handle drop operations and hover effects.\n */\n public static dropElement: DDDroppable;\n\n /**\n * Reference to the element currently being resized.\n * Helps ignore nested grid resize handles during resize operations.\n */\n public static overResizeElement: DDResizable;\n\n}\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-resizable-handle.d.ts b/node_modules/gridstack/dist/dd-resizable-handle.d.ts index a34a14505..d3ad470db 100644 --- a/node_modules/gridstack/dist/dd-resizable-handle.d.ts +++ b/node_modules/gridstack/dist/dd-resizable-handle.d.ts @@ -1,12 +1,13 @@ /** - * dd-resizable-handle.ts 12.3.2 + * dd-resizable-handle.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { GridItemHTMLElement } from './gridstack'; export interface DDResizableHandleOpt { - start?: (event: any) => void; - move?: (event: any) => void; - stop?: (event: any) => void; + element?: string | HTMLElement; + start?: (event: MouseEvent) => void; + move?: (event: MouseEvent) => void; + stop?: (event: MouseEvent) => void; } export declare class DDResizableHandle { protected host: GridItemHTMLElement; diff --git a/node_modules/gridstack/dist/dd-resizable-handle.js b/node_modules/gridstack/dist/dd-resizable-handle.js index 9a7501961..ec2e80147 100644 --- a/node_modules/gridstack/dist/dd-resizable-handle.js +++ b/node_modules/gridstack/dist/dd-resizable-handle.js @@ -1,5 +1,5 @@ /** - * dd-resizable-handle.ts 12.3.2 + * dd-resizable-handle.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { isTouch, pointerdown, touchend, touchmove, touchstart } from './dd-touch'; @@ -19,12 +19,25 @@ class DDResizableHandle { } /** @internal */ _init() { - const el = this.el = document.createElement('div'); - el.classList.add('ui-resizable-handle'); - el.classList.add(`${DDResizableHandle.prefix}${this.dir}`); - el.style.zIndex = '100'; - el.style.userSelect = 'none'; - this.host.appendChild(this.el); + if (this.option.element) { + try { + this.el = this.option.element instanceof HTMLElement + ? this.option.element + : this.host.querySelector(this.option.element); + } + catch (error) { + this.option.element = undefined; // make sure destroy handles it correctly + console.error("Query for resizeable handle failed, falling back", error); + } + } + if (!this.el) { + this.el = document.createElement('div'); + this.host.appendChild(this.el); + } + this.el.classList.add('ui-resizable-handle'); + this.el.classList.add(`${DDResizableHandle.prefix}${this.dir}`); + this.el.style.zIndex = '100'; + this.el.style.userSelect = 'none'; this.el.addEventListener('mousedown', this._mouseDown); if (isTouch) { this.el.addEventListener('touchstart', touchstart); @@ -42,7 +55,9 @@ class DDResizableHandle { this.el.removeEventListener('touchstart', touchstart); this.el.removeEventListener('pointerdown', pointerdown); } - this.host.removeChild(this.el); + if (!this.option.element) { + this.host.removeChild(this.el); + } delete this.el; delete this.host; return this; diff --git a/node_modules/gridstack/dist/dd-resizable-handle.js.map b/node_modules/gridstack/dist/dd-resizable-handle.js.map index 048353e79..806f8b80c 100644 --- a/node_modules/gridstack/dist/dd-resizable-handle.js.map +++ b/node_modules/gridstack/dist/dd-resizable-handle.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-resizable-handle.js","sourceRoot":"","sources":["../src/dd-resizable-handle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-resizable-handle.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { isTouch, pointerdown, touchend, touchmove, touchstart } from './dd-touch';\nimport { GridItemHTMLElement } from './gridstack';\n\nexport interface DDResizableHandleOpt {\n start?: (event) => void;\n move?: (event) => void;\n stop?: (event) => void;\n}\n\nexport class DDResizableHandle {\n /** @internal */\n protected el: HTMLElement;\n /** @internal true after we've moved enough pixels to start a resize */\n protected moving = false;\n /** @internal */\n protected mouseDownEvent: MouseEvent;\n /** @internal */\n protected static prefix = 'ui-resizable-';\n\n constructor(protected host: GridItemHTMLElement, protected dir: string, protected option: DDResizableHandleOpt) {\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._keyEvent = this._keyEvent.bind(this);\n\n this._init();\n }\n\n /** @internal */\n protected _init(): DDResizableHandle {\n const el = this.el = document.createElement('div');\n el.classList.add('ui-resizable-handle');\n el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\n el.style.zIndex = '100';\n el.style.userSelect = 'none';\n this.host.appendChild(this.el);\n this.el.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.addEventListener('touchstart', touchstart);\n this.el.addEventListener('pointerdown', pointerdown);\n // this.el.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n return this;\n }\n\n /** call this when resize handle needs to be removed and cleaned up */\n public destroy(): DDResizableHandle {\n if (this.moving) this._mouseUp(this.mouseDownEvent);\n this.el.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.removeEventListener('touchstart', touchstart);\n this.el.removeEventListener('pointerdown', pointerdown);\n }\n this.host.removeChild(this.el);\n delete this.el;\n delete this.host;\n return this;\n }\n\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\n protected _mouseDown(e: MouseEvent): void {\n this.mouseDownEvent = e;\n document.addEventListener('mousemove', this._mouseMove, { capture: true, passive: true}); // capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.addEventListener('touchmove', touchmove);\n this.el.addEventListener('touchend', touchend);\n }\n e.stopPropagation();\n e.preventDefault();\n }\n\n /** @internal */\n protected _mouseMove(e: MouseEvent): void {\n const s = this.mouseDownEvent;\n if (this.moving) {\n this._triggerEvent('move', e);\n } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\n // don't start unless we've moved at least 3 pixels\n this.moving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n this._triggerEvent('move', e);\n // now track keyboard events to cancel\n document.addEventListener('keydown', this._keyEvent);\n }\n e.stopPropagation();\n // e.preventDefault(); passive = true\n }\n\n /** @internal */\n protected _mouseUp(e: MouseEvent): void {\n if (this.moving) {\n this._triggerEvent('stop', e);\n document.removeEventListener('keydown', this._keyEvent);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.removeEventListener('touchmove', touchmove);\n this.el.removeEventListener('touchend', touchend);\n }\n delete this.moving;\n delete this.mouseDownEvent;\n e.stopPropagation();\n e.preventDefault();\n }\n\n /** @internal call when keys are being pressed - use Esc to cancel */\n protected _keyEvent(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n this.host.gridstackNode?.grid?.engine.restoreInitial();\n this._mouseUp(this.mouseDownEvent);\n }\n }\n\n\n\n /** @internal */\n protected _triggerEvent(name: string, event: MouseEvent): DDResizableHandle {\n if (this.option[name]) this.option[name](event);\n return this;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"dd-resizable-handle.js","sourceRoot":"","sources":["../src/dd-resizable-handle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-resizable-handle.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { isTouch, pointerdown, touchend, touchmove, touchstart } from './dd-touch';\nimport { GridItemHTMLElement } from './gridstack';\n\nexport interface DDResizableHandleOpt {\n element?: string | HTMLElement;\n start?: (event: MouseEvent) => void;\n move?: (event: MouseEvent) => void;\n stop?: (event: MouseEvent) => void;\n}\n\nexport class DDResizableHandle {\n /** @internal */\n protected el: HTMLElement;\n /** @internal true after we've moved enough pixels to start a resize */\n protected moving = false;\n /** @internal */\n protected mouseDownEvent: MouseEvent;\n /** @internal */\n protected static prefix = 'ui-resizable-';\n\n constructor(protected host: GridItemHTMLElement, protected dir: string, protected option: DDResizableHandleOpt) {\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._keyEvent = this._keyEvent.bind(this);\n\n this._init();\n }\n\n /** @internal */\n protected _init(): DDResizableHandle {\n if (this.option.element) {\n try {\n this.el = this.option.element instanceof HTMLElement\n ? this.option.element\n : this.host.querySelector(this.option.element)\n } catch (error) {\n this.option.element = undefined // make sure destroy handles it correctly\n console.error(\"Query for resizeable handle failed, falling back\", error)\n }\n }\n\n if (!this.el) {\n this.el = document.createElement('div');\n this.host.appendChild(this.el);\n }\n\n this.el.classList.add('ui-resizable-handle');\n this.el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\n this.el.style.zIndex = '100';\n this.el.style.userSelect = 'none';\n\n this.el.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.addEventListener('touchstart', touchstart);\n this.el.addEventListener('pointerdown', pointerdown);\n // this.el.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n\n return this;\n }\n\n /** call this when resize handle needs to be removed and cleaned up */\n public destroy(): DDResizableHandle {\n if (this.moving) this._mouseUp(this.mouseDownEvent);\n this.el.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.removeEventListener('touchstart', touchstart);\n this.el.removeEventListener('pointerdown', pointerdown);\n }\n if (!this.option.element) {\n this.host.removeChild(this.el);\n }\n delete this.el;\n delete this.host;\n return this;\n }\n\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\n protected _mouseDown(e: MouseEvent): void {\n this.mouseDownEvent = e;\n document.addEventListener('mousemove', this._mouseMove, { capture: true, passive: true}); // capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.addEventListener('touchmove', touchmove);\n this.el.addEventListener('touchend', touchend);\n }\n e.stopPropagation();\n e.preventDefault();\n }\n\n /** @internal */\n protected _mouseMove(e: MouseEvent): void {\n const s = this.mouseDownEvent;\n if (this.moving) {\n this._triggerEvent('move', e);\n } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\n // don't start unless we've moved at least 3 pixels\n this.moving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n this._triggerEvent('move', e);\n // now track keyboard events to cancel\n document.addEventListener('keydown', this._keyEvent);\n }\n e.stopPropagation();\n // e.preventDefault(); passive = true\n }\n\n /** @internal */\n protected _mouseUp(e: MouseEvent): void {\n if (this.moving) {\n this._triggerEvent('stop', e);\n document.removeEventListener('keydown', this._keyEvent);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.removeEventListener('touchmove', touchmove);\n this.el.removeEventListener('touchend', touchend);\n }\n delete this.moving;\n delete this.mouseDownEvent;\n e.stopPropagation();\n e.preventDefault();\n }\n\n /** @internal call when keys are being pressed - use Esc to cancel */\n protected _keyEvent(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n this.host.gridstackNode?.grid?.engine.restoreInitial();\n this._mouseUp(this.mouseDownEvent);\n }\n }\n\n\n\n /** @internal */\n protected _triggerEvent(name: string, event: MouseEvent): DDResizableHandle {\n if (this.option[name]) this.option[name](event);\n return this;\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-resizable.d.ts b/node_modules/gridstack/dist/dd-resizable.d.ts index 4d95dcd85..604ecb0a0 100644 --- a/node_modules/gridstack/dist/dd-resizable.d.ts +++ b/node_modules/gridstack/dist/dd-resizable.d.ts @@ -1,12 +1,10 @@ /** - * dd-resizable.ts 12.3.2 + * dd-resizable.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl'; -import { DDUIData, GridItemHTMLElement } from './types'; -export interface DDResizableOpt { - autoHide?: boolean; - handles?: string; +import { DDResizeOpt, DDUIData, GridItemHTMLElement } from './types'; +export interface DDResizableOpt extends DDResizeOpt { maxHeight?: number; maxHeightMoveUp?: number; maxWidth?: number; diff --git a/node_modules/gridstack/dist/dd-resizable.js b/node_modules/gridstack/dist/dd-resizable.js index ddc997333..4fd44d587 100644 --- a/node_modules/gridstack/dist/dd-resizable.js +++ b/node_modules/gridstack/dist/dd-resizable.js @@ -1,5 +1,5 @@ /** - * dd-resizable.ts 12.3.2 + * dd-resizable.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDResizableHandle } from './dd-resizable-handle'; @@ -135,15 +135,10 @@ class DDResizable extends DDBaseImplement { this.handlers = this.option.handles.split(',') .map(dir => dir.trim()) .map(dir => new DDResizableHandle(this.el, dir, { - start: (event) => { - this._resizeStart(event); - }, - stop: (event) => { - this._resizeStop(event); - }, - move: (event) => { - this._resizing(event, dir); - } + element: this.option.element, + start: (event) => this._resizeStart(event), + stop: (event) => this._resizeStop(event), + move: (event) => this._resizing(event, dir) })); return this; } diff --git a/node_modules/gridstack/dist/dd-resizable.js.map b/node_modules/gridstack/dist/dd-resizable.js.map index a0206ddab..7240ca286 100644 --- a/node_modules/gridstack/dist/dd-resizable.js.map +++ b/node_modules/gridstack/dist/dd-resizable.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-resizable.js","sourceRoot":"","sources":["../src/dd-resizable.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-resizable.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDResizableHandle } from './dd-resizable-handle';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDUIData, GridItemHTMLElement, Rect, Size } from './types';\nimport { DDManager } from './dd-manager';\n\n// import { GridItemHTMLElement } from './types'; let count = 0; // TEST\n\n// TODO: merge with DDDragOpt\nexport interface DDResizableOpt {\n autoHide?: boolean;\n handles?: string;\n maxHeight?: number;\n maxHeightMoveUp?: number;\n maxWidth?: number;\n maxWidthMoveLeft?: number;\n minHeight?: number;\n minWidth?: number;\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n resize?: (event: Event, ui: DDUIData) => void;\n}\n\ninterface RectScaleReciprocal {\n x: number;\n y: number;\n}\n\nexport class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt {\n /** @internal */\n protected handlers: DDResizableHandle[];\n /** @internal */\n protected originalRect: Rect;\n /** @internal */\n protected rectScale: RectScaleReciprocal = { x: 1, y: 1 };\n /** @internal */\n protected temporalRect: Rect;\n /** @internal */\n protected scrollY: number;\n /** @internal */\n protected scrolled: number;\n /** @internal */\n protected scrollEl: HTMLElement;\n /** @internal */\n protected startEvent: MouseEvent;\n /** @internal value saved in the same order as _originStyleProp[] */\n protected elOriginStyleVal: string[];\n /** @internal */\n protected parentOriginStylePosition: string;\n /** @internal */\n protected static _originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\n /** @internal */\n protected sizeToContent: boolean;\n\n // have to be public else complains for HTMLElementExtendOpt ?\n constructor(public el: GridItemHTMLElement, public option: DDResizableOpt = {}) {\n super();\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseOver = this._mouseOver.bind(this);\n this._mouseOut = this._mouseOut.bind(this);\n this.enable();\n this._setupAutoHide(this.option.autoHide);\n this._setupHandlers();\n }\n\n public on(event: 'resizestart' | 'resize' | 'resizestop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'resizestart' | 'resize' | 'resizestop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.el.classList.remove('ui-resizable-disabled');\n this._setupAutoHide(this.option.autoHide);\n }\n\n public disable(): void {\n super.disable();\n this.el.classList.add('ui-resizable-disabled');\n this._setupAutoHide(false);\n }\n\n public destroy(): void {\n this._removeHandlers();\n this._setupAutoHide(false);\n delete this.el;\n super.destroy();\n }\n\n public updateOption(opts: DDResizableOpt): DDResizable {\n const updateHandles = (opts.handles && opts.handles !== this.option.handles);\n const updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide(this.option.autoHide);\n }\n return this;\n }\n\n /** @internal turns auto hide on/off */\n protected _setupAutoHide(auto: boolean): DDResizable {\n if (auto) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover and not mouseenter to get better performance and track for nested cases\n this.el.addEventListener('mouseover', this._mouseOver);\n this.el.addEventListener('mouseout', this._mouseOut);\n } else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._mouseOver);\n this.el.removeEventListener('mouseout', this._mouseOut);\n if (DDManager.overResizeElement === this) {\n delete DDManager.overResizeElement;\n }\n }\n return this;\n }\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _mouseOver(e: Event): void {\n // console.log(`${count++} pre-enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n // already over a child, ignore. Ideally we just call e.stopPropagation() but see https://github.com/gridstack/gridstack.js/issues/2018\n if (DDManager.overResizeElement || DDManager.dragElement) return;\n DDManager.overResizeElement = this;\n // console.log(`${count++} enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.remove('ui-resizable-autohide');\n }\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _mouseOut(e: Event): void {\n // console.log(`${count++} pre-leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n if (DDManager.overResizeElement !== this) return;\n delete DDManager.overResizeElement;\n // console.log(`${count++} leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.add('ui-resizable-autohide');\n }\n\n /** @internal */\n protected _setupHandlers(): DDResizable {\n this.handlers = this.option.handles.split(',')\n .map(dir => dir.trim())\n .map(dir => new DDResizableHandle(this.el, dir, {\n start: (event: MouseEvent) => {\n this._resizeStart(event);\n },\n stop: (event: MouseEvent) => {\n this._resizeStop(event);\n },\n move: (event: MouseEvent) => {\n this._resizing(event, dir);\n }\n }));\n return this;\n }\n\n /** @internal */\n protected _resizeStart(event: MouseEvent): DDResizable {\n this.sizeToContent = Utils.shouldSizeToContent(this.el.gridstackNode, true); // strick true only and not number\n this.originalRect = this.el.getBoundingClientRect();\n this.scrollEl = Utils.getScrollElement(this.el);\n this.scrollY = this.scrollEl.scrollTop;\n this.scrolled = 0;\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n }\n\n /** @internal */\n protected _resizing(event: MouseEvent, dir: string): DDResizable {\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n }\n\n /** @internal */\n protected _resizeStop(event: MouseEvent): DDResizable {\n const ev = Utils.initEvent(event, { type: 'resizestop', target: this.el });\n // Remove style attr now, so the stop handler can rebuild style attrs\n this._cleanHelper();\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n delete this.scrollY;\n delete this.scrolled;\n return this;\n }\n\n /** @internal */\n protected _setupHelper(): DDResizable {\n this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n\n const parent = this.el.parentElement;\n const dragTransform = Utils.getValuesFromTransformedElement(parent);\n this.rectScale = {\n x: dragTransform.xScale,\n y: dragTransform.yScale\n };\n\n if (getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = 'absolute';\n this.el.style.opacity = '0.8';\n return this;\n }\n\n /** @internal */\n protected _cleanHelper(): DDResizable {\n DDResizable._originStyleProp.forEach((prop, i) => {\n this.el.style[prop] = this.elOriginStyleVal[i] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n }\n\n /** @internal */\n protected _getChange(event: MouseEvent, dir: string): Rect {\n const oEvent = this.startEvent;\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n\n const offsetX = event.clientX - oEvent.clientX;\n const offsetY = this.sizeToContent ? 0 : event.clientY - oEvent.clientY; // prevent vert resize\n let moveLeft: boolean;\n let moveUp: boolean;\n\n if (dir.indexOf('e') > -1) {\n newRect.width += offsetX;\n } else if (dir.indexOf('w') > -1) {\n newRect.width -= offsetX;\n newRect.left += offsetX;\n moveLeft = true;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += offsetY;\n } else if (dir.indexOf('n') > -1) {\n newRect.height -= offsetY;\n newRect.top += offsetY\n moveUp = true;\n }\n const constrain = this._constrainSize(newRect.width, newRect.height, moveLeft, moveUp);\n if (Math.round(newRect.width) !== Math.round(constrain.width)) { // round to ignore slight round-off errors\n if (dir.indexOf('w') > -1) {\n newRect.left += newRect.width - constrain.width;\n }\n newRect.width = constrain.width;\n }\n if (Math.round(newRect.height) !== Math.round(constrain.height)) {\n if (dir.indexOf('n') > -1) {\n newRect.top += newRect.height - constrain.height;\n }\n newRect.height = constrain.height;\n }\n return newRect;\n }\n\n /** @internal constrain the size to the set min/max values */\n protected _constrainSize(oWidth: number, oHeight: number, moveLeft: boolean, moveUp: boolean): Size {\n const o = this.option;\n const maxWidth = (moveLeft ? o.maxWidthMoveLeft : o.maxWidth) || Number.MAX_SAFE_INTEGER;\n const minWidth = o.minWidth / this.rectScale.x || oWidth;\n const maxHeight = (moveUp ? o.maxHeightMoveUp : o.maxHeight) || Number.MAX_SAFE_INTEGER;\n const minHeight = o.minHeight / this.rectScale.y || oHeight;\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width, height };\n }\n\n /** @internal */\n protected _applyChange(): DDResizable {\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n const containmentEl = this.el.parentElement;\n const { left, top } = containmentEl.getBoundingClientRect();\n containmentRect = { left, top, width: 0, height: 0 };\n }\n if (!this.temporalRect) return this;\n Object.keys(this.temporalRect).forEach(key => {\n const value = this.temporalRect[key];\n const scaleReciprocal = key === 'width' || key === 'left' ? this.rectScale.x : key === 'height' || key === 'top' ? this.rectScale.y : 1;\n this.el.style[key] = (value - containmentRect[key]) * scaleReciprocal + 'px';\n });\n return this;\n }\n\n /** @internal */\n protected _removeHandlers(): DDResizable {\n this.handlers.forEach(handle => handle.destroy());\n delete this.handlers;\n return this;\n }\n\n /** @internal */\n protected _ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n const rect = this.temporalRect || newRect;\n return {\n position: {\n left: (rect.left - containmentRect.left) * this.rectScale.x,\n top: (rect.top - containmentRect.top) * this.rectScale.y\n },\n size: {\n width: rect.width * this.rectScale.x,\n height: rect.height * this.rectScale.y\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"dd-resizable.js","sourceRoot":"","sources":["../src/dd-resizable.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dd-resizable.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDResizableHandle } from './dd-resizable-handle';\nimport { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDResizeOpt, DDUIData, GridItemHTMLElement, Rect, Size } from './types';\nimport { DDManager } from './dd-manager';\n\n// import { GridItemHTMLElement } from './types'; let count = 0; // TEST\n\n// TODO: merge with DDDragOpt\nexport interface DDResizableOpt extends DDResizeOpt {\n maxHeight?: number;\n maxHeightMoveUp?: number;\n maxWidth?: number;\n maxWidthMoveLeft?: number;\n minHeight?: number;\n minWidth?: number;\n start?: (event: Event, ui: DDUIData) => void;\n stop?: (event: Event) => void;\n resize?: (event: Event, ui: DDUIData) => void;\n}\n\ninterface RectScaleReciprocal {\n x: number;\n y: number;\n}\n\nexport class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt {\n /** @internal */\n protected handlers: DDResizableHandle[];\n /** @internal */\n protected originalRect: Rect;\n /** @internal */\n protected rectScale: RectScaleReciprocal = { x: 1, y: 1 };\n /** @internal */\n protected temporalRect: Rect;\n /** @internal */\n protected scrollY: number;\n /** @internal */\n protected scrolled: number;\n /** @internal */\n protected scrollEl: HTMLElement;\n /** @internal */\n protected startEvent: MouseEvent;\n /** @internal value saved in the same order as _originStyleProp[] */\n protected elOriginStyleVal: string[];\n /** @internal */\n protected parentOriginStylePosition: string;\n /** @internal */\n protected static _originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\n /** @internal */\n protected sizeToContent: boolean;\n\n // have to be public else complains for HTMLElementExtendOpt ?\n constructor(public el: GridItemHTMLElement, public option: DDResizableOpt = {}) {\n super();\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseOver = this._mouseOver.bind(this);\n this._mouseOut = this._mouseOut.bind(this);\n this.enable();\n this._setupAutoHide(this.option.autoHide);\n this._setupHandlers();\n }\n\n public on(event: 'resizestart' | 'resize' | 'resizestop', callback: (event: DragEvent) => void): void {\n super.on(event, callback);\n }\n\n public off(event: 'resizestart' | 'resize' | 'resizestop'): void {\n super.off(event);\n }\n\n public enable(): void {\n super.enable();\n this.el.classList.remove('ui-resizable-disabled');\n this._setupAutoHide(this.option.autoHide);\n }\n\n public disable(): void {\n super.disable();\n this.el.classList.add('ui-resizable-disabled');\n this._setupAutoHide(false);\n }\n\n public destroy(): void {\n this._removeHandlers();\n this._setupAutoHide(false);\n delete this.el;\n super.destroy();\n }\n\n public updateOption(opts: DDResizableOpt): DDResizable {\n const updateHandles = (opts.handles && opts.handles !== this.option.handles);\n const updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide(this.option.autoHide);\n }\n return this;\n }\n\n /** @internal turns auto hide on/off */\n protected _setupAutoHide(auto: boolean): DDResizable {\n if (auto) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover and not mouseenter to get better performance and track for nested cases\n this.el.addEventListener('mouseover', this._mouseOver);\n this.el.addEventListener('mouseout', this._mouseOut);\n } else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._mouseOver);\n this.el.removeEventListener('mouseout', this._mouseOut);\n if (DDManager.overResizeElement === this) {\n delete DDManager.overResizeElement;\n }\n }\n return this;\n }\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _mouseOver(e: Event): void {\n // console.log(`${count++} pre-enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n // already over a child, ignore. Ideally we just call e.stopPropagation() but see https://github.com/gridstack/gridstack.js/issues/2018\n if (DDManager.overResizeElement || DDManager.dragElement) return;\n DDManager.overResizeElement = this;\n // console.log(`${count++} enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.remove('ui-resizable-autohide');\n }\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _mouseOut(e: Event): void {\n // console.log(`${count++} pre-leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n if (DDManager.overResizeElement !== this) return;\n delete DDManager.overResizeElement;\n // console.log(`${count++} leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.add('ui-resizable-autohide');\n }\n\n /** @internal */\n protected _setupHandlers(): DDResizable {\n this.handlers = this.option.handles.split(',')\n .map(dir => dir.trim())\n .map(dir => new DDResizableHandle(this.el, dir, {\n element: this.option.element,\n start: (event: MouseEvent) => this._resizeStart(event),\n stop: (event: MouseEvent) => this._resizeStop(event),\n move: (event: MouseEvent) => this._resizing(event, dir)\n }));\n return this;\n }\n\n /** @internal */\n protected _resizeStart(event: MouseEvent): DDResizable {\n this.sizeToContent = Utils.shouldSizeToContent(this.el.gridstackNode, true); // strick true only and not number\n this.originalRect = this.el.getBoundingClientRect();\n this.scrollEl = Utils.getScrollElement(this.el);\n this.scrollY = this.scrollEl.scrollTop;\n this.scrolled = 0;\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n }\n\n /** @internal */\n protected _resizing(event: MouseEvent, dir: string): DDResizable {\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n }\n\n /** @internal */\n protected _resizeStop(event: MouseEvent): DDResizable {\n const ev = Utils.initEvent(event, { type: 'resizestop', target: this.el });\n // Remove style attr now, so the stop handler can rebuild style attrs\n this._cleanHelper();\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n delete this.scrollY;\n delete this.scrolled;\n return this;\n }\n\n /** @internal */\n protected _setupHelper(): DDResizable {\n this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n\n const parent = this.el.parentElement;\n const dragTransform = Utils.getValuesFromTransformedElement(parent);\n this.rectScale = {\n x: dragTransform.xScale,\n y: dragTransform.yScale\n };\n\n if (getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = 'absolute';\n this.el.style.opacity = '0.8';\n return this;\n }\n\n /** @internal */\n protected _cleanHelper(): DDResizable {\n DDResizable._originStyleProp.forEach((prop, i) => {\n this.el.style[prop] = this.elOriginStyleVal[i] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n }\n\n /** @internal */\n protected _getChange(event: MouseEvent, dir: string): Rect {\n const oEvent = this.startEvent;\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n\n const offsetX = event.clientX - oEvent.clientX;\n const offsetY = this.sizeToContent ? 0 : event.clientY - oEvent.clientY; // prevent vert resize\n let moveLeft: boolean;\n let moveUp: boolean;\n\n if (dir.indexOf('e') > -1) {\n newRect.width += offsetX;\n } else if (dir.indexOf('w') > -1) {\n newRect.width -= offsetX;\n newRect.left += offsetX;\n moveLeft = true;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += offsetY;\n } else if (dir.indexOf('n') > -1) {\n newRect.height -= offsetY;\n newRect.top += offsetY\n moveUp = true;\n }\n const constrain = this._constrainSize(newRect.width, newRect.height, moveLeft, moveUp);\n if (Math.round(newRect.width) !== Math.round(constrain.width)) { // round to ignore slight round-off errors\n if (dir.indexOf('w') > -1) {\n newRect.left += newRect.width - constrain.width;\n }\n newRect.width = constrain.width;\n }\n if (Math.round(newRect.height) !== Math.round(constrain.height)) {\n if (dir.indexOf('n') > -1) {\n newRect.top += newRect.height - constrain.height;\n }\n newRect.height = constrain.height;\n }\n return newRect;\n }\n\n /** @internal constrain the size to the set min/max values */\n protected _constrainSize(oWidth: number, oHeight: number, moveLeft: boolean, moveUp: boolean): Size {\n const o = this.option;\n const maxWidth = (moveLeft ? o.maxWidthMoveLeft : o.maxWidth) || Number.MAX_SAFE_INTEGER;\n const minWidth = o.minWidth / this.rectScale.x || oWidth;\n const maxHeight = (moveUp ? o.maxHeightMoveUp : o.maxHeight) || Number.MAX_SAFE_INTEGER;\n const minHeight = o.minHeight / this.rectScale.y || oHeight;\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width, height };\n }\n\n /** @internal */\n protected _applyChange(): DDResizable {\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n const containmentEl = this.el.parentElement;\n const { left, top } = containmentEl.getBoundingClientRect();\n containmentRect = { left, top, width: 0, height: 0 };\n }\n if (!this.temporalRect) return this;\n Object.keys(this.temporalRect).forEach(key => {\n const value = this.temporalRect[key];\n const scaleReciprocal = key === 'width' || key === 'left' ? this.rectScale.x : key === 'height' || key === 'top' ? this.rectScale.y : 1;\n this.el.style[key] = (value - containmentRect[key]) * scaleReciprocal + 'px';\n });\n return this;\n }\n\n /** @internal */\n protected _removeHandlers(): DDResizable {\n this.handlers.forEach(handle => handle.destroy());\n delete this.handlers;\n return this;\n }\n\n /** @internal */\n protected _ui = (): DDUIData => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const newRect = { // Note: originalRect is a complex object, not a simple Rect, so copy out.\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n const rect = this.temporalRect || newRect;\n return {\n position: {\n left: (rect.left - containmentRect.left) * this.rectScale.x,\n top: (rect.top - containmentRect.top) * this.rectScale.y\n },\n size: {\n width: rect.width * this.rectScale.x,\n height: rect.height * this.rectScale.y\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/dd-touch.d.ts b/node_modules/gridstack/dist/dd-touch.d.ts index b995bce01..690716432 100644 --- a/node_modules/gridstack/dist/dd-touch.d.ts +++ b/node_modules/gridstack/dist/dd-touch.d.ts @@ -1,5 +1,5 @@ /** - * touch.ts 12.3.2 + * touch.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ /** @@ -8,6 +8,11 @@ * /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) */ export declare const isTouch: boolean; +export declare class DDTouch { + /** set to true while we are handling touch dragging, to prevent accepting browser real mouse events (trusted:true) vs our simulated ones (trusted:false) */ + static touchHandled: boolean; + static pointerLeaveTimeout: number; +} /** * Handle the touchstart events * @param {Object} e The widget element's touchstart event diff --git a/node_modules/gridstack/dist/dd-touch.js b/node_modules/gridstack/dist/dd-touch.js index 00abdb9f2..7156390e5 100644 --- a/node_modules/gridstack/dist/dd-touch.js +++ b/node_modules/gridstack/dist/dd-touch.js @@ -1,5 +1,5 @@ /** - * touch.ts 12.3.2 + * touch.ts 12.4.2 * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license */ import { DDManager } from './dd-manager'; @@ -19,7 +19,7 @@ export const isTouch = typeof window !== 'undefined' && typeof document !== 'und // eslint-disable-next-line @typescript-eslint/no-explicit-any || navigator.msMaxTouchPoints > 0); // interface TouchCoord {x: number, y: number}; -class DDTouch { +export class DDTouch { } /** * Get the x,y position of a touch event diff --git a/node_modules/gridstack/dist/dd-touch.js.map b/node_modules/gridstack/dist/dd-touch.js.map index 32bdd2b0c..7b9560afc 100644 --- a/node_modules/gridstack/dist/dd-touch.js.map +++ b/node_modules/gridstack/dist/dd-touch.js.map @@ -1 +1 @@ -{"version":3,"file":"dd-touch.js","sourceRoot":"","sources":["../src/dd-touch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * touch.ts 12.3.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDManager } from './dd-manager';\nimport { Utils } from './utils';\n\n/**\n * Detect touch support - Windows Surface devices and other touch devices\n * should we use this instead ? (what we had for always showing resize handles)\n * /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)\n */\nexport const isTouch: boolean = typeof window !== 'undefined' && typeof document !== 'undefined' &&\n ( 'ontouchstart' in document\n || 'ontouchstart' in window\n // || !!window.TouchEvent // true on Windows 10 Chrome desktop so don't use this\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch)\n || navigator.maxTouchPoints > 0\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || (navigator as any).msMaxTouchPoints > 0\n );\n\n// interface TouchCoord {x: number, y: number};\n\nclass DDTouch {\n public static touchHandled: boolean;\n public static pointerLeaveTimeout: number;\n}\n\n/**\n* Get the x,y position of a touch event\n*/\n// function getTouchCoords(e: TouchEvent): TouchCoord {\n// return {\n// x: e.changedTouches[0].pageX,\n// y: e.changedTouches[0].pageY\n// };\n// }\n\n/**\n * Simulate a mouse event based on a corresponding touch event\n * @param {Object} e A touch event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulateMouseEvent(e: TouchEvent, simulatedType: string) {\n\n // Ignore multi-touch events\n if (e.touches.length > 1) return;\n\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable) e.preventDefault();\n\n // Dispatch the simulated event to the target element\n Utils.simulateMouseEvent(e.changedTouches[0], simulatedType);\n}\n\n/**\n * Simulate a mouse event based on a corresponding Pointer event\n * @param {Object} e A pointer event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulatePointerMouseEvent(e: PointerEvent, simulatedType: string) {\n\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable) e.preventDefault();\n\n // Dispatch the simulated event to the target element\n Utils.simulateMouseEvent(e, simulatedType);\n}\n\n\n/**\n * Handle the touchstart events\n * @param {Object} e The widget element's touchstart event\n */\nexport function touchstart(e: TouchEvent): void {\n // Ignore the event if another widget is already being handled\n if (DDTouch.touchHandled) return;\n DDTouch.touchHandled = true;\n\n // Simulate the mouse events\n // simulateMouseEvent(e, 'mouseover');\n // simulateMouseEvent(e, 'mousemove');\n simulateMouseEvent(e, 'mousedown');\n}\n\n/**\n * Handle the touchmove events\n * @param {Object} e The document's touchmove event\n */\nexport function touchmove(e: TouchEvent): void {\n // Ignore event if not handled by us\n if (!DDTouch.touchHandled) return;\n\n simulateMouseEvent(e, 'mousemove');\n}\n\n/**\n * Handle the touchend events\n * @param {Object} e The document's touchend event\n */\nexport function touchend(e: TouchEvent): void {\n\n // Ignore event if not handled\n if (!DDTouch.touchHandled) return;\n\n // cancel delayed leave event when we release on ourself which happens BEFORE we get this!\n if (DDTouch.pointerLeaveTimeout) {\n window.clearTimeout(DDTouch.pointerLeaveTimeout);\n delete DDTouch.pointerLeaveTimeout;\n }\n\n const wasDragging = !!DDManager.dragElement;\n\n // Simulate the mouseup event\n simulateMouseEvent(e, 'mouseup');\n // simulateMouseEvent(event, 'mouseout');\n\n // If the touch interaction did not move, it should trigger a click\n if (!wasDragging) {\n simulateMouseEvent(e, 'click');\n }\n\n // Unset the flag to allow other widgets to inherit the touch event\n DDTouch.touchHandled = false;\n}\n\n/**\n * Note we don't get touchenter/touchleave (which are deprecated)\n * see https://stackoverflow.com/questions/27908339/js-touch-equivalent-for-mouseenter\n * so instead of PointerEvent to still get enter/leave and send the matching mouse event.\n */\nexport function pointerdown(e: PointerEvent): void {\n // console.log(\"pointer down\")\n if (e.pointerType === 'mouse') return;\n (e.target as HTMLElement).releasePointerCapture(e.pointerId) // <- Important!\n}\n\nexport function pointerenter(e: PointerEvent): void {\n // ignore the initial one we get on pointerdown on ourself\n if (!DDManager.dragElement) {\n // console.log('pointerenter ignored');\n return;\n }\n // console.log('pointerenter');\n if (e.pointerType === 'mouse') return;\n simulatePointerMouseEvent(e, 'mouseenter');\n}\n\nexport function pointerleave(e: PointerEvent): void {\n // ignore the leave on ourself we get before releasing the mouse over ourself\n // by delaying sending the event and having the up event cancel us\n if (!DDManager.dragElement) {\n // console.log('pointerleave ignored');\n return;\n }\n if (e.pointerType === 'mouse') return;\n DDTouch.pointerLeaveTimeout = window.setTimeout(() => {\n delete DDTouch.pointerLeaveTimeout;\n // console.log('pointerleave delayed');\n simulatePointerMouseEvent(e, 'mouseleave');\n }, 10);\n}\n\n"]} \ No newline at end of file +{"version":3,"file":"dd-touch.js","sourceRoot":"","sources":["../src/dd-touch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * touch.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { DDManager } from './dd-manager';\nimport { Utils } from './utils';\n\n/**\n * Detect touch support - Windows Surface devices and other touch devices\n * should we use this instead ? (what we had for always showing resize handles)\n * /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)\n */\nexport const isTouch: boolean = typeof window !== 'undefined' && typeof document !== 'undefined' &&\n ( 'ontouchstart' in document\n || 'ontouchstart' in window\n // || !!window.TouchEvent // true on Windows 10 Chrome desktop so don't use this\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch)\n || navigator.maxTouchPoints > 0\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || (navigator as any).msMaxTouchPoints > 0\n );\n\n// interface TouchCoord {x: number, y: number};\n\nexport class DDTouch {\n /** set to true while we are handling touch dragging, to prevent accepting browser real mouse events (trusted:true) vs our simulated ones (trusted:false) */\n public static touchHandled: boolean;\n public static pointerLeaveTimeout: number;\n}\n\n/**\n* Get the x,y position of a touch event\n*/\n// function getTouchCoords(e: TouchEvent): TouchCoord {\n// return {\n// x: e.changedTouches[0].pageX,\n// y: e.changedTouches[0].pageY\n// };\n// }\n\n/**\n * Simulate a mouse event based on a corresponding touch event\n * @param {Object} e A touch event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulateMouseEvent(e: TouchEvent, simulatedType: string) {\n\n // Ignore multi-touch events\n if (e.touches.length > 1) return;\n\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable) e.preventDefault();\n\n // Dispatch the simulated event to the target element\n Utils.simulateMouseEvent(e.changedTouches[0], simulatedType);\n}\n\n/**\n * Simulate a mouse event based on a corresponding Pointer event\n * @param {Object} e A pointer event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulatePointerMouseEvent(e: PointerEvent, simulatedType: string) {\n\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable) e.preventDefault();\n\n // Dispatch the simulated event to the target element\n Utils.simulateMouseEvent(e, simulatedType);\n}\n\n\n/**\n * Handle the touchstart events\n * @param {Object} e The widget element's touchstart event\n */\nexport function touchstart(e: TouchEvent): void {\n // Ignore the event if another widget is already being handled\n if (DDTouch.touchHandled) return;\n DDTouch.touchHandled = true;\n\n // Simulate the mouse events\n // simulateMouseEvent(e, 'mouseover');\n // simulateMouseEvent(e, 'mousemove');\n simulateMouseEvent(e, 'mousedown');\n}\n\n/**\n * Handle the touchmove events\n * @param {Object} e The document's touchmove event\n */\nexport function touchmove(e: TouchEvent): void {\n // Ignore event if not handled by us\n if (!DDTouch.touchHandled) return;\n\n simulateMouseEvent(e, 'mousemove');\n}\n\n/**\n * Handle the touchend events\n * @param {Object} e The document's touchend event\n */\nexport function touchend(e: TouchEvent): void {\n\n // Ignore event if not handled\n if (!DDTouch.touchHandled) return;\n\n // cancel delayed leave event when we release on ourself which happens BEFORE we get this!\n if (DDTouch.pointerLeaveTimeout) {\n window.clearTimeout(DDTouch.pointerLeaveTimeout);\n delete DDTouch.pointerLeaveTimeout;\n }\n\n const wasDragging = !!DDManager.dragElement;\n\n // Simulate the mouseup event\n simulateMouseEvent(e, 'mouseup');\n // simulateMouseEvent(event, 'mouseout');\n\n // If the touch interaction did not move, it should trigger a click\n if (!wasDragging) {\n simulateMouseEvent(e, 'click');\n }\n\n // Unset the flag to allow other widgets to inherit the touch event\n DDTouch.touchHandled = false;\n}\n\n/**\n * Note we don't get touchenter/touchleave (which are deprecated)\n * see https://stackoverflow.com/questions/27908339/js-touch-equivalent-for-mouseenter\n * so instead of PointerEvent to still get enter/leave and send the matching mouse event.\n */\nexport function pointerdown(e: PointerEvent): void {\n // console.log(\"pointer down\")\n if (e.pointerType === 'mouse') return;\n (e.target as HTMLElement).releasePointerCapture(e.pointerId) // <- Important!\n}\n\nexport function pointerenter(e: PointerEvent): void {\n // ignore the initial one we get on pointerdown on ourself\n if (!DDManager.dragElement) {\n // console.log('pointerenter ignored');\n return;\n }\n // console.log('pointerenter');\n if (e.pointerType === 'mouse') return;\n simulatePointerMouseEvent(e, 'mouseenter');\n}\n\nexport function pointerleave(e: PointerEvent): void {\n // ignore the leave on ourself we get before releasing the mouse over ourself\n // by delaying sending the event and having the up event cancel us\n if (!DDManager.dragElement) {\n // console.log('pointerleave ignored');\n return;\n }\n if (e.pointerType === 'mouse') return;\n DDTouch.pointerLeaveTimeout = window.setTimeout(() => {\n delete DDTouch.pointerLeaveTimeout;\n // console.log('pointerleave delayed');\n simulatePointerMouseEvent(e, 'mouseleave');\n }, 10);\n}\n\n"]} \ No newline at end of file diff --git a/node_modules/gridstack/dist/gridstack-all.js b/node_modules/gridstack/dist/gridstack-all.js index 9afc9eb1e..8913728d0 100644 --- a/node_modules/gridstack/dist/gridstack-all.js +++ b/node_modules/gridstack/dist/gridstack-all.js @@ -1,3 +1,3 @@ /*! For license information please see gridstack-all.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.GridStack=t():e.GridStack=t()}(self,(()=>(()=>{"use strict";var e={d:(t,i)=>{for(var s in i)e.o(i,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};e.d(t,{GridStack:()=>x});class i{static getElements(e,t=document){if("string"==typeof e){const i="getElementById"in t?t:void 0;if(i&&!isNaN(+e[0])){const t=i.getElementById(e);return t?[t]:[]}let s=t.querySelectorAll(e);return s.length||"."===e[0]||"#"===e[0]||(s=t.querySelectorAll("."+e),s.length||(s=t.querySelectorAll("#"+e))),Array.from(s)}return[e]}static getElement(e,t=document){if("string"==typeof e){const i="getElementById"in t?t:void 0;if(!e.length)return null;if(i&&"#"===e[0])return i.getElementById(e.substring(1));if("#"===e[0]||"."===e[0]||"["===e[0])return t.querySelector(e);if(i&&!isNaN(+e[0]))return i.getElementById(e);let s=t.querySelector(e);return i&&!s&&(s=i.getElementById(e)),s||(s=t.querySelector("."+e)),s}return e}static lazyLoad(e){return e.lazyLoad||e.grid?.opts?.lazyLoad&&!1!==e.lazyLoad}static createDiv(e,t){const i=document.createElement("div");return e.forEach((e=>{e&&i.classList.add(e)})),t?.appendChild(i),i}static shouldSizeToContent(e,t=!1){return e?.grid&&(t?!0===e.sizeToContent||!0===e.grid.opts.sizeToContent&&void 0===e.sizeToContent:!!e.sizeToContent||e.grid.opts.sizeToContent&&!1!==e.sizeToContent)}static isIntercepted(e,t){return!(e.y>=t.y+t.h||e.y+e.h<=t.y||e.x+e.w<=t.x||e.x>=t.x+t.w)}static isTouching(e,t){return i.isIntercepted(e,{x:t.x-.5,y:t.y-.5,w:t.w+1,h:t.h+1})}static areaIntercept(e,t){const i=e.x>t.x?e.x:t.x,s=e.x+e.wt.y?e.y:t.y,n=e.y+e.h{const o=t*((e.y??i)-(s.y??i));return 0===o?t*((e.x??i)-(s.x??i)):o}))}static find(e,t){return t?e.find((e=>e.id===t)):void 0}static toBool(e){return"boolean"==typeof e?e:"string"==typeof e?!(""===(e=e.toLowerCase())||"no"===e||"false"===e||"0"===e):Boolean(e)}static toNumber(e){return null===e||0===e.length?void 0:Number(e)}static parseHeight(e){let t,i="px";if("string"==typeof e)if("auto"===e||""===e)t=0;else{const s=e.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%|cm|mm)?$/);if(!s)throw new Error(`Invalid height val = ${e}`);i=s[2]||"px",t=parseFloat(s[1])}else t=e;return{h:t,unit:i}}static defaults(e,...t){return t.forEach((t=>{for(const s in t){if(!t.hasOwnProperty(s))return;null===e[s]||void 0===e[s]?e[s]=t[s]:"object"==typeof t[s]&&"object"==typeof e[s]&&i.defaults(e[s],t[s])}})),e}static same(e,t){if("object"!=typeof e)return e==t;if(typeof e!=typeof t)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const i in e)if(e[i]!==t[i])return!1;return!0}static copyPos(e,t,i=!1){return void 0!==t.x&&(e.x=t.x),void 0!==t.y&&(e.y=t.y),void 0!==t.w&&(e.w=t.w),void 0!==t.h&&(e.h=t.h),i&&(t.minW&&(e.minW=t.minW),t.minH&&(e.minH=t.minH),t.maxW&&(e.maxW=t.maxW),t.maxH&&(e.maxH=t.maxH)),e}static samePos(e,t){return e&&t&&e.x===t.x&&e.y===t.y&&(e.w||1)===(t.w||1)&&(e.h||1)===(t.h||1)}static sanitizeMinMax(e){e.minW||delete e.minW,e.minH||delete e.minH,e.maxW||delete e.maxW,e.maxH||delete e.maxH}static removeInternalAndSame(e,t){if("object"==typeof e&&"object"==typeof t&&!Array.isArray(e)&&!Array.isArray(t))for(let s in e){const o=e[s],n=t[s];"_"===s[0]||o===n?delete e[s]:o&&"object"==typeof o&&void 0!==n&&(i.removeInternalAndSame(o,n),Object.keys(o).length||delete e[s])}}static removeInternalForSave(e,t=!0){for(let t in e)"_"!==t[0]&&null!==e[t]&&void 0!==e[t]||delete e[t];delete e.grid,t&&delete e.el,e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,e.locked||delete e.locked,1!==e.w&&e.w!==e.minW||delete e.w,1!==e.h&&e.h!==e.minH||delete e.h}static throttle(e,t){let i=!1;return(...s)=>{i||(i=!0,setTimeout((()=>{e(...s),i=!1}),t))}}static removePositioningStyles(e){const t=e.style;t.position&&t.removeProperty("position"),t.left&&t.removeProperty("left"),t.top&&t.removeProperty("top"),t.width&&t.removeProperty("width"),t.height&&t.removeProperty("height")}static getScrollElement(e){if(!e)return document.scrollingElement||document.documentElement;const t=getComputedStyle(e);return/(auto|scroll)/.test(t.overflow+t.overflowY)?e:i.getScrollElement(e.parentElement)}static updateScrollPosition(e,t,s){const o=i.getScrollElement(e);if(!o)return;const n=e.getBoundingClientRect(),r=o.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,h=n.bottom-Math.min(r.bottom,a),l=n.top-Math.max(r.top,0),d=o.scrollTop;l<0&&s<0?e.offsetHeight>r.height?o.scrollTop+=s:o.scrollTop+=Math.abs(l)>Math.abs(s)?s:l:h>0&&s>0&&(e.offsetHeight>r.height?o.scrollTop+=s:o.scrollTop+=h>s?s:h),t.top+=o.scrollTop-d}static updateScrollResize(e,t,s){const o=i.getScrollElement(t),n=o.clientHeight,r=o===i.getScrollElement()?0:o.getBoundingClientRect().top,a=e.clientY-r,h=a>n-s;ae===o))&&(s[o]=i.cloneDeep(e[o]));return s}static cloneNode(e){const t=e.cloneNode(!0);return t.removeAttribute("id"),t}static appendTo(e,t){let s;s="string"==typeof t?i.getElement(t):t,s&&s.appendChild(e)}static addElStyles(e,t){if(t instanceof Object)for(const i in t)t.hasOwnProperty(i)&&(Array.isArray(t[i])?t[i].forEach((t=>{e.style[i]=t})):e.style[i]=t[i])}static initEvent(e,t){const i={type:t.type},s={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:t.target?t.target:e.target};return["altKey","ctrlKey","metaKey","shiftKey"].forEach((t=>i[t]=e[t])),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach((t=>i[t]=e[t])),{...i,...s}}static simulateMouseEvent(e,t,i){const s=e,o=new MouseEvent(t,{bubbles:!0,composed:!0,cancelable:!0,view:window,detail:1,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,ctrlKey:s.ctrlKey??!1,altKey:s.altKey??!1,shiftKey:s.shiftKey??!1,metaKey:s.metaKey??!1,button:0,relatedTarget:e.target});(i||e.target).dispatchEvent(o)}static getValuesFromTransformedElement(e){const t=document.createElement("div");i.addElStyles(t,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),e.appendChild(t);const s=t.getBoundingClientRect();return e.removeChild(t),t.remove(),{xScale:1/s.width,yScale:1/s.height,xOffset:s.left,yOffset:s.top}}static swap(e,t,i){if(!e)return;const s=e[t];e[t]=e[i],e[i]=s}static canBeRotated(e){return!(!e||e.w===e.h||e.locked||e.noResize||e.grid?.opts.disableResize||e.minW&&e.minW===e.maxW||e.minH&&e.minH===e.maxH)}}class s{constructor(e={}){this.addedNodes=[],this.removedNodes=[],this.defaultColumn=12,this.column=e.column||this.defaultColumn,this.column>this.defaultColumn&&(this.defaultColumn=this.column),this.maxRow=e.maxRow,this._float=e.float,this.nodes=e.nodes||[],this.onChange=e.onChange}batchUpdate(e=!0,t=!0){return!!this.batchMode===e||(this.batchMode=e,e?(this._prevFloat=this._float,this._float=!0,this.cleanNodes(),this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,t&&this._packNodes(),this._notify())),this}_useEntireRowArea(e,t){return(!this.float||this.batchMode&&!this._prevFloat)&&!this._hasLocked&&(!e._moving||e._skipDown||t.y<=e.y)}_fixCollisions(e,t=e,s,o={}){if(this.sortNodes(-1),!(s=s||this.collide(e,t)))return!1;if(e._moving&&!o.nested&&!this.float&&this.swap(e,s))return!0;let n=t;!this._loading&&this._useEntireRowArea(e,t)&&(n={x:0,w:this.column,y:t.y,h:t.h},s=this.collide(e,n,o.skip));let r=!1;const a={nested:!0,pack:!1};let h=0;for(;s=s||this.collide(e,n,o.skip);){if(h++>2*this.nodes.length)throw new Error("Infinite collide check");let n;if(s.locked||this._loading||e._moving&&!e._skipDown&&t.y>e.y&&!this.float&&(!this.collide(s,{...s,y:e.y},e)||!this.collide(s,{...s,y:t.y-s.h},e))){e._skipDown=e._skipDown||t.y>e.y;const h={...t,y:s.y+s.h,...a};n=!(!this._loading||!i.samePos(e,h))||this.moveNode(e,h),(s.locked||this._loading)&&n?i.copyPos(t,e):!s.locked&&n&&o.pack&&(this._packNodes(),t.y=s.y+s.h,i.copyPos(e,t)),r=r||n}else n=this.moveNode(s,{...s,y:t.y+t.h,skip:e,...a});if(!n)return r;s=void 0}return r}collide(e,t=e,s){const o=e._id,n=s?._id;return this.nodes.find((e=>e._id!==o&&e._id!==n&&i.isIntercepted(e,t)))}collideAll(e,t=e,s){const o=e._id,n=s?._id;return this.nodes.filter((e=>e._id!==o&&e._id!==n&&i.isIntercepted(e,t)))}directionCollideCoverage(e,t,i){if(!t.rect||!e._rect)return;const s=e._rect,o={...t.rect};let n;o.y>s.y?(o.h+=o.y-s.y,o.y=s.y):o.h+=s.y-o.y,o.x>s.x?(o.w+=o.x-s.x,o.x=s.x):o.w+=s.x-o.x;let r=.5;for(let e of i){if(e.locked||!e._rect)break;const t=e._rect;let i=Number.MAX_VALUE,a=Number.MAX_VALUE;s.yt.y+t.h&&(i=(t.y+t.h-o.y)/t.h),s.xt.x+t.w&&(a=(t.x+t.w-o.x)/t.w);const h=Math.min(a,i);h>r&&(r=h,n=e)}return t.collide=n,n}cacheRects(e,t,i,s,o,n){return this.nodes.forEach((r=>r._rect={y:r.y*t+i,x:r.x*e+n,w:r.w*e-n-s,h:r.h*t-i-o})),this}swap(e,t){if(!t||t.locked||!e||e.locked)return!1;function s(){const i=t.x,s=t.y;return t.x=e.x,t.y=e.y,e.h!=t.h?(e.x=i,e.y=t.y+t.h):e.w!=t.w?(e.x=t.x+t.w,e.y=s):(e.x=i,e.y=s),e._dirty=t._dirty=!0,!0}let o;if(e.w===t.w&&e.h===t.h&&(e.x===t.x||e.y===t.y)&&(o=i.isTouching(e,t)))return s();if(!1!==o){if(e.w===t.w&&e.x===t.x&&(o||(o=i.isTouching(e,t)))){if(t.y{let o;t.locked||(t.autoPosition=!0,"list"===e&&i&&(o=s[i-1])),this.addNode(t,!1,o)})),s||delete this._inColumnResize,i||this.batchUpdate(!1),this}set float(e){this._float!==e&&(this._float=e||!1,e||this._packNodes()._notify())}get float(){return this._float||!1}sortNodes(e=1){return this.nodes=i.sort(this.nodes,e),this}_packNodes(){return this.batchMode||(this.sortNodes(),this.float?this.nodes.forEach((e=>{if(e._updating||void 0===e._orig||e.y===e._orig.y)return;let t=e.y;for(;t>e._orig.y;)--t,this.collide(e,{x:e.x,y:t,w:e.w,h:e.h})||(e._dirty=!0,e.y=t)})):this.nodes.forEach(((e,t)=>{if(!e.locked)for(;e.y>0;){const i=0===t?0:e.y-1;if(0!==t&&this.collide(e,{x:e.x,y:i,w:e.w,h:e.h}))break;e._dirty=e.y!==i,e.y=i}}))),this}prepareNode(e,t){e._id=e._id??s._idSeq++;const o=e.id;if(o){let t=1;for(;this.nodes.find((t=>t.id===e.id&&t!==e));)e.id=o+"_"+t++}void 0!==e.x&&void 0!==e.y&&null!==e.x&&null!==e.y||(e.autoPosition=!0);const n={x:0,y:0,w:1,h:1};return i.defaults(e,n),e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,i.sanitizeMinMax(e),"string"==typeof e.x&&(e.x=Number(e.x)),"string"==typeof e.y&&(e.y=Number(e.y)),"string"==typeof e.w&&(e.w=Number(e.w)),"string"==typeof e.h&&(e.h=Number(e.h)),isNaN(e.x)&&(e.x=n.x,e.autoPosition=!0),isNaN(e.y)&&(e.y=n.y,e.autoPosition=!0),isNaN(e.w)&&(e.w=n.w),isNaN(e.h)&&(e.h=n.h),this.nodeBoundFix(e,t),e}nodeBoundFix(e,t){const s=e._orig||i.copyPos({},e);if(e.maxW&&(e.w=Math.min(e.w||1,e.maxW)),e.maxH&&(e.h=Math.min(e.h||1,e.maxH)),e.minW&&(e.w=Math.max(e.w||1,e.minW)),e.minH&&(e.h=Math.max(e.h||1,e.minH)),(e.x||0)+(e.w||1)>this.column&&this.columnthis.column?e.w=this.column:e.w<1&&(e.w=1),this.maxRow&&e.h>this.maxRow?e.h=this.maxRow:e.h<1&&(e.h=1),e.x<0&&(e.x=0),e.y<0&&(e.y=0),e.x+e.w>this.column&&(t?e.w=this.column-e.x:e.x=this.column-e.w),this.maxRow&&e.y+e.h>this.maxRow&&(t?e.h=this.maxRow-e.y:e.y=this.maxRow-e.h),i.samePos(e,s)||(e._dirty=!0),this}getDirtyNodes(e){return e?this.nodes.filter((e=>e._dirty&&!i.samePos(e,e._orig))):this.nodes.filter((e=>e._dirty))}_notify(e){if(this.batchMode||!this.onChange)return this;const t=(e||[]).concat(this.getDirtyNodes());return this.onChange(t),this}cleanNodes(){return this.batchMode||this.nodes.forEach((e=>{delete e._dirty,delete e._lastTried})),this}saveInitial(){return this.nodes.forEach((e=>{e._orig=i.copyPos({},e),delete e._dirty})),this._hasLocked=this.nodes.some((e=>e.locked)),this}restoreInitial(){return this.nodes.forEach((e=>{e._orig&&!i.samePos(e,e._orig)&&(i.copyPos(e,e._orig),e._dirty=!0)})),this._notify(),this}findEmptyPosition(e,t=this.nodes,s=this.column,o){let n=!1;for(let r=o?o.y*s+(o.x+o.w):0;!n;++r){const o=r%s,a=Math.floor(r/s);if(o+e.w>s)continue;const h={x:o,y:a,w:e.w,h:e.h};t.find((e=>i.isIntercepted(h,e)))||(e.x===o&&e.y===a||(e._dirty=!0),e.x=o,e.y=a,delete e.autoPosition,n=!0)}return n}addNode(e,t=!1,i){const s=this.nodes.find((t=>t._id===e._id));if(s)return s;let o;return this._inColumnResize?this.nodeBoundFix(e):this.prepareNode(e),delete e._temporaryRemoved,delete e._removeDOM,e.autoPosition&&this.findEmptyPosition(e,this.nodes,this.column,i)&&(delete e.autoPosition,o=!0),this.nodes.push(e),t&&this.addedNodes.push(e),o||this._fixCollisions(e),this.batchMode||this._packNodes()._notify(),e}removeNode(e,t=!0,i=!1){return this.nodes.find((t=>t._id===e._id))?(i&&this.removedNodes.push(e),t&&(e._removeDOM=!0),this.nodes=this.nodes.filter((t=>t._id!==e._id)),e._isAboutToRemove||this._packNodes(),this._notify([e]),this):this}removeAll(e=!0,t=!0){if(delete this._layouts,!this.nodes.length)return this;e&&this.nodes.forEach((e=>e._removeDOM=!0));const i=this.nodes;return this.removedNodes=t?i:[],this.nodes=[],this._notify(i)}moveNodeCheck(e,t){if(!this.changedPosConstrain(e,t))return!1;if(t.pack=!0,!this.maxRow)return this.moveNode(e,t);let o;const n=new s({column:this.column,float:this.float,nodes:this.nodes.map((t=>t._id===e._id?(o={...t},o):{...t}))});if(!o)return!1;const r=n.moveNode(o,t)&&n.getRow()<=Math.max(this.getRow(),this.maxRow);if(!r&&!t.resizing&&t.collide){const i=t.collide.el.gridstackNode;if(this.swap(e,i))return this._notify(),!0}return!!r&&(n.nodes.filter((e=>e._dirty)).forEach((e=>{const t=this.nodes.find((t=>t._id===e._id));t&&(i.copyPos(t,e),t._dirty=!0)})),this._notify(),!0)}willItFit(e){if(delete e._willFitPos,!this.maxRow)return!0;const t=new s({column:this.column,float:this.float,nodes:this.nodes.map((e=>({...e})))}),o={...e};return this.cleanupNode(o),delete o.el,delete o._id,delete o.content,delete o.grid,t.addNode(o),t.getRow()<=this.maxRow&&(e._willFitPos=i.copyPos({},o),!0)}changedPosConstrain(e,t){return t.w=t.w||e.w,t.h=t.h||e.h,e.x!==t.x||e.y!==t.y||(e.maxW&&(t.w=Math.min(t.w,e.maxW)),e.maxH&&(t.h=Math.min(t.h,e.maxH)),e.minW&&(t.w=Math.max(t.w,e.minW)),e.minH&&(t.h=Math.max(t.h,e.minH)),e.w!==t.w||e.h!==t.h)}moveNode(e,t){if(!e||!t)return!1;let s;void 0!==t.pack||this.batchMode||(s=t.pack=!0),"number"!=typeof t.x&&(t.x=e.x),"number"!=typeof t.y&&(t.y=e.y),"number"!=typeof t.w&&(t.w=e.w),"number"!=typeof t.h&&(t.h=e.h);const o=e.w!==t.w||e.h!==t.h,n=i.copyPos({},e,!0);if(i.copyPos(n,t),this.nodeBoundFix(n,o),i.copyPos(t,n),!t.forceCollide&&i.samePos(e,t))return!1;const r=i.copyPos({},e),a=this.collideAll(e,n,t.skip);let h=!0;if(a.length){const o=e._moving&&!t.nested;let r=o?this.directionCollideCoverage(e,t,a):a[0];if(o&&r&&e.grid?.opts?.subGridDynamic&&!e.grid._isTemp){const s=i.areaIntercept(t.rect,r._rect),o=i.area(t.rect),n=i.area(r._rect);s/(o.8&&(r.grid.makeSubGrid(r.el,void 0,e),r=void 0)}r?h=!this._fixCollisions(e,n,r,t):(h=!1,s&&delete t.pack)}return h&&!i.samePos(e,n)&&(e._dirty=!0,i.copyPos(e,n)),t.pack&&this._packNodes()._notify(),!i.samePos(e,r)}getRow(){return this.nodes.reduce(((e,t)=>Math.max(e,t.y+t.h)),0)}beginUpdate(e){return e._updating||(e._updating=!0,delete e._skipDown,this.batchMode||this.saveInitial()),this}endUpdate(){const e=this.nodes.find((e=>e._updating));return e&&(delete e._updating,delete e._skipDown),this}save(e=!0,t,s){const o=this._layouts?.length||0;let n;o&&(s?s!==this.column&&(n=this._layouts[s]):this.column!==o-1&&(n=this._layouts[o-1]));const r=[];return this.sortNodes(),this.nodes.forEach((s=>{const o=n?.find((e=>e._id===s._id)),a={...s,...o||{}};i.removeInternalForSave(a,!e),t&&t(s,a),r.push(a)})),r}layoutsNodesChange(e){return!this._layouts||this._inColumnResize||this._layouts.forEach(((t,i)=>{if(!t||i===this.column)return this;if(i{if(!e._orig)return;const i=t.find((t=>t._id===e._id));i&&(i.y>=0&&e.y!==e._orig.y&&(i.y+=e.y-e._orig.y),e.x!==e._orig.x&&(i.x=Math.round(e.x*s)),e.w!==e._orig.w&&(i.w=Math.round(e.w*s)))}))}})),this}columnChanged(e,t,s="moveScale"){if(!this.nodes.length||!t||e===t)return this;const o="compact"===s||"list"===s;o&&this.sortNodes(1),te&&this._layouts){const i=this._layouts[t]||[],s=this._layouts.length-1;!i.length&&e!==s&&this._layouts[s]?.length&&(e=s,this._layouts[s].forEach((e=>{const t=r.find((t=>t._id===e._id));t&&(o||e.autoPosition||(t.x=e.x??t.x,t.y=e.y??t.y),t.w=e.w??t.w,null!=e.x&&void 0!==e.y||(t.autoPosition=!0))}))),i.forEach((e=>{const t=r.findIndex((t=>t._id===e._id));if(-1!==t){const i=r[t];if(o)return void(i.w=e.w);(e.autoPosition||isNaN(e.x)||isNaN(e.y))&&this.findEmptyPosition(e,n),e.autoPosition||(i.x=e.x??i.x,i.y=e.y??i.y,i.w=e.w??i.w,n.push(i)),r.splice(t,1)}}))}if(o)this.compact(s,!1);else{if(r.length)if("function"==typeof s)s(t,e,n,r);else{const i=o||"none"===s?1:t/e,a="move"===s||"moveScale"===s,h="scale"===s||"moveScale"===s;r.forEach((s=>{s.x=1===t?0:a?Math.round(s.x*i):Math.min(s.x,t-1),s.w=1===t||1===e?1:h?Math.round(s.w*i)||1:Math.min(s.w,t),n.push(s)})),r=[]}n=i.sort(n,-1),this._inColumnResize=!0,this.nodes=[],n.forEach((e=>{this.addNode(e,!1),delete e._orig}))}return this.nodes.forEach((e=>delete e._orig)),this.batchUpdate(!1,!o),delete this._inColumnResize,this}cacheLayout(e,t,i=!1){const o=[];return e.forEach(((e,t)=>{if(void 0===e._id){const t=e.id?this.nodes.find((t=>t.id===e.id)):void 0;e._id=t?._id??s._idSeq++}o[t]={x:e.x,y:e.y,w:e.w,_id:e._id}})),this._layouts=i?[]:this._layouts||[],this._layouts[t]=o,this}cacheOneLayout(e,t){e._id=e._id??s._idSeq++;const i={x:e.x,y:e.y,w:e.w,_id:e._id};(e.autoPosition||void 0===e.x)&&(delete i.x,delete i.y,e.autoPosition&&(i.autoPosition=!0)),this._layouts=this._layouts||[],this._layouts[t]=this._layouts[t]||[];const o=this.findCacheLayout(e,t);return-1===o?this._layouts[t].push(i):this._layouts[t][o]=i,this}findCacheLayout(e,t){return this._layouts?.[t]?.findIndex((t=>t._id===e._id))??-1}removeNodeFromLayoutCache(e){if(this._layouts)for(let t=0;t0||navigator.msMaxTouchPoints>0);class a{}function h(e,t){e.touches.length>1||(e.cancelable&&e.preventDefault(),i.simulateMouseEvent(e.changedTouches[0],t))}function l(e,t){e.cancelable&&e.preventDefault(),i.simulateMouseEvent(e,t)}function d(e){a.touchHandled||(a.touchHandled=!0,h(e,"mousedown"))}function c(e){a.touchHandled&&h(e,"mousemove")}function g(e){if(!a.touchHandled)return;a.pointerLeaveTimeout&&(window.clearTimeout(a.pointerLeaveTimeout),delete a.pointerLeaveTimeout);const t=!!n.dragElement;h(e,"mouseup"),t||h(e,"click"),a.touchHandled=!1}function u(e){"mouse"!==e.pointerType&&e.target.releasePointerCapture(e.pointerId)}function p(e){n.dragElement&&"mouse"!==e.pointerType&&l(e,"mouseenter")}function m(e){n.dragElement&&"mouse"!==e.pointerType&&(a.pointerLeaveTimeout=window.setTimeout((()=>{delete a.pointerLeaveTimeout,l(e,"mouseleave")}),10))}class f{constructor(e,t,i){this.host=e,this.dir=t,this.option=i,this.moving=!1,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this._init()}_init(){const e=this.el=document.createElement("div");return e.classList.add("ui-resizable-handle"),e.classList.add(`${f.prefix}${this.dir}`),e.style.zIndex="100",e.style.userSelect="none",this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),r&&(this.el.addEventListener("touchstart",d),this.el.addEventListener("pointerdown",u)),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),r&&(this.el.removeEventListener("touchstart",d),this.el.removeEventListener("pointerdown",u)),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(e){this.mouseDownEvent=e,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),r&&(this.el.addEventListener("touchmove",c),this.el.addEventListener("touchend",g)),e.stopPropagation(),e.preventDefault()}_mouseMove(e){const t=this.mouseDownEvent;this.moving?this._triggerEvent("move",e):Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>2&&(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent),this._triggerEvent("move",e),document.addEventListener("keydown",this._keyEvent)),e.stopPropagation()}_mouseUp(e){this.moving&&(this._triggerEvent("stop",e),document.removeEventListener("keydown",this._keyEvent)),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),r&&(this.el.removeEventListener("touchmove",c),this.el.removeEventListener("touchend",g)),delete this.moving,delete this.mouseDownEvent,e.stopPropagation(),e.preventDefault()}_keyEvent(e){"Escape"===e.key&&(this.host.gridstackNode?.grid?.engine.restoreInitial(),this._mouseUp(this.mouseDownEvent))}_triggerEvent(e,t){return this.option[e]&&this.option[e](t),this}}f.prefix="ui-resizable-";class v{constructor(){this._eventRegister={}}get disabled(){return this._disabled}on(e,t){this._eventRegister[e]=t}off(e){delete this._eventRegister[e]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(e,t){if(!this.disabled&&this._eventRegister&&this._eventRegister[e])return this._eventRegister[e](t)}}class _ extends v{constructor(e,t={}){super(),this.el=e,this.option=t,this.rectScale={x:1,y:1},this._ui=()=>{const e=this.el.parentElement.getBoundingClientRect(),t={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},i=this.temporalRect||t;return{position:{left:(i.left-e.left)*this.rectScale.x,top:(i.top-e.top)*this.rectScale.y},size:{width:i.width*this.rectScale.x,height:i.height*this.rectScale.y}}},this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this.enable(),this._setupAutoHide(this.option.autoHide),this._setupHandlers()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){super.enable(),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this._setupAutoHide(!1)}destroy(){this._removeHandlers(),this._setupAutoHide(!1),delete this.el,super.destroy()}updateOption(e){const t=e.handles&&e.handles!==this.option.handles,i=e.autoHide&&e.autoHide!==this.option.autoHide;return Object.keys(e).forEach((t=>this.option[t]=e[t])),t&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(this.option.autoHide),this}_setupAutoHide(e){return e?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),n.overResizeElement===this&&delete n.overResizeElement),this}_mouseOver(e){n.overResizeElement||n.dragElement||(n.overResizeElement=this,this.el.classList.remove("ui-resizable-autohide"))}_mouseOut(e){n.overResizeElement===this&&(delete n.overResizeElement,this.el.classList.add("ui-resizable-autohide"))}_setupHandlers(){return this.handlers=this.option.handles.split(",").map((e=>e.trim())).map((e=>new f(this.el,e,{start:e=>{this._resizeStart(e)},stop:e=>{this._resizeStop(e)},move:t=>{this._resizing(t,e)}}))),this}_resizeStart(e){this.sizeToContent=i.shouldSizeToContent(this.el.gridstackNode,!0),this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=i.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=e,this._setupHelper(),this._applyChange();const t=i.initEvent(e,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(t,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",t),this}_resizing(e,t){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(e,t),this._applyChange();const s=i.initEvent(e,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(s,this._ui()),this.triggerEvent("resize",s),this}_resizeStop(e){const t=i.initEvent(e,{type:"resizestop",target:this.el});return this._cleanHelper(),this.option.stop&&this.option.stop(t),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",t),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){this.elOriginStyleVal=_._originStyleProp.map((e=>this.el.style[e])),this.parentOriginStylePosition=this.el.parentElement.style.position;const e=this.el.parentElement,t=i.getValuesFromTransformedElement(e);return this.rectScale={x:t.xScale,y:t.yScale},getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this}_cleanHelper(){return _._originStyleProp.forEach(((e,t)=>{this.el.style[e]=this.elOriginStyleVal[t]||null})),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(e,t){const i=this.startEvent,s={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},o=e.clientX-i.clientX,n=this.sizeToContent?0:e.clientY-i.clientY;let r,a;t.indexOf("e")>-1?s.width+=o:t.indexOf("w")>-1&&(s.width-=o,s.left+=o,r=!0),t.indexOf("s")>-1?s.height+=n:t.indexOf("n")>-1&&(s.height-=n,s.top+=n,a=!0);const h=this._constrainSize(s.width,s.height,r,a);return Math.round(s.width)!==Math.round(h.width)&&(t.indexOf("w")>-1&&(s.left+=s.width-h.width),s.width=h.width),Math.round(s.height)!==Math.round(h.height)&&(t.indexOf("n")>-1&&(s.top+=s.height-h.height),s.height=h.height),s}_constrainSize(e,t,i,s){const o=this.option,n=(i?o.maxWidthMoveLeft:o.maxWidth)||Number.MAX_SAFE_INTEGER,r=o.minWidth/this.rectScale.x||e,a=(s?o.maxHeightMoveUp:o.maxHeight)||Number.MAX_SAFE_INTEGER,h=o.minHeight/this.rectScale.y||t;return{width:Math.min(n,Math.max(r,e)),height:Math.min(a,Math.max(h,t))}}_applyChange(){let e={left:0,top:0,width:0,height:0};if("absolute"===this.el.style.position){const t=this.el.parentElement,{left:i,top:s}=t.getBoundingClientRect();e={left:i,top:s,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach((t=>{const i=this.temporalRect[t],s="width"===t||"left"===t?this.rectScale.x:"height"===t||"top"===t?this.rectScale.y:1;this.el.style[t]=(i-e[t])*s+"px"})),this):this}_removeHandlers(){return this.handlers.forEach((e=>e.destroy())),delete this.handlers,this}}_._originStyleProp=["width","height","position","left","top","opacity","zIndex"];class y extends v{constructor(e,t={}){super(),this.el=e,this.option=t,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0};const i=t?.handle?.substring(1),s=e.gridstackNode;this.dragEls=!i||e.classList.contains(i)?[e]:s?.subGrid?[e.querySelector(t.handle)||e]:Array.from(e.querySelectorAll(t.handle)),0===this.dragEls.length&&(this.dragEls=[e]),this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this.enable()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){!1!==this.disabled&&(super.enable(),this.dragEls.forEach((e=>{e.addEventListener("mousedown",this._mouseDown),r&&(e.addEventListener("touchstart",d),e.addEventListener("pointerdown",u))})),this.el.classList.remove("ui-draggable-disabled"))}disable(e=!1){!0!==this.disabled&&(super.disable(),this.dragEls.forEach((e=>{e.removeEventListener("mousedown",this._mouseDown),r&&(e.removeEventListener("touchstart",d),e.removeEventListener("pointerdown",u))})),e||this.el.classList.add("ui-draggable-disabled"))}destroy(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.mouseDownEvent&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(e){return Object.keys(e).forEach((t=>this.option[t]=e[t])),this}_mouseDown(e){if(!n.mouseHandled)return 0!==e.button||!this.dragEls.find((t=>t===e.target))&&e.target.closest('input,textarea,button,select,option,[contenteditable="true"],.ui-resizable-handle')||this.option.cancel&&e.target.closest(this.option.cancel)||(this.mouseDownEvent=e,delete this.dragging,delete n.dragElement,delete n.dropElement,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),r&&(e.currentTarget.addEventListener("touchmove",c),e.currentTarget.addEventListener("touchend",g)),e.preventDefault(),document.activeElement&&document.activeElement.blur(),n.mouseHandled=!0),!0}_callDrag(e){if(!this.dragging)return;const t=i.initEvent(e,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(t,this.ui()),this.triggerEvent("drag",t)}_mouseMove(e){const t=this.mouseDownEvent;if(this.lastDrag=e,this.dragging)if(this._dragFollow(e),n.pauseDrag){const t=Number.isInteger(n.pauseDrag)?n.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout((()=>this._callDrag(e)),t)}else this._callDrag(e);else if(Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>3){this.dragging=!0,n.dragElement=this;const t=this.el.gridstackNode?.grid;t?n.dropElement=t.el.ddElement.ddDroppable:delete n.dropElement,this.helper=this._createHelper(),this._setupHelperContainmentStyle(),this.dragTransform=i.getValuesFromTransformedElement(this.helperContainment),this.dragOffset=this._getDragOffset(e,this.el,this.helperContainment),this._setupHelperStyle(e);const s=i.initEvent(e,{target:this.el,type:"dragstart"});this.option.start&&this.option.start(s,this.ui()),this.triggerEvent("dragstart",s),document.addEventListener("keydown",this._keyEvent)}return!0}_mouseUp(e){if(document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),r&&e.currentTarget&&(e.currentTarget.removeEventListener("touchmove",c,!0),e.currentTarget.removeEventListener("touchend",g,!0)),this.dragging){delete this.dragging,delete this.el.gridstackNode?._origRotate,document.removeEventListener("keydown",this._keyEvent),n.dropElement?.el===this.el.parentElement&&delete n.dropElement,this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper!==this.el&&this.helper.remove(),this._removeHelperStyle();const t=i.initEvent(e,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(t),this.triggerEvent("dragstop",t),n.dropElement&&n.dropElement.drop(e)}delete this.helper,delete this.mouseDownEvent,delete n.dragElement,delete n.dropElement,delete n.mouseHandled,e.preventDefault()}_keyEvent(e){const t=this.el.gridstackNode,s=t?.grid||n.dropElement?.el?.gridstack;if("Escape"===e.key)t&&t._origRotate&&(t._orig=t._origRotate,delete t._origRotate),s?.cancelDrag(),this._mouseUp(this.mouseDownEvent);else if(t&&s&&("r"===e.key||"R"===e.key)){if(!i.canBeRotated(t))return;t._origRotate=t._origRotate||{...t._orig},delete t._moving,s.setAnimation(!1).rotate(t.el,{top:-this.dragOffset.offsetTop,left:-this.dragOffset.offsetLeft}).setAnimation(),t._moving=!0,this.dragOffset=this._getDragOffset(this.lastDrag,t.el,this.helperContainment),this.helper.style.width=this.dragOffset.width+"px",this.helper.style.height=this.dragOffset.height+"px",i.swap(t._orig,"w","h"),delete t._rect,this._mouseMove(this.lastDrag)}}_createHelper(){let e=this.el;return"function"==typeof this.option.helper?e=this.option.helper(this.el):"clone"===this.option.helper&&(e=i.cloneNode(this.el)),e.parentElement||i.appendTo(e,"parent"===this.option.appendTo?this.el.parentElement:this.option.appendTo),this.dragElementOriginStyle=y.originStyleProp.map((e=>this.el.style[e])),e}_setupHelperStyle(e){this.helper.classList.add("ui-draggable-dragging"),this.el.gridstackNode?.grid?.el.classList.add("grid-stack-dragging");const t=this.helper.style;return t.pointerEvents="none",t.width=this.dragOffset.width+"px",t.height=this.dragOffset.height+"px",t.willChange="left, top",t.position="fixed",this._dragFollow(e),t.transition="none",setTimeout((()=>{this.helper&&(t.transition=null)}),0),this}_removeHelperStyle(){this.helper.classList.remove("ui-draggable-dragging"),this.el.gridstackNode?.grid?.el.classList.remove("grid-stack-dragging");const e=this.helper?.gridstackNode;if(!e?._isAboutToRemove&&this.dragElementOriginStyle){const e=this.helper,t=this.dragElementOriginStyle.transition||null;e.style.transition=this.dragElementOriginStyle.transition="none",y.originStyleProp.forEach((t=>e.style[t]=this.dragElementOriginStyle[t]||null)),setTimeout((()=>e.style.transition=t),50)}return delete this.dragElementOriginStyle,this}_dragFollow(e){const t=this.helper.style,i=this.dragOffset;t.left=(e.clientX+i.offsetLeft-0)*this.dragTransform.xScale+"px",t.top=(e.clientY+i.offsetTop-0)*this.dragTransform.yScale+"px"}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.helper.style.position&&(this.parentOriginStylePosition=this.helperContainment.style.position,getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_getDragOffset(e,t,i){let s=0,o=0;i&&(s=this.dragTransform.xOffset,o=this.dragTransform.yOffset);const n=t.getBoundingClientRect();return{left:n.left,top:n.top,offsetLeft:-e.clientX+n.left-s,offsetTop:-e.clientY+n.top-o,width:n.width*this.dragTransform.xScale,height:n.height*this.dragTransform.yScale}}ui(){const e=this.el.parentElement.getBoundingClientRect(),t=this.helper.getBoundingClientRect();return{position:{top:(t.top-e.top)*this.dragTransform.yScale,left:(t.left-e.left)*this.dragTransform.xScale}}}}y.originStyleProp=["width","height","transform","transform-origin","transition","pointerEvents","position","left","top","minWidth","willChange"];class b extends v{constructor(e,t={}){super(),this.el=e,this.option=t,this._mouseEnter=this._mouseEnter.bind(this),this._mouseLeave=this._mouseLeave.bind(this),this.enable(),this._setupAccept()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){!1!==this.disabled&&(super.enable(),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),r&&(this.el.addEventListener("pointerenter",p),this.el.addEventListener("pointerleave",m)))}disable(e=!1){!0!==this.disabled&&(super.disable(),this.el.classList.remove("ui-droppable"),e||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),r&&(this.el.removeEventListener("pointerenter",p),this.el.removeEventListener("pointerleave",m)))}destroy(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),super.destroy()}updateOption(e){return Object.keys(e).forEach((t=>this.option[t]=e[t])),this._setupAccept(),this}_mouseEnter(e){if(!n.dragElement)return;if(!this._canDrop(n.dragElement.el))return;e.preventDefault(),e.stopPropagation(),n.dropElement&&n.dropElement!==this&&n.dropElement._mouseLeave(e,!0),n.dropElement=this;const t=i.initEvent(e,{target:this.el,type:"dropover"});this.option.over&&this.option.over(t,this._ui(n.dragElement)),this.triggerEvent("dropover",t),this.el.classList.add("ui-droppable-over")}_mouseLeave(e,t=!1){if(!n.dragElement||n.dropElement!==this)return;e.preventDefault(),e.stopPropagation();const s=i.initEvent(e,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(s,this._ui(n.dragElement)),this.triggerEvent("dropout",s),n.dropElement===this&&(delete n.dropElement,!t)){let t,i=this.el.parentElement;for(;!t&&i;)t=i.ddElement?.ddDroppable,i=i.parentElement;t&&t._mouseEnter(e)}}drop(e){e.preventDefault();const t=i.initEvent(e,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(t,this._ui(n.dragElement)),this.triggerEvent("drop",t)}_canDrop(e){return e&&(!this.accept||this.accept(e))}_setupAccept(){return this.option.accept?("string"==typeof this.option.accept?this.accept=e=>e.classList.contains(this.option.accept)||e.matches(this.option.accept):this.accept=this.option.accept,this):this}_ui(e){return{draggable:e.el,...e.ui()}}}class w{static init(e){return e.ddElement||(e.ddElement=new w(e)),e.ddElement}constructor(e){this.el=e}on(e,t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.on(e,t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.on(e,t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.on(e,t),this}off(e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.off(e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.off(e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.off(e),this}setupDraggable(e){return this.ddDraggable?this.ddDraggable.updateOption(e):this.ddDraggable=new y(this.el,e),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(e){return this.ddResizable?this.ddResizable.updateOption(e):this.ddResizable=new _(this.el,e),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(e){return this.ddDroppable?this.ddDroppable.updateOption(e):this.ddDroppable=new b(this.el,e),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}}const E=new class{resizable(e,t,i,s){return this._getDDElements(e,t).forEach((e=>{if("disable"===t||"enable"===t)e.ddResizable&&e.ddResizable[t]();else if("destroy"===t)e.ddResizable&&e.cleanResizable();else if("option"===t)e.setupResizable({[i]:s});else{const i=e.el.gridstackNode.grid;let s=e.el.getAttribute("gs-resize-handles")||i.opts.resizable.handles||"e,s,se";"all"===s&&(s="n,e,s,w,se,sw,ne,nw");const o=!i.opts.alwaysShowResizeHandle;e.setupResizable({...i.opts.resizable,handles:s,autoHide:o,start:t.start,stop:t.stop,resize:t.resize})}})),this}draggable(e,t,i,s){return this._getDDElements(e,t).forEach((e=>{if("disable"===t||"enable"===t)e.ddDraggable&&e.ddDraggable[t]();else if("destroy"===t)e.ddDraggable&&e.cleanDraggable();else if("option"===t)e.setupDraggable({[i]:s});else{const i=e.el.gridstackNode.grid;e.setupDraggable({...i.opts.draggable,start:t.start,stop:t.stop,drag:t.drag})}})),this}dragIn(e,t){return this._getDDElements(e).forEach((e=>e.setupDraggable(t))),this}droppable(e,t,i,s){return"function"!=typeof t.accept||t._accept||(t._accept=t.accept,t.accept=e=>t._accept(e)),this._getDDElements(e,t).forEach((e=>{"disable"===t||"enable"===t?e.ddDroppable&&e.ddDroppable[t]():"destroy"===t?e.ddDroppable&&e.cleanDroppable():"option"===t?e.setupDroppable({[i]:s}):e.setupDroppable(t)})),this}isDroppable(e){return!(!e?.ddElement?.ddDroppable||e.ddElement.ddDroppable.disabled)}isDraggable(e){return!(!e?.ddElement?.ddDraggable||e.ddElement.ddDraggable.disabled)}isResizable(e){return!(!e?.ddElement?.ddResizable||e.ddElement.ddResizable.disabled)}on(e,t,i){return this._getDDElements(e).forEach((e=>e.on(t,(e=>{i(e,n.dragElement?n.dragElement.el:e.target,n.dragElement?n.dragElement.helper:null)})))),this}off(e,t){return this._getDDElements(e).forEach((e=>e.off(t))),this}_getDDElements(e,t){const s=e.gridstack||"destroy"!==t&&"disable"!==t,o=i.getElements(e);return o.length?o.map((e=>e.ddElement||(s?w.init(e):null))).filter((e=>e)):[]}};class x{static init(e={},t=".grid-stack"){if("undefined"==typeof document)return null;const s=x.getGridElement(t);return s?(s.gridstack||(s.gridstack=new x(s,i.cloneDeep(e))),s.gridstack):("string"==typeof t?console.error('GridStack.initAll() no grid was found with selector "'+t+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)}static initAll(e={},t=".grid-stack"){const s=[];return"undefined"==typeof document||(x.getGridElements(t).forEach((t=>{t.gridstack||(t.gridstack=new x(t,i.cloneDeep(e))),s.push(t.gridstack)})),0===s.length&&console.error('GridStack.initAll() no grid was found with selector "'+t+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.')),s}static addGrid(e,t={}){if(!e)return null;let s=e;if(s.gridstack){const e=s.gridstack;return t&&(e.opts={...e.opts,...t}),void 0!==t.children&&e.load(t.children),e}return e.classList.contains("grid-stack")&&!x.addRemoveCB||(s=x.addRemoveCB?x.addRemoveCB(e,t,!0,!0):i.createDiv(["grid-stack",t.class],e)),x.init(t,s)}static registerEngine(e){x.engineClass=e}get placeholder(){if(!this._placeholder){this._placeholder=i.createDiv([this.opts.placeholderClass,o.itemClass,this.opts.itemClass]);const e=i.createDiv(["placeholder-content"],this._placeholder);this.opts.placeholderText&&(e.textContent=this.opts.placeholderText)}return this._placeholder}constructor(e,t={}){this.el=e,this.opts=t,this.animationDelay=310,this._gsEventHandler={},this._extraDragRow=0,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0},e.gridstack=this,this.opts=t=t||{},e.classList.contains("grid-stack")||this.el.classList.add("grid-stack"),t.row&&(t.minRow=t.maxRow=t.row,delete t.row);const a=i.toNumber(e.getAttribute("gs-row"));"auto"===t.column&&delete t.column,void 0!==t.alwaysShowResizeHandle&&(t._alwaysShowResizeHandle=t.alwaysShowResizeHandle);const h=t.columnOpts;if(h){const e=h.breakpoints;h.columnWidth||e?.length?(h.columnMax=h.columnMax||12,e?.length>1&&e.sort(((e,t)=>(t.w||0)-(e.w||0)))):delete t.columnOpts}const l={...i.cloneDeep(o),column:i.toNumber(e.getAttribute("gs-column"))||o.column,minRow:a||i.toNumber(e.getAttribute("gs-min-row"))||o.minRow,maxRow:a||i.toNumber(e.getAttribute("gs-max-row"))||o.maxRow,staticGrid:i.toBool(e.getAttribute("gs-static"))||o.staticGrid,sizeToContent:i.toBool(e.getAttribute("gs-size-to-content"))||void 0,draggable:{handle:(t.handleClass?"."+t.handleClass:t.handle?t.handle:"")||o.draggable.handle},removableOptions:{accept:t.itemClass||o.removableOptions.accept,decline:o.removableOptions.decline}};e.getAttribute("gs-animate")&&(l.animate=i.toBool(e.getAttribute("gs-animate"))),t=i.defaults(t,l),this._initMargin(),this.checkDynamicColumn(),this._updateColumnVar(t),"auto"===t.rtl&&(t.rtl="rtl"===e.style.direction),t.rtl&&this.el.classList.add("grid-stack-rtl");const d=this.el.closest("."+o.itemClass),c=d?.gridstackNode;if(c&&(c.subGrid=this,this.parentGridNode=c,this.el.classList.add("grid-stack-nested"),c.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight="auto"===t.cellHeight,this._isAutoCellHeight||"initial"===t.cellHeight)this.cellHeight(void 0);else{"number"==typeof t.cellHeight&&t.cellHeightUnit&&t.cellHeightUnit!==o.cellHeightUnit&&(t.cellHeight=t.cellHeight+t.cellHeightUnit,delete t.cellHeightUnit);const e=t.cellHeight;delete t.cellHeight,this.cellHeight(e)}"mobile"===t.alwaysShowResizeHandle&&(t.alwaysShowResizeHandle=r),this._setStaticClass();const g=t.engineClass||x.engineClass||s;if(this.engine=new g({column:this.getColumn(),float:t.float,maxRow:t.maxRow,onChange:e=>{e.forEach((e=>{const t=e.el;t&&(e._removeDOM?(t&&t.remove(),delete e._removeDOM):this._writePosAttr(t,e))})),this._updateContainerHeight()}}),t.auto&&(this.batchUpdate(),this.engine._loading=!0,this.getGridItems().forEach((e=>this._prepareElement(e))),delete this.engine._loading,this.batchUpdate(!1)),t.children){const e=t.children;delete t.children,e.length&&this.load(e)}this.setAnimation(),t.subGridDynamic&&!n.pauseDrag&&(n.pauseDrag=!0),void 0!==t.draggable?.pause&&(n.pauseDrag=t.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateResizeEvent()}_updateColumnVar(e=this.opts){this.el.classList.add("gs-"+e.column),"number"==typeof e.column&&this.el.style.setProperty("--gs-column-width",100/e.column+"%")}addWidget(e){if(!e)return;if("string"==typeof e)return void console.error("V11: GridStack.addWidget() does not support string anymore. see #2736");if(e.ELEMENT_NODE)return console.error("V11: GridStack.addWidget() does not support HTMLElement anymore. use makeWidget()"),this.makeWidget(e);let t,s=e;if(s.grid=this,t=s.el?s.el:x.addRemoveCB?x.addRemoveCB(this.el,e,!0,!1):this.createWidgetDivs(s),!t)return;if(s=t.gridstackNode,s&&t.parentElement===this.el&&this.engine.nodes.find((e=>e._id===s._id)))return t;const o=this._readAttr(t);return i.defaults(e,o),this.engine.prepareNode(e),this.el.appendChild(t),this.makeWidget(t,e),t}createWidgetDivs(e){const t=i.createDiv(["grid-stack-item",this.opts.itemClass]),s=i.createDiv(["grid-stack-item-content"],t);return i.lazyLoad(e)?e.visibleObservable||(e.visibleObservable=new IntersectionObserver((([t])=>{t.isIntersecting&&(e.visibleObservable?.disconnect(),delete e.visibleObservable,x.renderCB(s,e),e.grid?.prepareDragDrop(e.el))})),window.setTimeout((()=>e.visibleObservable?.observe(t)))):x.renderCB(s,e),t}makeSubGrid(e,t,s,o=!0){let n,r=e.gridstackNode;if(r||(r=this.makeWidget(e).gridstackNode),r.subGrid?.el)return r.subGrid;let a,h=this;for(;h&&!n;)n=h.opts?.subGridOpts,h=h.parentGridNode?.grid;t=i.cloneDeep({...this.opts,id:void 0,children:void 0,column:"auto",columnOpts:void 0,layout:"list",subGridOpts:void 0,...n||{},...t||r.subGridOpts||{}}),r.subGridOpts=t,"auto"===t.column&&(a=!0,t.column=Math.max(r.w||1,s?.w||1),delete t.columnOpts);let l,d,c=r.el.querySelector(".grid-stack-item-content");if(o&&(this._removeDD(r.el),d={...r,x:0,y:0},i.removeInternalForSave(d),delete d.subGridOpts,r.content&&(d.content=r.content,delete r.content),x.addRemoveCB?l=x.addRemoveCB(this.el,d,!0,!1):(l=i.createDiv(["grid-stack-item"]),l.appendChild(c),c=i.createDiv(["grid-stack-item-content"],r.el)),this.prepareDragDrop(r.el)),s){const e=a?t.column:r.w,i=r.h+s.h,o=r.el.style;o.transition="none",this.update(r.el,{w:e,h:i}),setTimeout((()=>o.transition=null))}const g=r.subGrid=x.addGrid(c,t);return s?._moving&&(g._isTemp=!0),a&&(g._autoColumn=!0),o&&g.makeWidget(l,d),s&&(s._moving?window.setTimeout((()=>i.simulateMouseEvent(s._event,"mouseenter",g.el)),0):g.makeWidget(r.el,r)),this.resizeToContentCheck(!1,r),g}removeAsSubGrid(e){const t=this.parentGridNode?.grid;t&&(t.batchUpdate(),t.removeWidget(this.parentGridNode.el,!0,!0),this.engine.nodes.forEach((e=>{e.x+=this.parentGridNode.x,e.y+=this.parentGridNode.y,t.makeWidget(e.el,e)})),t.batchUpdate(!1),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,e&&window.setTimeout((()=>i.simulateMouseEvent(e._event,"mouseenter",t.el)),0))}save(e=!0,t=!1,s=x.saveCB,n){const r=this.engine.save(e,s,n);if(r.forEach((i=>{if(e&&i.el&&!i.subGrid&&!s){const e=i.el.querySelector(".grid-stack-item-content");i.content=e?.innerHTML,i.content||delete i.content}else if(e||s||delete i.content,i.subGrid?.el){const o=i.w||i.subGrid.getColumn(),n=i.subGrid.save(e,t,s,o);i.subGridOpts=t?n:{children:n},delete i.subGrid}delete i.el})),t){const e=i.cloneDeep(this.opts);e.marginBottom===e.marginTop&&e.marginRight===e.marginLeft&&e.marginTop===e.marginRight&&(e.margin=e.marginTop,delete e.marginTop,delete e.marginRight,delete e.marginBottom,delete e.marginLeft),e.rtl===("rtl"===this.el.style.direction)&&(e.rtl="auto"),this._isAutoCellHeight&&(e.cellHeight="auto"),this._autoColumn&&(e.column="auto");const t=e._alwaysShowResizeHandle;return delete e._alwaysShowResizeHandle,void 0!==t?e.alwaysShowResizeHandle=t:delete e.alwaysShowResizeHandle,i.removeInternalAndSame(e,o),e.children=r,e}return r}load(e,t=x.addRemoveCB||!0){e=i.cloneDeep(e);const s=this.getColumn();e.forEach((e=>{e.w=e.w||e.minW||1,e.h=e.h||e.minH||1})),e=i.sort(e),this.engine.skipCacheUpdate=this._ignoreLayoutsNodeChange=!0;let o=0;e.forEach((e=>{o=Math.max(o,(e.x||0)+e.w)})),o>this.engine.defaultColumn&&(this.engine.defaultColumn=o),o>s&&(0===this.engine.nodes.length&&this.responseLayout?(this.engine.nodes=e,this.engine.columnChanged(o,s,this.responseLayout),e=this.engine.nodes,this.engine.nodes=[],delete this.responseLayout):this.engine.cacheLayout(e,o,!0));const n=x.addRemoveCB;"function"==typeof t&&(x.addRemoveCB=t);const r=[];this.batchUpdate();const a=!this.engine.nodes.length,h=a&&this.opts.animate;h&&this.setAnimation(!1),!a&&t&&[...this.engine.nodes].forEach((t=>{t.id&&(i.find(e,t.id)||(x.addRemoveCB&&x.addRemoveCB(this.el,t,!1,!1),r.push(t),this.removeWidget(t.el,!0,!1)))})),this.engine._loading=!0;const l=[];return this.engine.nodes=this.engine.nodes.filter((t=>!i.find(e,t.id)||(l.push(t),!1))),e.forEach((e=>{const s=i.find(l,e.id);if(s){if(i.shouldSizeToContent(s)&&(e.h=s.h),this.engine.nodeBoundFix(e),(e.autoPosition||void 0===e.x||void 0===e.y)&&(e.w=e.w||s.w,e.h=e.h||s.h,this.engine.findEmptyPosition(e)),this.engine.nodes.push(s),i.samePos(s,e)&&this.engine.nodes.length>1&&(this.moveNode(s,{...e,forceCollide:!0}),i.copyPos(e,s)),this.update(s.el,e),e.subGridOpts?.children){const t=s.el.querySelector(".grid-stack");t&&t.gridstack&&t.gridstack.load(e.subGridOpts.children)}}else t&&this.addWidget(e)})),delete this.engine._loading,this.engine.removedNodes=r,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this.engine.skipCacheUpdate,n?x.addRemoveCB=n:delete x.addRemoveCB,h&&this.setAnimation(!0,!0),this}batchUpdate(e=!0){return this.engine.batchUpdate(e),e||(this._updateContainerHeight(),this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this}getCellHeight(e=!1){if(this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!e||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;if("rem"===this.opts.cellHeightUnit)return this.opts.cellHeight*parseFloat(getComputedStyle(document.documentElement).fontSize);if("em"===this.opts.cellHeightUnit)return this.opts.cellHeight*parseFloat(getComputedStyle(this.el).fontSize);if("cm"===this.opts.cellHeightUnit)return this.opts.cellHeight*(96/2.54);if("mm"===this.opts.cellHeightUnit)return this.opts.cellHeight*(96/2.54)/10;const t=this.el.querySelector("."+this.opts.itemClass);if(t){const e=i.toNumber(t.getAttribute("gs-h"))||1;return Math.round(t.offsetHeight/e)}const s=parseInt(this.el.getAttribute("gs-current-row"));return s?Math.round(this.el.getBoundingClientRect().height/s):this.opts.cellHeight}cellHeight(e){if(void 0!==e&&this._isAutoCellHeight!==("auto"===e)&&(this._isAutoCellHeight="auto"===e,this._updateResizeEvent()),"initial"!==e&&"auto"!==e||(e=void 0),void 0===e){const t=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;e=this.cellWidth()+t}const t=i.parseHeight(e);return this.opts.cellHeightUnit===t.unit&&this.opts.cellHeight===t.h||(this.opts.cellHeightUnit=t.unit,this.opts.cellHeight=t.h,this.el.style.setProperty("--gs-cell-height",`${this.opts.cellHeight}${this.opts.cellHeightUnit}`),this._updateContainerHeight(),this.resizeToContentCheck()),this}cellWidth(){return this._widthOrContainer()/this.getColumn()}_widthOrContainer(e=!1){return e&&this.opts.columnOpts?.breakpointForWindow?window.innerWidth:this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth}checkDynamicColumn(){const e=this.opts.columnOpts;if(!e||!e.columnWidth&&!e.breakpoints?.length)return!1;const t=this.getColumn();let i=t;const s=this._widthOrContainer(!0);if(e.columnWidth)i=Math.min(Math.round(s/e.columnWidth)||1,e.columnMax);else{i=e.columnMax;let o=0;for(;oe.c===i));return this.column(i,t?.layout||e.layout),!0}return!1}compact(e="compact",t=!0){return this.engine.compact(e,t),this._triggerChangeEvent(),this}column(e,t="moveScale"){if(!e||e<1||this.opts.column===e)return this;const i=this.getColumn();return this.opts.column=e,this.engine?(this.engine.column=e,this.el.classList.remove("gs-"+i),this._updateColumnVar(),this.engine.columnChanged(i,e,t),this._isAutoCellHeight&&this.cellHeight(),this.resizeToContentCheck(!0),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this):(this.responseLayout=t,this)}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter((e=>e.matches("."+this.opts.itemClass)&&!e.matches("."+this.opts.placeholderClass)))}isIgnoreChangeCB(){return this._ignoreLayoutsNodeChange}destroy(e=!0){if(this.el)return this.offAll(),this._updateResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),e?this.el.parentNode.removeChild(this.el):(this.removeAll(e),this.el.removeAttribute("gs-current-row")),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,delete this.opts,delete this._placeholder?.gridstackNode,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}float(e){return this.opts.float!==e&&(this.opts.float=this.engine.float=e,this._triggerChangeEvent()),this}getFloat(){return this.engine.float}getCellFromPixel(e,t=!1){const i=this.el.getBoundingClientRect();let s;s=t?{top:i.top+document.documentElement.scrollTop,left:i.left}:{top:this.el.offsetTop,left:this.el.offsetLeft};const o=e.left-s.left,n=e.top-s.top,r=i.width/this.getColumn(),a=i.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(o/r),y:Math.floor(n/a)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow||0)}isAreaEmpty(e,t,i,s){return this.engine.isAreaEmpty(e,t,i,s)}makeWidget(e,t){const i=x.getElement(e);if(!i||i.gridstackNode)return i;i.parentElement||this.el.appendChild(i),this._prepareElement(i,!0,t);const s=i.gridstackNode;let o;return this._updateContainerHeight(),s.subGridOpts&&this.makeSubGrid(i,s.subGridOpts,void 0,!1),1!==this.opts.column||this._ignoreLayoutsNodeChange||(o=this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),o&&delete this._ignoreLayoutsNodeChange,i}on(e,t){if(-1!==e.indexOf(" "))return e.split(" ").forEach((e=>this.on(e,t))),this;if("change"===e||"added"===e||"removed"===e||"enable"===e||"disable"===e){const i="enable"===e||"disable"===e;this._gsEventHandler[e]=i?e=>t(e):e=>{e.detail&&t(e,e.detail)},this.el.addEventListener(e,this._gsEventHandler[e])}else"drag"===e||"dragstart"===e||"dragstop"===e||"resizestart"===e||"resize"===e||"resizestop"===e||"dropped"===e||"resizecontent"===e?this._gsEventHandler[e]=t:console.error("GridStack.on("+e+") event not supported");return this}off(e){return-1!==e.indexOf(" ")?(e.split(" ").forEach((e=>this.off(e))),this):("change"!==e&&"added"!==e&&"removed"!==e&&"enable"!==e&&"disable"!==e||this._gsEventHandler[e]&&this.el.removeEventListener(e,this._gsEventHandler[e]),delete this._gsEventHandler[e],this)}offAll(){return Object.keys(this._gsEventHandler).forEach((e=>this.off(e))),this}removeWidget(e,t=!0,i=!0){return e?(x.getElements(e).forEach((e=>{if(e.parentElement&&e.parentElement!==this.el)return;let s=e.gridstackNode;s||(s=this.engine.nodes.find((t=>e===t.el))),s&&(t&&x.addRemoveCB&&x.addRemoveCB(this.el,s,!1,!1),delete e.gridstackNode,this._removeDD(e),this.engine.removeNode(s,t,i),t&&e.parentElement&&e.remove())})),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this):(console.error("Error: GridStack.removeWidget(undefined) called"),this)}removeAll(e=!0,t=!0){return this.engine.nodes.forEach((t=>{e&&x.addRemoveCB&&x.addRemoveCB(this.el,t,!1,!1),delete t.el.gridstackNode,this.opts.staticGrid||this._removeDD(t.el)})),this.engine.removeAll(e,t),t&&this._triggerRemoveEvent(),this}setAnimation(e=this.opts.animate,t){return t?setTimeout((()=>{this.opts&&this.setAnimation(e)})):e?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this.opts.animate=e,this}hasAnimationCSS(){return this.el.classList.contains("grid-stack-animate")}setStatic(e,t=!0,i=!0){return!!this.opts.staticGrid===e||(e?this.opts.staticGrid=!0:delete this.opts.staticGrid,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach((s=>{this.prepareDragDrop(s.el),s.subGrid&&i&&s.subGrid.setStatic(e,t,i)})),t&&this._setStaticClass()),this}updateOptions(e){const t=this.opts;return e===t||(void 0!==e.acceptWidgets&&(t.acceptWidgets=e.acceptWidgets,this._setupAcceptWidget()),void 0!==e.animate&&this.setAnimation(e.animate),e.cellHeight&&this.cellHeight(e.cellHeight),void 0!==e.class&&e.class!==t.class&&(t.class&&this.el.classList.remove(t.class),e.class&&this.el.classList.add(e.class)),e.columnOpts?(this.opts.columnOpts=e.columnOpts,this.checkDynamicColumn()):null===e.columnOpts&&this.opts.columnOpts?(delete this.opts.columnOpts,this._updateResizeEvent()):"number"==typeof e.column&&this.column(e.column),void 0!==e.margin&&this.margin(e.margin),void 0!==e.staticGrid&&this.setStatic(e.staticGrid),void 0===e.disableDrag||e.staticGrid||this.enableMove(!e.disableDrag),void 0===e.disableResize||e.staticGrid||this.enableResize(!e.disableResize),void 0!==e.float&&this.float(e.float),void 0!==e.row?(t.minRow=t.maxRow=t.row=e.row,this._updateContainerHeight()):(void 0!==e.minRow&&(t.minRow=e.minRow,this._updateContainerHeight()),void 0!==e.maxRow&&(t.maxRow=e.maxRow)),e.children?.length&&this.load(e.children)),this}update(e,t){return x.getElements(e).forEach((e=>{const s=e?.gridstackNode;if(!s)return;const o={...i.copyPos({},s),...i.cloneDeep(t)};this.engine.nodeBoundFix(o),delete o.autoPosition;const n=["x","y","w","h"];let r;if(n.some((e=>void 0!==o[e]&&o[e]!==s[e]))&&(r={},n.forEach((e=>{r[e]=void 0!==o[e]?o[e]:s[e],delete o[e]}))),!r&&(o.minW||o.minH||o.maxW||o.maxH)&&(r={}),void 0!==o.content){const t=e.querySelector(".grid-stack-item-content");t&&t.textContent!==o.content&&(s.content=o.content,x.renderCB(t,o),s.subGrid?.el&&(t.appendChild(s.subGrid.el),s.subGrid._updateContainerHeight())),delete o.content}let a=!1,h=!1;for(const e in o)"_"!==e[0]&&s[e]!==o[e]&&(s[e]=o[e],a=!0,h=h||!this.opts.staticGrid&&("noResize"===e||"noMove"===e||"locked"===e));if(i.sanitizeMinMax(s),r){const e=void 0!==r.w&&r.w!==s.w;this.moveNode(s,r),e&&s.subGrid?s.subGrid.onResize(this.hasAnimationCSS()?s.w:void 0):this.resizeToContentCheck(e,s),delete s._orig}(r||a)&&this._writeAttr(e,s),h&&this.prepareDragDrop(s.el),x.updateCB&&x.updateCB(s)})),this}moveNode(e,t){const i=e._updating;i||this.engine.cleanNodes().beginUpdate(e),this.engine.moveNode(e,t),this._updateContainerHeight(),i||(this._triggerChangeEvent(),this.engine.endUpdate())}resizeToContent(e){if(!e)return;if(e.classList.remove("size-to-content-max"),!e.clientHeight)return;const t=e.gridstackNode;if(!t)return;const i=t.grid;if(!i||e.parentElement!==i.el)return;const s=i.getCellHeight(!0);if(!s)return;let o,n=t.h?t.h*s:e.clientHeight;if(t.resizeToContentParent&&(o=e.querySelector(t.resizeToContentParent)),o||(o=e.querySelector(x.resizeToContentParent)),!o)return;const r=e.clientHeight-o.clientHeight,a=t.h?t.h*s-r:o.clientHeight;let h;if(t.subGrid){h=t.subGrid.getRow()*t.subGrid.getCellHeight(!0);const i=t.subGrid.el.getBoundingClientRect(),s=e.getBoundingClientRect();h+=i.top-s.top}else{if(t.subGridOpts?.children?.length)return;{const e=o.firstElementChild;if(!e)return void console.error(`Error: GridStack.resizeToContent() widget id:${t.id} '${x.resizeToContentParent}'.firstElementChild is null, make sure to have a div like container. Skipping sizing.`);h=e.getBoundingClientRect().height||a}}if(a===h)return;n+=h-a;let l=Math.ceil(n/s);const d=Number.isInteger(t.sizeToContent)?t.sizeToContent:0;d&&l>d&&(l=d,e.classList.add("size-to-content-max")),t.minH&&lt.maxH&&(l=t.maxH),l!==t.h&&(i._ignoreLayoutsNodeChange=!0,i.moveNode(t,{h:l}),delete i._ignoreLayoutsNodeChange)}resizeToContentCBCheck(e){x.resizeToContentCB?x.resizeToContentCB(e):this.resizeToContent(e)}rotate(e,t){return x.getElements(e).forEach((e=>{const s=e.gridstackNode;if(!i.canBeRotated(s))return;const o={w:s.h,h:s.w,minH:s.minW,minW:s.minH,maxH:s.maxW,maxW:s.maxH};if(t){const e=t.left>0?Math.floor(t.left/this.cellWidth()):0,i=t.top>0?Math.floor(t.top/this.opts.cellHeight):0;o.x=s.x+e-(s.h-(i+1)),o.y=s.y+i-e}Object.keys(o).forEach((e=>{void 0===o[e]&&delete o[e]}));const n=s._orig;this.update(e,o),s._orig=n})),this}margin(e){if(!("string"==typeof e&&e.split(" ").length>1)){const t=i.parseHeight(e);if(this.opts.marginUnit===t.unit&&this.opts.margin===t.h)return}return this.opts.margin=e,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this._initMargin(),this}getMargin(){return this.opts.margin}willItFit(e){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");const e=arguments;let t=0,i={x:e[t++],y:e[t++],w:e[t++],h:e[t++],autoPosition:e[t++]};return this.willItFit(i)}return this.engine.willItFit(e)}_triggerChangeEvent(){if(this.engine.batchMode)return this;const e=this.engine.getDirtyNodes(!0);return e&&e.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(e),this._triggerEvent("change",e)),this.engine.saveInitial(),this}_triggerAddEvent(){if(this.engine.batchMode)return this;if(this.engine.addedNodes?.length){this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach((e=>{delete e._dirty}));const e=[...this.engine.addedNodes];this.engine.addedNodes=[],this._triggerEvent("added",e)}return this}_triggerRemoveEvent(){if(this.engine.batchMode)return this;if(this.engine.removedNodes?.length){const e=[...this.engine.removedNodes];this.engine.removedNodes=[],this._triggerEvent("removed",e)}return this}_triggerEvent(e,t){const i=t?new CustomEvent(e,{bubbles:!1,detail:t}):new Event(e);let s=this;for(;s.parentGridNode;)s=s.parentGridNode.grid;return s.el.dispatchEvent(i),this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;const e=this.parentGridNode;let t=this.getRow()+this._extraDragRow;const s=this.opts.cellHeight,o=this.opts.cellHeightUnit;if(!s)return this;if(!e&&!this.opts.minRow){const e=i.parseHeight(getComputedStyle(this.el).minHeight);if(e.h>0&&e.unit===o){const i=Math.floor(e.h/s);t1?`calc(${t.w} * var(--gs-column-width))`:null,e.style.height=t.h>1?`calc(${t.h} * var(--gs-cell-height))`:null),t.x>0?e.setAttribute("gs-x",String(t.x)):e.removeAttribute("gs-x"),t.y>0?e.setAttribute("gs-y",String(t.y)):e.removeAttribute("gs-y"),t.w>1?e.setAttribute("gs-w",String(t.w)):e.removeAttribute("gs-w"),t.h>1?e.setAttribute("gs-h",String(t.h)):e.removeAttribute("gs-h"),this}_writeAttr(e,t){if(!t)return this;this._writePosAttr(e,t);const i={noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id",sizeToContent:"gs-size-to-content"};for(const s in i)t[s]?e.setAttribute(i[s],String(t[s])):e.removeAttribute(i[s]);return this}_readAttr(e,t=!0){const s={};s.x=i.toNumber(e.getAttribute("gs-x")),s.y=i.toNumber(e.getAttribute("gs-y")),s.w=i.toNumber(e.getAttribute("gs-w")),s.h=i.toNumber(e.getAttribute("gs-h")),s.autoPosition=i.toBool(e.getAttribute("gs-auto-position")),s.noResize=i.toBool(e.getAttribute("gs-no-resize")),s.noMove=i.toBool(e.getAttribute("gs-no-move")),s.locked=i.toBool(e.getAttribute("gs-locked"));const o=e.getAttribute("gs-size-to-content");o&&(s.sizeToContent="true"===o||"false"===o?i.toBool(o):parseInt(o,10)),s.id=e.getAttribute("gs-id"),s.maxW=i.toNumber(e.getAttribute("gs-max-w")),s.minW=i.toNumber(e.getAttribute("gs-min-w")),s.maxH=i.toNumber(e.getAttribute("gs-max-h")),s.minH=i.toNumber(e.getAttribute("gs-min-h")),t&&(1===s.w&&e.removeAttribute("gs-w"),1===s.h&&e.removeAttribute("gs-h"),s.maxW&&e.removeAttribute("gs-max-w"),s.minW&&e.removeAttribute("gs-min-w"),s.maxH&&e.removeAttribute("gs-max-h"),s.minH&&e.removeAttribute("gs-min-h"));for(const e in s){if(!s.hasOwnProperty(e))return;s[e]||0===s[e]||"sizeToContent"===e||delete s[e]}return s}_setStaticClass(){const e=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...e),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...e),this.el.removeAttribute("gs-static")),this}onResize(e=this.el?.clientWidth){if(!e)return;if(this.prevWidth===e)return;this.prevWidth=e,this.batchUpdate();let t=!1;return this._autoColumn&&this.parentGridNode?this.opts.column!==this.parentGridNode.w&&(this.column(this.parentGridNode.w,this.opts.layout||"list"),t=!0):t=this.checkDynamicColumn(),this._isAutoCellHeight&&this.cellHeight(),this.engine.nodes.forEach((e=>{e.subGrid&&e.subGrid.onResize()})),this._skipInitialResize||this.resizeToContentCheck(t),delete this._skipInitialResize,this.batchUpdate(!1),this}resizeToContentCheck(e=!1,t=void 0){if(this.engine){if(e&&this.hasAnimationCSS())return setTimeout((()=>this.resizeToContentCheck(!1,t)),this.animationDelay);if(t)i.shouldSizeToContent(t)&&this.resizeToContentCBCheck(t.el);else if(this.engine.nodes.some((e=>i.shouldSizeToContent(e)))){const e=[...this.engine.nodes];this.batchUpdate(),e.forEach((e=>{i.shouldSizeToContent(e)&&this.resizeToContentCBCheck(e.el)})),this._ignoreLayoutsNodeChange=!0,this.batchUpdate(!1),this._ignoreLayoutsNodeChange=!1}this._gsEventHandler.resizecontent&&this._gsEventHandler.resizecontent(null,t?[t]:this.engine.nodes)}}_updateResizeEvent(e=!1){const t=!this.parentGridNode&&(this._isAutoCellHeight||this.opts.sizeToContent||this.opts.columnOpts||this.engine.nodes.find((e=>e.sizeToContent)));return e||!t||this.resizeObserver?!e&&t||!this.resizeObserver||(this.resizeObserver.disconnect(),delete this.resizeObserver,delete this._sizeThrottle):(this._sizeThrottle=i.throttle((()=>this.onResize()),this.opts.cellHeightThrottle),this.resizeObserver=new ResizeObserver((()=>this._sizeThrottle())),this.resizeObserver.observe(this.el),this._skipInitialResize=!0),this}static getElement(e=".grid-stack-item"){return i.getElement(e)}static getElements(e=".grid-stack-item"){return i.getElements(e)}static getGridElement(e){return x.getElement(e)}static getGridElements(e){return i.getElements(e)}_initMargin(){let e,t=0,s=[];"string"==typeof this.opts.margin&&(s=this.opts.margin.split(" ")),2===s.length?(this.opts.marginTop=this.opts.marginBottom=s[0],this.opts.marginLeft=this.opts.marginRight=s[1]):4===s.length?(this.opts.marginTop=s[0],this.opts.marginRight=s[1],this.opts.marginBottom=s[2],this.opts.marginLeft=s[3]):(e=i.parseHeight(this.opts.margin),this.opts.marginUnit=e.unit,t=this.opts.margin=e.h),["marginTop","marginRight","marginBottom","marginLeft"].forEach((s=>{void 0===this.opts[s]?this.opts[s]=t:(e=i.parseHeight(this.opts[s]),this.opts[s]=e.h,delete this.opts.margin)})),this.opts.marginUnit=e.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop);const o=this.el.style;return o.setProperty("--gs-item-margin-top",`${this.opts.marginTop}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-bottom",`${this.opts.marginBottom}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-right",`${this.opts.marginRight}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-left",`${this.opts.marginLeft}${this.opts.marginUnit}`),this}static getDD(){return E}static setupDragIn(e,t,s,o=document){void 0!==t?.pause&&(n.pauseDrag=t.pause),t={appendTo:"body",helper:"clone",...t||{}},("string"==typeof e?i.getElements(e,o):e).forEach(((e,i)=>{E.isDraggable(e)||E.dragIn(e,t),s?.[i]&&(e.gridstackNode=s[i])}))}movable(e,t){return this.opts.staticGrid||x.getElements(e).forEach((e=>{const i=e.gridstackNode;i&&(t?delete i.noMove:i.noMove=!0,this.prepareDragDrop(i.el))})),this}resizable(e,t){return this.opts.staticGrid||x.getElements(e).forEach((e=>{const i=e.gridstackNode;i&&(t?delete i.noResize:i.noResize=!0,this.prepareDragDrop(i.el))})),this}disable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!1,e),this.enableResize(!1,e),this._triggerEvent("disable"),this}enable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!0,e),this.enableResize(!0,e),this._triggerEvent("enable"),this}enableMove(e,t=!0){return this.opts.staticGrid||(e?delete this.opts.disableDrag:this.opts.disableDrag=!0,this.engine.nodes.forEach((i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableMove(e,t)}))),this}enableResize(e,t=!0){return this.opts.staticGrid||(e?delete this.opts.disableResize:this.opts.disableResize=!0,this.engine.nodes.forEach((i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableResize(e,t)}))),this}cancelDrag(){const e=this._placeholder?.gridstackNode;e&&(e._isExternal?(e._isAboutToRemove=!0,this.engine.removeNode(e)):e._isAboutToRemove&&x._itemRemoving(e.el,!1),this.engine.restoreInitial())}_removeDD(e){return E.draggable(e,"destroy").resizable(e,"destroy"),e.gridstackNode&&delete e.gridstackNode._initDD,delete e.ddElement,this}_setupAcceptWidget(){if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return E.droppable(this.el,"destroy"),this;let e,t;const s=(s,o,n)=>{const r=(n=n||o).gridstackNode;if(!r)return;if(!r.grid?.el){n.style.transform=`scale(${1/this.dragTransform.xScale},${1/this.dragTransform.yScale})`;const e=n.getBoundingClientRect();n.style.left=e.x+(this.dragTransform.xScale-1)*(s.clientX-e.x)/this.dragTransform.xScale+"px",n.style.top=e.y+(this.dragTransform.yScale-1)*(s.clientY-e.y)/this.dragTransform.yScale+"px",n.style.transformOrigin="0px 0px"}let{top:a,left:h}=n.getBoundingClientRect();const l=this.el.getBoundingClientRect();h-=l.left,a-=l.top;const d={position:{top:a*this.dragTransform.xScale,left:h*this.dragTransform.yScale}};if(r._temporaryRemoved){if(r.x=Math.max(0,Math.round(h/t)),r.y=Math.max(0,Math.round(a/e)),delete r.autoPosition,this.engine.nodeBoundFix(r),!this.engine.willItFit(r)){if(r.autoPosition=!0,!this.engine.willItFit(r))return void E.off(o,"drag");r._willFitPos&&(i.copyPos(r,r._willFitPos),delete r._willFitPos)}this._onStartMoving(n,s,d,r,t,e)}else this._dragOrResize(n,s,d,r,t,e)};return E.droppable(this.el,{accept:e=>{const t=e.gridstackNode||this._readAttr(e,!1);if(t?.grid===this)return!0;if(!this.opts.acceptWidgets)return!1;let i=!0;if("function"==typeof this.opts.acceptWidgets)i=this.opts.acceptWidgets(e);else{const t=!0===this.opts.acceptWidgets?".grid-stack-item":this.opts.acceptWidgets;i=e.matches(t)}if(i&&t&&this.opts.maxRow){const e={w:t.w,h:t.h,minW:t.minW,minH:t.minH};i=this.engine.willItFit(e)}return i}}).on(this.el,"dropover",((i,o,n)=>{let r=n?.gridstackNode||o.gridstackNode;if(r?.grid===this&&!r._temporaryRemoved)return!1;if(r?._sidebarOrig&&(r.w=r._sidebarOrig.w,r.h=r._sidebarOrig.h),r?.grid&&r.grid!==this&&!r._temporaryRemoved&&r.grid._leave(o,n),n=n||o,t=this.cellWidth(),e=this.getCellHeight(!0),!r){const e=n.getAttribute("data-gs-widget")||n.getAttribute("gridstacknode");if(e){try{r=JSON.parse(e)}catch(t){console.error("Gridstack dropover: Bad JSON format: ",e)}n.removeAttribute("data-gs-widget"),n.removeAttribute("gridstacknode")}r||(r=this._readAttr(n)),r._sidebarOrig={w:r.w,h:r.h}}r.grid||(r.el||(r={...r}),r._isExternal=!0,n.gridstackNode=r);const a=r.w||Math.round(n.offsetWidth/t)||1,h=r.h||Math.round(n.offsetHeight/e)||1;return r.grid&&r.grid!==this?(o._gridstackNodeOrig||(o._gridstackNodeOrig=r),o.gridstackNode=r={...r,w:a,h,grid:this},delete r.x,delete r.y,this.engine.cleanupNode(r).nodeBoundFix(r),r._initDD=r._isExternal=r._temporaryRemoved=!0):(r.w=a,r.h=h,r._temporaryRemoved=!0),x._itemRemoving(r.el,!1),E.on(o,"drag",s),s(i,o,n),!1})).on(this.el,"dropout",((e,t,i)=>{const s=i?.gridstackNode||t.gridstackNode;return!!s&&(s.grid&&s.grid!==this||(this._leave(t,i),this._isTemp&&this.removeAsSubGrid(s)),!1)})).on(this.el,"drop",((e,t,s)=>{const o=s?.gridstackNode||t.gridstackNode;if(o?.grid===this&&!o._isExternal)return!1;const n=!!this.placeholder.parentElement,r=t!==s;this.placeholder.remove(),delete this.placeholder.gridstackNode,n&&this.opts.animate&&(this.setAnimation(!1),this.setAnimation(!0,!0));const a=t._gridstackNodeOrig;if(delete t._gridstackNodeOrig,n&&a?.grid&&a.grid!==this){const e=a.grid;e.engine.removeNodeFromLayoutCache(a),e.engine.removedNodes.push(a),e._triggerRemoveEvent()._triggerChangeEvent(),e.parentGridNode&&!e.engine.nodes.length&&e.opts.subGridDynamic&&e.removeAsSubGrid()}if(!o)return!1;if(n&&(this.engine.cleanupNode(o),o.grid=this),delete o.grid?._isTemp,E.off(t,"drag"),s!==t?(s.remove(),t=s):t.remove(),this._removeDD(t),!n)return!1;const h=o.subGrid?.el?.gridstack;return i.copyPos(o,this._readAttr(this.placeholder)),i.removePositioningStyles(t),r&&(o.content||o.subGridOpts||x.addRemoveCB)?(delete o.el,t=this.addWidget(o)):(this._prepareElement(t,!0,o),this.el.appendChild(t),this.resizeToContentCheck(!1,o),h&&(h.parentGridNode=o),this._updateContainerHeight()),this.engine.addedNodes.push(o),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped({...e,type:"dropped"},a&&a.grid?a:void 0,o),!1})),this}static _itemRemoving(e,t){if(!e)return;const i=e?e.gridstackNode:void 0;i?.grid&&!e.classList.contains(i.grid.opts.removableOptions.decline)&&(t?i._isAboutToRemove=!0:delete i._isAboutToRemove,t?e.classList.add("grid-stack-item-removing"):e.classList.remove("grid-stack-item-removing"))}_setupRemoveDrop(){if("string"!=typeof this.opts.removable)return this;const e=document.querySelector(this.opts.removable);return e?(this.opts.staticGrid||E.isDroppable(e)||E.droppable(e,this.opts.removableOptions).on(e,"dropover",((e,t)=>x._itemRemoving(t,!0))).on(e,"dropout",((e,t)=>x._itemRemoving(t,!1))),this):this}prepareDragDrop(e,t=!1){const s=e?.gridstackNode;if(!s)return;const o=s.noMove||this.opts.disableDrag,n=s.noResize||this.opts.disableResize,r=this.opts.staticGrid||o&&n;if((t||r)&&(s._initDD&&(this._removeDD(e),delete s._initDD),r&&e.classList.add("ui-draggable-disabled","ui-resizable-disabled"),!t))return this;if(!s._initDD){let t,o;const n=(i,n)=>{this.triggerEvent(i,i.target),t=this.cellWidth(),o=this.getCellHeight(!0),this._onStartMoving(e,i,n,s,t,o)},r=(i,n)=>{this._dragOrResize(e,i,n,s,t,o)},a=t=>{this.placeholder.remove(),delete this.placeholder.gridstackNode,delete s._moving,delete s._resizing,delete s._event,delete s._lastTried;const o=s.w!==s._orig.w,n=t.target;if(n.gridstackNode&&n.gridstackNode.grid===this){if(s.el=n,s._isAboutToRemove){const i=e.gridstackNode.grid;i._gsEventHandler[t.type]&&i._gsEventHandler[t.type](t,n),i.engine.nodes.push(s),i.removeWidget(e,!0,!0)}else i.removePositioningStyles(n),s._temporaryRemoved?(this._writePosAttr(n,s),this.engine.addNode(s)):this._writePosAttr(n,s),this.triggerEvent(t,n);this._extraDragRow=0,this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate(),"resizestop"===t.type&&(Number.isInteger(s.sizeToContent)&&(s.sizeToContent=s.h),this.resizeToContentCheck(o,s))}};E.draggable(e,{start:n,stop:a,drag:r}).resizable(e,{start:n,stop:a,resize:r}),s._initDD=!0}return E.draggable(e,o?"disable":"enable").resizable(e,n?"disable":"enable"),this}_onStartMoving(e,t,s,o,n,r){if(this.engine.cleanNodes().beginUpdate(o),this._writePosAttr(this.placeholder,o),this.el.appendChild(this.placeholder),this.placeholder.gridstackNode=o,o.grid?.el)this.dragTransform=i.getValuesFromTransformedElement(e);else if(this.placeholder&&this.placeholder.closest(".grid-stack")){const e=this.placeholder.closest(".grid-stack");this.dragTransform=i.getValuesFromTransformedElement(e)}else this.dragTransform={xScale:1,xOffset:0,yScale:1,yOffset:0};if(o.el=this.placeholder,o._lastUiPosition=s.position,o._prevYPix=s.position.top,o._moving="dragstart"===t.type,o._resizing="resizestart"===t.type,delete o._lastTried,"dropover"===t.type&&o._temporaryRemoved&&(this.engine.addNode(o),o._moving=!0),this.engine.cacheRects(n,r,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),"resizestart"===t.type){const t=this.getColumn()-o.x,i=(this.opts.maxRow||Number.MAX_SAFE_INTEGER)-o.y;E.resizable(e,"option","minWidth",n*Math.min(o.minW||1,t)).resizable(e,"option","minHeight",r*Math.min(o.minH||1,i)).resizable(e,"option","maxWidth",n*Math.min(o.maxW||Number.MAX_SAFE_INTEGER,t)).resizable(e,"option","maxWidthMoveLeft",n*Math.min(o.maxW||Number.MAX_SAFE_INTEGER,o.x+o.w)).resizable(e,"option","maxHeight",r*Math.min(o.maxH||Number.MAX_SAFE_INTEGER,i)).resizable(e,"option","maxHeightMoveUp",r*Math.min(o.maxH||Number.MAX_SAFE_INTEGER,o.y+o.h))}}_dragOrResize(e,t,s,o,n,r){const a={...o._orig};let h,l=this.opts.marginLeft,d=this.opts.marginRight,c=this.opts.marginTop,g=this.opts.marginBottom;const u=Math.round(.1*r),p=Math.round(.1*n);if(l=Math.min(l,p),d=Math.min(d,p),c=Math.min(c,u),g=Math.min(g,u),"drag"===t.type){if(o._temporaryRemoved)return;const t=s.position.top-o._prevYPix;o._prevYPix=s.position.top,!1!==this.opts.draggable.scroll&&i.updateScrollPosition(e,s.position,t);const h=s.position.left+(s.position.left>o._lastUiPosition.left?-d:l),u=s.position.top+(s.position.top>o._lastUiPosition.top?-g:c);a.x=Math.round(h/n),a.y=Math.round(u/r);const p=this._extraDragRow;if(this.engine.collide(o,a)){const e=this.getRow();let t=Math.max(0,a.y+o.h-e);this.opts.maxRow&&e+t>this.opts.maxRow&&(t=Math.max(0,this.opts.maxRow-e)),this._extraDragRow=t}else this._extraDragRow=0;if(this._extraDragRow!==p&&this._updateContainerHeight(),o.x===a.x&&o.y===a.y)return}else if("resize"===t.type){if(a.x<0)return;if(i.updateScrollResize(t,e,r),a.w=Math.round((s.size.width-l)/n),a.h=Math.round((s.size.height-c)/r),o.w===a.w&&o.h===a.h)return;if(o._lastTried&&o._lastTried.w===a.w&&o._lastTried.h===a.h)return;const d=s.position.left+l,g=s.position.top+c;a.x=Math.round(d/n),a.y=Math.round(g/r),h=!0}o._event=t,o._lastTried=a;const m={x:s.position.left+l,y:s.position.top+c,w:(s.size?s.size.width:o.w*n)-l-d,h:(s.size?s.size.height:o.h*r)-c-g};if(this.engine.moveNodeCheck(o,{...a,cellWidth:n,cellHeight:r,rect:m,resizing:h})){o._lastUiPosition=s.position,this.engine.cacheRects(n,r,c,d,g,l),delete o._skipDown,h&&o.subGrid&&o.subGrid.onResize(),this._extraDragRow=0,this._updateContainerHeight();const e=t.target;o._sidebarOrig||this._writePosAttr(e,o),this.triggerEvent(t,e)}}triggerEvent(e,t){let i=this;for(;i.parentGridNode;)i=i.parentGridNode.grid;i._gsEventHandler[e.type]&&i._gsEventHandler[e.type](e,t)}_leave(e,t){const i=(t=t||e).gridstackNode;if(!i)return;if(t.style.transform=t.style.transformOrigin=null,E.off(e,"drag"),i._temporaryRemoved)return;i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&t?t:e;const s=i._sidebarOrig;i._isExternal&&this.engine.cleanupNode(i),i._sidebarOrig=s,!0===this.opts.removable&&x._itemRemoving(e,!0),e._gridstackNodeOrig?(e.gridstackNode=e._gridstackNodeOrig,delete e._gridstackNodeOrig):i._isExternal&&this.engine.restoreInitial()}commit(){return this.batchUpdate(!1).prototype,this}}return x.renderCB=(e,t)=>{e&&t?.content&&(e.textContent=t.content)},x.resizeToContentParent=".grid-stack-item-content",x.Utils=i,x.Engine=s,x.GDRev="12.3.3",t.GridStack})())); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.GridStack=t():e.GridStack=t()}(self,(()=>(()=>{"use strict";var e={d:(t,i)=>{for(var s in i)e.o(i,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};e.d(t,{GridStack:()=>x});class i{static getElements(e,t=document){if("string"==typeof e){const i="getElementById"in t?t:void 0;if(i&&!isNaN(+e[0])){const t=i.getElementById(e);return t?[t]:[]}let s=t.querySelectorAll(e);if(!s.length&&"."!==e[0]&&"#"!==e[0]&&(s=t.querySelectorAll("."+e),s.length||(s=t.querySelectorAll("#"+e)),!s.length)){const i=t.querySelector(`[gs-id="${e}"]`);return i?[i]:[]}return Array.from(s)}return[e]}static getElement(e,t=document){if("string"==typeof e){const i="getElementById"in t?t:void 0;if(!e.length)return null;if(i&&"#"===e[0])return i.getElementById(e.substring(1));if("#"===e[0]||"."===e[0]||"["===e[0])return t.querySelector(e);if(i&&!isNaN(+e[0]))return i.getElementById(e);let s=t.querySelector(e);return i&&!s&&(s=i.getElementById(e)),s||(s=t.querySelector("."+e)),s}return e}static lazyLoad(e){return e.lazyLoad||e.grid?.opts?.lazyLoad&&!1!==e.lazyLoad}static createDiv(e,t){const i=document.createElement("div");return e.forEach((e=>{e&&i.classList.add(e)})),t?.appendChild(i),i}static shouldSizeToContent(e,t=!1){return e?.grid&&(t?!0===e.sizeToContent||!0===e.grid.opts.sizeToContent&&void 0===e.sizeToContent:!!e.sizeToContent||e.grid.opts.sizeToContent&&!1!==e.sizeToContent)}static isIntercepted(e,t){return!(e.y>=t.y+t.h||e.y+e.h<=t.y||e.x+e.w<=t.x||e.x>=t.x+t.w)}static isTouching(e,t){return i.isIntercepted(e,{x:t.x-.5,y:t.y-.5,w:t.w+1,h:t.h+1})}static areaIntercept(e,t){const i=e.x>t.x?e.x:t.x,s=e.x+e.wt.y?e.y:t.y,n=e.y+e.h{const o=t*((e.y??i)-(s.y??i));return 0===o?t*((e.x??i)-(s.x??i)):o}))}static find(e,t){return t?e.find((e=>e.id===t)):void 0}static toBool(e){return"boolean"==typeof e?e:"string"==typeof e?!(""===(e=e.toLowerCase())||"no"===e||"false"===e||"0"===e):Boolean(e)}static toNumber(e){return null===e||0===e.length?void 0:Number(e)}static parseHeight(e){let t,i="px";if("string"==typeof e)if("auto"===e||""===e)t=0;else{const s=e.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%|cm|mm)?$/);if(!s)throw new Error(`Invalid height val = ${e}`);i=s[2]||"px",t=parseFloat(s[1])}else t=e;return{h:t,unit:i}}static defaults(e,...t){return t.forEach((t=>{for(const s in t){if(!t.hasOwnProperty(s))return;null===e[s]||void 0===e[s]?e[s]=t[s]:"object"==typeof t[s]&&"object"==typeof e[s]&&i.defaults(e[s],t[s])}})),e}static same(e,t){if("object"!=typeof e)return e==t;if(typeof e!=typeof t)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const i in e)if(e[i]!==t[i])return!1;return!0}static copyPos(e,t,i=!1){return void 0!==t.x&&(e.x=t.x),void 0!==t.y&&(e.y=t.y),void 0!==t.w&&(e.w=t.w),void 0!==t.h&&(e.h=t.h),i&&(t.minW&&(e.minW=t.minW),t.minH&&(e.minH=t.minH),t.maxW&&(e.maxW=t.maxW),t.maxH&&(e.maxH=t.maxH)),e}static samePos(e,t){return e&&t&&e.x===t.x&&e.y===t.y&&(e.w||1)===(t.w||1)&&(e.h||1)===(t.h||1)}static sanitizeMinMax(e){e.minW||delete e.minW,e.minH||delete e.minH,e.maxW||delete e.maxW,e.maxH||delete e.maxH}static removeInternalAndSame(e,t){if("object"==typeof e&&"object"==typeof t&&!Array.isArray(e)&&!Array.isArray(t))for(let s in e){const o=e[s],n=t[s];"_"===s[0]||o===n?delete e[s]:o&&"object"==typeof o&&void 0!==n&&(i.removeInternalAndSame(o,n),Object.keys(o).length||delete e[s])}}static removeInternalForSave(e,t=!0){for(let t in e)"_"!==t[0]&&null!==e[t]&&void 0!==e[t]||delete e[t];delete e.grid,t&&delete e.el,e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,e.locked||delete e.locked,1!==e.w&&e.w!==e.minW||delete e.w,1!==e.h&&e.h!==e.minH||delete e.h}static throttle(e,t){let i=!1;return(...s)=>{i||(i=!0,setTimeout((()=>{e(...s),i=!1}),t))}}static removePositioningStyles(e){const t=e.style;t.position&&t.removeProperty("position"),t.left&&t.removeProperty("left"),t.top&&t.removeProperty("top"),t.width&&t.removeProperty("width"),t.height&&t.removeProperty("height")}static getScrollElement(e){if(!e)return document.scrollingElement||document.documentElement;const t=getComputedStyle(e);return/(auto|scroll)/.test(t.overflow+t.overflowY)?e:i.getScrollElement(e.parentElement)}static updateScrollPosition(e,t,s){const o=i.getScrollElement(e);if(!o)return;const n=e.getBoundingClientRect(),r=o.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,h=n.bottom-Math.min(r.bottom,a),l=n.top-Math.max(r.top,0),d=o.scrollTop;l<0&&s<0?e.offsetHeight>r.height?o.scrollTop+=s:o.scrollTop+=Math.abs(l)>Math.abs(s)?s:l:h>0&&s>0&&(e.offsetHeight>r.height?o.scrollTop+=s:o.scrollTop+=h>s?s:h),t.top+=o.scrollTop-d}static updateScrollResize(e,t,s){const o=i.getScrollElement(t),n=o.clientHeight,r=o===i.getScrollElement()?0:o.getBoundingClientRect().top,a=e.clientY-r,h=a>n-s;ae===o))&&(s[o]=i.cloneDeep(e[o]));return s}static cloneNode(e){const t=e.cloneNode(!0);return t.removeAttribute("id"),t}static appendTo(e,t){let s;s="string"==typeof t?i.getElement(t):t,s&&s.appendChild(e)}static addElStyles(e,t){if(t instanceof Object)for(const i in t)t.hasOwnProperty(i)&&(Array.isArray(t[i])?t[i].forEach((t=>{e.style[i]=t})):e.style[i]=t[i])}static initEvent(e,t){const i={type:t.type},s={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:t.target?t.target:e.target};return["altKey","ctrlKey","metaKey","shiftKey"].forEach((t=>i[t]=e[t])),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach((t=>i[t]=e[t])),{...i,...s}}static simulateMouseEvent(e,t,i){const s=e,o=new MouseEvent(t,{bubbles:!0,composed:!0,cancelable:!0,view:window,detail:1,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,ctrlKey:s.ctrlKey??!1,altKey:s.altKey??!1,shiftKey:s.shiftKey??!1,metaKey:s.metaKey??!1,button:0,relatedTarget:e.target});(i||e.target).dispatchEvent(o)}static getValuesFromTransformedElement(e){const t=document.createElement("div");i.addElStyles(t,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),e.appendChild(t);const s=t.getBoundingClientRect();return e.removeChild(t),t.remove(),{xScale:1/s.width,yScale:1/s.height,xOffset:s.left,yOffset:s.top}}static swap(e,t,i){if(!e)return;const s=e[t];e[t]=e[i],e[i]=s}static canBeRotated(e){return!(!e||e.w===e.h||e.locked||e.noResize||e.grid?.opts.disableResize||e.minW&&e.minW===e.maxW||e.minH&&e.minH===e.maxH)}}class s{constructor(e={}){this.addedNodes=[],this.removedNodes=[],this.defaultColumn=12,this.column=e.column||this.defaultColumn,this.column>this.defaultColumn&&(this.defaultColumn=this.column),this.maxRow=e.maxRow,this._float=e.float,this.nodes=e.nodes||[],this.onChange=e.onChange}batchUpdate(e=!0,t=!0){return!!this.batchMode===e||(this.batchMode=e,e?(this._prevFloat=this._float,this._float=!0,this.cleanNodes(),this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,t&&this._packNodes(),this._notify())),this}_useEntireRowArea(e,t){return(!this.float||this.batchMode&&!this._prevFloat)&&!this._hasLocked&&(!e._moving||e._skipDown||t.y<=e.y)}_fixCollisions(e,t=e,s,o={}){if(this.sortNodes(-1),!(s=s||this.collide(e,t)))return!1;if(e._moving&&!o.nested&&!this.float&&this.swap(e,s))return!0;let n=t;!this._loading&&this._useEntireRowArea(e,t)&&(n={x:0,w:this.column,y:t.y,h:t.h},s=this.collide(e,n,o.skip));let r=!1;const a={nested:!0,pack:!1};let h=0;for(;s=s||this.collide(e,n,o.skip);){if(h++>2*this.nodes.length)throw new Error("Infinite collide check");let n;if(s.locked||this._loading||e._moving&&!e._skipDown&&t.y>e.y&&!this.float&&(!this.collide(s,{...s,y:e.y},e)||!this.collide(s,{...s,y:t.y-s.h},e))){e._skipDown=e._skipDown||t.y>e.y;const h={...t,y:s.y+s.h,...a};n=!(!this._loading||!i.samePos(e,h))||this.moveNode(e,h),(s.locked||this._loading)&&n?i.copyPos(t,e):!s.locked&&n&&o.pack&&(this._packNodes(),t.y=s.y+s.h,i.copyPos(e,t)),r=r||n}else n=this.moveNode(s,{...s,y:t.y+t.h,skip:e,...a});if(!n)return r;s=void 0}return r}collide(e,t=e,s){const o=e._id,n=s?._id;return this.nodes.find((e=>e._id!==o&&e._id!==n&&i.isIntercepted(e,t)))}collideAll(e,t=e,s){const o=e._id,n=s?._id;return this.nodes.filter((e=>e._id!==o&&e._id!==n&&i.isIntercepted(e,t)))}directionCollideCoverage(e,t,i){if(!t.rect||!e._rect)return;const s=e._rect,o={...t.rect};let n;o.y>s.y?(o.h+=o.y-s.y,o.y=s.y):o.h+=s.y-o.y,o.x>s.x?(o.w+=o.x-s.x,o.x=s.x):o.w+=s.x-o.x;let r=.5;for(let e of i){if(e.locked||!e._rect)break;const t=e._rect;let i=Number.MAX_VALUE,a=Number.MAX_VALUE;s.yt.y+t.h&&(i=(t.y+t.h-o.y)/t.h),s.xt.x+t.w&&(a=(t.x+t.w-o.x)/t.w);const h=Math.min(a,i);h>r&&(r=h,n=e)}return t.collide=n,n}cacheRects(e,t,i,s,o,n){return this.nodes.forEach((r=>r._rect={y:r.y*t+i,x:r.x*e+n,w:r.w*e-n-s,h:r.h*t-i-o})),this}swap(e,t){if(!t||t.locked||!e||e.locked)return!1;function s(){const i=t.x,s=t.y;return t.x=e.x,t.y=e.y,e.h!=t.h?(e.x=i,e.y=t.y+t.h):e.w!=t.w?(e.x=t.x+t.w,e.y=s):(e.x=i,e.y=s),e._dirty=t._dirty=!0,!0}let o;if(e.w===t.w&&e.h===t.h&&(e.x===t.x||e.y===t.y)&&(o=i.isTouching(e,t)))return s();if(!1!==o){if(e.w===t.w&&e.x===t.x&&(o||(o=i.isTouching(e,t)))){if(t.y{let o;t.locked||(t.autoPosition=!0,"list"===e&&i&&(o=s[i-1])),this.addNode(t,!1,o)})),s||delete this._inColumnResize,i||this.batchUpdate(!1),this}set float(e){this._float!==e&&(this._float=e||!1,e||this._packNodes()._notify())}get float(){return this._float||!1}sortNodes(e=1){return this.nodes=i.sort(this.nodes,e),this}_packNodes(){return this.batchMode||(this.sortNodes(),this.float?this.nodes.forEach((e=>{if(e._updating||void 0===e._orig||e.y===e._orig.y)return;let t=e.y;for(;t>e._orig.y;)--t,this.collide(e,{x:e.x,y:t,w:e.w,h:e.h})||(e._dirty=!0,e.y=t)})):this.nodes.forEach(((e,t)=>{if(!e.locked)for(;e.y>0;){const i=0===t?0:e.y-1;if(0!==t&&this.collide(e,{x:e.x,y:i,w:e.w,h:e.h}))break;e._dirty=e.y!==i,e.y=i}}))),this}prepareNode(e,t){e._id=e._id??s._idSeq++;const o=e.id;if(o){let t=1;for(;this.nodes.find((t=>t.id===e.id&&t!==e));)e.id=o+"_"+t++}void 0!==e.x&&void 0!==e.y&&null!==e.x&&null!==e.y||(e.autoPosition=!0);const n={x:0,y:0,w:1,h:1};return i.defaults(e,n),e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,i.sanitizeMinMax(e),"string"==typeof e.x&&(e.x=Number(e.x)),"string"==typeof e.y&&(e.y=Number(e.y)),"string"==typeof e.w&&(e.w=Number(e.w)),"string"==typeof e.h&&(e.h=Number(e.h)),isNaN(e.x)&&(e.x=n.x,e.autoPosition=!0),isNaN(e.y)&&(e.y=n.y,e.autoPosition=!0),isNaN(e.w)&&(e.w=n.w),isNaN(e.h)&&(e.h=n.h),this.nodeBoundFix(e,t),e}nodeBoundFix(e,t){const s=e._orig||i.copyPos({},e);if(e.maxW&&(e.w=Math.min(e.w||1,e.maxW)),e.maxH&&(e.h=Math.min(e.h||1,e.maxH)),e.minW&&(e.w=Math.max(e.w||1,e.minW)),e.minH&&(e.h=Math.max(e.h||1,e.minH)),(e.x||0)+(e.w||1)>this.column&&this.columnthis.column?e.w=this.column:e.w<1&&(e.w=1),this.maxRow&&e.h>this.maxRow?e.h=this.maxRow:e.h<1&&(e.h=1),e.x<0&&(e.x=0),e.y<0&&(e.y=0),e.x+e.w>this.column&&(t?e.w=this.column-e.x:e.x=this.column-e.w),this.maxRow&&e.y+e.h>this.maxRow&&(t?e.h=this.maxRow-e.y:e.y=this.maxRow-e.h),i.samePos(e,s)||(e._dirty=!0),this}getDirtyNodes(e){return e?this.nodes.filter((e=>e._dirty&&!i.samePos(e,e._orig))):this.nodes.filter((e=>e._dirty))}_notify(e){if(this.batchMode||!this.onChange)return this;const t=(e||[]).concat(this.getDirtyNodes());return this.onChange(t),this}cleanNodes(){return this.batchMode||this.nodes.forEach((e=>{delete e._dirty,delete e._lastTried})),this}saveInitial(){return this.nodes.forEach((e=>{e._orig=i.copyPos({},e),delete e._dirty})),this._hasLocked=this.nodes.some((e=>e.locked)),this}restoreInitial(){return this.nodes.forEach((e=>{e._orig&&!i.samePos(e,e._orig)&&(i.copyPos(e,e._orig),e._dirty=!0)})),this._notify(),this}findEmptyPosition(e,t=this.nodes,s=this.column,o){let n=!1;for(let r=o?o.y*s+(o.x+o.w):0;!n;++r){const o=r%s,a=Math.floor(r/s);if(o+e.w>s)continue;const h={x:o,y:a,w:e.w,h:e.h};t.find((e=>i.isIntercepted(h,e)))||(e.x===o&&e.y===a||(e._dirty=!0),e.x=o,e.y=a,delete e.autoPosition,n=!0)}return n}addNode(e,t=!1,i){const s=this.nodes.find((t=>t._id===e._id));if(s)return s;let o;return this._inColumnResize?this.nodeBoundFix(e):this.prepareNode(e),delete e._temporaryRemoved,delete e._removeDOM,e.autoPosition&&this.findEmptyPosition(e,this.nodes,this.column,i)&&(delete e.autoPosition,o=!0),this.nodes.push(e),t&&this.addedNodes.push(e),o||this._fixCollisions(e),this.batchMode||this._packNodes()._notify(),e}removeNode(e,t=!0,i=!1){return this.nodes.find((t=>t._id===e._id))?(i&&this.removedNodes.push(e),t&&(e._removeDOM=!0),this.nodes=this.nodes.filter((t=>t._id!==e._id)),e._isAboutToRemove||this._packNodes(),this._notify([e]),this):this}removeAll(e=!0,t=!0){if(delete this._layouts,!this.nodes.length)return this;e&&this.nodes.forEach((e=>e._removeDOM=!0));const i=this.nodes;return this.removedNodes=t?i:[],this.nodes=[],this._notify(i)}moveNodeCheck(e,t){if(!this.changedPosConstrain(e,t))return!1;if(t.pack=!0,!this.maxRow)return this.moveNode(e,t);let o;const n=new s({column:this.column,float:this.float,nodes:this.nodes.map((t=>t._id===e._id?(o={...t},o):{...t}))});if(!o)return!1;const r=n.moveNode(o,t)&&n.getRow()<=Math.max(this.getRow(),this.maxRow);if(!r&&!t.resizing&&t.collide){const i=t.collide.el.gridstackNode;if(this.swap(e,i))return this._notify(),!0}return!!r&&(n.nodes.filter((e=>e._dirty)).forEach((e=>{const t=this.nodes.find((t=>t._id===e._id));t&&(i.copyPos(t,e),t._dirty=!0)})),this._notify(),!0)}willItFit(e){if(delete e._willFitPos,!this.maxRow)return!0;const t=new s({column:this.column,float:this.float,nodes:this.nodes.map((e=>({...e})))}),o={...e};return this.cleanupNode(o),delete o.el,delete o._id,delete o.content,delete o.grid,t.addNode(o),t.getRow()<=this.maxRow&&(e._willFitPos=i.copyPos({},o),!0)}changedPosConstrain(e,t){return t.w=t.w||e.w,t.h=t.h||e.h,e.x!==t.x||e.y!==t.y||(e.maxW&&(t.w=Math.min(t.w,e.maxW)),e.maxH&&(t.h=Math.min(t.h,e.maxH)),e.minW&&(t.w=Math.max(t.w,e.minW)),e.minH&&(t.h=Math.max(t.h,e.minH)),e.w!==t.w||e.h!==t.h)}moveNode(e,t){if(!e||!t)return!1;let s;void 0!==t.pack||this.batchMode||(s=t.pack=!0),"number"!=typeof t.x&&(t.x=e.x),"number"!=typeof t.y&&(t.y=e.y),"number"!=typeof t.w&&(t.w=e.w),"number"!=typeof t.h&&(t.h=e.h);const o=e.w!==t.w||e.h!==t.h,n=i.copyPos({},e,!0);if(i.copyPos(n,t),this.nodeBoundFix(n,o),i.copyPos(t,n),!t.forceCollide&&i.samePos(e,t))return!1;const r=i.copyPos({},e),a=this.collideAll(e,n,t.skip);let h=!0;if(a.length){const o=e._moving&&!t.nested;let r=o?this.directionCollideCoverage(e,t,a):a[0];if(o&&r&&e.grid?.opts?.subGridDynamic&&!e.grid._isTemp){const s=i.areaIntercept(t.rect,r._rect),o=i.area(t.rect),n=i.area(r._rect);s/(o.8&&(r.grid.makeSubGrid(r.el,void 0,e),r=void 0)}r?h=!this._fixCollisions(e,n,r,t):(h=!1,s&&delete t.pack)}return h&&!i.samePos(e,n)&&(e._dirty=!0,i.copyPos(e,n)),t.pack&&this._packNodes()._notify(),!i.samePos(e,r)}getRow(){return this.nodes.reduce(((e,t)=>Math.max(e,t.y+t.h)),0)}beginUpdate(e){return e._updating||(e._updating=!0,delete e._skipDown,this.batchMode||this.saveInitial()),this}endUpdate(){const e=this.nodes.find((e=>e._updating));return e&&(delete e._updating,delete e._skipDown),this}save(e=!0,t,s){const o=this._layouts?.length||0;let n;o&&(s?s!==this.column&&(n=this._layouts[s]):this.column!==o-1&&(n=this._layouts[o-1]));const r=[];return this.sortNodes(),this.nodes.forEach((s=>{const o=n?.find((e=>e._id===s._id)),a={...s,...o||{}};i.removeInternalForSave(a,!e),t&&t(s,a),r.push(a)})),r}layoutsNodesChange(e){return!this._layouts||this._inColumnResize||this._layouts.forEach(((t,i)=>{if(!t||i===this.column)return this;if(i{if(!e._orig)return;const i=t.find((t=>t._id===e._id));i&&(i.y>=0&&e.y!==e._orig.y&&(i.y+=e.y-e._orig.y,i.y<0&&(i.y=0)),e.x!==e._orig.x&&(i.x=Math.round(e.x*s),i.x<0&&(i.x=0)),e.w!==e._orig.w&&(i.w=Math.round(e.w*s),i.w<1&&(i.w=1)))}))}})),this}columnChanged(e,t,s="moveScale"){if(!this.nodes.length||!t||e===t)return this;const o="compact"===s||"list"===s;o&&this.sortNodes(1),te&&this._layouts){const i=this._layouts[t]||[],s=this._layouts.length-1;!i.length&&e!==s&&this._layouts[s]?.length&&(e=s,this._layouts[s].forEach((e=>{const t=r.find((t=>t._id===e._id));t&&(o||e.autoPosition||(t.x=e.x??t.x,t.y=e.y??t.y),t.w=e.w??t.w,null!=e.x&&void 0!==e.y||(t.autoPosition=!0))}))),i.forEach((e=>{const t=r.findIndex((t=>t._id===e._id));if(-1!==t){const i=r[t];if(o)return void(i.w=e.w);(e.autoPosition||isNaN(e.x)||isNaN(e.y))&&this.findEmptyPosition(e,n),e.autoPosition||(i.x=e.x??i.x,i.y=e.y??i.y,i.w=e.w??i.w,n.push(i)),r.splice(t,1)}}))}if(o)this.compact(s,!1);else{if(r.length)if("function"==typeof s)s(t,e,n,r);else{const i=o||"none"===s?1:t/e,a="move"===s||"moveScale"===s,h="scale"===s||"moveScale"===s;r.forEach((s=>{s.x=1===t?0:a?Math.round(s.x*i):Math.min(s.x,t-1),s.w=1===t||1===e?1:h?Math.round(s.w*i)||1:Math.min(s.w,t),n.push(s)})),r=[]}n=i.sort(n,-1),this._inColumnResize=!0,this.nodes=[],n.forEach((e=>{this.addNode(e,!1),delete e._orig}))}return this.nodes.forEach((e=>delete e._orig)),this.batchUpdate(!1,!o),delete this._inColumnResize,this}cacheLayout(e,t,i=!1){const o=[];return e.forEach(((e,t)=>{if(void 0===e._id){const t=e.id?this.nodes.find((t=>t.id===e.id)):void 0;e._id=t?._id??s._idSeq++}o[t]={x:e.x,y:e.y,w:e.w,_id:e._id}})),this._layouts=i?[]:this._layouts||[],this._layouts[t]=o,this}cacheOneLayout(e,t){e._id=e._id??s._idSeq++;const i={x:e.x,y:e.y,w:e.w,_id:e._id};(e.autoPosition||void 0===e.x)&&(delete i.x,delete i.y,e.autoPosition&&(i.autoPosition=!0)),this._layouts=this._layouts||[],this._layouts[t]=this._layouts[t]||[];const o=this.findCacheLayout(e,t);return-1===o?this._layouts[t].push(i):this._layouts[t][o]=i,this}findCacheLayout(e,t){return this._layouts?.[t]?.findIndex((t=>t._id===e._id))??-1}removeNodeFromLayoutCache(e){if(this._layouts)for(let t=0;t0||navigator.msMaxTouchPoints>0);class a{}function h(e,t){e.touches.length>1||(e.cancelable&&e.preventDefault(),i.simulateMouseEvent(e.changedTouches[0],t))}function l(e,t){e.cancelable&&e.preventDefault(),i.simulateMouseEvent(e,t)}function d(e){a.touchHandled||(a.touchHandled=!0,h(e,"mousedown"))}function c(e){a.touchHandled&&h(e,"mousemove")}function g(e){if(!a.touchHandled)return;a.pointerLeaveTimeout&&(window.clearTimeout(a.pointerLeaveTimeout),delete a.pointerLeaveTimeout);const t=!!n.dragElement;h(e,"mouseup"),t||h(e,"click"),a.touchHandled=!1}function u(e){"mouse"!==e.pointerType&&e.target.releasePointerCapture(e.pointerId)}function p(e){n.dragElement&&"mouse"!==e.pointerType&&l(e,"mouseenter")}function m(e){n.dragElement&&"mouse"!==e.pointerType&&(a.pointerLeaveTimeout=window.setTimeout((()=>{delete a.pointerLeaveTimeout,l(e,"mouseleave")}),10))}class f{constructor(e,t,i){this.host=e,this.dir=t,this.option=i,this.moving=!1,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this._init()}_init(){if(this.option.element)try{this.el=this.option.element instanceof HTMLElement?this.option.element:this.host.querySelector(this.option.element)}catch(e){this.option.element=void 0,console.error("Query for resizeable handle failed, falling back",e)}return this.el||(this.el=document.createElement("div"),this.host.appendChild(this.el)),this.el.classList.add("ui-resizable-handle"),this.el.classList.add(`${f.prefix}${this.dir}`),this.el.style.zIndex="100",this.el.style.userSelect="none",this.el.addEventListener("mousedown",this._mouseDown),r&&(this.el.addEventListener("touchstart",d),this.el.addEventListener("pointerdown",u)),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),r&&(this.el.removeEventListener("touchstart",d),this.el.removeEventListener("pointerdown",u)),this.option.element||this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(e){this.mouseDownEvent=e,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),r&&(this.el.addEventListener("touchmove",c),this.el.addEventListener("touchend",g)),e.stopPropagation(),e.preventDefault()}_mouseMove(e){const t=this.mouseDownEvent;this.moving?this._triggerEvent("move",e):Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>2&&(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent),this._triggerEvent("move",e),document.addEventListener("keydown",this._keyEvent)),e.stopPropagation()}_mouseUp(e){this.moving&&(this._triggerEvent("stop",e),document.removeEventListener("keydown",this._keyEvent)),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),r&&(this.el.removeEventListener("touchmove",c),this.el.removeEventListener("touchend",g)),delete this.moving,delete this.mouseDownEvent,e.stopPropagation(),e.preventDefault()}_keyEvent(e){"Escape"===e.key&&(this.host.gridstackNode?.grid?.engine.restoreInitial(),this._mouseUp(this.mouseDownEvent))}_triggerEvent(e,t){return this.option[e]&&this.option[e](t),this}}f.prefix="ui-resizable-";class v{constructor(){this._eventRegister={}}get disabled(){return this._disabled}on(e,t){this._eventRegister[e]=t}off(e){delete this._eventRegister[e]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(e,t){if(!this.disabled&&this._eventRegister&&this._eventRegister[e])return this._eventRegister[e](t)}}class _ extends v{constructor(e,t={}){super(),this.el=e,this.option=t,this.rectScale={x:1,y:1},this._ui=()=>{const e=this.el.parentElement.getBoundingClientRect(),t={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},i=this.temporalRect||t;return{position:{left:(i.left-e.left)*this.rectScale.x,top:(i.top-e.top)*this.rectScale.y},size:{width:i.width*this.rectScale.x,height:i.height*this.rectScale.y}}},this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this.enable(),this._setupAutoHide(this.option.autoHide),this._setupHandlers()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){super.enable(),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this._setupAutoHide(!1)}destroy(){this._removeHandlers(),this._setupAutoHide(!1),delete this.el,super.destroy()}updateOption(e){const t=e.handles&&e.handles!==this.option.handles,i=e.autoHide&&e.autoHide!==this.option.autoHide;return Object.keys(e).forEach((t=>this.option[t]=e[t])),t&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(this.option.autoHide),this}_setupAutoHide(e){return e?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),n.overResizeElement===this&&delete n.overResizeElement),this}_mouseOver(e){n.overResizeElement||n.dragElement||(n.overResizeElement=this,this.el.classList.remove("ui-resizable-autohide"))}_mouseOut(e){n.overResizeElement===this&&(delete n.overResizeElement,this.el.classList.add("ui-resizable-autohide"))}_setupHandlers(){return this.handlers=this.option.handles.split(",").map((e=>e.trim())).map((e=>new f(this.el,e,{element:this.option.element,start:e=>this._resizeStart(e),stop:e=>this._resizeStop(e),move:t=>this._resizing(t,e)}))),this}_resizeStart(e){this.sizeToContent=i.shouldSizeToContent(this.el.gridstackNode,!0),this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=i.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=e,this._setupHelper(),this._applyChange();const t=i.initEvent(e,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(t,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",t),this}_resizing(e,t){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(e,t),this._applyChange();const s=i.initEvent(e,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(s,this._ui()),this.triggerEvent("resize",s),this}_resizeStop(e){const t=i.initEvent(e,{type:"resizestop",target:this.el});return this._cleanHelper(),this.option.stop&&this.option.stop(t),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",t),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){this.elOriginStyleVal=_._originStyleProp.map((e=>this.el.style[e])),this.parentOriginStylePosition=this.el.parentElement.style.position;const e=this.el.parentElement,t=i.getValuesFromTransformedElement(e);return this.rectScale={x:t.xScale,y:t.yScale},getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this}_cleanHelper(){return _._originStyleProp.forEach(((e,t)=>{this.el.style[e]=this.elOriginStyleVal[t]||null})),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(e,t){const i=this.startEvent,s={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},o=e.clientX-i.clientX,n=this.sizeToContent?0:e.clientY-i.clientY;let r,a;t.indexOf("e")>-1?s.width+=o:t.indexOf("w")>-1&&(s.width-=o,s.left+=o,r=!0),t.indexOf("s")>-1?s.height+=n:t.indexOf("n")>-1&&(s.height-=n,s.top+=n,a=!0);const h=this._constrainSize(s.width,s.height,r,a);return Math.round(s.width)!==Math.round(h.width)&&(t.indexOf("w")>-1&&(s.left+=s.width-h.width),s.width=h.width),Math.round(s.height)!==Math.round(h.height)&&(t.indexOf("n")>-1&&(s.top+=s.height-h.height),s.height=h.height),s}_constrainSize(e,t,i,s){const o=this.option,n=(i?o.maxWidthMoveLeft:o.maxWidth)||Number.MAX_SAFE_INTEGER,r=o.minWidth/this.rectScale.x||e,a=(s?o.maxHeightMoveUp:o.maxHeight)||Number.MAX_SAFE_INTEGER,h=o.minHeight/this.rectScale.y||t;return{width:Math.min(n,Math.max(r,e)),height:Math.min(a,Math.max(h,t))}}_applyChange(){let e={left:0,top:0,width:0,height:0};if("absolute"===this.el.style.position){const t=this.el.parentElement,{left:i,top:s}=t.getBoundingClientRect();e={left:i,top:s,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach((t=>{const i=this.temporalRect[t],s="width"===t||"left"===t?this.rectScale.x:"height"===t||"top"===t?this.rectScale.y:1;this.el.style[t]=(i-e[t])*s+"px"})),this):this}_removeHandlers(){return this.handlers.forEach((e=>e.destroy())),delete this.handlers,this}}_._originStyleProp=["width","height","position","left","top","opacity","zIndex"];class y extends v{constructor(e,t={}){super(),this.el=e,this.option=t,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0};const i=t?.handle?.substring(1),s=e.gridstackNode;this.dragEls=!i||e.classList.contains(i)?[e]:s?.subGrid?[e.querySelector(t.handle)||e]:Array.from(e.querySelectorAll(t.handle)),0===this.dragEls.length&&(this.dragEls=[e]),this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this.enable()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){!1!==this.disabled&&(super.enable(),this.dragEls.forEach((e=>{e.addEventListener("mousedown",this._mouseDown),r&&(e.addEventListener("touchstart",d),e.addEventListener("pointerdown",u))})),this.el.classList.remove("ui-draggable-disabled"))}disable(e=!1){!0!==this.disabled&&(super.disable(),this.dragEls.forEach((e=>{e.removeEventListener("mousedown",this._mouseDown),r&&(e.removeEventListener("touchstart",d),e.removeEventListener("pointerdown",u))})),e||this.el.classList.add("ui-draggable-disabled"))}destroy(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.mouseDownEvent&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(e){return Object.keys(e).forEach((t=>this.option[t]=e[t])),this}_mouseDown(e){if(a.touchHandled&&e.isTrusted&&(a.touchHandled=!1),!n.mouseHandled)return 0!==e.button||!this.dragEls.find((t=>t===e.target))&&e.target.closest('input,textarea,button,select,option,[contenteditable="true"],.ui-resizable-handle')||this.option.cancel&&e.target.closest(this.option.cancel)||(this.mouseDownEvent=e,delete this.dragging,delete n.dragElement,delete n.dropElement,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),r&&(e.currentTarget.addEventListener("touchmove",c),e.currentTarget.addEventListener("touchend",g)),e.preventDefault(),document.activeElement&&document.activeElement.blur(),n.mouseHandled=!0),!0}_callDrag(e){if(!this.dragging)return;const t=i.initEvent(e,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(t,this.ui()),this.triggerEvent("drag",t)}_mouseMove(e){const t=this.mouseDownEvent;if(this.lastDrag=e,this.dragging)if(this._dragFollow(e),n.pauseDrag){const t=Number.isInteger(n.pauseDrag)?n.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout((()=>this._callDrag(e)),t)}else this._callDrag(e);else if(Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>3){this.dragging=!0,n.dragElement=this;const t=this.el.gridstackNode?.grid;t?n.dropElement=t.el.ddElement.ddDroppable:delete n.dropElement,this.helper=this._createHelper(),this._setupHelperContainmentStyle(),this.dragTransform=i.getValuesFromTransformedElement(this.helperContainment),this.dragOffset=this._getDragOffset(e,this.el,this.helperContainment),this._setupHelperStyle(e);const s=i.initEvent(e,{target:this.el,type:"dragstart"});this.option.start&&this.option.start(s,this.ui()),this.triggerEvent("dragstart",s),document.addEventListener("keydown",this._keyEvent)}return!0}_mouseUp(e){if(document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),r&&e.currentTarget&&(e.currentTarget.removeEventListener("touchmove",c,!0),e.currentTarget.removeEventListener("touchend",g,!0)),this.dragging){delete this.dragging,delete this.el.gridstackNode?._origRotate,document.removeEventListener("keydown",this._keyEvent),n.dropElement?.el===this.el.parentElement&&delete n.dropElement,this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper!==this.el&&this.helper.remove(),this._removeHelperStyle();const t=i.initEvent(e,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(t),this.triggerEvent("dragstop",t),n.dropElement&&n.dropElement.drop(e)}delete this.helper,delete this.mouseDownEvent,delete n.dragElement,delete n.dropElement,delete n.mouseHandled,e.preventDefault()}_keyEvent(e){const t=this.el.gridstackNode,s=t?.grid||n.dropElement?.el?.gridstack;if("Escape"===e.key)t&&t._origRotate&&(t._orig=t._origRotate,delete t._origRotate),s?.cancelDrag(),this._mouseUp(this.mouseDownEvent);else if(t&&s&&("r"===e.key||"R"===e.key)){if(!i.canBeRotated(t))return;t._origRotate=t._origRotate||{...t._orig},delete t._moving,s.setAnimation(!1).rotate(t.el,{top:-this.dragOffset.offsetTop,left:-this.dragOffset.offsetLeft}).setAnimation(),t._moving=!0,this.dragOffset=this._getDragOffset(this.lastDrag,t.el,this.helperContainment),this.helper.style.width=this.dragOffset.width+"px",this.helper.style.height=this.dragOffset.height+"px",i.swap(t._orig,"w","h"),delete t._rect,this._mouseMove(this.lastDrag)}}_createHelper(){let e=this.el;return"function"==typeof this.option.helper?e=this.option.helper(this.el):"clone"===this.option.helper&&(e=i.cloneNode(this.el)),e.parentElement||i.appendTo(e,"parent"===this.option.appendTo?this.el.parentElement:this.option.appendTo),this.dragElementOriginStyle=y.originStyleProp.map((e=>this.el.style[e])),e}_setupHelperStyle(e){this.helper.classList.add("ui-draggable-dragging"),this.el.gridstackNode?.grid?.el.classList.add("grid-stack-dragging");const t=this.helper.style;return t.pointerEvents="none",t.width=this.dragOffset.width+"px",t.height=this.dragOffset.height+"px",t.willChange="left, top",t.position="fixed",this._dragFollow(e),t.transition="none",setTimeout((()=>{this.helper&&(t.transition=null)}),0),this}_removeHelperStyle(){this.helper.classList.remove("ui-draggable-dragging"),this.el.gridstackNode?.grid?.el.classList.remove("grid-stack-dragging");const e=this.helper?.gridstackNode;if(!e?._isAboutToRemove&&this.dragElementOriginStyle){const e=this.helper,t=this.dragElementOriginStyle.transition||null;e.style.transition=this.dragElementOriginStyle.transition="none",y.originStyleProp.forEach((t=>e.style[t]=this.dragElementOriginStyle[t]||null)),setTimeout((()=>e.style.transition=t),50)}return delete this.dragElementOriginStyle,this}_dragFollow(e){const t=this.helper.style,i=this.dragOffset;t.left=(e.clientX+i.offsetLeft-0)*this.dragTransform.xScale+"px",t.top=(e.clientY+i.offsetTop-0)*this.dragTransform.yScale+"px"}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.helper.style.position&&(this.parentOriginStylePosition=this.helperContainment.style.position,getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_getDragOffset(e,t,i){let s=0,o=0;i&&(s=this.dragTransform.xOffset,o=this.dragTransform.yOffset);const n=t.getBoundingClientRect();return{left:n.left,top:n.top,offsetLeft:-e.clientX+n.left-s,offsetTop:-e.clientY+n.top-o,width:n.width*this.dragTransform.xScale,height:n.height*this.dragTransform.yScale}}ui(){const e=this.el.parentElement.getBoundingClientRect(),t=this.helper.getBoundingClientRect();return{position:{top:(t.top-e.top)*this.dragTransform.yScale,left:(t.left-e.left)*this.dragTransform.xScale}}}}y.originStyleProp=["width","height","transform","transform-origin","transition","pointerEvents","position","left","top","minWidth","willChange"];class b extends v{constructor(e,t={}){super(),this.el=e,this.option=t,this._mouseEnter=this._mouseEnter.bind(this),this._mouseLeave=this._mouseLeave.bind(this),this.enable(),this._setupAccept()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){!1!==this.disabled&&(super.enable(),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),r&&(this.el.addEventListener("pointerenter",p),this.el.addEventListener("pointerleave",m)))}disable(e=!1){!0!==this.disabled&&(super.disable(),this.el.classList.remove("ui-droppable"),e||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),r&&(this.el.removeEventListener("pointerenter",p),this.el.removeEventListener("pointerleave",m)))}destroy(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),super.destroy()}updateOption(e){return Object.keys(e).forEach((t=>this.option[t]=e[t])),this._setupAccept(),this}_mouseEnter(e){if(!n.dragElement)return;if(a.touchHandled&&e.isTrusted)return;if(!this._canDrop(n.dragElement.el))return;e.preventDefault(),e.stopPropagation(),n.dropElement&&n.dropElement!==this&&n.dropElement._mouseLeave(e,!0),n.dropElement=this;const t=i.initEvent(e,{target:this.el,type:"dropover"});this.option.over&&this.option.over(t,this._ui(n.dragElement)),this.triggerEvent("dropover",t),this.el.classList.add("ui-droppable-over")}_mouseLeave(e,t=!1){if(!n.dragElement||n.dropElement!==this)return;e.preventDefault(),e.stopPropagation();const s=i.initEvent(e,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(s,this._ui(n.dragElement)),this.triggerEvent("dropout",s),n.dropElement===this&&(delete n.dropElement,!t)){let t,i=this.el.parentElement;for(;!t&&i;)t=i.ddElement?.ddDroppable,i=i.parentElement;t&&t._mouseEnter(e)}}drop(e){e.preventDefault();const t=i.initEvent(e,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(t,this._ui(n.dragElement)),this.triggerEvent("drop",t)}_canDrop(e){return e&&(!this.accept||this.accept(e))}_setupAccept(){return this.option.accept?("string"==typeof this.option.accept?this.accept=e=>e.classList.contains(this.option.accept)||e.matches(this.option.accept):this.accept=this.option.accept,this):this}_ui(e){return{draggable:e.el,...e.ui()}}}class w{static init(e){return e.ddElement||(e.ddElement=new w(e)),e.ddElement}constructor(e){this.el=e}on(e,t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.on(e,t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.on(e,t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.on(e,t),this}off(e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.off(e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.off(e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.off(e),this}setupDraggable(e){return this.ddDraggable?this.ddDraggable.updateOption(e):this.ddDraggable=new y(this.el,e),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(e){return this.ddResizable?this.ddResizable.updateOption(e):this.ddResizable=new _(this.el,e),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(e){return this.ddDroppable?this.ddDroppable.updateOption(e):this.ddDroppable=new b(this.el,e),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}}const E=new class{resizable(e,t,i,s){return this._getDDElements(e,t).forEach((e=>{if("disable"===t||"enable"===t)e.ddResizable&&e.ddResizable[t]();else if("destroy"===t)e.ddResizable&&e.cleanResizable();else if("option"===t)e.setupResizable({[i]:s});else{const i=e.el.gridstackNode.grid;let s=e.el.getAttribute("gs-resize-handles")||i.opts.resizable.handles||"e,s,se";"all"===s&&(s="n,e,s,w,se,sw,ne,nw");const o=!i.opts.alwaysShowResizeHandle;e.setupResizable({...i.opts.resizable,handles:s,autoHide:o,start:t.start,stop:t.stop,resize:t.resize})}})),this}draggable(e,t,i,s){return this._getDDElements(e,t).forEach((e=>{if("disable"===t||"enable"===t)e.ddDraggable&&e.ddDraggable[t]();else if("destroy"===t)e.ddDraggable&&e.cleanDraggable();else if("option"===t)e.setupDraggable({[i]:s});else{const i=e.el.gridstackNode.grid;e.setupDraggable({...i.opts.draggable,start:t.start,stop:t.stop,drag:t.drag})}})),this}dragIn(e,t){return this._getDDElements(e).forEach((e=>e.setupDraggable(t))),this}droppable(e,t,i,s){return"function"!=typeof t.accept||t._accept||(t._accept=t.accept,t.accept=e=>t._accept(e)),this._getDDElements(e,t).forEach((e=>{"disable"===t||"enable"===t?e.ddDroppable&&e.ddDroppable[t]():"destroy"===t?e.ddDroppable&&e.cleanDroppable():"option"===t?e.setupDroppable({[i]:s}):e.setupDroppable(t)})),this}isDroppable(e){return!(!e?.ddElement?.ddDroppable||e.ddElement.ddDroppable.disabled)}isDraggable(e){return!(!e?.ddElement?.ddDraggable||e.ddElement.ddDraggable.disabled)}isResizable(e){return!(!e?.ddElement?.ddResizable||e.ddElement.ddResizable.disabled)}on(e,t,i){return this._getDDElements(e).forEach((e=>e.on(t,(e=>{i(e,n.dragElement?n.dragElement.el:e.target,n.dragElement?n.dragElement.helper:null)})))),this}off(e,t){return this._getDDElements(e).forEach((e=>e.off(t))),this}_getDDElements(e,t){const s=e.gridstack||"destroy"!==t&&"disable"!==t,o=i.getElements(e);return o.length?o.map((e=>e.ddElement||(s?w.init(e):null))).filter((e=>e)):[]}};class x{static init(e={},t=".grid-stack"){if("undefined"==typeof document)return null;const s=x.getGridElement(t);return s?(s.gridstack||(s.gridstack=new x(s,i.cloneDeep(e))),s.gridstack):("string"==typeof t?console.error('GridStack.initAll() no grid was found with selector "'+t+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)}static initAll(e={},t=".grid-stack"){const s=[];return"undefined"==typeof document||(x.getGridElements(t).forEach((t=>{t.gridstack||(t.gridstack=new x(t,i.cloneDeep(e))),s.push(t.gridstack)})),0===s.length&&console.error('GridStack.initAll() no grid was found with selector "'+t+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.')),s}static addGrid(e,t={}){if(!e)return null;let s=e;if(s.gridstack){const e=s.gridstack;return t&&(e.opts={...e.opts,...t}),void 0!==t.children&&e.load(t.children),e}return e.classList.contains("grid-stack")&&!x.addRemoveCB||(s=x.addRemoveCB?x.addRemoveCB(e,t,!0,!0):i.createDiv(["grid-stack",t.class],e)),x.init(t,s)}static registerEngine(e){x.engineClass=e}get placeholder(){if(!this._placeholder){this._placeholder=i.createDiv([this.opts.placeholderClass,o.itemClass,this.opts.itemClass]);const e=i.createDiv(["placeholder-content"],this._placeholder);this.opts.placeholderText&&(e.textContent=this.opts.placeholderText)}return this._placeholder}constructor(e,t={}){this.el=e,this.opts=t,this.animationDelay=310,this._gsEventHandler={},this._extraDragRow=0,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0},e.gridstack=this,this.opts=t=t||{},e.classList.contains("grid-stack")||this.el.classList.add("grid-stack"),t.row&&(t.minRow=t.maxRow=t.row,delete t.row);const a=i.toNumber(e.getAttribute("gs-row"));"auto"===t.column&&delete t.column,void 0!==t.alwaysShowResizeHandle&&(t._alwaysShowResizeHandle=t.alwaysShowResizeHandle);const h=t.columnOpts;if(h){const e=h.breakpoints;h.columnWidth||e?.length?(h.columnMax=h.columnMax||12,e?.length>1&&e.sort(((e,t)=>(t.w||0)-(e.w||0)))):delete t.columnOpts}const l={...i.cloneDeep(o),column:i.toNumber(e.getAttribute("gs-column"))||o.column,minRow:a||i.toNumber(e.getAttribute("gs-min-row"))||o.minRow,maxRow:a||i.toNumber(e.getAttribute("gs-max-row"))||o.maxRow,staticGrid:i.toBool(e.getAttribute("gs-static"))||o.staticGrid,sizeToContent:i.toBool(e.getAttribute("gs-size-to-content"))||void 0,draggable:{handle:(t.handleClass?"."+t.handleClass:t.handle?t.handle:"")||o.draggable.handle},removableOptions:{accept:t.itemClass||o.removableOptions.accept,decline:o.removableOptions.decline}};e.getAttribute("gs-animate")&&(l.animate=i.toBool(e.getAttribute("gs-animate"))),t=i.defaults(t,l),this._initMargin(),this.checkDynamicColumn(),this._updateColumnVar(t),"auto"===t.rtl&&(t.rtl="rtl"===e.style.direction),t.rtl&&this.el.classList.add("grid-stack-rtl");const d=this.el.closest("."+o.itemClass),c=d?.gridstackNode;if(c&&(c.subGrid=this,this.parentGridNode=c,this.el.classList.add("grid-stack-nested"),c.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight="auto"===t.cellHeight,this._isAutoCellHeight||"initial"===t.cellHeight)this.cellHeight(void 0);else{"number"==typeof t.cellHeight&&t.cellHeightUnit&&t.cellHeightUnit!==o.cellHeightUnit&&(t.cellHeight=t.cellHeight+t.cellHeightUnit,delete t.cellHeightUnit);const e=t.cellHeight;delete t.cellHeight,this.cellHeight(e)}"mobile"===t.alwaysShowResizeHandle&&(t.alwaysShowResizeHandle=r),this._setStaticClass();const g=t.engineClass||x.engineClass||s;if(this.engine=new g({column:this.getColumn(),float:t.float,maxRow:t.maxRow,onChange:e=>{e.forEach((e=>{const t=e.el;t&&(e._removeDOM?(t&&t.remove(),delete e._removeDOM):this._writePosAttr(t,e))})),this._updateContainerHeight()}}),t.auto&&(this.batchUpdate(),this.engine._loading=!0,this.getGridItems().forEach((e=>this._prepareElement(e))),delete this.engine._loading,this.batchUpdate(!1)),t.children){const e=t.children;delete t.children,e.length&&this.load(e)}this.setAnimation(),t.subGridDynamic&&!n.pauseDrag&&(n.pauseDrag=!0),void 0!==t.draggable?.pause&&(n.pauseDrag=t.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateResizeEvent()}_updateColumnVar(e=this.opts){this.el.classList.add("gs-"+e.column),"number"==typeof e.column&&this.el.style.setProperty("--gs-column-width",100/e.column+"%")}addWidget(e){if(!e)return;if("string"==typeof e)return void console.error("V11: GridStack.addWidget() does not support string anymore. see #2736");if(e.ELEMENT_NODE)return console.error("V11: GridStack.addWidget() does not support HTMLElement anymore. use makeWidget()"),this.makeWidget(e);let t,s=e;if(s.grid=this,t=s.el?s.el:x.addRemoveCB?x.addRemoveCB(this.el,e,!0,!1):this.createWidgetDivs(s),!t)return;if(s=t.gridstackNode,s&&t.parentElement===this.el&&this.engine.nodes.find((e=>e._id===s._id)))return t;const o=this._readAttr(t);return i.defaults(e,o),this.engine.prepareNode(e),this.el.appendChild(t),this.makeWidget(t,e),t}createWidgetDivs(e){const t=i.createDiv(["grid-stack-item",this.opts.itemClass]),s=i.createDiv(["grid-stack-item-content"],t);return i.lazyLoad(e)?e.visibleObservable||(e.visibleObservable=new IntersectionObserver((([t])=>{t.isIntersecting&&(e.visibleObservable?.disconnect(),delete e.visibleObservable,x.renderCB(s,e),e.grid?.prepareDragDrop(e.el))})),window.setTimeout((()=>e.visibleObservable?.observe(t)))):x.renderCB(s,e),t}makeSubGrid(e,t,s,o=!0){let n,r=e.gridstackNode;if(r||(r=this.makeWidget(e).gridstackNode),r.subGrid?.el)return r.subGrid;let a,h=this;for(;h&&!n;)n=h.opts?.subGridOpts,h=h.parentGridNode?.grid;t=i.cloneDeep({...this.opts,id:void 0,children:void 0,column:"auto",columnOpts:void 0,layout:"list",subGridOpts:void 0,...n||{},...t||r.subGridOpts||{}}),r.subGridOpts=t,"auto"===t.column&&(a=!0,t.column=Math.max(r.w||1,s?.w||1),delete t.columnOpts);let l,d,c=r.el.querySelector(".grid-stack-item-content");if(o&&(this._removeDD(r.el),d={...r,x:0,y:0},i.removeInternalForSave(d),delete d.subGridOpts,r.content&&(d.content=r.content,delete r.content),x.addRemoveCB?l=x.addRemoveCB(this.el,d,!0,!1):(l=i.createDiv(["grid-stack-item"]),l.appendChild(c),c=i.createDiv(["grid-stack-item-content"],r.el)),this.prepareDragDrop(r.el)),s){const e=a?t.column:r.w,i=r.h+s.h,o=r.el.style;o.transition="none",this.update(r.el,{w:e,h:i}),setTimeout((()=>o.transition=null))}const g=r.subGrid=x.addGrid(c,t);return s?._moving&&(g._isTemp=!0),a&&(g._autoColumn=!0),o&&g.makeWidget(l,d),s&&(s._moving?window.setTimeout((()=>i.simulateMouseEvent(s._event,"mouseenter",g.el)),0):g.makeWidget(r.el,r)),this.resizeToContentCheck(!1,r),g}removeAsSubGrid(e){const t=this.parentGridNode?.grid;t&&(t.batchUpdate(),t.removeWidget(this.parentGridNode.el,!0,!0),this.engine.nodes.forEach((e=>{e.x+=this.parentGridNode.x,e.y+=this.parentGridNode.y,t.makeWidget(e.el,e)})),t.batchUpdate(!1),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,e&&window.setTimeout((()=>i.simulateMouseEvent(e._event,"mouseenter",t.el)),0))}save(e=!0,t=!1,s=x.saveCB,n){const r=this.engine.save(e,s,n);if(r.forEach((i=>{if(e&&i.el&&!i.subGrid&&!s){const e=i.el.querySelector(".grid-stack-item-content");i.content=e?.innerHTML,i.content||delete i.content}else if(e||s||delete i.content,i.subGrid?.el){const o=i.w||i.subGrid.getColumn(),n=i.subGrid.save(e,t,s,o);i.subGridOpts=t?n:{children:n},delete i.subGrid}delete i.el})),t){const e=i.cloneDeep(this.opts);e.marginBottom===e.marginTop&&e.marginRight===e.marginLeft&&e.marginTop===e.marginRight&&(e.margin=e.marginTop,delete e.marginTop,delete e.marginRight,delete e.marginBottom,delete e.marginLeft),e.rtl===("rtl"===this.el.style.direction)&&(e.rtl="auto"),this._isAutoCellHeight&&(e.cellHeight="auto"),this._autoColumn&&(e.column="auto");const t=e._alwaysShowResizeHandle;return delete e._alwaysShowResizeHandle,void 0!==t?e.alwaysShowResizeHandle=t:delete e.alwaysShowResizeHandle,i.removeInternalAndSame(e,o),e.children=r,e}return r}load(e,t=x.addRemoveCB||!0){e=i.cloneDeep(e);const s=this.getColumn();e.forEach((e=>{e.w=e.w||e.minW||1,e.h=e.h||e.minH||1})),e=i.sort(e),this.engine.skipCacheUpdate=this._ignoreLayoutsNodeChange=!0;let o=0;e.forEach((e=>{o=Math.max(o,(e.x||0)+e.w)})),o>this.engine.defaultColumn&&(this.engine.defaultColumn=o),o>s&&(0===this.engine.nodes.length&&this.responseLayout?(this.engine.nodes=e,this.engine.columnChanged(o,s,this.responseLayout),e=this.engine.nodes,this.engine.nodes=[],delete this.responseLayout):this.engine.cacheLayout(e,o,!0));const n=x.addRemoveCB;"function"==typeof t&&(x.addRemoveCB=t);const r=[];this.batchUpdate();const a=!this.engine.nodes.length,h=a&&this.opts.animate;h&&this.setAnimation(!1),!a&&t&&[...this.engine.nodes].forEach((t=>{t.id&&(i.find(e,t.id)||(x.addRemoveCB&&x.addRemoveCB(this.el,t,!1,!1),r.push(t),this.removeWidget(t.el,!0,!1)))})),this.engine._loading=!0;const l=[];return this.engine.nodes=this.engine.nodes.filter((t=>!i.find(e,t.id)||(l.push(t),!1))),e.forEach((e=>{const s=i.find(l,e.id);if(s){if(i.shouldSizeToContent(s)&&(e.h=s.h),this.engine.nodeBoundFix(e),(e.autoPosition||void 0===e.x||void 0===e.y)&&(e.w=e.w||s.w,e.h=e.h||s.h,this.engine.findEmptyPosition(e)),this.engine.nodes.push(s),i.samePos(s,e)&&this.engine.nodes.length>1&&(this.moveNode(s,{...e,forceCollide:!0}),i.copyPos(e,s)),this.update(s.el,e),e.subGridOpts?.children){const t=s.el.querySelector(".grid-stack");t&&t.gridstack&&t.gridstack.load(e.subGridOpts.children)}}else t&&this.addWidget(e)})),delete this.engine._loading,this.engine.removedNodes=r,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this.engine.skipCacheUpdate,n?x.addRemoveCB=n:delete x.addRemoveCB,h&&this.setAnimation(!0,!0),this}batchUpdate(e=!0){return this.engine.batchUpdate(e),e||(this._updateContainerHeight(),this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this}getCellHeight(e=!1){if(this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!e||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;if("rem"===this.opts.cellHeightUnit)return this.opts.cellHeight*parseFloat(getComputedStyle(document.documentElement).fontSize);if("em"===this.opts.cellHeightUnit)return this.opts.cellHeight*parseFloat(getComputedStyle(this.el).fontSize);if("cm"===this.opts.cellHeightUnit)return this.opts.cellHeight*(96/2.54);if("mm"===this.opts.cellHeightUnit)return this.opts.cellHeight*(96/2.54)/10;const t=this.el.querySelector("."+this.opts.itemClass);if(t){const e=i.toNumber(t.getAttribute("gs-h"))||1;return Math.round(t.offsetHeight/e)}const s=parseInt(this.el.getAttribute("gs-current-row"));return s?Math.round(this.el.getBoundingClientRect().height/s):this.opts.cellHeight}cellHeight(e){if(void 0!==e&&this._isAutoCellHeight!==("auto"===e)&&(this._isAutoCellHeight="auto"===e,this._updateResizeEvent()),"initial"!==e&&"auto"!==e||(e=void 0),void 0===e){const t=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;e=this.cellWidth()+t}const t=i.parseHeight(e);return this.opts.cellHeightUnit===t.unit&&this.opts.cellHeight===t.h||(this.opts.cellHeightUnit=t.unit,this.opts.cellHeight=t.h,this.el.style.setProperty("--gs-cell-height",`${this.opts.cellHeight}${this.opts.cellHeightUnit}`),this._updateContainerHeight(),this.resizeToContentCheck()),this}cellWidth(){return this._widthOrContainer()/this.getColumn()}_widthOrContainer(e=!1){return e&&this.opts.columnOpts?.breakpointForWindow?window.innerWidth:this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth}checkDynamicColumn(){const e=this.opts.columnOpts;if(!e||!e.columnWidth&&!e.breakpoints?.length)return!1;const t=this.getColumn();let i=t;const s=this._widthOrContainer(!0);if(e.columnWidth)i=Math.min(Math.round(s/e.columnWidth)||1,e.columnMax);else{i=e.columnMax;let o=0;for(;oe.c===i));return this.column(i,t?.layout||e.layout),!0}return!1}compact(e="compact",t=!0){return this.engine.compact(e,t),this._triggerChangeEvent(),this}column(e,t="moveScale"){if(!e||e<1||this.opts.column===e)return this;const i=this.getColumn();return this.opts.column=e,this.engine?(this.engine.column=e,this.el.classList.remove("gs-"+i),this._updateColumnVar(),this.engine.columnChanged(i,e,t),this._isAutoCellHeight&&this.cellHeight(),this.resizeToContentCheck(!0),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this):(this.responseLayout=t,this)}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter((e=>e.matches("."+this.opts.itemClass)&&!e.matches("."+this.opts.placeholderClass)))}isIgnoreChangeCB(){return this._ignoreLayoutsNodeChange}destroy(e=!0){if(this.el)return this.offAll(),this._updateResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),e?this.el.parentNode.removeChild(this.el):(this.removeAll(e),this.el.removeAttribute("gs-current-row")),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,delete this.opts,delete this._placeholder?.gridstackNode,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}float(e){return this.opts.float!==e&&(this.opts.float=this.engine.float=e,this._triggerChangeEvent()),this}getFloat(){return this.engine.float}getCellFromPixel(e,t=!1){const i=this.el.getBoundingClientRect();let s;s=t?{top:i.top+document.documentElement.scrollTop,left:i.left}:{top:this.el.offsetTop,left:this.el.offsetLeft};const o=e.left-s.left,n=e.top-s.top,r=i.width/this.getColumn(),a=i.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(o/r),y:Math.floor(n/a)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow||0)}isAreaEmpty(e,t,i,s){return this.engine.isAreaEmpty(e,t,i,s)}makeWidget(e,t){const i=x.getElement(e);if(!i||i.gridstackNode)return i;i.parentElement||this.el.appendChild(i),this._prepareElement(i,!0,t);const s=i.gridstackNode;let o;return this._updateContainerHeight(),s.subGridOpts&&this.makeSubGrid(i,s.subGridOpts,void 0,!1),1!==this.opts.column||this._ignoreLayoutsNodeChange||(o=this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),o&&delete this._ignoreLayoutsNodeChange,i}on(e,t){if(-1!==e.indexOf(" "))return e.split(" ").forEach((e=>this.on(e,t))),this;if("change"===e||"added"===e||"removed"===e||"enable"===e||"disable"===e){const i="enable"===e||"disable"===e;this._gsEventHandler[e]=i?e=>t(e):e=>{e.detail&&t(e,e.detail)},this.el.addEventListener(e,this._gsEventHandler[e])}else"drag"===e||"dragstart"===e||"dragstop"===e||"resizestart"===e||"resize"===e||"resizestop"===e||"dropped"===e||"resizecontent"===e?this._gsEventHandler[e]=t:console.error("GridStack.on("+e+") event not supported");return this}off(e){return-1!==e.indexOf(" ")?(e.split(" ").forEach((e=>this.off(e))),this):("change"!==e&&"added"!==e&&"removed"!==e&&"enable"!==e&&"disable"!==e||this._gsEventHandler[e]&&this.el.removeEventListener(e,this._gsEventHandler[e]),delete this._gsEventHandler[e],this)}offAll(){return Object.keys(this._gsEventHandler).forEach((e=>this.off(e))),this}removeWidget(e,t=!0,i=!0){return e?(x.getElements(e).forEach((e=>{if(e.parentElement&&e.parentElement!==this.el)return;let s=e.gridstackNode;s||(s=this.engine.nodes.find((t=>e===t.el))),s&&(t&&x.addRemoveCB&&x.addRemoveCB(this.el,s,!1,!1),delete e.gridstackNode,this._removeDD(e),this.engine.removeNode(s,t,i),t&&e.parentElement&&e.remove())})),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this):(console.error("Error: GridStack.removeWidget(undefined) called"),this)}removeAll(e=!0,t=!0){return this.engine.nodes.forEach((t=>{e&&x.addRemoveCB&&x.addRemoveCB(this.el,t,!1,!1),delete t.el.gridstackNode,this.opts.staticGrid||this._removeDD(t.el)})),this.engine.removeAll(e,t),t&&this._triggerRemoveEvent(),this}setAnimation(e=this.opts.animate,t){return t?setTimeout((()=>{this.opts&&this.setAnimation(e)})):e?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this.opts.animate=e,this}hasAnimationCSS(){return this.el.classList.contains("grid-stack-animate")}setStatic(e,t=!0,i=!0){return!!this.opts.staticGrid===e||(e?this.opts.staticGrid=!0:delete this.opts.staticGrid,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach((s=>{this.prepareDragDrop(s.el),s.subGrid&&i&&s.subGrid.setStatic(e,t,i)})),t&&this._setStaticClass()),this}updateOptions(e){const t=this.opts;return e===t||(void 0!==e.acceptWidgets&&(t.acceptWidgets=e.acceptWidgets,this._setupAcceptWidget()),void 0!==e.animate&&this.setAnimation(e.animate),e.cellHeight&&this.cellHeight(e.cellHeight),void 0!==e.class&&e.class!==t.class&&(t.class&&this.el.classList.remove(t.class),e.class&&this.el.classList.add(e.class)),e.columnOpts?(this.opts.columnOpts=e.columnOpts,this.checkDynamicColumn()):null===e.columnOpts&&this.opts.columnOpts?(delete this.opts.columnOpts,this._updateResizeEvent()):"number"==typeof e.column&&this.column(e.column),void 0!==e.margin&&this.margin(e.margin),void 0!==e.staticGrid&&this.setStatic(e.staticGrid),void 0===e.disableDrag||e.staticGrid||this.enableMove(!e.disableDrag),void 0===e.disableResize||e.staticGrid||this.enableResize(!e.disableResize),void 0!==e.float&&this.float(e.float),void 0!==e.row?(t.minRow=t.maxRow=t.row=e.row,this._updateContainerHeight()):(void 0!==e.minRow&&(t.minRow=e.minRow,this._updateContainerHeight()),void 0!==e.maxRow&&(t.maxRow=e.maxRow)),void 0!==e.lazyLoad&&(t.lazyLoad=e.lazyLoad),e.children?.length&&this.load(e.children)),this}update(e,t){return x.getElements(e).forEach((e=>{const s=e?.gridstackNode;if(!s)return;const o={...i.copyPos({},s),...i.cloneDeep(t)};this.engine.nodeBoundFix(o),delete o.autoPosition;const n=["x","y","w","h"];let r;if(n.some((e=>void 0!==o[e]&&o[e]!==s[e]))&&(r={},n.forEach((e=>{r[e]=void 0!==o[e]?o[e]:s[e],delete o[e]}))),!r&&(o.minW||o.minH||o.maxW||o.maxH)&&(r={}),void 0!==o.content){const t=e.querySelector(".grid-stack-item-content");t&&t.textContent!==o.content&&(s.content=o.content,x.renderCB(t,o),s.subGrid?.el&&(t.appendChild(s.subGrid.el),s.subGrid._updateContainerHeight())),delete o.content}let a=!1,h=!1;for(const e in o)"_"!==e[0]&&s[e]!==o[e]&&(s[e]=o[e],a=!0,h=h||!this.opts.staticGrid&&("noResize"===e||"noMove"===e||"locked"===e));if(i.sanitizeMinMax(s),r){const e=void 0!==r.w&&r.w!==s.w;this.moveNode(s,r),e&&s.subGrid?s.subGrid.onResize(this.hasAnimationCSS()?s.w:void 0):this.resizeToContentCheck(e,s),delete s._orig}(r||a)&&this._writeAttr(e,s),h&&this.prepareDragDrop(s.el),x.updateCB&&x.updateCB(s)})),this}moveNode(e,t){const i=e._updating;i||this.engine.cleanNodes().beginUpdate(e),this.engine.moveNode(e,t),this._updateContainerHeight(),i||(this._triggerChangeEvent(),this.engine.endUpdate())}resizeToContent(e){if(!e)return;if(e.classList.remove("size-to-content-max"),!e.clientHeight)return;const t=e.gridstackNode;if(!t)return;const i=t.grid;if(!i||e.parentElement!==i.el)return;const s=i.getCellHeight(!0);if(!s)return;let o,n=t.h?t.h*s:e.clientHeight;if(t.resizeToContentParent&&(o=e.querySelector(t.resizeToContentParent)),o||(o=e.querySelector(x.resizeToContentParent)),!o)return;const r=e.clientHeight-o.clientHeight,a=t.h?t.h*s-r:o.clientHeight;let h;if(t.subGrid){h=t.subGrid.getRow()*t.subGrid.getCellHeight(!0);const i=t.subGrid.el.getBoundingClientRect(),s=e.getBoundingClientRect();h+=i.top-s.top}else{if(t.subGridOpts?.children?.length)return;{const e=o.firstElementChild;if(!e)return void console.error(`Error: GridStack.resizeToContent() widget id:${t.id} '${x.resizeToContentParent}'.firstElementChild is null, make sure to have a div like container. Skipping sizing.`);h=e.getBoundingClientRect().height||a}}if(a===h)return;n+=h-a;let l=Math.ceil(n/s);const d=Number.isInteger(t.sizeToContent)?t.sizeToContent:0;d&&l>d&&(l=d,e.classList.add("size-to-content-max")),t.minH&&lt.maxH&&(l=t.maxH),l!==t.h&&(i._ignoreLayoutsNodeChange=!0,i.moveNode(t,{h:l}),delete i._ignoreLayoutsNodeChange)}resizeToContentCBCheck(e){x.resizeToContentCB?x.resizeToContentCB(e):this.resizeToContent(e)}rotate(e,t){return x.getElements(e).forEach((e=>{const s=e.gridstackNode;if(!i.canBeRotated(s))return;const o={w:s.h,h:s.w,minH:s.minW,minW:s.minH,maxH:s.maxW,maxW:s.maxH};if(t){const e=t.left>0?Math.floor(t.left/this.cellWidth()):0,i=t.top>0?Math.floor(t.top/this.opts.cellHeight):0;o.x=s.x+e-(s.h-(i+1)),o.y=s.y+i-e}Object.keys(o).forEach((e=>{void 0===o[e]&&delete o[e]}));const n=s._orig;this.update(e,o),s._orig=n})),this}margin(e){if(!("string"==typeof e&&e.split(" ").length>1)){const t=i.parseHeight(e);if(this.opts.marginUnit===t.unit&&this.opts.margin===t.h)return}return this.opts.margin=e,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this._initMargin(),this}getMargin(){return this.opts.margin}willItFit(e){return this.engine.willItFit(e)}_triggerChangeEvent(){if(this.engine.batchMode)return this;const e=this.engine.getDirtyNodes(!0);return e&&e.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(e),this._triggerEvent("change",e)),this.engine.saveInitial(),this}_triggerAddEvent(){if(this.engine.batchMode)return this;if(this.engine.addedNodes?.length){this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach((e=>{delete e._dirty}));const e=[...this.engine.addedNodes];this.engine.addedNodes=[],this._triggerEvent("added",e)}return this}_triggerRemoveEvent(){if(this.engine.batchMode)return this;if(this.engine.removedNodes?.length){const e=[...this.engine.removedNodes];this.engine.removedNodes=[],this._triggerEvent("removed",e)}return this}_triggerEvent(e,t){const i=t?new CustomEvent(e,{bubbles:!1,detail:t}):new Event(e);let s=this;for(;s.parentGridNode;)s=s.parentGridNode.grid;return s.el.dispatchEvent(i),this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;const e=this.parentGridNode;let t=this.getRow()+this._extraDragRow;const s=this.opts.cellHeight,o=this.opts.cellHeightUnit;if(!s)return this;if(!e&&!this.opts.minRow){const e=i.parseHeight(getComputedStyle(this.el).minHeight);if(e.h>0&&e.unit===o){const i=Math.floor(e.h/s);t1?`calc(${t.w} * var(--gs-column-width))`:null,e.style.height=t.h>1?`calc(${t.h} * var(--gs-cell-height))`:null),e.setAttribute("gs-x",String(t.x)),e.setAttribute("gs-y",String(t.y)),t.w>1?e.setAttribute("gs-w",String(t.w)):e.removeAttribute("gs-w"),t.h>1?e.setAttribute("gs-h",String(t.h)):e.removeAttribute("gs-h"),this}_writeAttr(e,t){if(!t)return this;this._writePosAttr(e,t);const i={noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id",sizeToContent:"gs-size-to-content"};for(const s in i)t[s]?e.setAttribute(i[s],String(t[s])):e.removeAttribute(i[s]);return this}_readAttr(e,t=!0){const s={};s.x=i.toNumber(e.getAttribute("gs-x")),s.y=i.toNumber(e.getAttribute("gs-y")),s.w=i.toNumber(e.getAttribute("gs-w")),s.h=i.toNumber(e.getAttribute("gs-h")),s.autoPosition=i.toBool(e.getAttribute("gs-auto-position")),s.noResize=i.toBool(e.getAttribute("gs-no-resize")),s.noMove=i.toBool(e.getAttribute("gs-no-move")),s.locked=i.toBool(e.getAttribute("gs-locked"));const o=e.getAttribute("gs-size-to-content");o&&(s.sizeToContent="true"===o||"false"===o?i.toBool(o):parseInt(o,10)),s.id=e.getAttribute("gs-id"),s.maxW=i.toNumber(e.getAttribute("gs-max-w")),s.minW=i.toNumber(e.getAttribute("gs-min-w")),s.maxH=i.toNumber(e.getAttribute("gs-max-h")),s.minH=i.toNumber(e.getAttribute("gs-min-h")),t&&(1===s.w&&e.removeAttribute("gs-w"),1===s.h&&e.removeAttribute("gs-h"),s.maxW&&e.removeAttribute("gs-max-w"),s.minW&&e.removeAttribute("gs-min-w"),s.maxH&&e.removeAttribute("gs-max-h"),s.minH&&e.removeAttribute("gs-min-h"));for(const e in s){if(!s.hasOwnProperty(e))return;s[e]||0===s[e]||"sizeToContent"===e||delete s[e]}return s}_setStaticClass(){const e=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...e),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...e),this.el.removeAttribute("gs-static")),this}onResize(e=this.el?.clientWidth){if(!e)return;if(this.prevWidth===e)return;this.prevWidth=e,this.batchUpdate();let t=!1;return this._autoColumn&&this.parentGridNode?this.opts.column!==this.parentGridNode.w&&(this.column(this.parentGridNode.w,this.opts.layout||"list"),t=!0):t=this.checkDynamicColumn(),this._isAutoCellHeight&&this.cellHeight(),this.engine.nodes.forEach((e=>{e.subGrid&&e.subGrid.onResize()})),this._skipInitialResize||this.resizeToContentCheck(t),delete this._skipInitialResize,this.batchUpdate(!1),this}resizeToContentCheck(e=!1,t=void 0){if(this.engine){if(e&&this.hasAnimationCSS())return setTimeout((()=>this.resizeToContentCheck(!1,t)),this.animationDelay);if(t)i.shouldSizeToContent(t)&&this.resizeToContentCBCheck(t.el);else if(this.engine.nodes.some((e=>i.shouldSizeToContent(e)))){const e=[...this.engine.nodes];this.batchUpdate(),e.forEach((e=>{i.shouldSizeToContent(e)&&this.resizeToContentCBCheck(e.el)})),this._ignoreLayoutsNodeChange=!0,this.batchUpdate(!1),this._ignoreLayoutsNodeChange=!1}this._gsEventHandler.resizecontent&&this._gsEventHandler.resizecontent(null,t?[t]:this.engine.nodes)}}_updateResizeEvent(e=!1){const t=!this.parentGridNode&&(this._isAutoCellHeight||this.opts.sizeToContent||this.opts.columnOpts||this.engine.nodes.find((e=>e.sizeToContent)));return e||!t||this.resizeObserver?!e&&t||!this.resizeObserver||(this.resizeObserver.disconnect(),delete this.resizeObserver,delete this._sizeThrottle):(this._sizeThrottle=i.throttle((()=>this.onResize()),this.opts.cellHeightThrottle),this.resizeObserver=new ResizeObserver((()=>this._sizeThrottle())),this.resizeObserver.observe(this.el),this._skipInitialResize=!0),this}static getElement(e=".grid-stack-item"){return i.getElement(e)}static getElements(e=".grid-stack-item"){return i.getElements(e)}static getGridElement(e){return x.getElement(e)}static getGridElements(e){return i.getElements(e)}_initMargin(){let e,t=0,s=[];"string"==typeof this.opts.margin&&(s=this.opts.margin.split(" ")),2===s.length?(this.opts.marginTop=this.opts.marginBottom=s[0],this.opts.marginLeft=this.opts.marginRight=s[1]):4===s.length?(this.opts.marginTop=s[0],this.opts.marginRight=s[1],this.opts.marginBottom=s[2],this.opts.marginLeft=s[3]):(e=i.parseHeight(this.opts.margin),this.opts.marginUnit=e.unit,t=this.opts.margin=e.h),["marginTop","marginRight","marginBottom","marginLeft"].forEach((s=>{void 0===this.opts[s]?this.opts[s]=t:(e=i.parseHeight(this.opts[s]),this.opts[s]=e.h,delete this.opts.margin)})),this.opts.marginUnit=e.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop);const o=this.el.style;return o.setProperty("--gs-item-margin-top",`${this.opts.marginTop}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-bottom",`${this.opts.marginBottom}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-right",`${this.opts.marginRight}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-left",`${this.opts.marginLeft}${this.opts.marginUnit}`),this}static getDD(){return E}static setupDragIn(e,t,s,o=document){void 0!==t?.pause&&(n.pauseDrag=t.pause),t={appendTo:"body",helper:"clone",...t||{}},("string"==typeof e?i.getElements(e,o):e).forEach(((e,i)=>{E.isDraggable(e)||E.dragIn(e,t),s?.[i]&&(e.gridstackNode=s[i])}))}movable(e,t){return this.opts.staticGrid||x.getElements(e).forEach((e=>{const i=e.gridstackNode;i&&(t?delete i.noMove:i.noMove=!0,this.prepareDragDrop(i.el))})),this}resizable(e,t){return this.opts.staticGrid||x.getElements(e).forEach((e=>{const i=e.gridstackNode;i&&(t?delete i.noResize:i.noResize=!0,this.prepareDragDrop(i.el))})),this}disable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!1,e),this.enableResize(!1,e),this._triggerEvent("disable"),this}enable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!0,e),this.enableResize(!0,e),this._triggerEvent("enable"),this}enableMove(e,t=!0){return this.opts.staticGrid||(e?delete this.opts.disableDrag:this.opts.disableDrag=!0,this.engine.nodes.forEach((i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableMove(e,t)}))),this}enableResize(e,t=!0){return this.opts.staticGrid||(e?delete this.opts.disableResize:this.opts.disableResize=!0,this.engine.nodes.forEach((i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableResize(e,t)}))),this}cancelDrag(){const e=this._placeholder?.gridstackNode;e&&(e._isExternal?(e._isAboutToRemove=!0,this.engine.removeNode(e)):e._isAboutToRemove&&x._itemRemoving(e.el,!1),this.engine.restoreInitial())}_removeDD(e){return E.draggable(e,"destroy").resizable(e,"destroy"),e.gridstackNode&&delete e.gridstackNode._initDD,delete e.ddElement,this}_setupAcceptWidget(){if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return E.droppable(this.el,"destroy"),this;let e,t;const s=(s,o,n)=>{const r=(n=n||o).gridstackNode;if(!r)return;if(!r.grid?.el){n.style.transform=`scale(${1/this.dragTransform.xScale},${1/this.dragTransform.yScale})`;const e=n.getBoundingClientRect();n.style.left=e.x+(this.dragTransform.xScale-1)*(s.clientX-e.x)/this.dragTransform.xScale+"px",n.style.top=e.y+(this.dragTransform.yScale-1)*(s.clientY-e.y)/this.dragTransform.yScale+"px",n.style.transformOrigin="0px 0px"}let{top:a,left:h}=n.getBoundingClientRect();const l=this.el.getBoundingClientRect();h-=l.left,a-=l.top;const d={position:{top:a*this.dragTransform.xScale,left:h*this.dragTransform.yScale}};if(r._temporaryRemoved){if(r.x=Math.max(0,Math.round(h/t)),r.y=Math.max(0,Math.round(a/e)),delete r.autoPosition,this.engine.nodeBoundFix(r),!this.engine.willItFit(r)){if(r.autoPosition=!0,!this.engine.willItFit(r))return void E.off(o,"drag");r._willFitPos&&(i.copyPos(r,r._willFitPos),delete r._willFitPos)}this._onStartMoving(n,s,d,r,t,e)}else this._dragOrResize(n,s,d,r,t,e)};return E.droppable(this.el,{accept:e=>{const t=e.gridstackNode||this._readAttr(e,!1);if(t?.grid===this)return!0;if(!this.opts.acceptWidgets)return!1;let i=!0;if("function"==typeof this.opts.acceptWidgets)i=this.opts.acceptWidgets(e);else{const t=!0===this.opts.acceptWidgets?".grid-stack-item":this.opts.acceptWidgets;i=e.matches(t)}if(i&&t&&this.opts.maxRow){const e={w:t.w,h:t.h,minW:t.minW,minH:t.minH};i=this.engine.willItFit(e)}return i}}).on(this.el,"dropover",((i,o,n)=>{let r=n?.gridstackNode||o.gridstackNode;if(r?.grid===this&&!r._temporaryRemoved)return!1;if(r?._sidebarOrig&&(r.w=r._sidebarOrig.w,r.h=r._sidebarOrig.h),r?.grid&&r.grid!==this&&!r._temporaryRemoved&&r.grid._leave(o,n),n=n||o,t=this.cellWidth(),e=this.getCellHeight(!0),!r){const e=n.getAttribute("data-gs-widget")||n.getAttribute("gridstacknode");if(e){try{r=JSON.parse(e)}catch(t){console.error("Gridstack dropover: Bad JSON format: ",e)}n.removeAttribute("data-gs-widget"),n.removeAttribute("gridstacknode")}r||(r=this._readAttr(n)),r._sidebarOrig={w:r.w,h:r.h}}r.grid||(r.el||(r={...r}),r._isExternal=!0,n.gridstackNode=r);const a=r.w||Math.round(n.offsetWidth/t)||1,h=r.h||Math.round(n.offsetHeight/e)||1;return r.grid&&r.grid!==this?(o._gridstackNodeOrig||(o._gridstackNodeOrig=r),o.gridstackNode=r={...r,w:a,h,grid:this},delete r.x,delete r.y,this.engine.cleanupNode(r).nodeBoundFix(r),r._initDD=r._isExternal=r._temporaryRemoved=!0):(r.w=a,r.h=h,r._temporaryRemoved=!0),x._itemRemoving(r.el,!1),E.on(o,"drag",s),s(i,o,n),!1})).on(this.el,"dropout",((e,t,i)=>{const s=i?.gridstackNode||t.gridstackNode;return!!s&&(s.grid&&s.grid!==this||(this._leave(t,i),this._isTemp&&this.removeAsSubGrid(s)),!1)})).on(this.el,"drop",((e,t,s)=>{const o=s?.gridstackNode||t.gridstackNode;if(o?.grid===this&&!o._isExternal)return!1;const n=!!this.placeholder.parentElement,r=t!==s;this.placeholder.remove(),delete this.placeholder.gridstackNode,n&&this.opts.animate&&(this.setAnimation(!1),this.setAnimation(!0,!0));const a=t._gridstackNodeOrig;if(delete t._gridstackNodeOrig,n&&a?.grid&&a.grid!==this){const e=a.grid;e.engine.removeNodeFromLayoutCache(a),e.engine.removedNodes.push(a),e._triggerRemoveEvent()._triggerChangeEvent(),e.parentGridNode&&!e.engine.nodes.length&&e.opts.subGridDynamic&&e.removeAsSubGrid()}if(!o)return!1;if(n&&(this.engine.cleanupNode(o),o.grid=this),delete o.grid?._isTemp,E.off(t,"drag"),s!==t?(s.remove(),t=s):t.remove(),this._removeDD(t),!n)return!1;const h=o.subGrid?.el?.gridstack;return i.copyPos(o,this._readAttr(this.placeholder)),i.removePositioningStyles(t),r&&(o.content||o.subGridOpts||x.addRemoveCB)?(delete o.el,t=this.addWidget(o)):(this._prepareElement(t,!0,o),this.el.appendChild(t),this.resizeToContentCheck(!1,o),h&&(h.parentGridNode=o),this._updateContainerHeight()),this.engine.addedNodes.push(o),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped({...e,type:"dropped"},a&&a.grid?a:void 0,o),!1})),this}static _itemRemoving(e,t){if(!e)return;const i=e?e.gridstackNode:void 0;i?.grid&&!e.classList.contains(i.grid.opts.removableOptions.decline)&&(t?i._isAboutToRemove=!0:delete i._isAboutToRemove,t?e.classList.add("grid-stack-item-removing"):e.classList.remove("grid-stack-item-removing"))}_setupRemoveDrop(){if("string"!=typeof this.opts.removable)return this;const e=document.querySelector(this.opts.removable);return e?(this.opts.staticGrid||E.isDroppable(e)||E.droppable(e,this.opts.removableOptions).on(e,"dropover",((e,t)=>x._itemRemoving(t,!0))).on(e,"dropout",((e,t)=>x._itemRemoving(t,!1))),this):this}prepareDragDrop(e,t=!1){const s=e?.gridstackNode;if(!s)return;const o=s.noMove||this.opts.disableDrag,n=s.noResize||this.opts.disableResize,r=this.opts.staticGrid||o&&n;if((t||r)&&(s._initDD&&(this._removeDD(e),delete s._initDD),r&&e.classList.add("ui-draggable-disabled","ui-resizable-disabled"),!t))return this;if(!s._initDD){let t,o;const n=(i,n)=>{this.triggerEvent(i,i.target),t=this.cellWidth(),o=this.getCellHeight(!0),this._onStartMoving(e,i,n,s,t,o)},r=(i,n)=>{this._dragOrResize(e,i,n,s,t,o)},a=t=>{this.placeholder.remove(),delete this.placeholder.gridstackNode,delete s._moving,delete s._resizing,delete s._event,delete s._lastTried;const o=s.w!==s._orig.w,n=t.target;if(n.gridstackNode&&n.gridstackNode.grid===this){if(s.el=n,s._isAboutToRemove){const i=e.gridstackNode.grid;i._gsEventHandler[t.type]&&i._gsEventHandler[t.type](t,n),i.engine.nodes.push(s),i.removeWidget(e,!0,!0)}else i.removePositioningStyles(n),s._temporaryRemoved?(this._writePosAttr(n,s),this.engine.addNode(s)):this._writePosAttr(n,s),this.triggerEvent(t,n);this._extraDragRow=0,this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate(),"resizestop"===t.type&&(Number.isInteger(s.sizeToContent)&&(s.sizeToContent=s.h),this.resizeToContentCheck(o,s))}};E.draggable(e,{start:n,stop:a,drag:r}).resizable(e,{start:n,stop:a,resize:r}),s._initDD=!0}return E.draggable(e,o?"disable":"enable").resizable(e,n?"disable":"enable"),this}_onStartMoving(e,t,s,o,n,r){if(this.engine.cleanNodes().beginUpdate(o),this._writePosAttr(this.placeholder,o),this.el.appendChild(this.placeholder),this.placeholder.gridstackNode=o,o.grid?.el)this.dragTransform=i.getValuesFromTransformedElement(e);else if(this.placeholder&&this.placeholder.closest(".grid-stack")){const e=this.placeholder.closest(".grid-stack");this.dragTransform=i.getValuesFromTransformedElement(e)}else this.dragTransform={xScale:1,xOffset:0,yScale:1,yOffset:0};if(o.el=this.placeholder,o._lastUiPosition=s.position,o._prevYPix=s.position.top,o._moving="dragstart"===t.type,o._resizing="resizestart"===t.type,delete o._lastTried,"dropover"===t.type&&o._temporaryRemoved&&(this.engine.addNode(o),o._moving=!0),this.engine.cacheRects(n,r,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),"resizestart"===t.type){const t=this.getColumn()-o.x,i=(this.opts.maxRow||Number.MAX_SAFE_INTEGER)-o.y;E.resizable(e,"option","minWidth",n*Math.min(o.minW||1,t)).resizable(e,"option","minHeight",r*Math.min(o.minH||1,i)).resizable(e,"option","maxWidth",n*Math.min(o.maxW||Number.MAX_SAFE_INTEGER,t)).resizable(e,"option","maxWidthMoveLeft",n*Math.min(o.maxW||Number.MAX_SAFE_INTEGER,o.x+o.w)).resizable(e,"option","maxHeight",r*Math.min(o.maxH||Number.MAX_SAFE_INTEGER,i)).resizable(e,"option","maxHeightMoveUp",r*Math.min(o.maxH||Number.MAX_SAFE_INTEGER,o.y+o.h))}}_dragOrResize(e,t,s,o,n,r){const a={...o._orig};let h,l=this.opts.marginLeft,d=this.opts.marginRight,c=this.opts.marginTop,g=this.opts.marginBottom;const u=Math.round(.1*r),p=Math.round(.1*n);if(l=Math.min(l,p),d=Math.min(d,p),c=Math.min(c,u),g=Math.min(g,u),"drag"===t.type){if(o._temporaryRemoved)return;const t=s.position.top-o._prevYPix;o._prevYPix=s.position.top,!1!==this.opts.draggable.scroll&&i.updateScrollPosition(e,s.position,t);const h=s.position.left+(s.position.left>o._lastUiPosition.left?-d:l),u=s.position.top+(s.position.top>o._lastUiPosition.top?-g:c);a.x=Math.round(h/n),a.y=Math.round(u/r);const p=this._extraDragRow;if(this.engine.collide(o,a)){const e=this.getRow();let t=Math.max(0,a.y+o.h-e);this.opts.maxRow&&e+t>this.opts.maxRow&&(t=Math.max(0,this.opts.maxRow-e)),this._extraDragRow=t}else this._extraDragRow=0;if(this._extraDragRow!==p&&this._updateContainerHeight(),o.x===a.x&&o.y===a.y)return}else if("resize"===t.type){if(a.x<0)return;if(i.updateScrollResize(t,e,r),a.w=Math.round((s.size.width-l)/n),a.h=Math.round((s.size.height-c)/r),o.w===a.w&&o.h===a.h)return;if(o._lastTried&&o._lastTried.w===a.w&&o._lastTried.h===a.h)return;const d=s.position.left+l,g=s.position.top+c;a.x=Math.round(d/n),a.y=Math.round(g/r),h=!0}o._event=t,o._lastTried=a;const m={x:s.position.left+l,y:s.position.top+c,w:(s.size?s.size.width:o.w*n)-l-d,h:(s.size?s.size.height:o.h*r)-c-g};if(this.engine.moveNodeCheck(o,{...a,cellWidth:n,cellHeight:r,rect:m,resizing:h})){o._lastUiPosition=s.position,this.engine.cacheRects(n,r,c,d,g,l),delete o._skipDown,h&&o.subGrid&&o.subGrid.onResize(),this._extraDragRow=0,this._updateContainerHeight();const e=t.target;o._sidebarOrig||this._writePosAttr(e,o),this.triggerEvent(t,e)}}triggerEvent(e,t){let i=this;for(;i.parentGridNode;)i=i.parentGridNode.grid;i._gsEventHandler[e.type]&&i._gsEventHandler[e.type](e,t)}_leave(e,t){const i=(t=t||e).gridstackNode;if(!i)return;if(t.style.transform=t.style.transformOrigin=null,E.off(e,"drag"),i._temporaryRemoved)return;i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&t?t:e;const s=i._sidebarOrig;i._isExternal&&this.engine.cleanupNode(i),i._sidebarOrig=s,!0===this.opts.removable&&x._itemRemoving(e,!0),e._gridstackNodeOrig?(e.gridstackNode=e._gridstackNodeOrig,delete e._gridstackNodeOrig):i._isExternal&&this.engine.restoreInitial()}}return x.renderCB=(e,t)=>{e&&t?.content&&(e.textContent=t.content)},x.resizeToContentParent=".grid-stack-item-content",x.Utils=i,x.Engine=s,x.GDRev="12.4.2",t.GridStack})())); //# sourceMappingURL=gridstack-all.js.map \ No newline at end of file diff --git a/node_modules/gridstack/dist/gridstack-all.js.LICENSE.txt b/node_modules/gridstack/dist/gridstack-all.js.LICENSE.txt index 49052fac2..a02961f24 100644 --- a/node_modules/gridstack/dist/gridstack-all.js.LICENSE.txt +++ b/node_modules/gridstack/dist/gridstack-all.js.LICENSE.txt @@ -1,5 +1,5 @@ /*! - * GridStack 12.3.3 + * GridStack 12.4.2 * https://gridstackjs.com/ * * Copyright (c) 2021-2025 Alain Dumesny diff --git a/node_modules/gridstack/dist/gridstack-all.js.map b/node_modules/gridstack/dist/gridstack-all.js.map index 4cf19f354..e58d8b6bb 100644 --- a/node_modules/gridstack/dist/gridstack-all.js.map +++ b/node_modules/gridstack/dist/gridstack-all.js.map @@ -1 +1 @@ -{"version":3,"file":"gridstack-all.js","mappings":"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","sources":["webpack://GridStack/webpack/universalModuleDefinition","webpack://GridStack/webpack/bootstrap","webpack://GridStack/webpack/runtime/define property getters","webpack://GridStack/webpack/runtime/hasOwnProperty shorthand","webpack://GridStack/./src/utils.ts","webpack://GridStack/./src/gridstack-engine.ts","webpack://GridStack/./src/types.ts","webpack://GridStack/./src/dd-manager.ts","webpack://GridStack/./src/dd-touch.ts","webpack://GridStack/./src/dd-resizable-handle.ts","webpack://GridStack/./src/dd-base-impl.ts","webpack://GridStack/./src/dd-resizable.ts","webpack://GridStack/./src/dd-draggable.ts","webpack://GridStack/./src/dd-droppable.ts","webpack://GridStack/./src/dd-element.ts","webpack://GridStack/./src/gridstack.ts","webpack://GridStack/./src/dd-gridstack.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GridStack\"] = factory();\n\telse\n\t\troot[\"GridStack\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\r\n * utils.ts 12.3.3\r\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { GridStackElement, GridStackNode, GridStackOptions, numberOrString, GridStackPosition, GridStackWidget } from './types';\r\n\r\nexport interface HeightData {\r\n h: number;\r\n unit: string;\r\n}\r\n\r\nexport interface DragTransform {\r\n xScale: number;\r\n yScale: number;\r\n xOffset: number;\r\n yOffset: number;\r\n}\r\n\r\n/**\r\n * @internal Checks for obsolete method names and provides deprecation warnings.\r\n * Creates a wrapper function that logs a deprecation warning when called.\r\n *\r\n * @param self the object context to apply the function to\r\n * @param f the new function to call\r\n * @param oldName the deprecated method name\r\n * @param newName the new method name to use instead\r\n * @param rev the version when the deprecation was introduced\r\n * @returns a wrapper function that warns about deprecation\r\n */\r\n// eslint-disable-next-line\r\nexport function obsolete(self, f, oldName: string, newName: string, rev: string): (...args: any[]) => any {\r\n const wrapper = (...args) => {\r\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n 'with `' + newName + '`. It will be **removed** in a future release');\r\n return f.apply(self, args);\r\n }\r\n wrapper.prototype = f.prototype;\r\n return wrapper;\r\n}\r\n\r\n/**\r\n * @internal Checks for obsolete grid options and migrates them to new names.\r\n * Automatically copies old option values to new option names and shows deprecation warnings.\r\n *\r\n * @param opts the options object to check and migrate\r\n * @param oldName the deprecated option name\r\n * @param newName the new option name to use instead\r\n * @param rev the version when the deprecation was introduced\r\n */\r\nexport function obsoleteOpts(opts: GridStackOptions, oldName: string, newName: string, rev: string): void {\r\n if (opts[oldName] !== undefined) {\r\n opts[newName] = opts[oldName];\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **removed** in a future release');\r\n }\r\n}\r\n\r\n/**\r\n * @internal Checks for obsolete grid options that have been completely removed.\r\n * Shows deprecation warnings for options that are no longer supported.\r\n *\r\n * @param opts the options object to check\r\n * @param oldName the removed option name\r\n * @param rev the version when the option was removed\r\n * @param info additional information about the removal\r\n */\r\nexport function obsoleteOptsDel(opts: GridStackOptions, oldName: string, rev: string, info: string): void {\r\n if (opts[oldName] !== undefined) {\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n }\r\n}\r\n\r\n/**\r\n * @internal Checks for obsolete HTML element attributes and migrates them.\r\n * Automatically copies old attribute values to new attribute names and shows deprecation warnings.\r\n *\r\n * @param el the HTML element to check and migrate\r\n * @param oldName the deprecated attribute name\r\n * @param newName the new attribute name to use instead\r\n * @param rev the version when the deprecation was introduced\r\n */\r\nexport function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string): void {\r\n const oldAttr = el.getAttribute(oldName);\r\n if (oldAttr !== null) {\r\n el.setAttribute(newName, oldAttr);\r\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **removed** in a future release');\r\n }\r\n}\r\n\r\n/**\r\n * Collection of utility methods used throughout GridStack.\r\n * These are general-purpose helper functions for DOM manipulation,\r\n * positioning calculations, object operations, and more.\r\n */\r\nexport class Utils {\r\n\r\n /**\r\n * Convert a potential selector into an actual list of HTML elements.\r\n * Supports CSS selectors, element references, and special ID handling.\r\n *\r\n * @param els selector string, HTMLElement, or array of elements\r\n * @param root optional root element to search within (defaults to document, useful for shadow DOM)\r\n * @returns array of HTML elements matching the selector\r\n *\r\n * @example\r\n * const elements = Utils.getElements('.grid-item');\r\n * const byId = Utils.getElements('#myWidget');\r\n * const fromShadow = Utils.getElements('.item', shadowRoot);\r\n */\r\n static getElements(els: GridStackElement, root: HTMLElement | Document = document): HTMLElement[] {\r\n if (typeof els === 'string') {\r\n const doc = ('getElementById' in root) ? root as Document : undefined;\r\n\r\n // Note: very common for people use to id='1,2,3' which is only legal as HTML5 id, but not CSS selectors\r\n // so if we start with a number, assume it's an id and just return that one item...\r\n // see https://github.com/gridstack/gridstack.js/issues/2234#issuecomment-1523796562\r\n if (doc && !isNaN(+els[0])) { // start with digit\r\n const el = doc.getElementById(els);\r\n return el ? [el] : [];\r\n }\r\n\r\n let list = root.querySelectorAll(els);\r\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n list = root.querySelectorAll('.' + els);\r\n if (!list.length) { list = root.querySelectorAll('#' + els) }\r\n }\r\n return Array.from(list) as HTMLElement[];\r\n }\r\n return [els];\r\n }\r\n\r\n /**\r\n * Convert a potential selector into a single HTML element.\r\n * Similar to getElements() but returns only the first match.\r\n *\r\n * @param els selector string or HTMLElement\r\n * @param root optional root element to search within (defaults to document)\r\n * @returns the first HTML element matching the selector, or null if not found\r\n *\r\n * @example\r\n * const element = Utils.getElement('#myWidget');\r\n * const first = Utils.getElement('.grid-item');\r\n */\r\n static getElement(els: GridStackElement, root: HTMLElement | Document = document): HTMLElement {\r\n if (typeof els === 'string') {\r\n const doc = ('getElementById' in root) ? root as Document : undefined;\r\n if (!els.length) return null;\r\n if (doc && els[0] === '#') {\r\n return doc.getElementById(els.substring(1));\r\n }\r\n if (els[0] === '#' || els[0] === '.' || els[0] === '[') {\r\n return root.querySelector(els);\r\n }\r\n\r\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n if (doc && !isNaN(+els[0])) { // start with digit\r\n return doc.getElementById(els);\r\n }\r\n\r\n // finally try string, then id, then class\r\n let el = root.querySelector(els);\r\n if (doc && !el) { el = doc.getElementById(els) }\r\n if (!el) { el = root.querySelector('.' + els) }\r\n return el as HTMLElement;\r\n }\r\n return els;\r\n }\r\n\r\n /**\r\n * Check if a widget should be lazy loaded based on node or grid settings.\r\n *\r\n * @param n the grid node to check\r\n * @returns true if the item should be lazy loaded\r\n *\r\n * @example\r\n * if (Utils.lazyLoad(node)) {\r\n * // Set up intersection observer for lazy loading\r\n * }\r\n */\r\n static lazyLoad(n: GridStackNode): boolean {\r\n return n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false;\r\n }\r\n\r\n /**\r\n * Create a div element with the specified CSS classes.\r\n *\r\n * @param classes array of CSS class names to add\r\n * @param parent optional parent element to append the div to\r\n * @returns the created div element\r\n *\r\n * @example\r\n * const div = Utils.createDiv(['grid-item', 'draggable']);\r\n * const nested = Utils.createDiv(['content'], parentDiv);\r\n */\r\n static createDiv(classes: string[], parent?: HTMLElement): HTMLElement {\r\n const el = document.createElement('div');\r\n classes.forEach(c => {if (c) el.classList.add(c)});\r\n parent?.appendChild(el);\r\n return el;\r\n }\r\n\r\n /**\r\n * Check if a widget should resize to fit its content.\r\n *\r\n * @param n the grid node to check (can be undefined)\r\n * @param strict if true, only returns true for explicit sizeToContent:true (not numbers)\r\n * @returns true if the widget should resize to content\r\n *\r\n * @example\r\n * if (Utils.shouldSizeToContent(node)) {\r\n * // Trigger content-based resizing\r\n * }\r\n */\r\n static shouldSizeToContent(n: GridStackNode | undefined, strict = false): boolean {\r\n return n?.grid && (strict ?\r\n (n.sizeToContent === true || (n.grid.opts.sizeToContent === true && n.sizeToContent === undefined)) :\r\n (!!n.sizeToContent || (n.grid.opts.sizeToContent && n.sizeToContent !== false)));\r\n }\r\n\r\n /**\r\n * Check if two grid positions overlap/intersect.\r\n *\r\n * @param a first position with x, y, w, h properties\r\n * @param b second position with x, y, w, h properties\r\n * @returns true if the positions overlap\r\n *\r\n * @example\r\n * const overlaps = Utils.isIntercepted(\r\n * {x: 0, y: 0, w: 2, h: 1},\r\n * {x: 1, y: 0, w: 2, h: 1}\r\n * ); // true - they overlap\r\n */\r\n static isIntercepted(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);\r\n }\r\n\r\n /**\r\n * Check if two grid positions are touching (edges or corners).\r\n *\r\n * @param a first position\r\n * @param b second position\r\n * @returns true if the positions are touching\r\n *\r\n * @example\r\n * const touching = Utils.isTouching(\r\n * {x: 0, y: 0, w: 2, h: 1},\r\n * {x: 2, y: 0, w: 1, h: 1}\r\n * ); // true - they share an edge\r\n */\r\n static isTouching(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return Utils.isIntercepted(a, {x: b.x-0.5, y: b.y-0.5, w: b.w+1, h: b.h+1})\r\n }\r\n\r\n /**\r\n * Calculate the overlapping area between two grid positions.\r\n *\r\n * @param a first position\r\n * @param b second position\r\n * @returns the area of overlap (0 if no overlap)\r\n *\r\n * @example\r\n * const overlap = Utils.areaIntercept(\r\n * {x: 0, y: 0, w: 3, h: 2},\r\n * {x: 1, y: 0, w: 3, h: 2}\r\n * ); // returns 4 (2x2 overlap)\r\n */\r\n static areaIntercept(a: GridStackPosition, b: GridStackPosition): number {\r\n const x0 = (a.x > b.x) ? a.x : b.x;\r\n const x1 = (a.x+a.w < b.x+b.w) ? a.x+a.w : b.x+b.w;\r\n if (x1 <= x0) return 0; // no overlap\r\n const y0 = (a.y > b.y) ? a.y : b.y;\r\n const y1 = (a.y+a.h < b.y+b.h) ? a.y+a.h : b.y+b.h;\r\n if (y1 <= y0) return 0; // no overlap\r\n return (x1-x0) * (y1-y0);\r\n }\r\n\r\n /**\r\n * Calculate the total area of a grid position.\r\n *\r\n * @param a position with width and height\r\n * @returns the total area (width * height)\r\n *\r\n * @example\r\n * const area = Utils.area({x: 0, y: 0, w: 3, h: 2}); // returns 6\r\n */\r\n static area(a: GridStackPosition): number {\r\n return a.w * a.h;\r\n }\r\n\r\n /**\r\n * Sort an array of grid nodes by position (y first, then x).\r\n *\r\n * @param nodes array of nodes to sort\r\n * @param dir sort direction: 1 for ascending (top-left first), -1 for descending\r\n * @returns the sorted array (modifies original)\r\n *\r\n * @example\r\n * const sorted = Utils.sort(nodes); // Sort top-left to bottom-right\r\n * const reverse = Utils.sort(nodes, -1); // Sort bottom-right to top-left\r\n */\r\n static sort(nodes: GridStackNode[], dir: 1 | -1 = 1): GridStackNode[] {\r\n const und = 10000;\r\n return nodes.sort((a, b) => {\r\n const diffY = dir * ((a.y ?? und) - (b.y ?? und));\r\n if (diffY === 0) return dir * ((a.x ?? und) - (b.x ?? und));\r\n return diffY;\r\n });\r\n }\r\n\r\n /**\r\n * Find a grid node by its ID.\r\n *\r\n * @param nodes array of nodes to search\r\n * @param id the ID to search for\r\n * @returns the node with matching ID, or undefined if not found\r\n *\r\n * @example\r\n * const node = Utils.find(nodes, 'widget-1');\r\n * if (node) console.log('Found node at:', node.x, node.y);\r\n */\r\n static find(nodes: GridStackNode[], id: string): GridStackNode | undefined {\r\n return id ? nodes.find(n => n.id === id) : undefined;\r\n }\r\n\r\n /**\r\n * Convert various value types to boolean.\r\n * Handles strings like 'false', 'no', '0' as false.\r\n *\r\n * @param v value to convert\r\n * @returns boolean representation\r\n *\r\n * @example\r\n * Utils.toBool('true'); // true\r\n * Utils.toBool('false'); // false\r\n * Utils.toBool('no'); // false\r\n * Utils.toBool('1'); // true\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static toBool(v: unknown): boolean {\r\n if (typeof v === 'boolean') {\r\n return v;\r\n }\r\n if (typeof v === 'string') {\r\n v = v.toLowerCase();\r\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n }\r\n return Boolean(v);\r\n }\r\n\r\n /**\r\n * Convert a string value to a number, handling null and empty strings.\r\n *\r\n * @param value string or null value to convert\r\n * @returns number value, or undefined for null/empty strings\r\n *\r\n * @example\r\n * Utils.toNumber('42'); // 42\r\n * Utils.toNumber(''); // undefined\r\n * Utils.toNumber(null); // undefined\r\n */\r\n static toNumber(value: null | string): number {\r\n return (value === null || value.length === 0) ? undefined : Number(value);\r\n }\r\n\r\n /**\r\n * Parse a height value with units into numeric value and unit string.\r\n * Supports px, em, rem, vh, vw, %, cm, mm units.\r\n *\r\n * @param val height value as number or string with units\r\n * @returns object with h (height) and unit properties\r\n *\r\n * @example\r\n * Utils.parseHeight('100px'); // {h: 100, unit: 'px'}\r\n * Utils.parseHeight('2rem'); // {h: 2, unit: 'rem'}\r\n * Utils.parseHeight(50); // {h: 50, unit: 'px'}\r\n */\r\n static parseHeight(val: numberOrString): HeightData {\r\n let h: number;\r\n let unit = 'px';\r\n if (typeof val === 'string') {\r\n if (val === 'auto' || val === '') h = 0;\r\n else {\r\n const match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%|cm|mm)?$/);\r\n if (!match) {\r\n throw new Error(`Invalid height val = ${val}`);\r\n }\r\n unit = match[2] || 'px';\r\n h = parseFloat(match[1]);\r\n }\r\n } else {\r\n h = val;\r\n }\r\n return { h, unit };\r\n }\r\n\r\n /**\r\n * Copy unset fields from source objects to target object (shallow merge with defaults).\r\n * Similar to Object.assign but only sets undefined/null fields.\r\n *\r\n * @param target the object to copy defaults into\r\n * @param sources one or more source objects to copy defaults from\r\n * @returns the modified target object\r\n *\r\n * @example\r\n * const config = { width: 100 };\r\n * Utils.defaults(config, { width: 200, height: 50 });\r\n * // config is now { width: 100, height: 50 }\r\n */\r\n // eslint-disable-next-line\r\n static defaults(target, ...sources): {} {\r\n\r\n sources.forEach(source => {\r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key)) return;\r\n if (target[key] === null || target[key] === undefined) {\r\n target[key] = source[key];\r\n } else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n // property is an object, recursively add it's field over... #1373\r\n Utils.defaults(target[key], source[key]);\r\n }\r\n }\r\n });\r\n\r\n return target;\r\n }\r\n\r\n /**\r\n * Compare two objects for equality (shallow comparison).\r\n * Checks if objects have the same fields and values at one level deep.\r\n *\r\n * @param a first object to compare\r\n * @param b second object to compare\r\n * @returns true if objects have the same values\r\n *\r\n * @example\r\n * Utils.same({x: 1, y: 2}, {x: 1, y: 2}); // true\r\n * Utils.same({x: 1}, {x: 1, y: 2}); // false\r\n */\r\n static same(a: unknown, b: unknown): boolean {\r\n if (typeof a !== 'object') return a == b;\r\n if (typeof a !== typeof b) return false;\r\n // else we have object, check just 1 level deep for being same things...\r\n if (Object.keys(a).length !== Object.keys(b).length) return false;\r\n for (const key in a) {\r\n if (a[key] !== b[key]) return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Copy position and size properties from one widget to another.\r\n * Copies x, y, w, h and optionally min/max constraints.\r\n *\r\n * @param a target widget to copy to\r\n * @param b source widget to copy from\r\n * @param doMinMax if true, also copy min/max width/height constraints\r\n * @returns the target widget (a)\r\n *\r\n * @example\r\n * Utils.copyPos(widget1, widget2); // Copy position/size\r\n * Utils.copyPos(widget1, widget2, true); // Also copy constraints\r\n */\r\n static copyPos(a: GridStackWidget, b: GridStackWidget, doMinMax = false): GridStackWidget {\r\n if (b.x !== undefined) a.x = b.x;\r\n if (b.y !== undefined) a.y = b.y;\r\n if (b.w !== undefined) a.w = b.w;\r\n if (b.h !== undefined) a.h = b.h;\r\n if (doMinMax) {\r\n if (b.minW) a.minW = b.minW;\r\n if (b.minH) a.minH = b.minH;\r\n if (b.maxW) a.maxW = b.maxW;\r\n if (b.maxH) a.maxH = b.maxH;\r\n }\r\n return a;\r\n }\r\n\r\n /** true if a and b has same size & position */\r\n static samePos(a: GridStackPosition, b: GridStackPosition): boolean {\r\n return a && b && a.x === b.x && a.y === b.y && (a.w || 1) === (b.w || 1) && (a.h || 1) === (b.h || 1);\r\n }\r\n\r\n /** given a node, makes sure it's min/max are valid */\r\n static sanitizeMinMax(node: GridStackNode) {\r\n // remove 0, undefine, null\r\n if (!node.minW) { delete node.minW; }\r\n if (!node.minH) { delete node.minH; }\r\n if (!node.maxW) { delete node.maxW; }\r\n if (!node.maxH) { delete node.maxH; }\r\n }\r\n\r\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\r\n static removeInternalAndSame(a: unknown, b: unknown):void {\r\n if (typeof a !== 'object' || typeof b !== 'object') return;\r\n // skip arrays as we don't know how to hydrate them (unlike object spread operator)\r\n if (Array.isArray(a) || Array.isArray(b)) return;\r\n for (let key in a) {\r\n const aVal = a[key];\r\n const bVal = b[key];\r\n if (key[0] === '_' || aVal === bVal) {\r\n delete a[key]\r\n } else if (aVal && typeof aVal === 'object' && bVal !== undefined) {\r\n Utils.removeInternalAndSame(aVal, bVal);\r\n if (!Object.keys(aVal).length) { delete a[key] }\r\n }\r\n }\r\n }\r\n\r\n /** removes internal fields '_' and default values for saving */\r\n static removeInternalForSave(n: GridStackNode, removeEl = true): void {\r\n for (let key in n) { if (key[0] === '_' || n[key] === null || n[key] === undefined ) delete n[key]; }\r\n delete n.grid;\r\n if (removeEl) delete n.el;\r\n // delete default values (will be re-created on read)\r\n if (!n.autoPosition) delete n.autoPosition;\r\n if (!n.noResize) delete n.noResize;\r\n if (!n.noMove) delete n.noMove;\r\n if (!n.locked) delete n.locked;\r\n if (n.w === 1 || n.w === n.minW) delete n.w;\r\n if (n.h === 1 || n.h === n.minH) delete n.h;\r\n }\r\n\r\n /** return the closest parent (or itself) matching the given class */\r\n // static closestUpByClass(el: HTMLElement, name: string): HTMLElement {\r\n // while (el) {\r\n // if (el.classList.contains(name)) return el;\r\n // el = el.parentElement\r\n // }\r\n // return null;\r\n // }\r\n\r\n /** delay calling the given function for given delay, preventing new calls from happening while waiting */\r\n static throttle(func: () => void, delay: number): () => void {\r\n let isWaiting = false;\r\n return (...args) => {\r\n if (!isWaiting) {\r\n isWaiting = true;\r\n setTimeout(() => { func(...args); isWaiting = false; }, delay);\r\n }\r\n }\r\n }\r\n\r\n static removePositioningStyles(el: HTMLElement): void {\r\n const style = el.style;\r\n if (style.position) {\r\n style.removeProperty('position');\r\n }\r\n if (style.left) {\r\n style.removeProperty('left');\r\n }\r\n if (style.top) {\r\n style.removeProperty('top');\r\n }\r\n if (style.width) {\r\n style.removeProperty('width');\r\n }\r\n if (style.height) {\r\n style.removeProperty('height');\r\n }\r\n }\r\n\r\n /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */\r\n static getScrollElement(el?: HTMLElement): HTMLElement {\r\n if (!el) return document.scrollingElement as HTMLElement || document.documentElement; // IE support\r\n const style = getComputedStyle(el);\r\n const overflowRegex = /(auto|scroll)/;\r\n\r\n if (overflowRegex.test(style.overflow + style.overflowY)) {\r\n return el;\r\n } else {\r\n return Utils.getScrollElement(el.parentElement);\r\n }\r\n }\r\n\r\n /** @internal */\r\n static updateScrollPosition(el: HTMLElement, position: {top: number}, distance: number): void {\r\n const scrollEl = Utils.getScrollElement(el);\r\n if (!scrollEl) return;\r\n\r\n const elRect = el.getBoundingClientRect();\r\n const scrollRect = scrollEl.getBoundingClientRect();\r\n const innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n\r\n const offsetDiffDown = elRect.bottom - Math.min(scrollRect.bottom, innerHeightOrClientHeight);\r\n const offsetDiffUp = elRect.top - Math.max(scrollRect.top, 0);\r\n const prevScroll = scrollEl.scrollTop;\r\n\r\n if (offsetDiffUp < 0 && distance < 0) {\r\n // scroll up\r\n if (el.offsetHeight > scrollRect.height) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n }\r\n } else if (offsetDiffDown > 0 && distance > 0) {\r\n // scroll down\r\n if (el.offsetHeight > scrollRect.height) {\r\n scrollEl.scrollTop += distance;\r\n } else {\r\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n }\r\n }\r\n\r\n position.top += scrollEl.scrollTop - prevScroll;\r\n }\r\n\r\n /**\r\n * @internal Function used to scroll the page.\r\n *\r\n * @param event `MouseEvent` that triggers the resize\r\n * @param el `HTMLElement` that's being resized\r\n * @param distance Distance from the V edges to start scrolling\r\n */\r\n static updateScrollResize(event: MouseEvent, el: HTMLElement, distance: number): void {\r\n const scrollEl = Utils.getScrollElement(el);\r\n const height = scrollEl.clientHeight;\r\n // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top\r\n // #1745 Special situation if scrollEl is document 'html': here browser spec states that\r\n // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;\r\n // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.\r\n const offsetTop = (scrollEl === Utils.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;\r\n const pointerPosY = event.clientY - offsetTop;\r\n const top = pointerPosY < distance;\r\n const bottom = pointerPosY > height - distance;\r\n\r\n if (top) {\r\n // This also can be done with a timeout to keep scrolling while the mouse is\r\n // in the scrolling zone. (will have smoother behavior)\r\n scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance});\r\n } else if (bottom) {\r\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY)});\r\n }\r\n }\r\n\r\n /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */\r\n static clone(obj: T): T {\r\n if (obj === null || obj === undefined || typeof(obj) !== 'object') {\r\n return obj;\r\n }\r\n // return Object.assign({}, obj);\r\n if (obj instanceof Array) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return [...obj] as any;\r\n }\r\n return {...obj};\r\n }\r\n\r\n /**\r\n * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.\r\n * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.\r\n */\r\n static cloneDeep(obj: T): T {\r\n // list of fields we will skip during cloneDeep (nested objects, other internal)\r\n const skipFields = ['parentGrid', 'el', 'grid', 'subGrid', 'engine'];\r\n // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?\r\n const ret = Utils.clone(obj);\r\n for (const key in ret) {\r\n // NOTE: we don't support function/circular dependencies so skip those properties for now...\r\n if (ret.hasOwnProperty(key) && typeof(ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(k => k === key)) {\r\n ret[key] = Utils.cloneDeep(obj[key]);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /** deep clone the given HTML node, removing teh unique id field */\r\n public static cloneNode(el: HTMLElement): HTMLElement {\r\n const node = el.cloneNode(true) as HTMLElement;\r\n node.removeAttribute('id');\r\n return node;\r\n }\r\n\r\n public static appendTo(el: HTMLElement, parent: string | HTMLElement): void {\r\n let parentNode: HTMLElement;\r\n if (typeof parent === 'string') {\r\n parentNode = Utils.getElement(parent);\r\n } else {\r\n parentNode = parent;\r\n }\r\n if (parentNode) {\r\n parentNode.appendChild(el);\r\n }\r\n }\r\n\r\n // public static setPositionRelative(el: HTMLElement): void {\r\n // if (!(/^(?:r|a|f)/).test(getComputedStyle(el).position)) {\r\n // el.style.position = \"relative\";\r\n // }\r\n // }\r\n\r\n public static addElStyles(el: HTMLElement, styles: { [prop: string]: string | string[] }): void {\r\n if (styles instanceof Object) {\r\n for (const s in styles) {\r\n if (styles.hasOwnProperty(s)) {\r\n if (Array.isArray(styles[s])) {\r\n // support fallback value\r\n (styles[s] as string[]).forEach(val => {\r\n el.style[s] = val;\r\n });\r\n } else {\r\n el.style[s] = styles[s];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public static initEvent(e: DragEvent | MouseEvent, info: { type: string; target?: EventTarget }): T {\r\n const evt = { type: info.type };\r\n const obj = {\r\n button: 0,\r\n which: 0,\r\n buttons: 1,\r\n bubbles: true,\r\n cancelable: true,\r\n target: info.target ? info.target : e.target\r\n };\r\n ['altKey','ctrlKey','metaKey','shiftKey'].forEach(p => evt[p] = e[p]); // keys\r\n ['pageX','pageY','clientX','clientY','screenX','screenY'].forEach(p => evt[p] = e[p]); // point info\r\n return {...evt, ...obj} as unknown as T;\r\n }\r\n\r\n /** copies the MouseEvent (or convert Touch) properties and sends it as another event to the given target */\r\n public static simulateMouseEvent(e: MouseEvent | Touch, simulatedType: string, target?: EventTarget): void {\r\n const me = e as MouseEvent;\r\n const simulatedEvent = new MouseEvent(simulatedType, {\r\n bubbles: true,\r\n composed: true,\r\n cancelable: true,\r\n view: window,\r\n detail: 1,\r\n screenX: e.screenX,\r\n screenY: e.screenY,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n ctrlKey: me.ctrlKey??false,\r\n altKey: me.altKey??false,\r\n shiftKey: me.shiftKey??false,\r\n metaKey: me.metaKey??false,\r\n button: 0,\r\n relatedTarget: e.target\r\n });\r\n\r\n (target || e.target).dispatchEvent(simulatedEvent);\r\n }\r\n\r\n /**\r\n * defines an element that is used to get the offset and scale from grid transforms\r\n * returns the scale and offsets from said element\r\n */\r\n public static getValuesFromTransformedElement(parent: HTMLElement): DragTransform {\r\n const transformReference = document.createElement('div');\r\n Utils.addElStyles(transformReference, {\r\n opacity: '0',\r\n position: 'fixed',\r\n top: 0 + 'px',\r\n left: 0 + 'px',\r\n width: '1px',\r\n height: '1px',\r\n zIndex: '-999999',\r\n });\r\n parent.appendChild(transformReference);\r\n const transformValues = transformReference.getBoundingClientRect();\r\n parent.removeChild(transformReference);\r\n transformReference.remove();\r\n return {\r\n xScale: 1 / transformValues.width,\r\n yScale: 1 / transformValues.height,\r\n xOffset: transformValues.left,\r\n yOffset: transformValues.top,\r\n }\r\n }\r\n\r\n /** swap the given object 2 field values */\r\n public static swap(o: unknown, a: string, b: string): void {\r\n if (!o) return;\r\n const tmp = o[a]; o[a] = o[b]; o[b] = tmp;\r\n }\r\n\r\n /** returns true if event is inside the given element rectangle */\r\n // Note: Safari Mac has null event.relatedTarget which causes #1684 so check if DragEvent is inside the coordinates instead\r\n // Utils.el.contains(event.relatedTarget as HTMLElement)\r\n // public static inside(e: MouseEvent, el: HTMLElement): boolean {\r\n // // srcElement, toElement, target: all set to placeholder when leaving simple grid, so we can't use that (Chrome)\r\n // const target: HTMLElement = e.relatedTarget || (e as any).fromElement;\r\n // if (!target) {\r\n // const { bottom, left, right, top } = el.getBoundingClientRect();\r\n // return (e.x < right && e.x > left && e.y < bottom && e.y > top);\r\n // }\r\n // return el.contains(target);\r\n // }\r\n\r\n /** true if the item can be rotated (checking for prop, not space available) */\r\n public static canBeRotated(n: GridStackNode): boolean {\r\n return !(!n || n.w === n.h || n.locked || n.noResize || n.grid?.opts.disableResize || (n.minW && n.minW === n.maxW) || (n.minH && n.minH === n.maxH));\r\n }\r\n}","/**\n * gridstack-engine.ts 12.3.3\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n\nimport { Utils } from './utils';\nimport { GridStackNode, ColumnOptions, GridStackPosition, GridStackMoveOpts, SaveFcn, CompactOptions } from './types';\n\n/** callback to update the DOM attributes since this class is generic (no HTML or other info) for items that changed - see _notify() */\ntype OnChangeCB = (nodes: GridStackNode[]) => void;\n\n/** options used during creation - similar to GridStackOptions */\nexport interface GridStackEngineOptions {\n column?: number;\n maxRow?: number;\n float?: boolean;\n nodes?: GridStackNode[];\n onChange?: OnChangeCB;\n}\n\n/**\n * Defines the GridStack engine that handles all grid layout calculations and node positioning.\n * This is the core engine that performs grid manipulation without any DOM operations.\n *\n * The engine manages:\n * - Node positioning and collision detection\n * - Layout algorithms (compact, float, etc.)\n * - Grid resizing and column changes\n * - Widget movement and resizing logic\n *\n * NOTE: Values should not be modified directly - use the main GridStack API instead\n * to ensure proper DOM updates and event triggers.\n */\nexport class GridStackEngine {\n public column: number;\n public maxRow: number;\n public nodes: GridStackNode[];\n public addedNodes: GridStackNode[] = [];\n public removedNodes: GridStackNode[] = [];\n public batchMode: boolean;\n public defaultColumn = 12;\n /** @internal callback to update the DOM attributes */\n protected onChange: OnChangeCB;\n /** @internal */\n protected _float: boolean;\n /** @internal */\n protected _prevFloat: boolean;\n /** @internal cached layouts of difference column count so we can restore back (eg 12 -> 1 -> 12) */\n protected _layouts?: GridStackNode[][]; // maps column # to array of values nodes\n /** @internal set during loading (which is sorted) so item gets added AFTER collision nodes */\n public _loading?: boolean\n /** @internal true while we are resizing widgets during column resize to skip certain parts */\n protected _inColumnResize?: boolean;\n /** true when grid.load() already cached the layout and can skip out of bound caching info */\n public skipCacheUpdate?: boolean;\n /** @internal true if we have some items locked */\n protected _hasLocked: boolean;\n /** @internal unique global internal _id counter */\n public static _idSeq = 0;\n\n public constructor(opts: GridStackEngineOptions = {}) {\n this.column = opts.column || this.defaultColumn;\n if (this.column > this.defaultColumn) this.defaultColumn = this.column;\n this.maxRow = opts.maxRow;\n this._float = opts.float;\n this.nodes = opts.nodes || [];\n this.onChange = opts.onChange;\n }\n\n /**\n * Enable/disable batch mode for multiple operations to optimize performance.\n * When enabled, layout updates are deferred until batch mode is disabled.\n *\n * @param flag true to enable batch mode, false to disable and apply changes\n * @param doPack if true (default), pack/compact nodes when disabling batch mode\n * @returns the engine instance for chaining\n *\n * @example\n * // Start batch mode for multiple operations\n * engine.batchUpdate(true);\n * engine.addNode(node1);\n * engine.addNode(node2);\n * engine.batchUpdate(false); // Apply all changes at once\n */\n public batchUpdate(flag = true, doPack = true): GridStackEngine {\n if (!!this.batchMode === flag) return this;\n this.batchMode = flag;\n if (flag) {\n this._prevFloat = this._float;\n this._float = true; // let things go anywhere for now... will restore and possibly reposition later\n this.cleanNodes();\n this.saveInitial(); // since begin update (which is called multiple times) won't do this\n } else {\n this._float = this._prevFloat;\n delete this._prevFloat;\n if (doPack) this._packNodes();\n this._notify();\n }\n return this;\n }\n\n // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip\n protected _useEntireRowArea(node: GridStackNode, nn: GridStackPosition): boolean {\n return (!this.float || this.batchMode && !this._prevFloat) && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);\n }\n\n /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.\n * return true if we moved. */\n protected _fixCollisions(node: GridStackNode, nn = node, collide?: GridStackNode, opt: GridStackMoveOpts = {}): boolean {\n this.sortNodes(-1); // from last to first, so recursive collision move items in the right order\n\n collide = collide || this.collide(node, nn); // REAL area collide for swap and skip if none...\n if (!collide) return false;\n\n // swap check: if we're actively moving in gravity mode, see if we collide with an object the same size\n if (node._moving && !opt.nested && !this.float) {\n if (this.swap(node, collide)) return true;\n }\n\n // during while() collisions MAKE SURE to check entire row so larger items don't leap frog small ones (push them all down starting last in grid)\n let area = nn;\n if (!this._loading && this._useEntireRowArea(node, nn)) {\n area = {x: 0, w: this.column, y: nn.y, h: nn.h};\n collide = this.collide(node, area, opt.skip); // force new hit\n }\n\n let didMove = false;\n const newOpt: GridStackMoveOpts = {nested: true, pack: false};\n let counter = 0;\n while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each\n if (counter++ > this.nodes.length * 2) {\n throw new Error(\"Infinite collide check\");\n }\n let moved: boolean;\n // if colliding with a locked item OR loading (move after) OR moving down with top gravity (and collide could move up) -> skip past the collide,\n // but remember that skip down so we only do this once (and push others otherwise).\n if (collide.locked || this._loading || node._moving && !node._skipDown && nn.y > node.y && !this.float &&\n // can take space we had, or before where we're going\n (!this.collide(collide, {...collide, y: node.y}, node) || !this.collide(collide, {...collide, y: nn.y - collide.h}, node))) {\n\n node._skipDown = (node._skipDown || nn.y > node.y);\n const newNN = {...nn, y: collide.y + collide.h, ...newOpt};\n // pretent we moved to where we are now so we can continue any collision checks #2492\n moved = this._loading && Utils.samePos(node, newNN) ? true : this.moveNode(node, newNN);\n\n if ((collide.locked || this._loading) && moved) {\n Utils.copyPos(nn, node); // moving after lock become our new desired location\n } else if (!collide.locked && moved && opt.pack) {\n // we moved after and will pack: do it now and keep the original drop location, but past the old collide to see what else we might push way\n this._packNodes();\n nn.y = collide.y + collide.h;\n Utils.copyPos(node, nn);\n }\n didMove = didMove || moved;\n } else {\n // move collide down *after* where we will be, ignoring where we are now (don't collide with us)\n moved = this.moveNode(collide, {...collide, y: nn.y + nn.h, skip: node, ...newOpt});\n }\n\n if (!moved) return didMove; // break inf loop if we couldn't move after all (ex: maxRow, fixed)\n\n collide = undefined;\n }\n return didMove;\n }\n\n /**\n * Return the first node that intercepts/collides with the given node or area.\n * Used for collision detection during drag and drop operations.\n *\n * @param skip the node to skip in collision detection (usually the node being moved)\n * @param area the area to check for collisions (defaults to skip node's area)\n * @param skip2 optional second node to skip in collision detection\n * @returns the first colliding node, or undefined if no collision\n *\n * @example\n * const colliding = engine.collide(draggedNode, {x: 2, y: 1, w: 2, h: 1});\n * if (colliding) {\n * console.log('Would collide with:', colliding.id);\n * }\n */\n public collide(skip: GridStackNode, area = skip, skip2?: GridStackNode): GridStackNode | undefined {\n const skipId = skip._id;\n const skip2Id = skip2?._id;\n return this.nodes.find(n => n._id !== skipId && n._id !== skip2Id && Utils.isIntercepted(n, area));\n }\n /**\n * Return all nodes that intercept/collide with the given node or area.\n * Similar to collide() but returns all colliding nodes instead of just the first.\n *\n * @param skip the node to skip in collision detection\n * @param area the area to check for collisions (defaults to skip node's area)\n * @param skip2 optional second node to skip in collision detection\n * @returns array of all colliding nodes\n *\n * @example\n * const allCollisions = engine.collideAll(draggedNode);\n * console.log('Colliding with', allCollisions.length, 'nodes');\n */\n public collideAll(skip: GridStackNode, area = skip, skip2?: GridStackNode): GridStackNode[] {\n const skipId = skip._id;\n const skip2Id = skip2?._id;\n return this.nodes.filter(n => n._id !== skipId && n._id !== skip2Id && Utils.isIntercepted(n, area));\n }\n\n /** does a pixel coverage collision based on where we started, returning the node that has the most coverage that is >50% mid line */\n protected directionCollideCoverage(node: GridStackNode, o: GridStackMoveOpts, collides: GridStackNode[]): GridStackNode | undefined {\n if (!o.rect || !node._rect) return;\n const r0 = node._rect; // where started\n const r = {...o.rect}; // where we are\n\n // update dragged rect to show where it's coming from (above or below, etc...)\n if (r.y > r0.y) {\n r.h += r.y - r0.y;\n r.y = r0.y;\n } else {\n r.h += r0.y - r.y;\n }\n if (r.x > r0.x) {\n r.w += r.x - r0.x;\n r.x = r0.x;\n } else {\n r.w += r0.x - r.x;\n }\n\n let collide: GridStackNode;\n let overMax = 0.5; // need >50%\n for (let n of collides) {\n if (n.locked || !n._rect) {\n break;\n }\n const r2 = n._rect; // overlapping target\n let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE;\n // depending on which side we started from, compute the overlap % of coverage\n // (ex: from above/below we only compute the max horizontal line coverage)\n if (r0.y < r2.y) { // from above\n yOver = ((r.y + r.h) - r2.y) / r2.h;\n } else if (r0.y + r0.h > r2.y + r2.h) { // from below\n yOver = ((r2.y + r2.h) - r.y) / r2.h;\n }\n if (r0.x < r2.x) { // from the left\n xOver = ((r.x + r.w) - r2.x) / r2.w;\n } else if (r0.x + r0.w > r2.x + r2.w) { // from the right\n xOver = ((r2.x + r2.w) - r.x) / r2.w;\n }\n const over = Math.min(xOver, yOver);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n }\n o.collide = collide; // save it so we don't have to find it again\n return collide;\n }\n\n /** does a pixel coverage returning the node that has the most coverage by area */\n /*\n protected collideCoverage(r: GridStackPosition, collides: GridStackNode[]): {collide: GridStackNode, over: number} {\n const collide: GridStackNode;\n const overMax = 0;\n collides.forEach(n => {\n if (n.locked || !n._rect) return;\n const over = Utils.areaIntercept(r, n._rect);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n });\n return {collide, over: overMax};\n }\n */\n\n /**\n * Cache the pixel rectangles for all nodes used for collision detection during drag operations.\n * This optimization converts grid coordinates to pixel coordinates for faster collision detection.\n *\n * @param w width of a single grid cell in pixels\n * @param h height of a single grid cell in pixels\n * @param top top margin/padding in pixels\n * @param right right margin/padding in pixels\n * @param bottom bottom margin/padding in pixels\n * @param left left margin/padding in pixels\n * @returns the engine instance for chaining\n *\n * @internal This is typically called by GridStack during resize events\n */\n public cacheRects(w: number, h: number, top: number, right: number, bottom: number, left: number): GridStackEngine\n {\n this.nodes.forEach(n =>\n n._rect = {\n y: n.y * h + top,\n x: n.x * w + left,\n w: n.w * w - left - right,\n h: n.h * h - top - bottom\n }\n );\n return this;\n }\n\n /**\n * Attempt to swap the positions of two nodes if they meet swapping criteria.\n * Nodes can swap if they are the same size or in the same column/row, not locked, and touching.\n *\n * @param a first node to swap\n * @param b second node to swap\n * @returns true if swap was successful, false if not possible, undefined if not applicable\n *\n * @example\n * const swapped = engine.swap(nodeA, nodeB);\n * if (swapped) {\n * console.log('Nodes swapped successfully');\n * }\n */\n public swap(a: GridStackNode, b: GridStackNode): boolean | undefined {\n if (!b || b.locked || !a || a.locked) return false;\n\n function _doSwap(): true { // assumes a is before b IFF they have different height (put after rather than exact swap)\n const x = b.x, y = b.y;\n b.x = a.x; b.y = a.y; // b -> a position\n if (a.h != b.h) {\n a.x = x; a.y = b.y + b.h; // a -> goes after b\n } else if (a.w != b.w) {\n a.x = b.x + b.w; a.y = y; // a -> goes after b\n } else {\n a.x = x; a.y = y; // a -> old b position\n }\n a._dirty = b._dirty = true;\n return true;\n }\n let touching: boolean; // remember if we called it (vs undefined)\n\n // same size and same row or column, and touching\n if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = Utils.isTouching(a, b)))\n return _doSwap();\n if (touching === false) return; // IFF ran test and fail, bail out\n\n // check for taking same columns (but different height) and touching\n if (a.w === b.w && a.x === b.x && (touching || (touching = Utils.isTouching(a, b)))) {\n if (b.y < a.y) { const t = a; a = b; b = t; } // swap a <-> b vars so a is first\n return _doSwap();\n }\n if (touching === false) return;\n\n // check if taking same row (but different width) and touching\n if (a.h === b.h && a.y === b.y && (touching || (touching = Utils.isTouching(a, b)))) {\n if (b.x < a.x) { const t = a; a = b; b = t; } // swap a <-> b vars so a is first\n return _doSwap();\n }\n return false;\n }\n\n /**\n * Check if the specified rectangular area is empty (no nodes occupy any part of it).\n *\n * @param x the x coordinate (column) of the area to check\n * @param y the y coordinate (row) of the area to check\n * @param w the width in columns of the area to check\n * @param h the height in rows of the area to check\n * @returns true if the area is completely empty, false if any node overlaps\n *\n * @example\n * if (engine.isAreaEmpty(2, 1, 3, 2)) {\n * console.log('Area is available for placement');\n * }\n */\n public isAreaEmpty(x: number, y: number, w: number, h: number): boolean {\n const nn: GridStackNode = {x: x || 0, y: y || 0, w: w || 1, h: h || 1};\n return !this.collide(nn);\n }\n\n /**\n * Re-layout grid items to reclaim any empty space.\n * This optimizes the grid layout by moving items to fill gaps.\n *\n * @param layout layout algorithm to use:\n * - 'compact' (default): find truly empty spaces, may reorder items\n * - 'list': keep the sort order exactly the same, move items up sequentially\n * @param doSort if true (default), sort nodes by position before compacting\n * @returns the engine instance for chaining\n *\n * @example\n * // Compact to fill empty spaces\n * engine.compact();\n *\n * // Compact preserving item order\n * engine.compact('list');\n */\n public compact(layout: CompactOptions = 'compact', doSort = true): GridStackEngine {\n if (this.nodes.length === 0) return this;\n if (doSort) this.sortNodes();\n const wasBatch = this.batchMode;\n if (!wasBatch) this.batchUpdate();\n const wasColumnResize = this._inColumnResize;\n if (!wasColumnResize) this._inColumnResize = true; // faster addNode()\n const copyNodes = this.nodes;\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\n copyNodes.forEach((n, index, list) => {\n let after: GridStackNode;\n if (!n.locked) {\n n.autoPosition = true;\n if (layout === 'list' && index) after = list[index - 1];\n }\n this.addNode(n, false, after); // 'false' for add event trigger\n });\n if (!wasColumnResize) delete this._inColumnResize;\n if (!wasBatch) this.batchUpdate(false);\n return this;\n }\n\n /**\n * Enable/disable floating widgets (default: `false`).\n * When floating is enabled, widgets can move up to fill empty spaces.\n * See [example](http://gridstackjs.com/demo/float.html)\n *\n * @param val true to enable floating, false to disable\n *\n * @example\n * engine.float = true; // Enable floating\n * engine.float = false; // Disable floating (default)\n */\n public set float(val: boolean) {\n if (this._float === val) return;\n this._float = val || false;\n if (!val) {\n this._packNodes()._notify();\n }\n }\n\n /**\n * Get the current floating mode setting.\n *\n * @returns true if floating is enabled, false otherwise\n *\n * @example\n * const isFloating = engine.float;\n * console.log('Floating enabled:', isFloating);\n */\n public get float(): boolean { return this._float || false; }\n\n /**\n * Sort the nodes array from first to last, or reverse.\n * This is called during collision/placement operations to enforce a specific order.\n *\n * @param dir sort direction: 1 for ascending (first to last), -1 for descending (last to first)\n * @returns the engine instance for chaining\n *\n * @example\n * engine.sortNodes(); // Sort ascending (default)\n * engine.sortNodes(-1); // Sort descending\n */\n public sortNodes(dir: 1 | -1 = 1): GridStackEngine {\n this.nodes = Utils.sort(this.nodes, dir);\n return this;\n }\n\n /** @internal called to top gravity pack the items back OR revert back to original Y positions when floating */\n protected _packNodes(): GridStackEngine {\n if (this.batchMode) { return this; }\n this.sortNodes(); // first to last\n\n if (this.float) {\n // restore original Y pos\n this.nodes.forEach(n => {\n if (n._updating || n._orig === undefined || n.y === n._orig.y) return;\n let newY = n.y;\n while (newY > n._orig.y) {\n --newY;\n const collide = this.collide(n, {x: n.x, y: newY, w: n.w, h: n.h});\n if (!collide) {\n n._dirty = true;\n n.y = newY;\n }\n }\n });\n } else {\n // top gravity pack\n this.nodes.forEach((n, i) => {\n if (n.locked) return;\n while (n.y > 0) {\n const newY = i === 0 ? 0 : n.y - 1;\n const canBeMoved = i === 0 || !this.collide(n, {x: n.x, y: newY, w: n.w, h: n.h});\n if (!canBeMoved) break;\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\n // and move items back. The user 'change' CB should detect changes from the original\n // starting position instead.\n n._dirty = (n.y !== newY);\n n.y = newY;\n }\n });\n }\n return this;\n }\n\n /**\n * Prepare and validate a node's coordinates and values for the current grid.\n * This ensures the node has valid position, size, and properties before being added to the grid.\n *\n * @param node the node to prepare and validate\n * @param resizing if true, resize the node down if it's out of bounds; if false, move it to fit\n * @returns the prepared node with valid coordinates\n *\n * @example\n * const node = { w: 3, h: 2, content: 'Hello' };\n * const prepared = engine.prepareNode(node);\n * console.log('Node prepared at:', prepared.x, prepared.y);\n */\n public prepareNode(node: GridStackNode, resizing?: boolean): GridStackNode {\n node._id = node._id ?? GridStackEngine._idSeq++;\n\n // make sure USER supplied id are unique in our list, else assign a new one as it will create issues during load/update/etc...\n const id = node.id;\n if (id) {\n let count = 1; // append nice _n rather than some random number\n while (this.nodes.find(n => n.id === node.id && n !== node)) {\n node.id = id + '_' + (count++);\n }\n }\n\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\n node.autoPosition = true;\n }\n\n // assign defaults for missing required fields\n const defaults: GridStackNode = { x: 0, y: 0, w: 1, h: 1};\n Utils.defaults(node, defaults);\n\n if (!node.autoPosition) { delete node.autoPosition; }\n if (!node.noResize) { delete node.noResize; }\n if (!node.noMove) { delete node.noMove; }\n Utils.sanitizeMinMax(node);\n\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\n if (typeof node.x == 'string') { node.x = Number(node.x); }\n if (typeof node.y == 'string') { node.y = Number(node.y); }\n if (typeof node.w == 'string') { node.w = Number(node.w); }\n if (typeof node.h == 'string') { node.h = Number(node.h); }\n if (isNaN(node.x)) { node.x = defaults.x; node.autoPosition = true; }\n if (isNaN(node.y)) { node.y = defaults.y; node.autoPosition = true; }\n if (isNaN(node.w)) { node.w = defaults.w; }\n if (isNaN(node.h)) { node.h = defaults.h; }\n\n this.nodeBoundFix(node, resizing);\n return node;\n }\n\n /**\n * Part 2 of preparing a node to fit inside the grid - validates and fixes coordinates and dimensions.\n * This ensures the node fits within grid boundaries and respects min/max constraints.\n *\n * @param node the node to validate and fix\n * @param resizing if true, resize the node to fit; if false, move the node to fit\n * @returns the engine instance for chaining\n *\n * @example\n * // Fix a node that might be out of bounds\n * engine.nodeBoundFix(node, true); // Resize to fit\n * engine.nodeBoundFix(node, false); // Move to fit\n */\n public nodeBoundFix(node: GridStackNode, resizing?: boolean): GridStackEngine {\n\n const before = node._orig || Utils.copyPos({}, node);\n\n if (node.maxW) { node.w = Math.min(node.w || 1, node.maxW); }\n if (node.maxH) { node.h = Math.min(node.h || 1, node.maxH); }\n if (node.minW) { node.w = Math.max(node.w || 1, node.minW); }\n if (node.minH) { node.h = Math.max(node.h || 1, node.minH); }\n\n // if user loaded a larger than allowed widget for current # of columns,\n // remember it's position & width so we can restore back (1 -> 12 column) #1655 #1985\n // IFF we're not in the middle of column resizing!\n const saveOrig = (node.x || 0) + (node.w || 1) > this.column;\n if (saveOrig && this.column < this.defaultColumn && !this._inColumnResize && !this.skipCacheUpdate && node._id != null && this.findCacheLayout(node, this.defaultColumn) === -1) {\n const copy = {...node}; // need _id + positions\n if (copy.autoPosition || copy.x === undefined) { delete copy.x; delete copy.y; }\n else copy.x = Math.min(this.defaultColumn - 1, copy.x);\n copy.w = Math.min(this.defaultColumn, copy.w || 1);\n this.cacheOneLayout(copy, this.defaultColumn);\n }\n\n if (node.w > this.column) {\n node.w = this.column;\n } else if (node.w < 1) {\n node.w = 1;\n }\n\n if (this.maxRow && node.h > this.maxRow) {\n node.h = this.maxRow;\n } else if (node.h < 1) {\n node.h = 1;\n }\n\n if (node.x < 0) {\n node.x = 0;\n }\n if (node.y < 0) {\n node.y = 0;\n }\n\n if (node.x + node.w > this.column) {\n if (resizing) {\n node.w = this.column - node.x;\n } else {\n node.x = this.column - node.w;\n }\n }\n if (this.maxRow && node.y + node.h > this.maxRow) {\n if (resizing) {\n node.h = this.maxRow - node.y;\n } else {\n node.y = this.maxRow - node.h;\n }\n }\n\n if (!Utils.samePos(node, before)) {\n node._dirty = true;\n }\n\n return this;\n }\n\n /**\n * Returns a list of nodes that have been modified from their original values.\n * This is used to track which nodes need DOM updates.\n *\n * @param verify if true, performs additional verification by comparing current vs original positions\n * @returns array of nodes that have been modified\n *\n * @example\n * const changed = engine.getDirtyNodes();\n * console.log('Modified nodes:', changed.length);\n *\n * // Get verified dirty nodes\n * const verified = engine.getDirtyNodes(true);\n */\n public getDirtyNodes(verify?: boolean): GridStackNode[] {\n // compare original x,y,w,h instead as _dirty can be a temporary state\n if (verify) {\n return this.nodes.filter(n => n._dirty && !Utils.samePos(n, n._orig));\n }\n return this.nodes.filter(n => n._dirty);\n }\n\n /** @internal call this to call onChange callback with dirty nodes so DOM can be updated */\n protected _notify(removedNodes?: GridStackNode[]): GridStackEngine {\n if (this.batchMode || !this.onChange) return this;\n const dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());\n this.onChange(dirtyNodes);\n return this;\n }\n\n /**\n * Clean all dirty and last tried information from nodes.\n * This resets the dirty state tracking for all nodes.\n *\n * @returns the engine instance for chaining\n *\n * @internal\n */\n public cleanNodes(): GridStackEngine {\n if (this.batchMode) return this;\n this.nodes.forEach(n => {\n delete n._dirty;\n delete n._lastTried;\n });\n return this;\n }\n\n /**\n * Save the initial position/size of all nodes to track real dirty state.\n * This creates a snapshot of current positions that can be restored later.\n *\n * Note: Should be called right after change events and before move/resize operations.\n *\n * @returns the engine instance for chaining\n *\n * @internal\n */\n public saveInitial(): GridStackEngine {\n this.nodes.forEach(n => {\n n._orig = Utils.copyPos({}, n);\n delete n._dirty;\n });\n this._hasLocked = this.nodes.some(n => n.locked);\n return this;\n }\n\n /**\n * Restore all nodes back to their initial values.\n * This is typically called when canceling an operation (e.g., Esc key during drag).\n *\n * @returns the engine instance for chaining\n *\n * @internal\n */\n public restoreInitial(): GridStackEngine {\n this.nodes.forEach(n => {\n if (!n._orig || Utils.samePos(n, n._orig)) return;\n Utils.copyPos(n, n._orig);\n n._dirty = true;\n });\n this._notify();\n return this;\n }\n\n /**\n * Find the first available empty spot for the given node dimensions.\n * Updates the node's x,y attributes with the found position.\n *\n * @param node the node to find a position for (w,h must be set)\n * @param nodeList optional list of nodes to check against (defaults to engine nodes)\n * @param column optional column count (defaults to engine column count)\n * @param after optional node to start search after (maintains order)\n * @returns true if an empty position was found and node was updated\n *\n * @example\n * const node = { w: 2, h: 1 };\n * if (engine.findEmptyPosition(node)) {\n * console.log('Found position at:', node.x, node.y);\n * }\n */\n public findEmptyPosition(node: GridStackNode, nodeList = this.nodes, column = this.column, after?: GridStackNode): boolean {\n const start = after ? after.y * column + (after.x + after.w) : 0;\n let found = false;\n for (let i = start; !found; ++i) {\n const x = i % column;\n const y = Math.floor(i / column);\n if (x + node.w > column) {\n continue;\n }\n const box = {x, y, w: node.w, h: node.h};\n if (!nodeList.find(n => Utils.isIntercepted(box, n))) {\n if (node.x !== x || node.y !== y) node._dirty = true;\n node.x = x;\n node.y = y;\n delete node.autoPosition;\n found = true;\n }\n }\n return found;\n }\n\n /**\n * Add the given node to the grid, handling collision detection and re-packing.\n * This is the main method for adding new widgets to the engine.\n *\n * @param node the node to add to the grid\n * @param triggerAddEvent if true, adds node to addedNodes list for event triggering\n * @param after optional node to place this node after (for ordering)\n * @returns the added node (or existing node if duplicate)\n *\n * @example\n * const node = { x: 0, y: 0, w: 2, h: 1, content: 'Hello' };\n * const added = engine.addNode(node, true);\n */\n public addNode(node: GridStackNode, triggerAddEvent = false, after?: GridStackNode): GridStackNode {\n const dup = this.nodes.find(n => n._id === node._id);\n if (dup) return dup; // prevent inserting twice! return it instead.\n\n // skip prepareNode if we're in middle of column resize (not new) but do check for bounds!\n this._inColumnResize ? this.nodeBoundFix(node) : this.prepareNode(node);\n delete node._temporaryRemoved;\n delete node._removeDOM;\n\n let skipCollision: boolean;\n if (node.autoPosition && this.findEmptyPosition(node, this.nodes, this.column, after)) {\n delete node.autoPosition; // found our slot\n skipCollision = true;\n }\n\n this.nodes.push(node);\n if (triggerAddEvent) { this.addedNodes.push(node); }\n\n if (!skipCollision) this._fixCollisions(node);\n if (!this.batchMode) { this._packNodes()._notify(); }\n return node;\n }\n\n /**\n * Remove the given node from the grid.\n *\n * @param node the node to remove\n * @param removeDOM if true (default), marks node for DOM removal\n * @param triggerEvent if true, adds node to removedNodes list for event triggering\n * @returns the engine instance for chaining\n *\n * @example\n * engine.removeNode(node, true, true);\n */\n public removeNode(node: GridStackNode, removeDOM = true, triggerEvent = false): GridStackEngine {\n if (!this.nodes.find(n => n._id === node._id)) {\n // TEST console.log(`Error: GridStackEngine.removeNode() node._id=${node._id} not found!`)\n return this;\n }\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\n this.removedNodes.push(node);\n }\n if (removeDOM) node._removeDOM = true; // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\n // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\n this.nodes = this.nodes.filter(n => n._id !== node._id);\n if (!node._isAboutToRemove) this._packNodes(); // if dragged out, no need to relayout as already done...\n this._notify([node]);\n return this;\n }\n\n /**\n * Remove all nodes from the grid.\n *\n * @param removeDOM if true (default), marks all nodes for DOM removal\n * @param triggerEvent if true (default), triggers removal events\n * @returns the engine instance for chaining\n *\n * @example\n * engine.removeAll(); // Remove all nodes\n */\n public removeAll(removeDOM = true, triggerEvent = true): GridStackEngine {\n delete this._layouts;\n if (!this.nodes.length) return this;\n removeDOM && this.nodes.forEach(n => n._removeDOM = true); // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\n const removedNodes = this.nodes;\n this.removedNodes = triggerEvent ? removedNodes : [];\n this.nodes = [];\n return this._notify(removedNodes);\n }\n\n /**\n * Check if a node can be moved to a new position, considering layout constraints.\n * This is a safer version of moveNode() that validates the move first.\n *\n * For complex cases (like maxRow constraints), it simulates the move in a clone first,\n * then applies the changes only if they meet all specifications.\n *\n * @param node the node to move\n * @param o move options including target position\n * @returns true if the node was successfully moved\n *\n * @example\n * const canMove = engine.moveNodeCheck(node, { x: 2, y: 1 });\n * if (canMove) {\n * console.log('Node moved successfully');\n * }\n */\n public moveNodeCheck(node: GridStackNode, o: GridStackMoveOpts): boolean {\n // if (node.locked) return false;\n if (!this.changedPosConstrain(node, o)) return false;\n o.pack = true;\n\n // simpler case: move item directly...\n if (!this.maxRow) {\n return this.moveNode(node, o);\n }\n\n // complex case: create a clone with NO maxRow (will check for out of bounds at the end)\n let clonedNode: GridStackNode;\n const clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(n => {\n if (n._id === node._id) {\n clonedNode = {...n};\n return clonedNode;\n }\n return {...n};\n })\n });\n if (!clonedNode) return false;\n\n // check if we're covering 50% collision and could move, while still being under maxRow or at least not making it worse\n // (case where widget was somehow added past our max #2449)\n const canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= Math.max(this.getRow(), this.maxRow);\n // else check if we can force a swap (float=true, or different shapes) on non-resize\n if (!canMove && !o.resizing && o.collide) {\n const collide = o.collide.el.gridstackNode; // find the source node the clone collided with at 50%\n if (this.swap(node, collide)) { // swaps and mark dirty\n this._notify();\n return true;\n }\n }\n if (!canMove) return false;\n\n // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!\n // Note: we can't use the list directly as elements and other parts point to actual node, so copy content\n clone.nodes.filter(n => n._dirty).forEach(c => {\n const n = this.nodes.find(a => a._id === c._id);\n if (!n) return;\n Utils.copyPos(n, c);\n n._dirty = true;\n });\n this._notify();\n return true;\n }\n\n /** return true if can fit in grid height constrain only (always true if no maxRow) */\n public willItFit(node: GridStackNode): boolean {\n delete node._willFitPos;\n if (!this.maxRow) return true;\n // create a clone with NO maxRow and check if still within size\n const clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(n => {return {...n}})\n });\n const n = {...node}; // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687\n this.cleanupNode(n);\n delete n.el; delete n._id; delete n.content; delete n.grid;\n clone.addNode(n);\n if (clone.getRow() <= this.maxRow) {\n node._willFitPos = Utils.copyPos({}, n);\n return true;\n }\n return false;\n }\n\n /** true if x,y or w,h are different after clamping to min/max */\n public changedPosConstrain(node: GridStackNode, p: GridStackPosition): boolean {\n // first make sure w,h are set for caller\n p.w = p.w || node.w;\n p.h = p.h || node.h;\n if (node.x !== p.x || node.y !== p.y) return true;\n // check constrained w,h\n if (node.maxW) { p.w = Math.min(p.w, node.maxW); }\n if (node.maxH) { p.h = Math.min(p.h, node.maxH); }\n if (node.minW) { p.w = Math.max(p.w, node.minW); }\n if (node.minH) { p.h = Math.max(p.h, node.minH); }\n return (node.w !== p.w || node.h !== p.h);\n }\n\n /** return true if the passed in node was actually moved (checks for no-op and locked) */\n public moveNode(node: GridStackNode, o: GridStackMoveOpts): boolean {\n if (!node || /*node.locked ||*/ !o) return false;\n let wasUndefinedPack: boolean;\n if (o.pack === undefined && !this.batchMode) {\n wasUndefinedPack = o.pack = true;\n }\n\n // constrain the passed in values and check if we're still changing our node\n if (typeof o.x !== 'number') { o.x = node.x; }\n if (typeof o.y !== 'number') { o.y = node.y; }\n if (typeof o.w !== 'number') { o.w = node.w; }\n if (typeof o.h !== 'number') { o.h = node.h; }\n const resizing = (node.w !== o.w || node.h !== o.h);\n const nn: GridStackNode = Utils.copyPos({}, node, true); // get min/max out first, then opt positions next\n Utils.copyPos(nn, o);\n this.nodeBoundFix(nn, resizing);\n Utils.copyPos(o, nn);\n\n if (!o.forceCollide && Utils.samePos(node, o)) return false;\n const prevPos: GridStackPosition = Utils.copyPos({}, node);\n\n // check if we will need to fix collision at our new location\n const collides = this.collideAll(node, nn, o.skip);\n let needToMove = true;\n if (collides.length) {\n const activeDrag = node._moving && !o.nested;\n // check to make sure we actually collided over 50% surface area while dragging\n let collide = activeDrag ? this.directionCollideCoverage(node, o, collides) : collides[0];\n // if we're enabling creation of sub-grids on the fly, see if we're covering 80% of either one, if we didn't already do that\n if (activeDrag && collide && node.grid?.opts?.subGridDynamic && !node.grid._isTemp) {\n const over = Utils.areaIntercept(o.rect, collide._rect);\n const a1 = Utils.area(o.rect);\n const a2 = Utils.area(collide._rect);\n const perc = over / (a1 < a2 ? a1 : a2);\n if (perc > .8) {\n collide.grid.makeSubGrid(collide.el, undefined, node);\n collide = undefined;\n }\n }\n\n if (collide) {\n needToMove = !this._fixCollisions(node, nn, collide, o); // check if already moved...\n } else {\n needToMove = false; // we didn't cover >50% for a move, skip...\n if (wasUndefinedPack) delete o.pack;\n }\n }\n\n // now move (to the original ask vs the collision version which might differ) and repack things\n if (needToMove && !Utils.samePos(node, nn)) {\n node._dirty = true;\n Utils.copyPos(node, nn);\n }\n if (o.pack) {\n this._packNodes()\n ._notify();\n }\n return !Utils.samePos(node, prevPos); // pack might have moved things back\n }\n\n public getRow(): number {\n return this.nodes.reduce((row, n) => Math.max(row, n.y + n.h), 0);\n }\n\n public beginUpdate(node: GridStackNode): GridStackEngine {\n if (!node._updating) {\n node._updating = true;\n delete node._skipDown;\n if (!this.batchMode) this.saveInitial();\n }\n return this;\n }\n\n public endUpdate(): GridStackEngine {\n const n = this.nodes.find(n => n._updating);\n if (n) {\n delete n._updating;\n delete n._skipDown;\n }\n return this;\n }\n\n /** 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\n * count to use is given. returning a list of widgets for serialization\n * @param saveElement if true (default), the element will be saved to GridStackWidget.el field, else it will be removed.\n * @param saveCB callback for each node -> widget, so application can insert additional data to be saved into the widget data structure.\n * @param column if provided, the grid will be saved for the given column count (IFF we have matching internal saved layout, or current layout).\n * Note: nested grids will ALWAYS save the container w to match overall layouts (parent + child) to be consistent.\n */\n public save(saveElement = true, saveCB?: SaveFcn, column?: number): GridStackNode[] {\n // use the highest layout for any saved info so we can have full detail on reload #1849\n // unless we're given a column to match (always set for nested grids)\n const len = this._layouts?.length || 0;\n let layout: GridStackNode[];\n if (len) {\n if (column) {\n if (column !== this.column) layout = this._layouts[column];\n } else if (this.column !== len - 1) {\n layout = this._layouts[len - 1];\n }\n }\n const list: GridStackNode[] = [];\n this.sortNodes();\n this.nodes.forEach(n => {\n const wl = layout?.find(l => l._id === n._id);\n // use layout info fields instead if set\n const w: GridStackNode = {...n, ...(wl || {})};\n Utils.removeInternalForSave(w, !saveElement);\n if (saveCB) saveCB(n, w);\n list.push(w);\n });\n return list;\n }\n\n /** @internal called whenever a node is added or moved - updates the cached layouts */\n public layoutsNodesChange(nodes: GridStackNode[]): GridStackEngine {\n if (!this._layouts || this._inColumnResize) return this;\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\n this._layouts.forEach((layout, column) => {\n if (!layout || column === this.column) return this;\n if (column < this.column) {\n this._layouts[column] = undefined;\n }\n else {\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\n // NOTE: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. #1785\n const ratio = column / this.column;\n nodes.forEach(node => {\n if (!node._orig) return; // didn't change (newly added ?)\n const n = layout.find(l => l._id === node._id);\n if (!n) return; // no cache for new nodes. Will use those values.\n // Y changed, push down same amount\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\n if (n.y >= 0 && node.y !== node._orig.y) {\n n.y += (node.y - node._orig.y);\n }\n // X changed, scale from new position\n if (node.x !== node._orig.x) {\n n.x = Math.round(node.x * ratio);\n }\n // width changed, scale from new width\n if (node.w !== node._orig.w) {\n n.w = Math.round(node.w * ratio);\n }\n // ...height always carries over from cache\n });\n }\n });\n return this;\n }\n\n /**\n * @internal Called to scale the widget width & position up/down based on the column change.\n * Note we store previous layouts (especially original ones) to make it possible to go\n * from say 12 -> 1 -> 12 and get back to where we were.\n *\n * @param prevColumn previous number of columns\n * @param column new column number\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\n */\n public columnChanged(prevColumn: number, column: number, layout: ColumnOptions = 'moveScale'): GridStackEngine {\n if (!this.nodes.length || !column || prevColumn === column) return this;\n\n // simpler shortcuts layouts\n const doCompact = layout === 'compact' || layout === 'list';\n if (doCompact) {\n this.sortNodes(1); // sort with original layout once and only once (new column will affect order otherwise)\n }\n\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data IFF we're sizing down (see below)\n if (column < prevColumn) this.cacheLayout(this.nodes, prevColumn);\n this.batchUpdate(); // do this EARLY as it will call saveInitial() so we can detect where we started for _dirty and collision\n let newNodes: GridStackNode[] = [];\n let nodes = doCompact ? this.nodes : Utils.sort(this.nodes, -1); // current column reverse sorting so we can insert last to front (limit collision)\n\n // see if we have cached previous layout IFF we are going up in size (restore) otherwise always\n // generate next size down from where we are (looks more natural as you gradually size down).\n if (column > prevColumn && this._layouts) {\n const cacheNodes = this._layouts[column] || [];\n // ...if not, start with the largest layout (if not already there) as down-scaling is more accurate\n // by pretending we came from that larger column by assigning those values as starting point\n const lastIndex = this._layouts.length - 1;\n if (!cacheNodes.length && prevColumn !== lastIndex && this._layouts[lastIndex]?.length) {\n prevColumn = lastIndex;\n this._layouts[lastIndex].forEach(cacheNode => {\n const n = nodes.find(n => n._id === cacheNode._id);\n if (n) {\n // still current, use cache info positions\n if (!doCompact && !cacheNode.autoPosition) {\n n.x = cacheNode.x ?? n.x;\n n.y = cacheNode.y ?? n.y;\n }\n n.w = cacheNode.w ?? n.w;\n if (cacheNode.x == undefined || cacheNode.y === undefined) n.autoPosition = true;\n }\n });\n }\n\n // if we found cache re-use those nodes that are still current\n cacheNodes.forEach(cacheNode => {\n const j = nodes.findIndex(n => n._id === cacheNode._id);\n if (j !== -1) {\n const n = nodes[j];\n // still current, use cache info positions\n if (doCompact) {\n n.w = cacheNode.w; // only w is used, and don't trim the list\n return;\n }\n if (cacheNode.autoPosition || isNaN(cacheNode.x) || isNaN(cacheNode.y)) {\n this.findEmptyPosition(cacheNode, newNodes);\n }\n if (!cacheNode.autoPosition) {\n n.x = cacheNode.x ?? n.x;\n n.y = cacheNode.y ?? n.y;\n n.w = cacheNode.w ?? n.w;\n newNodes.push(n);\n }\n nodes.splice(j, 1);\n }\n });\n }\n\n // much simpler layout that just compacts\n if (doCompact) {\n this.compact(layout, false);\n } else {\n // ...and add any extra non-cached ones\n if (nodes.length) {\n if (typeof layout === 'function') {\n layout(column, prevColumn, newNodes, nodes);\n } else {\n const ratio = (doCompact || layout === 'none') ? 1 : column / prevColumn;\n const move = (layout === 'move' || layout === 'moveScale');\n const scale = (layout === 'scale' || layout === 'moveScale');\n nodes.forEach(node => {\n // NOTE: x + w could be outside of the grid, but addNode() below will handle that\n node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\n node.w = ((column === 1 || prevColumn === 1) ? 1 : scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\n newNodes.push(node);\n });\n nodes = [];\n }\n }\n\n // finally re-layout them in reverse order (to get correct placement)\n newNodes = Utils.sort(newNodes, -1);\n this._inColumnResize = true; // prevent cache update\n this.nodes = []; // pretend we have no nodes to start with (add() will use same structures) to simplify layout\n newNodes.forEach(node => {\n this.addNode(node, false); // 'false' for add event trigger\n delete node._orig; // make sure the commit doesn't try to restore things back to original\n });\n }\n\n this.nodes.forEach(n => delete n._orig); // clear _orig before batch=false so it doesn't handle float=true restore\n this.batchUpdate(false, !doCompact);\n delete this._inColumnResize;\n return this;\n }\n\n /**\n * call to cache the given layout internally to the given location so we can restore back when column changes size\n * @param nodes list of nodes\n * @param column corresponding column index to save it under\n * @param clear if true, will force other caches to be removed (default false)\n */\n public cacheLayout(nodes: GridStackNode[], column: number, clear = false): GridStackEngine {\n const copy: GridStackNode[] = [];\n nodes.forEach((n, i) => {\n // make sure we have an id in case this is new layout, else re-use id already set\n if (n._id === undefined) {\n const existing = n.id ? this.nodes.find(n2 => n2.id === n.id) : undefined; // find existing node using users id\n n._id = existing?._id ?? GridStackEngine._idSeq++;\n }\n copy[i] = {x: n.x, y: n.y, w: n.w, _id: n._id} // only thing we change is x,y,w and id to find it back\n });\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\n this._layouts[column] = copy;\n return this;\n }\n\n /**\n * call to cache the given node layout internally to the given location so we can restore back when column changes size\n * @param node single node to cache\n * @param column corresponding column index to save it under\n */\n public cacheOneLayout(n: GridStackNode, column: number): GridStackEngine {\n n._id = n._id ?? GridStackEngine._idSeq++;\n const l: GridStackNode = {x: n.x, y: n.y, w: n.w, _id: n._id}\n if (n.autoPosition || n.x === undefined) { delete l.x; delete l.y; if (n.autoPosition) l.autoPosition = true; }\n this._layouts = this._layouts || [];\n this._layouts[column] = this._layouts[column] || [];\n const index = this.findCacheLayout(n, column);\n if (index === -1)\n this._layouts[column].push(l);\n else\n this._layouts[column][index] = l;\n return this;\n }\n\n protected findCacheLayout(n: GridStackNode, column: number): number | undefined {\n return this._layouts?.[column]?.findIndex(l => l._id === n._id) ?? -1;\n }\n\n public removeNodeFromLayoutCache(n: GridStackNode) {\n if (!this._layouts) {\n return;\n }\n for (let i = 0; i < this._layouts.length; i++) {\n const index = this.findCacheLayout(n, i);\n if (index !== -1) {\n this._layouts[i].splice(index, 1);\n }\n }\n }\n\n /** called to remove all internal values but the _id */\n public cleanupNode(node: GridStackNode): GridStackEngine {\n for (const prop in node) {\n if (prop[0] === '_' && prop !== '_id') delete node[prop];\n }\n return this;\n }\n}\n","/**\r\n * types.ts 12.3.3\r\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { GridStack } from './gridstack';\r\nimport { GridStackEngine } from './gridstack-engine';\r\n\r\n/**\r\n * Default values for grid options - used during initialization and when saving out grid configuration.\r\n * These values are applied when options are not explicitly provided.\r\n */\r\nexport const gridDefaults: GridStackOptions = {\r\n alwaysShowResizeHandle: 'mobile',\r\n animate: true,\r\n auto: true,\r\n cellHeight: 'auto',\r\n cellHeightThrottle: 100,\r\n cellHeightUnit: 'px',\r\n column: 12,\r\n draggable: { handle: '.grid-stack-item-content', appendTo: 'body', scroll: true },\r\n handle: '.grid-stack-item-content',\r\n itemClass: 'grid-stack-item',\r\n margin: 10,\r\n marginUnit: 'px',\r\n maxRow: 0,\r\n minRow: 0,\r\n placeholderClass: 'grid-stack-placeholder',\r\n placeholderText: '',\r\n removableOptions: { accept: 'grid-stack-item', decline: 'grid-stack-non-removable'},\r\n resizable: { handles: 'se' },\r\n rtl: 'auto',\r\n\r\n // **** same as not being set ****\r\n // disableDrag: false,\r\n // disableResize: false,\r\n // float: false,\r\n // handleClass: null,\r\n // removable: false,\r\n // staticGrid: false,\r\n //removable\r\n};\r\n\r\n/**\r\n * Different layout options when changing the number of columns.\r\n *\r\n * These options control how widgets are repositioned when the grid column count changes.\r\n * Note: The new list may be partially filled if there's a cached layout for that size.\r\n *\r\n * Options:\r\n * - `'list'`: Treat items as a sorted list, keeping them sequentially without resizing (unless too big)\r\n * - `'compact'`: Similar to list, but uses compact() method to fill empty slots by reordering\r\n * - `'moveScale'`: Scale and move items by the ratio of newColumnCount / oldColumnCount\r\n * - `'move'`: Only move items, keep their sizes\r\n * - `'scale'`: Only scale items, keep their positions\r\n * - `'none'`: Leave items unchanged unless they don't fit in the new column count\r\n * - Custom function: Provide your own layout logic\r\n */\r\nexport type ColumnOptions = 'list' | 'compact' | 'moveScale' | 'move' | 'scale' | 'none' |\r\n ((column: number, oldColumn: number, nodes: GridStackNode[], oldNodes: GridStackNode[]) => void);\r\n/**\r\n * Options for the compact() method to reclaim empty space.\r\n * - `'list'`: Keep items in order, move them up sequentially\r\n * - `'compact'`: Find truly empty spaces, may reorder items for optimal fit\r\n */\r\nexport type CompactOptions = 'list' | 'compact';\r\n/**\r\n * Type representing values that can be either numbers or strings (e.g., dimensions with units).\r\n * Used for properties like width, height, margins that accept both numeric and string values.\r\n */\r\nexport type numberOrString = number | string;\r\n/**\r\n * Extended HTMLElement interface for grid items.\r\n * All grid item DOM elements implement this interface to provide access to their grid data.\r\n */\r\nexport interface GridItemHTMLElement extends HTMLElement {\r\n /** Pointer to the associated grid node instance containing position, size, and other widget data */\r\n gridstackNode?: GridStackNode;\r\n /** @internal Original node data (used for restoring during drag operations) */\r\n _gridstackNodeOrig?: GridStackNode;\r\n}\r\n\r\n/**\r\n * Type representing various ways to specify grid elements.\r\n * Can be a CSS selector string, HTMLElement, or GridItemHTMLElement.\r\n */\r\nexport type GridStackElement = string | HTMLElement | GridItemHTMLElement;\r\n\r\n/**\r\n * Event handler function types for the .on() method.\r\n * Different handlers receive different parameters based on the event type.\r\n */\r\n\r\n/** General event handler that receives only the event */\r\nexport type GridStackEventHandler = (event: Event) => void;\r\n\r\n/** Element-specific event handler that receives event and affected element */\r\nexport type GridStackElementHandler = (event: Event, el: GridItemHTMLElement) => void;\r\n\r\n/** Node-based event handler that receives event and array of affected nodes */\r\nexport type GridStackNodesHandler = (event: Event, nodes: GridStackNode[]) => void;\r\n\r\n/** Drop event handler that receives previous and new node states */\r\nexport type GridStackDroppedHandler = (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => void;\r\n\r\n/** Union type of all possible event handler types */\r\nexport type GridStackEventHandlerCallback = GridStackEventHandler | GridStackElementHandler | GridStackNodesHandler | GridStackDroppedHandler;\r\n\r\n/**\r\n * Optional callback function called during load() operations.\r\n * Allows custom handling of widget addition/removal for framework integration.\r\n *\r\n * @param parent - The parent HTML element\r\n * @param w - The widget definition\r\n * @param add - True if adding, false if removing\r\n * @param grid - True if this is a grid operation\r\n * @returns The created/modified HTML element, or undefined\r\n */\r\nexport type AddRemoveFcn = (parent: HTMLElement, w: GridStackWidget, add: boolean, grid: boolean) => HTMLElement | undefined;\r\n\r\n/**\r\n * Optional callback function called during save() operations.\r\n * Allows adding custom data to the saved widget structure.\r\n *\r\n * @param node - The internal grid node\r\n * @param w - The widget structure being saved (can be modified)\r\n */\r\nexport type SaveFcn = (node: GridStackNode, w: GridStackWidget) => void;\r\n\r\n/**\r\n * Optional callback function for custom widget content rendering.\r\n * Called during load()/addWidget() to create custom content beyond plain text.\r\n *\r\n * @param el - The widget's content container element\r\n * @param w - The widget definition with content and other properties\r\n */\r\nexport type RenderFcn = (el: HTMLElement, w: GridStackWidget) => void;\r\n\r\n/**\r\n * Optional callback function for custom resize-to-content behavior.\r\n * Called when a widget needs to resize to fit its content.\r\n *\r\n * @param el - The grid item element to resize\r\n */\r\nexport type ResizeToContentFcn = (el: GridItemHTMLElement) => void;\r\n\r\n/**\r\n * Configuration for responsive grid behavior.\r\n *\r\n * Defines how the grid responds to different screen sizes by changing column counts.\r\n * NOTE: Make sure to include the appropriate CSS (gridstack-extra.css) to support responsive behavior.\r\n */\r\nexport interface Responsive {\r\n /** wanted width to maintain (+-50%) to dynamically pick a column count. NOTE: make sure to have correct extra CSS to support this. */\r\n columnWidth?: number;\r\n /** maximum number of columns allowed (default: 12). NOTE: make sure to have correct extra CSS to support this. */\r\n columnMax?: number;\r\n /** explicit width:column breakpoints instead of automatic 'columnWidth'. NOTE: make sure to have correct extra CSS to support this. */\r\n breakpoints?: Breakpoint[];\r\n /** specify if breakpoints are for window size or grid size (default:false = grid) */\r\n breakpointForWindow?: boolean;\r\n /** global re-layout mode when changing columns */\r\n layout?: ColumnOptions;\r\n}\r\n\r\n/**\r\n * Defines a responsive breakpoint for automatic column count changes.\r\n * Used with the responsive.breakpoints option.\r\n */\r\nexport interface Breakpoint {\r\n /** Maximum width (in pixels) for this breakpoint to be active */\r\n w?: number;\r\n /** Number of columns to use when this breakpoint is active */\r\n c: number;\r\n /** Layout mode for this specific breakpoint (overrides global responsive.layout) */\r\n layout?: ColumnOptions;\r\n /** TODO: Future feature - specific children layout for this breakpoint */\r\n // children?: GridStackWidget[];\r\n}\r\n\r\n/**\r\n * Defines the options for a Grid\r\n */\r\nexport interface GridStackOptions {\r\n /**\r\n * Accept widgets dragged from other grids or from outside (default: `false`). Can be:\r\n * - `true`: will accept HTML elements having 'grid-stack-item' as class attribute\r\n * - `false`: will not accept any external widgets\r\n * - string: explicit class name to accept instead of default\r\n * - function: callback called before an item will be accepted when entering a grid\r\n *\r\n * @example\r\n * // Accept all grid items\r\n * acceptWidgets: true\r\n *\r\n * // Accept only items with specific class\r\n * acceptWidgets: 'my-draggable-item'\r\n *\r\n * // Custom validation function\r\n * acceptWidgets: (el) => {\r\n * return el.getAttribute('data-accept') === 'true';\r\n * }\r\n *\r\n * @see {@link http://gridstack.github.io/gridstack.js/demo/two.html} for complete example\r\n */\r\n acceptWidgets?: boolean | string | ((element: Element) => boolean);\r\n\r\n /** possible values (default: `mobile`) - does not apply to non-resizable widgets\r\n * `false` the resizing handles are only shown while hovering over a widget\r\n * `true` the resizing handles are always shown\r\n * 'mobile' if running on a mobile device, default to `true` (since there is no hovering per say), else `false`.\r\n See [example](http://gridstack.github.io/gridstack.js/demo/mobile.html) */\r\n alwaysShowResizeHandle?: true | false | 'mobile';\r\n\r\n /** turns animation on (default?: true) */\r\n animate?: boolean;\r\n\r\n /** if false gridstack will not initialize existing items (default?: true) */\r\n auto?: boolean;\r\n\r\n /**\r\n * One cell height (default: 'auto'). Can be:\r\n * - an integer (px): fixed pixel height\r\n * - a string (ex: '100px', '10em', '10rem'): CSS length value\r\n * - 0: library will not generate styles for rows (define your own CSS)\r\n * - 'auto': height calculated for square cells (width / column) and updated live on window resize\r\n * - 'initial': similar to 'auto' but stays fixed size during window resizing\r\n *\r\n * Note: % values don't work correctly - see demo/cell-height.html\r\n *\r\n * @example\r\n * // Fixed 100px height\r\n * cellHeight: 100\r\n *\r\n * // CSS units\r\n * cellHeight: '5rem'\r\n * cellHeight: '100px'\r\n *\r\n * // Auto-sizing for square cells\r\n * cellHeight: 'auto'\r\n *\r\n * // No CSS generation (custom styles)\r\n * cellHeight: 0\r\n */\r\n cellHeight?: numberOrString;\r\n\r\n /** throttle time delay (in ms) used when cellHeight='auto' to improve performance vs usability (default?: 100).\r\n * A value of 0 will make it instant at a cost of re-creating the CSS file at ever window resize event!\r\n * */\r\n cellHeightThrottle?: number;\r\n\r\n /** (internal) unit for cellHeight (default? 'px') which is set when a string cellHeight with a unit is passed (ex: '10rem') */\r\n cellHeightUnit?: string;\r\n\r\n /** list of children item to create when calling load() or addGrid() */\r\n children?: GridStackWidget[];\r\n\r\n /** number of columns (default?: 12). Note: IF you change this, CSS also have to change. See https://github.com/gridstack/gridstack.js#change-grid-columns.\r\n * Note: for nested grids, it is recommended to use 'auto' which will always match the container grid-item current width (in column) to keep inside and outside\r\n * items always the same. flag is NOT supported for regular non-nested grids.\r\n */\r\n column?: number | 'auto';\r\n\r\n /** responsive column layout for width:column behavior */\r\n columnOpts?: Responsive;\r\n\r\n /** additional class on top of '.grid-stack' (which is required for our CSS) to differentiate this instance.\r\n Note: only used by addGrid(), else your element should have the needed class */\r\n class?: string;\r\n\r\n /** disallows dragging of widgets (default?: false) */\r\n disableDrag?: boolean;\r\n\r\n /** disallows resizing of widgets (default?: false). */\r\n disableResize?: boolean;\r\n\r\n /** allows to override UI draggable options. (default?: { handle?: '.grid-stack-item-content', appendTo?: 'body' }) */\r\n draggable?: DDDragOpt;\r\n\r\n /** let user drag nested grid items out of a parent or not (default true - not supported yet) */\r\n //dragOut?: boolean;\r\n\r\n /** the type of engine to create (so you can subclass) default to GridStackEngine */\r\n engineClass?: typeof GridStackEngine;\r\n\r\n /** enable floating widgets (default?: false) See example (http://gridstack.github.io/gridstack.js/demo/float.html) */\r\n float?: boolean;\r\n\r\n /** draggable handle selector (default?: '.grid-stack-item-content') */\r\n handle?: string;\r\n\r\n /** draggable handle class (e.g. 'grid-stack-item-content'). If set 'handle' is ignored (default?: null) */\r\n handleClass?: string;\r\n\r\n /** additional widget class (default?: 'grid-stack-item') */\r\n itemClass?: string;\r\n\r\n /** re-layout mode when we're a subgrid and we are being resized. default to 'list' */\r\n layout?: ColumnOptions;\r\n\r\n /** true when widgets are only created when they scroll into view (visible) */\r\n lazyLoad?: boolean;\r\n\r\n /**\r\n * gap between grid item and content (default?: 10). This will set all 4 sides and support the CSS formats below\r\n * an integer (px)\r\n * a string with possible units (ex: '2em', '20px', '2rem')\r\n * string with space separated values (ex: '5px 10px 0 20px' for all 4 sides, or '5em 10em' for top/bottom and left/right pairs like CSS).\r\n * Note: all sides must have same units (last one wins, default px)\r\n */\r\n margin?: numberOrString;\r\n\r\n /** OLD way to optionally set each side - use margin: '5px 10px 0 20px' instead. Used internally to store each side. */\r\n marginTop?: numberOrString;\r\n marginRight?: numberOrString;\r\n marginBottom?: numberOrString;\r\n marginLeft?: numberOrString;\r\n\r\n /** (internal) unit for margin (default? 'px') set when `margin` is set as string with unit (ex: 2rem') */\r\n marginUnit?: string;\r\n\r\n /** maximum rows amount. Default? is 0 which means no maximum rows */\r\n maxRow?: number;\r\n\r\n /** minimum rows amount which is handy to prevent grid from collapsing when empty. Default is `0`.\r\n * When no set the `min-height` CSS attribute on the grid div (in pixels) can be used, which will round to the closest row.\r\n */\r\n minRow?: number;\r\n\r\n /** If you are using a nonce-based Content Security Policy, pass your nonce here and\r\n * GridStack will add it to the