diff --git a/.nvmrc b/.nvmrc index e6db45a907..6d80269a4f 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.14.0 +18.16.0 diff --git a/Dockerfile b/Dockerfile index e9fd196a45..50e3bff8c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,7 @@ RUN dnf install -y epel-release && \ xz RUN mkdir -p /usr/local/nvm ENV NVM_DIR=/usr/local/nvm -ENV NODE_VERSION=18.14.0 +ENV NODE_VERSION=18.16.0 RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash && \ . "$NVM_DIR/nvm.sh" && \ nvm install v${NODE_VERSION} && \ diff --git a/doc/url_parameters.md b/doc/url_parameters.md index df9336c4d8..10f45ae786 100644 --- a/doc/url_parameters.md +++ b/doc/url_parameters.md @@ -25,6 +25,7 @@ | `efc` | string | `id,id,id` | The event category ids for each category to be included in an event API request. | | `s` | string | *`coordinates`* | A pair of coordinates using Decimal Degrees format (`DDD.DDDD,DDD.DDDD`) to add a Location Search marker onto the map. To add more than one Location Search marker, separate coordinate pairs with a plus symbol. (`DDD.DDDD,DDD.DDDD+DDD.DDDD,DDD.DDDD`)| | `ab` | boolean | **`on`** | If set to "on", the animation widget will be shown. | +| `aa` | boolean | **`false`** | If set to "true", the animation will play on load. NOTE: The URL also requires valid animation parameters (ab, av, etc.). | | `as` | date | *`YYYY-MM-DDThh:mm:ssZ`* | The animation start day & time.\*\* | | `ae` | date | *`YYYY-MM-DDThh:mm:ssZ`* | The animation end day & time.\*\* | | `av` | number | `1` to `10` | The animation speed value from 1 to 10. 1 = slowest, 10 = fastest. | diff --git a/package-lock.json b/package-lock.json index 89301164e3..b5d11cb734 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "worldview", - "version": "4.4.0", + "version": "4.5.0c", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "worldview", - "version": "4.4.0", + "version": "4.5.0c", "hasInstallScript": true, "license": "NASA-1.3", "dependencies": { - "@elastic/react-search-ui": "^1.19.1", - "@elastic/react-search-ui-views": "^1.19.1", + "@elastic/react-search-ui": "^1.20.2", + "@elastic/react-search-ui-views": "^1.20.2", "@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.4.0", "@fortawesome/free-solid-svg-icons": "^6.4.0", @@ -51,7 +51,7 @@ "react-draggable": "^4.4.5", "react-image-crop": "^10.0.9", "react-infinite-scroller": "^1.2.6", - "react-joyride": "^2.5.3", + "react-joyride": "^2.5.4", "react-mobile-datepicker": "^4.0.2", "react-redux": "^8.0.5", "react-resizable": "^3.0.5", @@ -66,21 +66,21 @@ "reselect": "^4.1.8", "rgbcolor": "^1.0.1", "simplebar": "^6.2.5", - "simplebar-react": "^3.2.3", + "simplebar-react": "^3.2.4", "stackblur": "^1.0.0", - "supercluster": "^7.1.5", + "supercluster": "^8.0.1", "url-template": "^3.1.0", "what-input": "^5.2.12" }, "devDependencies": { - "@babel/core": "^7.21.4", - "@babel/eslint-parser": "^7.21.3", + "@babel/core": "^7.21.8", + "@babel/eslint-parser": "^7.21.8", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.21.4", + "@babel/preset-env": "^7.21.5", "@babel/preset-react": "^7.18.6", "@playwright/test": "^1.33.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", - "@webpack-cli/serve": "^2.0.2", + "@webpack-cli/serve": "^2.0.4", "ajv": "^8.12.0", "autoprefixer": "^10.4.14", "axios": "^1.4.0", @@ -91,8 +91,8 @@ "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^5.0.0", "css-url-relative-plugin": "^1.1.0", - "cssnano": "^6.0.0", - "eslint": "^8.39.0", + "cssnano": "^6.0.1", + "eslint": "^8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-standard": "^17.0.0", "eslint-import-resolver-webpack": "^0.13.2", @@ -108,7 +108,7 @@ "express": "^4.18.2", "fetch-mock": "^9.11.0", "geckodriver": "^3.2.0", - "glob": "^10.2.2", + "glob": "^10.2.3", "husky": "^8.0.3", "jest": "^29.5.0", "jest-canvas-mock": "^2.5.0", @@ -129,19 +129,19 @@ "sass-loader": "^13.2.2", "shelljs": "^0.8.5", "showdown": "^2.1.0", - "stylelint": "^15.6.0", + "stylelint": "^15.6.1", "stylelint-config-standard-scss": "^9.0.0", "stylelint-high-performance-animation": "^1.8.0", - "tar": "^6.1.13", - "terser-webpack-plugin": "^5.3.7", - "webpack": "^5.80.0", + "tar": "^6.1.14", + "terser-webpack-plugin": "^5.3.8", + "webpack": "^5.82.1", "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^5.0.2", - "webpack-dev-middleware": "^6.0.2", - "webpack-dev-server": "^4.13.3", + "webpack-dev-middleware": "^6.1.0", + "webpack-dev-server": "^4.15.0", "xml-js": "^1.6.11", "xml2js": "^0.5.0", - "yargs": "^17.7.1" + "yargs": "^17.7.2" }, "engines": { "node": ">= 18" @@ -171,30 +171,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -210,9 +210,10 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.21.3", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", + "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==", "dev": true, - "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -227,12 +228,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -278,12 +279,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", + "@babel/compat-data": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -363,9 +364,10 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -417,28 +419,30 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "license": "MIT", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -456,9 +460,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -497,11 +502,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -530,8 +536,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "engines": { "node": ">=6.9.0" } @@ -567,13 +574,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -592,9 +600,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1100,11 +1108,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1182,11 +1191,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/template": "^7.20.7" }, "engines": { @@ -1256,12 +1266,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1330,14 +1340,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1513,11 +1523,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "regenerator-transform": "^0.15.1" }, "engines": { @@ -1613,11 +1624,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1642,14 +1654,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", + "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/compat-data": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", @@ -1674,6 +1686,7 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@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", @@ -1683,22 +1696,22 @@ "@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.20.7", + "@babel/plugin-transform-arrow-functions": "^7.21.5", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-computed-properties": "^7.21.5", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", + "@babel/plugin-transform-for-of": "^7.21.5", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", @@ -1706,17 +1719,17 @@ "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", + "@babel/plugin-transform-regenerator": "^7.21.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-escapes": "^7.21.5", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1793,19 +1806,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1814,11 +1827,11 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -1924,11 +1937,12 @@ } }, "node_modules/@elastic/react-search-ui": { - "version": "1.19.1", - "license": "Apache-2.0", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@elastic/react-search-ui/-/react-search-ui-1.20.2.tgz", + "integrity": "sha512-riVo1Dja4TpI3WFuQVQUmMiRPSV+nAxdkF05UCA/4H5P2IAqzrRjEw4jVpR4vcj+4gAHJcLppYwmtjcn3h1dKw==", "dependencies": { - "@elastic/react-search-ui-views": "1.19.1", - "@elastic/search-ui": "1.19.1" + "@elastic/react-search-ui-views": "1.20.2", + "@elastic/search-ui": "1.20.2" }, "peerDependencies": { "react": ">= 16.8.0 <= 18", @@ -1936,11 +1950,11 @@ } }, "node_modules/@elastic/react-search-ui-views": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@elastic/react-search-ui-views/-/react-search-ui-views-1.19.1.tgz", - "integrity": "sha512-1IOVoG5GYKvrKoYZL247bd7eKVQAR4iJaYBkA4KOa8CEXdc3+N0Z63uAit+4+pAH6Z6IONNwk2iQPMDf2zjQGA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@elastic/react-search-ui-views/-/react-search-ui-views-1.20.2.tgz", + "integrity": "sha512-nx2XOxQ9ONIrd9MhJ1/z0p7AXYYXUr4Tqx8TPUqQd6m/yTa55qrCdEcBm59+MGSBFtVCRsix8KBMiOij+/afxQ==", "dependencies": { - "@elastic/search-ui": "1.19.1", + "@elastic/search-ui": "1.20.2", "downshift": "^3.2.10", "rc-pagination": "^1.20.1", "react-select": "^5.0.0" @@ -1951,8 +1965,9 @@ } }, "node_modules/@elastic/search-ui": { - "version": "1.19.1", - "license": "Apache-2.0", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@elastic/search-ui/-/search-ui-1.20.2.tgz", + "integrity": "sha512-48O0jKeMbhohxnVB6oOxT5R+x4nrwG0UWvFTCWPZJ4hKCLsPZZOWIFHziMaxhR8f0ckZCoiif+eD6FAgDW6kwA==", "dependencies": { "date-fns": "^1.30.1", "deep-equal": "^1.0.1", @@ -2115,12 +2130,13 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "license": "MIT", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2137,7 +2153,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2151,7 +2168,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.20.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2164,11 +2182,13 @@ }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" }, @@ -2177,9 +2197,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2303,6 +2323,96 @@ "version": "1.2.1", "license": "BSD-3-Clause" }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "dev": true, @@ -3037,16 +3147,18 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "license": "MIT", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "license": "MIT", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3575,12 +3687,14 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.192", - "license": "MIT" + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" }, "node_modules/@types/lodash-es": { "version": "4.17.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", + "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "dependencies": { "@types/lodash": "*" } @@ -4030,9 +4144,10 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "2.0.1", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", + "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -4054,9 +4169,9 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz", - "integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", + "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", "dev": true, "engines": { "node": ">=14.15.0" @@ -4114,7 +4229,8 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -5969,12 +6085,12 @@ "license": "MIT" }, "node_modules/cssnano": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.0.tgz", - "integrity": "sha512-RGlcbzGhzEBCHuQe3k+Udyj5M00z0pm9S+VurHXFEOXxH+y0sVrJH2sMzoyz2d8N1EScazg+DVvmgyx0lurwwA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dev": true, "dependencies": { - "cssnano-preset-default": "^6.0.0", + "cssnano-preset-default": "^6.0.1", "lilconfig": "^2.1.0" }, "engines": { @@ -5989,14 +6105,14 @@ } }, "node_modules/cssnano-preset-default": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.0.tgz", - "integrity": "sha512-BDxlaFzObRDXUiCCBQUNQcI+f1/aX2mgoNtXGjV6PG64POcHoDUoX+LgMWw+Q4609QhxwkcSnS65YFs42RA6qQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^4.0.0", - "postcss-calc": "^8.2.3", + "postcss-calc": "^9.0.0", "postcss-colormin": "^6.0.0", "postcss-convert-values": "^6.0.0", "postcss-discard-comments": "^6.0.0", @@ -6004,7 +6120,7 @@ "postcss-discard-empty": "^6.0.0", "postcss-discard-overridden": "^6.0.0", "postcss-merge-longhand": "^6.0.0", - "postcss-merge-rules": "^6.0.0", + "postcss-merge-rules": "^6.0.1", "postcss-minify-font-values": "^6.0.0", "postcss-minify-gradients": "^6.0.0", "postcss-minify-params": "^6.0.0", @@ -6246,8 +6362,9 @@ "license": "MIT" }, "node_modules/deepmerge": { - "version": "4.2.2", - "license": "MIT", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } @@ -6364,12 +6481,6 @@ "node": ">=8" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, "node_modules/dns-equal": { "version": "1.0.0", "dev": true, @@ -6495,6 +6606,12 @@ "version": "2.2.4", "license": "ISC" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ee-first": { "version": "1.1.1", "dev": true, @@ -6813,14 +6930,14 @@ } }, "node_modules/eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -6831,8 +6948,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7480,8 +7597,9 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "license": "Apache-2.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7544,12 +7662,13 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "license": "BSD-2-Clause", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7559,8 +7678,9 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "license": "Apache-2.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -8102,18 +8222,6 @@ "version": "1.0.0", "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "license": "MIT" @@ -8207,10 +8315,6 @@ "node": ">=10.19" } }, - "node_modules/geotiff/node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, "node_modules/geotiff/node_modules/quick-lru": { "version": "6.1.1", "license": "MIT", @@ -8296,9 +8400,9 @@ } }, "node_modules/glob": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", - "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", + "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -9494,12 +9598,12 @@ } }, "node_modules/jackspeak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.1.0.tgz", - "integrity": "sha512-DiEwVPqsieUzZBNxQ2cxznmFzfg/AMgJUjYw5xl6rSmCxAQXECcbSdwcLM6Ds6T09+SBfSNCGPhYUoQ96P4h7A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", + "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", "dev": true, "dependencies": { - "cliui": "^7.0.4" + "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" @@ -9511,17 +9615,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jackspeak/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/jest": { "version": "29.5.0", "dev": true, @@ -11321,8 +11414,9 @@ } }, "node_modules/kdbush": { - "version": "3.0.0", - "license": "ISC" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" }, "node_modules/keyv": { "version": "4.5.2", @@ -11490,7 +11584,8 @@ }, "node_modules/lodash-es": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -12591,6 +12686,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "node_modules/parent-module": { "version": "1.0.1", "license": "MIT", @@ -13088,14 +13188,17 @@ } }, "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, "peerDependencies": { "postcss": "^8.2.2" } @@ -13284,9 +13387,9 @@ } }, "node_modules/postcss-merge-rules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.0.tgz", - "integrity": "sha512-rCXkklftzEkniyv3f4mRCQzxD6oE4Quyh61uyWTUbCJ26Pv2hoz+fivJSsSBWxDBeScR4fKCfF3HHTcD7Ybqnw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -13643,9 +13746,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14081,10 +14185,11 @@ "license": "MIT" }, "node_modules/react-joyride": { - "version": "2.5.3", - "license": "MIT", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.5.4.tgz", + "integrity": "sha512-CLV1Ju79iRKIP/KqsEX05nSxMBzT41BhPAyNrTdBQWEYAkpyo6iiCPelk6No2W8iPgw373JKk2cK7AQ5Q3lFew==", "dependencies": { - "deepmerge": "^4.2.2", + "deepmerge": "^4.3.1", "exenv": "^1.2.2", "is-lite": "^0.9.2", "prop-types": "^15.8.1", @@ -14618,8 +14723,9 @@ }, "node_modules/regenerator-transform": { "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -15323,11 +15429,11 @@ } }, "node_modules/simplebar-react": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.3.tgz", - "integrity": "sha512-GjbACC7KlDUlfIZSbLf7K4FQcHW4rS0OFAAs6YvJpHUsOZ5DtIzg1WD4Uv+nO8wfQLFXMyFHDVk0jm15APFRNA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.4.tgz", + "integrity": "sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==", "dependencies": { - "simplebar-core": "^1.2.3" + "simplebar-core": "^1.2.4" }, "peerDependencies": { "react": ">=16.8.0" @@ -15460,7 +15566,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15468,7 +15575,8 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } @@ -15662,6 +15770,27 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/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==", + "dev": true + }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "dev": true, @@ -15737,6 +15866,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "dev": true, @@ -15796,9 +15938,9 @@ } }, "node_modules/stylelint": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.0.tgz", - "integrity": "sha512-Cqzpc8tvJm77KaM8qUbhpJ/UYK55Ia0whQXj4b9IId9dlPICO7J8Lyo15SZWiHxKjlvy3p5FQor/3n6i8ignXg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.1.tgz", + "integrity": "sha512-d8icFBlVl93Elf3Z5ABQNOCe4nx69is3D/NZhDLAie1eyYnpxfeKe7pCfqzT5W4F8vxHCLSDfV8nKNJzogvV2Q==", "dev": true, "dependencies": { "@csstools/css-parser-algorithms": "^2.1.1", @@ -15828,11 +15970,11 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.22", + "postcss": "^8.4.23", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "postcss-selector-parser": "^6.0.12", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", @@ -15842,7 +15984,7 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^5.0.0" + "write-file-atomic": "^5.0.1" }, "bin": { "stylelint": "bin/stylelint.js" @@ -15927,12 +16069,11 @@ } }, "node_modules/stylelint-scss": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.6.0.tgz", - "integrity": "sha512-M+E0BQim6G4XEkaceEhfVjP/41C9Klg5/tTPTCQVlgw/jm2tvB+OXJGaU0TDP5rnTCB62aX6w+rT+gqJW/uwjA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", + "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", "dev": true, "dependencies": { - "dlv": "^1.1.3", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-selector-parser": "^6.0.11", @@ -15991,14 +16132,26 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/stylelint/node_modules/write-file-atomic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", - "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -16010,11 +16163,11 @@ "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" }, "node_modules/supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", "dependencies": { - "kdbush": "^3.0.0" + "kdbush": "^4.0.2" } }, "node_modules/supports-color": { @@ -16128,13 +16281,14 @@ } }, "node_modules/tar": { - "version": "6.1.13", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", + "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", "dev": true, - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -16144,16 +16298,18 @@ } }, "node_modules/tar/node_modules/minipass": { - "version": "4.0.3", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/terser": { - "version": "5.16.6", - "license": "BSD-2-Clause", + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", + "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -16168,14 +16324,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "license": "MIT", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -16233,7 +16390,8 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/test-exclude": { "version": "6.0.0", @@ -16821,9 +16979,9 @@ } }, "node_modules/webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.82.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", + "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -16834,7 +16992,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -16954,15 +17112,15 @@ } }, "node_modules/webpack-cli": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", - "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.0.tgz", + "integrity": "sha512-a7KRJnCxejFoDpYTOwzm5o21ZXMaNqtRlvS183XzGDUPRdVEzJNImcQokqYZ8BNTnk9DkKiuWxw75+DCCoZ26w==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/configtest": "^2.1.0", "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.2", + "@webpack-cli/serve": "^2.0.3", "colorette": "^2.0.14", "commander": "^10.0.1", "cross-spawn": "^7.0.3", @@ -17027,9 +17185,10 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.0.2", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.0.tgz", + "integrity": "sha512-H7I+YAlKeKwMK0IidkwqpunHhYc/LKJlh5UxCdaLgkhIqwUfebP4rrC131+ddcCZ7LBDBMV9+bkisdbR4zhKhw==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.12", @@ -17072,9 +17231,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.13.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", - "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -17241,9 +17400,9 @@ } }, "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -17423,6 +17582,57 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -17559,9 +17769,10 @@ } }, "node_modules/yargs": { - "version": "17.7.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -17621,27 +17832,27 @@ } }, "@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", "dev": true }, "@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -17650,7 +17861,9 @@ } }, "@babel/eslint-parser": { - "version": "7.21.3", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", + "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -17659,12 +17872,12 @@ } }, "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dev": true, "requires": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -17697,12 +17910,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.4", + "@babel/compat-data": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -17759,7 +17972,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true }, "@babel/helper-explode-assignable-expression": { @@ -17794,23 +18009,27 @@ } }, "@babel/helper-module-imports": { - "version": "7.18.6", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { - "version": "7.21.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/helper-optimise-call-expression": { @@ -17821,7 +18040,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -17847,10 +18068,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.20.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -17868,7 +18091,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.19.4" + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==" }, "@babel/helper-validator-identifier": { "version": "7.19.1" @@ -17890,12 +18115,14 @@ } }, "@babel/helpers": { - "version": "7.21.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, "requires": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/highlight": { @@ -17907,9 +18134,9 @@ } }, "@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -18201,10 +18428,12 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-async-to-generator": { @@ -18250,10 +18479,12 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/template": "^7.20.7" } }, @@ -18290,12 +18521,12 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-function-name": { @@ -18330,14 +18561,14 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" } }, "@babel/plugin-transform-modules-systemjs": { @@ -18431,10 +18662,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.20.5", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "regenerator-transform": "^0.15.1" } }, @@ -18482,10 +18715,12 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-unicode-regex": { @@ -18497,14 +18732,14 @@ } }, "@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", + "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/compat-data": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", @@ -18529,6 +18764,7 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@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", @@ -18538,22 +18774,22 @@ "@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.20.7", + "@babel/plugin-transform-arrow-functions": "^7.21.5", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-computed-properties": "^7.21.5", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", + "@babel/plugin-transform-for-of": "^7.21.5", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", @@ -18561,17 +18797,17 @@ "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", + "@babel/plugin-transform-regenerator": "^7.21.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-escapes": "^7.21.5", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -18622,29 +18858,29 @@ } }, "@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, "requires": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "requires": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } @@ -18704,25 +18940,29 @@ "dev": true }, "@elastic/react-search-ui": { - "version": "1.19.1", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@elastic/react-search-ui/-/react-search-ui-1.20.2.tgz", + "integrity": "sha512-riVo1Dja4TpI3WFuQVQUmMiRPSV+nAxdkF05UCA/4H5P2IAqzrRjEw4jVpR4vcj+4gAHJcLppYwmtjcn3h1dKw==", "requires": { - "@elastic/react-search-ui-views": "1.19.1", - "@elastic/search-ui": "1.19.1" + "@elastic/react-search-ui-views": "1.20.2", + "@elastic/search-ui": "1.20.2" } }, "@elastic/react-search-ui-views": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@elastic/react-search-ui-views/-/react-search-ui-views-1.19.1.tgz", - "integrity": "sha512-1IOVoG5GYKvrKoYZL247bd7eKVQAR4iJaYBkA4KOa8CEXdc3+N0Z63uAit+4+pAH6Z6IONNwk2iQPMDf2zjQGA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@elastic/react-search-ui-views/-/react-search-ui-views-1.20.2.tgz", + "integrity": "sha512-nx2XOxQ9ONIrd9MhJ1/z0p7AXYYXUr4Tqx8TPUqQd6m/yTa55qrCdEcBm59+MGSBFtVCRsix8KBMiOij+/afxQ==", "requires": { - "@elastic/search-ui": "1.19.1", + "@elastic/search-ui": "1.20.2", "downshift": "^3.2.10", "rc-pagination": "^1.20.1", "react-select": "^5.0.0" } }, "@elastic/search-ui": { - "version": "1.19.1", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@elastic/search-ui/-/search-ui-1.20.2.tgz", + "integrity": "sha512-48O0jKeMbhohxnVB6oOxT5R+x4nrwG0UWvFTCWPZJ4hKCLsPZZOWIFHziMaxhR8f0ckZCoiif+eD6FAgDW6kwA==", "requires": { "date-fns": "^1.30.1", "deep-equal": "^1.0.1", @@ -18860,11 +19100,13 @@ "version": "4.4.0" }, "@eslint/eslintrc": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -18875,6 +19117,8 @@ "dependencies": { "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", @@ -18884,22 +19128,28 @@ }, "globals": { "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "requires": { "type-fest": "^0.20.2" } }, "json-schema-traverse": { - "version": "0.4.1" + "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==" }, "type-fest": { - "version": "0.20.2" + "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==" } } }, "@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==" + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==" }, "@floating-ui/core": { "version": "1.2.6", @@ -18984,6 +19234,65 @@ "@humanwhocodes/object-schema": { "version": "1.2.1" }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "dev": true, @@ -19467,14 +19776,18 @@ "version": "1.1.0" }, "@jridgewell/source-map": { - "version": "0.3.2", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.2", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -19870,10 +20183,14 @@ } }, "@types/lodash": { - "version": "4.14.192" + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" }, "@types/lodash-es": { "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", + "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "requires": { "@types/lodash": "*" } @@ -20228,7 +20545,9 @@ } }, "@webpack-cli/configtest": { - "version": "2.0.1", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", + "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", "dev": true, "requires": {} }, @@ -20238,9 +20557,9 @@ "requires": {} }, "@webpack-cli/serve": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz", - "integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", + "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", "dev": true, "requires": {} }, @@ -20274,6 +20593,8 @@ }, "acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "requires": {} }, "acorn-walk": { @@ -21461,24 +21782,24 @@ "dev": true }, "cssnano": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.0.tgz", - "integrity": "sha512-RGlcbzGhzEBCHuQe3k+Udyj5M00z0pm9S+VurHXFEOXxH+y0sVrJH2sMzoyz2d8N1EScazg+DVvmgyx0lurwwA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dev": true, "requires": { - "cssnano-preset-default": "^6.0.0", + "cssnano-preset-default": "^6.0.1", "lilconfig": "^2.1.0" } }, "cssnano-preset-default": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.0.tgz", - "integrity": "sha512-BDxlaFzObRDXUiCCBQUNQcI+f1/aX2mgoNtXGjV6PG64POcHoDUoX+LgMWw+Q4609QhxwkcSnS65YFs42RA6qQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dev": true, "requires": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^4.0.0", - "postcss-calc": "^8.2.3", + "postcss-calc": "^9.0.0", "postcss-colormin": "^6.0.0", "postcss-convert-values": "^6.0.0", "postcss-discard-comments": "^6.0.0", @@ -21486,7 +21807,7 @@ "postcss-discard-empty": "^6.0.0", "postcss-discard-overridden": "^6.0.0", "postcss-merge-longhand": "^6.0.0", - "postcss-merge-rules": "^6.0.0", + "postcss-merge-rules": "^6.0.1", "postcss-minify-font-values": "^6.0.0", "postcss-minify-gradients": "^6.0.0", "postcss-minify-params": "^6.0.0", @@ -21658,7 +21979,9 @@ "version": "0.1.4" }, "deepmerge": { - "version": "4.2.2" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, "default-gateway": { "version": "6.0.3", @@ -21723,12 +22046,6 @@ "path-type": "^4.0.0" } }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, "dns-equal": { "version": "1.0.0", "dev": true @@ -21814,6 +22131,12 @@ "earcut": { "version": "2.2.4" }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ee-first": { "version": "1.1.1", "dev": true @@ -22035,14 +22358,14 @@ } }, "eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -22053,8 +22376,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -22125,7 +22448,9 @@ } }, "eslint-visitor-keys": { - "version": "3.4.0" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" }, "glob-parent": { "version": "6.0.2", @@ -22468,15 +22793,19 @@ "dev": true }, "espree": { - "version": "9.5.1", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.4.0" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" } } }, @@ -22822,11 +23151,6 @@ "fs.realpath": { "version": "1.0.0" }, - "fsevents": { - "version": "2.3.2", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1" }, @@ -22891,9 +23215,6 @@ "xml-utils": "^1.0.2" }, "dependencies": { - "pako": { - "version": "2.1.0" - }, "quick-lru": { "version": "6.1.1" } @@ -22944,9 +23265,9 @@ } }, "glob": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", - "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", + "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", "dev": true, "requires": { "foreground-child": "^3.1.0", @@ -23659,26 +23980,13 @@ } }, "jackspeak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.1.0.tgz", - "integrity": "sha512-DiEwVPqsieUzZBNxQ2cxznmFzfg/AMgJUjYw5xl6rSmCxAQXECcbSdwcLM6Ds6T09+SBfSNCGPhYUoQ96P4h7A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", + "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", "dev": true, "requires": { - "@pkgjs/parseargs": "^0.11.0", - "cliui": "^7.0.4" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - } + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" } }, "jest": { @@ -24833,7 +25141,9 @@ } }, "kdbush": { - "version": "3.0.0" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" }, "keyv": { "version": "4.5.2", @@ -24949,7 +25259,9 @@ "version": "4.17.21" }, "lodash-es": { - "version": "4.17.21" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.debounce": { "version": "4.0.8", @@ -25644,6 +25956,11 @@ "version": "2.2.0", "dev": true }, + "pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "parent-module": { "version": "1.0.1", "requires": { @@ -25944,12 +26261,12 @@ } }, "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" } }, @@ -26057,9 +26374,9 @@ } }, "postcss-merge-rules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.0.tgz", - "integrity": "sha512-rCXkklftzEkniyv3f4mRCQzxD6oE4Quyh61uyWTUbCJ26Pv2hoz+fivJSsSBWxDBeScR4fKCfF3HHTcD7Ybqnw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dev": true, "requires": { "browserslist": "^4.21.4", @@ -26262,7 +26579,9 @@ "requires": {} }, "postcss-selector-parser": { - "version": "6.0.11", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -26555,9 +26874,11 @@ "version": "16.13.1" }, "react-joyride": { - "version": "2.5.3", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.5.4.tgz", + "integrity": "sha512-CLV1Ju79iRKIP/KqsEX05nSxMBzT41BhPAyNrTdBQWEYAkpyo6iiCPelk6No2W8iPgw373JKk2cK7AQ5Q3lFew==", "requires": { - "deepmerge": "^4.2.2", + "deepmerge": "^4.3.1", "exenv": "^1.2.2", "is-lite": "^0.9.2", "prop-types": "^15.8.1", @@ -26930,6 +27251,8 @@ }, "regenerator-transform": { "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -27392,11 +27715,11 @@ } }, "simplebar-react": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.3.tgz", - "integrity": "sha512-GjbACC7KlDUlfIZSbLf7K4FQcHW4rS0OFAAs6YvJpHUsOZ5DtIzg1WD4Uv+nO8wfQLFXMyFHDVk0jm15APFRNA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.4.tgz", + "integrity": "sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==", "requires": { - "simplebar-core": "^1.2.3" + "simplebar-core": "^1.2.4" } }, "sirv": { @@ -27482,13 +27805,17 @@ }, "source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -27631,6 +27958,25 @@ } } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, "string.prototype.matchall": { "version": "4.0.8", "dev": true, @@ -27678,6 +28024,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-bom": { "version": "4.0.0", "dev": true @@ -27711,9 +28066,9 @@ } }, "stylelint": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.0.tgz", - "integrity": "sha512-Cqzpc8tvJm77KaM8qUbhpJ/UYK55Ia0whQXj4b9IId9dlPICO7J8Lyo15SZWiHxKjlvy3p5FQor/3n6i8ignXg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.1.tgz", + "integrity": "sha512-d8icFBlVl93Elf3Z5ABQNOCe4nx69is3D/NZhDLAie1eyYnpxfeKe7pCfqzT5W4F8vxHCLSDfV8nKNJzogvV2Q==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^2.1.1", @@ -27743,11 +28098,11 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.22", + "postcss": "^8.4.23", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "postcss-selector-parser": "^6.0.12", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", @@ -27757,7 +28112,7 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^5.0.0" + "write-file-atomic": "^5.0.1" }, "dependencies": { "balanced-match": { @@ -27792,14 +28147,20 @@ "version": "5.0.0", "dev": true }, + "signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true + }, "write-file-atomic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", - "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" } } } @@ -27849,12 +28210,11 @@ } }, "stylelint-scss": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.6.0.tgz", - "integrity": "sha512-M+E0BQim6G4XEkaceEhfVjP/41C9Klg5/tTPTCQVlgw/jm2tvB+OXJGaU0TDP5rnTCB62aX6w+rT+gqJW/uwjA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", + "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", "dev": true, "requires": { - "dlv": "^1.1.3", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-selector-parser": "^6.0.11", @@ -27867,11 +28227,11 @@ "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" }, "supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", "requires": { - "kdbush": "^3.0.0" + "kdbush": "^4.0.2" } }, "supports-color": { @@ -27948,25 +28308,31 @@ "dev": true }, "tar": { - "version": "6.1.13", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", + "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { "minipass": { - "version": "4.0.3", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true } } }, "terser": { - "version": "5.16.6", + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", + "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -27975,18 +28341,22 @@ }, "dependencies": { "commander": { - "version": "2.20.3" + "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==" } } }, "terser-webpack-plugin": { - "version": "5.3.7", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", "requires": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "dependencies": { "has-flag": { @@ -28368,9 +28738,9 @@ "dev": true }, "webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.82.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", + "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -28381,7 +28751,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -28403,9 +28773,9 @@ "requires": {} }, "enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -28474,15 +28844,15 @@ } }, "webpack-cli": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", - "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.0.tgz", + "integrity": "sha512-a7KRJnCxejFoDpYTOwzm5o21ZXMaNqtRlvS183XzGDUPRdVEzJNImcQokqYZ8BNTnk9DkKiuWxw75+DCCoZ26w==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/configtest": "^2.1.0", "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.2", + "@webpack-cli/serve": "^2.0.3", "colorette": "^2.0.14", "commander": "^10.0.1", "cross-spawn": "^7.0.3", @@ -28514,7 +28884,9 @@ } }, "webpack-dev-middleware": { - "version": "6.0.2", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.0.tgz", + "integrity": "sha512-H7I+YAlKeKwMK0IidkwqpunHhYc/LKJlh5UxCdaLgkhIqwUfebP4rrC131+ddcCZ7LBDBMV9+bkisdbR4zhKhw==", "dev": true, "requires": { "colorette": "^2.0.10", @@ -28537,9 +28909,9 @@ } }, "webpack-dev-server": { - "version": "4.13.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", - "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -28755,6 +29127,43 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, "wrappy": { "version": "1.0.2" }, @@ -28815,7 +29224,9 @@ "version": "1.10.2" }, "yargs": { - "version": "17.7.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", diff --git a/package.json b/package.json index 53684d61c4..27ed8e9a6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "worldview", - "version": "4.4.0", + "version": "4.5.0c", "description": "Interactive interface for browsing full-resolution, global satellite imagery", "keywords": [ "NASA", @@ -75,14 +75,14 @@ "upload": "node tasks/util/upload.js" }, "devDependencies": { - "@babel/core": "^7.21.4", - "@babel/eslint-parser": "^7.21.3", + "@babel/core": "^7.21.8", + "@babel/eslint-parser": "^7.21.8", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.21.4", + "@babel/preset-env": "^7.21.5", "@babel/preset-react": "^7.18.6", "@playwright/test": "^1.33.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", - "@webpack-cli/serve": "^2.0.2", + "@webpack-cli/serve": "^2.0.4", "ajv": "^8.12.0", "autoprefixer": "^10.4.14", "axios": "^1.4.0", @@ -93,8 +93,8 @@ "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^5.0.0", "css-url-relative-plugin": "^1.1.0", - "cssnano": "^6.0.0", - "eslint": "^8.39.0", + "cssnano": "^6.0.1", + "eslint": "^8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-standard": "^17.0.0", "eslint-import-resolver-webpack": "^0.13.2", @@ -110,7 +110,7 @@ "express": "^4.18.2", "fetch-mock": "^9.11.0", "geckodriver": "^3.2.0", - "glob": "^10.2.2", + "glob": "^10.2.3", "husky": "^8.0.3", "jest": "^29.5.0", "jest-canvas-mock": "^2.5.0", @@ -131,23 +131,23 @@ "sass-loader": "^13.2.2", "shelljs": "^0.8.5", "showdown": "^2.1.0", - "stylelint": "^15.6.0", + "stylelint": "^15.6.1", "stylelint-config-standard-scss": "^9.0.0", "stylelint-high-performance-animation": "^1.8.0", - "tar": "^6.1.13", - "terser-webpack-plugin": "^5.3.7", - "webpack": "^5.80.0", + "tar": "^6.1.14", + "terser-webpack-plugin": "^5.3.8", + "webpack": "^5.82.1", "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^5.0.2", - "webpack-dev-middleware": "^6.0.2", - "webpack-dev-server": "^4.13.3", + "webpack-dev-middleware": "^6.1.0", + "webpack-dev-server": "^4.15.0", "xml-js": "^1.6.11", "xml2js": "^0.5.0", - "yargs": "^17.7.1" + "yargs": "^17.7.2" }, "dependencies": { - "@elastic/react-search-ui": "^1.19.1", - "@elastic/react-search-ui-views": "^1.19.1", + "@elastic/react-search-ui": "^1.20.2", + "@elastic/react-search-ui-views": "^1.20.2", "@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.4.0", "@fortawesome/free-solid-svg-icons": "^6.4.0", @@ -187,7 +187,7 @@ "react-draggable": "^4.4.5", "react-image-crop": "^10.0.9", "react-infinite-scroller": "^1.2.6", - "react-joyride": "^2.5.3", + "react-joyride": "^2.5.4", "react-mobile-datepicker": "^4.0.2", "react-redux": "^8.0.5", "react-resizable": "^3.0.5", @@ -202,9 +202,9 @@ "reselect": "^4.1.8", "rgbcolor": "^1.0.1", "simplebar": "^6.2.5", - "simplebar-react": "^3.2.3", + "simplebar-react": "^3.2.4", "stackblur": "^1.0.0", - "supercluster": "^7.1.5", + "supercluster": "^8.0.1", "url-template": "^3.1.0", "what-input": "^5.2.12" }, diff --git a/web/images/map/bluemarble-antarctic.jpg b/web/images/map/bluemarble-antarctic.jpg new file mode 100644 index 0000000000..ad181a51f6 Binary files /dev/null and b/web/images/map/bluemarble-antarctic.jpg differ diff --git a/web/images/map/bluemarble-arctic.jpg b/web/images/map/bluemarble-arctic.jpg new file mode 100644 index 0000000000..05d7e89667 Binary files /dev/null and b/web/images/map/bluemarble-arctic.jpg differ diff --git a/web/images/map/bluemarble-geographic.jpg b/web/images/map/bluemarble-geographic.jpg new file mode 100644 index 0000000000..c39b0340a8 Binary files /dev/null and b/web/images/map/bluemarble-geographic.jpg differ diff --git a/web/js/components/animation-widget/play-queue.js b/web/js/components/animation-widget/play-queue.js index 1dc3675759..273e029076 100644 --- a/web/js/components/animation-widget/play-queue.js +++ b/web/js/components/animation-widget/play-queue.js @@ -83,7 +83,7 @@ class PlayQueue extends React.Component { } /** - * Create an array of each date to be played + * Create a frameDates array of each date to be played to be used in getPlaybackPosition() */ determineFrameDates() { const { startDate, endDate } = this.props; @@ -232,7 +232,7 @@ class PlayQueue extends React.Component { const { isLoopActive, startDate, togglePlaying, speed, } = this.props; - const loopDelay = speed === 0.5 ? 2000 : 1000 / speed; + const loopDelay = speed === 0.5 ? 2000 : 1500; if (isLoopActive) { this.playingDate = toString(startDate); diff --git a/web/js/components/kiosk/animation-tile-check/animation-tile-check.js b/web/js/components/kiosk/animation-tile-check/animation-tile-check.js new file mode 100644 index 0000000000..7a4938cbdb --- /dev/null +++ b/web/js/components/kiosk/animation-tile-check/animation-tile-check.js @@ -0,0 +1,61 @@ +import React, { useEffect, useState } from 'react'; +import { useSelector } from 'react-redux'; +import PropTypes from 'prop-types'; +import util from '../../../util/util'; +import { getActiveLayers } from '../../../modules/layers/selectors'; +import DateRangeTileCheck from './date-range-tile-check'; + +function AnimationTileCheck(props) { + const { + startDate, + endDate, + interval, + delta, + isPlaying, + } = props; + + const { activeString } = useSelector((state) => ({ + activeString: state.compare.activeString, + })); + const activeLayers = useSelector((state) => getActiveLayers(state, activeString).map((layer) => layer)); + + const [frameDates, setFrameDates] = useState([]); + + useEffect(() => { + if (isPlaying) getFrameDates(); + }, [isPlaying]); + + // get an array of each frame date for duration of animation + function determineFrameDates() { + const getNextDate = (date) => util.dateAdd(date, interval, delta); + + const frameDatesArray = []; + let frameDate = startDate; + // this puts an extra '.000Z' on the end of the date string + frameDatesArray.push(frameDate.toISOString()); + while (frameDate < endDate) { + frameDate = getNextDate(frameDate); + frameDatesArray.push(frameDate.toISOString()); + } + return frameDatesArray; + } + + function getFrameDates() { + const frameDatesArray = determineFrameDates(); + setFrameDates([...frameDatesArray]); + } + + return ( + + ); +} + +AnimationTileCheck.propTypes = { + startDate: PropTypes.instanceOf(Date), + endDate: PropTypes.instanceOf(Date), + interval: PropTypes.string, + delta: PropTypes.number, + isPlaying: PropTypes.bool, +}; + +export default AnimationTileCheck; diff --git a/web/js/components/kiosk/animation-tile-check/date-range-tile-check.js b/web/js/components/kiosk/animation-tile-check/date-range-tile-check.js new file mode 100644 index 0000000000..f82f4287ef --- /dev/null +++ b/web/js/components/kiosk/animation-tile-check/date-range-tile-check.js @@ -0,0 +1,92 @@ +// import React, { useEffect, useState } from 'react'; +// import { useSelector, useDispatch } from 'react-redux'; +// import OlTileGridWMTS from 'ol/tilegrid/WMTS'; +// import OlSourceWMTS from 'ol/source/WMTS'; +// import OlLayerTile from 'ol/layer/Tile'; +// import TileState from 'ol/TileState'; +// import OlTileGridTileGrid from 'ol/tilegrid/TileGrid'; +// import PropTypes from 'prop-types'; + +function DateRangeTileCheck(props) { + // const { + // frameDates, + // activeLayers, + // } = props; + + // useEffect(() => { + // if (frameDates.length){ + // // console.log('frameDates', frameDates, 'activeLayers', activeLayers) + // parentFunction(activeLayers) + // } + + // }, [frameDates]) + + // function checkTileAvailability(url) { + // return new Promise((resolve, reject) => { + // const img = new Image(); + // img.onload = () => { + // resolve(true); + // }; + // img.onerror = () => { + // resolve(false); + // }; + // img.src = url; + // }); + // } + + // const wmtsUrlFunction = (layer, date) => async function(tile, src) { + + // } + + // // #3 child function that accepts an array of frame dates and a layer and returns availability for the range + // async function checkTilesForDates(dates, layer) { + // const availability = { + // availableTiles: [], + // unavailableTiles: [], + // }; + + // for (const date of dates) { + // const tileUrl = wmtsUrlFunction(layer, date); // Replace with your tile URL generation logic + // const isAvailable = await checkTileAvailability(tileUrl); + + // if (isAvailable) { + // availability.availableTiles.push(date); + // } else { + // availability.unavailableTiles.push(date); + // } + // } + // return availability; + // } + + // // #2 child function that accepts one layer and returns results for that layer + // async function getAvailabilityForLayer(layer) { + // console.log(layer) + + // const availability = await checkTilesForDates(frameDates, layer); + + // const id = layer.id + + // const layerAvailability = { + // [id]: availability, + // }; + + + // return layerAvailability + // } + + // // parent function that accepts activeLayers and returns final results + // function parentFunction(activeLayers) { + + // const allLayersAvailability = activeLayers.map((layer) => { + // const layerAvailability = getAvailabilityForLayer(layer) + // return layerAvailability; + // }) + + // console.log(allLayersAvailability) + // } + + + return null; +} + +export default DateRangeTileCheck; diff --git a/web/js/components/kiosk/util.js b/web/js/components/kiosk/util.js new file mode 100644 index 0000000000..76734dcc41 --- /dev/null +++ b/web/js/components/kiosk/util.js @@ -0,0 +1,26 @@ +/* eslint-disable import/prefer-default-export */ +// formats date for kiosk mode and updates to EST +export function formatKioskDate(date, subdaily) { + const options = { + year: 'numeric', + month: 'long', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false, + timeZone: 'America/New_York', + }; + + const formatter = new Intl.DateTimeFormat('en-US', options); + const dateParts = formatter.formatToParts(date); + + const year = dateParts.find((part) => part.type === 'year').value; + const month = dateParts.find((part) => part.type === 'month').value.slice(0, 3); + const day = dateParts.find((part) => part.type === 'day').value; + const hours = dateParts.find((part) => part.type === 'hour').value; + const minutes = dateParts.find((part) => part.type === 'minute').value; + + const formattedDate = subdaily ? `${day} ${month} ${year} ${hours}:${minutes}:00 EDT` : `${day} ${month} ${year}`; + + return formattedDate; +} diff --git a/web/js/components/layer/settings/granule-date-list.js b/web/js/components/layer/settings/granule-date-list.js index 97f3bdd7e8..4f664eecda 100644 --- a/web/js/components/layer/settings/granule-date-list.js +++ b/web/js/components/layer/settings/granule-date-list.js @@ -90,7 +90,6 @@ class GranuleDateList extends PureComponent { // move granule item to top of list moveUp = (e, sourceIndex, granuleDate) => { - console.log('uhh'); e.preventDefault(); const { updateGranuleLayerOptions, granuleCount, def } = this.props; const reorderedItems = this.reorderItems( diff --git a/web/js/components/timeline/kiosk-timestamp.js b/web/js/components/timeline/kiosk-timestamp.js new file mode 100644 index 0000000000..6ca63bad06 --- /dev/null +++ b/web/js/components/timeline/kiosk-timestamp.js @@ -0,0 +1,81 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** + * getIsDaylightSavingsTime() + * + * @returns bool indicating if it is daylight savings time on the US East coast + */ +function getIsDaylightSavingsTime() { + const date = new Date().toLocaleString('en-US', { timeZone: 'America/New_York' }); + const dateObj = new Date(date); + const isDaylightSavingTime = dateObj.getTimezoneOffset() < new Date(dateObj.getFullYear(), 0, 1).getTimezoneOffset(); + return isDaylightSavingTime; +} + +function KioskTimeStamp({ date, subdaily }) { + const options = { + year: 'numeric', + month: 'long', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false, + timeZone: 'America/New_York', + }; + + const isDaylightSavingsTime = getIsDaylightSavingsTime(); + const formatter = new Intl.DateTimeFormat('en-US', options); + const dateParts = formatter.formatToParts(date); + + const year = dateParts.find((part) => part.type === 'year').value; + const month = dateParts.find((part) => part.type === 'month').value.slice(0, 3); + const day = dateParts.find((part) => part.type === 'day').value; + const hours = dateParts.find((part) => part.type === 'hour').value; + const minutes = dateParts.find((part) => part.type === 'minute').value; + const timeZoneLabel = isDaylightSavingsTime ? 'EDT' : 'EST'; + + return ( + <> +
+ {day} +
+
+ {month} +
+
+ {year} +
+ + {subdaily && ( + <> +
+ {hours} +
+
+ : +
+
+ {minutes} +
+
+ : +
+
+ 00 +
+
+ {timeZoneLabel} +
+ + )} + + ); +} + +KioskTimeStamp.propTypes = { + date: PropTypes.object, + subdaily: PropTypes.bool, +}; + +export default KioskTimeStamp; diff --git a/web/js/containers/animation-widget/animation-widget.js b/web/js/containers/animation-widget/animation-widget.js index d6a1ec0f01..e53a5e908a 100644 --- a/web/js/containers/animation-widget/animation-widget.js +++ b/web/js/containers/animation-widget/animation-widget.js @@ -35,16 +35,19 @@ import { changeEndDate, changeStartAndEndDate, toggleAnimationCollapse, + toggleAnimationAutoplay, } from '../../modules/animation/actions'; import usePrevious from '../../util/customHooks'; import DesktopAnimationWidget from './desktop-animation-widget'; import MobileAnimationWidget from './mobile-animation-widget'; import CollapsedAnimationWidget from './collapsed-animation-widget'; +import AnimationTileCheck from '../../components/kiosk/animation-tile-check/animation-tile-check'; function AnimationWidget (props) { const { appNow, animationCustomModalOpen, + autoplay, breakpoints, currentDate, delta, @@ -54,7 +57,9 @@ function AnimationWidget (props) { interval, isActive, isCollapsed, + isDistractionFreeModeActive, isEmbedModeActive, + isKioskModeActive, isLandscape, isMobile, isMobilePhone, @@ -70,6 +75,7 @@ function AnimationWidget (props) { onPushPause, onPushPlay, onSlide, + onToggleAnimationAutoplay, onToggleAnimationCollapse, onUpdateEndDate, onUpdateStartDate, @@ -94,6 +100,7 @@ function AnimationWidget (props) { const [collapsedWidgetPosition, setCollapsedWidgetPosition] = useState({ x: 0, y: 0 }); const [userHasMovedWidget, setUserHasMovedWidget] = useState(false); const [speed, setSpeed] = useState(speedRedux); + const [testMode, setTestMode] = useState(false); const prevSubDailyMode = usePrevious(subDailyMode); const prevHasFutureLayers = usePrevious(hasFutureLayers); @@ -103,6 +110,10 @@ function AnimationWidget (props) { if (isEmbedModeActive) { setWidgetPosition({ x: 10, y: 0 }); } + if (!isPlaying && autoplay && !isKioskModeActive) { + onPushPlay(); + toggleAutoplay(); + } }, []); // component did update @@ -140,6 +151,10 @@ function AnimationWidget (props) { onToggleAnimationCollapse(); }; + const toggleAutoplay = () => { + onToggleAnimationAutoplay(); + }; + const onExpandedDrag = (e, position) => { const { x, y } = position; setUserHasMovedWidget(true); @@ -211,7 +226,19 @@ function AnimationWidget (props) { return isActive ? ( - {isPlaying && ( + { + testMode && ( + + ) + } + {isPlaying && !testMode && ( - ) : ( - - )} + ) : isKioskModeActive && !testMode + ? null + + : ( + + )} ) : null; } @@ -329,7 +361,7 @@ const mapStateToProps = (state) => { proj, } = state; const { - startDate, endDate, speed, loop, isPlaying, isActive, isCollapsed, + startDate, endDate, speed, loop, isPlaying, isActive, isCollapsed, autoplay, } = animation; const { customSelected, @@ -356,7 +388,7 @@ const mapStateToProps = (state) => { maxDate = appNow; } - const { isDistractionFreeModeActive } = ui; + const { isDistractionFreeModeActive, isKioskModeActive } = ui; const { isEmbedModeActive } = embed; const animationIsActive = isActive && lodashGet(map, 'ui.selected.frameState_') @@ -403,10 +435,12 @@ const mapStateToProps = (state) => { return { appNow, animationCustomModalOpen, + autoplay, customSelected, startDate, endDate, isCollapsed, + isKioskModeActive, snappedCurrentDate, currentDate, minDate, @@ -478,16 +512,18 @@ const mapDispatchToProps = (dispatch) => ({ onToggleAnimationCollapse: () => { dispatch(toggleAnimationCollapse()); }, + onToggleAnimationAutoplay: () => { + dispatch(toggleAnimationAutoplay()); + }, }); AnimationWidget.propTypes = { appNow: PropTypes.object, animationCustomModalOpen: PropTypes.bool, + autoplay: PropTypes.bool, breakpoints: PropTypes.object, snappedCurrentDate: PropTypes.object, currentDate: PropTypes.object, - customDelta: PropTypes.number, - customInterval: PropTypes.number, delta: PropTypes.number, endDate: PropTypes.object, hasFutureLayers: PropTypes.bool, @@ -497,6 +533,7 @@ AnimationWidget.propTypes = { isCollapsed: PropTypes.bool, isDistractionFreeModeActive: PropTypes.bool, isEmbedModeActive: PropTypes.bool, + isKioskModeActive: PropTypes.bool, isMobile: PropTypes.bool, isMobilePhone: PropTypes.bool, isMobileTablet: PropTypes.bool, @@ -508,8 +545,8 @@ AnimationWidget.propTypes = { minDate: PropTypes.object, numberOfFrames: PropTypes.number, onToggleAnimationCollapse: PropTypes.func, + onToggleAnimationAutoplay: PropTypes.func, onClose: PropTypes.func, - onIntervalSelect: PropTypes.func, onPushLoop: PropTypes.func, onPushPause: PropTypes.func, onPushPlay: PropTypes.func, @@ -523,10 +560,9 @@ AnimationWidget.propTypes = { screenWidth: PropTypes.number, selectDate: PropTypes.func, sliderLabel: PropTypes.string, - speed: PropTypes.number, + speedRedux: PropTypes.number, startDate: PropTypes.object, subDailyMode: PropTypes.bool, - toggleCustomModal: PropTypes.func, }; export default connect( diff --git a/web/js/containers/animation-widget/desktop-animation-widget.js b/web/js/containers/animation-widget/desktop-animation-widget.js index 667ecb15f9..60d14f3e73 100644 --- a/web/js/containers/animation-widget/desktop-animation-widget.js +++ b/web/js/containers/animation-widget/desktop-animation-widget.js @@ -72,7 +72,6 @@ function DesktopAnimationWidget(props) { {' Increments'} - {/* Custom time interval selection */} - {/* FPS slider */} @@ -114,7 +112,6 @@ function DesktopAnimationWidget(props) { zeroDates={zeroDates} numberOfFrames={numberOfFrames} /> - - diff --git a/web/js/containers/animation-widget/kiosk-animation-widget.js b/web/js/containers/animation-widget/kiosk-animation-widget.js new file mode 100644 index 0000000000..b5928a71eb --- /dev/null +++ b/web/js/containers/animation-widget/kiosk-animation-widget.js @@ -0,0 +1,36 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { formatKioskDate } from '../../components/kiosk/util'; + +function KioskAnimationWidget(props) { + const { + startDate, + endDate, + hasSubdailyLayers, + } = props; + + const startDateString = formatKioskDate(startDate, hasSubdailyLayers); + const endDateString = formatKioskDate(endDate, hasSubdailyLayers); + const middleText = ' to '; + + return ( +
+
+
+ {startDateString} + {middleText} + {endDateString} +
+
+
+ ); +} + +KioskAnimationWidget.propTypes = { + startDate: PropTypes.object, + endDate: PropTypes.object, + subDailyMode: PropTypes.bool, +}; + +export default KioskAnimationWidget; + diff --git a/web/js/containers/share.js b/web/js/containers/share.js index f82f7b32f4..20ae208ff1 100644 --- a/web/js/containers/share.js +++ b/web/js/containers/share.js @@ -16,7 +16,7 @@ import { import ShareLinks from '../components/toolbar/share/links'; import ShareToolTips from '../components/toolbar/share/tooltips'; import { - getPermalink, getShareLink, wrapWithObject, + getPermalink, getShareLink, wrapWithIframe, } from '../modules/link/util'; import { getSelectedDate } from '../modules/date/selectors'; import Checkbox from '../components/util/checkbox'; @@ -69,6 +69,7 @@ class ShareLinkContainer extends Component { this.unlisten = history.listen((location, action) => { const newString = location.search; const { queryString } = this.state; + if (newString === undefined) { return; } if (queryString !== newString) { this.setState({ queryString: newString, @@ -268,7 +269,7 @@ class ShareLinkContainer extends Component { activeTab, } = this.state; const embedValue = this.getPermalink(true); - const embedIframeHTMLCode = wrapWithObject(embedValue); + const embedIframeHTMLCode = wrapWithIframe(embedValue); return ( diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index a40ff351e2..67cedd84f9 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -4,7 +4,6 @@ import { connect } from 'react-redux'; import moment from 'moment'; import googleTagManager from 'googleTagManager'; import { UncontrolledTooltip } from 'reactstrap'; - import { debounce as lodashDebounce, throttle as lodashThrottle, @@ -12,7 +11,6 @@ import { } from 'lodash'; import ErrorBoundary from '../error-boundary'; import MobileDatePicker from '../../components/timeline/mobile-date-picker'; - import TimelineAxis from '../../components/timeline/timeline-axis/timeline-axis'; import TimelineLayerCoveragePanel from '../../components/timeline/timeline-coverage/timeline-coverage'; import TimeScaleIntervalChange from '../../components/timeline/timeline-controls/timescale-interval-change'; @@ -20,13 +18,12 @@ import DraggerContainer from '../../components/timeline/timeline-draggers/dragge import AxisHoverLine from '../../components/timeline/timeline-axis/date-tooltip/axis-hover-line'; import DateTooltip from '../../components/timeline/timeline-axis/date-tooltip/date-tooltip'; import CustomIntervalSelector from '../../components/timeline/custom-interval-selector/custom-interval-selector'; - import DateSelector from '../../components/date-selector/date-selector'; import DateChangeArrows from '../../components/timeline/timeline-controls/date-change-arrows'; - import AnimationButton from '../../components/timeline/timeline-controls/animation-button'; import AxisTimeScaleChange from '../../components/timeline/timeline-controls/axis-timescale-change'; import TimelineRangeSelector from '../../components/range-selection/range-selection'; +import KioskTimeStamp from '../../components/timeline/kiosk-timestamp'; import { getIsBetween, @@ -935,6 +932,18 @@ class Timeline extends React.Component { }; }; + getStringFromDate = (dateObj, hasSubdailyLayers) => { + const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + const day = dateObj.getDate().toString().padStart(2, '0'); + const month = months[dateObj.getMonth()]; + const year = dateObj.getFullYear().toString(); + const hours = dateObj.getUTCHours(); + const minutes = dateObj.getUTCMinutes(); + const timeString = hasSubdailyLayers ? ` ${`0${hours}`.slice(-2)}:${`0${minutes}`.slice(-2)}` : ''; + + return `${year} ${month} ${day}${timeString}`; + }; + renderDateChangeArrows = () => { const { isMobile, leftArrowDisabled, rightArrowDisabled, nowButtonDisabled, @@ -1094,75 +1103,169 @@ class Timeline extends React.Component { && animationEndLocationDate; const containerDisplayStyle = { - display: isDistractionFreeModeActive ? 'none' : 'block', + display: isDistractionFreeModeActive ? 'block' : 'block', }; - return (
{initialLoadComplete && !isDistractionFreeModeActive - && ( - - {isMobile || isEmbedModeActive - /* Mobile Timeline Size */ - ? this.renderMobile() - /* Normal Timeline Size */ - : !isDistractionFreeModeActive && ( -
-
- {/* Date Selector, Interval, Arrow Controls */} -
- -
-
- - + && ( + + {isMobile || isEmbedModeActive + /* Mobile Timeline Size */ + ? this.renderMobile() + /* Normal Timeline Size */ + : !isDistractionFreeModeActive && ( +
+
+ {/* Date Selector, Interval, Arrow Controls */} +
+ +
+
- {this.renderDateChangeArrows()} -
- + + {this.renderDateChangeArrows()}
+ +
+ + {!isTimelineHidden + && ( +
- )} -
- )} + )} + + {/* Custom Interval Selector Widget */} + + + {/* Zoom Level Change Controls */} + + + {/* Open/Close Chevron */} +
+ + {isTimelineHidden ? 'Show timeline' : 'Hide timeline'} + +
+
+ + )} + + )} + {initialLoadComplete && isDistractionFreeModeActive + && ( + +
+
+ +
+
+
+ )}
); } diff --git a/web/js/containers/toolbar.js b/web/js/containers/toolbar.js index 3e51506215..2a47be9c7f 100644 --- a/web/js/containers/toolbar.js +++ b/web/js/containers/toolbar.js @@ -394,13 +394,14 @@ class toolbarContainer extends Component { } render() { + const { isKioskModeActive } = this.props; return ( - {this.renderDistractionFreeExitButton()} + {!isKioskModeActive && this.renderDistractionFreeExitButton()} {this.renderLocationSearchButtonComponent()} {this.renderShareButton()} {this.renderProjectionButton()} @@ -429,7 +430,7 @@ const mapStateToProps = (state) => { sidebar, ui, } = state; - const { isDistractionFreeModeActive } = ui; + const { isDistractionFreeModeActive, isKioskModeActive } = ui; const { number, type } = notifications; const { activeString } = compare; const activeLayersForProj = getAllActiveLayers(state); @@ -472,6 +473,7 @@ const mapStateToProps = (state) => { visibleLayersForProj, isRotated: Boolean(map.rotation !== 0), isDistractionFreeModeActive, + isKioskModeActive, }; }; @@ -565,6 +567,7 @@ toolbarContainer.propTypes = { isAboutOpen: PropTypes.bool, isCompareActive: PropTypes.bool, isDistractionFreeModeActive: PropTypes.bool, + isKioskModeActive: PropTypes.bool, isLocationSearchExpanded: PropTypes.bool, isImageDownloadActive: PropTypes.bool, isMobile: PropTypes.bool, diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index 06fd8c7b36..34b0414e07 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -123,9 +123,10 @@ class Tour extends React.Component { selectTour(e, currentStory, currentStoryIndex, currentStoryId) { const { - config, renderedPalettes, selectTour, processStepLink, + config, renderedPalettes, selectTour, processStepLink, isKioskModeActive, } = this.props; if (e) e.preventDefault(); + const kioskParam = this.getKioskParam(isKioskModeActive); this.setState({ currentStep: 1, currentStoryIndex, @@ -145,7 +146,7 @@ class Tour extends React.Component { currentStoryId, 1, currentStory.steps.length, - `${storyStep.stepLink}&tr=${currentStoryId}${transitionParam}`, + `${storyStep.stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}`, config, renderedPalettes, ); @@ -225,9 +226,9 @@ class Tour extends React.Component { currentStoryId, } = this.state; const { - config, renderedPalettes, processStepLink, + config, renderedPalettes, processStepLink, isKioskModeActive, } = this.props; - + const kioskParam = this.getKioskParam(isKioskModeActive); if (currentStep + 1 <= totalSteps) { const newStep = currentStep + 1; this.fetchMetadata(currentStory, currentStep); @@ -239,7 +240,7 @@ class Tour extends React.Component { currentStoryId, newStep, currentStory.steps.length, - `${stepLink}&tr=${currentStoryId}${transitionParam}`, + `${stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}`, config, renderedPalettes, ); @@ -250,13 +251,18 @@ class Tour extends React.Component { } } + getKioskParam(isKioskModeActive) { + return isKioskModeActive ? '&kiosk=true' : ''; + } + decreaseStep(e) { const { - config, renderedPalettes, processStepLink, + config, renderedPalettes, processStepLink, isKioskModeActive, } = this.props; const { currentStep, currentStory, currentStoryId, } = this.state; + const kioskParam = this.getKioskParam(isKioskModeActive); if (currentStep - 1 >= 1) { const newStep = currentStep - 1; this.fetchMetadata(currentStory, newStep - 1); @@ -268,7 +274,7 @@ class Tour extends React.Component { currentStoryId, newStep, currentStory.steps.length, - `${stepLink}&tr=${currentStoryId}${transitionParam}`, + `${stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}`, config, renderedPalettes, ); @@ -519,10 +525,11 @@ const mapStateToProps = (state) => { screenSize, config, tour, palettes, models, compare, map, } = state; const { screenWidth, screenHeight } = screenSize; - + const { isKioskModeActive } = state.ui; return { config, isActive: tour.active, + isKioskModeActive, map, models, compareState: compare, @@ -558,6 +565,7 @@ Tour.propTypes = { currentStoryId: PropTypes.string, endTour: PropTypes.func, isActive: PropTypes.bool, + isKioskModeActive: PropTypes.bool, processStepLink: PropTypes.func, renderedPalettes: PropTypes.object, resetProductPicker: PropTypes.func, diff --git a/web/js/location.js b/web/js/location.js index 9d40ebc0ec..71742074be 100644 --- a/web/js/location.js +++ b/web/js/location.js @@ -296,6 +296,22 @@ const getParameters = function(config, parameters) { }, }, }, + kiosk: { + stateKey: 'ui.isKioskModeActive', + initialState: false, + type: 'bool', + options: { + serializeNeedsGlobalState: true, + serialize: (boo, state) => { + const isKioskModeActive = get(state, 'ui.isKioskModeActive'); + return isKioskModeActive ? boo : undefined; + }, + }, + }, + eic: { + stateKey: 'ui.eic', + initialState: '', + }, em: { stateKey: 'embed.isEmbedModeActive', initialState: false, @@ -481,6 +497,14 @@ const getParameters = function(config, parameters) { parse: (str) => str === 'on', }, }, + aa: { + stateKey: 'animation.autoplay', + initialState: false, + options: { + serialize: (boo) => (boo ? 'true' : undefined), + parse: (str) => str === 'true', + }, + }, abt: { stateKey: 'modalAbout.isOpen', initialState: false, diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index d8b17703a5..34e86984ff 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -10,18 +10,27 @@ import OlTileGridTileGrid from 'ol/tilegrid/TileGrid'; import MVT from 'ol/format/MVT'; import LayerVectorTile from 'ol/layer/VectorTile'; import SourceVectorTile from 'ol/source/VectorTile'; +import ImageLayer from 'ol/layer/Image'; +import Static from 'ol/source/ImageStatic'; import lodashCloneDeep from 'lodash/cloneDeep'; import lodashMerge from 'lodash/merge'; import lodashEach from 'lodash/each'; import lodashGet from 'lodash/get'; - import util from '../util/util'; import lookupFactory from '../ol/lookupimagetile'; import granuleLayerBuilder from './granule/granule-layer-builder'; import { getGranuleTileLayerExtent } from './granule/util'; -import { createVectorUrl, getGeographicResolutionWMS, mergeBreakpointLayerAttributes } from './util'; +import { + createVectorUrl, + getGeographicResolutionWMS, + mergeBreakpointLayerAttributes, + formatReduxDate, + extractDateFromTileErrorURL, + formatSelectedDate, +} from './util'; import { datesInDateRanges, prevDateInDateRange } from '../modules/layers/util'; import { updateLayerDateCollection, updateLayerCollection } from '../modules/layers/actions'; +import { setErrorTiles } from '../modules/ui/actions'; import { getCollections } from '../modules/layers/selectors'; import { getSelectedDate } from '../modules/date/selectors'; import { @@ -37,13 +46,23 @@ import { import { nearestInterval, } from '../modules/layers/util'; - import { LEFT_WING_EXTENT, RIGHT_WING_EXTENT, LEFT_WING_ORIGIN, RIGHT_WING_ORIGIN, CENTER_MAP_ORIGIN, } from '../modules/map/constants'; export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); + // keep track of each tile that returned an error + const errorTiles = { + dailyTiles: [], + subdailyTiles: [], + blankTiles: [], + kioskTileCount: 0, + lastCheckedDate: null, + }; + + // list of layer id's to check for blank tiles in blobs + const kioskCheckForBlankTilesList = ['VIIRS_SNPP_DayNightBand_At_Sensor_Radiance', 'VIIRS_SNPP_CorrectedReflectance_TrueColor', 'MODIS_Terra_CorrectedReflectance_TrueColor', 'IMERG_Precipitation_Rate', 'GHRSST_L4_MUR_Sea_Surface_Temperature', 'MODIS_Aqua_L3_Land_Surface_Temp_Daily_Day']; /** * Return a layer, or layergroup, created with the supplied function @@ -102,6 +121,40 @@ export default function mapLayerBuilder(config, cache, store) { store.dispatch(updateLayerCollection(id)); }; + // called from tileLoadFunction() when a tile returns an error + const handleTileError = async (tile, layer, sourceURL) => { + const state = store.getState(); + const { isKioskModeActive } = state.ui; + + if (isKioskModeActive) { + const { selected: reduxDate } = state.date; + const { id, layerPeriod } = layer; + const isSubdailyLayer = layerPeriod === 'Subdaily'; + const urlDate = extractDateFromTileErrorURL(sourceURL); + const currentDate = formatReduxDate(reduxDate, urlDate, isSubdailyLayer); + + errorTiles.lastCheckedDate = reduxDate; + + // we don't want to store cached dates in the error tiles + if (urlDate === currentDate) { + const matrixColRow = tile.tileCoord; + const errorObj = { + id, + layerPeriod, + date: urlDate, + matrixColRow, + sourceURL, + }; + + if (isSubdailyLayer) { + errorTiles.subdailyTiles.push(errorObj); + } else { + errorTiles.dailyTiles.push(errorObj); + } + } + } + }; + /** * We define our own tile loading function in order to capture custom header values * @@ -109,13 +162,29 @@ export default function mapLayerBuilder(config, cache, store) { * @param {*} src */ const tileLoadFunction = (layer, layerDate) => async function(tile, src) { + const state = store.getState(); + const { ui: { isKioskModeActive }, date: { selected } } = state; + const date = layerDate.toISOString().split('T')[0]; - let actualId; + + const checkBlobTiles = (headers) => { + // recently changed from appNow date to selected date, was previously only checking current day + const formattedSelectedDate = formatSelectedDate(selected); + if (isKioskModeActive && kioskCheckForBlankTilesList.includes(layer.id) && formattedSelectedDate === date) { + errorTiles.kioskTileCount += 1; + const contentLength = headers.get('content-length'); + const contentType = headers.get('content-type'); + const sizeThreshold = contentType === 'image/png' ? 2000 : 5000; + if (parseInt(contentLength, 10) < sizeThreshold) { + errorTiles.blankTiles.push({ id: layer.id, contentLength, date }); + } + } + }; const updateCollections = (headers) => { - actualId = headers.get('layer-identifier-actual'); + const actualId = headers.get('layer-identifier-actual'); if (!actualId) return; - const state = store.getState(); + const { layers } = state; const collectionCheck = getCollections(layers, date, layer); // check if the collection & dates already exist for layer so we don't dispatch actions @@ -132,12 +201,20 @@ export default function mapLayerBuilder(config, cache, store) { const response = await fetch(src); const data = await response.blob(); updateCollections(response.headers); + + // checking for blank tiles in kiosk mode for predefined layers + if (isKioskModeActive && kioskCheckForBlankTilesList.includes(layer.id)) { + checkBlobTiles(response.headers); + } + if (data !== undefined) { tile.getImage().src = URL.createObjectURL(data); } else { + handleTileError(tile, layer, src); tile.setState(TileState.ERROR); } } catch (e) { + handleTileError(tile, layer, src); tile.setState(TileState.ERROR); } }; @@ -227,8 +304,20 @@ export default function mapLayerBuilder(config, cache, store) { const createLayer = async (def, options = {}) => { const state = store.getState(); const { compare: { activeString } } = state; + const { + ui: { isKioskModeActive, displayStaticMap }, + animation: { isPlaying }, + map: { rendered }, + } = state; + options.group = options.group || activeString; + // if gibs/dns failure, display static image layer + if (displayStaticMap && isKioskModeActive) { + const layer = await createStaticImageLayer(); + return layer; + } + const { closestDate, nextDate, @@ -242,6 +331,8 @@ export default function mapLayerBuilder(config, cache, store) { const key = layerKey(def, options, state); const layer = await createLayerWrapper(def, key, options, dateOptions); + if (isKioskModeActive && !isPlaying && rendered) store.dispatch(setErrorTiles(errorTiles)); + return layer; }; @@ -411,6 +502,23 @@ export default function mapLayerBuilder(config, cache, store) { }; }; + const createStaticImageLayer = async() => { + const state = store.getState(); + const { proj: { selected: { id, crs, maxExtent } } } = state; + + const projectionURL = `images/map/bluemarble-${id}.jpg`; + + const layer = new ImageLayer({ + source: new Static({ + url: projectionURL, + projection: crs, + imageExtent: maxExtent, + }), + }); + + return layer; + }; + /** * Create a new WMTS Layer * @method createLayerWMTS diff --git a/web/js/map/natural-events/natural-events.js b/web/js/map/natural-events/natural-events.js index 31ad337b0c..715caf9334 100644 --- a/web/js/map/natural-events/natural-events.js +++ b/web/js/map/natural-events/natural-events.js @@ -170,7 +170,7 @@ class NaturalEvents extends React.Component { } zoomToEvent = function(event, date, isSameEventID) { - const { proj, map } = this.props; + const { proj, map, isKioskModeActive } = this.props; const { crs } = proj.selected; const category = event.categories[0].title; const zoom = isSameEventID ? map.getView().getZoom() : zoomLevelReference[category]; @@ -186,7 +186,7 @@ class NaturalEvents extends React.Component { } else { coordinates = olProj.transform(geometry.coordinates, CRS.GEOGRAPHIC, crs); } - return fly(map, proj, coordinates, zoom, null); + return fly(map, proj, coordinates, zoom, null, isKioskModeActive); }; render() { @@ -203,6 +203,7 @@ const mapStateToProps = (state) => { const { map, proj, requestedEvents, layers, config, } = state; + const { isKioskModeActive } = state.ui; const { active, selected } = state.events; const selectedMap = map.ui.selected; return { @@ -211,6 +212,7 @@ const mapStateToProps = (state) => { proj, eventsDataIsLoading: requestedEvents.isLoading, eventsData: getFilteredEvents(state), + isKioskModeActive, selectedEvent: selected, eventLayers: layers.eventLayers, layers: layers.active.layers, @@ -249,6 +251,7 @@ NaturalEvents.propTypes = { eventsData: PropTypes.array, eventsDataIsLoading: PropTypes.bool, eventLayers: PropTypes.array, + isKioskModeActive: PropTypes.bool, layers: PropTypes.array, selectedEvent: PropTypes.object, selectEventFinished: PropTypes.func, diff --git a/web/js/map/util.js b/web/js/map/util.js index 362b37498f..3dfe1adf17 100644 --- a/web/js/map/util.js +++ b/web/js/map/util.js @@ -144,7 +144,7 @@ const getBestZoom = function(distance, start, end, view) { * @param {integer} endZoom Ending Zoom Level * @return {Promise} Promise that is fulfilled when animation completes */ -export function fly (map, proj, endPoint, endZoom = 5, rotation = 0) { +export function fly (map, proj, endPoint, endZoom = 5, rotation = 0, isKioskModeActive) { const view = map.getView(); const polarProjectionCheck = proj.selected.id !== 'geographic'; // boolean if current projection is polar view.cancelAnimations(); @@ -156,7 +156,9 @@ export function fly (map, proj, endPoint, endZoom = 5, rotation = 0) { const line = new OlGeomLineString([startPoint, endPoint]); const distance = line.getLength(); // In map units, which is usually degrees const distanceDuration = polarProjectionCheck ? distance / 50000 : distance; // limit large polar projection distances from coordinate transforms - let duration = Math.max(5000, 2 * Math.floor(distanceDuration * 20 + 1000)); // Minimum 5 seconds, approx 12 seconds to go 360 degrees + let duration = isKioskModeActive + ? Math.max(5000, 2 * Math.floor(distanceDuration * 20 + 1000)) // Minimum 5 seconds, approx 12 seconds to go 360 degrees + : Math.floor(distanceDuration * 20 + 1000); // approx 6 seconds to go 360 degrees const animationPromise = function(...args) { return new Promise((resolve, reject) => { @@ -215,3 +217,72 @@ export const getOverDateLineCoordinates = (coordinates) => { export const getExtent = (proj) => (proj.selected.id === 'geographic' ? [-250, -90, 250, 90] : [-180, -90, 180, 90]); + +// Called in formatReduxDate when subdaily layers are active +// The timezone in the tile request URL parameter & selected date in redux are different +// Updates the redux date string to match the url parameter timezone +export function updateReduxDateTimezone(reduxDate, urlDate) { + const parsedReduxDate = new Date(reduxDate); + const parsedUrlDate = new Date(urlDate); + // Get the timezone offset in minutes and convert it to milliseconds + const timezoneOffsetMillis = parsedUrlDate.getTimezoneOffset() * 60 * 1000; + // Apply the timezone offset to the reduxDate + const adjustedReduxDate = new Date(parsedReduxDate.getTime() + timezoneOffsetMillis); + // Set the hour of the adjustedReduxDate to match the hour of the urlDate + adjustedReduxDate.setHours(parsedUrlDate.getHours()); + // Round down the minutes to the nearest multiple of 10 + const roundedMinutes = Math.floor(parsedUrlDate.getMinutes() / 10) * 10; + // Set the rounded minutes + adjustedReduxDate.setMinutes(roundedMinutes); + // Format the updated reduxDate back to a string + const year = adjustedReduxDate.getFullYear(); + const month = String(adjustedReduxDate.getMonth() + 1).padStart(2, '0'); + const day = String(adjustedReduxDate.getDate()).padStart(2, '0'); + const hours = String(adjustedReduxDate.getHours()).padStart(2, '0'); + const minutes = String(adjustedReduxDate.getMinutes()).padStart(2, '0'); + + return `${year}-${month}-${day}T${hours}:${minutes}:00`; +} + +// Used in layerbuilder and TileErrorHandler +// Formats the selected date in redux to match the date url parameter from error tiles +export function formatReduxDate(reduxDate, urlDate, isSubdailyLayer) { + const date = new Date(reduxDate); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + + if (isSubdailyLayer) { + const formattedReduxDate = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`; + const timezoneAdjustedReduxDate = updateReduxDateTimezone(formattedReduxDate, urlDate); + return timezoneAdjustedReduxDate; + } + return `${year}-${month}-${day}T00:00:00`; +} + +// Used in layerbuilder to extract date param from tile error url +export function extractDateFromTileErrorURL(url) { + const regex = /TIME=([\d-]+T(?:\d{2}:\d{2}:\d{2})?)/; + const match = url.match(regex); + + if (match && match[1]) { + return match[1]; + } + console.error('Date not found in the URL.'); + return null; +} + +// Updates the format of the appNow date to a date format of YYYY-MM-DD +export function formatSelectedDate(date) { + const dateObj = new Date(date); + + const year = dateObj.getFullYear(); + const month = String(dateObj.getMonth() + 1).padStart(2, '0'); + const day = String(dateObj.getDate()).padStart(2, '0'); + + const formattedDate = `${year}-${month}-${day}`; + return formattedDate; +} diff --git a/web/js/mapUI/components/kiosk/kiosk-animations/kiosk-animations.js b/web/js/mapUI/components/kiosk/kiosk-animations/kiosk-animations.js new file mode 100644 index 0000000000..8fcee0aa73 --- /dev/null +++ b/web/js/mapUI/components/kiosk/kiosk-animations/kiosk-animations.js @@ -0,0 +1,100 @@ +import { useEffect, useState } from 'react'; +import { useSelector, useDispatch } from 'react-redux'; +import PropTypes from 'prop-types'; +import { + onActivate as initiateAnimationAction, + playKioskAnimation as playKioskAnimationAction, +} from '../../../../modules/animation/actions'; +import { selectDate as selectDateAction } from '../../../../modules/date/actions'; + +function KioskAnimations({ ui }) { + const dispatch = useDispatch(); + const initiateAnimation = () => { dispatch(initiateAnimationAction()); }; + const playKioskAnimation = (startDate, endDate) => { dispatch(playKioskAnimationAction(startDate, endDate)); }; + const selectDate = (date) => { dispatch(selectDateAction(date)); }; + + const { + selectedDate, isAnimationPlaying, isKioskModeActive, eic, map, readyForKioskAnimation, + } = useSelector((state) => ({ + selectedDate: state.date.selected, + isAnimationPlaying: state.animation.isPlaying, + isKioskModeActive: state.ui.isKioskModeActive, + eic: state.ui.eic, + map: state.map, + readyForKioskAnimation: state.ui.readyForKioskAnimation, + })); + + const [subdailyAnimationDateUpdated, setSubdailyAnimationDateUpdated] = useState(false); + + useEffect(() => { + if (!ui.selected || !isKioskModeActive) return; + if (eic === 'sa' || eic === 'da') checkAnimationSettings(); + }, [map, readyForKioskAnimation]); + + const subdailyPlayCheck = eic === 'sa' && subdailyAnimationDateUpdated && readyForKioskAnimation && !isAnimationPlaying; + const dailyPlayCheck = eic === 'da' && readyForKioskAnimation && !isAnimationPlaying; + + // if subdaily animation check that date moved back one day otherwise check if animation should play + const checkAnimationSettings = () => { + if (!ui.selected.frameState_) return; + if (eic === 'sa' && !subdailyAnimationDateUpdated) { + const prevDayDate = new Date(selectedDate); + prevDayDate.setDate(prevDayDate.getDate() - 1); + selectDate(prevDayDate); + setSubdailyAnimationDateUpdated(true); + } else if (subdailyPlayCheck || dailyPlayCheck) { + handleAnimationSettings(); + } + }; + + // zero dates for subdaily times + const zeroDates = (start, end) => { + const startDateZeroed = new Date(start); + const endDateZeroed = new Date(end); + + // for subdaily, zero start and end dates to UTC HH:MM:00:00 + const startMinutes = startDateZeroed.getMinutes(); + const endMinutes = endDateZeroed.getMinutes(); + startDateZeroed.setUTCMinutes(Math.floor(startMinutes / 10) * 10); + startDateZeroed.setUTCSeconds(0); + startDateZeroed.setUTCMilliseconds(0); + endDateZeroed.setUTCMinutes(Math.floor(endMinutes / 10) * 10); + endDateZeroed.setUTCSeconds(0); + endDateZeroed.setUTCMilliseconds(0); + + return { + startDate: startDateZeroed, + endDate: endDateZeroed, + }; + }; + + // start time to determine animation duration + const updateStartTime = (dateString) => { + const date = new Date(dateString); + if (eic === 'sa') { + // Subtract 6 hours (6 * 60 * 60 * 1000 milliseconds) for subdaily animations + date.setTime(date.getTime() - 6 * 60 * 60 * 1000); + } else { + // Subtract 1 month for daily animations + date.setMonth(date.getMonth() - 1); + } + return date.toString(); + }; + + const handleAnimationSettings = () => { + const start = updateStartTime(selectedDate); + const end = selectedDate; + const { startDate, endDate } = zeroDates(start, end); + + initiateAnimation(); + playKioskAnimation(startDate, endDate); + }; + + return null; +} + +KioskAnimations.propTypes = { + ui: PropTypes.object, +}; + +export default KioskAnimations; diff --git a/web/js/mapUI/components/kiosk/tile-errors/tile-error-handler.js b/web/js/mapUI/components/kiosk/tile-errors/tile-error-handler.js new file mode 100644 index 0000000000..4ae4ed5b2d --- /dev/null +++ b/web/js/mapUI/components/kiosk/tile-errors/tile-error-handler.js @@ -0,0 +1,155 @@ +import { useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { useSelector, useDispatch } from 'react-redux'; +import { + clearErrorTiles as clearErrorTilesAction, + toggleStaticMap as toggleStaticMapAction, + toggleReadyForKioskAnimation as toggleReadyForKioskAnimationAction, +} from '../../../../modules/ui/actions'; +import { + selectDate as selectDateAction, + selectInterval as selectIntervalAction, +} from '../../../../modules/date/actions'; +import { getNextDateTime } from '../../../../modules/date/util'; +import { + subdailyLayersActive, + getActiveLayers, +} from '../../../../modules/layers/selectors'; +import { toggleGroupVisibility as toggleGroupVisiblityAction } from '../../../../modules/layers/actions'; +import { + formatDate, + weekAgo, + threeHoursAgo, + twentySevenHoursAgo, + compareDailyDates, + compareSubdailyDates, + formatSelectedDate, +} from '../../../util/util'; + +function TileErrorHandler({ action, ui }) { + const dispatch = useDispatch(); + const clearErrorTiles = () => { dispatch(clearErrorTilesAction()); }; + const selectDate = (date) => { dispatch(selectDateAction(date)); }; + const selectInterval = (delta, timeScale, customSelected) => { dispatch(selectIntervalAction(delta, timeScale, customSelected)); }; + const toggleStaticMap = (isActive) => { dispatch(toggleStaticMapAction(isActive)); }; + const toggleGroupVisibility = (ids, visible) => { dispatch(toggleGroupVisiblityAction(ids, visible)); }; + const toggleReadyForKioskAnimation = (toggleAnimation) => { dispatch(toggleReadyForKioskAnimationAction(toggleAnimation)); }; + + const { + displayStaticMap, + isKioskModeActive, + errorTiles, + selectedDate, + date, + compare, + isLoading, + realTimeDate, + eic, + map, + readyForKioskAnimation, + } = useSelector((state) => ({ + autoplayAnimation: state.animation.autoplay, + displayStaticMap: state.ui.displayStaticMap, + isAnimationPlaying: state.animation.isPlaying, + isKioskModeActive: state.ui.isKioskModeActive, + errorTiles: state.ui.errorTiles, + selectedDate: state.date.selected, + date: state.date, + compare: state.compare, + isLoading: state.loading.isLoading, + realTimeDate: state.date.appNow, + eic: state.ui.eic, + map: state.map, + readyForKioskAnimation: state.ui.readyForKioskAnimation, + })); + const { activeString } = compare; + const hasSubdailyLayers = useSelector((state) => subdailyLayersActive(state)); + const activeLayerIds = useSelector((state) => getActiveLayers(state, activeString).map((layer) => layer.id)); + + const { + dailyTiles, subdailyTiles, blankTiles, kioskTileCount, lastCheckedDate, + } = errorTiles; + + const lastDateToCheck = weekAgo(realTimeDate); + const lastTimeToCheck = eic === 'sa' ? twentySevenHoursAgo(realTimeDate) : threeHoursAgo(realTimeDate); + + const dailySafeguardCheck = compareDailyDates(lastDateToCheck, selectedDate); + const hourlySafeguardCheck = compareSubdailyDates(lastTimeToCheck, selectedDate); + + const errorTileCheck = dailyTiles.length || subdailyTiles.length; + const blankTileCheck = blankTiles.length; + + useEffect(() => { + if (!ui.selected || !map.rendered || readyForKioskAnimation) return; + + if (isKioskModeActive && errorTileCheck && dailySafeguardCheck && !isLoading) { + handleTileErrors(); + } else if (isKioskModeActive && errorTileCheck && (!dailySafeguardCheck || !hourlySafeguardCheck) && !isLoading) { + handleStaticMap(); + } else if (isKioskModeActive && blankTileCheck && dailySafeguardCheck && eic !== 'sa' && !isLoading) { + handleTimeChangeForBlankTiles(); + // reminder: we are NOT checking blank tiles when playing subdaily animations + } else if ((!errorTileCheck && !blankTileCheck && !readyForKioskAnimation) || (eic === 'sa' && !errorTileCheck && !readyForKioskAnimation)) { + readyForAnimation(); + } else { + clearErrorTiles(); + } + }, [action]); + + const handleStaticMap = () => { + toggleStaticMap(true); + toggleGroupVisibility(activeLayerIds, false); + }; + + const readyForAnimation = () => { + toggleReadyForKioskAnimation(true); + clearErrorTiles(); + }; + + // we don't need to include the readyForAnimation function here until we are checking a tile for blank tiles that we plan on animating + const handleTimeChangeForBlankTiles = () => { + const blankTilesOnCurentDate = blankTiles.filter((tile) => tile.date === formatSelectedDate(selectedDate)).length; + if (!blankTilesOnCurentDate) return clearErrorTiles(); + const blankTilesPercentage = (blankTiles.length / kioskTileCount) * 100; + if (blankTilesPercentage >= 50) { + const state = { date, compare }; + const prevDate = getNextDateTime(state, '-1'); + const prevDateObj = new Date(prevDate); + selectDate(prevDateObj); + } + clearErrorTiles(); + }; + + const handleTimeChangeForErrors = (tiles, isSubdaily) => { + const currentDate = formatDate(selectedDate, isSubdaily); + const errorTilesOnCurrentDate = tiles.filter((tile) => currentDate === tile.date).length; + if (errorTilesOnCurrentDate) { + const state = { date, compare }; + if (hasSubdailyLayers && !isSubdaily) selectInterval(1, 3, false); + const prevDate = getNextDateTime(state, '-1'); + const prevDateObj = new Date(prevDate); + selectDate(prevDateObj); + } else if ((lastCheckedDate === selectedDate && !readyForKioskAnimation && eic === 'da') || (eic === 'sa')) { + readyForAnimation(); + } else { + clearErrorTiles(); + } + + if (!hourlySafeguardCheck || !dailySafeguardCheck) return handleStaticMap(); + }; + + const handleTileErrors = () => { + if (dailyTiles.length) return handleTimeChangeForErrors(dailyTiles, false); + if (subdailyTiles.length && hourlySafeguardCheck) return handleTimeChangeForErrors(subdailyTiles, true); + if ((!hourlySafeguardCheck || !dailySafeguardCheck) && !displayStaticMap) return handleStaticMap(); + }; + + return null; +} + +export default TileErrorHandler; + +TileErrorHandler.propTypes = { + action: PropTypes.object, + ui: PropTypes.object, +}; diff --git a/web/js/mapUI/components/layers/addLayer.js b/web/js/mapUI/components/layers/addLayer.js index 13f4a70f6f..7efec94dbd 100644 --- a/web/js/mapUI/components/layers/addLayer.js +++ b/web/js/mapUI/components/layers/addLayer.js @@ -9,6 +9,7 @@ import { import { getActiveLayers } from '../../../modules/layers/selectors'; import * as layerConstants from '../../../modules/layers/constants'; import { clearPreload } from '../../../modules/date/actions'; +import { DISPLAY_STATIC_MAP } from '../../../modules/ui/constants'; function AddLayer(props) { const { @@ -31,9 +32,18 @@ function AddLayer(props) { } clearPreload(); addLayer(def); + } else if (action.type === DISPLAY_STATIC_MAP) { + addStaticLayer(); } }, [action]); + // add static layer for kiosk mode in case of gibs/dns failure + const addStaticLayer = async() => { + const { createLayer } = ui; + const newLayer = await createLayer(); + ui.selected.getLayers().insertAt(0, newLayer); + }; + const granuleLayerAdd = (def) => { ui.processingPromise = new Promise((resolve) => { resolve(addLayer(def)); @@ -72,6 +82,7 @@ function AddLayer(props) { updateLayerVisibilities(); preloadNextTiles(); }; + return null; } diff --git a/web/js/mapUI/components/markers/markers.js b/web/js/mapUI/components/markers/markers.js index cb4c447ffb..faffd07d31 100644 --- a/web/js/mapUI/components/markers/markers.js +++ b/web/js/mapUI/components/markers/markers.js @@ -13,6 +13,7 @@ function Markers(props) { activeLayers, config, coordinates, + isKioskModeActive, isMobileDevice, selectedMap, selectedMapMarkers, @@ -103,7 +104,7 @@ function Markers(props) { const latestCoordinates = coordinatesObject && [longitude, latitude]; const zoom = selectedMap.getView().getZoom(); const maxZoom = getMaxZoomLevelLayerCollection(activeLayers, zoom, proj.id, sources); - animateCoordinates(selectedMap, proj, latestCoordinates, maxZoom); + animateCoordinates(selectedMap, proj, latestCoordinates, maxZoom, isKioskModeActive); }; /** @@ -157,6 +158,7 @@ const mapStateToProps = (state) => { const { locationSearch, proj, screenSize, map, } = state; + const { isKioskModeActive } = state.ui; const { coordinates } = locationSearch; const { isMobileDevice } = screenSize; const activeLayers = getActiveLayers(state).filter(({ projections }) => projections[proj.id]); @@ -165,6 +167,7 @@ const mapStateToProps = (state) => { return { activeLayers, coordinates, + isKioskModeActive, isMobileDevice, selectedMap, selectedMapMarkers, @@ -192,6 +195,7 @@ Markers.propTypes = { action: PropTypes.object, config: PropTypes.object, coordinates: PropTypes.array, + isKioskModeActive: PropTypes.bool, isMobileDevice: PropTypes.bool, proj: PropTypes.object, removeMarker: PropTypes.func, diff --git a/web/js/mapUI/components/update-projection/updateProjection.js b/web/js/mapUI/components/update-projection/updateProjection.js index d00e21aef7..ec72e8db5b 100644 --- a/web/js/mapUI/components/update-projection/updateProjection.js +++ b/web/js/mapUI/components/update-projection/updateProjection.js @@ -38,6 +38,7 @@ function UpdateProjection(props) { dateCompareState, fitToLeadingExtent, getGranuleOptions, + isKioskModeActive, isMobile, layerState, map, @@ -124,6 +125,15 @@ function UpdateProjection(props) { } }; + /** + * Collect information required & initiate a "fly" map transition + * Used in Tour Stories. + * @method flyToNewExtent + * @static + * + * @param {object} extent + * @param {number} rotation + */ const flyToNewExtent = function(extent, rotation) { const coordinateX = extent[0] + (extent[2] - extent[0]) / 2; const coordinateY = extent[1] + (extent[3] - extent[1]) / 2; @@ -132,7 +142,7 @@ function UpdateProjection(props) { const zoom = ui.selected.getView().getZoomForResolution(resolution); // Animate to extent, zoom & rotate: // Don't animate when an event is selected (Event selection already animates) - return fly(ui.selected, proj, coordinates, zoom, rotation); + return fly(ui.selected, proj, coordinates, zoom, rotation, isKioskModeActive); }; /** @@ -357,6 +367,7 @@ const mapStateToProps = (state) => { const { proj, map, screenSize, layers, compare, date, } = state; + const { isKioskModeActive } = state.ui; const layerState = { layers, compare, proj }; const isMobile = screenSize.isMobileDevice; const dateCompareState = { date, compare }; @@ -367,6 +378,7 @@ const mapStateToProps = (state) => { compare, compareMode, dateCompareState, + isKioskModeActive, isMobile, layerState, proj, @@ -401,6 +413,7 @@ UpdateProjection.propTypes = { dateCompareState: PropTypes.object, fitToLeadingExtent: PropTypes.func, getGranuleOptions: PropTypes.func, + isKioskModeActive: PropTypes.bool, isMobile: PropTypes.bool, layerState: PropTypes.object, map: PropTypes.object, diff --git a/web/js/mapUI/mapUI.js b/web/js/mapUI/mapUI.js index 7a9ab3b2d3..e11f8993ac 100644 --- a/web/js/mapUI/mapUI.js +++ b/web/js/mapUI/mapUI.js @@ -16,6 +16,8 @@ import UpdateOpacity from './components/update-opacity/updateOpacity'; import UpdateProjection from './components/update-projection/updateProjection'; import MouseMoveEvents from './components/mouse-move-events/mouseMoveEvents'; import BufferQuickAnimate from './components/buffer-quick-animate/bufferQuickAnimate'; +import TileErrorHandler from './components/kiosk/tile-errors/tile-error-handler'; +import KioskAnimations from './components/kiosk/kiosk-animations/kiosk-animations'; import { LOCATION_POP_ACTION } from '../redux-location-state-customs'; import { CHANGE_PROJECTION } from '../modules/projection/constants'; import { SET_SCREEN_INFO } from '../modules/screen-size/constants'; @@ -44,6 +46,7 @@ import { updateVectorSelection } from '../modules/vector-styles/util'; import { REDUX_ACTION_DISPATCHED } from '../util/constants'; import { updateMapExtent } from '../modules/map/actions'; import { clearPreload, setPreload } from '../modules/date/actions'; +import { SET_ERROR_TILES, DISPLAY_STATIC_MAP } from '../modules/ui/constants'; const { events } = util; @@ -90,6 +93,7 @@ function MapUI(props) { const [quickAnimateAction, setQuickAnimateAction] = useState({}); const [vectorActions, setVectorActions] = useState({}); const [preloadAction, setPreloadAction] = useState({}); + const [tileErrorAction, setTileErrorAction] = useState({}); const subscribeToStore = function(action) { switch (action.type) { @@ -97,6 +101,7 @@ function MapUI(props) { return setProjectionTrigger((projectionTrigger) => projectionTrigger + 1); } case layerConstants.ADD_LAYER: + case DISPLAY_STATIC_MAP: return setAddLayerAction(action); case STOP_ANIMATION: case EXIT_ANIMATION: @@ -154,6 +159,8 @@ function MapUI(props) { case dateConstants.ARROW_DOWN: setQuickAnimateAction(action); break; + case SET_ERROR_TILES: + return setTileErrorAction(action); default: break; } @@ -312,8 +319,10 @@ function MapUI(props) { async function preloadNextTiles(date, compareString) { const map = { ui }; const state = { - proj, embed, layers, palettes, vectorStyles, compare, map, + proj, embed, layers, palettes, vectorStyles, compare, map, ui, }; + const { dislayStaticMap } = ui; + if (dislayStaticMap) return; const useActiveString = compareString || activeString; const useDate = date || (preloaded ? lastPreloadDate : getSelectedDate(dateCompareState)); const nextDate = getNextDateTime(dateCompareState, 1, useDate); @@ -389,6 +398,8 @@ function MapUI(props) { + + ); } diff --git a/web/js/mapUI/util/util.js b/web/js/mapUI/util/util.js new file mode 100644 index 0000000000..88c557cdb3 --- /dev/null +++ b/web/js/mapUI/util/util.js @@ -0,0 +1,239 @@ +import { each as lodashEach } from 'lodash'; +import TileLayer from 'ol/layer/Tile'; +import { transformExtent } from 'ol/proj'; + +// removes all of the layers from the openlayers map object +export const clearLayers = function(ui) { + const activeLayersUI = ui.selected + .getLayers() + .getArray() + .slice(0); + lodashEach(activeLayersUI, (mapLayer) => { + ui.selected.removeLayer(mapLayer); + }); + ui.cache.clear(); +}; + +// Helper function to process the tile layer +const processTileLayer = (layer, map, view) => { + const source = layer.getSource(); + const size = map.getSize(); + const extent = view.calculateExtent(size); + const zoom = view.getZoom(); + const sourceProjection = source.getProjection() || view.getProjection(); + const transformedExtent = transformExtent(extent, view.getProjection(), sourceProjection); + const tileGrid = source.getTileGridForProjection(sourceProjection); + const resolution = view.getResolutionForZoom(zoom); + const currentZ = tileGrid.getZForResolution(resolution); + + let expectedTileCount = 0; + let loadedTileCount = 0; + + const tileCoordFunction = (tileCoord) => { + const tile = source.getTile(tileCoord[0], tileCoord[1], tileCoord[2], 1, sourceProjection); + const tileState = tile.getState(); + if (tileState === 2) { + loadedTileCount += 1; + expectedTileCount += 1; + } else if (tileState === 3) { + expectedTileCount += 1; + } + }; + + tileGrid.forEachTileCoord(transformedExtent, currentZ, tileCoordFunction); + + return { + expectedTileCount, + loadedTileCount, + }; +}; + +export const countTiles = (ui) => { + const map = ui.selected; + const view = map.getView(); + const layers = map.getLayers().getArray(); + + let totalExpectedTileCount = 0; + let totalLoadedTileCount = 0; + + const processLayer = (layer) => { + if (layer instanceof TileLayer) { + const { expectedTileCount, loadedTileCount } = processTileLayer(layer, map, view); + totalExpectedTileCount += expectedTileCount; + totalLoadedTileCount += loadedTileCount; + } else if (layer.getLayers) { + const subLayers = layer.getLayers().getArray(); + subLayers.forEach(processLayer); + } + }; + + layers.forEach(processLayer); + + return { + totalExpectedTileCount, + totalLoadedTileCount, + }; +}; + +export const countTilesForSpecifiedLayers = (ui, layersToCheck) => { + const map = ui.selected; + const view = map.getView(); + const layers = map.getLayers().getArray(); + const matchingLayers = layers.filter((layer) => { + const layerId = layer.wv.id; + return layersToCheck.includes(layerId); + }); + + let totalExpectedTileCount = 0; + let totalLoadedTileCount = 0; + + const processLayer = (layer) => { + if (layer instanceof TileLayer) { + const { expectedTileCount, loadedTileCount } = processTileLayer(layer, map, view); + totalExpectedTileCount += expectedTileCount; + totalLoadedTileCount += loadedTileCount; + } else if (layer.getLayers) { + const subLayers = layer.getLayers().getArray(); + subLayers.forEach(processLayer); + } + }; + + matchingLayers.forEach(processLayer); + + return { + totalExpectedTileCount, + totalLoadedTileCount, + }; +}; + +/** + * Formats redux date to match timezone of tile request urls. + * Used in formatDate() when there are subdaily tiles + * @param {string} timestamp + * @returns {string} + */ +export function convertTimestamp(timestamp) { + const date = new Date(timestamp); + // add 4 hours to the time + date.setHours(date.getHours() + 4); + // set the seconds to 0 + date.setSeconds(0); + // round down the minutes to the nearest multiple of 10 + const roundedMinutes = Math.floor(date.getMinutes() / 10) * 10; + // format the updated date back to a string + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(roundedMinutes).padStart(2, '0'); + + return `${year}-${month}-${day}T${hours}:${minutes}:00`; +} + +/** + * Formats redux date to match format of dates from tile request url + * @param {string} dateString + * @param {boolean} hasSubdailyLayers + * @returns {string} + */ +export function formatDate(dateString, hasSubdailyLayers) { + const date = new Date(dateString); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + + if (hasSubdailyLayers) { + const timestamp = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`; + const adjustedTimezone = convertTimestamp(timestamp); + return adjustedTimezone; + } + + return `${year}-${month}-${day}T00:00:00`; +} + +/** + * Returns date string for 1 week before a given date string + * @param {string} date + * @returns {string} + */ +export function weekAgo(date) { + const inputDate = new Date(date); + const oneWeekInMilliseconds = 7 * 24 * 60 * 60 * 1000; + const earlierDate = new Date(inputDate.getTime() - oneWeekInMilliseconds); + const earlierDateString = earlierDate.toString(); + return earlierDateString; +} + +/** + * Returns date string for 3 hours before a given date string + * @param {string} date + * @returns {string} + */ +export function threeHoursAgo(date) { + const inputDate = new Date(date); + const threeHoursInMilliseconds = 3 * 60 * 60 * 1000; + const earlierDate = new Date(inputDate.getTime() - threeHoursInMilliseconds); + const earlierDateString = earlierDate.toString(); + return earlierDateString; +} + +/** + * Returns date string for 27 hours before a given date string + * @param {string} date + * @returns {string} + */ +export function twentySevenHoursAgo(date) { + const inputDate = new Date(date); + const twentySevenHoursInMilliseconds = 27 * 60 * 60 * 1000; + const earlierDate = new Date(inputDate.getTime() - twentySevenHoursInMilliseconds); + const earlierDateString = earlierDate.toString(); + return earlierDateString; +} + +/** + * Compares two dates and returns true if the selected date is younger than the last date to check + * Used as a safeguard to prevent automatically stepping back farther than 1 week in kiosk mode + * @param {string} lastDateToCheck + * @param {string} selectedDate + * @returns {boolean} + */ +export function compareDailyDates(lastDateToCheck, selectedDate) { + const lastDate = new Date(lastDateToCheck); + const selected = new Date(selectedDate); + lastDate.setHours(0, 0, 0, 0); + selected.setHours(0, 0, 0, 0); + return selected > lastDate; +} + +/** + * Compares two dates and returns true if ONLY the hour value in selectedDate is greater than 3 hours ahead of lastDateToCheck + * Used as a safeguard to prevent automatically stepping back farther than 3 hours for subdaily tiles in kiosk mode + * @param {string} lastDateToCheck + * @param {string} selectedDate + * @returns {boolean} + */ +export function compareSubdailyDates(lastDateToCheck, selectedDate) { + const lastDate = new Date(lastDateToCheck); + const selected = new Date(selectedDate); + const lastDateHour = lastDate.getHours(); + const selectedDateHour = selected.getHours(); + // Calculate the hour difference, considering the 24-hour wraparound + const hourDifference = (selectedDateHour - lastDateHour + 24) % 24; + // Check if the hour value in selectedDate is exactly 3 hours behind lastDateToCheck + return hourDifference <= 3; +} + +// Updates the format of the selected date to a date format of YYYY-MM-DD +export function formatSelectedDate(date) { + const dateObj = new Date(date); + + const year = dateObj.getFullYear(); + const month = String(dateObj.getMonth() + 1).padStart(2, '0'); + const day = String(dateObj.getDate()).padStart(2, '0'); + + const formattedDate = `${year}-${month}-${day}`; + return formattedDate; +} diff --git a/web/js/modules/animation/actions.js b/web/js/modules/animation/actions.js index 7aa8d83a1b..d68a11ccd9 100644 --- a/web/js/modules/animation/actions.js +++ b/web/js/modules/animation/actions.js @@ -11,6 +11,8 @@ import { UPDATE_CROP_BOUNDS, TOGGLE_GIF, COLLAPSE_ANIMATION, + TOGGLE_AUTOPLAY, + PLAY_KIOSK_ANIMATIONS, } from './constants'; import util from '../../util/util'; import { TIME_SCALE_FROM_NUMBER } from '../date/constants'; @@ -107,3 +109,15 @@ export function toggleAnimationCollapse() { type: COLLAPSE_ANIMATION, }; } +export function toggleAnimationAutoplay() { + return { + type: TOGGLE_AUTOPLAY, + }; +} +export function playKioskAnimation(startDate, endDate) { + return { + type: PLAY_KIOSK_ANIMATIONS, + startDate, + endDate, + }; +} diff --git a/web/js/modules/animation/constants.js b/web/js/modules/animation/constants.js index 1a27ba6cf2..b46172a2c4 100644 --- a/web/js/modules/animation/constants.js +++ b/web/js/modules/animation/constants.js @@ -11,3 +11,5 @@ export const UPDATE_CROP_BOUNDS = 'ANIMATION/UPDATE_CROP_BOUNDS'; export const TOGGLE_GIF = 'ANIMATION/TOGGLE_GIF'; export const KEY_PRESS_ACTION = 'ANIMATION/KEY_PRESS_ACTION'; export const COLLAPSE_ANIMATION = 'ANIMATION/COLLAPSE_ANIMATION'; +export const TOGGLE_AUTOPLAY = 'ANIMATION/TOGGLE_AUTOPLAY'; +export const PLAY_KIOSK_ANIMATIONS = 'ANIMATION/PLAY_KIOSK_ANIMATIONS'; diff --git a/web/js/modules/animation/reducers.js b/web/js/modules/animation/reducers.js index 5a67fa9d59..d6a59e606e 100644 --- a/web/js/modules/animation/reducers.js +++ b/web/js/modules/animation/reducers.js @@ -13,6 +13,8 @@ import { TOGGLE_GIF, KEY_PRESS_ACTION, COLLAPSE_ANIMATION, + TOGGLE_AUTOPLAY, + PLAY_KIOSK_ANIMATIONS, } from './constants'; export const defaultState = { @@ -25,6 +27,7 @@ export const defaultState = { endDate: undefined, boundaries: undefined, isCollapsed: false, + autoplay: false, }; export function getInitialState(config) { return { @@ -105,6 +108,11 @@ export function animationReducer(state = defaultState, action) { ...state, isCollapsed: !state.isCollapsed, }; + case TOGGLE_AUTOPLAY: + return { + ...state, + autoplay: !state.autoplay, + }; case KEY_PRESS_ACTION: if (action.keyCode === 32 && state.isActive) { return { @@ -121,6 +129,15 @@ export function animationReducer(state = defaultState, action) { }; } return state; + case PLAY_KIOSK_ANIMATIONS: + return { + ...state, + loop: true, + speed: 6, + startDate: action.startDate, + endDate: action.endDate, + isPlaying: true, + }; default: return state; diff --git a/web/js/modules/location-search/util.js b/web/js/modules/location-search/util.js index 438b6c8b1f..1c1cda195f 100644 --- a/web/js/modules/location-search/util.js +++ b/web/js/modules/location-search/util.js @@ -19,14 +19,14 @@ const { LOCATION_SEARCH_COLLAPSED } = safeLocalStorage.keys; * @param {Array} coordinates * @param {Number} zoom */ -export function animateCoordinates(map, proj, coordinates, zoom) { +export function animateCoordinates(map, proj, coordinates, zoom, isKioskModeActive) { const { crs } = proj.selected; let [x, y] = coordinates; if (proj !== 'geographic') { [x, y] = transform(coordinates, CRS.GEOGRAPHIC, crs); } - fly(map, proj, [x, y], zoom); + fly(map, proj, [x, y], zoom, isKioskModeActive); } /** diff --git a/web/js/modules/map/util.js b/web/js/modules/map/util.js index b5162facf5..06d8f533a9 100644 --- a/web/js/modules/map/util.js +++ b/web/js/modules/map/util.js @@ -1,4 +1,5 @@ import * as olExtent from 'ol/extent'; +import ImageLayer from 'ol/layer/Image'; import { each as lodashEach, isUndefined as lodashIsUndefined, @@ -266,7 +267,7 @@ function promiseLayerGroup(layerGroup, map) { const layerPromiseArray = layers.map((layer) => { // TODO #3688 figure out why vector layers cause preloadinig issues - if (layer.isVector) return Promise.resolve(); + if (layer.isVector || layer instanceof ImageLayer) return Promise.resolve(); const layerExtent = layer.getExtent(); const extent = calculateExtent(layerExtent, map); return promiseTileLayer(layer, extent, map); diff --git a/web/js/modules/ui/actions.js b/web/js/modules/ui/actions.js index a27be34427..d440814440 100644 --- a/web/js/modules/ui/actions.js +++ b/web/js/modules/ui/actions.js @@ -1,6 +1,13 @@ import googleTagManager from 'googleTagManager'; -import { TOGGLE_DISTRACTION_FREE_MODE } from './constants'; +import { + TOGGLE_DISTRACTION_FREE_MODE, + TOGGLE_KIOSK_MODE, + CLEAR_ERROR_TILES, + SET_ERROR_TILES, + DISPLAY_STATIC_MAP, + READY_FOR_KIOSK_ANIMATION, +} from './constants'; import { CLOSE as CLOSE_MODAL } from '../modal/constants'; export default function toggleDistractionFreeMode() { @@ -22,3 +29,61 @@ export default function toggleDistractionFreeMode() { } }; } + +export function toggleKioskMode(isActive) { + return { + type: TOGGLE_KIOSK_MODE, + isActive, + }; +} + +export function setErrorTiles(errorTiles) { + return { + type: SET_ERROR_TILES, + errorTiles: { + dailyTiles: errorTiles.dailyTiles, + subdailyTiles: errorTiles.subdailyTiles, + blankTiles: errorTiles.blankTiles, + kioskTileCount: errorTiles.kioskTileCount, + lastCheckedDate: errorTiles.lastCheckedDate, + }, + }; +} + +export function clearErrorTiles() { + return (dispatch, getState) => { + const { ui: { errorTiles: { lastCheckedDate } } } = getState(); + const errorTiles = { + dailyTiles: [], + subdailyTiles: [], + blankTiles: [], + kioskTileCount: 0, + lastCheckedDate, + }; + + dispatch({ + type: CLEAR_ERROR_TILES, + errorTiles: { + dailyTiles: errorTiles.dailyTiles, + subdailyTiles: errorTiles.subdailyTiles, + blankTiles: errorTiles.blankTiles, + kioskTileCount: errorTiles.kioskTileCount, + lastCheckedDate: errorTiles.lastCheckedDate, + }, + }); + }; +} + +export function toggleStaticMap(isActive) { + return { + type: DISPLAY_STATIC_MAP, + isActive, + }; +} + +export function toggleReadyForKioskAnimation(toggleAnimation) { + return { + type: READY_FOR_KIOSK_ANIMATION, + toggleAnimation, + }; +} diff --git a/web/js/modules/ui/constants.js b/web/js/modules/ui/constants.js index 3a58f1ab2e..d6f2d71f14 100644 --- a/web/js/modules/ui/constants.js +++ b/web/js/modules/ui/constants.js @@ -1,2 +1,6 @@ -// eslint-disable-next-line import/prefer-default-export export const TOGGLE_DISTRACTION_FREE_MODE = 'UI/TOGGLE_DISTRACTION_FREE_MODE'; +export const TOGGLE_KIOSK_MODE = 'UI/TOGGLE_KIOSK_MODE'; +export const SET_ERROR_TILES = 'UI/SET_ERROR_TILES'; +export const CLEAR_ERROR_TILES = 'UI/CLEAR_ERROR_TILES'; +export const DISPLAY_STATIC_MAP = 'UI/DISPLAY_STATIC_MAP'; +export const READY_FOR_KIOSK_ANIMATION = 'UI/READY_FOR_KIOSK_ANIMATION'; diff --git a/web/js/modules/ui/reducers.js b/web/js/modules/ui/reducers.js index c1f165f33d..1696a7dd24 100644 --- a/web/js/modules/ui/reducers.js +++ b/web/js/modules/ui/reducers.js @@ -1,17 +1,65 @@ -import { assign as lodashAssign } from 'lodash'; -import { TOGGLE_DISTRACTION_FREE_MODE } from './constants'; +import { + TOGGLE_DISTRACTION_FREE_MODE, + TOGGLE_KIOSK_MODE, + SET_ERROR_TILES, + DISPLAY_STATIC_MAP, + CLEAR_ERROR_TILES, + READY_FOR_KIOSK_ANIMATION, +} from './constants'; export const uiState = { isDistractionFreeModeActive: false, + isKioskModeActive: false, + displayStaticMap: false, + eic: '', // sa == subdaily-animation, da == daily-animation, ss== subdaily-static, ds == daily-static + errorTiles: { + dailyTiles: [], + subdailyTiles: [], + blankTiles: [], + kioskTileCount: 0, + lastCheckedDate: null, + }, + readyForKioskAnimation: false, }; export default function uiReducers(state = uiState, action) { switch (action.type) { case TOGGLE_DISTRACTION_FREE_MODE: - return lodashAssign({}, state, { + return { + ...state, isDistractionFreeModeActive: !state.isDistractionFreeModeActive, - }); + }; + case TOGGLE_KIOSK_MODE: + return { + ...state, + isKioskModeActive: action.isActive, + }; + case SET_ERROR_TILES: + return { + ...state, + errorTiles: { + ...action.errorTiles, + }, + }; + case CLEAR_ERROR_TILES: + return { + ...state, + errorTiles: { + ...action.errorTiles, + }, + }; + case DISPLAY_STATIC_MAP: + return { + ...state, + displayStaticMap: action.isActive, + }; + case READY_FOR_KIOSK_ANIMATION: + return { + ...state, + readyForKioskAnimation: action.toggleAnimation, + }; default: return state; } } + diff --git a/web/js/ol/lookupimagetile.js b/web/js/ol/lookupimagetile.js index af42fe56c3..8a3eeafb9f 100644 --- a/web/js/ol/lookupimagetile.js +++ b/web/js/ol/lookupimagetile.js @@ -6,6 +6,8 @@ class LookupImageTile extends OlImageTile { super(tileCoord, state, src, crossOrigin, tileLoadFunction, sourceOptions); this.lookup_ = lookup; this.canvas_ = null; + // Store custom tileLoadFunction + this.customTileLoadFunction_ = tileLoadFunction; } } LookupImageTile.prototype.getImage = function() { @@ -46,6 +48,12 @@ LookupImageTile.prototype.load = function() { } } g.putImageData(imageData, 0, 0); + + // uses the tileload function passed from layerbuilder + if (that.customTileLoadFunction_) { + that.customTileLoadFunction_(that, that.src_); + } + that.state = OlTileState.LOADED; that.changed(); that.image_.removeEventListener('load', onImageLoad); diff --git a/web/scss/components/modal.scss b/web/scss/components/modal.scss index 113d62707e..fe044dfa7c 100644 --- a/web/scss/components/modal.scss +++ b/web/scss/components/modal.scss @@ -205,3 +205,8 @@ .modal-dialog.light .modal-body { background: #eee; } + +.modal-backdrop.show { + opacity: 0 !important; + background-color: transparent !important; +} diff --git a/web/scss/components/tooltip.scss b/web/scss/components/tooltip.scss index 9f170aba34..1eab789643 100644 --- a/web/scss/components/tooltip.scss +++ b/web/scss/components/tooltip.scss @@ -218,6 +218,13 @@ top: 10px; } +#kiosk-setting-tooltip { + width: 70%; + padding: 4px; + position: relative; + top: 10px; +} + #temperature-setting-tooltip { width: 70%; padding: 4px; diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index 7324ffb3a8..6de9e0bb4e 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -112,8 +112,6 @@ cursor: default; } - - .wv-animation-widget { width: 334px; border-radius: 5px; @@ -693,3 +691,54 @@ a .wv-animation-widget-icon { border: 0; } } + +.wv-kiosk-animation-wrapper { + z-index: 100; + display: flex; + justify-content: center; + align-items: flex-end; + position: fixed; + bottom: 0; + left: 0; + right: 0; + margin-bottom: 70px; +} + +.wv-kiosk-animation-widget { + border: $wv-dark-menu-border; + background: $wv-transparent-black; + border-radius: $wv-menu-border-radius; + color: #fff; + display: flex; + flex-flow: row nowrap; + margin-left: 10px; + margin-right: 10px; + padding: 20px; +} + +.kiosk-animation-widget-row { + display: flex; + justify-content: center; + align-items: center; +} + +.kiosk-animation-widget-label { + font-size: 24px; + color: #fff; + display: block; + text-align: center; + font-family: Helvetica, sans-serif; + letter-spacing: 0.125em; +} + +#kiosk-animation-widget-middle-label { + margin-left: 8px; + margin-right: 8px; + font-size: 24px; + color: #fff; + display: block; + text-align: center; + font-family: Helvetica, sans-serif; + letter-spacing: 0.125em; + font-style: italic; +} \ No newline at end of file diff --git a/web/scss/features/compare.scss b/web/scss/features/compare.scss index 26296665a4..02f55ed783 100644 --- a/web/scss/features/compare.scss +++ b/web/scss/features/compare.scss @@ -165,6 +165,25 @@ span { padding-bottom: 2px; } + + &.nav-link { + &.first-tab, &.second-tab { + background-color: #28292a; + } + + &.active { + background-color: #fff; + } + + // Toggle layer icon color on hover by repositioning the SVG + &:not(.active):hover > i { + background-position: 0 -10px; + } + + &:not(.active):hover { + background-color: #404542; + } + } } /* Mobile */ @@ -198,7 +217,7 @@ border-bottom-right-radius: 5px; } - &:hover:not(.compare-btn-selected) { + .active.nav-link:not(.compare-btn-selected) { border-color: #fff; } } diff --git a/web/scss/features/events.scss b/web/scss/features/events.scss index a1e54acdcf..4887b86a2c 100644 --- a/web/scss/features/events.scss +++ b/web/scss/features/events.scss @@ -129,6 +129,7 @@ font-size: 14px; font-family: $wv-monospace-font; cursor: pointer; + text-decoration: none; } .active { diff --git a/web/scss/features/map.scss b/web/scss/features/map.scss index a55f7d0731..70caf242bf 100644 --- a/web/scss/features/map.scss +++ b/web/scss/features/map.scss @@ -260,12 +260,23 @@ background-position: -14px; } -.distraction-free-active .wv-map-zoom, +.distraction-free-active .wv-map-zoom { + display: none; +} + .distraction-free-active .wv-map-scale-imperial, .distraction-free-active .wv-map-scale-metric { display: none; } +.distraction-free-active .wv-map-scale-imperial { + bottom: 28px; +} + +.distraction-free-active .wv-map-scale-metric { + bottom: 45px; +} + .dateline-text { rect { fill: #444; diff --git a/web/scss/features/sidebar.scss b/web/scss/features/sidebar.scss index 572051cae7..86bacf4aa8 100644 --- a/web/scss/features/sidebar.scss +++ b/web/scss/features/sidebar.scss @@ -78,7 +78,7 @@ height: 32px; } - .nav-item a:hover { + .nav-item a:not(.active):hover { color: #fff !important; } @@ -88,6 +88,7 @@ .tab-content .nav-tabs { border-bottom: 3px solid #dee2e6; + padding-bottom: 4px; } .nav-item { diff --git a/web/scss/features/timeline.scss b/web/scss/features/timeline.scss index 3f5c40a356..acea968772 100644 --- a/web/scss/features/timeline.scss +++ b/web/scss/features/timeline.scss @@ -3,12 +3,44 @@ button:focus { outline: 0; } +#distraction-free-timeline, #timeline { left: 0; z-index: 3; } +.kiosk-year, .kiosk-month, .kiosk-day, .kiosk-hours, .kiosk-minutes, .kiosk-seconds, .kiosk-timezone { + font-family: Helvetica, sans-serif; + font-size: 34px; + letter-spacing: initial; + min-width: 46px; + text-align: center; +} + +.kiosk-year, .kiosk-month { + min-width: 80px; +} + +.kiosk-month { + padding: 0 8px; +} + +.kiosk-hours { + margin-left: 8px; +} + +.kiosk-colon { + font-family: Helvetica, sans-serif; + font-size: 37px; + letter-spacing: initial; +} + +.kiosk-timezone { + padding-left: 8px; +} + .timeline-inner { + height: 67px; position: absolute; border: $wv-dark-menu-border; background: $wv-transparent-black; @@ -17,13 +49,29 @@ button:focus { flex-flow: row nowrap; margin-left: 10px; margin-right: 10px; - height: 67px; bottom: 10px; } +#distraction-free-timeline { + position: absolute; + border: $wv-dark-menu-border; + background: rgba(35 31 32 / 60%); + display: flex; + flex-flow: row nowrap; + margin: 0; + bottom: 0; + left: 0; + border-radius: 0; + border-top-right-radius: 15px; +} + #timeline-header { - margin-top: 2px; min-width: 310px; + margin-top: 2px; +} + +#distraction-free-timeline-header, +#timeline-header { display: inline-block; &.subdaily { @@ -813,6 +861,25 @@ button:focus { fill: #1a1a1a; } +#distraction-free-timeline-header { + color: #fff; + font-family: Helvetica, sans-serif; + font-size: 37px; + display: flex; + justify-content: center; + align-items: center; + padding: 33px 10px 34px 51px; + + &.subdaily { + width: unset; + min-width: 320px; + } + + .mobile { + max-width: 390px; + } +} + .mobile-animate-button { position: absolute; background: $wv-transparent-black;