From 88a8f209a42b23e8cf9192b4b9b04f9ae9f361d9 Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Sun, 6 Jul 2025 18:06:05 -0700 Subject: [PATCH 01/29] v12.2.2-dev --- angular/projects/lib/src/lib/base-widget.ts | 2 +- angular/projects/lib/src/lib/gridstack-item.component.ts | 2 +- angular/projects/lib/src/lib/gridstack.component.ts | 2 +- angular/projects/lib/src/lib/gridstack.module.ts | 2 +- angular/projects/lib/src/lib/types.ts | 2 +- package.json | 2 +- src/dd-base-impl.ts | 2 +- src/dd-draggable.ts | 2 +- src/dd-droppable.ts | 2 +- src/dd-element.ts | 2 +- src/dd-gridstack.ts | 2 +- src/dd-manager.ts | 2 +- src/dd-resizable-handle.ts | 2 +- src/dd-resizable.ts | 2 +- src/dd-touch.ts | 2 +- src/gridstack-engine.ts | 2 +- src/gridstack.scss | 2 +- src/gridstack.ts | 4 ++-- src/types.ts | 2 +- src/utils.ts | 2 +- 20 files changed, 21 insertions(+), 21 deletions(-) diff --git a/angular/projects/lib/src/lib/base-widget.ts b/angular/projects/lib/src/lib/base-widget.ts index 9f0e32a52..d548e7911 100644 --- a/angular/projects/lib/src/lib/base-widget.ts +++ b/angular/projects/lib/src/lib/base-widget.ts @@ -1,5 +1,5 @@ /** - * gridstack-item.component.ts 12.2.2 + * gridstack-item.component.ts 12.2.2-dev * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license */ diff --git a/angular/projects/lib/src/lib/gridstack-item.component.ts b/angular/projects/lib/src/lib/gridstack-item.component.ts index 1b698737f..8308d844f 100644 --- a/angular/projects/lib/src/lib/gridstack-item.component.ts +++ b/angular/projects/lib/src/lib/gridstack-item.component.ts @@ -1,5 +1,5 @@ /** - * gridstack-item.component.ts 12.2.2 + * gridstack-item.component.ts 12.2.2-dev * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license */ diff --git a/angular/projects/lib/src/lib/gridstack.component.ts b/angular/projects/lib/src/lib/gridstack.component.ts index ac675ca71..529da7502 100644 --- a/angular/projects/lib/src/lib/gridstack.component.ts +++ b/angular/projects/lib/src/lib/gridstack.component.ts @@ -1,5 +1,5 @@ /** - * gridstack.component.ts 12.2.2 + * gridstack.component.ts 12.2.2-dev * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license */ diff --git a/angular/projects/lib/src/lib/gridstack.module.ts b/angular/projects/lib/src/lib/gridstack.module.ts index 4fdf76f85..7aaf145dc 100644 --- a/angular/projects/lib/src/lib/gridstack.module.ts +++ b/angular/projects/lib/src/lib/gridstack.module.ts @@ -1,5 +1,5 @@ /** - * gridstack.component.ts 12.2.2 + * gridstack.component.ts 12.2.2-dev * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license */ diff --git a/angular/projects/lib/src/lib/types.ts b/angular/projects/lib/src/lib/types.ts index 3b138a13f..6d840509a 100644 --- a/angular/projects/lib/src/lib/types.ts +++ b/angular/projects/lib/src/lib/types.ts @@ -1,5 +1,5 @@ /** - * gridstack-item.component.ts 12.2.2 + * gridstack-item.component.ts 12.2.2-dev * Copyright (c) 2025 Alain Dumesny - see GridStack root license */ diff --git a/package.json b/package.json index bfca17e98..f388d4900 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gridstack", - "version": "12.2.2", + "version": "12.2.2-dev", "license": "MIT", "author": "Alain Dumesny (https://github.com/adumesny)", "contributors": [ diff --git a/src/dd-base-impl.ts b/src/dd-base-impl.ts index 1ae39642a..40e80328d 100644 --- a/src/dd-base-impl.ts +++ b/src/dd-base-impl.ts @@ -1,5 +1,5 @@ /** - * dd-base-impl.ts 12.2.2 + * dd-base-impl.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-draggable.ts b/src/dd-draggable.ts index f6eb3c5e7..c1f183163 100644 --- a/src/dd-draggable.ts +++ b/src/dd-draggable.ts @@ -1,5 +1,5 @@ /** - * dd-draggable.ts 12.2.2 + * dd-draggable.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-droppable.ts b/src/dd-droppable.ts index 15569bae7..7d5c47abb 100644 --- a/src/dd-droppable.ts +++ b/src/dd-droppable.ts @@ -1,5 +1,5 @@ /** - * dd-droppable.ts 12.2.2 + * dd-droppable.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-element.ts b/src/dd-element.ts index 9aafcca37..552118fdd 100644 --- a/src/dd-element.ts +++ b/src/dd-element.ts @@ -1,5 +1,5 @@ /** - * dd-elements.ts 12.2.2 + * dd-elements.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-gridstack.ts b/src/dd-gridstack.ts index 9f0184965..55714167e 100644 --- a/src/dd-gridstack.ts +++ b/src/dd-gridstack.ts @@ -1,5 +1,5 @@ /** - * dd-gridstack.ts 12.2.2 + * dd-gridstack.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-manager.ts b/src/dd-manager.ts index 8707ea567..3c6e4ad31 100644 --- a/src/dd-manager.ts +++ b/src/dd-manager.ts @@ -1,5 +1,5 @@ /** - * dd-manager.ts 12.2.2 + * dd-manager.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-resizable-handle.ts b/src/dd-resizable-handle.ts index c59c9f7ef..8cd115e93 100644 --- a/src/dd-resizable-handle.ts +++ b/src/dd-resizable-handle.ts @@ -1,5 +1,5 @@ /** - * dd-resizable-handle.ts 12.2.2 + * dd-resizable-handle.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-resizable.ts b/src/dd-resizable.ts index c99465602..b9a124ccb 100644 --- a/src/dd-resizable.ts +++ b/src/dd-resizable.ts @@ -1,5 +1,5 @@ /** - * dd-resizable.ts 12.2.2 + * dd-resizable.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/dd-touch.ts b/src/dd-touch.ts index 4c7663628..8ae35f39d 100644 --- a/src/dd-touch.ts +++ b/src/dd-touch.ts @@ -1,5 +1,5 @@ /** - * touch.ts 12.2.2 + * touch.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/gridstack-engine.ts b/src/gridstack-engine.ts index d2fef54b7..8e1fe98dc 100644 --- a/src/gridstack-engine.ts +++ b/src/gridstack-engine.ts @@ -1,5 +1,5 @@ /** - * gridstack-engine.ts 12.2.2 + * gridstack-engine.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/gridstack.scss b/src/gridstack.scss index bebd23c0c..83cf08233 100644 --- a/src/gridstack.scss +++ b/src/gridstack.scss @@ -1,5 +1,5 @@ /** - * gridstack SASS styles 12.2.2 + * gridstack SASS styles 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/gridstack.ts b/src/gridstack.ts index 2cb5b0d3c..7831f9d55 100644 --- a/src/gridstack.ts +++ b/src/gridstack.ts @@ -1,5 +1,5 @@ /*! - * GridStack 12.2.2 + * GridStack 12.2.2-dev * https://gridstackjs.com/ * * Copyright (c) 2021-2024 Alain Dumesny @@ -1897,7 +1897,7 @@ export class GridStack { return this; } - static GDRev = '12.2.2'; + static GDRev = '12.2.2-dev'; /* =========================================================================================== * drag&drop methods that used to be stubbed out and implemented in dd-gridstack.ts diff --git a/src/types.ts b/src/types.ts index 941a7eac6..56e5df2a9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,5 @@ /** - * types.ts 12.2.2 + * types.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ diff --git a/src/utils.ts b/src/utils.ts index 313e4b3dd..09e9e03d2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,5 @@ /** - * utils.ts 12.2.2 + * utils.ts 12.2.2-dev * Copyright (c) 2021-2024 Alain Dumesny - see GridStack root license */ From 2df0ebace80831b37246ddc5c7369bc2454e5e70 Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Fri, 11 Jul 2025 09:25:40 -0700 Subject: [PATCH 02/29] new slack invite --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f82c629d8..a1172ebcd 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -9,7 +9,7 @@ assignees: '' ## Subject of the issue Describe your issue here. -If unsure if lib bug, use slack channel instead: https://join.slack.com/t/gridstackjs/shared_invite/zt-2qa21lnxz-vw29RdTFet3N6~ABqT9kwA +If unsure if lib bug, use slack channel instead: https://join.slack.com/t/gridstackjs/shared_invite/zt-3978nsff6-HDNE_N45DydP36NBSV9JFQ ## Your environment * version of gridstack.js - DON'T SAY LATEST as that doesn't mean anything a month/year from now. diff --git a/README.md b/README.md index 360721e91..502ecf29e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ If you find this lib useful, please donate [PayPal](https://www.paypal.me/alaind [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/alaind831) [![Donate](https://img.shields.io/badge/Donate-Venmo-g.svg)](https://www.venmo.com/adumesny) -Join us on Slack: [https://gridstackjs.slack.com](https://join.slack.com/t/gridstackjs/shared_invite/zt-2qa21lnxz-vw29RdTFet3N6~ABqT9kwA) +Join us on Slack: [https://gridstackjs.slack.com](https://join.slack.com/t/gridstackjs/shared_invite/zt-3978nsff6-HDNE_N45DydP36NBSV9JFQ) From 4ec9decf40581622b8f511a2f42a7319fdeb1aae Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Tue, 22 Jul 2025 13:35:37 -0700 Subject: [PATCH 03/29] update gitignore --- .gitignore | 1 + src/gridstack.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d58eb8745..8a0eab455 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ dist_save node_modules .vscode .idea/ +.DS_Store diff --git a/src/gridstack.ts b/src/gridstack.ts index 7831f9d55..df1b7d6dd 100644 --- a/src/gridstack.ts +++ b/src/gridstack.ts @@ -420,13 +420,14 @@ export class GridStack { * @param w GridStackWidget definition. used MakeWidget(el) if you have dom element instead. */ public addWidget(w: GridStackWidget): GridItemHTMLElement { + if (!w) return; if (typeof w === 'string') { console.error('V11: GridStack.addWidget() does not support string anymore. see #2736'); return; } if ((w as HTMLElement).ELEMENT_NODE) { console.error('V11: GridStack.addWidget() does not support HTMLElement anymore. use makeWidget()'); return this.makeWidget(w as HTMLElement); } let el: GridItemHTMLElement; let node: GridStackNode = w; node.grid = this; - if (node?.el) { + if (node.el) { el = node.el; // re-use element stored in the node } else if (GridStack.addRemoveCB) { el = GridStack.addRemoveCB(this.el, w, true, false); From a5f19683a09c3d24333de362833ef261ab81a836 Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Thu, 24 Jul 2025 09:48:30 -0700 Subject: [PATCH 04/29] scroll take into account ScrollContainer position * fix #3099 * no example were given, but the code looks resonnable, but broke scrolling entire page so I fixed to take the scroll vs page into accound Note: auto scrolling needs a major revamp (too fast) as well. --- src/utils.ts | 65 ++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 09e9e03d2..2f94473eb 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -220,7 +220,7 @@ export class Utils { target[key] = source[key]; } else if (typeof source[key] === 'object' && typeof target[key] === 'object') { // property is an object, recursively add it's field over... #1373 - this.defaults(target[key], source[key]); + Utils.defaults(target[key], source[key]); } } }); @@ -346,45 +346,40 @@ export class Utils { if (overflowRegex.test(style.overflow + style.overflowY)) { return el; } else { - return this.getScrollElement(el.parentElement); + return Utils.getScrollElement(el.parentElement); } } /** @internal */ static updateScrollPosition(el: HTMLElement, position: {top: number}, distance: number): void { - // is widget in view? - const rect = el.getBoundingClientRect(); + const scrollEl = Utils.getScrollElement(el); + if (!scrollEl) return; + + const elRect = el.getBoundingClientRect(); + const scrollRect = scrollEl.getBoundingClientRect(); const innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight); - if (rect.top < 0 || - rect.bottom > innerHeightOrClientHeight - ) { - // set scrollTop of first parent that scrolls - // if parent is larger than el, set as low as possible - // to get entire widget on screen - const offsetDiffDown = rect.bottom - innerHeightOrClientHeight; - const offsetDiffUp = rect.top; - const scrollEl = this.getScrollElement(el); - if (scrollEl !== null) { - const prevScroll = scrollEl.scrollTop; - if (rect.top < 0 && distance < 0) { - // moving up - if (el.offsetHeight > innerHeightOrClientHeight) { - scrollEl.scrollTop += distance; - } else { - scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp; - } - } else if (distance > 0) { - // moving down - if (el.offsetHeight > innerHeightOrClientHeight) { - scrollEl.scrollTop += distance; - } else { - scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown; - } - } - // move widget y by amount scrolled - position.top += scrollEl.scrollTop - prevScroll; + + const offsetDiffDown = elRect.bottom - Math.min(scrollRect.bottom, innerHeightOrClientHeight); + const offsetDiffUp = elRect.top - Math.max(scrollRect.top, 0); + const prevScroll = scrollEl.scrollTop; + + if (offsetDiffUp < 0 && distance < 0) { + // scroll up + if (el.offsetHeight > scrollRect.height) { + scrollEl.scrollTop += distance; + } else { + scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp; + } + } else if (offsetDiffDown > 0 && distance > 0) { + // scroll down + if (el.offsetHeight > scrollRect.height) { + scrollEl.scrollTop += distance; + } else { + scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown; } } + + position.top += scrollEl.scrollTop - prevScroll; } /** @@ -395,13 +390,13 @@ export class Utils { * @param distance Distance from the V edges to start scrolling */ static updateScrollResize(event: MouseEvent, el: HTMLElement, distance: number): void { - const scrollEl = this.getScrollElement(el); + const scrollEl = Utils.getScrollElement(el); const height = scrollEl.clientHeight; // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top // #1745 Special situation if scrollEl is document 'html': here browser spec states that // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element; // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself. - const offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top; + const offsetTop = (scrollEl === Utils.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top; const pointerPosY = event.clientY - offsetTop; const top = pointerPosY < distance; const bottom = pointerPosY > height - distance; @@ -562,7 +557,7 @@ export class Utils { /** returns true if event is inside the given element rectangle */ // Note: Safari Mac has null event.relatedTarget which causes #1684 so check if DragEvent is inside the coordinates instead - // this.el.contains(event.relatedTarget as HTMLElement) + // Utils.el.contains(event.relatedTarget as HTMLElement) // public static inside(e: MouseEvent, el: HTMLElement): boolean { // // srcElement, toElement, target: all set to placeholder when leaving simple grid, so we can't use that (Chrome) // const target: HTMLElement = e.relatedTarget || (e as any).fromElement; From ed81728d0085db9e972234847718ee5b3aad7652 Mon Sep 17 00:00:00 2001 From: tearf001 Date: Tue, 29 Jul 2025 04:31:26 +0800 Subject: [PATCH 05/29] feat(test): add vitest setup and widget container tests fix (fix #2937) - fix multiple grids crash. Implement WeakMap-based widget container tracking in GridStackRenderProvider - Configure vitest with jsdom environment in vite.config.ts - Add test scripts and dependencies to package.json - Add comprehensive test suite for widget container management --- react/lib/grid-stack-render-provider.test.tsx | 141 +++ react/lib/grid-stack-render-provider.tsx | 26 +- react/package.json | 9 +- react/src/demo/demo.tsx | 14 +- react/vite.config.ts | 4 + react/yarn.lock | 896 +++++++++++++++++- 6 files changed, 1082 insertions(+), 8 deletions(-) create mode 100644 react/lib/grid-stack-render-provider.test.tsx diff --git a/react/lib/grid-stack-render-provider.test.tsx b/react/lib/grid-stack-render-provider.test.tsx new file mode 100644 index 000000000..53cb6cc26 --- /dev/null +++ b/react/lib/grid-stack-render-provider.test.tsx @@ -0,0 +1,141 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { gridWidgetContainersMap } from './grid-stack-render-provider'; + +// Mock GridStack type +class MockGridStack { + el: HTMLElement; + constructor() { + this.el = document.createElement('div'); + } +} + +describe('GridStackRenderProvider', () => { + beforeEach(() => { + // Clear the WeakMap before each test + gridWidgetContainersMap.constructor.prototype.clear?.call(gridWidgetContainersMap); + }); + + it('should store widget containers in WeakMap for each grid instance', () => { + // Mock grid instances + const grid1 = new MockGridStack() as any; + const grid2 = new MockGridStack() as any; + const widget1 = { id: '1', grid: grid1 }; + const widget2 = { id: '2', grid: grid2 }; + const element1 = document.createElement('div'); + const element2 = document.createElement('div'); + + // Simulate renderCB + const renderCB = (element, widget) => { + if (widget.id && widget.grid) { + // Get or create the widget container map for this grid instance + let containers = gridWidgetContainersMap.get(widget.grid); + if (!containers) { + containers = new Map(); + gridWidgetContainersMap.set(widget.grid, containers); + } + containers.set(widget.id, element); + } + }; + + renderCB(element1, widget1); + renderCB(element2, widget2); + + const containers1 = gridWidgetContainersMap.get(grid1); + const containers2 = gridWidgetContainersMap.get(grid2); + + expect(containers1?.get('1')).toBe(element1); + expect(containers2?.get('2')).toBe(element2); + }); + + it('should not have containers for different grid instances mixed up', () => { + const grid1 = new MockGridStack() as any; + const grid2 = new MockGridStack() as any; + const widget1 = { id: '1', grid: grid1 }; + const widget2 = { id: '2', grid: grid1 }; + const widget3 = { id: '3', grid: grid2 }; + const element1 = document.createElement('div'); + const element2 = document.createElement('div'); + const element3 = document.createElement('div'); + + // Simulate renderCB + const renderCB = (element: HTMLElement, widget: any) => { + if (widget.id && widget.grid) { + let containers = gridWidgetContainersMap.get(widget.grid); + if (!containers) { + containers = new Map(); + gridWidgetContainersMap.set(widget.grid, containers); + } + containers.set(widget.id, element); + } + }; + + renderCB(element1, widget1); + renderCB(element2, widget2); + renderCB(element3, widget3); + + const containers1 = gridWidgetContainersMap.get(grid1); + const containers2 = gridWidgetContainersMap.get(grid2); + + // Grid1 should have widgets 1 and 2 + expect(containers1?.size).toBe(2); + expect(containers1?.get('1')).toBe(element1); + expect(containers1?.get('2')).toBe(element2); + expect(containers1?.get('3')).toBeUndefined(); + + // Grid2 should only have widget 3 + expect(containers2?.size).toBe(1); + expect(containers2?.get('3')).toBe(element3); + expect(containers2?.get('1')).toBeUndefined(); + expect(containers2?.get('2')).toBeUndefined(); + }); + + it('should clean up when grid instance is deleted from WeakMap', () => { + const grid = new MockGridStack() as any; + const widget = { id: '1', grid }; + const element = document.createElement('div'); + + // Add to WeakMap + const containers = new Map(); + containers.set(widget.id, element); + gridWidgetContainersMap.set(grid, containers); + + // Verify it exists + expect(gridWidgetContainersMap.has(grid)).toBe(true); + + // Delete from WeakMap + gridWidgetContainersMap.delete(grid); + + // Verify it's gone + expect(gridWidgetContainersMap.has(grid)).toBe(false); + }); + + it('should handle multiple widgets in the same grid', () => { + const grid = new MockGridStack() as any; + const widgets = [ + { id: '1', grid }, + { id: '2', grid }, + { id: '3', grid }, + ]; + const elements = widgets.map(() => document.createElement('div')); + + // Simulate renderCB for all widgets + widgets.forEach((widget, index) => { + const element = elements[index]; + if (widget.id && widget.grid) { + let containers = gridWidgetContainersMap.get(widget.grid); + if (!containers) { + containers = new Map(); + gridWidgetContainersMap.set(widget.grid, containers); + } + containers.set(widget.id, element); + } + }); + + const containers = gridWidgetContainersMap.get(grid); + expect(containers?.size).toBe(3); + expect(containers?.get('1')).toBe(elements[0]); + expect(containers?.get('2')).toBe(elements[1]); + expect(containers?.get('3')).toBe(elements[2]); + }); +}); + diff --git a/react/lib/grid-stack-render-provider.tsx b/react/lib/grid-stack-render-provider.tsx index 82c8e1f24..793e121d9 100644 --- a/react/lib/grid-stack-render-provider.tsx +++ b/react/lib/grid-stack-render-provider.tsx @@ -10,6 +10,9 @@ import { GridStack, GridStackOptions, GridStackWidget } from "gridstack"; import { GridStackRenderContext } from "./grid-stack-render-context"; import isEqual from "react-fast-compare"; +// WeakMap to store widget containers for each grid instance +export const gridWidgetContainersMap = new WeakMap>(); + export function GridStackRenderProvider({ children }: PropsWithChildren) { const { _gridStack: { value: gridStack, set: setGridStack }, @@ -21,8 +24,17 @@ export function GridStackRenderProvider({ children }: PropsWithChildren) { const optionsRef = useRef(initialOptions); const renderCBFn = useCallback( - (element: HTMLElement, widget: GridStackWidget) => { - if (widget.id) { + (element: HTMLElement, widget: GridStackWidget & { grid?: GridStack }) => { + if (widget.id && widget.grid) { + // Get or create the widget container map for this grid instance + let containers = gridWidgetContainersMap.get(widget.grid); + if (!containers) { + containers = new Map(); + gridWidgetContainersMap.set(widget.grid, containers); + } + containers.set(widget.id, element); + + // Also update the local ref for backward compatibility widgetContainersRef.current.set(widget.id, element); } }, @@ -50,6 +62,8 @@ export function GridStackRenderProvider({ children }: PropsWithChildren) { gridStack.removeAll(false); gridStack.destroy(false); widgetContainersRef.current.clear(); + // Clean up the WeakMap entry for this grid instance + gridWidgetContainersMap.delete(gridStack); optionsRef.current = initialOptions; setGridStack(initGrid()); } catch (e) { @@ -73,6 +87,14 @@ export function GridStackRenderProvider({ children }: PropsWithChildren) { value={useMemo( () => ({ getWidgetContainer: (widgetId: string) => { + // First try to get from the current grid instance's map + if (gridStack) { + const containers = gridWidgetContainersMap.get(gridStack); + if (containers?.has(widgetId)) { + return containers.get(widgetId) || null; + } + } + // Fallback to local ref for backward compatibility return widgetContainersRef.current.get(widgetId) || null; }, }), diff --git a/react/package.json b/react/package.json index 04e8fb239..100f62801 100644 --- a/react/package.json +++ b/react/package.json @@ -8,23 +8,28 @@ "start": "vite", "build": "tsc -b && vite build", "lint": "eslint .", - "preview": "vite preview" + "preview": "vite preview", + "test": "vitest", + "test:ui": "vitest --ui" }, "dependencies": { "gridstack": "^12.2.2", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-fast-compare": "^3.2.2" + "react-fast-compare": "^3.2.2", + "vitest": "^3.2.4" }, "devDependencies": { "@eslint/js": "^9.9.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react-swc": "^3.5.0", + "@vitest/ui": "^3.2.4", "eslint": "^9.9.0", "eslint-plugin-react-hooks": "^5.1.0-rc.0", "eslint-plugin-react-refresh": "^0.4.9", "globals": "^15.9.0", + "jsdom": "^26.1.0", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", "vite": "^5.4.19" diff --git a/react/src/demo/demo.tsx b/react/src/demo/demo.tsx index 6b02be90f..b0b4b6b53 100644 --- a/react/src/demo/demo.tsx +++ b/react/src/demo/demo.tsx @@ -8,6 +8,7 @@ import { GridStackRenderProvider, useGridStackContext, } from "../../lib"; +// import { GridStackRenderProvider } from "../../lib/grid-stack-render-provider-single"; import "gridstack/dist/gridstack.css"; import "./demo.css"; @@ -134,17 +135,26 @@ const gridOptions: GridStackOptions = { export function GridStackDemo() { // ! Uncontrolled const [initialOptions] = useState(gridOptions); + const [initialOptions2] = useState({}); return ( + <> - - + + + + + + + + + ); } diff --git a/react/vite.config.ts b/react/vite.config.ts index 861b04b35..61f32f2dc 100644 --- a/react/vite.config.ts +++ b/react/vite.config.ts @@ -4,4 +4,8 @@ import react from '@vitejs/plugin-react-swc' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + test: { + environment: 'jsdom', + globals: true, + }, }) diff --git a/react/yarn.lock b/react/yarn.lock index 50eefc541..b2617bd8b 100644 --- a/react/yarn.lock +++ b/react/yarn.lock @@ -2,121 +2,290 @@ # yarn lockfile v1 +"@asamuzakjp/css-color@^3.2.0": + version "3.2.0" + resolved "https://registry.npmmirror.com/@asamuzakjp/css-color/-/css-color-3.2.0.tgz#cc42f5b85c593f79f1fa4f25d2b9b321e61d1794" + integrity sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw== + dependencies: + "@csstools/css-calc" "^2.1.3" + "@csstools/css-color-parser" "^3.0.9" + "@csstools/css-parser-algorithms" "^3.0.4" + "@csstools/css-tokenizer" "^3.0.3" + lru-cache "^10.4.3" + +"@csstools/color-helpers@^5.0.2": + version "5.0.2" + resolved "https://registry.npmmirror.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz#82592c9a7c2b83c293d9161894e2a6471feb97b8" + integrity sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA== + +"@csstools/css-calc@^2.1.3", "@csstools/css-calc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmmirror.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" + integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== + +"@csstools/css-color-parser@^3.0.9": + version "3.0.10" + resolved "https://registry.npmmirror.com/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz#79fc68864dd43c3b6782d2b3828bc0fa9d085c10" + integrity sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg== + dependencies: + "@csstools/color-helpers" "^5.0.2" + "@csstools/css-calc" "^2.1.4" + +"@csstools/css-parser-algorithms@^3.0.4": + version "3.0.5" + resolved "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + +"@csstools/css-tokenizer@^3.0.3": + version "3.0.4" + resolved "https://registry.npmmirror.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + "@esbuild/aix-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== +"@esbuild/aix-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz#a1414903bb38027382f85f03dda6065056757727" + integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA== + "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== +"@esbuild/android-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz#c859994089e9767224269884061f89dae6fb51c6" + integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w== + "@esbuild/android-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== +"@esbuild/android-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz#96a8f2ca91c6cd29ea90b1af79d83761c8ba0059" + integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw== + "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== +"@esbuild/android-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz#a3a626c4fec4a024a9fa8c7679c39996e92916f0" + integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA== + "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== +"@esbuild/darwin-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz#a5e1252ca2983d566af1c0ea39aded65736fc66d" + integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw== + "@esbuild/darwin-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== +"@esbuild/darwin-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz#5271b0df2bb12ce8df886704bfdd1c7cc01385d2" + integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg== + "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== +"@esbuild/freebsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz#d0a0e7fdf19733b8bb1566b81df1aa0bb7e46ada" + integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA== + "@esbuild/freebsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== +"@esbuild/freebsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz#2de8b2e0899d08f1cb1ef3128e159616e7e85343" + integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw== + "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== +"@esbuild/linux-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz#a4209efadc0c2975716458484a4e90c237c48ae9" + integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w== + "@esbuild/linux-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== +"@esbuild/linux-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz#ccd9e291c24cd8d9142d819d463e2e7200d25b19" + integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg== + "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== +"@esbuild/linux-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz#006ad1536d0c2b28fb3a1cf0b53bcb85aaf92c4d" + integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg== + "@esbuild/linux-loong64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== +"@esbuild/linux-loong64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz#127b3fbfb2c2e08b1397e985932f718f09a8f5c4" + integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ== + "@esbuild/linux-mips64el@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== +"@esbuild/linux-mips64el@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz#837d1449517791e3fa7d82675a2d06d9f56cb340" + integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw== + "@esbuild/linux-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== +"@esbuild/linux-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz#aa2e3bd93ab8df084212f1895ca4b03c42d9e0fe" + integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ== + "@esbuild/linux-riscv64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== +"@esbuild/linux-riscv64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz#a340620e31093fef72767dd28ab04214b3442083" + integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg== + "@esbuild/linux-s390x@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== +"@esbuild/linux-s390x@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz#ddfed266c8c13f5efb3105a0cd47f6dcd0e79e71" + integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg== + "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== +"@esbuild/linux-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz#9a4f78c75c051e8c060183ebb39a269ba936a2ac" + integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ== + +"@esbuild/netbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz#902c80e1d678047926387230bc037e63e00697d0" + integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw== + "@esbuild/netbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== +"@esbuild/netbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz#2d9eb4692add2681ff05a14ce99de54fbed7079c" + integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg== + +"@esbuild/openbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz#89c3b998c6de739db38ab7fb71a8a76b3fa84a45" + integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ== + "@esbuild/openbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== +"@esbuild/openbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz#2f01615cf472b0e48c077045cfd96b5c149365cc" + integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ== + +"@esbuild/openharmony-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz#a201f720cd2c3ebf9a6033fcc3feb069a54b509a" + integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg== + "@esbuild/sunos-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== +"@esbuild/sunos-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz#07046c977985a3334667f19e6ab3a01a80862afb" + integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w== + "@esbuild/win32-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== +"@esbuild/win32-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz#4a5470caf0d16127c05d4833d4934213c69392d1" + integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ== + "@esbuild/win32-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== +"@esbuild/win32-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz#3de3e8470b7b328d99dbc3e9ec1eace207e5bbc4" + integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg== + "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== +"@esbuild/win32-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz#610d7ea539d2fcdbe39237b5cc175eb2c4451f9c" + integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -180,6 +349,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -201,86 +375,191 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.29" + resolved "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" + integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== + "@rollup/rollup-android-arm-eabi@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz#e0f5350845090ca09690fe4a472717f3b8aae225" integrity sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww== +"@rollup/rollup-android-arm-eabi@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.1.tgz#c659481d5b15054d4636b3dd0c2f50ab3083d839" + integrity sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw== + "@rollup/rollup-android-arm64@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz#08270faef6747e2716d3e978a8bbf479f75fb19a" integrity sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ== +"@rollup/rollup-android-arm64@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.1.tgz#7e05c3c0bf6a79ee6b40ab5e778679742f06815d" + integrity sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw== + "@rollup/rollup-darwin-arm64@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz#691671133b350661328d42c8dbdedd56dfb97dfd" integrity sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw== +"@rollup/rollup-darwin-arm64@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.1.tgz#b190fbd0274fbbd4d257ff0b3d68f0885c454e0d" + integrity sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A== + "@rollup/rollup-darwin-x64@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz#b2ec52a1615f24b1cd40bc8906ae31af81e8a342" integrity sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg== +"@rollup/rollup-darwin-x64@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.1.tgz#a4df7fa06ac318b66a6aa66d6f1e0a58fef58cd3" + integrity sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA== + +"@rollup/rollup-freebsd-arm64@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.1.tgz#6634478a78a0c17dcf55adb621fa66faa58a017b" + integrity sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig== + +"@rollup/rollup-freebsd-x64@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.1.tgz#db42c46c0263b2562e2ba5c2e00e318646f2b24c" + integrity sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w== + "@rollup/rollup-linux-arm-gnueabihf@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz#217f01f304808920680bd269002df38e25d9205f" integrity sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw== +"@rollup/rollup-linux-arm-gnueabihf@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.1.tgz#88ca443ad42c70555978b000c6d1dd925fb3203b" + integrity sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ== + "@rollup/rollup-linux-arm-musleabihf@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz#93ac1c5a1e389f4482a2edaeec41fcffee54a930" integrity sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ== +"@rollup/rollup-linux-arm-musleabihf@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.1.tgz#36106fe103d32c2a97583ebadcfb28dc63988bda" + integrity sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ== + "@rollup/rollup-linux-arm64-gnu@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz#a7f146787d6041fecc4ecdf1aa72234661ca94a4" integrity sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w== +"@rollup/rollup-linux-arm64-gnu@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.1.tgz#00c28bc9210dcfbb5e7fa8e52fd827fb570afe26" + integrity sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA== + "@rollup/rollup-linux-arm64-musl@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz#6a37236189648e678bd564d6e8ca798f42cf42c5" integrity sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw== +"@rollup/rollup-linux-arm64-musl@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.1.tgz#45a13486b5523235eb87b349e7ca5a0bb85a5b0e" + integrity sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg== + +"@rollup/rollup-linux-loongarch64-gnu@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.1.tgz#b8edd99f072cd652acbbddc1c539b1ac4254381d" + integrity sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw== + "@rollup/rollup-linux-powerpc64le-gnu@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz#5661420dc463bec31ecb2d17d113de858cfcfe2d" integrity sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w== +"@rollup/rollup-linux-ppc64-gnu@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.1.tgz#0ec72a4f8b7a86b13c0f6b7666ed1d3b6e8e67cc" + integrity sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA== + "@rollup/rollup-linux-riscv64-gnu@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz#cb00342b7432bdef723aa606281de2f522d6dcf7" integrity sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A== +"@rollup/rollup-linux-riscv64-gnu@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.1.tgz#99f06928528fb58addd12e50827e1a0269c1cca8" + integrity sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ== + +"@rollup/rollup-linux-riscv64-musl@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.1.tgz#3c14aba63b4170fe3d9d0b6ad98361366170590e" + integrity sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w== + "@rollup/rollup-linux-s390x-gnu@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz#0708889674dccecccd28e2befccf791e0767fcb7" integrity sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ== +"@rollup/rollup-linux-s390x-gnu@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.1.tgz#34c647a823dcdca0f749a2bdcbde4fb131f37a4c" + integrity sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA== + "@rollup/rollup-linux-x64-gnu@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz#a135b040b21582e91cfed2267ccfc7d589e1dbc6" integrity sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA== +"@rollup/rollup-linux-x64-gnu@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.1.tgz#3991010418c005e8791c415e7c2072b247157710" + integrity sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ== + "@rollup/rollup-linux-x64-musl@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz#88395a81a3ab7ee3dc8dc31a73ff62ed3185f34d" integrity sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g== +"@rollup/rollup-linux-x64-musl@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.1.tgz#f3943e5f284f40ffbcf4a14da9ee2e43d303b462" + integrity sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA== + "@rollup/rollup-win32-arm64-msvc@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz#12ee49233b1125f2c1da38392f63b1dbb0c31bba" integrity sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w== +"@rollup/rollup-win32-arm64-msvc@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.1.tgz#45b5a1d3f0af63f85044913c371d7b0519c913ad" + integrity sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw== + "@rollup/rollup-win32-ia32-msvc@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz#0f987b134c6b3123c22842b33ba0c2b6fb78cc3b" integrity sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg== +"@rollup/rollup-win32-ia32-msvc@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.1.tgz#900ef7211d2929e9809f3a044c4e2fd3aa685a0c" + integrity sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q== + "@rollup/rollup-win32-x64-msvc@4.22.5": version "4.22.5" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz#f2feb149235a5dc1deb5439758f8871255e5a161" integrity sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ== +"@rollup/rollup-win32-x64-msvc@4.46.1": + version "4.46.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.1.tgz#932d8696dfef673bee1a1e291a5531d25a6903be" + integrity sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ== + "@swc/core-darwin-arm64@1.7.26": version "1.7.26" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz#5f4096c00e71771ca1b18c824f0c92a052c70760" @@ -362,11 +641,28 @@ dependencies: "@swc/counter" "^0.1.3" +"@types/chai@^5.2.2": + version "5.2.2" + resolved "https://registry.npmmirror.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== + dependencies: + "@types/deep-eql" "*" + +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.npmmirror.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + "@types/estree@1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/estree@1.0.8", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + "@types/prop-types@*": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" @@ -475,6 +771,80 @@ dependencies: "@swc/core" "^1.5.7" +"@vitest/expect@3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" + integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + tinyrainbow "^2.0.0" + +"@vitest/mocker@3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/mocker/-/mocker-3.2.4.tgz#4471c4efbd62db0d4fa203e65cc6b058a85cabd3" + integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== + dependencies: + "@vitest/spy" "3.2.4" + estree-walker "^3.0.3" + magic-string "^0.30.17" + +"@vitest/pretty-format@3.2.4", "@vitest/pretty-format@^3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" + integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/runner@3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/runner/-/runner-3.2.4.tgz#5ce0274f24a971f6500f6fc166d53d8382430766" + integrity sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== + dependencies: + "@vitest/utils" "3.2.4" + pathe "^2.0.3" + strip-literal "^3.0.0" + +"@vitest/snapshot@3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-3.2.4.tgz#40a8bc0346ac0aee923c0eefc2dc005d90bc987c" + integrity sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== + dependencies: + "@vitest/pretty-format" "3.2.4" + magic-string "^0.30.17" + pathe "^2.0.3" + +"@vitest/spy@3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" + integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== + dependencies: + tinyspy "^4.0.3" + +"@vitest/ui@^3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/ui/-/ui-3.2.4.tgz#df8080537c1dcfeae353b2d3cb3301d9acafe04a" + integrity sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA== + dependencies: + "@vitest/utils" "3.2.4" + fflate "^0.8.2" + flatted "^3.3.3" + pathe "^2.0.3" + sirv "^3.0.1" + tinyglobby "^0.2.14" + tinyrainbow "^2.0.0" + +"@vitest/utils@3.2.4": + version "3.2.4" + resolved "https://registry.npmmirror.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" + integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== + dependencies: + "@vitest/pretty-format" "3.2.4" + loupe "^3.1.4" + tinyrainbow "^2.0.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -485,6 +855,11 @@ acorn@^8.12.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -512,6 +887,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -539,11 +919,27 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +chai@^5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/chai/-/chai-5.2.1.tgz#a9502462bdc79cf90b4a0953537a9908aa638b47" + integrity sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -552,6 +948,11 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -578,11 +979,34 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +cssstyle@^4.2.1: + version "4.6.0" + resolved "https://registry.npmmirror.com/cssstyle/-/cssstyle-4.6.0.tgz#ea18007024e3167f4f105315f3ec2d982bf48ed9" + integrity sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg== + dependencies: + "@asamuzakjp/css-color" "^3.2.0" + rrweb-cssom "^0.8.0" + csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +data-urls@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" + integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== + dependencies: + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + +debug@4, debug@^4.4.1: + version "4.4.1" + resolved "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" @@ -590,11 +1014,31 @@ debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "^2.1.3" +decimal.js@^10.5.0: + version "10.6.0" + resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== + +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.npmmirror.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== + +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + esbuild@^0.21.3: version "0.21.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" @@ -624,6 +1068,38 @@ esbuild@^0.21.3: "@esbuild/win32-ia32" "0.21.5" "@esbuild/win32-x64" "0.21.5" +esbuild@^0.25.0: + version "0.25.8" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.8.tgz#482d42198b427c9c2f3a81b63d7663aecb1dda07" + integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.8" + "@esbuild/android-arm" "0.25.8" + "@esbuild/android-arm64" "0.25.8" + "@esbuild/android-x64" "0.25.8" + "@esbuild/darwin-arm64" "0.25.8" + "@esbuild/darwin-x64" "0.25.8" + "@esbuild/freebsd-arm64" "0.25.8" + "@esbuild/freebsd-x64" "0.25.8" + "@esbuild/linux-arm" "0.25.8" + "@esbuild/linux-arm64" "0.25.8" + "@esbuild/linux-ia32" "0.25.8" + "@esbuild/linux-loong64" "0.25.8" + "@esbuild/linux-mips64el" "0.25.8" + "@esbuild/linux-ppc64" "0.25.8" + "@esbuild/linux-riscv64" "0.25.8" + "@esbuild/linux-s390x" "0.25.8" + "@esbuild/linux-x64" "0.25.8" + "@esbuild/netbsd-arm64" "0.25.8" + "@esbuild/netbsd-x64" "0.25.8" + "@esbuild/openbsd-arm64" "0.25.8" + "@esbuild/openbsd-x64" "0.25.8" + "@esbuild/openharmony-arm64" "0.25.8" + "@esbuild/sunos-x64" "0.25.8" + "@esbuild/win32-arm64" "0.25.8" + "@esbuild/win32-ia32" "0.25.8" + "@esbuild/win32-x64" "0.25.8" + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -725,11 +1201,23 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +expect-type@^1.2.1: + version "1.2.2" + resolved "https://registry.npmmirror.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3" + integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -763,6 +1251,16 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fdir@^6.4.4, fdir@^6.4.6: + version "6.4.6" + resolved "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" + integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== + +fflate@^0.8.2: + version "0.8.2" + resolved "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -798,6 +1296,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +flatted@^3.3.3: + version "3.3.3" + resolved "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -842,6 +1345,36 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +html-encoding-sniffer@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" + integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== + dependencies: + whatwg-encoding "^3.1.1" + +http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -882,6 +1415,11 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -892,6 +1430,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^9.0.1: + version "9.0.1" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -899,6 +1442,32 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsdom@^26.1.0: + version "26.1.0" + resolved "https://registry.npmmirror.com/jsdom/-/jsdom-26.1.0.tgz#ab5f1c1cafc04bd878725490974ea5e8bf0c72b3" + integrity sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg== + dependencies: + cssstyle "^4.2.1" + data-urls "^5.0.0" + decimal.js "^10.5.0" + html-encoding-sniffer "^4.0.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.6" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.16" + parse5 "^7.2.1" + rrweb-cssom "^0.8.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^5.1.1" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^3.1.1" + whatwg-mimetype "^4.0.0" + whatwg-url "^14.1.1" + ws "^8.18.0" + xml-name-validator "^5.0.0" + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -948,6 +1517,23 @@ loose-envify@^1.1.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^3.1.0, loupe@^3.1.4: + version "3.2.0" + resolved "https://registry.npmmirror.com/loupe/-/loupe-3.2.0.tgz#174073ba8e0a1d0d5e43cc08626ed8a19403c344" + integrity sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw== + +lru-cache@^10.4.3: + version "10.4.3" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -975,11 +1561,21 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" +mrmime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== + ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + nanoid@^3.3.7: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" @@ -990,6 +1586,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +nwsapi@^2.2.16: + version "2.2.21" + resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.21.tgz#8df7797079350adda208910d8c33fc4c2d7520c3" + integrity sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -1023,6 +1624,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse5@^7.2.1: + version "7.3.0" + resolved "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== + dependencies: + entities "^6.0.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -1033,16 +1641,36 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +pathval@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== + picocolors@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2, picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + postcss@^8.4.43: version "8.4.45" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603" @@ -1052,12 +1680,21 @@ postcss@^8.4.43: picocolors "^1.0.1" source-map-js "^1.2.0" +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -1122,6 +1759,40 @@ rollup@^4.20.0: "@rollup/rollup-win32-x64-msvc" "4.22.5" fsevents "~2.3.2" +rollup@^4.40.0: + version "4.46.1" + resolved "https://registry.npmmirror.com/rollup/-/rollup-4.46.1.tgz#287d07ef0ea17950b348b027c634a9544a1a375f" + integrity sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.46.1" + "@rollup/rollup-android-arm64" "4.46.1" + "@rollup/rollup-darwin-arm64" "4.46.1" + "@rollup/rollup-darwin-x64" "4.46.1" + "@rollup/rollup-freebsd-arm64" "4.46.1" + "@rollup/rollup-freebsd-x64" "4.46.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.46.1" + "@rollup/rollup-linux-arm-musleabihf" "4.46.1" + "@rollup/rollup-linux-arm64-gnu" "4.46.1" + "@rollup/rollup-linux-arm64-musl" "4.46.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.46.1" + "@rollup/rollup-linux-ppc64-gnu" "4.46.1" + "@rollup/rollup-linux-riscv64-gnu" "4.46.1" + "@rollup/rollup-linux-riscv64-musl" "4.46.1" + "@rollup/rollup-linux-s390x-gnu" "4.46.1" + "@rollup/rollup-linux-x64-gnu" "4.46.1" + "@rollup/rollup-linux-x64-musl" "4.46.1" + "@rollup/rollup-win32-arm64-msvc" "4.46.1" + "@rollup/rollup-win32-ia32-msvc" "4.46.1" + "@rollup/rollup-win32-x64-msvc" "4.46.1" + fsevents "~2.3.2" + +rrweb-cssom@^0.8.0: + version "0.8.0" + resolved "https://registry.npmmirror.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" + integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -1129,6 +1800,18 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.23.2: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" @@ -1153,11 +1836,35 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -source-map-js@^1.2.0: +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +sirv@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/sirv/-/sirv-3.0.1.tgz#32a844794655b727f9e2867b777e0060fbe07bf3" + integrity sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.9.0: + version "3.9.0" + resolved "https://registry.npmmirror.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1170,6 +1877,13 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-literal@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.0.0.tgz#ce9c452a91a0af2876ed1ae4e583539a353df3fc" + integrity sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA== + dependencies: + js-tokens "^9.0.1" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1177,11 +1891,61 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.npmmirror.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.14: + version "0.2.14" + resolved "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +tinypool@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/tinyspy/-/tinyspy-4.0.3.tgz#d1d0f0602f4c15f1aae083a34d6d0df3363b1b52" + integrity sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A== + +tldts-core@^6.1.86: + version "6.1.86" + resolved "https://registry.npmmirror.com/tldts-core/-/tldts-core-6.1.86.tgz#a93e6ed9d505cb54c542ce43feb14c73913265d8" + integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== + +tldts@^6.1.32: + version "6.1.86" + resolved "https://registry.npmmirror.com/tldts/-/tldts-6.1.86.tgz#087e0555b31b9725ee48ca7e77edc56115cd82f7" + integrity sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ== + dependencies: + tldts-core "^6.1.86" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1189,6 +1953,25 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tough-cookie@^5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.1.2.tgz#66d774b4a1d9e12dc75089725af3ac75ec31bed7" + integrity sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A== + dependencies: + tldts "^6.1.32" + +tr46@^5.1.0: + version "5.1.1" + resolved "https://registry.npmmirror.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca" + integrity sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw== + dependencies: + punycode "^2.3.1" + ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -1222,6 +2005,31 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +vite-node@3.2.4: + version "3.2.4" + resolved "https://registry.npmmirror.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07" + integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== + dependencies: + cac "^6.7.14" + debug "^4.4.1" + es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + +"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": + version "7.0.6" + resolved "https://registry.npmmirror.com/vite/-/vite-7.0.6.tgz#7866ccb176db4bbeec0adfb3f907f077881591d0" + integrity sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg== + dependencies: + esbuild "^0.25.0" + fdir "^6.4.6" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.40.0" + tinyglobby "^0.2.14" + optionalDependencies: + fsevents "~2.3.3" + vite@^5.4.19: version "5.4.19" resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.19.tgz#20efd060410044b3ed555049418a5e7d1998f959" @@ -1233,6 +2041,67 @@ vite@^5.4.19: optionalDependencies: fsevents "~2.3.3" +vitest@^3.2.4: + version "3.2.4" + resolved "https://registry.npmmirror.com/vitest/-/vitest-3.2.4.tgz#0637b903ad79d1539a25bc34c0ed54b5c67702ea" + integrity sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/expect" "3.2.4" + "@vitest/mocker" "3.2.4" + "@vitest/pretty-format" "^3.2.4" + "@vitest/runner" "3.2.4" + "@vitest/snapshot" "3.2.4" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + debug "^4.4.1" + expect-type "^1.2.1" + magic-string "^0.30.17" + pathe "^2.0.3" + picomatch "^4.0.2" + std-env "^3.9.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.14" + tinypool "^1.1.1" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node "3.2.4" + why-is-node-running "^2.3.0" + +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== + dependencies: + xml-name-validator "^5.0.0" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^14.0.0, whatwg-url@^14.1.1: + version "14.2.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" + integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== + dependencies: + tr46 "^5.1.0" + webidl-conversions "^7.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -1240,11 +2109,34 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +ws@^8.18.0: + version "8.18.3" + resolved "https://registry.npmmirror.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From d1b3389e6ac2e8c5a5fe2a426171b99a51f36fd8 Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Sat, 9 Aug 2025 10:46:38 -0700 Subject: [PATCH 06/29] moving to stackblitz.com --- .github/ISSUE_TEMPLATE/bug_report.md | 5 +++++ angular/README.md | 2 ++ doc/CHANGES.md | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a1172ebcd..97d350198 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -17,6 +17,11 @@ If unsure if lib bug, use slack channel instead: https://join.slack.com/t/gridst ## Steps to reproduce You **MUST** provide a working demo - keep it simple and avoid frameworks as that could have issues - you can use + +plain html: https://stackblitz.com/edit/gridstack-angular +Angular: https://stackblitz.com/edit/gridstack-angular + +please don't use jsfiddle.net as my work now blocks that website. https://jsfiddle.net/adumesny/jqhkry7g ## Expected behavior diff --git a/angular/README.md b/angular/README.md index 2af7cd84c..79abfc0ff 100644 --- a/angular/README.md +++ b/angular/README.md @@ -2,6 +2,8 @@ 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... diff --git a/doc/CHANGES.md b/doc/CHANGES.md index d72e11e3d..6b34e8aed 100644 --- a/doc/CHANGES.md +++ b/doc/CHANGES.md @@ -5,6 +5,7 @@ Change log **Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)* +- [12.2.2-dev (TBD)](#1222-dev-tbd) - [12.2.2 (2025-07-06)](#1222-2025-07-06) - [12.2.1 (2025-05-28)](#1221-2025-05-28) - [12.2.0 (2025-05-27)](#1220-2025-05-27) @@ -130,6 +131,10 @@ Change log +## 12.2.2-dev (TBD) +* fix: [#3099](https://github.com/gridstack/gridstack.js/issues/3099) scroll take into account ScrollContainer position +* fix: [#3102](https://github.com/gridstack/gridstack.js/pull/3102) React demo now support multiple grids + ## 12.2.2 (2025-07-06) * fix: [#3070](https://github.com/gridstack/gridstack.js/pull/3070) incorrect property name 'sizeToContent' when cleaning up invalid attributes * fix: [#3077](https://github.com/gridstack/gridstack.js/pull/3077) incorrect node._id check From cb1221e288b515f1d097a805f10f302a332be177 Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Sat, 9 Aug 2025 11:34:08 -0700 Subject: [PATCH 07/29] plain stackblitz example --- .github/ISSUE_TEMPLATE/bug_report.md | 6 +++--- README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 97d350198..485ad4be6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -18,11 +18,11 @@ If unsure if lib bug, use slack channel instead: https://join.slack.com/t/gridst ## Steps to reproduce You **MUST** provide a working demo - keep it simple and avoid frameworks as that could have issues - you can use -plain html: https://stackblitz.com/edit/gridstack-angular +plain html: https://stackblitz.com/edit/gridstack-demo Angular: https://stackblitz.com/edit/gridstack-angular -please don't use jsfiddle.net as my work now blocks that website. -https://jsfiddle.net/adumesny/jqhkry7g +please don't use [jsfiddle.net](https://jsfiddle.net/adumesny/jqhkry7g) as my work now blocks that website. + ## Expected behavior Tell us what should happen. If hard to describe, attach a video as well. diff --git a/README.md b/README.md index 502ecf29e..7ac81e8b9 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ GridStack.init(); ...or see list of all [API and options](https://github.com/gridstack/gridstack.js/tree/master/doc) available. -see [jsfiddle sample](https://jsfiddle.net/adumesny/jqhkry7g) as running example too. +see [stackblitz sample](https://stackblitz.com/edit/gridstack-demo) as running example too. ## Requirements From a8b6b7cad5551a8e69703e9ff9a8768faa276d10 Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Sat, 9 Aug 2025 19:35:02 -0700 Subject: [PATCH 08/29] added `.grid-stack-dragging` to grid when child is being dragged * fix #3047 * added `.grid-stack-dragging` to grid when child is being dragged so we can set cursor:grabbing, updated demo. --- demo/demo.css | 5 ++++- doc/CHANGES.md | 1 + src/dd-draggable.ts | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/demo/demo.css b/demo/demo.css index 27f7aa2de..d1ed5d944 100644 --- a/demo/demo.css +++ b/demo/demo.css @@ -56,13 +56,16 @@ h1 { .card-header { margin: 0; - cursor: move; + cursor: grab; min-height: 25px; background-color: #16af91; } .card-header:hover { background-color: #149b80; } +.grid-stack-dragging { + cursor: grabbing; +} .ui-draggable-disabled.ui-resizable-disabled > .grid-stack-item-content { background-color: #777; diff --git a/doc/CHANGES.md b/doc/CHANGES.md index 6b34e8aed..85346dcc1 100644 --- a/doc/CHANGES.md +++ b/doc/CHANGES.md @@ -134,6 +134,7 @@ Change log ## 12.2.2-dev (TBD) * fix: [#3099](https://github.com/gridstack/gridstack.js/issues/3099) scroll take into account ScrollContainer position * fix: [#3102](https://github.com/gridstack/gridstack.js/pull/3102) React demo now support multiple grids +* fix: [#3047](https://github.com/gridstack/gridstack.js/issues/3047) added `.grid-stack-dragging` to grid when child is being dragged so we can set cursor:grabbing, updated demo. ## 12.2.2 (2025-07-06) * fix: [#3070](https://github.com/gridstack/gridstack.js/pull/3070) incorrect property name 'sizeToContent' when cleaning up invalid attributes diff --git a/src/dd-draggable.ts b/src/dd-draggable.ts index c1f183163..f0d3c78e9 100644 --- a/src/dd-draggable.ts +++ b/src/dd-draggable.ts @@ -309,6 +309,7 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt /** @internal set the fix position of the dragged item */ protected _setupHelperStyle(e: DragEvent): DDDraggable { this.helper.classList.add('ui-draggable-dragging'); + this.el.gridstackNode?.grid?.el.classList.add('grid-stack-dragging'); // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593 const style = this.helper.style; style.pointerEvents = 'none'; // needed for over items to get enter/leave @@ -330,6 +331,7 @@ export class DDDraggable extends DDBaseImplement implements HTMLElementExtendOpt /** @internal restore back the original style before dragging */ protected _removeHelperStyle(): DDDraggable { this.helper.classList.remove('ui-draggable-dragging'); + this.el.gridstackNode?.grid?.el.classList.remove('grid-stack-dragging'); const node = (this.helper as GridItemHTMLElement)?.gridstackNode; // don't bother restoring styles if we're gonna remove anyway... if (!node?._isAboutToRemove && this.dragElementOriginStyle) { From 13680fc7d96f42e657089b546f53d08ee5445700 Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Sat, 9 Aug 2025 20:20:31 -0700 Subject: [PATCH 09/29] correctly reset widget back * fix #3021 correctly reset widget back (to last known position) when released outside (to last known position) when released outside --- demo/two_vertical.html | 2 +- doc/CHANGES.md | 1 + src/gridstack.ts | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/two_vertical.html b/demo/two_vertical.html index 73951a996..0745f3a6f 100644 --- a/demo/two_vertical.html +++ b/demo/two_vertical.html @@ -26,7 +26,7 @@

Two vertical grids demo - with maxRow

acceptWidgets: true } GridStack.init(opts, document.getElementById('grid1')) - .load([{x:0, y:0, content: '0'}, {x:1, y:0, content: '1'}]); + .load([{x:1, y:0, content: '0'}, {x:2, y:0, content: '1'}]); GridStack.init(opts, document.getElementById('grid2')) .load([{x:0, y:0, content: '2'}, {x:1, y:0, content: '3'}]); diff --git a/doc/CHANGES.md b/doc/CHANGES.md index 85346dcc1..318b3d07c 100644 --- a/doc/CHANGES.md +++ b/doc/CHANGES.md @@ -135,6 +135,7 @@ Change log * fix: [#3099](https://github.com/gridstack/gridstack.js/issues/3099) scroll take into account ScrollContainer position * fix: [#3102](https://github.com/gridstack/gridstack.js/pull/3102) React demo now support multiple grids * fix: [#3047](https://github.com/gridstack/gridstack.js/issues/3047) added `.grid-stack-dragging` to grid when child is being dragged so we can set cursor:grabbing, updated demo. +* fix: [#3021](https://github.com/gridstack/gridstack.js/issues/3021) correctly reset widget back (to last known position) when released outside ## 12.2.2 (2025-07-06) * fix: [#3070](https://github.com/gridstack/gridstack.js/pull/3070) incorrect property name 'sizeToContent' when cleaning up invalid attributes diff --git a/src/gridstack.ts b/src/gridstack.ts index df1b7d6dd..d88ac5df1 100644 --- a/src/gridstack.ts +++ b/src/gridstack.ts @@ -553,7 +553,7 @@ export class GridStack { if (nodeToAdd?._moving) subGrid._isTemp = true; // prevent re-nesting as we add over if (autoColumn) subGrid._autoColumn = true; - // add the original content back as a child of hte newly created grid + // add the original content back as a child of the newly created grid if (saveContent) { subGrid.makeWidget(newItem, newItemOpt); } @@ -2424,8 +2424,7 @@ export class GridStack { } else { Utils.removePositioningStyles(target); if (node._temporaryRemoved) { - // got removed - restore item back to before dragging position - Utils.copyPos(node, node._orig);// @ts-ignore + // use last position we were at (not _orig as we may have pushed others and moved) and add it back this._writePosAttr(target, node); this.engine.addNode(node); } else { From c530ee8907a65ed7730e887252ade071312e475c Mon Sep 17 00:00:00 2001 From: Alain Dumesny Date: Sat, 9 Aug 2025 20:59:21 -0700 Subject: [PATCH 10/29] typedoc from code generation * initial stap at generation documentation from code --- docs/.nojekyll | 1 + docs/assets/hierarchy.js | 1 + docs/assets/highlight.css | 141 ++ docs/assets/icons.js | 18 + docs/assets/icons.svg | 1 + docs/assets/main.js | 60 + docs/assets/navigation.js | 1 + docs/assets/search.js | 1 + docs/assets/style.css | 1633 +++++++++++++++++ docs/classes/DDGridStack.html | 15 + docs/classes/GridStack.html | 322 ++++ docs/classes/GridStackEngine.html | 77 + docs/classes/Utils.html | 66 + docs/functions/obsolete.html | 2 + docs/functions/obsoleteAttr.html | 2 + docs/functions/obsoleteOpts.html | 2 + docs/functions/obsoleteOptsDel.html | 2 + docs/hierarchy.html | 1 + docs/index.html | 336 ++++ docs/interfaces/Breakpoint.html | 7 + docs/interfaces/CellPosition.html | 4 + docs/interfaces/DDDragOpt.html | 18 + docs/interfaces/DDRemoveOpt.html | 6 + docs/interfaces/DDResizeOpt.html | 7 + docs/interfaces/DDUIData.html | 5 + docs/interfaces/DragTransform.html | 5 + docs/interfaces/GridHTMLElement.html | 2 + docs/interfaces/GridItemHTMLElement.html | 3 + docs/interfaces/GridStackEngineOptions.html | 7 + docs/interfaces/GridStackMoveOpts.html | 31 + docs/interfaces/GridStackNode.html | 47 + docs/interfaces/GridStackOptions.html | 112 ++ docs/interfaces/GridStackPosition.html | 9 + docs/interfaces/GridStackWidget.html | 39 + docs/interfaces/HeightData.html | 3 + docs/interfaces/MousePosition.html | 4 + docs/interfaces/Position.html | 3 + docs/interfaces/Rect.html | 5 + docs/interfaces/Responsive.html | 12 + docs/interfaces/Size.html | 3 + docs/modules.html | 1 + docs/sitemap.xml | 211 +++ docs/types/AddRemoveFcn.html | 2 + docs/types/ColumnOptions.html | 9 + docs/types/CompactOptions.html | 1 + docs/types/DDCallback.html | 2 + docs/types/DDDropOpt.html | 4 + docs/types/DDKey.html | 1 + docs/types/DDOpts.html | 2 + docs/types/DDValue.html | 1 + docs/types/GridStackDroppedHandler.html | 1 + docs/types/GridStackElement.html | 1 + docs/types/GridStackElementHandler.html | 1 + docs/types/GridStackEvent.html | 2 + docs/types/GridStackEventHandler.html | 2 + docs/types/GridStackEventHandlerCallback.html | 1 + docs/types/GridStackNodesHandler.html | 1 + docs/types/RenderFcn.html | 2 + docs/types/ResizeToContentFcn.html | 1 + docs/types/SaveFcn.html | 2 + docs/types/numberOrString.html | 1 + docs/variables/gridDefaults.html | 1 + package.json | 11 +- typedoc.json | 52 + typedoc.markdown.json | 29 + yarn.lock | 132 ++ 66 files changed, 3486 insertions(+), 2 deletions(-) create mode 100644 docs/.nojekyll create mode 100644 docs/assets/hierarchy.js create mode 100644 docs/assets/highlight.css create mode 100644 docs/assets/icons.js create mode 100644 docs/assets/icons.svg create mode 100644 docs/assets/main.js create mode 100644 docs/assets/navigation.js create mode 100644 docs/assets/search.js create mode 100644 docs/assets/style.css create mode 100644 docs/classes/DDGridStack.html create mode 100644 docs/classes/GridStack.html create mode 100644 docs/classes/GridStackEngine.html create mode 100644 docs/classes/Utils.html create mode 100644 docs/functions/obsolete.html create mode 100644 docs/functions/obsoleteAttr.html create mode 100644 docs/functions/obsoleteOpts.html create mode 100644 docs/functions/obsoleteOptsDel.html create mode 100644 docs/hierarchy.html create mode 100644 docs/index.html create mode 100644 docs/interfaces/Breakpoint.html create mode 100644 docs/interfaces/CellPosition.html create mode 100644 docs/interfaces/DDDragOpt.html create mode 100644 docs/interfaces/DDRemoveOpt.html create mode 100644 docs/interfaces/DDResizeOpt.html create mode 100644 docs/interfaces/DDUIData.html create mode 100644 docs/interfaces/DragTransform.html create mode 100644 docs/interfaces/GridHTMLElement.html create mode 100644 docs/interfaces/GridItemHTMLElement.html create mode 100644 docs/interfaces/GridStackEngineOptions.html create mode 100644 docs/interfaces/GridStackMoveOpts.html create mode 100644 docs/interfaces/GridStackNode.html create mode 100644 docs/interfaces/GridStackOptions.html create mode 100644 docs/interfaces/GridStackPosition.html create mode 100644 docs/interfaces/GridStackWidget.html create mode 100644 docs/interfaces/HeightData.html create mode 100644 docs/interfaces/MousePosition.html create mode 100644 docs/interfaces/Position.html create mode 100644 docs/interfaces/Rect.html create mode 100644 docs/interfaces/Responsive.html create mode 100644 docs/interfaces/Size.html create mode 100644 docs/modules.html create mode 100644 docs/sitemap.xml create mode 100644 docs/types/AddRemoveFcn.html create mode 100644 docs/types/ColumnOptions.html create mode 100644 docs/types/CompactOptions.html create mode 100644 docs/types/DDCallback.html create mode 100644 docs/types/DDDropOpt.html create mode 100644 docs/types/DDKey.html create mode 100644 docs/types/DDOpts.html create mode 100644 docs/types/DDValue.html create mode 100644 docs/types/GridStackDroppedHandler.html create mode 100644 docs/types/GridStackElement.html create mode 100644 docs/types/GridStackElementHandler.html create mode 100644 docs/types/GridStackEvent.html create mode 100644 docs/types/GridStackEventHandler.html create mode 100644 docs/types/GridStackEventHandlerCallback.html create mode 100644 docs/types/GridStackNodesHandler.html create mode 100644 docs/types/RenderFcn.html create mode 100644 docs/types/ResizeToContentFcn.html create mode 100644 docs/types/SaveFcn.html create mode 100644 docs/types/numberOrString.html create mode 100644 docs/variables/gridDefaults.html create mode 100644 typedoc.json create mode 100644 typedoc.markdown.json diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e2ac6616a --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/assets/hierarchy.js b/docs/assets/hierarchy.js new file mode 100644 index 000000000..a03a950aa --- /dev/null +++ b/docs/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJydkrFuwyAQht/lZtxGNtSpX6BT06gZMkQZLHNuUAhEQDok8rvnaFXLVS0Zd2LgP75P/3EDZ23wUO14KZgociby5z0Dh63GJihr6O4GXJTxMPUJoYIXp+Qm1M3x1X7i25nGGRyVkVDl4onBxWkKKRPQtXWD/vFP/uEQTpqGGl17eh+Cl1l8IOuHoGNARmPQtfUqiqVCf/IJULo8KC0dmliIKBlfLvbRZLkYM9kq+YEh1eM7PddCcB4NaCsDg4264gQ2RmazCvHFKvIBK7Hu/7bcM4e7fqevN8GLkbRvRA2OLW9l5VSHv7IpsK67AwsFFqk=" \ No newline at end of file diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 000000000..a48eee2bb --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,141 @@ +:root { + --light-hl-0: #001080; + --dark-hl-0: #9CDCFE; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #008000; + --dark-hl-2: #6A9955; + --light-hl-3: #AF00DB; + --dark-hl-3: #C586C0; + --light-hl-4: #A31515; + --dark-hl-4: #CE9178; + --light-hl-5: #800000; + --dark-hl-5: #808080; + --light-hl-6: #800000; + --dark-hl-6: #569CD6; + --light-hl-7: #E50000; + --dark-hl-7: #9CDCFE; + --light-hl-8: #0000FF; + --dark-hl-8: #CE9178; + --light-hl-9: #000000FF; + --dark-hl-9: #D4D4D4; + --light-hl-10: #0000FF; + --dark-hl-10: #569CD6; + --light-hl-11: #795E26; + --dark-hl-11: #DCDCAA; + --light-hl-12: #098658; + --dark-hl-12: #B5CEA8; + --light-hl-13: #0070C1; + --dark-hl-13: #4FC1FF; + --light-hl-14: #267F99; + --dark-hl-14: #4EC9B0; + --light-hl-15: #800000; + --dark-hl-15: #D7BA7D; + --light-hl-16: #000000; + --dark-hl-16: #C8C8C8; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --hl-13: var(--light-hl-13); + --hl-14: var(--light-hl-14); + --hl-15: var(--light-hl-15); + --hl-16: var(--light-hl-16); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --hl-13: var(--dark-hl-13); + --hl-14: var(--dark-hl-14); + --hl-15: var(--dark-hl-15); + --hl-16: var(--dark-hl-16); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --hl-13: var(--light-hl-13); + --hl-14: var(--light-hl-14); + --hl-15: var(--light-hl-15); + --hl-16: var(--light-hl-16); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --hl-13: var(--dark-hl-13); + --hl-14: var(--dark-hl-14); + --hl-15: var(--dark-hl-15); + --hl-16: var(--dark-hl-16); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } +.hl-12 { color: var(--hl-12); } +.hl-13 { color: var(--hl-13); } +.hl-14 { color: var(--hl-14); } +.hl-15 { color: var(--hl-15); } +.hl-16 { color: var(--hl-16); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/icons.js b/docs/assets/icons.js new file mode 100644 index 000000000..58882d76d --- /dev/null +++ b/docs/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/assets/icons.svg b/docs/assets/icons.svg new file mode 100644 index 000000000..50ad5799d --- /dev/null +++ b/docs/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 000000000..19bbb7a74 --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; +"use strict";(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()}(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function xe(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function Ee(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function we(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var Le=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;xe(i,{closeOnClick:!0});function a(){Ee(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",Le+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!we(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` + ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${Le}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
${e}
`:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Be(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Be(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Be(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Ve),Ve())}async function Ve(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js new file mode 100644 index 000000000..44092639c --- /dev/null +++ b/docs/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "eJydlk1z0zAQhv+Lzx1KAy3QW4kL6UAok6Rw6PSg2BtHE1nySHKGwvDfK8f5kKxPuOp99/FqtSv58U8m4ZfMrrM8zzlr7huZnWUNkmu1JJ8bEOdH4dVa1kSpG0zL7Hr0+sO7i8vR3zONoEzCDu9W47Ff4NkOVYvxyB+ItGDH7pbj0WNEyBIVGxtwUOKMzxyXc2lACoKE2GGOosm5GL3XGEfTLa0wBVUyzKhWS0wl8BUqFNFtHSR5eeWH20kODLFEJ4vp11sCNVDpzVDzpKW2NWj9GZhq7BymrBXwnQncFcSZmOEIpTUGQoIk3ZC0v0DRQ+WulCmHFWqJPllbxDFaEgXRdZPzRi/NmJG2plZX9VU2xFiRx6xuUCG9KF2NsWhbL4Hf87nkmFZDlqnGWF017yTUKb058KX155A57FAny5nmqaMniJYEeLjt96Z0cp9JlG3YkunfWAkixtZNyeTulWmgjLFN23/V23flB82xL92U5QxqtoVPBR2CdS3GmSMnYr8ci54BLYE74o9CnCDwb1iwMVNDQ6UTNXQkMBt1H+AtOGfyJIdG8SMHtGkY9gz2SU6a56QX9l/e1qk6XvP/x0U8uJKQwRfIciUhf+KyAv/NqHlCuDzve8D4W9RQmh7D1H1BvJi9HsbkHFV+yF4NIeYqWWd0J4QCg0eUcjIzKNx5d0J41w93OZLIs+leTOqJ7rYOd0TnCKEmgKu19GZzkoMbUse04IiKFeO1e1e6I4RiS8EISG1Xq5YWu1k+P2hm/NVbR7g5zjbCHmQvJgcSIylLAuxGSh4idXoA8yAx0fZ0+BfdLdv/oU8vilPBzw==" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js new file mode 100644 index 000000000..a7859f03e --- /dev/null +++ b/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = "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"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 000000000..5ba5a2a90 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1633 @@ +@layer typedoc { + :root { + --dim-toolbar-contents-height: 2.5rem; + --dim-toolbar-border-bottom-width: 1px; + --dim-header-height: calc( + var(--dim-toolbar-border-bottom-width) + + var(--dim-toolbar-contents-height) + ); + + /* 0rem For mobile; unit is required for calculation in `calc` */ + --dim-container-main-margin-y: 0rem; + + --dim-footer-height: 3.5rem; + + --modal-animation-duration: 0.2s; + } + + :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --light-color-background-active: #d6d8da; + --light-color-background-warning: #e6e600; + --light-color-warning-text: #222; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-background-active); + --light-color-text: #222; + --light-color-contrast-text: #000; + --light-color-text-aside: #5e5e5e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var( + --light-color-ts-constructor + ); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #c73c3c; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + } + + :root { + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --dark-color-background-active: #5d5d6a; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: var(--dark-color-background-active); + --dark-color-text: #f5f5f5; + --dark-color-contrast-text: #ffffff; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff6060; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var( + --light-color-background-secondary + ); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var( + --dark-color-background-secondary + ); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + :root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + + :root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + + html { + color-scheme: var(--color-scheme); + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + } + + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); + } + + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } + + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } + + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } + + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } + + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } + + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } + + dl, + menu, + ol, + ul { + margin: 1em 0; + } + + dd { + margin: 0 0 0 34px; + } + + .container { + max-width: 1700px; + padding: 0 2rem; + } + + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: var(--dim-footer-height); + } + footer > p { + margin: 0 1em; + } + + .container-main { + margin: var(--dim-container-main-margin-y) auto; + /* toolbar, footer, margin */ + min-height: calc( + 100svh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + margin: 0; + } + + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } + :target { + scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); + } + + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } + + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; + } + pre:hover > button, + pre > button.visible, + pre > button:focus-visible { + opacity: 1; + } + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; + } + + img { + max-width: 100%; + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + dialog { + border: none; + outline: none; + padding: 0; + background-color: var(--color-background); + } + dialog::backdrop { + display: none; + } + #tsd-overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 9999; + top: 0; + left: 0; + right: 0; + bottom: 0; + animation: fade-in var(--modal-animation-duration) forwards; + } + #tsd-overlay.closing { + animation-name: fade-out; + } + + .tsd-typography { + line-height: 1.333em; + } + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; + } + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; + } + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; + } + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; + } + .tsd-typography table { + border-collapse: collapse; + border: none; + } + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); + } + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); + } + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); + } + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; + } + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; + } + + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } + + .tsd-breadcrumb { + margin: 0; + margin-top: 1rem; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } + + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } + + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } + + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } + + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; + } + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; + } + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; + } + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); + } + + .settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; + } + + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } + + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } + + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } + + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } + + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } + + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } + + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } + + .tsd-anchor { + position: relative; + top: -100px; + } + + .tsd-member { + position: relative; + } + .tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; + } + + .tsd-navigation.settings { + margin: 0; + margin-bottom: 1rem; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + color: var(--color-contrast-text); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; + max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } + + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > summary > svg { + margin-right: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 30px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } + + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } + + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + display: flex; + align-items: center; + gap: 0.25rem; + box-sizing: border-box; + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + /* + * We need to be careful to target the arrow indicating whether the accordion + * is open, but not any other SVGs included in the details element. + */ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-summary { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + display: flex; + align-content: center; + } + + .tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } + + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } + + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } + + #tsd-search[open] { + animation: fade-in var(--modal-animation-duration) ease-out forwards; + } + #tsd-search[open].closing { + animation-name: fade-out; + } + + /* Avoid setting `display` on closed dialog */ + #tsd-search[open] { + display: flex; + flex-direction: column; + padding: 1rem; + width: 32rem; + max-width: 90vw; + max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); + /* Anchor dialog to top */ + margin-top: 10vh; + border-radius: 6px; + will-change: max-height; + } + #tsd-search-input { + box-sizing: border-box; + width: 100%; + padding: 0 0.625rem; /* 10px */ + outline: 0; + border: 2px solid var(--color-accent); + background-color: transparent; + color: var(--color-text); + border-radius: 4px; + height: 2.5rem; + flex: 0 0 auto; + font-size: 0.875rem; + transition: border-color 0.2s, background-color 0.2s; + } + #tsd-search-input:focus-visible { + background-color: var(--color-background-active); + border-color: transparent; + color: var(--color-contrast-text); + } + #tsd-search-input::placeholder { + color: inherit; + opacity: 0.8; + } + #tsd-search-results { + margin: 0; + padding: 0; + list-style: none; + flex: 1 1 auto; + display: flex; + flex-direction: column; + overflow-y: auto; + } + #tsd-search-results:not(:empty) { + margin-top: 0.5rem; + } + #tsd-search-results > li { + background-color: var(--color-background); + line-height: 1.5; + box-sizing: border-box; + border-radius: 4px; + } + #tsd-search-results > li:nth-child(even) { + background-color: var(--color-background-secondary); + } + #tsd-search-results > li:is(:hover, [aria-selected="true"]) { + background-color: var(--color-background-active); + color: var(--color-contrast-text); + } + /* It's important that this takes full size of parent `li`, to capture a click on `li` */ + #tsd-search-results > li > a { + display: flex; + align-items: center; + padding: 0.5rem 0.25rem; + box-sizing: border-box; + width: 100%; + } + #tsd-search-results > li > a > .text { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; + } + #tsd-search-results > li > a .parent { + color: var(--color-text-aside); + } + #tsd-search-results > li > a mark { + color: inherit; + background-color: inherit; + font-weight: bold; + } + #tsd-search-status { + flex: 1; + display: grid; + place-content: center; + text-align: center; + overflow-wrap: anywhere; + } + #tsd-search-status:not(:empty) { + min-height: 6rem; + } + + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } + + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } + + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } + + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } + + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } + + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } + + .tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: var(--dim-toolbar-border-bottom-width) + var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + } + .tsd-toolbar-contents { + display: flex; + align-items: center; + height: var(--dim-toolbar-contents-height); + margin: 0 auto; + } + .tsd-toolbar-contents > .title { + font-weight: bold; + margin-right: auto; + } + #tsd-toolbar-links { + display: flex; + align-items: center; + gap: 1.5rem; + margin-right: 1rem; + } + + .tsd-widget { + box-sizing: border-box; + display: inline-block; + opacity: 0.8; + height: 2.5rem; + width: 2.5rem; + transition: opacity 0.1s, background-color 0.1s; + text-align: center; + cursor: pointer; + border: none; + background-color: transparent; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget:active { + opacity: 1; + background-color: var(--color-accent); + } + #tsd-toolbar-menu-trigger { + display: none; + } + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; + } + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); + vertical-align: middle; + } + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; + } + + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg, + .tsd-anchor-icon:focus-visible svg { + visibility: visible; + } + + .deprecated { + text-decoration: line-through !important; + } + + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); + } + + .tsd-kind-project { + color: var(--color-ts-project); + } + .tsd-kind-module { + color: var(--color-ts-module); + } + .tsd-kind-namespace { + color: var(--color-ts-namespace); + } + .tsd-kind-enum { + color: var(--color-ts-enum); + } + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); + } + .tsd-kind-variable { + color: var(--color-ts-variable); + } + .tsd-kind-function { + color: var(--color-ts-function); + } + .tsd-kind-class { + color: var(--color-ts-class); + } + .tsd-kind-interface { + color: var(--color-ts-interface); + } + .tsd-kind-constructor { + color: var(--color-ts-constructor); + } + .tsd-kind-property { + color: var(--color-ts-property); + } + .tsd-kind-method { + color: var(--color-ts-method); + } + .tsd-kind-reference { + color: var(--color-ts-reference); + } + .tsd-kind-call-signature { + color: var(--color-ts-call-signature); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); + } + + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); + } + + /* mobile */ + @media (max-width: 769px) { + #tsd-toolbar-menu-trigger { + display: inline-block; + /* temporary fix to vertically align, for compatibility */ + line-height: 2.5; + } + #tsd-toolbar-links { + display: none; + } + + .container-main { + display: flex; + } + .col-content { + float: none; + max-width: 100%; + width: 100%; + } + .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + .col-sidebar > *:last-child { + padding-bottom: 20px; + } + .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + --dim-container-main-margin-y: 2rem; + } + + .tsd-breadcrumb { + margin-top: 0; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: + minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 0rem; + } + + .page-menu, + .site-menu { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + } +} diff --git a/docs/classes/DDGridStack.html b/docs/classes/DDGridStack.html new file mode 100644 index 000000000..2a7df1216 --- /dev/null +++ b/docs/classes/DDGridStack.html @@ -0,0 +1,15 @@ +DDGridStack | gridstack - v12.2.2-dev
gridstack - v12.2.2-dev
    Preparing search index...

    Class DDGridStack

    HTML Native Mouse and Touch Events Drag and Drop functionality.

    +
    Index

    Constructors

    Methods

    • true if element is droppable

      +

      Parameters

      • el: DDElementHost

      Returns boolean

    • true if element is draggable

      +

      Parameters

      • el: DDElementHost

      Returns boolean

    • true if element is draggable

      +

      Parameters

      • el: DDElementHost

      Returns boolean

    diff --git a/docs/classes/GridStack.html b/docs/classes/GridStack.html new file mode 100644 index 000000000..469342c4c --- /dev/null +++ b/docs/classes/GridStack.html @@ -0,0 +1,322 @@ +GridStack | gridstack - v12.2.2-dev
    gridstack - v12.2.2-dev
      Preparing search index...

      Class GridStack

      Main gridstack class - you will need to call GridStack.init() first to initialize your grid. +Note: your grid elements MUST have the following classes for the CSS layout to work:

      +
      <div class="grid-stack">
      <div class="grid-stack-item">
      <div class="grid-stack-item-content">Item 1</div>
      </div>
      </div> +
      + +
      Index

      Constructors

      Methods

      • initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will +simply return the existing instance (ignore any passed options). There is also an initAll() version that support +multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.

        +

        Parameters

        • options: GridStackOptions = {}

          grid options (optional)

          +
        • elOrString: GridStackElement = '.grid-stack'

          element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)

          +

        Returns GridStack

        const grid = GridStack.init();

        Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later
        const grid = document.querySelector('.grid-stack').gridstack; +
        + +
      • Will initialize a list of elements (given a selector) and return an array of grids.

        +

        Parameters

        • options: GridStackOptions = {}

          grid options (optional)

          +
        • selector: string = '.grid-stack'

          elements selector to convert to grids (default to '.grid-stack' class selector)

          +

        Returns GridStack[]

        const grids = GridStack.initAll();
        grids.forEach(...) +
        + +
      • call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then +grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from +JSON serialized data, including options.

        +

        Parameters

        • parent: HTMLElement

          HTML element parent to the grid

          +
        • opt: GridStackOptions = {}

          grids options used to initialize the grid, and list of children

          +

        Returns GridStack

      • call this method to register your engine instead of the default one. +See instead GridStackOptions.engineClass if you only need to +replace just one instance.

        +

        Parameters

        Returns void

      • add a new widget and returns it.

        +

        Widget will be always placed even if result height is more than actual grid height. +You need to use willItFit() before calling addWidget for additional check. +See also makeWidget(el) for DOM element.

        +

        Parameters

        • w: GridStackWidget

          GridStackWidget definition. used MakeWidget(el) if you have dom element instead.

          +

        Returns GridItemHTMLElement

        const grid = GridStack.init();
        grid.addWidget({w: 3, content: 'hello'}); +
        + +
      • create the default grid item divs, and content (possibly lazy loaded) by using GridStack.renderCB()

        +

        Parameters

        Returns HTMLElement

      • Convert an existing gridItem element into a sub-grid with the given (optional) options, else inherit them +from the parent's subGrid options.

        +

        Parameters

        • el: GridItemHTMLElement

          gridItem element to convert

          +
        • Optionalops: GridStackOptions

          (optional) sub-grid options, else default to node, then parent settings, else defaults

          +
        • OptionalnodeToAdd: GridStackNode

          (optional) node to add to the newly created sub grid (used when dragging over existing regular item)

          +
        • saveContent: boolean = true

          if true (default) the html inside .grid-stack-content will be saved to child widget

          +

        Returns GridStack

        newly created grid

        +
      • called when an item was converted into a nested grid to accommodate a dragged over item, but then item leaves - return back +to the original grid-item. Also called to remove empty sub-grids when last item is dragged out (since re-creating is simple)

        +

        Parameters

        Returns void

      • saves the current layout returning a list of widgets for serialization which might include any nested grids.

        +

        Parameters

        • saveContent: boolean = true

          if true (default) the latest html inside .grid-stack-content will be saved to GridStackWidget.content field, else it will +be removed.

          +
        • saveGridOpt: boolean = false

          if true (default false), save the grid options itself, so you can call the new GridStack.addGrid() +to recreate everything from scratch. GridStackOptions.children would then contain the widget list instead.

          +
        • saveCB: SaveFcn = GridStack.saveCB

          callback for each node -> widget, so application can insert additional data to be saved into the widget data structure.

          +

        Returns GridStackOptions | GridStackWidget[]

        list of widgets or full grid option, including .children list of widgets

        +
      • load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.

        +

        Parameters

        • items: GridStackWidget[]

          list of widgets definition to update/create

          +
        • addRemove: boolean | AddRemoveFcn = ...

          boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving +the user control of insertion.

          +

        Returns GridStack

        see http://gridstackjs.com/demo/serialization.html
        +
        + +
      • use before calling a bunch of addWidget() to prevent un-necessary relayouts in between (more efficient) +and get a single event callback. You will see no changes until batchUpdate(false) is called.

        +

        Parameters

        • flag: boolean = true

        Returns GridStack

      • Gets current cell height.

        +

        Parameters

        • forcePixel: boolean = false

        Returns number

      • Update current cell height - see GridStackOptions.cellHeight for format. +This method rebuilds an internal CSS style sheet. +Note: You can expect performance issues if call this method too often.

        +

        Parameters

        • Optionalval: numberOrString

          the cell height. If not passed (undefined), cells content will be made square (match width minus margin), +if pass 0 the CSS will be generated by the application instead.

          +

        Returns GridStack

        grid.cellHeight(100); // same as 100px
        grid.cellHeight('70px');
        grid.cellHeight(grid.cellWidth() * 1.2); +
        + +
      • Gets current cell width.

        +

        Returns number

      • return our expected width (or parent) , and optionally of window for dynamic column check

        +

        Parameters

        • forBreakpoint: boolean = false

        Returns number

      • checks for dynamic column count for our current size, returning true if changed

        +

        Returns boolean

      • re-layout grid items to reclaim any empty space. Options are: +'list' keep the widget left->right order the same, even if that means leaving an empty slot if things don't fit +'compact' might re-order items to fill any empty space

        +

        doSort - 'false' to let you do your own sorting ahead in case you need to control a different order. (default to sort)

        +

        Parameters

        Returns GridStack

      • set the number of columns in the grid. Will update existing widgets to conform to new number of columns, +as well as cache the original layout so you can revert back to previous positions without loss.

        +

        Parameters

        • column: number

          Integer > 0 (default 12).

          +
        • layout: ColumnOptions = 'moveScale'

          specify the type of re-layout that will happen (position, size, etc...). +Note: items will never be outside of the current column boundaries. default ('moveScale'). Ignored for 1 column

          +

        Returns GridStack

      • get the number of columns in the grid (default 12)

        +

        Returns number

      • true if changeCB should be ignored due to column change, sizeToContent, loading, etc... which caller can ignore for dirty flag case

        +

        Returns boolean

      • Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.

        +

        Parameters

        • removeDOM: boolean = true

          if false grid and items HTML elements will not be removed from the DOM (Optional. Default true).

          +

        Returns GridStack

      • get the current float mode

        +

        Returns boolean

      • Get the position of the cell under a pixel on screen.

        +

        Parameters

        • position: MousePosition

          the position of the pixel to resolve in +absolute coordinates, as an object with top and left properties

          +
        • useDocRelative: boolean = false

          if true, value will be based on document position vs parent position (Optional. Default false). +Useful when grid is within position: relative element

          +

          Returns an object with properties x and y i.e. the column and row in the grid.

          +

        Returns CellPosition

      • returns the current number of rows, which will be at least minRow if set

        +

        Returns number

      • Checks if specified area is empty.

        +

        Parameters

        • x: number

          the position x.

          +
        • y: number

          the position y.

          +
        • w: number

          the width of to check

          +
        • h: number

          the height of to check

          +

        Returns boolean

      • If you add elements to your grid by hand (or have some framework creating DOM), you have to tell gridstack afterwards to make them widgets. +If you want gridstack to add the elements for you, use addWidget() instead. +Makes the given element a widget and returns it.

        +

        Parameters

        • els: GridStackElement

          widget or single selector to convert.

          +
        • Optionaloptions: GridStackWidget

          widget definition to use instead of reading attributes or using default sizing values

          +

        Returns GridItemHTMLElement

        const grid = GridStack.init();
        grid.el.innerHtml = '<div id="1" gs-w="3"></div><div id="2"></div>';
        grid.makeWidget('1');
        grid.makeWidget('2', {w:2, content: 'hello'}); +
        + +
      • Event handler that extracts our CustomEvent data out automatically for receiving custom +notifications (see doc for supported events)

        +

        Parameters

        • name: "dropped"

          of the event (see possible values) or list of names space separated

          +
        • callback: GridStackDroppedHandler

          function called with event and optional second/third param +(see README documentation for each signature).

          +

        Returns GridStack

        grid.on('added', function(e, items) { log('added ', items)} );
        or
        grid.on('added removed change', function(e, items) { log(e.type, items)} );

        Note: in some cases it is the same as calling native handler and parsing the event.
        grid.el.addEventListener('added', function(event) { log('added ', event.detail)} ); +
        + +
      • Event handler that extracts our CustomEvent data out automatically for receiving custom +notifications (see doc for supported events)

        +

        Parameters

        • name: "enable" | "disable"

          of the event (see possible values) or list of names space separated

          +
        • callback: GridStackEventHandler

          function called with event and optional second/third param +(see README documentation for each signature).

          +

        Returns GridStack

        grid.on('added', function(e, items) { log('added ', items)} );
        or
        grid.on('added removed change', function(e, items) { log(e.type, items)} );

        Note: in some cases it is the same as calling native handler and parsing the event.
        grid.el.addEventListener('added', function(event) { log('added ', event.detail)} ); +
        + +
      • Event handler that extracts our CustomEvent data out automatically for receiving custom +notifications (see doc for supported events)

        +

        Parameters

        • name: "removed" | "change" | "added" | "resizecontent"

          of the event (see possible values) or list of names space separated

          +
        • callback: GridStackNodesHandler

          function called with event and optional second/third param +(see README documentation for each signature).

          +

        Returns GridStack

        grid.on('added', function(e, items) { log('added ', items)} );
        or
        grid.on('added removed change', function(e, items) { log(e.type, items)} );

        Note: in some cases it is the same as calling native handler and parsing the event.
        grid.el.addEventListener('added', function(event) { log('added ', event.detail)} ); +
        + +
      • Event handler that extracts our CustomEvent data out automatically for receiving custom +notifications (see doc for supported events)

        +

        Parameters

        • name: "resize" | "drag" | "dragstart" | "resizestart" | "resizestop" | "dragstop"

          of the event (see possible values) or list of names space separated

          +
        • callback: GridStackElementHandler

          function called with event and optional second/third param +(see README documentation for each signature).

          +

        Returns GridStack

        grid.on('added', function(e, items) { log('added ', items)} );
        or
        grid.on('added removed change', function(e, items) { log(e.type, items)} );

        Note: in some cases it is the same as calling native handler and parsing the event.
        grid.el.addEventListener('added', function(event) { log('added ', event.detail)} ); +
        + +
      • Event handler that extracts our CustomEvent data out automatically for receiving custom +notifications (see doc for supported events)

        +

        Parameters

        • name: string

          of the event (see possible values) or list of names space separated

          +
        • callback: GridStackEventHandlerCallback

          function called with event and optional second/third param +(see README documentation for each signature).

          +

        Returns GridStack

        grid.on('added', function(e, items) { log('added ', items)} );
        or
        grid.on('added removed change', function(e, items) { log(e.type, items)} );

        Note: in some cases it is the same as calling native handler and parsing the event.
        grid.el.addEventListener('added', function(event) { log('added ', event.detail)} ); +
        + +
      • unsubscribe from the 'on' event GridStackEvent

        +

        Parameters

        • name: string

          of the event (see possible values) or list of names space separated

          +

        Returns GridStack

      • Removes widget from the grid.

        +

        Parameters

        • els: GridStackElement
        • removeDOM: boolean = true

          if false DOM element won't be removed from the tree (Default? true).

          +
        • triggerEvent: boolean = true

          if false (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).

          +

        Returns GridStack

      • Removes all widgets from the grid.

        +

        Parameters

        • removeDOM: boolean = true

          if false DOM elements won't be removed from the tree (Default? true).

          +
        • triggerEvent: boolean = true

          if false (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).

          +

        Returns GridStack

      • Toggle the grid animation state. Toggles the grid-stack-animate class.

        +

        Parameters

        • doAnimate: boolean = ...

          if true the grid will animate.

          +
        • Optionaldelay: boolean

          if true setting will be set on next event loop.

          +

        Returns GridStack

      • Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on. +Also toggle the grid-stack-static class.

        +

        Parameters

        • val: boolean

          if true the grid become static.

          +
        • updateClass: boolean = true

          true (default) if css class gets updated

          +
        • recurse: boolean = true

          true (default) if sub-grids also get updated

          +

        Returns GridStack

      • Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.

        +

        Parameters

        • els: GridStackElement

          widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)

          +
        • opt: GridStackWidget

          new widget options (x,y,w,h, etc..). Only those set will be updated.

          +

        Returns GridStack

      • Updates widget height to match the content height to avoid v-scrollbar or dead space. +Note: this assumes only 1 child under resizeToContentParent='.grid-stack-item-content' (sized to gridItem minus padding) that is at the entire content size wanted.

        +

        Parameters

        Returns void

      • returns current margin number value (undefined if 4 sides don't match)

        +

        Returns number

      • Returns true if the height of the grid will be less than the vertical +constraint. Always returns true if grid doesn't have height constraint.

        +

        Parameters

        Returns boolean

        if (grid.willItFit(newWidget)) {
        grid.addWidget(newWidget);
        } else {
        alert('Not enough free space to place the widget');
        } +
        + +
      • called when we are being resized - check if the one Column Mode needs to be turned on/off +and remember the prev columns we used, or get our count from parent, as well as check for cellHeight==='auto' (square) +or sizeToContent gridItem options.

        +

        Parameters

        • clientWidth: number = ...

        Returns GridStack

      • add or remove the grid element size event handler

        +

        Parameters

        • forceRemove: boolean = false

        Returns GridStack

      • call to setup dragging in from the outside (say toolbar), by specifying the class selection and options. +Called during GridStack.init() as options, but can also be called directly (last param are used) in case the toolbar +is dynamically create and needs to be set later.

        +

        Parameters

        • OptionaldragIn: string | HTMLElement[]

          string selector (ex: '.sidebar-item') or list of dom elements

          +
        • OptionaldragInOptions: DDDragOpt

          options - see DDDragOpt. (default: {handle: '.grid-stack-item-content', appendTo: 'body'}

          +
        • Optionalwidgets: GridStackWidget[]

          GridStackWidget def to assign to each element which defines what to create on drop

          +
        • root: Document | HTMLElement = document

          optional root which defaults to document (for shadow dom pass the parent HTMLDocument)

          +

        Returns void

      • Enables/Disables dragging by the user of specific grid element. If you want all items, and have it affect future items, use enableMove() instead. No-op for static grids. +IF you are looking to prevent an item from moving (due to being pushed around by another during collision) use locked property instead.

        +

        Parameters

        • els: GridStackElement

          widget or selector to modify.

          +
        • val: boolean

          if true widget will be draggable, assuming the parent grid isn't noMove or static.

          +

        Returns GridStack

      • Enables/Disables user resizing of specific grid element. If you want all items, and have it affect future items, use enableResize() instead. No-op for static grids.

        +

        Parameters

        • els: GridStackElement

          widget or selector to modify

          +
        • val: boolean

          if true widget will be resizable, assuming the parent grid isn't noResize or static.

          +

        Returns GridStack

      • Temporarily disables widgets moving/resizing. +If you want a more permanent way (which freezes up resources) use setStatic(true) instead. +Note: no-op for static grid +This is a shortcut for:

        +

        Parameters

        • recurse: boolean = true

          true (default) if sub-grids also get updated

          +

        Returns GridStack

        grid.enableMove(false);
        grid.enableResize(false); +
        + +
      • Re-enables widgets moving/resizing - see disable(). +Note: no-op for static grid. +This is a shortcut for:

        +

        Parameters

        • recurse: boolean = true

          true (default) if sub-grids also get updated

          +

        Returns GridStack

        grid.enableMove(true);
        grid.enableResize(true); +
        + +
      • Enables/disables widget moving. No-op for static grids, and locally defined items still overrule

        +

        Parameters

        • doEnable: boolean
        • recurse: boolean = true

          true (default) if sub-grids also get updated

          +

        Returns GridStack

      • Enables/disables widget resizing. No-op for static grids.

        +

        Parameters

        • doEnable: boolean
        • recurse: boolean = true

          true (default) if sub-grids also get updated

          +

        Returns GridStack

      Properties

      addRemoveCB?: AddRemoveFcn

      callback method use when new items|grids needs to be created or deleted, instead of the default +item:

      w.content
      +grid:
      grid content...
      +add = true: the returned DOM element will then be converted to a GridItemHTMLElement using makeWidget()|GridStack:init(). +add = false: the item will be removed from DOM (if not already done) +grid = true|false for grid vs grid-items

      +
      saveCB?: SaveFcn

      callback during saving to application can inject extra data for each widget, on top of the grid layout properties

      +
      renderCB?: RenderFcn = ...

      callback to create the content of widgets so the app can control how to store and restore it +By default this lib will do 'el.textContent = w.content' forcing text only support for avoiding potential XSS issues.

      +
      updateCB?: (w: GridStackNode) => void

      called after a widget has been updated (eg: load() into an existing list of children) so application can do extra work

      +
      resizeToContentCB?: ResizeToContentFcn

      callback to use for resizeToContent instead of the built in one

      +
      resizeToContentParent: string = '.grid-stack-item-content'

      parent class for sizing content. defaults to '.grid-stack-item-content'

      +
      Utils: typeof Utils = Utils

      scoping so users can call GridStack.Utils.sort() for example

      +
      Engine: typeof GridStackEngine = GridStackEngine

      scoping so users can call new GridStack.Engine(12) for example

      +

      engine used to implement non DOM grid functionality

      +
      parentGridNode?: GridStackNode

      point to a parent grid item if we're nested (inside a grid-item in between 2 Grids)

      +
      animationDelay: number = ...

      time to wait for animation (if enabled) to be done so content sizing can happen

      +
      engineClass: typeof GridStackEngine
      resizeObserver: ResizeObserver
      responseLayout: ColumnOptions

      the HTML element tied to this grid after it's been initialized

      +
      opts: GridStackOptions = {}

      grid options - public for classes to access, but use methods to modify!

      +
      GDRev: string = '12.2.2-dev'
      diff --git a/docs/classes/GridStackEngine.html b/docs/classes/GridStackEngine.html new file mode 100644 index 000000000..2ee78a855 --- /dev/null +++ b/docs/classes/GridStackEngine.html @@ -0,0 +1,77 @@ +GridStackEngine | gridstack - v12.2.2-dev
      gridstack - v12.2.2-dev
        Preparing search index...

        Class GridStackEngine

        Defines the GridStack engine that does most no DOM grid manipulation. +See GridStack methods and vars for descriptions.

        +

        NOTE: values should not be modified directly - call the main GridStack API instead

        +
        Index

        Accessors

        Constructors

        Methods

        • called to cache the nodes pixel rectangles used for collision detection during drag

          +

          Parameters

          • w: number
          • h: number
          • top: number
          • right: number
          • bottom: number
          • left: number

          Returns GridStackEngine

        • Parameters

          • x: number
          • y: number
          • w: number
          • h: number

          Returns boolean

        • find the first available empty spot for the given node width/height, updating the x,y attributes. return true if found. +optionally you can pass your own existing node list and column count, otherwise defaults to that engine data. +Optionally pass a widget to start search AFTER, meaning the order will remain the same but possibly have empty slots we skipped

          +

          Parameters

          Returns boolean

        • checks if item can be moved (layout constrain) vs moveNode(), returning true if was able to move. +In more complicated cases (maxRow) it will attempt at moving the item and fixing +others in a clone first, then apply those changes if still within specs.

          +

          Returns boolean

        • saves a copy of the largest column layout (eg 12 even when rendering oneColumnMode) so we don't loose orig layout, +returning a list of widgets for serialization

          +

          Parameters

          • saveElement: boolean = true
          • OptionalsaveCB: SaveFcn

          Returns GridStackNode[]

        • call to cache the given layout internally to the given location so we can restore back when column changes size

          +

          Parameters

          • nodes: GridStackNode[]

            list of nodes

            +
          • column: number

            corresponding column index to save it under

            +
          • clear: boolean = false

            if true, will force other caches to be removed (default false)

            +

          Returns GridStackEngine

        Properties

        column: number
        maxRow: number
        nodes: GridStackNode[]
        addedNodes: GridStackNode[] = []
        removedNodes: GridStackNode[] = []
        batchMode: boolean
        defaultColumn: number = 12
        skipCacheUpdate?: boolean

        true when grid.load() already cached the layout and can skip out of bound caching info

        +
        diff --git a/docs/classes/Utils.html b/docs/classes/Utils.html new file mode 100644 index 000000000..fd0ec18b1 --- /dev/null +++ b/docs/classes/Utils.html @@ -0,0 +1,66 @@ +Utils | gridstack - v12.2.2-dev
        gridstack - v12.2.2-dev
          Preparing search index...

          Class Utils

          Utility methods

          +
          Index

          Constructors

          Methods

          • convert a potential selector into actual list of html elements. optional root which defaults to document (for shadow dom)

            +

            Parameters

            Returns HTMLElement[]

          • convert a potential selector into actual single element. optional root which defaults to document (for shadow dom)

            +

            Parameters

            Returns HTMLElement

          • create a div with the given classes

            +

            Parameters

            • classes: string[]
            • Optionalparent: HTMLElement

            Returns HTMLElement

          • true if we should resize to content. strict=true when only 'sizeToContent:true' and not a number which lets user adjust

            +

            Parameters

            Returns boolean

          • Parameters

            • v: unknown

            Returns boolean

          • Parameters

            • value: string

            Returns number

          • copies unset fields in target to use the given default sources values

            +

            Parameters

            • target: any
            • ...sources: any[]

            Returns {}

          • given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down)

            +

            Parameters

            • a: unknown
            • b: unknown

            Returns boolean

          • removes field from the first object if same as the second objects (like diffing) and internal '_' for saving

            +

            Parameters

            • a: unknown
            • b: unknown

            Returns void

          • removes internal fields '_' and default values for saving

            +

            Parameters

            Returns void

          • delay calling the given function for given delay, preventing new calls from happening while waiting

            +

            Parameters

            • func: () => void
            • delay: number

            Returns () => void

          • Parameters

            • el: HTMLElement

            Returns void

          • single level clone, returning a new object with same top fields. This will share sub objects and arrays

            +

            Type Parameters

            • T

            Parameters

            • obj: T

            Returns T

          • Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY. +Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.

            +

            Type Parameters

            • T

            Parameters

            • obj: T

            Returns T

          • deep clone the given HTML node, removing teh unique id field

            +

            Parameters

            • el: HTMLElement

            Returns HTMLElement

          • Parameters

            • el: HTMLElement
            • parent: string | HTMLElement

            Returns void

          • Parameters

            • el: HTMLElement
            • styles: { [prop: string]: string | string[] }

            Returns void

          • Type Parameters

            • T

            Parameters

            • e: MouseEvent | DragEvent
            • info: { type: string; target?: EventTarget }

            Returns T

          • copies the MouseEvent (or convert Touch) properties and sends it as another event to the given target

            +

            Parameters

            • e: MouseEvent | Touch
            • simulatedType: string
            • Optionaltarget: EventTarget

            Returns void

          • defines an element that is used to get the offset and scale from grid transforms +returns the scale and offsets from said element

            +

            Parameters

            • parent: HTMLElement

            Returns DragTransform

          • swap the given object 2 field values

            +

            Parameters

            • o: unknown
            • a: string
            • b: string

            Returns void

          diff --git a/docs/functions/obsolete.html b/docs/functions/obsolete.html new file mode 100644 index 000000000..835314338 --- /dev/null +++ b/docs/functions/obsolete.html @@ -0,0 +1,2 @@ +obsolete | gridstack - v12.2.2-dev
          gridstack - v12.2.2-dev
            Preparing search index...

            Function obsolete

            • checks for obsolete method names

              +

              Parameters

              • self: any
              • f: any
              • oldName: string
              • newName: string
              • rev: string

              Returns (...args: any[]) => any

            diff --git a/docs/functions/obsoleteAttr.html b/docs/functions/obsoleteAttr.html new file mode 100644 index 000000000..62def74eb --- /dev/null +++ b/docs/functions/obsoleteAttr.html @@ -0,0 +1,2 @@ +obsoleteAttr | gridstack - v12.2.2-dev
            gridstack - v12.2.2-dev
              Preparing search index...

              Function obsoleteAttr

              • checks for obsolete Jquery element attributes

                +

                Parameters

                • el: HTMLElement
                • oldName: string
                • newName: string
                • rev: string

                Returns void

              diff --git a/docs/functions/obsoleteOpts.html b/docs/functions/obsoleteOpts.html new file mode 100644 index 000000000..944a00bc9 --- /dev/null +++ b/docs/functions/obsoleteOpts.html @@ -0,0 +1,2 @@ +obsoleteOpts | gridstack - v12.2.2-dev
              gridstack - v12.2.2-dev
                Preparing search index...

                Function obsoleteOpts

                • checks for obsolete grid options (can be used for any fields, but msg is about options)

                  +

                  Parameters

                  Returns void

                diff --git a/docs/functions/obsoleteOptsDel.html b/docs/functions/obsoleteOptsDel.html new file mode 100644 index 000000000..39be95e8b --- /dev/null +++ b/docs/functions/obsoleteOptsDel.html @@ -0,0 +1,2 @@ +obsoleteOptsDel | gridstack - v12.2.2-dev
                gridstack - v12.2.2-dev
                  Preparing search index...

                  Function obsoleteOptsDel

                  • checks for obsolete grid options which are gone

                    +

                    Parameters

                    Returns void

                  diff --git a/docs/hierarchy.html b/docs/hierarchy.html new file mode 100644 index 000000000..ee83985db --- /dev/null +++ b/docs/hierarchy.html @@ -0,0 +1 @@ +gridstack - v12.2.2-dev
                  gridstack - v12.2.2-dev
                    Preparing search index...
                    diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..223345502 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,336 @@ +gridstack - v12.2.2-dev
                    gridstack - v12.2.2-dev
                      Preparing search index...

                      gridstack - v12.2.2-dev

                      gridstack.js

                      NPM version +Coverage Status +downloads

                      +

                      Mobile-friendly modern Typescript library for dashboard layout and creation. Making a drag-and-drop, multi-column responsive dashboard has never been easier. Has multiple bindings and works great with Angular (included), React, Vue, Knockout.js, Ember and others (see frameworks section).

                      +

                      Inspired by no-longer maintained gridster, built with love.

                      +

                      Check http://gridstackjs.com and these demos.

                      +

                      If you find this lib useful, please donate PayPal (use “send to a friend” to avoid 3% fee) or Venmo (adumesny) and help support it!

                      +

                      Donate +Donate

                      +

                      Join us on Slack: https://gridstackjs.slack.com

                      + + + +

                      Table of Contents generated with DocToc

                      + + +

                      Demo and API Documentation

                      Please visit http://gridstackjs.com and these demos, and complete API documentation

                      +

                      Usage

                      NPM version

                      +
                      yarn add gridstack
                      // or
                      npm install --save gridstack +
                      + +

                      ES6 or Typescript

                      +
                      import 'gridstack/dist/gridstack.min.css';
                      import { GridStack } from 'gridstack'; +
                      + +

                      Alternatively (single combined file, notice the -all.js) in html

                      +
                      <link href="node_modules/gridstack/dist/gridstack.min.css" rel="stylesheet"/>
                      <script src="node_modules/gridstack/dist/gridstack-all.js"></script> +
                      + +

                      Note: IE support was dropped in v2, but restored in v4.4 by an external contributor (I have no interest in testing+supporting obsolete browser so this likely will break again in the future) and DROPPED again in v12 (css variable needed). +You can use the es5 files and polyfill (larger) for older browser instead. For example:

                      +
                      <link href="node_modules/gridstack/dist/gridstack.min.css" rel="stylesheet"/>
                      <script src="node_modules/gridstack/dist/es5/gridstack-poly.js"></script>
                      <script src="node_modules/gridstack/dist/es5/gridstack-all.js"></script> +
                      + +

                      creating items dynamically...

                      +
                      // ...in your HTML
                      <div class="grid-stack"></div>

                      // ...in your script
                      var grid = GridStack.init();
                      grid.addWidget({w: 2, content: 'item 1'}); +
                      + +

                      ... or creating from list

                      +
                      // using serialize data instead of .addWidget()
                      const serializedData = [
                      {x: 0, y: 0, w: 2, h: 2},
                      {x: 2, y: 3, w: 3, content: 'item 2'},
                      {x: 1, y: 3}
                      ];

                      grid.load(serializedData); +
                      + +

                      ... or DOM created items

                      +
                      // ...in your HTML
                      <div class="grid-stack">
                      <div class="grid-stack-item">
                      <div class="grid-stack-item-content">Item 1</div>
                      </div>
                      <div class="grid-stack-item" gs-w="2">
                      <div class="grid-stack-item-content">Item 2 wider</div>
                      </div>
                      </div>

                      // ...in your script
                      GridStack.init(); +
                      + +

                      ...or see list of all API and options available.

                      +

                      see stackblitz sample as running example too.

                      +

                      GridStack no longer requires external dependencies as of v1 (lodash was removed in v0.5 and jquery API in v1). v3 is a complete HTML5 re-write removing need for jquery. v6 is native mouse and touch event for mobile support, and no longer have jquery-ui version. All you need to include now is gridstack-all.js and gridstack.min.css (layouts are done using CSS column based %).

                      +

                      search for 'gridstack' under NPM for latest, more to come...

                      + +

                      You can easily extend or patch gridstack with code like this:

                      +
                      // extend gridstack with our own custom method
                      GridStack.prototype.printCount = function() {
                      console.log('grid has ' + this.engine.nodes.length + ' items');
                      };

                      let grid = GridStack.init();

                      // you can now call
                      grid.printCount(); +
                      + +

                      You can now (5.1+) easily create your own layout engine to further customize your usage. Here is a typescript example

                      +
                      import { GridStack, GridStackEngine, GridStackNode, GridStackMoveOpts } from 'gridstack';

                      class CustomEngine extends GridStackEngine {

                      /** refined this to move the node to the given new location */
                      public override moveNode(node: GridStackNode, o: GridStackMoveOpts): boolean {
                      // keep the same original X and Width and let base do it all...
                      o.x = node.x;
                      o.w = node.w;
                      return super.moveNode(node, o);
                      }
                      }

                      GridStack.registerEngine(CustomEngine); // globally set our custom class +
                      + +

                      GridStack makes it very easy if you need [1-12] columns out of the box (default is 12), but you always need 2 things if you need to customize this:

                      +
                        +
                      1. Change the column grid option when creating a grid to your number N
                      2. +
                      +
                      GridStack.init( {column: N} );
                      +
                      + +

                      NOTE: step 2 is OLD and not needed with v12+ which uses CSS variables instead of classes

                      +
                        +
                      1. also include gridstack-extra.css if N < 12 (else custom CSS - see next). Without these, things will not render/work correctly.
                      2. +
                      +
                      <link href="node_modules/gridstack/dist/gridstack.min.css" rel="stylesheet"/>
                      <link href="node_modules/gridstack/dist/gridstack-extra.min.css" rel="stylesheet"/>

                      <div class="grid-stack">...</div> +
                      + +

                      Note: class .grid-stack-N will automatically be added and we include gridstack-extra.min.css which defines CSS for grids with custom [2-11] columns. Anything more and you'll need to generate the SASS/CSS yourself (see next).

                      +

                      See example: 2 grids demo with 6 columns

                      +

                      NOTE: step is OLD and not needed with v12+ which uses CSS variables instead of classes

                      +

                      If you need > 12 columns or want to generate the CSS manually you will need to generate CSS rules for .grid-stack-item[gs-w="X"] and .grid-stack-item[gs-x="X"].

                      +

                      For instance for 4-column grid you need CSS to be:

                      +
                      .gs-4 > .grid-stack-item[gs-x="1"]  { left: 25% }
                      .gs-4 > .grid-stack-item[gs-x="2"] { left: 50% }
                      .gs-4 > .grid-stack-item[gs-x="3"] { left: 75% }

                      .gs-4 > .grid-stack-item { width: 25% }
                      .gs-4 > .grid-stack-item[gs-w="2"] { width: 50% }
                      .gs-4 > .grid-stack-item[gs-w="3"] { width: 75% }
                      .gs-4 > .grid-stack-item[gs-w="4"] { width: 100% } +
                      + +

                      Better yet, here is a SCSS code snippet, you can use sites like sassmeister.com to generate the CSS for you instead:

                      +
                      $columns: 20;
                      +@function fixed($float) {
                      +  @return round($float * 1000) / 1000; // total 2+3 digits being %
                      +}
                      +.gs-#{$columns} > .grid-stack-item {
                      +
                      +  width: fixed(100% / $columns);
                      +
                      +  @for $i from 1 through $columns - 1 {
                      +    &[gs-x='#{$i}'] { left: fixed((100% / $columns) * $i); }
                      +    &[gs-w='#{$i+1}'] { width: fixed((100% / $columns) * ($i+1)); }
                      +  }
                      +}
                      +
                      + +

                      you can also use the SCSS src/gridstack-extra.scss included in NPM package and modify to add more columns.

                      +

                      Sample gulp command for 30 columns:

                      +
                      gulp.src('node_modules/gridstack/dist/src/gridstack-extra.scss')
                      .pipe(replace('$start: 2 !default;','$start: 30;'))
                      .pipe(replace('$end: 11 !default;','$end: 30;'))
                      .pipe(sass({outputStyle: 'compressed'}))
                      .pipe(rename({extname: '.min.css'}))
                      .pipe(gulp.dest('dist/css')) +
                      + +

                      You can override default resizable/draggable options. For instance to enable other then bottom right resizing handle +you can init gridstack like:

                      +
                      GridStack.init({
                      resizable: {
                      handles: 'e,se,s,sw,w'
                      }
                      }); +
                      + +

                      gridstack v6+ now support mobile out of the box, with the addition of native touch event (along with mouse event) for drag&drop and resize. +Older versions (3.2+) required the jq version with added touch punch, but doesn't work well with nested grids.

                      +

                      This option is now the default:

                      +
                      let options = {
                      alwaysShowResizeHandle: 'mobile' // true if we're on mobile devices
                      };
                      GridStack.init(options); +
                      + +

                      See example.

                      +

                      Migrating

                      starting in 0.6.x change event are no longer sent (for pretty much most nodes!) when an item is just added/deleted unless it also changes other nodes (was incorrect and causing inefficiencies). You may need to track added|removed events if you didn't and relied on the old broken behavior.

                      +

                      v1.0.0 removed Jquery from the API and external dependencies, which will require some code changes. Here is a list of the changes:

                      +
                        +
                      1. +

                        see previous step if not on v0.6 already

                        +
                      2. +
                      3. +

                        your code only needs to import GridStack from 'gridstack' or include gridstack.all.js and gristack.css (don't include other JS) and is recommended you do that as internal dependencies will change over time. If you are jquery based, see jquery app section.

                        +
                      4. +
                      5. +

                        code change:

                        +
                      6. +
                      +

                      OLD initializing code + adding a widget + adding an event:

                      +
                      // initialization returned Jquery element, requiring second call to get GridStack var
                      var grid = $('.grid-stack').gridstack(opts?).data('gridstack');

                      // returned Jquery element
                      grid.addWidget($('<div><div class="grid-stack-item-content"> test </div></div>'), undefined, undefined, 2, undefined, true);

                      // jquery event handler
                      $('.grid-stack').on('added', function(e, items) {/* items contains info */});

                      // grid access after init
                      var grid = $('.grid-stack').data('gridstack'); +
                      + +

                      NEW

                      +
                      // element identifier defaults to '.grid-stack', returns the grid
                      // Note: for Typescript use window.GridStack.init() until next native 2.x TS version
                      var grid = GridStack.init(opts?, element?);

                      // returns DOM element
                      grid.addWidget('<div><div class="grid-stack-item-content"> test </div></div>', {width: 2});
                      // Note: in 3.x it's ever simpler
                      // grid.addWidget({w:2, content: 'test'})

                      // event handler
                      grid.on('added', function(e, items) {/* items contains info */});

                      // grid access after init
                      var grid = el.gridstack; // where el = document.querySelector('.grid-stack') or other ways... +
                      + +

                      Other rename changes

                      +
                      `GridStackUI` --> `GridStack`
                      `GridStackUI.GridStackEngine` --> `GridStack.Engine`
                      `grid.container` (jquery grid wrapper) --> `grid.el` // (grid DOM element)
                      `grid.grid` (GridStackEngine) --> `grid.engine`
                      `grid.setColumn(N)` --> `grid.column(N)` and `grid.column()` // to get value, old API still supported though +
                      + +

                      Recommend looking at the many samples for more code examples.

                      +

                      make sure to read v1 migration first!

                      +

                      v2 is a Typescript rewrite of 1.x, removing all jquery events, using classes and overall code cleanup to support ES6 modules. Your code might need to change from 1.x

                      +
                        +
                      1. In general methods that used no args (getter) vs setter can't be used in TS when the arguments differ (set/get are also not function calls so API would have changed). Instead we decided to have all set methods return GridStack to they can be chain-able (ex: grid.float(true).cellHeight(10).column(6)). Also legacy methods that used to take many parameters will now take a single object (typically GridStackOptions or GridStackWidget).
                      2. +
                      +
                      `addWidget(el, x, y, width, height)` --> `addWidget(el, {with: 2})`
                      // Note: in 2.1.x you can now just do addWidget({with: 2, content: "text"})
                      `float()` --> `getFloat()` // to get value
                      `cellHeight()` --> `getCellHeight()` // to get value
                      `verticalMargin` --> `margin` // grid options and API that applies to all 4 sides.
                      `verticalMargin()` --> `getMargin()` // to get value +
                      + +
                        +
                      1. +

                        event signatures are generic and not jquery-ui dependent anymore. gsresizestop has been removed as resizestop|dragstop are now called after the DOM attributes have been updated.

                        +
                      2. +
                      3. +

                        oneColumnMode would trigger when window.width < 768px by default. We now check for grid width instead (more correct and supports nesting). You might need to adjust grid oneColumnSize or disableOneColumnMode.

                        +
                      4. +
                      +

                      Note: 2.x no longer support legacy IE11 and older due to using more compact ES6 output and typecsript native code. You will need to stay at 1.x

                      +

                      make sure to read v2 migration first!

                      +

                      v3 has a new HTML5 drag&drop plugging (63k total, all native code), while still allowing you to use the legacy jquery-ui version instead (188k), or a new static grid version (34k, no user drag&drop but full API support). You will need to decide which version to use as gridstack.all.js no longer exist (same is now gridstack-jq.js) - see include info.

                      +

                      NOTE: HTML5 version is almost on parity with the old jquery-ui based drag&drop. the containment (prevent a child from being dragged outside it's parent) and revert (not clear what it is for yet) are not yet implemented in initial release of v3.0.0.
                      +Also mobile devices don't support h5 drag events (will need to handle touch) whereas v3.2 jq version now now supports out of the box (see v3.2 release)

                      +

                      Breaking changes:

                      +
                        +
                      1. +

                        include (as mentioned) need to change

                        +
                      2. +
                      3. +

                        GridStack.update(el, opt) now takes single GridStackWidget options instead of only supporting (x,y,w,h) BUT legacy call in JS will continue working the same for now. That method is a complete re-write and does the right constrain and updates now for all the available params.

                        +
                      4. +
                      5. +

                        locked(), move(), resize(), minWidth(), minHeight(), maxWidth(), maxHeight() methods are hidden from Typescript (JS can still call for now) as they are just 1 liner wrapper around update(el, opt) anyway and will go away soon. (ex: move(el, x, y) => update(el, {x, y}))

                        +
                      6. +
                      7. +

                        item attribute like data-gs-min-width is now gs-min-w. We removed 'data-' from all attributes, and shorten 'width|height' to just 'w|h' to require less typing and more efficient (2k saved in .js alone!).

                        +
                      8. +
                      9. +

                        GridStackWidget used in most API width|height|minWidth|minHeight|maxWidth|maxHeight are now shorter w|h|minW|minH|maxW|maxH as well

                        +
                      10. +
                      +

                      make sure to read v3 migration first!

                      +

                      v4 is a complete re-write of the collision and drag in/out heuristics to fix some very long standing request & bugs. It also greatly improved usability. Read the release notes for more detail.

                      +

                      Unlikely Breaking Changes (internal usage):

                      +
                        +
                      1. +

                        removeTimeout was removed (feedback over trash will be immediate - actual removal still on mouse up)

                        +
                      2. +
                      3. +

                        the following GridStackEngine methods changed (used internally, doesn't affect GridStack public API)

                        +
                      4. +
                      +
                      // moved to 3 methods with new option params to support new code and pixel coverage check
                      `collision()` -> `collide(), collideAll(), collideCoverage()`
                      `moveNodeCheck(node, x, y, w, h)` -> `moveNodeCheck(node, opt: GridStackMoveOpts)`
                      `isNodeChangedPosition(node, x, y, w, h)` -> `changedPosConstrain(node, opt: GridStackMoveOpts)`
                      `moveNode(node, x, y, w, h, noPack)` -> `moveNode(node, opt: GridStackMoveOpts)` +
                      + +
                        +
                      1. removed old obsolete (v0.6-v1 methods/attrs) getGridHeight(), verticalMargin, data-gs-current-height, +locked(), maxWidth(), minWidth(), maxHeight(), minHeight(), move(), resize()
                      2. +
                      +

                      make sure to read v4 migration first!

                      +

                      v5 does not have any breaking changes from v4, but a focus on nested grids in h5 mode: +You can now drag in/out of parent into nested child, with new API parameters values. See the release notes.

                      +

                      the API did not really change from v5, but a complete re-write of Drag&Drop to use native mouseevent (instead of HTML draggable=true which is buggy on Mac Safari, and doesn't work on mobile devices) and touchevent (mobile), and we no longer have jquery ui option (wasn't working well for nested grids, didn't want to maintain legacy lib).

                      +

                      The main difference is you only need to include gridstack.js and get D&D (desktop and mobile) out of the box for the same size as h5 version.

                      +

                      New addition, no API breakage per say. See release notes about creating sub-grids on the fly.

                      +

                      Possible breaking change if you use nested grid JSON format, or original Angular wrapper, or relied on specific CSS paths. Also target is now ES2020 (see release notes).

                      +
                        +
                      • GridStackOptions.subGrid -> GridStackOptions.subGridOpts rename. We now have GridStackWidget.subGridOpts vs GridStackNode.subGrid (was both types which is error prone)
                      • +
                      • GridStackOptions.addRemoveCB -> GridStack.addRemoveCB is now global instead of grid option
                      • +
                      • removed GridStackOptions.dragInOptions since GridStack.setupDragIn() has it replaced since 4.0
                      • +
                      • remove GridStackOptions.minWidth obsolete since 5.1, use oneColumnSize instead
                      • +
                      • CSS rules removed .grid-stack prefix for anything already gs based, 12 column (default) now uses .gs-12, extra.css is less than 1/4th it original size!, gs-min|max_w|h attribute no longer written (but read)
                      • +
                      +

                      New addition - see release notes about sizeToContent feature. +Possible break:

                      +
                        +
                      • GridStack.onParentResize() is now called onResize() as grid now directly track size change, no longer involving parent per say to tell us anything. Note sure why it was public.
                      • +
                      +

                      we now support much richer responsive behavior with GridStackOptions.columnOpts including any breakpoint width:column pairs, or automatic column sizing.

                      +

                      breaking change:

                      +
                        +
                      • disableOneColumnMode, oneColumnSize have been removed (thought we temporary convert if you have them). use columnOpts: { breakpoints: [{w:768, c:1}] } for the same behavior.
                      • +
                      • 1 column mode switch is no longer by default (columnOpts is not defined) as too many new users had issues. Instead set it explicitly (see above).
                      • +
                      • oneColumnModeDomSort has been removed. Planning to support per column layouts at some future times. TBD
                      • +
                      +
                        +
                      • +

                        All instances of el.innerHTML = 'some content' have been removed for security reason as it opens up some potential for accidental XSS.

                        +
                      • +
                      • +

                        Side panel drag&drop complete rewrite.

                        +
                      • +
                      • +

                        new lazy loading option

                        +
                      • +
                      +

                      Breaking change:

                      +
                        +
                      • V11 add new GridStack.renderCB that is called for you to create the widget content (entire GridStackWidget is passed so you can use id or some other field as logic) while GS creates the 2 needed parent divs + classes, unlike GridStack.addRemoveCB which doesn't create anything for you. Both can be handy for Angular/React/Vue frameworks.
                      • +
                      • addWidget(w: GridStackWidget) is now the only supported format, no more string content passing. You will need to create content yourself as shown below, OR use GridStack.createWidgetDivs() to create parent divs, do the innerHtml, then call makeWidget(el) instead.
                      • +
                      • if your code relies on GridStackWidget.content with real HTML (like a few demos) it is up to you to do this:
                      • +
                      +
                      // NOTE: REAL apps would sanitize-html or DOMPurify before blinding setting innerHTML. see #2736
                      GridStack.renderCB = function(el: HTMLElement, w: GridStackNode) {
                      el.innerHTML = w.content;
                      };

                      // now you can create widgets like this again
                      let gridWidget = grid.addWidget({x, y, w, h, content: '<div>My html content</div>'}); +
                      + +

                      Potential breaking change:

                      +
                        +
                      • BIG overall to how sidepanel helper drag&drop is done:
                      • +
                      +
                        +
                      1. clone() helper is now passed full HTML element dragged, not an event on grid-stack-item-content so you can clone or set attr at the top.
                      2. +
                      3. use any class/structure you want for side panel items (see two.html)
                      4. +
                      5. GridStack.setupDragIn() now support associating a GridStackWidget for each sidepanel that will be used to define what to create on drop!
                      6. +
                      7. if no GridStackWidget is defined, the helper will now be inserted as is, and NOT original sidepanel item.
                      8. +
                      9. support DOM gs- attr as well as gridstacknode JSON (see two.html) alternatives.
                      10. +
                      +
                        +
                      • column and cell height code has been re-writen to use browser CSS variables, and we no longer need a tons of custom CSS classes! +this fixes a long standing issue where people forget to include the right CSS for non 12 columns layouts, and a big speedup in many cases (many columns, or small cellHeight values).
                      • +
                      +

                      Potential breaking change:

                      +
                        +
                      • gridstack-extra.min.css no longer exist, nor is custom column CSS classes needed. API/options hasn't changed.
                      • +
                      • (v12.1) ES5 folder content has been removed - was for IE support, which has been dropped.
                      • +
                      • (v12.1) nested grid events are now sent to the main grid. You might have to adjust your workaround of this missing feature. nested.html demo has been adjusted.
                      • +
                      +

                      jQuery Application

                      This is old and no longer apply to v6+. You'll need to use v5.1.1 and before

                      +
                      import 'gridstack/dist/gridstack.min.css';
                      import { GridStack } from 'gridstack';
                      import 'gridstack/dist/jq/gridstack-dd-jqueryui'; +
                      + +

                      Note: jquery & jquery-ui are imported by name, so you will have to specify their location in your webpack (or equivalent) config file, +which means you can possibly bring your own version

                      +
                        alias: {
                      'jquery': 'gridstack/dist/jq/jquery.js',
                      'jquery-ui': 'gridstack/dist/jq/jquery-ui.js',
                      'jquery.ui': 'gridstack/dist/jq/jquery-ui.js',
                      'jquery.ui.touch-punch': 'gridstack/dist/jq/jquery.ui.touch-punch.js',
                      }, +
                      + +

                      Alternatively (single combined file) in html

                      +
                      <link href="node_modules/gridstack/dist/gridstack.min.css" rel="stylesheet"/>
                      <!-- HTML5 drag&drop (70k) -->
                      <script src="node_modules/gridstack/dist/gridstack-h5.js"></script>
                      <!-- OR jquery-ui drag&drop (195k) -->
                      <script src="node_modules/gridstack/dist/gridstack-jq.js"></script>
                      <!-- OR static grid (40k) -->
                      <script src="node_modules/gridstack/dist/gridstack-static.js"></script> +
                      + +

                      We have a native HTML5 drag'n'drop through the plugin system (default), but the jquery-ui version can be used instead. It will bundle jquery (3.5.1) + jquery-ui (1.13.1 minimal drag|drop|resize) + jquery-ui-touch-punch (1.0.8 for mobile support) in gridstack-jq.js.

                      +

                      NOTE: in v4, v3: we ES6 module import jquery & jquery-ui by name, so you need to specify location of those .js files, which means you might be able to bring your own version as well. See the include instructions.

                      +

                      NOTE: in v1.x IFF you want to use gridstack-jq instead and your app needs to bring your own JQ version, you should instead include gridstack-poly.min.js (optional IE support) + gridstack.min.js + gridstack.jQueryUI.min.js after you import your JQ libs. But note that there are issue with jQuery and ES6 import (see 1306).

                      +

                      As for events, you can still use $(".grid-stack").on(...) for the version that uses jquery-ui for things we don't support.

                      +

                      Changes

                      View our change log here.

                      +

                      Usage Trend

                      Usage Trend of gridstack

                      + + NPM Usage Trend of gridstack + +

                      The Team

                      gridstack.js is currently maintained by Alain Dumesny, before that Dylan Weiss, originally created by Pavel Reznikov. We appreciate all contributors for help.

                      +
                      diff --git a/docs/interfaces/Breakpoint.html b/docs/interfaces/Breakpoint.html new file mode 100644 index 000000000..511da1a54 --- /dev/null +++ b/docs/interfaces/Breakpoint.html @@ -0,0 +1,7 @@ +Breakpoint | gridstack - v12.2.2-dev
                      gridstack - v12.2.2-dev
                        Preparing search index...

                        Interface Breakpoint

                        interface Breakpoint {
                            w?: number;
                            c: number;
                            layout?: ColumnOptions;
                        }
                        Index

                        Properties

                        Properties

                        w?: number

                        <= width for the breakpoint to trigger

                        +
                        c: number

                        column count

                        +
                        layout?: ColumnOptions

                        re-layout mode if different from global one

                        +
                        diff --git a/docs/interfaces/CellPosition.html b/docs/interfaces/CellPosition.html new file mode 100644 index 000000000..a1720ba0f --- /dev/null +++ b/docs/interfaces/CellPosition.html @@ -0,0 +1,4 @@ +CellPosition | gridstack - v12.2.2-dev
                        gridstack - v12.2.2-dev
                          Preparing search index...

                          Interface CellPosition

                          Defines the position of a cell inside the grid

                          +
                          interface CellPosition {
                              x: number;
                              y: number;
                          }
                          Index

                          Properties

                          x +y +

                          Properties

                          x: number
                          y: number
                          diff --git a/docs/interfaces/DDDragOpt.html b/docs/interfaces/DDDragOpt.html new file mode 100644 index 000000000..57db3d53d --- /dev/null +++ b/docs/interfaces/DDDragOpt.html @@ -0,0 +1,18 @@ +DDDragOpt | gridstack - v12.2.2-dev
                          gridstack - v12.2.2-dev
                            Preparing search index...

                            Interface DDDragOpt

                            Drag&Drop dragging options

                            +
                            interface DDDragOpt {
                                handle?: string;
                                appendTo?: string;
                                pause?: number | boolean;
                                scroll?: boolean;
                                cancel?: string;
                                helper?: "clone" | ((el: HTMLElement) => HTMLElement);
                                start?: (event: Event, ui: DDUIData) => void;
                                stop?: (event: Event) => void;
                                drag?: (event: Event, ui: DDUIData) => void;
                            }
                            Index

                            Properties

                            handle?: string

                            class selector of items that can be dragged. default to '.grid-stack-item-content'

                            +
                            appendTo?: string

                            default to 'body'

                            +
                            pause?: number | boolean

                            if set (true | msec), dragging placement (collision) will only happen after a pause by the user. Note: this is Global

                            +
                            scroll?: boolean

                            default to true

                            +
                            cancel?: string

                            prevents dragging from starting on specified elements, listed as comma separated selectors (eg: '.no-drag'). default built in is 'input,textarea,button,select,option'

                            +
                            helper?: "clone" | ((el: HTMLElement) => HTMLElement)

                            helper function when dropping: 'clone' or your own method

                            +
                            start?: (event: Event, ui: DDUIData) => void

                            callbacks

                            +
                            stop?: (event: Event) => void
                            drag?: (event: Event, ui: DDUIData) => void
                            diff --git a/docs/interfaces/DDRemoveOpt.html b/docs/interfaces/DDRemoveOpt.html new file mode 100644 index 000000000..8c5a79d97 --- /dev/null +++ b/docs/interfaces/DDRemoveOpt.html @@ -0,0 +1,6 @@ +DDRemoveOpt | gridstack - v12.2.2-dev
                            gridstack - v12.2.2-dev
                              Preparing search index...

                              Interface DDRemoveOpt

                              Drag&Drop remove options

                              +
                              interface DDRemoveOpt {
                                  accept?: string;
                                  decline?: string;
                              }
                              Index

                              Properties

                              Properties

                              accept?: string

                              class that can be removed (default?: opts.itemClass)

                              +
                              decline?: string

                              class that cannot be removed (default: 'grid-stack-non-removable')

                              +
                              diff --git a/docs/interfaces/DDResizeOpt.html b/docs/interfaces/DDResizeOpt.html new file mode 100644 index 000000000..4abfcc2a0 --- /dev/null +++ b/docs/interfaces/DDResizeOpt.html @@ -0,0 +1,7 @@ +DDResizeOpt | gridstack - v12.2.2-dev
                              gridstack - v12.2.2-dev
                                Preparing search index...

                                Interface DDResizeOpt

                                Drag&Drop resize options

                                +
                                interface DDResizeOpt {
                                    autoHide?: boolean;
                                    handles?: string;
                                }
                                Index

                                Properties

                                Properties

                                autoHide?: boolean

                                do resize handle hide by default until mouse over ? - default: true on desktop, false on mobile

                                +
                                handles?: string

                                sides where you can resize from (ex: 'e, se, s, sw, w') - default 'se' (south-east) +Note: it is not recommended to resize from the top sides as weird side effect may occur.

                                +
                                diff --git a/docs/interfaces/DDUIData.html b/docs/interfaces/DDUIData.html new file mode 100644 index 000000000..d2d2cb225 --- /dev/null +++ b/docs/interfaces/DDUIData.html @@ -0,0 +1,5 @@ +DDUIData | gridstack - v12.2.2-dev
                                gridstack - v12.2.2-dev
                                  Preparing search index...

                                  Interface DDUIData

                                  data that is passed during drag and resizing callbacks

                                  +
                                  interface DDUIData {
                                      position?: Position;
                                      size?: Size;
                                      draggable?: HTMLElement;
                                  }
                                  Index

                                  Properties

                                  Properties

                                  position?: Position
                                  size?: Size
                                  draggable?: HTMLElement
                                  diff --git a/docs/interfaces/DragTransform.html b/docs/interfaces/DragTransform.html new file mode 100644 index 000000000..d2b8655f0 --- /dev/null +++ b/docs/interfaces/DragTransform.html @@ -0,0 +1,5 @@ +DragTransform | gridstack - v12.2.2-dev
                                  gridstack - v12.2.2-dev
                                    Preparing search index...

                                    Interface DragTransform

                                    interface DragTransform {
                                        xScale: number;
                                        yScale: number;
                                        xOffset: number;
                                        yOffset: number;
                                    }
                                    Index

                                    Properties

                                    Properties

                                    xScale: number
                                    yScale: number
                                    xOffset: number
                                    yOffset: number
                                    diff --git a/docs/interfaces/GridHTMLElement.html b/docs/interfaces/GridHTMLElement.html new file mode 100644 index 000000000..3f288938f --- /dev/null +++ b/docs/interfaces/GridHTMLElement.html @@ -0,0 +1,2 @@ +GridHTMLElement | gridstack - v12.2.2-dev
                                    gridstack - v12.2.2-dev
                                      Preparing search index...

                                      Interface GridHTMLElement

                                      interface GridHTMLElement {
                                          gridstack?: GridStack;
                                      }

                                      Hierarchy

                                      • HTMLElement
                                        • GridHTMLElement
                                      Index

                                      Properties

                                      Properties

                                      gridstack?: GridStack
                                      diff --git a/docs/interfaces/GridItemHTMLElement.html b/docs/interfaces/GridItemHTMLElement.html new file mode 100644 index 000000000..28554481c --- /dev/null +++ b/docs/interfaces/GridItemHTMLElement.html @@ -0,0 +1,3 @@ +GridItemHTMLElement | gridstack - v12.2.2-dev
                                      gridstack - v12.2.2-dev
                                        Preparing search index...

                                        Interface GridItemHTMLElement

                                        interface GridItemHTMLElement {
                                            gridstackNode?: GridStackNode;
                                        }

                                        Hierarchy

                                        • HTMLElement
                                          • GridItemHTMLElement
                                        Index

                                        Properties

                                        Properties

                                        gridstackNode?: GridStackNode

                                        pointer to grid node instance

                                        +
                                        diff --git a/docs/interfaces/GridStackEngineOptions.html b/docs/interfaces/GridStackEngineOptions.html new file mode 100644 index 000000000..8fef89533 --- /dev/null +++ b/docs/interfaces/GridStackEngineOptions.html @@ -0,0 +1,7 @@ +GridStackEngineOptions | gridstack - v12.2.2-dev
                                        gridstack - v12.2.2-dev
                                          Preparing search index...

                                          Interface GridStackEngineOptions

                                          options used during creation - similar to GridStackOptions

                                          +
                                          interface GridStackEngineOptions {
                                              column?: number;
                                              maxRow?: number;
                                              float?: boolean;
                                              nodes?: GridStackNode[];
                                              onChange?: OnChangeCB;
                                          }
                                          Index

                                          Properties

                                          column?: number
                                          maxRow?: number
                                          float?: boolean
                                          nodes?: GridStackNode[]
                                          onChange?: OnChangeCB
                                          diff --git a/docs/interfaces/GridStackMoveOpts.html b/docs/interfaces/GridStackMoveOpts.html new file mode 100644 index 000000000..4fe9139af --- /dev/null +++ b/docs/interfaces/GridStackMoveOpts.html @@ -0,0 +1,31 @@ +GridStackMoveOpts | gridstack - v12.2.2-dev
                                          gridstack - v12.2.2-dev
                                            Preparing search index...

                                            Interface GridStackMoveOpts

                                            options used during GridStackEngine.moveNode()

                                            +
                                            interface GridStackMoveOpts {
                                                skip?: GridStackNode;
                                                pack?: boolean;
                                                nested?: boolean;
                                                cellWidth?: number;
                                                cellHeight?: number;
                                                marginTop?: number;
                                                marginBottom?: number;
                                                marginLeft?: number;
                                                marginRight?: number;
                                                rect?: GridStackPosition;
                                                resizing?: boolean;
                                                collide?: GridStackNode;
                                                forceCollide?: boolean;
                                                x?: number;
                                                y?: number;
                                                w?: number;
                                                h?: number;
                                            }

                                            Hierarchy (View Summary)

                                            Index

                                            Properties

                                            node to skip collision

                                            +
                                            pack?: boolean

                                            do we pack (default true)

                                            +
                                            nested?: boolean

                                            true if we are calling this recursively to prevent simple swap or coverage collision - default false

                                            +
                                            cellWidth?: number

                                            vars to calculate other cells coordinates

                                            +
                                            cellHeight?: number
                                            marginTop?: number
                                            marginBottom?: number
                                            marginLeft?: number
                                            marginRight?: number

                                            position in pixels of the currently dragged items (for overlap check)

                                            +
                                            resizing?: boolean

                                            true if we're live resizing

                                            +
                                            collide?: GridStackNode

                                            best node (most coverage) we collied with

                                            +
                                            forceCollide?: boolean

                                            for collision check even if we don't move

                                            +
                                            x?: number

                                            widget position x (default?: 0)

                                            +
                                            y?: number

                                            widget position y (default?: 0)

                                            +
                                            w?: number

                                            widget dimension width (default?: 1)

                                            +
                                            h?: number

                                            widget dimension height (default?: 1)

                                            +
                                            diff --git a/docs/interfaces/GridStackNode.html b/docs/interfaces/GridStackNode.html new file mode 100644 index 000000000..a8731910f --- /dev/null +++ b/docs/interfaces/GridStackNode.html @@ -0,0 +1,47 @@ +GridStackNode | gridstack - v12.2.2-dev
                                            gridstack - v12.2.2-dev
                                              Preparing search index...

                                              Interface GridStackNode

                                              internal runtime descriptions describing the widgets in the grid

                                              +
                                              interface GridStackNode {
                                                  x?: number;
                                                  y?: number;
                                                  w?: number;
                                                  h?: number;
                                                  autoPosition?: boolean;
                                                  minW?: number;
                                                  maxW?: number;
                                                  minH?: number;
                                                  maxH?: number;
                                                  noResize?: boolean;
                                                  noMove?: boolean;
                                                  locked?: boolean;
                                                  id?: string;
                                                  content?: string;
                                                  lazyLoad?: boolean;
                                                  sizeToContent?: number | boolean;
                                                  resizeToContentParent?: string;
                                                  subGridOpts?: GridStackOptions;
                                                  el?: GridItemHTMLElement;
                                                  grid?: GridStack;
                                                  subGrid?: GridStack;
                                                  visibleObservable?: IntersectionObserver;
                                              }

                                              Hierarchy (View Summary)

                                              Index

                                              Properties

                                              x?: number

                                              widget position x (default?: 0)

                                              +
                                              y?: number

                                              widget position y (default?: 0)

                                              +
                                              w?: number

                                              widget dimension width (default?: 1)

                                              +
                                              h?: number

                                              widget dimension height (default?: 1)

                                              +
                                              autoPosition?: boolean

                                              if true then x, y parameters will be ignored and widget will be places on the first available position (default?: false)

                                              +
                                              minW?: number

                                              minimum width allowed during resize/creation (default?: undefined = un-constrained)

                                              +
                                              maxW?: number

                                              maximum width allowed during resize/creation (default?: undefined = un-constrained)

                                              +
                                              minH?: number

                                              minimum height allowed during resize/creation (default?: undefined = un-constrained)

                                              +
                                              maxH?: number

                                              maximum height allowed during resize/creation (default?: undefined = un-constrained)

                                              +
                                              noResize?: boolean

                                              prevent direct resizing by the user (default?: undefined = un-constrained)

                                              +
                                              noMove?: boolean

                                              prevents direct moving by the user (default?: undefined = un-constrained)

                                              +
                                              locked?: boolean

                                              prevents being pushed by other widgets or api (default?: undefined = un-constrained), which is different from noMove (user action only)

                                              +
                                              id?: string

                                              value for gs-id stored on the widget (default?: undefined)

                                              +
                                              content?: string

                                              html to append inside as content

                                              +
                                              lazyLoad?: boolean

                                              true when widgets are only created when they scroll into view (visible)

                                              +
                                              sizeToContent?: number | boolean

                                              local (vs grid) override - see GridStackOptions. +Note: This also allow you to set a maximum h value (but user changeable during normal resizing) to prevent unlimited content from taking too much space (get scrollbar)

                                              +
                                              resizeToContentParent?: string

                                              local override of GridStack.resizeToContentParent that specify the class to use for the parent (actual) vs child (wanted) height

                                              +
                                              subGridOpts?: GridStackOptions

                                              optional nested grid options and list of children, which then turns into actual instance at runtime to get options from

                                              +

                                              pointer back to HTML element

                                              +
                                              grid?: GridStack

                                              pointer back to parent Grid instance

                                              +
                                              subGrid?: GridStack

                                              actual sub-grid instance

                                              +
                                              visibleObservable?: IntersectionObserver

                                              allow delay creation when visible

                                              +
                                              diff --git a/docs/interfaces/GridStackOptions.html b/docs/interfaces/GridStackOptions.html new file mode 100644 index 000000000..44cd9bada --- /dev/null +++ b/docs/interfaces/GridStackOptions.html @@ -0,0 +1,112 @@ +GridStackOptions | gridstack - v12.2.2-dev
                                              gridstack - v12.2.2-dev
                                                Preparing search index...

                                                Interface GridStackOptions

                                                Defines the options for a Grid

                                                +
                                                interface GridStackOptions {
                                                    acceptWidgets?: string | boolean | ((element: Element) => boolean);
                                                    alwaysShowResizeHandle?: boolean | "mobile";
                                                    animate?: boolean;
                                                    auto?: boolean;
                                                    cellHeight?: numberOrString;
                                                    cellHeightThrottle?: number;
                                                    cellHeightUnit?: string;
                                                    children?: GridStackWidget[];
                                                    column?: number | "auto";
                                                    columnOpts?: Responsive;
                                                    class?: string;
                                                    disableDrag?: boolean;
                                                    disableResize?: boolean;
                                                    draggable?: DDDragOpt;
                                                    engineClass?: typeof GridStackEngine;
                                                    float?: boolean;
                                                    handle?: string;
                                                    handleClass?: string;
                                                    itemClass?: string;
                                                    layout?: ColumnOptions;
                                                    lazyLoad?: boolean;
                                                    margin?: numberOrString;
                                                    marginTop?: numberOrString;
                                                    marginRight?: numberOrString;
                                                    marginBottom?: numberOrString;
                                                    marginLeft?: numberOrString;
                                                    marginUnit?: string;
                                                    maxRow?: number;
                                                    minRow?: number;
                                                    nonce?: string;
                                                    placeholderClass?: string;
                                                    placeholderText?: string;
                                                    resizable?: DDResizeOpt;
                                                    removable?: string | boolean;
                                                    removableOptions?: DDRemoveOpt;
                                                    row?: number;
                                                    rtl?: boolean | "auto";
                                                    sizeToContent?: boolean;
                                                    staticGrid?: boolean;
                                                    styleInHead?: boolean;
                                                    subGridOpts?: GridStackOptions;
                                                    subGridDynamic?: boolean;
                                                }
                                                Index

                                                Properties

                                                acceptWidgets?: string | boolean | ((element: Element) => boolean)

                                                accept widgets dragged from other grids or from outside (default: false). Can be: +true (uses '.grid-stack-item' class filter) or false, +string for explicit class name, +function returning a boolean. See example

                                                +
                                                alwaysShowResizeHandle?: boolean | "mobile"

                                                possible values (default: mobile) - does not apply to non-resizable widgets +false the resizing handles are only shown while hovering over a widget +true the resizing handles are always shown +'mobile' if running on a mobile device, default to true (since there is no hovering per say), else false. +See example

                                                +
                                                animate?: boolean

                                                turns animation on (default?: true)

                                                +
                                                auto?: boolean

                                                if false gridstack will not initialize existing items (default?: true)

                                                +
                                                cellHeight?: numberOrString

                                                one cell height (default?: 'auto'). Can be: +an integer (px) +a string (ex: '100px', '10em', '10rem'). Note: % doesn't work right - see demo/cell-height.html +0, in which case the library will not generate styles for rows. Everything must be defined in your own CSS files. +'auto' - height will be calculated for square cells (width / column) and updated live as you resize the window - also see cellHeightThrottle +'initial' - similar to 'auto' (start at square cells) but stay that size during window resizing.

                                                +
                                                cellHeightThrottle?: number

                                                throttle time delay (in ms) used when cellHeight='auto' to improve performance vs usability (default?: 100). +A value of 0 will make it instant at a cost of re-creating the CSS file at ever window resize event!

                                                +
                                                cellHeightUnit?: string

                                                (internal) unit for cellHeight (default? 'px') which is set when a string cellHeight with a unit is passed (ex: '10rem')

                                                +
                                                children?: GridStackWidget[]

                                                list of children item to create when calling load() or addGrid()

                                                +
                                                column?: number | "auto"

                                                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. +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 +items always the same. flag is NOT supported for regular non-nested grids.

                                                +
                                                columnOpts?: Responsive

                                                responsive column layout for width:column behavior

                                                +
                                                class?: string

                                                additional class on top of '.grid-stack' (which is required for our CSS) to differentiate this instance. +Note: only used by addGrid(), else your element should have the needed class

                                                +
                                                disableDrag?: boolean

                                                disallows dragging of widgets (default?: false)

                                                +
                                                disableResize?: boolean

                                                disallows resizing of widgets (default?: false).

                                                +
                                                draggable?: DDDragOpt

                                                allows to override UI draggable options. (default?: { handle?: '.grid-stack-item-content', appendTo?: 'body' })

                                                +
                                                engineClass?: typeof GridStackEngine

                                                the type of engine to create (so you can subclass) default to GridStackEngine

                                                +
                                                float?: boolean

                                                enable floating widgets (default?: false) See example (http://gridstack.github.io/gridstack.js/demo/float.html)

                                                +
                                                handle?: string

                                                draggable handle selector (default?: '.grid-stack-item-content')

                                                +
                                                handleClass?: string

                                                draggable handle class (e.g. 'grid-stack-item-content'). If set 'handle' is ignored (default?: null)

                                                +
                                                itemClass?: string

                                                additional widget class (default?: 'grid-stack-item')

                                                +
                                                layout?: ColumnOptions

                                                re-layout mode when we're a subgrid and we are being resized. default to 'list'

                                                +
                                                lazyLoad?: boolean

                                                true when widgets are only created when they scroll into view (visible)

                                                +

                                                gap between grid item and content (default?: 10). This will set all 4 sides and support the CSS formats below +an integer (px) +a string with possible units (ex: '2em', '20px', '2rem') +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). +Note: all sides must have same units (last one wins, default px)

                                                +
                                                marginTop?: numberOrString

                                                OLD way to optionally set each side - use margin: '5px 10px 0 20px' instead. Used internally to store each side.

                                                +
                                                marginRight?: numberOrString
                                                marginBottom?: numberOrString
                                                marginLeft?: numberOrString
                                                marginUnit?: string

                                                (internal) unit for margin (default? 'px') set when margin is set as string with unit (ex: 2rem')

                                                +
                                                maxRow?: number

                                                maximum rows amount. Default? is 0 which means no maximum rows

                                                +
                                                minRow?: number

                                                minimum rows amount which is handy to prevent grid from collapsing when empty. Default is 0. +When no set the min-height CSS attribute on the grid div (in pixels) can be used, which will round to the closest row.

                                                +
                                                nonce?: string

                                                If you are using a nonce-based Content Security Policy, pass your nonce here and +GridStack will add it to the