From f5f6cc02249fbad3733444620245f54102d44fee Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Sat, 26 Apr 2025 16:48:04 +0300 Subject: [PATCH 01/47] [add] initial api and guides for grid range manager module --- docs/grid/api/api_overview.md | 20 +++++ docs/grid/api/grid_rangeselection_config.md | 61 +++++++++++++ .../rangeselection_afterresetrange_event.md | 0 .../rangeselection_aftersetrange_event.md | 0 .../rangeselection_beforeresetrange_event.md | 0 .../rangeselection_beforesetrange_event.md | 0 .../rangeselection_disable_method.md | 0 .../rangeselection_enable_method.md | 0 .../rangeselection_getrange_method.md | 52 +++++++++++ .../rangeselection_getrangedcells_method.md | 0 .../rangeselection_isdisabled_method.md | 0 .../rangeselection_isranged_method.md | 49 +++++++++++ .../rangeselection_resetrange_method.md | 42 +++++++++ .../rangeselection_setrange_method.md | 87 +++++++++++++++++++ docs/grid/configuration.md | 44 ++++++++++ docs/grid/usage.md | 4 + docs/grid/usage_range_selection.md | 11 +++ sidebars.js | 50 +++++++++++ 18 files changed, 420 insertions(+) create mode 100644 docs/grid/api/grid_rangeselection_config.md create mode 100644 docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md create mode 100644 docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md create mode 100644 docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md create mode 100644 docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md create mode 100644 docs/grid/api/rangeselection/rangeselection_disable_method.md create mode 100644 docs/grid/api/rangeselection/rangeselection_enable_method.md create mode 100644 docs/grid/api/rangeselection/rangeselection_getrange_method.md create mode 100644 docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md create mode 100644 docs/grid/api/rangeselection/rangeselection_isdisabled_method.md create mode 100644 docs/grid/api/rangeselection/rangeselection_isranged_method.md create mode 100644 docs/grid/api/rangeselection/rangeselection_resetrange_method.md create mode 100644 docs/grid/api/rangeselection/rangeselection_setrange_method.md create mode 100644 docs/grid/usage_range_selection.md diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index 583b67d2e..f08bd4401 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -203,6 +203,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX | [](grid/api/grid_leftsplit_config.md) | @getshort(grid/api/grid_leftsplit_config.md) | | [](grid/api/grid_multiselection_config.md) | @getshort(grid/api/grid_multiselection_config.md) | | [](grid/api/grid_multisort_config.md) | @getshort(grid/api/grid_multisort_config.md) | +| [](grid/api/grid_rangeselection_config.md) | @getshort(grid/api/grid_rangeselection_config.md) | | [](grid/api/grid_resizable_config.md) | @getshort(grid/api/grid_resizable_config.md) | | [](grid/api/grid_rightsplit_config.md) | @getshort(grid/api/grid_rightsplit_config.md) | | [](grid/api/grid_rootparent_config.md) | @getshort(grid/api/grid_rootparent_config.md) | @@ -245,6 +246,25 @@ You will find the list of all the available configuration properties of a Grid c | [](grid/api/selection/selection_beforeselect_event.md) | @getshort(grid/api/selection/selection_beforeselect_event.md) | | [](grid/api/selection/selection_beforeunselect_event.md) | @getshort(grid/api/selection/selection_beforeunselect_event.md) | +## Range Selection API + +### Range Selection methods + +| Name | Description | +| ----------------------------------------------------- | ------------------------------------------------------------ | +| [](grid/api/rangeselection/rangeselection_disable_method.md) | @getshort(grid/api/rangeselection/rangeselection_disable_method.md) | +| [](grid/api/rangeselection/rangeselection_enable_method.md) | @getshort(grid/api/rangeselection/rangeselection_enable_method.md) | +| [](grid/api/rangeselection/rangeselection_getrange_method.md) | @getshort(grid/api/rangeselection/rangeselection_getrange_method.md) | +| [](grid/api/rangeselection/rangeselection_getrangedcells_method.md) | @getshort(grid/api/rangeselection/rangeselection_getrangedcells_method.md) | +| [](grid/api/rangeselection/rangeselection_isdisabled_method.md) | @getshort(grid/api/rangeselection/rangeselection_isdisabled_method.md) | +| [](grid/api/rangeselection/rangeselection_isranged_method.md) | @getshort(grid/api/rangeselection/rangeselection_isranged_method.md) | +| [](grid/api/rangeselection/rangeselection_resetrange_method.md) | @getshort(grid/api/rangeselection/rangeselection_resetrange_method.md) | +| [](grid/api/rangeselection/rangeselection_setrange_method.md) | @getshort(grid/api/rangeselection/rangeselection_setrange_method.md) | + + +### Range Selection events + + ## Export methods | Name | Description | diff --git a/docs/grid/api/grid_rangeselection_config.md b/docs/grid/api/grid_rangeselection_config.md new file mode 100644 index 000000000..0d3012c6e --- /dev/null +++ b/docs/grid/api/grid_rangeselection_config.md @@ -0,0 +1,61 @@ +--- +sidebar_label: rangeSelection +title: JavaScript Grid - rangeSelection Config +description: You can explore the rangeSelection config of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# rangeSelection + +@short: Optional. Enables range selection management within a grid + +### Usage + +~~~jsx +rangeSelection?: + | boolean + | { + disabled?: boolean; + }; +~~~ + +@default: false + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true // enables the Range module +}); + +@descr: +The `rangeSelection` configuration object can have the following properties: + +- **disabled** - makes the module inactive upon initialization of the component + +~~~jsx {11,15} +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: { disabled: true } +}); + +console.log(grid.range.isDisabled()); // `true` - module is inactive +grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set +~~~ + +**Related article:** [Range selection](grid/configuration.md/#range-selection) + +@changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md b/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md b/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md b/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md b/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_disable_method.md b/docs/grid/api/rangeselection/rangeselection_disable_method.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_enable_method.md b/docs/grid/api/rangeselection/rangeselection_enable_method.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_getrange_method.md b/docs/grid/api/rangeselection/rangeselection_getrange_method.md new file mode 100644 index 000000000..8041de6b1 --- /dev/null +++ b/docs/grid/api/rangeselection/rangeselection_getrange_method.md @@ -0,0 +1,52 @@ +--- +sidebar_label: getRange() +title: JavaScript Grid - getRange Method +description: You can explore the getRange method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# getRange() + +@short: returns the current selection range or `null` if no range is set + +### Usage + +~~~jsx +getRange(): + | null + | { + xStart?: string | number; + xEnd?: string | number; + yStart?: string | number; + yEnd?: string | number; + }; +~~~ + +@returns: +- an object with the current selection range, where: + - `xStart?: string | number` - the starting column id + - `xEnd?: string | number` - the ending column id + - `yStart?: string | number` - the starting row id + - `yEnd?: string | number` - the ending row id +- `null` if no range is set + +@example: +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "2" }); +console.log(grid.range.getRange()); // { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } + +@descr: + +@changelog: +added in v9.2 diff --git a/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md b/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md b/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/grid/api/rangeselection/rangeselection_isranged_method.md b/docs/grid/api/rangeselection/rangeselection_isranged_method.md new file mode 100644 index 000000000..6762c3ac6 --- /dev/null +++ b/docs/grid/api/rangeselection/rangeselection_isranged_method.md @@ -0,0 +1,49 @@ +--- +sidebar_label: isRanged() +title: JavaScript Grid - isRanged Method +description: You can explore the isRanged method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# isRanged() + +@short: checks whether a cell is within the current range + +### Usage + +~~~jsx +isRanged(cell: { x: string | number; y: string | number }): boolean; +~~~ + +@params: +- `cell: object` - an object with the `x` and `y` coordinates of a cell, where: + - `x: string | number` - the column id + - `y: string | number` - the row id + +:::note +You can specify just `x` or `y` to check a column or a row, correspondingly. +::: + +@returns: +`true`, if the cell is within the current range, `false` otherwise + +@example: +// this example shows checking whether an ID belongs to the selected cell range +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "2" }); +console.log(grid.range.isRanged({ x: "a", y: "1" })); // true +console.log(grid.range.isRanged({ x: "a" })); // true +console.log(grid.range.isRanged({ y: "3" })); // false + +@descr: diff --git a/docs/grid/api/rangeselection/rangeselection_resetrange_method.md b/docs/grid/api/rangeselection/rangeselection_resetrange_method.md new file mode 100644 index 000000000..2987ef7e0 --- /dev/null +++ b/docs/grid/api/rangeselection/rangeselection_resetrange_method.md @@ -0,0 +1,42 @@ +--- +sidebar_label: resetRange() +title: JavaScript Grid - resetRange Method +description: You can explore the resetRange method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# resetRange() + +@short: resets the current selection range + +### Usage + +~~~jsx +resetRange(): boolean; +~~~ + +@returns: +`true` - on success, `false` if the module is disabled, or if reset is canceled by an event. + + +@example: +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.resetRange(); +console.log(grid.range.getRange()); // -> null + +@descr: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_setrange_method.md b/docs/grid/api/rangeselection/rangeselection_setrange_method.md new file mode 100644 index 000000000..59df53279 --- /dev/null +++ b/docs/grid/api/rangeselection/rangeselection_setrange_method.md @@ -0,0 +1,87 @@ +--- +sidebar_label: setRange() +title: JavaScript Grid - setRange Method +description: You can explore the setRange method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# setRange() + +@short: sets the selection range + +### Usage + +~~~jsx +setRange( + range: { + xStart?: string | number; + xEnd?: string | number; + yStart?: string | number; + yEnd?: string | number; + }, + join?: boolean +): boolean; +~~~ + +@params: +- `range: object` - defines the range to set: + - `xStart?: string | number` - sets the starting column id + - `xEnd?: string | number` - sets the ending column id + - `yStart?: string | number` - sets the starting row id + - `yEnd?: string | number` - sets the ending row id +- `join?: boolean` - defines whether a new range is merged with the current one: + - when `join: true` is set, the method merges the new range with the current one. In this case only the ending ids are required + - if the `join: false` setting is specified, the method resets the previous range + +If not all coordinates are provided, the missing ones are automatically filled (e.g., the last visible column for xEnd). The starting id for at least one coordinate is required. + +@returns: +`true` - on success, `false` - on error, event cancellation, or if the module is disabled. + +@descr: +### Example + +~~~jsx +// this example shows setting a range with omitted ending coordinates +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); // sets range from "a1" to the end +console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } +~~~ + +~~~jsx +// this example demonstrates merging a range +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.setRange({ xEnd: "b", yEnd: "2" }, true); // merges with the current range +console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } +~~~ + + + + + +@changelog: +added in v9.2 diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index b3cb274c2..895171057 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2418,6 +2418,50 @@ const grid = new dhx.Grid("grid_container", { Since the `multiselection` configuration option is set to *true*, using the "Ctrl + Click" combination allows selecting the desired cells or rows. A range of Grid cells/rows can be selected by clicking the first element to select and then, while holding down the Shift key, clicking the last element to select. +## Range selection + +To enable [range selection management](grid/usage_range_selection.md) within a grid, you should use the Range module. To initialize the Range module, use the [rangeSelection](grid/api/grid_rangeselection_config.md) property in the Grid configuration: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true // enables the Range module +}); +~~~ + +The `rangeSelection` property can be set in two ways: + +- as a *boolean* value it enables or disables the range selection module upon the component initialization +- as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: + - **disabled** - makes the module inactive upon initialization of the component + +The example below demonstrates interaction with the Range module's methods when range selection is configured to be inactive on the component initialization. + +~~~jsx {11,15} +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: { disabled: true } +}); + +console.log(grid.range.isDisabled()); // `true` - module is inactive +grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set +~~~ + ## Spans The Grid component has the [spans](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 8cf3b5f28..29da03af6 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -1200,6 +1200,10 @@ grid.destructor(); For information on using Selection API, read [Work with Selection Object](grid/usage_selection.md). +## Using Range Selection API + +For information on using Range Selection API, read [Work with Range Selection Object](grid/usage_range_selection.md). + ## Working with Grid in the TreeGrid mode For information on working with with Grid in the TreeGrid mode, read the [TreeGrid mode](grid/treegrid_mode.md#work-with-grid-in-the-treegrid-mode) guide. diff --git a/docs/grid/usage_range_selection.md b/docs/grid/usage_range_selection.md new file mode 100644 index 000000000..2846261f1 --- /dev/null +++ b/docs/grid/usage_range_selection.md @@ -0,0 +1,11 @@ +--- +sidebar_label: Work with Range Selection object +title: JavaScript Grid - Work with Range Selection Object +description: You can explore how to work with Range Selection Object of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# Work with Range Selection object + +You can manage range selection withing a grid via the API of the [Range selection](grid/configuration.md/#range-selection) object. It provides methods for setting and resetting a range of cells, getting information about the current range, and checking whether specific cells belong to the selected range. It also supports an event system to track changes. + +To initialize the Range module, use the [rangeSelection](grid/api/grid_rangeselection_config.md) property in the Grid configuration. Once the Grid is created, the Range module is accessible through the `grid.range` property. \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 08066c691..45b99a08e 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2642,6 +2642,7 @@ module.exports = { "grid/api/grid_leftsplit_config", "grid/api/grid_multiselection_config", "grid/api/grid_multisort_config", + "grid/api/grid_rangeselection_config", "grid/api/grid_resizable_config", "grid/api/grid_rightsplit_config", "grid/api/grid_rootparent_config", @@ -2763,6 +2764,54 @@ module.exports = { }, ], }, + { + type: "category", + label: "Range Selection API", + link: { + type: 'generated-index', + title: "Range Selection API", + keywords: ['range selection API'], + image: '/img/docusaurus.png' + }, + items: [{ + type: "category", + label: "Grid Range Selection methods", + link: { + type: 'generated-index', + title: "Grid Range Selection methods", + keywords: ['grid range selection methods'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/rangeselection/rangeselection_disable_method", + "grid/api/rangeselection/rangeselection_enable_method", + "grid/api/rangeselection/rangeselection_getrange_method", + "grid/api/rangeselection/rangeselection_getrangedcells_method", + "grid/api/rangeselection/rangeselection_isdisabled_method", + "grid/api/rangeselection/rangeselection_isranged_method", + "grid/api/rangeselection/rangeselection_resetrange_method", + "grid/api/rangeselection/rangeselection_setrange_method", + ], + }, + + { + type: "category", + label: "Grid Range Selection events", + link: { + type: 'generated-index', + title: "Grid Range Selection events", + keywords: ['grid range selection events'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/rangeselection/rangeselection_afterresetrange_event", + "grid/api/rangeselection/rangeselection_aftersetrange_event", + "grid/api/rangeselection/rangeselection_beforeresetrange_event", + "grid/api/rangeselection/rangeselection_beforesetrange_event", + ], + }, + ], + }, { type: "category", label: "Export methods", @@ -2790,6 +2839,7 @@ module.exports = { "grid/usage", "grid/treegrid_mode", "grid/usage_selection", + "grid/usage_range_selection", "grid/customization", "grid/events", ], From 07a3102e6f5ebfb0815b64a57507029b02dec4e1 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 2 May 2025 17:44:58 +0300 Subject: [PATCH 02/47] [update] complete api and guides for grid range manager module --- docs/grid/api/api_overview.md | 10 + .../rangeselection_afterresetrange_event.md | 55 ++++ .../rangeselection_aftersetrange_event.md | 53 ++++ .../rangeselection_beforeresetrange_event.md | 59 ++++ .../rangeselection_beforesetrange_event.md | 59 ++++ .../rangeselection_disable_method.md | 45 +++ .../rangeselection_enable_method.md | 43 +++ .../rangeselection_getrange_method.md | 8 +- .../rangeselection_getrangedcells_method.md | 46 +++ .../rangeselection_isdisabled_method.md | 47 +++ .../rangeselection_isranged_method.md | 15 +- .../rangeselection_resetrange_method.md | 5 + .../rangeselection_setrange_method.md | 24 +- docs/grid/configuration.md | 4 +- docs/grid/features.md | 11 + docs/grid/usage_range_selection.md | 271 +++++++++++++++++- 16 files changed, 736 insertions(+), 19 deletions(-) diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index f08bd4401..f76543670 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -44,6 +44,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX :::info important - Use [the methods of DataCollection](data_collection.md) to work with data. - Apply [the methods of Selection](grid/api/api_overview.md#selection-methods) to manage the selection of Grid cells. +- Apply [the methods of Range Selection](grid/api/api_overview.md#range-selection-methods) to manage the range selection within Grid. - Use [the methods of TreeCollection](tree_collection.md#methods) to work with data of Grid in the TreeGrid mode. ::: @@ -165,6 +166,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX :::info important - Use [the events of DataCollection](data_collection.md#events) to work with data of Grid. - Apply [the events of Selection](grid/api/api_overview.md#selection-events) to handle the selection of Grid cells. +- Apply [the events of Range Selection](grid/api/api_overview.md#range-selection-events) to handle the range selection within Grid. - Use [the events of TreeCollection](tree_collection.md#events) to work with data of Grid in the TreeGrid mode. ::: @@ -264,6 +266,14 @@ You will find the list of all the available configuration properties of a Grid c ### Range Selection events +| Name | Description | +| -------------------------------------------------------- | --------------------------------------------------------------- | +| [](grid/api/rangeselection/rangeselection_afterresetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_afterresetrange_event.md) | +| [](grid/api/rangeselection/rangeselection_aftersetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_aftersetrange_event.md) | +| [](grid/api/rangeselection/rangeselection_beforeresetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_beforeresetrange_event.md) | +| [](grid/api/rangeselection/rangeselection_beforesetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_beforesetrange_event.md) | + + ## Export methods diff --git a/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md b/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md index e69de29bb..fa892e56f 100644 --- a/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md +++ b/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md @@ -0,0 +1,55 @@ +--- +sidebar_label: afterResetRange +title: JavaScript Grid - afterResetRange Event +description: You can explore the afterResetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterResetRange + +@short: fires after a range has been successfully reset + +### Usage + +~~~jsx +afterResetRange: ( + range: { + xStart: string | number; + xEnd: string | number; + yStart: string | number; + yEnd: string | number; + } +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `range: object` - the object of the reset range: + - `xStart?: string | number` - the starting column id + - `xEnd?: string | number` - the ending column id + - `yStart?: string | number` - the starting row id + - `yEnd?: string | number` - the ending row id + +@example: +const grid = new dhx.Grid("grid_container", { + // other configuration + rangeSelection: true +}); + +grid.range.events.on("afterResetRange", (range) => { + console.log("The range is reset, the previous range is:", range); +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.resetRange(); // logs the previous range + +@descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), +[`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md), +[`beforeResetRange`](grid/api/rangeselection/rangeselection_beforeresetrange_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md b/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md index e69de29bb..6553e0ed3 100644 --- a/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md +++ b/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md @@ -0,0 +1,53 @@ +--- +sidebar_label: afterSetRange +title: JavaScript Grid - afterSetRange Event +description: You can explore the afterSetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterSetRange + +@short: fires after a range has been successfully set + +### Usage + +~~~jsx +afterSetRange: ( + range: { + xStart: string | number; + xEnd: string | number; + yStart: string | number; + yEnd: string | number; + } +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `range: object` - the object of the set range: + - `xStart?: string | number` - the starting column id + - `xEnd?: string | number` - the ending column id + - `yStart?: string | number` - the starting row id + - `yEnd?: string | number` - the ending row id + +@example: +const grid = new dhx.Grid("grid_container", { + // other configuration + rangeSelection: true +}); + +grid.range.events.on("afterSetRange", (range) => { + console.log("The range is set:", range); +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); // logs the range object + +@descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), +[`beforeSetRange`](grid/api/rangeselection/rangeselection_beforesetrange_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md b/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md index e69de29bb..923b4e961 100644 --- a/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md +++ b/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md @@ -0,0 +1,59 @@ +--- +sidebar_label: beforeResetRange +title: JavaScript Grid - beforeResetRange Event +description: You can explore the beforeResetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeResetRange + +@short: fires before resetting the range + +### Usage + +~~~jsx +beforeResetRange: ( + range: { + xStart: string | number; + xEnd: string | number; + yStart: string | number; + yEnd: string | number; + } +) => boolean | void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `range: object` - the range object: + - `xStart?: string | number` - the starting column id + - `xEnd?: string | number` - the ending column id + - `yStart?: string | number` - the starting row id + - `yEnd?: string | number` - the ending row id + +@returns: +Return `false` to prevent resetting of the range; otherwise, `true`. + +@example: +const grid = new dhx.Grid("grid_container", { + // other configuration + rangeSelection: true +}); + +grid.range.events.on("beforeResetRange", (range) => { + console.log("Resetting the range:", range); + return false; // cancels resetting of the range +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.resetRange(); // resetting of the range is canceled + +@descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), +[`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md), +[`afterResetRange`](grid/api/rangeselection/rangeselection_afterresetrange_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md b/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md index e69de29bb..28e175bb3 100644 --- a/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md +++ b/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md @@ -0,0 +1,59 @@ +--- +sidebar_label: beforeSetRange +title: JavaScript Grid - beforeSetRange Event +description: You can explore the beforeSetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeSetRange + +@short: fires before setting a new range + +### Usage + +~~~jsx +beforeSetRange: ( + range: { + xStart: string | number; + xEnd: string | number; + yStart: string | number; + yEnd: string | number; + } +) => boolean | void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `range: object` - the range object: + - `xStart?: string | number` - the starting column id + - `xEnd?: string | number` - the ending column id + - `yStart?: string | number` - the starting row id + - `yEnd?: string | number` - the ending row id + +@returns: +Return `false` to prevent setting a range; otherwise, `true`. + +@example: +const grid = new dhx.Grid("grid_container", { + // other configuration + rangeSelection: true +}); + +grid.range.events.on("beforeSetRange", (range) => { + if (range.xStart === "b") { + console.log("Range can't start with the column B"); + return false; // cancels setting a range + } +}); + +grid.range.setRange({ xStart: "b", yStart: "1" }); // setting a new range is canceled + +@descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), +[`afterSetRange`](grid/api/rangeselection/rangeselection_aftersetrange_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_disable_method.md b/docs/grid/api/rangeselection/rangeselection_disable_method.md index e69de29bb..1384aa152 100644 --- a/docs/grid/api/rangeselection/rangeselection_disable_method.md +++ b/docs/grid/api/rangeselection/rangeselection_disable_method.md @@ -0,0 +1,45 @@ +--- +sidebar_label: disable() +title: JavaScript Grid - disable Method +description: You can explore the disable method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# disable() + +@short: disables the Range Selection module and resets the current range + +### Usage + +~~~jsx +disable(): void; +~~~ + +@example: +// this example shows disabling of the module +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.disable(); // disabling the module +console.log(grid.range.getRange()); // -> null +grid.range.setRange({ xStart: "a", yStart: "1" }); // the range won't be set + +@descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`enable()`](grid/api/rangeselection/rangeselection_enable_method.md), [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), +[`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_enable_method.md b/docs/grid/api/rangeselection/rangeselection_enable_method.md index e69de29bb..4f88029d1 100644 --- a/docs/grid/api/rangeselection/rangeselection_enable_method.md +++ b/docs/grid/api/rangeselection/rangeselection_enable_method.md @@ -0,0 +1,43 @@ +--- +sidebar_label: enable() +title: JavaScript Grid - enable Method +description: You can explore the enable method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# enable() + +@short: activates the Range Selection module + +### Usage + +~~~jsx +enable(): void; +~~~ + +@example: +// this example shows enabling the module after deactivation +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: { disabled: true } // disabled on initialization +}); + +grid.range.enable(); // activating the module +grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will be set + +@descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`disable()`](grid/api/rangeselection/rangeselection_disable_method.md), [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), +[`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_getrange_method.md b/docs/grid/api/rangeselection/rangeselection_getrange_method.md index 8041de6b1..eec539507 100644 --- a/docs/grid/api/rangeselection/rangeselection_getrange_method.md +++ b/docs/grid/api/rangeselection/rangeselection_getrange_method.md @@ -30,6 +30,7 @@ getRange(): - `null` if no range is set @example: +// this example shows retrieving of the current range const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -44,9 +45,14 @@ const grid = new dhx.Grid("grid_container", { }); grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "2" }); -console.log(grid.range.getRange()); // { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } +console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } @descr: +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) + + @changelog: added in v9.2 diff --git a/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md b/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md index e69de29bb..6fb0b6e21 100644 --- a/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md +++ b/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md @@ -0,0 +1,46 @@ +--- +sidebar_label: getRangedCells() +title: JavaScript Grid - getRangedCells Method +description: You can explore the getRangedCells method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# getRangedCells() + +@short: returns an array of cells within the current range + +### Usage + +~~~jsx +getRangedCells(): { row: object; column: object; }[]; +~~~ + +@returns: +- an array of objects where: + - `row: object` - the row object + - `column: object` - the column object + +@example: +// this example shows retrieving of the range of selected cells +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "1" }); +console.log(grid.range.getRangedCells()); // -> [{ row: { id: "1", ... }, column: { id: "a", ... }}, ...] + +@descr: +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) + +@changelog: +added in v9.2 diff --git a/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md b/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md index e69de29bb..d8e546e82 100644 --- a/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md +++ b/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md @@ -0,0 +1,47 @@ +--- +sidebar_label: isDisabled() +title: JavaScript Grid - isDisabled Method +description: You can explore the isDisabled method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# isDisabled() + +@short: returns the module's current state + +### Usage + +~~~jsx +isDisabled(): boolean; +~~~ + +@returns: +`true` if the module is disabled, `false` if the module is enabled + +@example: +// this example shows checking the module's activity status +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.disable(); +console.log(grid.range.isDisabled()); // -> true +grid.range.enable(); +console.log(grid.range.isDisabled()); // -> false + +@descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`enable()`](grid/api/rangeselection/rangeselection_enable_method.md), [`disable()`](grid/api/rangeselection/rangeselection_disable_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_isranged_method.md b/docs/grid/api/rangeselection/rangeselection_isranged_method.md index 6762c3ac6..9039ee826 100644 --- a/docs/grid/api/rangeselection/rangeselection_isranged_method.md +++ b/docs/grid/api/rangeselection/rangeselection_isranged_method.md @@ -27,7 +27,7 @@ You can specify just `x` or `y` to check a column or a row, correspondingly. `true`, if the cell is within the current range, `false` otherwise @example: -// this example shows checking whether an ID belongs to the selected cell range +// this example shows checking whether an ID belongs to the selected range of cells const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -42,8 +42,15 @@ const grid = new dhx.Grid("grid_container", { }); grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "2" }); -console.log(grid.range.isRanged({ x: "a", y: "1" })); // true -console.log(grid.range.isRanged({ x: "a" })); // true -console.log(grid.range.isRanged({ y: "3" })); // false +console.log(grid.range.isRanged({ x: "a", y: "1" })); // -> true +console.log(grid.range.isRanged({ x: "a" })); // -> true +console.log(grid.range.isRanged({ y: "3" })); // -> false @descr: + +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) + +@changelog: +added in v9.2 diff --git a/docs/grid/api/rangeselection/rangeselection_resetrange_method.md b/docs/grid/api/rangeselection/rangeselection_resetrange_method.md index 2987ef7e0..7a68257c1 100644 --- a/docs/grid/api/rangeselection/rangeselection_resetrange_method.md +++ b/docs/grid/api/rangeselection/rangeselection_resetrange_method.md @@ -19,6 +19,7 @@ resetRange(): boolean; @example: +// this example shows resetting of the current range const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -38,5 +39,9 @@ console.log(grid.range.getRange()); // -> null @descr: +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) + +**Related API**: [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_setrange_method.md b/docs/grid/api/rangeselection/rangeselection_setrange_method.md index 59df53279..edbb627c3 100644 --- a/docs/grid/api/rangeselection/rangeselection_setrange_method.md +++ b/docs/grid/api/rangeselection/rangeselection_setrange_method.md @@ -24,15 +24,17 @@ setRange( @params: - `range: object` - defines the range to set: - - `xStart?: string | number` - sets the starting column id - - `xEnd?: string | number` - sets the ending column id - - `yStart?: string | number` - sets the starting row id - - `yEnd?: string | number` - sets the ending row id + - `xStart?: string | number` - the starting column id + - `xEnd?: string | number` - the ending column id + - `yStart?: string | number` - the starting row id + - `yEnd?: string | number` - the ending row id - `join?: boolean` - defines whether a new range is merged with the current one: - - when `join: true` is set, the method merges the new range with the current one. In this case only the ending ids are required + - if `join: true` is set, the method merges the new range with the current one. In this case, you can specify just the ending ids of the range, while the starting ids are optional - if the `join: false` setting is specified, the method resets the previous range -If not all coordinates are provided, the missing ones are automatically filled (e.g., the last visible column for xEnd). The starting id for at least one coordinate is required. +:::note +If not all coordinates are provided, the missing ones are automatically filled (e.g., the last visible column for `xEnd`). The starting id for at least one coordinate is required. +::: @returns: `true` - on success, `false` - on error, event cancellation, or if the module is disabled. @@ -41,7 +43,7 @@ If not all coordinates are provided, the missing ones are automatically filled ( ### Example ~~~jsx -// this example shows setting a range with omitted ending coordinates +// this example shows setting of a range with omitted ending coordinates const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -60,7 +62,7 @@ console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", ~~~ ~~~jsx -// this example demonstrates merging a range +// this example demonstrates merging of a range const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -79,9 +81,11 @@ grid.range.setRange({ xEnd: "b", yEnd: "2" }, true); // merges with the current console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } ~~~ +**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) - +**Related API**: [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), +[`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md) @changelog: -added in v9.2 +added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 895171057..17ee89a8e 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2420,7 +2420,7 @@ A range of Grid cells/rows can be selected by clicking the first element to sele ## Range selection -To enable [range selection management](grid/usage_range_selection.md) within a grid, you should use the Range module. To initialize the Range module, use the [rangeSelection](grid/api/grid_rangeselection_config.md) property in the Grid configuration: +To enable [range selection management](grid/usage_range_selection.md) within a grid, you should use the Range module. To initialize the Range module, use the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -2462,6 +2462,8 @@ console.log(grid.range.isDisabled()); // `true` - module is inactive grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set ~~~ +For information on using the Range Selection API, read the [Work with Range Selection object](grid/usage_range_selection.md) guide. + ## Spans The Grid component has the [spans](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. diff --git a/docs/grid/features.md b/docs/grid/features.md index 37716bf63..bc8d5b273 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -283,6 +283,17 @@ In this section you will find the ways of working with selection functionality. | [Selection API](../../category/selection-api/) | Learn how to use the API of Selection to manage the selection of Grid cells | | [Keyboard navigation](../configuration/#arrow-shortcut-keys) | Learn how to enable key navigation that allows moving the selection between cells ([Example](https://snippet.dhtmlx.com/y9kdk0md)) | +## How to work with range selection + +In this section you will get to know how to work with the range selection functionality. + +| Topic | Description | +| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Configuring range selection](../configuration/#range-selection) | Learn how to configure the mode of range selection within Grid | +| [Working with range selection](../usage_range_selection/) | Learn how to enable/disable range selection, set/reset range selection, get the range selection object, and check whether a cell is in the range | +| [Range Selection API](../../category/range-selection-api/) | Learn how to use the API of Range Selection to manage the range selection within Grid | + + ## How to work with TreeGrid mode In this section you will find the ways of working with the TreeGrid mode of Grid. diff --git a/docs/grid/usage_range_selection.md b/docs/grid/usage_range_selection.md index 2846261f1..d96d12e8d 100644 --- a/docs/grid/usage_range_selection.md +++ b/docs/grid/usage_range_selection.md @@ -1,11 +1,276 @@ --- sidebar_label: Work with Range Selection object -title: JavaScript Grid - Work with Range Selection Object -description: You can explore how to work with Range Selection Object of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +title: JavaScript Grid - Work with Range Selection object +description: You can explore how to work with Range Selection object of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # Work with Range Selection object You can manage range selection withing a grid via the API of the [Range selection](grid/configuration.md/#range-selection) object. It provides methods for setting and resetting a range of cells, getting information about the current range, and checking whether specific cells belong to the selected range. It also supports an event system to track changes. -To initialize the Range module, use the [rangeSelection](grid/api/grid_rangeselection_config.md) property in the Grid configuration. Once the Grid is created, the Range module is accessible through the `grid.range` property. \ No newline at end of file +To initialize the Range module, use the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration. Once the Grid is created, the Range module is accessible through the `grid.range` property. + +## Enabling/disabling Range Selection module + +You can activate the range selection module via the [`enable()`](grid/api/rangeselection/rangeselection_enable_method.md) method of the `range` object. + +The following example shows how the module is enabled after deactivation on initialization: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: { disabled: true } // disabled on initialization +}); + +grid.range.enable(); // activating the module +grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will be set +~~~ + +To disable the range selection in Grid, use the [`disable()`](grid/api/rangeselection/rangeselection_disable_method.md) method of the `range` object: + +The example below shows disabling of the `range` module: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.disable(); // disabling the module +console.log(grid.range.getRange()); // -> null +grid.range.setRange({ xStart: "a", yStart: "1" }); // the range won't be set +~~~ + +## Checking Range Selection module state + +You can check whether the Range Selection module is disabled, using the [`isDisabled()`](grid/api/rangeselection/rangeselection_isdisabled_method.md) method of the `range` object. It returns `true`, if the module is disabled and `false`, if it is enabled. + +The following example shows checking of the module's activity status: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.disable(); +console.log(grid.range.isDisabled()); // -> true +grid.range.enable(); +console.log(grid.range.isDisabled()); // -> false +~~~ + +## Setting a range selection + +You can set a range selection using the [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) method of the `range` object. The method takes the following parameters: + + + + + + + + + + + + +
range(object) an object with the range coordinates that contains the following options:
  • `xStart` - (string | number) the starting column id
  • `xEnd` - (string | number) the ending column id
  • `yStart` - (string | number) the starting row id
  • `yEnd` - (string | number) the ending row id
join(boolean) defines whether a new range is merged with the current one: +
  • if `join: true` is set, the method merges the new range with the current one. In this case, you can specify just the ending ids of the range, while the starting ids are optional
  • if the `join: false` setting is specified, the method resets the previous range
+ +If not all coordinates are provided, the missing ones are automatically filled (e.g., the last visible column for `xEnd`). The starting id for at least one coordinate is required. The method returns `true` - on success or `false` - on error, event cancellation, or if the module is disabled. + +The following example shows setting of a range with omitted ending coordinates: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); // sets range from "a1" to the end +console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } +~~~ + +The example below demonstrates merging of a new range with the current one: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.setRange({ xEnd: "b", yEnd: "2" }, true); // merges with the current range +console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } +~~~ + +To make the process of selecting a range more flexible, you can apply the related events of the `range` object: + +- [`afterSetRange`](grid/api/rangeselection/rangeselection_aftersetrange_event.md) +- [`beforeSetRange`](grid/api/rangeselection/rangeselection_beforesetrange_event.md) + +## Resetting the range selection + +You can reset the applied range selection using the [`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md) method of the `range` object. The method returns +`true` - on success, `false`, if the module is disabled, or if reset is canceled by an event. + +The following example shows resetting of the current range: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1" }); +grid.range.resetRange(); +console.log(grid.range.getRange()); // -> null +~~~ + +To make the process of unselecting a range more flexible, you can apply the related events of the `range` object: + +- [`afterResetRange`](grid/api/rangeselection/rangeselection_afterresetrange_event.md) +- [`beforeResetRange`](grid/api/rangeselection/rangeselection_beforeresetrange_event.md) + +## Getting the range selection + +You can get the current selection range. For this, use the [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md) method of the `range` object. It returns the object of selection range or `null` if no range is set. + +The following example shows retrieving of the current range: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "2" }); +console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } +~~~ + +The returned object with the current selection range contains the following properties: + +- `xStart` - (*string | number*) the starting column id +- `xEnd` - (*string | number*) the ending column id +- `yStart` - (*string | number*) the starting row id +- `yEnd` - (*string | number*) the ending row id + +### Getting an array of cells within the range + +It is also possible to get an array of cells within the range selection by using the [`getRangedCells()`](grid/api/rangeselection/rangeselection_getrangedcells_method.md) method of the `range` object. It returns an array of objects where: + +- `row` - (*object*) the row object +- `column` - (*object*) the column object + +This example shows retrieving of the range of selected cells: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "1" }); +console.log(grid.range.getRangedCells()); // -> [{ row: { id: "1", ... }, column: { id: "a", ... }}, ...] +~~~ + +## Checking whether a cell is in the range + +You can check whether a cell is within the current range using the [`isRanged()`](grid/api/rangeselection/rangeselection_isranged_method.md) method of the `range` object. The method takes the following parameter: + +- `cell` - (*object*) - an object with the `x` and `y` coordinates of a cell, where: + - `x` - (*string | number*) - the column id + - `y` - (*string | number*) - the row id + +:::note +You can specify just `x` or `y` to check a column or a row, correspondingly. +::: + +The method returns `true`, if the cell is within the current range and `false` if it isn't. + +The example below shows checking whether an ID belongs to the selected range of cells: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + // other configuration + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true +}); + +grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "2" }); +console.log(grid.range.isRanged({ x: "a", y: "1" })); // -> true +console.log(grid.range.isRanged({ x: "a" })); // -> true +console.log(grid.range.isRanged({ y: "3" })); // -> false +~~~ \ No newline at end of file From fc2f0fd80223467c0457f43f7fdf1d8967ee8c12 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 29 May 2025 17:16:52 +0300 Subject: [PATCH 03/47] [add] guides and api pages for the blockselection module --- docs/grid/api/api_overview.md | 27 ++ .../afterblockhandleapply_event.md | 44 +++ .../afterblockselectionapply_event.md | 45 +++ .../afterblockselectionmove_event.md | 48 +++ .../beforeblockhandleapply_event.md | 50 +++ .../beforeblockselectionapply_event.md | 50 +++ .../beforeblockselectionmove_event.md | 51 +++ .../blockhandlemousedown_event.md | 30 ++ .../blockselection/blockselectionend_event.md | 44 +++ .../blockselectionstart_event.md | 47 +++ .../blockselectionvalidate_event.md | 57 ++++ .../grid/api/blockselection/disable_method.md | 37 +++ docs/grid/api/blockselection/enable_method.md | 37 +++ .../api/blockselection/isdisabled_method.md | 45 +++ docs/grid/api/grid_blockselection_config.md | 141 +++++++++ docs/grid/configuration.md | 104 ++++++ docs/grid/features.md | 10 + docs/grid/usage.md | 6 +- docs/grid/usage_blockselection.md | 297 ++++++++++++++++++ sidebars.js | 51 +++ 20 files changed, 1220 insertions(+), 1 deletion(-) create mode 100644 docs/grid/api/blockselection/afterblockhandleapply_event.md create mode 100644 docs/grid/api/blockselection/afterblockselectionapply_event.md create mode 100644 docs/grid/api/blockselection/afterblockselectionmove_event.md create mode 100644 docs/grid/api/blockselection/beforeblockhandleapply_event.md create mode 100644 docs/grid/api/blockselection/beforeblockselectionapply_event.md create mode 100644 docs/grid/api/blockselection/beforeblockselectionmove_event.md create mode 100644 docs/grid/api/blockselection/blockhandlemousedown_event.md create mode 100644 docs/grid/api/blockselection/blockselectionend_event.md create mode 100644 docs/grid/api/blockselection/blockselectionstart_event.md create mode 100644 docs/grid/api/blockselection/blockselectionvalidate_event.md create mode 100644 docs/grid/api/blockselection/disable_method.md create mode 100644 docs/grid/api/blockselection/enable_method.md create mode 100644 docs/grid/api/blockselection/isdisabled_method.md create mode 100644 docs/grid/api/grid_blockselection_config.md create mode 100644 docs/grid/usage_blockselection.md diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index 583b67d2e..a83988f48 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -176,6 +176,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX | [](grid/api/grid_autoemptyrow_config.md) | @getshort(grid/api/grid_autoemptyrow_config.md) | | [](grid/api/grid_autoheight_config.md) | @getshort(grid/api/grid_autoheight_config.md) | | [](grid/api/grid_autowidth_config.md) | @getshort(grid/api/grid_autowidth_config.md) | +| [](grid/api/grid_blockselection_config.md) | @getshort(grid/api/grid_blockselection_config.md) | | [](grid/api/grid_bottomsplit_config.md) | @getshort(grid/api/grid_bottomsplit_config.md) | | [](grid/api/grid_closable_config.md) | @getshort(grid/api/grid_closable_config.md) | | [](grid/api/grid_collapsed_config.md) | @getshort(grid/api/grid_collapsed_config.md) | @@ -245,6 +246,32 @@ You will find the list of all the available configuration properties of a Grid c | [](grid/api/selection/selection_beforeselect_event.md) | @getshort(grid/api/selection/selection_beforeselect_event.md) | | [](grid/api/selection/selection_beforeunselect_event.md) | @getshort(grid/api/selection/selection_beforeunselect_event.md) | +## BlockSelection API + +### BlockSelection methods + +| Name | Description | +| ----------------------------------------------------- | ------------------------------------------------------------ | +| [](grid/api/blockselection/disable_method.md) | @getshort(grid/api/blockselection/disable_method.md) | +| [](grid/api/blockselection/enable_method.md) | @getshort(grid/api/blockselection/enable_method.md) | +| [](grid/api/blockselection/isdisabled_method.md) | @getshort(grid/api/blockselection/isdisabled_method.md) | + +### BlockSelection events + +| Name | Description | +| ------------------------------------------------------------- | --------------------------------------------------------------------- | +| [](grid/api/blockselection/afterblockhandleapply_event.md) | @getshort(grid/api/blockselection/afterblockhandleapply_event.md) | +| [](grid/api/blockselection/afterblockselectionapply_event.md) | @getshort(grid/api/blockselection/afterblockselectionapply_event.md) | +| [](grid/api/blockselection/afterblockselectionmove_event.md) | @getshort(grid/api/blockselection/afterblockselectionmove_event.md) | +| [](grid/api/blockselection/beforeblockhandleapply_event.md) | @getshort(grid/api/blockselection/beforeblockhandleapply_event.md) | +| [](grid/api/blockselection/beforeblockselectionapply_event.md)| @getshort(grid/api/blockselection/beforeblockselectionapply_event.md) | +| [](grid/api/blockselection/beforeblockselectionmove_event.md) | @getshort(grid/api/blockselection/beforeblockselectionmove_event.md) | +| [](grid/api/blockselection/blockhandlemousedown_event.md) | @getshort(grid/api/blockselection/blockhandlemousedown_event.md) | +| [](grid/api/blockselection/blockselectionend_event.md) | @getshort(grid/api/blockselection/blockselectionend_event.md) | +| [](grid/api/blockselection/blockselectionstart_event.md) | @getshort(grid/api/blockselection/blockselectionstart_event.md) | +| [](grid/api/blockselection/blockselectionvalidate_event.md) | @getshort(grid/api/blockselection/blockselectionvalidate_event.md) | + + ## Export methods | Name | Description | diff --git a/docs/grid/api/blockselection/afterblockhandleapply_event.md b/docs/grid/api/blockselection/afterblockhandleapply_event.md new file mode 100644 index 000000000..96af4e99f --- /dev/null +++ b/docs/grid/api/blockselection/afterblockhandleapply_event.md @@ -0,0 +1,44 @@ +--- +sidebar_label: afterBlockHandleApply +title: JavaScript Grid - afterBlockHandleApply Event +description: You can explore the afterBlockHandleApply event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterBlockHandleApply + +@short: triggered after applying the handle action + +### Usage + +~~~jsx +afterBlockHandleApply: ( + startCell: { row: object; column: object }, + endCell: { row: object; column: object }, + dragDirection: "up" | "down" | "left" | "right" | null, + event: MouseEvent | TouchEvent +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `endCell` - an object that contains the end cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `dragDirection` - determines the direction of movement of the focused cell +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@example: +grid.block.events.on("afterBlockHandleApply", (startCell, endCell, dir) => { + console.log("Handle applied:"); +}); + +@descr: + +**Related API**: [`beforeBlockHandleApply`](grid/api/blockselection/beforeblockhandleapply_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/afterblockselectionapply_event.md b/docs/grid/api/blockselection/afterblockselectionapply_event.md new file mode 100644 index 000000000..6ffb16ff4 --- /dev/null +++ b/docs/grid/api/blockselection/afterblockselectionapply_event.md @@ -0,0 +1,45 @@ +--- +sidebar_label: afterBlockSelectionApply +title: JavaScript Grid - afterBlockSelectionApply Event +description: You can explore the afterBlockSelectionApply event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterBlockSelectionApply + +@short: triggered after applying the selection + +### Usage + +~~~jsx +afterBlockSelectionApply: ( + startCell: { row: object; column: object }, + endCell: { row: object; column: object }, + handle: boolean, + event: MouseEvent | TouchEvent +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `endCell` - an object that contains the end cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `handle` - indicates whether the handle was used (`true`) or a regular selection (`false`) +- `event` - the browser event: `MouseEvent` or `TouchEvent` + + +@example: +grid.block.events.on("afterBlockSelectionApply", (startCell, endCell) => { + console.log("Selection applied:", startCell.column.id, endCell.column.id); +}); + +@descr: + +**Related API**: [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/afterblockselectionmove_event.md b/docs/grid/api/blockselection/afterblockselectionmove_event.md new file mode 100644 index 000000000..dc9c61a44 --- /dev/null +++ b/docs/grid/api/blockselection/afterblockselectionmove_event.md @@ -0,0 +1,48 @@ +--- +sidebar_label: afterBlockSelectionMove +title: JavaScript Grid - afterBlockSelectionMove Event +description: You can explore the afterBlockSelectionMove event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterBlockSelectionMove + +@short: triggered after moving the selection boundary + +### Usage + +~~~jsx +afterBlockSelectionMove: ( + startCell: { row: object; column: object }, + endCell: { row: object; column: object }, + focusCell: { row: object; column: object } | null, + dragDirection: "up" | "down" | "left" | "right" | null, + event: MouseEvent | TouchEvent +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `endCell` - an object that contains the current end cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `focusCell` - an object that contains the focus cell (if the handle is used) or `null`, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `dragDirection` - determines the direction of movement of the focused cell +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@example: +grid.block.events.on("afterBlockSelectionMove", (startCell, endCell) => { + console.log("Selection updated to:", endCell.column.id, endCell.row.id); +}); + +@descr: + +**Related API**: [`beforeBlockSelectionMove`](grid/api/blockselection/beforeblockselectionmove_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/beforeblockhandleapply_event.md b/docs/grid/api/blockselection/beforeblockhandleapply_event.md new file mode 100644 index 000000000..8e865f980 --- /dev/null +++ b/docs/grid/api/blockselection/beforeblockhandleapply_event.md @@ -0,0 +1,50 @@ +--- +sidebar_label: beforeBlockHandleApply +title: JavaScript Grid - beforeBlockHandleApply Event +description: You can explore the beforeBlockHandleApply event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeBlockHandleApply + +@short: triggered before applying the handle action + +### Usage + +~~~jsx +beforeBlockHandleApply: ( + startCell: { row: object; column: object }, + endCell: { row: object; column: object }, + dragDirection: "up" | "down" | "left" | "right" | null, + event: MouseEvent | TouchEvent +) => boolean | void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `endCell` - an object that contains the end cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `dragDirection` - determines the direction of movement of the focused cell +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@returns: +Return `false` to cancel the action; otherwise, `true`. + +@example: +grid.block.events.on("beforeBlockHandleApply", (startCell, endCell, dir) => { + if (dir === "right" | dir === "left") { + console.log("Horizontal change canceled"); + return false; + } +}); + +@descr: + +**Related API**: [`afterBlockHandleApply`](grid/api/blockselection/afterblockhandleapply_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/beforeblockselectionapply_event.md b/docs/grid/api/blockselection/beforeblockselectionapply_event.md new file mode 100644 index 000000000..693b66b01 --- /dev/null +++ b/docs/grid/api/blockselection/beforeblockselectionapply_event.md @@ -0,0 +1,50 @@ +--- +sidebar_label: beforeBlockSelectionApply +title: JavaScript Grid - beforeBlockSelectionApply Event +description: You can explore the beforeBlockSelectionApply event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeBlockSelectionApply + +@short: triggered before applying the selection (e.g., to a range) + +### Usage + +~~~jsx +beforeBlockSelectionApply: ( + startCell: { row: object; column: object }, + endCell: { row: object; column: object }, + handle: boolean, + event: MouseEvent | TouchEvent +) => boolean | void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `endCell` - an object that contains the end cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `handle` - indicates whether the handle was used (`true`) or a regular selection (`false`) +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@returns: +Return `false` to cancel the action; otherwise, `true`. + +@example: +grid.block.events.on("beforeBlockSelectionApply", (startCell, endCell) => { + if (endCell.row.id === "2") { + console.log("Application canceled if the range ends with row 2"); + return false; + } +}); + +@descr: + +**Related API**: [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/beforeblockselectionmove_event.md b/docs/grid/api/blockselection/beforeblockselectionmove_event.md new file mode 100644 index 000000000..12ac60234 --- /dev/null +++ b/docs/grid/api/blockselection/beforeblockselectionmove_event.md @@ -0,0 +1,51 @@ +--- +sidebar_label: beforeBlockSelectionMove +title: JavaScript Grid - beforeBlockSelectionMove Event +description: You can explore the beforeBlockSelectionMove event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeBlockSelectionMove + +@short: triggered before moving the selection boundary + +### Usage + +~~~jsx +beforeBlockSelectionMove: ( + startCell: { row: object; column: object }, + nextCell: { row: object; column: object }, + focusCell: { row: object; column: object } | null, + dragDirection: "up" | "down" | "left" | "right" | null, + event: MouseEvent | TouchEvent +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `nextCell` - an object that contains the next cell to which the boundary is moving or the end cell of the previously selected boundary during the handle movement, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `focusCell` - an object that contains the last focus cell (if the handle is used) or `null`. The cell object includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `dragDirection` - determines the direction of movement of the focused cell +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@returns: +Return `false` to cancel the action; otherwise, `true`. + +@example: +grid.block.events.on("beforeBlockSelectionMove", (startCell, nextCell) => { + console.log("Moving to:", nextCell.column.id, nextCell.row.id); +}); + +@descr: + +**Related API**: [`afterBlockSelectionMove`](grid/api/blockselection/afterblockselectionmove_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/blockhandlemousedown_event.md b/docs/grid/api/blockselection/blockhandlemousedown_event.md new file mode 100644 index 000000000..2981c6bf5 --- /dev/null +++ b/docs/grid/api/blockselection/blockhandlemousedown_event.md @@ -0,0 +1,30 @@ +--- +sidebar_label: blockHandleMouseDown +title: JavaScript Grid - blockHandleMouseDown Event +description: You can explore the blockHandleMouseDown event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# blockHandleMouseDown + +@short: triggered when clicking on the selection handle + +### Usage + +~~~jsx +blockHandleMouseDown: (event: MouseEvent | TouchEvent) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@example: +grid.block.events.on("blockHandleMouseDown", (event) => { + console.log("Handle clicked:", event.type); +}); + +@descr: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/blockselectionend_event.md b/docs/grid/api/blockselection/blockselectionend_event.md new file mode 100644 index 000000000..9cfe19238 --- /dev/null +++ b/docs/grid/api/blockselection/blockselectionend_event.md @@ -0,0 +1,44 @@ +--- +sidebar_label: blockSelectionEnd +title: JavaScript Grid - blockSelectionEnd Event +description: You can explore the blockSelectionEnd event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# blockSelectionEnd + +@short: triggered when the selection has been completed + +### Usage + +~~~jsx +blockSelectionEnd: ( + startCell: { row: object; column: object }, + endCell: { row: object; column: object }, + handle: boolean, + event: MouseEvent | TouchEvent +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `endCell` - an object that contains the end cell at the time of selection completion, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `handle` - indicates whether the handle was used (`true`) or a regular selection (`false`) +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@example: +grid.block.events.on("blockSelectionEnd", (startCell, endCell) => { + console.log("Selection completed:", startCell.column.id, endCell.column.id); +}); + +@descr: + +**Related API**: [`blockSelectionStart`](grid/api/blockselection/blockselectionstart_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/blockselectionstart_event.md b/docs/grid/api/blockselection/blockselectionstart_event.md new file mode 100644 index 000000000..e974e4d1e --- /dev/null +++ b/docs/grid/api/blockselection/blockselectionstart_event.md @@ -0,0 +1,47 @@ +--- +sidebar_label: blockSelectionStart +title: JavaScript Grid - blockSelectionStart Event +description: You can explore the blockSelectionStart event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# blockSelectionStart + +@short: triggered when selection has been started + +### Usage + +~~~jsx +blockSelectionStart: ( + startCell: { row: object; column: object }, + endCell: { row: object; column: object }, + handle: boolean, + event: MouseEvent | TouchEvent +) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `startCell` - an object that contains the initial cell of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `endCell` - an object that contains the end cell at the start of the selection, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `handle` - indicates whether the handle is used (`true`) or a regular selection (`false`) +- `event` - a browser event: `MouseEvent` or `TouchEvent` + +@returns: +Return `false` to cancel the action; otherwise, `true`. + +@example: +grid.block.events.on("blockSelectionStart", (startCell, endCell, handle) => { + console.log("Selection started:", startCell.column.id, startCell.row.id); +}); + +@descr: + +**Related API**: [`blockSelectionEnd`](grid/api/blockselection/blockselectionend_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/blockselectionvalidate_event.md b/docs/grid/api/blockselection/blockselectionvalidate_event.md new file mode 100644 index 000000000..98dc247a1 --- /dev/null +++ b/docs/grid/api/blockselection/blockselectionvalidate_event.md @@ -0,0 +1,57 @@ +--- +sidebar_label: blockSelectionValidate +title: JavaScript Grid - blockSelectionValidate Event +description: You can explore the blockSelectionValidate event of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# blockSelectionValidate + +@short: triggered to check the possibility of starting a selection + +### Usage + +~~~jsx +blockSelectionValidate: ( + validateCell: { row: object; column: object }, + handle: boolean, + event: MouseEvent | TouchEvent +) => boolean | void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `validateCell` - an object that contains the cell where the selection starts, includes the following properties: + - `row` - the row configuration object + - `column`- the column configuration object +- `handle` - indicates whether the handle is used (`true`) or a regular selection (`false`) +- `event` - the browser event: `MouseEvent` or `TouchEvent` + +@returns: +Return `false` to cancel the action; otherwise, `true`. + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true +}); + +grid.block.events.on("blockSelectionValidate", (cell, handle, event) => { + if (cell.column.id === "b") { + console.log("Selection cannot start from column B"); + return false; + } +}); + +@descr: + + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/disable_method.md b/docs/grid/api/blockselection/disable_method.md new file mode 100644 index 000000000..f886e95cb --- /dev/null +++ b/docs/grid/api/blockselection/disable_method.md @@ -0,0 +1,37 @@ +--- +sidebar_label: disable() +title: JavaScript Grid - disable Method +description: You can explore the disable method of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# disable() + +@short: disables the BlockSelection module and resets processing of block selection + +@signature: {'disable(): void;'} + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true +}); + +// disabling the block selection module +grid.block.disable(); +console.log(grid.block.isDisabled()); // -> true + +@descr: + +**Related article**: [Work with BlockSelection module](grid/usage_blockselection.md) + +**Related API**: [`enable()`](grid/api/blockselection/enable_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/enable_method.md b/docs/grid/api/blockselection/enable_method.md new file mode 100644 index 000000000..0ff4fea44 --- /dev/null +++ b/docs/grid/api/blockselection/enable_method.md @@ -0,0 +1,37 @@ +--- +sidebar_label: enable() +title: JavaScript Grid - enable Method +description: You can explore the enable method of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# enable() + +@short: enables the BlockSelection module and activates the capabilities of block selection in Grid + +@signature: {'enable(): void;'} + +@example: +// this example shows enabling the module after deactivation +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { disabled: true } // disabled on initialization +}); + +grid.block.enable(); // activating the module +console.log(grid.block.isDisabled()); // -> false + +@descr: + +**Related article**: [Work with BlockSelection module](grid/usage_blockselection.md) + +**Related API**: [`disable()`](grid/api/blockselection/disable_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/blockselection/isdisabled_method.md b/docs/grid/api/blockselection/isdisabled_method.md new file mode 100644 index 000000000..9cd43df85 --- /dev/null +++ b/docs/grid/api/blockselection/isdisabled_method.md @@ -0,0 +1,45 @@ +--- +sidebar_label: isDisabled() +title: JavaScript Grid - isDisabled Method +description: You can explore the isDisabled method of Grid block selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# isDisabled() + +@short: returns the module's current state + +### Usage + +~~~jsx +isDisabled(): boolean; +~~~ + +@returns: +`true` if the module is disabled, `false` if the module is enabled + +@example: +// this example shows checking the module's activity status +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true +}); + +console.log(grid.block.isDisabled()); // -> false +grid.block.disable(); +console.log(grid.block.isDisabled()); // -> true + +@descr: + +**Related article**: [Work with BlockSelection module](grid/usage_blockselection.md) + +**Related API**: [`disable()`](grid/api/blockselection/disable_method.md), [`enable()`](grid/api/blockselection/enable_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md new file mode 100644 index 000000000..5f9881a6c --- /dev/null +++ b/docs/grid/api/grid_blockselection_config.md @@ -0,0 +1,141 @@ +--- +sidebar_label: blockSelection +title: JavaScript Grid - blockSelection Config +description: You can explore the blockSelection config of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# blockSelection + +@short: Optional. Enables/disables block selection management within a grid + +### Usage + +~~~jsx +blockSelection?: + | boolean + | { + disabled?: boolean; + mode?: "range" | "manual"; + handle?: boolean | { + allowAxis?: "x" | "y" | "xy"; + handler?: + | boolean + | ((args: { + cell: { row: object; column: object }; + array: { row: object; column: object }[]; + range: { row: object; column: object }[]; + dir: "up" | "down" | "right" | "left"; + index: number; + grid: IProGrid; + }) => void); + }; + area?: boolean; + }; +~~~ + +@default: false + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true // enables the BlockSelection module +}); + +@descr: +### Parameters + +The `blockSelection` property can be set in two ways: + +- as a *boolean* value it enables or disables the block selection module upon the component initialization +- as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: + - `disabled` - disables the module on startup (`false` by default) + - `mode` - the operating mode of the module: + - "range" - managed through the Range module [link] + - "manual" - managed through the manual control + - `handle` - enables the handle for resizing. Can be set as a *boolean* value or as an *object* (`true` by default). As an *object* can contain the following properties: + - `allowAxis` - restricts the handle movement: "x" (horizontal), "y" (vertical), "xy" (both directions). `"xy"` by default + - `handler` - a *function* to process the handle actions or *boolean* to enable/disable. As a function, the property takes the following parameters: + - `cell` - the object of the current cell. Contains the following properties: + - `row` - the object of a row + - `column` - the object of a column + - `array` - an array of all selected cells. Each cell object contains the following properties: + - `row` - the object of a row + - `column` - the object of a column + - `range` - an array of pre-selected? cells. Each cell object contains the following properties: + - `row` - the object of a row + - `column` - the object of a column + - `dir` - the direction of cells selection: "up" | "down" | "right" | "left" + - `index` - the index of the iterated cell + - `grid` - the `dhx.Grid` component object + - `area` - enables the display of the selection area (`true` by default) + + +:::note +By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the **Range** module is initialized. +::: + + +~~~jsx +// this example demonstrates configuring the module with the handle disabled and the "range" mode enabled +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { + mode: "range", + handle: false, + } +}); +~~~ + +~~~jsx +// this example demonstrates configuring the handle and its behavior +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { + mode: "range", + handle: { + allowAxis: "x", // the handle movement is restricted by the "x" axis + handler: ({ array, range, grid, cell, index }) => { + if (array.length <= 1) { + return; + } + const firstCell = range[0]; + // the copied cells will have the "-copied" suffix + const value = firstCell.row[firstCell.column.id] + (index ? "-copied" : ""); + grid.data.update( + cell.row.id, + { [cell.column.id]: value }, + index < array.length - 1 // the silent mode for all the cells except for the last cell + ); + } + } + } +}); +~~~ + +**Related sample:** [Grid. BlockSelection with handle configuration](https://snippet.dhtmlx.com/8gx20g1d) + +**Related article:** [Managing block selection in Grid](grid/configuration.md/#managing-block-selection-in-grid) + +@changelog: added in v9.2 + diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index b3cb274c2..7b93b1c95 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2418,6 +2418,110 @@ const grid = new dhx.Grid("grid_container", { Since the `multiselection` configuration option is set to *true*, using the "Ctrl + Click" combination allows selecting the desired cells or rows. A range of Grid cells/rows can be selected by clicking the first element to select and then, while holding down the Shift key, clicking the last element to select. +### Managing block selection in Grid + +You can manage selection of cells' ranges via the mouse pointer, touch input, and keyboard navigation. To enable [block selection management](grid/usage_blockselection_module.md) within a grid, you should use the `BlockSelection` module. To initialize the module, use the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true // enables the BlockSelection module +}); +~~~ + +The `blockSelection` property can be set in two ways: + +- as a *boolean* value it enables or disables the block selection module upon the component initialization +- as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: + - `disabled` - disables the module on startup (`false` by default) + - `mode` - the operating mode of the module: + - "range" - managed through the Range module [link] + - "manual" - managed through the manual control + - `handle` - enables the handle for resizing. Can be set as a *boolean* value or as an *object* (`true` by default). As an *object* can contain the following properties: + - `allowAxis` - restricts the handle movement: "x" (horizontal), "y" (vertical), "xy" (both directions). `"xy"` by default + - `handler` - a *function* to process the handle actions or *boolean* to enable/disable. As a function, the property takes the following parameters: + - `cell` - the object of the current cell. Contains the following properties: + - `row` - the object of a row + - `column` - the object of a column + - `array` - an array of all selected cells. Each cell object contains the following properties: + - `row` - the object of a row + - `column` - the object of a column + - `range` - an array of pre-selected cells. Each cell object contains the following properties: + - `row` - the object of a row + - `column` - the object of a column + - `dir` - the direction of cells selection: "up" | "down" | "right" | "left" + - `index` - the index of the iterated cell + - `grid` - the `dhx.Grid` component object + - `area` - enables the display of the selection area (`true` by default) + +:::note +By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the **Range** module is initialized. +::: + +The example below demonstrates configuring the module with the handle disabled and the "range" mode enabled: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { + mode: "range", + handle: false + } +}); +~~~ + +The following example demonstrates configuring the handle and its behavior: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { + mode: "range", + handle: { + allowAxis: "x", // the handle movement is restricted by the "x" axis + handler: ({ array, range, grid, cell, index }) => { + if (array.length <= 1) { + return; + } + const firstCell = range[0]; + // the copied cells will have the "-copied" suffix + const value = firstCell.row[firstCell.column.id] + (index ? "-copied" : ""); + grid.data.update( + cell.row.id, + { [cell.column.id]: value }, + index < array.length - 1 // the silent mode for all the cells except for the last cell + ); + } + } + } +}); +~~~ + +**Related sample**: [Grid. BlockSelection with handle configuration](https://snippet.dhtmlx.com/8gx20g1d) + +For information on using the Block Selection API, read the [Work with Block Selection object](grid/usage_blockselection.md) guide. + ## Spans The Grid component has the [spans](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. diff --git a/docs/grid/features.md b/docs/grid/features.md index 37716bf63..b864b6de4 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -283,6 +283,16 @@ In this section you will find the ways of working with selection functionality. | [Selection API](../../category/selection-api/) | Learn how to use the API of Selection to manage the selection of Grid cells | | [Keyboard navigation](../configuration/#arrow-shortcut-keys) | Learn how to enable key navigation that allows moving the selection between cells ([Example](https://snippet.dhtmlx.com/y9kdk0md)) | +### How to work with block selection + +In this section you will get to know how to work with the block selection functionality. + +| Topic | Description | +| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Configuring block selection](../configuration/#managing-block-selection-in-grid) | Learn how to configure the block selection module within Grid ([Example](https://snippet.dhtmlx.com/8gx20g1d)) | +| [Working with block selection](../usage_blockselection/) | Learn how to enable/disable block selection in Grid, check the main features of the BlockSelection module and explore it interacts with other modules | +| [BlockSelection API](../../category/blockselection-api/) | Learn how to use API of the BlockSelection module to manage the block selection within Grid | + ## How to work with TreeGrid mode In this section you will find the ways of working with the TreeGrid mode of Grid. diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 8cf3b5f28..ffd06a49e 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -1198,7 +1198,11 @@ grid.destructor(); ## Using Selection API -For information on using Selection API, read [Work with Selection Object](grid/usage_selection.md). +For information on using Selection API, read [Work with Selection object](grid/usage_selection.md). + +## Using BlockSelection API + +For information on using BlockSelection API, read [Work with BlockSelection module](grid/usage_blockselection.md). ## Working with Grid in the TreeGrid mode diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md new file mode 100644 index 000000000..f9fc11853 --- /dev/null +++ b/docs/grid/usage_blockselection.md @@ -0,0 +1,297 @@ +--- +sidebar_label: Work with BlockSelection module +title: JavaScript Grid - Work with BlockSelection module +description: You can explore how to work with BlockSelection module of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# Work with BlockSelection module + +You can manage block selection within a grid via the API of the [`BlockSelection`](grid/configuration.md/#managing-block-selection-in-grid) module. It allows selecting ranges of cells using the mouse pointer, touch input, or keyboard navigation, visualizing the selection, and controlling behavior through various modes and handlers. It also supports an [event system](grid/api/api_overview.md/#blockselection-events) to track user actions, including keyboard and mouse combinations. + +To initialize the `BlockSelection` module, use the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration. Once the Grid is created, the module is accessible through the `grid.block` property. + +## Enabling/disabling BlockSelection module + +You can activate the block selection module via the [`enable()`](grid/api/blockselection/enable_method.md) method of the `block` object. + +The following example shows how the module is enabled after deactivation on initialization: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { disabled: true } // disabled on initialization +}); + +grid.block.enable(); // activating the module +console.log(grid.block.isDisabled()); // -> false +~~~ + +To disable the block selection in Grid, use the [`disable()`](grid/api/blockselection/disable_method.md) method of the `block` object. + +The example below shows disabling of the `BlockSelection` module: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true +}); + +grid.block.disable(); +console.log(grid.block.isDisabled()); // true +~~~ + +## Checking BlockSelection module state + +You can check whether the `BlockSelection` module is disabled, using the [`isDisabled()`](grid/api/blockselection/isdisabled_method.md) method of the `block` object. It returns `true`, if the module is disabled and `false`, if it is enabled. + +The following example shows checking of the module's activity status: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true +}); + +console.log(grid.block.isDisabled()); // false +grid.block.disable(); +console.log(grid.block.isDisabled()); // true +~~~ + +## User-interface features + +### Cell selection + +- The user selects a range by dragging the mouse from the initial cell to the end cell. For example, dragging from **A1** to **B3** creates the range **A1:B3**, which is highlighted. +- The `Shift + click` combination allows extending the range from the current initial cell to the clicked cell. +- The cell selection behavior depends on the applied mode: + - the *"range"* mode uses the **Range API** + - the *manual* mode requires specifying a custom logic via the [events](grid/api/api_overview.md/#blockselection-events) + +### Keyboard navigation + +- The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: + - **Arrows** (`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`): moves the focus to the adjacent cell, setting the initial selection cell if no selection is active. + - **Shift + Arrows**: extends the selected range from the current initial cell in the direction of the pressed arrow. + - **Ctrl + Arrows**: extends the selected range to the last cell in the direction of the pressed arrow. +- Keyboard and mouse combinations: + - **Shift + click**: sets the end cell of the range, extending the selection from the current initial cell. +- Keyboard navigation works in both the "range" and manual modes. In the manual mode, applying the selection (e.g., after Enter) requires handling via the events, such as [beforeBlockSelectionApply](grid/api/blockselection/beforeblockselectionapply_event.md) and [afterBlockSelectionApply](grid/api/blockselection/afterblockselectionapply_event.md). + +### Selection handle + +- If enabled (via [`blockSelection.handle`](grid/api/grid_blockselection_config.md/#parameters)), the handle appears in the bottom-right corner of the range. +- The default behavior (when the `handler` property isn't specified in the `handle` object) is the following: + - In the *`range`* mode: + - copies the value of the first cell of the selected range (or the entire range if selected) to new cells. For example, selecting **A1** (the value is "x") and dragging to **A3** fills **A2**, **A3** with "x". + - if the range **A1:B1** (the values are "x" and "y", correspondingly) is selected, dragging to **D1** copies "x" to **C1** and "y" to **D1**. +- A custom handler can be specified to modify the behavior (e.g., adding suffixes or other rules). +- In the *manual* mode, the handle and `handler` are ignored, and the built-in filling does not work. + +## Interaction with other modules + +The `BlockSelection` API interacts with other grid modules depending on the applied mode. + +#### Range mode + +- The `BlockSelection` module uses the `Range` API to manage continuous rectangular ranges. +- The handle automatically fills data in the new range. +- The selected range will be reset during data grouping or ungrouping. +- The range will be reinstalled to a new one when moving columns or rows. + +#### Manual mode + +- The `BlockSelection` module does not use the `Range` API. The developer implements logic via the events such as [`blockSelectionValidate`](grid/api/blockselection/blockselectionvalidate_event.md), [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). +- The handle and built-in filling are unavailable. + +### Usage examples + +#### Restricting selection in the Range mode + +This example shows how to control the start of a block selection and programmatically set a range using the `Range` API. + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }], minWidth: 150 }, + { id: "b", header: [{ text: "B" }], minWidth: 150 }, + { id: "c", header: [{ text: "C" }], minWidth: 150 }, + { id: "d", header: [{ text: "D" }], minWidth: 150 }, + { id: "e", header: [{ text: "E" }], minWidth: 150 }, + { id: "f", header: [{ text: "F" }], minWidth: 150 }, + ], + data, + autoWidth: true, + blockSelection: { + mode: "range", // setting the "range" mode + handle: { allowAxis: "xy" }, + }, +}); + +// controlling the block selection start via the event +grid.block.events.on("blockSelectionValidate", (cell, handle, event) => { + if (cell.column.id === "a") { + console.log("Selection cannot start from column A"); + return false; + } +}); + +// setting a range via the setRange() method of the Range API +grid.range.setRange({ xStart: "b", xEnd: "d", yStart: "4", yEnd: "8" }); +~~~ + +**Related sample:** [Grid. BlockSelection in the "range" mode](https://snippet.dhtmlx.com/85pb04cg) + +#### Setting custom logic in the manual mode + +This example demonstrates the manual mode, providing full control and allowing the use of events for custom logic, such as styling. + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }], minWidth: 150 }, + { id: "b", header: [{ text: "B" }], minWidth: 150 }, + { id: "c", header: [{ text: "C" }], minWidth: 150 }, + { id: "d", header: [{ text: "D" }], minWidth: 150 }, + { id: "e", header: [{ text: "E" }], minWidth: 150 }, + { id: "f", header: [{ text: "F" }], minWidth: 150 }, + ], + data, + autoWidth: true, + blockSelection: { + mode: "manual", // setting the manual mode + handle: false + }, + rangeSelection: true, +}); + +// using an event for applying custom styling to a range of cells +grid.block.events.on("afterBlockSelectionApply", (startCell, endCell) => { + if ( + startCell.column.id === endCell.column.id && + startCell.row.id === endCell.row.id + ) { + return; + } + if (grid.range.getRange) { + grid.range.getRangedCells().forEach(cell => { + grid.removeCellCss(cell.row.id, cell.column.id, "custom-selected-cell"); + }); + } + + grid.range.setRange({ + xStart: startCell.column.id, + xEnd: endCell.column.id, + yStart: startCell.row.id, + yEnd: endCell.row.id, + }); + + grid.range.getRangedCells().forEach(cell => { + grid.addCellCss(cell.row.id, cell.column.id, "custom-selected-cell"); + }); +}); +~~~ + +**Related sample:** [Grid. BlockSelection in the "manual" mode](https://snippet.dhtmlx.com/jgjllbc7) + +#### Setting a custom handler for the handle + +This example shows how to override the handle behavior by adding a custom logic, such as modifying values based on the drag direction. + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }], minWidth: 150 }, + { id: "b", header: [{ text: "B" }], minWidth: 150 }, + { id: "c", header: [{ text: "C" }], minWidth: 150 }, + { id: "d", header: [{ text: "D" }], minWidth: 150 }, + { id: "e", header: [{ text: "E" }], minWidth: 150 }, + { id: "f", header: [{ text: "F" }], minWidth: 150 }, + ], + data, + autoWidth: true, + blockSelection: { + mode: "range", + handle: { + handler: ({ array, startCell, grid, cell, index }) => { + if (array.length <= 1) { + return; + } + const cellValue = startCell.row[startCell.column.id]?.replace("-copied", ""); + // copied cells will have the "-copied" suffix + const value = cellValue + (index ? "-copied" : ""); + // setting the silent mode for all cells except for the last cell + const silent = index < array.length - 1 + // updating the selected items + grid.data.update(cell.row.id, { + [cell.column.id]: value + }, silent); + } + } + }, +}); +~~~ + +**Related sample:** [Grid. BlockSelection with handle configuration](https://snippet.dhtmlx.com/8gx20g1d) + +#### Selection styling + +This example demonstrates how to customize the appearance of the selected range and of the handle. + +~~~html + + + +~~~ + +**Related sample:** [Grid. BlockSelection area styling](https://snippet.dhtmlx.com/ptc0jfww) \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 08066c691..f913e505d 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2615,6 +2615,7 @@ module.exports = { "grid/api/grid_autoemptyrow_config", "grid/api/grid_autoheight_config", "grid/api/grid_autowidth_config", + "grid/api/grid_blockselection_config", "grid/api/grid_bottomsplit_config", "grid/api/grid_closable_config", "grid/api/grid_collapsed_config", @@ -2763,6 +2764,55 @@ module.exports = { }, ], }, + { + type: "category", + label: "BlockSelection API", + link: { + type: 'generated-index', + title: "BlockSelection API", + keywords: ['block selection API'], + image: '/img/docusaurus.png' + }, + items: [{ + type: "category", + label: "Grid BlockSelection methods", + link: { + type: 'generated-index', + title: "Grid BlockSelection methods", + keywords: ['grid block selection methods'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/blockselection/disable_method", + "grid/api/blockselection/enable_method", + "grid/api/blockselection/isdisabled_method" + ], + }, + + { + type: "category", + label: "Grid BlockSelection events", + link: { + type: 'generated-index', + title: "Grid BlockSelection events", + keywords: ['grid block selection events'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/blockselection/afterblockhandleapply_event", + "grid/api/blockselection/afterblockselectionapply_event", + "grid/api/blockselection/afterblockselectionmove_event", + "grid/api/blockselection/beforeblockhandleapply_event", + "grid/api/blockselection/beforeblockselectionapply_event", + "grid/api/blockselection/beforeblockselectionmove_event", + "grid/api/blockselection/blockhandlemousedown_event", + "grid/api/blockselection/blockselectionend_event", + "grid/api/blockselection/blockselectionstart_event", + "grid/api/blockselection/blockselectionvalidate_event" + ], + } + ], + }, { type: "category", label: "Export methods", @@ -2790,6 +2840,7 @@ module.exports = { "grid/usage", "grid/treegrid_mode", "grid/usage_selection", + "grid/usage_blockselection", "grid/customization", "grid/events", ], From edb762a433e5636a99594b66bd73554972470789 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 30 May 2025 12:07:03 +0300 Subject: [PATCH 04/47] [update] description of the blockselection config properties --- docs/grid/api/grid_blockselection_config.md | 40 ++++++++++---------- docs/grid/configuration.md | 41 +++++++++++---------- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md index 5f9881a6c..5d7900126 100644 --- a/docs/grid/api/grid_blockselection_config.md +++ b/docs/grid/api/grid_blockselection_config.md @@ -55,27 +55,27 @@ The `blockSelection` property can be set in two ways: - as a *boolean* value it enables or disables the block selection module upon the component initialization - as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: - - `disabled` - disables the module on startup (`false` by default) - - `mode` - the operating mode of the module: - - "range" - managed through the Range module [link] - - "manual" - managed through the manual control - - `handle` - enables the handle for resizing. Can be set as a *boolean* value or as an *object* (`true` by default). As an *object* can contain the following properties: - - `allowAxis` - restricts the handle movement: "x" (horizontal), "y" (vertical), "xy" (both directions). `"xy"` by default - - `handler` - a *function* to process the handle actions or *boolean* to enable/disable. As a function, the property takes the following parameters: - - `cell` - the object of the current cell. Contains the following properties: - - `row` - the object of a row - - `column` - the object of a column - - `array` - an array of all selected cells. Each cell object contains the following properties: - - `row` - the object of a row - - `column` - the object of a column - - `range` - an array of pre-selected? cells. Each cell object contains the following properties: - - `row` - the object of a row - - `column` - the object of a column - - `dir` - the direction of cells selection: "up" | "down" | "right" | "left" - - `index` - the index of the iterated cell - - `grid` - the `dhx.Grid` component object - - `area` - enables the display of the selection area (`true` by default) + + + + + + + + + + + + + + + + + + + +
disableddisables the module on startup, `false` by default
modethe operating mode of the module:
  • "range" - managed through the Range module
  • "manual" - managed through the manual control
handleenables the handle for resizing. Can be set as a *boolean* value or as an *object*, `true` by default.
As an *object* can contain the following properties:
  • allowAxis - restricts the handle movement: `"x"` (horizontal), `"y"` (vertical), `"xy"` (both directions). `"xy"` by default
  • handler - a *function* to process the handle actions or *boolean* to enable/disable. As a *function*, the property takes the following parameters:
    • cell - the object of the current cell. Contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • array - an array of all selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • range - an array of pre-selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • dir - the direction of cells selection: "up" | "down" | "right" | "left"
    • index - the index of the iterated cell
    • grid - the `dhx.Grid` component object
areaenables the display of the selection area, `true` by default
:::note By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the **Range** module is initialized. diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 7b93b1c95..6fe023a6f 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2440,26 +2440,27 @@ The `blockSelection` property can be set in two ways: - as a *boolean* value it enables or disables the block selection module upon the component initialization - as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: - - `disabled` - disables the module on startup (`false` by default) - - `mode` - the operating mode of the module: - - "range" - managed through the Range module [link] - - "manual" - managed through the manual control - - `handle` - enables the handle for resizing. Can be set as a *boolean* value or as an *object* (`true` by default). As an *object* can contain the following properties: - - `allowAxis` - restricts the handle movement: "x" (horizontal), "y" (vertical), "xy" (both directions). `"xy"` by default - - `handler` - a *function* to process the handle actions or *boolean* to enable/disable. As a function, the property takes the following parameters: - - `cell` - the object of the current cell. Contains the following properties: - - `row` - the object of a row - - `column` - the object of a column - - `array` - an array of all selected cells. Each cell object contains the following properties: - - `row` - the object of a row - - `column` - the object of a column - - `range` - an array of pre-selected cells. Each cell object contains the following properties: - - `row` - the object of a row - - `column` - the object of a column - - `dir` - the direction of cells selection: "up" | "down" | "right" | "left" - - `index` - the index of the iterated cell - - `grid` - the `dhx.Grid` component object - - `area` - enables the display of the selection area (`true` by default) + + + + + + + + + + + + + + + + + + + + +
disableddisables the module on startup, `false` by default
modethe operating mode of the module:
  • "range" - managed through the Range module
  • "manual" - managed through the manual control
handleenables the handle for resizing. Can be set as a *boolean* value or as an *object*, `true` by default.
As an *object* can contain the following properties:
  • allowAxis - restricts the handle movement: `"x"` (horizontal), `"y"` (vertical), `"xy"` (both directions). `"xy"` by default
  • handler - a *function* to process the handle actions or *boolean* to enable/disable. As a *function*, the property takes the following parameters:
    • cell - the object of the current cell. Contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • array - an array of all selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • range - an array of pre-selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • dir - the direction of cells selection: "up" | "down" | "right" | "left"
    • index - the index of the iterated cell
    • grid - the `dhx.Grid` component object
areaenables the display of the selection area, `true` by default
:::note By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the **Range** module is initialized. From cdcea11a3c5c20289665a7f640163cf43aac67b0 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 30 May 2025 21:28:17 +0300 Subject: [PATCH 05/47] [update] guides and api for rangeselection and blockselection modules --- docs/grid/api/api_overview.md | 36 ++++++++-------- docs/grid/api/grid_rangeselection_config.md | 4 +- ...ange_event.md => afterresetrange_event.md} | 10 ++--- ...trange_event.md => aftersetrange_event.md} | 8 ++-- ...nge_event.md => beforeresetrange_event.md} | 10 ++--- ...range_event.md => beforesetrange_event.md} | 8 ++-- ...on_disable_method.md => disable_method.md} | 10 ++--- ...tion_enable_method.md => enable_method.md} | 10 ++--- ..._getrange_method.md => getrange_method.md} | 6 +-- ...lls_method.md => getrangedcells_method.md} | 6 +-- ...isabled_method.md => isdisabled_method.md} | 6 +-- ..._isranged_method.md => isranged_method.md} | 6 +-- ...etrange_method.md => resetrange_method.md} | 6 +-- ..._setrange_method.md => setrange_method.md} | 29 +++++++------ docs/grid/configuration.md | 16 +++++--- docs/grid/features.md | 10 ++--- docs/grid/usage.md | 6 ++- docs/grid/usage_blockselection.md | 6 +-- ...e_selection.md => usage_rangeselection.md} | 41 +++++++++---------- sidebars.js | 40 +++++++++--------- 20 files changed, 143 insertions(+), 131 deletions(-) rename docs/grid/api/rangeselection/{rangeselection_afterresetrange_event.md => afterresetrange_event.md} (67%) rename docs/grid/api/rangeselection/{rangeselection_aftersetrange_event.md => aftersetrange_event.md} (70%) rename docs/grid/api/rangeselection/{rangeselection_beforeresetrange_event.md => beforeresetrange_event.md} (73%) rename docs/grid/api/rangeselection/{rangeselection_beforesetrange_event.md => beforesetrange_event.md} (73%) rename docs/grid/api/rangeselection/{rangeselection_disable_method.md => disable_method.md} (58%) rename docs/grid/api/rangeselection/{rangeselection_enable_method.md => enable_method.md} (57%) rename docs/grid/api/rangeselection/{rangeselection_getrange_method.md => getrange_method.md} (77%) rename docs/grid/api/rangeselection/{rangeselection_getrangedcells_method.md => getrangedcells_method.md} (73%) rename docs/grid/api/rangeselection/{rangeselection_isdisabled_method.md => isdisabled_method.md} (66%) rename docs/grid/api/rangeselection/{rangeselection_isranged_method.md => isranged_method.md} (78%) rename docs/grid/api/rangeselection/{rangeselection_resetrange_method.md => resetrange_method.md} (66%) rename docs/grid/api/rangeselection/{rangeselection_setrange_method.md => setrange_method.md} (58%) rename docs/grid/{usage_range_selection.md => usage_rangeselection.md} (75%) diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index 5d3489e90..5a1ad2f78 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -44,7 +44,8 @@ description: You can explore the API of Grid in the documentation of the DHTMLX :::info important - Use [the methods of DataCollection](data_collection.md) to work with data. - Apply [the methods of Selection](grid/api/api_overview.md#selection-methods) to manage the selection of Grid cells. -- Apply [the methods of Range Selection](grid/api/api_overview.md#range-selection-methods) to manage the range selection within Grid. +- Apply [the methods of RangeSelection](grid/api/api_overview.md#rangeselection-methods) to manage the range selection within Grid. +- Apply [the methods of BlockSelection](grid/api/api_overview.md#blockselection-methods) to manage the block selection within Grid. - Use [the methods of TreeCollection](tree_collection.md#methods) to work with data of Grid in the TreeGrid mode. ::: @@ -166,7 +167,8 @@ description: You can explore the API of Grid in the documentation of the DHTMLX :::info important - Use [the events of DataCollection](data_collection.md#events) to work with data of Grid. - Apply [the events of Selection](grid/api/api_overview.md#selection-events) to handle the selection of Grid cells. -- Apply [the events of Range Selection](grid/api/api_overview.md#range-selection-events) to handle the range selection within Grid. +- Apply [the events of RangeSelection](grid/api/api_overview.md#rangeselection-events) to handle the range selection within Grid. +- Apply [the events of BlockSelection](grid/api/api_overview.md#blockselection-events) to handle the block selection within Grid. - Use [the events of TreeCollection](tree_collection.md#events) to work with data of Grid in the TreeGrid mode. ::: @@ -249,30 +251,30 @@ You will find the list of all the available configuration properties of a Grid c | [](grid/api/selection/selection_beforeselect_event.md) | @getshort(grid/api/selection/selection_beforeselect_event.md) | | [](grid/api/selection/selection_beforeunselect_event.md) | @getshort(grid/api/selection/selection_beforeunselect_event.md) | -## Range Selection API +## RangeSelection API -### Range Selection methods +### RangeSelection methods | Name | Description | | ----------------------------------------------------- | ------------------------------------------------------------ | -| [](grid/api/rangeselection/rangeselection_disable_method.md) | @getshort(grid/api/rangeselection/rangeselection_disable_method.md) | -| [](grid/api/rangeselection/rangeselection_enable_method.md) | @getshort(grid/api/rangeselection/rangeselection_enable_method.md) | -| [](grid/api/rangeselection/rangeselection_getrange_method.md) | @getshort(grid/api/rangeselection/rangeselection_getrange_method.md) | -| [](grid/api/rangeselection/rangeselection_getrangedcells_method.md) | @getshort(grid/api/rangeselection/rangeselection_getrangedcells_method.md) | -| [](grid/api/rangeselection/rangeselection_isdisabled_method.md) | @getshort(grid/api/rangeselection/rangeselection_isdisabled_method.md) | -| [](grid/api/rangeselection/rangeselection_isranged_method.md) | @getshort(grid/api/rangeselection/rangeselection_isranged_method.md) | -| [](grid/api/rangeselection/rangeselection_resetrange_method.md) | @getshort(grid/api/rangeselection/rangeselection_resetrange_method.md) | -| [](grid/api/rangeselection/rangeselection_setrange_method.md) | @getshort(grid/api/rangeselection/rangeselection_setrange_method.md) | +| [](grid/api/rangeselection/disable_method.md) | @getshort(grid/api/rangeselection/disable_method.md) | +| [](grid/api/rangeselection/enable_method.md) | @getshort(grid/api/rangeselection/enable_method.md) | +| [](grid/api/rangeselection/getrange_method.md) | @getshort(grid/api/rangeselection/getrange_method.md) | +| [](grid/api/rangeselection/getrangedcells_method.md) | @getshort(grid/api/rangeselection/getrangedcells_method.md) | +| [](grid/api/rangeselection/isdisabled_method.md) | @getshort(grid/api/rangeselection/isdisabled_method.md) | +| [](grid/api/rangeselection/isranged_method.md) | @getshort(grid/api/rangeselection/isranged_method.md) | +| [](grid/api/rangeselection/resetrange_method.md) | @getshort(grid/api/rangeselection/resetrange_method.md) | +| [](grid/api/rangeselection/setrange_method.md) | @getshort(grid/api/rangeselection/setrange_method.md) | -### Range Selection events +### RangeSelection events | Name | Description | | -------------------------------------------------------- | --------------------------------------------------------------- | -| [](grid/api/rangeselection/rangeselection_afterresetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_afterresetrange_event.md) | -| [](grid/api/rangeselection/rangeselection_aftersetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_aftersetrange_event.md) | -| [](grid/api/rangeselection/rangeselection_beforeresetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_beforeresetrange_event.md) | -| [](grid/api/rangeselection/rangeselection_beforesetrange_event.md) | @getshort(grid/api/rangeselection/rangeselection_beforesetrange_event.md) | +| [](grid/api/rangeselection/afterresetrange_event.md) | @getshort(grid/api/rangeselection/afterresetrange_event.md) | +| [](grid/api/rangeselection/aftersetrange_event.md) | @getshort(grid/api/rangeselection/aftersetrange_event.md) | +| [](grid/api/rangeselection/beforeresetrange_event.md) | @getshort(grid/api/rangeselection/beforeresetrange_event.md) | +| [](grid/api/rangeselection/beforesetrange_event.md) | @getshort(grid/api/rangeselection/beforesetrange_event.md) | diff --git a/docs/grid/api/grid_rangeselection_config.md b/docs/grid/api/grid_rangeselection_config.md index 0d3012c6e..17e981884 100644 --- a/docs/grid/api/grid_rangeselection_config.md +++ b/docs/grid/api/grid_rangeselection_config.md @@ -6,7 +6,7 @@ description: You can explore the rangeSelection config of Grid in the documentat # rangeSelection -@short: Optional. Enables range selection management within a grid +@short: Optional. Enables/disables range selection management within a grid ### Usage @@ -56,6 +56,6 @@ console.log(grid.range.isDisabled()); // `true` - module is inactive grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set ~~~ -**Related article:** [Range selection](grid/configuration.md/#range-selection) +**Related article:** [Managing RangeSelection in Grid](grid/configuration.md/#managing-range-selection-in-grid) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md b/docs/grid/api/rangeselection/afterresetrange_event.md similarity index 67% rename from docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md rename to docs/grid/api/rangeselection/afterresetrange_event.md index fa892e56f..d888e7564 100644 --- a/docs/grid/api/rangeselection/rangeselection_afterresetrange_event.md +++ b/docs/grid/api/rangeselection/afterresetrange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterResetRange title: JavaScript Grid - afterResetRange Event -description: You can explore the afterResetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the afterResetRange event of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # afterResetRange @@ -45,11 +45,11 @@ grid.range.resetRange(); // logs the previous range @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), -[`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md), -[`beforeResetRange`](grid/api/rangeselection/rangeselection_beforeresetrange_event.md) +**Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md), +[`resetRange()`](grid/api/rangeselection/resetrange_method.md), +[`beforeResetRange`](grid/api/rangeselection/beforeresetrange_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md b/docs/grid/api/rangeselection/aftersetrange_event.md similarity index 70% rename from docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md rename to docs/grid/api/rangeselection/aftersetrange_event.md index 6553e0ed3..29951bfe6 100644 --- a/docs/grid/api/rangeselection/rangeselection_aftersetrange_event.md +++ b/docs/grid/api/rangeselection/aftersetrange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: afterSetRange title: JavaScript Grid - afterSetRange Event -description: You can explore the afterSetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the afterSetRange event of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # afterSetRange @@ -44,10 +44,10 @@ grid.range.setRange({ xStart: "a", yStart: "1" }); // logs the range object @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), -[`beforeSetRange`](grid/api/rangeselection/rangeselection_beforesetrange_event.md) +**Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md), +[`beforeSetRange`](grid/api/rangeselection/beforesetrange_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md b/docs/grid/api/rangeselection/beforeresetrange_event.md similarity index 73% rename from docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md rename to docs/grid/api/rangeselection/beforeresetrange_event.md index 923b4e961..58abd27d6 100644 --- a/docs/grid/api/rangeselection/rangeselection_beforeresetrange_event.md +++ b/docs/grid/api/rangeselection/beforeresetrange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeResetRange title: JavaScript Grid - beforeResetRange Event -description: You can explore the beforeResetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the beforeResetRange event of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # beforeResetRange @@ -49,11 +49,11 @@ grid.range.resetRange(); // resetting of the range is canceled @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), -[`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md), -[`afterResetRange`](grid/api/rangeselection/rangeselection_afterresetrange_event.md) +**Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md), +[`resetRange()`](grid/api/rangeselection/resetrange_method.md), +[`afterResetRange`](grid/api/rangeselection/afterresetrange_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md b/docs/grid/api/rangeselection/beforesetrange_event.md similarity index 73% rename from docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md rename to docs/grid/api/rangeselection/beforesetrange_event.md index 28e175bb3..8752f50eb 100644 --- a/docs/grid/api/rangeselection/rangeselection_beforesetrange_event.md +++ b/docs/grid/api/rangeselection/beforesetrange_event.md @@ -1,7 +1,7 @@ --- sidebar_label: beforeSetRange title: JavaScript Grid - beforeSetRange Event -description: You can explore the beforeSetRange event of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the beforeSetRange event of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # beforeSetRange @@ -50,10 +50,10 @@ grid.range.setRange({ xStart: "b", yStart: "1" }); // setting a new range is can @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md), -[`afterSetRange`](grid/api/rangeselection/rangeselection_aftersetrange_event.md) +**Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md), +[`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_disable_method.md b/docs/grid/api/rangeselection/disable_method.md similarity index 58% rename from docs/grid/api/rangeselection/rangeselection_disable_method.md rename to docs/grid/api/rangeselection/disable_method.md index 1384aa152..8ab28bd8e 100644 --- a/docs/grid/api/rangeselection/rangeselection_disable_method.md +++ b/docs/grid/api/rangeselection/disable_method.md @@ -1,12 +1,12 @@ --- sidebar_label: disable() title: JavaScript Grid - disable Method -description: You can explore the disable method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the disable method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # disable() -@short: disables the Range Selection module and resets the current range +@short: disables the `RangeSelection` module and resets the current range ### Usage @@ -36,10 +36,10 @@ grid.range.setRange({ xStart: "a", yStart: "1" }); // the range won't be set @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`enable()`](grid/api/rangeselection/rangeselection_enable_method.md), [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), -[`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) +**Related API**: [`enable()`](grid/api/rangeselection/enable_method.md), [`getRange()`](grid/api/rangeselection/getrange_method.md), +[`setRange()`](grid/api/rangeselection/setrange_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_enable_method.md b/docs/grid/api/rangeselection/enable_method.md similarity index 57% rename from docs/grid/api/rangeselection/rangeselection_enable_method.md rename to docs/grid/api/rangeselection/enable_method.md index 4f88029d1..29384e3c0 100644 --- a/docs/grid/api/rangeselection/rangeselection_enable_method.md +++ b/docs/grid/api/rangeselection/enable_method.md @@ -1,12 +1,12 @@ --- sidebar_label: enable() title: JavaScript Grid - enable Method -description: You can explore the enable method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the enable method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # enable() -@short: activates the Range Selection module +@short: activates the `RangeSelection` module ### Usage @@ -34,10 +34,10 @@ grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will be set @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`disable()`](grid/api/rangeselection/rangeselection_disable_method.md), [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), -[`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) +**Related API**: [`disable()`](grid/api/rangeselection/disable_method.md), [`getRange()`](grid/api/rangeselection/getrange_method.md), +[`setRange()`](grid/api/rangeselection/setrange_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_getrange_method.md b/docs/grid/api/rangeselection/getrange_method.md similarity index 77% rename from docs/grid/api/rangeselection/rangeselection_getrange_method.md rename to docs/grid/api/rangeselection/getrange_method.md index eec539507..2fdd25c2e 100644 --- a/docs/grid/api/rangeselection/rangeselection_getrange_method.md +++ b/docs/grid/api/rangeselection/getrange_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getRange() title: JavaScript Grid - getRange Method -description: You can explore the getRange method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the getRange method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # getRange() @@ -49,9 +49,9 @@ console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) +**Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md) @changelog: diff --git a/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md b/docs/grid/api/rangeselection/getrangedcells_method.md similarity index 73% rename from docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md rename to docs/grid/api/rangeselection/getrangedcells_method.md index 6fb0b6e21..50db4042f 100644 --- a/docs/grid/api/rangeselection/rangeselection_getrangedcells_method.md +++ b/docs/grid/api/rangeselection/getrangedcells_method.md @@ -1,7 +1,7 @@ --- sidebar_label: getRangedCells() title: JavaScript Grid - getRangedCells Method -description: You can explore the getRangedCells method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the getRangedCells method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # getRangedCells() @@ -38,9 +38,9 @@ grid.range.setRange({ xStart: "a", yStart: "1", xEnd: "b", yEnd: "1" }); console.log(grid.range.getRangedCells()); // -> [{ row: { id: "1", ... }, column: { id: "a", ... }}, ...] @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) +**Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md) @changelog: added in v9.2 diff --git a/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md b/docs/grid/api/rangeselection/isdisabled_method.md similarity index 66% rename from docs/grid/api/rangeselection/rangeselection_isdisabled_method.md rename to docs/grid/api/rangeselection/isdisabled_method.md index d8e546e82..3db9486ae 100644 --- a/docs/grid/api/rangeselection/rangeselection_isdisabled_method.md +++ b/docs/grid/api/rangeselection/isdisabled_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isDisabled() title: JavaScript Grid - isDisabled Method -description: You can explore the isDisabled method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the isDisabled method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # isDisabled() @@ -39,9 +39,9 @@ console.log(grid.range.isDisabled()); // -> false @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`enable()`](grid/api/rangeselection/rangeselection_enable_method.md), [`disable()`](grid/api/rangeselection/rangeselection_disable_method.md) +**Related API**: [`enable()`](grid/api/rangeselection/enable_method.md), [`disable()`](grid/api/rangeselection/disable_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_isranged_method.md b/docs/grid/api/rangeselection/isranged_method.md similarity index 78% rename from docs/grid/api/rangeselection/rangeselection_isranged_method.md rename to docs/grid/api/rangeselection/isranged_method.md index 9039ee826..c5f14c9a8 100644 --- a/docs/grid/api/rangeselection/rangeselection_isranged_method.md +++ b/docs/grid/api/rangeselection/isranged_method.md @@ -1,7 +1,7 @@ --- sidebar_label: isRanged() title: JavaScript Grid - isRanged Method -description: You can explore the isRanged method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the isRanged method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # isRanged() @@ -48,9 +48,9 @@ console.log(grid.range.isRanged({ y: "3" })); // -> false @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) +**Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md) @changelog: added in v9.2 diff --git a/docs/grid/api/rangeselection/rangeselection_resetrange_method.md b/docs/grid/api/rangeselection/resetrange_method.md similarity index 66% rename from docs/grid/api/rangeselection/rangeselection_resetrange_method.md rename to docs/grid/api/rangeselection/resetrange_method.md index 7a68257c1..843824655 100644 --- a/docs/grid/api/rangeselection/rangeselection_resetrange_method.md +++ b/docs/grid/api/rangeselection/resetrange_method.md @@ -1,7 +1,7 @@ --- sidebar_label: resetRange() title: JavaScript Grid - resetRange Method -description: You can explore the resetRange method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the resetRange method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # resetRange() @@ -39,9 +39,9 @@ console.log(grid.range.getRange()); // -> null @descr: -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) +**Related API**: [`getRange()`](grid/api/rangeselection/getrange_method.md), [`setRange()`](grid/api/rangeselection/setrange_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/rangeselection_setrange_method.md b/docs/grid/api/rangeselection/setrange_method.md similarity index 58% rename from docs/grid/api/rangeselection/rangeselection_setrange_method.md rename to docs/grid/api/rangeselection/setrange_method.md index edbb627c3..ebdcd77c5 100644 --- a/docs/grid/api/rangeselection/rangeselection_setrange_method.md +++ b/docs/grid/api/rangeselection/setrange_method.md @@ -1,7 +1,7 @@ --- sidebar_label: setRange() title: JavaScript Grid - setRange Method -description: You can explore the setRange method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +description: You can explore the setRange method of Grid range selection in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- # setRange() @@ -23,14 +23,19 @@ setRange( ~~~ @params: -- `range: object` - defines the range to set: - - `xStart?: string | number` - the starting column id - - `xEnd?: string | number` - the ending column id - - `yStart?: string | number` - the starting row id - - `yEnd?: string | number` - the ending row id -- `join?: boolean` - defines whether a new range is merged with the current one: - - if `join: true` is set, the method merges the new range with the current one. In this case, you can specify just the ending ids of the range, while the starting ids are optional - - if the `join: false` setting is specified, the method resets the previous range + + + + + + + + + + + +
range(object) an object with the range coordinates that contains the following options:
  • `xStart` - (string | number) the starting column id
  • `xEnd` - (string | number) the ending column id
  • `yStart` - (string | number) the starting row id
  • `yEnd` - (string | number) the ending row id
join(boolean) defines whether a new range is merged with the current one: +
  • if `join: true` is set, the method merges the new range with the current one. In this case, you can specify just the ending ids of the range, while the starting ids are optional
  • if the `join: false` setting is specified, the method resets the previous range
:::note If not all coordinates are provided, the missing ones are automatically filled (e.g., the last visible column for `xEnd`). The starting id for at least one coordinate is required. @@ -81,10 +86,10 @@ grid.range.setRange({ xEnd: "b", yEnd: "2" }, true); // merges with the current console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", yEnd: "2" } ~~~ -**Related article**: [Work with Range Selection object](grid/usage_range_selection.md) +**Related article**: [Work with Range Selection object](grid/usage_rangeselection.md) -**Related API**: [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md), -[`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md) +**Related API**: [`getRange()`](grid/api/rangeselection/getrange_method.md), +[`resetRange()`](grid/api/rangeselection/resetrange_method.md) @changelog: diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index ce5ad2d6e..39db3928f 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2418,9 +2418,11 @@ const grid = new dhx.Grid("grid_container", { Since the `multiselection` configuration option is set to *true*, using the "Ctrl + Click" combination allows selecting the desired cells or rows. A range of Grid cells/rows can be selected by clicking the first element to select and then, while holding down the Shift key, clicking the last element to select. -## Range selection +### Managing range selection in Grid -To enable [range selection management](grid/usage_range_selection.md) within a grid, you should use the Range module. To initialize the Range module, use the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration: +The Grid functionality provides the [range selection management](grid/usage_rangeselection.md) feature for setting/resetting a range of cells, retrieving information about the current range, and checking whether specific cells belong to the selected range. + +To enable [range selection management](grid/usage_rangeselection.md) within a grid, you should use the `RangeSelection` module. To initialize the module, enable the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -2432,7 +2434,7 @@ const grid = new dhx.Grid("grid_container", { { id: "1", a: "A1", b: "B1" }, { id: "2", a: "A2", b: "B2" }, ], - rangeSelection: true // enables the Range module + rangeSelection: true // enables the RangeSelection module }); ~~~ @@ -2462,11 +2464,13 @@ console.log(grid.range.isDisabled()); // `true` - module is inactive grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set ~~~ -For information on using the Range Selection API, read the [Work with Range Selection object](grid/usage_range_selection.md) guide. +For information on using the Range Selection API, read the [Work with RangeSelection module](grid/usage_rangeselection.md) guide. ### Managing block selection in Grid -You can manage selection of cells' ranges via the mouse pointer, touch input, and keyboard navigation. To enable [block selection management](grid/usage_blockselection_module.md) within a grid, you should use the `BlockSelection` module. To initialize the module, use the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration: +The Grid functionality provides the [block selection management](grid/usage_blockselection.md) feature for selecting cells' ranges via the mouse pointer, touch input, and keyboard navigation, as well as adjusting the appearance of the selection and handlers, depending on the applied mode. + +To enable managing of the block selection within a grid, you should use the `BlockSelection` module. To initialize the module, enable the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -2509,7 +2513,7 @@ The `blockSelection` property can be set in two ways: :::note -By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the **Range** module is initialized. +By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the [`RangeSelection`](grid/usage_rangeselection.md) module is initialized. ::: The example below demonstrates configuring the module with the handle disabled and the "range" mode enabled: diff --git a/docs/grid/features.md b/docs/grid/features.md index 1043531f2..320b1bc84 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -283,15 +283,15 @@ In this section you will find the ways of working with selection functionality. | [Selection API](../../category/selection-api/) | Learn how to use the API of Selection to manage the selection of Grid cells | | [Keyboard navigation](../configuration/#arrow-shortcut-keys) | Learn how to enable key navigation that allows moving the selection between cells ([Example](https://snippet.dhtmlx.com/y9kdk0md)) | -## How to work with range selection +### How to work with range selection In this section you will get to know how to work with the range selection functionality. | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring range selection](../configuration/#range-selection) | Learn how to configure the mode of range selection within Grid | -| [Working with range selection](../usage_range_selection/) | Learn how to enable/disable range selection, set/reset range selection, get the range selection object, and check whether a cell is in the range | -| [Range Selection API](../../category/range-selection-api/) | Learn how to use the API of Range Selection to manage the range selection within Grid | +| [Configuring range selection](../configuration/#managing-range-selection-in-grid) | Learn how to configure the range selection module within Grid | +| [Working with range selection](../usage_rangeselection/) | Learn how to enable/disable range selection, set/reset range selection, get the range selection object, and check whether a cell is in the range | +| [Range Selection API](../../category/rangeselection-api/) | Learn how to use the API of the RangeSelection module to manage the range selection within Grid | ### How to work with block selection @@ -301,7 +301,7 @@ In this section you will get to know how to work with the block selection functi | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Configuring block selection](../configuration/#managing-block-selection-in-grid) | Learn how to configure the block selection module within Grid ([Example](https://snippet.dhtmlx.com/8gx20g1d)) | -| [Working with block selection](../usage_blockselection/) | Learn how to enable/disable block selection in Grid, check the main features of the BlockSelection module and explore it interacts with other modules | +| [Working with block selection](../usage_blockselection/) | Learn how to enable/disable block selection in Grid, check the main features of the BlockSelection module and explore how it interacts with other modules | | [BlockSelection API](../../category/blockselection-api/) | Learn how to use API of the BlockSelection module to manage the block selection within Grid | ## How to work with TreeGrid mode diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 63f4b850f..930bdd3c2 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -1200,13 +1200,15 @@ grid.destructor(); For information on using Selection API, read [Work with Selection object](grid/usage_selection.md). +## Using Range Selection API + +For information on using RangeSelection API, read [Work with RangeSelection Module](grid/usage_rangeselection.md). + ## Using BlockSelection API For information on using BlockSelection API, read [Work with BlockSelection module](grid/usage_blockselection.md). -## Using Range Selection API -For information on using Range Selection API, read [Work with Range Selection Object](grid/usage_range_selection.md). ## Working with Grid in the TreeGrid mode diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md index f9fc11853..101bb498b 100644 --- a/docs/grid/usage_blockselection.md +++ b/docs/grid/usage_blockselection.md @@ -114,21 +114,21 @@ The `BlockSelection` API interacts with other grid modules depending on the appl #### Range mode -- The `BlockSelection` module uses the `Range` API to manage continuous rectangular ranges. +- The `BlockSelection` module uses the [`RangeSelection` API](grid/api/api_overview.md/#rangeselection-api) to manage continuous rectangular ranges. - The handle automatically fills data in the new range. - The selected range will be reset during data grouping or ungrouping. - The range will be reinstalled to a new one when moving columns or rows. #### Manual mode -- The `BlockSelection` module does not use the `Range` API. The developer implements logic via the events such as [`blockSelectionValidate`](grid/api/blockselection/blockselectionvalidate_event.md), [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). +- The `BlockSelection` module does not use the `RangeSelection` API. The developer implements logic via the events such as [`blockSelectionValidate`](grid/api/blockselection/blockselectionvalidate_event.md), [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). - The handle and built-in filling are unavailable. ### Usage examples #### Restricting selection in the Range mode -This example shows how to control the start of a block selection and programmatically set a range using the `Range` API. +This example shows how to control the start of a block selection and programmatically set a range using the [`RangeSelection` API](grid/api/api_overview.md/#rangeselection-api). ~~~jsx const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/usage_range_selection.md b/docs/grid/usage_rangeselection.md similarity index 75% rename from docs/grid/usage_range_selection.md rename to docs/grid/usage_rangeselection.md index d96d12e8d..c69cfe31d 100644 --- a/docs/grid/usage_range_selection.md +++ b/docs/grid/usage_rangeselection.md @@ -1,18 +1,18 @@ --- -sidebar_label: Work with Range Selection object -title: JavaScript Grid - Work with Range Selection object -description: You can explore how to work with Range Selection object of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +sidebar_label: Work with RangeSelection module +title: JavaScript Grid - Work with RangeSelection module +description: You can explore how to work with RangeSelection module of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- -# Work with Range Selection object +# Work with RangeSelection module -You can manage range selection withing a grid via the API of the [Range selection](grid/configuration.md/#range-selection) object. It provides methods for setting and resetting a range of cells, getting information about the current range, and checking whether specific cells belong to the selected range. It also supports an event system to track changes. +You can manage range selection within a grid via the API of the [`RangeSelection`](grid/configuration.md/#managing-range-selection-in-grid) module. It provides methods for setting and resetting a range of cells, getting information about the current range, and checking whether specific cells belong to the selected range. It also supports an [event system](grid/api/api_overview.md/#rangeselection-events) to track changes. -To initialize the Range module, use the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration. Once the Grid is created, the Range module is accessible through the `grid.range` property. +To initialize the `RangeSelection` module, use the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration. Once the Grid is created, the module is accessible through the `grid.range` property. -## Enabling/disabling Range Selection module +## Enabling/disabling RangeSelection module -You can activate the range selection module via the [`enable()`](grid/api/rangeselection/rangeselection_enable_method.md) method of the `range` object. +You can activate the range selection module via the [`enable()`](grid/api/rangeselection/enable_method.md) method of the `range` object. The following example shows how the module is enabled after deactivation on initialization: @@ -34,7 +34,7 @@ grid.range.enable(); // activating the module grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will be set ~~~ -To disable the range selection in Grid, use the [`disable()`](grid/api/rangeselection/rangeselection_disable_method.md) method of the `range` object: +To disable the range selection in Grid, use the [`disable()`](grid/api/rangeselection/disable_method.md) method of the `range` object: The example below shows disabling of the `range` module: @@ -58,9 +58,9 @@ console.log(grid.range.getRange()); // -> null grid.range.setRange({ xStart: "a", yStart: "1" }); // the range won't be set ~~~ -## Checking Range Selection module state +## Checking RangeSelection module state -You can check whether the Range Selection module is disabled, using the [`isDisabled()`](grid/api/rangeselection/rangeselection_isdisabled_method.md) method of the `range` object. It returns `true`, if the module is disabled and `false`, if it is enabled. +You can check whether the RangeSelection module is disabled, using the [`isDisabled()`](grid/api/rangeselection/isdisabled_method.md) method of the `range` object. It returns `true`, if the module is disabled and `false`, if it is enabled. The following example shows checking of the module's activity status: @@ -86,7 +86,7 @@ console.log(grid.range.isDisabled()); // -> false ## Setting a range selection -You can set a range selection using the [`setRange()`](grid/api/rangeselection/rangeselection_setrange_method.md) method of the `range` object. The method takes the following parameters: +You can set a range selection using the [`setRange()`](grid/api/rangeselection/setrange_method.md) method of the `range` object. The method takes the following parameters: @@ -147,13 +147,12 @@ console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", To make the process of selecting a range more flexible, you can apply the related events of the `range` object: -- [`afterSetRange`](grid/api/rangeselection/rangeselection_aftersetrange_event.md) -- [`beforeSetRange`](grid/api/rangeselection/rangeselection_beforesetrange_event.md) +- [`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md) +- [`beforeSetRange`](grid/api/rangeselection/beforesetrange_event.md) ## Resetting the range selection -You can reset the applied range selection using the [`resetRange()`](grid/api/rangeselection/rangeselection_resetrange_method.md) method of the `range` object. The method returns -`true` - on success, `false`, if the module is disabled, or if reset is canceled by an event. +You can reset the applied range selection using the [`resetRange()`](grid/api/rangeselection/resetrange_method.md) method of the `range` object. The method returns `true` - on success, `false`, if the module is disabled, or if reset is canceled by an event. The following example shows resetting of the current range: @@ -178,12 +177,12 @@ console.log(grid.range.getRange()); // -> null To make the process of unselecting a range more flexible, you can apply the related events of the `range` object: -- [`afterResetRange`](grid/api/rangeselection/rangeselection_afterresetrange_event.md) -- [`beforeResetRange`](grid/api/rangeselection/rangeselection_beforeresetrange_event.md) +- [`afterResetRange`](grid/api/rangeselection/afterresetrange_event.md) +- [`beforeResetRange`](grid/api/rangeselection/beforeresetrange_event.md) ## Getting the range selection -You can get the current selection range. For this, use the [`getRange()`](grid/api/rangeselection/rangeselection_getrange_method.md) method of the `range` object. It returns the object of selection range or `null` if no range is set. +You can get the current selection range. For this, use the [`getRange()`](grid/api/rangeselection/getrange_method.md) method of the `range` object. It returns the object of selection range or `null` if no range is set. The following example shows retrieving of the current range: @@ -214,7 +213,7 @@ The returned object with the current selection range contains the following prop ### Getting an array of cells within the range -It is also possible to get an array of cells within the range selection by using the [`getRangedCells()`](grid/api/rangeselection/rangeselection_getrangedcells_method.md) method of the `range` object. It returns an array of objects where: +It is also possible to get an array of cells within the range selection by using the [`getRangedCells()`](grid/api/rangeselection/getrangedcells_method.md) method of the `range` object. It returns an array of objects where: - `row` - (*object*) the row object - `column` - (*object*) the column object @@ -241,7 +240,7 @@ console.log(grid.range.getRangedCells()); // -> [{ row: { id: "1", ... }, column ## Checking whether a cell is in the range -You can check whether a cell is within the current range using the [`isRanged()`](grid/api/rangeselection/rangeselection_isranged_method.md) method of the `range` object. The method takes the following parameter: +You can check whether a cell is within the current range using the [`isRanged()`](grid/api/rangeselection/isranged_method.md) method of the `range` object. The method takes the following parameter: - `cell` - (*object*) - an object with the `x` and `y` coordinates of a cell, where: - `x` - (*string | number*) - the column id diff --git a/sidebars.js b/sidebars.js index 2be136ca7..46e11fdae 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2767,48 +2767,48 @@ module.exports = { }, { type: "category", - label: "Range Selection API", + label: "RangeSelection API", link: { type: 'generated-index', - title: "Range Selection API", - keywords: ['range selection API'], + title: "RangeSelection API", + keywords: ['rangeselection API'], image: '/img/docusaurus.png' }, items: [{ type: "category", - label: "Grid Range Selection methods", + label: "Grid RangeSelection methods", link: { type: 'generated-index', - title: "Grid Range Selection methods", + title: "Grid RangeSelection methods", keywords: ['grid range selection methods'], image: '/img/docusaurus.png' }, items: [ - "grid/api/rangeselection/rangeselection_disable_method", - "grid/api/rangeselection/rangeselection_enable_method", - "grid/api/rangeselection/rangeselection_getrange_method", - "grid/api/rangeselection/rangeselection_getrangedcells_method", - "grid/api/rangeselection/rangeselection_isdisabled_method", - "grid/api/rangeselection/rangeselection_isranged_method", - "grid/api/rangeselection/rangeselection_resetrange_method", - "grid/api/rangeselection/rangeselection_setrange_method", + "grid/api/rangeselection/disable_method", + "grid/api/rangeselection/enable_method", + "grid/api/rangeselection/getrange_method", + "grid/api/rangeselection/getrangedcells_method", + "grid/api/rangeselection/isdisabled_method", + "grid/api/rangeselection/isranged_method", + "grid/api/rangeselection/resetrange_method", + "grid/api/rangeselection/setrange_method", ], }, { type: "category", - label: "Grid Range Selection events", + label: "Grid RangeSelection events", link: { type: 'generated-index', - title: "Grid Range Selection events", + title: "Grid RangeSelection events", keywords: ['grid range selection events'], image: '/img/docusaurus.png' }, items: [ - "grid/api/rangeselection/rangeselection_afterresetrange_event", - "grid/api/rangeselection/rangeselection_aftersetrange_event", - "grid/api/rangeselection/rangeselection_beforeresetrange_event", - "grid/api/rangeselection/rangeselection_beforesetrange_event", + "grid/api/rangeselection/afterresetrange_event", + "grid/api/rangeselection/aftersetrange_event", + "grid/api/rangeselection/beforeresetrange_event", + "grid/api/rangeselection/beforesetrange_event", ], }, ], @@ -2889,7 +2889,7 @@ module.exports = { "grid/usage", "grid/treegrid_mode", "grid/usage_selection", - "grid/usage_range_selection", + "grid/usage_rangeselection", "grid/usage_blockselection", "grid/customization", "grid/events", From 8dec094b7556624c159539740519214884428e50 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 2 Jun 2025 11:24:08 +0300 Subject: [PATCH 06/47] [add] a draft for what's new v9.2 --- docs/whatsnew.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 6f9f209c6..9d1ba4119 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -8,6 +8,42 @@ description: You can explore what's new in DHTMLX Suite and its release history Before updating DHTMLX to the latest version, please check the [Migration to Newer Versions](migration.md) guide to avoid possible breakdowns. +## Version 9.2 + +Released on June X, 2025 + +Review of the release on the blog + +### New functionality + +- Grid. The Range manager is added (PRO version) + - new methods of the `range` object: `disable()`, `enable()`, `getRange()`, `getRangedCells()`, `isDisabled()`, `isRanged()`, `resetRange()`, `setRange()` + - new events of the `range` object: `afterResetRange`, `afterSetRange`, `beforeResetRange`, `beforeSetRange` +- Grid. The BlockSelection manager is added (PRO version) + - new methods of the `block` object: `disable()`, `enable()`, `isDisabled()` + - new events of the `block` object: `afterBlockHandleApply`, `afterBlockSelectionApply`, `afterBlockSelectionMove`, `beforeBlockHandleApply`, `beforeBlockSelectionApply`, `beforeBlockSelectionMove`, `blockHandleMouseDown`, `blockSelectionEnd`, `blockSelectionStart`, `blockSelectionValidate` +- Grid. The Clipboard functionality is added (PRO version) +- Grid. The drag and drop handle (panel) for rows is added +- Grid. Undo/Redo functionality + +### Updates + +- Context Menu. The `navigationType:"click"` is added +- Grid. The drag-n-drop functionality is improved (The DropManager is added) +- Grid. Updating / improving the export to Excel module + +### Fixes + +- DragManager. Incorrect detection of elements' drop location during drag-n-drop and other (Grid component) (?): + - Solving the problem of incorrectly determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode; + - Solving the problem when moving a line to the header/footer area; + - Solving the problem of determining the position for dropping above the first element; + - Solving the problem associated with the absence or incorrect definition of the drop position for the default mode; + - Fixed the `dragIn` event (the previous reset state was transmitted); + - Optimization of the `dragIn/dragOut` events (removed false positives). +- Grid. The issue with falsy selection of frozen cells while selecting unfrozen cells +- Grid. The issue with dragging unselected items + ## Version 9.1.3 Released on April 3, 2025 From cedf4c2310dde52258829b07c96bb34892063ff3 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 3 Jun 2025 16:33:59 +0300 Subject: [PATCH 07/47] [add] drafts for grid clipboard module api and guides --- docs/grid/api/api_overview.md | 18 +- docs/grid/api/clipboard/aftercopy_event.md | 43 +++++ docs/grid/api/clipboard/afterpaste_event.md | 39 ++++ docs/grid/api/clipboard/beforecopy_event.md | 49 +++++ docs/grid/api/clipboard/beforepaste_event.md | 44 +++++ docs/grid/api/clipboard/copyerror_event.md | 44 +++++ docs/grid/api/clipboard/pasteerror_event.md | 44 +++++ docs/grid/api/grid_clipboard_config.md | 76 ++++++++ docs/grid/configuration.md | 81 +++++++- docs/grid/features.md | 10 + docs/grid/usage.md | 2 + docs/grid/usage_clipboard.md | 189 +++++++++++++++++++ sidebars.js | 21 +++ 13 files changed, 658 insertions(+), 2 deletions(-) create mode 100644 docs/grid/api/clipboard/aftercopy_event.md create mode 100644 docs/grid/api/clipboard/afterpaste_event.md create mode 100644 docs/grid/api/clipboard/beforecopy_event.md create mode 100644 docs/grid/api/clipboard/beforepaste_event.md create mode 100644 docs/grid/api/clipboard/copyerror_event.md create mode 100644 docs/grid/api/clipboard/pasteerror_event.md create mode 100644 docs/grid/api/grid_clipboard_config.md create mode 100644 docs/grid/usage_clipboard.md diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index 5a1ad2f78..2835f3ef4 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -46,6 +46,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX - Apply [the methods of Selection](grid/api/api_overview.md#selection-methods) to manage the selection of Grid cells. - Apply [the methods of RangeSelection](grid/api/api_overview.md#rangeselection-methods) to manage the range selection within Grid. - Apply [the methods of BlockSelection](grid/api/api_overview.md#blockselection-methods) to manage the block selection within Grid. +- Use [the methods of Export](grid/api/api_overview.md#export-methods) to work with data export within Grid. - Use [the methods of TreeCollection](tree_collection.md#methods) to work with data of Grid in the TreeGrid mode. ::: @@ -169,6 +170,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX - Apply [the events of Selection](grid/api/api_overview.md#selection-events) to handle the selection of Grid cells. - Apply [the events of RangeSelection](grid/api/api_overview.md#rangeselection-events) to handle the range selection within Grid. - Apply [the events of BlockSelection](grid/api/api_overview.md#blockselection-events) to handle the block selection within Grid. +- Use [the events of Clipboard](grid/api/api_overview.md#clipboard-events) to work with clipboard within Grid. - Use [the events of TreeCollection](tree_collection.md#events) to work with data of Grid in the TreeGrid mode. ::: @@ -182,6 +184,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX | [](grid/api/grid_autowidth_config.md) | @getshort(grid/api/grid_autowidth_config.md) | | [](grid/api/grid_blockselection_config.md) | @getshort(grid/api/grid_blockselection_config.md) | | [](grid/api/grid_bottomsplit_config.md) | @getshort(grid/api/grid_bottomsplit_config.md) | +| [](grid/api/grid_clipboard_config.md) | @getshort(grid/api/grid_clipboard_config.md) | | [](grid/api/grid_closable_config.md) | @getshort(grid/api/grid_closable_config.md) | | [](grid/api/grid_collapsed_config.md) | @getshort(grid/api/grid_collapsed_config.md) | | [](grid/api/grid_columns_config.md) | @getshort(grid/api/grid_columns_config.md) | @@ -303,8 +306,9 @@ You will find the list of all the available configuration properties of a Grid c | [](grid/api/blockselection/blockselectionstart_event.md) | @getshort(grid/api/blockselection/blockselectionstart_event.md) | | [](grid/api/blockselection/blockselectionvalidate_event.md) | @getshort(grid/api/blockselection/blockselectionvalidate_event.md) | +## Export API -## Export methods +### Export methods | Name | Description | | --------------------------------------- | ---------------------------------------------- | @@ -313,3 +317,15 @@ You will find the list of all the available configuration properties of a Grid c | [](grid/api/export/grid_png_method.md) | @getshort(grid/api/export/grid_png_method.md) | | [](grid/api/export/grid_xlsx_method.md) | @getshort(grid/api/export/grid_xlsx_method.md) | +## Clipboard API + +### Clipboard events + +| Name | Description | +| ------------------------------------------ | ------------------------------------------------- | +| [](grid/api/clipboard/aftercopy_event.md) | @getshort(grid/api/clipboard/aftercopy_event.md) | +| [](grid/api/clipboard/afterpaste_event.md) | @getshort(grid/api/clipboard/afterpaste_event.md) | +| [](grid/api/clipboard/beforecopy_event.md) | @getshort(grid/api/clipboard/beforecopy_event.md) | +| [](grid/api/clipboard/beforepaste_event.md)| @getshort(grid/api/clipboard/beforepaste_event.md)| +| [](grid/api/clipboard/copyerror_event.md) | @getshort(grid/api/clipboard/copyerror_event.md) | +| [](grid/api/clipboard/pasteerror_event.md) | @getshort(grid/api/clipboard/pasteerror_event.md) | diff --git a/docs/grid/api/clipboard/aftercopy_event.md b/docs/grid/api/clipboard/aftercopy_event.md new file mode 100644 index 000000000..c4bbf6f46 --- /dev/null +++ b/docs/grid/api/clipboard/aftercopy_event.md @@ -0,0 +1,43 @@ +--- +sidebar_label: afterCopy +title: JavaScript Grid - afterCopy Event +description: You can explore the afterCopy event of Grid clipboard in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterCopy + +@short: fires after successfully copying or cutting data + +### Usage + +~~~jsx +afterCopy: (isCut: boolean) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `isCut` - indicates whether the operation was a cut (`true`) or a copy (`false`) + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + ], + clipboard: true +}); + +grid.clipboard.events.on("afterCopy", (isCut) => { + console.log(isCut ? "Data cut" : "Data copied"); +}); + +@descr: + +**Related API**: [`beforeCopy`](grid/api/clipboard/beforecopy_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/afterpaste_event.md b/docs/grid/api/clipboard/afterpaste_event.md new file mode 100644 index 000000000..1e30f8101 --- /dev/null +++ b/docs/grid/api/clipboard/afterpaste_event.md @@ -0,0 +1,39 @@ +--- +sidebar_label: afterPaste +title: JavaScript Grid - afterPaste Event +description: You can explore the afterPaste event of Grid clipboard in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterPaste + +@short: fires after successfully pasting data + +### Usage + +~~~jsx +afterPaste: () => void; +~~~ + + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + ], + clipboard: true +}); + +grid.clipboard.events.on("afterPaste", () => { + console.log("Data pasted"); +}); + +@descr: + +**Related API**: [`beforePaste`](grid/api/clipboard/beforepaste_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/beforecopy_event.md b/docs/grid/api/clipboard/beforecopy_event.md new file mode 100644 index 000000000..232e17a84 --- /dev/null +++ b/docs/grid/api/clipboard/beforecopy_event.md @@ -0,0 +1,49 @@ +--- +sidebar_label: beforeCopy +title: JavaScript Grid - beforeCopy Event +description: You can explore the beforeCopy event of Grid clipboard in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeCopy + +@short: fires before copying or cutting data + +### Usage + +~~~jsx +beforeCopy: (isCut: boolean) => boolean | void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `isCut` - indicates whether the operation is a cut (`true`) or a copy (`false`) + +@returns: +Return `false` to cancel the operation; otherwise, `true` + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + ], + clipboard: true +}); + +grid.clipboard.events.on("beforeCopy", (isCut) => { + if (isCut) { + console.log("Cutting canceled"); + return false; + } +}); + +@descr: + +**Related API**: [`afterCopy`](grid/api/clipboard/aftercopy_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/beforepaste_event.md b/docs/grid/api/clipboard/beforepaste_event.md new file mode 100644 index 000000000..35f0a8a3c --- /dev/null +++ b/docs/grid/api/clipboard/beforepaste_event.md @@ -0,0 +1,44 @@ +--- +sidebar_label: beforePaste +title: JavaScript Grid - beforePaste Event +description: You can explore the beforePaste event of Grid clipboard in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforePaste + +@short: fires before pasting data from the clipboard + +### Usage + +~~~jsx +beforePaste: () => boolean | void; +~~~ + +@returns: +Return `false` to cancel the operation; otherwise, `true` + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + ], + clipboard: true +}); + +grid.clipboard.events.on("beforePaste", () => { + if (!grid.range.getRange()) { + console.log("Paste canceled: no range specified"); + return false; + } +}); + +@descr: + +**Related API**: [`afterPaste`](grid/api/clipboard/afterpaste_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/copyerror_event.md b/docs/grid/api/clipboard/copyerror_event.md new file mode 100644 index 000000000..92bb1d096 --- /dev/null +++ b/docs/grid/api/clipboard/copyerror_event.md @@ -0,0 +1,44 @@ +--- +sidebar_label: copyError +title: JavaScript Grid - copyError Event +description: You can explore the copyError event of Grid clipboard in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# copyError + +@short: fires when an error occurs during copying or cutting (e.g., clipboard access is blocked) + +### Usage + +~~~jsx +copyError: (error: string) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `error` - an error message + + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + ], + clipboard: true +}); + +grid.clipboard.events.on("copyError", (error) => { + console.log("Copy error:", error); +}); + +@descr: + +**Related API**: [`pasteError`](grid/api/clipboard/pasteerror_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/pasteerror_event.md b/docs/grid/api/clipboard/pasteerror_event.md new file mode 100644 index 000000000..df6ee5195 --- /dev/null +++ b/docs/grid/api/clipboard/pasteerror_event.md @@ -0,0 +1,44 @@ +--- +sidebar_label: pasteError +title: JavaScript Grid - pasteError Event +description: You can explore the pasteError event of Grid clipboard in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# pasteError + +@short: fires when an error occurs during pasting (e.g., clipboard is empty or data is invalid) + +### Usage + +~~~jsx +pasteError: (error: string) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `error` - an error message + + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + ], + clipboard: true +}); + +grid.clipboard.events.on("pasteError", (error) => { + console.log("Paste error:", error); +}); + +@descr: + +**Related API**: [`copyError`](grid/api/clipboard/copyerror_event.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md new file mode 100644 index 000000000..27e50464f --- /dev/null +++ b/docs/grid/api/grid_clipboard_config.md @@ -0,0 +1,76 @@ +--- +sidebar_label: clipboard +title: JavaScript Grid - clipboard Config +description: You can explore the clipboard config of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# clipboard + +@short: Optional. Enables/disables the clipboard module within a grid + +:::note +The module requires the `RangeSelection` module to be enabled via one of the configuration properties: `rangeSelection: true` or `blockSelection: { mode: "range" }`. +::: + +### Usage + +~~~jsx +clipboard?: + | boolean + | { + copyModifier?: (value: any, cell: { row: object; column: object }, cut: boolean) => string; + cutModifier?: (value: any, cell: { row: object; column: object }) => string; + pasteModifier?: (value: any, cell: { row: object; column: object }) => any; + }; +~~~ + +@default: false + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { mode: "range" }, // required for Clipboard to function (initializes automatically) + clipboard: true // enables the Clipboard module +}); + +@descr: +The `clipboard` property can be set in two ways: + +- as a *boolean* value it enables or disables the `clipboard` module upon the component initialization +- as an *object* it enables the module and allows defining [modifier functions](grid/usage_clipboard.md/#using-formatter-functions) for data processing. The following properties are available: + - `copyModifier` - modifies data before copying to the clipboard. Accepts as parameters the cell value, the cell object, and the `cut` flag (set to `true`, if it's a cut operation) + - `cutModifier` - modifies the cell data before cutting (before clearing the cell). Accepts as parameters the cell value and the cell object + - `pasteModifier` - modifies data from the clipboard before pasting into a cell. Accepts as parameters the cell value and the cell object + +The example below demonstrates the clipboard configuration with all the modifiers in use: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true, // required for the clipboard module to function + clipboard: { + // adds a suffix based on the operation + copyModifier: (value, cell, cut) => `${value}${cut ? "-cut" : "-copied"}`, + cutModifier: (value, cell) => `${value}-removed`, // before cutting a value + pasteModifier: (value, cell) => value.replace("-copied", "") // removes the suffix on pasting + } +}); +~~~ + +**Related article:** [Clipboard](grid/configuration.md/#clipboard) + +@changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 39db3928f..187861e8e 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2573,9 +2573,88 @@ const grid = new dhx.Grid("grid_container", { For information on using the Block Selection API, read the [Work with Block Selection object](grid/usage_blockselection.md) guide. +## Clipboard + +The Grid configuration includes the `Clipboard` module that allows working with the clipboard functionality in the component. + +:::note +The module requires the `RangeSelection` module to be enabled via one of the configuration properties: `rangeSelection: true` or `blockSelection: { mode: "range" }`. +::: + +To enable the clipboard functionality within a grid, you should use the `Clipboard` module. To initialize the module, enable the [`clipboard`](grid/api/grid_clipboard_config.md) property in the Grid configuration. + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: { mode: "range" }, // required for Clipboard to function (initializes automatically) + clipboard: true // enables the Clipboard module +}); +~~~ + +The `clipboard` property can be set in two ways: + +- as a *boolean* value it enables or disables the `clipboard` module upon the component initialization +- as an *object* it enables the module and allows defining [modifier functions](grid/usage_clipboard.md/#using-formatter-functions) for data processing. The following properties are available: + - `copyModifier` - modifies data before copying to the clipboard. Accepts as parameters the cell value, the cell object, and the `cut` flag (set to `true`, if it's a cut operation) + - `cutModifier` - modifies the cell data before cutting (before clearing the cell). Accepts as parameters the cell value and the cell object + - `pasteModifier` - modifies data from the clipboard before pasting into a cell. Accepts as parameters the cell value and the cell object + +The example below demonstrates the clipboard configuration with all the modifiers in use: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true, // required for the Clipboard module to function + clipboard: { + // adds a suffix based on the operation + copyModifier: (value, cell, cut) => `${value}${cut ? "-cut" : "-copied"}`, + cutModifier: (value, cell) => `${value}-removed`, // before cutting a value + pasteModifier: (value, cell) => value.replace("-copied", "") // removes the suffix on data pasting + } +}); +~~~ + +For information on working with Clipboard, read the [Work with Clipboard module](grid/usage_clipboard.md) guide. + +### Interaction between Grids and external widgets + +The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. + +#### Integration with Google Spreadsheets + +Data from a grid can be copied to the clipboard and pasted directly into Google Spreadsheets. Similarly, data from Google Spreadsheets can be copied and pasted into the grid. Use `pasteModifier` to process data formats (e.g., converting strings to numbers). + +### Pasting from clipboard + +Data from the clipboard is pasted into the range defined by `rangeSelection`. The behavior depends on the size of the selected range and the number of copied elements: + +- **If the range is smaller than the copied elements**: all the copied elements will be pasted if there is enough space in the grid (i.e., sufficient rows and columns exist beyond the range's starting point). For example, if 4 cells (2 rows x 2 columns) are copied and the range is set to 1 row x 2 columns, the data will be fully pasted, expanding the range to 2 rows, if rows are available. + +- **If the range is larger than the copied elements**: the copied elements will repeat cyclically to fill the entire range. For example, if 2 cells ("A1", "A2") are copied and the range is 4 cells (2 rows x 2 columns), the result will be "A1", "A2", "A1", "A2". + +The repetition of elements follows the order of copying, starting from the first cell. + +### Recommendation for use with BlockSelection + +For convenient range selection via the UI, it is recommended to use the `BlockSelection` module with the `mode: "range"` setting. It allows users to visually select areas before copying or pasting. + ## Spans -The Grid component has the [spans](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. +The Grid component has the [`spans`](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. ~~~jsx const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/features.md b/docs/grid/features.md index 320b1bc84..2e0d3f7b8 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -304,6 +304,16 @@ In this section you will get to know how to work with the block selection functi | [Working with block selection](../usage_blockselection/) | Learn how to enable/disable block selection in Grid, check the main features of the BlockSelection module and explore how it interacts with other modules | | [BlockSelection API](../../category/blockselection-api/) | Learn how to use API of the BlockSelection module to manage the block selection within Grid | +## How to work with clipboard + +In this section you will get to know how to work with the clipboard functionality. + +| Topic | Description | +| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Configuring clipboard(../configuration/#clipboard) | Learn how to configure the Clipboard module within Grid | +| [Working with clipboard](../usage_clipboard/) | Learn how to enable the clipboard in Grid, check the main features and explore the peculiarities of using the Clipboard module | +| [Clipboard API](../../category/clipboard-api/) | Learn how to use API of the Clipboard module to manage the clipboard operations within Grid | + ## How to work with TreeGrid mode In this section you will find the ways of working with the TreeGrid mode of Grid. diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 930bdd3c2..96976e758 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -1208,7 +1208,9 @@ For information on using RangeSelection API, read [Work with RangeSelection Modu For information on using BlockSelection API, read [Work with BlockSelection module](grid/usage_blockselection.md). +## Working with Clipboard +For information on using the Clipboard module in Grid, read [Work with Clipboard module](grid/usage_clipboard.md). ## Working with Grid in the TreeGrid mode diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md new file mode 100644 index 000000000..253fecd6b --- /dev/null +++ b/docs/grid/usage_clipboard.md @@ -0,0 +1,189 @@ +--- +sidebar_label: Work with Clipboard module +title: JavaScript Grid - Work with Clipboard module +description: You can explore how to work with Clipboard module of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# Work with Clipboard module + +The `Clipboard` module provides functionality for interacting with the clipboard in the Grid component. It allows copying, cutting, and pasting data from a selected range of cells, as well as integrating with other grids or external applications like Google Spreadsheets. + +## Initializing the Clipboard module + +To initialize the `Clipboard` module, use the [`clipboard`](grid/api/grid_clipboard_config.md) property in the **dhx.Grid** component configuration. After the Grid component is created, the module is accessible through the `grid.clipboard` property. + +:::note +The module requires the [`RangeSelection`](grid/usage_rangeselection.md) module to be enabled and is best used in conjunction with the [`BlockSelection`](grid/usage_blockselection.md) module in the `"range"` mode for convenient range selection via the UI. +::: + +The `clipboard` property can be set: +- as a *boolean* value to enable/disable the `Clipboard` module upon the component initialization +- as an *object* to enable the module and define the [modifier functions](#using-formatter-functions) for data processing: `copyModifier`, `cutModifier` and `pasteModifier`. The example below demonstrates the clipboard configuration with all the modifiers in use: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true, // required for the Clipboard module to function + clipboard: { + // adds a suffix based on the operation + copyModifier: (value, cell, cut) => `${value}${cut ? "-cut" : "-copied"}`, + cutModifier: (value, cell) => `${value}-removed`, // before cutting a value + pasteModifier: (value, cell) => value.replace("-copied", "") // removes the suffix on pasting + } +}); +~~~ + +## Using the events of the Clipboard object + +To make the process of working with clipboard more flexible, you can apply the related events of the `clipboard` object: +[`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), +[`pasteError`](grid/api/clipboard/pasteerror_event.md) + +## Interaction with cell selection + +### Automatic activation of BlockSelection module + +When **Clipboard API** is enabled (e.g., via `grid.config.clipboard: true`), the **BlockSelection API** is automatically activated in the `range` mode unless another mode is specified. + +### Usage in other BlockSelection modes + +If the `BlockSelection` module is configured in the `manual` mode, the **Clipboard API** does not automatically receive a range. In this case, you should manually set the range using the **Range API**. For this purpose, you need to call + `grid.range.setRange({ xStart, xEnd, yStart, yEnd })`. + +:::note +Without a set range, copying and pasting will not work, as **Clipboard API** relies on data from the **Range API**. +::: + +### Data source for Clipboard + +The **Clipboard API** always uses data from the **Range API** to determine the cells that will be copied or into which data will be pasted. + +:::note +The `cut`/`paste` operations will be blocked in the [*grouping*](grid/usage.md/#grouping-data) mode. +::: + +## Interaction between Grids and external widgets + +### Columns with type "date" + +When copying cells with the column type `type: "date"`, the *formatted* value is copied to the clipboard (not the original string or date object). For example, if the data contains `"2025-04-11"` and the display format is set to `"dd/mm/yyyy"`, the copied value will be `"11/04/2025"`. This behavior simplifies working with dates in tables and other applications. + +When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value is checked for compliance with the column's `dateFormat` (e.g., `"dd/mm/yyyy"`) or whether it can be parsed as a valid `Date` object (e.g., `"2025-04-11"` or `"April 11, 2025"`). If the value is valid, it is converted to the grid's expected format and inserted. If invalid (e.g., `"abc"` or `"31 12 2025"`), the paste operation is ignored, and the cell's current value remains unchanged. + +### Columns with type "number" + +When copying cells with the column type `type: "number"`, the values are copied to the clipboard as numbers, even if `numberMask` or `patternMask` is applied. For example, if a cell displays `"1,234.56"` due to a mask, the copied value will be `1234.56`. This is done to maintain data purity and compatibility with other systems, such as spreadsheets or data processing software. + +When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value must be a valid number (e.g., `1234.56` or `"1,234.56"` after cleaning). If the value is not a number (e.g., `"abc"`), the paste operation is ignored, and the cell's current value remains unchanged. + +### Columns with type "string" + +If `patternMask` is applied to a cell (e.g., for formatting phone numbers or currency), the *formatted* value is copied to the clipboard. +For example, if the data contains `"1234567890"` and the mask is `"+# (###) ###-##-##"`, the copied value will be `"+1 (234) 567-89-0"`. This preserves readability for the end user. + +### Templates + +Templates applied to cell values (e.g., via the `template` property) are not included in the data during copying. This prevents unwanted HTML or formatted text from entering the clipboard, which could disrupt the functionality of external widgets or tables (e.g., Google Spreadsheets). Only the "raw" value from the data is copied. + +### Columns with editors "combobox", "multiselect", "select" + +If a column has `editorType: "combobox"`, `"multiselect"`, or `"select"`, the value stored in the data (typically an `id` or a key) is copied to the clipboard, not the displayed portion (e.g., the option text). + +For example, if the data contains `{ id: "1", value: "Option 1" }` and the cell displays `"Option 1"`, the copied value will be `"1"`. This ensures data consistency when transferring between systems. + +## Using formatter functions + +If you need a specific data format during copying or pasting, the default behavior can be modified using the formatter functions (`copyModifier`, `cutModifier`, `pasteModifier`). These functions provide flexible control over how data is processed before copying, cutting, or pasting, which is particularly useful in the scenarios described below. + +### Why formatters are needed + +- **Format control**: if the default behavior (e.g., copying numbers without a mask or `id` instead of text in a `combobox`) does not meet the requirements, formatters allow data to be transformed into the desired form. +- **Compatibility**: formatters help adapting data for specific external systems (e.g., preserving number masks or converting dates to a different format). +- **Customization**: you can add additional information (e.g., units of measurement) or remove unnecessary elements from the data. +- **Preprocessing before validation**: `pasteModifier` can preprocess data before it undergoes validation for `date`, `number`, or `boolean` types, ensuring compatibility with the grid's strict typing. + +### How to use formatters + +- **`copyModifier`** + - Applied before copying or cutting data to the clipboard. Allows overriding what is placed in the clipboard. + - Example: To copy the displayed text instead of the `id` for a `combobox`, you can use the cell object (`cell`) to retrieve the desired value. +- **`cutModifier`** + - Applied before cutting to modify the data that goes into the clipboard and leave the original cells in a desired state (e.g., not fully clearing them). + - Example: You can add a suffix to the cut value to indicate its origin. +- **`pasteModifier`** + - Applied before pasting data from the clipboard into cells. Allows transforming the incoming data into a format suitable for the grid, before validation for the `date`, `number`, or `boolean` types. + - Example: If the clipboard contains a formatted date (`"11/04/2025"`) but the data requires `"2025-04-11"`, `pasteModifier` can perform this conversion. + +### Examples + +**Numbers with a mask** + +This example demonstrates how to copy numbers while preserving the mask (e.g., `"1,234.56"` instead of `1234.56`). + +~~~jsx +copyModifier: (value, cell, cut) => { + if (cell.column.type === "number" && cell.column.numberMask) { + return new Intl.NumberFormat("en-US", { + minimumFractionDigits: 2 + }).format(value); + } + return value; +} +~~~ + +**Combobox with displayed text** + +This example shows how to copy the combobox option text (`"Option 1"`) instead of the `id` (`"1"`). + +~~~jsx +copyModifier: (value, cell, cut) => { + if (cell.column.editorType === "combobox") { + const options = cell.column.options; + const option = options.find(opt => opt.id === value); + return option ? option.value : value; + } + return value; +} +~~~ + +**Dates with validation** + +This example demonstrates how to transform a date from `"11/04/2025"` to `"2025-04-11"` during pasting and ensure it is valid. + +~~~jsx +pasteModifier: (value, cell) => { + if (cell.column.type === "date") { + const dateFormat = cell.column.dateFormat || "dd/mm/yyyy"; + const regex = /^(\d{2})\/(\d{2})\/(\d{4})$/; // for dd/mm/yyyy + const match = value.match(regex); + if (match) { + const date = new Date(`${match[3]}-${match[2]}-${match[1]}`); + if (!isNaN(date.getTime())) { + return `${match[3]}-${match[2]}-${match[1]}`; // ISO format + } + } + return value; // validation will handle invalid cases + } + return value; +} +~~~ + +**PatternMask during copying** + +This example shows how to remove mask formatting (e.g., copy `"1234567890"` instead of `"+1 (234) 567-89-0"`). + +~~~jsx +copyModifier: (value, cell, cut) => { + if (cell.column.patternMask) { + return value.replace(/[^0-9]/g, ""); // remove all non-numeric characters + } + return value; +} +~~~ \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 46e11fdae..683c38382 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2617,6 +2617,7 @@ module.exports = { "grid/api/grid_autowidth_config", "grid/api/grid_blockselection_config", "grid/api/grid_bottomsplit_config", + "grid/api/grid_clipboard_config", "grid/api/grid_closable_config", "grid/api/grid_collapsed_config", "grid/api/grid_columns_config", @@ -2879,6 +2880,25 @@ module.exports = { "grid/api/export/grid_xlsx_method" ], }, + { + type: "category", + label: "Clipboard events", + collapsed: true, + link: { + type: 'generated-index', + title: "Clipboard events", + keywords: ['clipboard events'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/clipboard/aftercopy_event", + "grid/api/clipboard/afterpaste_event", + "grid/api/clipboard/beforecopy_event", + "grid/api/clipboard/beforepaste_event", + "grid/api/clipboard/copyerror_event", + "grid/api/clipboard/pasteerror_event" + ], + }, ], }, "grid/features", @@ -2891,6 +2911,7 @@ module.exports = { "grid/usage_selection", "grid/usage_rangeselection", "grid/usage_blockselection", + "grid/usage_clipboard", "grid/customization", "grid/events", ], From 052395feca8ab7649ef4f6295d6d7b2187e555fb Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 4 Jun 2025 12:50:34 +0300 Subject: [PATCH 08/47] [update] guides for the clipboard module --- docs/grid/api/grid_clipboard_config.md | 1 - docs/grid/configuration.md | 17 ++++++------- docs/grid/usage_clipboard.md | 35 ++++++++++++++++++-------- docs/whatsnew.md | 2 ++ 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md index 27e50464f..d95b02669 100644 --- a/docs/grid/api/grid_clipboard_config.md +++ b/docs/grid/api/grid_clipboard_config.md @@ -61,7 +61,6 @@ const grid = new dhx.Grid("grid_container", { { id: "1", a: "A1", b: "B1" }, { id: "2", a: "A2", b: "B2" }, ], - rangeSelection: true, // required for the clipboard module to function clipboard: { // adds a suffix based on the operation copyModifier: (value, cell, cut) => `${value}${cut ? "-cut" : "-copied"}`, diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 187861e8e..e6bfdb5d8 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2575,14 +2575,16 @@ For information on using the Block Selection API, read the [Work with Block Sele ## Clipboard -The Grid configuration includes the `Clipboard` module that allows working with the clipboard functionality in the component. +The Grid component provides the [functionality for interacting with the clipboard](grid/usage_clipboard.md), such as copying, cutting, and pasting data from a selected range of cells, as well as integrating with other grids or external applications like Google Spreadsheets. + +To enable the clipboard functionality within a grid, you should use the `Clipboard` module. To initialize the module, enable the [`clipboard`](grid/api/grid_clipboard_config.md) property in the Grid configuration. + +The `Clipboard` module requires the [`RangeSelection`](#managing-range-selection-in-grid) module to be enabled. For convenient range selection via the UI, it is recommended to use the [`BlockSelection`](#managing-block-selection-in-grid) module with the `mode: "range"` setting. It allows users to visually select areas before copying or pasting. :::note -The module requires the `RangeSelection` module to be enabled via one of the configuration properties: `rangeSelection: true` or `blockSelection: { mode: "range" }`. +The `blockSelection: { mode: "range" }` property is initialized in the Grid configuration when the `Clipboard` module is enabled. ::: -To enable the clipboard functionality within a grid, you should use the `Clipboard` module. To initialize the module, enable the [`clipboard`](grid/api/grid_clipboard_config.md) property in the Grid configuration. - ~~~jsx const grid = new dhx.Grid("grid_container", { columns: [ @@ -2618,7 +2620,6 @@ const grid = new dhx.Grid("grid_container", { { id: "1", a: "A1", b: "B1" }, { id: "2", a: "A2", b: "B2" }, ], - rangeSelection: true, // required for the Clipboard module to function clipboard: { // adds a suffix based on the operation copyModifier: (value, cell, cut) => `${value}${cut ? "-cut" : "-copied"}`, @@ -2628,8 +2629,6 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -For information on working with Clipboard, read the [Work with Clipboard module](grid/usage_clipboard.md) guide. - ### Interaction between Grids and external widgets The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. @@ -2648,9 +2647,7 @@ Data from the clipboard is pasted into the range defined by `rangeSelection`. Th The repetition of elements follows the order of copying, starting from the first cell. -### Recommendation for use with BlockSelection - -For convenient range selection via the UI, it is recommended to use the `BlockSelection` module with the `mode: "range"` setting. It allows users to visually select areas before copying or pasting. +For information on working with Clipboard, read the [Work with Clipboard module](grid/usage_clipboard.md) guide. ## Spans diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md index 253fecd6b..f1ff051bf 100644 --- a/docs/grid/usage_clipboard.md +++ b/docs/grid/usage_clipboard.md @@ -6,14 +6,14 @@ description: You can explore how to work with Clipboard module of Grid in the do # Work with Clipboard module -The `Clipboard` module provides functionality for interacting with the clipboard in the Grid component. It allows copying, cutting, and pasting data from a selected range of cells, as well as integrating with other grids or external applications like Google Spreadsheets. +You can manage the clipboard functionality within a grid via the API of the [`Clipboard`](grid/configuration.md/#clipboard) module. It enables copying, cutting, and pasting data from a selected range of cells. Besides, it allows integrating with other grids or external applications like Google Spreadsheets. ## Initializing the Clipboard module To initialize the `Clipboard` module, use the [`clipboard`](grid/api/grid_clipboard_config.md) property in the **dhx.Grid** component configuration. After the Grid component is created, the module is accessible through the `grid.clipboard` property. :::note -The module requires the [`RangeSelection`](grid/usage_rangeselection.md) module to be enabled and is best used in conjunction with the [`BlockSelection`](grid/usage_blockselection.md) module in the `"range"` mode for convenient range selection via the UI. +The module requires the [`RangeSelection`](grid/usage_rangeselection.md) module to be enabled and is best used in conjunction with the [`BlockSelection`](grid/usage_blockselection.md) module in the `"range"` mode (enabled on initialization of the `Clipboard` module) for convenient range selection via the UI. ::: The `clipboard` property can be set: @@ -30,13 +30,7 @@ const grid = new dhx.Grid("grid_container", { { id: "1", a: "A1", b: "B1" }, { id: "2", a: "A2", b: "B2" }, ], - rangeSelection: true, // required for the Clipboard module to function - clipboard: { - // adds a suffix based on the operation - copyModifier: (value, cell, cut) => `${value}${cut ? "-cut" : "-copied"}`, - cutModifier: (value, cell) => `${value}-removed`, // before cutting a value - pasteModifier: (value, cell) => value.replace("-copied", "") // removes the suffix on pasting - } + clipboard: true }); ~~~ @@ -100,7 +94,28 @@ For example, if the data contains `{ id: "1", value: "Option 1" }` and the cell ## Using formatter functions -If you need a specific data format during copying or pasting, the default behavior can be modified using the formatter functions (`copyModifier`, `cutModifier`, `pasteModifier`). These functions provide flexible control over how data is processed before copying, cutting, or pasting, which is particularly useful in the scenarios described below. +If you need a specific data format during copying or pasting, the default behavior can be modified using the formatter functions (`copyModifier`, `cutModifier`, `pasteModifier`). Check the example below: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + clipboard: { + // adds a suffix based on the operation + copyModifier: (value, cell, cut) => `${value}${cut ? "-cut" : "-copied"}`, + cutModifier: (value, cell) => `${value}-removed`, // before cutting a value + pasteModifier: (value, cell) => value.replace("-copied", "") // removes the suffix on pasting + } +}); +~~~ + +These functions provide flexible control over how data is processed before copying, cutting, or pasting, which is particularly useful in the scenarios described below. ### Why formatters are needed diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 9d1ba4119..0675dd7c7 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -23,6 +23,8 @@ Released on June X, 2025 - new methods of the `block` object: `disable()`, `enable()`, `isDisabled()` - new events of the `block` object: `afterBlockHandleApply`, `afterBlockSelectionApply`, `afterBlockSelectionMove`, `beforeBlockHandleApply`, `beforeBlockSelectionApply`, `beforeBlockSelectionMove`, `blockHandleMouseDown`, `blockSelectionEnd`, `blockSelectionStart`, `blockSelectionValidate` - Grid. The Clipboard functionality is added (PRO version) + - new Grid configuration property: [`clipboard`](grid/api/grid_clipboard_config.md) + - new events of the `clipboard` object: [`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), [`pasteError`](grid/api/clipboard/pasteerror_event.md) - Grid. The drag and drop handle (panel) for rows is added - Grid. Undo/Redo functionality From eb30db8451dd4a350304796f6ce0c44241f8a152 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 4 Jun 2025 14:55:39 +0300 Subject: [PATCH 09/47] [update] what's new for v9.2 --- docs/whatsnew.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 0675dd7c7..fd362f2f5 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -16,13 +16,15 @@ Released on June X, 2025 ### New functionality -- Grid. The Range manager is added (PRO version) - - new methods of the `range` object: `disable()`, `enable()`, `getRange()`, `getRangedCells()`, `isDisabled()`, `isRanged()`, `resetRange()`, `setRange()` - - new events of the `range` object: `afterResetRange`, `afterSetRange`, `beforeResetRange`, `beforeSetRange` -- Grid. The BlockSelection manager is added (PRO version) - - new methods of the `block` object: `disable()`, `enable()`, `isDisabled()` - - new events of the `block` object: `afterBlockHandleApply`, `afterBlockSelectionApply`, `afterBlockSelectionMove`, `beforeBlockHandleApply`, `beforeBlockSelectionApply`, `beforeBlockSelectionMove`, `blockHandleMouseDown`, `blockSelectionEnd`, `blockSelectionStart`, `blockSelectionValidate` -- Grid. The Clipboard functionality is added (PRO version) +- Grid. The `RangeSelection` manager is added (PRO version) + - new Grid configuration property: [`rangeSelection`](grid/api/grid_rangeselection_config.md) + - new methods of the `range` object: [`disable()`](grid/api/rangeselection/disable_method.md), [`enable()`](grid/api/rangeselection/enable_method.md), [`getRange()`](grid/api/rangeselection/getrange_method.md), [`getRangedCells()`](grid/api/rangeselection/getrangedcells_method.md), [`isDisabled()`](grid/api/rangeselection/isdisabled_method.md), [`isRanged()`](grid/api/rangeselection/isranged_method.md), [`resetRange()`](grid/api/rangeselection/resetrange_method.md), [`setRange()`](grid/api/rangeselection/setrange_method.md) + - new events of the `range` object: [`afterResetRange`](grid/api/rangeselection/afterresetrange_event.md), [`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md), [`beforeResetRange`](grid/api/rangeselection/beforeresetrange_event.md), [`beforeSetRange`](grid/api/rangeselection/beforesetrange_event.md) +- Grid. The `BlockSelection` manager is added (PRO version) + - new Grid configuration property: [`blockSelection`](grid/api/grid_blockselection_config.md) + - new methods of the `block` object: [`disable()`](grid/api/blockselection/disable_method.md), [`enable()`](grid/api/blockselection/enable_method.md), [`isDisabled()`](grid/api/blockselection/isdisabled_method.md) + - new events of the `block` object: [`afterBlockHandleApply`](grid/api/blockselection/afterblockhandleapply_event.md), [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md), [`afterBlockSelectionMove`](grid/api/blockselection/afterblockselectionmove_event.md), [`beforeBlockHandleApply`](grid/api/blockselection/beforeblockhandleapply_event.md), [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md), [`beforeBlockSelectionMove`](grid/api/blockselection/beforeblockselectionmove_event.md), [`blockHandleMouseDown`](grid/api/blockselection/blockhandlemousedown_event.md), [`blockSelectionEnd`](grid/api/blockselection/blockselectionend_event.md), [`blockSelectionStart`](grid/api/blockselection/blockselectionstart_event.md), [`blockSelectionValidate`](grid/api/blockselection/blockselectionvalidate_event.md) +- Grid. The `Clipboard` module is added (PRO version) - new Grid configuration property: [`clipboard`](grid/api/grid_clipboard_config.md) - new events of the `clipboard` object: [`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), [`pasteError`](grid/api/clipboard/pasteerror_event.md) - Grid. The drag and drop handle (panel) for rows is added @@ -33,10 +35,11 @@ Released on June X, 2025 - Context Menu. The `navigationType:"click"` is added - Grid. The drag-n-drop functionality is improved (The DropManager is added) - Grid. Updating / improving the export to Excel module +- Grid. The possibility to clear data while editing a cell by using the `Delete` shortcut key is added ### Fixes -- DragManager. Incorrect detection of elements' drop location during drag-n-drop and other (Grid component) (?): +- DragManager. Incorrect detection of elements' drop location during drag-n-drop and other (Grid component): - Solving the problem of incorrectly determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode; - Solving the problem when moving a line to the header/footer area; - Solving the problem of determining the position for dropping above the first element; From 8347ca31bef26d7923a6661ea8f883c23e34b0fb Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 5 Jun 2025 16:00:15 +0300 Subject: [PATCH 10/47] [add] initial docs for grid drag panel module --- docs/grid/api/api_overview.md | 13 +++ .../api/dragpanel/dragpanelitemclick_event.md | 43 ++++++++++ .../dragpanel/dragpanelitemmousedown_event.md | 43 ++++++++++ docs/grid/api/grid_dragpanel_config.md | 86 +++++++++++++++++++ docs/grid/configuration.md | 60 +++++++++++++ docs/grid/usage_dragpanel.md | 38 ++++++++ sidebars.js | 19 +++- 7 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 docs/grid/api/dragpanel/dragpanelitemclick_event.md create mode 100644 docs/grid/api/dragpanel/dragpanelitemmousedown_event.md create mode 100644 docs/grid/api/grid_dragpanel_config.md create mode 100644 docs/grid/usage_dragpanel.md diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index 2835f3ef4..b0e0aa249 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -171,6 +171,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX - Apply [the events of RangeSelection](grid/api/api_overview.md#rangeselection-events) to handle the range selection within Grid. - Apply [the events of BlockSelection](grid/api/api_overview.md#blockselection-events) to handle the block selection within Grid. - Use [the events of Clipboard](grid/api/api_overview.md#clipboard-events) to work with clipboard within Grid. +- Use [the events of DragPanel](grid/api/api_overview.md#dragpanel-events) to work with drag panel within Grid. - Use [the events of TreeCollection](tree_collection.md#events) to work with data of Grid in the TreeGrid mode. ::: @@ -194,6 +195,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX | [](grid/api/grid_dragexpand_config.md) | @getshort(grid/api/grid_dragexpand_config.md) | | [](grid/api/grid_dragitem_config.md) | @getshort(grid/api/grid_dragitem_config.md) | | [](grid/api/grid_dragmode_config.md) | @getshort(grid/api/grid_dragmode_config.md) | +| [](grid/api/grid_dragpanel_config.md) | @getshort(grid/api/grid_dragpanel_config.md) | | [](grid/api/grid_editable_config.md) | @getshort(grid/api/grid_editable_config.md) | | [](grid/api/grid_eventhandlers_config.md) | @getshort(grid/api/grid_eventhandlers_config.md) | | [](grid/api/grid_exportstyles_config.md) | @getshort(grid/api/grid_exportstyles_config.md) | @@ -329,3 +331,14 @@ You will find the list of all the available configuration properties of a Grid c | [](grid/api/clipboard/beforepaste_event.md)| @getshort(grid/api/clipboard/beforepaste_event.md)| | [](grid/api/clipboard/copyerror_event.md) | @getshort(grid/api/clipboard/copyerror_event.md) | | [](grid/api/clipboard/pasteerror_event.md) | @getshort(grid/api/clipboard/pasteerror_event.md) | + +## DragPanel API + +### DragPanel events + +| Name | Description | +| ----------------------------------------------------- | ------------------------------------------------------------- | +| [](grid/api/dragpanel/dragpanelitemclick_event.md) | @getshort(grid/api/dragpanel/dragpanelitemclick_event.md) | +| [](grid/api/dragpanel/dragpanelitemmousedown_event.md)| @getshort(grid/api/dragpanel/dragpanelitemmousedown_event.md) | + + diff --git a/docs/grid/api/dragpanel/dragpanelitemclick_event.md b/docs/grid/api/dragpanel/dragpanelitemclick_event.md new file mode 100644 index 000000000..eb2d9a5d4 --- /dev/null +++ b/docs/grid/api/dragpanel/dragpanelitemclick_event.md @@ -0,0 +1,43 @@ +--- +sidebar_label: dragPanelItemClick +title: JavaScript Grid - dragPanelItemClick Event +description: You can explore the dragPanelItemClick event of Grid drag panel in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# dragPanelItemClick + +@short: triggered when the drag panel item is clicked + +### Usage + +~~~jsx +dragPanelItemClick: (id: string, event: MouseEvent | TouchEvent) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `id` - the ID of the row associated with the drag panel item +- `event` - a browser event: `MouseEvent` or `TouchEvent` + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragPanel: true +}); + +grid.events.on("dragPanelItemClick", (id, event) => { + console.log(`Drag panel clicked for row ID: ${id}`); +}); + +@descr: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md b/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md new file mode 100644 index 000000000..ac8ba12c9 --- /dev/null +++ b/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md @@ -0,0 +1,43 @@ +--- +sidebar_label: dragPanelItemMouseDown +title: JavaScript Grid - dragPanelItemMouseDown Event +description: You can explore the dragPanelItemMouseDown event of Grid drag panel in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# dragPanelItemMouseDown + +@short: triggered when the mouse button is pressed on the drag panel item + +### Usage + +~~~jsx +dragPanelItemMouseDown: (id: string, event: MouseEvent | TouchEvent) => void; +~~~ + +@params: +The callback of the event is called with the following parameters: + +- `id` - the ID of the row associated with the drag panel item +- `event` - a browser event: `MouseEvent` or `TouchEvent` + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragPanel: true +}); + +grid.events.on("dragPanelItemMouseDown", (id, event) => { + console.log(`Mouse down on drag panel for row ID: ${id}`); +}); + +@descr: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_dragpanel_config.md b/docs/grid/api/grid_dragpanel_config.md new file mode 100644 index 000000000..814467f7d --- /dev/null +++ b/docs/grid/api/grid_dragpanel_config.md @@ -0,0 +1,86 @@ +--- +sidebar_label: dragPanel +title: JavaScript Grid - dragPanel Config +description: You can explore the dragPanel config of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# dragPanel + +@short: Optional. Enables/disables the dragPanel module within a grid + +### Usage + +~~~jsx +dragPanel?: + | boolean + | { + css?: string; + icon?: string; + width?: number; + }; +~~~ + +@default: false + +:::note +The module is automatically enabled, if the row Drag-and-Drop is active (e.g., `dragItem: "row"` or `dragItem: "both"`), and either the `BlockSelection` or `Clipboard` modules are enabled. +::: + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragItem: "both", // enables row Drag-and-Drop + blockSelection: true, // triggers the `DragPanel` activation, when `dragItem` is enabled + // or + dragPanel: true // enables the `DragPanel` module +}); + +@descr: + +The `dragPanel` property can be set in two ways: + +- as a *boolean* value it enables or disables the `dragPanel` module upon the component initialization +- as an *object* it enables the module and allows defining additional configuration during initialization: + - `css` - specifies a custom CSS class for styling the drag panel + - `icon` - defines a custom icon for the drag handle + - `width` - sets the width of the drag panel in pixels + +The following example demonstrates configuring the `DragPanel` module with custom styling and width: + +~~~html + + + +~~~ + +**Related article:** [Using the DragPanel module](grid/configuration.md/#using-the-dragpanel-module) + +@changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index e6bfdb5d8..9043be1ce 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2181,6 +2181,66 @@ const grid = new dhx.Grid("grid", { }); ~~~ +### Using the DragPanel module + +The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the appearance of the drag panel that appears when the drag-n-drop functionality is activated. + +To initialize the `DragPanel` module, enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration. The module is automatically enabled if the [row Drag-and-Drop](grid/configuration.md/#drag-n-drop) is active (e.g., `dragItem: "row"` or `dragItem: "both"`) and either the `BlockSelection` or `Clipboard` modules are enabled. + +This example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragItem: "row", // enables row Drag-and-Drop + blockSelection: true, // triggers DragPanel activation +}); +~~~ + +The `dragPanel` property can be set in two ways: + +- as a *boolean* value it enables or disables the range selection module upon the component initialization +- as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: + - `css` - specifies a custom CSS class for styling the drag panel + - `icon` - defines a custom icon for the drag handle + - `width` - sets the width of the drag panel in pixels + +The following example demonstrates configuring the `DragPanel` module with custom styling and width: + +~~~html + + + +~~~ + ## Keyboard Navigation DHTMLX Grid provides the keyboard navigation that will help you manipulate your grid faster. diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md new file mode 100644 index 000000000..7afa76910 --- /dev/null +++ b/docs/grid/usage_dragpanel.md @@ -0,0 +1,38 @@ +--- +sidebar_label: Work with DragPanel module +title: JavaScript Grid - Work with DragPanel module +description: You can explore how to work with DragPanel module of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# Work with DragPanel module + +The `DragPanel` module provides auxiliary functionality for moving rows in the dhx.Grid component. It is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled (e.g., via `dragItem: "both"`) and conflicting configurations, such as the `BlockSelection` or `Clipboard` modules, are used. + +The module supports customization through configuration options to adjust its appearance and behavior. + +## Initializing the DragPanel module + +The `DragPanel` module is initialized via the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the configuration of the dhx.Grid component. The module is also automatically activated if: + +- The row Drag-and-Drop is enabled via `dragItem: "row"` or `dragItem: "both"` +- The `BlockSelection` or `Clipboard` modules are enabled + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragItem: "both", // enables row Drag-and-Drop + blockSelection: true, // triggers `DragPanel` activation when `dragItem` is enabled + // or + dragPanel: true // enables the `DragPanel` module +}); +~~~ + +## Using the events of the dragPanel object + diff --git a/sidebars.js b/sidebars.js index 683c38382..b6a84ce3b 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2627,6 +2627,7 @@ module.exports = { "grid/api/grid_dragexpand_config", "grid/api/grid_dragitem_config", "grid/api/grid_dragmode_config", + "grid/api/grid_dragpanel_config", "grid/api/grid_editable_config", "grid/api/grid_eventhandlers_config", "grid/api/grid_exportstyles_config", @@ -2899,6 +2900,21 @@ module.exports = { "grid/api/clipboard/pasteerror_event" ], }, + { + type: "category", + label: "DragPanel events", + collapsed: true, + link: { + type: 'generated-index', + title: "DragPanel events", + keywords: ['drag panel events'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/dragpanel/dragpanelitemclick_event", + "grid/api/dragpanel/dragpanelitemmousedown_event" + ], + }, ], }, "grid/features", @@ -2912,8 +2928,9 @@ module.exports = { "grid/usage_rangeselection", "grid/usage_blockselection", "grid/usage_clipboard", + "grid/usage_dragpanel", "grid/customization", - "grid/events", + "grid/events" ], }, // end Grid From b6b13714e46041d1a9b754bdc0b37356b3977c08 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 5 Jun 2025 17:39:46 +0300 Subject: [PATCH 11/47] [update] grid drag panel guides --- docs/grid/api/grid_dragpanel_config.md | 8 ++++++-- docs/grid/configuration.md | 6 +++++- docs/grid/usage_dragpanel.md | 14 +++++++++++--- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/grid/api/grid_dragpanel_config.md b/docs/grid/api/grid_dragpanel_config.md index 814467f7d..baa1d0ca7 100644 --- a/docs/grid/api/grid_dragpanel_config.md +++ b/docs/grid/api/grid_dragpanel_config.md @@ -6,7 +6,11 @@ description: You can explore the dragPanel config of Grid in the documentation o # dragPanel -@short: Optional. Enables/disables the dragPanel module within a grid +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +@short: Optional. Enables/disables the [`dragPanel`](grid/usage_dragpanel.md) module within a grid ### Usage @@ -23,7 +27,7 @@ dragPanel?: @default: false :::note -The module is automatically enabled, if the row Drag-and-Drop is active (e.g., `dragItem: "row"` or `dragItem: "both"`), and either the `BlockSelection` or `Clipboard` modules are enabled. +The module is automatically enabled, if the row Drag-and-Drop is active (e.g., `dragItem: "row"` or `dragItem: "both"`), and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. ::: @example: diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 9043be1ce..bb294a722 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2183,9 +2183,13 @@ const grid = new dhx.Grid("grid", { ### Using the DragPanel module +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the appearance of the drag panel that appears when the drag-n-drop functionality is activated. -To initialize the `DragPanel` module, enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration. The module is automatically enabled if the [row Drag-and-Drop](grid/configuration.md/#drag-n-drop) is active (e.g., `dragItem: "row"` or `dragItem: "both"`) and either the `BlockSelection` or `Clipboard` modules are enabled. +To initialize the `DragPanel` module, enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration. The module is automatically enabled if the [row Drag-and-Drop](grid/configuration.md/#drag-n-drop) is active (e.g., `dragItem: "row"` or `dragItem: "both"`) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. This example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index 7afa76910..40d8c8fb3 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -6,7 +6,11 @@ description: You can explore how to work with DragPanel module of Grid in the do # Work with DragPanel module -The `DragPanel` module provides auxiliary functionality for moving rows in the dhx.Grid component. It is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled (e.g., via `dragItem: "both"`) and conflicting configurations, such as the `BlockSelection` or `Clipboard` modules, are used. +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +The `DragPanel` module provides auxiliary functionality for moving rows in the dhx.Grid component. It is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled (e.g., via `dragItem: "both"`) and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. The module supports customization through configuration options to adjust its appearance and behavior. @@ -15,7 +19,7 @@ The module supports customization through configuration options to adjust its ap The `DragPanel` module is initialized via the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the configuration of the dhx.Grid component. The module is also automatically activated if: - The row Drag-and-Drop is enabled via `dragItem: "row"` or `dragItem: "both"` -- The `BlockSelection` or `Clipboard` modules are enabled +- The [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) are enabled ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -34,5 +38,9 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -## Using the events of the dragPanel object +## Using the events of the DragPanel module + +To make the process of working with the drag panel more flexible, you can apply the related events of the `DragPanel` module: +- [`dragPanelItemClick`](grid/api/dragpanel/dragpanelitemclick_event.md) +- [`dragPanelItemMouseDown`](grid/api/dragpanel/dragpanelitemmousedown_event.md) \ No newline at end of file From a66b6dd3f13bb609b3a2fafa6c667877d6038f4c Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 6 Jun 2025 13:39:14 +0300 Subject: [PATCH 12/47] [update] grid drag panel guides --- docs/grid/features.md | 1 + docs/grid/usage_dragpanel.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/grid/features.md b/docs/grid/features.md index 2e0d3f7b8..14e306c4c 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -124,6 +124,7 @@ In this section you will get to know how to configure the drag-n-drop functional | [Drag-n-drop between grids](../configuration/#drag-n-drop-between-grids) | Learn how to configure drag-n-drop between grids ([Example](https://snippet.dhtmlx.com/qx9a86ax)) | | [Drag-n-drop of multiple rows](grid/configuration.md#drag-n-drop-of-multiple-rows) | Learn how to allow end users to drag-n-drop several rows at once | | [Copying of rows during drag-n-drop](../api/grid_dragcopy_config/) | Learn how to copy a row to a target during drag-n-drop ([Example](https://snippet.dhtmlx.com/23slivyz)) | +| [Using the DragPanel module](../usage_dragpanel/) | Learn how to use the DragPanel module that provides additional functionality for moving rows in the Grid | ## How to render custom statistics in the column header/footer and in the spans diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index 40d8c8fb3..b2de56b71 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -38,6 +38,8 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +Learn about configuration possibilities of the drag panel in the [Configuration](grid/configuration.md/#using-the-dragpanel-module) guide. + ## Using the events of the DragPanel module To make the process of working with the drag panel more flexible, you can apply the related events of the `DragPanel` module: From a9c49dad30f9eecaf449bca8855022a449bf199c Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 9 Jun 2025 17:50:26 +0300 Subject: [PATCH 13/47] [add] drafts for grid history module api pages --- docs/grid/api/api_overview.md | 37 +++++++++++ docs/grid/api/grid_history_config.md | 67 ++++++++++++++++++++ docs/grid/api/history/add_method.md | 72 ++++++++++++++++++++++ docs/grid/api/history/afteradd_event.md | 40 ++++++++++++ docs/grid/api/history/afterredo_event.md | 40 ++++++++++++ docs/grid/api/history/afterundo_event.md | 40 ++++++++++++ docs/grid/api/history/beforeadd_event.md | 46 ++++++++++++++ docs/grid/api/history/beforeredo_event.md | 46 ++++++++++++++ docs/grid/api/history/beforeundo_event.md | 46 ++++++++++++++ docs/grid/api/history/canredo_method.md | 51 +++++++++++++++ docs/grid/api/history/canundo_method.md | 49 +++++++++++++++ docs/grid/api/history/disable_method.md | 51 +++++++++++++++ docs/grid/api/history/enable_method.md | 48 +++++++++++++++ docs/grid/api/history/error_event.md | 45 ++++++++++++++ docs/grid/api/history/gethistory_method.md | 55 +++++++++++++++++ docs/grid/api/history/isdisabled_method.md | 42 +++++++++++++ docs/grid/api/history/redo_method.md | 51 +++++++++++++++ docs/grid/api/history/remove_method.md | 52 ++++++++++++++++ docs/grid/api/history/removeall_method.md | 52 ++++++++++++++++ docs/grid/api/history/undo_method.md | 52 ++++++++++++++++ sidebars.js | 53 ++++++++++++++++ 21 files changed, 1035 insertions(+) create mode 100644 docs/grid/api/grid_history_config.md create mode 100644 docs/grid/api/history/add_method.md create mode 100644 docs/grid/api/history/afteradd_event.md create mode 100644 docs/grid/api/history/afterredo_event.md create mode 100644 docs/grid/api/history/afterundo_event.md create mode 100644 docs/grid/api/history/beforeadd_event.md create mode 100644 docs/grid/api/history/beforeredo_event.md create mode 100644 docs/grid/api/history/beforeundo_event.md create mode 100644 docs/grid/api/history/canredo_method.md create mode 100644 docs/grid/api/history/canundo_method.md create mode 100644 docs/grid/api/history/disable_method.md create mode 100644 docs/grid/api/history/enable_method.md create mode 100644 docs/grid/api/history/error_event.md create mode 100644 docs/grid/api/history/gethistory_method.md create mode 100644 docs/grid/api/history/isdisabled_method.md create mode 100644 docs/grid/api/history/redo_method.md create mode 100644 docs/grid/api/history/remove_method.md create mode 100644 docs/grid/api/history/removeall_method.md create mode 100644 docs/grid/api/history/undo_method.md diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index 2835f3ef4..48a9f4bbd 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -47,6 +47,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX - Apply [the methods of RangeSelection](grid/api/api_overview.md#rangeselection-methods) to manage the range selection within Grid. - Apply [the methods of BlockSelection](grid/api/api_overview.md#blockselection-methods) to manage the block selection within Grid. - Use [the methods of Export](grid/api/api_overview.md#export-methods) to work with data export within Grid. +- Use [the methods of History](grid/api/api_overview.md#history-methods) to manage the history of actions within Grid. - Use [the methods of TreeCollection](tree_collection.md#methods) to work with data of Grid in the TreeGrid mode. ::: @@ -171,6 +172,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX - Apply [the events of RangeSelection](grid/api/api_overview.md#rangeselection-events) to handle the range selection within Grid. - Apply [the events of BlockSelection](grid/api/api_overview.md#blockselection-events) to handle the block selection within Grid. - Use [the events of Clipboard](grid/api/api_overview.md#clipboard-events) to work with clipboard within Grid. +- Use [the events of History](grid/api/api_overview.md#history-events) to work with the history of actions within Grid. - Use [the events of TreeCollection](tree_collection.md#events) to work with data of Grid in the TreeGrid mode. ::: @@ -206,6 +208,7 @@ description: You can explore the API of Grid in the documentation of the DHTMLX | [](grid/api/grid_headerrowheight_config.md) | @getshort(grid/api/grid_headerrowheight_config.md) | | [](grid/api/grid_headertooltip_config.md) | @getshort(grid/api/grid_headertooltip_config.md) | | [](grid/api/grid_height_config.md) | @getshort(grid/api/grid_height_config.md) | +| [](grid/api/grid_history_config.md) | @getshort(grid/api/grid_history_config.md) | | [](grid/api/grid_htmlenable_config.md) | @getshort(grid/api/grid_htmlenable_config.md) | | [](grid/api/grid_keynavigation_config.md) | @getshort(grid/api/grid_keynavigation_config.md) | | [](grid/api/grid_leftsplit_config.md) | @getshort(grid/api/grid_leftsplit_config.md) | @@ -329,3 +332,37 @@ You will find the list of all the available configuration properties of a Grid c | [](grid/api/clipboard/beforepaste_event.md)| @getshort(grid/api/clipboard/beforepaste_event.md)| | [](grid/api/clipboard/copyerror_event.md) | @getshort(grid/api/clipboard/copyerror_event.md) | | [](grid/api/clipboard/pasteerror_event.md) | @getshort(grid/api/clipboard/pasteerror_event.md) | + + +## History API + +### History methods + +| Name | Description | +| ----------------------------------------------------- | ------------------------------------------------------------ | +| [](grid/api/history/add_method.md) | @getshort(grid/api/history/add_method.md) | +| [](grid/api/history/canredo_method.md) | @getshort(grid/api/history/canredo_method.md) | +| [](grid/api/history/canundo_method.md) | @getshort(grid/api/history/canundo_method.md) | +| [](grid/api/history/disable_method.md) | @getshort(grid/api/history/disable_method.md) | +| [](grid/api/history/enable_method.md) | @getshort(grid/api/history/enable_method.md) | +| [](grid/api/history/gethistory_method.md) | @getshort(grid/api/history/gethistory_method.md) | +| [](grid/api/history/isdisabled_method.md) | @getshort(grid/api/history/isdisabled_method.md) | +| [](grid/api/history/redo_method.md) | @getshort(grid/api/history/redo_method.md) | +| [](grid/api/history/remove_method.md) | @getshort(grid/api/history/remove_method.md) | +| [](grid/api/history/removeall_method.md) | @getshort(grid/api/history/removeall_method.md) | +| [](grid/api/history/undo_method.md) | @getshort(grid/api/history/undo_method.md) | + + +### History events + +| Name | Description | +| ----------------------------------------------------- | ------------------------------------------------------------ | +| [](grid/api/history/afteradd_event.md) | @getshort(grid/api/history/afteradd_event.md) | +| [](grid/api/history/afterredo_event.md) | @getshort(grid/api/history/afterredo_event.md) | +| [](grid/api/history/afterundo_event.md) | @getshort(grid/api/history/afterundo_event.md) | +| [](grid/api/history/beforeadd_event.md) | @getshort(grid/api/history/beforeadd_event.md) | +| [](grid/api/history/beforeredo_event.md) | @getshort(grid/api/history/beforeredo_event.md) | +| [](grid/api/history/beforeundo_event.md) | @getshort(grid/api/history/beforeundo_event.md) | +| [](grid/api/history/error_event.md) | @getshort(grid/api/history/error_event.md) | + + diff --git a/docs/grid/api/grid_history_config.md b/docs/grid/api/grid_history_config.md new file mode 100644 index 000000000..f75967c36 --- /dev/null +++ b/docs/grid/api/grid_history_config.md @@ -0,0 +1,67 @@ +--- +sidebar_label: history +title: JavaScript Grid - history Config +description: You can explore the history config of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# history + +@short: Optional. Enables/disables the `History` module during the Grid initialization + +### Usage + +~~~jsx +history?: + | boolean + | { + limit?: number; + disabled?: boolean; + }; +~~~ + +@default: false + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + history: true // enables the History module +}); + +@descr: +The `history` property can be set in two ways: +- as a *boolean* value it enables or disables the `History` module upon the component initialization +- as an *object* it enables the module and allows setting additional parameters: + - `limit` - the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed + - `disabled` - if `true`, the module is disabled on initialization, and no actions are recorded in the history + +The example below demonstrates configuring the module with a history limit of 10 actions. The module is disabled on initialization: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + history: { + limit: 10, // limits history to 10 actions + disabled: true // module is disabled on start + } +}); + +grid.history.enable(); // enabling the module +~~~ + +**Related article:** + +@changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/add_method.md b/docs/grid/api/history/add_method.md new file mode 100644 index 000000000..0ed512808 --- /dev/null +++ b/docs/grid/api/history/add_method.md @@ -0,0 +1,72 @@ +--- +sidebar_label: add() +title: JavaScript Grid - add Method +description: You can explore the add method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# add() + +@short: adds a new action to the history + +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; + timestamp?: number; +} + +add(action: IAction): void; +~~~ + +@params: + +- `action: IAction` - the action object containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) + +:::note +The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing for a `change` action, the `error` event is triggered. The `timestamp` field is automatically added if not specified. +::: + +@example: +// The example shows adding a new row via `DataCollection` with an explicitly specified timestamp +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding a new row via DataCollection +const newItem = { id: "2", name: "New Item", value: 20 }; +grid.data.add(newItem); + +// recording the action in the history with a timestamp +grid.history.add({ + type: "add", + batch: [{ ...newItem }], +}); + +// checking the history +const history = grid.history.getHistory(); +console.log(history.length); // ->1 + +@descr: + +**Related article**: + +**Related API**: [`getHistory()`](grid/api/history/gethistory_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/afteradd_event.md b/docs/grid/api/history/afteradd_event.md new file mode 100644 index 000000000..14c85e5a9 --- /dev/null +++ b/docs/grid/api/history/afteradd_event.md @@ -0,0 +1,40 @@ +--- +sidebar_label: afterAdd +title: JavaScript Grid - afterAdd Event +description: You can explore the afterAdd event of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterAdd + +@short: triggered before adding an action to the history + +@signature: {'afterAdd: (action: IAction) => void;'} + +@params: +The callback of the event is called with the following parameters: +- `action` - the object of the added action. + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.events.on("afterAdd", (action) => { + console.log("Action added to history:", action.type); +}); + +@descr: + +**Related article**: + +**Related API**: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/afterredo_event.md b/docs/grid/api/history/afterredo_event.md new file mode 100644 index 000000000..4658354ca --- /dev/null +++ b/docs/grid/api/history/afterredo_event.md @@ -0,0 +1,40 @@ +--- +sidebar_label: afterRedo +title: JavaScript Grid - afterRedo Event +description: You can explore the afterRedo event of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterRedo + +@short: triggered after successfully redoing an action + +@signature: {'afterRedo: (action: IAction) => void;'} + +@params: +The callback of the event is called with the following parameters: +- `action` - the object of the executed action. + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.events.on("afterRedo", (action) => { + console.log("Action redone:", action.type); +}); + +@descr: + +**Related article**: + +**Related API**: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/afterundo_event.md b/docs/grid/api/history/afterundo_event.md new file mode 100644 index 000000000..aade72902 --- /dev/null +++ b/docs/grid/api/history/afterundo_event.md @@ -0,0 +1,40 @@ +--- +sidebar_label: afterUndo +title: JavaScript Grid - afterUndo Event +description: You can explore the afterUndo event of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# afterUndo + +@short: triggered after successfully undoing an action + +@signature: {'afterUndo: (action: IAction) => void;'} + +@params: +The callback of the event is called with the following parameters: +- `action` - the object of the executed action. + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.events.on("afterUndo", (action) => { + console.log("Action undone:", action.type); +}); + +@descr: + +**Related article**: + +**Related API**: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/beforeadd_event.md b/docs/grid/api/history/beforeadd_event.md new file mode 100644 index 000000000..4a3f55cc3 --- /dev/null +++ b/docs/grid/api/history/beforeadd_event.md @@ -0,0 +1,46 @@ +--- +sidebar_label: beforeAdd +title: JavaScript Grid - beforeAdd Event +description: You can explore the beforeAdd event of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeAdd + +@short: triggered before adding an action to the history + +@signature: {'beforeAdd: (action: IAction) => boolean | void;'} + +@params: +The callback of the event is called with the following parameters: +- `action` - the action object to be added. + +@returns: +Returning `false` cancels the addition. + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.events.on("beforeAdd", (action) => { + if (action.type === "add") { + console.log("Adding a new row is prohibited"); + return false; + } +}); + +@descr: + +**Related article**: + +**Related API**: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/beforeredo_event.md b/docs/grid/api/history/beforeredo_event.md new file mode 100644 index 000000000..962d4fc71 --- /dev/null +++ b/docs/grid/api/history/beforeredo_event.md @@ -0,0 +1,46 @@ +--- +sidebar_label: beforeRedo +title: JavaScript Grid - beforeRedo Event +description: You can explore the beforeRedo event of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeRedo + +@short: triggered before redoing an action + +@signature: {'beforeRedo: (action: IAction) => boolean | void;'} + +@params: +The callback of the event is called with the following parameters: +- `action` - the action object from the redo stack. + +@returns: +Returning `false` cancels the operation. + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.events.on("beforeRedo", (action) => { + if (action.type === "remove") { + console.log("Redoing removal is prohibited"); + return false; + } +}); + +@descr: + +**Related article**: + +**Related API**: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/beforeundo_event.md b/docs/grid/api/history/beforeundo_event.md new file mode 100644 index 000000000..8c8505969 --- /dev/null +++ b/docs/grid/api/history/beforeundo_event.md @@ -0,0 +1,46 @@ +--- +sidebar_label: beforeUndo +title: JavaScript Grid - beforeUndo Event +description: You can explore the beforeUndo event of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# beforeUndo + +@short: triggered before undoing an action + +@signature: {'beforeUndo: (action: IAction) => boolean | void;'} + +@params: +The callback of the event is called with the following parameters: +- `action` - the action object containing the type (`type`), an array of rows (`batch`), and the inverse action (`inverse`), if applicable. + +@returns: +Returning `false` cancels the operation. + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.events.on("beforeUndo", (action) => { + if (action.type === "change") { + console.log("Undoing change is prohibited"); + return false; + } +}); + +@descr: + +**Related article**: + +**Related API**: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/canredo_method.md b/docs/grid/api/history/canredo_method.md new file mode 100644 index 000000000..67a25ee58 --- /dev/null +++ b/docs/grid/api/history/canredo_method.md @@ -0,0 +1,51 @@ +--- +sidebar_label: canRedo() +title: JavaScript Grid - canRedo Method +description: You can explore the canRedo method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# canRedo() + +@short: checks whether an action can be redone + +@signature: {'canRedo(): boolean;'} + +@returns: Returns `true` if the redo stack contains actions and the module is not disabled. + +@example: +// The example shows checking whether redo is possible after undoing +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// modifying data +const updatedItem = { id: "1", name: "Updated Item", value: 15 }; +grid.data.update("1", updatedItem); +grid.history.add({ + type: "change", + batch: [{ ...updatedItem }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); + +// undoing and checking +grid.history.undo(); +if (grid.history.canRedo()) { + console.log("Redo is possible"); + grid.history.redo(); +} + +@descr: + +**Related article**: + +**Related API**: [`redo()`](grid/api/history/redo_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/canundo_method.md b/docs/grid/api/history/canundo_method.md new file mode 100644 index 000000000..b41b5e8f1 --- /dev/null +++ b/docs/grid/api/history/canundo_method.md @@ -0,0 +1,49 @@ +--- +sidebar_label: canUndo() +title: JavaScript Grid - canUndo Method +description: You can explore the canUndo method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# canUndo() + +@short: checks whether an action can be undone + +@signature: {'canUndo(): boolean;'} + +@returns: Returns `true` if the history contains actions and the module is not disabled. + +@example: +// The example shows checking whether undo is possible after removing a row +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// removing a row +const removedItem = { id: "1", name: "Item 1", value: 10 }; +grid.data.remove("1"); +grid.history.add({ + type: "remove", + batch: [{ ...removedItem }], +}); + +// checking +if (grid.history.canUndo()) { + console.log("Undo is possible"); + grid.history.undo(); +} + +@descr: + +**Related article**: + +**Related API**: [`undo()`](grid/api/history/undo_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/disable_method.md b/docs/grid/api/history/disable_method.md new file mode 100644 index 000000000..f2c0d3a11 --- /dev/null +++ b/docs/grid/api/history/disable_method.md @@ -0,0 +1,51 @@ +--- +sidebar_label: disable() +title: JavaScript Grid - disable Method +description: You can explore the disable method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# disable() + +@short: disables the module, preventing the addition of new actions to the history and the execution of any operations + +@signature: {'disable(): void;'} + +@example: +// The example shows disabling the module after adding an action +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding an action +grid.history.add({ + type: "change", + batch: [{ id: "1", name: "Updated Item", value: 15 }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); + +// disabling the module +grid.history.disable(); +console.log(grid.history.isDisabled()); // -> true + +// attempting to add a new action +grid.history.add({ + type: "add", + batch: [{ id: "2", name: "New Item", value: 20 }], +}); +console.log(grid.history.getHistory().length); // -> 1 (the new action hasn't been added) + +@descr: + +**Related article**: + +**Related API**: [`enable()`](grid/api/history/enable_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/enable_method.md b/docs/grid/api/history/enable_method.md new file mode 100644 index 000000000..7672bc4ca --- /dev/null +++ b/docs/grid/api/history/enable_method.md @@ -0,0 +1,48 @@ +--- +sidebar_label: enable() +title: JavaScript Grid - enable Method +description: You can explore the enable method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# enable() + +@short: enables the module, allowing the addition of new actions to the history + +@signature: {'enable(): void;'} + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + // disabled on initialization + history: { disabled: true } +}); + +// checking the state +console.log(grid.history.isDisabled()); // -> true + +// enabling the module +grid.history.enable(); +console.log(grid.history.isDisabled()); // -> false + +// adding an action +grid.history.add({ + type: "change", + batch: [{ id: "1", name: "Updated Item", value: 15 }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); +console.log(grid.history.getHistory().length); // -> 1 + +@descr: + +**Related article**: + +**Related API**: [`disable()`](grid/api/history/disable_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/error_event.md b/docs/grid/api/history/error_event.md new file mode 100644 index 000000000..87af78d07 --- /dev/null +++ b/docs/grid/api/history/error_event.md @@ -0,0 +1,45 @@ +--- +sidebar_label: error +title: JavaScript Grid - error Event +description: You can explore the error event of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# error + +@short: triggered when an error occurs + +:::note +The event is triggered when an error occurs, such as the module is disabled, the history is empty, the action type is invalid, the inverse action is missing for `undo` +::: + +@signature: {'error: (error: string, action: IAction | null) => void;'} + +@params: +The callback of the event is called with the following parameters: +- `error` - the error message +- `action` - the action object associated with the error, or `null` + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.events.on("error", (error, action) => { + console.log("Error:", error, action); +}); + +@descr: + +**Related article**: + +**Related API**: + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/gethistory_method.md b/docs/grid/api/history/gethistory_method.md new file mode 100644 index 000000000..b4d260e28 --- /dev/null +++ b/docs/grid/api/history/gethistory_method.md @@ -0,0 +1,55 @@ +--- +sidebar_label: getHistory() +title: JavaScript Grid - getHistory Method +description: You can explore the getHistory method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# getHistory() + +@short: returns a copy of the array of all actions in the history to prevent accidental modification of the internal structure + +@signature: {'getHistory(): IAction[];'} + +@returns: +Returns a copy of the array of all actions in the history. Each `action` object may contain: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing + - `timestamp?: number` - the timestamp of the action in milliseconds + +@example: +// The example shows retrieving the history with timestamps +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding actions +grid.history.add({ + type: "change", + batch: [{ id: "1", name: "Updated Item", value: 15 }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); +grid.history.add({ + type: "add", + batch: [{ id: "2", name: "New Item", value: 20 }], +}); + +// retrieving the history +const history = grid.history.getHistory(); +console.log(history.length); // -> 2 + +@descr: + +**Related article**: + +**Related API**: [`add()`](grid/api/history/add_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/isdisabled_method.md b/docs/grid/api/history/isdisabled_method.md new file mode 100644 index 000000000..acc18fdbe --- /dev/null +++ b/docs/grid/api/history/isdisabled_method.md @@ -0,0 +1,42 @@ +--- +sidebar_label: isDisabled() +title: JavaScript Grid - isDisabled Method +description: You can explore the isDisabled method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# isDisabled() + +@short: checks whether the module is disabled + +@signature: {'isDisabled(): boolean;'} + +@returns: +Returns `true` if the module is disabled. + +@example: +// The example shows checking the module's state after disabling it +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.disable(); +console.log(grid.history.isDisabled()); // -> true + +grid.history.enable(); +console.log(grid.history.isDisabled()); // -> false + +@descr: + +**Related article**: + +**Related API**: [`enable()`](grid/api/history/enable_method.md), [`disable()`](grid/api/history/disable_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/redo_method.md b/docs/grid/api/history/redo_method.md new file mode 100644 index 000000000..14e371150 --- /dev/null +++ b/docs/grid/api/history/redo_method.md @@ -0,0 +1,51 @@ +--- +sidebar_label: redo() +title: JavaScript Grid - redo Method +description: You can explore the redo method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# redo() + +@short: redoes the last undone action + +:::note +If the redo stack is empty or the module is disabled, the `error` event is triggered. +::: + +@signature: {'redo(): void;'} + +@example: +// The example shows redoing the undone row addition +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding a new row +const newItem = { id: "2", name: "New Item", value: 20 }; +grid.data.add(newItem); +grid.history.add({ + type: "add", + batch: [{ ...newItem }], +}); + +// undoing and redoing +grid.history.undo(); +grid.history.redo(); +console.log(grid.history.getHistory().length); // -> 1 +console.log(grid.history.canUndo()); // -> true + +@descr: + +**Related article**: + +**Related API**: [`add()`](grid/api/history/add_method.md), [`undo()`](grid/api/history/undo_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/remove_method.md b/docs/grid/api/history/remove_method.md new file mode 100644 index 000000000..648104497 --- /dev/null +++ b/docs/grid/api/history/remove_method.md @@ -0,0 +1,52 @@ +--- +sidebar_label: remove() +title: JavaScript Grid - remove Method +description: You can explore the remove method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# remove() + +@short: removes the last action from the history + +:::note +If the history is empty or the module is disabled, the operation is ignored, and an error event is triggered (for a disabled module). +::: + +@signature: {'remove(): void;'} + +@example: +// The example shows removing the last action from the history after modifying a value +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// modifying a value via DataCollection +const updatedItem = { id: "1", name: "Updated Item", value: 15 }; +grid.data.update("1", updatedItem); + +// adding the action to history +grid.history.add({ + type: "change", + batch: [{ ...updatedItem }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); + +// removing the last action +grid.history.remove(); +console.log(grid.history.getHistory().length); // -> 0 + +@descr: + +**Related article**: + +**Related API**: [`add()`](grid/api/history/add_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/removeall_method.md b/docs/grid/api/history/removeall_method.md new file mode 100644 index 000000000..a309d500e --- /dev/null +++ b/docs/grid/api/history/removeall_method.md @@ -0,0 +1,52 @@ +--- +sidebar_label: removeAll() +title: JavaScript Grid - removeAll Method +description: You can explore the removeAll method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# removeAll() + +@short: clears the entire history and the redo stack + +:::note +If the module is disabled, the operation is ignored, and the `error` event is triggered. +::: + +@signature: {'removeAll(): void;'} + +@example: +// The example shows clearing the history after adding multiple rows +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding two actions +grid.history.add({ + type: "add", + batch: [{ id: "2", name: "New Item 1", value: 20 }], +}); +grid.history.add({ + type: "add", + batch: [{ id: "3", name: "New Item 2", value: 30 }], +}); + +// clearing the history +grid.history.removeAll(); +console.log(grid.history.getHistory().length); // -> 0 +console.log(grid.history.canRedo()); // -> false + +@descr: + +**Related article**: + +**Related API**: [`add()`](grid/api/history/add_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/undo_method.md b/docs/grid/api/history/undo_method.md new file mode 100644 index 000000000..0a3740529 --- /dev/null +++ b/docs/grid/api/history/undo_method.md @@ -0,0 +1,52 @@ +--- +sidebar_label: undo() +title: JavaScript Grid - undo Method +description: You can explore the undo method of Grid history in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# undo() + +@short: undoes the last action in the history by applying the inverse action (for `change`, `removeAll`) or restoring data (for `add`, `remove`) + +:::note +If the history is empty, the module is disabled, or no inverse action is available, the `error` event is triggered. +::: + +@signature: {'undo(): void;'} + +@example: +// The example shows undoing the removal of all rows +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + { id: "2", name: "Item 2", value: 20 }, + ], + history: true +}); + +// removing all rows +const removedData = grid.data.serialize(); +grid.data.removeAll(); +grid.history.add({ + type: "removeAll", + batch: [], + inverse: { type: "add", batch: removedData }, +}); + +// undoing the action +grid.history.undo(); +console.log(grid.history.getHistory().length); // -> 0 +console.log(grid.history.canRedo()); // -> true + +@descr: + +**Related article**: + +**Related API**: [`add()`](grid/api/history/add_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 683c38382..1cdab9b01 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2639,6 +2639,7 @@ module.exports = { "grid/api/grid_headerrowheight_config", "grid/api/grid_headertooltip_config", "grid/api/grid_height_config", + "grid/api/grid_history_config", "grid/api/grid_htmlenable_config", "grid/api/grid_keynavigation_config", "grid/api/grid_leftsplit_config", @@ -2899,6 +2900,58 @@ module.exports = { "grid/api/clipboard/pasteerror_event" ], }, + { + type: "category", + label: "History API", + link: { + type: 'generated-index', + title: "History API", + keywords: ['history API'], + image: '/img/docusaurus.png' + }, + items: [{ + type: "category", + label: "Grid History methods", + link: { + type: 'generated-index', + title: "Grid History methods", + keywords: ['grid history methods'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/history/add_method", + "grid/api/history/canredo_method", + "grid/api/history/canundo_method", + "grid/api/history/disable_method", + "grid/api/history/enable_method", + "grid/api/history/isdisabled_method", + "grid/api/history/gethistory_method", + "grid/api/history/redo_method", + "grid/api/history/remove_method", + "grid/api/history/removeall_method", + "grid/api/history/undo_method" + ], + }, + { + type: "category", + label: "Grid History events", + link: { + type: 'generated-index', + title: "Grid History events", + keywords: ['grid history events'], + image: '/img/docusaurus.png' + }, + items: [ + "grid/api/history/afteradd_event", + "grid/api/history/afterredo_event", + "grid/api/history/afterundo_event", + "grid/api/history/beforeadd_event", + "grid/api/history/beforeredo_event", + "grid/api/history/beforeundo_event", + "grid/api/history/error_event" + ], + }], + }, ], }, "grid/features", From bb704355446e46f48394bab0dae7427e09396ec7 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 11 Jun 2025 16:23:11 +0300 Subject: [PATCH 14/47] [add] grid history module guides, update related api --- docs/grid/api/grid_history_config.md | 6 +- docs/grid/api/history/add_method.md | 6 +- docs/grid/api/history/afteradd_event.md | 10 +- docs/grid/api/history/afterredo_event.md | 10 +- docs/grid/api/history/afterundo_event.md | 10 +- docs/grid/api/history/beforeadd_event.md | 10 +- docs/grid/api/history/beforeredo_event.md | 10 +- docs/grid/api/history/beforeundo_event.md | 9 +- docs/grid/api/history/canredo_method.md | 2 +- docs/grid/api/history/canundo_method.md | 2 +- docs/grid/api/history/disable_method.md | 4 +- docs/grid/api/history/enable_method.md | 4 +- docs/grid/api/history/error_event.md | 9 +- docs/grid/api/history/gethistory_method.md | 4 +- docs/grid/api/history/isdisabled_method.md | 2 +- docs/grid/api/history/redo_method.md | 4 +- docs/grid/api/history/remove_method.md | 4 +- docs/grid/api/history/removeall_method.md | 4 +- docs/grid/api/history/undo_method.md | 4 +- docs/grid/configuration.md | 53 +++ docs/grid/features.md | 15 +- docs/grid/usage.md | 4 + docs/grid/usage_history.md | 465 +++++++++++++++++++++ sidebars.js | 1 + 24 files changed, 608 insertions(+), 44 deletions(-) create mode 100644 docs/grid/usage_history.md diff --git a/docs/grid/api/grid_history_config.md b/docs/grid/api/grid_history_config.md index f75967c36..665b44504 100644 --- a/docs/grid/api/grid_history_config.md +++ b/docs/grid/api/grid_history_config.md @@ -8,6 +8,10 @@ description: You can explore the history config of Grid in the documentation of @short: Optional. Enables/disables the `History` module during the Grid initialization +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + ### Usage ~~~jsx @@ -62,6 +66,6 @@ const grid = new dhx.Grid("grid_container", { grid.history.enable(); // enabling the module ~~~ -**Related article:** +**Related article:** [History of Grid actions](grid/configuration.md/#history-of-grid-actions) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/add_method.md b/docs/grid/api/history/add_method.md index 0ed512808..a418f5302 100644 --- a/docs/grid/api/history/add_method.md +++ b/docs/grid/api/history/add_method.md @@ -32,7 +32,7 @@ add(action: IAction): void; - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) :::note -The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing for a `change` action, the `error` event is triggered. The `timestamp` field is automatically added if not specified. +The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing for a `change` action, the [`error`](grid/api/history/error_event.md) event is triggered. The `timestamp` field is automatically added if not specified. ::: @example: @@ -64,9 +64,9 @@ console.log(history.length); // ->1 @descr: -**Related article**: +**Related article**: [Adding/removing Grid history actions](grid/usage_history.md/#addingremoving-grid-history-actions) -**Related API**: [`getHistory()`](grid/api/history/gethistory_method.md) +**Related API**: [`remove()`](grid/api/history/remove_method.md), [`removeAll()`](grid/api/history/removeall_method.md), [`getHistory()`](grid/api/history/gethistory_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/afteradd_event.md b/docs/grid/api/history/afteradd_event.md index 14c85e5a9..6754c8f8a 100644 --- a/docs/grid/api/history/afteradd_event.md +++ b/docs/grid/api/history/afteradd_event.md @@ -12,7 +12,11 @@ description: You can explore the afterAdd event of Grid history in the documenta @params: The callback of the event is called with the following parameters: -- `action` - the object of the added action. +- `action: IAction` - the object of the added action containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) @example: const grid = new dhx.Grid("grid_container", { @@ -32,9 +36,9 @@ grid.history.events.on("afterAdd", (action) => { @descr: -**Related article**: +**Related article**: [Adding/removing Grid history actions](grid/usage_history.md/#addingremoving-grid-history-actions) -**Related API**: +**Related API**: [`add()`](grid/api/history/add_method.md), [`beforeAdd()`](grid/api/history/beforeadd_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/afterredo_event.md b/docs/grid/api/history/afterredo_event.md index 4658354ca..157625300 100644 --- a/docs/grid/api/history/afterredo_event.md +++ b/docs/grid/api/history/afterredo_event.md @@ -12,7 +12,11 @@ description: You can explore the afterRedo event of Grid history in the document @params: The callback of the event is called with the following parameters: -- `action` - the object of the executed action. +- `action: IAction` - the object of the executed action containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) @example: const grid = new dhx.Grid("grid_container", { @@ -32,9 +36,9 @@ grid.history.events.on("afterRedo", (action) => { @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) -**Related API**: +**Related API**: [`redo()`](grid/api/history/redo_method.md), [`beforeRedo()`](grid/api/history/beforeredo_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/afterundo_event.md b/docs/grid/api/history/afterundo_event.md index aade72902..a59beb92b 100644 --- a/docs/grid/api/history/afterundo_event.md +++ b/docs/grid/api/history/afterundo_event.md @@ -12,7 +12,11 @@ description: You can explore the afterUndo event of Grid history in the document @params: The callback of the event is called with the following parameters: -- `action` - the object of the executed action. +- `action: IAction` - the object of the executed action containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) @example: const grid = new dhx.Grid("grid_container", { @@ -32,9 +36,9 @@ grid.history.events.on("afterUndo", (action) => { @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) -**Related API**: +**Related API**: [`undo()`](grid/api/history/undo_method.md), [`beforeUndo()`](grid/api/history/beforeundo_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/beforeadd_event.md b/docs/grid/api/history/beforeadd_event.md index 4a3f55cc3..8e66b0047 100644 --- a/docs/grid/api/history/beforeadd_event.md +++ b/docs/grid/api/history/beforeadd_event.md @@ -12,7 +12,11 @@ description: You can explore the beforeAdd event of Grid history in the document @params: The callback of the event is called with the following parameters: -- `action` - the action object to be added. +- `action: IAction` - the action object to be added containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) @returns: Returning `false` cancels the addition. @@ -38,9 +42,9 @@ grid.history.events.on("beforeAdd", (action) => { @descr: -**Related article**: +**Related article**: [Adding/removing Grid history actions](grid/usage_history.md/#addingremoving-grid-history-actions) -**Related API**: +**Related API**: [`add()`](grid/api/history/add_method.md), [`afterAdd()`](grid/api/history/afteradd_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/beforeredo_event.md b/docs/grid/api/history/beforeredo_event.md index 962d4fc71..ba5011f1f 100644 --- a/docs/grid/api/history/beforeredo_event.md +++ b/docs/grid/api/history/beforeredo_event.md @@ -12,7 +12,11 @@ description: You can explore the beforeRedo event of Grid history in the documen @params: The callback of the event is called with the following parameters: -- `action` - the action object from the redo stack. +- `action: IAction` - the action object from the redo stack containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) @returns: Returning `false` cancels the operation. @@ -38,9 +42,9 @@ grid.history.events.on("beforeRedo", (action) => { @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) -**Related API**: +**Related API**: [`redo()`](grid/api/history/redo_method.md), [`afterRedo()`](grid/api/history/afterredo_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/beforeundo_event.md b/docs/grid/api/history/beforeundo_event.md index 8c8505969..1d735db95 100644 --- a/docs/grid/api/history/beforeundo_event.md +++ b/docs/grid/api/history/beforeundo_event.md @@ -12,7 +12,10 @@ description: You can explore the beforeUndo event of Grid history in the documen @params: The callback of the event is called with the following parameters: -- `action` - the action object containing the type (`type`), an array of rows (`batch`), and the inverse action (`inverse`), if applicable. +- `action: IAction` - the action object containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) @returns: Returning `false` cancels the operation. @@ -38,9 +41,9 @@ grid.history.events.on("beforeUndo", (action) => { @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) -**Related API**: +**Related API**: [`undo()`](grid/api/history/undo_method.md), [`afterUndo()`](grid/api/history/afterundo_event.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/canredo_method.md b/docs/grid/api/history/canredo_method.md index 67a25ee58..0d8f00da1 100644 --- a/docs/grid/api/history/canredo_method.md +++ b/docs/grid/api/history/canredo_method.md @@ -43,7 +43,7 @@ if (grid.history.canRedo()) { @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) **Related API**: [`redo()`](grid/api/history/redo_method.md) diff --git a/docs/grid/api/history/canundo_method.md b/docs/grid/api/history/canundo_method.md index b41b5e8f1..1aee6df49 100644 --- a/docs/grid/api/history/canundo_method.md +++ b/docs/grid/api/history/canundo_method.md @@ -41,7 +41,7 @@ if (grid.history.canUndo()) { @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) **Related API**: [`undo()`](grid/api/history/undo_method.md) diff --git a/docs/grid/api/history/disable_method.md b/docs/grid/api/history/disable_method.md index f2c0d3a11..aeddfb9a7 100644 --- a/docs/grid/api/history/disable_method.md +++ b/docs/grid/api/history/disable_method.md @@ -43,9 +43,9 @@ console.log(grid.history.getHistory().length); // -> 1 (the new action hasn't be @descr: -**Related article**: +**Related article**: [Enabling/disabling History module](grid/usage_history.md/#enablingdisabling-history-module) -**Related API**: [`enable()`](grid/api/history/enable_method.md) +**Related API**: [`enable()`](grid/api/history/enable_method.md), [`isDisabled()`](grid/api/history/isdisabled_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/enable_method.md b/docs/grid/api/history/enable_method.md index 7672bc4ca..e3c70c2e4 100644 --- a/docs/grid/api/history/enable_method.md +++ b/docs/grid/api/history/enable_method.md @@ -40,9 +40,9 @@ console.log(grid.history.getHistory().length); // -> 1 @descr: -**Related article**: +**Related article**: [Enabling/disabling History module](grid/usage_history.md/#enablingdisabling-history-module) -**Related API**: [`disable()`](grid/api/history/disable_method.md) +**Related API**: [`disable()`](grid/api/history/disable_method.md), [`isDisabled()`](grid/api/history/isdisabled_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/error_event.md b/docs/grid/api/history/error_event.md index 87af78d07..eac9ee56e 100644 --- a/docs/grid/api/history/error_event.md +++ b/docs/grid/api/history/error_event.md @@ -17,7 +17,11 @@ The event is triggered when an error occurs, such as the module is disabled, the @params: The callback of the event is called with the following parameters: - `error` - the error message -- `action` - the action object associated with the error, or `null` +- `action: IAction` - the action object associated with the error, or `null`. The `action` object contains the following properties: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) @example: const grid = new dhx.Grid("grid_container", { @@ -37,9 +41,8 @@ grid.history.events.on("error", (error, action) => { @descr: -**Related article**: +**Related article**: [Work with History module](grid/usage_history.md) -**Related API**: @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/gethistory_method.md b/docs/grid/api/history/gethistory_method.md index b4d260e28..5cfa4aa0d 100644 --- a/docs/grid/api/history/gethistory_method.md +++ b/docs/grid/api/history/gethistory_method.md @@ -47,9 +47,9 @@ console.log(history.length); // -> 2 @descr: -**Related article**: +**Related article**: [Getting the history of Grid actions](grid/usage_history.md/#getting-the-history-of-grid-actions) -**Related API**: [`add()`](grid/api/history/add_method.md) +**Related API**: [`add()`](grid/api/history/add_method.md), [`remove()`](grid/api/history/remove_method.md), [`removeAll()`](grid/api/history/removeall_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/isdisabled_method.md b/docs/grid/api/history/isdisabled_method.md index acc18fdbe..970d332a2 100644 --- a/docs/grid/api/history/isdisabled_method.md +++ b/docs/grid/api/history/isdisabled_method.md @@ -34,7 +34,7 @@ console.log(grid.history.isDisabled()); // -> false @descr: -**Related article**: +**Related article**: [Enabling/disabling History module](grid/usage_history.md/#enablingdisabling-history-module) **Related API**: [`enable()`](grid/api/history/enable_method.md), [`disable()`](grid/api/history/disable_method.md) diff --git a/docs/grid/api/history/redo_method.md b/docs/grid/api/history/redo_method.md index 14e371150..90cdd7b9c 100644 --- a/docs/grid/api/history/redo_method.md +++ b/docs/grid/api/history/redo_method.md @@ -43,9 +43,9 @@ console.log(grid.history.canUndo()); // -> true @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) -**Related API**: [`add()`](grid/api/history/add_method.md), [`undo()`](grid/api/history/undo_method.md) +**Related API**: [`undo()`](grid/api/history/undo_method.md), [`canRedo()`](grid/api/history/canredo_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/remove_method.md b/docs/grid/api/history/remove_method.md index 648104497..d98e6a438 100644 --- a/docs/grid/api/history/remove_method.md +++ b/docs/grid/api/history/remove_method.md @@ -44,9 +44,9 @@ console.log(grid.history.getHistory().length); // -> 0 @descr: -**Related article**: +**Related article**: [Adding/removing Grid history actions](grid/usage_history.md/#addingremoving-grid-history-actions) -**Related API**: [`add()`](grid/api/history/add_method.md) +**Related API**: [`add()`](grid/api/history/add_method.md), [`removeAll()`](grid/api/history/removeall_method.md), [`getHistory()`](grid/api/history/gethistory_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/removeall_method.md b/docs/grid/api/history/removeall_method.md index a309d500e..160b1f47d 100644 --- a/docs/grid/api/history/removeall_method.md +++ b/docs/grid/api/history/removeall_method.md @@ -44,9 +44,9 @@ console.log(grid.history.canRedo()); // -> false @descr: -**Related article**: +**Related article**: [Adding/removing Grid history actions](grid/usage_history.md/#addingremoving-grid-history-actions) -**Related API**: [`add()`](grid/api/history/add_method.md) +**Related API**: [`add()`](grid/api/history/add_method.md), [`remove()`](grid/api/history/remove_method.md), [`getHistory()`](grid/api/history/gethistory_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/history/undo_method.md b/docs/grid/api/history/undo_method.md index 0a3740529..baf92ba14 100644 --- a/docs/grid/api/history/undo_method.md +++ b/docs/grid/api/history/undo_method.md @@ -44,9 +44,9 @@ console.log(grid.history.canRedo()); // -> true @descr: -**Related article**: +**Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) -**Related API**: [`add()`](grid/api/history/add_method.md) +**Related API**: [`redo()`](grid/api/history/redo_method.md), [`canUndo()`](grid/api/history/canundo_method.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index e6bfdb5d8..7f407ff3f 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2649,6 +2649,59 @@ The repetition of elements follows the order of copying, starting from the first For information on working with Clipboard, read the [Work with Clipboard module](grid/usage_clipboard.md) guide. +## History of Grid actions + +DHTMLX Grid provides the functionality for managing the history of actions in the component. + +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +To enable the history functionality within a grid, you should use the `History` module. To initialize the module, enable the [`history`](grid/api/grid_history_config.md) property in the Grid configuration. + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + history: true // enables the History module +}); +~~~ + +The `history` property can be set in two ways: +- as a *boolean* value it enables or disables the `History` module upon the component initialization +- as an *object* it enables the module and allows setting additional parameters: + - `limit` - the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed + - `disabled` - if `true`, the module is disabled on initialization, and no actions are recorded in the history + +The example below demonstrates configuring the module with a history limit of 10 actions. The module is disabled on initialization: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + history: { + limit: 10, // limits history to 10 actions + disabled: true // the module is disabled on start + } +}); + +grid.history.enable(); // enabling the module +~~~ + +For information on working with the History API, read the [Work with History module](grid/usage_history.md) guide. + ## Spans The Grid component has the [`spans`](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. diff --git a/docs/grid/features.md b/docs/grid/features.md index 2e0d3f7b8..dcc33bfe3 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -310,9 +310,20 @@ In this section you will get to know how to work with the clipboard functionalit | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring clipboard(../configuration/#clipboard) | Learn how to configure the Clipboard module within Grid | +| [Configuring clipboard](../configuration/#clipboard) | Learn how to configure the Clipboard module within Grid | | [Working with clipboard](../usage_clipboard/) | Learn how to enable the clipboard in Grid, check the main features and explore the peculiarities of using the Clipboard module | -| [Clipboard API](../../category/clipboard-api/) | Learn how to use API of the Clipboard module to manage the clipboard operations within Grid | +| [Clipboard API](../../category/clipboard-events/) | Learn how to use API of the Clipboard module to manage the clipboard operations within Grid | + +## How to work with history of Grid actions + +In this section you will get to know how to work with the history of Grid actions. + +| Topic | Description | +| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Configuring history of Grid actions](../configuration/#history-of-grid-actions) | Learn how to configure the History module within Grid | +| [Working with history of actions](../usage_history/) | Learn how to enable the history of actions in Grid, check the main features and explore the peculiarities of using the History module | +| [History API](../../category/history-api/) | Learn how to use API of the History module to manage the history of operations within Grid | + ## How to work with TreeGrid mode diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 96976e758..f039ee091 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -1212,6 +1212,10 @@ For information on using BlockSelection API, read [Work with BlockSelection modu For information on using the Clipboard module in Grid, read [Work with Clipboard module](grid/usage_clipboard.md). +## Working with History API + +For information on using the History API in Grid, read [Work with History module](grid/usage_history.md). + ## Working with Grid in the TreeGrid mode For information on working with with Grid in the TreeGrid mode, read the [TreeGrid mode](grid/treegrid_mode.md#work-with-grid-in-the-treegrid-mode) guide. diff --git a/docs/grid/usage_history.md b/docs/grid/usage_history.md new file mode 100644 index 000000000..33ffe1e80 --- /dev/null +++ b/docs/grid/usage_history.md @@ -0,0 +1,465 @@ +--- +sidebar_label: Work with History module +title: JavaScript Grid - Work with History module +description: You can explore how to work with History module of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# Work with History module + +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +You can manage the history of actions in the Grid component via the API of the [`History`](grid/configuration.md/#history-of-grid-actions) module. It allows tracking changes made by the user through the user interface, such as editing cells using the editor, clearing cells, or applying modifications via the handle in the `BlockSelection` mode. The module supports the undo (`undo`) and redo (`redo`) operations, as well as allows managing the history stack with the ability to limit its size. + +## Features of the History module + +### User interface interaction + +The `History` module records actions performed through the user interface, including: + +- cells editing: changes made using the cell editor +- cells clearing: clearing the contents of cells using keyboard navigation +- handle modifications: if the handle is used in the [`BlockSelection` mode](grid/configuration.md/#managing-block-selection-in-grid) and the `handler` function returns an object with the `prev` (previous value) and `current` (current value) fields, these changes are added to the history: + +~~~jsx +interface IHandleHistory { + prev: any; // the previous value + current: any; // the current value +} +~~~ + +The actions not related to the UI (e.g., programmatic changes via `grid.data`) are not automatically recorded but can be manually added using the [`add()`](grid/api/history/add_method.md) method. + +### Types of actions + +The module supports the following action types: + +- **add** - adding rows to the table +- **remove** - removing rows from the table +- **removeAll** - clearing all the rows +- **change** - modifying cell values (requires specifying an inverse action, `inverse`). + +For the `change` and `removeAll` actions, an inverse action (`inverse`) is mandatory. Otherwise, adding the action to the history will trigger an error. + +### History stack limitation + +If the `limit` parameter is set in the [configuration of the History module](grid/api/grid_history_config.md), the history is limited to the specified number of actions. When the limit is exceeded, the oldest actions are automatically removed. + +### Disabling the module + +If the module is disabled (via [`disabled: true`](grid/api/grid_history_config.md) in the configuration or the [`disable()`](grid/api/rangeselection/disable_method.md) method), all operations (`add`, `remove`, `removeAll`, `undo`, `redo`) are blocked, and the [`error`](grid/api/history/error_event.md) event is triggered. + +## Initializing the History module + +The `History` module is initialized via the [`history`](grid/api/grid_history_config.md) property in the configuration of the **dhx.Grid** component. After creating the Grid component, the module is accessible through the `grid.history` property. + +The `history` property can be set: +- as a *boolean* value it enables or disables the `History` module upon the component initialization +- as an *object* it enables the module and allows setting additional parameters: + - `limit` - the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed + - `disabled` - if `true`, the module is disabled on initialization, and no actions are recorded in the history + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + history: true // enables the History module +}); +~~~ + +## Enabling/disabling History module + +You can activate the history module via the [`enable()`](grid/api/history/enable_method.md) method of the `history` object. + +The following example shows how the module is enabled after deactivation on initialization: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: { disabled: true } +}); + +// checking the state +console.log(grid.history.isDisabled()); // -> true + +// enabling the module +grid.history.enable(); +console.log(grid.history.isDisabled()); // -> false + +// adding an action +grid.history.add({ + type: "change", + batch: [{ id: "1", name: "Updated Item", value: 15 }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); +console.log(grid.history.getHistory().length); // -> 1 +~~~ + +To disable the management of actions history in Grid, use the [`disable()`](grid/api/rangeselection/disable_method.md) method of the `history` object. + +The following example shows disabling of the module after adding an action: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding an action +grid.history.add({ + type: "change", + batch: [{ id: "1", name: "Updated Item", value: 15 }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); + +// disabling the module +grid.history.disable(); +console.log(grid.history.isDisabled()); // -> true + +// attempting to add a new action +grid.history.add({ + type: "add", + batch: [{ id: "2", name: "New Item", value: 20 }], +}); +console.log(grid.history.getHistory().length); // -> 1 (the new action hasn't been added) +~~~ + +### Checking History module state + +You can check whether the `History` module is disabled, using the [`isDisabled()`](grid/api/history/isdisabled_method.md) method of the `history` object. It returns `true`, if the module is disabled and `false`, if it is enabled. + +The following example shows checking the module's state after disabling it: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +grid.history.disable(); +console.log(grid.history.isDisabled()); // -> true + +grid.history.enable(); +console.log(grid.history.isDisabled()); // -> false +~~~ + +## Adding/removing Grid history actions + +### Adding a new action + +You can add a new action into the history of actions within the grid by using the [`add()`](grid/api/history/add_method.md) method of the `history` object. The method takes the following parameters: + +- `action: IAction` - the action object containing: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) + +:::note +The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing for a `change` action, the [`error`](grid/api/history/error_event.md) event is triggered. The `timestamp` field is automatically added if not specified. +::: + +The following example shows adding a new row via `DataCollection` with an explicitly specified timestamp: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding a new row via DataCollection +const newItem = { id: "2", name: "New Item", value: 20 }; +grid.data.add(newItem); + +// recording the action in the history with a timestamp +grid.history.add({ + type: "add", + batch: [{ ...newItem }], +}); + +// checking the history +const history = grid.history.getHistory(); +console.log(history.length); // ->1 +~~~ + +To make the process of adding new actions into the Grid history more flexible, you can apply the related events of the `history` object: [`beforeAdd`](grid/api/history/beforeadd_event.md), [`afterAdd`](grid/api/history/afteradd_event.md) + +### Removing the last action + +You can remove the last action from the Grid history using the [`remove()`](grid/api/history/remove_method.md) method of the `history` object. Note that if the history is empty or the module is disabled, the operation is ignored, and the [`error`](grid/api/history/error_event.md) event is triggered (for a disabled module). + +The following example shows removing the last action from the history after modifying a value: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// modifying a value via DataCollection +const updatedItem = { id: "1", name: "Updated Item", value: 15 }; +grid.data.update("1", updatedItem); + +// adding the action to history +grid.history.add({ + type: "change", + batch: [{ ...updatedItem }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); + +// removing the last action +grid.history.remove(); +console.log(grid.history.getHistory().length); // -> 0 +~~~ + +### Removing all the actions + +You can remove all the actions from the Grid history using the [`removeAll()`](grid/api/history/removeall_method.md) method of the `history` object. The method clears the entire history and the redo stack. Note that if the module is disabled, the operation is ignored, and the [`error`](grid/api/history/error_event.md) event is triggered. + +The example below shows clearing the history after adding multiple rows: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding two actions +grid.history.add({ + type: "add", + batch: [{ id: "2", name: "New Item 1", value: 20 }], +}); +grid.history.add({ + type: "add", + batch: [{ id: "3", name: "New Item 2", value: 30 }], +}); + +// clearing the history +grid.history.removeAll(); +console.log(grid.history.getHistory().length); // -> 0 +console.log(grid.history.canRedo()); // -> false +~~~ + +## Applying undo/redo operations to Grid history actions + +### Applying the `undo` operation + +The Grid component allows applying the `undo` operation to the last action in the history via the [`undo()`](grid/api/history/undo_method.md) method of the `history` object. + +Depending on the type of the action, the method either applies the inverse action (for the `change` and `removeAll` types) or restores data (for the `add` and `remove` types). Note that if the history is empty, the module is disabled, or no inverse action is available, the [`error`](grid/api/history/error_event.md) event is triggered. + +The following example shows undoing the removal of all rows: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + { id: "2", name: "Item 2", value: 20 }, + ], + history: true +}); + +// removing all rows +const removedData = grid.data.serialize(); +grid.data.removeAll(); +grid.history.add({ + type: "removeAll", + batch: [], + inverse: { type: "add", batch: removedData }, +}); + +// undoing the action +grid.history.undo(); +console.log(grid.history.getHistory().length); // -> 0 +console.log(grid.history.canRedo()); // -> true +~~~ + +### Applying the `redo` operation + +You can re-apply the last undone action in the Grid history using the [`redo()`](grid/api/history/redo_method.md) method of the `history` object. Note that if the redo stack is empty or the module is disabled, the [`error`](grid/api/history/error_event.md) event is triggered. + +The example below shows how the undone row addition can be re-applied: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding a new row +const newItem = { id: "2", name: "New Item", value: 20 }; +grid.data.add(newItem); +grid.history.add({ + type: "add", + batch: [{ ...newItem }], +}); + +// undoing and redoing +grid.history.undo(); +grid.history.redo(); +console.log(grid.history.getHistory().length); // -> 1 +console.log(grid.history.canUndo()); // -> true +~~~ + +### Checking whether an action can be undone + +You can check whether an action in the Grid history can be undone using the [`canUndo`](grid/api/history/canundo_method.md) method of the `history` object. The method returns `true` if the history contains actions and the module is not disabled. + +The following example shows checking whether undo is possible after removing a row: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// removing a row +const removedItem = { id: "1", name: "Item 1", value: 10 }; +grid.data.remove("1"); +grid.history.add({ + type: "remove", + batch: [{ ...removedItem }], +}); + +// checking +if (grid.history.canUndo()) { + console.log("Undo is possible"); + grid.history.undo(); +} +~~~ + +### Checking whether an action can be re-applied + +It is possible to check whether an action in the Grid history can be re-applied using the [`canRedo`](grid/api/history/canredo_method.md) method of the `history` object. The method returns `true` if the redo stack contains actions and the module is not disabled. + +The following example shows checking whether it is possible to redo an undone action: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// modifying data +const updatedItem = { id: "1", name: "Updated Item", value: 15 }; +grid.data.update("1", updatedItem); +grid.history.add({ + type: "change", + batch: [{ ...updatedItem }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); + +// undoing and checking +grid.history.undo(); +if (grid.history.canRedo()) { + console.log("Redo is possible"); + grid.history.redo(); +} +~~~ + +To make the process of working with the undo/redo operations more flexible, you can apply the related events of the `history` object: [`beforeUndo`](grid/api/history/beforeundo_event.md), [`afterUndo`](grid/api/history/afterundo_event.md), [`beforeRedo`](grid/api/history/beforeredo_event.md), [`afterRedo`](grid/api/history/afterredo_event.md). + +## Getting the history of Grid actions + +You can get a copy of the array of all actions in the history of Grid actions using the [`getHistory`](grid/api/history/gethistory_method.md) method of the `history` object to prevent accidental modification of the internal structure. + +Each `action` object in the returned array may contain the following properties: + - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" + - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) + - `inverse?: IAction` - the inverse action required for undoing + - `timestamp?: number` - the timestamp of the action in milliseconds + +The example below shows retrieving the history with timestamps: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "name", header: [{ text: "Name" }] }, + { id: "value", header: [{ text: "Value" }] }, + ], + data: [ + { id: "1", name: "Item 1", value: 10 }, + ], + history: true +}); + +// adding actions +grid.history.add({ + type: "change", + batch: [{ id: "1", name: "Updated Item", value: 15 }], + inverse: { type: "change", batch: [{ id: "1", name: "Item 1", value: 10 }] }, +}); +grid.history.add({ + type: "add", + batch: [{ id: "2", name: "New Item", value: 20 }], +}); + +// retrieving the history +const history = grid.history.getHistory(); +console.log(history.length); // -> 2 +~~~ \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 1cdab9b01..32402d0aa 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2965,6 +2965,7 @@ module.exports = { "grid/usage_rangeselection", "grid/usage_blockselection", "grid/usage_clipboard", + "grid/usage_history", "grid/customization", "grid/events", ], From 0272e3fb0c91c4504d3abf72e33e3f44e02d9d72 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 12 Jun 2025 14:47:09 +0300 Subject: [PATCH 15/47] [add] the isSelectedCell() method page, update related docs --- docs/grid/api/api_overview.md | 17 +-- .../selection_isselectedcell_method.md | 44 ++++++++ .../api/selection/selection_setcell_method.md | 12 +- docs/grid/usage_selection.md | 103 ++++++++++++------ sidebars.js | 1 + 5 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 docs/grid/api/selection/selection_isselectedcell_method.md diff --git a/docs/grid/api/api_overview.md b/docs/grid/api/api_overview.md index 167e7caa9..6921974a7 100644 --- a/docs/grid/api/api_overview.md +++ b/docs/grid/api/api_overview.md @@ -241,14 +241,15 @@ You will find the list of all the available configuration properties of a Grid c ### Selection methods -| Name | Description | -| ----------------------------------------------------- | ------------------------------------------------------------ | -| [](grid/api/selection/selection_disable_method.md) | @getshort(grid/api/selection/selection_disable_method.md) | -| [](grid/api/selection/selection_enable_method.md) | @getshort(grid/api/selection/selection_enable_method.md) | -| [](grid/api/selection/selection_getcell_method.md) | @getshort(grid/api/selection/selection_getcell_method.md) | -| [](grid/api/selection/selection_getcells_method.md) | @getshort(grid/api/selection/selection_getcells_method.md) | -| [](grid/api/selection/selection_removecell_method.md) | @getshort(grid/api/selection/selection_removecell_method.md) | -| [](grid/api/selection/selection_setcell_method.md) | @getshort(grid/api/selection/selection_setcell_method.md) | +| Name | Description | +| --------------------------------------------------------- | --------------------------------------------------------------- | +| [](grid/api/selection/selection_disable_method.md) | @getshort(grid/api/selection/selection_disable_method.md) | +| [](grid/api/selection/selection_enable_method.md) | @getshort(grid/api/selection/selection_enable_method.md) | +| [](grid/api/selection/selection_getcell_method.md) | @getshort(grid/api/selection/selection_getcell_method.md) | +| [](grid/api/selection/selection_getcells_method.md) | @getshort(grid/api/selection/selection_getcells_method.md) | +| [](grid/api/selection/selection_isselectedcell_method.md) | @getshort(grid/api/selection/selection_isselectedcell_method.md)| +| [](grid/api/selection/selection_removecell_method.md) | @getshort(grid/api/selection/selection_removecell_method.md) | +| [](grid/api/selection/selection_setcell_method.md) | @getshort(grid/api/selection/selection_setcell_method.md) | ### Selection events diff --git a/docs/grid/api/selection/selection_isselectedcell_method.md b/docs/grid/api/selection/selection_isselectedcell_method.md new file mode 100644 index 000000000..9ea1caff2 --- /dev/null +++ b/docs/grid/api/selection/selection_isselectedcell_method.md @@ -0,0 +1,44 @@ +--- +sidebar_label: isSelectedCell() +title: JavaScript Grid - isSelectedCell Method +description: You can explore the isSelectedCell method of Grid in the documentation of the DHTMLX JavaScript UI library. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +--- + +# isSelectedCell() + +@short: checks whether the cell with the specified row and column parameters is selected + +@signature: {'isSelectedCell(row: IRow | Id, column?: ICol | Id): boolean;'} + +@params: +- `row: IRow | Id` - an object with a cell to be checked or the id of a row +- `column: ICol | Id` - the config of a column or its id + +@returns: +Returns `true` if the cell is selected, otherwise `false` + +@example: +const grid = new dhx.Grid("grid_container", { + columns: [ + // columns config + ], + selection:"cell", + multiselection: false, + data: dataset +}); + +const row = grid.data.getItem(grid.data.getId(0)); +const column = grid.getColumn("project"); +grid.selection.setCell(row,column); + +const selectedCell = grid.selection.isSelectedCell(row,column); +console.log(selectedCell); // -> true + +@descr: + +**Related article**: [Selection](grid/usage_selection.md) + +**Related API**: [`setCell()`](grid/api/selection/selection_setcell_method.md) + +@changelog: +added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/selection/selection_setcell_method.md b/docs/grid/api/selection/selection_setcell_method.md index ba8fcb2e6..c6925fd21 100644 --- a/docs/grid/api/selection/selection_setcell_method.md +++ b/docs/grid/api/selection/selection_setcell_method.md @@ -13,8 +13,8 @@ description: You can explore the setCell method of Grid in the documentation of @params: - `row: object | string | number` - an object with a cell to be selected or the id of a row - `column: object | string | number` - the config of a column or its id -- `ctrlUp: boolean` - *true* - to select the desired rows or cells, otherwise - *false* (for multiselection mode) -- `shiftUp: boolean` - *true* - to select a range of rows or cells, otherwise - *false* (for multiselection mode) +- `ctrlUp: boolean` - *true* - to select the desired rows or cells, otherwise - *false* (for the `multiselection` mode) +- `shiftUp: boolean` - *true* - to select a range of rows or cells, otherwise - *false* (for the `multiselection` mode) @example: const grid = new dhx.Grid("grid_container", { @@ -32,10 +32,12 @@ grid.selection.setCell(row, column); @descr: -{{note For details about how to set selection to multiple cells/rows, see [Setting selection to cells](grid/usage_selection.md#setting-selection-to-cells).}} +:::note +For details about how to set selection to multiple cells/rows, see [Setting selection to cells](grid/usage_selection.md#setting-selection-to-cells). +::: **Related sample**: [Grid. Multiselection](https://snippet.dhtmlx.com/4nj0e9ye) -[comment]: # (@related: grid/usage_selection.md) +**Related article**: [Selection](grid/usage_selection.md) -[comment]: # (@relatedapi: grid/api/selection/selection_enable_method.md grid/api/selection/selection_removecell_method.md) +**Related API**: [`enable()`](grid/api/selection/selection_enable_method.md), [`removeCell()`](grid/api/selection/selection_removecell_method.md) diff --git a/docs/grid/usage_selection.md b/docs/grid/usage_selection.md index 58b73efe3..329b2d40b 100644 --- a/docs/grid/usage_selection.md +++ b/docs/grid/usage_selection.md @@ -6,43 +6,43 @@ description: You can explore how to work with Selection Object of Grid in the do # Work with Selection object -You can manipulate with Grid cells via the API of the selection object. It is possible to get the object of one or more selected cells or rows, to set selection as to a single row or cell as to multiple rows or cells. The selection object also allows removing selection from previously selected cells. +You can manipulate with Grid cells via the API of the `selection` object. It is possible to get the object of one or more selected cells or rows, to set selection both to a single row or cell and to multiple rows or cells. The `selection` object also allows removing selection from previously selected cells. -## Enabling/Disabling Selection object +## Enabling/disabling Selection object -Starting from v7.0, you can activate selection of cells via the [](grid/api/selection/selection_enable_method.md) method of the selection object. +Starting from v7.0, you can activate selection of cells via the [`enable`](grid/api/selection/selection_enable_method.md) method of the `selection` object. -~~~js +~~~jsx grid.selection.enable(); ~~~ -To disable selection of cells in Grid, make use of the [](grid/api/selection/selection_disable_method.md) method of the selection object: +To disable selection of cells in Grid, make use of the [`disable`](grid/api/selection/selection_disable_method.md) method of the `selection` object: -~~~js +~~~jsx grid.selection.disable(); ~~~ ## Setting selection to cells -You can set selection to one or more rows or cells using the [setCell()](grid/api/selection/selection_setcell_method.md) method of the selection object. The method takes the following parameters: +You can set selection to one or more rows or cells using the [`setCell()`](grid/api/selection/selection_setcell_method.md) method of the `selection` object. The method takes the following parameters:
- + - + - + - +
row(object|string) an object with a cell to be selected or the id of a row(object | string) an object with a cell to be selected or the id of a row
column(object|string) the config of a column or its id(object | string) the config of a column or its id
ctrlUp(boolean) true - to select the desired rows or cells, otherwise - false (for multiselection mode)(boolean) true - to select the desired rows or cells, otherwise - false (for the `multiselection` mode)
shiftUp(boolean) true - to select a range of rows or cells, otherwise - false (for multiselection mode)(boolean) true - to select a range of rows or cells, otherwise - false (for the `multiselection` mode)
@@ -53,7 +53,7 @@ You can set selection to one or more rows or cells using the [setCell()](grid/ap The example below shows how to highlight the first cell in the "Yearly Change" column: -~~~js {6} +~~~jsx {6} const grid = new dhx.Grid("grid_container", { columns: [ // columns config @@ -70,15 +70,17 @@ grid.selection.setCell(row, column); **Related sample**: [Grid. Multiselection](https://snippet.dhtmlx.com/4nj0e9ye) -{{note The **multiselection** property is disabled.}} +:::note +The `multiselection` property is disabled. +::: ### Setting selection to multiple cells/rows -You can highlight the desired cells when the [multiselection:true](grid/api/grid_multiselection_config.md) and the [selection:"cell"](grid/api/grid_selection_config.md) properties are set: +You can highlight the desired cells when the [`multiselection:true`](grid/api/grid_multiselection_config.md) and the [`selection:"cell"`](grid/api/grid_selection_config.md) properties are set: ![](../assets/grid/desired_setcell.png) -~~~js {5,6} +~~~jsx {5,6} const grid = new dhx.Grid("grid_container", { columns: [ // columns config @@ -99,40 +101,77 @@ It is also possible to select a range of cells at once: ![](../assets/grid/range_setcell.png) -For that, manipulate the **ctrlUp** and **shiftUp** parameters accordingly: +For that, manipulate the `ctrlUp` and `shiftUp` parameters accordingly: -~~~js +~~~jsx grid.selection.setCell(grid.data.getId(1),"yearlyChange"); grid.selection.setCell(grid.data.getId(3),"density", false, true); ~~~ **Related sample**: [Grid. Multiselection](https://snippet.dhtmlx.com/4nj0e9ye) -{{note Use the **selection:"rows"** property to be able to operate rows. }} +:::note +Use the `selection:"rows"` property to be able to operate rows. +::: -To make the process of selecting cells more flexible, you can apply the related events of the selection object: +To make the process of selecting cells more flexible, you can apply the related events of the `selection` object: -- [afterSelect](grid/api/selection/selection_afterselect_event.md) -- [beforeSelect](grid/api/selection/selection_beforeselect_event.md) +- [`afterSelect`](grid/api/selection/selection_afterselect_event.md) +- [`beforeSelect`](grid/api/selection/selection_beforeselect_event.md) + +## Checking whether a cell is selected + +You can check whether a particular cell is selected using the [`isSelectedCell()`](grid/api/selection/selection_isselectedcell_method.md) method of the `selection` object. The method takes the following parameters: + + + + + + + + + + + + +
row(IRow | Id) an object with a cell to be checked or the id of a row
column(ICol | Id) the config of a column or its id
+ +~~~jsx {14} +const grid = new dhx.Grid("grid_container", { + columns: [ + // columns config + ], + selection:"cell", + multiselection: false, + data: dataset +}); + +const row = grid.data.getItem(grid.data.getId(0)); +const column = grid.getColumn("project"); +grid.selection.setCell(row,column); + +const selectedCell = grid.selection.isSelectedCell(row,column); +console.log(selectedCell); // -> true +~~~ ## Removing selection -Starting from v7.0, you can remove selection from a selected cell/row or from highlighted cells/rows using the [](grid/api/selection/selection_removecell_method.md) method of the selection object. The method takes two parameters: +Starting from v7.0, you can remove selection from a selected cell/row or from highlighted cells/rows using the [`removeCell`](grid/api/selection/selection_removecell_method.md) method of the `selection` object. The method takes two parameters: - + - +
rowId(string|number) optional, the id of a row(string | number) optional, the id of a row
colId(string|number) optional, the id of a column(string | number) optional, the id of a column
-~~~js +~~~jsx // unselects all previously selected cells grid.selection.removeCell(); @@ -143,23 +182,23 @@ grid.selection.removeCell(rowId); grid.selection.removeCell(rowId, colId); ~~~ -To make the process of unselecting cells more flexible, you can apply the related events of the selection object: +To make the process of unselecting cells more flexible, you can apply the related events of the `selection` object: -- [afterUnSelect](grid/api/selection/selection_afterunselect_event.md) -- [beforeUnSelect](grid/api/selection/selection_beforeunselect_event.md) +- [`afterUnSelect`](grid/api/selection/selection_afterunselect_event.md) +- [`beforeUnSelect`](grid/api/selection/selection_beforeunselect_event.md) ## Getting object of selected cells -To get the object of a selected Grid cell, use the [getCell()](grid/api/selection/selection_getcell_method.md) method of the selection object: +To get the object of a selected Grid cell, use the [`getCell()`](grid/api/selection/selection_getcell_method.md) method of the `selection` object: -~~~js +~~~jsx const selectedCell = grid.selection.getCell(); // -> {row: {…}, column: {…}} ~~~ -To get the object of multiple selected cells, use the [getCells()](grid/api/selection/selection_getcells_method.md) method of the selection object: +To get the object of multiple selected cells, use the [`getCells()`](grid/api/selection/selection_getcells_method.md) method of the `selection` object: -~~~js +~~~jsx const selectedCells = grid.selection.getCells(); // -> [{…}, {…}, {…}] 0: {row: {…}, column: {…}} diff --git a/sidebars.js b/sidebars.js index 29ef62de5..d6626e1a8 100644 --- a/sidebars.js +++ b/sidebars.js @@ -2741,6 +2741,7 @@ module.exports = { "grid/api/selection/selection_enable_method", "grid/api/selection/selection_getcell_method", "grid/api/selection/selection_getcells_method", + "grid/api/selection/selection_isselectedcell_method", "grid/api/selection/selection_removecell_method", "grid/api/selection/selection_setcell_method", ], From 9aa69e9389ea8a8fca6e368f30f04b5f80b465b0 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 13 Jun 2025 10:43:55 +0300 Subject: [PATCH 16/47] [update] what's new and docs for new Grid modules --- docs/grid/api/grid_blockselection_config.md | 4 +++ docs/grid/api/grid_clipboard_config.md | 8 +++-- docs/grid/api/grid_history_config.md | 4 +-- docs/grid/api/grid_rangeselection_config.md | 4 +++ docs/grid/configuration.md | 35 +++++++++++++++++++-- docs/grid/usage_blockselection.md | 4 +++ docs/grid/usage_clipboard.md | 4 +++ docs/grid/usage_rangeselection.md | 4 +++ docs/whatsnew.md | 18 +++++++---- 9 files changed, 72 insertions(+), 13 deletions(-) diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md index 5d7900126..e01ae85e0 100644 --- a/docs/grid/api/grid_blockselection_config.md +++ b/docs/grid/api/grid_blockselection_config.md @@ -6,6 +6,10 @@ description: You can explore the blockSelection config of Grid in the documentat # blockSelection +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: Optional. Enables/disables block selection management within a grid ### Usage diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md index d95b02669..f5ce8e9e6 100644 --- a/docs/grid/api/grid_clipboard_config.md +++ b/docs/grid/api/grid_clipboard_config.md @@ -6,10 +6,14 @@ description: You can explore the clipboard config of Grid in the documentation o # clipboard -@short: Optional. Enables/disables the clipboard module within a grid +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +@short: Optional. Enables/disables the [`Clipboard`](grid/usage_clipboard.md) module within a grid :::note -The module requires the `RangeSelection` module to be enabled via one of the configuration properties: `rangeSelection: true` or `blockSelection: { mode: "range" }`. +The module requires the [`RangeSelection`](grid/usage_rangeselection.md) module to be enabled and is best used in conjunction with the [`BlockSelection`](grid/usage_blockselection.md) module in the `"range"` mode (enabled on initialization of the `Clipboard` module) for convenient range selection via the UI. ::: ### Usage diff --git a/docs/grid/api/grid_history_config.md b/docs/grid/api/grid_history_config.md index 665b44504..7e651dcaf 100644 --- a/docs/grid/api/grid_history_config.md +++ b/docs/grid/api/grid_history_config.md @@ -6,12 +6,12 @@ description: You can explore the history config of Grid in the documentation of # history -@short: Optional. Enables/disables the `History` module during the Grid initialization - :::tip Pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: +@short: Optional. Enables/disables the `History` module during the Grid initialization + ### Usage ~~~jsx diff --git a/docs/grid/api/grid_rangeselection_config.md b/docs/grid/api/grid_rangeselection_config.md index 17e981884..3d0e049ad 100644 --- a/docs/grid/api/grid_rangeselection_config.md +++ b/docs/grid/api/grid_rangeselection_config.md @@ -6,6 +6,10 @@ description: You can explore the rangeSelection config of Grid in the documentat # rangeSelection +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: Optional. Enables/disables range selection management within a grid ### Usage diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index ad3becc91..9755e9e8e 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2189,7 +2189,24 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the appearance of the drag panel that appears when the drag-n-drop functionality is activated. -To initialize the `DragPanel` module, enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration. The module is automatically enabled if the [row Drag-and-Drop](grid/configuration.md/#drag-n-drop) is active (e.g., `dragItem: "row"` or `dragItem: "both"`) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. +To initialize the `DragPanel` module, enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration. + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragItem: "row", // enables row Drag-and-Drop + dragPanel: true // enables the DragPanel module +}); +~~~ + +The module is automatically enabled if the [row Drag-and-Drop](grid/configuration.md/#drag-n-drop) is active (e.g., `dragItem: "row"` or `dragItem: "both"`) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. This example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: @@ -2484,6 +2501,10 @@ A range of Grid cells/rows can be selected by clicking the first element to sele ### Managing range selection in Grid +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + The Grid functionality provides the [range selection management](grid/usage_rangeselection.md) feature for setting/resetting a range of cells, retrieving information about the current range, and checking whether specific cells belong to the selected range. To enable [range selection management](grid/usage_rangeselection.md) within a grid, you should use the `RangeSelection` module. To initialize the module, enable the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration: @@ -2532,6 +2553,10 @@ For information on using the Range Selection API, read the [Work with RangeSelec ### Managing block selection in Grid +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + The Grid functionality provides the [block selection management](grid/usage_blockselection.md) feature for selecting cells' ranges via the mouse pointer, touch input, and keyboard navigation, as well as adjusting the appearance of the selection and handlers, depending on the applied mode. To enable managing of the block selection within a grid, you should use the `BlockSelection` module. To initialize the module, enable the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration: @@ -2639,6 +2664,10 @@ For information on using the Block Selection API, read the [Work with Block Sele ## Clipboard +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + The Grid component provides the [functionality for interacting with the clipboard](grid/usage_clipboard.md), such as copying, cutting, and pasting data from a selected range of cells, as well as integrating with other grids or external applications like Google Spreadsheets. To enable the clipboard functionality within a grid, you should use the `Clipboard` module. To initialize the module, enable the [`clipboard`](grid/api/grid_clipboard_config.md) property in the Grid configuration. @@ -2715,12 +2744,12 @@ For information on working with Clipboard, read the [Work with Clipboard module] ## History of Grid actions -DHTMLX Grid provides the functionality for managing the history of actions in the component. - :::tip Pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: +DHTMLX Grid provides the functionality for managing the history of actions in the component. + To enable the history functionality within a grid, you should use the `History` module. To initialize the module, enable the [`history`](grid/api/grid_history_config.md) property in the Grid configuration. ~~~jsx diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md index 101bb498b..afaefe9ef 100644 --- a/docs/grid/usage_blockselection.md +++ b/docs/grid/usage_blockselection.md @@ -6,6 +6,10 @@ description: You can explore how to work with BlockSelection module of Grid in t # Work with BlockSelection module +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + You can manage block selection within a grid via the API of the [`BlockSelection`](grid/configuration.md/#managing-block-selection-in-grid) module. It allows selecting ranges of cells using the mouse pointer, touch input, or keyboard navigation, visualizing the selection, and controlling behavior through various modes and handlers. It also supports an [event system](grid/api/api_overview.md/#blockselection-events) to track user actions, including keyboard and mouse combinations. To initialize the `BlockSelection` module, use the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration. Once the Grid is created, the module is accessible through the `grid.block` property. diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md index f1ff051bf..65c792f73 100644 --- a/docs/grid/usage_clipboard.md +++ b/docs/grid/usage_clipboard.md @@ -6,6 +6,10 @@ description: You can explore how to work with Clipboard module of Grid in the do # Work with Clipboard module +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + You can manage the clipboard functionality within a grid via the API of the [`Clipboard`](grid/configuration.md/#clipboard) module. It enables copying, cutting, and pasting data from a selected range of cells. Besides, it allows integrating with other grids or external applications like Google Spreadsheets. ## Initializing the Clipboard module diff --git a/docs/grid/usage_rangeselection.md b/docs/grid/usage_rangeselection.md index c69cfe31d..f49036c9b 100644 --- a/docs/grid/usage_rangeselection.md +++ b/docs/grid/usage_rangeselection.md @@ -6,6 +6,10 @@ description: You can explore how to work with RangeSelection module of Grid in t # Work with RangeSelection module +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + You can manage range selection within a grid via the API of the [`RangeSelection`](grid/configuration.md/#managing-range-selection-in-grid) module. It provides methods for setting and resetting a range of cells, getting information about the current range, and checking whether specific cells belong to the selected range. It also supports an [event system](grid/api/api_overview.md/#rangeselection-events) to track changes. To initialize the `RangeSelection` module, use the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration. Once the Grid is created, the module is accessible through the `grid.range` property. diff --git a/docs/whatsnew.md b/docs/whatsnew.md index fd362f2f5..85bce9b72 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -16,24 +16,30 @@ Released on June X, 2025 ### New functionality -- Grid. The `RangeSelection` manager is added (PRO version) +- Grid. The [`RangeSelection` module](grid/usage_rangeselection.md) is added to provide functionality for managing range selection in Grid (PRO version) - new Grid configuration property: [`rangeSelection`](grid/api/grid_rangeselection_config.md) - new methods of the `range` object: [`disable()`](grid/api/rangeselection/disable_method.md), [`enable()`](grid/api/rangeselection/enable_method.md), [`getRange()`](grid/api/rangeselection/getrange_method.md), [`getRangedCells()`](grid/api/rangeselection/getrangedcells_method.md), [`isDisabled()`](grid/api/rangeselection/isdisabled_method.md), [`isRanged()`](grid/api/rangeselection/isranged_method.md), [`resetRange()`](grid/api/rangeselection/resetrange_method.md), [`setRange()`](grid/api/rangeselection/setrange_method.md) - new events of the `range` object: [`afterResetRange`](grid/api/rangeselection/afterresetrange_event.md), [`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md), [`beforeResetRange`](grid/api/rangeselection/beforeresetrange_event.md), [`beforeSetRange`](grid/api/rangeselection/beforesetrange_event.md) -- Grid. The `BlockSelection` manager is added (PRO version) +- Grid. The [`BlockSelection` module](grid/usage_blockselection.md) is added to provide functionality for managing block selection in Grid (PRO version) - new Grid configuration property: [`blockSelection`](grid/api/grid_blockselection_config.md) - new methods of the `block` object: [`disable()`](grid/api/blockselection/disable_method.md), [`enable()`](grid/api/blockselection/enable_method.md), [`isDisabled()`](grid/api/blockselection/isdisabled_method.md) - new events of the `block` object: [`afterBlockHandleApply`](grid/api/blockselection/afterblockhandleapply_event.md), [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md), [`afterBlockSelectionMove`](grid/api/blockselection/afterblockselectionmove_event.md), [`beforeBlockHandleApply`](grid/api/blockselection/beforeblockhandleapply_event.md), [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md), [`beforeBlockSelectionMove`](grid/api/blockselection/beforeblockselectionmove_event.md), [`blockHandleMouseDown`](grid/api/blockselection/blockhandlemousedown_event.md), [`blockSelectionEnd`](grid/api/blockselection/blockselectionend_event.md), [`blockSelectionStart`](grid/api/blockselection/blockselectionstart_event.md), [`blockSelectionValidate`](grid/api/blockselection/blockselectionvalidate_event.md) -- Grid. The `Clipboard` module is added (PRO version) +- Grid. The [`Clipboard` module](grid/usage_clipboard.md) is added to provide functionality for interacting with the clipboard in Grid (PRO version) - new Grid configuration property: [`clipboard`](grid/api/grid_clipboard_config.md) - new events of the `clipboard` object: [`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), [`pasteError`](grid/api/clipboard/pasteerror_event.md) -- Grid. The drag and drop handle (panel) for rows is added -- Grid. Undo/Redo functionality +- Grid. The [`DragPanel` module](grid/usage_dragpanel.md) is added to provide auxiliary functionality for moving rows in Grid (PRO version) + - new Grid configuration property: [`dragPanel`](grid/api/grid_dragpanel_config.md) + - new events: [`dragPanelItemClick`](grid/api/dragpanel/dragpanelitemclick_event.md), [`dragPanelItemMouseDown`](grid/api/dragpanel/dragpanelitemmousedown_event.md) +- Grid. The [`History` module](grid/usage_history.md) is added to provide functionality for managing the history of actions in Grid, including the [Undo/Redo functionality](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) (PRO version) + - new Grid configuration property: [`history`](grid/api/grid_history_config.md) + - new methods of the `history` object: [`add()`](grid/api/history/add_method.md), [`canRedo()`](grid/api/history/canredo_method.md), [`canUndo()`](grid/api/history/canundo_method.md), [`disable()`](grid/api/history/disable_method.md), [`enable()`](grid/api/history/enable_method.md), [`isDisabled()`](grid/api/history/isdisabled_method.md), [`getHistory()`](grid/api/history/gethistory_method.md), [`redo()`](grid/api/history/redo_method.md), [`remove()`](grid/api/history/remove_method.md), [`removeAll()`](grid/api/history/removeall_method.md), [`undo()`](grid/api/history/undo_method.md) + - new events of the `history` object: [`afterAdd`](grid/api/history/afteradd_event.md), [`afterRedo`](grid/api/history/afterredo_event.md), [`afterUndo`](grid/api/history/afterundo_event.md), [`beforeAdd`](grid/api/history/beforeadd_event.md), [`beforeRedo`](grid/api/history/beforeredo_event.md), [`beforeUndo`](grid/api/history/beforeundo_event.md), [`error`](grid/api/history/error_event.md) ### Updates - Context Menu. The `navigationType:"click"` is added -- Grid. The drag-n-drop functionality is improved (The DropManager is added) +- Grid. The logic and appearance of the drag-n-drop functionality is improved (the `DropManager` module is added) +- Grid. The [`isSelected()`](grid/api/selection/selection_isselectedcell_method.md) method is added for the [`Selection` module](grid/usage_selection.md) to check whether the specified cell is selected - Grid. Updating / improving the export to Excel module - Grid. The possibility to clear data while editing a cell by using the `Delete` shortcut key is added From 0d32fe61747bac6181e77bd84c2f12dea22accb8 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 13 Jun 2025 13:31:54 +0300 Subject: [PATCH 17/47] [update] what's new for v9.2 and the dragpanel module guides --- docs/assets/grid/drag_panel.png | Bin 0 -> 39647 bytes .../api/dragpanel/dragpanelitemclick_event.md | 2 ++ .../dragpanel/dragpanelitemmousedown_event.md | 2 ++ docs/grid/configuration.md | 19 +++++++++--------- docs/grid/usage_dragpanel.md | 18 +++++++++++------ docs/whatsnew.md | 9 ++++----- 6 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 docs/assets/grid/drag_panel.png diff --git a/docs/assets/grid/drag_panel.png b/docs/assets/grid/drag_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb246f40f5092047ff5619bac0087345b056134 GIT binary patch literal 39647 zcmcG#WpErz&@CutCX1PwnI(%X$zo<^W|l0p*kUG&EM{hAW{sGc8FudV{bGOYM(oCm z_kMIt&vaK!RZ{24lO3TTFNp|;3kL!Mf+#H|t^@)C4hsST`UM6G_{+gEj6CoI)>B8}E zvwwWQ$~vZ$1jDt1jFbedi$jIBe0-#em}8*JiC@3pZSS&-^BmqjXR_s_-FoIs9XiMK zTCnq?io%ctqlm(AaR{F-R^YYa|NS1mCM+!tJ37et&o$r;I}fBHL4QwsBOze_8^nZ0 z{&zGA1_|x+fKz@QYd`$ZK-%~VguKrO z<+c8o&GhjY``rm-Bquf}x)0uLE+PB7?@IqH%pLWGGw#s5 zvpb+MJwv6PZveKjqa|W|RVaxUjQ8H`YB(<#&rT8bpV__}yjdF`J4M!F{JU4VIYemK zqI%PDjbA~feIVKCgmTq98B^#@b!VR#N-bt2WLlf!MjJS!**?)Vx;<*DvK#)tmRo4E zcRtf)KijS}{*_ZW-x4AeY>Usw6vpU%pQpeDq}Lyi{D=!MWqrWpgFs6ZHj&KBPYo;z zNmd^fl2^ChW=uNlr48|iVmi&1bC_beT>H&17XR$YW;-t(v0$^>_+pKZ2ks!y*<{o< z@(|D}O4c%f+QIm8_`$ZuTi51fJQ&@}q*yAaIqpoLI?bQH;ftoC+Dj=^HD7A6qW1B6 zzraNQYuW^~n3maSr}Mc`8fPi;vk~IO>o8j$at?^i@Gz~4m-D8D~a1)9mf;0>eaKO_wM^69sT~vGJ%@Wd9MnCLlUT4 zgeGQ_D^rWVRc>T#OSD7S*xl$AMO@V*ZgSjeU6)0pall!@1Z7WmF5k0ct8t%6FY9?y0o5sLy zwMAF%22?W4#L5|1q#~&!Px>LmJ`{0#GHDiax}4|ZJVp(%v}aZX)H7r(XXwUE&@pr? z${rl9NxhVUu<@>b*wLehx`-4*FdM&lQSl+0E80Nmo;pAYvBZ?Df?VB9{VAK^+tinO z?LV}y?Rqv?B@`NVPydkh%o74lNm)}Ii4eH9dHoJ*))06_vWw&XS=jKCt+D2OOcriD z*ZRxEa&hQvq38K^NBM^9d&qsrKTg;@!vp&j=l7QYKZSZeVTaQPc1KuPdK`kYYcpQy zuzPXjXi8b+ef`dX_It_PDU*ZAY*}{6W$sS~H~pd1d*hMPr@?Wfi{B*JPLDNrUH*m} zJ*60|cgCq4-mGE>Eoa`Z42{`PVqJmaAT(jKx~Ewmp?A(G+__A7snjnm;raQjvP-T8 z?XD*acw!r{H}nmcCcoThGhvm@SokrbUIk68MZOG9c||WBOc;5T$qH`7N0fPLO0O=) zK2H`4O-*@*@Sx{c@6QV`c8rl#U9Tpf3PbGbJ9B_p->&5lb}!>pU5!R5LVRY5&o(7h zex-nZ_Lzg^72pk9I_T)#>*Rc>S{s2KOFCYYzu4=Wf`jotz|`|T$1LK9u_QVtp9ABD zTmIaptkpt3oT_Rcq*I34eLWxQ|FrKxBy5narOo&7Tcm4eb!86SmF}-vjrAJF(DO7! zntBYJ|NfZZ?)VOdRHTN+VTe>U?wL(3NvoZ3Tbb_Fvs9|`ap8H;&Kh>;f0&k>Rz4+U zQpK81!_+lM=T9hE+%D(iv&>PJd$U&I^F+k)uJ1zd0~U3k+_#o!Nv~C~Otvde)^p`u zGwbH9+>ggLAn4O1kB~D>b4pwvhZy9oI_DB>i1l<|J(YtrwH+Y+yG2Om_WRnC1Ce;w z6I@jXYosH=&2s&QvtY1$N87{8KVhkP4WJR{kcWnja&+mx0*2`I1N6tn?W#BV+=gy% zdFgj_%i;aVDOM66R(n|@5tlAhS#9PtyBOIG0aAh6pbvqnOL7@irs=)2@ zcg{E8aGF2pu;~!`xL`;JE??wSP5X1ZuXU>o3OIrBkhq~><|yn?G=4qI3-U>Dm0EPG zE4!jV_aaYvPnM5jnJdI5p1gJ)>h3`9tng?2kK?^!i3)hiosGuSXvjo;3RkgB#gy5f z4uz@;NQu84ufhyMW5OLSC8?k!-Sdb~A@&0*hcwLOaJ~lToMP8^aAh_YQVr7$y=y|w zeQvKB10s6f`31|Yf9q;jZtH?y+4?0-c2tVtcm928jk3%_5nh@%QU; zHZWyDeVr?0jzs^09Aw^6HuaxM-~U96eaUh|1aDm)Ct}a($BDlXx_deWFpbp>3ql8i z_cC#GYKP6$A(Cga8d22ityl_pF^RUhLn|?7L#{5>)S6>s;L5ub@7tiF$ZqH(`*}?R2->t1r1p~u=D?4EGID`%W z&rJ;?rJf2uoT%#fBB?V|%~aeD7UbP9v>oiE-+f<8_?_$?C$kx7NgmWrHq-PnVK~3&?+t%ld&~9%w z`D)eH)fV>Zb{#f$X-VqUYX63@`Qm4Rfip;=vJMQD;3u@b-$hG3L(fAbp7;EZmvSax zq7mK(h=zn^@R2x#Zsn?yd$+^b|WnGi^q;<*fpEf zs*c5T$u9%JJblM1L-{*>M7P`iVA!uabd_{h7cCfEWas++p!$;Y!8{06bl1FL*YCam zDiLM<$f2M+Tf7lc`9@GlE`TvL`yKe0UrNZ;U!6pef8B!5V~vfk6oHA(NQ0{WeCU4mJI7Gh<=bh=&_G-~EPwJq|SMJCCV?%>4n#`gdLb zM+dT$$e~JA5Zehz3~xWRZ0HAE%TL};Y^^k&>swQ2;mY)n`^vv+nL!kkWk?*NLhLb+ zF+BbjxqPKcTN?IIa}Pk4hE&k?Z3|?{i^H7y)NRR_7i-gOV9qukRggeHf($zLt0I&? zH|uLuQR-Ul4hl}BQ{u_G3#6N3QoFurBn`*zoo)@q1oXcY4j=%!rGFnRKC0tJ5-LWlH#d+Tfy)fWE{PvfuS&4dH zceeo~cv{ww1Z`wR;lJJR{hZ*m!Sp;6iqkZg0jY;04siN8X1ja>Q{G-0@uZ8MDF_@xt}p*xrdSiL+WY zlbD7EQFqg#bzZRz0o0aeQfgN`1Tmu}^|DiDSE87EQ$<8k+@1DtYw{ht3`Cp4bL6_c zX$@2AIQ>=WYS(>FHI+quug1T4NPKg#gUMG7E8`UVY^vOSwM$+*|HUQ$?KJCbiVK{R z_Vxk2i!!2}7rkra-z342t96?PHhtK#Tmx+s`g48sA*ph(zSET}pNioiB&&OE9ue$)9)XV8Sn^tH7Re?}7J^;L@1y~w+8MvxTSc!w1Y zzWj(U*6`yDRXxXGohuo&=$zhr%@=-tg^6vFEY|^%XO!Gsfj#8~b={pysrAB6WpiXK zEvNn1D>wbs(8{>@eYS7j=lFdY;^&gRsoc8!k}ccoU6H|e3N!fJdkU*{h*5zQ_j54w zs$V*%4*6}rYi>LI<9N=dWIGp40_6MBZW7bw_!h5X2{@-43f;%K^WQ3UQ~{nCQ$no? z6{nv)er!jpUzuHIsY&ZWY;oS+JZy4ob~~!*08PRKQ+uGcRkAQJM|{cK&qQ^WUvZDX zU@li80@ijqc{|0Ua}aWDjpu5Aq!L&m0AAVLT&U)Sui{`4zOVNeVU{kt*d7ber!zjM zT?CBp)_INX){U0wuXeTWJ;s{X8sn`AM(pMeF<9~GQe2i>&Ch(cy8TpI0s!}!m~ z1Vqx!lhGeFt{RrAV%HI6vl7JjdK=muI=GOnERfn?ylikXo+Pat0FN_Y{zV--l+-jd zEi>B^aw0q{4PtQ!;NcfD%lj=lJeH@)HTSPZHb~W~CbiC+u&Wz*jG%u3nuUV61s3f;1gJ+Y^%wt%dc+fp{Jp&WH3;JGpy2_X6dD!Wj(%`I9NVWwZI0}WB+B*_9ssj7cMO-YHgFZ#cg zZT#*_{dQ`cl< zbCw@YDSo1=oM(3iHox{rbhVBreRXwO?ptI2-c&|SKIDP$Sw|Vp%&zm?pLHr{EGr)5)mlt8u3tLU_BY9S&D_*|@mu%wSl9DZyE)d-B>&p{u-IjT%!O z@MPKbe4$RB)P!2~XIw|H%ybPig_GCHhj*6P4;m@P?Xpg;tAD)8!D zcH}AUWpu`}P{~u3movZuyP|{bm6yFOc;ms@D@_{|cS}a@-Ym)1zNb&upZE29GO^_g zqNb6947n{|d#(oHgVGhBm_Rv=bHwSw zTP5%%LT^9jN|`jmS4K=`2lXetm#F0A{yucwv%|Am42H&xJ7M2CB>HiwySZlK=pT2X zt?nA9@>b!O{z;=3W5A4lN8Aolxpua?zfyAlFV-#T&|-g4rHudZw)G9^V3ib=(;(%+ zsXAI4c@}6aLQk`MTO0mvDu*vV0FYF0G)=o9#|@m6F1^tgo6DJZw^e!qRW2kcu}Ue| zmOTDEL}lqcw)7-U*5X7; z8G_uZkCQ6-fu+~473%3SWSxyox&Amv;3oT(FGf`3^lry$y+rhh#uSZEcs0i}u9I`R zYVa;=)aCbc-#^ea<(|HIG7mg8hdWYAXVZ3x2bVq64k7anZSDnfW3Ry1yp`;LJdx^h zKfD0XxJceaii*3|ooPR%BH?wwPWDGJi~B4JSY!;!=f?%zVhc4>62d2{thXhpugh2b zh@8GCIcAel9m-FVxO}o}pX#Ls*NbFGdVnSQT^hGq7hj~*E9%bXTO5M70DMkU7C==j z^l1C>g?__ z6NP*41VQf7vW0u$W6=bpkUdL(XS-D-T>J8(jC2b&Oc0~fKu3!U3Z+=ax(_*-kVT@+ z)_|G#b(h&+_F?eEx6~E0P*P_^-)Rn= zb#v?Kw`4y5sK?h7icO+PnJBEqTWNJbrNPYOzYm3g*}+;U)0aB@=?wUt9oH5JX>UKY z>`3ZJm%>IjIvO9$^~{VOB*{p=J)yA*eomw<+Z!a=d=OBuj!5s}O;l8(Nw1GH)PM2y z%-b6j&&hsNqY}^ZqloDkSEUB*XN~H%xkp^3S<(rqr znqG`N!X~=XZrDBWyJ08@5MS`OhF?fSWzz@4Ujqc=-WQaVYMr;XvmubQMSC59fRzw2 zFADF5hvu|ygfSrd9;a*x2tcz1gMbrS^S-M6PRIaX#~Xfx;%E(%AS1)%U8 zieD(F_!V?LmeZYoObIEDrGu)7KsvE0V!z>-3gOG_v{PTd}S)=F1U{mr<$rY++L3+8ZAl4^3b& zjTeF+t^t0mxGgywPX@jOil&lOJoxG(j?7del*flD*5hy<{qSCVP{e!^{IbVvcYyjA z&JS)EN9|^c`;#xTrKdXPi1;JFg5xdjpzd&Cq6vBrNAN}j&4R-X5d5_2K_=GsI~}64 z=xOp{1p1&6iJKW9zUxaV_>-lZscmVINu+nK2}upV2c2u8@EB7=1^9tSNQIlfX6r~q zA$K&VKkRTjA$kdHRqF^$(7k*IyGC~CQn3`+Sjv5*Gv4&RtRp$c-alA<6f5P5ZD;pV zhp}}8;T1?H;<{Q4lQzlbTWLpolEHeQc#YXXYT_>JQQ8;Rrm3w(k$Lp+h3CXh=a#Qr|@9}KLLd<449o}$IF1r z33Za*_Z4+IPk&$9p;4xLt@W)mbW$kR->z`d_EA*tofc5yh=xbi7GM;DAQu6|B#%;X zUxjCWUiVjCX~a3Du3zVI>9L#)$h@3Dmh)l^D@QKgNO5&|kFUu|z1*o`(aZd{nWjhE zzzq;d0j3aNf3I6ePf!vk7Vqd8mvjw*6%w`-D+AKi04LIS!~)XNVJowF;iRP4&icN7 z`{f#Cfs@}+x$LR4RV51&fN}{~@B57b0y&0F)HZG`0vG0-LwT33f4BC|w}U$wuOS$q zX}w`4Y&~J>UIA;?k9T_XJg0|r#@*f7Uud&wVK5#9K`EglGcdg>{5%q?@w_jLCFsL< zmSUmP^ha-jDNAdyK8aor*+D5Ee5k5ERg82b$1uClE5A;V?= zs61XL*Srf9+oekoP|b)c%*Z1l0QIBiUcW%3AjP3sUas2i{)`QzV;3f3&549Gy))&L zP+xXK#?FnA`Uk8vp2SgyupN>_*0vE~hMJ?&&_Q&4oArTQ@plyQ;;px!Hv)i~^tcS6 z`<>v4CbE3>Sy*p#04N%zU>4+Ndtz{{Hor>-!rS!GIj-uHcLof|*sWvrl(?%8c2a_U zo9_>)t}|u`OjUZr{gZJxUB42`-0dRU1}jR{?`4L>wrR*HMS(~^YxO|RcQP~E^wB4) z%^b6Arz_BJH}%0^z1nRC8*C!&Oi)E7Rwbizt&NI=EeQi%{A1fO|J9S-jjTf4uQMu9 z45uB%nT>U{umq*qs6CVEgCQ^q+~$)sRcdyn`kB2e-}n@*LkNm^Hxluz4nncnU97_k zHOf3PHwFhPR3w(!#F_GSaolVnq&Q-JzuI1zlt;0u?qDFBwf4fv-3y@98Y+f8_ZWZT zE;Iu`ND0MHBhJ^~r1OeX;;hK$i?{fGZYG9{ErCR$WZL~QjM8X!VZ2{fR^r2tc3$dh zBQ;Lq)q|@S9+ysbVeo*Ugq%+7L>=pm*wsd4edCr)QT*%L=R4E~$*(6&X?pG7hsSv- zezCfn65wL?rdhc-{6q6#y1ocQha^C-V5%r7N6TehaGrvS*un{nVS@QAxR z)hHc=9ki(|Y&kpKQPK3;@uGWW;CquE?hV??Ren4KmE21qP1E3M_{)tMTbrUUMbREv zJRFtxk+sUw?}F*Cm#6aX0^}672HvlMN8dd!C9Ata<~z!UXI|LoIOFmY5ti^nkfMc_ zj@%ryAIX3Fqy>+hA~D#tW{XP%SWej~S=q_!C65iQff^VLpDp2_YfW|r7t*h(j)X4@ z3NsGYb+PslqH8`G5!J6mlzTmr&598kdO&X-X6pNiZZ8aWpOB_CnlOs-rgFzsCl;0^ zP@l4-rR2neZKUjU0zDLQ+BeX3AWmxsWa{u+%Xg4tPnE)a>lg~iV3k7 z{Q8(9WHfnKIevOhMAGD+|Q7=>fHOu^J5nQd`r{?ey-Hs5`9|FZ@&MXGuPZ)rtM9#W_sr z7x(QL|CHi~9mpJq671AwP=4!0gc9G&utSup@0ig65qt*~Bm7^GYbWr35>R7E6wFxG zXyEdb5fKqtSy|!o6a9y+qvxy|NTj^*LPRMGusjP80(4jGl#N?C5m#30{{46KxG~b-8 z@cERZRm+$FIB#9ZI)KSTBDE#d)+#AITu}1eQgdb?I!7nXL7J+h;eBj7|IdCXameR2 z$}?$b2euuy`XlC!yN?~VTzG3VM1RUp|4%PKxk*u>k_&CDG7nWLw|;2fMfb7GJw7*R z*j&ttj@(J00KWXjx0ArCl6Hl_zTCwv=*EYq`1ZDX`D_{A4Ic?QNmUj9^V!At zvhuH}xpWiY(Ef~bWHQk98M?RPz9La^h5-%g0tqWKlZmNd&`PA(I&@Mpa?WzdtghJ` z?Tq`ZGEaiyt9gyaxJueYCX>*2zY9kzEBfUMPN2@++7jC5LR3`JalM=VrA&jHOVd^2 z4Cv`wxLtEMR#f6o1f5}kbc%xw}QsTmxc z&+W0AIHNCO0aPvQ2W>(Gt}+F8o^px{cIkw4qyO>F~_eO@Bs_tE!_s$nH!^V~1Z|&5!e?maMXP-85G*gh) zLeVwZg{N)kh{IWi*airlumeifuuiL{^;4Ukla`jw@?tGWD9R@hRLqze`>kfBe11N) zM!TYNtM^#AU?J}jx!KKURF*+rDGW>e&oZS^s;%(0HNE2~qH%lGKg&ZQ3iBM#CMfs0yNcCPccv1vJhd=fJ*rF6;=PcE3MFk_CzN1-tnp^Ov>B$LssiprXQgp!j8Dn zZs0brByJZp#?u!5mygb!l+R}qV?`uWs7@a(9X{S47~f*f56YZ{K(E3$1w0zoVEoo< z#X1`8&mN*IH13hmL<#jLV}`0e+>PlNX$l6Fe)L%m*{SC#(N@!{UYOJH^&Iz0p7zb` zZYrp$i8fX0T5gO(14S^P6#`DhtLvOdOCeuO(6NzXXiRjt-1J%WdkaIR0xEJKctI0UHQRGjs7)JOalE#?C5d5tetl@N$(>$O?J#XPAJKL z^bd# z#-hE1kp0lWlp>6yIlQM0Ped&EZ`39?^@1d_w+)9{w=;6{ySiY{cK^FEU6lXKQyY1kwj98b>jzH3$2$Q zbV;yuQ91@E4K~<1ropkf*ql#jBsw;JW_=SP8~ROAa+#xXwS;ZyvjMT0Ei_PFwVAi- zcU-rr>X2A9`QD!m{izfyoR@u$^9{*6nTaZ|G5UH-<>1XU?v+iJ%8h52Svd-xOIZ6VUnU&o;)I^ki`V)0pSyOU_?dc_g_$osm#*OPy(<08_#=yI{f zV}Ua!yCK(hDORY1H6yjUz;$t|q^z>amC7yg^Lfokkk3wZt&-@w;BEQB~?#Q<*$%mXk};^7`8W$H*e;?3mMie8r1O&PYKB1eE8Qq z6!_n)m`Cg#9^@-fE0!kKTVZzl&b+hKBXyT5DCnxn>_3AsCT4Bx^w9jAJW$r~NY6xH zxo5Ii`EHVhXr!>oeEI0=`#iU)zn|xAMW=(5(UgQ%=Rp>ck&I^i88vVk+d8-0x6^eY zemif4=6*)(cx?c;p+DS;AA5&%Mo#C&a&28ad-?_5WM`VsSz1A0@MMBdDk^8l7Y9D= z@%Wr2>P+qSvrkMssqnhvRU`ew9hPk=`FeU2eWivWegJt7{qZn_ysb@XtW#tBt)r9w zc{4*wrztV@gnhP>$_ztv{lhK+%5wTj@s3XBzBa!JuI|s&{e)np>IGWkR)?QcDLq^V&xqrr(JfNcU`X zbtz(0v-eG|l4zvdf6`QX^3uZ>faGSQJ(lSGz~=ACij|*QXABMRhy3OT%D0Zl%=Cc2 zIH5Vb9Y+HkPwaSK_vFu$lV&aO-E5@%l{J`$i1OFd6izUaZeKdnm>(bz1B9NZag9#6 zMAf#bc5nH@no6PSAu3|;Gkc`E-o7-~ zY=0r)X7kNNvpmH0RxQq~Q|7(>DgwTA3l-Ny1z7 zz1$cKiO#a}Q~nTOj#w$^gSlBM=-{XOKB(*Clnb3ugxISOzZ#$?i;eena-02PwA7SW zzzdFs9(>q*sgb>xC`U|IouQ;YINCpp1~B(@7wJQsBcM-6LGK0^>$X&|@H}_gVvaLE z+(sO1kv{sz8}-(KqV0jO<8C863;*PUx}bg4^7(A_mu#%iq=7;JR{h6a`W3b!kA8w0 zgwHLLo2F6foh;K^gVr5E7)y_D(gWPkW8JC8{D3or-!?y=D_jS4Ap(rI5l;q|kVq<$ z!twD^*O#|f@0i7`^d@^jQ|GS;%9LMQri6Z^-lkyF3cb(o8hyh^_+X7f$-=VjCWaCM zk&Ml0zc8k%RN?DC@=DQF$$5x!{F3v*mq}$l*nASs7)5m;NAk9rQ+v8Ip(%=ezs@Xr zr&SNC*#AZX@oid678^H6t!%)5%fQPqF^4~BH!dC>dr>h~?eu$ZuTUnFGDCrzWf5&W0D3*DE2`)Kc{r5T58pPEL&hnJ=6<=CG)tVeXUL} z_3_Dm4AU=13N#BxK8Tq@33B_-M!*bn0Sga~!Xgo_T%Jz`cW2g-K%c*DfdfmeOw!wk z&3?)mnac_O^zs^VMxTtk#PtA!=Qrx(lf@4ICi3Zw$F7|{UI?(UDPO($@JZial=pOG z#63iz*ok;Att?X~1Z9Wv54-B@={B~{XKm!3(1TGNV~&7#9SjjKvj2lex#n;wzLYmr z^30`25sCyd{N86Kau(4IVQs<9S=g0=nv~%XVI`DaMJ3Dl(TQJ0ox{_63pu&DqT98M z-8-)Qv(RCmJt5h89X^5Bk{-c>w#x(^m>q~rd`FQl@NJ3D;OUU49&78hc zHeu#&Q`hf>EoPTlgJl;F`AhFt(vBoso`RE9hvw98n`u!SJ00)2yr@uv;w1BrYpZV``LR&07(rpCZ=V%m5pV`a<9_E!c4r zWiScE#4H!rQxbTnW}2o8=3a6at*W)?HLR?rIUc_r78IO_vbafNB87oBC`AkyiWPuW zXa&Yrn!dyTS=x<^NI#+bqDebiZS`LDCeohi$aeeDnh@7gChap#R6(0F!B%{I?@GWj z#X3-JF_&nK@U8V*s$41z>GXxHV1~l5}AH!N2;>vjlOld3LBT^tiiX_;Do$ z%A-ej5}{ciLF4*Xz1jZZ4{v!nK|c9}{Y^+myjkzGm11wx|LZR`_$00hpPiJqJUL`H z%z41!Eijd<%o6rpWplN&=utY>HZ0-n>5h%l?~TQ~Q#SwY4N`$tfflm_(@Lw!>gyPm zS5&c6v%@w&Zv`@L1u{|?ro(J|OEwn6yCO{zHvv*6Cp7o@R`qWEvIT$^7}xGEMLgO> ze|?_6JIC;(QB3gPlAhfa(wstTChLNBf|mrz6!V5QX&k_GibN*@+fe3sPqT3!ao3CdSWwzD-N7A=)|m{_eO?>`_CM$i1}`F__RdESlX)@l)CEXi}#y^xrr1W66EAw{vbeykn9L zS(6-H-r)qFp9f>`3=2H!)k!iowI$Uc4QO_cUeaXseCtb>e3`J6NhF)-O%7h45ngWV zF8J_5P}n$smNQr{8`lQ_L?;g&%g17NYT`+RQGSFyI5B*#1P|y8&NQ5^yMF_A+=b?y z^QHQI&Cq-dVPZjET7bqMEUD?BUa!q`6-ozzHHmqRx}zP9Q70#Ezy$p=<_9TdVOH+wwMrtXBWDa|vy!e?hWo(tCGHm`v{R2?hl~ z2Mc+|NN3Psw9f>5Vt;>HNCu}Luq@YXfZrSrCL_j{ z6q?%DapGxCR-*1r$sIaGIJ}ea_!wsoHO}MnaKT$k=n<8=WnJj+%EKqv>7ut$pE*$^ z(tp?Ca~7K{Qebo?l-a%J4POI-wM&>Rn?1(pF1Fd`r)T`WWyn8Y=B7_y`O?~HnRA^n zo*B%T1uQOn>T8s9l(5TW!ckdOV2Pc|AKgtbXI15P@Y+0$!=Gg}6oNoyM2#<9!ix)!x*5`$<=S`P7`mQ4$$NQze zsptM$|3rjo$SYP!!bVyT@gwaA*T!4Z zt%fny*vTgIm9r3DLvSPMx>_A8{SNd=<&8V zcz?s4TPft)W*w~DzMsYO+X|*-Wa#5sGQsj&+h^jhKhf3QLhFVwU{{8-3xUL)mPrdHN-?4YEl zHyDvH#QpBfIg$Qq#9W{6n$gHU$051do6_A)9A)nOymO0Ot)iaqLd~+U?6_;M;8e! zyUVJY$>;Ehd3xd;{*-s_Y!CjG&z6{o;c#-eo5`ImVi*|z=g*(W?`D-X%hYTO3c9vt z-Q8j2!p)JG7pY^;pXV164T@7@umrrptb5yvXRk~0iSkKhkKHEV(LYmbjJY4?V53@wN~!rKX6l{%6li8F zd@L%LoKM7|pned^6oVzjB4a5-PNbh&Vxoli+4ULKDd;GPCzYn-)?tPz_axLzq2aFH zuR@~BrO<}^`RmDa330iJ0IR0qMNB75e3d?4O%^C}v{E1*2WelPNp`hwZk=k@=5yz{_)?}sesRb8S)>&F$8>U))%L_K=7^`4KR|lbk9}eIrjBuw<02X)2h$? z8i`fU{xmaNMNy#zJxxmt5&{U6UqYy8!~t>y*3mc}RiMgA5wo+bZwM70*4N%H$Lkd} z?#h45*HFNJfC$(G`i{T;9U(!hi%3Y&ffbP-9uGvcMCkgwcN4HybIE!F{$uI;r$@dyQK9Jn%12H;0TB&^*Y%{g zwvdSBU-*_Mt7XkcK)@nQ=) zWXNIlq6RfJ{opY~#bQ{TTA=vdiJUY2QpnF zMoqvcT;=V3wTt}t%kxe<#`IIFCyfnQg@uKIBQ0^o6Xgw=ZLvmPg?1+|vDKcZU1&i6 z+cTOE+hQFQtfdv5ywP!4?0)%**GB!9eppXVzsvluU$g%{;s0*p{D*mi3)x9FSt(e;_S(w|PCZ@o~aGqg( zd{ib@(9V(2`dFwqtlM2*i+Y@&hIW# z$yMaO775e>r40cq1WS~G+=4^HfP<9DZ4s4r??^XR<+RF_XC3=PUEat_TtWd=@hARK z_OGdj&Y4g#9;$0fe!0M?LcW~W; zdx0F4-%dRkkUKlgg|NU#B>*y6>gko+QZn>z+!`K%w^-iB=h^>l@gM%EO+IB#26Uzq z*YB{bFiGne4yKy`yIGHJT>wJ9nR{LewBBL)YUm$os@RRp3LKVsjo_`gxt7IE?msVH z+6xNq2sz}jZ8UJ?y;kOdwJ-W@|BXoNPa?JB1Xqde4IO4>#ApgqP>>lCAE5kjrc9OE z(P+A4eLJx1TTdW52AqtwjgP*T>#4iKe^W004hkl%OA@0<;?7hsb5}C0$!}MXmzwaD zXt*I!C=lNT_V%j;z=gabN#-gA$#3Ttv}Ag}y(`e@I-_Y>C6+J>()Ix9u&k|q=?Bj` z1U|ICF+muL|*?vw$Wr=5q>>41Y<(v3-kvpBAw zn^BReo|SR#APkX-P%Cr+pkWGc!=d6=rf{!^U1)@~%si<7r`>6jpkUmvAO0z-+Yo2m zH9Nm&xBG!?A4H-RV#S%6ME&fngf<>^fEuW6CMR#kH;dwuyuzLUnY?~bjWZ+%UPU_4 zVr!%yr-f~jpu-&sKN{TJoWY+T*6e{0qpGsCy}mwic6Qdf$oXQO2MryaB~6yA&I7om z3u2_OA9KaujXB4@GLrN!EWGl-K5Lt?+S(!+PE{B^?~Mo8N*uc(y3yZ%9cxhEuSJy_X$MC97pNO zv5S#=tC>Jq%Y2zb(Ws21zHP_o^KPt=(@sBZC^Auu+Ue@Sa*eUi?F3g84jWX59&&f7 za`Ds4X%!Be**M4C`1ttm*4Feqv9Nrl5jOnFq2sw?9-k*>U`seKG3IqU8~%YTD0O=< zQPonhU`0Vg6S1}RIknL-B&m21@$spms_yE}+k_M>EDA2&3^CAc(N97w0^!n64G!)l zVQ3zFA9jK7yf^^BjFHrgZFV*h0Oz9{|8U48ib4wga)O;k@D)b{7N%zg28ML|7d&~O z3nSq8;-vD=CQ()}1PaVS(6#4OWXhbbuIiMsXY1+nqBGt&vftGYLa7R37=en$#$;gd z)2SEDN=h0?q)~1aKwN9I-7Tx?Y&~jxdh)pFc-(089!i1<5j|UPNx-vf4xA~FbXR2! zxlFTnMz#So)z;RY3uH_TPUnfGF&l!_)YRx^>1@;9r47u-Jc-p$Dw7)Gq^UBAB?Mn(@X%Z-PJTGi#1(AFcEQ5qSsk+DnU6GZ0kq6q(@uO^or z5tZmAZM9fSf`YYc$~ZVM3+ge@j#JRojF>tssI06!5Br!eRVJsT1ak0<-s2+)RQeMX zuN!=RZ`?$FPb9lTvF1-#+rfQ?ZkHPqjkas4EXERRo02HOmsNXvCVmffIj$Z|C@@!t zLZ2-|w9CrH@}?*ArNZ^5E&2IDe3$J&{<7-C1885Kw+F7KXd#y+H$}{!uH_MZ<^>{G zC4NYLiG*QP7bl}?<^ZQL23ye3%}evg3xExvHHql`NK#$p6SZ{-6B;(VrHnfLb)w2! z+muq_nC9MH&y&=6-4R`SDKuvv-1Pa~voNkkwXFxh!7HIrfz{cc$0J z%OPe2V2<4nw1n`;$TngI$yh>DVBd;t24{32IP}ir>+?}TEVt(k`JX?(5)%4=Q&`y9 z9ZdOuuvuDK`aJKaMB#D85WQ_dXY#Xx`Z51cFM#K-SizU@q9V$jot;!}N7BAf#8)-{ zq3rxqUjO$~{g#W?(`MiSGR+>HVc(eseDVSlbZkx=?ECxsv*nt90zm;aobh1P_CbdI z!P!ck?e{NqbaY+!a@s&m#?;obp1JY81J{548)RlN=6tOwAw7Mx=Ld8er!6jUWxx?( zVqr)P0Qe&Lte<21y_b)-LqZ?%>+3q9hbQr&I zZThfXw%;N(G&FGI$H0%?R~z>IBeH>kf%&DSgw)jG{s{DIkI8$Bl`elF@5hS)W&~iU zk=NBFI6giG%1+1t=z~BdrLma<1@ey(j@2%Ac)M#`>z?}RDPp+j9u~w3?f}CQ$nWA} zHp^M^GdJ(z6YWh^Uo%HfS0&4S7T|{B0Fap5%O#cyfdcFeIuxg8&0( zwjxu~F}QdK>^}DJBVH^@q>TO&2)+U%j!Y-^tLku|tt2nP&4KAtnQ_;yoi_vQCNp`! z1C~y|CYugM;fTq}A#OXQ8Zb*48@deaX6dwJ>nRMG z=m5Cc@oa&NoX@wz{(*t(8A&2TY=SurW#zs~-L_O<$N+~%5?^u!>R>Pc6kMa(fy8~& zmkS!1(B{=BSd>IQM^MhsPY|g4p40nU=R^6ySfZ&uWTEk=>)n+W=R?fs=w>XS>c9ep z!-%i~mX|e(WYa`NMZtOu;*bTO0)R$PXE8(ScaxCg0F3EC4NJ+(9|S@Z5;HJFYumMi zyuJCL62tU922`Hn^Ed^^lS%3+1NeLeiTt{9a^Ci+JopJ8E&$(v+7Ws`{;mmJpQEGW z*=hs)96M9%r@FrHz;Ha7=TTnR@aX7H!goPbW2~3vPu|6O5@CzN3@l)*IQ|oJeEZDp z`@-&gIJr+H^b91OIegylm(;TcZ^v9!RWbS8&bE@Z?Y6hWhz^P}?2Lf=2RbmQf}Y-F zr|)Yjzb7j^7QI1t0O*(bZ!ttdlR(v{3HtK>%&!ItM0Re^{^P(tmCK&6SUxMiz8)js z*Dtj6j114MKxhx(0d!Hb%Z-liq@||Lu}W?!>P?mZi>a>ws;gN`K)tHkmrc`?k)T=Hp8*K}CSH_1U^-<9Ghjo)q%ea}G|lc^3+q zo=EY$Ql@m&;C{<%JKSS}%q19kbb7kwk{n&^x9N5q?IamR#ln^ryk6!%4=y7k^S!VT z4JiZ`;ypVjr?EB`EG(?e6Cy5a5YQ0>Ah80WktLHrX=#klXwZQoXlQ8C($c~jb4UzG zHVY$r+kn7L0fl91X7*lLLqmcBZ40o#QYsjL5?Ud14ZX!|+ey;h-{=%7DM1SpSH}4I z4jhVPlob~jch&Q#eDUOV;_bpygaXaxrFw~%vv9aZUPlMdwh>=prs=4n6^F}~poTs^ zCPo<0j>SKI?0=(x53onHcu{DZ&#D>h>$4waXpBio3C*Kfb>IHB>amx}ovDZ+VYFCf zG&?_!2KSY*#qZ-sEU{pOZnIhz>qTZj*$QTBvDYzuJ~5tMvPlM@O)sExBYU@iLdq~8 z76JGt6&4%z++)dxzF~PZO>3tO+x1Kfz=1IX1_h2a`6w&7WF!e2TYPT_vWYg9q2CJ! zFg__88@j>_4vR4aEiEnKL_A=&&$oIVxCt@@ypooeb!^)%B-J&52t(FUWoOpNh%7J@ z;3NRHE(6H=DvFnhr;5$Win2`8RNr{4IASwF8%qMkBaZekiqKO9_I@J?B!V+m!}R`! zxQLM|Egtsqy4R>I$$uhc8m_al+COwAYz7zjh>FiIoWP%KIKS0-2w7ot%T?U2gBV&} zWr6kMar_N4K0dClsR>N(>*x*{6;&``gn<1hBQ3qpj52OkOFFt|%sX1c_$Y3%Kb1=$ z=$+EjBl>e@2A9K1JtRHV2nPcjJHNy#Rgjha z)v#hq&dHf1Oft3QzGaV-JvsP8C7+jo9FQbn1AeZqMo#XToNsm~%bPsaoZdYZmzHkV zFBlx1r`FZ6(~lbWg`!%oG<*Yu@kh;@nNa~2scYv**GD89H-1yyGz}3x%)*U4-Exav zOu7a_5!!)8G2^0|Td%^Rk#w}rOf8lI7B-@#rIww8JuU_%B5&FLPKjy)GXfWmLlEp{R0sf2&3vl3sox2>JoY;U@G~uGMvT&G~m_fZ;4R^diE@yFh z^D&S?)pj$lYYGCf_&&RnEZbNBrj~%uwams_q!a+OtbopipYW=tRnyP_E!SBB#!Kzv z$AO7VzUq||;4tQ^)mmRC&3`GXm&k4Z#0(q`KwYnUoe2O>IRPYPs$lHIsZGNLOf>=& z^z`E55FjfrKH6l{G%COpvU6}ayuI9QJ2rCzSPgiiJ(GP4kF_K_5U{fwP36>e#7*Ay zI)R&|bCrfdmseLzK=#x2#raJ3YXY#6Q3O0aMcKZ~^TzhYj~@*^J}q-OzPnblVGs+? z--c30py(A&5{U>S9mo_ncJ#xTgF;J5!p$5}*WmU&#tA|49-+=Y-Hw>-AiDj+4X`TLu$Xz@`@X2$DS3L!9t9hF@M3!~EF$7_`r&6l(6h6%_Pb-a z08*Mg_&mjX=OQKs4#-qKi$4``4*s|f@BR0YMdalX0JZi4XfKheP|9)WO2~rmluY*tc)(IZvu;YUlt`Z_;A~02yyRR>I7Ib-Hk&#*xoDGlF6k ze^|v40zPLX;LF4VD6iUN5WxS*<#soa0Kn+^R1_XWKv-oh(uPSG6iIM`W-8tj6d-c_ z39L8t6CNsAE=dhN+hZ`xDl=yYi}pf%T%2faC+-aM1qUZ8QV1BXLaekh$QTngzW_`k z8B`_xlb7pLef``fV9>u86x2&(lyhY%(})`z8y8jj(~lAe`DOs<5hi;w#4-)gwgz<% zOgucPsN|AWUU#<6`qT^zhzc`{0Df($Ku3UDYOuivfMDl-v$r6z-@~ZkkFv798u~T^ zrd;KHJ~nsF8TOjmS{~83d? zEsyxo3!Q#`fL(h46wvvDH{iPbfgcVIEQOYiz}{={R6Pn*R+y<;vewkwcx3#e!X=vs zj%{H+fg4kV!b7t3@EVPhSonj~bfECl7p*xdMthhModrUTYo~=kB;cwu%w$jkp!R5#eDBt zHzWd!rt<+6kI_o=PLjdrNu3bB(gbJhf#v$GJ@Nl?N>JP4fJ|z6m zr?0@JkVGu_)l!5Ei;MkZ4u_WtJ$i_On3@KKaP`uZI>+O+K~zOZ&Jv-8D|GlclyuMy zb8M($&al+^Z(3H?pVj6_63H4!?k}@J2+vga2oY6~$e`;^i}=hbHoytw9fP2R(HBXe z%jFAoq;!T>sh9vPolN-ruxKs{5b)dr^v?4{*|u}}kK*D3J_gt{`dXT$;VfR_*HC|k z-(sv}+ysipCG))IwBhvmLvZ0%Vo8`)@?~wdE99r{Am8fina5d54B%fuh}h_$qH=dbw%0i zsXePEq#}6oG7}osm&Y5iT3QJ28=P2_aO+-MH)CxoNs0has+J@Ud7eocmKKzxv_$<9 zvjVvG$0{Cn^;TEg0#F_U40t9U7nT0g(YyaGA_yltAx141{nws}XUoExS_o<** zx1S;k>HfD!5V>}T@gf2Ablk>hF!zVb>X@3|{9DRwl3LUd7OvEB^!bbG1S}3e(g?{3 zpy=6)*m$>N3x9<=kk*$OeR>y1OA4+AJ+L+3hvE1~&cGBmW~l=qz$E5EWu&RluF2oA zR6DTGd4=s$nNbAfEl(4;VrYy0JYHnylO1*b5nhrvBgG?LWabwAkw-aa7^?Q(RQK&}w1*B6d6H8w^M4Z|EwhW{&so_=Rb=%)xsm~z3_ zd;KiWLqE5jgMUMc>_cf1QUKt(*0>)ISc(+`Vj*7wnQ*DNU(G(t0${7YPXab)uzv>% zus^AN2Y8|S7f9u72y^rEKc}XIZEP446B7X|d>PLpLS1@#){B0?x+^71FT~(E#AV*X{)PUf|G(W(Plax<x z>Q@tUAFik1pI-bs${Ya4DsAO^sJ(74-2Cp`LqtaQqE(s*TFvtJPZa3&TiR^8IsTp- z5fo3uB3(2cT@=|{TRShi!xJ_4vQ3#b7lU>8D}6LHUPUI)r#i1cP(nYZa9t4cO9~F3 zpZ90-yNMRVI+}kcx`!igMx=+UJn&qBu^y3xlQWo$vvc5>N2vYSyfwfw?cQ7Py+2s4 za;QCbq@~VKO%VO)kCN~;+ra~8z?}@FcRQf3{!dinN6s;ScJHd-Nfr|34Hlig~od2mNaQ@am%T^`<*y=0075<7(UoC z6mKIkN=t323J@PMsBAoOIbyFUmq(|d#oN;YO9~5%q}K*~|6f-RfN$S*;_9Z02l;nB zw{#pdd@Prt;WSIB-v=qv^Z@{)lSR0SzI3Plt7TdWL!~bG*LkJ1LKz^+2}p0hWu3ti z^Y6rhKKE<5HQB*q*mf4#kX$CFc|IlBBBKEACXdG@ME55YZful{w@G#e`dUinuAVv_ z!3cew$?kojVfbKVV|No>8k2A&|6i?Xw`lTsK) zA#?KneQmGs?|sg^cm5PcGH8yi-I#Io^^maASXwAZ_<+}$Han}%u5dK({h!XZyZc~pGEM@sOJ2zlkje8g6`gHXvswq@}94qAA9YqvOFP3AgPbk)8YHH-yA%z7NP zawz>fhf^~x-aK3L!dvUwcWx=W&Z~G&p)dP6VY2YFypRJ0EZ&WvCBPWS-rWeL=?Z87i8Oh5+SQOBUW@N0a;9k(sV1k@o zeIIfCysuoywwQxK0ifxr#Zb$%wX{a04{)?YhB7jfnJR$AYuZh$Vin3x^z!5*3?RA2 z)LdQr;jQ*Ax`K(^=hd&ua~(wyOK@PrhI{_DrF~x5==M0f=GVhMdl8`B^|S78@$mB_ zn&%e09>(qFH}ALtL7UEt4wjt9uHSHq2n7h<%}|gE2D7buBFsS0@y5q0sN!xal5n_y zMWtxjy?N`1vLi?<$fx&Ef$2%Ub5%+xOS@b_Go)CDU&0Gt)*L zM|4p{Qp^lTvUt;XM>u#QkeK$-XT-Z7u&Z~C(acT>rCjJ#Fg+Z5&l?dx+KR%pSUdJq zw}iBY4*mQBf58dSF!FDkUukvo*YqhRP0{6TL}bPr7|-cVYMiWW@y+QJ`mscp-B-vL z+1IzYZaVU5@(CQyT|T{lscUBEUCz=Dm~C`nKgp?7Rh8m_LtXcpY4SJ?jABbg5MElP(vY{Ek<-YxkKfTDA=`LcF*nH?CZUsf;FKhB-sguw~AzfB^Hj`dIt zYq8#^gKH8{{N^_hpWdE+Gwdk-A|;eHBv-mSy;PYz#leat?zigf$AQ^uV7?7v$sR4#X;&${%^T zJmNZ5aHlxXm~-a#iyHFe0U+(6FP3=sX@L~f%{)#mP_3ZN)8wGyqrRn+z7{LEJ=bf3Qv{ROW9fGCv^Sl&>X5% z{CzWT?C6ulqHshW(HR;?DcRGP%{LJ=+~+3qZ;n)_6$+s2yk^y*lv|w1gHf&XBg8Rx z5X%zW7saKgQtf(MK9H~dx1sIW!Q>dOCKn~4f}^CGUzx1WR&dQ%ms5reef4$b+04Ki zXCD5jkTD7!{MM@JD?RG|!lgUCTk&hyk|8>QfT&QYBj#5#orljxTg2=7z0gWmc=CGQ zbwU&;O>)TV193{~H0!ja0!!)Jq)r3zZ64pM=~{J=IhMp3+fF*1`}O@A|A}u%VtJ>H zkY5`0*<%yG1z%OViU@A%Hi>qb(0!L_j?{bXcC*MZxXax(l@mMmK$fIhu zrkX>{lg9$j%e_69Cx34clcDe|fF4iCZ>$C8hoYcsd5LM%F;vfoWKMml!rTnp<5~S$ zABQp3@9Xd9S=)o}kjBg%RIlC9u{}Jt6IC5`PD@{X@UXsq}Yy6pXb@*fr#>~Z@y;<+tCO+=@Ogow-)V}m5mMv)q6Jz7LF&Xtw zI@!~HQJF|G6r2ne*tvJu!WGJf!m2}|RDInh57^HbC00>n*%iEEb29DU~EoK`e#ljGwtaa8B zi376Ms>#sL>MvW->)YkHa_DT047fR2`Q30eVa~(fZp4;u=n+{a_F2258Uae_ld&WR z<WTyxO`$)Ik}9z*iVTk;;Q)){D^Hl5b^Q!`C$pR&wEVlDOfaHcKWOp^gor!bg&rOres36d9Y&XWoj$KK z@i>3@+6IeDxZx(hnQNYHDtRbzDuVfy-ls6ATItz8uaWbrl!q5TsiKeq#y)g|(IYFL zXYxFxF`UNJgN2qasoGPjb^Ca+Yu-ps%djc+Cfe-cA+6r}!hpi28|@<#@bPWUs)uqi z&dLtt@GJ|SdC-JOLXGQzPSoqB%)H(5*eGN^PfO`q`)Qm9N=Lc5+ea4|6dg!1s>#!` zmXUm0^WIjXr00qPU)7eR`ZI&FO}&SUb)J~faE>DnQv!QaaLCEio>~jS^a#${QxPuR z><^!MW0RtjD?m$W`M>$Av&Qia&1B|P!Y7ZYv~DL9>m)jjUutX5H;eB3sok|x$J2U% zx#^B9G9}esf3pxcoT3}m@-l;?s~$RJ-n$pxYjK+ zAI3~BgcJt1r=}kFE*2-9elU7QtMbcdCrK;~w$eaztBtJJ&=<<1koI6YHQB2u)MMvl zFxVx=Z~%36QWiNDrmJrV5mJfg1KA_~jtw2UvI80Y&+ZBE<6Bf--QJg;Jb>rq%mQN0 zA2es#F)!8X^d+2JgVgnFJ`P}kTN^kV41sUGdPc;{a%eV1?l>Rzl-YuMu7yuoxLnz3 zHW6ggU!fHQ!@*r`v?6C38y8mla<5ky8ThL+DT}Y`{_AruJ91j#R)-B7PlDq$*~6Th zjZrCYbih;o;7=$8^9%ATd&m!repx+Q7I!8XWrzvyT;A-a!_mUSM%k-RUZTEOxD&f{o4Xf+Z;a@dye=d zYtN_Kl6W;aktarStutwJ|~SOau8_YA>E3skegnzVBs+g#^#Au^>bFsiOWZ)W|-kEWFBy)p%A~ zp5hn@I^6Q|W!e~y2#bX?z;-x#V;2xI~#+`%9+ z7o$M=hcL$`Urz0l^xa_3A@=qBV+@wI?*G&VWZ)ECuWkWquK{F40slFMZ^&KxW}7;m+IdCwrq72ImgUAGmvMK6Qcb06E1 zvRqINT6@OQ4|5fL_eyK@t#j66L@A+nD(t&n9o-1%l0+|GuZdu<-6gD3bLmlP*l@%4 zth<@s-~xxoX3)Z~%_0>?fUdNcgp(2t-&DwGU>JS=BlVOS)mo7WZH%D z0(T{z>L=OZv^sHTj>E_tVj)^ny>sQSw&*HI^)o(GP1@+m-}X0vg!<$vUsGzB!j~S37PKD^by$f# zqV`VDyEYH_+Zm%T!B>{*x5Ylbz39~OWo>Il)G)zRb(TJkr9h;Y7;8}_fh3{HfEX4; zO&JQD6p$LC%>7=AVzAYohn-!5Y~nyz1LKjpxq29_cLvI_r7-ETWaeIsSAmpJCaH=d zG^iJFmx2pS8ds{p=;0MkT1fA+a*4RlDMOZ})`2Q!IwDr6Os~=xbi$XR$;`pS)5PbC1S$sW85fYFsc{gyA2B*UC>s!3HIzB)#$P-G>O?&CU4~L+6pe z?9qAEe~~y^cIg)xJPS#9l@W*syR)c)(x~;B^my?JSn+uEhb*HN@C(6ERn57sRppKR zXwhz$L7TstJ^1{TkLlLrPS>3%eUJ?i67^FM^omZ2L40d)%byh~|D&SUYud>Ws3vN> zo$XW4Xn-&ES48A}p7k#WYGlDDdTbAJA-O0vO^MvDHnn}Hj*wbpXrgHJ~j)w1u z+A#W)RTDY$j)9I;7l@+b4soV_e|=HLgbdLq=V2jAUQ^T;L*EMZU)dpH`AGTmxVJz! zvgDVt>2XOgpCHzF;TCeRa!i;*e_qLl8VZwCD%6=ic6x-FKBGoAeM#H2@wR)0wr49^ z1Hx-I$}%5I`085o_!+DSYx5JPMpdHO=}Bwz8#>DGzb7ps0@lzShXu7{52n(GvGl)H zgq~IwI?p)5z1C*58IIYdE)DgLY4Z>)*Cmx>^5XD<{Pc!{dwIq>M!~-`gLGV-pJ0VN zr{oSE5v|X5+JMk}J*zFwx7UeL45I0GglAE6ZEe(F+hhdh=4b+!A}*)6%1v*g9G^X% zTZYP+I^>5#fqv6757`SttzJ~8`b<}LXPWuop8X%Q46h+{C%_oFs%2qy*BJ)S?$lmi zugcauTxe&g#!Nk%Vl?narx2%U1>EaRKa#edC>ThEF)UhbhjosL@5+~nnNuhk~a`GtcFeCya; zCv4cJbsC{x5<1_!)|+P+b0b?H99%iRcCL5jO6F~o88CdBPP4H0yzb00@AtDU(6L)` z{Xy_+tuJp27zV`DL9{kGMay?i>Fb78z2=AODG%r+6k=?tn*%F)3i{#quo&8;_>=ncm!xOhaE$^ zyM~^=i~ZejPYu1XN$dIOcT;A+otdCF5M>0Xhi;*;PnyPEV<+y8!(9_v(xf3_=KGrl zO8y1kR=(ubqxoN>sU-7;O_5G7q`FvYPdjNy5yj26UU3>7ekMC{JY}}2?_IVcqGJ~> zQSbESJSwbc>EKSy>(fL}+w>gwi>D(2*FW^QzpcuYgDxwr7fQ(Dl-^9Rw#267AZrt^ zGl)aU=2L$Qb<-Q95cjI-x6Wwnte4;e%3AE&UEFU#N!Cb)25%E<%4))eYrvmzJ%cT;G2UTEa?E^A%_vK|IaJgR_|#;X zvF~TB8tkjp-pShMB}j}0dH*!Fx)eJi-V?LknbJ=?vRT^7p&Ow|GnA0ijACrb9bf$B ztl)ObqipfHBKBTAcx}7d&mpt)YU42BuP&hSZvrXlh{%rcCvVosHPqF$0JeV3H?O4R zgQ{9<<--Uwg6qjTr1X~{3ORrw8X1B6$p1pY*eYqGPncGgLyK0As9;)%)VJe^3U~DV zTJHD$uq;}JE4xDf)bahZ$cM=c(0&&N)=RIdyCx)w=3q}-T*|VH zT7S|`gZ{Se>CX0iqkA3Q`y3n5pEr_kJe$!TDFBvk=JhTlDiI(73Yx+s1*#DADU~YNax*-F ze2xugl-+*O+JY5AlvlA;Qq2jhb3;jAU!dqi$^PE#IVby;vZ*ONy9P+vnC#p5`0+~{ z26!>0a8(T0XwCkfVq5Tg2*S>V(Od=mML{d5841ez6%A~G?f^sE0)Ci%gNDv)R!Us- zRFaBzAZxDRprFh^ed?zR#5MWXGS6PA_3sf#q?kdYKZSJ11E@KbJqrsW&IbU)bd^FD zKC5xSw)PDSstBpD|7;($>Eq=Fu_;kz87X|07UAN^Fg)e+0-?Un$gTfJ;;p6&G4G% zi}xL@T#-{Vbq?^_o~9h7ek>u5Z~cYpn7sLu&RkYEH`C+^n(6@*Mn<_qAE1$wYAzq% z6xtNJiRY_HQ8^LxfRvrI;14q52!R8iU~nUrC56aCzN1y=TwCzWP_6eh9o#VsoVlvY z^sp<)kCJgve$6GCZd+IpXDj{7Uj))%6C8<7zS`o&Y!$#YQDu7 z<(S0Ib`l#B^2pL)7=7W3@@1svlp(`8->zDzF2&=N=-#Qz=Q$=Q=2mc`k za|8(sbKCI2ETGhqN688H2WCoGKc~>zZ{yDPI9Y;qjkUD@ zBHn9xN>H%X6p1I!9!Sl&K`{xO!* ziv%PnNT^ZbF%+RGR5f{M$%mx#xPg&j#EFTd{iO#}+fR2$qwx4d>6Q3q2+xhx?)t*qX2#1X6?}*nnKDL{e z{qk)GR5h$2PMiBGNZvk?2W}g357pZl{EwJmThb7Q%m{@tk-bqyX-yff6`daZes2+P z6A2eQeS@K=5`QDgJ$Jo#WYS>!$thjG(``*fT{%IC8m7?%-F_ANy?d=fRL6Fr06oBn zEfx%lNzdvIe6u0iw#^DHENRbl{zq2rt8Ao`^&Ss zO3^a^_69`mm3Yj*)rJv;R+W(WN-3inok7pY7*$wUNW_!;-!C)GwLdz`ivnqkjoD=- zCE-m?+(0T(%ZpymogBc>L?;++JxTn3xd%ZNAGNhA&Ryl}JDE85&CWF-{eWVsP>D*1Nh_sZl*t+;!KZ_v+-XaS2xAtRb(N}*log130P1uzKK?l;Kt z6Rnv=SqAG@u-N}-7lWyyz#t%%+3~1cP3xv~E+rNw$?}tU4+OX`kX%qDY-K3}Hetw= zcT-;h{UFrooh1{0$$h_*n>8NvZ%wbO1o0`3SGC80LX-RJ86T|_trYP{=5As1LL!p= zQfi!Y6K#faxVk#}A;;@%vOo~3^=&TnOW&f+^G&T%^WHko@%oF*nVI50VYaAbBcR=$ z33atKUs+gKh^t@#dA4yB=&({Tl;{!~)x~hJG1>OaU%o=dVc77*(3_?Qp@wbRT?Swp zO?8<cAi=A`b{dC$^FjGCDXCBW)}!sR@^Qv!J(EUjR+R6(aH1S|CfEro+%0l@_V~848*kIW@dn&iTspC z6$f$QfE2e1JDXwi>5ke^*}xZW24Z}x3l}|boN8M(l$vFD9GQAebfgO-gGG_ORn}UM zprVNzLqg=EsdZYof<~-q>c+E~zMc7h*%2-3*|2CpQri96*{cv3JuF2Ycr3%HDDuJV zyeE%qTU<$rRgWi*00tEXoUtSV7*t`wuPVNwc8+9x+cC3|I)11EMANBF4C7zMu{NAz zp)y+0D6mph^5_z=?lvZ*3JM(+lgbjLkPna;AHnWvH#9|?JCBse|7eW81U0Rg$q|9} zOeBB>U%{+w()&YiEF{NPZ&H37ztKByX>5OSMGZCr(yx<@j7O&Xr|3&vd_eG{@3pIQ zOYq|8x2Ecnw&18x_04a=uW-D!xiR{KpC-iTWteJT0#AajnUPuvXCj5=Hm8@3-<|Kd zZJ3-YnYn#vf9?HR_Bw};p?NRj5X<5q7|qWcPruMF=##+p=E5@?FQDuh57BMO;;pVr(2NYCTGczF2d9J9=1CNwWk$T<}iNMZ|?NbLDb*88NHz}--$ z_%(T-#K~;-Uib4eGvU!>7cPftjQQb{YHZV>8MG$mlRsYe3C&eo&3UsXT)7SHRx3#8 z+b0IyUi*}K{7yxa#BS>vkfHtI$+6wc7r` zs-9V+prl-N-T1xCFSLwEez5*hS#h6FP~c>5DN_Sr7ht-suidlKQbxXkSMJL!HO_a) zAAQ@I_BxM4DV^6VW2CsQqdT?zo!T0nmzUQdwEIx$wSrw>_^EbDIniR3Tn;Uq-lUfH zPl7_lJG5Yskq%a{Wll)%qV>Bv9PAQ;UoYh=KLkB6#G;jTb;S;npX~eihR38u<4hx^ zA;{6F2oOF=_TX$W$J&Q>`rcYns~&BM)FcADA#M zcWa)8CktT%6b7>G-0&2Hi#$A%}V z{Z8L!X=#QN>$C()WCtXa`z1UFh>m!%Z~@`jWL80;9F{A84oV6`mO~+v= z(<}0=7Lne|9SL9p#ysvl8WIlnI1PSvfGNKg?P;?&f>tWs9G08T??pGR4lIS@{ro~3 zqi4}WQy|Ew?1+oaFVB!K4h~B9H}q7bMP6kaPM;Vc@Al%eg+e6g8kBv%?i8O8d0WAs z5puh=^$0O;ziRKbbUobFGaZdCo@)=*xzbO5En^re`lNP^q zBNXY_Q087|vyxBOV1HV=Q{=pcPM?B5eiT62SpeKplzgHyZ$3bgLC*w~S5WZqVgXKu z`gm}e^rAIup`|1=3;Kxxg$!Ca!Z5hH=&K}DVKWS5PY}b`P*jnbV+7(Yv(={Ddoj*{ zT#`bgPq>nDRVdx8WS>$9nD|_GU~jP0yqW)!A(}PAnTL7TT_7{L!|c(7V^-HwtMa(R z<7Ev|*>!Q&bG7GR=xt?VW(r2A=?e^?W9(7wN6FU1qbN7->t4(<-8Yye&8)+Y!6(WP zMg8Arn<-sllY+yM>V({VcFFvc(;4RXy}A+@?QJOugri#RVjAw7#sega{*Fpx?Up{W zoNr_5cqPB&#{->tgX^umMB=kd@a8hD+AOJocT$|n=f{lv5%bl}7HmgE&b2qi?>Px9 zAKVXglFE5xC(w_U+E{e5A|{UtHUB?qMQ``XVLuU6CcyR;6F-7xxha6we7@#-M-{B? ztm4yB6b4qslKk|p3%&eH%+93E*2?c&9jAT~(TBqKmsgV#CVQQyHb4rnsWwn^bDS1T zH}7Bg0VmkM;wWgP1zMtrDUlMkSNX?}I2l>R9_IMaFeM;Z1w^jEe;`e4fh4x&TAs zS~x>nhY348@px~!|GZE-wE2#5Lut_A{MsPXZ{kZfX@}OS3jR5tNv>BycK&V0VWKks z*lwRv&dZ)v1a`>KNze#4&Fg1NCJHSe%M;UPdOW-K3&?Ny_prI&>NYae$h?rOukUNK zACu%tpd1|6X10D;8!8?RUKZaj+f04tFL1rv4&}>NtZP0jR-u(|h0W*kUNNm9xAp@; z2Gh&^KWbMP8A85BEB)nmSU~&?n6|LDzeRn_j^%b24KAn*(kIDCHX4qBkZP0gb8|yDpQW_hu#C{vZ zPJ8CQ^1dj(6gh#yD2N|W;g<(mNXkj|yPO z=GL*XwcdQ^bhdZ(Vy1&FAjrF{L(|kiaf309y>%L*dHEt^WSx^=4o!MuW=iIQ#)N&uf|v z`_XZVZHMI*or_0sZ->j|6#fHF1MdroC=TMSz`M5qo7Sd^_le;hn8m|$kE-rJO=ag7 zlxI{GAN+N!pcAV4wF`~h=`Awpen&*02iMz!zS0|&aWjVPH-$;&`&`W{02JbpC_wfjjyVyA`xGx z_V|-`SKypCeuT=&d`X>ZBgsHhO8^Ni+)Sg|W}fUZ#aHxFWC+27(`fIB7K5mT2@Fx-2gHwbg5@8Mct$tI!a_-g)9>Wo#z; z?upy0v@3Uf^|s{9qI+c0Jksj-!0nbCjHN9(nqFimSX9dOn+pvFhH+&r_ls7wtzmh_ zCE=5FPKmQl#UIv~#84yMjvobU&)bT{H3!(T>G~jF36C4F&_1S+)R#SpP$Ifj8eNtA zn$?f2$1K}_nujB;!1$OF_hhDayUJ^|ZXi938P}+NxoP%s-6d=KY<=_n-dCvGYu}kZ zOsm7W)aSvcy~&^yPnQh@CTE`Ti<3Tcg5cNp3knIVlkrNEIj_+i$G!*JNrLVEvB(vs zJ9T6<86!1CBNpyn)LyRb6D`EnU1<$*#7s0Y>FL#$YVpeKZ9lv$R1;-c!l|bb;)Q91 zr_RJ^u}3d~vRe^b+mz!~c{unhT!R!PBNfy%Tl<;^lr4MCv$pnRp|cnGTxGBoMP~zg*{^xF?84l{7>rzlH1btyO z-eL0#>MTC3;N3QS4U?xaKQ+-P%Qh5Vlk>9ZD%={!J46yw8CE}iS(nZ7tjmb+bpPrs zE3KHG23!r^v=zyNz;0a4U0%d{kpk7s;~Ng=go{i2Y4wLURTS|^rXjuANVy3v8-I51 z)B0}a#!FhG?-QI9{^7$&f{c8IJ%b&9wbJnJ*tU{%n_Zt3A_>@{wtA&<4tUeHzpH*j z_!bv;#F$%PG;&5a=xfUpEvPBwBnQtBa`eNXBjZqur`C%bS@b@N4}j(Q1udR&h!dcn1>< zi(7B)*X(b>4z$E8U8;H-v%ydS@&^2COd7lgMZXsqOGa7mK8(-J4(`9|`y^#JKqq?ylDH{F$;=s3J6GdR5VZ^iq2s0F!vI&uL}-Q{{V3TM_x<~B!UoBYcIgUnYPc0dL*r7EleF;Ww^i8l5Pq_qXC~FU2dd!IvMg+*z zYPZq&5c%jUc85i1zb#^Y6u5zLniucJE_DB8Jy#aYlAJEF^y|ZM$%mwg zCDGYxm}puP8PLW&xt{W{=sZ)Smcb3mo%#|=B=e1z9PMOaL>9IzR?VgVT$#H!(Oeiw zEG-)?At_f9RCqcRw8v|f3bx-?qVcR=36We?o8!AV2G02yv{M6v{?!?M?z30DUg~5; z!~1(0!u0%;8yJiH#J!Bt%uKAH63vpS9BI(1ytI4Z6$VliU&42CMNlK zoYq>Ee#$_Gv{=aP`gUnUgX`thr9-P))D#K9#P4AIO3?2i)O*B!AXxYi7-A%~!tIfV z8YdG)Bq%(ym49q!W%QQ&G2!RX`1r5N*F#rZx^z)9MI-}1Dx~njU`bz1wO%Fz| zjH}{ki0*G|Lb0f_MT-|#1&wzMEX>2cl%9ddnt5D9zAjK9Y~g1|ORRpV;~R;o!%TBP zz2?s%Dxf+z(9Y*cxA*}i;XQjxi}CF1UADW!ieF9V7IU?GfR+^XiA{ME5(OdT2ad*` zoK+O`3Z`GBZjpOgogMK<75Gvg4Tvo8F5Iy*Pfncc>ZiT0aatoE@0_uzP4<;et_Ih{ZNt*TJ`;kzpMZ!T)VnaPWHRVFw zK)7w+3%x(GbHDWh5kT730oF1oC&`SS%_PH|Ai`Ywk@IKCLll7o1g^tlgdFl6rQKYV;RKmy&F?993*@h4^(X z*S`hX?%%%%(nkkxn4_JAqn#b*HD7?ERl6p{cR9r0gQxBXhgo{Sf_6|~Os8>=y6X6y zCHbVO;%S5}bB>@+P6)sBOd$}t+rKl3n4x|8Uyq|-S0AJ=$|(6gAQ7kEJd%KCEGpN& zLSALxqC!|BiM5xe=+?kX0-;6>?(bU+Zr9sqKwMO~Ca6NNIt~pJODg)37VeNzcgAR$ zQ)d#|i0kUwqj9DcZeKwH1p*ebCeJqu)z-stuc!Ymkx15GhJ*!6=d=Y1mw+)H^oNGV za@dkKhc2+#qp{bnxATnBuv&8Sk9aFertElPUB^;hPYeI{TWTj` z02-bFb%5Up`3wr1no@4(6?Js;>l$59Bl!BZIf00Pdz+R4)4DJePhjvCJj4_ta*NUC z#bcHCI|4-BWj^UeSV<|#3p=3)><(s?f$6_}jSlE+0wJU^S>G12@UR&5hAy^?LS2{Z zBwFng{3o&dWLh9}44d0^0t?{)s%?CkMwR%)$R330s zD>W!HH^tTqK|78u~Zx^-- zEpW26e;3zIJE2khuMZOp=|mm}C+7!+naAI~tgNgSc6Mj+lYiGpRFAhny@bjLD5Ym*N!O{+j=JH>(I-zN#Jm5KS= zwJnG{0s{8GHxZgV(0E&UA1dD((_7l@YC3bX@~P7gLbFA;P-<9l;?#yX$Ojx>QZ5qK zo#A~uJ3G_q|K6~YjmIn^`qJ&wc3%26O4s>78C+qKMnyCV^!T8UMpkgDTH}6-KF+T` zAmMX+qkinfTlHNryqKfKL?GtO>jb)d{}GgUHV%qNPv`TB&{a=m$+QBpLG;(1i%*{N z{6ygTZX)39kZ^iCd9A!@tkWEsT!T4>Ki;vf0^eGLiaIlZvMP7gJn%%LYP?<(= zC*Y^DY_1+QB#lC^1HrNqp;2$4#;V^2a;TohYWCW{R%Z*}K{57q4=9tGZ$UYl)SJk; zxw%KYEfx75@(8_M>`#N_O)so0l$?{_`g z4}J0a&dY=p`p{oxzk;Vlu{uvNAk0WjB}ewqD z$NU(Uv*p|ZhajCeowJWSNnMQ|_53z>a(djCq;T#e6&f{koFYkazvRVS-c{F>heR?W zdv4D1|AMG%Rm<6ICfypa-1jsiHNL4dz}s*H0G`7d2u z=7Oj0r#Xda{=l*o{Cl~9LG@Y_^x$fC?ia>fMVT$TLPwDCiaGVWY8Ogp)X1RYYYfIe zo?xMZnXr|>>RZQ1{LX^bjmeTrTRz0LZsDk;s|sJ$g1kiBcnd`q)MjI8$xejRQy_f6 zxkZ*0KB?~2`BmM~X@jhBac5#H4uPLdG6#OhFDy(RYyREpQf`VfpccqGHK$#TZPg## zAY0YZ)s^p__40Q#6b~wr3Gv&Q+gE!`8g=VSmlJX&Mroj_IRd|jdPUlzZ>Xo$`RPeO z(IWP`ue)W-C0AZ7Bb5ZImDIDa#l|Pf_ViisEFDe#{5MQcpaXdwK^HVk zl;3l(M0~1jp_@e@)i7$<%Bn3J5j|{Wu>YmfdGqQTrhRhs?w~rX4MvteDe61Ql-pEE zkT5$i1OhH6q38R=PxNdL{iqlwJmSgUzY7^{^lq8%tW>+7++ItcA zg8bZoDogGTgw%CIoB%}wFGD!WKov5&>_MsEA>JXdQQUUwZ2-=AF3I0HLsw0AD7^YQ*Y|e%*R2FpAvIX{&ONHa=9C zeAOZ_(!rTAerpgw9^SE@3*lGVoI0H1%?*=_6}J_w10B1f0>ad@vxq@J(EQQD=N5mB zJ7Zw>REUHG>)2{HSTohrgRYoV0aC0dNy%KY@T9E%K_^%wM7CvmI;ysAWW-&E)58O$ zKw=sBq8FWC{$NS5s#`ZbRLN>DZCyhal`^}VS0mhzvMm(NE!4)SozOsQw>l^EQXPY+ z2(-VC$u;e+jOGh)oY0a5X`h{Ge{0^7v3NRN+&ld(B&G2h_i*O%IO%b%6YlkKn&7H~ zkn<}{59IDvV5(2EGj~h+M;C2TiDXpsXH7z4_U{H!O@`Vv?$1v0e5rieeraMqU^2ZS z#N=S3I`04hEbA#F#%iiRVYgFjHsadOg=3Bi!9Q@c#XYZcx6Q)PuAB4Y}+63W9}tLD1KKPZ#g6jRw?%CV7rpuFxFx zZZrKq@&vKRuvJr$FcP0T>A1Q|^XZGv-7U?bM3~{;rm8tZmC?d@yhC4RnxBu(Wv9=o z_QF-ytD@9yOhe7qxAye(no6msje9lY9mj?V`+>iLbAw&^Qj9=fl7dH`zK|Ih-Cnq+V2mKHzM-d zbO*MSmdm6pTFFlYEuZ7=%Q*z)t$YimQ7ZDj)wL<-2T>ZOPT}FHZ;ugf-eCMO5c`7h z>58pu+l|*(I)1s-lyyJPbbA(c3r~{|*>$MX?0^3|@gp)l{%4 z>9_VB-VT`&85P2>ezDv@-8@>7{#mq{%7GltR?{8n=;tfBfN^X^NS&^va^PviMG1zd z0OmK`SZ3xuDUtbvDaWu!Emo}X;b^-6-Qo>^Gp0wC zQ%CJK0HUXTM;gd%til7SB2w#w?0{|y7WZe0$dCqfLM=UmqzYM5HTXb>d%nJ*rBR~R zL{e6>>bTUBsOizVcrZ(Gs1C)egCP^RaaZpP8M5rRe9MB9t7$e1G21qs{qbeqMPuLE zX7b``pB*NQBhcOWZ+@76b(Bn^dcTy4XT5WL=wOl)tP@6%Wo@q5?d9-^$Ll!)^r6Jl zh$PLy#hKstBuGU|${{F#g_w?eSK;cA>orh z5jnhWKNAw%QbxVCeu<3X8^{0brbCx5w0m}YS%YxYhilS-vgzkfy16{Uw?h_dJjyl*$zUZH8EqYju6;M{;fzrh1CS=5;G1ZAeXzf<%QlODu&hRB*FK4) zXMXr|8$ku=Qp#gnZoFHNHYXmJ(N?`Lx~p39ocEq)cnnP=H<(%F98gIkcEne*HG9l4 zA>>y2%IvY7Z2P(m`@qP8BJ2ll2PXz+aYKHM5e{B+aQyM~7Em3RXz$zVp(RO=>DxG8 zscEH=w9;0nk8ASMyFvI?fF$G@K-kAQtL?3(TW+(o;@&GK`pbg15riLt>R@$4%%x%F zf8nyxWxx+zMO)%6DR-@()fYq5{bZt0Xc1~z#XY#1^m*1p;p1|#t%~WNYo#>pF z2rszx($w#a_bs7o?i`~b;GF67!zy#FysRi4Uj`L13Mf@?Z$ClF+SWVT?KL*w=RQWG z-tB8_kjClpO-2bDjsl&;#5onVH7u21NPP2-b^j9M+(Rje=pp}{stipPV`lWamWW;~ z-nH0M^@D+71ZiWx(&Tt|)=5l->SwW2M{#p2N?qA)S~pcXxR}?XRqkaU4b#h~6}hX| zPEK`KQs;G5)gMr#hEp<%{&D&l`Kq5 zI8TMFJc{M!kHX{btqjCY8{IR2PInyh^uR%Od09dduSMvYsV`KWac=Ca#>(#hC%Jms z73x`Kp)aX|Fl(;Y9P}01mgH$#Jm|oH2j&}Q)!W=bpIzpacr1XoTnCtjVCJmIV0Vhp z&d9kv9ofd>=m+=Z6NZYucq8=Mw&$it9V790R)cP0RJ0$2$UgT(0;TUSF7=WMfneg&Xjjpdn#R-g^@bc97f#GYg$UU+}+}>XhUxUqy63-pIL?XgQc%^r$N$-cN{3SEC$Zd4b>ZE zDj9WLl&!+ucO2?gaQovU&I@JymcQD+<0(ZBh@X;c(7q=%#QAm1%M>*we#E259JI0f z@Ed*8Q3v_(>NZfnC%M11Ql&9J8B$^GTGO(@zEf7q z&S0}~0@uqWyM+ukr86+94Ym^31s$0;`0J|jB2c#Me5@vevFKIZSsCKj>+ha4t&2Rx zk7IK-vfIwf=E6n~9EB`P?`kslHNRP{*}3FiN)z?#j!ZopI_RJR-q-QQ0Mx9l&=IDe zysmqA?Jc%U%uvZIXd~Q61-{|=@D5fv1(hoIKZN#}htf^R@GqgYqR|kwIoO~wZwj0d z0I*e5>P>x)V?kXdo#o^n zsTesi5ul&CXp_mCjG}BkQ(yaDs#?5%YPwT!quJq?U%x(gwR8RlR)iCe%YXhu=ggBF zLlT7f%VWPDnplJkI^s>T%DnF~;Y-c7CDO#0Z1gyVd$OQhOxeL9E@hi#>+*8faW{5! zf)NB%Pu7^4vUK63edOx^LKZBb1Yy`kNg5b-9z|JlR~7v*_xZd?5`p|5Dp8zPuPQ;v z-C}=NB^%>zd5?O;CsIe59+besVS|oo0G3{k^SngpnrS2Q#etwHPr&SRna9t6dY}qj z7;p@&5o}O2$9khA=?fKQjRjI>2Ix)er zi>uj)KKYcyg@FD(-f~(4#ZhQm_k{7yulsBGZjUK`k7S(36|Qq-x#ly{XRUW*sTOb! zi!~9BP{{ZC9fOC_{`^OZ9IhD7J0i*eirau3DVylOJZ1fXKptn#%87X#(6a05GTKST zhjuJ4#+YZ(u@T3B@)Qvef}#`9+2K3XZ*3y*wxM_X8{~Nk5xP)1TQOeI#I;d&1@ouK z{l9RF;}Y-=zn+@mP|S6PyC<$Gs|Tt8mS9Del%$#Phrf^c4gfDN9&n3_@q2pJGUz3~ zcT(F9|I-2n6H<*t_bjI@3!fwMDpa6in1s?_{>G>Glm5T-aaoqini}0BzXyL_Vbm>S b*!4}Ww-zJ(mS)KW_(N4mOR?(Ni-`XLA&kRT literal 0 HcmV?d00001 diff --git a/docs/grid/api/dragpanel/dragpanelitemclick_event.md b/docs/grid/api/dragpanel/dragpanelitemclick_event.md index eb2d9a5d4..b0387201e 100644 --- a/docs/grid/api/dragpanel/dragpanelitemclick_event.md +++ b/docs/grid/api/dragpanel/dragpanelitemclick_event.md @@ -39,5 +39,7 @@ grid.events.on("dragPanelItemClick", (id, event) => { @descr: +**Related article**: [Work with DragPanel module](grid/usage_dragpanel.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md b/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md index ac8ba12c9..320a1a015 100644 --- a/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md +++ b/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md @@ -39,5 +39,7 @@ grid.events.on("dragPanelItemMouseDown", (id, event) => { @descr: +**Related article**: [Work with DragPanel module](grid/usage_dragpanel.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 9755e9e8e..7e2b06928 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2181,15 +2181,17 @@ const grid = new dhx.Grid("grid", { }); ~~~ -### Using the DragPanel module +### Adjusting the DragPanel module :::tip Pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the appearance of the drag panel that appears when the drag-n-drop functionality is activated. +The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the look and feel of the drag panel that appears when the drag-n-drop functionality is activated. Check the details below. -To initialize the `DragPanel` module, enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration. +![](../assets/grid/drag_panel.png) + +To initialize the `DragPanel` module, you should enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration together with the [row Drag-and-Drop](#drag-n-drop) functionality (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties). For example: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -2206,9 +2208,11 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -The module is automatically enabled if the [row Drag-and-Drop](grid/configuration.md/#drag-n-drop) is active (e.g., `dragItem: "row"` or `dragItem: "both"`) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. +**Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) + +The module is automatically enabled if the [row Drag-and-Drop](#drag-n-drop) is activated (e.g., via `dragItem: "row"` or `dragItem: "both"`) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. -This example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: +The following example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -2225,10 +2229,7 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -The `dragPanel` property can be set in two ways: - -- as a *boolean* value it enables or disables the range selection module upon the component initialization -- as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: +You can specify additional configuration options for the `DragPanel` module while initializing the component. For this, you need to set the `dragPanel` property as an object. The following options are available: - `css` - specifies a custom CSS class for styling the drag panel - `icon` - defines a custom icon for the drag handle - `width` - sets the width of the drag panel in pixels diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index b2de56b71..cf799e276 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -10,16 +10,22 @@ description: You can explore how to work with DragPanel module of Grid in the do This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -The `DragPanel` module provides auxiliary functionality for moving rows in the dhx.Grid component. It is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled (e.g., via `dragItem: "both"`) and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. +The `DragPanel` module provides auxiliary functionality for moving rows in the **dhx.Grid** component. -The module supports customization through configuration options to adjust its appearance and behavior. +![](../assets/grid/drag_panel.png) + +**Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) + +The module is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. + +The module also supports customization through [configuration options](grid/configuration.md/#adjusting-the-dragpanel-module) to adjust its appearance and behavior. ## Initializing the DragPanel module -The `DragPanel` module is initialized via the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the configuration of the dhx.Grid component. The module is also automatically activated if: +The `DragPanel` module is initialized via the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the configuration of the **dhx.Grid** component. The module is also automatically activated if: -- The row Drag-and-Drop is enabled via `dragItem: "row"` or `dragItem: "both"` -- The [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) are enabled +- The row Drag-and-Drop is enabled, e.g. via `dragItem: "row"` or `dragItem: "both"` +- The [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -38,7 +44,7 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -Learn about configuration possibilities of the drag panel in the [Configuration](grid/configuration.md/#using-the-dragpanel-module) guide. +Learn about configuration possibilities of the drag panel in the [Configuration](grid/configuration.md/#adjusting-the-dragpanel-module) guide. ## Using the events of the DragPanel module diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 85bce9b72..3b99ec5e0 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -27,20 +27,19 @@ Released on June X, 2025 - Grid. The [`Clipboard` module](grid/usage_clipboard.md) is added to provide functionality for interacting with the clipboard in Grid (PRO version) - new Grid configuration property: [`clipboard`](grid/api/grid_clipboard_config.md) - new events of the `clipboard` object: [`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), [`pasteError`](grid/api/clipboard/pasteerror_event.md) -- Grid. The [`DragPanel` module](grid/usage_dragpanel.md) is added to provide auxiliary functionality for moving rows in Grid (PRO version) +- Grid. The [`DragPanel` module](grid/usage_dragpanel.md) is added to provide auxiliary functionality for moving rows in Grid and improve the drag-n-drop visualization (PRO version) - new Grid configuration property: [`dragPanel`](grid/api/grid_dragpanel_config.md) - new events: [`dragPanelItemClick`](grid/api/dragpanel/dragpanelitemclick_event.md), [`dragPanelItemMouseDown`](grid/api/dragpanel/dragpanelitemmousedown_event.md) - Grid. The [`History` module](grid/usage_history.md) is added to provide functionality for managing the history of actions in Grid, including the [Undo/Redo functionality](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) (PRO version) - new Grid configuration property: [`history`](grid/api/grid_history_config.md) - new methods of the `history` object: [`add()`](grid/api/history/add_method.md), [`canRedo()`](grid/api/history/canredo_method.md), [`canUndo()`](grid/api/history/canundo_method.md), [`disable()`](grid/api/history/disable_method.md), [`enable()`](grid/api/history/enable_method.md), [`isDisabled()`](grid/api/history/isdisabled_method.md), [`getHistory()`](grid/api/history/gethistory_method.md), [`redo()`](grid/api/history/redo_method.md), [`remove()`](grid/api/history/remove_method.md), [`removeAll()`](grid/api/history/removeall_method.md), [`undo()`](grid/api/history/undo_method.md) - new events of the `history` object: [`afterAdd`](grid/api/history/afteradd_event.md), [`afterRedo`](grid/api/history/afterredo_event.md), [`afterUndo`](grid/api/history/afterundo_event.md), [`beforeAdd`](grid/api/history/beforeadd_event.md), [`beforeRedo`](grid/api/history/beforeredo_event.md), [`beforeUndo`](grid/api/history/beforeundo_event.md), [`error`](grid/api/history/error_event.md) +- Grid. The [`isSelected()`](grid/api/selection/selection_isselectedcell_method.md) method is added for the [`Selection` module](grid/usage_selection.md) to check whether the specified cell is selected ### Updates -- Context Menu. The `navigationType:"click"` is added -- Grid. The logic and appearance of the drag-n-drop functionality is improved (the `DropManager` module is added) -- Grid. The [`isSelected()`](grid/api/selection/selection_isselectedcell_method.md) method is added for the [`Selection` module](grid/usage_selection.md) to check whether the specified cell is selected -- Grid. Updating / improving the export to Excel module +- Grid. The logic and appearance of the drag-n-drop functionality is improved +- Grid. Improving the export to Excel module - Grid. The possibility to clear data while editing a cell by using the `Delete` shortcut key is added ### Fixes From e91bb3b75fd04ddc0280e6967ee82754862787f2 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 13 Jun 2025 17:26:15 +0300 Subject: [PATCH 18/47] [update] grid clipboard module guides --- docs/grid/api/clipboard/aftercopy_event.md | 2 + docs/grid/api/clipboard/afterpaste_event.md | 2 + docs/grid/api/clipboard/beforecopy_event.md | 2 + docs/grid/api/clipboard/beforepaste_event.md | 2 + docs/grid/api/clipboard/copyerror_event.md | 2 + docs/grid/api/clipboard/pasteerror_event.md | 2 + docs/grid/configuration.md | 24 +-- docs/grid/usage_clipboard.md | 154 +++++++++++-------- 8 files changed, 102 insertions(+), 88 deletions(-) diff --git a/docs/grid/api/clipboard/aftercopy_event.md b/docs/grid/api/clipboard/aftercopy_event.md index c4bbf6f46..81ee80b1d 100644 --- a/docs/grid/api/clipboard/aftercopy_event.md +++ b/docs/grid/api/clipboard/aftercopy_event.md @@ -39,5 +39,7 @@ grid.clipboard.events.on("afterCopy", (isCut) => { **Related API**: [`beforeCopy`](grid/api/clipboard/beforecopy_event.md) +**Related article**: [Work with Clipboard module](grid/usage_clipboard.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/afterpaste_event.md b/docs/grid/api/clipboard/afterpaste_event.md index 1e30f8101..b1f50e28c 100644 --- a/docs/grid/api/clipboard/afterpaste_event.md +++ b/docs/grid/api/clipboard/afterpaste_event.md @@ -35,5 +35,7 @@ grid.clipboard.events.on("afterPaste", () => { **Related API**: [`beforePaste`](grid/api/clipboard/beforepaste_event.md) +**Related article**: [Work with Clipboard module](grid/usage_clipboard.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/beforecopy_event.md b/docs/grid/api/clipboard/beforecopy_event.md index 232e17a84..aa08fe5a1 100644 --- a/docs/grid/api/clipboard/beforecopy_event.md +++ b/docs/grid/api/clipboard/beforecopy_event.md @@ -45,5 +45,7 @@ grid.clipboard.events.on("beforeCopy", (isCut) => { **Related API**: [`afterCopy`](grid/api/clipboard/aftercopy_event.md) +**Related article**: [Work with Clipboard module](grid/usage_clipboard.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/beforepaste_event.md b/docs/grid/api/clipboard/beforepaste_event.md index 35f0a8a3c..78c153bcb 100644 --- a/docs/grid/api/clipboard/beforepaste_event.md +++ b/docs/grid/api/clipboard/beforepaste_event.md @@ -40,5 +40,7 @@ grid.clipboard.events.on("beforePaste", () => { **Related API**: [`afterPaste`](grid/api/clipboard/afterpaste_event.md) +**Related article**: [Work with Clipboard module](grid/usage_clipboard.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/copyerror_event.md b/docs/grid/api/clipboard/copyerror_event.md index 92bb1d096..7f64a4503 100644 --- a/docs/grid/api/clipboard/copyerror_event.md +++ b/docs/grid/api/clipboard/copyerror_event.md @@ -40,5 +40,7 @@ grid.clipboard.events.on("copyError", (error) => { **Related API**: [`pasteError`](grid/api/clipboard/pasteerror_event.md) +**Related article**: [Work with Clipboard module](grid/usage_clipboard.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/clipboard/pasteerror_event.md b/docs/grid/api/clipboard/pasteerror_event.md index df6ee5195..557f52866 100644 --- a/docs/grid/api/clipboard/pasteerror_event.md +++ b/docs/grid/api/clipboard/pasteerror_event.md @@ -40,5 +40,7 @@ grid.clipboard.events.on("pasteError", (error) => { **Related API**: [`copyError`](grid/api/clipboard/copyerror_event.md) +**Related article**: [Work with Clipboard module](grid/usage_clipboard.md) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 7e2b06928..15b3bef06 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2671,12 +2671,10 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The Grid component provides the [functionality for interacting with the clipboard](grid/usage_clipboard.md), such as copying, cutting, and pasting data from a selected range of cells, as well as integrating with other grids or external applications like Google Spreadsheets. -To enable the clipboard functionality within a grid, you should use the `Clipboard` module. To initialize the module, enable the [`clipboard`](grid/api/grid_clipboard_config.md) property in the Grid configuration. - -The `Clipboard` module requires the [`RangeSelection`](#managing-range-selection-in-grid) module to be enabled. For convenient range selection via the UI, it is recommended to use the [`BlockSelection`](#managing-block-selection-in-grid) module with the `mode: "range"` setting. It allows users to visually select areas before copying or pasting. +To enable the clipboard functionality within a grid, you should use the `Clipboard` module. To initialize the module, enable the [`clipboard`](grid/api/grid_clipboard_config.md) property in the Grid configuration. The `Clipboard` module requires the [`RangeSelection`](#managing-range-selection-in-grid) module to be enabled. For convenient range selection via the UI, it is recommended to use the [`BlockSelection`](#managing-block-selection-in-grid) module with the `mode: "range"` setting. It allows users to visually select areas before copying or pasting. :::note -The `blockSelection: { mode: "range" }` property is initialized in the Grid configuration when the `Clipboard` module is enabled. +The `blockSelection: { mode: "range" }` property is automatically initialized in the Grid configuration when the `Clipboard` module is enabled. ::: ~~~jsx @@ -2723,24 +2721,6 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -### Interaction between Grids and external widgets - -The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. - -#### Integration with Google Spreadsheets - -Data from a grid can be copied to the clipboard and pasted directly into Google Spreadsheets. Similarly, data from Google Spreadsheets can be copied and pasted into the grid. Use `pasteModifier` to process data formats (e.g., converting strings to numbers). - -### Pasting from clipboard - -Data from the clipboard is pasted into the range defined by `rangeSelection`. The behavior depends on the size of the selected range and the number of copied elements: - -- **If the range is smaller than the copied elements**: all the copied elements will be pasted if there is enough space in the grid (i.e., sufficient rows and columns exist beyond the range's starting point). For example, if 4 cells (2 rows x 2 columns) are copied and the range is set to 1 row x 2 columns, the data will be fully pasted, expanding the range to 2 rows, if rows are available. - -- **If the range is larger than the copied elements**: the copied elements will repeat cyclically to fill the entire range. For example, if 2 cells ("A1", "A2") are copied and the range is 4 cells (2 rows x 2 columns), the result will be "A1", "A2", "A1", "A2". - -The repetition of elements follows the order of copying, starting from the first cell. - For information on working with Clipboard, read the [Work with Clipboard module](grid/usage_clipboard.md) guide. ## History of Grid actions diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md index 65c792f73..42e126cdb 100644 --- a/docs/grid/usage_clipboard.md +++ b/docs/grid/usage_clipboard.md @@ -10,20 +10,16 @@ description: You can explore how to work with Clipboard module of Grid in the do This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -You can manage the clipboard functionality within a grid via the API of the [`Clipboard`](grid/configuration.md/#clipboard) module. It enables copying, cutting, and pasting data from a selected range of cells. Besides, it allows integrating with other grids or external applications like Google Spreadsheets. +You can manage the clipboard functionality within a grid via the API of the [`Clipboard`](grid/configuration.md/#clipboard) module. It enables copying, cutting, and pasting data from a selected range of cells. Besides, it allows [integrating with other grids or external applications](#interaction-between-grids-and-external-widgets) like Google Spreadsheets. ## Initializing the Clipboard module To initialize the `Clipboard` module, use the [`clipboard`](grid/api/grid_clipboard_config.md) property in the **dhx.Grid** component configuration. After the Grid component is created, the module is accessible through the `grid.clipboard` property. :::note -The module requires the [`RangeSelection`](grid/usage_rangeselection.md) module to be enabled and is best used in conjunction with the [`BlockSelection`](grid/usage_blockselection.md) module in the `"range"` mode (enabled on initialization of the `Clipboard` module) for convenient range selection via the UI. +The module requires the [`RangeSelection`](grid/usage_rangeselection.md) module to be enabled and is best used in conjunction with the [`BlockSelection`](grid/usage_blockselection.md) module in the `"range"` mode (enabled on initialization of the `Clipboard` module) for convenient range selection via the UI. [Check the details below](#interaction-with-cell-selection) ::: -The `clipboard` property can be set: -- as a *boolean* value to enable/disable the `Clipboard` module upon the component initialization -- as an *object* to enable the module and define the [modifier functions](#using-formatter-functions) for data processing: `copyModifier`, `cutModifier` and `pasteModifier`. The example below demonstrates the clipboard configuration with all the modifiers in use: - ~~~jsx const grid = new dhx.Grid("grid_container", { columns: [ @@ -34,71 +30,16 @@ const grid = new dhx.Grid("grid_container", { { id: "1", a: "A1", b: "B1" }, { id: "2", a: "A2", b: "B2" }, ], - clipboard: true + blockSelection: { mode: "range" }, // required for Clipboard to function (initializes automatically) + clipboard: true // enables the Clipboard module }); ~~~ -## Using the events of the Clipboard object - -To make the process of working with clipboard more flexible, you can apply the related events of the `clipboard` object: -[`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), -[`pasteError`](grid/api/clipboard/pasteerror_event.md) - -## Interaction with cell selection - -### Automatic activation of BlockSelection module - -When **Clipboard API** is enabled (e.g., via `grid.config.clipboard: true`), the **BlockSelection API** is automatically activated in the `range` mode unless another mode is specified. - -### Usage in other BlockSelection modes - -If the `BlockSelection` module is configured in the `manual` mode, the **Clipboard API** does not automatically receive a range. In this case, you should manually set the range using the **Range API**. For this purpose, you need to call - `grid.range.setRange({ xStart, xEnd, yStart, yEnd })`. - -:::note -Without a set range, copying and pasting will not work, as **Clipboard API** relies on data from the **Range API**. -::: - -### Data source for Clipboard - -The **Clipboard API** always uses data from the **Range API** to determine the cells that will be copied or into which data will be pasted. - -:::note -The `cut`/`paste` operations will be blocked in the [*grouping*](grid/usage.md/#grouping-data) mode. -::: - -## Interaction between Grids and external widgets - -### Columns with type "date" - -When copying cells with the column type `type: "date"`, the *formatted* value is copied to the clipboard (not the original string or date object). For example, if the data contains `"2025-04-11"` and the display format is set to `"dd/mm/yyyy"`, the copied value will be `"11/04/2025"`. This behavior simplifies working with dates in tables and other applications. - -When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value is checked for compliance with the column's `dateFormat` (e.g., `"dd/mm/yyyy"`) or whether it can be parsed as a valid `Date` object (e.g., `"2025-04-11"` or `"April 11, 2025"`). If the value is valid, it is converted to the grid's expected format and inserted. If invalid (e.g., `"abc"` or `"31 12 2025"`), the paste operation is ignored, and the cell's current value remains unchanged. - -### Columns with type "number" - -When copying cells with the column type `type: "number"`, the values are copied to the clipboard as numbers, even if `numberMask` or `patternMask` is applied. For example, if a cell displays `"1,234.56"` due to a mask, the copied value will be `1234.56`. This is done to maintain data purity and compatibility with other systems, such as spreadsheets or data processing software. - -When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value must be a valid number (e.g., `1234.56` or `"1,234.56"` after cleaning). If the value is not a number (e.g., `"abc"`), the paste operation is ignored, and the cell's current value remains unchanged. - -### Columns with type "string" - -If `patternMask` is applied to a cell (e.g., for formatting phone numbers or currency), the *formatted* value is copied to the clipboard. -For example, if the data contains `"1234567890"` and the mask is `"+# (###) ###-##-##"`, the copied value will be `"+1 (234) 567-89-0"`. This preserves readability for the end user. - -### Templates - -Templates applied to cell values (e.g., via the `template` property) are not included in the data during copying. This prevents unwanted HTML or formatted text from entering the clipboard, which could disrupt the functionality of external widgets or tables (e.g., Google Spreadsheets). Only the "raw" value from the data is copied. - -### Columns with editors "combobox", "multiselect", "select" - -If a column has `editorType: "combobox"`, `"multiselect"`, or `"select"`, the value stored in the data (typically an `id` or a key) is copied to the clipboard, not the displayed portion (e.g., the option text). - -For example, if the data contains `{ id: "1", value: "Option 1" }` and the cell displays `"Option 1"`, the copied value will be `"1"`. This ensures data consistency when transferring between systems. +The `clipboard` property can be set as an *object* to enable the module and define the [modifier functions](#using-formatter-functions) for data processing: `copyModifier`, `cutModifier` and `pasteModifier`. ## Using formatter functions -If you need a specific data format during copying or pasting, the default behavior can be modified using the formatter functions (`copyModifier`, `cutModifier`, `pasteModifier`). Check the example below: +If you need a specific data format during copying or pasting, the default behavior can be modified using the formatter functions: `copyModifier`, `cutModifier`, `pasteModifier`. Check the example below: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -205,4 +146,85 @@ copyModifier: (value, cell, cut) => { } return value; } -~~~ \ No newline at end of file +~~~ + +**Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) + +## Using the events of the Clipboard object + +To make the process of working with clipboard more flexible, you can apply the related events of the `clipboard` object: +[`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), [`pasteError`](grid/api/clipboard/pasteerror_event.md) + +## Interaction with cell selection + +### Automatic activation of BlockSelection module + +When `Clipboard` module is enabled (e.g., via `grid.config.clipboard: true`), the `BlockSelection` module is automatically activated in the `range` mode unless another mode is specified. + +### Usage in other BlockSelection modes + +If the [`BlockSelection`](grid/usage_blockselection.md) module is configured in the `manual` mode, the `Clipboard` module does not automatically receive a range. In this case, you should manually set the range using the [`RangeSelection` API](grid/api/api_overview.md/#rangeselection-api). For this purpose, you need to call `grid.range.setRange({ xStart, xEnd, yStart, yEnd })`. + +:::note +Without a set range, copying and pasting will not work, as **Clipboard API** relies on data from the **RangeSelection API**. +::: + +### Data source for Clipboard + +The **Clipboard API** always uses data from the **RangeSelection API** to determine the cells that will be copied or into which data will be pasted. + +:::note +The `cut`/`paste` operations will be blocked in the [*grouping*](grid/usage.md/#grouping-data) mode. +::: + +### Pasting from clipboard + +Data from the clipboard is pasted into the range defined by `rangeSelection`. The behavior depends on the size of the selected range and the number of copied elements: + +- **If the range is smaller than the copied elements**: all the copied elements will be pasted if there is enough space in the grid (i.e., the sufficient number of rows and columns exist beyond the range's starting point). For example, if 4 cells (2 rows x 2 columns) are copied and the range is set to 1 row x 2 columns, the data will be fully pasted, expanding the range to 2 rows, if rows are available. + +- **If the range is larger than the copied elements**: the copied elements will repeat cyclically to fill the entire range. For example, if 2 cells ("A1", "A2") are copied and the range contains 4 cells (2 rows x 2 columns), the result will be "A1", "A2", "A1", "A2". + +The repetition of elements follows the order of copying, starting from the first cell. + +## Interaction between Grids and external widgets + +The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. + +**Related sample**: [Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/qll7bcv5) + +Below you'll find the details on copying/pasting data depending on the type of a column. + +### Columns with type "date" + +When copying cells with the column type `type: "date"`, the *formatted* value is copied to the clipboard (not the original string or date object). For example, if the data contains `"2025-04-11"` and the display format is set to `"dd/mm/yyyy"`, the copied value will be `"11/04/2025"`. This behavior simplifies working with dates in tables and other applications. + +When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value is checked for compliance with the column's `dateFormat` (e.g., `"dd/mm/yyyy"`) or whether it can be parsed as a valid `Date` object (e.g., `"2025-04-11"` or `"April 11, 2025"`). If the value is valid, it is converted to the grid's expected format and inserted. If invalid (e.g., `"abc"` or `"31 12 2025"`), the paste operation is ignored, and the cell's current value remains unchanged. + +### Columns with type "number" + +When copying cells with the column type `type: "number"`, the values are copied to the clipboard as numbers, even if `numberMask` or `patternMask` is applied. For example, if a cell displays `"1,234.56"` due to a mask, the copied value will be `1234.56`. This is done to maintain data purity and compatibility with other systems, such as spreadsheets or data processing software. + +When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value must be a valid number (e.g., `1234.56` or `"1,234.56"` after cleaning). If the value is not a number (e.g., `"abc"`), the paste operation is ignored, and the cell's current value remains unchanged. + +### Columns with type "string" + +If `patternMask` is applied to a cell (e.g., for formatting phone numbers or currency), the *formatted* value is copied to the clipboard. +For example, if the data contains `"1234567890"` and the mask is `"+# (###) ###-##-##"`, the copied value will be `"+1 (234) 567-89-0"`. This preserves readability for the end user. + +### Templates + +Templates applied to cell values (e.g., via the `template` property) are not included in the data during copying. This prevents unwanted HTML or formatted text from entering the clipboard, which could disrupt the functionality of external widgets or tables (e.g., Google Spreadsheets). Only the "raw" value from the data is copied. + +### Columns with editors "combobox", "multiselect", "select" + +If a column has `editorType: "combobox"`, `"multiselect"`, or `"select"`, the value stored in the data (typically an `id` or a key) is copied to the clipboard, not the displayed portion (e.g., the option text). + +For example, if the data contains `{ id: "1", value: "Option 1" }` and the cell displays `"Option 1"`, the copied value will be `"1"`. This ensures data consistency when transferring between systems. + +### Integration with Google Spreadsheets + +Data from a grid can be copied to the clipboard and pasted directly into Google Spreadsheets. Similarly, data from Google Spreadsheets can be copied and pasted into the grid. Use [`pasteModifier`](#using-formatter-functions) to process data formats (e.g., converting strings to numbers). + +**Related sample**: [Clipboard. Clipboard operations between Grid and Spreadsheet](https://snippet.dhtmlx.com/mfmvbbda) + From 0c05efbcad783cbcc9a8dda1800fe46aa04ac05a Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 17 Jun 2025 17:13:33 +0300 Subject: [PATCH 19/47] [update] guides and api of the grid modules --- docs/assets/grid/blockselection_module.png | Bin 0 -> 53736 bytes .../{drag_panel.png => dragpanel_module.png} | Bin .../afterblockhandleapply_event.md | 2 +- .../beforeblockhandleapply_event.md | 4 +- .../blockselectionvalidate_event.md | 2 +- .../grid/api/blockselection/disable_method.md | 2 +- docs/grid/api/blockselection/enable_method.md | 2 +- docs/grid/api/grid_blockselection_config.md | 125 +++++++--- docs/grid/api/grid_clipboard_config.md | 2 + docs/grid/api/grid_dragpanel_config.md | 2 + docs/grid/api/grid_rangeselection_config.md | 2 +- .../rangeselection/beforesetrange_event.md | 2 + .../api/rangeselection/setrange_method.md | 1 + docs/grid/configuration.md | 46 ++-- docs/grid/usage_blockselection.md | 215 ++++++++++++------ docs/grid/usage_clipboard.md | 160 ++++++------- docs/grid/usage_dragpanel.md | 7 +- docs/grid/usage_history.md | 9 +- docs/grid/usage_rangeselection.md | 51 +++-- 19 files changed, 391 insertions(+), 243 deletions(-) create mode 100644 docs/assets/grid/blockselection_module.png rename docs/assets/grid/{drag_panel.png => dragpanel_module.png} (100%) diff --git a/docs/assets/grid/blockselection_module.png b/docs/assets/grid/blockselection_module.png new file mode 100644 index 0000000000000000000000000000000000000000..99961c6cfdf76970d4b4112e576f1075620aeb28 GIT binary patch literal 53736 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 { +grid.block.events.on("afterBlockHandleApply", (startCell, endCell, dragDirection) => { console.log("Handle applied:"); }); diff --git a/docs/grid/api/blockselection/beforeblockhandleapply_event.md b/docs/grid/api/blockselection/beforeblockhandleapply_event.md index 8e865f980..579b82598 100644 --- a/docs/grid/api/blockselection/beforeblockhandleapply_event.md +++ b/docs/grid/api/blockselection/beforeblockhandleapply_event.md @@ -35,8 +35,8 @@ The callback of the event is called with the following parameters: Return `false` to cancel the action; otherwise, `true`. @example: -grid.block.events.on("beforeBlockHandleApply", (startCell, endCell, dir) => { - if (dir === "right" | dir === "left") { +grid.block.events.on("beforeBlockHandleApply", (startCell, endCell, dragDirection) => { + if (dragDirection === "right" | dragDirection === "left") { console.log("Horizontal change canceled"); return false; } diff --git a/docs/grid/api/blockselection/blockselectionvalidate_event.md b/docs/grid/api/blockselection/blockselectionvalidate_event.md index 98dc247a1..12f0695f6 100644 --- a/docs/grid/api/blockselection/blockselectionvalidate_event.md +++ b/docs/grid/api/blockselection/blockselectionvalidate_event.md @@ -43,7 +43,7 @@ const grid = new dhx.Grid("grid_container", { blockSelection: true }); -grid.block.events.on("blockSelectionValidate", (cell, handle, event) => { +grid.block.events.on("blockSelectionValidate", (validateCell, handle, event) => { if (cell.column.id === "b") { console.log("Selection cannot start from column B"); return false; diff --git a/docs/grid/api/blockselection/disable_method.md b/docs/grid/api/blockselection/disable_method.md index f886e95cb..e31eaf45b 100644 --- a/docs/grid/api/blockselection/disable_method.md +++ b/docs/grid/api/blockselection/disable_method.md @@ -6,7 +6,7 @@ description: You can explore the disable method of Grid block selection in the d # disable() -@short: disables the BlockSelection module and resets processing of block selection +@short: disables the `BlockSelection` module and resets processing of block selection @signature: {'disable(): void;'} diff --git a/docs/grid/api/blockselection/enable_method.md b/docs/grid/api/blockselection/enable_method.md index 0ff4fea44..7024c1b9f 100644 --- a/docs/grid/api/blockselection/enable_method.md +++ b/docs/grid/api/blockselection/enable_method.md @@ -6,7 +6,7 @@ description: You can explore the enable method of Grid block selection in the do # enable() -@short: enables the BlockSelection module and activates the capabilities of block selection in Grid +@short: enables the `BlockSelection` module and activates the capabilities of block selection in Grid @signature: {'enable(): void;'} diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md index e01ae85e0..36d09bd46 100644 --- a/docs/grid/api/grid_blockselection_config.md +++ b/docs/grid/api/grid_blockselection_config.md @@ -68,7 +68,7 @@ The `blockSelection` property can be set in two ways: mode - the operating mode of the module:
  • "range" - managed through the Range module
  • "manual" - managed through the manual control
+ the operating mode of the module:
handle @@ -82,12 +82,12 @@ The `blockSelection` property can be set in two ways: :::note -By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the **Range** module is initialized. +By default, the `blockSelection` property is set to `false`. When `blockSelection` is set to `true` or the module is set to the "range" mode, the [`RangeSelection`](grid/usage_rangeselection.md) module is initialized. ::: +This example demonstrates configuring the module with the handle disabled and the "range" mode enabled: -~~~jsx -// this example demonstrates configuring the module with the handle disabled and the "range" mode enabled +~~~jsx {10-13} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -98,46 +98,105 @@ const grid = new dhx.Grid("grid_container", { { id: "2", a: "A2", b: "B2" }, ], blockSelection: { - mode: "range", - handle: false, + mode: "range", // setting the "range" mode + handle: false // the handle is disabled } }); ~~~ +This example demonstrates configuring the handle and its behavior: + ~~~jsx -// this example demonstrates configuring the handle and its behavior +/* Define grid columns configuration */ +const columns = [ + { id: "productId", header: [{ text: "Product ID" }] }, // Column for the unique product identifier + { id: "productName", header: [{ text: "Product Name" }] }, // Column for the product name + { id: "category", header: [{ text: "Category" }] }, // Column for the product category + { id: "receivedDate", header: [{ text: "Received Date" }], type: "date", dateFormat: "%d.%m.%Y" }, // Date column with the specified format + { id: "stock", header: [{ text: "Stock" }], type: "number" }, // Numeric column for the stock quantity + { id: "price", header: [{ text: "Price" }], type: "number", numberMask: { prefix: "$" } } // Numeric column for the price with the dollar prefix +]; + +/* Initialize DHTMLX Grid with the specified configuration */ const grid = new dhx.Grid("grid_container", { - columns: [ - { id: "a", header: [{ text: "A" }] }, - { id: "b", header: [{ text: "B" }] }, - ], - data: [ - { id: "1", a: "A1", b: "B1" }, - { id: "2", a: "A2", b: "B2" }, - ], + columns, + data, + autoWidth: true, + history: true, // Enable history tracking for undo/redo blockSelection: { - mode: "range", handle: { - allowAxis: "x", // the handle movement is restricted by the "x" axis - handler: ({ array, range, grid, cell, index }) => { - if (array.length <= 1) { - return; - } - const firstCell = range[0]; - // the copied cells will have the "-copied" suffix - const value = firstCell.row[firstCell.column.id] + (index ? "-copied" : ""); - grid.data.update( - cell.row.id, - { [cell.column.id]: value }, - index < array.length - 1 // the silent mode for all the cells except for the last cell - ); - } - } - } + allowAxis: "y", // Allow selection along the y-axis (rows) + handler: blockSelectionHandler, // Custom handler for block selection + }, + }, }); + +/* Set initial selection range for the grid */ +grid.range.setRange({ + xStart: "productId", // Start selection at the "productId" column + yEnd: grid.data.getId(0), // End selection at the first row +}); + +/* Initialize objects to store initial values and column indices */ +let initValues = {}; // Store initial values for each column +let columnIndex = {}; // Track index increments for each column + +/* The handler function for block selection events */ +function blockSelectionHandler({ cell, array, index, grid }) { + // Reset tracking objects if this is the first cell in the selection + if (!index) { + initValues = {}; + columnIndex = {}; + } + const columnId = cell.column.id; + // Initialize values for a new column if not already set + if (!initValues[columnId]) { + initValues[columnId] = cell.row[columnId]; // Store the initial cell value + columnIndex[columnId] = 0; // Initialize the index counter + return { prev: initValues[columnId], current: initValues[columnId] }; // Return unchanged values + } + + // Increment column index for the current column + const colIndex = columnIndex[columnId] += 1; + const initValue = initValues[columnId]; // Get the initial value for a column + let prev = current = cell.row[columnId]; // Set the default previous and current values + + // Modify the current value based on the column type + switch (cell.column.type) { + case "number": + current = initValue + colIndex * 10; // Increment the number by 10 per row + break; + case "date": + // Parse ISO date and increment the day by colIndex + const [year, month, day] = initValue.split("-"); + current = new Date(Number(year), Number(month) - 1, Number(day) + colIndex).toISOString(); + break; + default: + current = initValue; // Keep the default value for other types + break; + } + + // Custom formatting for specific columns + if (columnId === "productId") { + // Generate a new product ID with the format P00N + current = `P00${parseInt(initValue.replace(/\D/g, "")) + colIndex}`; + } + if (columnId === "category") { + // Append the index in parentheses to the category + current = `${current} (${colIndex})`; + } + + // Create the history object for undo/redo + const history = { prev, current }; + // Update grid data with the new value + grid.data.update(cell.row.id, { [columnId]: current }, + index < array.length - 1 // Continue updating if it isn't the last cell in selection + ); + return history; // Return the history for tracking +} ~~~ -**Related sample:** [Grid. BlockSelection with handle configuration](https://snippet.dhtmlx.com/8gx20g1d) +**Related sample:** [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/8kttktiy) **Related article:** [Managing block selection in Grid](grid/configuration.md/#managing-block-selection-in-grid) diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md index f5ce8e9e6..199653c00 100644 --- a/docs/grid/api/grid_clipboard_config.md +++ b/docs/grid/api/grid_clipboard_config.md @@ -76,4 +76,6 @@ const grid = new dhx.Grid("grid_container", { **Related article:** [Clipboard](grid/configuration.md/#clipboard) +**Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_dragpanel_config.md b/docs/grid/api/grid_dragpanel_config.md index baa1d0ca7..a38be17e5 100644 --- a/docs/grid/api/grid_dragpanel_config.md +++ b/docs/grid/api/grid_dragpanel_config.md @@ -87,4 +87,6 @@ const grid = new dhx.Grid("grid_container", { **Related article:** [Using the DragPanel module](grid/configuration.md/#using-the-dragpanel-module) +**Related sample:** [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_rangeselection_config.md b/docs/grid/api/grid_rangeselection_config.md index 3d0e049ad..894849b20 100644 --- a/docs/grid/api/grid_rangeselection_config.md +++ b/docs/grid/api/grid_rangeselection_config.md @@ -56,7 +56,7 @@ const grid = new dhx.Grid("grid_container", { rangeSelection: { disabled: true } }); -console.log(grid.range.isDisabled()); // `true` - module is inactive +console.log(grid.range.isDisabled()); // -> `true` - module is inactive grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set ~~~ diff --git a/docs/grid/api/rangeselection/beforesetrange_event.md b/docs/grid/api/rangeselection/beforesetrange_event.md index 8752f50eb..5e3322bc2 100644 --- a/docs/grid/api/rangeselection/beforesetrange_event.md +++ b/docs/grid/api/rangeselection/beforesetrange_event.md @@ -55,5 +55,7 @@ grid.range.setRange({ xStart: "b", yStart: "1" }); // setting a new range is can **Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md), [`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md) +**Related sample**: [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/setrange_method.md b/docs/grid/api/rangeselection/setrange_method.md index ebdcd77c5..7954e77c6 100644 --- a/docs/grid/api/rangeselection/setrange_method.md +++ b/docs/grid/api/rangeselection/setrange_method.md @@ -91,6 +91,7 @@ console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", **Related API**: [`getRange()`](grid/api/rangeselection/getrange_method.md), [`resetRange()`](grid/api/rangeselection/resetrange_method.md) +**Related sample**: [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 15b3bef06..fe0f9c917 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2189,7 +2189,7 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the look and feel of the drag panel that appears when the drag-n-drop functionality is activated. Check the details below. -![](../assets/grid/drag_panel.png) +![](../assets/grid/dragpanel_module.png) To initialize the `DragPanel` module, you should enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration together with the [row Drag-and-Drop](#drag-n-drop) functionality (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties). For example: @@ -2210,7 +2210,8 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) -The module is automatically enabled if the [row Drag-and-Drop](#drag-n-drop) is activated (e.g., via `dragItem: "row"` or `dragItem: "both"`) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. +The module is also automatically enabled if the [row Drag-and-Drop](#drag-n-drop) functionality is activated +(e.g. via the `dragItem: "row"` or `dragItem: "both"` properties) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. The following example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: @@ -2530,7 +2531,7 @@ The `rangeSelection` property can be set in two ways: - as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: - **disabled** - makes the module inactive upon initialization of the component -The example below demonstrates interaction with the Range module's methods when range selection is configured to be inactive on the component initialization. +The example below demonstrates interaction with the RangeSelection module's API when range selection is configured to be inactive on the component initialization. ~~~jsx {11,15} const grid = new dhx.Grid("grid_container", { @@ -2558,7 +2559,7 @@ For information on using the Range Selection API, read the [Work with RangeSelec This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -The Grid functionality provides the [block selection management](grid/usage_blockselection.md) feature for selecting cells' ranges via the mouse pointer, touch input, and keyboard navigation, as well as adjusting the appearance of the selection and handlers, depending on the applied mode. +The Grid functionality provides the [block selection management](grid/usage_blockselection.md) feature for selecting cells' ranges via the mouse pointer, touch input, and keyboard navigation, as well as adjusting the appearance of the selection and managing the behavior of the module, depending on the applied mode. To enable managing of the block selection within a grid, you should use the `BlockSelection` module. To initialize the module, enable the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration: @@ -2589,7 +2590,7 @@ The `blockSelection` property can be set in two ways: mode - the operating mode of the module:
  • "range" - managed through the Range module
  • "manual" - managed through the manual control
+ the operating mode of the module: handle @@ -2608,7 +2609,7 @@ By default, the `blockSelection` property is set to `false`. When `blockSelectio The example below demonstrates configuring the module with the handle disabled and the "range" mode enabled: -~~~jsx +~~~jsx {10-13} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -2619,15 +2620,15 @@ const grid = new dhx.Grid("grid_container", { { id: "2", a: "A2", b: "B2" }, ], blockSelection: { - mode: "range", - handle: false + mode: "range", // setting the "range" mode + handle: false // the handle is disabled } }); ~~~ -The following example demonstrates configuring the handle and its behavior: +The following example demonstrates configuring the handle: -~~~jsx +~~~jsx {10-13} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -2638,30 +2639,13 @@ const grid = new dhx.Grid("grid_container", { { id: "2", a: "A2", b: "B2" }, ], blockSelection: { - mode: "range", - handle: { - allowAxis: "x", // the handle movement is restricted by the "x" axis - handler: ({ array, range, grid, cell, index }) => { - if (array.length <= 1) { - return; - } - const firstCell = range[0]; - // the copied cells will have the "-copied" suffix - const value = firstCell.row[firstCell.column.id] + (index ? "-copied" : ""); - grid.data.update( - cell.row.id, - { [cell.column.id]: value }, - index < array.length - 1 // the silent mode for all the cells except for the last cell - ); - } - } + mode: "range", // setting the "range" mode + handle: { allowAxis: "y" } // restricts the handle movement to the vertical direction } }); ~~~ -**Related sample**: [Grid. BlockSelection with handle configuration](https://snippet.dhtmlx.com/8gx20g1d) - -For information on using the Block Selection API, read the [Work with Block Selection object](grid/usage_blockselection.md) guide. +For information on using the Block Selection API, read the [Work with Block Selection module](grid/usage_blockselection.md) guide. ## Clipboard @@ -2721,6 +2705,8 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +**Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) + For information on working with Clipboard, read the [Work with Clipboard module](grid/usage_clipboard.md) guide. ## History of Grid actions diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md index afaefe9ef..43398e009 100644 --- a/docs/grid/usage_blockselection.md +++ b/docs/grid/usage_blockselection.md @@ -12,15 +12,35 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac You can manage block selection within a grid via the API of the [`BlockSelection`](grid/configuration.md/#managing-block-selection-in-grid) module. It allows selecting ranges of cells using the mouse pointer, touch input, or keyboard navigation, visualizing the selection, and controlling behavior through various modes and handlers. It also supports an [event system](grid/api/api_overview.md/#blockselection-events) to track user actions, including keyboard and mouse combinations. +![](../assets/grid/blockselection_module.png) + +## Initializing the BlockSelection module + To initialize the `BlockSelection` module, use the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration. Once the Grid is created, the module is accessible through the `grid.block` property. +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + blockSelection: true // enables the BlockSelection module +}); +~~~ + +The `blockSelection` property can also be set as an *object* to enable the module and provide additional configuration options. +Learn about configuration possibilities of the `BlockSelection` module in the [Configuration](grid/configuration.md/#managing-block-selection-in-grid) guide. + ## Enabling/disabling BlockSelection module You can activate the block selection module via the [`enable()`](grid/api/blockselection/enable_method.md) method of the `block` object. - The following example shows how the module is enabled after deactivation on initialization: -~~~jsx +~~~jsx {13} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -38,10 +58,9 @@ console.log(grid.block.isDisabled()); // -> false ~~~ To disable the block selection in Grid, use the [`disable()`](grid/api/blockselection/disable_method.md) method of the `block` object. - The example below shows disabling of the `BlockSelection` module: -~~~jsx +~~~jsx {13} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -54,17 +73,15 @@ const grid = new dhx.Grid("grid_container", { blockSelection: true }); -grid.block.disable(); -console.log(grid.block.isDisabled()); // true +grid.block.disable(); // disabling the module +console.log(grid.block.isDisabled()); // -> true ~~~ ## Checking BlockSelection module state -You can check whether the `BlockSelection` module is disabled, using the [`isDisabled()`](grid/api/blockselection/isdisabled_method.md) method of the `block` object. It returns `true`, if the module is disabled and `false`, if it is enabled. - -The following example shows checking of the module's activity status: +You can check whether the `BlockSelection` module is disabled, using the [`isDisabled()`](grid/api/blockselection/isdisabled_method.md) method of the `block` object. It returns `true`, if the module is disabled and `false`, if it is enabled. The following example shows checking of the module's activity status: -~~~jsx +~~~jsx {13,15} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -77,44 +94,54 @@ const grid = new dhx.Grid("grid_container", { blockSelection: true }); -console.log(grid.block.isDisabled()); // false -grid.block.disable(); -console.log(grid.block.isDisabled()); // true +console.log(grid.block.isDisabled()); // -> false +grid.block.disable(); +console.log(grid.block.isDisabled()); // -> true ~~~ +## Using events of the BlockSelection object + +To make the process of working with block selection more flexible, you can apply the [related events of the `block` object](grid/api/api_overview.md/#blockselection-events). + ## User-interface features +This section describes the main UI features of the `BlockSelection` module: the way of selecting a range of cells, the available keyboard navigation combinations, as well as the appearance and behavior of the selection handle. + ### Cell selection +The main points of cell selection while using the `BlockSelection` module are given below: + - The user selects a range by dragging the mouse from the initial cell to the end cell. For example, dragging from **A1** to **B3** creates the range **A1:B3**, which is highlighted. - The `Shift + click` combination allows extending the range from the current initial cell to the clicked cell. - The cell selection behavior depends on the applied mode: - - the *"range"* mode uses the **Range API** - - the *manual* mode requires specifying a custom logic via the [events](grid/api/api_overview.md/#blockselection-events) + - the `"range"` mode uses the [**RangeSelection API**](grid/api/api_overview.md/#rangeselection-api) + - the `"manual"` mode requires specifying a custom logic via the [events](grid/api/api_overview.md/#blockselection-events) ### Keyboard navigation -- The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: - - **Arrows** (`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`): moves the focus to the adjacent cell, setting the initial selection cell if no selection is active. +The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: + - **Arrows** (`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`): moves the focus to the adjacent cell, setting the initially selected cell if no selection is active. - **Shift + Arrows**: extends the selected range from the current initial cell in the direction of the pressed arrow. - **Ctrl + Arrows**: extends the selected range to the last cell in the direction of the pressed arrow. -- Keyboard and mouse combinations: - - **Shift + click**: sets the end cell of the range, extending the selection from the current initial cell. -- Keyboard navigation works in both the "range" and manual modes. In the manual mode, applying the selection (e.g., after Enter) requires handling via the events, such as [beforeBlockSelectionApply](grid/api/blockselection/beforeblockselectionapply_event.md) and [afterBlockSelectionApply](grid/api/blockselection/afterblockselectionapply_event.md). + +The **Shift + click** combination is also available. It sets the end cell of the range, extending the selection from the current initial cell. + +Keyboard navigation works in both the `"range"` and `"manual"` modes. In the `"manual"` mode, applying the selection (e.g., after `Enter`) requires handling via the events, such as [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) and [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). ### Selection handle -- If enabled (via [`blockSelection.handle`](grid/api/grid_blockselection_config.md/#parameters)), the handle appears in the bottom-right corner of the range. -- The default behavior (when the `handler` property isn't specified in the `handle` object) is the following: - - In the *`range`* mode: - - copies the value of the first cell of the selected range (or the entire range if selected) to new cells. For example, selecting **A1** (the value is "x") and dragging to **A3** fills **A2**, **A3** with "x". - - if the range **A1:B1** (the values are "x" and "y", correspondingly) is selected, dragging to **D1** copies "x" to **C1** and "y" to **D1**. +The peculiarities of the selection handle functionality are the following: + +- When the handle is enabled via [`blockSelection.handle`](grid/api/grid_blockselection_config.md/#parameters), it appears in the bottom-right corner of the range. +- When the handle is used with **default** settings (the `handler` property isn't specified in the `handle` object) and the `BlockSelection` module is used in the `"range"` mode, the behavior of the handle is the following: + - copies the value of the first cell of the selected range (or the entire range if selected) to new cells. For example, selecting **A1** (the value is "x") and dragging to **A3** fills **A2**, **A3** with "x". + - if the range **A1:B1** (the values are "x" and "y", correspondingly) is selected, dragging to **D1** copies "x" to **C1** and "y" to **D1**. - A custom handler can be specified to modify the behavior (e.g., adding suffixes or other rules). -- In the *manual* mode, the handle and `handler` are ignored, and the built-in filling does not work. +- In the `"manual"` mode, the handle and `handler` are ignored, and the built-in filling does not work. ## Interaction with other modules -The `BlockSelection` API interacts with other grid modules depending on the applied mode. +The way of `BlockSelection` API interacting with other grid modules depends on which mode the module is used in: the `"range"` or the `"manual"` mode. #### Range mode @@ -128,7 +155,7 @@ The `BlockSelection` API interacts with other grid modules depending on the appl - The `BlockSelection` module does not use the `RangeSelection` API. The developer implements logic via the events such as [`blockSelectionValidate`](grid/api/blockselection/blockselectionvalidate_event.md), [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). - The handle and built-in filling are unavailable. -### Usage examples +## Usage examples #### Restricting selection in the Range mode @@ -148,11 +175,11 @@ const grid = new dhx.Grid("grid_container", { autoWidth: true, blockSelection: { mode: "range", // setting the "range" mode - handle: { allowAxis: "xy" }, - }, + handle: { allowAxis: "xy" } + } }); -// controlling the block selection start via the event +// Controlling the block selection start via the event grid.block.events.on("blockSelectionValidate", (cell, handle, event) => { if (cell.column.id === "a") { console.log("Selection cannot start from column A"); @@ -160,15 +187,15 @@ grid.block.events.on("blockSelectionValidate", (cell, handle, event) => { } }); -// setting a range via the setRange() method of the Range API +// Setting a range via the `setRange()` method of the Range API grid.range.setRange({ xStart: "b", xEnd: "d", yStart: "4", yEnd: "8" }); ~~~ -**Related sample:** [Grid. BlockSelection in the "range" mode](https://snippet.dhtmlx.com/85pb04cg) +**Related sample:** [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) #### Setting custom logic in the manual mode -This example demonstrates the manual mode, providing full control and allowing the use of events for custom logic, such as styling. +This example demonstrates the `"manual"` mode, providing full control and allowing the use of events for custom logic, such as styling. ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -183,13 +210,13 @@ const grid = new dhx.Grid("grid_container", { data, autoWidth: true, blockSelection: { - mode: "manual", // setting the manual mode + mode: "manual", // Setting the manual mode handle: false }, rangeSelection: true, }); -// using an event for applying custom styling to a range of cells +// Using an event for applying custom styling to a range of cells grid.block.events.on("afterBlockSelectionApply", (startCell, endCell) => { if ( startCell.column.id === endCell.column.id && @@ -216,47 +243,101 @@ grid.block.events.on("afterBlockSelectionApply", (startCell, endCell) => { }); ~~~ -**Related sample:** [Grid. BlockSelection in the "manual" mode](https://snippet.dhtmlx.com/jgjllbc7) - #### Setting a custom handler for the handle This example shows how to override the handle behavior by adding a custom logic, such as modifying values based on the drag direction. ~~~jsx +/* Define grid columns configuration */ +const columns = [ + { id: "productId", header: [{ text: "Product ID" }] }, // Column for the unique product identifier + { id: "productName", header: [{ text: "Product Name" }] }, // Column for the product name + { id: "category", header: [{ text: "Category" }] }, // Column for the product category + { id: "receivedDate", header: [{ text: "Received Date" }], type: "date", dateFormat: "%d.%m.%Y" }, // Date column with the specified format + { id: "stock", header: [{ text: "Stock" }], type: "number" }, // Numeric column for the stock quantity + { id: "price", header: [{ text: "Price" }], type: "number", numberMask: { prefix: "$" } } // Numeric column for the price with the dollar prefix +]; + +/* Initialize DHTMLX Grid with the specified configuration */ const grid = new dhx.Grid("grid_container", { - columns: [ - { id: "a", header: [{ text: "A" }], minWidth: 150 }, - { id: "b", header: [{ text: "B" }], minWidth: 150 }, - { id: "c", header: [{ text: "C" }], minWidth: 150 }, - { id: "d", header: [{ text: "D" }], minWidth: 150 }, - { id: "e", header: [{ text: "E" }], minWidth: 150 }, - { id: "f", header: [{ text: "F" }], minWidth: 150 }, - ], + columns, data, autoWidth: true, + history: true, // Enable history tracking for undo/redo blockSelection: { - mode: "range", handle: { - handler: ({ array, startCell, grid, cell, index }) => { - if (array.length <= 1) { - return; - } - const cellValue = startCell.row[startCell.column.id]?.replace("-copied", ""); - // copied cells will have the "-copied" suffix - const value = cellValue + (index ? "-copied" : ""); - // setting the silent mode for all cells except for the last cell - const silent = index < array.length - 1 - // updating the selected items - grid.data.update(cell.row.id, { - [cell.column.id]: value - }, silent); - } - } + allowAxis: "y", // Allow selection along the y-axis (rows) + handler: blockSelectionHandler, // Custom handler for block selection + }, }, }); + +/* Set initial selection range for the grid */ +grid.range.setRange({ + xStart: "productId", // Start selection at the "productId" column + yEnd: grid.data.getId(0), // End selection at the first row +}); + +/* Initialize objects to store initial values and column indices */ +let initValues = {}; // Store initial values for each column +let columnIndex = {}; // Track index increments for each column + +/* The handler function for block selection events */ +function blockSelectionHandler({ cell, array, index, grid }) { + // Reset tracking objects if this is the first cell in the selection + if (!index) { + initValues = {}; + columnIndex = {}; + } + const columnId = cell.column.id; + // Initialize values for a new column if not already set + if (!initValues[columnId]) { + initValues[columnId] = cell.row[columnId]; // Store the initial cell value + columnIndex[columnId] = 0; // Initialize the index counter + return { prev: initValues[columnId], current: initValues[columnId] }; // Return unchanged values + } + + // Increment column index for the current column + const colIndex = columnIndex[columnId] += 1; + const initValue = initValues[columnId]; // Get the initial value for a column + let prev = current = cell.row[columnId]; // Set the default previous and current values + + // Modify the current value based on the column type + switch (cell.column.type) { + case "number": + current = initValue + colIndex * 10; // Increment the number by 10 per row + break; + case "date": + // Parse ISO date and increment the day by colIndex + const [year, month, day] = initValue.split("-"); + current = new Date(Number(year), Number(month) - 1, Number(day) + colIndex).toISOString(); + break; + default: + current = initValue; // Keep the default value for other types + break; + } + + // Custom formatting for specific columns + if (columnId === "productId") { + // Generate a new product ID with the format P00N + current = `P00${parseInt(initValue.replace(/\D/g, "")) + colIndex}`; + } + if (columnId === "category") { + // Append the index in parentheses to the category + current = `${current} (${colIndex})`; + } + + // Create the history object for undo/redo + const history = { prev, current }; + // Update grid data with the new value + grid.data.update(cell.row.id, { [columnId]: current }, + index < array.length - 1 // Continue updating if it isn't the last cell in selection + ); + return history; // Return the history for tracking +} ~~~ -**Related sample:** [Grid. BlockSelection with handle configuration](https://snippet.dhtmlx.com/8gx20g1d) +**Related sample:** [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/8kttktiy) #### Selection styling @@ -275,19 +356,19 @@ This example demonstrates how to customize the appearance of the selected range ], data, autoWidth: true, - blockSelection: { mode: "range" }, + blockSelection: { mode: "range" } }); ~~~ -**Related sample:** [Grid. BlockSelection area styling](https://snippet.dhtmlx.com/ptc0jfww) \ No newline at end of file +**Related sample:** [Grid. BlockSelection. Stylization of the area](https://snippet.dhtmlx.com/qr5xyqpu) \ No newline at end of file diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md index 42e126cdb..0b880db7f 100644 --- a/docs/grid/usage_clipboard.md +++ b/docs/grid/usage_clipboard.md @@ -35,7 +35,87 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -The `clipboard` property can be set as an *object* to enable the module and define the [modifier functions](#using-formatter-functions) for data processing: `copyModifier`, `cutModifier` and `pasteModifier`. +The `clipboard` property can be set as an *object* to enable the module and define the [modifier functions](#using-formatter-functions) for data processing: `copyModifier`, `cutModifier` and `pasteModifier`. Check the details below. + +## Using events of the Clipboard object + +To make the process of working with clipboard more flexible, you can apply the related events of the `clipboard` object: +[`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), [`pasteError`](grid/api/clipboard/pasteerror_event.md) + +## Interaction with cell selection + +### Automatic activation of BlockSelection module + +When `Clipboard` module is enabled (e.g., via `grid.config.clipboard: true`), the `BlockSelection` module is automatically activated in the `range` mode unless another mode is specified. + +### Usage in other BlockSelection modes + +If the [`BlockSelection`](grid/usage_blockselection.md) module is configured in the `manual` mode, the `Clipboard` module does not automatically receive a range. In this case, you should manually set the range using the [`RangeSelection` API](grid/api/api_overview.md/#rangeselection-api). For this purpose, you need to call `grid.range.setRange({ xStart, xEnd, yStart, yEnd })`. + +:::note +Without a set range, copying and pasting will not work, as **Clipboard API** relies on data from the **RangeSelection API**. +::: + +### Data source for Clipboard + +The **Clipboard API** always uses data from the [`RangeSelection` API](grid/api/api_overview.md/#rangeselection-api) to determine the cells that will be copied or into which data will be pasted. + +:::note +The `cut`/`paste` operations will be blocked in the [*grouping*](grid/usage.md/#grouping-data) mode. +::: + +## Interaction between Grids and external widgets + +The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. + +**Related sample**: [Grid. Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/qll7bcv5) + +### Integration with Google Spreadsheets + +Data from a grid can be copied to the clipboard and pasted directly into Google Spreadsheets. Similarly, data from Google Spreadsheets can be copied and pasted into the grid. Use [`pasteModifier`](#using-formatter-functions) to process data formats (e.g., converting strings to numbers). + +**Related sample**: [Grid. Clipboard. Clipboard operations between Grid and Spreadsheet](https://snippet.dhtmlx.com/mfmvbbda) + +### Pasting from clipboard + +Data from the clipboard is pasted into the range defined by `rangeSelection`. The behavior depends on the size of the selected range and the number of copied elements: + +- **If the range is smaller than the copied elements**: all the copied elements will be pasted if there is enough space in the grid (i.e., the sufficient number of rows and columns exist beyond the range's starting point). For example, if 4 cells (2 rows x 2 columns) are copied and the range is set to 1 row x 2 columns, the data will be fully pasted, expanding the range to 2 rows, if rows are available. + +- **If the range is larger than the copied elements**: the copied elements will repeat cyclically to fill the entire range. For example, if 2 cells ("A1", "A2") are copied and the range contains 4 cells (2 rows x 2 columns), the result will be "A1", "A2", "A1", "A2". + +The repetition of elements follows the order of copying, starting from the first cell. + +### Copying cells depending on the column type + +Below you'll find the details on copying/pasting data depending on the type of a column. + +#### Columns with type "date" + +When copying cells with the column type `type: "date"`, the *formatted* value is copied to the clipboard (not the original string or date object). For example, if the data contains `"2025-04-11"` and the display format is set to `"dd/mm/yyyy"`, the copied value will be `"11/04/2025"`. This behavior simplifies working with dates in tables and other applications. + +When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value is checked for compliance with the column's `dateFormat` (e.g., `"dd/mm/yyyy"`) or whether it can be parsed as a valid `Date` object (e.g., `"2025-04-11"` or `"April 11, 2025"`). If the value is valid, it is converted to the grid's expected format and inserted. If invalid (e.g., `"abc"` or `"31 12 2025"`), the paste operation is ignored, and the cell's current value remains unchanged. + +#### Columns with type "number" + +When copying cells with the column type `type: "number"`, the values are copied to the clipboard as numbers, even if `numberMask` or `patternMask` is applied. For example, if a cell displays `"1,234.56"` due to a mask, the copied value will be `1234.56`. This is done to maintain data purity and compatibility with other systems, such as spreadsheets or data processing software. + +When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value must be a valid number (e.g., `1234.56` or `"1,234.56"` after cleaning). If the value is not a number (e.g., `"abc"`), the paste operation is ignored, and the cell's current value remains unchanged. + +#### Columns with type "string" + +If `patternMask` is applied to a cell (e.g., for formatting phone numbers or currency), the *formatted* value is copied to the clipboard. +For example, if the data contains `"1234567890"` and the mask is `"+# (###) ###-##-##"`, the copied value will be `"+1 (234) 567-89-0"`. This preserves readability for the end user. + +#### Templates + +Templates applied to cell values (e.g., via the `template` property) are not included in the data during copying. This prevents unwanted HTML or formatted text from entering the clipboard, which could disrupt the functionality of external widgets or tables (e.g., Google Spreadsheets). Only the "raw" value from the data is copied. + +#### Columns with editors "combobox", "multiselect", "select" + +If a column has `editorType: "combobox"`, `"multiselect"`, or `"select"`, the value stored in the data (typically an `id` or a key) is copied to the clipboard, not the displayed portion (e.g., the option text). + +For example, if the data contains `{ id: "1", value: "Option 1" }` and the cell displays `"Option 1"`, the copied value will be `"1"`. This ensures data consistency when transferring between systems. ## Using formatter functions @@ -150,81 +230,3 @@ copyModifier: (value, cell, cut) => { **Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) -## Using the events of the Clipboard object - -To make the process of working with clipboard more flexible, you can apply the related events of the `clipboard` object: -[`afterCopy`](grid/api/clipboard/aftercopy_event.md), [`afterPaste`](grid/api/clipboard/afterpaste_event.md), [`beforeCopy`](grid/api/clipboard/beforecopy_event.md), [`beforePaste`](grid/api/clipboard/beforepaste_event.md), [`copyError`](grid/api/clipboard/copyerror_event.md), [`pasteError`](grid/api/clipboard/pasteerror_event.md) - -## Interaction with cell selection - -### Automatic activation of BlockSelection module - -When `Clipboard` module is enabled (e.g., via `grid.config.clipboard: true`), the `BlockSelection` module is automatically activated in the `range` mode unless another mode is specified. - -### Usage in other BlockSelection modes - -If the [`BlockSelection`](grid/usage_blockselection.md) module is configured in the `manual` mode, the `Clipboard` module does not automatically receive a range. In this case, you should manually set the range using the [`RangeSelection` API](grid/api/api_overview.md/#rangeselection-api). For this purpose, you need to call `grid.range.setRange({ xStart, xEnd, yStart, yEnd })`. - -:::note -Without a set range, copying and pasting will not work, as **Clipboard API** relies on data from the **RangeSelection API**. -::: - -### Data source for Clipboard - -The **Clipboard API** always uses data from the **RangeSelection API** to determine the cells that will be copied or into which data will be pasted. - -:::note -The `cut`/`paste` operations will be blocked in the [*grouping*](grid/usage.md/#grouping-data) mode. -::: - -### Pasting from clipboard - -Data from the clipboard is pasted into the range defined by `rangeSelection`. The behavior depends on the size of the selected range and the number of copied elements: - -- **If the range is smaller than the copied elements**: all the copied elements will be pasted if there is enough space in the grid (i.e., the sufficient number of rows and columns exist beyond the range's starting point). For example, if 4 cells (2 rows x 2 columns) are copied and the range is set to 1 row x 2 columns, the data will be fully pasted, expanding the range to 2 rows, if rows are available. - -- **If the range is larger than the copied elements**: the copied elements will repeat cyclically to fill the entire range. For example, if 2 cells ("A1", "A2") are copied and the range contains 4 cells (2 rows x 2 columns), the result will be "A1", "A2", "A1", "A2". - -The repetition of elements follows the order of copying, starting from the first cell. - -## Interaction between Grids and external widgets - -The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. - -**Related sample**: [Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/qll7bcv5) - -Below you'll find the details on copying/pasting data depending on the type of a column. - -### Columns with type "date" - -When copying cells with the column type `type: "date"`, the *formatted* value is copied to the clipboard (not the original string or date object). For example, if the data contains `"2025-04-11"` and the display format is set to `"dd/mm/yyyy"`, the copied value will be `"11/04/2025"`. This behavior simplifies working with dates in tables and other applications. - -When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value is checked for compliance with the column's `dateFormat` (e.g., `"dd/mm/yyyy"`) or whether it can be parsed as a valid `Date` object (e.g., `"2025-04-11"` or `"April 11, 2025"`). If the value is valid, it is converted to the grid's expected format and inserted. If invalid (e.g., `"abc"` or `"31 12 2025"`), the paste operation is ignored, and the cell's current value remains unchanged. - -### Columns with type "number" - -When copying cells with the column type `type: "number"`, the values are copied to the clipboard as numbers, even if `numberMask` or `patternMask` is applied. For example, if a cell displays `"1,234.56"` due to a mask, the copied value will be `1234.56`. This is done to maintain data purity and compatibility with other systems, such as spreadsheets or data processing software. - -When pasting, values are validated after applying [`pasteModifier`](#using-formatter-functions) (if defined). The value must be a valid number (e.g., `1234.56` or `"1,234.56"` after cleaning). If the value is not a number (e.g., `"abc"`), the paste operation is ignored, and the cell's current value remains unchanged. - -### Columns with type "string" - -If `patternMask` is applied to a cell (e.g., for formatting phone numbers or currency), the *formatted* value is copied to the clipboard. -For example, if the data contains `"1234567890"` and the mask is `"+# (###) ###-##-##"`, the copied value will be `"+1 (234) 567-89-0"`. This preserves readability for the end user. - -### Templates - -Templates applied to cell values (e.g., via the `template` property) are not included in the data during copying. This prevents unwanted HTML or formatted text from entering the clipboard, which could disrupt the functionality of external widgets or tables (e.g., Google Spreadsheets). Only the "raw" value from the data is copied. - -### Columns with editors "combobox", "multiselect", "select" - -If a column has `editorType: "combobox"`, `"multiselect"`, or `"select"`, the value stored in the data (typically an `id` or a key) is copied to the clipboard, not the displayed portion (e.g., the option text). - -For example, if the data contains `{ id: "1", value: "Option 1" }` and the cell displays `"Option 1"`, the copied value will be `"1"`. This ensures data consistency when transferring between systems. - -### Integration with Google Spreadsheets - -Data from a grid can be copied to the clipboard and pasted directly into Google Spreadsheets. Similarly, data from Google Spreadsheets can be copied and pasted into the grid. Use [`pasteModifier`](#using-formatter-functions) to process data formats (e.g., converting strings to numbers). - -**Related sample**: [Clipboard. Clipboard operations between Grid and Spreadsheet](https://snippet.dhtmlx.com/mfmvbbda) - diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index cf799e276..8ef532f70 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -12,13 +12,13 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The `DragPanel` module provides auxiliary functionality for moving rows in the **dhx.Grid** component. -![](../assets/grid/drag_panel.png) +![](../assets/grid/dragpanel_module.png) **Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) The module is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. -The module also supports customization through [configuration options](grid/configuration.md/#adjusting-the-dragpanel-module) to adjust its appearance and behavior. +You can also adjust the appearance and behavior of the `DragPanel` module via the [configuration options](grid/configuration.md/#adjusting-the-dragpanel-module). ## Initializing the DragPanel module @@ -44,9 +44,10 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +The `dragPanel` property can also be set as an *object* to enable the module and provide additional configuration options. Learn about configuration possibilities of the drag panel in the [Configuration](grid/configuration.md/#adjusting-the-dragpanel-module) guide. -## Using the events of the DragPanel module +## Using events of the DragPanel module To make the process of working with the drag panel more flexible, you can apply the related events of the `DragPanel` module: diff --git a/docs/grid/usage_history.md b/docs/grid/usage_history.md index 33ffe1e80..4e860b167 100644 --- a/docs/grid/usage_history.md +++ b/docs/grid/usage_history.md @@ -54,12 +54,6 @@ If the module is disabled (via [`disabled: true`](grid/api/grid_history_config.m The `History` module is initialized via the [`history`](grid/api/grid_history_config.md) property in the configuration of the **dhx.Grid** component. After creating the Grid component, the module is accessible through the `grid.history` property. -The `history` property can be set: -- as a *boolean* value it enables or disables the `History` module upon the component initialization -- as an *object* it enables the module and allows setting additional parameters: - - `limit` - the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed - - `disabled` - if `true`, the module is disabled on initialization, and no actions are recorded in the history - ~~~jsx const grid = new dhx.Grid("grid_container", { columns: [ @@ -74,6 +68,9 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +The `history` property can also be set as an *object* to enable the module and provide additional configuration options. +Learn about configuration possibilities of the `History` module in the [Configuration](grid/configuration.md/#history-of-grid-actions) guide. + ## Enabling/disabling History module You can activate the history module via the [`enable()`](grid/api/history/enable_method.md) method of the `history` object. diff --git a/docs/grid/usage_rangeselection.md b/docs/grid/usage_rangeselection.md index f49036c9b..038e8234f 100644 --- a/docs/grid/usage_rangeselection.md +++ b/docs/grid/usage_rangeselection.md @@ -12,15 +12,33 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac You can manage range selection within a grid via the API of the [`RangeSelection`](grid/configuration.md/#managing-range-selection-in-grid) module. It provides methods for setting and resetting a range of cells, getting information about the current range, and checking whether specific cells belong to the selected range. It also supports an [event system](grid/api/api_overview.md/#rangeselection-events) to track changes. +## Initializing the RangeSelection module + To initialize the `RangeSelection` module, use the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration. Once the Grid is created, the module is accessible through the `grid.range` property. +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true // enables the RangeSelection module +}); +~~~ + +The `rangeSelection` property can also be set as an *object* to enable the module and provide additional configuration options. +Learn about configuration possibilities of the `RangeSelection` module in the [Configuration](grid/configuration.md/#managing-range-selection-in-grid) guide. + ## Enabling/disabling RangeSelection module You can activate the range selection module via the [`enable()`](grid/api/rangeselection/enable_method.md) method of the `range` object. - The following example shows how the module is enabled after deactivation on initialization: -~~~jsx +~~~jsx {14} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -38,11 +56,10 @@ grid.range.enable(); // activating the module grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will be set ~~~ -To disable the range selection in Grid, use the [`disable()`](grid/api/rangeselection/disable_method.md) method of the `range` object: - +To disable the range selection in Grid, use the [`disable()`](grid/api/rangeselection/disable_method.md) method of the `range` object. The example below shows disabling of the `range` module: -~~~jsx +~~~jsx {15} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -64,11 +81,9 @@ grid.range.setRange({ xStart: "a", yStart: "1" }); // the range won't be set ## Checking RangeSelection module state -You can check whether the RangeSelection module is disabled, using the [`isDisabled()`](grid/api/rangeselection/isdisabled_method.md) method of the `range` object. It returns `true`, if the module is disabled and `false`, if it is enabled. +You can check whether the RangeSelection module is disabled, using the [`isDisabled()`](grid/api/rangeselection/isdisabled_method.md) method of the `range` object. It returns `true`, if the module is disabled and `false`, if it is enabled. The following example shows checking of the module's activity status: -The following example shows checking of the module's activity status: - -~~~jsx +~~~jsx {15,17} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -110,7 +125,7 @@ If not all coordinates are provided, the missing ones are automatically filled ( The following example shows setting of a range with omitted ending coordinates: -~~~jsx +~~~jsx {14} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -130,7 +145,7 @@ console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", The example below demonstrates merging of a new range with the current one: -~~~jsx +~~~jsx {14,15} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -154,13 +169,15 @@ To make the process of selecting a range more flexible, you can apply the relate - [`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md) - [`beforeSetRange`](grid/api/rangeselection/beforesetrange_event.md) +**Related sample**: [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) + ## Resetting the range selection You can reset the applied range selection using the [`resetRange()`](grid/api/rangeselection/resetrange_method.md) method of the `range` object. The method returns `true` - on success, `false`, if the module is disabled, or if reset is canceled by an event. The following example shows resetting of the current range: -~~~jsx +~~~jsx {15} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -186,11 +203,9 @@ To make the process of unselecting a range more flexible, you can apply the rela ## Getting the range selection -You can get the current selection range. For this, use the [`getRange()`](grid/api/rangeselection/getrange_method.md) method of the `range` object. It returns the object of selection range or `null` if no range is set. - -The following example shows retrieving of the current range: +You can get the current selection range. For this, use the [`getRange()`](grid/api/rangeselection/getrange_method.md) method of the `range` object. It returns the object of selection range or `null` if no range is set. The following example shows retrieving of the current range: -~~~jsx +~~~jsx {15} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -224,7 +239,7 @@ It is also possible to get an array of cells within the range selection by using This example shows retrieving of the range of selected cells: -~~~jsx +~~~jsx {15} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ @@ -258,7 +273,7 @@ The method returns `true`, if the cell is within the current range and `false` i The example below shows checking whether an ID belongs to the selected range of cells: -~~~jsx +~~~jsx {15-17} const grid = new dhx.Grid("grid_container", { // other configuration columns: [ From 5adfe0dcc81e978905dd27af8e50ff7ae68a5deb Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 19 Jun 2025 17:05:02 +0300 Subject: [PATCH 20/47] [update] what's new for v9.2 and docs for new grid modules --- docs/grid/api/grid_blockselection_config.md | 2 +- docs/grid/api/grid_clipboard_config.md | 6 +- docs/grid/api/grid_dragpanel_config.md | 7 +- docs/grid/api/grid_history_config.md | 4 +- docs/grid/api/grid_rangeselection_config.md | 2 +- docs/grid/api/history/add_method.md | 10 +- docs/grid/api/history/afteradd_event.md | 7 +- docs/grid/api/history/afterredo_event.md | 5 +- docs/grid/api/history/afterundo_event.md | 5 +- docs/grid/api/history/beforeadd_event.md | 5 +- docs/grid/api/history/beforeredo_event.md | 3 +- docs/grid/api/history/beforeundo_event.md | 2 +- docs/grid/api/history/canredo_method.md | 2 +- docs/grid/api/history/canundo_method.md | 2 +- docs/grid/api/history/disable_method.md | 2 +- docs/grid/api/history/enable_method.md | 3 +- docs/grid/api/history/error_event.md | 7 +- docs/grid/api/history/gethistory_method.md | 5 +- docs/grid/api/history/isdisabled_method.md | 2 +- docs/grid/api/history/redo_method.md | 2 +- docs/grid/api/history/remove_method.md | 4 +- docs/grid/api/history/removeall_method.md | 4 +- docs/grid/api/history/undo_method.md | 6 +- docs/grid/configuration.md | 16 ++- docs/grid/usage_blockselection.md | 2 +- docs/grid/usage_clipboard.md | 2 +- docs/grid/usage_dragpanel.md | 2 +- docs/grid/usage_history.md | 126 ++++++++++---------- docs/whatsnew.md | 29 ++++- 29 files changed, 146 insertions(+), 128 deletions(-) diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md index 36d09bd46..33b899cf8 100644 --- a/docs/grid/api/grid_blockselection_config.md +++ b/docs/grid/api/grid_blockselection_config.md @@ -10,7 +10,7 @@ description: You can explore the blockSelection config of Grid in the documentat This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -@short: Optional. Enables/disables block selection management within a grid +@short: Optional. Enables/disables the BlockSelection module during the Grid initialization ### Usage diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md index 199653c00..11ddfb0e1 100644 --- a/docs/grid/api/grid_clipboard_config.md +++ b/docs/grid/api/grid_clipboard_config.md @@ -10,7 +10,7 @@ description: You can explore the clipboard config of Grid in the documentation o This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -@short: Optional. Enables/disables the [`Clipboard`](grid/usage_clipboard.md) module within a grid +@short: Optional. Enables/disables the Clipboard module during the Grid initialization :::note The module requires the [`RangeSelection`](grid/usage_rangeselection.md) module to be enabled and is best used in conjunction with the [`BlockSelection`](grid/usage_blockselection.md) module in the `"range"` mode (enabled on initialization of the `Clipboard` module) for convenient range selection via the UI. @@ -74,8 +74,8 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -**Related article:** [Clipboard](grid/configuration.md/#clipboard) - **Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) +**Related article:** [Clipboard](grid/configuration.md/#clipboard) + @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_dragpanel_config.md b/docs/grid/api/grid_dragpanel_config.md index a38be17e5..ea1717ed1 100644 --- a/docs/grid/api/grid_dragpanel_config.md +++ b/docs/grid/api/grid_dragpanel_config.md @@ -10,7 +10,7 @@ description: You can explore the dragPanel config of Grid in the documentation o This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -@short: Optional. Enables/disables the [`dragPanel`](grid/usage_dragpanel.md) module within a grid +@short: Optional. Enables/disables the DragPanel module during the Grid initialization ### Usage @@ -27,7 +27,7 @@ dragPanel?: @default: false :::note -The module is automatically enabled, if the row Drag-and-Drop is active (e.g., `dragItem: "row"` or `dragItem: "both"`), and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. +The module is automatically enabled, if the [row Drag-and-Drop](grid/configuration.md/#drag-n-drop) functionality is active (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties), and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. ::: @example: @@ -85,8 +85,9 @@ const grid = new dhx.Grid("grid_container", { ~~~ +**Related sample:** [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) + **Related article:** [Using the DragPanel module](grid/configuration.md/#using-the-dragpanel-module) -**Related sample:** [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_history_config.md b/docs/grid/api/grid_history_config.md index 7e651dcaf..9040166e8 100644 --- a/docs/grid/api/grid_history_config.md +++ b/docs/grid/api/grid_history_config.md @@ -10,7 +10,7 @@ description: You can explore the history config of Grid in the documentation of This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -@short: Optional. Enables/disables the `History` module during the Grid initialization +@short: Optional. Enables/disables the History module during the Grid initialization ### Usage @@ -66,6 +66,8 @@ const grid = new dhx.Grid("grid_container", { grid.history.enable(); // enabling the module ~~~ +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) + **Related article:** [History of Grid actions](grid/configuration.md/#history-of-grid-actions) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_rangeselection_config.md b/docs/grid/api/grid_rangeselection_config.md index 894849b20..78e2d17e9 100644 --- a/docs/grid/api/grid_rangeselection_config.md +++ b/docs/grid/api/grid_rangeselection_config.md @@ -10,7 +10,7 @@ description: You can explore the rangeSelection config of Grid in the documentat This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -@short: Optional. Enables/disables range selection management within a grid +@short: Optional. Enables/disables the RangeSelection module during the Grid initialization ### Usage diff --git a/docs/grid/api/history/add_method.md b/docs/grid/api/history/add_method.md index a418f5302..f48155bf2 100644 --- a/docs/grid/api/history/add_method.md +++ b/docs/grid/api/history/add_method.md @@ -6,7 +6,7 @@ description: You can explore the add method of Grid history in the documentation # add() -@short: adds a new action to the history +@short: adds a new action into the history of actions within the Grid ### Usage @@ -17,7 +17,6 @@ interface IAction { type: ActionType; batch: IRow[]; inverse?: IAction; - timestamp?: number; } add(action: IAction): void; @@ -29,14 +28,13 @@ add(action: IAction): void; - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) :::note -The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing for a `change` action, the [`error`](grid/api/history/error_event.md) event is triggered. The `timestamp` field is automatically added if not specified. +The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing (for actions with the "change" and "removeAll" types), the [`error`](grid/api/history/error_event.md) event is triggered. ::: @example: -// The example shows adding a new row via `DataCollection` with an explicitly specified timestamp +// The example shows adding a new row via `DataCollection` const grid = new dhx.Grid("grid_container", { columns: [ { id: "name", header: [{ text: "Name" }] }, @@ -52,7 +50,7 @@ const grid = new dhx.Grid("grid_container", { const newItem = { id: "2", name: "New Item", value: 20 }; grid.data.add(newItem); -// recording the action in the history with a timestamp +// recording the action in the history grid.history.add({ type: "add", batch: [{ ...newItem }], diff --git a/docs/grid/api/history/afteradd_event.md b/docs/grid/api/history/afteradd_event.md index 6754c8f8a..d7ce8f9c8 100644 --- a/docs/grid/api/history/afteradd_event.md +++ b/docs/grid/api/history/afteradd_event.md @@ -6,7 +6,7 @@ description: You can explore the afterAdd event of Grid history in the documenta # afterAdd -@short: triggered before adding an action to the history +@short: triggered after successfully adding an action to the history @signature: {'afterAdd: (action: IAction) => void;'} @@ -15,8 +15,7 @@ The callback of the event is called with the following parameters: - `action: IAction` - the object of the added action containing: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) @example: const grid = new dhx.Grid("grid_container", { @@ -36,6 +35,8 @@ grid.history.events.on("afterAdd", (action) => { @descr: +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) + **Related article**: [Adding/removing Grid history actions](grid/usage_history.md/#addingremoving-grid-history-actions) **Related API**: [`add()`](grid/api/history/add_method.md), [`beforeAdd()`](grid/api/history/beforeadd_event.md) diff --git a/docs/grid/api/history/afterredo_event.md b/docs/grid/api/history/afterredo_event.md index 157625300..ba39424aa 100644 --- a/docs/grid/api/history/afterredo_event.md +++ b/docs/grid/api/history/afterredo_event.md @@ -15,8 +15,7 @@ The callback of the event is called with the following parameters: - `action: IAction` - the object of the executed action containing: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) @example: const grid = new dhx.Grid("grid_container", { @@ -36,6 +35,8 @@ grid.history.events.on("afterRedo", (action) => { @descr: +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) + **Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) **Related API**: [`redo()`](grid/api/history/redo_method.md), [`beforeRedo()`](grid/api/history/beforeredo_event.md) diff --git a/docs/grid/api/history/afterundo_event.md b/docs/grid/api/history/afterundo_event.md index a59beb92b..39f5f3330 100644 --- a/docs/grid/api/history/afterundo_event.md +++ b/docs/grid/api/history/afterundo_event.md @@ -15,8 +15,7 @@ The callback of the event is called with the following parameters: - `action: IAction` - the object of the executed action containing: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) @example: const grid = new dhx.Grid("grid_container", { @@ -36,6 +35,8 @@ grid.history.events.on("afterUndo", (action) => { @descr: +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) + **Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) **Related API**: [`undo()`](grid/api/history/undo_method.md), [`beforeUndo()`](grid/api/history/beforeundo_event.md) diff --git a/docs/grid/api/history/beforeadd_event.md b/docs/grid/api/history/beforeadd_event.md index 8e66b0047..b5e18b82d 100644 --- a/docs/grid/api/history/beforeadd_event.md +++ b/docs/grid/api/history/beforeadd_event.md @@ -15,11 +15,10 @@ The callback of the event is called with the following parameters: - `action: IAction` - the action object to be added containing: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) @returns: -Returning `false` cancels the addition. +Returning `false` cancels the operation. @example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/api/history/beforeredo_event.md b/docs/grid/api/history/beforeredo_event.md index ba5011f1f..137eae93e 100644 --- a/docs/grid/api/history/beforeredo_event.md +++ b/docs/grid/api/history/beforeredo_event.md @@ -15,8 +15,7 @@ The callback of the event is called with the following parameters: - `action: IAction` - the action object from the redo stack containing: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) @returns: Returning `false` cancels the operation. diff --git a/docs/grid/api/history/beforeundo_event.md b/docs/grid/api/history/beforeundo_event.md index 1d735db95..a0091cc3a 100644 --- a/docs/grid/api/history/beforeundo_event.md +++ b/docs/grid/api/history/beforeundo_event.md @@ -15,7 +15,7 @@ The callback of the event is called with the following parameters: - `action: IAction` - the action object containing: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) @returns: Returning `false` cancels the operation. diff --git a/docs/grid/api/history/canredo_method.md b/docs/grid/api/history/canredo_method.md index 0d8f00da1..76f0d1062 100644 --- a/docs/grid/api/history/canredo_method.md +++ b/docs/grid/api/history/canredo_method.md @@ -6,7 +6,7 @@ description: You can explore the canRedo method of Grid history in the documenta # canRedo() -@short: checks whether an action can be redone +@short: checks whether an action within the Grid history can be redone @signature: {'canRedo(): boolean;'} diff --git a/docs/grid/api/history/canundo_method.md b/docs/grid/api/history/canundo_method.md index 1aee6df49..71ab9249a 100644 --- a/docs/grid/api/history/canundo_method.md +++ b/docs/grid/api/history/canundo_method.md @@ -6,7 +6,7 @@ description: You can explore the canUndo method of Grid history in the documenta # canUndo() -@short: checks whether an action can be undone +@short: checks whether an action within the Grid history can be undone @signature: {'canUndo(): boolean;'} diff --git a/docs/grid/api/history/disable_method.md b/docs/grid/api/history/disable_method.md index aeddfb9a7..5bab402bd 100644 --- a/docs/grid/api/history/disable_method.md +++ b/docs/grid/api/history/disable_method.md @@ -6,7 +6,7 @@ description: You can explore the disable method of Grid history in the documenta # disable() -@short: disables the module, preventing the addition of new actions to the history and the execution of any operations +@short: disables the module, preventing the addition of new actions to the Grid history and the execution of any operations @signature: {'disable(): void;'} diff --git a/docs/grid/api/history/enable_method.md b/docs/grid/api/history/enable_method.md index e3c70c2e4..62fd93b8e 100644 --- a/docs/grid/api/history/enable_method.md +++ b/docs/grid/api/history/enable_method.md @@ -6,11 +6,12 @@ description: You can explore the enable method of Grid history in the documentat # enable() -@short: enables the module, allowing the addition of new actions to the history +@short: enables the module, allowing the addition of new actions to the Grid history @signature: {'enable(): void;'} @example: +// The example shows how the module is enabled after deactivation on initialization const grid = new dhx.Grid("grid_container", { columns: [ { id: "name", header: [{ text: "Name" }] }, diff --git a/docs/grid/api/history/error_event.md b/docs/grid/api/history/error_event.md index eac9ee56e..630ae68b0 100644 --- a/docs/grid/api/history/error_event.md +++ b/docs/grid/api/history/error_event.md @@ -9,7 +9,7 @@ description: You can explore the error event of Grid history in the documentatio @short: triggered when an error occurs :::note -The event is triggered when an error occurs, such as the module is disabled, the history is empty, the action type is invalid, the inverse action is missing for `undo` +The event is triggered when an error occurs, such as the module is disabled, the history is empty, the action type is invalid, or the inverse action is missing for the `undo` operation. ::: @signature: {'error: (error: string, action: IAction | null) => void;'} @@ -20,9 +20,8 @@ The callback of the event is called with the following parameters: - `action: IAction` - the action object associated with the error, or `null`. The `action` object contains the following properties: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) - + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + @example: const grid = new dhx.Grid("grid_container", { columns: [ diff --git a/docs/grid/api/history/gethistory_method.md b/docs/grid/api/history/gethistory_method.md index 5cfa4aa0d..9b1ca5bc7 100644 --- a/docs/grid/api/history/gethistory_method.md +++ b/docs/grid/api/history/gethistory_method.md @@ -6,7 +6,7 @@ description: You can explore the getHistory method of Grid history in the docume # getHistory() -@short: returns a copy of the array of all actions in the history to prevent accidental modification of the internal structure +@short: returns a copy of the array of all actions in the Grid history to prevent accidental modification of the internal structure @signature: {'getHistory(): IAction[];'} @@ -15,10 +15,9 @@ Returns a copy of the array of all actions in the history. Each `action` object - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - `inverse?: IAction` - the inverse action required for undoing - - `timestamp?: number` - the timestamp of the action in milliseconds @example: -// The example shows retrieving the history with timestamps +// The example shows retrieving the history const grid = new dhx.Grid("grid_container", { columns: [ { id: "name", header: [{ text: "Name" }] }, diff --git a/docs/grid/api/history/isdisabled_method.md b/docs/grid/api/history/isdisabled_method.md index 970d332a2..5a3a3a0e7 100644 --- a/docs/grid/api/history/isdisabled_method.md +++ b/docs/grid/api/history/isdisabled_method.md @@ -6,7 +6,7 @@ description: You can explore the isDisabled method of Grid history in the docume # isDisabled() -@short: checks whether the module is disabled +@short: returns the module's current state @signature: {'isDisabled(): boolean;'} diff --git a/docs/grid/api/history/redo_method.md b/docs/grid/api/history/redo_method.md index 90cdd7b9c..7eaec40bc 100644 --- a/docs/grid/api/history/redo_method.md +++ b/docs/grid/api/history/redo_method.md @@ -6,7 +6,7 @@ description: You can explore the redo method of Grid history in the documentatio # redo() -@short: redoes the last undone action +@short: reapplies the last undone action in the Grid history :::note If the redo stack is empty or the module is disabled, the `error` event is triggered. diff --git a/docs/grid/api/history/remove_method.md b/docs/grid/api/history/remove_method.md index d98e6a438..026c11e2e 100644 --- a/docs/grid/api/history/remove_method.md +++ b/docs/grid/api/history/remove_method.md @@ -6,10 +6,10 @@ description: You can explore the remove method of Grid history in the documentat # remove() -@short: removes the last action from the history +@short: removes the last action from the Grid history :::note -If the history is empty or the module is disabled, the operation is ignored, and an error event is triggered (for a disabled module). +If the history is empty or the module is disabled, the operation is ignored, and the [`error`](grid/api/history/error_event.md) event is triggered (for a disabled module). ::: @signature: {'remove(): void;'} diff --git a/docs/grid/api/history/removeall_method.md b/docs/grid/api/history/removeall_method.md index 160b1f47d..83deb7c82 100644 --- a/docs/grid/api/history/removeall_method.md +++ b/docs/grid/api/history/removeall_method.md @@ -6,10 +6,10 @@ description: You can explore the removeAll method of Grid history in the documen # removeAll() -@short: clears the entire history and the redo stack +@short: clears the entire Grid history and the redo stack :::note -If the module is disabled, the operation is ignored, and the `error` event is triggered. +If the module is disabled, the operation is ignored, and the [`error`](grid/api/history/error_event.md) event is triggered. ::: @signature: {'removeAll(): void;'} diff --git a/docs/grid/api/history/undo_method.md b/docs/grid/api/history/undo_method.md index baf92ba14..6dcc6e594 100644 --- a/docs/grid/api/history/undo_method.md +++ b/docs/grid/api/history/undo_method.md @@ -6,10 +6,12 @@ description: You can explore the undo method of Grid history in the documentatio # undo() -@short: undoes the last action in the history by applying the inverse action (for `change`, `removeAll`) or restoring data (for `add`, `remove`) +@short: undoes the last action in the Grid history + +Depending on the type of the action, the method either applies the inverse action (for the "change" and "removeAll" types) or restores data (for the "add" and "remove" types). :::note -If the history is empty, the module is disabled, or no inverse action is available, the `error` event is triggered. +If the history is empty, the module is disabled, or no inverse action is available (for actions with the "change" and "removeAll" types), the [`error`](grid/api/history/error_event.md) event is triggered. ::: @signature: {'undo(): void;'} diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index fe0f9c917..6ae2b6694 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2193,7 +2193,7 @@ The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n- To initialize the `DragPanel` module, you should enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration together with the [row Drag-and-Drop](#drag-n-drop) functionality (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties). For example: -~~~jsx +~~~jsx {10-11} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -2215,7 +2215,7 @@ The module is also automatically enabled if the [row Drag-and-Drop](#drag-n-drop The following example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: -~~~jsx +~~~jsx {10-11} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -2226,7 +2226,7 @@ const grid = new dhx.Grid("grid_container", { { id: "2", a: "A2", b: "B2" }, ], dragItem: "row", // enables row Drag-and-Drop - blockSelection: true, // triggers DragPanel activation + blockSelection: true // triggers DragPanel activation }); ~~~ @@ -2645,6 +2645,8 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +**Related sample:** [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) + For information on using the Block Selection API, read the [Work with Block Selection module](grid/usage_blockselection.md) guide. ## Clipboard @@ -2686,7 +2688,7 @@ The `clipboard` property can be set in two ways: The example below demonstrates the clipboard configuration with all the modifiers in use: -~~~jsx +~~~jsx {10-15} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -2715,7 +2717,7 @@ For information on working with Clipboard, read the [Work with Clipboard module] This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -DHTMLX Grid provides the functionality for managing the history of actions in the component. +DHTMLX Grid provides the [functionality for managing the history of actions in the component](grid/usage_history.md). To enable the history functionality within a grid, you should use the `History` module. To initialize the module, enable the [`history`](grid/api/grid_history_config.md) property in the Grid configuration. @@ -2741,7 +2743,7 @@ The `history` property can be set in two ways: The example below demonstrates configuring the module with a history limit of 10 actions. The module is disabled on initialization: -~~~jsx +~~~jsx {10-13} const grid = new dhx.Grid("grid_container", { columns: [ { id: "a", header: [{ text: "A" }] }, @@ -2760,6 +2762,8 @@ const grid = new dhx.Grid("grid_container", { grid.history.enable(); // enabling the module ~~~ +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) + For information on working with the History API, read the [Work with History module](grid/usage_history.md) guide. ## Spans diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md index 43398e009..fba6517c3 100644 --- a/docs/grid/usage_blockselection.md +++ b/docs/grid/usage_blockselection.md @@ -16,7 +16,7 @@ You can manage block selection within a grid via the API of the [`BlockSelection ## Initializing the BlockSelection module -To initialize the `BlockSelection` module, use the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the Grid configuration. Once the Grid is created, the module is accessible through the `grid.block` property. +To initialize the `BlockSelection` module, use the [`blockSelection`](grid/api/grid_blockselection_config.md) property in the configuration of the **dhx.Grid** component. Once the Grid is created, the module is accessible through the `grid.block` property. ~~~jsx const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md index 0b880db7f..c6e4d7d4e 100644 --- a/docs/grid/usage_clipboard.md +++ b/docs/grid/usage_clipboard.md @@ -68,7 +68,7 @@ The `cut`/`paste` operations will be blocked in the [*grouping*](grid/usage.md/# The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. -**Related sample**: [Grid. Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/qll7bcv5) +**Related sample**: [Grid. Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/z2i033yq) ### Integration with Google Spreadsheets diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index 8ef532f70..a424d5e7a 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -22,7 +22,7 @@ You can also adjust the appearance and behavior of the `DragPanel` module via th ## Initializing the DragPanel module -The `DragPanel` module is initialized via the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the configuration of the **dhx.Grid** component. The module is also automatically activated if: +To initialize the `DragPanel` module, use the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the configuration of the **dhx.Grid** component. The module is also automatically activated if: - The row Drag-and-Drop is enabled, e.g. via `dragItem: "row"` or `dragItem: "both"` - The [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled diff --git a/docs/grid/usage_history.md b/docs/grid/usage_history.md index 4e860b167..56f610ae3 100644 --- a/docs/grid/usage_history.md +++ b/docs/grid/usage_history.md @@ -10,49 +10,11 @@ description: You can explore how to work with History module of Grid in the docu This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -You can manage the history of actions in the Grid component via the API of the [`History`](grid/configuration.md/#history-of-grid-actions) module. It allows tracking changes made by the user through the user interface, such as editing cells using the editor, clearing cells, or applying modifications via the handle in the `BlockSelection` mode. The module supports the undo (`undo`) and redo (`redo`) operations, as well as allows managing the history stack with the ability to limit its size. - -## Features of the History module - -### User interface interaction - -The `History` module records actions performed through the user interface, including: - -- cells editing: changes made using the cell editor -- cells clearing: clearing the contents of cells using keyboard navigation -- handle modifications: if the handle is used in the [`BlockSelection` mode](grid/configuration.md/#managing-block-selection-in-grid) and the `handler` function returns an object with the `prev` (previous value) and `current` (current value) fields, these changes are added to the history: - -~~~jsx -interface IHandleHistory { - prev: any; // the previous value - current: any; // the current value -} -~~~ - -The actions not related to the UI (e.g., programmatic changes via `grid.data`) are not automatically recorded but can be manually added using the [`add()`](grid/api/history/add_method.md) method. - -### Types of actions - -The module supports the following action types: - -- **add** - adding rows to the table -- **remove** - removing rows from the table -- **removeAll** - clearing all the rows -- **change** - modifying cell values (requires specifying an inverse action, `inverse`). - -For the `change` and `removeAll` actions, an inverse action (`inverse`) is mandatory. Otherwise, adding the action to the history will trigger an error. - -### History stack limitation - -If the `limit` parameter is set in the [configuration of the History module](grid/api/grid_history_config.md), the history is limited to the specified number of actions. When the limit is exceeded, the oldest actions are automatically removed. - -### Disabling the module - -If the module is disabled (via [`disabled: true`](grid/api/grid_history_config.md) in the configuration or the [`disable()`](grid/api/rangeselection/disable_method.md) method), all operations (`add`, `remove`, `removeAll`, `undo`, `redo`) are blocked, and the [`error`](grid/api/history/error_event.md) event is triggered. +You can manage the history of actions in the Grid component via the API of the [`History`](grid/configuration.md/#history-of-grid-actions) module. It allows tracking changes made by the user through the user interface, such as editing cells using the editor, clearing cells, or applying modifications via the handle in the `BlockSelection` mode. The module supports the `undo` and `redo` operations, as well as allows managing the history stack with the ability to limit its size. ## Initializing the History module -The `History` module is initialized via the [`history`](grid/api/grid_history_config.md) property in the configuration of the **dhx.Grid** component. After creating the Grid component, the module is accessible through the `grid.history` property. +To initialize the `History` module, use the [`history`](grid/api/grid_history_config.md) property in the configuration of the **dhx.Grid** component. When the Grid is created, the module is accessible through the `grid.history` property. ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -73,9 +35,7 @@ Learn about configuration possibilities of the `History` module in the [Configur ## Enabling/disabling History module -You can activate the history module via the [`enable()`](grid/api/history/enable_method.md) method of the `history` object. - -The following example shows how the module is enabled after deactivation on initialization: +You can activate the history module via the [`enable()`](grid/api/history/enable_method.md) method of the `history` object. The following example shows how the module is enabled after deactivation on initialization: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -105,9 +65,7 @@ grid.history.add({ console.log(grid.history.getHistory().length); // -> 1 ~~~ -To disable the management of actions history in Grid, use the [`disable()`](grid/api/rangeselection/disable_method.md) method of the `history` object. - -The following example shows disabling of the module after adding an action: +To disable the management of the history of actions in Grid, use the [`disable()`](grid/api/rangeselection/disable_method.md) method of the `history` object. The following example shows disabling of the module after adding an action: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -142,9 +100,7 @@ console.log(grid.history.getHistory().length); // -> 1 (the new action hasn't be ### Checking History module state -You can check whether the `History` module is disabled, using the [`isDisabled()`](grid/api/history/isdisabled_method.md) method of the `history` object. It returns `true`, if the module is disabled and `false`, if it is enabled. - -The following example shows checking the module's state after disabling it: +You can check whether the `History` module is disabled, using the [`isDisabled()`](grid/api/history/isdisabled_method.md) method of the `history` object. It returns `true`, if the module is disabled and `false`, if it is enabled. The following example shows checking the module's state after disabling it: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -167,6 +123,17 @@ console.log(grid.history.isDisabled()); // -> false ## Adding/removing Grid history actions +### Types of actions + +The `History` module supports the following action types within the Grid component: + +- **"add"** - adding rows to the table +- **"remove"** - removing rows from the table +- **"removeAll"** - clearing all the rows +- **"change"** - modifying cell values (requires specifying an inverse action) + +For the "change" and "removeAll" actions, an `inverse` action is mandatory. Otherwise, [adding the action to the history](#adding-a-new-action) will trigger an error. + ### Adding a new action You can add a new action into the history of actions within the grid by using the [`add()`](grid/api/history/add_method.md) method of the `history` object. The method takes the following parameters: @@ -175,13 +142,12 @@ You can add a new action into the history of actions within the grid by using th - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) - - `timestamp?: number` - the timestamp of the action in milliseconds (set automatically, if not provided) :::note -The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing for a `change` action, the [`error`](grid/api/history/error_event.md) event is triggered. The `timestamp` field is automatically added if not specified. +The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing (for actions with the "change" and "removeAll" types), the [`error`](grid/api/history/error_event.md) event is triggered. ::: -The following example shows adding a new row via `DataCollection` with an explicitly specified timestamp: +All the actions performed through the API (e.g., using `grid.data`) can be added to the history using the `add()` method. The following example shows adding a new row via `DataCollection`: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -199,7 +165,7 @@ const grid = new dhx.Grid("grid_container", { const newItem = { id: "2", name: "New Item", value: 20 }; grid.data.add(newItem); -// recording the action in the history with a timestamp +// recording the action in the history grid.history.add({ type: "add", batch: [{ ...newItem }], @@ -210,11 +176,13 @@ const history = grid.history.getHistory(); console.log(history.length); // ->1 ~~~ -To make the process of adding new actions into the Grid history more flexible, you can apply the related events of the `history` object: [`beforeAdd`](grid/api/history/beforeadd_event.md), [`afterAdd`](grid/api/history/afteradd_event.md) +To make the process of adding new actions into the Grid history more flexible, you can apply the related events of the `history` object: +- [`beforeAdd`](grid/api/history/beforeadd_event.md) +- [`afterAdd`](grid/api/history/afteradd_event.md) ### Removing the last action -You can remove the last action from the Grid history using the [`remove()`](grid/api/history/remove_method.md) method of the `history` object. Note that if the history is empty or the module is disabled, the operation is ignored, and the [`error`](grid/api/history/error_event.md) event is triggered (for a disabled module). +You can remove the last action from the Grid history using the [`remove()`](grid/api/history/remove_method.md) method of the `history` object. Note that if the history is empty or the module is disabled, the operation is ignored and the [`error`](grid/api/history/error_event.md) event is triggered (for a disabled module). The following example shows removing the last action from the history after modifying a value: @@ -248,7 +216,7 @@ console.log(grid.history.getHistory().length); // -> 0 ### Removing all the actions -You can remove all the actions from the Grid history using the [`removeAll()`](grid/api/history/removeall_method.md) method of the `history` object. The method clears the entire history and the redo stack. Note that if the module is disabled, the operation is ignored, and the [`error`](grid/api/history/error_event.md) event is triggered. +You can remove all the actions from the Grid history using the [`removeAll()`](grid/api/history/removeall_method.md) method of the `history` object. The method clears the entire history and the redo stack. Note that if the module is disabled, the operation is ignored and the [`error`](grid/api/history/error_event.md) event is triggered. The example below shows clearing the history after adding multiple rows: @@ -286,7 +254,7 @@ console.log(grid.history.canRedo()); // -> false The Grid component allows applying the `undo` operation to the last action in the history via the [`undo()`](grid/api/history/undo_method.md) method of the `history` object. -Depending on the type of the action, the method either applies the inverse action (for the `change` and `removeAll` types) or restores data (for the `add` and `remove` types). Note that if the history is empty, the module is disabled, or no inverse action is available, the [`error`](grid/api/history/error_event.md) event is triggered. +Depending on the [type of the action](#types-of-actions), the method either applies the inverse action (for the "change" and "removeAll" types) or restores data (for the "add" and "remove" types). Note that if the history is empty, the module is disabled, or no inverse action is available (for actions with the "change" and "removeAll" types), the [`error`](grid/api/history/error_event.md) event is triggered. The following example shows undoing the removal of all rows: @@ -320,7 +288,7 @@ console.log(grid.history.canRedo()); // -> true ### Applying the `redo` operation -You can re-apply the last undone action in the Grid history using the [`redo()`](grid/api/history/redo_method.md) method of the `history` object. Note that if the redo stack is empty or the module is disabled, the [`error`](grid/api/history/error_event.md) event is triggered. +You can reapply the last undone action in the Grid history using the [`redo()`](grid/api/history/redo_method.md) method of the `history` object. Note that if the redo stack is empty or the module is disabled, the [`error`](grid/api/history/error_event.md) event is triggered. The example below shows how the undone row addition can be re-applied: @@ -353,7 +321,7 @@ console.log(grid.history.canUndo()); // -> true ### Checking whether an action can be undone -You can check whether an action in the Grid history can be undone using the [`canUndo`](grid/api/history/canundo_method.md) method of the `history` object. The method returns `true` if the history contains actions and the module is not disabled. +You can check whether an action in the Grid history can be undone using the [`canUndo()`](grid/api/history/canundo_method.md) method of the `history` object. The method returns `true` if the history contains actions and the module is not disabled. The following example shows checking whether undo is possible after removing a row: @@ -384,9 +352,9 @@ if (grid.history.canUndo()) { } ~~~ -### Checking whether an action can be re-applied +### Checking whether an action can be reapplied -It is possible to check whether an action in the Grid history can be re-applied using the [`canRedo`](grid/api/history/canredo_method.md) method of the `history` object. The method returns `true` if the redo stack contains actions and the module is not disabled. +It is possible to check whether an action in the Grid history can be reapplied using the [`canRedo()`](grid/api/history/canredo_method.md) method of the `history` object. The method returns `true` if the redo stack contains actions and the module is not disabled. The following example shows checking whether it is possible to redo an undone action: @@ -423,15 +391,14 @@ To make the process of working with the undo/redo operations more flexible, you ## Getting the history of Grid actions -You can get a copy of the array of all actions in the history of Grid actions using the [`getHistory`](grid/api/history/gethistory_method.md) method of the `history` object to prevent accidental modification of the internal structure. +You can get a copy of the array of all actions in the Grid history using the [`getHistory()`](grid/api/history/gethistory_method.md) method of the `history` object to prevent accidental modification of the internal structure. Each `action` object in the returned array may contain the following properties: - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing - - `timestamp?: number` - the timestamp of the action in milliseconds + - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) -The example below shows retrieving the history with timestamps: +The example below shows retrieving the history: ~~~jsx const grid = new dhx.Grid("grid_container", { @@ -459,4 +426,31 @@ grid.history.add({ // retrieving the history const history = grid.history.getHistory(); console.log(history.length); // -> 2 -~~~ \ No newline at end of file +~~~ + +## User interface interaction + +The `History` module records actions performed through the user interface, including: + +- cells editing: changes made using the cell editor +- cells clearing: clearing the contents of cells using keyboard navigation +- handle modifications: if the handle is used in the [`BlockSelection` mode](grid/configuration.md/#managing-block-selection-in-grid) and the `handler` function returns an object with the `prev` (previous value) and `current` (current value) fields, these changes are added to the history: + +~~~jsx +interface IHandleHistory { + prev: any; // the previous value + current: any; // the current value +} +~~~ + +The actions not related to the UI (e.g., programmatic changes via `grid.data`) are not automatically recorded, but can be manually added using the [`add()`](grid/api/history/add_method.md) method. + +## History stack limitation + +If the `limit` parameter is set in the [configuration of the `History` module](grid/api/grid_history_config.md), the history is limited to the specified number of actions. When the limit is exceeded, the oldest actions are automatically removed. + +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) + +## Module disabling + +If the module is disabled (via [`disabled: true`](grid/api/grid_history_config.md) in the module configuration or the [`disable()`](grid/api/rangeselection/disable_method.md) method), all the operations ("add", "remove", "removeAll", "change", undo", "redo") are blocked, and the [`error`](grid/api/history/error_event.md) event is triggered. diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 3b99ec5e0..e838d99e3 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -45,14 +45,31 @@ Released on June X, 2025 ### Fixes - DragManager. Incorrect detection of elements' drop location during drag-n-drop and other (Grid component): - - Solving the problem of incorrectly determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode; - - Solving the problem when moving a line to the header/footer area; - - Solving the problem of determining the position for dropping above the first element; - - Solving the problem associated with the absence or incorrect definition of the drop position for the default mode; - - Fixed the `dragIn` event (the previous reset state was transmitted); - - Optimization of the `dragIn/dragOut` events (removed false positives). + - Solving the problem of incorrectly determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode + - Solving the problem when moving a line to the header/footer area + - Solving the problem of determining the position for dropping above the first element + - Solving the problem associated with the absence or incorrect definition of the drop position for the default mode + - Fixed the `dragIn` event (the previous reset state was transmitted) + - Optimization of the `dragIn/dragOut` events (removed false positives) - Grid. The issue with falsy selection of frozen cells while selecting unfrozen cells - Grid. The issue with dragging unselected items +- Grid. Sorting of the Date string (ISO) values results in the invalid format error +- Grid. The issue with displaying of the TreeMap with groups + +### New samples + +#### Grid + +- [Drag-and-Drop in the TreeGrid mode](https://snippet.dhtmlx.com/0tuk0y5f) +- [BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) +- [BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/8kttktiy) +- [BlockSelection. Stylization of the area](https://snippet.dhtmlx.com/qr5xyqpu) +- [Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) +- [Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/z2i033yq) +- [Clipboard. Clipboard operations between Grid and Spreadsheet](https://snippet.dhtmlx.com/mfmvbbda) +- [DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) +- [History. Configuration](https://snippet.dhtmlx.com/m88562wf) + ## Version 9.1.3 From f9641ab69db4443dc6ac7878ce7f1daf27647372 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 20 Jun 2025 15:39:34 +0300 Subject: [PATCH 21/47] [update] grid export to excel docs --- docs/grid/api/export/grid_xlsx_method.md | 21 ++++++++++++------ docs/grid/usage.md | 27 ++++++++++++++++++------ docs/whatsnew.md | 4 ++-- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/docs/grid/api/export/grid_xlsx_method.md b/docs/grid/api/export/grid_xlsx_method.md index 11190db2b..8031be5e2 100644 --- a/docs/grid/api/export/grid_xlsx_method.md +++ b/docs/grid/api/export/grid_xlsx_method.md @@ -8,13 +8,18 @@ description: You can explore the xlsx export method of Grid in the documentation @short: Exports data from a grid to an Excel file +:::info +DHTMLX Grid uses the WebAssembly-based library [Json2Excel](https://github.com/dhtmlx/json2excel) for export of data to Excel. [Check the details](grid/usage.md/#exporting-data-to-excel). +::: + @signature: {'xlsx(config?: object): void;'} @params: -- `config` - (optional) an object with export settings. You can specify the following settings for export to EXCEL: - - `url?: string` - (optional) the link to the server side where export will be processed. By default, it is **"//export.dhtmlx.com/excel"** +- `config` - (optional) an object with export settings. You can specify the following settings for export to Excel: + - `url?: string` - (optional) the link to the **worker.js** file of the [Json2Excel](https://github.com/dhtmlx/json2excel) library where export will be processed - `name?: string` - (optional) the name of a ready Excel file - + - `tableName?: string` - (optional) the name of a sheet with grid data in the Excel file + - `dateFormatMask?: string` - (optional) the mask used for [dates formatting in Excel](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e) @example: // default export @@ -22,13 +27,15 @@ grid.export.xlsx(); // export with config settings grid.export.xlsx({ - name:"grid_data", - url: "//export.dhtmlx.com/excel" + // a local path to the `worker.js` file of the Json2Excel library + url: "../libs/json2excel/1.3/worker.js?vx", + name: "my_file", + tableName: "grid", + dateFormatMask: "mm.dd.yy" }); - @descr: **Related samples**: [Grid. Export to xlsx and csv](https://snippet.dhtmlx.com/58oqij47) -**Related article:** [Exporting Grid](grid/usage.md) \ No newline at end of file +**Related article:** [Exporting Grid](grid/usage.md/#exporting-data-to-excel) \ No newline at end of file diff --git a/docs/grid/usage.md b/docs/grid/usage.md index f039ee091..8a1bd8268 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -473,22 +473,35 @@ You can easily export data of Grid into the Excel, CSV, PDF, or PNG format. #### Exporting data to Excel -DHTMLX Grid provides the possibility to export data from Grid into an Excel file by calling the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the Export module. The method takes an object with export settings as a parameter. +DHTMLX Grid uses the WebAssembly-based library [Json2Excel](https://github.com/dhtmlx/json2excel) to enable the export to Excel functionality and the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module to export data from Grid into an Excel file. Thus, to have the possibility of exporting files you need to: -~~~js +- install the [Json2Excel](https://github.com/dhtmlx/json2excel) library +- if you need to set a local path to the export module on your computer, specify the `url` option in the configuration object of the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method and set the path to the **worker.js** file like: `"../libs/json2excel/1.3/worker.js?vx"`. If the local path isn't set, the link to the file from CDN will be used +- call the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module with the provided settings (all settings are optional) + +~~~jsx grid.export.xlsx({ - name:"grid_data", - url: "//export.dhtmlx.com/excel" + // a local path to the `worker.js` file of the Json2Excel library + url: "../libs/json2excel/1.3/worker.js?vx", + name: "my_file", // the name of a ready Excel file + tableName: "grid", // the name of a sheet with grid data in the Excel file + dateFormatMask: "mm.dd.yy" // the mask used for dates formatting in Excel }); ~~~ +:::note +You can check the latest version of the Json2Excel library at the [github repository](https://github.com/dhtmlx/json2excel). +::: + +You can read the details on dates formatting in Excel in the [related Excel documentation](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e). + **Related sample**: [Grid. Export to xlsx and csv](https://snippet.dhtmlx.com/58oqij47) #### Exporting data to CSV You can export data from Grid to the CSV format with the [`csv()`](grid/api/export/grid_csv_method.md) method of the Export module. -~~~js +~~~jsx grid.export.csv({ name:"grid_data", // grid data will be exported to a CSV file named "grid_data" rowDelimiter: "\t", // the tab delimiter will be used to separate rows @@ -504,7 +517,7 @@ The `csv()` method returns a CSV string with Grid data. The [`pdf()`](grid/api/export/grid_pdf_method.md) method of the Export module allows you to export data from Grid into a PDF file. The method takes an object with export settings as a parameter. -~~~js +~~~jsx grid.export.pdf({ format: "A4", scale: 0.75, @@ -519,7 +532,7 @@ grid.export.pdf({ The [`png()`](grid/api/export/grid_png_method.md) method of the Export module allows you to export data from Grid into a PNG file. The method takes an object with export settings as a parameter. -~~~js +~~~jsx grid.export.png({ theme: "dark", }); diff --git a/docs/whatsnew.md b/docs/whatsnew.md index e838d99e3..fd8070ad0 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -38,8 +38,8 @@ Released on June X, 2025 ### Updates -- Grid. The logic and appearance of the drag-n-drop functionality is improved -- Grid. Improving the export to Excel module +- Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved +- Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated - Grid. The possibility to clear data while editing a cell by using the `Delete` shortcut key is added ### Fixes From 883aa82aea3a145a46ad47085f3b10013365183f Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 20 Jun 2025 17:41:30 +0300 Subject: [PATCH 22/47] [add] the delete shortcut key description for grid --- docs/grid/configuration.md | 4 ++++ docs/grid/usage_blockselection.md | 33 ++++++++++++++++++++++++++++--- docs/whatsnew.md | 1 - 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 6ae2b6694..a08b3436c 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2444,6 +2444,10 @@ The list of the shortcut keys for editing: Escape close the editor of the selected cell without saving + + Delete + clears the data in the selected cells. Works only with the `BlockSelection` module in the "range" mode + diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md index fba6517c3..4bcd73e56 100644 --- a/docs/grid/usage_blockselection.md +++ b/docs/grid/usage_blockselection.md @@ -119,14 +119,41 @@ The main points of cell selection while using the `BlockSelection` module are gi ### Keyboard navigation -The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: +:::note +Keyboard navigation works in both the `"range"` and `"manual"` modes. In the `"manual"` mode, applying the selection (e.g., after `Enter`) requires handling via the events, such as [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) and [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). +::: + +- The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: - **Arrows** (`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`): moves the focus to the adjacent cell, setting the initially selected cell if no selection is active. - **Shift + Arrows**: extends the selected range from the current initial cell in the direction of the pressed arrow. - **Ctrl + Arrows**: extends the selected range to the last cell in the direction of the pressed arrow. -The **Shift + click** combination is also available. It sets the end cell of the range, extending the selection from the current initial cell. +- The **Shift + click** combination sets the end cell of the range, extending the selection from the current initial cell. -Keyboard navigation works in both the `"range"` and `"manual"` modes. In the `"manual"` mode, applying the selection (e.g., after `Enter`) requires handling via the events, such as [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) and [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). +- The **Delete** shortcut key allows clearing the selected cells when the [`editable` mode](grid/api/grid_editable_config.md) is set for the Grid component and the `BlockSelection` module is used in the `"range"` mode. +It is possible to cancel the cells clearing by using the [`beforeKeyDown`](grid/api/grid_beforekeydown_event.md) event: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "country", header: [{ text: "Country" }] }, + // The data of the cells in the "population" column will not be cleared + { id: "population", header: [{ text: "Population" }], editable: false }, + { id: "yearlyChange", header: [{ text: "Yearly Change" }] }, + ], + blockSelection: { + mode: "range" + }, + editable: true, + // other configuration +}); + +grid.events.on("beforeKeyDown", (event) => { + if (event.key === "Delete") { + return false; // cancel clearing all selected cells + } +}); +~~~ ### Selection handle diff --git a/docs/whatsnew.md b/docs/whatsnew.md index fd8070ad0..5eff025aa 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -54,7 +54,6 @@ Released on June X, 2025 - Grid. The issue with falsy selection of frozen cells while selecting unfrozen cells - Grid. The issue with dragging unselected items - Grid. Sorting of the Date string (ISO) values results in the invalid format error -- Grid. The issue with displaying of the TreeMap with groups ### New samples From c082765031c8325112f817c6bb7926edad6636e4 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 23 Jun 2025 11:37:38 +0300 Subject: [PATCH 23/47] [update] the context menu docs --- docs/menu/creating_context_menu.md | 52 ++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/docs/menu/creating_context_menu.md b/docs/menu/creating_context_menu.md index 7e2714ce9..3db94f181 100644 --- a/docs/menu/creating_context_menu.md +++ b/docs/menu/creating_context_menu.md @@ -16,22 +16,28 @@ dhtmlxContextMenu is a component that provides an easy way to add a contextual m You can initialize dhtmlxContextMenu with the constructor: -~~~js +~~~jsx const cmenu = new dhx.ContextMenu(null, {css: "dhx_widget--bg_gray"}); ~~~ It takes two parameters: -- *container* - optional, set it to *null*, since ContentMenu is created inside a popup -- *config* - optional, a configuration object. You can set the CSS classes to style a context menu here +- `container` - optional, set it to *null*, since ContextMenu is created inside a popup +- `config` - optional, a configuration object. It may contain the following properties: + - `css` - adds style classes to ContextMenu + - `data` - specifies an array of data objects to set into ContextMenu + - `navigationType` - defines the action that opens context menu options: + - "click" - displays the context menu option when a user clicks on it + - "pointer" - displays the context menu option when a user hovers the mouse pointer over it ## Loading menu options -Like with DHTMLX Menu, options can be either parsed from a JSON array: +dhtmlxContextMenu expects loaded data in the JSON format. Here is an example of an appropriate data set: -~~~js -const data = [ - { value: "File", +~~~jsx +const dataset = [ + { + value: "File", items: [ { value: "New File", icon: "dxi dxi-file-outline"}, { value: "Remove File", icon: "dxi dxi-delete"} @@ -40,7 +46,8 @@ const data = [ { type: "separator" }, - { value: "Edit", + { + value: "Edit", items: [ { value: "Undo", icon: "dxi dxi-undo"}, { value: "Redo", icon: "dxi dxi-redo"} @@ -50,19 +57,36 @@ const data = [ type: "spacer" } ]; +~~~ + +A data set consists of objects with configurations of context menu controls. + +Like with [DHTMLX Menu](menu/data_loading.md), options can be: + +- either loaded into the ContextMenu on initialization via the `data` configuration property: + +~~~jsx +const cmenu = new dhx.ContextMenu(null, { + css: "dhx_widget--bg_gray" + data: dataset +}); +~~~ + +- or parsed from a JSON array: -cmenu.data.parse(data); +~~~jsx +cmenu.data.parse(dataset); ~~~ -or loaded from a JSON file: +- or loaded from a JSON file: -~~~js +~~~jsx cmenu.data.load("[path_to_file]/file.json"); ~~~ ## Showing dhtmlxContextMenu -dhtmlxContextMenu is attached to a context zone, and can be shown with the **showAt()** method. It takes two parameters: +dhtmlxContextMenu is attached to a context zone, and can be shown with the `showAt()` method. It takes two parameters: @@ -85,7 +109,7 @@ This is how you can attach dhtmlxContextMenu to an HTML element: ~~~ -~~~js +~~~jsx const cmenu = new dhx.ContextMenu(null, {css: "dhx_widget--bg_gray"}); document.querySelector('#menu').oncontextmenu = function(e) { @@ -100,7 +124,7 @@ document.querySelector('#menu').oncontextmenu = function(e) { This is how you can attach dhtmlxContextMenu to a mouse event: -~~~js +~~~jsx const cmenu = new dhx.ContextMenu(null, {css: "dhx_widget--bg_gray"}); document.querySelector('#menu').oncontextmenu = function(e) { From 0645b4c97aa6a2019e4807d082ab097aacd04de0 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 24 Jun 2025 11:57:46 +0300 Subject: [PATCH 24/47] [update] complete grid docs for v9.2 --- docs/assets/grid/dnd_treegrid_mode.png | Bin 0 -> 65932 bytes docs/grid/api/api_overview.md | 26 +++++------ .../grid/api/blockselection/disable_method.md | 2 +- docs/grid/api/blockselection/enable_method.md | 2 +- .../grid/api/rangeselection/disable_method.md | 2 +- docs/grid/api/rangeselection/enable_method.md | 2 +- .../api/rangeselection/getrange_method.md | 2 +- docs/grid/configuration.md | 6 ++- docs/grid/features.md | 42 ++++++++++-------- docs/whatsnew.md | 4 +- 10 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 docs/assets/grid/dnd_treegrid_mode.png diff --git a/docs/assets/grid/dnd_treegrid_mode.png b/docs/assets/grid/dnd_treegrid_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..379ffbf986dcf74550d52a297677e67e0f748fe3 GIT binary patch literal 65932 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 KOIC@SeEVPPIl - +
Deleteclears the data in the selected cells. Works only with the `BlockSelection` module in the "range" modeclears data in the selected cells. Works only with the `BlockSelection` module in the "range" mode
diff --git a/docs/grid/features.md b/docs/grid/features.md index 7dd5bf9e6..d35e32f0a 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -46,6 +46,17 @@ In this section you can find out how to initialize Grid, how to load data into t ## How to configure Grid +### How to work with TreeGrid mode + +In this section you will find the ways of working with the TreeGrid mode of Grid. + +| Topic | Description | +| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Enabling TreeGrid mode](../treegrid_mode/#initialization) | Learn how to enable the TreeGrid mode of Grid | +| [Configuring TreeGrid mode](../treegrid_mode/#configuration)| Learn how to configure the TreeGrid mode of Grid | +| [Data loading in TreeGrid mode](../treegrid_mode/#data-loading)| Learn how to load data in the TreeGrid mode of Grid | +| [Working with TreeGrid mode](../treegrid_mode/#work-with-grid-in-the-treegrid-mode) | Learn how to expand/collapse nodes | + ### How to configure columns In this section you will get to know how to configure Grid columns on Grid initialization. @@ -124,7 +135,7 @@ In this section you will get to know how to configure the drag-n-drop functional | [Drag-n-drop between grids](../configuration/#drag-n-drop-between-grids) | Learn how to configure drag-n-drop between grids ([Example](https://snippet.dhtmlx.com/qx9a86ax)) | | [Drag-n-drop of multiple rows](grid/configuration.md#drag-n-drop-of-multiple-rows) | Learn how to allow end users to drag-n-drop several rows at once | | [Copying of rows during drag-n-drop](../api/grid_dragcopy_config/) | Learn how to copy a row to a target during drag-n-drop ([Example](https://snippet.dhtmlx.com/23slivyz)) | -| [Using the DragPanel module](../usage_dragpanel/) | Learn how to use the DragPanel module that provides additional functionality for moving rows in the Grid | +| [Using the DragPanel module](../usage_dragpanel/) | Learn how to use the DragPanel module that provides additional functionality for moving rows in the Grid ([Example](https://snippet.dhtmlx.com/oyk02cr6)) | ## How to render custom statistics in the column header/footer and in the spans @@ -291,7 +302,7 @@ In this section you will get to know how to work with the range selection functi | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Configuring range selection](../configuration/#managing-range-selection-in-grid) | Learn how to configure the range selection module within Grid | -| [Working with range selection](../usage_rangeselection/) | Learn how to enable/disable range selection, set/reset range selection, get the range selection object, and check whether a cell is in the range | +| [Working with range selection](../usage_rangeselection/) | Learn how to enable/disable range selection, set/reset range selection, get the range selection object, and check whether a cell is in the range ([Example](https://snippet.dhtmlx.com/42fp5qvt)) | | [Range Selection API](../../category/rangeselection-api/) | Learn how to use the API of the RangeSelection module to manage the range selection within Grid | @@ -301,7 +312,7 @@ In this section you will get to know how to work with the block selection functi | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring block selection](../configuration/#managing-block-selection-in-grid) | Learn how to configure the block selection module within Grid ([Example](https://snippet.dhtmlx.com/8gx20g1d)) | +| [Configuring block selection](../configuration/#managing-block-selection-in-grid) | Learn how to configure the block selection module within Grid ([Example](https://snippet.dhtmlx.com/8kttktiy)) | | [Working with block selection](../usage_blockselection/) | Learn how to enable/disable block selection in Grid, check the main features of the BlockSelection module and explore how it interacts with other modules | | [BlockSelection API](../../category/blockselection-api/) | Learn how to use API of the BlockSelection module to manage the block selection within Grid | @@ -311,7 +322,7 @@ In this section you will get to know how to work with the clipboard functionalit | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring clipboard](../configuration/#clipboard) | Learn how to configure the Clipboard module within Grid | +| [Configuring clipboard](../configuration/#clipboard) | Learn how to configure the Clipboard module within Grid ([Example](https://snippet.dhtmlx.com/1fnkhwm0)) | | [Working with clipboard](../usage_clipboard/) | Learn how to enable the clipboard in Grid, check the main features and explore the peculiarities of using the Clipboard module | | [Clipboard API](../../category/clipboard-events/) | Learn how to use API of the Clipboard module to manage the clipboard operations within Grid | @@ -321,23 +332,11 @@ In this section you will get to know how to work with the history of Grid action | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring history of Grid actions](../configuration/#history-of-grid-actions) | Learn how to configure the History module within Grid | +| [Configuring history of Grid actions](../configuration/#history-of-grid-actions) | Learn how to configure the History module within Grid ([Example](https://snippet.dhtmlx.com/m88562wf)) | | [Working with history of actions](../usage_history/) | Learn how to enable the history of actions in Grid, check the main features and explore the peculiarities of using the History module | | [History API](../../category/history-api/) | Learn how to use API of the History module to manage the history of operations within Grid | -## How to work with TreeGrid mode - -In this section you will find the ways of working with the TreeGrid mode of Grid. - -| Topic | Description | -| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Enabling TreeGrid mode](../treegrid_mode/#initialization) | Learn how to enable the TreeGrid mode of Grid | -| [Configuring TreeGrid mode](../treegrid_mode/#configuration)| Learn how to configure the TreeGrid mode of Grid | -| [Data loading in TreeGrid mode](../treegrid_mode/#data-loading)| Learn how to load data in the TreeGrid mode of Grid | -| [Working with TreeGrid mode](../treegrid_mode/#work-with-grid-in-the-treegrid-mode) | Learn how to expand/collapse nodes | - - ## How to scroll Grid In this section you will learn how to scroll Grid to the necessary position. @@ -384,7 +383,14 @@ In this section you can find out corresponding references of Grid API. | [Grid properties](../api/api_overview/#grid-properties) | Check the list of Grid properties | | [Grid column properties](../api/api_gridcolumn_properties/) | Check the list of properties of a Grid column | | [DataCollection API](../../data_collection/) | Check the API of DataCollection to work with Grid data | -| [Selection API](../../category/selection-api/) | Check the API of Selection to manage the selection of Grid cells | +| [TreeCollection API](../../tree_collection/) | Check the API of TreeCollection to work with Grid data in the TreeGrid mode | +| [Selection API](../../category/selection-api/) | Check the API of the Selection object to manage the selection of Grid cells | +| [RangeSelection API](../../category/rangeselection-api/) | Check the API of the RangeSelection module to manage the range selection in Grid | +| [BlockSelection API](../../category/blockselection-api/) | Check the API of the BlockSelection module to manage the block selection in Grid | +| [Clipboard API](../../category/clipboard-events/) | Check the API of the Clipboard module to work with clipboard in Grid | +| [DragPanel API](../../category/dragpanel-events/) | Check the API of the DragPanel module to work with drag panel within Grid | +| [History API](../../category/history-api/) | Check the API of the History module to work with the history of Grid actions | +| [Export API](../../category/export-methods-1/) | Check the API of the Export module to export Grid data | ## Common functionality diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 5eff025aa..99174ebf7 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -38,9 +38,9 @@ Released on June X, 2025 ### Updates -- Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved +- Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved. Check the [related sample](https://snippet.dhtmlx.com/0tuk0y5f) - Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated -- Grid. The possibility to clear data while editing a cell by using the `Delete` shortcut key is added +- Grid. The possibility to [clear data in selected cells by using the `Delete` shortcut key](grid/configuration.md/#shortcut-keys-for-editing) is added ### Fixes From 36eb5b5e5e48c85f483c73f14da4f68ff91c345a Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 24 Jun 2025 12:17:00 +0300 Subject: [PATCH 25/47] [update] what's new for v9.2 --- docs/whatsnew.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 0843968f1..64ed388d2 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -44,13 +44,12 @@ Released on June X, 2025 ### Fixes -- DragManager. Incorrect detection of elements' drop location during drag-n-drop and other (Grid component): - - Solving the problem of incorrectly determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode - - Solving the problem when moving a line to the header/footer area - - Solving the problem of determining the position for dropping above the first element - - Solving the problem associated with the absence or incorrect definition of the drop position for the default mode - - Fixed the `dragIn` event (the previous reset state was transmitted) - - Optimization of the `dragIn/dragOut` events (removed false positives) +- DragManager. Solving the problem of incorrectly determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode +- DragManager. Solving the problem when moving a line to the header/footer area +- DragManager. Solving the problem of determining the position for dropping above the first element +- DragManager. Solving the problem associated with the absence or incorrect definition of the drop position for the default mode +- DragManager. Fixed the `dragIn` event (the previous reset state was transmitted) +- DragManager. Optimization of the `dragIn/dragOut` events (removed false positives) - Grid. The issue with falsy selection of frozen cells while selecting unfrozen cells - Grid. The issue with dragging unselected items - Grid. Sorting of the Date string (ISO) values results in the invalid format error From 54bcb2fc613ba0b138f1defaea264011676240ca Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 24 Jun 2025 14:57:40 +0300 Subject: [PATCH 26/47] [update] docs for grid range selection module --- .../rangeselection/afterresetrange_event.md | 13 +++-- .../api/rangeselection/aftersetrange_event.md | 13 +++-- .../rangeselection/beforeresetrange_event.md | 13 +++-- .../rangeselection/beforesetrange_event.md | 13 +++-- .../api/rangeselection/getrange_method.md | 24 +++++++-- .../rangeselection/getrangedcells_method.md | 14 +++++- .../api/rangeselection/isranged_method.md | 11 +++-- docs/grid/usage_rangeselection.md | 49 +++++++++++++++---- 8 files changed, 112 insertions(+), 38 deletions(-) diff --git a/docs/grid/api/rangeselection/afterresetrange_event.md b/docs/grid/api/rangeselection/afterresetrange_event.md index d888e7564..437d57559 100644 --- a/docs/grid/api/rangeselection/afterresetrange_event.md +++ b/docs/grid/api/rangeselection/afterresetrange_event.md @@ -24,11 +24,14 @@ afterResetRange: ( @params: The callback of the event is called with the following parameters: -- `range: object` - the object of the reset range: - - `xStart?: string | number` - the starting column id - - `xEnd?: string | number` - the ending column id - - `yStart?: string | number` - the starting row id - - `yEnd?: string | number` - the ending row id + + + + + + + +
range(object) the object with the reset range coordinates that contains the following options:
  • `xStart` - (string | number) the starting column id
  • `xEnd` - (string | number) the ending column id
  • `yStart` - (string | number) the starting row id
  • `yEnd` - (string | number) the ending row id
@example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/api/rangeselection/aftersetrange_event.md b/docs/grid/api/rangeselection/aftersetrange_event.md index 29951bfe6..6ace68e22 100644 --- a/docs/grid/api/rangeselection/aftersetrange_event.md +++ b/docs/grid/api/rangeselection/aftersetrange_event.md @@ -24,11 +24,14 @@ afterSetRange: ( @params: The callback of the event is called with the following parameters: -- `range: object` - the object of the set range: - - `xStart?: string | number` - the starting column id - - `xEnd?: string | number` - the ending column id - - `yStart?: string | number` - the starting row id - - `yEnd?: string | number` - the ending row id + + + + + + + +
range(object) the object with the set range coordinates that contains the following options:
  • `xStart` - (string | number) the starting column id
  • `xEnd` - (string | number) the ending column id
  • `yStart` - (string | number) the starting row id
  • `yEnd` - (string | number) the ending row id
@example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/api/rangeselection/beforeresetrange_event.md b/docs/grid/api/rangeselection/beforeresetrange_event.md index 58abd27d6..4d848166c 100644 --- a/docs/grid/api/rangeselection/beforeresetrange_event.md +++ b/docs/grid/api/rangeselection/beforeresetrange_event.md @@ -24,11 +24,14 @@ beforeResetRange: ( @params: The callback of the event is called with the following parameters: -- `range: object` - the range object: - - `xStart?: string | number` - the starting column id - - `xEnd?: string | number` - the ending column id - - `yStart?: string | number` - the starting row id - - `yEnd?: string | number` - the ending row id + + + + + + + +
range(object) an object with the range coordinates that contains the following options:
  • `xStart` - (string | number) the starting column id
  • `xEnd` - (string | number) the ending column id
  • `yStart` - (string | number) the starting row id
  • `yEnd` - (string | number) the ending row id
@returns: Return `false` to prevent resetting of the range; otherwise, `true`. diff --git a/docs/grid/api/rangeselection/beforesetrange_event.md b/docs/grid/api/rangeselection/beforesetrange_event.md index 5e3322bc2..3cfa2e65e 100644 --- a/docs/grid/api/rangeselection/beforesetrange_event.md +++ b/docs/grid/api/rangeselection/beforesetrange_event.md @@ -24,11 +24,14 @@ beforeSetRange: ( @params: The callback of the event is called with the following parameters: -- `range: object` - the range object: - - `xStart?: string | number` - the starting column id - - `xEnd?: string | number` - the ending column id - - `yStart?: string | number` - the starting row id - - `yEnd?: string | number` - the ending row id + + + + + + + +
range(object) an object with the range coordinates that contains the following options:
  • `xStart` - (string | number) the starting column id
  • `xEnd` - (string | number) the ending column id
  • `yStart` - (string | number) the starting row id
  • `yEnd` - (string | number) the ending row id
@returns: Return `false` to prevent setting a range; otherwise, `true`. diff --git a/docs/grid/api/rangeselection/getrange_method.md b/docs/grid/api/rangeselection/getrange_method.md index ac09dfaa3..d4d0c2fc9 100644 --- a/docs/grid/api/rangeselection/getrange_method.md +++ b/docs/grid/api/rangeselection/getrange_method.md @@ -23,10 +23,26 @@ getRange(): @returns: - an object with the current selection range, where: - - `xStart?: string | number` - the starting column id - - `xEnd?: string | number` - the ending column id - - `yStart?: string | number` - the starting row id - - `yEnd?: string | number` - the ending row id + + + + + + + + + + + + + + + + + + + +
xStart(string | number) the starting column id
xEnd(string | number) the ending column id
yStart(string | number) the starting row id
yEnd(string | number) the ending row id
- `null` if no range is set @example: diff --git a/docs/grid/api/rangeselection/getrangedcells_method.md b/docs/grid/api/rangeselection/getrangedcells_method.md index 50db4042f..3475b5c9a 100644 --- a/docs/grid/api/rangeselection/getrangedcells_method.md +++ b/docs/grid/api/rangeselection/getrangedcells_method.md @@ -16,8 +16,18 @@ getRangedCells(): { row: object; column: object; }[]; @returns: - an array of objects where: - - `row: object` - the row object - - `column: object` - the column object + + + + + + + + + + + +
row(object) the row object
column(object) the column object
@example: // this example shows retrieving of the range of selected cells diff --git a/docs/grid/api/rangeselection/isranged_method.md b/docs/grid/api/rangeselection/isranged_method.md index c5f14c9a8..27cf88eb1 100644 --- a/docs/grid/api/rangeselection/isranged_method.md +++ b/docs/grid/api/rangeselection/isranged_method.md @@ -15,9 +15,14 @@ isRanged(cell: { x: string | number; y: string | number }): boolean; ~~~ @params: -- `cell: object` - an object with the `x` and `y` coordinates of a cell, where: - - `x: string | number` - the column id - - `y: string | number` - the row id + + + + + + + +
cell(object) - an object with the `x` and `y` coordinates of a cell, where:
  • `x` - (*string | number*) - the column id
  • `y` - (*string | number*) - the row id
:::note You can specify just `x` or `y` to check a column or a row, correspondingly. diff --git a/docs/grid/usage_rangeselection.md b/docs/grid/usage_rangeselection.md index 038e8234f..5e8024db0 100644 --- a/docs/grid/usage_rangeselection.md +++ b/docs/grid/usage_rangeselection.md @@ -225,17 +225,43 @@ console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", The returned object with the current selection range contains the following properties: -- `xStart` - (*string | number*) the starting column id -- `xEnd` - (*string | number*) the ending column id -- `yStart` - (*string | number*) the starting row id -- `yEnd` - (*string | number*) the ending row id + + + + + + + + + + + + + + + + + + + +
xStart(string | number) the starting column id
xEnd(string | number) the ending column id
yStart(string | number) the starting row id
yEnd(string | number) the ending row id
### Getting an array of cells within the range It is also possible to get an array of cells within the range selection by using the [`getRangedCells()`](grid/api/rangeselection/getrangedcells_method.md) method of the `range` object. It returns an array of objects where: -- `row` - (*object*) the row object -- `column` - (*object*) the column object + + + + + + + + + + + +
row(object) the row object
column(object) the column object
This example shows retrieving of the range of selected cells: @@ -261,9 +287,14 @@ console.log(grid.range.getRangedCells()); // -> [{ row: { id: "1", ... }, column You can check whether a cell is within the current range using the [`isRanged()`](grid/api/rangeselection/isranged_method.md) method of the `range` object. The method takes the following parameter: -- `cell` - (*object*) - an object with the `x` and `y` coordinates of a cell, where: - - `x` - (*string | number*) - the column id - - `y` - (*string | number*) - the row id + + + + + + + +
cell(object) - an object with the `x` and `y` coordinates of a cell, where:
  • `x` - (*string | number*) - the column id
  • `y` - (*string | number*) - the row id
:::note You can specify just `x` or `y` to check a column or a row, correspondingly. From 8cf46e9b66b117b7fe34e296b26cd6c19cdb4672 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 24 Jun 2025 16:26:38 +0300 Subject: [PATCH 27/47] [update] grid blockselection module events' pages --- .../afterblockhandleapply_event.md | 30 +++++++++++----- .../afterblockselectionapply_event.md | 29 ++++++++++----- .../afterblockselectionmove_event.md | 35 ++++++++++++------ .../beforeblockhandleapply_event.md | 32 +++++++++++------ .../beforeblockselectionapply_event.md | 28 ++++++++++----- .../beforeblockselectionmove_event.md | 36 +++++++++++++------ .../blockhandlemousedown_event.md | 2 +- .../blockselection/blockselectionend_event.md | 28 ++++++++++----- .../blockselectionstart_event.md | 28 ++++++++++----- .../blockselectionvalidate_event.md | 21 ++++++++--- 10 files changed, 189 insertions(+), 80 deletions(-) diff --git a/docs/grid/api/blockselection/afterblockhandleapply_event.md b/docs/grid/api/blockselection/afterblockhandleapply_event.md index a9955fe5e..aacccde54 100644 --- a/docs/grid/api/blockselection/afterblockhandleapply_event.md +++ b/docs/grid/api/blockselection/afterblockhandleapply_event.md @@ -22,17 +22,29 @@ afterBlockHandleApply: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `endCell` - an object that contains the end cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `dragDirection` - determines the direction of movement of the focused cell -- `event` - the browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
endCell(object) an object that contains the end cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
dragDirection(string) determines the direction of movement of the focused cell: `"up"` | `"down"` | `"left"` | `"right"` | `null`
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@example: -grid.block.events.on("afterBlockHandleApply", (startCell, endCell, dragDirection) => { +grid.block.events.on("afterBlockHandleApply", (startCell, endCell, dir) => { console.log("Handle applied:"); }); diff --git a/docs/grid/api/blockselection/afterblockselectionapply_event.md b/docs/grid/api/blockselection/afterblockselectionapply_event.md index 6ffb16ff4..936eaa5f6 100644 --- a/docs/grid/api/blockselection/afterblockselectionapply_event.md +++ b/docs/grid/api/blockselection/afterblockselectionapply_event.md @@ -22,15 +22,26 @@ afterBlockSelectionApply: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `endCell` - an object that contains the end cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `handle` - indicates whether the handle was used (`true`) or a regular selection (`false`) -- `event` - the browser event: `MouseEvent` or `TouchEvent` - + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
endCell(object) an object that contains the end cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
handle(boolean) indicates whether the handle was used (`true`) or a regular selection (`false`)
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@example: grid.block.events.on("afterBlockSelectionApply", (startCell, endCell) => { diff --git a/docs/grid/api/blockselection/afterblockselectionmove_event.md b/docs/grid/api/blockselection/afterblockselectionmove_event.md index dc9c61a44..496620d5e 100644 --- a/docs/grid/api/blockselection/afterblockselectionmove_event.md +++ b/docs/grid/api/blockselection/afterblockselectionmove_event.md @@ -23,17 +23,30 @@ afterBlockSelectionMove: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `endCell` - an object that contains the current end cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `focusCell` - an object that contains the focus cell (if the handle is used) or `null`, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `dragDirection` - determines the direction of movement of the focused cell -- `event` - the browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
endCell(object) an object that contains the current end cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
focusCell(object) an object that contains the focus cell (if the handle is used) or `null`, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
dragDirection(string) determines the direction of movement of the focused cell: `"up"` | `"down"` | `"left"` | `"right"` | `null`
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@example: grid.block.events.on("afterBlockSelectionMove", (startCell, endCell) => { diff --git a/docs/grid/api/blockselection/beforeblockhandleapply_event.md b/docs/grid/api/blockselection/beforeblockhandleapply_event.md index 579b82598..bfee497ad 100644 --- a/docs/grid/api/blockselection/beforeblockhandleapply_event.md +++ b/docs/grid/api/blockselection/beforeblockhandleapply_event.md @@ -22,21 +22,33 @@ beforeBlockHandleApply: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `endCell` - an object that contains the end cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `dragDirection` - determines the direction of movement of the focused cell -- `event` - the browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
endCell(object) an object that contains the end cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
dragDirection(string) determines the direction of movement of the focused cell: `"up"` | `"down"` | `"left"` | `"right"` | `null`
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@returns: Return `false` to cancel the action; otherwise, `true`. @example: -grid.block.events.on("beforeBlockHandleApply", (startCell, endCell, dragDirection) => { - if (dragDirection === "right" | dragDirection === "left") { +grid.block.events.on("beforeBlockHandleApply", (startCell, endCell, dir) => { + if (dir === "right" | dir === "left") { console.log("Horizontal change canceled"); return false; } diff --git a/docs/grid/api/blockselection/beforeblockselectionapply_event.md b/docs/grid/api/blockselection/beforeblockselectionapply_event.md index 693b66b01..58ab37d49 100644 --- a/docs/grid/api/blockselection/beforeblockselectionapply_event.md +++ b/docs/grid/api/blockselection/beforeblockselectionapply_event.md @@ -22,14 +22,26 @@ beforeBlockSelectionApply: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `endCell` - an object that contains the end cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `handle` - indicates whether the handle was used (`true`) or a regular selection (`false`) -- `event` - the browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
endCell(object) an object that contains the end cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
handle(boolean) indicates whether the handle was used (`true`) or a regular selection (`false`)
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@returns: Return `false` to cancel the action; otherwise, `true`. diff --git a/docs/grid/api/blockselection/beforeblockselectionmove_event.md b/docs/grid/api/blockselection/beforeblockselectionmove_event.md index 12ac60234..71b664e3f 100644 --- a/docs/grid/api/blockselection/beforeblockselectionmove_event.md +++ b/docs/grid/api/blockselection/beforeblockselectionmove_event.md @@ -23,17 +23,31 @@ beforeBlockSelectionMove: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `nextCell` - an object that contains the next cell to which the boundary is moving or the end cell of the previously selected boundary during the handle movement, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `focusCell` - an object that contains the last focus cell (if the handle is used) or `null`. The cell object includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `dragDirection` - determines the direction of movement of the focused cell -- `event` - the browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
nextCell(object) an object that contains the next cell to which the boundary is moving or the end cell of the previously selected boundary during the handle movement, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
focusCell(object) an object that contains the last focus cell (if the handle is used) or `null`, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
dragDirection(string) determines the direction of movement of the focused cell: `"up"` | `"down"` | `"left"` | `"right"` | `null`
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@returns: Return `false` to cancel the action; otherwise, `true`. diff --git a/docs/grid/api/blockselection/blockhandlemousedown_event.md b/docs/grid/api/blockselection/blockhandlemousedown_event.md index 2981c6bf5..3ec5790a6 100644 --- a/docs/grid/api/blockselection/blockhandlemousedown_event.md +++ b/docs/grid/api/blockselection/blockhandlemousedown_event.md @@ -15,7 +15,7 @@ blockHandleMouseDown: (event: MouseEvent | TouchEvent) => void; ~~~ @params: -The callback of the event is called with the following parameters: +The callback of the event is called with the following parameter: - `event` - the browser event: `MouseEvent` or `TouchEvent` diff --git a/docs/grid/api/blockselection/blockselectionend_event.md b/docs/grid/api/blockselection/blockselectionend_event.md index 9cfe19238..ebc9b167f 100644 --- a/docs/grid/api/blockselection/blockselectionend_event.md +++ b/docs/grid/api/blockselection/blockselectionend_event.md @@ -22,14 +22,26 @@ blockSelectionEnd: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `endCell` - an object that contains the end cell at the time of selection completion, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `handle` - indicates whether the handle was used (`true`) or a regular selection (`false`) -- `event` - the browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
endCell(object) an object that contains the end cell at the time of selection completion, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
handle(boolean) indicates whether the handle was used (`true`) or a regular selection (`false`)
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@example: grid.block.events.on("blockSelectionEnd", (startCell, endCell) => { diff --git a/docs/grid/api/blockselection/blockselectionstart_event.md b/docs/grid/api/blockselection/blockselectionstart_event.md index e974e4d1e..c85d247cf 100644 --- a/docs/grid/api/blockselection/blockselectionstart_event.md +++ b/docs/grid/api/blockselection/blockselectionstart_event.md @@ -22,14 +22,26 @@ blockSelectionStart: ( @params: The callback of the event is called with the following parameters: -- `startCell` - an object that contains the initial cell of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `endCell` - an object that contains the end cell at the start of the selection, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `handle` - indicates whether the handle is used (`true`) or a regular selection (`false`) -- `event` - a browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + + + + + +
startCell(object) an object that contains the initial cell of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
endCell(object) an object that contains the end cell at the start of the selection, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
handle(boolean) indicates whether the handle is used (`true`) or a regular selection (`false`)
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@returns: Return `false` to cancel the action; otherwise, `true`. diff --git a/docs/grid/api/blockselection/blockselectionvalidate_event.md b/docs/grid/api/blockselection/blockselectionvalidate_event.md index 12f0695f6..0d5210e66 100644 --- a/docs/grid/api/blockselection/blockselectionvalidate_event.md +++ b/docs/grid/api/blockselection/blockselectionvalidate_event.md @@ -21,11 +21,22 @@ blockSelectionValidate: ( @params: The callback of the event is called with the following parameters: -- `validateCell` - an object that contains the cell where the selection starts, includes the following properties: - - `row` - the row configuration object - - `column`- the column configuration object -- `handle` - indicates whether the handle is used (`true`) or a regular selection (`false`) -- `event` - the browser event: `MouseEvent` or `TouchEvent` + + + + + + + + + + + + + + + +
validateCell(object) an object that contains the cell where the selection starts, includes the following properties:
  • `row` - (object) the row configuration object
  • `column` - (object) the column configuration object
handle(boolean) indicates whether the handle is used (`true`) or a regular selection (`false`)
event(Event) the browser event: `MouseEvent` or `TouchEvent`
@returns: Return `false` to cancel the action; otherwise, `true`. From 4a6de11ae110b7de0d14c2edd5301a898b7f01c5 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 24 Jun 2025 16:45:50 +0300 Subject: [PATCH 28/47] [update] grid clipboard module guide --- docs/grid/usage_clipboard.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md index c6e4d7d4e..20a04b108 100644 --- a/docs/grid/usage_clipboard.md +++ b/docs/grid/usage_clipboard.md @@ -86,7 +86,7 @@ Data from the clipboard is pasted into the range defined by `rangeSelection`. Th The repetition of elements follows the order of copying, starting from the first cell. -### Copying cells depending on the column type +### Copying/pasting cells depending on the column type Below you'll find the details on copying/pasting data depending on the type of a column. @@ -163,7 +163,7 @@ These functions provide flexible control over how data is processed before copyi ### Examples -**Numbers with a mask** +**Copying numbers with a mask** This example demonstrates how to copy numbers while preserving the mask (e.g., `"1,234.56"` instead of `1234.56`). @@ -178,7 +178,7 @@ copyModifier: (value, cell, cut) => { } ~~~ -**Combobox with displayed text** +**Copying the displayed text of the Combobox option** This example shows how to copy the combobox option text (`"Option 1"`) instead of the `id` (`"1"`). @@ -193,7 +193,7 @@ copyModifier: (value, cell, cut) => { } ~~~ -**Dates with validation** +**Pasting dates with validation** This example demonstrates how to transform a date from `"11/04/2025"` to `"2025-04-11"` during pasting and ensure it is valid. @@ -215,7 +215,7 @@ pasteModifier: (value, cell) => { } ~~~ -**PatternMask during copying** +**Removing `patternMask` during copying** This example shows how to remove mask formatting (e.g., copy `"1234567890"` instead of `"+1 (234) 567-89-0"`). From 5b2778c5708d262f8dc72210d0fbe1fb9d390821 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 24 Jun 2025 17:16:52 +0300 Subject: [PATCH 29/47] [update] grid configuration and features guides --- docs/grid/configuration.md | 4 ++-- docs/grid/features.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 64a9eeea6..6d7f70d5b 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2509,7 +2509,7 @@ const grid = new dhx.Grid("grid_container", { Since the `multiselection` configuration option is set to *true*, using the "Ctrl + Click" combination allows selecting the desired cells or rows. A range of Grid cells/rows can be selected by clicking the first element to select and then, while holding down the Shift key, clicking the last element to select. -### Managing range selection in Grid +## Managing range selection in Grid :::tip Pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. @@ -2561,7 +2561,7 @@ grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set For information on using the Range Selection API, read the [Work with RangeSelection module](grid/usage_rangeselection.md) guide. -### Managing block selection in Grid +## Managing block selection in Grid :::tip Pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. diff --git a/docs/grid/features.md b/docs/grid/features.md index d35e32f0a..22049ec12 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -295,7 +295,7 @@ In this section you will find the ways of working with selection functionality. | [Selection API](../../category/selection-api/) | Learn how to use the API of Selection to manage the selection of Grid cells | | [Keyboard navigation](../configuration/#arrow-shortcut-keys) | Learn how to enable key navigation that allows moving the selection between cells ([Example](https://snippet.dhtmlx.com/y9kdk0md)) | -### How to work with range selection +## How to work with range selection In this section you will get to know how to work with the range selection functionality. @@ -306,7 +306,7 @@ In this section you will get to know how to work with the range selection functi | [Range Selection API](../../category/rangeselection-api/) | Learn how to use the API of the RangeSelection module to manage the range selection within Grid | -### How to work with block selection +## How to work with block selection In this section you will get to know how to work with the block selection functionality. From db8194991c03c37cef3baa57e50497146c6656aa Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 25 Jun 2025 13:40:01 +0300 Subject: [PATCH 30/47] [update] grid modules configs and related guides --- docs/grid/api/grid_blockselection_config.md | 14 +++++----- docs/grid/api/grid_clipboard_config.md | 10 ++++--- docs/grid/api/grid_dragpanel_config.md | 10 ++++--- docs/grid/api/grid_history_config.md | 8 +++--- docs/grid/api/grid_rangeselection_config.md | 6 +++-- docs/grid/configuration.md | 30 ++++++++++----------- docs/grid/usage_history.md | 9 +------ docs/whatsnew.md | 12 ++++----- 8 files changed, 51 insertions(+), 48 deletions(-) diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md index 33b899cf8..c120eda95 100644 --- a/docs/grid/api/grid_blockselection_config.md +++ b/docs/grid/api/grid_blockselection_config.md @@ -31,7 +31,7 @@ blockSelection?: dir: "up" | "down" | "right" | "left"; index: number; grid: IProGrid; - }) => void); + }) => { prev: any; current: any } | void); }; area?: boolean; }; @@ -64,19 +64,19 @@ The `blockSelection` property can be set in two ways: disabled - disables the module on startup, `false` by default + (boolean) disables the module on startup, `false` by default mode - the operating mode of the module:
+ (string) the operating mode of the module: handle - enables the handle for resizing. Can be set as a *boolean* value or as an *object*, `true` by default.
As an *object* can contain the following properties:
  • allowAxis - restricts the handle movement: `"x"` (horizontal), `"y"` (vertical), `"xy"` (both directions). `"xy"` by default
  • handler - a *function* to process the handle actions or *boolean* to enable/disable. As a *function*, the property takes the following parameters:
    • cell - the object of the current cell. Contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • array - an array of all selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • range - an array of pre-selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • dir - the direction of cells selection: "up" | "down" | "right" | "left"
    • index - the index of the iterated cell
    • grid - the `dhx.Grid` component object
+ (boolean | object) enables the handle for resizing or provides additional configuration options, `true` by default. As an *object* can contain the following properties:
  • allowAxis - (string) restricts the handle movement: `"x"` (horizontal), `"y"` (vertical), `"xy"` (both directions). `"xy"` by default
  • handler - (function | boolean) a *function* to process the handle actions or *boolean* to enable/disable. As a *function*, the property takes the following parameters:
    • cell - (object) the object of the current cell. Contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • array - (array) an array of all selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • range - (array) an array of pre-selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • dir - (string) the direction of cells selection: "up" | "down" | "right" | "left"
    • index - (number) the index of the iterated cell
    • grid - (object) the `dhx.Grid` component object
    The handler function may return an object with the history of Grid actions. The returned object contains the following properties:
    • prev - the previous cell value
    • current - the new cell value
area - enables the display of the selection area, `true` by default + (boolean) enables the display of the selection area, `true` by default @@ -198,7 +198,9 @@ function blockSelectionHandler({ cell, array, index, grid }) { **Related sample:** [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/8kttktiy) -**Related article:** [Managing block selection in Grid](grid/configuration.md/#managing-block-selection-in-grid) +**Related articles:** +- [Managing block selection in Grid](grid/configuration.md/#managing-block-selection-in-grid) +- [Work with BlockSelection module](grid/usage_blockselection.md) @changelog: added in v9.2 diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md index 11ddfb0e1..d840f30d2 100644 --- a/docs/grid/api/grid_clipboard_config.md +++ b/docs/grid/api/grid_clipboard_config.md @@ -49,9 +49,9 @@ The `clipboard` property can be set in two ways: - as a *boolean* value it enables or disables the `clipboard` module upon the component initialization - as an *object* it enables the module and allows defining [modifier functions](grid/usage_clipboard.md/#using-formatter-functions) for data processing. The following properties are available: - - `copyModifier` - modifies data before copying to the clipboard. Accepts as parameters the cell value, the cell object, and the `cut` flag (set to `true`, if it's a cut operation) - - `cutModifier` - modifies the cell data before cutting (before clearing the cell). Accepts as parameters the cell value and the cell object - - `pasteModifier` - modifies data from the clipboard before pasting into a cell. Accepts as parameters the cell value and the cell object + - `copyModifier` - (*function*) modifies data before copying to the clipboard. Accepts as parameters the cell value, the cell object, and the `cut` flag (set to `true`, if it's a cut operation) + - `cutModifier` - (*function*) modifies the cell data before cutting (before clearing the cell). Accepts as parameters the cell value and the cell object + - `pasteModifier` - (*function*) modifies data from the clipboard before pasting into a cell. Accepts as parameters the cell value and the cell object The example below demonstrates the clipboard configuration with all the modifiers in use: @@ -76,6 +76,8 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) -**Related article:** [Clipboard](grid/configuration.md/#clipboard) +**Related articles:** +- [Clipboard](grid/configuration.md/#clipboard) +- [Work with Clipboard module](grid/usage_clipboard.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_dragpanel_config.md b/docs/grid/api/grid_dragpanel_config.md index ea1717ed1..e30588100 100644 --- a/docs/grid/api/grid_dragpanel_config.md +++ b/docs/grid/api/grid_dragpanel_config.md @@ -52,9 +52,9 @@ The `dragPanel` property can be set in two ways: - as a *boolean* value it enables or disables the `dragPanel` module upon the component initialization - as an *object* it enables the module and allows defining additional configuration during initialization: - - `css` - specifies a custom CSS class for styling the drag panel - - `icon` - defines a custom icon for the drag handle - - `width` - sets the width of the drag panel in pixels + - `css` - (*string*) specifies a custom CSS class for styling the drag panel + - `icon` - (*string*) defines a custom icon for the drag handle + - `width` - (*number*) sets the width of the drag panel in pixels The following example demonstrates configuring the `DragPanel` module with custom styling and width: @@ -87,7 +87,9 @@ const grid = new dhx.Grid("grid_container", { **Related sample:** [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) -**Related article:** [Using the DragPanel module](grid/configuration.md/#using-the-dragpanel-module) +**Related articles:** +- [Adjusting DragPanel module](grid/configuration.md/#adjusting-dragpanel-module) +- [Work with DragPanel module](grid/usage_dragpanel.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_history_config.md b/docs/grid/api/grid_history_config.md index 9040166e8..ad5cb09c7 100644 --- a/docs/grid/api/grid_history_config.md +++ b/docs/grid/api/grid_history_config.md @@ -42,8 +42,8 @@ const grid = new dhx.Grid("grid_container", { The `history` property can be set in two ways: - as a *boolean* value it enables or disables the `History` module upon the component initialization - as an *object* it enables the module and allows setting additional parameters: - - `limit` - the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed - - `disabled` - if `true`, the module is disabled on initialization, and no actions are recorded in the history + - `limit` - (*number*) the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed + - `disabled` - (*boolean*) if `true`, the module is disabled on initialization, and no actions are recorded in the history The example below demonstrates configuring the module with a history limit of 10 actions. The module is disabled on initialization: @@ -68,6 +68,8 @@ grid.history.enable(); // enabling the module **Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) -**Related article:** [History of Grid actions](grid/configuration.md/#history-of-grid-actions) +**Related articles:** +- [History of Grid actions](grid/configuration.md/#history-of-grid-actions) +- [Work with History module](grid/usage_history.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/grid_rangeselection_config.md b/docs/grid/api/grid_rangeselection_config.md index 78e2d17e9..1b346f49d 100644 --- a/docs/grid/api/grid_rangeselection_config.md +++ b/docs/grid/api/grid_rangeselection_config.md @@ -40,7 +40,7 @@ const grid = new dhx.Grid("grid_container", { @descr: The `rangeSelection` configuration object can have the following properties: -- **disabled** - makes the module inactive upon initialization of the component +- `disabled` - (*boolean*) makes the module inactive upon initialization of the component ~~~jsx {11,15} const grid = new dhx.Grid("grid_container", { @@ -60,6 +60,8 @@ console.log(grid.range.isDisabled()); // -> `true` - module is inactive grid.range.setRange({ xStart: "a", yStart: "1" }); // the range will not be set ~~~ -**Related article:** [Managing RangeSelection in Grid](grid/configuration.md/#managing-range-selection-in-grid) +**Related articles:** +- [Managing RangeSelection in Grid](grid/configuration.md/#managing-range-selection-in-grid) +- [Work with RangeSelection module](grid/usage_rangeselection.md) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 6d7f70d5b..8c0ce1235 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2185,7 +2185,7 @@ const grid = new dhx.Grid("grid", { }); ~~~ -### Adjusting the DragPanel module +### Adjusting DragPanel module :::tip Pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. @@ -2234,10 +2234,10 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -You can specify additional configuration options for the `DragPanel` module while initializing the component. For this, you need to set the `dragPanel` property as an object. The following options are available: - - `css` - specifies a custom CSS class for styling the drag panel - - `icon` - defines a custom icon for the drag handle - - `width` - sets the width of the drag panel in pixels +You can specify additional configuration options for the `DragPanel` module while initializing the component. For this, you need to set the `dragPanel` property as an *object*. The following options are available: + - `css` - (*string*) specifies a custom CSS class for styling the drag panel + - `icon` - (*string*) defines a custom icon for the drag handle + - `width` - (*number*) sets the width of the drag panel in pixels The following example demonstrates configuring the `DragPanel` module with custom styling and width: @@ -2537,7 +2537,7 @@ The `rangeSelection` property can be set in two ways: - as a *boolean* value it enables or disables the range selection module upon the component initialization - as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: - - **disabled** - makes the module inactive upon initialization of the component + - `disabled` - (*boolean*) makes the module inactive upon initialization of the component The example below demonstrates interaction with the RangeSelection module's API when range selection is configured to be inactive on the component initialization. @@ -2594,19 +2594,19 @@ The `blockSelection` property can be set in two ways: disabled - disables the module on startup, `false` by default + (boolean) disables the module on startup, `false` by default mode - the operating mode of the module: + (string) the operating mode of the module: handle - enables the handle for resizing. Can be set as a *boolean* value or as an *object*, `true` by default.
As an *object* can contain the following properties:
  • allowAxis - restricts the handle movement: `"x"` (horizontal), `"y"` (vertical), `"xy"` (both directions). `"xy"` by default
  • handler - a *function* to process the handle actions or *boolean* to enable/disable. As a *function*, the property takes the following parameters:
    • cell - the object of the current cell. Contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • array - an array of all selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • range - an array of pre-selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • dir - the direction of cells selection: "up" | "down" | "right" | "left"
    • index - the index of the iterated cell
    • grid - the `dhx.Grid` component object
+ (boolean | object) enables the handle for resizing or provides additional configuration options, `true` by default. As an *object* can contain the following properties:
  • allowAxis - (string) restricts the handle movement: `"x"` (horizontal), `"y"` (vertical), `"xy"` (both directions). `"xy"` by default
  • handler - (function | boolean) a *function* to process the handle actions or *boolean* to enable/disable. As a *function*, the property takes the following parameters:
    • cell - (object) the object of the current cell. Contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • array - (array) an array of all selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • range - (array) an array of pre-selected cells. Each cell object contains the following properties:
      • *row* - the configuration object of a row
      • *column* - the configuration object of a column
    • dir - (string) the direction of cells selection: "up" | "down" | "right" | "left"
    • index - (number) the index of the iterated cell
    • grid - (object) the `dhx.Grid` component object
    The handler function may return an object with the history of Grid actions. The returned object contains the following properties:
    • prev - the previous cell value
    • current - the new cell value
area - enables the display of the selection area, `true` by default + (boolean) enables the display of the selection area, `true` by default @@ -2690,9 +2690,9 @@ The `clipboard` property can be set in two ways: - as a *boolean* value it enables or disables the `clipboard` module upon the component initialization - as an *object* it enables the module and allows defining [modifier functions](grid/usage_clipboard.md/#using-formatter-functions) for data processing. The following properties are available: - - `copyModifier` - modifies data before copying to the clipboard. Accepts as parameters the cell value, the cell object, and the `cut` flag (set to `true`, if it's a cut operation) - - `cutModifier` - modifies the cell data before cutting (before clearing the cell). Accepts as parameters the cell value and the cell object - - `pasteModifier` - modifies data from the clipboard before pasting into a cell. Accepts as parameters the cell value and the cell object + - `copyModifier` - (*function*) modifies data before copying to the clipboard. Accepts as parameters the cell value, the cell object, and the `cut` flag (set to `true`, if it's a cut operation) + - `cutModifier` - (*function*) modifies the cell data before cutting (before clearing the cell). Accepts as parameters the cell value and the cell object + - `pasteModifier` - (*function*) modifies data from the clipboard before pasting into a cell. Accepts as parameters the cell value and the cell object The example below demonstrates the clipboard configuration with all the modifiers in use: @@ -2746,8 +2746,8 @@ const grid = new dhx.Grid("grid_container", { The `history` property can be set in two ways: - as a *boolean* value it enables or disables the `History` module upon the component initialization - as an *object* it enables the module and allows setting additional parameters: - - `limit` - the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed - - `disabled` - if `true`, the module is disabled on initialization, and no actions are recorded in the history + - `limit` - (*number*) the maximum number of actions stored in the history. When the limit is exceeded, the oldest actions are removed + - `disabled` - (*boolean*) if `true`, the module is disabled on initialization, and no actions are recorded in the history The example below demonstrates configuring the module with a history limit of 10 actions. The module is disabled on initialization: diff --git a/docs/grid/usage_history.md b/docs/grid/usage_history.md index 56f610ae3..9279bdbd3 100644 --- a/docs/grid/usage_history.md +++ b/docs/grid/usage_history.md @@ -434,14 +434,7 @@ The `History` module records actions performed through the user interface, inclu - cells editing: changes made using the cell editor - cells clearing: clearing the contents of cells using keyboard navigation -- handle modifications: if the handle is used in the [`BlockSelection` mode](grid/configuration.md/#managing-block-selection-in-grid) and the `handler` function returns an object with the `prev` (previous value) and `current` (current value) fields, these changes are added to the history: - -~~~jsx -interface IHandleHistory { - prev: any; // the previous value - current: any; // the current value -} -~~~ +- handle modifications: if the handle is used in the [`BlockSelection` mode](grid/configuration.md/#managing-block-selection-in-grid) and the [`handler`](grid/api/grid_blockselection_config.md/#parameters) function returns an object with the `prev` (the previous cell value) and `current` (the new cell value) fields, these changes are added to the history The actions not related to the UI (e.g., programmatic changes via `grid.data`) are not automatically recorded, but can be manually added using the [`add()`](grid/api/history/add_method.md) method. diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 64ed388d2..47bde207a 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -44,12 +44,12 @@ Released on June X, 2025 ### Fixes -- DragManager. Solving the problem of incorrectly determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode -- DragManager. Solving the problem when moving a line to the header/footer area -- DragManager. Solving the problem of determining the position for dropping above the first element -- DragManager. Solving the problem associated with the absence or incorrect definition of the drop position for the default mode -- DragManager. Fixed the `dragIn` event (the previous reset state was transmitted) -- DragManager. Optimization of the `dragIn/dragOut` events (removed false positives) +- DragManager. Incorrect determining the position for dropping an element during the Drag&Drop operation (child elements) in the TreeGrid mode +- DragManager. The issue with moving a line to the header/footer area +- DragManager. The problem with determining the position for dropping above the first element +- DragManager. The issue associated with the absence or incorrect definition of the drop position for the default mode +- DragManager. The issue with the `dragIn` event (the previous reset state was transmitted) +- DragManager. The `dragIn/dragOut` events are optimized (false positives are removed) - Grid. The issue with falsy selection of frozen cells while selecting unfrozen cells - Grid. The issue with dragging unselected items - Grid. Sorting of the Date string (ISO) values results in the invalid format error From 6f97d7ad093d65dd153452dfa038f4f027b0111a Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 25 Jun 2025 17:33:32 +0300 Subject: [PATCH 31/47] [update] grid configuration and usage guides --- docs/grid/configuration.md | 1987 ++++++++++++++++++------------------ docs/grid/usage.md | 13 +- 2 files changed, 1011 insertions(+), 989 deletions(-) diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 8c0ce1235..0fe1e6efc 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -1628,918 +1628,1118 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid. Frozen columns and rows](https://snippet.dhtmlx.com/hcgl9nth) -## Row expander +## Spans -The row expander functionality allows using nested content in Grid sub-rows. You can add a Grid or any other Suite widget, as well as some HTML content into a sub-row. +The Grid component has the [`spans`](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. -:::tip Pro version only -This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. -::: +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + // columns config + ], + spans: [ + {row:"0", column:"a", rowspan:5 }, + {row:"0", column:"b", rowspan:9, text:"

Some content here

"}, + {row:"0", column:"c", colspan:2, text:"Some content"}, + {row:"10", column:"a", colspan:4, text:"Some header", css:"myCustomColspan"} + ], + data: dataset +}); +~~~ -![](../assets/grid/row_expander.png) +Each span object contains the following properties: -### Adding sub-rows +- `row` - (*string | number*) obligatory, the id of a row +- `column` - (*string|number*) obligatory, the id of a column +- `rowspan` - (*number*) optional, the number of rows in a span +- `colspan` - (*number*) optional, the number of columns in a span +- `text` - (*string|number*) optional, the content of a span. You can specify the text of the column span via the `text` property. It can be set either as a *string* or a *callback function* which is called with the following parameter: + - `content` - an object with the content of the span tooltip that contains the calculated values of the `summary` property, set as *key:value* pairs where: + - the *key* is either the key defined in the list or the functor name + - the *value* can be a *string*, *number* or *null* -In order to enable the row expander feature, you should use the [`subRow`](grid/api/grid_subrow_config.md) configuration option. It defines the content of sub-rows for each row of the Grid. The `subRow` property is a callback function which is called with the row object as a parameter and should return an HTML string or the constructor of a Suite component (Grid, Chart, Form, DataView, etc.). +The calculated values are taken from the [`summary`](grid/api/grid_summary_config.md) config option of the component and the [`summary`](grid/api/api_gridcolumn_properties.md) config option of a column. :::note -Note that when the `subRow` config is used, Grid doesn't support the [TreeGrid mode](grid/treegrid_mode.md) and the [data grouping](grid/usage.md#grouping-data) functionality. +In case key names in the `summary` configs are the same, values are taken from the column's configuration option. ::: -Check the example of using a sub-row with an HTML content: +:::info important +If the value of a spanned cell is initialized with the `text` property set as a *callback function*, the cell content can't be edited. +::: -~~~jsx {8-10} +~~~jsx {17} const grid = new dhx.Grid("grid_container", { columns: [ - { id: "zone_name", header: [{ text: "Zone name" }] }, - { id: "temperature", header: [{ text: "Temperature" }] }, - { id: "status", header: [{ text: "Status" }] }, + { width: 200, id: "country", header: [{ text: "Country" }] }, + { + width: 150, + id: "population", + header: [{ text: "Population" }], + summary: "count" + } ], - data: dataset, - subRow: ({ zone_name }) => { - return `
Details for ${zone_name}
`; - }, + summary: { totalPopulation: ["population", "sum"] }, + spans: [ + { + row: "rowid", + column: "population", + rowspan: 9, + text: ({ count }) => ("Count population:" + count) + }, + ], + data: dataset }); ~~~ -**Related sample:** [Grid. Row expander. Custom HTML and hiding toggle icon](https://snippet.dhtmlx.com/pvgyd3z9) - -In the example below a sub-row contains a subgrid: +- `css` - (*string*) optional, the name of a CSS class applied to a span +- [`tooltip`](#column-and-spans-tooltips) - (*boolean|object*) optional, enables a tooltip on hovering over the content of a span, or sets the configuration object with the tooltip settings; *true* by default. When set as an object, the `tooltip` config can have the following properties: + - `force` - (optional) forces opening of a tooltip; if set to true, the `showDelay` and `hideDelay` settings are ignored, *false* by default + - `showDelay` - (optional) the time period that should pass before showing a tooltip, in ms + - `hideDelay` - (optional) the time period that should pass before hiding a tooltip, in ms + - `margin` - (optional) the margin between the node and tooltip + - `position` - (optional) the position of a tooltip: *"right"*, *"bottom"*, *"center"*, *"left"*, *"top"*; *"bottom"* by default + - `css` - (optional) the style of a tooltip box -~~~jsx {7-16} +~~~jsx const grid = new dhx.Grid("grid_container", { columns: [ - { id: "zone_name", header: [{ text: "Zone name" }] }, - { id: "temperature", header: [{ text: "Temperature" }] }, + // columns config ], - data: dataset, - subRow: ({ data }) => { - return new dhx.Grid(null, { - columns: [ - { id: "animal_type", header: [{ text: "Animal type" }] }, - { id: "name", header: [{ text: "Name" }] }, - ], - data, - autoWidth: true, - }); - }, + spans: [ + {row:"0", column:"a", rowspan:5 }, + {row:"0", column:"b", rowspan:9, text:"

Some content here

"}, + {row:"0", column:"c", colspan:2, text:"Some content"}, + {row:"10", column:"a", colspan:4, text:"Some header", css:"myCustomColspan"} + ], + data: dataset }); ~~~ -**Related sample:** [Grid. Row expander. Full config](https://snippet.dhtmlx.com/xdw2037t) - -### Adjusting configuration of sub-rows +- [`tooltipTemplate`](#adding-templates-for-column-and-spans-tooltip) - (*function*) sets a template for the span tooltip. The value of the `tooltipTemplate` property is a callback function which is called with the following parameters: + - `content` - an object with the content of the span tooltip. Contains two properties which are available either from the component's or from the column's configuration: + - `value` - the value rendered in a cell, including the applied templates + - an object with the calculated values of the `summary` property, set as *key:value* pairs where: + - the *key* is either the key defined in the list or the functor name + - the *value* can be a *string*, *number* or *null* + - `span` - the object of the column span -You can define common configuration settings of all sub-rows or provide specific options for each sub-row via the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration property of Grid. +~~~jsx {17-18} +const grid = new dhx.Grid("grid_container", { + columns: [ + { width: 200, id: "country", header: [{ text: "Country" }] }, + { + width: 150, + id: "population", + header: [{ text: "Population" }], + summary: "count" + } + ], + summary: { totalPopulation: ["population", "sum"] }, + spans: [ + { + row: "rowid", + column: "population", + rowspan: 9, + text: "Some text", + tooltipTemplate: ({ value, count }) => (`value: ${value}; count: ${count}`), + }, + ], + data: dataset +}); +~~~ -This property can be used either as a callback function or as an object: +**Related sample**: [Grid. Grouped cells (spans)](https://snippet.dhtmlx.com/1775dwbl) -- when set as an *object*, the specified parameters are applied to all the rows -- when set as a *callback function*, it is called with the row object as a parameter and returns an object, which allows providing specific configuration for each particular row +**Note**, that if both the `spans` and [`leftSplit`](grid/api/grid_leftsplit_config.md) properties are set in the Grid config, the following rules will be applied: -The **subRowConfig** object may contain the following properties: +- All necessary columns or rows will be in a span if the `spans` property is set for the columns located within the frozen area. +- If the `spans` property is set for a number of columns or rows placed as in the frozen part as in the movable one, then the columns remained in the movable part only will be in a span. -- `expanded` - (*boolean*) defines whether a sub-row is expanded by default, *false* by default -- `preserve` - (*boolean*) saves the state of sub-rows when they are expanded/collapsed, hidden from the visible area, the data is updated, *false* by default -- `toggleIcon` - (*boolean*) enables the icon for sub-rows expanding/collapsing, *true* by default -- `height` - (*number*) the height of a sub-row in pixels, *200* by default -- `padding` - (*string|number*) the inner padding of a sub-row, *8* by default -- `css` - (*string*) user-defined CSS classes for a sub-row -- `fullWidth` - (*boolean*) defines whether a sub-row will take all the width of Grid, *false* by default +## Tooltip -:::info note -The `fullWidth` property works only if the `subRowConfig` property is initialized as an object. -::: +### Grid tooltips -The following example shows how to provide global configuration options for sub-rows: +The default configuration of Grid provides tooltips that are rendered when a user hovers over the content of a column's cell. All the tooltips can be controlled via the [](grid/api/grid_tooltip_config.md) configuration property of Grid. By default, the tooltips are enabled. You can disable them, by setting the config to *false*: -~~~jsx {7-11} +~~~jsx const grid = new dhx.Grid("grid_container", { columns: [ - { id: "zone_name", header: [{ text: "Zone name" }] }, - { id: "temperature", header: [{ text: "Temperature" }] }, + //columns config ], data: dataset, - subRowConfig: { - height: 200, - padding: 8, - fullWidth: true, - }, - subRow: ({ zone_name }) => `
Details for ${zone_name}
`, + tooltip: false }); ~~~ -**Related sample:** [Grid. Row expander. Full config](https://snippet.dhtmlx.com/xdw2037t) +**Related sample**: [Grid. Hiding tooltips](https://snippet.dhtmlx.com/mq4t3t3w) -### Dynamic configuration of sub-rows +The `tooltip` configuration option can be set as an object with the following properties: -You can dynamically expand/collapse certain sub-rows or adjust their appearance (specify the size of a cell, provide particular styles for sub-rows, etc.) on initialization of Grid depending on some conditions, using the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration property of Grid set as a callback function. Check the example below: +- `force` - (optional) forces opening of a tooltip; if set to true, the `showDelay` and `hideDelay` settings are ignored, *false* by default +- `showDelay` - (optional) the time period that should pass before showing a tooltip, in ms +- `hideDelay` - (optional) the time period that should pass before hiding a tooltip, in ms +- `margin` - (optional) the margin between the node and tooltip +- `position` - (optional) the position of a tooltip: *"right"*, *"bottom"*, *"center"*, *"left"*, *"top"*; *"bottom"* by default +- `css` - (optional) the style of a tooltip box -~~~jsx {7-11} +~~~jsx {6-8} const grid = new dhx.Grid("grid_container", { columns: [ - { id: "zone_name", header: [{ text: "Zone name" }] }, - { id: "temperature", header: [{ text: "Temperature" }] }, + // columns config ], data: dataset, - subRowConfig: (row) => ({ - height: 200, - expanded: row.temperature > 30, - css: row.temperature > 30 ? "hot-zone" : "cool-zone", - }), - subRow: ({ zone_name }) => `
Details for ${zone_name}
`, + tooltip: { + force: true + } }); ~~~ -In the above example the sub-rows are dynamically configured depending on the value in the column with the "temperature" id. If the temperature value is more than 30, a sub-row will be expanded and gets the CSS "hot-zone" class (or "cool-zone", if the temperature value is less than 30). The height of an expanded sub-row cell will be 200px. - -#### Adding sub-rows for specific rows - -You can define which row a sub-row should be created for with the help of the `height` property of the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration option. If you don't want to create sub-rows for particular rows, specify the `height:0` setting in the `subRowConfig` property. +**Related sample**: [Grid. Tooltip config](https://snippet.dhtmlx.com/qpqnalyt) -:::note -The described functionality works only if the `subRowConfig` property is initialized as a callback function. -::: +It is also possible to control the header and footer tooltips, independently. There are the [`headerTooltip`](grid/api/grid_headertooltip_config.md) and [`footerTooltip`](grid/api/grid_footertooltip_config.md) Grid configuration properties, that you can use for this purpose: -~~~jsx {7-10} +~~~jsx {7-8} const grid = new dhx.Grid("grid_container", { columns: [ // columns config ], data: dataset, - autoWidth: true, - subRowConfig: (row) => ({ - height: row.data.length ? 250 : 0, - expanded: true - }), - subRow: (row) => new dhx.Grid(null, { - columns: [ - // columns config - ], - data: row.data - }), + tooltip: false, // Disable all tooltips + headerTooltip: true, // Enable all header tooltips + footerTooltip: true, // Enable all footer tooltips }); ~~~ -![](../assets/grid/subgrid_specific_rows.png) - -In the above example the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) config set as a callback function defines that sub-rows with the height 250px will be created for rows that have some data. For rows without data the `height:0` setting is specified, so sub-rows won't be created for these rows. - -**Related sample:** [Grid. Row expander. Subgrid only in specific rows](https://snippet.dhtmlx.com/03udbtmr) - -### Saving state of nested components or data in sub-rows - -You can save the state of the nested components or the data of sub-rows while updating data, scrolling or collapsing sub-rows by using the `preserve` property of the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration option of Grid. By default, sub-rows are destroyed when they are hidden (e.g. if a row leaves the visible area during scrolling) or collapsed, which leads to resetting of any changes made in the inner components. - -When the `preserve: true` setting is specified, sub-rows aren't destroyed when hidden or collapsed and their content is saved. It means that any change (such as sorting, data input or state change) is saved and the sub-row is restored in the same state when displayed again. - -:::info note -It's important to take into account that the `preserve: true` setting increases the size of the used memory, since the sub-rows data are kept in the memory even when they aren't displayed. -::: - -#### When using `preserve` is useful - -- When the data of sub-rows should be interactive. It means when a sub-row contains a form or any other component the content of which can be changed by a user and the changes shouldn't be reset -- For complex sub-rows with a state. For example, if a sub-row renders a component with a dynamic content and a complex user interface - -#### When `preserve` shouldn't be used +The `headerTooltip` and `footerTooltip` configs can be specified as objects the same as the main [`tooltip`](grid/configuration.md#grid-tooltips) config. -- When sub-rows are used just for rendering static information. If a sub-row presents a simple text or a static HTML, the use of `preserve` is not rational -- In case a large amount of data is used. If a grid has a lot of rows and sub-rows, using `preserve` may increase the size of the used memory, which will affect the performance +### Column and spans tooltips -In the example below the `preserve` config is used to save the context of the Form nested in a sub-row: +There is a possibility to enable/disable tooltips for separate columns or spans by using the `tooltip` option in the configuration object of the [`columns`](grid/configuration.md#columns) or [`spans`](grid/configuration.md#spans) accordingly: -~~~jsx {7-9} +~~~jsx {3,7,10} const grid = new dhx.Grid("grid_container", { columns: [ - { id: "name", header: [{ text: "Name" }] }, - { id: "age", header: [{ text: "Age" }] }, + { width: 200, id: "country", header: [{ text: "Country" }], tooltip: true }, + { width: 150, id: "population", header: [{ text: "Population" }] }, ], - data: dataset, - subRowConfig: { - preserve: true, // saves the state of sub-rows - }, - subRow: (row) => { - return new dhx.Form(null, { - rows: [ - { type: "input", name: "details", label: "Details", value: row.details }, - ], - }); - }, + spans: [ + { row: "1", column: "country", rowspan: 5, tooltip: true }, + ], + data: dataset, + tooltip: false }); ~~~ -### Loading data into a sub-row +The same as with the common Grid tooltips, column and span tooltips can be set as objects with the following properties: -You can dynamically load data into a sub-row using the `load()` method of [DataCollection](/data_collection/) or [TreeCollection](/tree_collection/), depending on the nested component: +- `force` - (optional) forces opening of a tooltip; if set to true, the `showDelay` and `hideDelay` settings are ignored, *false* by default +- `showDelay` - (optional) the time period that should pass before showing a tooltip, in ms +- `hideDelay` - (optional) the time period that should pass before hiding a tooltip, in ms +- `margin` - (optional) the margin between the node and tooltip; *8px* by default +- `position` - (optional) the position of a tooltip: *"right"*, *"bottom"*, *"center"*, *"left"*, *"top"*; *"bottom"* by default +- `css` - (optional) the style of a tooltip box -~~~jsx {16-18} +~~~jsx {3,7,10} const grid = new dhx.Grid("grid_container", { columns: [ - { id: "country", header: [{ text: "Country" }] }, - { id: "population", header: [{ text: "Population" }] }, + { width: 200, id: "country", header: [{ text: "Country" }], tooltip: { force: true } }, + { width: 150, id: "population", header: [{ text: "Population" }] }, + ], + spans: [ + { row: "1", column: "country", rowspan: 5, tooltip: { force: true } }, ], data: dataset, - subRowConfig: { height: 400 }, - subRow: () => { - const subGrid = new dhx.Grid(null, { - columns: [ - { id: "title", header: [{ text: "Title" }] }, - { id: "authors", header: [{ text: "Authors" }] }, - ], - }); - - subGrid.data.load("https://some/dataset.json").then(() => { - subGrid.selection.setCell(subGrid.data.getId(0)); - }); - - return subGrid; - }, + tooltip: false }); ~~~ -In the above example the `load()` method of [DataCollection](/data_collection/) is used for loading data into a nested Grid. - -**Related sample:** [Grid. Row expander. Subgrid data loading](https://snippet.dhtmlx.com/03ndqrqt) +#### Adding templates for column and spans tooltip -### Handling events +You can add a template for a column or spans tooltip. -#### Grid event handlers +- to set a template for a column tooltip use a function which takes 3 parameters: + - `value` - (required) the value of a cell + - `row` - (required) an object with all cells in a row + - `column` - (required) an object with the configuration of a column -If a sub-row initializes a nested component (any Suite component), the sub-component's events can be set in the [`subRow`](grid/api/grid_subrow_config.md) callback function. It allows specifying event handlers directly for the nested component: +Returning *false* from the function will block showing of the tooltip. -~~~jsx {16-18} +~~~jsx {6-8} const grid = new dhx.Grid("grid_container", { columns: [ - { width: 200, id: "zone_name", header: [{ text: "Zone Name" }] }, - { width: 150, id: "temperature", header: [{ text: "Temperature" }] }, + { + width: 200, id: "country", header: [{ text: "Country" }], align: "left", + htmlEnable: true, + tooltipTemplate: function (value, row, column) { + // the template logic + } + }, + { width: 150, id: "population", header: [{ text: "Population" }] }, + { width: 150, id: "yearlyChange", header: [{ text: "Yearly Change" }] }, + // more options ], - data: dataset, - subRow: ({ zone_name }) => { - const subGrid = new dhx.Grid(null, { - columns: [ - { id: "animal", header: [{ text: "Animal" }] }, - { id: "count", header: [{ text: "Count" }] }, - ], - data: zooMap[zone_name], - }); - - subGrid.events.on("cellClick", (row, column) => { - console.log(`${row} ${column}`); - }); - - return subGrid; - }, + data: dataset }); ~~~ -**Related sample:** [Grid. Row expander. Subgrid events handling](https://snippet.dhtmlx.com/3364si14) - -#### HTML template event handlers +You can [check an example of applying a template for a column tooltip](grid/customization.md#adding-template-to-tooltip). -To specify the event handlers for a sub-row with an HTML content, use the [`eventHandlers`](grid/api/grid_eventhandlers_config.md) configuration option of Grid: +- to set a template for a spans tooltip use the `tooltipTemplate` configuration property. The value of the `tooltipTemplate` property is a callback function which is called with the following parameters: + - `content` - an object with the content of the span tooltip. Contains two properties which are available either from the component's or from the column's configuration: + - `value` - the value rendered in a cell, including the applied templates + - an object with the calculated values of the `summary` property, set as *key:value* pairs where: + - the *key* is either the key defined in the list or the functor name + - the *value* can be a *string*, *number* or *null* + - `span` - the object of the column span -~~~jsx {13-20} +~~~jsx {18} const grid = new dhx.Grid("grid_container", { columns: [ - { width: 200, id: "name", header: [{ text: "Name" }] }, - { width: 150, id: "details", header: [{ text: "Details" }] }, + { width: 200, id: "country", header: [{ text: "Country" }] }, + { + width: 150, + id: "population", + header: [{ text: "Population" }], + summary: "count" + } ], - data: dataset, - subRow: (row) => ` -
-

Details for ${row.name}

- -
- `, - eventHandlers: { - onclick: { - // the button click event in a sub-row - subrow_button: (event, data) => { - console.log(`A button click in the row ${data.row.id}`); // subRow id - } + summary: { totalPopulation: ["population", "sum"] }, + spans: [ + { + row: "rowid", + column: "population", + rowspan: 9, + text: "Some text", + tooltipTemplate: ({ value, count }) => (`value: ${value}; count: ${count}`), }, - } + ], + data: dataset }); ~~~ -### Multi-level Grid nesting - -It is possible to create as many levels of nested subgrids, as necessary. - -![](../assets/grid/multi_level_nesting.png) - -To specify the structure of a multi-level Grid nesting, do the following: - -- create a Grid with columns and data -- in the Grid configuration specify the [`subRow`](grid/api/grid_subrow_config.md) option as a callback function, which: - - returns a nested Grid that contains the `subRow` config set as a callback function that may return: - - some Suite component - - HTML as string - - a subgrid instance for another nesting level (that contains the `subRow` config set as a callback function to return another subgrid, a Suite component, or HTML content) +#### Column header/footer tooltip -Check the example below: +The tooltip set for a column enables/disables all its tooltips. However, you can control the tooltips of the column header/footer separately, by specifying the `tooltip` property in the corresponding header/footer object inside the column: -~~~jsx {12,24,36} +~~~jsx {4} const grid = new dhx.Grid("grid_container", { columns: [ - { id: "col_1", header: [{ text: "Grid. Level 1" }] }, - { id: "col_2", header: [{ text: "Second Column" }] }, + // Enables a tooltip for the country title + { id: "country", header: [{ text: "Country", tooltip: true }] }, + { id: "population", header: [{ text: "Population" }] }, + // more columns ], data: dataset, - autoWidth: true, - subRowConfig: (row) => ({ - height: 300, - expanded: row.col_1 === "Row 1", - }), - subRow: ({ data }) => { - return new dhx.Grid(null, { - columns: [ - { id: "col_1", header: [{ text: "Grid. Level 2" }] }, - { id: "col_2", header: [{ text: "Second Column" }] }, - ], - data, - autoWidth: true, - subRowConfig: (row) => ({ - height: 300, - expanded: row.col_1 === "Row 1", - }), - subRow: ({ data }) => { - return new dhx.Grid(null, { - columns: [ - { id: "col_1", header: [{ text: "Grid. Level 3" }] }, - { id: "col_2", header: [{ text: "Second Column" }] }, - ], - data, - autoWidth: true, - subRowConfig: (row) => ({ - height: 300, - expanded: row.col_1 === "Row 1", - }), - subRow: () => (`Subrow. Level 4`), - }) - }, - }) - }, + tooltip: false, }); ~~~ -**Related sample:** [Grid. Row expander. Subgrid with rows expanded by criteria](https://snippet.dhtmlx.com/dih3z7cz) - -### Adjusting sub-row width - -You can adjust the sub-row width depending on the width of its parent Grid via the `fullWidth` property of the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration object. - -:::info note -The `fullWidth` property works only if the `subRowConfig` property is initialized as an object. -::: +What is more, you can specify a necessary template for the header/footer tooltip via the `tooltipTemplate` configuration property. The value of the `tooltipTemplate` property is a callback +function which is called with the following parameters: -If the `fullWidth: true` configuration option is specified, the sub-row width is the same as the full width of the Grid content, including the area outside the visible area borders (it means that the sub-row will be scrolled together with the horizontal scroll). By default, a sub-row takes just the width of the visible Grid area. +- `content` - an object with the content of the header/footer tooltip. Contains two properties which are available either from the component's or from the column's configuration: + - `value` - (*string*) the value rendered in a cell, including the applied templates + - an object with the calculated values of the `summary` property, set as *key:value* pairs where: + - the *key* is either the key defined in the list or the functor name + - the *value* can be a *string*, *number* or *null* +- `header/footer` - (*object*) the object of the column header/footer +- `column` - (*object*) the object of a column -Check the example below: +and returns a string with the tooltip template for the header/footer or *false* to disable a tooltip. -~~~jsx {12-14} +~~~jsx {9} const grid = new dhx.Grid("grid_container", { - width: 400, columns: [ - { id: "name", header: [{ text: "Name" }], width: 150 }, - { id: "value", header: [{ text: "Value" }], width: 150 }, - { id: "description", header: [{ text: "Description" }], width: 300 }, + { + width: 150, + id: "population", + header: [ + { + text: "Population", + tooltipTemplate: ({ totalPopulation, count }) => `Total: ${totalPopulation}, Count: ${ count }` + } + ], + summary: "count" + } + // more columns ], - data: dataset, - subRow: (row) => { - return `
Details for ${row.name}
`; - }, - subRowConfig: { - fullWidth: true, // makes the sub-row width equal to the Grid content width - }, -}); + summary: { totalPopulation: ["population", "sum"] }, + data: dataset ~~~ -In the above example: +**Related sample**: [Grid. Header/footer tooltip](https://snippet.dhtmlx.com/fgstf2mq) -- the width of the Grid container is set as 400px -- if the `fullWidth` config isn't enabled, the sub-row width will be equal to the Grid width (400px) -- the common width of all the columns is 600px, thus if the `fullWidth: true` setting is specified, the sub-row width will be equal to 600px +#### Tooltips for filters -### Getting sub-row config and content +You can provide a tooltip template for the header content of any type, which allows showing tooltips for filters. -You can get the configuration settings applied to a sub-row and the content inside it using the [`getSubRow()`](grid/api/grid_getsubrow_method.md) method. - -:::info -Note that the method works if a sub-row is in the visible area or if the `preserve:true` property is specified in the `subRowConfig` object of the sub-row. -::: +Check the example below: -The method takes as a parameter the id of a row and returns an object that includes the following properties: +~~~jsx {14,26} +const balanceTemplate = value => { + return value > 0 + ? `
⬆ $${value}
` + : `
⬇ $${value}
`; +}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
css(string) user-defined CSS classes for a sub-row
element(HTMLElement | null) the parent container of the current sub-row
expanded(boolean) defines whether a sub-row is expanded by default, false by default
fullWidth(boolean) defines whether a sub-row will take all the width of Grid, false by default
height(number) the height of a sub-row in pixels, 200 by default
padding(string | number) the inner padding of a sub-row, 8 by default
preserve(boolean) saves the state of sub-rows while expanding/collapsing, disappearing from the visible area, data updating, false by default
toggleIcon(boolean) enables the icon for expanding/collapsing, true by default
view(string | object | null) that can be presented by:
  • a string, if the sub-row is set by the HTML content
  • an object instance to interact with, if a sub-row is an instance of a nested component (for example, Grid)
  • null, if the sub-row is unavailable (for example, it is hidden or placed outside the visible area and the `preserve` config is not specified)
+const grid = new dhx.Grid("grid_container", { + columns: [ + { + minWidth: 150, + id: "project", + header: [ + {text: "Project"}, + {content: "comboFilter", tooltipTemplate: () => "Select project"} + ], + footer: [{text: "Total"}], + resizable: true, + draggable: false + }, + { + width: 130, + id: "balance", + header: [{text: "Balance"}, {content: "inputFilter"}], + footer: [ + { + tooltipTemplate: balanceTemplate + }, + ], + template: balanceTemplate, + htmlEnable: true, + numberMask: { + prefix: "$" + } + }, + ], +}); +~~~ -## Drag-n-drop +## Row expander -The drag-n-drop functionality allows you to reorder one or several rows or columns inside the grid or between several grids. +The row expander functionality allows using nested content in Grid sub-rows. You can add a Grid or any other Suite widget, as well as some HTML content into a sub-row. :::tip Pro version only -If you use the GPL version of DHTMLX Grid (or DHTMLX Suite), you will be able to reorder only rows and only one by one. - -**Note**, to be able to drag-n-drop a column and (or) multiple rows, you need to use PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -![](../assets/grid/dnd_treegrid_mode.png) +![](../assets/grid/row_expander.png) -**Related sample**: [Grid. Drag-and-Drop in TreeGrid mode](https://snippet.dhtmlx.com/0tuk0y5f) +### Adding sub-rows -### Drag-n-drop inside the grid +In order to enable the row expander feature, you should use the [`subRow`](grid/api/grid_subrow_config.md) configuration option. It defines the content of sub-rows for each row of the Grid. The `subRow` property is a callback function which is called with the row object as a parameter and should return an HTML string or the constructor of a Suite component (Grid, Chart, Form, DataView, etc.). -It is possible to reorder a row or column of Grid by drag and drop. To enable the functionality, define the [`dragItem: "both"`](grid/api/grid_dragitem_config.md) property in the configuration object of Grid: +:::note +Note that when the `subRow` config is used, Grid doesn't support the [TreeGrid mode](grid/treegrid_mode.md) and the [data grouping](grid/usage.md#grouping-data) functionality. +::: -~~~jsx {5} +Check the example of using a sub-row with an HTML content: + +~~~jsx {8-10} const grid = new dhx.Grid("grid_container", { columns: [ - // columns config + { id: "zone_name", header: [{ text: "Zone name" }] }, + { id: "temperature", header: [{ text: "Temperature" }] }, + { id: "status", header: [{ text: "Status" }] }, ], - dragItem: "both", - data: dataset + data: dataset, + subRow: ({ zone_name }) => { + return `
Details for ${zone_name}
`; + }, }); ~~~ -**Related sample**: [Grid. Drag-n-drop](https://snippet.dhtmlx.com/zwc91d50) - -:::note -To activate the functionality for columns or rows separately, use `dragItem: "column"` or `dragItem: "row"` respectively. -::: +**Related sample:** [Grid. Row expander. Custom HTML and hiding toggle icon](https://snippet.dhtmlx.com/pvgyd3z9) -If needed, you can disable the drag-n-drop functionality for a separate column via the `draggable` configuration option of the column: +In the example below a sub-row contains a subgrid: -~~~jsx {5,8} +~~~jsx {7-16} const grid = new dhx.Grid("grid_container", { columns: [ - { width: 200, id: "country", header: [{ text: "Country" }]}, - { width: 150, id: "land", header: [{ text: "Land" }] }, - { width: 150, id: "density", header: [{ text: "Density" }], draggable: false } + { id: "zone_name", header: [{ text: "Zone name" }] }, + { id: "temperature", header: [{ text: "Temperature" }] }, ], data: dataset, - dragItem: "column", + subRow: ({ data }) => { + return new dhx.Grid(null, { + columns: [ + { id: "animal_type", header: [{ text: "Animal type" }] }, + { id: "name", header: [{ text: "Name" }] }, + ], + data, + autoWidth: true, + }); + }, }); ~~~ -:::tip -To make the process of work with drag and drop more flexible, you can apply the related drag-n-drop events of Grid for [columns](grid/api/api_overview.md#column-drag-and-drop) and [rows](grid/api/api_overview.md/#row-drag-and-drop). -::: +**Related sample:** [Grid. Row expander. Full config](https://snippet.dhtmlx.com/xdw2037t) -### Drag-n-drop between grids +### Adjusting configuration of sub-rows -DHTMLX Grid supports drag-n-drop of rows/columns between grids in several modes. To begin with, you should specify the [dragMode](grid/api/grid_dragmode_config.md) property in the configuration object of Grid. Then define which mode you need: +You can define common configuration settings of all sub-rows or provide specific options for each sub-row via the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration property of Grid. -- "target" - a grid takes a row/column from other grids, while its row/colmn can't be dragged out of it -- "source" - a grid allows dragging its row/column out and can't take a row/column from other grids -- "both" - a grid both takes a row/column from other grids and allows dragging its row/column out as well +This property can be used either as a callback function or as an object: -~~~jsx {7} -const grid = new dhx.Grid("grid_container", { - columns: [ - { id: "country", header: [{ text: "Country" }] }, - { id: "population", header: [{ text: "Population" }] } - ], - data: dataset, - dragMode: "source", - // dragItem: "column" - allows reordering columns one by one -}); -~~~ +- when set as an *object*, the specified parameters are applied to all the rows +- when set as a *callback function*, it is called with the row object as a parameter and returns an object, which allows providing specific configuration for each particular row -**Related sample**: [Grid. Drag-n-drop between grids](https://snippet.dhtmlx.com/qx9a86ax) +The **subRowConfig** object may contain the following properties: -### Drag-n-drop of multiple rows +- `expanded` - (*boolean*) defines whether a sub-row is expanded by default, *false* by default +- `preserve` - (*boolean*) saves the state of sub-rows when they are expanded/collapsed, hidden from the visible area, the data is updated, *false* by default +- `toggleIcon` - (*boolean*) enables the icon for sub-rows expanding/collapsing, *true* by default +- `height` - (*number*) the height of a sub-row in pixels, *200* by default +- `padding` - (*string|number*) the inner padding of a sub-row, *8* by default +- `css` - (*string*) user-defined CSS classes for a sub-row +- `fullWidth` - (*boolean*) defines whether a sub-row will take all the width of Grid, *false* by default -:::tip Pro version only -This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +:::info note +The `fullWidth` property works only if the `subRowConfig` property is initialized as an object. ::: -To allow a user to drag-n-drop multiple rows at once, you need to enable [multiselection](#multiple-selection-of-grid-cells) of rows when configuring drag-n-drop. For example: +The following example shows how to provide global configuration options for sub-rows: -~~~jsx -const grid = new dhx.Grid("grid", { +~~~jsx {7-11} +const grid = new dhx.Grid("grid_container", { columns: [ - // columns config + { id: "zone_name", header: [{ text: "Zone name" }] }, + { id: "temperature", header: [{ text: "Temperature" }] }, ], - data: data, - selection: "row", - //drag-n-drop rows inside the grid - multiselection: true, - dragItem: "both" // or dragItem: "row" + data: dataset, + subRowConfig: { + height: 200, + padding: 8, + fullWidth: true, + }, + subRow: ({ zone_name }) => `
Details for ${zone_name}
`, }); ~~~ -**Related sample**: [Grid. Drag-n-drop](https://snippet.dhtmlx.com/zwc91d50) +**Related sample:** [Grid. Row expander. Full config](https://snippet.dhtmlx.com/xdw2037t) -or +### Dynamic configuration of sub-rows -~~~jsx -const grid = new dhx.Grid("grid", { +You can dynamically expand/collapse certain sub-rows or adjust their appearance (specify the size of a cell, provide particular styles for sub-rows, etc.) on initialization of Grid depending on some conditions, using the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration property of Grid set as a callback function. Check the example below: + +~~~jsx {7-11} +const grid = new dhx.Grid("grid_container", { columns: [ - // columns config + { id: "zone_name", header: [{ text: "Zone name" }] }, + { id: "temperature", header: [{ text: "Temperature" }] }, ], data: dataset, - selection: "row", - //drag-n-drop rows between grids - multiselection: true, - dragMode: "both" // or dragMode: "source" + subRowConfig: (row) => ({ + height: 200, + expanded: row.temperature > 30, + css: row.temperature > 30 ? "hot-zone" : "cool-zone", + }), + subRow: ({ zone_name }) => `
Details for ${zone_name}
`, }); ~~~ -### Adjusting DragPanel module - -:::tip Pro version only -This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. -::: +In the above example the sub-rows are dynamically configured depending on the value in the column with the "temperature" id. If the temperature value is more than 30, a sub-row will be expanded and gets the CSS "hot-zone" class (or "cool-zone", if the temperature value is less than 30). The height of an expanded sub-row cell will be 200px. -The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the look and feel of the drag panel that appears when the drag-n-drop functionality is activated. Check the details below. +#### Adding sub-rows for specific rows -![](../assets/grid/dragpanel_module.png) +You can define which row a sub-row should be created for with the help of the `height` property of the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration option. If you don't want to create sub-rows for particular rows, specify the `height:0` setting in the `subRowConfig` property. -To initialize the `DragPanel` module, you should enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration together with the [row Drag-and-Drop](#drag-n-drop) functionality (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties). For example: +:::note +The described functionality works only if the `subRowConfig` property is initialized as a callback function. +::: -~~~jsx {10-11} +~~~jsx {7-10} const grid = new dhx.Grid("grid_container", { columns: [ - { id: "a", header: [{ text: "A" }] }, - { id: "b", header: [{ text: "B" }] }, - ], - data: [ - { id: "1", a: "A1", b: "B1" }, - { id: "2", a: "A2", b: "B2" }, + // columns config ], - dragItem: "row", // enables row Drag-and-Drop - dragPanel: true // enables the DragPanel module -}); -~~~ - -**Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) - -The module is also automatically enabled if the [row Drag-and-Drop](#drag-n-drop) functionality is activated -(e.g. via the `dragItem: "row"` or `dragItem: "both"` properties) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. + data: dataset, + autoWidth: true, + subRowConfig: (row) => ({ + height: row.data.length ? 250 : 0, + expanded: true + }), + subRow: (row) => new dhx.Grid(null, { + columns: [ + // columns config + ], + data: row.data + }), +}); +~~~ -The following example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: +![](../assets/grid/subgrid_specific_rows.png) -~~~jsx {10-11} +In the above example the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) config set as a callback function defines that sub-rows with the height 250px will be created for rows that have some data. For rows without data the `height:0` setting is specified, so sub-rows won't be created for these rows. + +**Related sample:** [Grid. Row expander. Subgrid only in specific rows](https://snippet.dhtmlx.com/03udbtmr) + +### Saving state of nested components or data in sub-rows + +You can save the state of the nested components or the data of sub-rows while updating data, scrolling or collapsing sub-rows by using the `preserve` property of the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration option of Grid. By default, sub-rows are destroyed when they are hidden (e.g. if a row leaves the visible area during scrolling) or collapsed, which leads to resetting of any changes made in the inner components. + +When the `preserve: true` setting is specified, sub-rows aren't destroyed when hidden or collapsed and their content is saved. It means that any change (such as sorting, data input or state change) is saved and the sub-row is restored in the same state when displayed again. + +:::info note +It's important to take into account that the `preserve: true` setting increases the size of the used memory, since the sub-rows data are kept in the memory even when they aren't displayed. +::: + +#### When using `preserve` is useful + +- When the data of sub-rows should be interactive. It means when a sub-row contains a form or any other component the content of which can be changed by a user and the changes shouldn't be reset +- For complex sub-rows with a state. For example, if a sub-row renders a component with a dynamic content and a complex user interface + +#### When `preserve` shouldn't be used + +- When sub-rows are used just for rendering static information. If a sub-row presents a simple text or a static HTML, the use of `preserve` is not rational +- In case a large amount of data is used. If a grid has a lot of rows and sub-rows, using `preserve` may increase the size of the used memory, which will affect the performance + +In the example below the `preserve` config is used to save the context of the Form nested in a sub-row: + +~~~jsx {7-9} const grid = new dhx.Grid("grid_container", { columns: [ - { id: "a", header: [{ text: "A" }] }, - { id: "b", header: [{ text: "B" }] }, - ], - data: [ - { id: "1", a: "A1", b: "B1" }, - { id: "2", a: "A2", b: "B2" }, + { id: "name", header: [{ text: "Name" }] }, + { id: "age", header: [{ text: "Age" }] }, ], - dragItem: "row", // enables row Drag-and-Drop - blockSelection: true // triggers DragPanel activation + data: dataset, + subRowConfig: { + preserve: true, // saves the state of sub-rows + }, + subRow: (row) => { + return new dhx.Form(null, { + rows: [ + { type: "input", name: "details", label: "Details", value: row.details }, + ], + }); + }, }); ~~~ -You can specify additional configuration options for the `DragPanel` module while initializing the component. For this, you need to set the `dragPanel` property as an *object*. The following options are available: - - `css` - (*string*) specifies a custom CSS class for styling the drag panel - - `icon` - (*string*) defines a custom icon for the drag handle - - `width` - (*number*) sets the width of the drag panel in pixels - -The following example demonstrates configuring the `DragPanel` module with custom styling and width: +### Loading data into a sub-row -~~~html - +You can dynamically load data into a sub-row using the `load()` method of [DataCollection](/data_collection/) or [TreeCollection](/tree_collection/), depending on the nested component: - ~~~ -## Keyboard Navigation - -DHTMLX Grid provides the keyboard navigation that will help you manipulate your grid faster. +In the above example the `load()` method of [DataCollection](/data_collection/) is used for loading data into a nested Grid. -### Default shortcut keys +**Related sample:** [Grid. Row expander. Subgrid data loading](https://snippet.dhtmlx.com/03ndqrqt) -There are four navigation keys that Grid enables by default: +### Handling events - - - - - - - - - - - - - - - - - - - - - - - -
PageUpscroll Grid up to the height of the visible content (without change of the selected cell)
PageDownscroll Grid down to the height of the visible content (without change of the selected cell)
Homenavigate to the beginning of the Grid content (without change of the selected cell)
Endnavigate to the end of the Grid content (without change of the selected cell)
Ctrl+Enterexpands/collapses the parent item in the TreeGrid mode
+#### Grid event handlers -If you need to disable this functionality, set the [`keyNavigation`](grid/api/grid_keynavigation_config.md) property to *false*. +If a sub-row initializes a nested component (any Suite component), the sub-component's events can be set in the [`subRow`](grid/api/grid_subrow_config.md) callback function. It allows specifying event handlers directly for the nested component: -~~~jsx +~~~jsx {16-18} const grid = new dhx.Grid("grid_container", { columns: [ - // columns config + { width: 200, id: "zone_name", header: [{ text: "Zone Name" }] }, + { width: 150, id: "temperature", header: [{ text: "Temperature" }] }, ], data: dataset, - keyNavigation: false + subRow: ({ zone_name }) => { + const subGrid = new dhx.Grid(null, { + columns: [ + { id: "animal", header: [{ text: "Animal" }] }, + { id: "count", header: [{ text: "Count" }] }, + ], + data: zooMap[zone_name], + }); + + subGrid.events.on("cellClick", (row, column) => { + console.log(`${row} ${column}`); + }); + + return subGrid; + }, }); ~~~ -**Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) +**Related sample:** [Grid. Row expander. Subgrid events handling](https://snippet.dhtmlx.com/3364si14) -### Arrow shortcut keys +#### HTML template event handlers -In case you want to enable the arrow keys that allow moving the selection between cells, you need to specify the [`selection`](grid/api/grid_selection_config.md) property for Grid. +To specify the event handlers for a sub-row with an HTML content, use the [`eventHandlers`](grid/api/grid_eventhandlers_config.md) configuration option of Grid: -~~~jsx {6} +~~~jsx {13-20} const grid = new dhx.Grid("grid_container", { columns: [ - // columns config + { width: 200, id: "name", header: [{ text: "Name" }] }, + { width: 150, id: "details", header: [{ text: "Details" }] }, ], data: dataset, - selection: "complex", - keyNavigation: true // true - by default + subRow: (row) => ` +
+

Details for ${row.name}

+ +
+ `, + eventHandlers: { + onclick: { + // the button click event in a sub-row + subrow_button: (event, data) => { + console.log(`A button click in the row ${data.row.id}`); // subRow id + } + }, + } }); ~~~ -**Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) +### Multi-level Grid nesting -The list of the arrow shortcut keys: +It is possible to create as many levels of nested subgrids, as necessary. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ArrowUpmove selection to the previous vertical cell
ArrowDownmove selection to the next vertical cell
ArrowLeftmove selection to the previous horizontal cell
ArrowRightmove selection to the next horizontal cell
Ctrl+ArrowUpmove selection to the first vertical cell
Ctrl+ArrowDownmove selection to the last vertical cell
Ctrl+ArrowLeft move selection to the first horizontal cell
Ctrl+ArrowRight move selection to the last horizontal cell
Tab move selection to the next horizontal cell or the first cell of the next row
Shit+Tab move selection to the previous horizontal cell or to the first cell of the previous row
+![](../assets/grid/multi_level_nesting.png) -The arrow shortcut keys listed below do not work when the `selection` property is set to *"complex"*. Use another mode (*"cell" or "row"*) in case you want to activate these navigation keys: +To specify the structure of a multi-level Grid nesting, do the following: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Shift+ArrowUpmove selection to the previous vertical cell with the change of the selected cells
Shift+ArrowDownmove selection to the next vertical cell with the change of the selected cells
Shift+ArrowLeftmove selection to the previous horizontal cell with the change of the selected cells
Shift+ArrowRightmove selection to the next horizontal cell with the change of the selected cells
Ctrl+Shift+ArrowUpmove selection to the first vertical cell with the change of the selected cells
Ctrl+Shift+ArrowDownmove selection to the last vertical cell with the change of the selected cells
Ctrl+Shift+ArrowLeftmove selection to the first horizontal cell with the change of the selected cells
Ctrl+Shift+ArrowRightmove selection to the last horizontal cell with the change of the selected cells
+- create a Grid with columns and data +- in the Grid configuration specify the [`subRow`](grid/api/grid_subrow_config.md) option as a callback function, which: + - returns a nested Grid that contains the `subRow` config set as a callback function that may return: + - some Suite component + - HTML as string + - a subgrid instance for another nesting level (that contains the `subRow` config set as a callback function to return another subgrid, a Suite component, or HTML content) -### Shortcut keys for editing +Check the example below: -It is also possible to use shortcut keys for editing a cell in Grid by setting [`editable:true`](grid/api/grid_editable_config.md) property in the configuration object of Grid. +~~~jsx {12,24,36} +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "col_1", header: [{ text: "Grid. Level 1" }] }, + { id: "col_2", header: [{ text: "Second Column" }] }, + ], + data: dataset, + autoWidth: true, + subRowConfig: (row) => ({ + height: 300, + expanded: row.col_1 === "Row 1", + }), + subRow: ({ data }) => { + return new dhx.Grid(null, { + columns: [ + { id: "col_1", header: [{ text: "Grid. Level 2" }] }, + { id: "col_2", header: [{ text: "Second Column" }] }, + ], + data, + autoWidth: true, + subRowConfig: (row) => ({ + height: 300, + expanded: row.col_1 === "Row 1", + }), + subRow: ({ data }) => { + return new dhx.Grid(null, { + columns: [ + { id: "col_1", header: [{ text: "Grid. Level 3" }] }, + { id: "col_2", header: [{ text: "Second Column" }] }, + ], + data, + autoWidth: true, + subRowConfig: (row) => ({ + height: 300, + expanded: row.col_1 === "Row 1", + }), + subRow: () => (`Subrow. Level 4`), + }) + }, + }) + }, +}); +~~~ -~~~jsx {7} +**Related sample:** [Grid. Row expander. Subgrid with rows expanded by criteria](https://snippet.dhtmlx.com/dih3z7cz) + +### Adjusting sub-row width + +You can adjust the sub-row width depending on the width of its parent Grid via the `fullWidth` property of the [`subRowConfig`](grid/api/grid_subrowconfig_config.md) configuration object. + +:::info note +The `fullWidth` property works only if the `subRowConfig` property is initialized as an object. +::: + +If the `fullWidth: true` configuration option is specified, the sub-row width is the same as the full width of the Grid content, including the area outside the visible area borders (it means that the sub-row will be scrolled together with the horizontal scroll). By default, a sub-row takes just the width of the visible Grid area. + +Check the example below: + +~~~jsx {12-14} const grid = new dhx.Grid("grid_container", { + width: 400, columns: [ - // columns config + { id: "name", header: [{ text: "Name" }], width: 150 }, + { id: "value", header: [{ text: "Value" }], width: 150 }, + { id: "description", header: [{ text: "Description" }], width: 300 }, ], data: dataset, - selection: "complex", - editable: true, - keyNavigation: true // true - by default + subRow: (row) => { + return `
Details for ${row.name}
`; + }, + subRowConfig: { + fullWidth: true, // makes the sub-row width equal to the Grid content width + }, }); ~~~ -**Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) +In the above example: -The list of the shortcut keys for editing: +- the width of the Grid container is set as 400px +- if the `fullWidth` config isn't enabled, the sub-row width will be equal to the Grid width (400px) +- the common width of all the columns is 600px, thus if the `fullWidth: true` setting is specified, the sub-row width will be equal to 600px + +### Getting sub-row config and content + +You can get the configuration settings applied to a sub-row and the content inside it using the [`getSubRow()`](grid/api/grid_getsubrow_method.md) method. + +:::info +Note that the method works if a sub-row is in the visible area or if the `preserve:true` property is specified in the `subRowConfig` object of the sub-row. +::: + +The method takes as a parameter the id of a row and returns an object that includes the following properties: + + + + - - + + - - + + - - + + - -
css(string) user-defined CSS classes for a sub-row
Enteropen the editor in the selected cell. If the editor is currently opened - close the editor and save changeselement(HTMLElement | null) the parent container of the current sub-row
Escapeclose the editor of the selected cell without savingexpanded(boolean) defines whether a sub-row is expanded by default, false by default
Deleteclears data in the selected cells. Works only with the `BlockSelection` module in the "range" modefullWidth(boolean) defines whether a sub-row will take all the width of Grid, false by default
- -## Selection - -DHTMLX Grid includes the selection feature that allows highlighting Grid elements depending on the chosen mode. The [`selection`](grid/api/grid_selection_config.md) property enables selection in a grid. It can take three values: - - - - - + + - - + + - - + + + + + + + + + +
rowto move selection between Grid rowsheight(number) the height of a sub-row in pixels, 200 by default
cellto move selection between Grid cellspadding(string | number) the inner padding of a sub-row, 8 by default
complexto highlight both a selected cell and the row it belongs topreserve(boolean) saves the state of sub-rows while expanding/collapsing, disappearing from the visible area, data updating, false by default
toggleIcon(boolean) enables the icon for expanding/collapsing, true by default
view(string | object | null) that can be presented by:
  • a string, if the sub-row is set by the HTML content
  • an object instance to interact with, if a sub-row is an instance of a nested component (for example, Grid)
  • null, if the sub-row is unavailable (for example, it is hidden or placed outside the visible area and the `preserve` config is not specified)
-
-~~~jsx +## Drag-n-drop + +The drag-n-drop functionality allows you to reorder one or several rows or columns inside the grid or between several grids. + +:::tip Pro version only +If you use the GPL version of DHTMLX Grid (or DHTMLX Suite), you will be able to reorder only rows and only one by one. + +**Note**, to be able to drag-n-drop a column and (or) multiple rows, you need to use PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +![](../assets/grid/dnd_treegrid_mode.png) + +**Related sample**: [Grid. Drag-and-Drop in TreeGrid mode](https://snippet.dhtmlx.com/0tuk0y5f) + +### Drag-n-drop inside the grid + +It is possible to reorder a row or column of Grid by drag and drop. To enable the functionality, define the [`dragItem: "both"`](grid/api/grid_dragitem_config.md) property in the configuration object of Grid: + +~~~jsx {5} const grid = new dhx.Grid("grid_container", { columns: [ // columns config ], - selection: "complex", + dragItem: "both", data: dataset }); ~~~ -**Related sample**: [Grid. Selection](https://snippet.dhtmlx.com/ad6roqsx) +**Related sample**: [Grid. Drag-n-drop](https://snippet.dhtmlx.com/zwc91d50) -### Multiple selection of Grid cells +:::note +To activate the functionality for columns or rows separately, use `dragItem: "column"` or `dragItem: "row"` respectively. +::: -While setting the [`selection`](grid/configuration.md#selection) property to *"row"*, *"cell"*, or *"complex"* value, you can enable the [](grid/api/grid_multiselection_config.md) property to allow a user to select multiple Grid elements: +If needed, you can disable the drag-n-drop functionality for a separate column via the `draggable` configuration option of the column: -~~~jsx +~~~jsx {5,8} const grid = new dhx.Grid("grid_container", { columns: [ - // columns config + { width: 200, id: "country", header: [{ text: "Country" }]}, + { width: 150, id: "land", header: [{ text: "Land" }] }, + { width: 150, id: "density", header: [{ text: "Density" }], draggable: false } ], - multiselection: true, - selection: "row", - data: dataset + data: dataset, + dragItem: "column", }); ~~~ -**Related sample**: [Grid. Multiselection](https://snippet.dhtmlx.com/4nj0e9ye) - -Since the `multiselection` configuration option is set to *true*, using the "Ctrl + Click" combination allows selecting the desired cells or rows. -A range of Grid cells/rows can be selected by clicking the first element to select and then, while holding down the Shift key, clicking the last element to select. - -## Managing range selection in Grid - -:::tip Pro version only -This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +:::tip +To make the process of work with drag and drop more flexible, you can apply the related drag-n-drop events of Grid for [columns](grid/api/api_overview.md#column-drag-and-drop) and [rows](grid/api/api_overview.md/#row-drag-and-drop). ::: -The Grid functionality provides the [range selection management](grid/usage_rangeselection.md) feature for setting/resetting a range of cells, retrieving information about the current range, and checking whether specific cells belong to the selected range. +### Drag-n-drop between grids -To enable [range selection management](grid/usage_rangeselection.md) within a grid, you should use the `RangeSelection` module. To initialize the module, enable the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration: +DHTMLX Grid supports drag-n-drop of rows/columns between grids in several modes. To begin with, you should specify the [dragMode](grid/api/grid_dragmode_config.md) property in the configuration object of Grid. Then define which mode you need: -~~~jsx -const grid = new dhx.Grid("grid_container", { +- "target" - a grid takes a row/column from other grids, while its row/colmn can't be dragged out of it +- "source" - a grid allows dragging its row/column out and can't take a row/column from other grids +- "both" - a grid both takes a row/column from other grids and allows dragging its row/column out as well + +~~~jsx {7} +const grid = new dhx.Grid("grid_container", { columns: [ - { id: "a", header: [{ text: "A" }] }, - { id: "b", header: [{ text: "B" }] }, - ], - data: [ - { id: "1", a: "A1", b: "B1" }, - { id: "2", a: "A2", b: "B2" }, + { id: "country", header: [{ text: "Country" }] }, + { id: "population", header: [{ text: "Population" }] } ], - rangeSelection: true // enables the RangeSelection module + data: dataset, + dragMode: "source", + // dragItem: "column" - allows reordering columns one by one }); ~~~ -The `rangeSelection` property can be set in two ways: +**Related sample**: [Grid. Drag-n-drop between grids](https://snippet.dhtmlx.com/qx9a86ax) -- as a *boolean* value it enables or disables the range selection module upon the component initialization -- as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: - - `disabled` - (*boolean*) makes the module inactive upon initialization of the component +### Drag-n-drop of multiple rows -The example below demonstrates interaction with the RangeSelection module's API when range selection is configured to be inactive on the component initialization. +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +To allow a user to drag-n-drop multiple rows at once, you need to enable [multiselection](#multiple-selection-of-grid-cells) of rows when configuring drag-n-drop. For example: + +~~~jsx +const grid = new dhx.Grid("grid", { + columns: [ + // columns config + ], + data: data, + selection: "row", + //drag-n-drop rows inside the grid + multiselection: true, + dragItem: "both" // or dragItem: "row" +}); +~~~ + +**Related sample**: [Grid. Drag-n-drop](https://snippet.dhtmlx.com/zwc91d50) + +or + +~~~jsx +const grid = new dhx.Grid("grid", { + columns: [ + // columns config + ], + data: dataset, + selection: "row", + //drag-n-drop rows between grids + multiselection: true, + dragMode: "both" // or dragMode: "source" +}); +~~~ + +### Adjusting DragPanel module + +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the look and feel of the drag panel that appears when the drag-n-drop functionality is activated. Check the details below. + +![](../assets/grid/dragpanel_module.png) + +To initialize the `DragPanel` module, you should enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration together with the [row Drag-and-Drop](#drag-n-drop) functionality (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties). For example: + +~~~jsx {10-11} +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragItem: "row", // enables row Drag-and-Drop + dragPanel: true // enables the DragPanel module +}); +~~~ + +**Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) + +The module is also automatically enabled if the [row Drag-and-Drop](#drag-n-drop) functionality is activated +(e.g. via the `dragItem: "row"` or `dragItem: "both"` properties) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. + +The following example demonstrates enabling the `DragPanel` module with row Drag-and-Drop and the `BlockSelection` module: + +~~~jsx {10-11} +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + dragItem: "row", // enables row Drag-and-Drop + blockSelection: true // triggers DragPanel activation +}); +~~~ + +You can specify additional configuration options for the `DragPanel` module while initializing the component. For this, you need to set the `dragPanel` property as an *object*. The following options are available: + - `css` - (*string*) specifies a custom CSS class for styling the drag panel + - `icon` - (*string*) defines a custom icon for the drag handle + - `width` - (*number*) sets the width of the drag panel in pixels + +The following example demonstrates configuring the `DragPanel` module with custom styling and width: + +~~~html + + + +~~~ + +## Selection + +DHTMLX Grid includes the selection feature that allows highlighting Grid elements depending on the chosen mode. The [`selection`](grid/api/grid_selection_config.md) property enables selection in a grid. It can take three values: + + + + + + + + + + + + + + + + +
rowto move selection between Grid rows
cellto move selection between Grid cells
complexto highlight both a selected cell and the row it belongs to
+
+ +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + // columns config + ], + selection: "complex", + data: dataset +}); +~~~ + +**Related sample**: [Grid. Selection](https://snippet.dhtmlx.com/ad6roqsx) + +### Multiple selection of Grid cells + +While setting the [`selection`](grid/configuration.md#selection) property to *"row"*, *"cell"*, or *"complex"* value, you can enable the [](grid/api/grid_multiselection_config.md) property to allow a user to select multiple Grid elements: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + // columns config + ], + multiselection: true, + selection: "row", + data: dataset +}); +~~~ + +**Related sample**: [Grid. Multiselection](https://snippet.dhtmlx.com/4nj0e9ye) + +Since the `multiselection` configuration option is set to *true*, using the "Ctrl + Click" combination allows selecting the desired cells or rows. +A range of Grid cells/rows can be selected by clicking the first element to select and then, while holding down the Shift key, clicking the last element to select. + +## Managing range selection in Grid + +:::tip Pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + +The Grid functionality provides the [range selection management](grid/usage_rangeselection.md) feature for setting/resetting a range of cells, retrieving information about the current range, and checking whether specific cells belong to the selected range. + +To enable [range selection management](grid/usage_rangeselection.md) within a grid, you should use the `RangeSelection` module. To initialize the module, enable the [`rangeSelection`](grid/api/grid_rangeselection_config.md) property in the Grid configuration: + +~~~jsx +const grid = new dhx.Grid("grid_container", { + columns: [ + { id: "a", header: [{ text: "A" }] }, + { id: "b", header: [{ text: "B" }] }, + ], + data: [ + { id: "1", a: "A1", b: "B1" }, + { id: "2", a: "A2", b: "B2" }, + ], + rangeSelection: true // enables the RangeSelection module +}); +~~~ + +The `rangeSelection` property can be set in two ways: + +- as a *boolean* value it enables or disables the range selection module upon the component initialization +- as an *object* it enables the module and allows setting additional configuration options during the component initialization. The following options are available: + - `disabled` - (*boolean*) makes the module inactive upon initialization of the component + +The example below demonstrates interaction with the RangeSelection module's API when range selection is configured to be inactive on the component initialization. ~~~jsx {11,15} const grid = new dhx.Grid("grid_container", { @@ -2774,390 +2974,207 @@ grid.history.enable(); // enabling the module For information on working with the History API, read the [Work with History module](grid/usage_history.md) guide. -## Spans +## Keyboard navigation -The Grid component has the [`spans`](grid/api/grid_spans_config.md) property that allows you to specify all necessary columns and rows spans right through the initial configuration. It represents an array with spans objects. +DHTMLX Grid provides the keyboard navigation that will help you manipulate your grid faster. + +### Default shortcut keys + +There are four navigation keys that Grid enables by default: + + + + + + + + + + + + + + + + + + + + + + + + +
PageUpscroll Grid up to the height of the visible content (without change of the selected cell)
PageDownscroll Grid down to the height of the visible content (without change of the selected cell)
Homenavigate to the beginning of the Grid content (without change of the selected cell)
Endnavigate to the end of the Grid content (without change of the selected cell)
Ctrl+Enterexpands/collapses the parent item in the TreeGrid mode
+ +If you need to disable this functionality, set the [`keyNavigation`](grid/api/grid_keynavigation_config.md) property to *false*. ~~~jsx const grid = new dhx.Grid("grid_container", { - columns: [ + columns: [ // columns config ], - spans: [ - {row:"0", column:"a", rowspan:5 }, - {row:"0", column:"b", rowspan:9, text:"

Some content here

"}, - {row:"0", column:"c", colspan:2, text:"Some content"}, - {row:"10", column:"a", colspan:4, text:"Some header", css:"myCustomColspan"} - ], - data: dataset + data: dataset, + keyNavigation: false }); ~~~ -Each span object contains the following properties: +**Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) -- `row` - (*string | number*) obligatory, the id of a row -- `column` - (*string|number*) obligatory, the id of a column -- `rowspan` - (*number*) optional, the number of rows in a span -- `colspan` - (*number*) optional, the number of columns in a span -- `text` - (*string|number*) optional, the content of a span. You can specify the text of the column span via the `text` property. It can be set either as a *string* or a *callback function* which is called with the following parameter: - - `content` - an object with the content of the span tooltip that contains the calculated values of the `summary` property, set as *key:value* pairs where: - - the *key* is either the key defined in the list or the functor name - - the *value* can be a *string*, *number* or *null* - -The calculated values are taken from the [`summary`](grid/api/grid_summary_config.md) config option of the component and the [`summary`](grid/api/api_gridcolumn_properties.md) config option of a column. - -:::note -In case key names in the `summary` configs are the same, values are taken from the column's configuration option. -::: - -:::info important -If the value of a spanned cell is initialized with the `text` property set as a *callback function*, the cell content can't be edited. -::: - -~~~jsx {17} -const grid = new dhx.Grid("grid_container", { - columns: [ - { width: 200, id: "country", header: [{ text: "Country" }] }, - { - width: 150, - id: "population", - header: [{ text: "Population" }], - summary: "count" - } - ], - summary: { totalPopulation: ["population", "sum"] }, - spans: [ - { - row: "rowid", - column: "population", - rowspan: 9, - text: ({ count }) => ("Count population:" + count) - }, - ], - data: dataset -}); -~~~ - -- `css` - (*string*) optional, the name of a CSS class applied to a span -- [`tooltip`](#column-and-spans-tooltips) - (*boolean|object*) optional, enables a tooltip on hovering over the content of a span, or sets the configuration object with the tooltip settings; *true* by default. When set as an object, the `tooltip` config can have the following properties: - - `force` - (optional) forces opening of a tooltip; if set to true, the `showDelay` and `hideDelay` settings are ignored, *false* by default - - `showDelay` - (optional) the time period that should pass before showing a tooltip, in ms - - `hideDelay` - (optional) the time period that should pass before hiding a tooltip, in ms - - `margin` - (optional) the margin between the node and tooltip - - `position` - (optional) the position of a tooltip: *"right"*, *"bottom"*, *"center"*, *"left"*, *"top"*; *"bottom"* by default - - `css` - (optional) the style of a tooltip box - -~~~jsx -const grid = new dhx.Grid("grid_container", { - columns: [ - // columns config - ], - spans: [ - {row:"0", column:"a", rowspan:5 }, - {row:"0", column:"b", rowspan:9, text:"

Some content here

"}, - {row:"0", column:"c", colspan:2, text:"Some content"}, - {row:"10", column:"a", colspan:4, text:"Some header", css:"myCustomColspan"} - ], - data: dataset -}); -~~~ - -- [`tooltipTemplate`](#adding-templates-for-column-and-spans-tooltip) - (*function*) sets a template for the span tooltip. The value of the `tooltipTemplate` property is a callback function which is called with the following parameters: - - `content` - an object with the content of the span tooltip. Contains two properties which are available either from the component's or from the column's configuration: - - `value` - the value rendered in a cell, including the applied templates - - an object with the calculated values of the `summary` property, set as *key:value* pairs where: - - the *key* is either the key defined in the list or the functor name - - the *value* can be a *string*, *number* or *null* - - `span` - the object of the column span - -~~~jsx {17-18} -const grid = new dhx.Grid("grid_container", { - columns: [ - { width: 200, id: "country", header: [{ text: "Country" }] }, - { - width: 150, - id: "population", - header: [{ text: "Population" }], - summary: "count" - } - ], - summary: { totalPopulation: ["population", "sum"] }, - spans: [ - { - row: "rowid", - column: "population", - rowspan: 9, - text: "Some text", - tooltipTemplate: ({ value, count }) => (`value: ${value}; count: ${count}`), - }, - ], - data: dataset -}); -~~~ - -**Related sample**: [Grid. Grouped cells (spans)](https://snippet.dhtmlx.com/1775dwbl) - -**Note**, that if both the `spans` and [`leftSplit`](grid/api/grid_leftsplit_config.md) properties are set in the Grid config, the following rules will be applied: - -- All necessary columns or rows will be in a span if the `spans` property is set for the columns located within the frozen area. -- If the `spans` property is set for a number of columns or rows placed as in the frozen part as in the movable one, then the columns remained in the movable part only will be in a span. - -## Tooltip - -### Grid tooltips - -The default configuration of Grid provides tooltips that are rendered when a user hovers over the content of a column's cell. All the tooltips can be controlled via the [](grid/api/grid_tooltip_config.md) configuration property of Grid. By default, the tooltips are enabled. You can disable them, by setting the config to *false*: - -~~~jsx -const grid = new dhx.Grid("grid_container", { - columns: [ - //columns config - ], - data: dataset, - tooltip: false -}); -~~~ - -**Related sample**: [Grid. Hiding tooltips](https://snippet.dhtmlx.com/mq4t3t3w) - -The `tooltip` configuration option can be set as an object with the following properties: - -- `force` - (optional) forces opening of a tooltip; if set to true, the `showDelay` and `hideDelay` settings are ignored, *false* by default -- `showDelay` - (optional) the time period that should pass before showing a tooltip, in ms -- `hideDelay` - (optional) the time period that should pass before hiding a tooltip, in ms -- `margin` - (optional) the margin between the node and tooltip -- `position` - (optional) the position of a tooltip: *"right"*, *"bottom"*, *"center"*, *"left"*, *"top"*; *"bottom"* by default -- `css` - (optional) the style of a tooltip box - -~~~jsx {6-8} -const grid = new dhx.Grid("grid_container", { - columns: [ - // columns config - ], - data: dataset, - tooltip: { - force: true - } -}); -~~~ - -**Related sample**: [Grid. Tooltip config](https://snippet.dhtmlx.com/qpqnalyt) +### Arrow shortcut keys -It is also possible to control the header and footer tooltips, independently. There are the [`headerTooltip`](grid/api/grid_headertooltip_config.md) and [`footerTooltip`](grid/api/grid_footertooltip_config.md) Grid configuration properties, that you can use for this purpose: +In case you want to enable the arrow keys that allow moving the selection between cells, you need to specify the [`selection`](grid/api/grid_selection_config.md) property for Grid. -~~~jsx {7-8} +~~~jsx {6} const grid = new dhx.Grid("grid_container", { columns: [ // columns config ], data: dataset, - tooltip: false, // Disable all tooltips - headerTooltip: true, // Enable all header tooltips - footerTooltip: true, // Enable all footer tooltips -}); -~~~ - -The `headerTooltip` and `footerTooltip` configs can be specified as objects the same as the main [`tooltip`](grid/configuration.md#grid-tooltips) config. - -### Column and spans tooltips - -There is a possibility to enable/disable tooltips for separate columns or spans by using the `tooltip` option in the configuration object of the [`columns`](grid/configuration.md#columns) or [`spans`](grid/configuration.md#spans) accordingly: - -~~~jsx {3,7,10} -const grid = new dhx.Grid("grid_container", { - columns: [ - { width: 200, id: "country", header: [{ text: "Country" }], tooltip: true }, - { width: 150, id: "population", header: [{ text: "Population" }] }, - ], - spans: [ - { row: "1", column: "country", rowspan: 5, tooltip: true }, - ], - data: dataset, - tooltip: false -}); -~~~ - -The same as with the common Grid tooltips, column and span tooltips can be set as objects with the following properties: - -- `force` - (optional) forces opening of a tooltip; if set to true, the `showDelay` and `hideDelay` settings are ignored, *false* by default -- `showDelay` - (optional) the time period that should pass before showing a tooltip, in ms -- `hideDelay` - (optional) the time period that should pass before hiding a tooltip, in ms -- `margin` - (optional) the margin between the node and tooltip; *8px* by default -- `position` - (optional) the position of a tooltip: *"right"*, *"bottom"*, *"center"*, *"left"*, *"top"*; *"bottom"* by default -- `css` - (optional) the style of a tooltip box - -~~~jsx {3,7,10} -const grid = new dhx.Grid("grid_container", { - columns: [ - { width: 200, id: "country", header: [{ text: "Country" }], tooltip: { force: true } }, - { width: 150, id: "population", header: [{ text: "Population" }] }, - ], - spans: [ - { row: "1", column: "country", rowspan: 5, tooltip: { force: true } }, - ], - data: dataset, - tooltip: false + selection: "complex", + keyNavigation: true // true - by default }); ~~~ -#### Adding templates for column and spans tooltip - -You can add a template for a column or spans tooltip. - -- to set a template for a column tooltip use a function which takes 3 parameters: - - `value` - (required) the value of a cell - - `row` - (required) an object with all cells in a row - - `column` - (required) an object with the configuration of a column - -Returning *false* from the function will block showing of the tooltip. +**Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) -~~~jsx {6-8} -const grid = new dhx.Grid("grid_container", { - columns: [ - { - width: 200, id: "country", header: [{ text: "Country" }], align: "left", - htmlEnable: true, - tooltipTemplate: function (value, row, column) { - // the template logic - } - }, - { width: 150, id: "population", header: [{ text: "Population" }] }, - { width: 150, id: "yearlyChange", header: [{ text: "Yearly Change" }] }, - // more options - ], - data: dataset -}); -~~~ +The list of the arrow shortcut keys: -You can [check an example of applying a template for a column tooltip](grid/customization.md#adding-template-to-tooltip). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArrowUpmove selection to the previous vertical cell
ArrowDownmove selection to the next vertical cell
ArrowLeftmove selection to the previous horizontal cell
ArrowRightmove selection to the next horizontal cell
Ctrl+ArrowUpmove selection to the first vertical cell
Ctrl+ArrowDownmove selection to the last vertical cell
Ctrl+ArrowLeft move selection to the first horizontal cell
Ctrl+ArrowRight move selection to the last horizontal cell
Tab move selection to the next horizontal cell or the first cell of the next row
Shit+Tab move selection to the previous horizontal cell or to the first cell of the previous row
-- to set a template for a spans tooltip use the `tooltipTemplate` configuration property. The value of the `tooltipTemplate` property is a callback function which is called with the following parameters: - - `content` - an object with the content of the span tooltip. Contains two properties which are available either from the component's or from the column's configuration: - - `value` - the value rendered in a cell, including the applied templates - - an object with the calculated values of the `summary` property, set as *key:value* pairs where: - - the *key* is either the key defined in the list or the functor name - - the *value* can be a *string*, *number* or *null* - - `span` - the object of the column span +The arrow shortcut keys listed below do not work when the `selection` property is set to *"complex"*. Use another mode (*"cell" or "row"*) in case you want to activate these navigation keys: -~~~jsx {18} -const grid = new dhx.Grid("grid_container", { - columns: [ - { width: 200, id: "country", header: [{ text: "Country" }] }, - { - width: 150, - id: "population", - header: [{ text: "Population" }], - summary: "count" - } - ], - summary: { totalPopulation: ["population", "sum"] }, - spans: [ - { - row: "rowid", - column: "population", - rowspan: 9, - text: "Some text", - tooltipTemplate: ({ value, count }) => (`value: ${value}; count: ${count}`), - }, - ], - data: dataset -}); -~~~ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Shift+ArrowUpmove selection to the previous vertical cell with the change of the selected cells
Shift+ArrowDownmove selection to the next vertical cell with the change of the selected cells
Shift+ArrowLeftmove selection to the previous horizontal cell with the change of the selected cells
Shift+ArrowRightmove selection to the next horizontal cell with the change of the selected cells
Ctrl+Shift+ArrowUpmove selection to the first vertical cell with the change of the selected cells
Ctrl+Shift+ArrowDownmove selection to the last vertical cell with the change of the selected cells
Ctrl+Shift+ArrowLeftmove selection to the first horizontal cell with the change of the selected cells
Ctrl+Shift+ArrowRightmove selection to the last horizontal cell with the change of the selected cells
-#### Column header/footer tooltip +### Shortcut keys for editing -The tooltip set for a column enables/disables all its tooltips. However, you can control the tooltips of the column header/footer separately, by specifying the `tooltip` property in the corresponding header/footer object inside the column: +It is also possible to use shortcut keys for editing a cell in Grid by setting [`editable:true`](grid/api/grid_editable_config.md) property in the configuration object of Grid. -~~~jsx {4} +~~~jsx {7} const grid = new dhx.Grid("grid_container", { columns: [ - // Enables a tooltip for the country title - { id: "country", header: [{ text: "Country", tooltip: true }] }, - { id: "population", header: [{ text: "Population" }] }, - // more columns + // columns config ], data: dataset, - tooltip: false, + selection: "complex", + editable: true, + keyNavigation: true // true - by default }); ~~~ -What is more, you can specify a necessary template for the header/footer tooltip via the `tooltipTemplate` configuration property. The value of the `tooltipTemplate` property is a callback -function which is called with the following parameters: - -- `content` - an object with the content of the header/footer tooltip. Contains two properties which are available either from the component's or from the column's configuration: - - `value` - (*string*) the value rendered in a cell, including the applied templates - - an object with the calculated values of the `summary` property, set as *key:value* pairs where: - - the *key* is either the key defined in the list or the functor name - - the *value* can be a *string*, *number* or *null* -- `header/footer` - (*object*) the object of the column header/footer -- `column` - (*object*) the object of a column +**Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) -and returns a string with the tooltip template for the header/footer or *false* to disable a tooltip. +The list of the shortcut keys for editing: -~~~jsx {9} -const grid = new dhx.Grid("grid_container", { - columns: [ - { - width: 150, - id: "population", - header: [ - { - text: "Population", - tooltipTemplate: ({ totalPopulation, count }) => `Total: ${totalPopulation}, Count: ${ count }` - } - ], - summary: "count" - } - // more columns - ], - summary: { totalPopulation: ["population", "sum"] }, - data: dataset -~~~ + + + + + + + + + + + + + + + +
Enteropen the editor in the selected cell. If the editor is currently opened - close the editor and save changes
Escapeclose the editor of the selected cell without saving
Deleteclears data in the selected cells. Works only with the `BlockSelection` module in the "range" mode
-**Related sample**: [Grid. Header/footer tooltip](https://snippet.dhtmlx.com/fgstf2mq) +### Selecting ranges of cells -#### Tooltips for filters +If you need to use the keyboard navigation for selecting ranges of cells via the user interface, you should enable the [`BlockSelection`](grid/usage_blockselection.md) module in the Grid configuration. -You can provide a tooltip template for the header content of any type, which allows showing tooltips for filters. +:::note +Keyboard navigation works in both the `"range"` and `"manual"` modes. In the `"manual"` mode, applying the selection (e.g., after `Enter`) requires handling via the events, such as [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) and [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). +::: -Check the example below: +- The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: + - **Arrows** (`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`): moves the focus to the adjacent cell, setting the initially selected cell if no selection is active. + - **Shift + Arrows**: extends the selected range from the current initial cell in the direction of the pressed arrow. + - **Ctrl + Arrows**: extends the selected range to the last cell in the direction of the pressed arrow. -~~~jsx {14,26} -const balanceTemplate = value => { - return value > 0 - ? `
⬆ $${value}
` - : `
⬇ $${value}
`; -}; +- The **Shift + click** combination sets the end cell of the range, extending the selection from the current initial cell. -const grid = new dhx.Grid("grid_container", { - columns: [ - { - minWidth: 150, - id: "project", - header: [ - {text: "Project"}, - {content: "comboFilter", tooltipTemplate: () => "Select project"} - ], - footer: [{text: "Total"}], - resizable: true, - draggable: false - }, - { - width: 130, - id: "balance", - header: [{text: "Balance"}, {content: "inputFilter"}], - footer: [ - { - tooltipTemplate: balanceTemplate - }, - ], - template: balanceTemplate, - htmlEnable: true, - numberMask: { - prefix: "$" - } - }, - ], -}); -~~~ +- The **Delete** shortcut key allows clearing the selected cells when the [`editable` mode](grid/api/grid_editable_config.md) is set for the Grid component and the `BlockSelection` module is used in the `"range"` mode. diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 8a1bd8268..3e577c824 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -6,6 +6,10 @@ description: You can explore how to work with Grid in the documentation of the D # Work with Grid +## Working with Grid in the TreeGrid mode + +For information on working with with Grid in the TreeGrid mode, read the [TreeGrid mode](grid/treegrid_mode.md#work-with-grid-in-the-treegrid-mode) guide. + ## Working with columns and cells The API of DHTMLX Grid allows setting configuration of columns, getting an object of a particular column as well as the parameters of a certain cell. @@ -1213,7 +1217,7 @@ grid.destructor(); For information on using Selection API, read [Work with Selection object](grid/usage_selection.md). -## Using Range Selection API +## Using RangeSelection API For information on using RangeSelection API, read [Work with RangeSelection Module](grid/usage_rangeselection.md). @@ -1225,10 +1229,11 @@ For information on using BlockSelection API, read [Work with BlockSelection modu For information on using the Clipboard module in Grid, read [Work with Clipboard module](grid/usage_clipboard.md). +## Working with DragPanel + +For information on using the DragPanel module in Grid, read [Work with DragPanel module](grid/usage_dragpanel.md). + ## Working with History API For information on using the History API in Grid, read [Work with History module](grid/usage_history.md). -## Working with Grid in the TreeGrid mode - -For information on working with with Grid in the TreeGrid mode, read the [TreeGrid mode](grid/treegrid_mode.md#work-with-grid-in-the-treegrid-mode) guide. From 733a2dc57e5477fc26fc4afea9dac89ae55c7af9 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 26 Jun 2025 18:29:39 +0300 Subject: [PATCH 32/47] [update] what's new for v9.2, complete grid index page --- docs/grid/index.md | 7 +++++++ docs/whatsnew.md | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/grid/index.md b/docs/grid/index.md index ede57e1fc..e95af17d7 100644 --- a/docs/grid/index.md +++ b/docs/grid/index.md @@ -28,6 +28,7 @@ You can check the following page to learn how to build a full-featured DHTMLX Gr - To get the whole JavaScript library of UI components [download DHTMLX Suite](https://dhtmlx.com/docs/products/dhtmlxSuite/download.shtml) - There are also [online samples for DHTMLX Grid](https://snippet.dhtmlx.com/1mxmshax?tag=grid) - To work with data of Grid check [DataCollection API](data_collection.md) +- To work with data of Grid in the TreeGrid mode check [TreeCollection API](tree_collection.md) ## Guides @@ -35,10 +36,16 @@ Says how to build a standard grid on a page and bring it to life: configure with - [](grid/initialization.md) - [](grid/configuration.md) +- [](grid/localization.md) - [](grid/data_loading.md) - [](grid/usage.md) - [](grid/treegrid_mode.md) - [](grid/usage_selection.md) +- [](grid/usage_rangeselection.md) +- [](grid/usage_blockselection.md) +- [](grid/usage_clipboard.md) +- [](grid/usage_dragpanel.md) +- [](grid/usage_history.md) - [](grid/customization.md) - [](grid/events.md) diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 47bde207a..e13502bcd 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -50,9 +50,10 @@ Released on June X, 2025 - DragManager. The issue associated with the absence or incorrect definition of the drop position for the default mode - DragManager. The issue with the `dragIn` event (the previous reset state was transmitted) - DragManager. The `dragIn/dragOut` events are optimized (false positives are removed) -- Grid. The issue with falsy selection of frozen cells while selecting unfrozen cells +- Grid. The issue with falsy selection of fixed cells while selecting unfrozen cells - Grid. The issue with dragging unselected items - Grid. Sorting of the Date string (ISO) values results in the invalid format error +- Grid. Export. Grid. Double quotes in the cell value are escaped in the exported Excel ### New samples From aa9c344b799b95586b3b325a80e0371247e21ecc Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 27 Jun 2025 17:07:35 +0300 Subject: [PATCH 33/47] [update] the keyboard navigation section for grid --- docs/grid/configuration.md | 159 +++++++++++++++++++++++------- docs/grid/usage_blockselection.md | 99 +++++++++++++++++-- docs/whatsnew.md | 1 + 3 files changed, 214 insertions(+), 45 deletions(-) diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 0fe1e6efc..67124d5fe 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2980,25 +2980,25 @@ DHTMLX Grid provides the keyboard navigation that will help you manipulate your ### Default shortcut keys -There are four navigation keys that Grid enables by default: +The navigation shortcut keys and keys combinations that Grid enables by default are provided below: - + - + - + - + @@ -3021,9 +3021,9 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) -### Arrow shortcut keys +### Shortcut keys for moving selection between cells -In case you want to enable the arrow keys that allow moving the selection between cells, you need to specify the [`selection`](grid/api/grid_selection_config.md) property for Grid. +In case you want to enable the shortcut keys that allow moving the selection between cells, you need to specify the [`selection`](grid/api/grid_selection_config.md) property for Grid. ~~~jsx {6} const grid = new dhx.Grid("grid_container", { @@ -3038,95 +3038,95 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) -The list of the arrow shortcut keys: +The list of the shortcut keys and their combinations used for moving selection between cells is the following:
PageUpscroll Grid up to the height of the visible content (without change of the selected cell)scrolls Grid up to the height of the visible content (without change of the selected cell)
PageDownscroll Grid down to the height of the visible content (without change of the selected cell)scrolls Grid down to the height of the visible content (without change of the selected cell)
Homenavigate to the beginning of the Grid content (without change of the selected cell)navigates to the beginning of the Grid content (without change of the selected cell)
Endnavigate to the end of the Grid content (without change of the selected cell)navigates to the end of the Grid content (without change of the selected cell)
Ctrl+Enter
- + - + - + - + - + - + - + - + - + - +
ArrowUpmove selection to the previous vertical cellmoves selection to the previous vertical cell
ArrowDownmove selection to the next vertical cellmoves selection to the next vertical cell
ArrowLeftmove selection to the previous horizontal cellmoves selection to the previous horizontal cell
ArrowRightmove selection to the next horizontal cellmoves selection to the next horizontal cell
Ctrl+ArrowUpmove selection to the first vertical cellmoves selection to the first vertical cell
Ctrl+ArrowDownmove selection to the last vertical cellmoves selection to the last vertical cell
Ctrl+ArrowLeft move selection to the first horizontal cell moves selection to the first horizontal cell
Ctrl+ArrowRight move selection to the last horizontal cell moves selection to the last horizontal cell
Tab move selection to the next horizontal cell or the first cell of the next row moves selection to the next horizontal cell or the first cell of the next row
Shit+Tab move selection to the previous horizontal cell or to the first cell of the previous row moves selection to the previous horizontal cell or to the first cell of the previous row
-The arrow shortcut keys listed below do not work when the `selection` property is set to *"complex"*. Use another mode (*"cell" or "row"*) in case you want to activate these navigation keys: +The combinations of the shortcut keys listed below do not work when the `selection` property is set to *"complex"*. Use another mode (*"cell" or "row"*) in case you want to activate these navigation keys: - + - + - + - + - + - + - + - +
Shift+ArrowUpmove selection to the previous vertical cell with the change of the selected cellsmoves selection to the previous vertical cell with the change of the selected cells
Shift+ArrowDownmove selection to the next vertical cell with the change of the selected cellsmoves selection to the next vertical cell with the change of the selected cells
Shift+ArrowLeftmove selection to the previous horizontal cell with the change of the selected cellsmoves selection to the previous horizontal cell with the change of the selected cells
Shift+ArrowRightmove selection to the next horizontal cell with the change of the selected cellsmoves selection to the next horizontal cell with the change of the selected cells
Ctrl+Shift+ArrowUpmove selection to the first vertical cell with the change of the selected cellsmoves selection to the first vertical cell with the change of the selected cells
Ctrl+Shift+ArrowDownmove selection to the last vertical cell with the change of the selected cellsmoves selection to the last vertical cell with the change of the selected cells
Ctrl+Shift+ArrowLeftmove selection to the first horizontal cell with the change of the selected cellsmoves selection to the first horizontal cell with the change of the selected cells
Ctrl+Shift+ArrowRightmove selection to the last horizontal cell with the change of the selected cellsmoves selection to the last horizontal cell with the change of the selected cells
### Shortcut keys for editing -It is also possible to use shortcut keys for editing a cell in Grid by setting [`editable:true`](grid/api/grid_editable_config.md) property in the configuration object of Grid. +It is possible to use shortcut keys for editing a cell in Grid by setting the [`editable:true`](grid/api/grid_editable_config.md) property in the configuration object of Grid. ~~~jsx {7} const grid = new dhx.Grid("grid_container", { @@ -3142,17 +3142,17 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid. Key navigation](https://snippet.dhtmlx.com/y9kdk0md) -The list of the shortcut keys for editing: +The list of the shortcut keys for editing is given below: - + - + @@ -3161,7 +3161,7 @@ The list of the shortcut keys for editing:
Enteropen the editor in the selected cell. If the editor is currently opened - close the editor and save changesopens the editor in the selected cell. If the editor is currently opened - closes the editor and saves changes
Escapeclose the editor of the selected cell without savingcloses the editor of the selected cell without saving
Delete
-### Selecting ranges of cells +### Shortcut keys for selecting ranges of cells If you need to use the keyboard navigation for selecting ranges of cells via the user interface, you should enable the [`BlockSelection`](grid/usage_blockselection.md) module in the Grid configuration. @@ -3169,12 +3169,95 @@ If you need to use the keyboard navigation for selecting ranges of cells via the Keyboard navigation works in both the `"range"` and `"manual"` modes. In the `"manual"` mode, applying the selection (e.g., after `Enter`) requires handling via the events, such as [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) and [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). ::: -- The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: - - **Arrows** (`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`): moves the focus to the adjacent cell, setting the initially selected cell if no selection is active. - - **Shift + Arrows**: extends the selected range from the current initial cell in the direction of the pressed arrow. - - **Ctrl + Arrows**: extends the selected range to the last cell in the direction of the pressed arrow. +The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets. The following shortcut keys and their combinations are available: -- The **Shift + click** combination sets the end cell of the range, extending the selection from the current initial cell. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArrowUpresets the selected range and moves the focus to the previous vertical cell, setting the initially selected cell if no selection is active
ArrowDownresets the selected range and moves the focus to the next vertical cell, setting the initially selected cell if no selection is active
ArrowLeftresets the selected range and moves the focus to the previous horizontal cell, setting the initially selected cell if no selection is active
ArrowRightresets the selected range and moves the focus to the next horizontal cell, setting the initially selected cell if no selection is active
Shift+ArrowUpextends the selected range from the current initial cell to the previous vertical cell
Shift+ArrowDownextends the selected range from the current initial cell to the next vertical cell
Shift+ArrowLeftextends the selected range from the current initial cell to the previous horizontal cell
Shift+ArrowRightextends the selected range from the current initial cell to the next horizontal cell
Ctrl+ArrowUpresets the selected range and moves the focus to the first vertical cell
Ctrl+ArrowDownresets the selected range and moves the focus to the last vertical cell
Ctrl+ArrowLeftresets the selected range and moves the focus to the first horizontal cell
Ctrl+ArrowRightresets the selected range and moves the focus to the last horizontal cell
Ctrl+Shift+ArrowUpextends the selected range to the first vertical cell
Ctrl+Shift+ArrowDownextends the selected range to the last vertical cell
Ctrl+Shift+ArrowLeft extends the selected range to the first horizontal cell
Ctrl+Shift+ArrowRight extends the selected range to the last horizontal cell
+ +The following shortcut key and mouse combination is available: + + + + + + + + +
Shift + clicksets the end cell of the range, extending the selection from the current initial cell
-- The **Delete** shortcut key allows clearing the selected cells when the [`editable` mode](grid/api/grid_editable_config.md) is set for the Grid component and the `BlockSelection` module is used in the `"range"` mode. +The following shortcut key is available when the [`editable` mode](grid/api/grid_editable_config.md) is set for the Grid component and the `BlockSelection` module is used in the `"range"` mode: + + + + + + + +
Deleteallows clearing the selected cells
\ No newline at end of file diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md index 4bcd73e56..885f3e18c 100644 --- a/docs/grid/usage_blockselection.md +++ b/docs/grid/usage_blockselection.md @@ -123,14 +123,99 @@ The main points of cell selection while using the `BlockSelection` module are gi Keyboard navigation works in both the `"range"` and `"manual"` modes. In the `"manual"` mode, applying the selection (e.g., after `Enter`) requires handling via the events, such as [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) and [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). ::: -- The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets: - - **Arrows** (`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`): moves the focus to the adjacent cell, setting the initially selected cell if no selection is active. - - **Shift + Arrows**: extends the selected range from the current initial cell in the direction of the pressed arrow. - - **Ctrl + Arrows**: extends the selected range to the last cell in the direction of the pressed arrow. +The module supports keyboard navigation for selecting and managing ranges, similar to keyboard navigation used in Google Spreadsheets. The following shortcut keys and their combinations are available: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArrowUpresets the selected range and moves the focus to the previous vertical cell, setting the initially selected cell if no selection is active
ArrowDownresets the selected range and moves the focus to the next vertical cell, setting the initially selected cell if no selection is active
ArrowLeftresets the selected range and moves the focus to the previous horizontal cell, setting the initially selected cell if no selection is active
ArrowRightresets the selected range and moves the focus to the next horizontal cell, setting the initially selected cell if no selection is active
Shift+ArrowUpextends the selected range from the current initial cell to the previous vertical cell
Shift+ArrowDownextends the selected range from the current initial cell to the next vertical cell
Shift+ArrowLeftextends the selected range from the current initial cell to the previous horizontal cell
Shift+ArrowRightextends the selected range from the current initial cell to the next horizontal cell
Ctrl+ArrowUpresets the selected range and moves the focus to the first vertical cell
Ctrl+ArrowDownresets the selected range and moves the focus to the last vertical cell
Ctrl+ArrowLeftresets the selected range and moves the focus to the first horizontal cell
Ctrl+ArrowRightresets the selected range and moves the focus to the last horizontal cell
Ctrl+Shift+ArrowUpextends the selected range to the first vertical cell
Ctrl+Shift+ArrowDownextends the selected range to the last vertical cell
Ctrl+Shift+ArrowLeft extends the selected range to the first horizontal cell
Ctrl+Shift+ArrowRight extends the selected range to the last horizontal cell
+ +The following shortcut key and mouse combination is available: + + + + + + + + +
Shift + clicksets the end cell of the range, extending the selection from the current initial cell
+ +The following shortcut key is available when the [`editable` mode](grid/api/grid_editable_config.md) is set for the Grid component and the `BlockSelection` module is used in the `"range"` mode: + + + + + + + + +
Deleteallows clearing the selected cells
-- The **Shift + click** combination sets the end cell of the range, extending the selection from the current initial cell. - -- The **Delete** shortcut key allows clearing the selected cells when the [`editable` mode](grid/api/grid_editable_config.md) is set for the Grid component and the `BlockSelection` module is used in the `"range"` mode. It is possible to cancel the cells clearing by using the [`beforeKeyDown`](grid/api/grid_beforekeydown_event.md) event: ~~~jsx diff --git a/docs/whatsnew.md b/docs/whatsnew.md index e13502bcd..5f5999b5b 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -41,6 +41,7 @@ Released on June X, 2025 - Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved. Check the [related sample](https://snippet.dhtmlx.com/0tuk0y5f) - Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated - Grid. The possibility to [clear data in selected cells by using the `Delete` shortcut key](grid/configuration.md/#shortcut-keys-for-editing) is added +- Grid. The possibility to use keyboard navigation for [selecting ranges of cells](grid/configuration.md/#selecting-ranges-of-cells) ### Fixes From a8887e96b1673fd9a67238e94a56e9f4b0487f8b Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 30 Jun 2025 12:00:07 +0300 Subject: [PATCH 34/47] [update] what's new for v9.2 --- docs/grid/configuration.md | 2 +- docs/whatsnew.md | 94 +++++++++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 67124d5fe..16f44f390 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -3163,7 +3163,7 @@ The list of the shortcut keys for editing is given below: ### Shortcut keys for selecting ranges of cells -If you need to use the keyboard navigation for selecting ranges of cells via the user interface, you should enable the [`BlockSelection`](grid/usage_blockselection.md) module in the Grid configuration. +If you need to use the keyboard navigation for selecting ranges of cells via the user interface, you should enable the [`BlockSelection` module](grid/usage_blockselection.md) in the Grid configuration. :::note Keyboard navigation works in both the `"range"` and `"manual"` modes. In the `"manual"` mode, applying the selection (e.g., after `Enter`) requires handling via the events, such as [`beforeBlockSelectionApply`](grid/api/blockselection/beforeblockselectionapply_event.md) and [`afterBlockSelectionApply`](grid/api/blockselection/afterblockselectionapply_event.md). diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 5f5999b5b..b932f7223 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -40,8 +40,98 @@ Released on June X, 2025 - Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved. Check the [related sample](https://snippet.dhtmlx.com/0tuk0y5f) - Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated -- Grid. The possibility to [clear data in selected cells by using the `Delete` shortcut key](grid/configuration.md/#shortcut-keys-for-editing) is added -- Grid. The possibility to use keyboard navigation for [selecting ranges of cells](grid/configuration.md/#selecting-ranges-of-cells) +- Grid. The possibility to use keyboard navigation for [selecting ranges of cells](grid/configuration.md/#shortcut-keys-for-selecting-ranges-of-cells). The following shortcut keys and their combinations are available: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArrowUpresets the selected range and moves the focus to the previous vertical cell, setting the initially selected cell if no selection is active
ArrowDownresets the selected range and moves the focus to the next vertical cell, setting the initially selected cell if no selection is active
ArrowLeftresets the selected range and moves the focus to the previous horizontal cell, setting the initially selected cell if no selection is active
ArrowRightresets the selected range and moves the focus to the next horizontal cell, setting the initially selected cell if no selection is active
Shift+ArrowUpextends the selected range from the current initial cell to the previous vertical cell
Shift+ArrowDownextends the selected range from the current initial cell to the next vertical cell
Shift+ArrowLeftextends the selected range from the current initial cell to the previous horizontal cell
Shift+ArrowRightextends the selected range from the current initial cell to the next horizontal cell
Ctrl+ArrowUpresets the selected range and moves the focus to the first vertical cell
Ctrl+ArrowDownresets the selected range and moves the focus to the last vertical cell
Ctrl+ArrowLeftresets the selected range and moves the focus to the first horizontal cell
Ctrl+ArrowRightresets the selected range and moves the focus to the last horizontal cell
Ctrl+Shift+ArrowUpextends the selected range to the first vertical cell
Ctrl+Shift+ArrowDownextends the selected range to the last vertical cell
Ctrl+Shift+ArrowLeft extends the selected range to the first horizontal cell
Ctrl+Shift+ArrowRight extends the selected range to the last horizontal cell
+ +The following shortcut key and mouse combination is available: + + + + + + + + +
Shift + clicksets the end cell of the range, extending the selection from the current initial cell
+ +The following shortcut key is available when the [`editable` mode](grid/api/grid_editable_config.md) is set for the Grid component and the `BlockSelection` module is used in the `"range"` mode: + + + + + + + + +
Deleteallows clearing the selected cells
### Fixes From b48253af95cf16a665e869745357132904f6c25c Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Tue, 1 Jul 2025 18:33:26 +0300 Subject: [PATCH 35/47] [update] links to new snippets in the docs for v9.2 --- docs/grid/api/grid_blockselection_config.md | 2 +- docs/grid/api/grid_clipboard_config.md | 2 +- docs/grid/api/grid_dragpanel_config.md | 2 +- docs/grid/api/grid_history_config.md | 2 +- docs/grid/api/history/afteradd_event.md | 2 +- docs/grid/api/history/afterredo_event.md | 2 +- docs/grid/api/history/afterundo_event.md | 2 +- .../rangeselection/beforesetrange_event.md | 2 +- .../api/rangeselection/setrange_method.md | 2 +- docs/grid/configuration.md | 12 ++++------ docs/grid/features.md | 8 +++---- docs/grid/usage_blockselection.md | 8 ++++--- docs/grid/usage_clipboard.md | 12 ++++++---- docs/grid/usage_dragpanel.md | 4 ++-- docs/grid/usage_history.md | 6 ++++- docs/grid/usage_rangeselection.md | 2 +- docs/whatsnew.md | 22 ++++++++++--------- 17 files changed, 50 insertions(+), 42 deletions(-) diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md index c120eda95..fc2553c15 100644 --- a/docs/grid/api/grid_blockselection_config.md +++ b/docs/grid/api/grid_blockselection_config.md @@ -196,7 +196,7 @@ function blockSelectionHandler({ cell, array, index, grid }) { } ~~~ -**Related sample:** [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/8kttktiy) +**Related sample:** [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/sryiguxu) **Related articles:** - [Managing block selection in Grid](grid/configuration.md/#managing-block-selection-in-grid) diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md index d840f30d2..f25bc10f3 100644 --- a/docs/grid/api/grid_clipboard_config.md +++ b/docs/grid/api/grid_clipboard_config.md @@ -74,7 +74,7 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -**Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) +**Related sample**: [Grid. Clipboard. Custom copy/cut/paste for number and date columns](https://snippet.dhtmlx.com/dfj49xah) **Related articles:** - [Clipboard](grid/configuration.md/#clipboard) diff --git a/docs/grid/api/grid_dragpanel_config.md b/docs/grid/api/grid_dragpanel_config.md index e30588100..ea47b7447 100644 --- a/docs/grid/api/grid_dragpanel_config.md +++ b/docs/grid/api/grid_dragpanel_config.md @@ -85,7 +85,7 @@ const grid = new dhx.Grid("grid_container", { ~~~ -**Related sample:** [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) +**Related sample:** [Grid (TreeGrid). DragPanel. Initialization](https://snippet.dhtmlx.com/uevdwjuo) **Related articles:** - [Adjusting DragPanel module](grid/configuration.md/#adjusting-dragpanel-module) diff --git a/docs/grid/api/grid_history_config.md b/docs/grid/api/grid_history_config.md index ad5cb09c7..bc924664e 100644 --- a/docs/grid/api/grid_history_config.md +++ b/docs/grid/api/grid_history_config.md @@ -66,7 +66,7 @@ const grid = new dhx.Grid("grid_container", { grid.history.enable(); // enabling the module ~~~ -**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) **Related articles:** - [History of Grid actions](grid/configuration.md/#history-of-grid-actions) diff --git a/docs/grid/api/history/afteradd_event.md b/docs/grid/api/history/afteradd_event.md index d7ce8f9c8..d15499179 100644 --- a/docs/grid/api/history/afteradd_event.md +++ b/docs/grid/api/history/afteradd_event.md @@ -35,7 +35,7 @@ grid.history.events.on("afterAdd", (action) => { @descr: -**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) **Related article**: [Adding/removing Grid history actions](grid/usage_history.md/#addingremoving-grid-history-actions) diff --git a/docs/grid/api/history/afterredo_event.md b/docs/grid/api/history/afterredo_event.md index ba39424aa..41ab6ed99 100644 --- a/docs/grid/api/history/afterredo_event.md +++ b/docs/grid/api/history/afterredo_event.md @@ -35,7 +35,7 @@ grid.history.events.on("afterRedo", (action) => { @descr: -**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) **Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) diff --git a/docs/grid/api/history/afterundo_event.md b/docs/grid/api/history/afterundo_event.md index 39f5f3330..8bd84dcd2 100644 --- a/docs/grid/api/history/afterundo_event.md +++ b/docs/grid/api/history/afterundo_event.md @@ -35,7 +35,7 @@ grid.history.events.on("afterUndo", (action) => { @descr: -**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) **Related article**: [Applying undo/redo operations to Grid history actions](grid/usage_history.md/#applying-undoredo-operations-to-grid-history-actions) diff --git a/docs/grid/api/rangeselection/beforesetrange_event.md b/docs/grid/api/rangeselection/beforesetrange_event.md index 3cfa2e65e..983584c54 100644 --- a/docs/grid/api/rangeselection/beforesetrange_event.md +++ b/docs/grid/api/rangeselection/beforesetrange_event.md @@ -58,7 +58,7 @@ grid.range.setRange({ xStart: "b", yStart: "1" }); // setting a new range is can **Related API**: [`setRange()`](grid/api/rangeselection/setrange_method.md), [`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md) -**Related sample**: [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) +**Related sample**: [Grid. BlockSelection in the "range" mode. Selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/api/rangeselection/setrange_method.md b/docs/grid/api/rangeselection/setrange_method.md index 7954e77c6..649642231 100644 --- a/docs/grid/api/rangeselection/setrange_method.md +++ b/docs/grid/api/rangeselection/setrange_method.md @@ -91,7 +91,7 @@ console.log(grid.range.getRange()); // -> { xStart: "a", xEnd: "b", yStart: "1", **Related API**: [`getRange()`](grid/api/rangeselection/getrange_method.md), [`resetRange()`](grid/api/rangeselection/resetrange_method.md) -**Related sample**: [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) +**Related sample**: [Grid. BlockSelection in the "range" mode. Selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) @changelog: added in v9.2 \ No newline at end of file diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 16f44f390..b4b7ee7ea 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2470,10 +2470,6 @@ If you use the GPL version of DHTMLX Grid (or DHTMLX Suite), you will be able to **Note**, to be able to drag-n-drop a column and (or) multiple rows, you need to use PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: -![](../assets/grid/dnd_treegrid_mode.png) - -**Related sample**: [Grid. Drag-and-Drop in TreeGrid mode](https://snippet.dhtmlx.com/0tuk0y5f) - ### Drag-n-drop inside the grid It is possible to reorder a row or column of Grid by drag and drop. To enable the functionality, define the [`dragItem: "both"`](grid/api/grid_dragitem_config.md) property in the configuration object of Grid: @@ -2599,7 +2595,7 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -**Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) +**Related sample**: [Grid (TreeGrid). DragPanel. Initialization](https://snippet.dhtmlx.com/uevdwjuo) The module is also automatically enabled if the [row Drag-and-Drop](#drag-n-drop) functionality is activated (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties) and either the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules are enabled. @@ -2853,7 +2849,7 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -**Related sample:** [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) +**Related sample:** [Grid. BlockSelection in the "range" mode. Selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) For information on using the Block Selection API, read the [Work with Block Selection module](grid/usage_blockselection.md) guide. @@ -2915,7 +2911,7 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ -**Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) +**Related sample**: [Grid. Clipboard. Custom copy/cut/paste for number and date columns](https://snippet.dhtmlx.com/dfj49xah) For information on working with Clipboard, read the [Work with Clipboard module](grid/usage_clipboard.md) guide. @@ -2970,7 +2966,7 @@ const grid = new dhx.Grid("grid_container", { grid.history.enable(); // enabling the module ~~~ -**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) For information on working with the History API, read the [Work with History module](grid/usage_history.md) guide. diff --git a/docs/grid/features.md b/docs/grid/features.md index 22049ec12..b3a4b3a2b 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -135,7 +135,7 @@ In this section you will get to know how to configure the drag-n-drop functional | [Drag-n-drop between grids](../configuration/#drag-n-drop-between-grids) | Learn how to configure drag-n-drop between grids ([Example](https://snippet.dhtmlx.com/qx9a86ax)) | | [Drag-n-drop of multiple rows](grid/configuration.md#drag-n-drop-of-multiple-rows) | Learn how to allow end users to drag-n-drop several rows at once | | [Copying of rows during drag-n-drop](../api/grid_dragcopy_config/) | Learn how to copy a row to a target during drag-n-drop ([Example](https://snippet.dhtmlx.com/23slivyz)) | -| [Using the DragPanel module](../usage_dragpanel/) | Learn how to use the DragPanel module that provides additional functionality for moving rows in the Grid ([Example](https://snippet.dhtmlx.com/oyk02cr6)) | +| [Using the DragPanel module](../usage_dragpanel/) | Learn how to use the DragPanel module that provides additional functionality for moving rows in the Grid ([Example](https://snippet.dhtmlx.com/uevdwjuo)) | ## How to render custom statistics in the column header/footer and in the spans @@ -312,7 +312,7 @@ In this section you will get to know how to work with the block selection functi | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring block selection](../configuration/#managing-block-selection-in-grid) | Learn how to configure the block selection module within Grid ([Example](https://snippet.dhtmlx.com/8kttktiy)) | +| [Configuring block selection](../configuration/#managing-block-selection-in-grid) | Learn how to configure the block selection module within Grid ([Example](https://snippet.dhtmlx.com/sryiguxu)) | | [Working with block selection](../usage_blockselection/) | Learn how to enable/disable block selection in Grid, check the main features of the BlockSelection module and explore how it interacts with other modules | | [BlockSelection API](../../category/blockselection-api/) | Learn how to use API of the BlockSelection module to manage the block selection within Grid | @@ -322,7 +322,7 @@ In this section you will get to know how to work with the clipboard functionalit | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring clipboard](../configuration/#clipboard) | Learn how to configure the Clipboard module within Grid ([Example](https://snippet.dhtmlx.com/1fnkhwm0)) | +| [Configuring clipboard](../configuration/#clipboard) | Learn how to configure the Clipboard module within Grid ([Example](https://snippet.dhtmlx.com/dfj49xah)) | | [Working with clipboard](../usage_clipboard/) | Learn how to enable the clipboard in Grid, check the main features and explore the peculiarities of using the Clipboard module | | [Clipboard API](../../category/clipboard-events/) | Learn how to use API of the Clipboard module to manage the clipboard operations within Grid | @@ -332,7 +332,7 @@ In this section you will get to know how to work with the history of Grid action | Topic | Description | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Configuring history of Grid actions](../configuration/#history-of-grid-actions) | Learn how to configure the History module within Grid ([Example](https://snippet.dhtmlx.com/m88562wf)) | +| [Configuring history of Grid actions](../configuration/#history-of-grid-actions) | Learn how to configure the History module within Grid ([Example](https://snippet.dhtmlx.com/vznpyeit)) | | [Working with history of actions](../usage_history/) | Learn how to enable the history of actions in Grid, check the main features and explore the peculiarities of using the History module | | [History API](../../category/history-api/) | Learn how to use API of the History module to manage the history of operations within Grid | diff --git a/docs/grid/usage_blockselection.md b/docs/grid/usage_blockselection.md index 885f3e18c..1af99cca9 100644 --- a/docs/grid/usage_blockselection.md +++ b/docs/grid/usage_blockselection.md @@ -35,6 +35,8 @@ const grid = new dhx.Grid("grid_container", { The `blockSelection` property can also be set as an *object* to enable the module and provide additional configuration options. Learn about configuration possibilities of the `BlockSelection` module in the [Configuration](grid/configuration.md/#managing-block-selection-in-grid) guide. +**Related sample:** [Grid. BlockSelection in the "range" mode. Selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) + ## Enabling/disabling BlockSelection module You can activate the block selection module via the [`enable()`](grid/api/blockselection/enable_method.md) method of the `block` object. @@ -303,7 +305,7 @@ grid.block.events.on("blockSelectionValidate", (cell, handle, event) => { grid.range.setRange({ xStart: "b", xEnd: "d", yStart: "4", yEnd: "8" }); ~~~ -**Related sample:** [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) +**Related sample:** [Grid. BlockSelection in the "range" mode. Selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) #### Setting custom logic in the manual mode @@ -449,7 +451,7 @@ function blockSelectionHandler({ cell, array, index, grid }) { } ~~~ -**Related sample:** [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/8kttktiy) +**Related sample:** [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/sryiguxu) #### Selection styling @@ -491,4 +493,4 @@ This example demonstrates how to customize the appearance of the selected range ~~~ -**Related sample:** [Grid. BlockSelection. Stylization of the area](https://snippet.dhtmlx.com/qr5xyqpu) \ No newline at end of file +**Related sample:** [Grid. BlockSelection. Styling (custom CSS)](https://snippet.dhtmlx.com/4k3x4bfm) \ No newline at end of file diff --git a/docs/grid/usage_clipboard.md b/docs/grid/usage_clipboard.md index 20a04b108..a02a96771 100644 --- a/docs/grid/usage_clipboard.md +++ b/docs/grid/usage_clipboard.md @@ -35,6 +35,8 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +**Related sample**: [Grid. Clipboard with notifications (messages)](https://snippet.dhtmlx.com/2nar7ocd) + The `clipboard` property can be set as an *object* to enable the module and define the [modifier functions](#using-formatter-functions) for data processing: `copyModifier`, `cutModifier` and `pasteModifier`. Check the details below. ## Using events of the Clipboard object @@ -68,14 +70,14 @@ The `cut`/`paste` operations will be blocked in the [*grouping*](grid/usage.md/# The `Clipboard` module enables data exchange between multiple `dhx.Grid` instances or with external applications like Google Spreadsheets, Microsoft Excel, or similar widgets. Data is copied to the clipboard in a text format with tab separators (`\t`) between columns and newlines (`\n`) between rows, matching the standard table format. -**Related sample**: [Grid. Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/z2i033yq) +**Related sample**: [Grid. Clipboard. Copy/сut/paste between grids with validation](https://snippet.dhtmlx.com/q1wj772g) + +**Related sample**: [Grid. Clipboard between Grid and Spreadsheet](https://snippet.dhtmlx.com/hx69j42h) ### Integration with Google Spreadsheets Data from a grid can be copied to the clipboard and pasted directly into Google Spreadsheets. Similarly, data from Google Spreadsheets can be copied and pasted into the grid. Use [`pasteModifier`](#using-formatter-functions) to process data formats (e.g., converting strings to numbers). -**Related sample**: [Grid. Clipboard. Clipboard operations between Grid and Spreadsheet](https://snippet.dhtmlx.com/mfmvbbda) - ### Pasting from clipboard Data from the clipboard is pasted into the range defined by `rangeSelection`. The behavior depends on the size of the selected range and the number of copied elements: @@ -140,6 +142,8 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +**Related sample**: [Grid. Clipboard between two Grids with modifiers](https://snippet.dhtmlx.com/h3hxcpog) + These functions provide flexible control over how data is processed before copying, cutting, or pasting, which is particularly useful in the scenarios described below. ### Why formatters are needed @@ -228,5 +232,5 @@ copyModifier: (value, cell, cut) => { } ~~~ -**Related sample**: [Grid. Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) +**Related sample**: [Grid. Clipboard. Custom copy/cut/paste for number and date columns](https://snippet.dhtmlx.com/dfj49xah) diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index a424d5e7a..80a0591f1 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -14,8 +14,6 @@ The `DragPanel` module provides auxiliary functionality for moving rows in the * ![](../assets/grid/dragpanel_module.png) -**Related sample**: [Grid. DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) - The module is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. You can also adjust the appearance and behavior of the `DragPanel` module via the [configuration options](grid/configuration.md/#adjusting-the-dragpanel-module). @@ -44,6 +42,8 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +**Related sample**: [Grid (TreeGrid). DragPanel. Initialization](https://snippet.dhtmlx.com/uevdwjuo) + The `dragPanel` property can also be set as an *object* to enable the module and provide additional configuration options. Learn about configuration possibilities of the drag panel in the [Configuration](grid/configuration.md/#adjusting-the-dragpanel-module) guide. diff --git a/docs/grid/usage_history.md b/docs/grid/usage_history.md index 9279bdbd3..15cf5aa19 100644 --- a/docs/grid/usage_history.md +++ b/docs/grid/usage_history.md @@ -33,6 +33,8 @@ const grid = new dhx.Grid("grid_container", { The `history` property can also be set as an *object* to enable the module and provide additional configuration options. Learn about configuration possibilities of the `History` module in the [Configuration](grid/configuration.md/#history-of-grid-actions) guide. +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) + ## Enabling/disabling History module You can activate the history module via the [`enable()`](grid/api/history/enable_method.md) method of the `history` object. The following example shows how the module is enabled after deactivation on initialization: @@ -176,6 +178,8 @@ const history = grid.history.getHistory(); console.log(history.length); // ->1 ~~~ +**Related sample:** [Grid. History. Adding a custom action](https://snippet.dhtmlx.com/i9rm4vsd) + To make the process of adding new actions into the Grid history more flexible, you can apply the related events of the `history` object: - [`beforeAdd`](grid/api/history/beforeadd_event.md) - [`afterAdd`](grid/api/history/afteradd_event.md) @@ -442,7 +446,7 @@ The actions not related to the UI (e.g., programmatic changes via `grid.data`) a If the `limit` parameter is set in the [configuration of the `History` module](grid/api/grid_history_config.md), the history is limited to the specified number of actions. When the limit is exceeded, the oldest actions are automatically removed. -**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/m88562wf) +**Related sample:** [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) ## Module disabling diff --git a/docs/grid/usage_rangeselection.md b/docs/grid/usage_rangeselection.md index 5e8024db0..74884ed5e 100644 --- a/docs/grid/usage_rangeselection.md +++ b/docs/grid/usage_rangeselection.md @@ -169,7 +169,7 @@ To make the process of selecting a range more flexible, you can apply the relate - [`afterSetRange`](grid/api/rangeselection/aftersetrange_event.md) - [`beforeSetRange`](grid/api/rangeselection/beforesetrange_event.md) -**Related sample**: [Grid. BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) +**Related sample**: [Grid. BlockSelection in the "range" mode. Selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) ## Resetting the range selection diff --git a/docs/whatsnew.md b/docs/whatsnew.md index b932f7223..4c5d22f26 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -38,7 +38,7 @@ Released on June X, 2025 ### Updates -- Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved. Check the [related sample](https://snippet.dhtmlx.com/0tuk0y5f) +- Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved. Check the [related sample](https://snippet.dhtmlx.com/uevdwjuo) - Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated - Grid. The possibility to use keyboard navigation for [selecting ranges of cells](grid/configuration.md/#shortcut-keys-for-selecting-ranges-of-cells). The following shortcut keys and their combinations are available: @@ -150,15 +150,17 @@ The following shortcut key is available when the [`editable` mode](grid/api/grid #### Grid -- [Drag-and-Drop in the TreeGrid mode](https://snippet.dhtmlx.com/0tuk0y5f) -- [BlockSelection in the "range" mode. Inventory selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) -- [BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/8kttktiy) -- [BlockSelection. Stylization of the area](https://snippet.dhtmlx.com/qr5xyqpu) -- [Clipboard. Financial data with formatted copy/paste](https://snippet.dhtmlx.com/1fnkhwm0) -- [Clipboard. Employee data transfer between Grids](https://snippet.dhtmlx.com/z2i033yq) -- [Clipboard. Clipboard operations between Grid and Spreadsheet](https://snippet.dhtmlx.com/mfmvbbda) -- [DragPanel. Initialization](https://snippet.dhtmlx.com/oyk02cr6) -- [History. Configuration](https://snippet.dhtmlx.com/m88562wf) +- [Grid (TreeGrid). DragPanel. Initialization](https://snippet.dhtmlx.com/uevdwjuo) +- [Grid. BlockSelection in the "range" mode. Selection with restricted columns](https://snippet.dhtmlx.com/42fp5qvt) +- [Grid. BlockSelection. Work with the handle configuration](https://snippet.dhtmlx.com/sryiguxu) +- [Grid. BlockSelection. Styling (custom CSS)](https://snippet.dhtmlx.com/4k3x4bfm) +- [Grid. Clipboard with notifications (messages)](https://snippet.dhtmlx.com/2nar7ocd) +- [Grid. Clipboard. Custom copy/cut/paste for number and date columns](https://snippet.dhtmlx.com/dfj49xah) +- [Grid. Clipboard. Copy/сut/paste between grids with validation](https://snippet.dhtmlx.com/q1wj772g) +- [Grid. Clipboard between two Grids with modifiers](https://snippet.dhtmlx.com/h3hxcpog) +- [Grid. Clipboard between Grid and Spreadsheet](https://snippet.dhtmlx.com/hx69j42h) +- [Grid. History. Configuration](https://snippet.dhtmlx.com/vznpyeit) +- [Grid. History. Adding a custom action](https://snippet.dhtmlx.com/i9rm4vsd) ## Version 9.1.6 From 22d4f04955f9b5d826b1c3ad75480260c37c2064 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 2 Jul 2025 17:39:42 +0300 Subject: [PATCH 36/47] [update] what's new and migration guide for v9.2 --- docs/migration.md | 27 +++++++++++++++++++++++++++ docs/whatsnew.md | 5 ++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/migration.md b/docs/migration.md index b38e6cd72..c1a4dfb5c 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -6,6 +6,33 @@ description: You can explore how to migrate to newer versions in the documentati # Migration to newer versions +9.1 -> 9.2 +----------- + +### Grid + +Since v9.2 the Grid component uses the WebAssembly-based library [Json2Excel](https://github.com/dhtmlx/json2excel) for [exporting Grid data to an Excel file](grid/usage.md/#exporting-data-to-excel). By default, you don't need to specify the link to the export module. + +However, if you use your own export server, you need to install the **Json2Excel** library and provide the local path to the export module on your computer by setting the path to the **worker.js** file as `"../libs/json2excel/1.3/worker.js?vx"`: + +~~~jsx title="Before v9.2" +grid.export.xlsx({ + url: "https://export.dhtmlx.com/excel", // optional, the link to the export module + // more export settings +}); +~~~ + +~~~jsx title="From v9.2" +grid.export.xlsx({ + url: "../libs/json2excel/1.3/worker.js?vx", // optional, a local path to the export module + // more export settings +}); +~~~ + +:::info +The previously used export module server is still available for the Suite versions up to v9.1. +::: + 9.0 -> 9.1 ----------- diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 4c5d22f26..59f7a77e7 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -39,7 +39,10 @@ Released on June X, 2025 ### Updates - Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved. Check the [related sample](https://snippet.dhtmlx.com/uevdwjuo) -- Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated +- Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated. The [Json2Excel](https://github.com/dhtmlx/json2excel) module is now used for exporting Grid data to Excel. Check the [Migration guide](migration.md/#91---92) for details +- Grid. The [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the Export module gets two new properties: + - `tableName`- to set the name of a sheet with grid data in the Excel file + - `dateFormatMask` - to set the date format mask for Excel - Grid. The possibility to use keyboard navigation for [selecting ranges of cells](grid/configuration.md/#shortcut-keys-for-selecting-ranges-of-cells). The following shortcut keys and their combinations are available: From 489e8f7e29bfe8ede879c2ca9e24ba2b47d7ad7d Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Wed, 2 Jul 2025 18:26:43 +0300 Subject: [PATCH 37/47] [update] grid data export guides --- docs/grid/api/export/grid_csv_method.md | 8 +++--- docs/grid/api/export/grid_xlsx_method.md | 17 ++++++------ docs/grid/usage.md | 35 ++++++++++++------------ docs/whatsnew.md | 2 +- 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/docs/grid/api/export/grid_csv_method.md b/docs/grid/api/export/grid_csv_method.md index 09f04cbee..80c1ede64 100644 --- a/docs/grid/api/export/grid_csv_method.md +++ b/docs/grid/api/export/grid_csv_method.md @@ -13,7 +13,7 @@ description: You can explore the csv export method of Grid in the documentation @params: - `config` - (optional) an object with export settings. You can specify the following settings for export to CSV: - `asFile?: boolean` - (optional) defines whether Grid should be exported to a file, *true* by default. To export Grid only as a CSV string, you need to set *asFile:false* - - `name?: string` - (optional) the name of the exported CSV file (if asFile is not set to *false*) + - `name?: string` - (optional) "grid" by default. The name of the exported CSV file (if asFile is not set to *false*) - `rowDelimiter?: string` - (optional) a newline ("\n") by default. A separator between rows, can be a tab - "\t", or any other value - `columnDelimiter?: string` - (optional) a comma (",") by default. A separator between columns, can be a semicolon - ";", or any other value @@ -26,9 +26,9 @@ grid.export.csv(); // export with config settings grid.export.csv({ - name:"grid_data", // grid data will be exported to a CSV file named "grid_data" - rowDelimiter: "\t", // the tab delimiter will be used to separate rows - columnDelimiter: ";" // the semicolon delimiter will be used to separate columns + name: "my_file", // the name of a ready CSV file + rowDelimiter: "\t", // the delimiter used to separate rows + columnDelimiter: ";" // the delimiter used to separate columns }); diff --git a/docs/grid/api/export/grid_xlsx_method.md b/docs/grid/api/export/grid_xlsx_method.md index 8031be5e2..13fb7b8f6 100644 --- a/docs/grid/api/export/grid_xlsx_method.md +++ b/docs/grid/api/export/grid_xlsx_method.md @@ -16,10 +16,10 @@ DHTMLX Grid uses the WebAssembly-based library [Json2Excel](https://github.com/d @params: - `config` - (optional) an object with export settings. You can specify the following settings for export to Excel: - - `url?: string` - (optional) the link to the **worker.js** file of the [Json2Excel](https://github.com/dhtmlx/json2excel) library where export will be processed - - `name?: string` - (optional) the name of a ready Excel file - - `tableName?: string` - (optional) the name of a sheet with grid data in the Excel file - - `dateFormatMask?: string` - (optional) the mask used for [dates formatting in Excel](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e) + - `url?: string` - (optional) a local path to the **worker.js** file of the [Json2Excel](https://github.com/dhtmlx/json2excel) library (where export will be processed) set as `"../libs/json2excel/1.3/worker.js?vx"` + - `name?: string` - (optional) "grid" by default. The name of a ready Excel file + - `tableName?: string` - (optional) "data" by default. The name of a sheet with grid data in the Excel file + - `dateFormatMask?: string` - (optional) "dd/mm/yy" by default. The mask used for [dates formatting in Excel](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e) @example: // default export @@ -27,11 +27,10 @@ grid.export.xlsx(); // export with config settings grid.export.xlsx({ - // a local path to the `worker.js` file of the Json2Excel library - url: "../libs/json2excel/1.3/worker.js?vx", - name: "my_file", - tableName: "grid", - dateFormatMask: "mm.dd.yy" + url: "../libs/json2excel/1.3/worker.js?vx", // a local path to the `worker.js` file of the export module + name: "my_file", // the name of a ready Excel file + tableName: "grid", // the name of a sheet with grid data in the Excel file + dateFormatMask: "mm.dd.yy" // the date format mask for Excel }); @descr: diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 3e577c824..79227da80 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -481,15 +481,14 @@ DHTMLX Grid uses the WebAssembly-based library [Json2Excel](https://github.com/d - install the [Json2Excel](https://github.com/dhtmlx/json2excel) library - if you need to set a local path to the export module on your computer, specify the `url` option in the configuration object of the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method and set the path to the **worker.js** file like: `"../libs/json2excel/1.3/worker.js?vx"`. If the local path isn't set, the link to the file from CDN will be used -- call the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module with the provided settings (all settings are optional) +- call the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module. The method takes an [object with export settings](grid/api/export/grid_xlsx_method.md) as a parameter (all settings are optional) ~~~jsx grid.export.xlsx({ - // a local path to the `worker.js` file of the Json2Excel library - url: "../libs/json2excel/1.3/worker.js?vx", - name: "my_file", // the name of a ready Excel file - tableName: "grid", // the name of a sheet with grid data in the Excel file - dateFormatMask: "mm.dd.yy" // the mask used for dates formatting in Excel + url: "../libs/json2excel/1.3/worker.js?vx", // a local path to the export module + name: "my_file", // the name of a ready Excel file, "grid" by default + tableName: "grid", // the name of a sheet with grid data in the Excel file, "data" by default + dateFormatMask: "mm.dd.yy" // the date format mask for Excel, "dd/mm/yy" by default }); ~~~ @@ -497,19 +496,19 @@ grid.export.xlsx({ You can check the latest version of the Json2Excel library at the [github repository](https://github.com/dhtmlx/json2excel). ::: -You can read the details on dates formatting in Excel in the [related Excel documentation](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e). +Read the details on dates formatting in Excel in the [related Excel documentation](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e). **Related sample**: [Grid. Export to xlsx and csv](https://snippet.dhtmlx.com/58oqij47) #### Exporting data to CSV -You can export data from Grid to the CSV format with the [`csv()`](grid/api/export/grid_csv_method.md) method of the Export module. +You can export data from Grid to the CSV format with the [`csv()`](grid/api/export/grid_csv_method.md) method of the Export module. The method takes an [object with export settings](grid/api/export/grid_csv_method.md) as a parameter (all settings are optional). ~~~jsx grid.export.csv({ - name:"grid_data", // grid data will be exported to a CSV file named "grid_data" - rowDelimiter: "\t", // the tab delimiter will be used to separate rows - columnDelimiter: ";" // the semicolon delimiter will be used to separate columns + name: "my_file", // the name of a ready CSV file, "grid" by default + rowDelimiter: "\t", // the delimiter used to separate rows, "\n" (newline) by default + columnDelimiter: ";" // the delimiter used to separate columns, "," (comma) by default }); ~~~ @@ -519,14 +518,14 @@ The `csv()` method returns a CSV string with Grid data. #### Exporting data to PDF -The [`pdf()`](grid/api/export/grid_pdf_method.md) method of the Export module allows you to export data from Grid into a PDF file. The method takes an object with export settings as a parameter. +The [`pdf()`](grid/api/export/grid_pdf_method.md) method of the Export module allows you to export data from Grid into a PDF file. The method takes an [object with export settings](grid/api/export/grid_pdf_method.md) as a parameter (all settings are optional). ~~~jsx grid.export.pdf({ - format: "A4", - scale: 0.75, - displayHeaderFooter: true, - theme: "dark", + format: "A4", // the format of the output file, "A4" by default + scale: 0.75, // the scale of the grid rendering (between 0.1 and 2) + displayHeaderFooter: true, // defines whether to display the header and footer, false by default + theme: "dark" // the exported theme, "light" by default }); ~~~ @@ -534,11 +533,11 @@ grid.export.pdf({ #### Exporting data to PNG -The [`png()`](grid/api/export/grid_png_method.md) method of the Export module allows you to export data from Grid into a PNG file. The method takes an object with export settings as a parameter. +The [`png()`](grid/api/export/grid_png_method.md) method of the Export module allows you to export data from Grid into a PNG file. The method takes an [object with export settings](grid/api/export/grid_png_method.md) as a parameter (all settings are optional). ~~~jsx grid.export.png({ - theme: "dark", + theme: "dark" // the exported theme, "light" by default }); ~~~ diff --git a/docs/whatsnew.md b/docs/whatsnew.md index 59f7a77e7..ead56ff26 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -40,7 +40,7 @@ Released on June X, 2025 - Grid. The logic and appearance of the [drag-n-drop functionality](grid/configuration.md/#drag-n-drop) is improved. Check the [related sample](https://snippet.dhtmlx.com/uevdwjuo) - Grid. The [export to Excel](grid/usage.md/#exporting-data-to-excel) functionality is updated. The [Json2Excel](https://github.com/dhtmlx/json2excel) module is now used for exporting Grid data to Excel. Check the [Migration guide](migration.md/#91---92) for details -- Grid. The [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the Export module gets two new properties: +- Grid. The [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the Export module gets two new configuration settings: - `tableName`- to set the name of a sheet with grid data in the Excel file - `dateFormatMask` - to set the date format mask for Excel - Grid. The possibility to use keyboard navigation for [selecting ranges of cells](grid/configuration.md/#shortcut-keys-for-selecting-ranges-of-cells). The following shortcut keys and their combinations are available: From 381631bcd92ce69b9a1273a4bf193bf61c6e7a0b Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Mon, 7 Jul 2025 11:54:53 +0300 Subject: [PATCH 38/47] [update] dragpanel module image --- docs/assets/grid/dnd_treegrid_mode.png | Bin 65932 -> 0 bytes docs/assets/grid/dragpanel_module.png | Bin 39647 -> 64857 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/assets/grid/dnd_treegrid_mode.png diff --git a/docs/assets/grid/dnd_treegrid_mode.png b/docs/assets/grid/dnd_treegrid_mode.png deleted file mode 100644 index 379ffbf986dcf74550d52a297677e67e0f748fe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65932 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 b*!4}Ww-zJ(mS)KW_(N4mOR?(Ni-`XLA&kRT From ec362448ea59339e8b47fea4a3ca42583f1a1179 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 10 Jul 2025 12:52:58 +0300 Subject: [PATCH 39/47] [update] what's new, pro notes for new api, minor fixes --- .../afterblockhandleapply_event.md | 4 ++++ .../afterblockselectionapply_event.md | 4 ++++ .../afterblockselectionmove_event.md | 4 ++++ .../beforeblockhandleapply_event.md | 4 ++++ .../beforeblockselectionapply_event.md | 4 ++++ .../beforeblockselectionmove_event.md | 4 ++++ .../blockhandlemousedown_event.md | 4 ++++ .../blockselection/blockselectionend_event.md | 4 ++++ .../blockselectionstart_event.md | 4 ++++ .../blockselectionvalidate_event.md | 4 ++++ docs/grid/api/blockselection/disable_method.md | 4 ++++ docs/grid/api/blockselection/enable_method.md | 4 ++++ .../api/blockselection/isdisabled_method.md | 4 ++++ docs/grid/api/clipboard/aftercopy_event.md | 4 ++++ docs/grid/api/clipboard/afterpaste_event.md | 4 ++++ docs/grid/api/clipboard/beforecopy_event.md | 4 ++++ docs/grid/api/clipboard/beforepaste_event.md | 4 ++++ docs/grid/api/clipboard/copyerror_event.md | 4 ++++ docs/grid/api/clipboard/pasteerror_event.md | 4 ++++ .../api/dragpanel/dragpanelitemclick_event.md | 4 ++++ .../dragpanel/dragpanelitemmousedown_event.md | 4 ++++ docs/grid/api/grid_adjust_config.md | 6 +++--- docs/grid/api/grid_adjustcolumnwidth_method.md | 2 +- docs/grid/api/grid_autoheight_config.md | 2 +- docs/grid/api/grid_beforecolumndrag_event.md | 4 +++- docs/grid/api/grid_beforecolumndrop_event.md | 4 +++- docs/grid/api/grid_beforerowresize_event.md | 4 +++- docs/grid/api/grid_blockselection_config.md | 2 +- docs/grid/api/grid_cancelcolumndrop_event.md | 4 +++- docs/grid/api/grid_cancolumndrop_event.md | 4 +++- docs/grid/api/grid_clipboard_config.md | 2 +- docs/grid/api/grid_dragcolumnin_event.md | 4 +++- docs/grid/api/grid_dragcolumnout_event.md | 4 +++- docs/grid/api/grid_dragcolumnstart_event.md | 4 +++- docs/grid/api/grid_dragpanel_config.md | 2 +- docs/grid/api/grid_footerautoheight_config.md | 7 +++++-- docs/grid/api/grid_getsubrow_method.md | 4 ++++ docs/grid/api/grid_headerautoheight_config.md | 4 +++- docs/grid/api/grid_height_config.md | 5 ++++- docs/grid/api/grid_history_config.md | 2 +- docs/grid/api/grid_multisort_config.md | 12 ++++++++---- docs/grid/api/grid_rangeselection_config.md | 2 +- docs/grid/api/grid_selection_config.md | 4 +++- docs/grid/api/grid_spans_config.md | 3 ++- docs/grid/api/grid_subrow_config.md | 7 +++++++ docs/grid/api/grid_subrowconfig_config.md | 7 +++++++ docs/grid/api/grid_summary_config.md | 2 +- docs/grid/api/grid_tooltip_config.md | 3 ++- docs/grid/api/history/add_method.md | 4 ++++ docs/grid/api/history/afteradd_event.md | 4 ++++ docs/grid/api/history/afterredo_event.md | 4 ++++ docs/grid/api/history/afterundo_event.md | 4 ++++ docs/grid/api/history/beforeadd_event.md | 4 ++++ docs/grid/api/history/beforeredo_event.md | 4 ++++ docs/grid/api/history/beforeundo_event.md | 4 ++++ docs/grid/api/history/canredo_method.md | 4 ++++ docs/grid/api/history/canundo_method.md | 4 ++++ docs/grid/api/history/disable_method.md | 4 ++++ docs/grid/api/history/enable_method.md | 4 ++++ docs/grid/api/history/error_event.md | 4 ++++ docs/grid/api/history/gethistory_method.md | 4 ++++ docs/grid/api/history/isdisabled_method.md | 4 ++++ docs/grid/api/history/redo_method.md | 4 ++++ docs/grid/api/history/remove_method.md | 4 ++++ docs/grid/api/history/removeall_method.md | 4 ++++ docs/grid/api/history/undo_method.md | 4 ++++ .../rangeselection/afterresetrange_event.md | 4 ++++ .../api/rangeselection/aftersetrange_event.md | 4 ++++ .../rangeselection/beforeresetrange_event.md | 4 ++++ .../api/rangeselection/beforesetrange_event.md | 4 ++++ docs/grid/api/rangeselection/disable_method.md | 4 ++++ docs/grid/api/rangeselection/enable_method.md | 4 ++++ .../grid/api/rangeselection/getrange_method.md | 4 ++++ .../rangeselection/getrangedcells_method.md | 4 ++++ .../api/rangeselection/isdisabled_method.md | 4 ++++ .../grid/api/rangeselection/isranged_method.md | 4 ++++ .../api/rangeselection/resetrange_method.md | 4 ++++ .../grid/api/rangeselection/setrange_method.md | 4 ++++ docs/grid/configuration.md | 4 ++++ docs/grid/features.md | 2 +- docs/grid/usage_dragpanel.md | 4 ++-- docs/whatsnew.md | 18 ++++++++++++++++-- 82 files changed, 307 insertions(+), 35 deletions(-) diff --git a/docs/grid/api/blockselection/afterblockhandleapply_event.md b/docs/grid/api/blockselection/afterblockhandleapply_event.md index aacccde54..2288a13e2 100644 --- a/docs/grid/api/blockselection/afterblockhandleapply_event.md +++ b/docs/grid/api/blockselection/afterblockhandleapply_event.md @@ -6,6 +6,10 @@ description: You can explore the afterBlockHandleApply event of Grid block selec # afterBlockHandleApply +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered after applying the handle action ### Usage diff --git a/docs/grid/api/blockselection/afterblockselectionapply_event.md b/docs/grid/api/blockselection/afterblockselectionapply_event.md index 936eaa5f6..3b6b0713c 100644 --- a/docs/grid/api/blockselection/afterblockselectionapply_event.md +++ b/docs/grid/api/blockselection/afterblockselectionapply_event.md @@ -6,6 +6,10 @@ description: You can explore the afterBlockSelectionApply event of Grid block se # afterBlockSelectionApply +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered after applying the selection ### Usage diff --git a/docs/grid/api/blockselection/afterblockselectionmove_event.md b/docs/grid/api/blockselection/afterblockselectionmove_event.md index 496620d5e..689015bbf 100644 --- a/docs/grid/api/blockselection/afterblockselectionmove_event.md +++ b/docs/grid/api/blockselection/afterblockselectionmove_event.md @@ -6,6 +6,10 @@ description: You can explore the afterBlockSelectionMove event of Grid block sel # afterBlockSelectionMove +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered after moving the selection boundary ### Usage diff --git a/docs/grid/api/blockselection/beforeblockhandleapply_event.md b/docs/grid/api/blockselection/beforeblockhandleapply_event.md index bfee497ad..3f1c42839 100644 --- a/docs/grid/api/blockselection/beforeblockhandleapply_event.md +++ b/docs/grid/api/blockselection/beforeblockhandleapply_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeBlockHandleApply event of Grid block sele # beforeBlockHandleApply +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered before applying the handle action ### Usage diff --git a/docs/grid/api/blockselection/beforeblockselectionapply_event.md b/docs/grid/api/blockselection/beforeblockselectionapply_event.md index 58ab37d49..f6ab4d899 100644 --- a/docs/grid/api/blockselection/beforeblockselectionapply_event.md +++ b/docs/grid/api/blockselection/beforeblockselectionapply_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeBlockSelectionApply event of Grid block s # beforeBlockSelectionApply +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered before applying the selection (e.g., to a range) ### Usage diff --git a/docs/grid/api/blockselection/beforeblockselectionmove_event.md b/docs/grid/api/blockselection/beforeblockselectionmove_event.md index 71b664e3f..346564cdd 100644 --- a/docs/grid/api/blockselection/beforeblockselectionmove_event.md +++ b/docs/grid/api/blockselection/beforeblockselectionmove_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeBlockSelectionMove event of Grid block se # beforeBlockSelectionMove +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered before moving the selection boundary ### Usage diff --git a/docs/grid/api/blockselection/blockhandlemousedown_event.md b/docs/grid/api/blockselection/blockhandlemousedown_event.md index 3ec5790a6..05743df5d 100644 --- a/docs/grid/api/blockselection/blockhandlemousedown_event.md +++ b/docs/grid/api/blockselection/blockhandlemousedown_event.md @@ -6,6 +6,10 @@ description: You can explore the blockHandleMouseDown event of Grid block select # blockHandleMouseDown +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered when clicking on the selection handle ### Usage diff --git a/docs/grid/api/blockselection/blockselectionend_event.md b/docs/grid/api/blockselection/blockselectionend_event.md index ebc9b167f..ebf582e3c 100644 --- a/docs/grid/api/blockselection/blockselectionend_event.md +++ b/docs/grid/api/blockselection/blockselectionend_event.md @@ -6,6 +6,10 @@ description: You can explore the blockSelectionEnd event of Grid block selection # blockSelectionEnd +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered when the selection has been completed ### Usage diff --git a/docs/grid/api/blockselection/blockselectionstart_event.md b/docs/grid/api/blockselection/blockselectionstart_event.md index c85d247cf..dcde355e1 100644 --- a/docs/grid/api/blockselection/blockselectionstart_event.md +++ b/docs/grid/api/blockselection/blockselectionstart_event.md @@ -6,6 +6,10 @@ description: You can explore the blockSelectionStart event of Grid block selecti # blockSelectionStart +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered when selection has been started ### Usage diff --git a/docs/grid/api/blockselection/blockselectionvalidate_event.md b/docs/grid/api/blockselection/blockselectionvalidate_event.md index 0d5210e66..0cbb3b2a0 100644 --- a/docs/grid/api/blockselection/blockselectionvalidate_event.md +++ b/docs/grid/api/blockselection/blockselectionvalidate_event.md @@ -6,6 +6,10 @@ description: You can explore the blockSelectionValidate event of Grid block sele # blockSelectionValidate +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered to check the possibility of starting a selection ### Usage diff --git a/docs/grid/api/blockselection/disable_method.md b/docs/grid/api/blockselection/disable_method.md index fc115955c..bf9284ec1 100644 --- a/docs/grid/api/blockselection/disable_method.md +++ b/docs/grid/api/blockselection/disable_method.md @@ -6,6 +6,10 @@ description: You can explore the disable method of Grid block selection in the d # disable() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: disables the BlockSelection module and resets processing of block selection in Grid @signature: {'disable(): void;'} diff --git a/docs/grid/api/blockselection/enable_method.md b/docs/grid/api/blockselection/enable_method.md index 0ff4fea44..71623cbbf 100644 --- a/docs/grid/api/blockselection/enable_method.md +++ b/docs/grid/api/blockselection/enable_method.md @@ -6,6 +6,10 @@ description: You can explore the enable method of Grid block selection in the do # enable() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: enables the BlockSelection module and activates the capabilities of block selection in Grid @signature: {'enable(): void;'} diff --git a/docs/grid/api/blockselection/isdisabled_method.md b/docs/grid/api/blockselection/isdisabled_method.md index 9cd43df85..a1a9e74c0 100644 --- a/docs/grid/api/blockselection/isdisabled_method.md +++ b/docs/grid/api/blockselection/isdisabled_method.md @@ -6,6 +6,10 @@ description: You can explore the isDisabled method of Grid block selection in th # isDisabled() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: returns the module's current state ### Usage diff --git a/docs/grid/api/clipboard/aftercopy_event.md b/docs/grid/api/clipboard/aftercopy_event.md index 81ee80b1d..fba0e0b47 100644 --- a/docs/grid/api/clipboard/aftercopy_event.md +++ b/docs/grid/api/clipboard/aftercopy_event.md @@ -6,6 +6,10 @@ description: You can explore the afterCopy event of Grid clipboard in the docume # afterCopy +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires after successfully copying or cutting data ### Usage diff --git a/docs/grid/api/clipboard/afterpaste_event.md b/docs/grid/api/clipboard/afterpaste_event.md index b1f50e28c..9365e16f4 100644 --- a/docs/grid/api/clipboard/afterpaste_event.md +++ b/docs/grid/api/clipboard/afterpaste_event.md @@ -6,6 +6,10 @@ description: You can explore the afterPaste event of Grid clipboard in the docum # afterPaste +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires after successfully pasting data ### Usage diff --git a/docs/grid/api/clipboard/beforecopy_event.md b/docs/grid/api/clipboard/beforecopy_event.md index aa08fe5a1..74a58a54f 100644 --- a/docs/grid/api/clipboard/beforecopy_event.md +++ b/docs/grid/api/clipboard/beforecopy_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeCopy event of Grid clipboard in the docum # beforeCopy +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires before copying or cutting data ### Usage diff --git a/docs/grid/api/clipboard/beforepaste_event.md b/docs/grid/api/clipboard/beforepaste_event.md index 78c153bcb..9f973639a 100644 --- a/docs/grid/api/clipboard/beforepaste_event.md +++ b/docs/grid/api/clipboard/beforepaste_event.md @@ -6,6 +6,10 @@ description: You can explore the beforePaste event of Grid clipboard in the docu # beforePaste +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires before pasting data from the clipboard ### Usage diff --git a/docs/grid/api/clipboard/copyerror_event.md b/docs/grid/api/clipboard/copyerror_event.md index 7f64a4503..065550cf7 100644 --- a/docs/grid/api/clipboard/copyerror_event.md +++ b/docs/grid/api/clipboard/copyerror_event.md @@ -6,6 +6,10 @@ description: You can explore the copyError event of Grid clipboard in the docume # copyError +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires when an error occurs during copying or cutting (e.g., clipboard access is blocked) ### Usage diff --git a/docs/grid/api/clipboard/pasteerror_event.md b/docs/grid/api/clipboard/pasteerror_event.md index 557f52866..2b37aeee8 100644 --- a/docs/grid/api/clipboard/pasteerror_event.md +++ b/docs/grid/api/clipboard/pasteerror_event.md @@ -6,6 +6,10 @@ description: You can explore the pasteError event of Grid clipboard in the docum # pasteError +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires when an error occurs during pasting (e.g., clipboard is empty or data is invalid) ### Usage diff --git a/docs/grid/api/dragpanel/dragpanelitemclick_event.md b/docs/grid/api/dragpanel/dragpanelitemclick_event.md index b0387201e..51cd75529 100644 --- a/docs/grid/api/dragpanel/dragpanelitemclick_event.md +++ b/docs/grid/api/dragpanel/dragpanelitemclick_event.md @@ -6,6 +6,10 @@ description: You can explore the dragPanelItemClick event of Grid drag panel in # dragPanelItemClick +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered when the drag panel item is clicked ### Usage diff --git a/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md b/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md index 320a1a015..4d5c7d570 100644 --- a/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md +++ b/docs/grid/api/dragpanel/dragpanelitemmousedown_event.md @@ -6,6 +6,10 @@ description: You can explore the dragPanelItemMouseDown event of Grid drag panel # dragPanelItemMouseDown +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered when the mouse button is pressed on the drag panel item ### Usage diff --git a/docs/grid/api/grid_adjust_config.md b/docs/grid/api/grid_adjust_config.md index 47dbbec22..4393a704d 100644 --- a/docs/grid/api/grid_adjust_config.md +++ b/docs/grid/api/grid_adjust_config.md @@ -60,8 +60,8 @@ The width the columns will be adjusted to also depends on the values of the [`mi - in case of complex HTML data, usage of the `adjust` config may lead to incorrect size calculations - the enabled `adjust` config (including the "header", "footer", "data" modes) adjusts the width of columns taking into account the [`template`](grid/api/api_gridcolumn_properties.md) added to cells. You need to set the **content** attribute of the [`header/footer`](grid/api/api_gridcolumn_properties.md) properties to one of the following modes: "avg" | "sum" | "max" | "min" | "count", otherwise **text** will be calculated -@changelog: added in v6.4 +**Related API**: [`adjustColumnWidth()`](grid/api/grid_adjustcolumnwidth_method.md) -[comment]: # (@relatedapi: grid/api/grid_adjustcolumnwidth_method.md) +**Related article**: [Autosize for columns](grid/configuration.md#autosize-for-columns) -[comment]: # (@related: grid/initialization.md#initialize-grid grid/configuration.md#autosize-for-columns) +@changelog: added in v6.4 diff --git a/docs/grid/api/grid_adjustcolumnwidth_method.md b/docs/grid/api/grid_adjustcolumnwidth_method.md index 7b5add192..2487c65f8 100644 --- a/docs/grid/api/grid_adjustcolumnwidth_method.md +++ b/docs/grid/api/grid_adjustcolumnwidth_method.md @@ -21,4 +21,4 @@ grid.adjustColumnWidth("b", "header"); If no value is set to the `adjust` parameter, the `adjustColumnWidth()` method sets it to *true*. -[comment]: # (@relatedapi: grid/api/grid_adjust_config.md) +**Related API**: [`adjust`](grid/api/grid_adjust_config.md) diff --git a/docs/grid/api/grid_autoheight_config.md b/docs/grid/api/grid_autoheight_config.md index 30744991f..75ff5eb49 100644 --- a/docs/grid/api/grid_autoheight_config.md +++ b/docs/grid/api/grid_autoheight_config.md @@ -6,7 +6,7 @@ description: You can explore the autoHeight config of Grid in the documentation # autoHeight -:::tip Pro version only +:::tip pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: diff --git a/docs/grid/api/grid_beforecolumndrag_event.md b/docs/grid/api/grid_beforecolumndrag_event.md index dcebc81db..bd1417bbc 100644 --- a/docs/grid/api/grid_beforecolumndrag_event.md +++ b/docs/grid/api/grid_beforecolumndrag_event.md @@ -6,7 +6,9 @@ description: You can explore the beforeColumnDrag event of Grid in the documenta # beforeColumnDrag -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires before dragging of a column has started diff --git a/docs/grid/api/grid_beforecolumndrop_event.md b/docs/grid/api/grid_beforecolumndrop_event.md index 7c562f43f..b47d15b19 100644 --- a/docs/grid/api/grid_beforecolumndrop_event.md +++ b/docs/grid/api/grid_beforecolumndrop_event.md @@ -6,7 +6,9 @@ description: You can explore the beforeColumnDrop event of Grid in the documenta # beforeColumnDrop -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires before the user has finished dragging and released the mouse button over a target column diff --git a/docs/grid/api/grid_beforerowresize_event.md b/docs/grid/api/grid_beforerowresize_event.md index ea0e1c70a..46f0b5b56 100644 --- a/docs/grid/api/grid_beforerowresize_event.md +++ b/docs/grid/api/grid_beforerowresize_event.md @@ -6,7 +6,9 @@ description: You can explore the beforeRowResize event of Grid in the documentat # beforeRowResize -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires before the height of a row is changed diff --git a/docs/grid/api/grid_blockselection_config.md b/docs/grid/api/grid_blockselection_config.md index fc2553c15..69d2a1d9f 100644 --- a/docs/grid/api/grid_blockselection_config.md +++ b/docs/grid/api/grid_blockselection_config.md @@ -6,7 +6,7 @@ description: You can explore the blockSelection config of Grid in the documentat # blockSelection -:::tip Pro version only +:::tip pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: diff --git a/docs/grid/api/grid_cancelcolumndrop_event.md b/docs/grid/api/grid_cancelcolumndrop_event.md index 518abab6d..67bb5c010 100644 --- a/docs/grid/api/grid_cancelcolumndrop_event.md +++ b/docs/grid/api/grid_cancelcolumndrop_event.md @@ -6,7 +6,9 @@ description: You can explore the cancelColumnDrop event of Grid in the documenta # cancelColumnDrop -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires on moving a mouse pointer out of borders of a column while dragging the column diff --git a/docs/grid/api/grid_cancolumndrop_event.md b/docs/grid/api/grid_cancolumndrop_event.md index f2438d927..2219653d5 100644 --- a/docs/grid/api/grid_cancolumndrop_event.md +++ b/docs/grid/api/grid_cancolumndrop_event.md @@ -6,7 +6,9 @@ description: You can explore the canColumnDrop event of Grid in the documentatio # canColumnDrop -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires when a dragged column is placed over a target column diff --git a/docs/grid/api/grid_clipboard_config.md b/docs/grid/api/grid_clipboard_config.md index f25bc10f3..e08eab058 100644 --- a/docs/grid/api/grid_clipboard_config.md +++ b/docs/grid/api/grid_clipboard_config.md @@ -6,7 +6,7 @@ description: You can explore the clipboard config of Grid in the documentation o # clipboard -:::tip Pro version only +:::tip pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: diff --git a/docs/grid/api/grid_dragcolumnin_event.md b/docs/grid/api/grid_dragcolumnin_event.md index 50ae5a2c6..4ef0a480e 100644 --- a/docs/grid/api/grid_dragcolumnin_event.md +++ b/docs/grid/api/grid_dragcolumnin_event.md @@ -6,7 +6,9 @@ description: You can explore the dragColumnIn event of Grid in the documentation # dragColumnIn -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires when a column is dragged to another potential target diff --git a/docs/grid/api/grid_dragcolumnout_event.md b/docs/grid/api/grid_dragcolumnout_event.md index 7986cc063..e9dab30b4 100644 --- a/docs/grid/api/grid_dragcolumnout_event.md +++ b/docs/grid/api/grid_dragcolumnout_event.md @@ -6,7 +6,9 @@ description: You can explore the dragColumnOut event of Grid in the documentatio # dragColumnOut -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires when a column is dragged out of a potential target diff --git a/docs/grid/api/grid_dragcolumnstart_event.md b/docs/grid/api/grid_dragcolumnstart_event.md index d1539b66d..1eeae7a87 100644 --- a/docs/grid/api/grid_dragcolumnstart_event.md +++ b/docs/grid/api/grid_dragcolumnstart_event.md @@ -6,7 +6,9 @@ description: You can explore the dragColumnStart event of Grid in the documentat # dragColumnStart -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: fires when dragging of a column has started diff --git a/docs/grid/api/grid_dragpanel_config.md b/docs/grid/api/grid_dragpanel_config.md index ea47b7447..36d8c5b9b 100644 --- a/docs/grid/api/grid_dragpanel_config.md +++ b/docs/grid/api/grid_dragpanel_config.md @@ -6,7 +6,7 @@ description: You can explore the dragPanel config of Grid in the documentation o # dragPanel -:::tip Pro version only +:::tip pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: diff --git a/docs/grid/api/grid_footerautoheight_config.md b/docs/grid/api/grid_footerautoheight_config.md index f1c55b35c..7be6839fe 100644 --- a/docs/grid/api/grid_footerautoheight_config.md +++ b/docs/grid/api/grid_footerautoheight_config.md @@ -6,10 +6,13 @@ description: You can explore the footerAutoHeight config of Grid in the document # footerAutoHeight -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: Optional. Allows adjusting the height of the footer for the content to fit in -@signature: footerAutoHeight?: boolean; + +@signature: {'footerAutoHeight?: boolean;'} @default: false diff --git a/docs/grid/api/grid_getsubrow_method.md b/docs/grid/api/grid_getsubrow_method.md index 56e50053d..2979c185c 100644 --- a/docs/grid/api/grid_getsubrow_method.md +++ b/docs/grid/api/grid_getsubrow_method.md @@ -6,6 +6,10 @@ description: You can explore the getSubRow method of Grid in the documentation o # getSubRow() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: returns the configuration and content of a sub-row for the specified row :::info diff --git a/docs/grid/api/grid_headerautoheight_config.md b/docs/grid/api/grid_headerautoheight_config.md index 7a1625eb3..8e2536a47 100644 --- a/docs/grid/api/grid_headerautoheight_config.md +++ b/docs/grid/api/grid_headerautoheight_config.md @@ -6,7 +6,9 @@ description: You can explore the headerAutoHeight config of Grid in the document # headerAutoHeight -{{pronote This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @short: Optional. Allows adjusting the height of the header for the content to fit in diff --git a/docs/grid/api/grid_height_config.md b/docs/grid/api/grid_height_config.md index c4755a01d..aec8624e4 100644 --- a/docs/grid/api/grid_height_config.md +++ b/docs/grid/api/grid_height_config.md @@ -11,7 +11,10 @@ description: You can explore the height config of Grid in the documentation of t @signature: {'height?: number | "auto";'} @descr: -{{pronote The **height: "auto"** option requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package.}} + +:::tip note +The **height: "auto"** option requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: @example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/api/grid_history_config.md b/docs/grid/api/grid_history_config.md index bc924664e..774aecd94 100644 --- a/docs/grid/api/grid_history_config.md +++ b/docs/grid/api/grid_history_config.md @@ -6,7 +6,7 @@ description: You can explore the history config of Grid in the documentation of # history -:::tip Pro version only +:::tip pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: diff --git a/docs/grid/api/grid_multisort_config.md b/docs/grid/api/grid_multisort_config.md index 6cd0f008a..1494655eb 100644 --- a/docs/grid/api/grid_multisort_config.md +++ b/docs/grid/api/grid_multisort_config.md @@ -6,11 +6,12 @@ description: You can explore the multiSort config of Grid in the documentation o # multiSort +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: Optional. Enables the possibility of sorting Grid data by multiple columns -:::tip Pro version only -This functionality is available in the PRO edition only. -::: @signature: {'multiSort?: boolean;'} @@ -29,4 +30,7 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid. Sorting by multiple columns (multisorting)](https://snippet.dhtmlx.com/4ej0i3qi) -**Related article**: [Sorting by multiple columns](grid/usage.md#sorting-by-multiple-columns) \ No newline at end of file +**Related article**: [Sorting by multiple columns](grid/usage.md#sorting-by-multiple-columns) + +@changelog: +- Added in v9.1 \ No newline at end of file diff --git a/docs/grid/api/grid_rangeselection_config.md b/docs/grid/api/grid_rangeselection_config.md index 1b346f49d..5b40cbc3f 100644 --- a/docs/grid/api/grid_rangeselection_config.md +++ b/docs/grid/api/grid_rangeselection_config.md @@ -6,7 +6,7 @@ description: You can explore the rangeSelection config of Grid in the documentat # rangeSelection -:::tip Pro version only +:::tip pro version only This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. ::: diff --git a/docs/grid/api/grid_selection_config.md b/docs/grid/api/grid_selection_config.md index 1b35dc038..578da658f 100644 --- a/docs/grid/api/grid_selection_config.md +++ b/docs/grid/api/grid_selection_config.md @@ -27,4 +27,6 @@ When you set `selection:true`, the "complex" mode is applied. **Related sample**: [Grid. Selection](https://snippet.dhtmlx.com/ad6roqsx) -[comment]: # (@related: grid/initialization.md#initialize-grid grid/configuration.md#selection) +**Related articles:** +- [Selection](grid/configuration.md#selection) +- [Work with Selection object](grid/usage_selection.md) diff --git a/docs/grid/api/grid_spans_config.md b/docs/grid/api/grid_spans_config.md index d74c9464d..5c11ae37e 100644 --- a/docs/grid/api/grid_spans_config.md +++ b/docs/grid/api/grid_spans_config.md @@ -120,9 +120,10 @@ const grid = new dhx.Grid("grid_container", { - All necessary columns or rows will be in a span if the **spans** property is set for the columns located within the frozen area. - If the **spans** property is set for a number of columns or rows placed as in the frozen part as in the movable one, then the columns remained in the movable part only will be in a span. +**Related article:** [Spans](grid/configuration.md#spans) + @changelog: - The `tooltipTemplate` property is added in v9.0 - The ability to set the `tooltip` config as an object is added in v8.4 - The `tooltip` property is added in v6.5. -[comment]: # (@related: grid/initialization.md#initialize-grid grid/configuration.md#spans) diff --git a/docs/grid/api/grid_subrow_config.md b/docs/grid/api/grid_subrow_config.md index 812b78ab2..6bd285215 100644 --- a/docs/grid/api/grid_subrow_config.md +++ b/docs/grid/api/grid_subrow_config.md @@ -6,6 +6,10 @@ description: You can explore the subRow config of Grid in the documentation of t # subRow +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: Optional. Defines the sub-row content for each row of the main Grid :::note @@ -66,4 +70,7 @@ const grid = new dhx.Grid("grid_container", { **Related API**: [subRowConfig](grid/api/grid_subrowconfig_config.md) +@changelog: +- Added in v9.1 + \ No newline at end of file diff --git a/docs/grid/api/grid_subrowconfig_config.md b/docs/grid/api/grid_subrowconfig_config.md index 3dc470441..6095e3299 100644 --- a/docs/grid/api/grid_subrowconfig_config.md +++ b/docs/grid/api/grid_subrowconfig_config.md @@ -6,6 +6,10 @@ description: You can explore the subRowConfig config of Grid in the documentatio # subRowConfig +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: Optional. Specifies the configuration settings of a sub-row @signature: {'subRowConfig?: ((row: IRow) => ISubRowConfig) | ISubRowConfig;'} @@ -83,4 +87,7 @@ const grid = new dhx.Grid("grid_container", { **Related article:** [Row expander](grid/configuration.md#row-expander) **Related API**: [subRow](grid/api/grid_subrow_config.md) + +@changelog: +- Added in v9.1 \ No newline at end of file diff --git a/docs/grid/api/grid_summary_config.md b/docs/grid/api/grid_summary_config.md index feadbe2cf..c0b77ab55 100644 --- a/docs/grid/api/grid_summary_config.md +++ b/docs/grid/api/grid_summary_config.md @@ -84,7 +84,7 @@ console.log(summary); // { totalPopulation: 1000000, totalArea: 50000, density: **Related article:** [Custom statistics in the column header/footer and spans](../../configuration/#custom-statistics-in-the-column-headerfooter-and-spans) -**Related API**: [getSummary](grid/api/grid_getsummary_method.md) +**Related API**: [getSummary()](grid/api/grid_getsummary_method.md) @changelog: - Added in v9.0 \ No newline at end of file diff --git a/docs/grid/api/grid_tooltip_config.md b/docs/grid/api/grid_tooltip_config.md index cac62057e..01815eb7d 100644 --- a/docs/grid/api/grid_tooltip_config.md +++ b/docs/grid/api/grid_tooltip_config.md @@ -47,8 +47,9 @@ const grid = new dhx.Grid("grid_container", { - [Grid. Hiding tooltips](https://snippet.dhtmlx.com/mq4t3t3w) - [Grid. Tooltip config](https://snippet.dhtmlx.com/qpqnalyt) +**Related article:** [Tooltip](grid/configuration.md#tooltip) + @changelog: - The ability to set the `tooltip` config as an object is added in v8.4 - Added in v6.5 -[comment]: # (@related: grid/initialization.md#initialize-grid grid/configuration.md#tooltip) diff --git a/docs/grid/api/history/add_method.md b/docs/grid/api/history/add_method.md index f48155bf2..3517faec1 100644 --- a/docs/grid/api/history/add_method.md +++ b/docs/grid/api/history/add_method.md @@ -6,6 +6,10 @@ description: You can explore the add method of Grid history in the documentation # add() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: adds a new action into the history of actions within the Grid ### Usage diff --git a/docs/grid/api/history/afteradd_event.md b/docs/grid/api/history/afteradd_event.md index d15499179..4f8167d12 100644 --- a/docs/grid/api/history/afteradd_event.md +++ b/docs/grid/api/history/afteradd_event.md @@ -6,6 +6,10 @@ description: You can explore the afterAdd event of Grid history in the documenta # afterAdd +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered after successfully adding an action to the history @signature: {'afterAdd: (action: IAction) => void;'} diff --git a/docs/grid/api/history/afterredo_event.md b/docs/grid/api/history/afterredo_event.md index 41ab6ed99..4d4c7fe1c 100644 --- a/docs/grid/api/history/afterredo_event.md +++ b/docs/grid/api/history/afterredo_event.md @@ -6,6 +6,10 @@ description: You can explore the afterRedo event of Grid history in the document # afterRedo +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered after successfully redoing an action @signature: {'afterRedo: (action: IAction) => void;'} diff --git a/docs/grid/api/history/afterundo_event.md b/docs/grid/api/history/afterundo_event.md index 8bd84dcd2..56aebc37c 100644 --- a/docs/grid/api/history/afterundo_event.md +++ b/docs/grid/api/history/afterundo_event.md @@ -6,6 +6,10 @@ description: You can explore the afterUndo event of Grid history in the document # afterUndo +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered after successfully undoing an action @signature: {'afterUndo: (action: IAction) => void;'} diff --git a/docs/grid/api/history/beforeadd_event.md b/docs/grid/api/history/beforeadd_event.md index b5e18b82d..b2b926b4d 100644 --- a/docs/grid/api/history/beforeadd_event.md +++ b/docs/grid/api/history/beforeadd_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeAdd event of Grid history in the document # beforeAdd +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered before adding an action to the history @signature: {'beforeAdd: (action: IAction) => boolean | void;'} diff --git a/docs/grid/api/history/beforeredo_event.md b/docs/grid/api/history/beforeredo_event.md index 137eae93e..316373d56 100644 --- a/docs/grid/api/history/beforeredo_event.md +++ b/docs/grid/api/history/beforeredo_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeRedo event of Grid history in the documen # beforeRedo +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered before redoing an action @signature: {'beforeRedo: (action: IAction) => boolean | void;'} diff --git a/docs/grid/api/history/beforeundo_event.md b/docs/grid/api/history/beforeundo_event.md index a0091cc3a..f9d2060c5 100644 --- a/docs/grid/api/history/beforeundo_event.md +++ b/docs/grid/api/history/beforeundo_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeUndo event of Grid history in the documen # beforeUndo +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered before undoing an action @signature: {'beforeUndo: (action: IAction) => boolean | void;'} diff --git a/docs/grid/api/history/canredo_method.md b/docs/grid/api/history/canredo_method.md index 76f0d1062..4048c14cc 100644 --- a/docs/grid/api/history/canredo_method.md +++ b/docs/grid/api/history/canredo_method.md @@ -6,6 +6,10 @@ description: You can explore the canRedo method of Grid history in the documenta # canRedo() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: checks whether an action within the Grid history can be redone @signature: {'canRedo(): boolean;'} diff --git a/docs/grid/api/history/canundo_method.md b/docs/grid/api/history/canundo_method.md index 71ab9249a..2b8a8d7ba 100644 --- a/docs/grid/api/history/canundo_method.md +++ b/docs/grid/api/history/canundo_method.md @@ -6,6 +6,10 @@ description: You can explore the canUndo method of Grid history in the documenta # canUndo() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: checks whether an action within the Grid history can be undone @signature: {'canUndo(): boolean;'} diff --git a/docs/grid/api/history/disable_method.md b/docs/grid/api/history/disable_method.md index 5bab402bd..c849778b4 100644 --- a/docs/grid/api/history/disable_method.md +++ b/docs/grid/api/history/disable_method.md @@ -6,6 +6,10 @@ description: You can explore the disable method of Grid history in the documenta # disable() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: disables the module, preventing the addition of new actions to the Grid history and the execution of any operations @signature: {'disable(): void;'} diff --git a/docs/grid/api/history/enable_method.md b/docs/grid/api/history/enable_method.md index 62fd93b8e..40ecdab5b 100644 --- a/docs/grid/api/history/enable_method.md +++ b/docs/grid/api/history/enable_method.md @@ -6,6 +6,10 @@ description: You can explore the enable method of Grid history in the documentat # enable() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: enables the module, allowing the addition of new actions to the Grid history @signature: {'enable(): void;'} diff --git a/docs/grid/api/history/error_event.md b/docs/grid/api/history/error_event.md index 630ae68b0..b4c267455 100644 --- a/docs/grid/api/history/error_event.md +++ b/docs/grid/api/history/error_event.md @@ -6,6 +6,10 @@ description: You can explore the error event of Grid history in the documentatio # error +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: triggered when an error occurs :::note diff --git a/docs/grid/api/history/gethistory_method.md b/docs/grid/api/history/gethistory_method.md index 9b1ca5bc7..98b6f3fc4 100644 --- a/docs/grid/api/history/gethistory_method.md +++ b/docs/grid/api/history/gethistory_method.md @@ -6,6 +6,10 @@ description: You can explore the getHistory method of Grid history in the docume # getHistory() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: returns a copy of the array of all actions in the Grid history to prevent accidental modification of the internal structure @signature: {'getHistory(): IAction[];'} diff --git a/docs/grid/api/history/isdisabled_method.md b/docs/grid/api/history/isdisabled_method.md index 5a3a3a0e7..dc6747e71 100644 --- a/docs/grid/api/history/isdisabled_method.md +++ b/docs/grid/api/history/isdisabled_method.md @@ -6,6 +6,10 @@ description: You can explore the isDisabled method of Grid history in the docume # isDisabled() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: returns the module's current state @signature: {'isDisabled(): boolean;'} diff --git a/docs/grid/api/history/redo_method.md b/docs/grid/api/history/redo_method.md index 7eaec40bc..8c86f1656 100644 --- a/docs/grid/api/history/redo_method.md +++ b/docs/grid/api/history/redo_method.md @@ -6,6 +6,10 @@ description: You can explore the redo method of Grid history in the documentatio # redo() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: reapplies the last undone action in the Grid history :::note diff --git a/docs/grid/api/history/remove_method.md b/docs/grid/api/history/remove_method.md index 026c11e2e..cb0378ae0 100644 --- a/docs/grid/api/history/remove_method.md +++ b/docs/grid/api/history/remove_method.md @@ -6,6 +6,10 @@ description: You can explore the remove method of Grid history in the documentat # remove() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: removes the last action from the Grid history :::note diff --git a/docs/grid/api/history/removeall_method.md b/docs/grid/api/history/removeall_method.md index 83deb7c82..2e967aa98 100644 --- a/docs/grid/api/history/removeall_method.md +++ b/docs/grid/api/history/removeall_method.md @@ -6,6 +6,10 @@ description: You can explore the removeAll method of Grid history in the documen # removeAll() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: clears the entire Grid history and the redo stack :::note diff --git a/docs/grid/api/history/undo_method.md b/docs/grid/api/history/undo_method.md index 6dcc6e594..876157cb9 100644 --- a/docs/grid/api/history/undo_method.md +++ b/docs/grid/api/history/undo_method.md @@ -6,6 +6,10 @@ description: You can explore the undo method of Grid history in the documentatio # undo() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: undoes the last action in the Grid history Depending on the type of the action, the method either applies the inverse action (for the "change" and "removeAll" types) or restores data (for the "add" and "remove" types). diff --git a/docs/grid/api/rangeselection/afterresetrange_event.md b/docs/grid/api/rangeselection/afterresetrange_event.md index 437d57559..ed7b5de92 100644 --- a/docs/grid/api/rangeselection/afterresetrange_event.md +++ b/docs/grid/api/rangeselection/afterresetrange_event.md @@ -6,6 +6,10 @@ description: You can explore the afterResetRange event of Grid range selection i # afterResetRange +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires after a range has been successfully reset ### Usage diff --git a/docs/grid/api/rangeselection/aftersetrange_event.md b/docs/grid/api/rangeselection/aftersetrange_event.md index 6ace68e22..cbc0d81b1 100644 --- a/docs/grid/api/rangeselection/aftersetrange_event.md +++ b/docs/grid/api/rangeselection/aftersetrange_event.md @@ -6,6 +6,10 @@ description: You can explore the afterSetRange event of Grid range selection in # afterSetRange +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires after a range has been successfully set ### Usage diff --git a/docs/grid/api/rangeselection/beforeresetrange_event.md b/docs/grid/api/rangeselection/beforeresetrange_event.md index 4d848166c..b1ecb2dde 100644 --- a/docs/grid/api/rangeselection/beforeresetrange_event.md +++ b/docs/grid/api/rangeselection/beforeresetrange_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeResetRange event of Grid range selection # beforeResetRange +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires before resetting the range ### Usage diff --git a/docs/grid/api/rangeselection/beforesetrange_event.md b/docs/grid/api/rangeselection/beforesetrange_event.md index 983584c54..ed362d0ba 100644 --- a/docs/grid/api/rangeselection/beforesetrange_event.md +++ b/docs/grid/api/rangeselection/beforesetrange_event.md @@ -6,6 +6,10 @@ description: You can explore the beforeSetRange event of Grid range selection in # beforeSetRange +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: fires before setting a new range ### Usage diff --git a/docs/grid/api/rangeselection/disable_method.md b/docs/grid/api/rangeselection/disable_method.md index bc7bdd5fe..2fef90bb8 100644 --- a/docs/grid/api/rangeselection/disable_method.md +++ b/docs/grid/api/rangeselection/disable_method.md @@ -6,6 +6,10 @@ description: You can explore the disable method of Grid range selection in the d # disable() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: disables the RangeSelection module and resets the current range in Grid ### Usage diff --git a/docs/grid/api/rangeselection/enable_method.md b/docs/grid/api/rangeselection/enable_method.md index 5fa85fa95..3ddaeb2e9 100644 --- a/docs/grid/api/rangeselection/enable_method.md +++ b/docs/grid/api/rangeselection/enable_method.md @@ -6,6 +6,10 @@ description: You can explore the enable method of Grid range selection in the do # enable() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: enables the RangeSelection module and activates the capabilities of range selection in Grid ### Usage diff --git a/docs/grid/api/rangeselection/getrange_method.md b/docs/grid/api/rangeselection/getrange_method.md index d4d0c2fc9..f64a307c4 100644 --- a/docs/grid/api/rangeselection/getrange_method.md +++ b/docs/grid/api/rangeselection/getrange_method.md @@ -6,6 +6,10 @@ description: You can explore the getRange method of Grid range selection in the # getRange() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: returns the current selection range ### Usage diff --git a/docs/grid/api/rangeselection/getrangedcells_method.md b/docs/grid/api/rangeselection/getrangedcells_method.md index 3475b5c9a..cff88c5ec 100644 --- a/docs/grid/api/rangeselection/getrangedcells_method.md +++ b/docs/grid/api/rangeselection/getrangedcells_method.md @@ -6,6 +6,10 @@ description: You can explore the getRangedCells method of Grid range selection i # getRangedCells() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: returns an array of cells within the current range ### Usage diff --git a/docs/grid/api/rangeselection/isdisabled_method.md b/docs/grid/api/rangeselection/isdisabled_method.md index 3db9486ae..c489d71d5 100644 --- a/docs/grid/api/rangeselection/isdisabled_method.md +++ b/docs/grid/api/rangeselection/isdisabled_method.md @@ -6,6 +6,10 @@ description: You can explore the isDisabled method of Grid range selection in th # isDisabled() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: returns the module's current state ### Usage diff --git a/docs/grid/api/rangeselection/isranged_method.md b/docs/grid/api/rangeselection/isranged_method.md index 27cf88eb1..b6c955da1 100644 --- a/docs/grid/api/rangeselection/isranged_method.md +++ b/docs/grid/api/rangeselection/isranged_method.md @@ -6,6 +6,10 @@ description: You can explore the isRanged method of Grid range selection in the # isRanged() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: checks whether a cell is within the current range ### Usage diff --git a/docs/grid/api/rangeselection/resetrange_method.md b/docs/grid/api/rangeselection/resetrange_method.md index 843824655..4a3488097 100644 --- a/docs/grid/api/rangeselection/resetrange_method.md +++ b/docs/grid/api/rangeselection/resetrange_method.md @@ -6,6 +6,10 @@ description: You can explore the resetRange method of Grid range selection in th # resetRange() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: resets the current selection range ### Usage diff --git a/docs/grid/api/rangeselection/setrange_method.md b/docs/grid/api/rangeselection/setrange_method.md index 649642231..3ad4e8c46 100644 --- a/docs/grid/api/rangeselection/setrange_method.md +++ b/docs/grid/api/rangeselection/setrange_method.md @@ -6,6 +6,10 @@ description: You can explore the setRange method of Grid range selection in the # setRange() +:::tip pro version only +This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) package. +::: + @short: sets the selection range ### Usage diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index b4b7ee7ea..82e9a61f0 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -804,6 +804,10 @@ const grid = new dhx.Grid("grid_container", { }); ~~~ +:::info +Note that on scrolling the grid the cell editor will be closed only when the cell is not in the visible area of the table anymore. +::: + ### Types of column editor You can specify the way of editing the cells of a Grid column depending on its content as a simple input, a date picker, a textarea control, a checkbox, a select, a multiselect or a combobox. The type of the used editor can be defined either by the `editorType` property of a [column](grid/api/grid_columns_config.md) or via the `type` one. diff --git a/docs/grid/features.md b/docs/grid/features.md index b3a4b3a2b..e05ae2d0e 100644 --- a/docs/grid/features.md +++ b/docs/grid/features.md @@ -293,7 +293,7 @@ In this section you will find the ways of working with selection functionality. | [Enabling multiselection](../configuration/#multiple-selection-of-grid-cells) | Learn how to enable multi-row/multi-cell selection in Grid ([Example](https://snippet.dhtmlx.com/4nj0e9ye)) | | [Working with selection](../usage_selection/) | Learn how to enable/disable selection, set selection to cells, remove selection, and get the object of a selected cell ([Example](https://snippet.dhtmlx.com/4nj0e9ye)) | | [Selection API](../../category/selection-api/) | Learn how to use the API of Selection to manage the selection of Grid cells | -| [Keyboard navigation](../configuration/#arrow-shortcut-keys) | Learn how to enable key navigation that allows moving the selection between cells ([Example](https://snippet.dhtmlx.com/y9kdk0md)) | +| [Keyboard navigation](../configuration/#shortcut-keys-for-moving-selection-between-cells) | Learn how to enable key navigation that allows moving the selection between cells ([Example](https://snippet.dhtmlx.com/y9kdk0md)) | ## How to work with range selection diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index 80a0591f1..c8a731737 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -16,7 +16,7 @@ The `DragPanel` module provides auxiliary functionality for moving rows in the * The module is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. -You can also adjust the appearance and behavior of the `DragPanel` module via the [configuration options](grid/configuration.md/#adjusting-the-dragpanel-module). +You can also adjust the appearance and behavior of the `DragPanel` module via the [configuration options](grid/configuration.md/#adjusting-dragpanel-module). ## Initializing the DragPanel module @@ -45,7 +45,7 @@ const grid = new dhx.Grid("grid_container", { **Related sample**: [Grid (TreeGrid). DragPanel. Initialization](https://snippet.dhtmlx.com/uevdwjuo) The `dragPanel` property can also be set as an *object* to enable the module and provide additional configuration options. -Learn about configuration possibilities of the drag panel in the [Configuration](grid/configuration.md/#adjusting-the-dragpanel-module) guide. +Learn about configuration possibilities of the drag panel in the [Configuration](grid/configuration.md/#adjusting-dragpanel-module) guide. ## Using events of the DragPanel module diff --git a/docs/whatsnew.md b/docs/whatsnew.md index ead56ff26..bec86fcb7 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -10,10 +10,14 @@ Before updating DHTMLX to the latest version, please check the [Migration to New ## Version 9.2 -Released on June X, 2025 +Released on July X, 2025 Review of the release on the blog +### Breaking changes + +This version brings some updates in the use of the export module used for [exporting Grid data to an Excel file](grid/usage.md/#exporting-data-to-excel). Check the [Migration](migration.md#91---92) guide to keep in step with the latest updates. + ### New functionality - Grid. The [`RangeSelection` module](grid/usage_rangeselection.md) is added to provide functionality for managing range selection in Grid (PRO version) @@ -147,7 +151,9 @@ The following shortcut key is available when the [`editable` mode](grid/api/grid - Grid. The issue with falsy selection of fixed cells while selecting unfrozen cells - Grid. The issue with dragging unselected items - Grid. Sorting of the Date string (ISO) values results in the invalid format error -- Grid. Export. Grid. Double quotes in the cell value are escaped in the exported Excel +- Grid. Export. Double quotes in the cell value are escaped in the exported Excel +- Grid. The issue with editor closing and saving the entered value on scrolling the grid +- Grid. The `draggable:false` setting of a column affects the drag-n-drop of rows ### New samples @@ -256,10 +262,18 @@ This version brings some updates in the API methods. Check the [Migration](migra ### New functionality +#### DataCollection/TreeCollection + +- The new [`getSortingStates()`](data_collection/api/datacollection_getsortingstates_method.md) method to get the current state of data sorting (including sorting by multiple columns) + #### Grid - [Row expander](grid/configuration.md#row-expander) with the possibility to insert any Suite widget or HTML content (PRO version) + - new Grid configuration property: [`subRow`](grid/api/grid_subrow_config.md) + - new Grid configuration property: [`subRowConfig`](grid/api/grid_subrowconfig_config.md) + - new method: [`getSubRow()`](grid/api/grid_getsubrow_method.md) - [Multi-sorting](grid/usage.md#sorting-by-multiple-columns) functionality that allows sorting Grid by several columns (PRO version) + - new Grid configuration property: [`multiSort`](grid/api/grid_multisort_config.md) ### Fixes From a9c7c841811dc4b073359e385a38a25cc6c0b243 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Thu, 10 Jul 2025 16:42:55 +0300 Subject: [PATCH 40/47] [update] docs for export to excel for v9.2 --- docs/grid/api/export/grid_xlsx_method.md | 2 +- docs/grid/usage.md | 25 +++++++++++++++++------ docs/migration.md | 26 +++++++++++++++--------- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/docs/grid/api/export/grid_xlsx_method.md b/docs/grid/api/export/grid_xlsx_method.md index 13fb7b8f6..4c546902c 100644 --- a/docs/grid/api/export/grid_xlsx_method.md +++ b/docs/grid/api/export/grid_xlsx_method.md @@ -16,7 +16,7 @@ DHTMLX Grid uses the WebAssembly-based library [Json2Excel](https://github.com/d @params: - `config` - (optional) an object with export settings. You can specify the following settings for export to Excel: - - `url?: string` - (optional) a local path to the **worker.js** file of the [Json2Excel](https://github.com/dhtmlx/json2excel) library (where export will be processed) set as `"../libs/json2excel/1.3/worker.js?vx"` + - `url?: string` - (optional) the path to the **worker.js** file of the [Json2Excel](https://github.com/dhtmlx/json2excel) library (where export will be processed) set as `"../libs/json2excel/1.3/worker.js?vx"`, if the local export server is used. The path to the public export server is used by default - `name?: string` - (optional) "grid" by default. The name of a ready Excel file - `tableName?: string` - (optional) "data" by default. The name of a sheet with grid data in the Excel file - `dateFormatMask?: string` - (optional) "dd/mm/yy" by default. The mask used for [dates formatting in Excel](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e) diff --git a/docs/grid/usage.md b/docs/grid/usage.md index 79227da80..63ad82da5 100644 --- a/docs/grid/usage.md +++ b/docs/grid/usage.md @@ -477,12 +477,15 @@ You can easily export data of Grid into the Excel, CSV, PDF, or PNG format. #### Exporting data to Excel -DHTMLX Grid uses the WebAssembly-based library [Json2Excel](https://github.com/dhtmlx/json2excel) to enable the export to Excel functionality and the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module to export data from Grid into an Excel file. Thus, to have the possibility of exporting files you need to: +Since v9.2 DHTMLX Grid uses the WebAssembly-based library [Json2Excel](https://github.com/dhtmlx/json2excel) to enable the export to Excel functionality and the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module to export data from Grid into an Excel file. You can use either the public export server or a local export server. -- install the [Json2Excel](https://github.com/dhtmlx/json2excel) library -- if you need to set a local path to the export module on your computer, specify the `url` option in the configuration object of the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method and set the path to the **worker.js** file like: `"../libs/json2excel/1.3/worker.js?vx"`. If the local path isn't set, the link to the file from CDN will be used -- call the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module. The method takes an [object with export settings](grid/api/export/grid_xlsx_method.md) as a parameter (all settings are optional) +Thus, to have the possibility of exporting files you need to: +- call the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method of the `Export` module. The method takes an [object with export settings](grid/api/export/grid_xlsx_method.md) as a parameter (all settings are optional) + - if you use the public export server, you don't need to specify the link to it, since it is used by default + - if you use your own export server, you need to: + - install the [Json2Excel](https://github.com/dhtmlx/json2excel) library + - provide a local path to the export module on your computer by setting the path to the **worker.js** file as `"../libs/json2excel/1.3/worker.js?vx"`, as a value of the `url` option in the configuration object of the [`xlsx()`](grid/api/export/grid_xlsx_method.md) method ~~~jsx grid.export.xlsx({ url: "../libs/json2excel/1.3/worker.js?vx", // a local path to the export module @@ -492,14 +495,24 @@ grid.export.xlsx({ }); ~~~ -:::note You can check the latest version of the Json2Excel library at the [github repository](https://github.com/dhtmlx/json2excel). -::: Read the details on dates formatting in Excel in the [related Excel documentation](https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-in-excel-8e10019e-d5d8-47a1-ba95-db95123d273e). **Related sample**: [Grid. Export to xlsx and csv](https://snippet.dhtmlx.com/58oqij47) +:::note +The export module server used in the Suite versions up to v9.1 is still available. You can either set the path to the public export server as: + +~~~jsx +grid.export.xlsx({ + url: "//export.dhtmlx.com/excel" +}); +~~~ + +or provide a local path to the export module on your computer as a value of the `url` property of the export method. +::: + #### Exporting data to CSV You can export data from Grid to the CSV format with the [`csv()`](grid/api/export/grid_csv_method.md) method of the Export module. The method takes an [object with export settings](grid/api/export/grid_csv_method.md) as a parameter (all settings are optional). diff --git a/docs/migration.md b/docs/migration.md index c1a4dfb5c..4b330d223 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -11,27 +11,33 @@ description: You can explore how to migrate to newer versions in the documentati ### Grid -Since v9.2 the Grid component uses the WebAssembly-based library [Json2Excel](https://github.com/dhtmlx/json2excel) for [exporting Grid data to an Excel file](grid/usage.md/#exporting-data-to-excel). By default, you don't need to specify the link to the export module. +#### Export to Excel module update -However, if you use your own export server, you need to install the **Json2Excel** library and provide the local path to the export module on your computer by setting the path to the **worker.js** file as `"../libs/json2excel/1.3/worker.js?vx"`: +Since v9.2 the Grid component uses the WebAssembly-based library [Json2Excel](https://github.com/dhtmlx/json2excel) for [exporting Grid data to an Excel file](grid/usage.md/#exporting-data-to-excel). As earlier, you can use either the public export server or a local export server. -~~~jsx title="Before v9.2" +##### From v9.2 + +The link to the public export server is used by default, so you don't need to specify it. If you use your own export server, you need to install the **Json2Excel** library and provide the local path to the export module on your computer by setting the path to the **worker.js** file as `"../libs/json2excel/1.3/worker.js?vx"`: + +~~~jsx grid.export.xlsx({ - url: "https://export.dhtmlx.com/excel", // optional, the link to the export module + url: "../libs/json2excel/1.3/worker.js?vx", // the path to the export module, if a local export server is used // more export settings }); ~~~ -~~~jsx title="From v9.2" +##### Up to v9.1 + +The previously used export module server is still available for the Suite versions up to v9.1. You can either set the path to the public export server as: + +~~~jsx grid.export.xlsx({ - url: "../libs/json2excel/1.3/worker.js?vx", // optional, a local path to the export module - // more export settings + url: "//export.dhtmlx.com/excel" }); ~~~ -:::info -The previously used export module server is still available for the Suite versions up to v9.1. -::: +or provide a local path to the export module on your computer as a value of the `url` property of the export method. + 9.0 -> 9.1 ----------- From f35d3be1e8ffb478f3bed0ab6eadc286e39021af Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Fri, 11 Jul 2025 17:11:54 +0300 Subject: [PATCH 41/47] [update] what's new for v 9.2 --- docs/assets/grid/dragpanel_modulle4.png | Bin 0 -> 41218 bytes docs/grid/api/history/add_method.md | 12 ++++++---- docs/grid/api/history/afteradd_event.md | 28 +++++++++++++++++++---- docs/grid/api/history/afterredo_event.md | 27 ++++++++++++++++++---- docs/grid/api/history/afterundo_event.md | 13 +++++++---- docs/grid/configuration.md | 2 +- docs/grid/usage_dragpanel.md | 2 +- docs/whatsnew.md | 1 + 8 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 docs/assets/grid/dragpanel_modulle4.png diff --git a/docs/assets/grid/dragpanel_modulle4.png b/docs/assets/grid/dragpanel_modulle4.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9cdb2fbe84c4fb194f127a30e507268d04724d GIT binary patch literal 41218 zcmcG!V{~TA6F!Gw4JzyBM8Vh zr++?Q)=dfAK5s%gNyvym9znt)e4&>AX=4fkLI@%u{9V~C{dCP!TSaBP>tm9i0|8%H z9>_Y?)s|ow5ZTC_J~tA|EK?i74wQ{qe$9=T2lBtoSF-ffrNOj%Z(<|ozQvP?@?1z=l)n}fX{%pPlh1HaOp=)%Swa|UWqJFO)({iDv8dT37@B$zbFBr^`veHOqCDG%HSPgPKDli^+UD(o%dZb z%k-SY(zk7x%W={9Vvv)?$8mzA=|IqvCY}ODvg8dutNm*OT^xu=&%h335QJPUHsf<) zC9*xqIguR%B;K^8Dy-#K@-H1rW5IMWK*la?bysH1HY;8}m&)DVH|qJ)m&>6!Gb|5y zGhyJTNs7yM5%8OA5D9z|V=S$NvZ^PqU-qq@R^p>}OI4R|-2*Kq;mDTZ4#~Wlt%+=H z7A3+UaTjj4{0cJ-&CBjUQ|O`aPizKUH@Zh+qE&sGzx&JtlWWP}B#{YiM z9diRPLa|E@h?^m?x30+WX$3pIReX(9_hprFod}qqR*n(v7g}JKVi&}P z4?1qoa34GAAo<4}k=AM%yye!{R357CFDk1Yr1(oVB!v%hc;8=1NCP3&F1$m6x;?-K z*>17!ADd4goOy0Cllx5}7=LsFNr%+BOvQX$)H!Lk4^wr zVtm32&m;36*M{>dh7eDyh!c?Yc)MN;4c4*vVEnk9KxUb zCW@fbSZr6GobL|G`;^RDi#vrvwL2SH3DegKN3wx#uO8m7{YFjB>|6}IkN?-eb|*l> zzauK&_X(2cmfQ4w5K%*mD^x-*%1plWTSNOZww2VENmF!LE$k-!_l{(&-dwKRY1;RO z9My`qm8Y5_$QWM!FdjpdYd~suUmc!sj9a_}NvqM?2a%)N8I*PD#b*7%L5;#$Kgp!D zfubbNeOdCz20zzDA)$GyN$Fsd(+t4{m_XLxti;Do`>l*aSB&2EUQQP~Psa)Zshw07 zP=+vJ{DYow>p>}*wFY*%Az@5%BN{{hz>4={MszMvEctqj^gMdGcf`Wi=&U;8jWx(T zPm-g`0LMwzCtVDpzo!9y?!AQWZP!*>rya#A23gwU7`f$itIY3hjol5FW8p36dJ0#>xJfnd zr5Q9r9~re8AZ|j#d94XQ_5*!Z?>W{VAttuLj$e-4V=3_+%^Cgw|8%NQj$;c^@BCzV%uiN=tO1Ua2|e zTuQ=G+M#&$ZZh6W$iE-7#_By^3RJr%#-{S`3J7c9Syno5`_M)5? zV7PE$r(cxqKxyLl8`PCLu=o6mz%%uZ|4sD_4*$Wp0`hV*Fz1#{NN)vUetb##z(DS5 zvm9A~_54S1*{csC_$}e_20=|l9Xv^atf9GBwlC}XM_!G?4!NXFCr((3J?B; zUuu2yOsVK4AO?{P{cxpw{GLL!#$F0qNGWeOw4l;yl-y+|<;t5l)D$U0jn-r~Q89QO z>&vei=TTX^)o$P{KHQkh;ZC;k-0J36DTXwhC$@M-`ixs>1md3ZF7H)fQ+&pfrycXJ zK%@R&k6Wqy0Y~=EUtixfOkEwfqZO_4v#=XEx_=&+vA;GsPE%^fJKUihrI%LR zG&BRbj$93$g*U4NPeZ?Z#kR-udBSFUvLbJ>TZ80udnM^@lEx&+`v>sELm+vx2?O|n zMQN~A!5)6FQK-$#tm_~|A4dFR0f7_{C|{;N&|3-__ImH0;PCLYYE#NhSDVm6z%H#0 zU0`UVA>~`PaksfB zZBf19jq0`7;QOnf0)=h^L*_&--48eYdFJz@Q>bYB7qoc(TZCCNlWkd#_}fl+!k&%{ zcM{X;r-S{u-=NjJvG)MD=(75rU4hIsCz~X-rQ`1#q>v}`KTMoozDXWVtnr;(!yoi( zfjfEqtSb&E)^RFxq2k(Rj_phs5Ao~0!Q?a4Ek{dRO8p?L#%Pw3p>XgV-g;!YZ(yw1tBKjawXpC;{6VQ$xGp@~=_8Hybr;=qeI0W` zinUBirQ$eoLSj8VNLsHch5ff#t+hG^E?IZ;Pe2l%p9JhI)^iqo*;-YYv#m9`qlhax zUGgwtN*+AxJQvh60=t(s=$aVgUJ6yA&-oEt$U?P&nYURs=D`=V<%fJ*GqFvZvUi#_ zCTeOzg2QQF5afHkOq*5bH9xO(a0FsvVo-o8jcQ0>_kj~uVmZDy#O9?f$<3SB;d+vf znGePS=>?gu9Dj0dSSxq*;)$OZ1^9hvYK;+_2AI%Bp!v2-nVwi!F%OBQ-ofOmjG3hR z!x93a8~o`6$;Iw#)@()pfKSvf`Ad?i8+3>|7_SYh`hBJZ8{Y_#%8CL~4@yLSK*+5c zMcn4+3OUuRrLAa5GsBqNjf<{wJQ8Hj>QvIwW}=sAE>YsHMIi0QkNUqtm@%KW_}?eYk!ZHC>aznUtNkp(++CQ41be3aGk~VlR!gI}v}rulzG5 za~Xfx&C71P)J*{NjRMssNYMLGZ4YqU85uYl zkFUhkqU8EKO>vFP8Mhf7fdH4Jc#>2`Z%Dm&t)Rf}NZubqIt*<~1k4OCQZBC@kd3RU zT{GY($sD8I0ReK}1dtU2P!Jr)R(;=%zh16Ew%w(ODi3R}KR*=LBP+0{S_l-A~gso$>3aXGU zoDz}k~pE{vH>a$mX`1hQ5`SU$tJ$@HL&$Lp2`zV&5r3{q#L z>!{{@h7~`8st2hPq%)pXqnkY`-|%VN+SNIf7r})Ey6f_f!_ZOks>SVhZfR z_5MBQdGif+Hpl_dX6j4wQxfE%!=?;5fIn`S=6-6w!s2zZIoMO%kw7jwIw;+JY&6j( zkY?rc1cD)X5ZOX+I8-~IX_pKl zzSq8uVf%{PO@4D*b1Q7)>;BwUc~}haewT14Q{=cw+0?}97K;P8@lX~LQx~Rq&9m`C z`)zII&gEw>-$fz+EQVS|ZZ7e1!;h7zCG)Rs*6%Ck`^7sFSzNcui2iNPPiAor&SVM- zqqv;1vXQGF=qOp^eOE92d2b_fRPp~yI>W=mv5$~Qh=eoT5YO~y_g&qraGZQkPq#z_ zLvL(P5|9z$$tKQCUrMAUrPr_+7^J=lYHxieoVn1Bw!T1-Qdn~qH|)s~6!E|& z%6a}yvysf8wiN!PF`zA5*4?AUg%Gk}C{5f~C_z?(ABry ztHB+<$r2j?RwvOwq+EN8U%+2Mf3sfr|6fyGSOEnEg?2oF;)C1%1euYc1ySh51P~?AUc%k@D!oPouh`#v$RU$VyKZoT~ z3M<%8>?YUU*(oc!;^hhl0wg?FpFOQAStd}OE-+AC0X5&xk@nxd!aIMA!M;|?iIrc= z?_D``karqjKEC<1=@#9ZW12vW3kul<2J6=+Gg$ciwUaqas_{>|+}!wZNx5u}E=ER> zUfXO+N&OU1%)$l^5RxW=Pe}?#L}eOK$m4kMao&I71MG5gG(xv_{^+ctu7la`Jbg^R zg3ba9uTGYv!$WgTJv8w8XVgewCzT&zPvMI^Y7ojEe+e(XrbwVsttQTX;9o_}jZ?=+ zP2}oDx8io(SQ)q>e0sZ}-gnQQqoWAgdtLQ>!xj!;?=ipfAj5UZU!FkNJlM0_s*h%7 zG(URr^ZwCAz;jVLn#R6e{ZAZis_;+wa(60PuIP=6!LBaGS4-6k+e0^A6|ZIsKCN1g%e{ihB1(o{TTJs7S)Xa-5>oO1oM7=4 z3Y={4%H!?P*_TlK5~mw_2qJ$lCccvav2*{oX8ER@J+e^z*j zCVznC4@N6#oOLUmb$jnJwoGCyPC&gL@-qO=-!f~A#I97`i#QcVh!$eZ`SG&!1}`3z z6f}lAz(TN}o&J+9AH^+DbgQhSygg8f;}_hq(RJ{!!*Q#ht#6k*CsVK1YlGO2Z`jM| ztj3rl$ZA^Gi{2kIC*pewAgIkV154TW(~yUf})D#n5;C^MH~sFH8ANTtq#V>EpXYt zQntwTelr~W?OrTTbERCOtfuzcz1>`sP16}IwV-;zy(&je>tC2E6k^sK>}ytqlDY#e zChFl~ca8vmr{4miZfBOHO1@?}2v|jX1r0O@eD04IPQf!5!7}tyRoHO7!IM8#A&VCH z`(4J>*~zHZ>@V7FR!}#>0>d6xA?WK1y zkhxnwbv!OeX+sh9p>@}D-_6XCDawU;xM;Q(b$BO;N?JlxNIBL)*mr|`K27-b3sq6A zb>hj>n~MK<;NULjgx{+rdh($6;BFiK-8?m>CLAU;i0xpW=fb3G)A;kyb@kMytmZk@ zzAm6|@L0Wk%1OMkd2{sW3{b5NiWj0^6^o!`pvli&l@V!9yT0D}m4Ih*(cz7ep?CKJ zw=az=BPj_()ho(k;R4~FWL~Fu)!?-MdVzgSKfaa9iGfv2<=3h7*@B7$lZPvc&C}RC z1!)_uCD>CB!Af<^c!WT-cC%C}!*BE9PZgK3=S2Pb@b#dgxP-*cf;swIs`GG46kBm2 zJpg{`{3)N_f^k}yZ5bm!0oQTo&g1)+&aJ_`&u}B%-AEQdFx95ZefLOrRuNX9VNU6@ z7E$rSm_mElLePoq#-thAj>WX#Oyc^oAS^1Hn+#{jl?tWF8Td9cu`LCuT!OP|SR* zgk%`6ck>NwO@vQ-@0^(q@tyL{^>|po*iviaWb`S-=6q?(mDfSeYk|lM_u0nO8NR{? zJtkpaWV+n^(9MUgUNpX=Qn|_whm+G<xI?oxslWPT$pJN z(Wmy~T44lWt?gLkwa~p&_MAPK%+{oyoloILA&7=G8q=(3m5nemrTgkfOeLi>S62Mj z8P6iSbHghijrc1=PrLw5@~R>H-q^yyY7=8@TVKBL;dZcy(hRHQn}dZV#k{RUCk7=w zuV0V)p2};$Zh!ZSntTCpF}Sxu{>d9xh#ALnS(BLWme6V8;bM#wYJV8(%Xcqv7O1!jpb*s zV=w4F!}vh4|8J#lC|Q}(inqgjDh^4qCih~p%2udvVq`hxLtRX4rTZ6jf#%DG!IKn@ zqyh*Qqw}ol{4Kg032kLDb_J0{74z4ta`W=`-fD&&0B_HQ&KdESPT+>l1GD?UZ_;2$ zHT1cPkYGmM^SRjN+T(9*F_BLeZSD1#N`*%-AZ_SjN2H+G)Z!Y&e~ z*JEN~uDh{`%s^`p)A;L3(gHIX^5e0(Q3rK?SLh30tw_@tVxL76X>Uq=NP+JV#VCjl z3z3OltPgzYB~e8_G0bnx#ujexFdba>u|#@p(g{Atww?QS^jUaI149L{k(j~ho*+7G=QB3P||yxbi60)!m2&$&j;w%r>W z!BIx{?l4Sm*7?!2R^C@PUaoyzRexs$*xf$bmy{@%@Fpm$s4A*xh^UBwCwzu66O&&_ zcn6PHMqc%AI4&3KQIlFxlLv#J0sC|kV6v2Ed%5nJ(sX^JfQn*T88&8bU-ydT4UR8LG<$OV2Ng1B!V_(S7_^>mLk#*4ELIE2G zjC_az@_Le`l4@e->0%mun1cr1EQ(Fya88qChnA-0(lHDl5< zO0Cr&r8j@z>DN6CU3-H|CY1OmTls#bvDFq{xu4k6 zYGw?NEDbCB`aU7bS=N05(`$o8vR_j7WOvGK7OR#F}bjd}vizu0%UL7|hjt zZea=Tp=$j9Ck4^h;`hM z)W$4B5HVl!&gx_eo3K8J#qDQ%r4U00m$}rbKc2Xgd40%eM_n%aIhHi)y(?)gOg4(& z;@GR|qYt(W!Z;iE31@qK{MY;f48zwz=;zzAgcjm}66eNXwNXveEXh-3A+7+IFZA=i z@lvay(5ox`e&hHOuZv8iY?o9}MD%j!C2sMymHOkst4gEuzI}=G4-N|!KUguWRLy43 z5anX$mLVF%w+ZlNb8lcBB!5-{OrjFUnnJe2>Xz)BFnfBtTWigh9=NRT$>!(C0$okU z`k?z9aXFAUEcr`6qtXOIGTv<`7kBnu=$&r?cgo*@S+WJ&Ypzyn z<`TxMvqGWOD^>NfhWfTcYmFbd03Q1WU~f3Ri%wKaohQuv<+++pGk}dtUi8#HGL_q} zLa%)^H5Ia<&u(FnsE^ZnQIjIx%L-0&?guX~Cq&w~=q?>t7)8=rJ?Ks{4}qyTBqX~Q z=@nuW$x=tqWMif`2Y|we>-bVx6#V2ed1Wy6bjWnH!ZB+`&PJ~)Q_iu~;lqex)QHz8 zSnr+9=QB9T+xN(bhoY65_U1h*TpB&LA9h%FW#6fsU0Gtcdy-AHsL;IrB*5#;ooe{O zN-hOu8j-NrB#XRTb#JFvX-m(C9yD z&vdljm8_Zuwt|S&#>&RoM@f0UuNky%@7J}N*Au`wO!UJT#-cuH(Alc#s#Zpp2{J>W z&$XOyog+Ru8X>(xAlZ2enh7zZ&=5^9R8JvD^ZV=Ba3EiM@F}1VXzW_;BZRL5DMuE6 zSKmOppN-<6i~oIOv|cIncN#%~0KWj>!hCKorg&!5@zyGI7UC?|#G+X2bU7c2S zWOTGjvpiYal)G=>+cItB+r%4ZDo@plVAW!o8ykFi3$|x1<0+8~^=M4)3(eKbo4PbP zYbRnUmNj}1l4nGV+1wT(T*7flt(t|2Oj*!0@B*59r(06|W(amkg1e>j;; z6jyb^I5Era6w7OchBBe><<;Zu9h<8%FJ6@~z4;?qL@k8wa&ZvD_j|l6@G<->H?QE4iz^L74)hnPo+>es z(qwg&x0{l1e}X>sY1d8tUoAibQdtAis}FVrn)E*@Kk^2t7gqd(mmKT!22njKJsAMpb}x*(qBCp&2$B zZKP)nx5t;4z~-Yy!Ue&Y6~UV&f^az_uXN#uiJ)R1L|SM#KMKt{c$yG`<`bJ#C|Vl1 z$q3Qq^!to4%k>l$q)BUHR^Uua8IuU3;L`GAfHvFM8&Ts=;Ugc1KxkZuZ zeAVvG&D>rFMEojM$gRjy6I(WI%-#o2(1NRbHL|EN=dM=`eo{#;zWQYP?QG|l-^=|1 z)e(j(5AjF#>LbI9XXFUGF; z+2hY8$sMe?8GcZTg4OxojbQ}fCD@%rHL2di}5jn&@LIk?5*dA<4b z@|ldRAxdmWN;cl4WurR31&{qnaagIw}{7x=MOIQ9MSSK5{xYOb%uumg+KAFx1C|4p9c_iMKa?b zL!2@3I_(FB_;jJsq?)aGh1tIIaSsSSL8QAv1RFhbO?r&=sC9Ybd! z%E<{7(e6z}oLBIAWOQlGu;Ex0?@Wt7bn)is>FupvD#P>%m{H^aoNkQffO$gwKo=Dj zmeSO5X3M!Zg4L>Nt~%-3LXH&8WFQ&$&nb?Ma9 z+v}g@V#^r;j*rD%%>20W5`FV;CCS}lb8G&VL`J2S%dai5M}4q|nmG7X*Ma(2&A`B5 zCnEp}dpR;M@4LDT`dBztf1&>M(PLc~D>+c2`{YK^t10viaB3i@i$54cAXa{BS5y`I zIaD!81pC}u%t1*QE|*hANW{~f5N{qzer*906O(bAq*68loBGreYD6%bW*L7l`|tf4 zN|-MT`U}PTBDp zG$ZmfrBtOw1C;@K4~~;-4;;4^5#)r&6T{M+u>*BXu$Jq@+;9B~L*DTJ4#4>nAT;0L zPyF7v(LW#u=rK+PYlkR7EHjM{SsPzp1IWjA#xOq+IXFr#nXntw2TzS{ZEhm+goZ*5 z8dD|<2~N#13#M_IFSWq?tcC2)a(a{nO4f&4#$a^j*nNaD^$obR*bM|SicNpWIUao! z22X^3f~odTQeNCAr;QE~9-8pd zX3ZFhfyHpur&2j;LBYZbl`31{2NBJqHqi(B5b6D+DT?G@1;5!-sbcVhLkwe)_B@%o4cc?aNsO)8#tX-eSyiz zJY@?(D<5ha9jea5PWk;NRD?jeGMCS)jGM63JNpaTXB2JDkyH8)2wflr{rVHfrYR1? ztX=Tsq@p)ckVOirQvx&a&#}Ob{{|zJEwXIHJ~C%ds(~shtto6cG&PM%gV&X9$HzXv zJOPc>m6hbUq%`c}3MX+)Zz77%L^5*VBjl!`# z?T_NPw>&KSTMRk9%T~+<_1Bf5&t(6Ha{%2l{^L$ZrGETERPymm;9(Rij zX^d1b5HJgDwKK~$2Z1*FlrY(wv^SSYXHTa*3QJRk6#vb~DN@itZ<7Sx#vcUafWTB# z>F|_Kxw({q)Z}B5`kZmOl*yJp0^I@%T_s)hIpiZwfKNuIl9Cc8S-$A@h;~&$AV+g; zs*vihxB#nfUwU9yd`XwBFYT;&5E~q(x-EM+v5-K>L50G`z6PUUA>r!g>Gx#U>yZRo zzUmSn)Izi9E27H7p-L-1deN?sR8nL7HQzKOl<(Reabul7^;&j$|K_|ni?2C`s8%UB zO?|*u069uB^gTYN4{CPvIazT@Y$6f6w1876ncEBm#O5FfVP{#mYX%v-)BoZT!e>xl zR8k$b0-)xCL3;bFCg6|thcs1hGtRE?9GW-kt96xOCZnOKq6$irkA?g9e;r2)Sl`?C0?36AaCzk^k)6U8HJ>*&Pn%-Iy`F2_MF zR#9%zcGHFo&&VkZ1!Wu!Y$L$=aITuD{q^kBI~x%B22Xl2T{@Sm>GA|TudRrQ&yiUHL)_7K z9@i9IPJbyvDD;(!AhU_^lNv&Q_5GI#s0~P7?{z13M%BS{URn_mJtpmFYWAu8LL>}E zJw)id?T~(;$>GMWQ5<%c8I+!+l>AhAQ!ZoZF>g#ykMZJu;cKSI>w{Hmle8@Is@<7~ z0C(Ejb|2(igYZ5}*)m^#L`Lr?`a-_vi$@363$?nZ))gaIT#>D+s-WV58?)b!YS>>v zsqLH_3CTTRX!{2yYciz3;&VfVst)l7{iH;IV!!7q6_n3<{rw>sLD!%#e@6R3gTn>1 z&5UqELd9jYd~??4kVWiU1RHhe9R9NQeS%&*5|P&Nd?X0xJpVTqHGQnz12?StpgF0e1n7p36uLob)7apD*hBpKR?LOrurV6 z&h?5xqa^S+ldPxry0%(6$WEv+Ikn?Ebnsyjw=T68CMV-x6?%Mi;^2}}!s4S1`W3g6 za#LMOKK$ulOZe}K!#dnS)g(&d5?I}f!<9fKm-DhBy?iDYb!seGx+cP;J%&g#VaZEO z4Ovht2XQHhy}Li3DF$=U+#f%q(v6OZU)3a^452~aB30Y_-QFVN+3wkgR?LrGxJ&}v zfL@zk^ndxPxF%aJTVK4@GGka+@)&p@7o(IKRtz-%-WE_-K>8?oTzsnE2}Lw{V3Su9 zz&(u(?|iSKDR@Fc-Y(f<0CE=dbKrHAAnnO?mFc=>yYpTN2eFCYR-*-UfGxzIn03Hi z-=VVZ$GyYrI!65uK$*iR;O5azk4l9f@OcrO)9fYs?pMEEPCmXsj&40y>QOj5Wv@nM zwL>K7Hm+G6Z|1UjwL~~3SqZ#(aLwYwHYnhy4P3K~l$`8vMG~Y4j#N$Ob;Nha&ncay zecDZ2C$-yuP&B=y(HUdOG2pDq;J1WMYJdmxWJ?5FEybU*G*(Y|iZoS>S$eAx>@(c2 zg_=IXgws9Jof$$574hI(fx)ZrPrG`PnXK> zU6&~Mxr~>Vkc|xp`9UIIK--~o1z2AFcCcXjRWNQyf4h0y`?q;_n{Ibp4B6irt%eGR zcTPZ~_q?61?-9N~YkvPzuvgaU!aT~%tifJPvq7iZlj=AYUHjo?>O8u=!A>Xr$2M5%eFhm{#o{ig=;Q_<3@;iztxZ@%#?{znLQJ*ufLv zK^4Frf@Wiqn8q7aA+4ZVABf&o+7!xU@5e)^(RpZ-iIjU}cRl^md@E;TEd;22GFS68 zWzZey!y&qeq8hV*PsAFn9rEzSLRt2nsC!y6KUi96e%6WJU`t9!DNRlTy?DEDaA2@_ z@6W&A#t2e=n#i=$*t@ye#sEBI$S=`;kOmKb43XYMQ5>eW29jmH#)ovI>sBl^rq5wC zesipey0#-d(Gxd$>e$?GmP&4L1B59h#x+xC4C_49?nPetO~iC`vHReU>f(yRQETaD z3bwd&MzGWjX>%uJ@|ZH;tqEw+Uqo5Za&gBlmDUVtvZeWnB{8z`*_q5W>&*A*Fbdd} z%aW1pDWkgVU)=2_FN92jR3c-(8$ss65hUafny+*Fn;MLBYH#L#QhTrHG%708gVDe2 zPKS_JKkGe;OK_?9rBzhO!a?~fA;O_+&vRVU7%P65_M5`+c2Zt8DS`JwNvo@RJHvT? zsX|_0Ls*E`Uj2Epf=m5;n`iZEE8zqYjK8%iler#clVNo>|4Em?MR%LlB0shIk;ad{ zJHok?QZC%dJ1if5))jg;M5c%3=AcyetNOU&|FIROSYFfg;Z zM|3ReEi9(N4}b9OMvckUc(azI4FF~vNVg$gPt}(oxpK>n6}kPcWeuN^z(V?2!)v^~ zEV^CweYNPRER`>ulSkiW>SN#S@woMd{rPurAu~Dux3ux^3wddwO0Knfy3kGXeKtf6)}j~V)vZEe0&iU&my@BgDy)Z*`K)lAs?+$qhg*)=6N z)5~93gnc%9=Jv?!Y5oNoS15jkBLN$ql~v@gEeOF`Mj}DVV!~6z#NR4a2i8BlL>l?u zj_?gA(L??jr)68CIOT zz{!^K3XIb;H!m!i?L0`hS_oY4oQT@1m=W#7GvyXndP)839|S2 z55+vToiD{1fk;UV948CbIaVXg*rSKJO1OS$yx-Yd2j2^CRvaBHW}Y4p>ND%d zJUh-Ih$c>M9iY18R;`@r(}YKAG(E*0%z92K#LFapyLkM=c&t=a6y_t(=8$-8_lclR zfFZfw$N@n2>uPk}kSMtFqNIt+??vs`rhYzlKNx!2!~E`)+ima>!hCEMe%`<|_ta_9 zadB_b|B3X^ZcH-y;prV#rOCB__n8f|f(cHA-4-X)!iWkxR#;+5xG7upXo+ld2yi%A z6S<6qg9c~$gF#YpY4`p4QAtcn8hF?gU1zg~trvs?l-OFnl{x#N&QE~ta4^#)$KyxsYM+lbzm? z`+^Qk=KzqA?IH;O$>B@%KV*);Yx8_RU?dmqVSBYYh=JcHt(Ycp%6^;HbPZoA#ARtO z=X16oOg@>Eo`1ue^iw&$3l;1d z9r4UZM&rCV1tfKBG-tNc5wZm(n&zy~{d#}x2CozUL$}~aFMo}QLg1-Sj2uIw0$beL z;c`RrY2^gwNI9vAIBXa5%q2=!88Fz zE%93n+#hVS4T#u>b`q4fjBLr(`h;Q0bk!qshD|7j@l8k@axo*xb$MpH$M6tI434R< z|NGT+L^Al)CkezBa$(5sw(mXi!spKNZ$GCKmQ`!P%;;>QJzm#Sw?ha}+@gXz#QLe!yF4#mtJ zC+sj}Pd;-KoOMIBXy;oWXu;4aql=Yo#p!w`8f7i9n35*CF}jOf8yIy za8L<2es#n9o|6N2)YiN1Pm*{>M+7T=`S(JX>6EDugNDfj)gUXcmUkg4IQXTMjP{W;QlVQ6f#RJWYi0NjA8jGn_j;O3&+r?n zE5^eB2JmX+THr;}5!gzca24S={qxQ0fbr#z{)>boFzvwqQoM)0;B&8M`*aRiCCmZ* zf`T=SFf~$s!fzF|9BkdPV1JuhgF_#u&MYJ;s6(IE$0Fs?PlT4J!cmQTZ3?Wiz`kr3 zYL7xzzF1X0-WQ~HpNy0_{+#aYwBk~qgQ~~}Yz`}?xWWA;!5F<>-LADu-dbY)HXV|mEv`G~`wls5~ zfX@9^R39{T40T_DR$~j`Gukm?9Y9eFE@D}9S!I>l2fT%~0bAr!P??-GP%2oPJcWzp zApL>>g^(JGnh3frD+Usg+0iCza_nG?>*A(4O47;c>6^nrnaS|;H`PfhV$?4emtN@Q z9Wm*(WjM*IW48db+UsIo_K69T_1~k@AN7&oN~4Ud3`;r4^qA9h@&9Q3C9%ZyELyOAl~%VIDnj)ae}>Mg`WGg-9y z`@gwUjLhsF@&b5~VT@v-)Njt4((1%ineX;M69EsK80lr=P}5qoh$Y_O(@If$5pk;CA)tC+;NUp&0vLz|RsjxY9>ihEmmurO>MX(b7wt8wS<~TFZct+?7pvhuqv5)4MbFAw?r$O&+ zpkuCqa2VGC7mkmwLQ60%3=oKq2spDx5ZMv7PP>4U1a1oa13cy?F|Jb@-ETXT#NdRP z0<N=kB1=-a4@g?oQ2miQM?c{x=8|-W2O7Es$fVe{moGkui97#Pc*XfYw>R$p3kN=z6czL>(Eg3v}>Sr{e7)$d_ze58vFga?EI# z3T$rFO0B{pb-ZeG%#hh2j%LI}lW!ck>ZZ6X=tQP!N+Eo0! z>!iwrHd=kwoXE9JnBKT99DMDJs2u01U!B?2US>s(Or|$ z%oHn{j;rAj_f@hVa@1y&NT|rN0v@{regLRFa+zW{{Zz6Z4MQ2h&% z3f_8H{$H%URal(Mwl<2pyK8WFhv04jLJ02e(l`VNE+M$PySrPEMgxtz1b4U7b7k&z z{_{Wk@?7MGG|l(bs2Vlul~Dk?|12UfdhhyQ27w<4siv(BDuTDRw$3XmDpHK2tX9(3 z_ZUi&|9@9KO?wbD1yjYb1?C%qoQevqfI!=LEckQo?(X_u|L>1V=<8>3bNqb`iOm1n zQMS4N+ccu&_Q?x_c|5lPUUtVnfZXX;IV;&!la-!;Bs)KiWdiom# z!j6z?=d%4bLIhn@AH!v+VQkSc<3{T0u=$=BQ;Q>FzMHSmM?xXd(;G3-M+OB&mea1w zs$-ER;=&@=+7T0n4{d|L$do{a@8Hwl;W`5`r4x{f>O~Rq)!9XbhI&iTsW`nnaG=dE znCQ|DRFi#^)ZnmZr@~w{U@I@qTjXsYkLiiaX>9B!kiltLiJ3}4DUIkxjFecd=bxSK z-Tau_(ZKkZz-T$TgzS%}zHMxht+mgfzHNF5I1cE`TmBmRJsmvu!#ghZfGJjPt)V<2 zYd#aJa%fGbHuucP$Rnp9^SO0Ai;wTjZ`D?u)H2cidmeeE5pfhmF)k+$h@7*}97Vpz$FLy?)1w1n4C4Yvy8SmvZwMx%uHOFpY?w27}rpuTn zL9?^te7>bN(dFh@*ipTon|4YBZLE&i2CR?oI;w83NNXUV0A=d`8OsN@0M_ct~ zt#$r0SbAyRZh_#zaaJ1d459A35JX{)+z2D;5*w}n|m_~ZKJ028?{IcpNk$*F!z z%~%6DUz6PrIltrxq)*Rw53rdVNdB9A!vrW@ZZ{o)K zIj9`3HLdiF3`l-2&cU6y_n!++1a=7@TB1IrK(Fl$?s%9E?$9TH-$)sZ7*-qkC6ima zsYY^hUGkGBSIohY^D;GJ>eyWEvlx+Tc41vx(t)98d`-+doOWC%Sy(aT^ehoA56xrH ztWHyPcoJKVt+nVl6Mp>tycnAE3``ll!ACD(8A$Lg-Zbqp_z@@e#>28d1Vd!9B!CU; zioDuvCRH&d@Lsc6UPFq5BbyXxLnt!{=V zrnKB7owmF@K7BW@sVb(YyDg5`rKZ3!$834oq|h@#?z-fYHmLWReEzD0^nG;tgoGqA zvWl^>smahO@JCDS&#~_jJ;AzBIv2~HWK3DH(P6(EvXGo&oS>V0vWs^|u9te;M52a& z;c6o|D@0pWqy!ZmrzN@W>%U^XDG}79a0E!>7DR&T%_V463ch8Ts$y490gb-0S>|@WL(+Ri}9ry^u?m=80JL!y`V#S z8$U6YWIelUTiZI0eE#SvD5tEl^{&$yQj+t=(gAqG$K&l=9^h`09vvGS%-N+}bi(K|3{g_&Y)> zAD@p4sFhf=*6ZrXZPdy&n)O1Vcs^QmZT;msjK|K?g%1@oYXaO0=VjzO%n=iP_B)kV z5pi15THX478_s!022hM;Fu+;EOM12|%}mw%ht@Esh1l20Q`JdoZD{sVud?Xb7@;!6 zV1TFSH9jj6+EuXb zz+BJjH_@s@ngl^Ip*Cn7=FEXJYZ~F#r<;bi^^gsE%Ujbab$!QNa9!_*{u zt>SX5RbHR(RqJ;KEDXB%4x-=@n{aWa#0K@5W(`_^P34A`BmvtJfW_qY{`$fukkIT|6{Ob9Cr7~c zjicd9W9bhmOcaeSXIL6G5(=D|%Q)uUzJRv4&hg5-f{{D%a2ZrJ96Mb~+mEz_glR9E z@Yii;PkPK;Dl*=NP}HuE9iv>SdKaj0H@BvPCSQ^flVkE38>M%4Q6^26vo_48!;eeF z2x;AJ_?78YXJ=>o`Fd`ZlUa3;(uXUA47YaB#UNH_T{!5JxoqhT8-I#?^Riq0JlcHQ zaM4p6y$#Gd26*Vo(~%C)AyMF>Xu0PO^O`+pPY$%KJGE@zYhWf=4L!xMaW=V10`3#KR$8b5c!F zZC4~?!}Ba#$RDUC9vH;yvGz0^TwHbThSYix5$oEeIVt$8ZpZ7p8@kj8F$7Td<{P@Nj%Yd>4Io=G z@#A;*9Nfp4-aY{*dLTV}GPh;#Fj70>?UPm(J!^7E(eX9j{6~)FiN7?zQFul1HQ0~S z;_Z=`-It`pEeQ7@`<+cKz5FtR3R&uM;K*oXsH`b9TNy5j_P3=`%#mMpB=vM5B#u=z zyG>SLY^k)^zC>kS(?tFF=leXf4^M)?af^DJJ+*7Sf$?7Xsc+Kiozwv;Mv!h41GpKP zr|m^$O@{(A89Xx7H;5>Fv5;Z`rz64a59Fg{_-J#vr#r8jJr5{#PF&?sgm0Sl4PoqN zP7ne0ab_)()0Ijx4{M7+I)VkZ7;$J$0q6R(KFJ!Bg_D2}?+YufHgdeD_NP+O1j+WM zgWLFQ)HPy~(yo-(`@35pan&iynSP0{IbOwcsOF;A{(2vKs|rdEt~c+mtxA34ZJ=U!4G39JWNmdLu?yG0fW90)Es@5y1$-1~zx@#h`Ft-et3|*s<1CC5zxNu18inV>%fZ-;!G(#u; zY_GumD$sP%tit5oVQ(v9is3cbdkQbEuDSi0#Euxb7IK_BV#K6T1~p$M(}`PZH5^;p z4({$)u~9@q(I+uc)JSHz&Hq8`rRa(DO^62;HYvF{Av1dT!c+L+`9WO^Raz^Jy)N+W z6@J_8$SAnn-FdtsRs8sSb%tnc1jx?lex0HlR56-XE0>P%{#`DWJG6F;8=TK%HX5`yjgr+^GYUfki#{9*OYL&`pR1~ zDKDI+uRS;xm30>7l<5l2qvroqR^Tl;+jXhPi9@EJ+XUa2&fQ~O;Y6f8w`1uxtVHMOH(V&taHw1eioG;&kN6t#Y-KcC+c57Whc|blE;45d_^RZzmT|i% zih#BjVXnK_oK>n)i>oOuuE9-J$KS3v51<^5{&@H~@#5 zyYbm%Q2eQA!EbG~e!h7W}?+VDqni!D4RvYLi6 zL+8K#d_c!N{QQjQ?MDg=oN9g1D+f4i4uOii)U^>`52edryrL)JewjIWK+nSqw$P)@ zsKGCNQ=;gt-I|_uYHQ-hk#PHbt;yla=V9X?EY6RTc4(bK3;CwLi(+MTu&&y48F69; z6lu^gd_6?v9GwU`;wyiYIuFqRrR?y)3_MPxr?py#HGt6c!Y6LH`JH}DG9U-&4V?ib z4@6Wbd_CnrV`*UlSG6?k>hq6S^~(z#s+p8+9{^hOhQXjn3ZnElLWPwvrNn*D3M!?EG`2(h7zujCgJC9=pBMe zONM8HJoiE*^^mN^0tL6$z~?^*A0cq;R;ZSIFjX;FGIVIhBVKJ0U0Xs0Lk09z4ksq@ zQ+?0c^CFWP#;^u5*PFw&vQnN$IL^{h8~0<99&uTJa-EV3(JDM2KB+1t?swTE7FE5g zjOLdmx}&%XTCN4}0xGwATp22klIz<&Y0W2!JeIie2nd%zy8B_RQh`|?io+N z3gA@Ji-?@u6m60=gx{j4G0cgq41~B$9IblcujoS-3^Wsb6gZ`7(mw zlRu@RsrAm{iYLFBL2{ALkCF%lchHgUMyRE-347!S#lb6rr$|DPk{=_=y4}@5^3`V5 zlUH1UZQF#dNF2|5`_Cm^p-=%*Y@_=!Olwg-^lg*YvYr&n614L(GriWW26{jK;mDtD znj!xTi27Kih7S0l%b!8DSMf`lZYZwl{|n!tu7ZzCmyU?bs;}7E7`=UH9%0U>WHB!Z z`vCc#*~F}4*ncD-9YPiH94uXNPJNI$a+H;bF6%o&_H=gMegZ)r^TKLq@m_3Q|2*Xb zL5zbdtv*A7c4TAw7@*DEckJS_Ek&)OHB@9xVryfu*bDiA#*4#5opbKViQO|*GY+|= z+VqI^>%b|A=)$ibkguuN1w|-5HvHw~#w&QqRe`9@Ca%}FpnP|Cu@JWY%6u~$fnahL z^QYYF8vmlw|1cuN6_U!EzhMRI6O!h#jemPT#(H-+uxW4Cf7maaw`~5)uCH-OK3=FNgVd1cI1!HKy#pixy9d+D|xxgysRY&kZ+plE6b(j{@9A@ zU<{B;-7hdkxqV|JI0!n}iGJ`~)!qq-mk_MW&XOs&CacArDgYxILMA*b&OV>fN7!^v z2umV-%2HEcx{+x(Uh24#0D}x9| zMhhR&K%~Q;?U+{vBZJGWQOMHAXvsz_|3HfORtR~=T#_^P(plZ!uXU{R7p zxIBEpE_)NTN)HBzmhUZBgl#*u^NZw`Da*11Nx%F1bqK9wX*L`_Gc9dRnXXfFy1Jxr(1FUCU2v0v1@l)n7~(RXl*Nr1DdR*NSMyYksd$X#YPdb`asn{vJkQv-K4 zL1a*wc!ks2&StpkxKY-mQ5KaXeYh_aJKE`x08eV$d3N^G<%hP2G-n(w<>+LyB{TCo z>e1^oLhE*QGIUXGFK<2TnP985Xdfe%9kM@XAqbRG=R2eVSv1Eb008Hp`Txz>7(LW( zg{Wi~@~lRdmrE%p&`*kVI=})G61p5Ig=1qx|-5EldADoDF5Wma4Vgdt3D=;rHUB#b#hf z9|c`{`orBW!_D}w-gm;D9*{Nl>ohZArN@B^P1vv80gaudB5Y4VF;rs`j&R@BW{AVyZo}P}aVx&s_??u2TcS2qp?u5whsHqes zZnA@}r_e!PxZXZ&pp<<^ax=nd9sOl%L_Xsn3-Zv`hqeHS96Cf;WPMl8?V}3sFLPA? zKDBHO0tUoWVewBf59WdDb|f$Wz3;{$2yT(`RV}a@92L{Tr_P(pM>!WCIr*zCRpp`6 zyIh+Hom6pgcb~_ns>cZVSvR@@85HUvK%27T-)|jEnX?63RDSQ`khPyb@9yhK{tn-s z){lN(I0gUvV24bl4joo(GMGv#xK{Wzd`dbBMT$uiEbC3M$4iOy;3jd(g7|K zYF2^lb+6>)6^_pA{v{W7ZpQxM?s7C8x*ln}voprS+`~pmIf6#`goiT% z)}@74gUU-=y9`26NQYZ1>eFt!tXG}JVcbd@Iucm_;_z|vw$LFOZY9C-lA-J_zc9`^ zZ;98kNdCUOcay<9{J&khXPW-op*wRQ0-VB*XM-CX8>hk1D;mMjF0N+n*dF_^r{D$) zHk>fYwPES^LH|1+uiAhXWz9psDCLa z^%_JBkJDvo@xIf}HxQ@~4jGw?tfZ=nkZVDu@%F>a9k1O=kW`m=ep`HbZYg7Vv61QA z`ho=WY$RxJGluU?VFplgbs+W*XxUf(OCx0GYr`No_Pp{2i21=O1A$iQU^?)l2F`XJ z0ouGur-#j8fpLC(^V}<@=8%l~$9W2}IBW;ByhRSUn<;jB;MDjTl0r`$+o8>V?DsDyXVi<5DB`+9`c8rwJha-7r1^LItH1y6=F@#n>I67 zb}1nQ4y+xsTZ+opujHJZvu(Whf}GEmP`oTaVB>dPX93Nh!h+6ogTrt*%gd&n&u_B6 z4>Kd&p+xF9YMS4{q=}*+>wmb;a3+H|G>mosXZyETOR<4w?3Vk8H`v^Ar1rUQE2o8q zGKRjRqF_R%%#lAL2wQpH$~FqaI?hCgchrC_{pjNicmEcGvN8)vnb=r7^+-epZDjfb z!5hewxUek#Ke21g2k#(xC-`yMXO4C&yvgRqUuo%i8AcsuUl>S4W(ITayOr%vF_jd> z0Ub_sG+Wc$zGV!Bck<>FAsl9RQ-cY+;($X>jZYWFg#<-bq5q==$hRRXFWz$Ecj70d zFYgaEbU0a8`j@4bnM$HqCiCuA>i0kW`jFDBEiAjXaNEa9M^!63cB zJ?eV0kYx4iL=ce2Y|1}+*81C2=NV&CPt71Fi>B64Gm8>7GymGE93(R_xM(grrY{c~ zFEXXGkfFwly6o~PaUD?R+n(lr+2{_A8Kd=h1F7W8prri6H{{ZPX?FJ(S_ysk-I6YT zeNALbT)*f5Gd(YVnVz2_{&?5;I6rqpR+izt?&z4TQ#;bM01rLO@HE|te>tIvd)&W# zP|nWtQzHfL5b`2Vp6wLay28gryx8T>W6m~@!P_S!ob!l`A20T2mZaN8ACt*Y6g2Cb ztj$Vwj(ngI}j%f#)jn~Z{&WE#wFE0jKm}+Pg3bV-@vsA zw>Di-`F+}s;xu40eT!t2!L2bL4^hgLffgdyAKnhzs%x4<^xc03_r#1S=VP%@2I?m| zFwm@k4@B-9Ly9>RuGfCMdODaU{I&O4Q(q2?6IDl3Iw3vcGYDD7>AW1ck{$=7_x zz8`qA;VRICeO;ouRoLE{2H%o}m~}>t4%F|IB@^wfV}L<}daJ*`{Pz z7v8^vYv)brmTX^6&%l^(#^&TJ6s5{1qQGuoAV2fE_ZuQr+@qSsVt$-i~xCI#6)kN#7B^sVnZuM({#R($D!b^F4 zWz{0*!znWMutU-`nlBE7Tyy|EjR`mpvG&xZxk!4(^sy6ZRW-kMdG!)o^oWwuA=Oi} z=cBfWjrO!5;mgoQvG&zha0p;K7V2K*cup;%J-CMNsOND`zK(39qv`jOv0ez;{H`sy zejQ)Vf&pqgm*y9irqVIyUV% z;Yzr7p54(I3TC^OUNyjQyUEe3?V^FH(-Fy+N6w3@G1XO}EWcL`I`yrl#$spxao51JyhbnYm84W`{C@9WB8C~7zZW}d!HL}ww#Tpf=a};KFJE^; z^BN*{E5V|qI1VP_dP^~xJ#FuFx{yC@^=Vq|@m_p@PHqX!cWeBn0Xoh*EFO+_b|EkS z4gSwH8xt?Yo4pB9IvTFXOk+%Cz7Aa1U>ZZ`P$k;cPQT%nkm&sDxMPdGu|1~nbAn4b zoAuLBQS*M6*sQ}am{aH=GzIzu2*0DT{t+ayI8cpZaO}>S*JUhQtxvzarD6WkmB7`q zz|(p4IZ!&Ix$bmyPsz?NImz|&ClL#Qp0(x};5&8L>oH$#*PQD@x^@L3j-$y+GqAF~ zAt{nPrH;!bnS0@Lts9s;#(z&9J7~VVE`!@s950RBtt+knxz_^O!cuaj$<^grjgDdR zd}QAFQ#5R(*Q^Oob<82%U`xL>EpVj<79%NZ%w(bYisH9d z8>iFCFv|$ziShJe(({%hC6~Fh8WcFn2s$&NI=V2DwGi7Syb-3Yx*xnolU%xk&n7|p zN+-JNiBh@FjGMJvW`FEdU#BQZigDRkr!4UwU(?ideX{8${D)(vii*qAF#>gfhIbyB zo=q!WPxI;%IzQqJ;YCDJeCQ6;8%iQWH8SGT2I3;?M{j(3$JnA=ZcfG|X`cxA@A}W{2dwCok;GoGzGQ&W3I}N)5QL4TJKU(D@>F2O(xa zT3?bZ^~;fN1!NGr_JAOO;P2|vwq-N!1Lx)v7w$#Njk3IjCqOv zFZV_dp{Wy~v5d2EK686RTDKdSfKQI`^C3|y1OUiNu{l38cTN9d0YQE3ah8Si5#;{T zqVgfd=B_7TAK{zOd67{#zW#lJ&lCyLT8EeUl;yxid8A9fMr4|(9=tN0(+D$Cm(Wtz z`H9Zc>a8u{!o(eo>x_+Jb75xAHI0Yn{Ut|(4P^RE0a0R$NWw}7mOdFT(blzo&$lw7 z+n4&M0=2YQ+oQY>orxw82&!58DLWB9ySf@ZzGL41fEZ0G^zGpN!Y7u8`(g_oK0=BG zXB=+jgn&+7K!mNoXq#LpcJ;PniIlPMVu!K(X|F+$c+n@EsGL6Svy}V+YQ1ch7twA~ z?`Hm-TV}k7-Iu0_tn<)G--Q-;%lr_GHR{Vj=XlI~?{TDL;6`sb-9h|{>GBt!%l4_x z*)=#HGQ)}DEO>-0|9bDU48od`$FzHsgK`IqZHal({9;4af?1)i6f&dKmQYFeUW!1~ zBoQFufj~`WR*G%g?mCJpxnrPe$f>xEXlQ6k6vOh<=;^ic#TMV)b$p}iQ%PF{Uni&~( zJCF0MdTNlp!l4$~+`sQHS^CRH_OJnP{P6?Qa{zZ;%H#n^1=XaJdCR6DD$OP%EX?CD zE5&hQxBb{h|3fiIG)R8hXQrp6T}w4Q^IuC`Mq+P^SlxmR(SfH zav`vhGDAXD{CxRIdPyt^BeOFZSmAncR3ak`_M6tZiM8ENPz2Z#cH9H0TV$ILxl6qp zQ-3ZqRKCtLx^#M*@DIzj3+d<6Jz5OYHGYvwhG*{Twl8ksjO4JfwQ@>6NOXzq3T35cFfSn`3vtg&jc)BsN0&jLS)>Ho0#A1 zCjx%@tlnM}I5eX0@-l8R0i_(#vd-5#|8i_291Y>La6FC3mC92 zMA)zML($Vk;R8XMDbqWlf`(6ru5l;6`cI7;EQwiy~PT4JJLyy=ZgkGodaAA@_5L~q( zJAW_Rj}UP6+Ky4}IUn#zrY#bYgyta+8_f|A0e|G+#FwJ_i=xa6DcNZQk1QE*^e1Kj z;Eh!8mpivD`;u(MQb6b2)eb5Q&<@VhuV@$WX*@5Ef<@$7Xbg_by6pxwudA zz=WbmtKCz3Y+rIjHa?g^$#3?OwlDp_pl5(YLsOZmFTVKuA9!7Qs7+hqx`lP;e?{pF z**QEKdIF1>f|y@Np)5qxA12PT-G0zX7^7e*qyMjtgzLjyHpU@(7W2aim;U0|05efV z1@BMq!K&997t@SE=rtC76P!1YJEE!yUy{X10hI|?I_X9t&M=F!9M}>6TCbLGKa0QtZ z@Y$PwLpbunqB9rO7Lbb@^{?%AsSU4M*Enqye>!_xy?w=D)t4R^sL)}r+UX=pfOqu! z9(@Bf7DnA|itcw0(Dw+8lkrbsYk1$^$D5ty!U9Ii!65htAn~p9N1hlgj*(>>HS6XN{ISO{}eZjZTqOprUAgV+9qM2mFWM-i~z z5VhgBA>PUoL>g59L4FdDVU}}l5`eQ!Rq+o*f1E$Bg#`HzlqLC(gjxGjTlrUQDX+~s z)|@cK4`W(!RpMZ4`u_9#LqMIiMn0any4LbC^~vkFE*NbRA6^xXto$Zvg&u~;*J3ne zZ#OsGtfhwgbgN9u!jcqy(~UwV`16}&O|j~Ro83x(cq2HgTH9L}Z~eI(ER_bUe05j3 zTti{t{{x$DN6v#4pU}b&oA3OuE%v&D(fk(7vBk?$F$iJ7JltfqxpxKkR<`y-5(8Uq z2`7rQz>TmxNjOe^cARi97ztMY7Pqm3!PMe}-yrbu|Cc%n^-QFmy4G2aP>ByG(_btQ zecIF(1ERX;Owj+PAYgj~1eR^gIr*%%W+FMHU>Ar)&#X_zFQZ3D>-KW81NqMiad5(* z!Dfhz<&+PONcN}3Bq~{VPN~VB*vU|lKU2?hi;7_Frn!^I-!|c+$3_p&?Ebu7FUm-2C49uRv5Ci2 z2dv^WPLD`SSaU!h6(v9RuP^Rs__y~;%P}rw|1HRHglo#7z)%J*vV7X9F`{^%enhg0 zyCo!o$ay8qmu7zu;AXsd^!1d&haV%+7 zLER;POiT>e4s6s*!G`oBKDn={z+rQk*kSnKl`+BhFW}|ub=(Bm&md~Z30QTu1kg$T z1vtkgYV1rt{0rg|{kQLtiYvtL`FZz4aquz4%G&yH)-;?+Lpw#^*&KYWNPAEs(+n=S zeNy!%#ILcjqk3pxm=APx37MIz=KlcQ?d|QXEdMvwomXA0l1_m5cVH&}d)1|LI{4C% zzmGEK{VI%5RmIZTxD%(T)g^P9$5;1NblA>eUuv;-5+8m8VUS5jq@XA_^X}sX{01e;{o?QqX8oC zISvj-Z2+D_7;?!r zjN$;d<~C-A)nLC>OKkyf`QBhf3A<4*{W2A=%x@{z4?7-S>NvPz1LCbsX#oZTJ^#m| z2m2v6@Iz7qPau@n{;8y8?&hb8k`S#w1U+Hr%6?(&pq z(Xwb@MmS%a7+549JMjkX-0^dol#E+TT7ySZYp=J%v99{WuwAI*?;LciAS0z9S?q}$ z33!Z(?S^4&HaC?r<^D}73GlYI;UsXK^ZfKvqfQG|*EwH6r10UH-R^s-0T50(#VXtCRaPk`9l9G<>&Y@X+@fOeskfB#MfnFxA+P4;5oKwiEL zqs7Evq;6?sxIn5Ntmz*V8~4XaVxLOdk1~%m+>dnKCl95fXQM{qa11+kIeouT zVAJV|YlDohu3bk*NAnB1vaD3`NlC*N8=kS3SMD`5Q^#{eA5>?{aMDe3iD|2g1Iuy` zbB~dTd4*-Um$`lqiTRugEj}5qs2zX@d9ZEzld7^i>Me_87A9rr=bbB?@)W-8j4b<# zqW0qKUu{b(KmPE246m%n12bFc?(qq4VqXk4Zfs|pV|H2zLS-z9Bc?2|;zp)5iRqFG zYjXq7tnlH{NvX0_64KJ-kKbNlu8|2f1Y@D$(WbFu@@)m-mshO7E&vaEv@^%zQZwe* z{LNCN^s=4HLr-7EcI)fmeZwqq73$w0O%1;h&gKs)$z;W6Z#Lx>wgUL`&8Gm{FLygJ zC;afwf;mH?m6l7;01bV8pa}7vgVAog?a2YC_3NIKKrIe%4$z*;cL0i zXr)w7O6Il`M8=#ho~(7GoKz}djpB%`=_|F}33j_5E9-e5n!`Xr;^+mndFfp>jsFqw zO%2+nvYRjJ=*Tc*jM-Z()FXCM*TmNfd-r^AvCKC1VXCn^5_a}_ux~zj?hiBVjV#Z} zH9qZ1%<9n322^g;?0yR~{3evM`Q80kr{@l__!0@3tb)!2-Tf>CV<1?1Cjt2j9;@YB z`7L+n3sh9i($vxSscE;^8tkHmocz4JZ=s=~Q`Oqn#|Y!M3YkUs?dfTcXH&o4=QrZt zD|$@#JH&Rns`nuS43=kVy8TBeLM$qCjfczL$(bWwh3H3l55X%bo_ z?Hz)0#$5g{Fn29Y@d~#thvq5Ux1OU@qj@h^w;{yQ7it0}2~tbOx35 z01A_qb--2*9*$FdRkfsm$tbGOUq1RkB|jelXQA7}`k3bo&z)WmUj1hbZHu@wOJry} z*(&yo&y_~NnddlLa-%oNq!8{v8JmjZUtRAm>j4hXTLdt}s-|1pWm4IC{aojb#$HjW zSFh5-F1j0{L@C-DDLg6TVwI)?lLRnhX>Ded4YY77>Eny!M_-)~K453)+-|$l!^}39I?`c0ihUanue1lyrSEzsq5FuO^e3XTms`D9pSdTmQ>dJAG@0C6lE;eY3DAmd;cI-?)2Ru8Xy4{5| zmRm0FCQb2Zn`Z-z2g{LeD#jXy z*B6&_p4I09+19o}D36PY7xRnxCQO zk7$yVw)k0R)(s*RWn7N|XIr`eARRT|pe*@mVMRyAeTHbRmns1cF)pkgESRss!Cg`3 z_q~`90(cCMm$lQ34TCa7b(;@yn^iK0Pe-yOi@3Be`e)M;y&+k86OYG?SDv{cU*33l zJ+wLR-;ja~5_(h1RyF)4;GPu4K99>7_}XH*?rULj_f4=JWD7AO^vwN&6^a(XqgH^3 zJAZ&ln8wwhCpQn$AJbf^Stx=fQs68uCwJ8Hdu6y9Pq`3RXDf-SD?l%cQ%qZ;b^k z#9r3Agn)U?+j(h61}^-`BD)nuyBD{Qe&H*Ysx&z49M?>x?HnOmZd~`PIQ`tpK^vXf zF6oQ@6TzTq`+IhGC5SncPj6iUnqDpSk6G9``+N%^%nXBpiA!25+B{tgb=<}N1+nZ- zxf1;zbL<+PBxlg82BMep#EXlCa?Qy*f7U_hDR&8c0h)?nOxZDiwFGlfe67ClIs|@P zjuZfZGt#_tclMm9oY~)05b5kro^Dh77SJ^oMt)AA7;%}>@D{oKlgecP^DDZC2@@mF z?v4BZXaN|Q6ZWUw4&DSHdHC%>n{cY z)I8=Sg6y7F+lxWlSvhP*KyU*0CwjcoYW|gt5Z#uXuVI!4UXIrGv`W-XT;*jV9$tqZ zx}Vrax*>pra-9Q5BcL014#D=9(7cI643j^DR!@&mpFJkGOOVH>9@htK57fKv8s4D` zirE2&!J3&L)CBaOCEjqVd(3z;Hjd3KjF@!An0KCFvB<*3rG<@+S}1hynRzc6}Yn~PHF2B5c@mcq()2Y1``mM@5wih7&Z#G z!52m3GfH)s+C9D-7FAtC1l-^A*u7s!Mk*pX>B0AG$j&|cOl!f8D+C=I{n2J?fbDGv)StkCl<1cy)V>a_(hT6n3=e2D}Uczj2 zr<`(Iz;@V6%BD87!#1(E%4a>GN%0YmSln&yqdK=tte|vC zmOpITQx%d2cc;W_1#!gsr}=xvWzjn?KjJMB4#xBBCBP+ItY0QMBPqOn*dO5`W{B6K z02O~s={lKpF^};6@1h+aov_TQmlx|#Tb+p`SeT#J?LPBBk{VOhDOjwn;gdjo!GChb z-iE?`wr7ds4e{I^ebmf+skS5#@Oy^B=sfct%iwKzx|KOJaQo(M)?f9&y%Vx03fzoG zY`N?C2F?#O1q}9%CO#t^hotsWC!b_eeDhAo3%>8K{m3wMTfL%+jLbbmSI((Zlcz5?1&7<-1{M-%} zN7#UkG^}F@La1J~SnOO(OaBR=cAh>JEy5`hsnqRtaG5O$Z~;d3a6GaT6z zG#|13K}`!DKFql&CEL9lXj^Tm;3MMRGnRXloFLLNMUe^{Q{zB|6@|Id5MgfH?3?U6 zbgP+0taGi0orM^+n5`_lf zQ0d-O>B}TB0aYQ?U%Y2)MIsi}Q4Iwp&eOo8?6BE?Dz*`yO z4oR*^*}ZJCV&j#|+kdKfz(r$Q>dJ-j+Q0;w}k;6++%g_j})@h)@&Ze%n z8KI{(=;;fM7Kmg6eB<)f9b?dWMnj#NG^+nZhwFMvrfQo zO$S!7uXxB61@ZG!qyPgySkx5`1jCxtXbXZ;2K+VKACV)Y7sRcR@&*o&0)2XSryH@i zC8sAuLZKl^W&yTLK%YB|C=X8O*$?S&7p(TDRUyOClmp}x_9gU;j20)0948LegVUO` zhuxR($w@HM(({|g+DZb?(LPLN?dG_;fE<4QHq{?xV!oNbOcm1r_ha3M^=GML)g?j^ zG!Tvgt|^n|OJc0XckR@3sVZo7w|^)|t8#93?zEb$V1F;vdwPg)tQ3NqNTwQU_*1&& z2o?42K2~~H#ullvZJyDYY@&YRePqoBJDv>hzin#bvBuV3j9j-qk9M2#o)+s1&k+vf z*Bl!UvCRE?oxwWub!Ch)@UL~mgP|PMmJ5lQvd^0fZHF%}6XHD#mF5=ye@Z*cu&BSS z@6#aC-O`MLG?J1cAsrIZozgH!i_(pN4BZGwgF|;ogLKbG=g`O?_wRq}IoElf>pZWX zm-A-!HG9w6d#}&>?(Y($8~^otF|FOJ7->LVUZCeON~AjTBy2Thq2No$FPE`jXLpSS z7^VJT%*jPVisiP`LBSFaeNAoOs3Qe*Qiw#{;jnF;yDi=+=jVo>A<1!ldH&qx6d7D5 zeDUIX`a~e>y)|y6r`Xzr*K{e^i|uN3ex%LuHSb~lKK2*GYZ2%8r`D@6EZZ|baYfFk z5#yZSIY`?N4#fQB%WQx0#p|SD=7H3oQYIn4*nZLQD*bLHYtKiQDNZu99Kf0rICX-SU+} z{z|waJV|jupOncySv#RsY=EDQR|~SbUlICGUjh3sm26*HDj5@R8t2z8EMb{x*cwsi5pv`b8@3| zQmVXyg7~D}r^`EHk}s@~Vi*D}6Pb8|H6a+9ZATckkr3yT7~_-o3n?-rScV44L#$Ar zg*8sth?RzvOuTb3@9GmNL1CwZH6*ro*V@k1&SKrxEc0{ zNq-hGC%L-2Ae=wnnl2=HoTQc{{fsPb@a3E_zd+qith`c*_WUkcb0z%h*Q5^p%r32V zu32vG#ymmP)K#cmRybiEG}j)tl%k!BaCen;?QZxH?@|7%u;zIT_OYLdx&q^3#sD%E zF_BkA#}|^zddM`U)+dM0zj{nZGmDDWN%+X5JIC7@en*(0Sk7Hp41%wP!O2&T|SYbvG-qO5tbi~BM zBCW2DiU23Au9_qbVYIciQ56FXhUKP(0OSsz8fwLz(U#>KlyFM3_w8siLFPTP$$yOE4D zUdxw+>m_}EYA;ZfOkrTsfwyUHlk(QA6=aR@d`Ip$c#?9Fn=z%FFbesA+X*;eUTv+u zq%o`im@v1Drnz!MuQFH?f;>dcyG3ygIz!6gTV2v_$Rj#a+$P$vA)Zm zhV5VDBR>Cs8y{VNBA8fQ6e|_q-QCSADY4bKV&YZ_HTLQIsI-?tg{M{3YnJei4J(vD zLraU_PJABU%El%sJzdo9mWZ-=c6L_gYYVKK71&jw(zZ9tx;s6wN{$m1>8NDH;>J>}%4 zRW+vO8$&A{P=L>L1228No*~^?GFIoi1Fpu+FIRjB+?4*r43)`PIg0t!kxeT1o3YD7 zaiEYl3dhuAvR=yF`^+F!yvsy$*v+e|GL6#dMu#^YnpY0^WR-~^$L|fsE1&z_WZdt! zd?KU7a~t~meGFq6C>x>o$b^C4IYpj6SAfs8Qju0E=$gM)Q;4+ZeB+^&#b<`rc085% zG_Zs+V?yNGao>cFrz(@MRN6gqJpfi?0{K1BtNzXcd6;?ZhLE4y{A(O_WJ<#3#{m(5*l98v(;`+fGh=i;+!TGYh!hlDM$=DzX%WT#W*AwR|NJ-L6#^%c8Mv@Oc0Wtae7z!~(!Za-3%rF>?S+bO2 z%>>3-D@fQ)8u;MR7QUC}pID^Q>XDSzZ*agLZFzHYqatBKS~VW}mTE^*%3wi8>v6^l zW+jtA?j}*{bukfXg2 zyEIU_f_=SHV6(V*X<6c|VPpvD@uU~)4QXt<_NTVO_88&;p&4;;#=#eJGmuNgYZ|_z zGarv)VoN? z$aA}1m%My-++WL;^hI#j6A~ACE9$v}QkhlE>Pg(ZmtZP_)@KQWa@)(Jl9{X^kC(4Z zkEs3=?lW$#f-|3H1clmD0aXHj6R9Rl7EM*cg)TI9l~y3tG-?(jOj0YF6vFSTIr;K{ zWKt~&!EI3k8hVi#Ga{j)&R%9?hJJe`G(Ec*ljr!8k}NqTE7qQBC#rj?!;v*nF>t8J zzOb1pTSB-Ki%-MY@uKnQL79wMF~<6?tB}4TFoRF!UdQPi4O# zJ-Q}|z9ycw9kA9=%FtU`fYY`)YHpil)`O}lo0(%eIyE^w zN?zJ$qKz8*noNFX!Yef9fU&GNF{%&H1q^(YehHkWArB?1D0SyFgpybFKf#iSOHt`L zsX4N0uctZu#u!V?O^^%hBh;MWpT#Vct}YQ@2uIELV+>7@cO%J?n~`^UKvK}AGA;Sg zqnGUHZbM2#*Wr@Q(EQm~{VvG2o?aY{cZcXBL8V%1P@X=Nj;hPA704lnM*km?oA_GZ z!~PU&dTO~v*%0hK9P|&{ns-YE5)BsYQ=ShIGvt0AY~#HpS_aMb^InfdoZna|%-6Q2 z>MATHEp6AG-;!g*)w3mSKnw^huNbnve-RYd3A6yVm)ugwp*6`<4FnR3cG{y-@sb zf2oxCuhs!~G+Swh`3RNl*vPZl+W4TmruFqwXqE-=M?VTeM|V)bcIP3rIm2e!sxlb= zWy%HnwS$#9Vjw&HQ(mGY@VR4kA21+@M-kM1MIN!F5A>l{sMx2#W+!w_{k!1#-8{D~MSGcSyBGv^n;LrH7Sr^(EM^X-wB5yoTv)Qn2|( zQSvg5HZJ+(fHpiwbce4!i|uo06vf4I{nClPjb|%^%q+I_G`uWv%6DvznjU|!hhTL0 zKHn6q3D~yv!&&hr)E>a#9cA2H%aBX);mlYQMaUf3kH;p9+%?rl&OyFI_kVx+(8_KT zC|XyncNvs9=F#Jg_x>%|byBJ1-GpaK>oONN?q<>^Ha)iPoZDn|5`~{nfZ{7wmAAaf zW-<}dHqX+GZt#D@eOwaLCS$j}*JseK?-p2-mAHnx1@Uxr<=l+X0v|=~!_I7ot`=Ce z!?A0uh`arA4@YUr<^m*(rmze%9#EzVJih<@0Z9Z$Gl#qh(G2}8G^rrKM{->K3n3I> z923XgVGa@iw&QK@*_zW>_pQpu;YPAZX zT2L_v_Q`8@?qB3)V0E<`;q@@4c)J>7<{W>hzW#xR${&#!lk?fi%O{CH6r+`+I7O;D zb-?9e_Gj0r$6H(#$!)Tvwr?5NDF09NTOhyy7%kEf@8wjK*j*YH@Ln75*0H&GkOFYCrI!j{afa==0qJt}@plUGkeA z_@TJCr@Z*2@oR**`l+$W-b&)QLspPa1@9{p6HQ;JsqtBQXo2DgwXpIg?6~h2F^cau z>5a4yl&lTJy(HX?&dF*Ve0V7pBTg#Qz1wH`pxh_iVR;*Ts!s{cZhSnw_{a=eX9oMt99rntT>@{oR@(5s%f<`uOu|A|wiHr3$O z3^6-Nxz+4SKo@E-Tjg{A00Thx&c%%Ja7VN$%|6dp7`T+ve{0S0fMcLT zd7=-Q-JJ~De_4JCKc@QdfHJoK9FkiKjgozG=nCZ++Q?=_e2V@G60v{SQj$f?GT^?D zvSxW28`LLnO$lcu1$om5*}F}T3Tx|2P{i|uwst34ZT*Cg4|eAeGbW_>%};5$pPg!w zW6pU^c%{|k34CcQQt7B7aWsC)xfVrK*SQy0ZGS^UGcXRTERQo?`>zO7Jox`XLZ{kx zUhxJWa}u%2Ia2H^BN9 zJP+k`$kX7{c>WL>UAG$)Ti*Am4F#c|Jfv^Isj5#Y<|#HPUu!%nFWiH`Z*R{%-lE8} zG1)~=q*hlS{5~2kcK5iMtku`2kF5xNJG?*%llbS{HS(VXL9QC7X6Osb1(bc%dAy&5 zl+9b&fDwKqR=!4LJ<*m+&?s!vRVsgztkAEcPUS(7vs*UoD}kJIDos&qZRk;G-eSqY z9Yim7D032mcE1b@Jc+MZVoF4lFS0#JAYyc>jpQ9ZGGGhVSfaGIXK&6bfIFIIuwa(^VByuD%le*dDn!Rw_mJ@*i$~rs7d#mt1vSR+Menju=jI% zd}dQ2!9Qw`>3@QW>&~DdnSSEzbD+>cS5JSCeN8`Ra|`4;K}+XY&WBlo0oBp4Zdr-u z?;AbX8f2iyLnTf~#bv8ctJ$Eq)UJq0cxNQ>ekAciTh1l=b8x7E|H+0LK|Ouvz7XQt z%Tsu0hwtN0%2*lgHWBE&{f;WDD7ZQ~$RErgS!GKU7k16x(AcP@#e7%UoA&Bo$OD?N zrwgc(_GC{BLbhcc9rsTHLUZ@UEMLYIHWg)6X1_gsh|5R*(TZPQV)d0;AcHXtiL2Y?m2=L`6px?1=ygMpnK!&GxUydIVlI ze-mnc0A~*3+X%RgD6YCJ%B%bEh^C{WrOPz85Y!3RVw=8Xzg-kl?DeA(bzm(Ri0M+j z$}d}o5*;5fW;JSf(i`he3X!u2paa{54*h_)>mgZOc~Y%$W%Id(^1xs@=RdqDVxth2 zhedttLx8_zuNDuvnhTOIo-49GW+1rgMc7&;X=|v+4C%Y-5ctq_0?F+V83?O#Pwvbr zZx7W-e&7V-1YF14mcCPr-6IH~I#q2AA$<9n2o6#!+v}V1mJUEtM*hF~w1p!6Kj<>& zHzM4VVG*zqCYVrp8Al^0BSYNPigp?m^#JQ^aG0}SS5UJSTE4CvxL~*=Kgh z+gy7wh|T-_i&z6!Iwy|Uy)yspEywWY&wn%ZrZZ+~XrUAHJ@THr@XU;MG?AjBUhcIT zHzr#F2*e<-Ib?@suyBn|y~7{{;RrrL6wtDlRbGv{lz~Ko59imPuxi^Ur2>+*k&5<^ zNfre>FTTGk;Jz&%jKbRl!wp2P1xkxe$`>}J>nx(K^vd^~U-Pz^2(G-)6r!Wl@HEmx z*JDdjhKnR98x&TMJzioCq`J|_SCx4(=NTPnFhF4zuKF^=?8)GPe$tT^vk8Rnzz?1W@ z>AL>5Zm{c*pu2s)`L>deu~p7nU%$};3`%4wc2F%@ttjHsGbudI`+-CtB4Z`@uj4;|C2*4Ft#Xk<#IDFUtw)pT@zOm~5w$in#WCE`{KR?I2eEVmbh)gH$QOReRT$nns R0)YWhl;qW3RLYvY{~zTrV4DB{ literal 0 HcmV?d00001 diff --git a/docs/grid/api/history/add_method.md b/docs/grid/api/history/add_method.md index 3517faec1..b0ba97488 100644 --- a/docs/grid/api/history/add_method.md +++ b/docs/grid/api/history/add_method.md @@ -28,10 +28,14 @@ add(action: IAction): void; @params: -- `action: IAction` - the action object containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) +
+ + + + + + +
action(object) the action object that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
:::note The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing (for actions with the "change" and "removeAll" types), the [`error`](grid/api/history/error_event.md) event is triggered. diff --git a/docs/grid/api/history/afteradd_event.md b/docs/grid/api/history/afteradd_event.md index 4f8167d12..f3fa44507 100644 --- a/docs/grid/api/history/afteradd_event.md +++ b/docs/grid/api/history/afteradd_event.md @@ -12,14 +12,32 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @short: triggered after successfully adding an action to the history -@signature: {'afterAdd: (action: IAction) => void;'} +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +afterAdd: (action: IAction) => void; +~~~ @params: The callback of the event is called with the following parameters: -- `action: IAction` - the object of the added action containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + + + + + + + + +
action(object) the object of the added action that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
+ @example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/api/history/afterredo_event.md b/docs/grid/api/history/afterredo_event.md index 4d4c7fe1c..43021a9be 100644 --- a/docs/grid/api/history/afterredo_event.md +++ b/docs/grid/api/history/afterredo_event.md @@ -12,14 +12,31 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @short: triggered after successfully redoing an action -@signature: {'afterRedo: (action: IAction) => void;'} +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +afterRedo: (action: IAction) => void; +~~~ @params: The callback of the event is called with the following parameters: -- `action: IAction` - the object of the executed action containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + + + + + + + + +
action(object) the object of the executed action that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
@example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/api/history/afterundo_event.md b/docs/grid/api/history/afterundo_event.md index 56aebc37c..095543ab2 100644 --- a/docs/grid/api/history/afterundo_event.md +++ b/docs/grid/api/history/afterundo_event.md @@ -16,10 +16,15 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @params: The callback of the event is called with the following parameters: -- `action: IAction` - the object of the executed action containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + + + + + + + + +
action(object) the object of the executed action that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
@example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index 82e9a61f0..aac728b8d 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2580,7 +2580,7 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the look and feel of the drag panel that appears when the drag-n-drop functionality is activated. Check the details below. -![](../assets/grid/dragpanel_module.png) +![](../assets/grid/dragpanel_modulle4.png) To initialize the `DragPanel` module, you should enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration together with the [row Drag-and-Drop](#drag-n-drop) functionality (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties). For example: diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index c8a731737..a2cd87995 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -12,7 +12,7 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The `DragPanel` module provides auxiliary functionality for moving rows in the **dhx.Grid** component. -![](../assets/grid/dragpanel_module.png) +![](../assets/grid/dragpanel_modulle4.png) The module is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. diff --git a/docs/whatsnew.md b/docs/whatsnew.md index bec86fcb7..b6fa90f50 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -154,6 +154,7 @@ The following shortcut key is available when the [`editable` mode](grid/api/grid - Grid. Export. Double quotes in the cell value are escaped in the exported Excel - Grid. The issue with editor closing and saving the entered value on scrolling the grid - Grid. The `draggable:false` setting of a column affects the drag-n-drop of rows +- Grid. The error that occurred when the value of the `parent` property was set as a number ### New samples From 152562ab46223889062b25707de4109a7e2ec42c Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Sat, 12 Jul 2025 12:49:40 +0300 Subject: [PATCH 42/47] [update] what's new, drag panel image --- docs/assets/grid/dragpanel_module.png | Bin 64857 -> 41218 bytes docs/assets/grid/dragpanel_modulle4.png | Bin 41218 -> 0 bytes docs/grid/configuration.md | 2 +- docs/grid/usage_dragpanel.md | 2 +- docs/whatsnew.md | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 docs/assets/grid/dragpanel_modulle4.png diff --git a/docs/assets/grid/dragpanel_module.png b/docs/assets/grid/dragpanel_module.png index 01c8c24b54278ee2b3ad24c15c3752164a75ac91..4f9cdb2fbe84c4fb194f127a30e507268d04724d 100644 GIT binary patch literal 41218 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 R0)YWhl;qW3RLYvY{~zTrV4DB{ literal 64857 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 R0)YWhl;qW3RLYvY{~zTrV4DB{ diff --git a/docs/grid/configuration.md b/docs/grid/configuration.md index aac728b8d..82e9a61f0 100644 --- a/docs/grid/configuration.md +++ b/docs/grid/configuration.md @@ -2580,7 +2580,7 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The [`DragPanel`](grid/usage_dragpanel.md) module allows configuring the drag-n-drop functionality in Grid. It provides settings for adjusting the look and feel of the drag panel that appears when the drag-n-drop functionality is activated. Check the details below. -![](../assets/grid/dragpanel_modulle4.png) +![](../assets/grid/dragpanel_module.png) To initialize the `DragPanel` module, you should enable the [`dragPanel`](grid/api/grid_dragpanel_config.md) property in the Grid configuration together with the [row Drag-and-Drop](#drag-n-drop) functionality (e.g. via the `dragItem: "row"` or `dragItem: "both"` properties). For example: diff --git a/docs/grid/usage_dragpanel.md b/docs/grid/usage_dragpanel.md index a2cd87995..c8a731737 100644 --- a/docs/grid/usage_dragpanel.md +++ b/docs/grid/usage_dragpanel.md @@ -12,7 +12,7 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The `DragPanel` module provides auxiliary functionality for moving rows in the **dhx.Grid** component. -![](../assets/grid/dragpanel_modulle4.png) +![](../assets/grid/dragpanel_module.png) The module is automatically activated when the [Drag-and-Drop functionality](grid/configuration.md/#drag-n-drop) for rows is enabled and conflicting configurations, such as the [`BlockSelection`](grid/usage_blockselection.md) or [`Clipboard`](grid/usage_clipboard.md) modules, are used. diff --git a/docs/whatsnew.md b/docs/whatsnew.md index b6fa90f50..195c4cc4c 100644 --- a/docs/whatsnew.md +++ b/docs/whatsnew.md @@ -10,7 +10,7 @@ Before updating DHTMLX to the latest version, please check the [Migration to New ## Version 9.2 -Released on July X, 2025 +Released on July 15, 2025 Review of the release on the blog From 44c0f133bd4ecbed4e7eacb891c57b086e9cb0b6 Mon Sep 17 00:00:00 2001 From: Masha_Rudenko Date: Sat, 12 Jul 2025 13:01:45 +0300 Subject: [PATCH 43/47] [update] api pages for grid history module --- docs/grid/api/history/afterundo_event.md | 15 +++++++++- docs/grid/api/history/beforeadd_event.md | 28 +++++++++++++++---- docs/grid/api/history/beforeredo_event.md | 27 ++++++++++++++---- docs/grid/api/history/beforeundo_event.md | 27 ++++++++++++++---- docs/grid/api/history/error_event.md | 32 ++++++++++++++++++---- docs/grid/api/history/gethistory_method.md | 28 +++++++++++++++---- docs/grid/usage_history.md | 26 ++++++++++++------ 7 files changed, 148 insertions(+), 35 deletions(-) diff --git a/docs/grid/api/history/afterundo_event.md b/docs/grid/api/history/afterundo_event.md index 095543ab2..e5cf908c8 100644 --- a/docs/grid/api/history/afterundo_event.md +++ b/docs/grid/api/history/afterundo_event.md @@ -12,7 +12,20 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @short: triggered after successfully undoing an action -@signature: {'afterUndo: (action: IAction) => void;'} + +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +afterUndo: (action: IAction) => void; +~~~ @params: The callback of the event is called with the following parameters: diff --git a/docs/grid/api/history/beforeadd_event.md b/docs/grid/api/history/beforeadd_event.md index b2b926b4d..ba04f9d77 100644 --- a/docs/grid/api/history/beforeadd_event.md +++ b/docs/grid/api/history/beforeadd_event.md @@ -12,14 +12,32 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @short: triggered before adding an action to the history -@signature: {'beforeAdd: (action: IAction) => boolean | void;'} + +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +beforeAdd: (action: IAction) => boolean | void; +~~~ @params: The callback of the event is called with the following parameters: -- `action: IAction` - the action object to be added containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + + + + + + + + +
action(object) the action object to be added that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
@returns: Returning `false` cancels the operation. diff --git a/docs/grid/api/history/beforeredo_event.md b/docs/grid/api/history/beforeredo_event.md index 316373d56..d15f85115 100644 --- a/docs/grid/api/history/beforeredo_event.md +++ b/docs/grid/api/history/beforeredo_event.md @@ -12,14 +12,31 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @short: triggered before redoing an action -@signature: {'beforeRedo: (action: IAction) => boolean | void;'} +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +beforeRedo: (action: IAction) => boolean | void; +~~~ @params: The callback of the event is called with the following parameters: -- `action: IAction` - the action object from the redo stack containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + + + + + + + + +
action(object) the action object from the redo stack that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
@returns: Returning `false` cancels the operation. diff --git a/docs/grid/api/history/beforeundo_event.md b/docs/grid/api/history/beforeundo_event.md index f9d2060c5..9b4d12e03 100644 --- a/docs/grid/api/history/beforeundo_event.md +++ b/docs/grid/api/history/beforeundo_event.md @@ -12,14 +12,31 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @short: triggered before undoing an action -@signature: {'beforeUndo: (action: IAction) => boolean | void;'} +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +beforeUndo: (action: IAction) => boolean | void; +~~~ @params: The callback of the event is called with the following parameters: -- `action: IAction` - the action object containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + + + + + + + + +
action(object) the action object that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
@returns: Returning `false` cancels the operation. diff --git a/docs/grid/api/history/error_event.md b/docs/grid/api/history/error_event.md index b4c267455..e876bc785 100644 --- a/docs/grid/api/history/error_event.md +++ b/docs/grid/api/history/error_event.md @@ -16,15 +16,35 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac The event is triggered when an error occurs, such as the module is disabled, the history is empty, the action type is invalid, or the inverse action is missing for the `undo` operation. ::: -@signature: {'error: (error: string, action: IAction | null) => void;'} +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +error: (error: string, action: IAction | null) => void; +~~~ @params: The callback of the event is called with the following parameters: -- `error` - the error message -- `action: IAction` - the action object associated with the error, or `null`. The `action` object contains the following properties: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) + + + + + + + + + + + + +
error(string) the error message
action(object) the action object associated with the error, or `null`. It contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (for the "change" and "removeAll" types)
@example: const grid = new dhx.Grid("grid_container", { diff --git a/docs/grid/api/history/gethistory_method.md b/docs/grid/api/history/gethistory_method.md index 98b6f3fc4..ec4fcafed 100644 --- a/docs/grid/api/history/gethistory_method.md +++ b/docs/grid/api/history/gethistory_method.md @@ -12,13 +12,31 @@ This functionality requires PRO version of the DHTMLX Grid (or DHTMLX Suite) pac @short: returns a copy of the array of all actions in the Grid history to prevent accidental modification of the internal structure -@signature: {'getHistory(): IAction[];'} +### Usage + +~~~jsx +type ActionType = "add" | "remove" | "removeAll" | "change"; + +interface IAction { + type: ActionType; + batch: IRow[]; + inverse?: IAction; +} + +getHistory(): IAction[]; +~~~ @returns: -Returns a copy of the array of all actions in the history. Each `action` object may contain: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing +Returns a copy of the array of all actions in the Grid history, where each action presents an object described below: + + + + + + + + +
action(object) the action object that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (for the "change" and "removeAll" types)
@example: // The example shows retrieving the history diff --git a/docs/grid/usage_history.md b/docs/grid/usage_history.md index 15cf5aa19..4c92e757c 100644 --- a/docs/grid/usage_history.md +++ b/docs/grid/usage_history.md @@ -140,10 +140,14 @@ For the "change" and "removeAll" actions, an `inverse` action is mandatory. Othe You can add a new action into the history of actions within the grid by using the [`add()`](grid/api/history/add_method.md) method of the `history` object. The method takes the following parameters: -- `action: IAction` - the action object containing: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types) + + + + + + + +
action(object) the action object that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (mandatory for the "change" and "removeAll" types, not required for other types)
:::note The `action` argument must conform to the `IAction` interface. If the module is disabled, the action type is invalid, or the `inverse` property is missing (for actions with the "change" and "removeAll" types), the [`error`](grid/api/history/error_event.md) event is triggered. @@ -397,10 +401,16 @@ To make the process of working with the undo/redo operations more flexible, you You can get a copy of the array of all actions in the Grid history using the [`getHistory()`](grid/api/history/gethistory_method.md) method of the `history` object to prevent accidental modification of the internal structure. -Each `action` object in the returned array may contain the following properties: - - `type: ActionType` - the type of action: "add", "remove", "removeAll", or "change" - - `batch: IRow[]` - an array of rows representing the data affected by the action (e.g., added, removed, or modified rows) - - `inverse?: IAction` - the inverse action required for undoing (for the "change" and "removeAll" types) +Each action in the returned array presents an object described below: + + + + + + + + +
action(object) the action object that contains the following properties:
  • `type` - (string) the type of action: "add", "remove", "removeAll", or "change"
  • `batch` - (array) an array of rows representing the data affected by the action (e.g., added, removed, or modified rows)
  • `inverse` - (object) optional, the inverse action required for undoing (for the "change" and "removeAll" types)
The example below shows retrieving the history: From fe3beaeea9b2b9fcb8c2ad5daaaf611142d19eb8 Mon Sep 17 00:00:00 2001 From: Serhii Pylypchuk Date: Mon, 14 Jul 2025 22:26:28 +0400 Subject: [PATCH 44/47] Add integration guides --- docs/integration/suite_and_angular.md | 278 +++++++++++++++++++++++++- docs/integration/suite_and_react.md | 246 ++++++++++++++++++++++- docs/integration/suite_and_svelte.md | 259 +++++++++++++++++++++++- docs/integration/suite_and_vue.md | 261 +++++++++++++++++++++++- 4 files changed, 1012 insertions(+), 32 deletions(-) diff --git a/docs/integration/suite_and_angular.md b/docs/integration/suite_and_angular.md index 8ec111478..2d92d18f9 100644 --- a/docs/integration/suite_and_angular.md +++ b/docs/integration/suite_and_angular.md @@ -1,14 +1,276 @@ --- -sidebar_label: Code examples with Angular -title: Code examples of DHTMLX Widgets with Angular -description: You can explore how to use DHTMLX Widgets with Angular. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +sidebar_label: Integration with Angular +title: Integration DHTML Suite with Angular +description: You can explore how to use DHTMLX Suite Widgets with Angular. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- -# Code examples of how to use Widgets with Angular +# Integration Suite widgets with Angular -![](../assets/integration/work_with_frameworks.png) +:::tip +You should be familiar with basic concepts and patterns of **Angular** before reading this documentation. To refresh your knowledge, please refer to the [**Angular documentation**](https://angular.io/docs). +::: -DHTMLX Suite is compatible with Angular. We have prepared code examples of how to use DHTMLX widgets with Angular. +DHTMLX Suite is compatible with **Angular**. For more information, refer to the corresponding example on GitHub: [DHTMLX Suite with Angular Demo](https://github.com/DHTMLX/angular-suite-demo). -- To check online samples, please refer to the corresponding [Example on Replit](https://replit.com/@dhtmlx/dhtmlx-suite-with-angular). -- To download samples, please check our GitHub repository: [DHTMLX Widgets + Angular](https://github.com/DHTMLX/angular-suite-demo). The README.md file provides all the necessary information on how to run the app in the development mode. +## Create new Angular project + +:::info +Before you start to create a new project, install [**Angular CLI**](https://angular.io/cli) and [**Node.js**](https://nodejs.org/en/). +::: + +Step 1. Create a project and name it as ***my-angular-suite-app***: + +~~~bash +ng new my-angular-suite-app +~~~ + +:::note +If you want to follow this guide, disable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) when creating new Angular app! +::: + +The command above installs all the necessary tools, so you don't need to run any additional commands. + +Step 2. Go to the project directory: + +~~~bash +cd my-angular-suite-app +~~~ + +Step 3. Install dependencies and start the dev server. Use the [**yarn**](https://yarnpkg.com/) package manager: + +~~~json +yarn +yarn start +~~~ + +The app should run on a localhost (for instance `http://localhost:3000`). + +## Install Suite sources + +Install the DHTMLX Suite library to get access to Suite widgets. Refer to the following topic for more information: [**Installing DHTMLX Suite via npm or yarn**](../../#installing-trial-dhtmlx-suite-via-npm-or-yarn) + +## Create Angular component + +Now you can create Angular components (wrappers) based on Suite widgets. For each complex Suite widget you can create a separate file (for instance [***grid.component.ts***](https://github.com/DHTMLX/angular-suite-demo/blob/master/src/app/MainContainer/Content/LeftContent/Grid/grid.component.ts)) in the [***src/***](https://github.com/DHTMLX/angular-suite-demo/tree/master/src) directory. + +### Import source files + +Open the ***grid.component.ts*** file and import the corresponding Suite widget. Note that: + +- if you use PRO version and install the Suite package from a local folder, the import paths look as follows: + +~~~jsx title="grid.component.ts" +import { SuiteWidgetName } from "dhx-suite-package"; // import { Grid, Pagination, ... } from "dhx-suite-package"; +import "dhx-suite-package/codebase/suite.css"; // import Suite styles +~~~ + +Note that depending on the used package, the source files can be minified. In this case, make sure that you import the CSS file as ***suite.min.css***. + +- if you use the trial version of Suite, the import paths look as follows: + +~~~jsx title="grid.component.ts" +import { SuiteWidgetName } from "@dhx/trial-suite"; // import { Grid, Pagination, ... } from "@dhx/trial-suite"; +import "@dhx/trial-suite/codebase/suite.min.css"; // import Suite styles +~~~ + +In this guide you can find basic concepts on how to utilize the **trial** version of Suite widgets. + +### Initialize Suite widget(s) within a container + +To display a Suite widget on a page, you need to create a container and initialize a widget through the corresponding constructor: + +~~~jsx {2,17,23,29-31} title="grid.component.ts" +// import a Suite widget +import { Grid } from "@dhx/trial-suite"; +// import Suite styles +import "@dhx/trial-suite/codebase/suite.min.css"; + +import { + Component, + ElementRef, + OnInit, + OnDestroy, + ViewChild +} from "@angular/core"; + +@Component({ + selector: "app-grid", + template: `
+
+
` +}) + +// create and export the Angular component +export class GridComponent implements OnInit, OnDestroy { + @ViewChild("grid_container", { static: true }) grid_container!: ElementRef; + + private _grid_widget!: Grid; + + ngOnInit() { + // initialize a Suite widget + this._grid_widget = new Grid(this.grid_container.nativeElement, { + // configuration properties here + }); + } + + ngOnDestroy() { + this._grid_widget?.destructor(); // destruct a Suite widget + } +} +~~~ + +### Load data + +To add data into a Suite widget, you need to provide a data set. You can create the [***app.data.ts***](https://github.com/DHTMLX/angular-suite-demo/blob/master/src/app/app.data.ts) file in the ***src/*** directory and add required data sets: + +~~~jsx {2,27,29} title="app.data.ts" +export function getData() { + const gridData = [ + { + time: new Date("Jan 28, 2021"), + nights: 7, + price: 68, + contactPerson: "Yoshio Slater", + contactEmail: "phasellus.fermentum@yahoo.net" + }, + { + time: new Date("Apr 13, 2021") + nights: 6, + price: 66, + contactPerson: "Christopher Kirk", + contactEmail: "posuere.vulputate.lacus@outlook.org" + }, + { + time: new Date("Jan 31, 2021"), + nights: 15, + price: 64, + contactPerson: "Jana Meyers", + contactEmail: "mollis@aol.edu" + }, + // other data items + ]; + + const sidebarData = [ /* ... */ ]; + + return { gridData, sidebarData }; +} +~~~ + +#### Specify data through the property + +To load predefined data into a Suite widget, you need to perform the following steps: + +1. Import predefined data +2. Initialize the required data set +3. Set the `data` property to the predefined data set within the Suite widget constructor + +~~~jsx {1,4,27,30} title="grid.component.ts" +import { Grid } from "@dhx/trial-suite"; +import "@dhx/trial-suite/codebase/suite.min.css"; + +import { getData } from "../../../app.data"; // 1. import predefined data + +import { + Component, + ElementRef, + OnInit, + OnDestroy, + ViewChild +} from "@angular/core"; + +@Component({ + selector: "app-grid", + template: `
+
+
` +}) + +export class GridComponent implements OnInit, OnDestroy { + @ViewChild("grid_container", { static: true }) grid_container!: ElementRef; + + private _grid_widget!: Grid; + + ngOnInit() { + const { gridData } = getData(); // 2. initialize the required data set + // initialize a Suite widget with data + this._grid_widget = new Grid(this.grid_container.nativeElement, { + data: gridData, // 3. set the `data` property to the predefined data set + // other configuration properties + }); + } + + ngOnDestroy() { + this._grid_widget?.destructor(); // destruct a Suite widget + } +} +~~~ + +:::tip +For more information, refer to the **Data loading** section of the corresponding control: [Tree](tree/loading_data.md), [Toolbar](toolbar/load_data.md), [Sidebar](sidebar/data_loading.md), [Ribbon](ribbon/data_loading.md), [Menu](menu/data_loading.md), [List](list/load_data.md), [Grid](grid/data_loading.md), [DataView](dataview/data_loading.md), [Combobox](combobox/adding_options.md), [Chart](chart/data_loading.md), etc. +::: + +#### Specify data through the method + +To load predefined data into a Suite widget, you can also call the `parse()` method: + +~~~jsx {1,4,27,33} title="grid.component.ts" +import { Grid } from "@dhx/trial-suite"; +import "@dhx/trial-suite/codebase/suite.min.css"; + +import { getData } from "../../../app.data"; // 1. import predefined data + +import { + Component, + ElementRef, + OnInit, + OnDestroy, + ViewChild +} from "@angular/core"; + +@Component({ + selector: "app-grid", + template: `
+
+
` +}) + +export class GridComponent implements OnInit, OnDestroy { + @ViewChild("grid_container", { static: true }) grid_container!: ElementRef; + + private _grid_widget!: Grid; + + ngOnInit() { + const { gridData } = getData(); // 2. initialize the required data set + // initialize a Suite widget without data + this._grid_widget = new Grid(this.grid_container.nativeElement, { + // other configuration properties + }); + + this._grid_widget.data.parse(gridData); // 3. call the parse() method and pass data as a parameter + } + + ngOnDestroy() { + this._grid_widget?.destructor(); // destruct a Suite widget + } +} +~~~ + +### Handle events + +When a user performs some action in a Suite widget, an event is fired. You can use this event to detect an action and run the required code. + +~~~jsx {6-8} title="grid.component.ts" +// ... + +ngOnInit() { + this._grid_widget = new Grid(this.grid_container.nativeElement, {}); + + this._grid_widget.events.on("scroll", function({top,left}){ + console.log("The grid is scrolled to "+top,left); + }); +} + +// ... +~~~ + +Now you know how to integrate and configure any Suite widget with Angular. You can customize the code according to your specific requirements. The extended example you can find on [**GitHub**](https://github.com/DHTMLX/angular-suite-demo). diff --git a/docs/integration/suite_and_react.md b/docs/integration/suite_and_react.md index bbf7dad59..6178b7e42 100644 --- a/docs/integration/suite_and_react.md +++ b/docs/integration/suite_and_react.md @@ -1,14 +1,244 @@ --- -sidebar_label: Code examples with React -title: Code examples of DHTMLX Widgets with React -description: You can explore how to use DHTMLX Widgets with React. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +sidebar_label: Integration with React +title: Integration DHTML Suite with React +description: You can explore how to use DHTMLX Suite Widgets with React. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- -# Code examples of how to use widgets with React +# Integration Suite widgets with React -![](../assets/integration/work_with_frameworks.png) +:::tip +You should be familiar with the basic concepts and patterns of [**React**](https://react.dev) before reading this documentation. To refresh your knowledge, please refer to the [**React documentation**](https://reactjs.org/docs/getting-started.html). +::: -DHTMLX Suite is compatible with React. We have prepared code examples of how to use DHTMLX widgets with React. +DHTMLX Suite widgets are compatible with [**React**](https://react.dev). For more information, refer to the corresponding example on GitHub: [DHTMLX Suite with React Demo](https://github.com/DHTMLX/react-suite-demo). -- To check online samples, please refer to the corresponding [Example on Replit](https://replit.com/@dhtmlx/dhtmlx-suite-with-react). -- To download samples, please check our GitHub repository: [DHTMLX Widgets + React](https://github.com/DHTMLX/react-suite-demo). The README.md file provides all the necessary information on how to run the app in the development mode. +## Create new React project + +:::info +Before you start to create a new project, install [**Vite**](https://vite.dev/) (optional) and [**Node.js**](https://nodejs.org/en/). You can create a basic **React** project or use **React with Vite**. +::: + +Step 1. Create a project and name it as ***my-react-suite-app***: + +~~~bash +npx create-react-app my-react-suite-app +~~~ + +Step 2. Go to the project directory: + +~~~bash +cd my-react-suite-app +~~~ + +Step 3. Install dependencies and start the dev server: + +- if you use [**yarn**](https://yarnpkg.com/), run the following commands: + +~~~bash +yarn +yarn start +~~~ + +- if you use [**npm**](https://www.npmjs.com/), run the following commands: + +~~~bash +npm install +npm run dev +~~~ + +The app should run on a localhost (for instance `http://localhost:3000`). + +## Install Suite sources + +Install the DHTMLX Suite library to get access to Suite widgets. Refer to the following topic for more information: [**Installing DHTMLX Suite via npm or yarn**](../../#installing-trial-dhtmlx-suite-via-npm-or-yarn) + +## Create React component + +Now you can create React components (wrappers) based on Suite widgets. For each complex Suite widget you can create a separate file (for instance [***Grid.jsx***](https://github.com/DHTMLX/react-suite-demo/blob/master/src/Content/LeftPanel/Grid.jsx)) in the [***src/***](https://github.com/DHTMLX/react-suite-demo/blob/master/src) directory. + +### Import source files + +Open the ***Grid.jsx*** file and import the corresponding Suite widget. Note that: + +- if you use PRO version and install the Suite package from a local folder, the import paths look as follows: + +~~~jsx title="Grid.jsx" +import { SuiteWidgetName } from "dhx-suite-package"; // import { Grid, Pagination, ... } from "dhx-suite-package"; +import "dhx-suite-package/codebase/suite.css"; // import Suite styles +~~~ + +Note that depending on the used package, the source files can be minified. In this case, make sure that you import the CSS file as ***suite.min.css***. + +- if you use the trial version of Suite, the import paths look as follows: + +~~~jsx title="Grid.jsx" +import { SuiteWidgetName } from "@dhx/trial-suite"; // import { Grid, Pagination, ... } from "@dhx/trial-suite"; +import "@dhx/trial-suite/codebase/suite.min.css"; // import Suite styles +~~~ + +In this guide you can find basic concepts on how to utilize the **trial** version of Suite widgets. + +### Initialize Suite widget(s) within a container + +To display a Suite widget on a page, you need to create a container and initialize a widget through the corresponding constructor: + +~~~jsx {3,8,12-14,22} title="Grid.jsx" +import { useEffect, useRef } from "react"; +// import a Suite widget +import { Grid } from "@dhx/trial-suite"; +// import Suite styles +import "@dhx/trial-suite/codebase/suite.min.css"; +// create and export the React component +export default function GridComponent() { + let grid_container = useRef(); // initialize container for a Suite widget + + useEffect(() => { + // initialize a Suite widget + const grid_widget = new Grid(grid_container.current, { + // configuration properties here + }); + + return () => { + grid_widget.destructor(); // destruct a Suite widget + }; + }, []); + + return
+
+
+} +~~~ + +### Load data + +To add data into a Suite widget, you need to provide a data set. You can create the [***data.js***](https://github.com/DHTMLX/react-suite-demo/blob/master/src/data.js) file in the ***src/*** directory and add required data sets: + +~~~jsx {2,27,29} title="data.js" +export function getData() { + const gridData = [ + { + time: new Date("Jan 28, 2021"), + nights: 7, + price: 68, + contactPerson: "Yoshio Slater", + contactEmail: "phasellus.fermentum@yahoo.net" + }, + { + time: new Date("Apr 13, 2021") + nights: 6, + price: 66, + contactPerson: "Christopher Kirk", + contactEmail: "posuere.vulputate.lacus@outlook.org" + }, + { + time: new Date("Jan 31, 2021"), + nights: 15, + price: 64, + contactPerson: "Jana Meyers", + contactEmail: "mollis@aol.edu" + }, + // other data items + ]; + + const sidebarData = [ /* ... */ ]; + + return { gridData, sidebarData }; +} +~~~ + +#### Specify data through the property + +To load predefined data into a Suite widget, you need to perform the following steps: + +1. Import predefined data +2. Initialize the required data set +3. Set the `data` property to the predefined data set within the Suite widget constructor + +~~~jsx {5,8,14} title="Grid.jsx" +import { useEffect, useRef } from "react"; +import { Grid } from "@dhx/trial-suite"; +import "@dhx/trial-suite/codebase/suite.min.css"; + +import { getData } from "../../data"; // 1. import predefined data + +export default function Grid() { + const { gridData } = getData(); // 2. initialize the required data set + let grid_container = useRef(); + + useEffect(() => { + // initialize a Suite widget with data + const grid_widget = new Grid(grid_container.current, { + data: gridData, // 3. set the `data` property to the predefined data set + // other configuration properties + }); + + return () => { + grid_widget.destructor(); + }; + }, [gridData]); + + return
+
+
+} +~~~ + +:::tip +For more information, refer to the **Data loading** section of the corresponding control: [Tree](tree/loading_data.md), [Toolbar](toolbar/load_data.md), [Sidebar](sidebar/data_loading.md), [Ribbon](ribbon/data_loading.md), [Menu](menu/data_loading.md), [List](list/load_data.md), [Grid](grid/data_loading.md), [DataView](dataview/data_loading.md), [Combobox](combobox/adding_options.md), [Chart](chart/data_loading.md), etc. +::: + +#### Specify data through the method + +To load predefined data into a Suite widget, you can also call the `parse()` method: + +~~~jsx {5,8,17} title="Grid.jsx" +import { useEffect, useRef } from "react"; +import { Grid } from "@dhx/trial-suite"; +import "@dhx/trial-suite/codebase/suite.min.css"; + +import { getData } from "../../data"; // 1. import predefined data + +export default function Grid() { + const { gridData } = getData(); // 2. initialize the required data set + let grid_container = useRef(); + + useEffect(() => { + // initialize a Suite widget without data + const grid_widget = new Grid(grid_container.current, { + // configuration properties here + }); + + grid_widget.data.parse(gridData); // 3. call the parse() method and pass data as a parameter + + return () => { + grid_widget.destructor(); + }; + }, []); + + return
+
+
+} +~~~ + +### Handle events + +When a user performs some action in a Suite widget, an event is fired. You can use this event to detect an action and run the required code. + +~~~jsx {6-8} title="Grid.jsx" +// ... + +useEffect(() => { + const grid_widget = new Grid(grid_container.current, {}); + + grid_widget.events.on("scroll", function({top,left}){ + console.log("The grid is scrolled to "+top,left); + }); + + //... +}, []); + +// ... +~~~ + +Now you know how to integrate and configure any Suite widget with React. You can customize the code according to your specific requirements. The extended example you can find on [**GitHub**](https://github.com/DHTMLX/react-suite-demo). diff --git a/docs/integration/suite_and_svelte.md b/docs/integration/suite_and_svelte.md index e8fb44c71..b45ff6498 100644 --- a/docs/integration/suite_and_svelte.md +++ b/docs/integration/suite_and_svelte.md @@ -1,14 +1,257 @@ --- -sidebar_label: Code examples with Svelte -title: Code examples of DHTMLX Widgets with Svelte -description: You can explore how to use DHTMLX Widgets with Svelte. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +sidebar_label: Integration with Svelte +title: Integration DHTML Suite with Svelte +description: You can explore how to use DHTMLX Suite Widgets with Svelte. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- -# Code examples of how to use widgets with Svelte +# Integration Suite widgets with Svelte -![](../assets/integration/work_with_frameworks.png) +:::tip +You should be familiar with the basic concepts and patterns of **Svelte** before reading this documentation. To refresh your knowledge, please refer to the [**Svelte documentation**](https://svelte.dev/). +::: -DHTMLX Suite is compatible with Svelte. We have prepared code examples of how to use DHTMLX widgets with Svelte. +DHTMLX Suite is compatible with **Svelte**. For more information, refer to the corresponding example on GitHub: [DHTMLX Suite with Svelte Demo](https://github.com/DHTMLX/svelte-suite-demo). -- To check online samples, please refer to the corresponding [Example on Replit](https://replit.com/@dhtmlx/dhtmlx-suite-with-svelte). -- To download samples, please check our GitHub repository: [DHTMLX Widgets + Svelte](https://github.com/DHTMLX/svelte-suite-demo). The README.md file provides all the necessary information on how to run the app in the development mode. \ No newline at end of file +## Create new Svelte project + +:::info +Before you start to create a new project, install [**Vite**](https://vite.dev/) (optional) and [**Node.js**](https://nodejs.org/en/). +::: + +Step 1. Create a project and name it as ***my-svelte-suite-app***: + +There are several ways on how to create a **Svelte** project: + +- you can use the [**SvelteKit**](https://kit.svelte.dev/) + +or + +- you can also use **Svelte with Vite** (but without SvelteKit): + +~~~json +npm create vite@latest +~~~ + +Check the details in the [related article](https://svelte.dev/docs/introduction#start-a-new-project-alternatives-to-sveltekit). + +Step 2. Go to the project directory: + +~~~bash +cd my-svelte-suite-app +~~~ + +Step 3. Install dependencies and start the dev server: + +- if you use [**yarn**](https://yarnpkg.com/), run the following commands: + +~~~bash +yarn +yarn start +~~~ + +- if you use [**npm**](https://www.npmjs.com/), run the following commands: + +~~~json +npm install +npm run dev +~~~ + +The app should run on a localhost (for instance `http://localhost:3000`). + +## Install Suite sources + +Install the DHTMLX Suite library to get access to Suite widgets. Refer to the following topic for more information: [**Installing DHTMLX Suite via npm or yarn**](../../#installing-trial-dhtmlx-suite-via-npm-or-yarn) + +## Create Svelte component + +Now you can create Svelte components (wrappers) based on Suite widgets. For each complex Suite widget you can create a separate file (for instance [***Grid.svelte***](https://github.com/DHTMLX/svelte-suite-demo/blob/main/src/Content/LeftPanel/Grid.svelte)) in the [***src/***](https://github.com/DHTMLX/svelte-suite-demo/tree/main/src) directory. + +### Import source files + +Open the ***Grid.svelte*** file and import the corresponding Suite widget. Note that: + +- if you use PRO version and install the Suite package from a local folder, the import paths look as follows: + +~~~jsx title="Grid.svelte" +import { SuiteWidgetName } from "dhx-suite-package"; // import { Grid, Pagination, ... } from "dhx-suite-package"; +import "dhx-suite-package/codebase/suite.css"; // import Suite styles +~~~ + +Note that depending on the used package, the source files can be minified. In this case, make sure that you import the CSS file as ***suite.min.css***. + +- if you use the trial version of Suite, the import paths look as follows: + +~~~jsx title="Grid.svelte" +import { SuiteWidgetName } from "@dhx/trial-suite"; // import { Grid, Pagination, ... } from "@dhx/trial-suite"; +import "@dhx/trial-suite/codebase/suite.min.css"; // import Suite styles +~~~ + +In this guide you can find basic concepts on how to utilize the **trial** version of Suite widgets. + +### Initialize Suite widget(s) within a container + +To display a Suite widget on a page, you need to create a container and initialize a widget through the corresponding constructor: + +~~~html {4,8-9,13-15,24} title="Grid.svelte" + + +
+
+
+~~~ + +### Load data + +To add data into a Suite widget, you need to provide a data set. You can create the [***data.js***](https://github.com/DHTMLX/svelte-suite-demo/blob/main/src/data.js) file in the ***src/*** directory and add required data sets: + +~~~jsx {2,27,29} title="data.js" +export function getData() { + const gridData = [ + { + time: new Date("Jan 28, 2021"), + nights: 7, + price: 68, + contactPerson: "Yoshio Slater", + contactEmail: "phasellus.fermentum@yahoo.net" + }, + { + time: new Date("Apr 13, 2021") + nights: 6, + price: 66, + contactPerson: "Christopher Kirk", + contactEmail: "posuere.vulputate.lacus@outlook.org" + }, + { + time: new Date("Jan 31, 2021"), + nights: 15, + price: 64, + contactPerson: "Jana Meyers", + contactEmail: "mollis@aol.edu" + }, + // other data items + ]; + + const sidebarData = [ /* ... */ ]; + + return { gridData, sidebarData }; +} +~~~ + +#### Specify data through the property + +To load predefined data into a Suite widget, you need to perform the following steps: + +1. Import predefined data +2. Initialize the required data set +3. Set the `data` property to the predefined data set within the Suite widget constructor + +~~~html {6,8,16} title="Grid.svelte" + + +
+
+
+~~~ + +:::tip +For more information, refer to the **Data loading** section of the corresponding control: [Tree](tree/loading_data.md), [Toolbar](toolbar/load_data.md), [Sidebar](sidebar/data_loading.md), [Ribbon](ribbon/data_loading.md), [Menu](menu/data_loading.md), [List](list/load_data.md), [Grid](grid/data_loading.md), [DataView](dataview/data_loading.md), [Combobox](combobox/adding_options.md), [Chart](chart/data_loading.md), etc. +::: + +#### Specify data through the method + +To load predefined data into a Suite widget, you can also call the `parse()` method: + +~~~html {6,8,19} title="Grid.svelte" + + +
+
+
+~~~ + +### Handle events + +When a user performs some action in a Suite widget, an event is fired. You can use this event to detect an action and run the required code. + +~~~jsx {6-8} title="Grid.svelte" +// ... + +onMount(() => { + grid_widget = new Grid(grid_container, {}); + + grid_widget.events.on("scroll", function({top,left}){ + console.log("The grid is scrolled to "+top,left); + }); +}); + +// ... +~~~ + +Now you know how to integrate and configure any Suite widget with Svelte. You can customize the code according to your specific requirements. The extended example you can find on [**GitHub**](https://github.com/DHTMLX/svelte-suite-demo). diff --git a/docs/integration/suite_and_vue.md b/docs/integration/suite_and_vue.md index ccce2f275..b6006945a 100644 --- a/docs/integration/suite_and_vue.md +++ b/docs/integration/suite_and_vue.md @@ -1,14 +1,259 @@ --- -sidebar_label: Code examples with Vue -title: Code examples of DHTMLX Widgets with Vue.js -description: You can explore how to use DHTMLX Widgets with Vue.js. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. +sidebar_label: Integration with Vue +title: Integration DHTML Suite with Vue +description: You can explore how to use DHTMLX Suite Widgets with Vue.js. Browse developer guides and API reference, try out code examples and live demos, and download a free 30-day evaluation version of DHTMLX Suite. --- -# Code examples of how to use widgets with Vue.js +# Integration Suite widgets with Vue -![](../assets/integration/work_with_frameworks.png) +:::tip +You should be familiar with the basic concepts and patterns of [**Vue**](https://vuejs.org/) before reading this documentation. To refresh your knowledge, please refer to the [**Vue 3 documentation**](https://vuejs.org/guide/introduction.html#getting-started). +::: -DHTMLX Suite is compatible with Vue.js. We have prepared code examples of how to use DHTMLX widgets with Vue.js. +DHTMLX Suite is compatible with [**Vue**](https://vuejs.org/). For more information, refer to the corresponding example on GitHub: [DHTMLX Suite with Vue Demo](https://github.com/DHTMLX/vue-suite-demo). -- To check online samples, please refer to the corresponding [Example on Replit](https://replit.com/@dhtmlx/dhtmlx-suite-with-vue3). -- To download samples, please check our GitHub repository: [DHTMLX Widgets + Vue.js](https://github.com/DHTMLX/vue-suite-demo). The README.md file provides all the necessary information on how to run the app in the development mode. +## Create new Vue project + +:::info +Before you start to create a new project, install [**Node.js**](https://nodejs.org/en/). +::: + +Step 1. Create a project and name it as ***my-vue-suite-app***: + +~~~bash +npm create vue@latest +~~~ + +This command installs and executes `create-vue`, the official **Vue** project scaffolding tool. Check the details in the [Vue.js Quick Start](https://vuejs.org/guide/quick-start.html#creating-a-vue-application). + +Step 2. Go to the project directory: + +~~~bash +cd my-vue-suite-app +~~~ + +Step 3. Install dependencies and start the dev server: + +- if you use [**yarn**](https://yarnpkg.com/), run the following commands: + +~~~bash +yarn +yarn start // or yarn dev +~~~ + +- if you use [**npm**](https://www.npmjs.com/), run the following commands: + +~~~bash +npm install +npm run dev +~~~ + +The app should run on a localhost (for instance `http://localhost:3000`). + +## Install Suite sources + +Install the DHTMLX Suite library to get access to Suite widgets. Refer to the following topic for more information: [**Installing DHTMLX Suite via npm or yarn**](../../#installing-trial-dhtmlx-suite-via-npm-or-yarn) + +## Create Vue component + +Now you can create Vue components (wrappers) based on Suite widgets. For each complex Suite widget you can create a separate file (for instance [***Grid.vue***](https://github.com/DHTMLX/vue-suite-demo/blob/master/src/components/Content/LeftPanel/Grid.vue)) in the [***src/***](https://github.com/DHTMLX/vue-suite-demo/tree/master/src) directory. + +### Import source files + +Open the ***Grid.vue*** file and import Suite source files. Note that: + +- if you use PRO version and install the Suite package from a local folder, the import paths look as follows: + +~~~html title="Grid.vue" + +~~~ + +Note that depending on the used package, the source files can be minified. In this case, make sure that you import the CSS file as ***suite.min.css***. + +- if you use the trial version of Suite, the import paths look as follows: + +~~~html title="Grid.vue" + +~~~ + +In this guide you can find basic concepts on how to utilize the **trial** version of Suite widgets. + +### Initialize Suite widget(s) within a container + +To display a Suite widget on a page, you need to create a container and initialize a widget through the corresponding constructor: + +~~~html {3,10-12,23} title="Grid.vue" + + + +~~~ + +### Load data + +To add data into a Suite widget, you need to provide a data set. You can create the [***data.js***](https://github.com/DHTMLX/vue-suite-demo/blob/master/src/store.js) file in the ***src/*** directory and add required data sets: + +~~~jsx {2,27,29} title="data.js" +export function getData() { + const gridData = [ + { + time: new Date("Jan 28, 2021"), + nights: 7, + price: 68, + contactPerson: "Yoshio Slater", + contactEmail: "phasellus.fermentum@yahoo.net" + }, + { + time: new Date("Apr 13, 2021") + nights: 6, + price: 66, + contactPerson: "Christopher Kirk", + contactEmail: "posuere.vulputate.lacus@outlook.org" + }, + { + time: new Date("Jan 31, 2021"), + nights: 15, + price: 64, + contactPerson: "Jana Meyers", + contactEmail: "mollis@aol.edu" + }, + // other data items + ]; + + const sidebarData = [ /* ... */ ]; + + return { gridData, sidebarData }; +} +~~~ + +#### Specify data through the property + +To load predefined data into a Suite widget, you need to perform the following steps: + +1. Import predefined data +2. Initialize the required data set +3. Set the `data` property to the predefined data set within the Suite widget constructor + +~~~html {5,8-11,16} title="Grid.vue" + + + +~~~ + +:::tip +For more information, refer to the **Data loading** section of the corresponding control: [Tree](tree/loading_data.md), [Toolbar](toolbar/load_data.md), [Sidebar](sidebar/data_loading.md), [Ribbon](ribbon/data_loading.md), [Menu](menu/data_loading.md), [List](list/load_data.md), [Grid](grid/data_loading.md), [DataView](dataview/data_loading.md), [Combobox](combobox/adding_options.md), [Chart](chart/data_loading.md), etc. +::: + +#### Specify data through the method + +To load predefined data into a Suite widget, you can also call the `parse()` method: + +~~~html {5,8-11,19} title="Grid.vue" + + + +~~~ + +### Handle events + +When a user performs some action in a Suite widget, an event is fired. You can use this event to detect an action and run the required code. + +~~~jsx {6-8} title="Grid.vue" +// ... + +mounted() { + this.grid_widget = new Grid(this.$refs.grid_container, {}); + + this.grid_widget..events.on("scroll", function({top,left}){ + console.log("The grid is scrolled to "+top,left); + }); +} + +// ... +~~~ + +Now you know how to integrate and configure any Suite widget with Vue. You can customize the code according to your specific requirements. The extended example you can find on [**GitHub**](https://github.com/DHTMLX/vue-suite-demo). From fd245e1cca443ee6399d13aeb4d1beb5eca0fffe Mon Sep 17 00:00:00 2001 From: Serhii Pylypchuk Date: Mon, 14 Jul 2025 22:47:01 +0400 Subject: [PATCH 45/47] Add integration section to the Overview page --- docs/index.md | 23 +- package-lock.json | 12034 -------------------------------------------- 2 files changed, 21 insertions(+), 12036 deletions(-) delete mode 100644 package-lock.json diff --git a/docs/index.md b/docs/index.md index 4cacba0ab..ee7a2f710 100644 --- a/docs/index.md +++ b/docs/index.md @@ -62,10 +62,29 @@ A gallery of live demos provides real-life examples of using DHTMLX widgets in w A [set of CSS templates](https://dhtmlx.com/docs/products/dhtmlxSuite/how-to-create-javascript-applications/) is specially designed for various use cases that can be implemented using DHTMLX widgets. You can borrow the CSS code and apply the styles you like in your web app. -### Integration with Angular, React, and Vue.js +### Integration with frameworks + [comment]: # (ссылки ниже должны уводить на страницы доки) -DHTMLX Suite is compatible with any client-side framework. There are code examples of how to use DHTMLX widgets with [Angular](integration/suite_and_angular.md), [React](integration/suite_and_react.md), and [Vue.js](integration/suite_and_vue.md) available on our GitHub pages. +DHTMLX Suite is compatible with client-side frameworks. Refer to the following guides for more information on how to use DHTMLX Suite widgets with frameworks: +- [Integration with React](integration/suite_and_react.md) +- [Integration with Angular](integration/suite_and_angular.md) +- [Integration with Vue](integration/suite_and_vue.md) +- [Integration with Svelte](integration/suite_and_svelte.md) + +You can import DHTMLX Suite into your project using `yarn` or `npm` package manager. + +#### Installing trial DHTMLX Suite via npm or yarn + +:::info +If you want to use trial version of Suite, download the [**trial Suite package**](https://dhtmlx.com/docs/products/dhtmlxSuite/download.shtml) and follow steps mentioned in the *README* file. Note that trial Suite is available 30 days only. +::: + +#### Installing PRO DHTMLX Suite via npm or yarn + +:::info +You can access the DHTMLX private **npm** directly in the [Client's Area](https://dhtmlx.com/clients/) by generating your login and password for **npm**. A detailed installation guide is also available there. Please note that access to the private **npm** is available only while your proprietary Suite license is active. +::: ### Integration with any backend technologies Being a fully client-side library, DHTMLX Suite can be used with any backend. There is an example of integrating [DHTMLX Suite widgets with Node.js](https://github.com/DHTMLX/nodejs-suite-demo) in our GitHub repository. diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 94724b870..000000000 --- a/package-lock.json +++ /dev/null @@ -1,12034 +0,0 @@ -{ - "name": "doc", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz", - "integrity": "sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw==", - "requires": { - "@algolia/autocomplete-shared": "1.2.2" - } - }, - "@algolia/autocomplete-preset-algolia": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz", - "integrity": "sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q==", - "requires": { - "@algolia/autocomplete-shared": "1.2.2" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz", - "integrity": "sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw==" - }, - "@algolia/cache-browser-local-storage": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.5.tgz", - "integrity": "sha512-cfX2rEKOtuuljcGI5DMDHClwZHdDqd2nT2Ohsc8aHtBiz6bUxKVyIqxr2gaC6tU8AgPtrTVBzcxCA+UavXpKww==", - "requires": { - "@algolia/cache-common": "4.10.5" - } - }, - "@algolia/cache-common": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.5.tgz", - "integrity": "sha512-1mClwdmTHll+OnHkG+yeRoFM17kSxDs4qXkjf6rNZhoZGXDvfYLy3YcZ1FX4Kyz0DJv8aroq5RYGBDsWkHj6Tw==" - }, - "@algolia/cache-in-memory": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.5.tgz", - "integrity": "sha512-+ciQnfIGi5wjMk02XhEY8fmy2pzy+oY1nIIfu8LBOglaSipCRAtjk6WhHc7/KIbXPiYzIwuDbM2K1+YOwSGjwA==", - "requires": { - "@algolia/cache-common": "4.10.5" - } - }, - "@algolia/client-account": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.5.tgz", - "integrity": "sha512-I9UkSS2glXm7RBZYZIALjBMmXSQbw/fI/djPcBHxiwXIheNIlqIFl2SNPkvihpPF979BSkzjqdJNRPhE1vku3Q==", - "requires": { - "@algolia/client-common": "4.10.5", - "@algolia/client-search": "4.10.5", - "@algolia/transporter": "4.10.5" - } - }, - "@algolia/client-analytics": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.5.tgz", - "integrity": "sha512-h2owwJSkovPxzc+xIsjY1pMl0gj+jdVwP9rcnGjlaTY2fqHbSLrR9yvGyyr6305LvTppxsQnfAbRdE/5Z3eFxw==", - "requires": { - "@algolia/client-common": "4.10.5", - "@algolia/client-search": "4.10.5", - "@algolia/requester-common": "4.10.5", - "@algolia/transporter": "4.10.5" - } - }, - "@algolia/client-common": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.5.tgz", - "integrity": "sha512-21FAvIai5qm8DVmZHm2Gp4LssQ/a0nWwMchAx+1hIRj1TX7OcdW6oZDPyZ8asQdvTtK7rStQrRnD8a95SCUnzA==", - "requires": { - "@algolia/requester-common": "4.10.5", - "@algolia/transporter": "4.10.5" - } - }, - "@algolia/client-personalization": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.5.tgz", - "integrity": "sha512-nH+IyFKBi8tCyzGOanJTbXC5t4dspSovX3+ABfmwKWUYllYzmiQNFUadpb3qo+MLA3jFx5IwBesjneN6dD5o3w==", - "requires": { - "@algolia/client-common": "4.10.5", - "@algolia/requester-common": "4.10.5", - "@algolia/transporter": "4.10.5" - } - }, - "@algolia/client-search": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.5.tgz", - "integrity": "sha512-1eQFMz9uodrc5OM+9HeT+hHcfR1E1AsgFWXwyJ9Q3xejA2c1c4eObGgOgC9ZoshuHHdptaTN1m3rexqAxXRDBg==", - "requires": { - "@algolia/client-common": "4.10.5", - "@algolia/requester-common": "4.10.5", - "@algolia/transporter": "4.10.5" - } - }, - "@algolia/logger-common": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.5.tgz", - "integrity": "sha512-gRJo9zt1UYP4k3woEmZm4iuEBIQd/FrArIsjzsL/b+ihNoOqIxZKTSuGFU4UUZOEhvmxDReiA4gzvQXG+TMTmA==" - }, - "@algolia/logger-console": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.5.tgz", - "integrity": "sha512-4WfIbn4253EDU12u9UiYvz+QTvAXDv39mKNg9xSoMCjKE5szcQxfcSczw2byc6pYhahOJ9PmxPBfs1doqsdTKQ==", - "requires": { - "@algolia/logger-common": "4.10.5" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.5.tgz", - "integrity": "sha512-53/MURQEqtK+bGdfq4ITSPwTh5hnADU99qzvpAINGQveUFNSFGERipJxHjTJjIrjFz3vxj5kKwjtxDnU6ygO9g==", - "requires": { - "@algolia/requester-common": "4.10.5" - } - }, - "@algolia/requester-common": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.5.tgz", - "integrity": "sha512-UkVa1Oyuj6NPiAEt5ZvrbVopEv1m/mKqjs40KLB+dvfZnNcj+9Fry4Oxnt15HMy/HLORXsx4UwcthAvBuOXE9Q==" - }, - "@algolia/requester-node-http": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.5.tgz", - "integrity": "sha512-aNEKVKXL4fiiC+bS7yJwAHdxln81ieBwY3tsMCtM4zF9f5KwCzY2OtN4WKEZa5AAADVcghSAUdyjs4AcGUlO5w==", - "requires": { - "@algolia/requester-common": "4.10.5" - } - }, - "@algolia/transporter": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.5.tgz", - "integrity": "sha512-F8DLkmIlvCoMwSCZA3FKHtmdjH3o5clbt0pi2ktFStVNpC6ZDmY307HcK619bKP5xW6h8sVJhcvrLB775D2cyA==", - "requires": { - "@algolia/cache-common": "4.10.5", - "@algolia/logger-common": "4.10.5", - "@algolia/requester-common": "4.10.5" - } - }, - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" - }, - "@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", - "requires": { - "@babel/types": "^7.15.4", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", - "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", - "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", - "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", - "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", - "requires": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", - "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", - "requires": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", - "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-wrap-function": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", - "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" - }, - "@babel/helper-wrap-function": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", - "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", - "requires": { - "@babel/helper-function-name": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", - "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==" - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", - "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", - "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.15.4", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", - "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", - "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", - "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", - "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", - "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", - "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", - "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", - "requires": { - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.15.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", - "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", - "requires": { - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", - "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", - "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", - "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.15.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", - "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", - "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.9" - }, - "dependencies": { - "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - } - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.14.5" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz", - "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz", - "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/preset-env": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.4.tgz", - "integrity": "sha512-4f2nLw+q6ht8gl3sHCmNhmA5W6b1ItLzbH3UrKuJxACHr2eCpk96jwjrAfCAaXaaVwTQGnyUYHY2EWXJGt7TUQ==", - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", - "@babel/plugin-proposal-async-generator-functions": "^7.15.4", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.15.4", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.15.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.15.3", - "@babel/plugin-transform-classes": "^7.15.4", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.15.4", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.15.4", - "@babel/plugin-transform-modules-systemjs": "^7.15.4", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.15.4", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.15.4", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.16.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" - } - }, - "@babel/preset-typescript": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", - "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.15.0" - } - }, - "@babel/runtime": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", - "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", - "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", - "requires": { - "core-js-pure": "^3.16.0", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.9", - "to-fast-properties": "^2.0.0" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", - "dev": true - }, - "@docsearch/css": { - "version": "3.0.0-alpha.40", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.40.tgz", - "integrity": "sha512-PrOTPgJMl+Iji1zOH0+J0PEDMriJ1teGxbgll7o4h8JrvJW6sJGqQw7/bLW7enWiFaxbJMK76w1yyPNLFHV7Qg==" - }, - "@docsearch/react": { - "version": "3.0.0-alpha.40", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.40.tgz", - "integrity": "sha512-aKxnu7sgpP1R7jtgOV/pZdJEHXx6Ts+jnS9U/ejSUS2BMUpwQI5SA3oLs1BA5TA9kIViJ5E+rrjh0VsbcsJ6sQ==", - "requires": { - "@algolia/autocomplete-core": "1.2.2", - "@algolia/autocomplete-preset-algolia": "1.2.2", - "@docsearch/css": "3.0.0-alpha.40", - "algoliasearch": "^4.0.0" - } - }, - "@docusaurus/core": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-0.0.0-3991.tgz", - "integrity": "sha512-qSiSRjEX0UjdZe/9OxC6V/8TwD8auTXHImuDW5mfdWZ2A5wN1uaIpmB5GNK2o/LzYQggiwxPosepOsbTcyIOLw==", - "requires": { - "@babel/core": "^7.12.16", - "@babel/generator": "^7.12.15", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.12.15", - "@babel/preset-env": "^7.12.16", - "@babel/preset-react": "^7.12.13", - "@babel/preset-typescript": "^7.12.16", - "@babel/runtime": "^7.12.5", - "@babel/runtime-corejs3": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@docusaurus/cssnano-preset": "0.0.0-3991", - "@docusaurus/react-loadable": "5.5.0", - "@docusaurus/types": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@docusaurus/utils-common": "0.0.0-3991", - "@docusaurus/utils-validation": "0.0.0-3991", - "@slorber/static-site-generator-webpack-plugin": "^4.0.0", - "@svgr/webpack": "^5.5.0", - "autoprefixer": "^10.2.5", - "babel-loader": "^8.2.2", - "babel-plugin-dynamic-import-node": "2.3.0", - "boxen": "^5.0.1", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "clean-css": "^5.1.5", - "commander": "^5.1.0", - "copy-webpack-plugin": "^9.0.0", - "core-js": "^3.9.1", - "css-loader": "^5.1.1", - "css-minimizer-webpack-plugin": "^3.0.1", - "cssnano": "^5.0.4", - "del": "^6.0.0", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^1.12.1", - "express": "^4.17.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "github-slugger": "^1.3.0", - "globby": "^11.0.2", - "html-minifier-terser": "^5.1.1", - "html-tags": "^3.1.0", - "html-webpack-plugin": "^5.3.2", - "import-fresh": "^3.3.0", - "is-root": "^2.1.0", - "leven": "^3.1.0", - "lodash": "^4.17.20", - "mini-css-extract-plugin": "^1.6.0", - "module-alias": "^2.2.2", - "nprogress": "^0.2.0", - "postcss": "^8.2.15", - "postcss-loader": "^5.3.0", - "prompts": "^2.4.1", - "react-dev-utils": "^11.0.1", - "react-error-overlay": "^6.0.9", - "react-helmet": "^6.1.0", - "react-loadable": "^5.5.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.2.0", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.2.0", - "remark-admonitions": "^1.2.1", - "resolve-pathname": "^3.0.0", - "rtl-detect": "^1.0.3", - "semver": "^7.3.4", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.4", - "std-env": "^2.2.1", - "strip-ansi": "^6.0.0", - "terser-webpack-plugin": "^5.1.3", - "tslib": "^2.2.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^5.3.0", - "webpack": "^5.40.0", - "webpack-bundle-analyzer": "^4.4.2", - "webpack-dev-server": "^3.11.2", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.0-3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "@docusaurus/cssnano-preset": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-0.0.0-3991.tgz", - "integrity": "sha512-n96onhgUObEzbTEjg6tpF8Xab+pJ6pqsKnSmhQIz/I4ZrSsGBgg/c6FVxiBDEgDqxuq77++1S269+qW8im9P8Q==", - "requires": { - "cssnano-preset-advanced": "^5.1.1", - "postcss": "^8.2.15", - "postcss-sort-media-queries": "^3.10.11" - } - }, - "@docusaurus/mdx-loader": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-0.0.0-3991.tgz", - "integrity": "sha512-jDTm6972PZ/KpLBM+eJ7M/ooX7R1SEWPJ68lciAAPnY+GQeIUS5PMzLafK/LaBd7OeYpPhytJNgO1h/RpovQmA==", - "requires": { - "@babel/parser": "^7.12.16", - "@babel/traverse": "^7.12.13", - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@mdx-js/mdx": "^1.6.21", - "@mdx-js/react": "^1.6.21", - "chalk": "^4.1.1", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "github-slugger": "^1.3.0", - "gray-matter": "^4.0.3", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.1.0", - "stringify-object": "^3.3.0", - "unist-util-visit": "^2.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.40.0" - }, - "dependencies": { - "@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==" - } - } - }, - "@docusaurus/plugin-content-blog": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-0.0.0-3991.tgz", - "integrity": "sha512-63WFz6Wa8JfpSvukB3IVjFSfn3Ao5EBlksFcRHzVsMxmyEf4cqtOobNL23qOpOICdmEezYbchGc6ekhknCb0SQ==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/mdx-loader": "0.0.0-3991", - "@docusaurus/types": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@docusaurus/utils-validation": "0.0.0-3991", - "chalk": "^4.1.1", - "escape-string-regexp": "^4.0.0", - "feed": "^4.2.2", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "js-yaml": "^4.0.0", - "loader-utils": "^2.0.0", - "lodash": "^4.17.20", - "reading-time": "^1.3.0", - "remark-admonitions": "^1.2.1", - "tslib": "^2.2.0", - "webpack": "^5.40.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "@docusaurus/plugin-content-docs": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-0.0.0-3991.tgz", - "integrity": "sha512-jEu5dg5sprtSJDRm9+L2wycrD3jrlKlsqJ2axqzcLtabG2e8VaCpW3smDU9ZR30OM8eMGKu1j5rfolZ+EqmCMg==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/mdx-loader": "0.0.0-3991", - "@docusaurus/types": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@docusaurus/utils-validation": "0.0.0-3991", - "chalk": "^4.1.1", - "combine-promises": "^1.1.0", - "escape-string-regexp": "^4.0.0", - "execa": "^5.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "import-fresh": "^3.2.2", - "js-yaml": "^4.0.0", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "remark-admonitions": "^1.2.1", - "shelljs": "^0.8.4", - "tslib": "^2.2.0", - "utility-types": "^3.10.0", - "webpack": "^5.40.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "@docusaurus/plugin-content-pages": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-0.0.0-3991.tgz", - "integrity": "sha512-mRimm5jt1UIpgv5B2HDrrOAIxrAV+3uavGRqRtRmtQtHV0+2tA7B65GMVDO/ijnA+b7ZLupNiEgOPyPdZf2JRw==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/mdx-loader": "0.0.0-3991", - "@docusaurus/types": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@docusaurus/utils-validation": "0.0.0-3991", - "globby": "^11.0.2", - "lodash": "^4.17.20", - "remark-admonitions": "^1.2.1", - "tslib": "^2.1.0", - "webpack": "^5.40.0" - } - }, - "@docusaurus/plugin-debug": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-0.0.0-3991.tgz", - "integrity": "sha512-RPFveH9eInAGG7TQR0QbZYrp9+dcpTTRRRv4LKfU4hNmGZ3GUXb0KdmprPIcJoyYIvIUtiD9GL1MmVY5R4Kuug==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/types": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "fs-extra": "^9.1.0", - "react-json-view": "^1.21.3", - "tslib": "^2.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@docusaurus/plugin-google-analytics": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-0.0.0-3991.tgz", - "integrity": "sha512-GEjw/9lDV4K8pRTiHL5Pj7rhgtZYeDIaVZxvTeqDdfwpFOBU6gMiKfA5CSpIdq7klT2Xmeh36HmlViWlOFD9Ug==", - "requires": { - "@docusaurus/core": "0.0.0-3991" - } - }, - "@docusaurus/plugin-google-gtag": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-0.0.0-3991.tgz", - "integrity": "sha512-IRiNkYBN1pEToqr6DcIeaaBWamDlY3QZAaWSsH+0zwDef00hZzH70yJ6P4UfFojIhPzyNUm7YHoOZeskEmZ4vw==", - "requires": { - "@docusaurus/core": "0.0.0-3991" - } - }, - "@docusaurus/plugin-sitemap": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-0.0.0-3991.tgz", - "integrity": "sha512-NgJifW5s4v5ibDXrPIHl4wGjmgzfM5uyiljKeePhfjejzC5rmnxEPKTyZNFP/vqevZhiR2gjqQwIeInCK9KJeg==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/types": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@docusaurus/utils-common": "0.0.0-3991", - "@docusaurus/utils-validation": "0.0.0-3991", - "fs-extra": "^10.0.0", - "sitemap": "^7.0.0", - "tslib": "^2.2.0" - } - }, - "@docusaurus/preset-classic": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-0.0.0-3991.tgz", - "integrity": "sha512-QL66qgktxOhV5Q/r4YqHpB6lMEFTjE/oLr0PcwX9YZnrNY5rg2J+F+O88MBSGDClg19eUtLXkwtkSvDx/Rbcgw==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/plugin-content-blog": "0.0.0-3991", - "@docusaurus/plugin-content-docs": "0.0.0-3991", - "@docusaurus/plugin-content-pages": "0.0.0-3991", - "@docusaurus/plugin-debug": "0.0.0-3991", - "@docusaurus/plugin-google-analytics": "0.0.0-3991", - "@docusaurus/plugin-google-gtag": "0.0.0-3991", - "@docusaurus/plugin-sitemap": "0.0.0-3991", - "@docusaurus/theme-classic": "0.0.0-3991", - "@docusaurus/theme-search-algolia": "0.0.0-3991" - } - }, - "@docusaurus/react-loadable": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", - "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", - "requires": { - "prop-types": "^15.6.2" - } - }, - "@docusaurus/theme-classic": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-0.0.0-3991.tgz", - "integrity": "sha512-mim7HPL+03qGIosvDNatw0zfmr+rsgKA8ia/u3FB5qtX4Wa7FHhx1FTryJH9iS+93iVnAtBfIzDdc4fcNWIlgA==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/plugin-content-blog": "0.0.0-3991", - "@docusaurus/plugin-content-docs": "0.0.0-3991", - "@docusaurus/plugin-content-pages": "0.0.0-3991", - "@docusaurus/theme-common": "0.0.0-3991", - "@docusaurus/types": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@docusaurus/utils-common": "0.0.0-3991", - "@docusaurus/utils-validation": "0.0.0-3991", - "@mdx-js/mdx": "^1.6.21", - "@mdx-js/react": "^1.6.21", - "chalk": "^4.1.1", - "clsx": "^1.1.1", - "copy-text-to-clipboard": "^3.0.1", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "infima": "0.2.0-alpha.33", - "lodash": "^4.17.20", - "parse-numeric-range": "^1.2.0", - "postcss": "^8.2.15", - "prism-react-renderer": "^1.2.1", - "prismjs": "^1.23.0", - "prop-types": "^15.7.2", - "react-router-dom": "^5.2.0", - "rtlcss": "^3.1.2" - }, - "dependencies": { - "@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==" - }, - "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" - } - } - }, - "@docusaurus/theme-common": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-0.0.0-3991.tgz", - "integrity": "sha512-mGdp+nuXELGBfOKl7gTRo7cy3jgmM/Yv7acyh44VlV/qCjmIgQzE/DRsgH9qZuzGU93rw0V62B96YooBm4Zsiw==", - "requires": { - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/plugin-content-blog": "0.0.0-3991", - "@docusaurus/plugin-content-docs": "0.0.0-3991", - "@docusaurus/plugin-content-pages": "0.0.0-3991", - "@docusaurus/types": "0.0.0-3991", - "clsx": "^1.1.1", - "fs-extra": "^10.0.0", - "tslib": "^2.1.0" - }, - "dependencies": { - "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" - } - } - }, - "@docusaurus/theme-search-algolia": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-0.0.0-3991.tgz", - "integrity": "sha512-TjURJqR9LyT8m/kJQ9pIu3SMiDXU8OExih7V5G0/8qla9bikNO68+8+5+sD0SqkZbwsCqHi4fXZhoXS0dZGu3A==", - "requires": { - "@docsearch/react": "^3.0.0-alpha.39", - "@docusaurus/core": "0.0.0-3991", - "@docusaurus/theme-common": "0.0.0-3991", - "@docusaurus/utils": "0.0.0-3991", - "@docusaurus/utils-validation": "0.0.0-3991", - "algoliasearch": "^4.8.4", - "algoliasearch-helper": "^3.3.4", - "clsx": "^1.1.1", - "eta": "^1.12.1", - "lodash": "^4.17.20" - }, - "dependencies": { - "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" - } - } - }, - "@docusaurus/types": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-0.0.0-3991.tgz", - "integrity": "sha512-EqZq79E94Ttpic3Sige61h9naBTtvRDJhkXKH4O7hQqN9Y/qpiPKXWwdVn7b0YUsVJto/jF2e6AdCmjgL8RUuw==", - "requires": { - "commander": "^5.1.0", - "joi": "^17.4.0", - "querystring": "0.2.0", - "webpack": "^5.40.0", - "webpack-merge": "^5.8.0" - } - }, - "@docusaurus/utils": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-0.0.0-3991.tgz", - "integrity": "sha512-bah5mwA1zIbc3Gd8EpwsslX+9vd5bjALmYTOt283YMnZG9nUKGtpeKQoPF+WgGonI6fjliSSAtTkNlFg+KdDQg==", - "requires": { - "@docusaurus/types": "0.0.0-3991", - "@types/github-slugger": "^1.3.0", - "chalk": "^4.1.1", - "escape-string-regexp": "^4.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.4", - "gray-matter": "^4.0.3", - "lodash": "^4.17.20", - "micromatch": "^4.0.4", - "resolve-pathname": "^3.0.0", - "tslib": "^2.2.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - } - } - }, - "@docusaurus/utils-common": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-0.0.0-3991.tgz", - "integrity": "sha512-BHMV4j66C5e/Ve60TDAx1+Q9kOnV2lv2Mbal4wxaSORzZpVVcDNrL0QjfYiSM9wmsmhVEHrz/y7wGm36qZWWbw==", - "requires": { - "@docusaurus/types": "0.0.0-3991", - "tslib": "^2.2.0" - } - }, - "@docusaurus/utils-validation": { - "version": "0.0.0-3991", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-0.0.0-3991.tgz", - "integrity": "sha512-l0cgVbfNd6GKlGaPxlzQI7hC8enx5V5drWhIhC6kM0PGR1KhunBhqljMqTh0iALsnDqIudEkumxtRMzjag99AQ==", - "requires": { - "@docusaurus/utils": "0.0.0-3991", - "chalk": "^4.1.1", - "joi": "^17.4.0", - "tslib": "^2.1.0" - } - }, - "@hapi/hoek": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", - "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "requires": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@polka/url": { - "version": "1.0.0-next.20", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", - "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==" - }, - "@sideway/address": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", - "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-PSv4RIVO1Y3kvHxjvqeVisk3E9XFoO04uwYBDWe217MFqKspplYswTuKLiJu0aLORQWzuQjfVsSlLPojwfYsLw==", - "requires": { - "bluebird": "^3.7.1", - "cheerio": "^0.22.0", - "eval": "^0.1.4", - "url": "^0.11.0", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" - }, - "@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - } - }, - "@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "requires": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" - } - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "requires": { - "@babel/types": "^7.12.6" - } - }, - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - }, - "@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "requires": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - } - } - }, - "@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@trysound/sax": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", - "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==" - }, - "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" - }, - "@types/github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" - }, - "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "requires": { - "@types/unist": "*" - } - }, - "@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" - }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "requires": { - "@types/unist": "*" - } - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.0.tgz", - "integrity": "sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag==" - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" - }, - "@types/sax": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", - "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", - "requires": { - "@types/node": "*" - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", - "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", - "dev": true - }, - "@webpack-cli/info": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", - "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.1.tgz", - "integrity": "sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw==", - "dev": true - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" - }, - "acorn-import-assertions": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==" - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "algoliasearch": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.5.tgz", - "integrity": "sha512-KmH2XkiN+8FxhND4nWFbQDkIoU6g2OjfeU9kIv4Lb+EiOOs3Gpp7jvd+JnatsCisAZsnWQdjd7zVlW7I/85QvQ==", - "requires": { - "@algolia/cache-browser-local-storage": "4.10.5", - "@algolia/cache-common": "4.10.5", - "@algolia/cache-in-memory": "4.10.5", - "@algolia/client-account": "4.10.5", - "@algolia/client-analytics": "4.10.5", - "@algolia/client-common": "4.10.5", - "@algolia/client-personalization": "4.10.5", - "@algolia/client-search": "4.10.5", - "@algolia/logger-common": "4.10.5", - "@algolia/logger-console": "4.10.5", - "@algolia/requester-browser-xhr": "4.10.5", - "@algolia/requester-common": "4.10.5", - "@algolia/requester-node-http": "4.10.5", - "@algolia/transporter": "4.10.5" - } - }, - "algoliasearch-helper": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.5.5.tgz", - "integrity": "sha512-JDH14gMpSj8UzEaKwVkrqKOeAOyK0dDWsFlKvWhk0Xl5yw9FyafYf1xZPb4uSXaPBAFQtUouFlR1Zt68BCY0/w==", - "requires": { - "events": "^1.1.1" - }, - "dependencies": { - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - } - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "requires": { - "string-width": "^3.0.0" - } - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - } - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.4.tgz", - "integrity": "sha512-EKjKDXOq7ug+jagLzmnoTRpTT0q1KVzEJqrJd0hCBa7FiG0WbFOBCcJCy2QkW1OckpO3qgttA1aWjVbeIPAecw==", - "requires": { - "browserslist": "^4.16.8", - "caniuse-lite": "^1.0.30001252", - "colorette": "^1.3.0", - "fraction.js": "^4.1.1", - "normalize-range": "^0.1.2", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", - "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.14.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2" - } - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", - "requires": { - "caniuse-lite": "^1.0.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", - "escalade": "^3.1.1", - "node-releases": "^1.1.75" - }, - "dependencies": { - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - } - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001255", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", - "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.5.tgz", - "integrity": "sha512-9dr/cU/LjMpU57PXlSvDkVRh0rPxJBXiBtD0+SgYt8ahTCsXtfKjCkNYgIoTC6mBg8CFr5EKhW3DKCaGMUbUfQ==", - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colord": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.7.0.tgz", - "integrity": "sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q==" - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" - }, - "copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", - "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", - "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "core-js": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.3.tgz", - "integrity": "sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw==" - }, - "core-js-compat": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.3.tgz", - "integrity": "sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA==", - "requires": { - "browserslist": "^4.17.0", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "core-js-pure": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.17.3.tgz", - "integrity": "sha512-YusrqwiOTTn8058JDa0cv9unbXdIiIgcgI9gXso0ey4WgkFLd3lYlV9rp9n7nDCsYxXsMDTjA4m1h3T348mdlQ==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "requires": { - "node-fetch": "2.6.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "css-color-names": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", - "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==" - }, - "css-declaration-sorter": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz", - "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", - "requires": { - "timsort": "^0.3.0" - } - }, - "css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", - "requires": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - } - }, - "css-minimizer-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", - "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "p-limit": "^3.0.2", - "postcss": "^8.3.5", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.8.tgz", - "integrity": "sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg==", - "requires": { - "cssnano-preset-default": "^5.1.4", - "is-resolvable": "^1.1.0", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-advanced": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.1.4.tgz", - "integrity": "sha512-pFtIM15OzryDk09RcK+bBBtwSl80+g/POTAf/sVPqPmnOAleK6vBkY5wTmPjqGyV5/UTPjEzWMtbOQ3Z0kCBXA==", - "requires": { - "autoprefixer": "^10.2.0", - "cssnano-preset-default": "^5.1.4", - "postcss-discard-unused": "^5.0.1", - "postcss-merge-idents": "^5.0.1", - "postcss-reduce-idents": "^5.0.1", - "postcss-zindex": "^5.0.1" - } - }, - "cssnano-preset-default": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz", - "integrity": "sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ==", - "requires": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^2.0.1", - "postcss-calc": "^8.0.0", - "postcss-colormin": "^5.2.0", - "postcss-convert-values": "^5.0.1", - "postcss-discard-comments": "^5.0.1", - "postcss-discard-duplicates": "^5.0.1", - "postcss-discard-empty": "^5.0.1", - "postcss-discard-overridden": "^5.0.1", - "postcss-merge-longhand": "^5.0.2", - "postcss-merge-rules": "^5.0.2", - "postcss-minify-font-values": "^5.0.1", - "postcss-minify-gradients": "^5.0.2", - "postcss-minify-params": "^5.0.1", - "postcss-minify-selectors": "^5.1.0", - "postcss-normalize-charset": "^5.0.1", - "postcss-normalize-display-values": "^5.0.1", - "postcss-normalize-positions": "^5.0.1", - "postcss-normalize-repeat-style": "^5.0.1", - "postcss-normalize-string": "^5.0.1", - "postcss-normalize-timing-functions": "^5.0.1", - "postcss-normalize-unicode": "^5.0.1", - "postcss-normalize-url": "^5.0.2", - "postcss-normalize-whitespace": "^5.0.1", - "postcss-ordered-values": "^5.0.2", - "postcss-reduce-initial": "^5.0.1", - "postcss-reduce-transforms": "^5.0.1", - "postcss-svgo": "^5.0.2", - "postcss-unique-selectors": "^5.0.1" - } - }, - "cssnano-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", - "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==" - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "requires": { - "repeat-string": "^1.5.4" - } - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "docusaurus-gtm-plugin": { - "version": "0.0.2" - }, - "docusaurus-plugin-sass": { - "version": "0.1.15", - "dev": true, - "requires": { - "node-sass": "^6.0.0", - "sass-loader": "^10.1.1" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.833", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.833.tgz", - "integrity": "sha512-h+9aVaUHjyunLqtCjJF2jrJ73tYcJqo2cCGKtVAXH9WmnBsb8hiChRQ0P1uXjdxR6Wcfxibephy41c1YlZA/pA==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.6.tgz", - "integrity": "sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-string": "^1.0.7", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-module-lexer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", - "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==" - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eval": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", - "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", - "requires": { - "require-like": ">= 0.1.1" - } - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "requires": { - "original": "^1.0.0" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", - "requires": { - "punycode": "^1.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, - "fastq": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "requires": { - "fbjs": "^3.0.0" - } - }, - "fbjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", - "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", - "requires": { - "cross-fetch": "^3.0.4", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - }, - "fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "requires": { - "xml-js": "^1.6.11" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "flux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.1.tgz", - "integrity": "sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ==", - "requires": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.0" - } - }, - "follow-redirects": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", - "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", - "requires": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", - "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "globule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", - "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "requires": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", - "requires": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - }, - "hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "dependencies": { - "hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "requires": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - } - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - } - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "requires": { - "source-map": "~0.6.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - } - } - }, - "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" - }, - "html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" - }, - "html-webpack-plugin": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz", - "integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==", - "requires": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", - "lodash": "^4.17.21", - "pretty-error": "^3.0.4", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - }, - "immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "infima": { - "version": "0.2.0-alpha.33", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.33.tgz", - "integrity": "sha512-iLZI8/vGTbbhbeFhlWv1zwvrqfNDLAayuEdqZqNqCyGuh0IW469dRIRm0FLZ98YyLikt2njzuKfy6xUrBWRXcg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - } - } - }, - "is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jest-worker": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", - "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", - "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "lilconfig": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", - "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==" - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==" - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, - "lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { - "unist-util-remove": "^2.0.0" - } - }, - "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" - }, - "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "requires": { - "mime-db": "1.48.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "requires": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - } - }, - "mini-css-extract-plugin": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", - "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - } - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" - }, - "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - } - }, - "node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" - }, - "node-sass": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", - "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "meow": "^9.0.0", - "nan": "^2.13.2", - "node-gyp": "^7.1.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" - }, - "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - } - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "^1.4.3" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", - "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", - "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" - } - }, - "postcss-calc": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", - "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", - "requires": { - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", - "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-convert-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", - "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", - "requires": { - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-discard-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==" - }, - "postcss-discard-duplicates": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==" - }, - "postcss-discard-empty": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==" - }, - "postcss-discard-overridden": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", - "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==" - }, - "postcss-discard-unused": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.0.1.tgz", - "integrity": "sha512-tD6xR/xyZTwfhKYRw0ylfCY8wbfhrjpKAMnDKRTLMy2fNW5hl0hoV6ap5vo2JdCkuHkP3CHw72beO4Y8pzFdww==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-loader": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", - "integrity": "sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==", - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "semver": "^7.3.4" - } - }, - "postcss-merge-idents": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.0.1.tgz", - "integrity": "sha512-xu8ueVU0RszbI2gKkxR6mluupsOSSLvt8q4gA2fcKFkA+x6SlH3cb4cFHpDvcRCNFbUmCR/VUub+Y6zPOjPx+Q==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-merge-longhand": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", - "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", - "requires": { - "css-color-names": "^1.0.1", - "postcss-value-parser": "^4.1.0", - "stylehacks": "^5.0.1" - } - }, - "postcss-merge-rules": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", - "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^2.0.1", - "postcss-selector-parser": "^6.0.5", - "vendors": "^1.0.3" - } - }, - "postcss-minify-font-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", - "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", - "requires": { - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-minify-gradients": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz", - "integrity": "sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ==", - "requires": { - "colord": "^2.6", - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-minify-params": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", - "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", - "requires": { - "alphanum-sort": "^1.0.2", - "browserslist": "^4.16.0", - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0", - "uniqs": "^2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", - "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", - "requires": { - "alphanum-sort": "^1.0.2", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==" - }, - "postcss-normalize-display-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", - "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-normalize-positions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", - "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", - "requires": { - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", - "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-normalize-string": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", - "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", - "requires": { - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", - "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", - "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", - "requires": { - "browserslist": "^4.16.0", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-normalize-url": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", - "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", - "requires": { - "is-absolute-url": "^3.0.3", - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", - "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", - "requires": { - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-ordered-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", - "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-reduce-idents": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.0.1.tgz", - "integrity": "sha512-6Rw8iIVFbqtaZExgWK1rpVgP7DPFRPh0DDFZxJ/ADNqPiH10sPCoq5tgo6kLiTyfh9sxjKYjXdc8udLEcPOezg==", - "requires": { - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-reduce-initial": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", - "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", - "requires": { - "browserslist": "^4.16.0", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", - "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-sort-media-queries": { - "version": "3.11.12", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-3.11.12.tgz", - "integrity": "sha512-PNhEOWR/btZ0bNNRqqdW4TWxBPQ1mu2I6/Zpco80vBUDSyEjtduUAorY0Vm68rvDlGea3+sgEnQ36iQ1A/gG8Q==", - "requires": { - "sort-css-media-queries": "1.5.4" - } - }, - "postcss-svgo": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", - "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", - "requires": { - "postcss-value-parser": "^4.1.0", - "svgo": "^2.3.0" - } - }, - "postcss-unique-selectors": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", - "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", - "requires": { - "alphanum-sort": "^1.0.2", - "postcss-selector-parser": "^6.0.5", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "postcss-zindex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.0.1.tgz", - "integrity": "sha512-nwgtJJys+XmmSGoYCcgkf/VczP8Mp/0OfSv3v0+fw0uABY4yxw+eFs0Xp9nAZHIKnS5j+e9ywQ+RD+ONyvl5pA==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "pretty-error": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", - "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^2.0.6" - } - }, - "pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" - }, - "prism-react-renderer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", - "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==" - }, - "prismjs": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz", - "integrity": "sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { - "escape-goat": "^2.0.0" - } - }, - "pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "17.0.2", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", - "requires": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "react-dev-utils": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", - "requires": { - "@babel/code-frame": "7.10.4", - "address": "1.1.2", - "browserslist": "4.14.2", - "chalk": "2.4.2", - "cross-spawn": "7.0.3", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.1.0", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "4.1.6", - "global-modules": "2.0.0", - "globby": "11.0.1", - "gzip-size": "5.1.1", - "immer": "8.0.1", - "is-root": "2.1.0", - "loader-utils": "2.0.0", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "prompts": "2.4.0", - "react-error-overlay": "^6.0.9", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", - "requires": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "react-dom": { - "version": "17.0.2", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" - }, - "react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - }, - "react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "requires": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - } - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-loadable": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", - "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", - "requires": { - "prop-types": "^15.5.0" - } - }, - "react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "requires": { - "@babel/runtime": "^7.10.3" - } - }, - "react-router": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", - "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-router-dom": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", - "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.1", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-side-effect": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", - "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==" - }, - "react-textarea-autosize": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", - "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", - "requires": { - "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.0.0", - "use-latest": "^1.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "reading-time": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.4.0.tgz", - "integrity": "sha512-0I9aP583rqQhm6T6Y+pYgYaM4w649VHgQPC24xSWXpn/4qRs08Zu6KgXRf0da6/k7IHoC6idm76fU6vz4mmzHQ==" - }, - "rechoir": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", - "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", - "requires": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remark-admonitions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", - "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", - "requires": { - "rehype-parse": "^6.0.2", - "unified": "^8.4.2", - "unist-util-visit": "^2.0.1" - } - }, - "remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "requires": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" - }, - "remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "requires": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - } - } - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" - }, - "rtlcss": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.3.0.tgz", - "integrity": "sha512-XZ2KEatH2nU5yPlts1Wu8SGIuZ3ndN025HQX5MqtUCUiOn5WkCDbcpJ2VJWjpuFmM2cUTQ1xtH21fhMCSseI5A==", - "requires": { - "chalk": "^4.1.0", - "find-up": "^5.0.0", - "mkdirp": "^1.0.4", - "postcss": "^8.2.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - } - }, - "sass-loader": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", - "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", - "requires": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.0.4", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "requires": { - "mime-db": "~1.33.0" - } - }, - "path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - } - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "sirv": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", - "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", - "requires": { - "@polka/url": "^1.0.0-next.20", - "mime": "^2.3.1", - "totalist": "^1.0.0" - }, - "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" - } - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "sitemap": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.0.0.tgz", - "integrity": "sha512-Ud0jrRQO2k7fEtPAM+cQkBKoMvxQyPKNXKDLn8tRVHxRCsdDQ2JZvw+aZ5IRYYQVAV9iGxEar6boTwZzev+x3g==", - "requires": { - "@types/node": "^15.0.1", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "15.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==" - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "sockjs-client": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", - "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.3" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "sort-css-media-queries": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.4.tgz", - "integrity": "sha512-YP5W/h4Sid/YP7Lp87ejJ5jP13/Mtqt2vx33XyhO+IAugKlufRPbOrPlIiEUuxmpNBSBd3EeeQpFhdu3RfI2Ag==" - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "std-env": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.0.tgz", - "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==", - "requires": { - "ci-info": "^3.0.0" - } - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "stylehacks": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", - "requires": { - "browserslist": "^4.16.0", - "postcss-selector-parser": "^6.0.4" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.5.0.tgz", - "integrity": "sha512-FSdBOOo271VyF/qZnOn1PgwCdt1v4Dx0Sey+U1jgqm1vqRYjPGdip0RGrFW6ItwtkBB8rHgHk26dlVr0uCs82Q==", - "requires": { - "@trysound/sax": "0.1.1", - "colorette": "^1.3.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "stable": "^0.1.8" - }, - "dependencies": { - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - } - } - }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==" - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "terser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", - "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", - "requires": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, - "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "ts-essentials": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", - "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" - }, - "unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" - }, - "unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" - }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" - }, - "unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - } - }, - "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "use-composed-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", - "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", - "requires": { - "ts-essentials": "^2.0.3" - } - }, - "use-isomorphic-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", - "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==" - }, - "use-latest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", - "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", - "requires": { - "use-isomorphic-layout-effect": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - } - } - }, - "vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "requires": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - } - }, - "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" - }, - "webpack": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", - "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.7.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" - }, - "dependencies": { - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", - "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", - "requires": { - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^6.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "dependencies": { - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - } - } - }, - "webpack-cli": { - "version": "4.7.2", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.4", - "@webpack-cli/info": "^1.3.0", - "@webpack-cli/serve": "^1.5.1", - "colorette": "^1.2.1", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" - } - } - }, - "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==" - }, - "webpackbar": { - "version": "5.0.0-3", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", - "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", - "requires": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.1.0", - "consola": "^2.15.0", - "figures": "^3.2.0", - "pretty-time": "^1.1.0", - "std-env": "^2.2.1", - "text-table": "^0.2.0", - "wrap-ansi": "^7.0.0" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "requires": { - "sax": "^1.2.4" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" - } - } -} From ef6d3c4f29d38f56a0f3dfd19c29756b04635334 Mon Sep 17 00:00:00 2001 From: Serhii Pylypchuk Date: Mon, 14 Jul 2025 22:47:32 +0400 Subject: [PATCH 46/47] Update gitignore file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c5a42c3da..70c1c2e57 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ yarn-error.log* # Idea .idea +package-lock.json From 296bdc00a81b5b538a821ba1e5e4c31c7e5b6d1d Mon Sep 17 00:00:00 2001 From: Serhii Pylypchuk Date: Mon, 14 Jul 2025 23:00:48 +0400 Subject: [PATCH 47/47] Update Docusaurus engine to v3.8.1 --- package.json | 4 +- yarn.lock | 1598 +++++++++++++++++++++++--------------------------- 2 files changed, 730 insertions(+), 872 deletions(-) diff --git a/package.json b/package.json index 6356769b4..63280b8f6 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "normalizeLink": "cd plugins && node samplesLinksNormalize.js" }, "dependencies": { - "@docusaurus/core": "^3.7.0", - "@docusaurus/preset-classic": "^3.7.0", + "@docusaurus/core": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", "@mdx-js/react": "^3.0.0", "clsx": "^1.1.1", "docusaurus-gtm-plugin": "^0.0.2", diff --git a/yarn.lock b/yarn.lock index f2cb0736a..62b4a2736 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,32 +2,32 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.17.7": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz#2c410baa94a47c5c5f56ed712bb4a00ebe24088b" - integrity sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q== +"@algolia/autocomplete-core@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz#83374c47dc72482aa45d6b953e89377047f0dcdc" + integrity sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ== dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.17.7" - "@algolia/autocomplete-shared" "1.17.7" + "@algolia/autocomplete-plugin-algolia-insights" "1.17.9" + "@algolia/autocomplete-shared" "1.17.9" -"@algolia/autocomplete-plugin-algolia-insights@1.17.7": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz#7d2b105f84e7dd8f0370aa4c4ab3b704e6760d82" - integrity sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A== +"@algolia/autocomplete-plugin-algolia-insights@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz#74c86024d09d09e8bfa3dd90b844b77d9f9947b6" + integrity sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ== dependencies: - "@algolia/autocomplete-shared" "1.17.7" + "@algolia/autocomplete-shared" "1.17.9" -"@algolia/autocomplete-preset-algolia@1.17.7": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz#c9badc0d73d62db5bf565d839d94ec0034680ae9" - integrity sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA== +"@algolia/autocomplete-preset-algolia@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz#911f3250544eb8ea4096fcfb268f156b085321b5" + integrity sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ== dependencies: - "@algolia/autocomplete-shared" "1.17.7" + "@algolia/autocomplete-shared" "1.17.9" -"@algolia/autocomplete-shared@1.17.7": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz#105e84ad9d1a31d3fb86ba20dc890eefe1a313a0" - integrity sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg== +"@algolia/autocomplete-shared@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz#5f38868f7cb1d54b014b17a10fc4f7e79d427fa8" + integrity sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ== "@algolia/client-abtesting@5.19.0": version "5.19.0" @@ -158,7 +158,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -2050,92 +2050,103 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@csstools/cascade-layer-name-parser@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz#64d128529397aa1e1c986f685713363b262b81b1" - integrity sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA== +"@csstools/cascade-layer-name-parser@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz#43f962bebead0052a9fed1a2deeb11f85efcbc72" + integrity sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A== -"@csstools/color-helpers@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.1.tgz#829f1c76f5800b79c51c709e2f36821b728e0e10" - integrity sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA== +"@csstools/color-helpers@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz#82592c9a7c2b83c293d9161894e2a6471feb97b8" + integrity sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA== -"@csstools/css-calc@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.0.tgz#3f28b8f8f736b8f78abbc75eebd55c756207e773" - integrity sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw== +"@csstools/css-calc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" + integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== -"@csstools/css-color-parser@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz#e646838f6aab4618aeea7ba0c4921a254e180276" - integrity sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw== +"@csstools/css-color-parser@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz#79fc68864dd43c3b6782d2b3828bc0fa9d085c10" + integrity sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg== dependencies: - "@csstools/color-helpers" "^5.0.1" - "@csstools/css-calc" "^2.1.0" + "@csstools/color-helpers" "^5.0.2" + "@csstools/css-calc" "^2.1.4" -"@csstools/css-parser-algorithms@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" - integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A== +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.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.3" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" - integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== -"@csstools/media-query-list-parser@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz#e80e17eba1693fceafb8d6f2cfc68c0e7a9ab78a" - integrity sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A== +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== -"@csstools/postcss-cascade-layers@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz#9640313e64b5e39133de7e38a5aa7f40dc259597" - integrity sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ== +"@csstools/postcss-cascade-layers@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz#dd2c70db3867b88975f2922da3bfbae7d7a2cae7" + integrity sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg== dependencies: "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" -"@csstools/postcss-color-function@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz#dabd1e516ccd4c7bd5803e37075a503b5f7f0ac4" - integrity sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ== +"@csstools/postcss-color-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz#11ad43a66ef2cc794ab826a07df8b5fa9fb47a3a" + integrity sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ== dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-color-mix-function@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz#d971832ec30b3b60363bceddfeb4b90c7cc0f4b8" - integrity sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg== +"@csstools/postcss-color-mix-function@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz#8c9d0ccfae5c45a9870dd84807ea2995c7a3a514" + integrity sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q== dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-content-alt-text@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz#76f4687fb15ed45bc1139bb71e5775779762897a" - integrity sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw== +"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz#0b29cb9b4630d7ed68549db265662d41554a17ed" + integrity sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ== dependencies: - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-exponential-functions@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz#0c39f75df3357ee1e444b0aa0ede4e12aafea0e9" - integrity sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ== +"@csstools/postcss-content-alt-text@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz#548862226eac54bab0ee5f1bf3a9981393ab204b" + integrity sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-exponential-functions@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz#fc03d1272888cb77e64cc1a7d8a33016e4f05c69" + integrity sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw== dependencies: - "@csstools/css-calc" "^2.1.0" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" "@csstools/postcss-font-format-keywords@^4.0.0": version "4.0.0" @@ -2145,67 +2156,67 @@ "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-gamut-mapping@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz#04ec6a50fdbca2a30dec56e6bb780c79621e47a7" - integrity sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA== - dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - -"@csstools/postcss-gradients-interpolation-method@^5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz#67fa61ada95e4534687fa76cd2d15ac74386560e" - integrity sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg== - dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" +"@csstools/postcss-gamut-mapping@^2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz#f518d941231d721dbecf5b41e3c441885ff2f28b" + integrity sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-gradients-interpolation-method@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz#3146da352c31142a721fdba062ac3a6d11dbbec3" + integrity sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-hwb-function@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz#c40f557a54ed45e75c601a9ba7a08d315f64dbd7" - integrity sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ== +"@csstools/postcss-hwb-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz#f93f3c457e6440ac37ef9b908feb5d901b417d50" + integrity sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ== dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-ic-unit@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz#b60ec06500717c337447c39ae7fe7952eeb9d48f" - integrity sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA== +"@csstools/postcss-ic-unit@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz#7561e09db65fac8304ceeab9dd3e5c6e43414587" + integrity sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA== dependencies: - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-initial@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz#a86f5fc59ab9f16f1422dade4c58bd941af5df22" - integrity sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA== +"@csstools/postcss-initial@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz#c385bd9d8ad31ad159edd7992069e97ceea4d09a" + integrity sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg== -"@csstools/postcss-is-pseudo-class@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz#12041448fedf01090dd4626022c28b7f7623f58e" - integrity sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ== +"@csstools/postcss-is-pseudo-class@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz#d34e850bcad4013c2ed7abe948bfa0448aa8eb74" + integrity sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ== dependencies: "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" -"@csstools/postcss-light-dark-function@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz#807c170cd28eebb0c00e64dfc6ab0bf418f19209" - integrity sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw== +"@csstools/postcss-light-dark-function@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz#9fb080188907539734a9d5311d2a1cb82531ef38" + integrity sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ== dependencies: - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" "@csstools/postcss-logical-float-and-clear@^3.0.0": @@ -2230,32 +2241,32 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-logical-viewport-units@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz#f6cc63520ca2a6eb76b9cd946070c38dda66d733" - integrity sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw== +"@csstools/postcss-logical-viewport-units@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz#016d98a8b7b5f969e58eb8413447eb801add16fc" + integrity sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ== dependencies: - "@csstools/css-tokenizer" "^3.0.3" + "@csstools/css-tokenizer" "^3.0.4" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-media-minmax@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz#66970aa8d8057f84b88aff21f385194fbe03eb11" - integrity sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew== +"@csstools/postcss-media-minmax@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz#184252d5b93155ae526689328af6bdf3fc113987" + integrity sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig== dependencies: - "@csstools/css-calc" "^2.1.0" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/media-query-list-parser" "^4.0.2" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" -"@csstools/postcss-media-queries-aspect-ratio-number-values@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz#d71102172c74baf3f892fac88cf1ea46a961600d" - integrity sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ== +"@csstools/postcss-media-queries-aspect-ratio-number-values@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz#f485c31ec13d6b0fb5c528a3474334a40eff5f11" + integrity sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg== dependencies: - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/media-query-list-parser" "^4.0.2" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" "@csstools/postcss-nested-calc@^4.0.0": version "4.0.0" @@ -2272,42 +2283,42 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz#17e8dfb6422dfd8d77256def5d5be8335ea7af34" - integrity sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A== +"@csstools/postcss-oklab-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz#d4c23c51dd0be45e6dedde22432d7d0003710780" + integrity sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg== dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-progressive-custom-properties@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz#ecdb85bcdb1852d73970a214a376684a91f82bdc" - integrity sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q== +"@csstools/postcss-progressive-custom-properties@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz#70c8d41b577f4023633b7e3791604e0b7f3775bc" + integrity sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-random-function@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz#73a0b62b5dbbc03c25a28f085235eb61b09a2fb0" - integrity sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA== - dependencies: - "@csstools/css-calc" "^2.1.0" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - -"@csstools/postcss-relative-color-syntax@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz#4b8bc219b34b16f5abdbbcf09ac13e65bff6ef16" - integrity sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg== - dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" +"@csstools/postcss-random-function@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz#3191f32fe72936e361dadf7dbfb55a0209e2691e" + integrity sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-relative-color-syntax@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz#daa840583969461e1e06b12e9c591e52a790ec86" + integrity sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" "@csstools/postcss-scope-pseudo-class@^4.0.1": @@ -2317,50 +2328,50 @@ dependencies: postcss-selector-parser "^7.0.0" -"@csstools/postcss-sign-functions@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz#a524fae1374b0e167729f612ca875d7b1b334262" - integrity sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA== +"@csstools/postcss-sign-functions@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz#a9ac56954014ae4c513475b3f1b3e3424a1e0c12" + integrity sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg== dependencies: - "@csstools/css-calc" "^2.1.0" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@csstools/postcss-stepped-value-functions@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz#4d68633d502fbe2b6ef3898e368e3540488a0d8a" - integrity sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw== +"@csstools/postcss-stepped-value-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz#36036f1a0e5e5ee2308e72f3c9cb433567c387b9" + integrity sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA== dependencies: - "@csstools/css-calc" "^2.1.0" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@csstools/postcss-text-decoration-shorthand@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz#251fab0939d50c6fd73bb2b830b2574188efa087" - integrity sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw== +"@csstools/postcss-text-decoration-shorthand@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz#a3bcf80492e6dda36477538ab8e8943908c9f80a" + integrity sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA== dependencies: - "@csstools/color-helpers" "^5.0.1" + "@csstools/color-helpers" "^5.0.2" postcss-value-parser "^4.2.0" -"@csstools/postcss-trigonometric-functions@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz#267b95a8bd45536e0360596b6da660a9eb6aac83" - integrity sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA== +"@csstools/postcss-trigonometric-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz#3f94ed2e319b57f2c59720b64e4d0a8a6fb8c3b2" + integrity sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A== dependencies: - "@csstools/css-calc" "^2.1.0" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" "@csstools/postcss-unset-value@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz#7caa981a34196d06a737754864baf77d64de4bba" integrity sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA== -"@csstools/selector-resolve-nested@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz#704a9b637975680e025e069a4c58b3beb3e2752a" - integrity sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ== +"@csstools/selector-resolve-nested@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz#848c6f44cb65e3733e478319b9342b7aa436fac7" + integrity sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g== "@csstools/selector-specificity@^5.0.0": version "5.0.0" @@ -2377,25 +2388,25 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/css@3.8.2": - version "3.8.2" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.8.2.tgz#7973ceb6892c30f154ba254cd05c562257a44977" - integrity sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ== +"@docsearch/css@3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.9.0.tgz#3bc29c96bf024350d73b0cfb7c2a7b71bf251cd5" + integrity sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA== -"@docsearch/react@^3.8.1": - version "3.8.2" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.8.2.tgz#7b11d39b61c976c0aa9fbde66e6b73b30f3acd42" - integrity sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg== +"@docsearch/react@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.9.0.tgz#d0842b700c3ee26696786f3c8ae9f10c1a3f0db3" + integrity sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ== dependencies: - "@algolia/autocomplete-core" "1.17.7" - "@algolia/autocomplete-preset-algolia" "1.17.7" - "@docsearch/css" "3.8.2" + "@algolia/autocomplete-core" "1.17.9" + "@algolia/autocomplete-preset-algolia" "1.17.9" + "@docsearch/css" "3.9.0" algoliasearch "^5.14.2" -"@docusaurus/babel@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.7.0.tgz#770dd5da525a9d6a2fee7d3212ec62040327f776" - integrity sha512-0H5uoJLm14S/oKV3Keihxvh8RV+vrid+6Gv+2qhuzbqHanawga8tYnsdpjEyt36ucJjqlby2/Md2ObWjA02UXQ== +"@docusaurus/babel@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.8.1.tgz#db329ac047184214e08e2dbc809832c696c18506" + integrity sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw== dependencies: "@babel/core" "^7.25.9" "@babel/generator" "^7.25.9" @@ -2407,55 +2418,54 @@ "@babel/runtime" "^7.25.9" "@babel/runtime-corejs3" "^7.25.9" "@babel/traverse" "^7.25.9" - "@docusaurus/logger" "3.7.0" - "@docusaurus/utils" "3.7.0" + "@docusaurus/logger" "3.8.1" + "@docusaurus/utils" "3.8.1" babel-plugin-dynamic-import-node "^2.3.3" fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/bundler@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.7.0.tgz#d8e7867b3b2c43a1e320ed429f8dfe873c38506d" - integrity sha512-CUUT9VlSGukrCU5ctZucykvgCISivct+cby28wJwCC/fkQFgAHRp/GKv2tx38ZmXb7nacrKzFTcp++f9txUYGg== +"@docusaurus/bundler@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.8.1.tgz#e2b11d615f09a6e470774bb36441b8d06736b94c" + integrity sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA== dependencies: "@babel/core" "^7.25.9" - "@docusaurus/babel" "3.7.0" - "@docusaurus/cssnano-preset" "3.7.0" - "@docusaurus/logger" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" + "@docusaurus/babel" "3.8.1" + "@docusaurus/cssnano-preset" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" babel-loader "^9.2.1" - clean-css "^5.3.2" + clean-css "^5.3.3" copy-webpack-plugin "^11.0.0" - css-loader "^6.8.1" + css-loader "^6.11.0" css-minimizer-webpack-plugin "^5.0.1" cssnano "^6.1.2" file-loader "^6.2.0" html-minifier-terser "^7.2.0" - mini-css-extract-plugin "^2.9.1" + mini-css-extract-plugin "^2.9.2" null-loader "^4.0.1" - postcss "^8.4.26" - postcss-loader "^7.3.3" - postcss-preset-env "^10.1.0" - react-dev-utils "^12.0.1" + postcss "^8.5.4" + postcss-loader "^7.3.4" + postcss-preset-env "^10.2.1" terser-webpack-plugin "^5.3.9" tslib "^2.6.0" url-loader "^4.1.1" webpack "^5.95.0" webpackbar "^6.0.1" -"@docusaurus/core@3.7.0", "@docusaurus/core@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.7.0.tgz#e871586d099093723dfe6de81c1ce610aeb20292" - integrity sha512-b0fUmaL+JbzDIQaamzpAFpTviiaU4cX3Qz8cuo14+HGBCwa0evEK0UYCBFY3n4cLzL8Op1BueeroUD2LYAIHbQ== - dependencies: - "@docusaurus/babel" "3.7.0" - "@docusaurus/bundler" "3.7.0" - "@docusaurus/logger" "3.7.0" - "@docusaurus/mdx-loader" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-common" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" +"@docusaurus/core@3.8.1", "@docusaurus/core@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.8.1.tgz#c22e47c16a22cb7d245306c64bc54083838ff3db" + integrity sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA== + dependencies: + "@docusaurus/babel" "3.8.1" + "@docusaurus/bundler" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" boxen "^6.2.1" chalk "^4.1.2" chokidar "^3.5.3" @@ -2463,19 +2473,19 @@ combine-promises "^1.1.0" commander "^5.1.0" core-js "^3.31.1" - del "^6.1.1" detect-port "^1.5.1" escape-html "^1.0.3" eta "^2.2.0" eval "^0.1.8" + execa "5.1.1" fs-extra "^11.1.1" html-tags "^3.3.1" html-webpack-plugin "^5.6.0" leven "^3.1.0" lodash "^4.17.21" + open "^8.4.0" p-map "^4.0.0" prompts "^2.4.2" - react-dev-utils "^12.0.1" react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" react-loadable-ssr-addon-v5-slorber "^1.0.1" @@ -2484,7 +2494,7 @@ react-router-dom "^5.3.4" semver "^7.5.4" serve-handler "^6.1.6" - shelljs "^0.8.5" + tinypool "^1.0.2" tslib "^2.6.0" update-notifier "^6.0.2" webpack "^5.95.0" @@ -2492,39 +2502,39 @@ webpack-dev-server "^4.15.2" webpack-merge "^6.0.1" -"@docusaurus/cssnano-preset@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.7.0.tgz#8fe8f2c3acbd32384b69e14983b9a63c98cae34e" - integrity sha512-X9GYgruZBSOozg4w4dzv9uOz8oK/EpPVQXkp0MM6Tsgp/nRIU9hJzJ0Pxg1aRa3xCeEQTOimZHcocQFlLwYajQ== +"@docusaurus/cssnano-preset@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz#bd55026251a6ab8e2194839a2042458ef9880c44" + integrity sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug== dependencies: cssnano-preset-advanced "^6.1.2" - postcss "^8.4.38" + postcss "^8.5.4" postcss-sort-media-queries "^5.2.0" tslib "^2.6.0" -"@docusaurus/logger@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.7.0.tgz#07ecc2f460c4d2382df4991f9ce4e348e90af04c" - integrity sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA== +"@docusaurus/logger@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.8.1.tgz#45321b2e2e14695d0dbd8b4104ea7b0fbaa98700" + integrity sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.7.0.tgz#5890c6e7a5b68cb1d066264ac5290cdcd59d4ecc" - integrity sha512-OFBG6oMjZzc78/U3WNPSHs2W9ZJ723ewAcvVJaqS0VgyeUfmzUV8f1sv+iUHA0DtwiR5T5FjOxj6nzEE8LY6VA== +"@docusaurus/mdx-loader@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz#74309b3614bbcef1d55fb13e6cc339b7fb000b5f" + integrity sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w== dependencies: - "@docusaurus/logger" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" + "@docusaurus/logger" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" estree-util-value-to-estree "^3.0.1" file-loader "^6.2.0" fs-extra "^11.1.1" - image-size "^1.0.2" + image-size "^2.0.2" mdast-util-mdx "^3.0.0" mdast-util-to-string "^4.0.0" rehype-raw "^7.0.0" @@ -2540,7 +2550,20 @@ vfile "^6.0.1" webpack "^5.88.1" -"@docusaurus/module-type-aliases@3.7.0", "@docusaurus/module-type-aliases@^3.7.0": +"@docusaurus/module-type-aliases@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz#454de577bd7f50b5eae16db0f76b49ca5e4e281a" + integrity sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg== + dependencies: + "@docusaurus/types" "3.8.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + +"@docusaurus/module-type-aliases@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.7.0.tgz#15c0745b829c6966c5b3b2c2527c72b54830b0e5" integrity sha512-g7WdPqDNaqA60CmBrr0cORTrsOit77hbsTj7xE2l71YhBn79sxdm7WMK7wfhcaafkbpIh7jv5ef5TOpf1Xv9Lg== @@ -2553,184 +2576,197 @@ react-helmet-async "npm:@slorber/react-helmet-async@*" react-loadable "npm:@docusaurus/react-loadable@6.0.0" -"@docusaurus/plugin-content-blog@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.7.0.tgz#7bd69de87a1f3adb652e1473ef5b7ccc9468f47e" - integrity sha512-EFLgEz6tGHYWdPU0rK8tSscZwx+AsyuBW/r+tNig2kbccHYGUJmZtYN38GjAa3Fda4NU+6wqUO5kTXQSRBQD3g== - dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/logger" "3.7.0" - "@docusaurus/mdx-loader" "3.7.0" - "@docusaurus/theme-common" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-common" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" +"@docusaurus/plugin-content-blog@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz#88d842b562b04cf59df900d9f6984b086f821525" + integrity sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" cheerio "1.0.0-rc.12" feed "^4.2.2" fs-extra "^11.1.1" lodash "^4.17.21" - reading-time "^1.5.0" + schema-dts "^1.1.2" srcset "^4.0.0" tslib "^2.6.0" unist-util-visit "^5.0.0" utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.7.0.tgz#297a549e926ee2b1147b5242af6f21532c7b107c" - integrity sha512-GXg5V7kC9FZE4FkUZA8oo/NrlRb06UwuICzI6tcbzj0+TVgjq/mpUXXzSgKzMS82YByi4dY2Q808njcBCyy6tQ== - dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/logger" "3.7.0" - "@docusaurus/mdx-loader" "3.7.0" - "@docusaurus/module-type-aliases" "3.7.0" - "@docusaurus/theme-common" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-common" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" +"@docusaurus/plugin-content-docs@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz#40686a206abb6373bee5638de100a2c312f112a4" + integrity sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/module-type-aliases" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" js-yaml "^4.1.0" lodash "^4.17.21" + schema-dts "^1.1.2" tslib "^2.6.0" utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.7.0.tgz#c4a8f7237872236aacb77665822c474c0a00e91a" - integrity sha512-YJSU3tjIJf032/Aeao8SZjFOrXJbz/FACMveSMjLyMH4itQyZ2XgUIzt4y+1ISvvk5zrW4DABVT2awTCqBkx0Q== +"@docusaurus/plugin-content-pages@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz#41b684dbd15390b7bb6a627f78bf81b6324511ac" + integrity sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w== dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/mdx-loader" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-debug@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.7.0.tgz#a4fd45132e40cffe96bb51f48e89982a1cb8e194" - integrity sha512-Qgg+IjG/z4svtbCNyTocjIwvNTNEwgRjSXXSJkKVG0oWoH0eX/HAPiu+TS1HBwRPQV+tTYPWLrUypYFepfujZA== +"@docusaurus/plugin-css-cascade-layers@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz#cb414b4a82aa60fc64ef2a435ad0105e142a6c71" + integrity sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw== dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" + tslib "^2.6.0" + +"@docusaurus/plugin-debug@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz#45b107e46b627caaae66995f53197ace78af3491" + integrity sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" fs-extra "^11.1.1" - react-json-view-lite "^1.2.0" + react-json-view-lite "^2.3.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.7.0.tgz#d20f665e810fb2295d1c1bbfe13398c5ff42eb24" - integrity sha512-otIqiRV/jka6Snjf+AqB360XCeSv7lQC+DKYW+EUZf6XbuE8utz5PeUQ8VuOcD8Bk5zvT1MC4JKcd5zPfDuMWA== +"@docusaurus/plugin-google-analytics@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz#64a302e62fe5cb6e007367c964feeef7b056764a" + integrity sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q== dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.7.0.tgz#a48638dfd132858060458b875a440b6cbda6bf8f" - integrity sha512-M3vrMct1tY65ModbyeDaMoA+fNJTSPe5qmchhAbtqhDD/iALri0g9LrEpIOwNaoLmm6lO88sfBUADQrSRSGSWA== +"@docusaurus/plugin-google-gtag@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz#8c76f8a1d96448f2f0f7b10e6bde451c40672b95" + integrity sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg== dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@types/gtag.js" "^0.0.12" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.7.0.tgz#0a4390f4b0e760d073bdb1905436bfa7bd71356b" - integrity sha512-X8U78nb8eiMiPNg3jb9zDIVuuo/rE1LjGDGu+5m5CX4UBZzjMy+klOY2fNya6x8ACyE/L3K2erO1ErheP55W/w== +"@docusaurus/plugin-google-tag-manager@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz#88241ffd06369f4a4d5fb982ff3ac2777561ae37" + integrity sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw== dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.7.0.tgz#2c1bf9de26aeda455df6f77748e5887ace39b2d7" - integrity sha512-bTRT9YLZ/8I/wYWKMQke18+PF9MV8Qub34Sku6aw/vlZ/U+kuEuRpQ8bTcNOjaTSfYsWkK4tTwDMHK2p5S86cA== - dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/logger" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-common" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" +"@docusaurus/plugin-sitemap@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz#3aebd39186dc30e53023f1aab44625bc0bdac892" + integrity sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/plugin-svgr@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.7.0.tgz#018e89efd615d5fde77b891a8c2aadf203013f5d" - integrity sha512-HByXIZTbc4GV5VAUkZ2DXtXv1Qdlnpk3IpuImwSnEzCDBkUMYcec5282hPjn6skZqB25M1TYCmWS91UbhBGxQg== +"@docusaurus/plugin-svgr@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz#6f340be8eae418a2cce540d8ece096ffd9c9b6ab" + integrity sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw== dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@svgr/core" "8.1.0" "@svgr/webpack" "^8.1.0" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/preset-classic@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.7.0.tgz#f6656a04ae6a4877523dbd04f7c491632e4003b9" - integrity sha512-nPHj8AxDLAaQXs+O6+BwILFuhiWbjfQWrdw2tifOClQoNfuXDjfjogee6zfx6NGHWqshR23LrcN115DmkHC91Q== - dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/plugin-content-blog" "3.7.0" - "@docusaurus/plugin-content-docs" "3.7.0" - "@docusaurus/plugin-content-pages" "3.7.0" - "@docusaurus/plugin-debug" "3.7.0" - "@docusaurus/plugin-google-analytics" "3.7.0" - "@docusaurus/plugin-google-gtag" "3.7.0" - "@docusaurus/plugin-google-tag-manager" "3.7.0" - "@docusaurus/plugin-sitemap" "3.7.0" - "@docusaurus/plugin-svgr" "3.7.0" - "@docusaurus/theme-classic" "3.7.0" - "@docusaurus/theme-common" "3.7.0" - "@docusaurus/theme-search-algolia" "3.7.0" - "@docusaurus/types" "3.7.0" - -"@docusaurus/theme-classic@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.7.0.tgz#b483bd8e2923b6994b5f47238884b9f8984222c5" - integrity sha512-MnLxG39WcvLCl4eUzHr0gNcpHQfWoGqzADCly54aqCofQX6UozOS9Th4RK3ARbM9m7zIRv3qbhggI53dQtx/hQ== - dependencies: - "@docusaurus/core" "3.7.0" - "@docusaurus/logger" "3.7.0" - "@docusaurus/mdx-loader" "3.7.0" - "@docusaurus/module-type-aliases" "3.7.0" - "@docusaurus/plugin-content-blog" "3.7.0" - "@docusaurus/plugin-content-docs" "3.7.0" - "@docusaurus/plugin-content-pages" "3.7.0" - "@docusaurus/theme-common" "3.7.0" - "@docusaurus/theme-translations" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-common" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" +"@docusaurus/preset-classic@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz#bb79fd12f3211363720c569a526c7e24d3aa966b" + integrity sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/plugin-content-blog" "3.8.1" + "@docusaurus/plugin-content-docs" "3.8.1" + "@docusaurus/plugin-content-pages" "3.8.1" + "@docusaurus/plugin-css-cascade-layers" "3.8.1" + "@docusaurus/plugin-debug" "3.8.1" + "@docusaurus/plugin-google-analytics" "3.8.1" + "@docusaurus/plugin-google-gtag" "3.8.1" + "@docusaurus/plugin-google-tag-manager" "3.8.1" + "@docusaurus/plugin-sitemap" "3.8.1" + "@docusaurus/plugin-svgr" "3.8.1" + "@docusaurus/theme-classic" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/theme-search-algolia" "3.8.1" + "@docusaurus/types" "3.8.1" + +"@docusaurus/theme-classic@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz#1e45c66d89ded359225fcd29bf3258d9205765c1" + integrity sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/module-type-aliases" "3.8.1" + "@docusaurus/plugin-content-blog" "3.8.1" + "@docusaurus/plugin-content-docs" "3.8.1" + "@docusaurus/plugin-content-pages" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/theme-translations" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" infima "0.2.0-alpha.45" lodash "^4.17.21" nprogress "^0.2.0" - postcss "^8.4.26" + postcss "^8.5.4" prism-react-renderer "^2.3.0" prismjs "^1.29.0" react-router-dom "^5.3.4" @@ -2738,15 +2774,15 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.7.0.tgz#18bf5c6b149a701f4bd865715ee8b595aa40b354" - integrity sha512-8eJ5X0y+gWDsURZnBfH0WabdNm8XMCXHv8ENy/3Z/oQKwaB/EHt5lP9VsTDTf36lKEp0V6DjzjFyFIB+CetL0A== +"@docusaurus/theme-common@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.8.1.tgz#17c23316fbe3ee3f7e707c7298cb59a0fff38b4b" + integrity sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw== dependencies: - "@docusaurus/mdx-loader" "3.7.0" - "@docusaurus/module-type-aliases" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-common" "3.7.0" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/module-type-aliases" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -2756,19 +2792,19 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.7.0.tgz#2108ddf0b300b82de7c2b9ff9fcf62121b66ea37" - integrity sha512-Al/j5OdzwRU1m3falm+sYy9AaB93S1XF1Lgk9Yc6amp80dNxJVplQdQTR4cYdzkGtuQqbzUA8+kaoYYO0RbK6g== - dependencies: - "@docsearch/react" "^3.8.1" - "@docusaurus/core" "3.7.0" - "@docusaurus/logger" "3.7.0" - "@docusaurus/plugin-content-docs" "3.7.0" - "@docusaurus/theme-common" "3.7.0" - "@docusaurus/theme-translations" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-validation" "3.7.0" +"@docusaurus/theme-search-algolia@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz#3aa3d99c35cc2d4b709fcddd4df875a9b536e29b" + integrity sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ== + dependencies: + "@docsearch/react" "^3.9.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/plugin-content-docs" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/theme-translations" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" algoliasearch "^5.17.1" algoliasearch-helper "^3.22.6" clsx "^2.0.0" @@ -2778,10 +2814,10 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.7.0.tgz#0891aedc7c7040afcb3a1b34051d3a69096d0d25" - integrity sha512-Ewq3bEraWDmienM6eaNK7fx+/lHMtGDHQyd1O+4+3EsDxxUmrzPkV7Ct3nBWTuE0MsoZr3yNwQVKjllzCMuU3g== +"@docusaurus/theme-translations@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz#4b1d76973eb53861e167c7723485e059ba4ffd0a" + integrity sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" @@ -2801,37 +2837,53 @@ webpack "^5.95.0" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.7.0.tgz#1bef52837d321db5dd2361fc07f3416193b5d029" - integrity sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA== +"@docusaurus/types@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.8.1.tgz#83ab66c345464e003b576a49f78897482061fc26" + integrity sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg== dependencies: - "@docusaurus/types" "3.7.0" + "@mdx-js/mdx" "^3.0.0" + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.9.2" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + utility-types "^3.10.0" + webpack "^5.95.0" + webpack-merge "^5.9.0" + +"@docusaurus/utils-common@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.8.1.tgz#c369b8c3041afb7dcd595d4172beb1cc1015c85f" + integrity sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg== + dependencies: + "@docusaurus/types" "3.8.1" tslib "^2.6.0" -"@docusaurus/utils-validation@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.7.0.tgz#dc0786fb633ae5cef8e93337bf21c2a826c7ecbd" - integrity sha512-w8eiKk8mRdN+bNfeZqC4nyFoxNyI1/VExMKAzD9tqpJfLLbsa46Wfn5wcKH761g9WkKh36RtFV49iL9lh1DYBA== +"@docusaurus/utils-validation@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz#0499c0d151a4098a0963237057993282cfbd538e" + integrity sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA== dependencies: - "@docusaurus/logger" "3.7.0" - "@docusaurus/utils" "3.7.0" - "@docusaurus/utils-common" "3.7.0" + "@docusaurus/logger" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" fs-extra "^11.2.0" joi "^17.9.2" js-yaml "^4.1.0" lodash "^4.17.21" tslib "^2.6.0" -"@docusaurus/utils@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.7.0.tgz#dfdebd63524c52b498f36b2907a3b2261930b9bb" - integrity sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA== +"@docusaurus/utils@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.8.1.tgz#2ac1e734106e2f73dbd0f6a8824d525f9064e9f0" + integrity sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ== dependencies: - "@docusaurus/logger" "3.7.0" - "@docusaurus/types" "3.7.0" - "@docusaurus/utils-common" "3.7.0" + "@docusaurus/logger" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-common" "3.8.1" escape-string-regexp "^4.0.0" + execa "5.1.1" file-loader "^6.2.0" fs-extra "^11.1.1" github-slugger "^1.5.0" @@ -2841,9 +2893,9 @@ js-yaml "^4.1.0" lodash "^4.17.21" micromatch "^4.0.5" + p-queue "^6.6.2" prompts "^2.4.2" resolve-pathname "^3.0.0" - shelljs "^0.8.5" tslib "^2.6.0" url-loader "^4.1.1" utility-types "^3.10.0" @@ -3322,7 +3374,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -3368,11 +3420,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - "@types/prismjs@^1.26.0": version "1.26.4" resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.4.tgz#1a9e1074619ce1d7322669e5b46fbe823925103a" @@ -3685,7 +3732,7 @@ acorn@^8.14.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== -address@^1.0.1, address@^1.1.2: +address@^1.0.1: version "1.2.2" resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== @@ -3705,7 +3752,7 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -3717,7 +3764,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.5: +ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3851,11 +3898,6 @@ astring@^1.8.0: resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - autoprefixer@^10.4.19: version "10.4.19" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" @@ -3868,6 +3910,18 @@ autoprefixer@^10.4.19: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autoprefixer@^10.4.21: + version "10.4.21" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" + integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== + dependencies: + browserslist "^4.24.4" + caniuse-lite "^1.0.30001702" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + babel-loader@^9.2.1: version "9.2.1" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" @@ -4014,7 +4068,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: +browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== @@ -4024,7 +4078,7 @@ browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^ node-releases "^2.0.14" update-browserslist-db "^1.0.13" -browserslist@^4.23.1, browserslist@^4.24.0, browserslist@^4.24.2: +browserslist@^4.24.0, browserslist@^4.24.2: version "4.24.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== @@ -4034,6 +4088,16 @@ browserslist@^4.23.1, browserslist@^4.24.0, browserslist@^4.24.2: node-releases "^2.0.18" update-browserslist-db "^1.1.1" +browserslist@^4.24.4, browserslist@^4.25.0: + version "4.25.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== + dependencies: + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -4121,6 +4185,11 @@ caniuse-lite@^1.0.30001669: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e" integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA== +caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726: + version "1.0.30001727" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" + integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== + ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" @@ -4135,7 +4204,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4198,7 +4267,7 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -4223,7 +4292,7 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -clean-css@^5.2.2, clean-css@^5.3.2, clean-css@~5.3.2: +clean-css@^5.2.2, clean-css@^5.3.3, clean-css@~5.3.2: version "5.3.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== @@ -4479,17 +4548,6 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" @@ -4528,16 +4586,16 @@ css-declaration-sorter@^7.2.0: resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== -css-has-pseudo@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz#adbb51821e51f7a7c1d2df4d12827870cc311137" - integrity sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg== +css-has-pseudo@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz#fb42e8de7371f2896961e1f6308f13c2c7019b72" + integrity sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ== dependencies: "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" postcss-value-parser "^4.2.0" -css-loader@^6.8.1: +css-loader@^6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== @@ -4611,10 +4669,10 @@ css-what@^6.0.1, css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssdb@^8.2.1: - version "8.2.1" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.2.1.tgz#62a5d9a41e2c86f1d7c35981098fc5ce47c5766c" - integrity sha512-KwEPys7lNsC8OjASI8RrmwOYYDcm0JOW9zQhcV83ejYcQkirTEyeAGui8aO2F5PiS6SLpxuTzl6qlMElIdsgIg== +cssdb@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.3.1.tgz#0ac96395b7092ffee14563e948cf43c2019b051e" + integrity sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ== cssesc@^3.0.0: version "3.0.0" @@ -4700,7 +4758,7 @@ debounce@^1.2.1: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9, debug@^2.6.0: +debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4733,7 +4791,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deepmerge@^4.2.2, deepmerge@^4.3.1: +deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -4773,20 +4831,6 @@ define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4812,14 +4856,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - detect-port@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" @@ -4964,6 +5000,11 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.777.tgz#f846fbba23fd11b3c6f97848cdda94896fdb8baf" integrity sha512-n02NCwLJ3wexLfK/yQeqfywCblZqLcXphzmid5e8yVPdtEcida7li0A5WQKghHNG0FeOMCzeFOzEbtAh5riXFw== +electron-to-chromium@^1.5.173: + version "1.5.183" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz#38c2e16910569b6c595bd16d1d39d1218bf0ffb6" + integrity sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA== + electron-to-chromium@^1.5.41: version "1.5.63" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz#69444d592fbbe628d129866c2355691ea93eda3e" @@ -5196,7 +5237,7 @@ eval@^0.1.8: "@types/node" "*" require-like ">= 0.1.1" -eventemitter3@^4.0.0: +eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -5206,7 +5247,7 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: +execa@5.1.1, execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -5339,11 +5380,6 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -5372,13 +5408,6 @@ find-cache-dir@^4.0.0: common-path-prefix "^3.0.0" pkg-dir "^7.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -5387,14 +5416,6 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" @@ -5413,25 +5434,6 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - form-data-encoder@^2.1.2: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" @@ -5466,16 +5468,6 @@ fs-extra@^11.1.1, fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-monkey@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" @@ -5546,7 +5538,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: +glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5565,28 +5557,12 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: +globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6015,24 +5991,17 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -image-size@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" - integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== +image-size@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-2.0.2.tgz#84a7b43704db5736f364bf0d1b029821299b4bdc" + integrity sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w== immutable@^4.0.0: version "4.3.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== -import-fresh@^3.1.0, import-fresh@^3.3.0: +import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6091,7 +6060,7 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -6106,11 +6075,6 @@ inline-style-parser@0.2.3: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.3.tgz#e35c5fb45f3a83ed7849fe487336eb7efa25971c" integrity sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g== -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -6237,11 +6201,6 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -6276,11 +6235,6 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -6505,19 +6459,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -6525,13 +6466,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - locate-path@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" @@ -6839,7 +6773,7 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.1.2, memfs@^3.4.3: +memfs@^3.4.3: version "3.6.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== @@ -7334,7 +7268,7 @@ mimic-response@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== -mini-css-extract-plugin@^2.9.1: +mini-css-extract-plugin@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== @@ -7347,7 +7281,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@3.1.2, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -7387,6 +7321,11 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -7442,6 +7381,11 @@ node-releases@^2.0.18: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + normalize-newline@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-newline/-/normalize-newline-3.0.0.tgz#1cbea804aba436001f83938ab21ec039d69ae9d3" @@ -7564,20 +7508,18 @@ p-cancelable@^3.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== -p-limit@^2.0.0, p-limit@^2.2.0: +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-limit@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" @@ -7585,13 +7527,6 @@ p-limit@^4.0.0: dependencies: yocto-queue "^1.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -7599,13 +7534,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - p-locate@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" @@ -7620,6 +7548,14 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" @@ -7628,6 +7564,13 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -7672,7 +7615,7 @@ parse-entities@^4.0.0: is-decimal "^2.0.0" is-hexadecimal "^2.0.0" -parse-json@^5.0.0, parse-json@^5.2.0: +parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -7715,11 +7658,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -7786,7 +7724,7 @@ picocolors@^1.0.0, picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picocolors@^1.1.0: +picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -7810,13 +7748,6 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - postcss-attribute-case-insensitive@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz#0c4500e3bcb2141848e89382c05b5a31c23033a3" @@ -7839,15 +7770,15 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz#d74c1e2294b72287eb9af079c04b7ddeff7ec5b3" - integrity sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA== +postcss-color-functional-notation@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz#f1e9c3e4371889dcdfeabfa8515464fd8338cedc" + integrity sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA== dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" postcss-color-hex-alpha@^10.0.0: @@ -7884,35 +7815,35 @@ postcss-convert-values@^6.1.0: browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-custom-media@^11.0.5: - version "11.0.5" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz#2fcd88a9b1d4da41c67dac6f2def903063a3377d" - integrity sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ== +postcss-custom-media@^11.0.6: + version "11.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz#6b450e5bfa209efb736830066682e6567bd04967" + integrity sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw== dependencies: - "@csstools/cascade-layer-name-parser" "^2.0.4" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/media-query-list-parser" "^4.0.2" + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" -postcss-custom-properties@^14.0.4: - version "14.0.4" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz#de9c663285a98833a946d7003a34369d3ce373a9" - integrity sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A== +postcss-custom-properties@^14.0.6: + version "14.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz#1af73a650bf115ba052cf915287c9982825fc90e" + integrity sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ== dependencies: - "@csstools/cascade-layer-name-parser" "^2.0.4" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -postcss-custom-selectors@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz#95ef8268fdbbbd84f34cf84a4517c9d99d419c5a" - integrity sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg== +postcss-custom-selectors@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz#9448ed37a12271d7ab6cb364b6f76a46a4a323e8" + integrity sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg== dependencies: - "@csstools/cascade-layer-name-parser" "^2.0.4" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" postcss-selector-parser "^7.0.0" postcss-dir-pseudo-class@^9.0.1: @@ -7949,12 +7880,12 @@ postcss-discard-unused@^6.0.5: dependencies: postcss-selector-parser "^6.0.16" -postcss-double-position-gradients@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz#eddd424ec754bb543d057d4d2180b1848095d4d2" - integrity sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg== +postcss-double-position-gradients@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz#185f8eab2db9cf4e34be69b5706c905895bb52ae" + integrity sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q== dependencies: - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" @@ -7990,18 +7921,18 @@ postcss-image-set-function@^7.0.0: "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -postcss-lab-function@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz#3121800fc7939ed1d9a1e87abeb33c407151252c" - integrity sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ== +postcss-lab-function@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz#0537bd7245b935fc133298c8896bcbd160540cae" + integrity sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ== dependencies: - "@csstools/css-color-parser" "^3.0.6" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" "@csstools/utilities" "^2.0.0" -postcss-loader@^7.3.3: +postcss-loader@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== @@ -8010,10 +7941,10 @@ postcss-loader@^7.3.3: jiti "^1.20.0" semver "^7.5.4" -postcss-logical@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-8.0.0.tgz#0db0b90c2dc53b485a8074a4b7a906297544f58d" - integrity sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg== +postcss-logical@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-8.1.0.tgz#4092b16b49e3ecda70c4d8945257da403d167228" + integrity sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA== dependencies: postcss-value-parser "^4.2.0" @@ -8103,12 +8034,12 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-13.0.1.tgz#c405796d7245a3e4c267a9956cacfe9670b5d43e" - integrity sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ== +postcss-nesting@^13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-13.0.2.tgz#fde0d4df772b76d03b52eccc84372e8d1ca1402e" + integrity sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ== dependencies: - "@csstools/selector-resolve-nested" "^3.0.0" + "@csstools/selector-resolve-nested" "^3.1.0" "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" @@ -8206,67 +8137,68 @@ postcss-place@^10.0.0: dependencies: postcss-value-parser "^4.2.0" -postcss-preset-env@^10.1.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz#6ee631272353fb1c4a9711943e9b80a178ffce44" - integrity sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ== - dependencies: - "@csstools/postcss-cascade-layers" "^5.0.1" - "@csstools/postcss-color-function" "^4.0.6" - "@csstools/postcss-color-mix-function" "^3.0.6" - "@csstools/postcss-content-alt-text" "^2.0.4" - "@csstools/postcss-exponential-functions" "^2.0.5" +postcss-preset-env@^10.2.1: + version "10.2.4" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz#17d386b5a86b136dfbca89b52ef03a95ad9e32fa" + integrity sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA== + dependencies: + "@csstools/postcss-cascade-layers" "^5.0.2" + "@csstools/postcss-color-function" "^4.0.10" + "@csstools/postcss-color-mix-function" "^3.0.10" + "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.0" + "@csstools/postcss-content-alt-text" "^2.0.6" + "@csstools/postcss-exponential-functions" "^2.0.9" "@csstools/postcss-font-format-keywords" "^4.0.0" - "@csstools/postcss-gamut-mapping" "^2.0.6" - "@csstools/postcss-gradients-interpolation-method" "^5.0.6" - "@csstools/postcss-hwb-function" "^4.0.6" - "@csstools/postcss-ic-unit" "^4.0.0" - "@csstools/postcss-initial" "^2.0.0" - "@csstools/postcss-is-pseudo-class" "^5.0.1" - "@csstools/postcss-light-dark-function" "^2.0.7" + "@csstools/postcss-gamut-mapping" "^2.0.10" + "@csstools/postcss-gradients-interpolation-method" "^5.0.10" + "@csstools/postcss-hwb-function" "^4.0.10" + "@csstools/postcss-ic-unit" "^4.0.2" + "@csstools/postcss-initial" "^2.0.1" + "@csstools/postcss-is-pseudo-class" "^5.0.3" + "@csstools/postcss-light-dark-function" "^2.0.9" "@csstools/postcss-logical-float-and-clear" "^3.0.0" "@csstools/postcss-logical-overflow" "^2.0.0" "@csstools/postcss-logical-overscroll-behavior" "^2.0.0" "@csstools/postcss-logical-resize" "^3.0.0" - "@csstools/postcss-logical-viewport-units" "^3.0.3" - "@csstools/postcss-media-minmax" "^2.0.5" - "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.4" + "@csstools/postcss-logical-viewport-units" "^3.0.4" + "@csstools/postcss-media-minmax" "^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5" "@csstools/postcss-nested-calc" "^4.0.0" "@csstools/postcss-normalize-display-values" "^4.0.0" - "@csstools/postcss-oklab-function" "^4.0.6" - "@csstools/postcss-progressive-custom-properties" "^4.0.0" - "@csstools/postcss-random-function" "^1.0.1" - "@csstools/postcss-relative-color-syntax" "^3.0.6" + "@csstools/postcss-oklab-function" "^4.0.10" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-random-function" "^2.0.1" + "@csstools/postcss-relative-color-syntax" "^3.0.10" "@csstools/postcss-scope-pseudo-class" "^4.0.1" - "@csstools/postcss-sign-functions" "^1.1.0" - "@csstools/postcss-stepped-value-functions" "^4.0.5" - "@csstools/postcss-text-decoration-shorthand" "^4.0.1" - "@csstools/postcss-trigonometric-functions" "^4.0.5" + "@csstools/postcss-sign-functions" "^1.1.4" + "@csstools/postcss-stepped-value-functions" "^4.0.9" + "@csstools/postcss-text-decoration-shorthand" "^4.0.2" + "@csstools/postcss-trigonometric-functions" "^4.0.9" "@csstools/postcss-unset-value" "^4.0.0" - autoprefixer "^10.4.19" - browserslist "^4.23.1" + autoprefixer "^10.4.21" + browserslist "^4.25.0" css-blank-pseudo "^7.0.1" - css-has-pseudo "^7.0.1" + css-has-pseudo "^7.0.2" css-prefers-color-scheme "^10.0.0" - cssdb "^8.2.1" + cssdb "^8.3.0" postcss-attribute-case-insensitive "^7.0.1" postcss-clamp "^4.1.0" - postcss-color-functional-notation "^7.0.6" + postcss-color-functional-notation "^7.0.10" postcss-color-hex-alpha "^10.0.0" postcss-color-rebeccapurple "^10.0.0" - postcss-custom-media "^11.0.5" - postcss-custom-properties "^14.0.4" - postcss-custom-selectors "^8.0.4" + postcss-custom-media "^11.0.6" + postcss-custom-properties "^14.0.6" + postcss-custom-selectors "^8.0.5" postcss-dir-pseudo-class "^9.0.1" - postcss-double-position-gradients "^6.0.0" + postcss-double-position-gradients "^6.0.2" postcss-focus-visible "^10.0.1" postcss-focus-within "^9.0.1" postcss-font-variant "^5.0.0" postcss-gap-properties "^6.0.0" postcss-image-set-function "^7.0.0" - postcss-lab-function "^7.0.6" - postcss-logical "^8.0.0" - postcss-nesting "^13.0.1" + postcss-lab-function "^7.0.10" + postcss-logical "^8.1.0" + postcss-nesting "^13.0.2" postcss-opacity-percentage "^3.0.0" postcss-overflow-shorthand "^6.0.0" postcss-page-break "^3.0.4" @@ -8364,7 +8296,7 @@ postcss-zindex@^6.0.2: resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-6.0.2.tgz#e498304b83a8b165755f53db40e2ea65a99b56e1" integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== -postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.33, postcss@^8.4.38: +postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -8373,6 +8305,15 @@ postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.33, postcss@^8.4 picocolors "^1.0.0" source-map-js "^1.2.0" +postcss@^8.5.4: + version "8.5.6" + resolved "https://registry.yarnpkg.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" + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -8463,13 +8404,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -8512,36 +8446,6 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - react-dom@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" @@ -8550,11 +8454,6 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.2" -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - react-fast-compare@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" @@ -8576,10 +8475,10 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-json-view-lite@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz#0ff493245f4550abe5e1f1836f170fa70bb95914" - integrity sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA== +react-json-view-lite@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz#0d06696a06aaf4a74e890302b76cf8cddcc45d60" + integrity sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA== react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" @@ -8666,18 +8565,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - rechoir@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" @@ -8685,13 +8572,6 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - regenerate-unicode-properties@^10.1.0: version "10.1.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" @@ -8933,7 +8813,7 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.9.0: +resolve@^1.14.2, resolve@^1.9.0: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -9030,14 +8910,10 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" +schema-dts@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/schema-dts/-/schema-dts-1.1.5.tgz#9237725d305bac3469f02b292a035107595dc324" + integrity sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg== schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" @@ -9204,20 +9080,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3, shell-quote@^1.8.1: +shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - side-channel@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -9301,6 +9168,11 @@ sort-css-media-queries@2.2.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +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== + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -9521,11 +9393,6 @@ svgo@^3.0.2, svgo@^3.2.0: csso "^5.0.5" picocolors "^1.0.0" -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -9552,11 +9419,6 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: commander "^2.20.0" source-map-support "~0.5.20" -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== - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -9572,6 +9434,11 @@ tiny-warning@^1.0.0: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinypool@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -9771,6 +9638,14 @@ update-browserslist-db@^1.1.1: escalade "^3.2.0" picocolors "^1.1.0" +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + update-notifier@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" @@ -10080,13 +9955,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -10166,16 +10034,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"