diff --git a/deployment/frontend/.prettierrc b/deployment/frontend/.prettierrc new file mode 100644 index 000000000..ef58ff9d1 --- /dev/null +++ b/deployment/frontend/.prettierrc @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "tabWidth": 4, + "semi": false, + "singleQuote": true +} diff --git a/deployment/frontend/Dockerfile b/deployment/frontend/Dockerfile index bedae96ab..43243a6f2 100644 --- a/deployment/frontend/Dockerfile +++ b/deployment/frontend/Dockerfile @@ -11,7 +11,7 @@ COPY . . # You can setup env vars here or via `.env` file -RUN npm ci +RUN npm ci -f RUN npm run build EXPOSE 3000 diff --git a/deployment/frontend/package-lock.json b/deployment/frontend/package-lock.json index f50db81c8..af26f7920 100644 --- a/deployment/frontend/package-lock.json +++ b/deployment/frontend/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", + "@mapbox/mapbox-gl-draw": "^1.4.3", "@mapbox/mapbox-gl-geocoder": "^5.0.1", "@portaljs/ckan": "^0.1.0", "@radix-ui/react-tooltip": "^1.0.7", @@ -17,6 +18,7 @@ "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.6", "@tanstack/react-query": "^4.32.6", + "@tanstack/react-table": "^8.10.7", "@tiptap/extension-bold": "^2.1.12", "@tiptap/extension-code": "^2.1.12", "@tiptap/extension-document": "^2.1.12", @@ -32,28 +34,43 @@ "@trpc/next": "^10.37.1", "@trpc/react-query": "^10.37.1", "@trpc/server": "^10.37.1", + "@vizzuality/layer-manager-plugin-mapboxgl": "^2.0.3", + "@vizzuality/layer-manager-provider-carto": "^2.0.3", + "@vizzuality/layer-manager-utils": "^1.1.4", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "js-deep-equals": "^2.1.1", "ky": "^1.0.1", "mapbox-gl": "^2.15.0", "next": "^13.5.4", "next-auth": "^4.23.0", "next-seo": "^6.1.0", + "old-vizzuality-components": "npm:vizzuality-components@1.3.0", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.47.0", "react-map-gl": "^7.1.6", "react-modal": "^3.16.1", + "react-query": "^3.39.3", "react-sortablejs": "^6.1.4", + "react-vega": "^7.6.0", + "sass": "^1.69.5", "sortablejs": "^1.15.0", "superjson": "^1.13.1", "swiper": "^10.3.1", "tailwind-merge": "^1.14.0", "ts-pattern": "^5.0.5", - "zod": "^3.22.4" + "use-debounce": "^9.0.4", + "vega": "^5.25.0", + "vega-lite": "^5.16.1", + "vizzuality-components": "^3.0.3", + "zod": "^3.22.4", + "zustand": "^4.4.4" }, "devDependencies": { "@types/eslint": "^8.44.2", + "@types/lodash": "^4.14.200", + "@types/mapbox__mapbox-gl-draw": "^1.4.5", "@types/mapbox__mapbox-gl-geocoder": "^4.7.6", "@types/node": "^18.16.0", "@types/react": "^18.2.20", @@ -264,6 +281,40 @@ "node": ">=6.9.0" } }, + "node_modules/@deck.gl/core": { + "version": "8.9.32", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-8.9.32.tgz", + "integrity": "sha512-LQA2wPYxuWqZyxrlFZMsLOr3tBHdOFXMMVz4wBNATCyObbc9THly8FgW2N48tHT6OY2fM2N5wmbw9uRLsCg1kw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@loaders.gl/core": "^3.4.13", + "@loaders.gl/images": "^3.4.13", + "@luma.gl/constants": "^8.5.21", + "@luma.gl/core": "^8.5.21", + "@luma.gl/webgl": "^8.5.21", + "@math.gl/core": "^3.6.2", + "@math.gl/sun": "^3.6.2", + "@math.gl/web-mercator": "^3.6.2", + "@probe.gl/env": "^3.5.0", + "@probe.gl/log": "^3.5.0", + "@probe.gl/stats": "^3.5.0", + "gl-matrix": "^3.0.0", + "math.gl": "^3.6.2", + "mjolnir.js": "^2.7.0" + } + }, + "node_modules/@deck.gl/mapbox": { + "version": "8.9.32", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-8.9.32.tgz", + "integrity": "sha512-SFUiHIHnonEloiz4702oO4t91nqhgV7fcrYtu5RPY5Jvq1DsXo2xEU+E9QpNZLtoB8doS56RdS6eCSZV5LtVOA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@types/mapbox-gl": "^2.6.3" + }, + "peerDependencies": { + "@deck.gl/core": "^8.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -453,6 +504,140 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@loaders.gl/core": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-3.4.14.tgz", + "integrity": "sha512-5PFcjv7xC8AYL17juDMrvo8n0Fcwg9s8F4BaM2YCNUsb9RCI2SmLuIFJMcx1GgHO5vL0WiTIKO+JT4n1FuNR6w==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "@loaders.gl/loader-utils": "3.4.14", + "@loaders.gl/worker-utils": "3.4.14", + "@probe.gl/log": "^4.0.1" + } + }, + "node_modules/@loaders.gl/core/node_modules/@probe.gl/env": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.0.4.tgz", + "integrity": "sha512-sYNGqesDfWD6dFP5oNZtTeFA4Z6ak5T4a8BNPdNhoqy7PK9w70JHrb6mv+RKWqKXq33KiwCDWL7fYxx2HuEH2w==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@loaders.gl/core/node_modules/@probe.gl/log": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-4.0.4.tgz", + "integrity": "sha512-WpmXl6njlBMwrm8HBh/b4kSp/xnY1VVmeT4PWUKF+RkVbFuKQbsU11dA1IxoMd7gSY+5DGIwxGfAv1H5OMzA4A==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@probe.gl/env": "4.0.4" + } + }, + "node_modules/@loaders.gl/images": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-3.4.14.tgz", + "integrity": "sha512-tL447hTWhOKBOB87SE4hvlC8OkbRT0mEaW1a/wIS9f4HnYDa/ycRLMV+nvdvYMZur4isNPam44oiRqi7GcILkg==", + "dependencies": { + "@loaders.gl/loader-utils": "3.4.14" + } + }, + "node_modules/@loaders.gl/loader-utils": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-3.4.14.tgz", + "integrity": "sha512-HCTY2/F83RLbZWcTvWLVJ1vke3dl6Bye20HU1AqkA37J2vzHwOZ8kj6eee8eeSkIkf7VIFwjyhVJxe0flQE/Bw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "@loaders.gl/worker-utils": "3.4.14", + "@probe.gl/stats": "^4.0.1" + } + }, + "node_modules/@loaders.gl/loader-utils/node_modules/@probe.gl/stats": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-4.0.4.tgz", + "integrity": "sha512-SDuSY/D4yDL6LQDa69l/GCcnZLRiGYdyvYkxWb0CgnzTPdPrcdrzGkzkvpC3zsA4fEFw2smlDje370QGHwlisg==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@loaders.gl/worker-utils": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-3.4.14.tgz", + "integrity": "sha512-PUSwxoAYbskisXd0KfYEQ902b0igBA2UAWdP6PzPvY+tJmobfh74dTNwrrBQ1rGXQxxmGx6zc6/ksX6mlIzIrg==", + "dependencies": { + "@babel/runtime": "^7.3.1" + } + }, + "node_modules/@luma.gl/constants": { + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-8.5.21.tgz", + "integrity": "sha512-aJxayGxTT+IRd1vfpcgD/cKSCiVJjBNiuiChS96VulrmCvkzUOLvYXr42y5qKB4RyR7vOIda5uQprNzoHrhQAA==" + }, + "node_modules/@luma.gl/core": { + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-8.5.21.tgz", + "integrity": "sha512-11jQJQEMoR/IN2oIsd4zFxiQJk6FE+xgVIMUcsCTBuzafTtQZ8Po9df8mt+MVewpDyBlTVs6g8nxHRH4np1ukA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.21", + "@luma.gl/engine": "8.5.21", + "@luma.gl/gltools": "8.5.21", + "@luma.gl/shadertools": "8.5.21", + "@luma.gl/webgl": "8.5.21" + } + }, + "node_modules/@luma.gl/engine": { + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-8.5.21.tgz", + "integrity": "sha512-IG3WQSKXFNUEs8QG7ZjHtGiOtsakUu+BAxtJ6997A6/F06yynZ44tPe5NU70jG9Yfu3kV0LykPZg7hO3vXZDiA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.21", + "@luma.gl/gltools": "8.5.21", + "@luma.gl/shadertools": "8.5.21", + "@luma.gl/webgl": "8.5.21", + "@math.gl/core": "^3.5.0", + "@probe.gl/env": "^3.5.0", + "@probe.gl/stats": "^3.5.0", + "@types/offscreencanvas": "^2019.7.0" + } + }, + "node_modules/@luma.gl/gltools": { + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/@luma.gl/gltools/-/gltools-8.5.21.tgz", + "integrity": "sha512-6qZ0LaT2Mxa4AJT5F44TFoaziokYiHUwO45vnM/NYUOIu9xevcmS6VtToawytMEACGL6PDeDyVqP3Y80SDzq5g==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.21", + "@probe.gl/env": "^3.5.0", + "@probe.gl/log": "^3.5.0", + "@types/offscreencanvas": "^2019.7.0" + } + }, + "node_modules/@luma.gl/shadertools": { + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-8.5.21.tgz", + "integrity": "sha512-WQah7yFDJ8cNCLPYpIm3r0wSlXLvjoA279fcknmATvvkW3/i8PcCJ/nYEBJO3hHEwwMQxD16+YZu/uwGiifLMg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@math.gl/core": "^3.5.0" + } + }, + "node_modules/@luma.gl/webgl": { + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-8.5.21.tgz", + "integrity": "sha512-ZVLO4W5UuaOlzZIwmFWhnmZ1gYoU97a+heMqxLrSSmCUAsSu3ZETUex9gOmzdM1WWxcdWaa3M68rvKCNEgwz0Q==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.21", + "@luma.gl/gltools": "8.5.21", + "@probe.gl/env": "^3.5.0", + "@probe.gl/stats": "^3.5.0" + } + }, + "node_modules/@mapbox/extent": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@mapbox/extent/-/extent-0.4.0.tgz", + "integrity": "sha512-MSoKw3qPceGuupn04sdaJrFeLKvcSETVLZCGS8JA9x6zXQL3FWiKaIXYIZEDXd5jpXpWlRxinCZIN49yRy0C9A==" + }, "node_modules/@mapbox/fusspot": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@mapbox/fusspot/-/fusspot-0.4.0.tgz", @@ -462,6 +647,50 @@ "xtend": "^4.0.1" } }, + "node_modules/@mapbox/geojson-area": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz", + "integrity": "sha512-bBqqFn1kIbLBfn7Yq1PzzwVkPYQr9lVUeT8Dhd0NL5n76PBuXzOcuLV7GOSbEB1ia8qWxH4COCvFpziEu/yReA==", + "dependencies": { + "wgs84": "0.0.0" + } + }, + "node_modules/@mapbox/geojson-coords": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-coords/-/geojson-coords-0.0.2.tgz", + "integrity": "sha512-YuVzpseee/P1T5BWyeVVPppyfmuXYHFwZHmybkqaMfu4BWlOf2cmMGKj2Rr92MwfSTOCSUA0PAsVGRG8akY0rg==", + "dependencies": { + "@mapbox/geojson-normalize": "0.0.1", + "geojson-flatten": "^1.0.4" + } + }, + "node_modules/@mapbox/geojson-extent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-extent/-/geojson-extent-1.0.1.tgz", + "integrity": "sha512-hh8LEO3djT4fqfr8sSC6wKt+p0TMiu+KOLMBUiFOyj+zGq7+IXwQGl0ppCVDkyzCewyd9LoGe9zAvDxXrLfhLw==", + "dependencies": { + "@mapbox/extent": "0.4.0", + "@mapbox/geojson-coords": "0.0.2", + "rw": "~0.1.4", + "traverse": "~0.6.6" + }, + "bin": { + "geojson-extent": "bin/geojson-extent" + } + }, + "node_modules/@mapbox/geojson-extent/node_modules/rw": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz", + "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" + }, + "node_modules/@mapbox/geojson-normalize": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-normalize/-/geojson-normalize-0.0.1.tgz", + "integrity": "sha512-82V7YHcle8lhgIGqEWwtXYN5cy0QM/OHq3ypGhQTbvHR57DF0vMHMjjVSQKFfVXBe/yWCBZTyOuzvK7DFFnx5Q==", + "bin": { + "geojson-normalize": "geojson-normalize" + } + }, "node_modules/@mapbox/geojson-rewind": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", @@ -482,6 +711,20 @@ "node": ">= 0.6" } }, + "node_modules/@mapbox/mapbox-gl-draw": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.4.3.tgz", + "integrity": "sha512-03qIJgyGmm0IoTZbV/cfODru9jRGogi4LcQ3maxIJDKccq1gY3ofgt2UYPkeU143ElxitZahEythNQv1NpsLhg==", + "dependencies": { + "@mapbox/geojson-area": "^0.2.2", + "@mapbox/geojson-extent": "^1.0.1", + "@mapbox/geojson-normalize": "^0.0.1", + "@mapbox/point-geometry": "^0.1.0", + "hat": "0.0.3", + "lodash.isequal": "^4.5.0", + "xtend": "^4.0.2" + } + }, "node_modules/@mapbox/mapbox-gl-geocoder": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-geocoder/-/mapbox-gl-geocoder-5.0.1.tgz", @@ -593,6 +836,38 @@ "gl-style-validate": "dist/gl-style-validate.mjs" } }, + "node_modules/@math.gl/core": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-3.6.3.tgz", + "integrity": "sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@math.gl/types": "3.6.3", + "gl-matrix": "^3.4.0" + } + }, + "node_modules/@math.gl/sun": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-3.6.3.tgz", + "integrity": "sha512-mrx6CGYYeTNSQttvcw0KVUy+35YDmnjMqpO/o0t06Vcghrt0HNruB/ScRgUSbJrgkbOg1Vcqm23HBd++clzQzw==", + "dependencies": { + "@babel/runtime": "^7.12.0" + } + }, + "node_modules/@math.gl/types": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-3.6.3.tgz", + "integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==" + }, + "node_modules/@math.gl/web-mercator": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-3.6.3.tgz", + "integrity": "sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "gl-matrix": "^3.4.0" + } + }, "node_modules/@next/env": { "version": "13.5.4", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz", @@ -607,66 +882,6 @@ "glob": "7.1.7" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz", - "integrity": "sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz", - "integrity": "sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz", - "integrity": "sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz", - "integrity": "sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-linux-x64-gnu": { "version": "13.5.4", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz", @@ -697,51 +912,6 @@ "node": ">= 10" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz", - "integrity": "sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz", - "integrity": "sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz", - "integrity": "sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -805,6 +975,31 @@ "react-dom": "^18.2.0" } }, + "node_modules/@probe.gl/env": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.6.0.tgz", + "integrity": "sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@probe.gl/log": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.6.0.tgz", + "integrity": "sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@probe.gl/env": "3.6.0" + } + }, + "node_modules/@probe.gl/stats": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.6.0.tgz", + "integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, "node_modules/@radix-ui/primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", @@ -1384,6 +1579,37 @@ } } }, + "node_modules/@tanstack/react-table": { + "version": "8.10.7", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.7.tgz", + "integrity": "sha512-bXhjA7xsTcsW8JPTTYlUg/FuBpn8MNjiEPhkNhIGCUR6iRQM2+WEco4OBpvDeVcR9SE+bmWLzdfiY7bCbCSVuA==", + "dependencies": { + "@tanstack/table-core": "8.10.7" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.10.7", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.10.7.tgz", + "integrity": "sha512-KQk5OMg5OH6rmbHZxuNROvdI+hKDIUxANaHlV+dPlNN7ED3qYQ/WkpY2qlXww1SIdeMlkIhpN/2L00rof0fXFw==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tiptap/core": { "version": "2.1.12", "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.12.tgz", @@ -1681,14 +1907,18 @@ "node_modules/@types/estree": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", - "dev": true + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==" }, "node_modules/@types/geojson": { "version": "7946.0.11", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.11.tgz", "integrity": "sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==" }, + "node_modules/@types/hammerjs": { + "version": "2.0.43", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.43.tgz", + "integrity": "sha512-wqxfwHk83RS7+6OpytGdo5wqkqtvx+bGaIs1Rwm5NrtQHUfL4OgWs/5p0OipmjmT+fexePh37Ek+mqIpdNjQKA==" + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.3.tgz", @@ -1723,6 +1953,22 @@ "@types/node": "*" } }, + "node_modules/@types/lodash": { + "version": "4.14.200", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz", + "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==", + "dev": true + }, + "node_modules/@types/mapbox__mapbox-gl-draw": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/mapbox__mapbox-gl-draw/-/mapbox__mapbox-gl-draw-1.4.5.tgz", + "integrity": "sha512-TnJMtupXFJQMdVasqJyJYuNuFthyW0TurJ1hyT1ccNxkTH1osQYH2VM2PlJcB8B0rFPv6pl3YjW/PJv+6EKIOg==", + "dev": true, + "dependencies": { + "@types/geojson": "*", + "@types/mapbox-gl": "*" + } + }, "node_modules/@types/mapbox__mapbox-gl-geocoder": { "version": "4.7.6", "resolved": "https://registry.npmjs.org/@types/mapbox__mapbox-gl-geocoder/-/mapbox__mapbox-gl-geocoder-4.7.6.tgz", @@ -1768,6 +2014,11 @@ "integrity": "sha512-qZqHmdGEALeSATMB1djT1S5szv6Wtpb7DKpHrt2XG4iyKlV7C2Xk8GmDXr1KXakOqUfX6ohw7ceruYt4NVmB1Q==", "peer": true }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.2", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.2.tgz", + "integrity": "sha512-ujCjOxeA07IbEBQYAkoOI+XFw5sT3nhWJ/xZfPR6reJppDG7iPQPZacQiLTtWH1b3a2NYXWlxvYqa40y/LAixQ==" + }, "node_modules/@types/prop-types": { "version": "15.7.8", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", @@ -2020,6 +2271,65 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vizzuality/layer-manager": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vizzuality/layer-manager/-/layer-manager-5.0.3.tgz", + "integrity": "sha512-nMacGn/KJBR/zuTn0KJpp/fS5oFoz6uuSBeFB3/+IRejXYc9D/v4jg7bytc9dbVY4T+kS5FcFu4JluHyKx397w==", + "dependencies": { + "@vizzuality/layer-manager-utils": "^1.1.4", + "axios": "^0.21.4", + "cancelable-promise": "^3.2.3", + "fast-deep-equal": "^3.1.3", + "js-deep-equals": "^2.1.1", + "mapbox-gl": "^2.2.0" + } + }, + "node_modules/@vizzuality/layer-manager-plugin-mapboxgl": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vizzuality/layer-manager-plugin-mapboxgl/-/layer-manager-plugin-mapboxgl-2.0.3.tgz", + "integrity": "sha512-HJIizvSVgkGMj84LqZ3AvsphAI9S05LFoZO8E7CaE0vJ0g1eY1gtcfAYmSF0zhrzLtsfE4CvC6nHaQLyQdsBEg==", + "dependencies": { + "@deck.gl/core": "^8.7.11", + "@deck.gl/mapbox": "^8.7.11", + "@vizzuality/layer-manager-utils": "^1.1.4", + "cancelable-promise": "^3.2.3", + "react": "^17.0.2" + }, + "peerDependencies": { + "@deck.gl/core": "^8.7.3", + "@deck.gl/mapbox": "^8.7.4" + } + }, + "node_modules/@vizzuality/layer-manager-plugin-mapboxgl/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vizzuality/layer-manager-provider-carto": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vizzuality/layer-manager-provider-carto/-/layer-manager-provider-carto-2.0.3.tgz", + "integrity": "sha512-jkOH5iNFt3DcOehkM6UpXbMK6ZAQhHCjQlJZD0QMu8uD6CxB4LntlCSyKRxSWJ+Tp18e5YxyLT5LFnYW2URkyQ==", + "dependencies": { + "@vizzuality/layer-manager": "^5.0.3", + "@vizzuality/layer-manager-utils": "^1.1.4" + } + }, + "node_modules/@vizzuality/layer-manager-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@vizzuality/layer-manager-utils/-/layer-manager-utils-1.1.4.tgz", + "integrity": "sha512-yTrrsKJ1GF8om1vL1UZzmoIJB4KnhGI+Ow89qiMpNPdnfGzTUH3rhLpOJA9CDCYQ7Z2kIEu68RMsRa7h5BhhFQ==", + "dependencies": { + "axios": "^0.21.4", + "cancelable-promise": "^3.2.3" + } + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -2041,6 +2351,14 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/add-dom-event-listener": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", + "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", + "dependencies": { + "object-assign": "4.x" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2061,7 +2379,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2070,7 +2387,6 @@ "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" }, @@ -2157,6 +2473,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-move": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array-move/-/array-move-2.2.2.tgz", + "integrity": "sha512-lKc6C+nsOSA1o7eHSP/HshlGDYUI7QKyaus5kPDm2zEEPQID9xlspnraLR8l+rDlqg9mGo8ziE7F8TEnF6D3Tw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2349,6 +2676,14 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -2358,6 +2693,20 @@ "dequal": "^2.0.3" } }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2368,6 +2717,14 @@ "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==" }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2396,6 +2753,21 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "node_modules/browserslist": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", @@ -2557,6 +2929,11 @@ "node": ">=8" } }, + "node_modules/cancelable-promise": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/cancelable-promise/-/cancelable-promise-3.2.3.tgz", + "integrity": "sha512-P0yW/pq7ZEx4znOnDd4PqA5l+I/INpo32BE4Rg3QQxVBhKk7g9hAbmJt7oYbffo1q8j+1QfSZHGmjHMqj8RoJw==" + }, "node_modules/caniuse-lite": { "version": "1.0.30001547", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", @@ -2653,9 +3030,9 @@ } }, "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/client-only": { "version": "0.0.1", @@ -2685,7 +3062,6 @@ "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" }, @@ -2696,8 +3072,7 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -2718,6 +3093,19 @@ "node": ">= 6" } }, + "node_modules/component-classes": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", + "integrity": "sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==", + "dependencies": { + "component-indexof": "0.0.3" + } + }, + "node_modules/component-indexof": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", + "integrity": "sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2745,6 +3133,13 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -2765,6 +3160,15 @@ "node": ">= 8" } }, + "node_modules/css-animation": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz", + "integrity": "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==", + "dependencies": { + "babel-runtime": "6.x", + "component-classes": "^1.2.5" + } + }, "node_modules/csscolorparser": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", @@ -2786,6 +3190,232 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", + "peer": true + }, + "node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "peer": true, + "dependencies": { + "d3-array": "^1.1.1" + } + }, + "node_modules/d3-contour/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "peer": true + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "peer": true, + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, + "node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "peer": true, + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/d3-geo-projection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", + "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", + "dependencies": { + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" + }, + "bin": { + "geo2svg": "bin/geo2svg.js", + "geograticule": "bin/geograticule.js", + "geoproject": "bin/geoproject.js", + "geoquantize": "bin/geoquantize.js", + "geostitch": "bin/geostitch.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-geo/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", + "peer": true + }, + "node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "peer": true, + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "peer": true + }, + "node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "peer": true, + "dependencies": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "peer": true, + "dependencies": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "node_modules/d3-scale/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "peer": true + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "peer": true, + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "peer": true + }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==", + "peer": true + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -2924,6 +3554,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2941,6 +3579,11 @@ "node": ">=6" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2975,6 +3618,11 @@ "node": ">=6.0.0" } }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, "node_modules/earcut": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", @@ -3152,7 +3800,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -3646,6 +4293,11 @@ "node": ">= 6" } }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3725,6 +4377,25 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3789,19 +4460,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3843,6 +4501,11 @@ "node": ">= 0.6.0" } }, + "node_modules/geojson-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/geojson-flatten/-/geojson-flatten-1.1.1.tgz", + "integrity": "sha512-k/6BCd0qAt7vdqdM1LkLfAy72EsLDy0laNwX0x2h49vfYCiQkRc4PSra8DNEdJ10EKRpwEvDXMb0dBknTJuWpQ==" + }, "node_modules/geojson-vt": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", @@ -3919,7 +4582,6 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4053,6 +4715,14 @@ "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -4138,6 +4808,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hat": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", + "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==", + "engines": { + "node": "*" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -4174,6 +4852,18 @@ "node": ">=10.19.0" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -4202,6 +4892,11 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4263,6 +4958,19 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -4336,6 +5044,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4676,6 +5406,19 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-deep-equals": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/js-deep-equals/-/js-deep-equals-2.1.1.tgz", + "integrity": "sha512-l568Khc0UBoO/bA3BpFPUM2PKNcUMR0WW2Ytb639iZOPCd1tRabUJuYDGg8+3UR0Wy6yLUhSdDA79orFq0dV4A==", + "dependencies": { + "murmurhash": "0.0.2" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4864,6 +5607,11 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4962,6 +5710,23 @@ "markdown-it": "bin/markdown-it.js" } }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "node_modules/math.gl": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/math.gl/-/math.gl-3.6.3.tgz", + "integrity": "sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==", + "dependencies": { + "@math.gl/core": "3.6.3" + } + }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -5024,6 +5789,11 @@ "node": ">=8.6" } }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -5099,12 +5869,41 @@ "node": ">= 6" } }, + "node_modules/mjolnir.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.7.1.tgz", + "integrity": "sha512-72BeUWgTv2cj5aZQKpwL8caNUFhXZ9bDm1hxpNj70XJQ62IBnTZmtv/WPxJvtaVNhzNo+D2U8O6ryNI0zImYcw==", + "dependencies": { + "@types/hammerjs": "^2.0.41", + "hammerjs": "^2.0.8" + }, + "engines": { + "node": ">= 4", + "npm": ">= 3" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/murmurhash": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/murmurhash/-/murmurhash-0.0.2.tgz", + "integrity": "sha512-LKlwdZKWzvCQpMszb2HO5leJ7P9T4m5XuDKku8bM0uElrzqK9cn0+iozwQS8jO4SNjrp4w7olalgd8WgsIjhWA==", + "engines": { + "node": "*" + } + }, "node_modules/murmurhash-js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", @@ -5120,6 +5919,14 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -5225,6 +6032,25 @@ "react-dom": ">=16.0.0" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -5439,6 +6265,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, "node_modules/oidc-token-hash": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", @@ -5447,49 +6278,173 @@ "node": "^10.13.0 || >=12.0.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/old-vizzuality-components": { + "name": "vizzuality-components", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vizzuality-components/-/vizzuality-components-1.3.0.tgz", + "integrity": "sha512-+g4/I5qj742mqeXmZF5/T/ONraDQ9+ffJ6aaiIdp1LHNJM7SuMzItoCBsb6WRd0ajNOja7xzuosH+VFfGpqKUg==", + "dependencies": { + "axios": "^0.19.0", + "classnames": "^2.2.6", + "layer-manager": "^1.10.0", + "lodash": "^4.17.10", + "moment": "^2.22.2", + "prop-types": "^15.6.2", + "rc-slider": "^8.6.3", + "rc-tooltip": "3.7.0", + "react-sortable-hoc": "^0.6.8", + "react-vega": "^4.0.2", + "vega-tooltip": "^0.13.0", + "wri-json-api-serializer": "^1.0.1" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0", + "vega": "^3.0.0 || ^4.0.0", + "vega-lib": "^4.2.0" + } + }, + "node_modules/old-vizzuality-components/node_modules/axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", "dependencies": { - "wrappy": "1" + "follow-redirects": "1.5.10" } }, - "node_modules/openid-client": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.0.tgz", - "integrity": "sha512-uFTkN/iqgKvSnmpVAS/T6SNThukRMBcmymTQ71Ngus1F60tdtKVap7zCrleocY+fogPtpmoxi5Q1YdrgYuTlkA==", + "node_modules/old-vizzuality-components/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { - "jose": "^4.15.1", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" + "ms": "2.0.0" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, + "node_modules/old-vizzuality-components/node_modules/follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "debug": "=3.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=4.0" } }, - "node_modules/orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "node_modules/old-vizzuality-components/node_modules/kdbush": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-2.0.1.tgz", + "integrity": "sha512-9KqSdmWCkBIisFIGclT0FRagKhI7IVbMyUjsxCFG0Ly1Dg6whlxJ7b9lrq8ifk3X/fGeJzok1R75LQfZTfA5zQ==" + }, + "node_modules/old-vizzuality-components/node_modules/layer-manager": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/layer-manager/-/layer-manager-1.16.0.tgz", + "integrity": "sha512-W3aduKBzOzZau1G31WEqcN60/tMb0XNJz35nMgPMoa0Vf1PCXUsi0WFo2hU0LMajnZ1tOIyV5wxYpuKdqVktaw==", + "dependencies": { + "axios": "^0.18.0", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "supercluster": "^4.1.1", + "wri-json-api-serializer": "^1.0.1" + }, + "peerDependencies": { + "react": "^16.3.2" + } + }, + "node_modules/old-vizzuality-components/node_modules/layer-manager/node_modules/axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "node_modules/old-vizzuality-components/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/old-vizzuality-components/node_modules/react-sortable-hoc": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-0.6.8.tgz", + "integrity": "sha512-sUUAtNdV84AKZ2o+F5lVOOFWcyWG6aGDkNFgHoieB1zFLeWLWENkix06asPS4/GhigfuRh06aZix1j3Qx8+NSQ==", + "dependencies": { + "babel-runtime": "^6.11.6", + "invariant": "^2.2.1", + "lodash": "^4.12.0", + "prop-types": "^15.5.7" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/old-vizzuality-components/node_modules/react-vega": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/react-vega/-/react-vega-4.0.2.tgz", + "integrity": "sha512-1SNIciulgOzWt2AVIz9QbweeWfnXn31JT+67F/YKfKnl9F5iTS6y05k3Aiak9xOKL/BLKiFARd9a0dgTkZ4ycg==", + "dependencies": { + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": ">=15.5.4 || ^16.0.0", + "vega-lib": "^4.2.0" + } + }, + "node_modules/old-vizzuality-components/node_modules/supercluster": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-4.1.1.tgz", + "integrity": "sha512-sF0FfUOPFp96DKzwWFLeQOEqqKu2PpcesxAFeFsknA/q7g7igVVn/p3NI2XHEghNSyDAqunKNKqAbqNO8+7NDQ==", + "dependencies": { + "kdbush": "^2.0.1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openid-client": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.0.tgz", + "integrity": "sha512-uFTkN/iqgKvSnmpVAS/T6SNThukRMBcmymTQ71Ngus1F60tdtKVap7zCrleocY+fogPtpmoxi5Q1YdrgYuTlkA==", + "dependencies": { + "jose": "^4.15.1", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", "peer": true }, "node_modules/p-cancelable": { @@ -5618,6 +6573,11 @@ "pbf": "bin/pbf" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -6163,6 +7123,90 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/rc-align": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.5.tgz", + "integrity": "sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==", + "dependencies": { + "babel-runtime": "^6.26.0", + "dom-align": "^1.7.0", + "prop-types": "^15.5.8", + "rc-util": "^4.0.4" + } + }, + "node_modules/rc-animate": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.11.1.tgz", + "integrity": "sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==", + "dependencies": { + "babel-runtime": "6.x", + "classnames": "^2.2.6", + "css-animation": "^1.3.2", + "prop-types": "15.x", + "raf": "^3.4.0", + "rc-util": "^4.15.3", + "react-lifecycles-compat": "^3.0.4" + } + }, + "node_modules/rc-slider": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.7.1.tgz", + "integrity": "sha512-WMT5mRFUEcrLWwTxsyS8jYmlaMsTVCZIGENLikHsNv+tE8ThU2lCoPfi/xFNUfJFNFSBFP3MwPez9ZsJmNp13g==", + "dependencies": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "prop-types": "^15.5.4", + "rc-tooltip": "^3.7.0", + "rc-util": "^4.0.4", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0", + "warning": "^4.0.3" + } + }, + "node_modules/rc-tooltip": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.0.tgz", + "integrity": "sha512-xEoUMatXp8OEL61UFH0+NrC39nkKzpOBhLrJCnnRpDRduU8L3DOhF6CNlIMkvg68hxlGGdquFtFw2t+1xNLX5A==", + "dependencies": { + "babel-runtime": "6.x", + "prop-types": "^15.5.8", + "rc-trigger": "^2.2.2" + } + }, + "node_modules/rc-trigger": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.6.5.tgz", + "integrity": "sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==", + "dependencies": { + "babel-runtime": "6.x", + "classnames": "^2.2.6", + "prop-types": "15.x", + "rc-align": "^2.4.0", + "rc-animate": "2.x", + "rc-util": "^4.4.0", + "react-lifecycles-compat": "^3.0.4" + } + }, + "node_modules/rc-util": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", + "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", + "dependencies": { + "add-dom-event-listener": "^1.1.0", + "prop-types": "^15.5.10", + "react-is": "^16.12.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -6257,6 +7301,31 @@ "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" } }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-sortablejs": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/react-sortablejs/-/react-sortablejs-6.1.4.tgz", @@ -6272,6 +7341,11 @@ "sortablejs": "1" } }, + "node_modules/react-sortablejs/node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "node_modules/react-ssr-prepass": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", @@ -6280,6 +7354,53 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-vega": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-vega/-/react-vega-7.6.0.tgz", + "integrity": "sha512-2oMML4wH9qWLnZPRxJm06ozwrVN/K+nkjqdI5/ofWWsrBnnH4iB9rRKrsV8px0nlWgZrwfdCH4g5RUiyyJHWSA==", + "dependencies": { + "@types/react": "*", + "fast-deep-equal": "^3.1.1", + "prop-types": "^15.8.1", + "vega-embed": "^6.5.1" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "vega": "*", + "vega-lite": "*" + } + }, + "node_modules/react-vega/node_modules/vega-embed": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.23.0.tgz", + "integrity": "sha512-8Iava57LdROsatqsOhMLErHYaBpZBB7yZJlSVU3/xOK3l8Ft5WFnj5fm3OOAVML97/0yULE7LRVjXW5hV3fSpg==", + "bundleDependencies": [ + "yallist" + ], + "dependencies": { + "fast-json-patch": "^3.1.1", + "json-stringify-pretty-compact": "^3.0.0", + "semver": "^7.5.4", + "tslib": "^2.6.1", + "vega-interpreter": "^1.0.5", + "vega-schema-url-parser": "^2.2.0", + "vega-themes": "^2.14.0", + "vega-tooltip": "^0.33.0", + "yallist": "*" + }, + "peerDependencies": { + "vega": "^5.21.0", + "vega-lite": "*" + } + }, + "node_modules/react-vega/node_modules/vega-tooltip": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.33.0.tgz", + "integrity": "sha512-jMcvH2lP20UfyvO2KAEdloiwRyasikaiLuNFhzwrrzf2RamGTxP4G7B2OZ2QENfrGUH05Z9ei5tn/eErdzOaZQ==", + "dependencies": { + "vega-util": "^1.17.2" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -6471,6 +7592,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -6542,7 +7676,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -6553,6 +7686,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "node_modules/rope-sequence": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", @@ -6618,6 +7756,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -6668,6 +7827,11 @@ "node": ">=0.10.0" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6896,7 +8060,6 @@ "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" }, @@ -7219,6 +8382,37 @@ "node": ">=8.0" } }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -7416,6 +8610,15 @@ "node": ">=0.10.0" } }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -7455,6 +8658,17 @@ "punycode": "^2.1.0" } }, + "node_modules/use-debounce": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-9.0.4.tgz", + "integrity": "sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==", + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -7485,80 +8699,1710 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "node_modules/vega": { + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-5.25.0.tgz", + "integrity": "sha512-lr+uj0mhYlSN3JOKbMNp1RzZBenWp9DxJ7kR3lha58AFNCzzds7pmFa7yXPbtbaGhB7Buh/t6n+Bzk3Y0VnF5g==", + "dependencies": { + "vega-crossfilter": "~4.1.1", + "vega-dataflow": "~5.7.5", + "vega-encode": "~4.9.2", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.0", + "vega-force": "~4.2.0", + "vega-format": "~1.1.1", + "vega-functions": "~5.13.2", + "vega-geo": "~4.4.1", + "vega-hierarchy": "~4.1.1", + "vega-label": "~1.2.1", + "vega-loader": "~4.5.1", + "vega-parser": "~6.2.0", + "vega-projection": "~1.6.0", + "vega-regression": "~1.2.0", + "vega-runtime": "~6.1.4", + "vega-scale": "~7.3.0", + "vega-scenegraph": "~4.10.2", + "vega-statistics": "~1.9.0", + "vega-time": "~2.1.1", + "vega-transforms": "~4.10.2", + "vega-typings": "~0.24.0", + "vega-util": "~1.17.2", + "vega-view": "~5.11.1", + "vega-view-transforms": "~4.5.9", + "vega-voronoi": "~4.2.1", + "vega-wordcloud": "~4.1.4" + } + }, + "node_modules/vega-canvas": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.7.tgz", + "integrity": "sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==" + }, + "node_modules/vega-crossfilter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-3.0.1.tgz", + "integrity": "sha512-GNCP0k1otJKtE9SnYm1cDBqUfBvWTaxJ3/bdMpWvGNUtAdDBAlrtspDBTpwMu4MLNWbAy1zp9jN0ztCXBZF29Q==", + "peer": true, "dependencies": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" + "d3-array": "^2.0.2", + "vega-dataflow": "^4.1.0", + "vega-util": "^1.7.0" } }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "node_modules/vega-dataflow": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-4.1.0.tgz", + "integrity": "sha512-LuXoN3LkYWNYTPeMiOgSlw2TZAWjmN46Q9HmHM8ClhXYAj+pYme3IPdtYn1OmcvWe4rKeiYgNYrtJCgTOvCepg==", + "peer": true, + "dependencies": { + "vega-loader": "^3.1.0", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-encode": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-3.2.2.tgz", + "integrity": "sha512-Hmk+ReH6R1wTnz56gWyk8CnzgAzq11QYkrEzw794MMY2l61EG3sX9veyZ9AdtDufOq9oDa58/kfgk65UD9A+sA==", + "peer": true, + "dependencies": { + "d3-array": "^2.0.2", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.3.2", + "vega-dataflow": "^4.1.0", + "vega-scale": "^2.5.0", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-event-selector": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.6.tgz", + "integrity": "sha512-UwCu50Sqd8kNZ1X/XgiAY+QAyQUmGFAwyDu7y0T5fs6/TPQnDo/Bo346NgSgINBEhEKOAMY1Nd/rPOk4UEm/ew==", "peer": true }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "node_modules/vega-expression": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-2.7.0.tgz", + "integrity": "sha512-fMnHtcFfVAxuwjsKGh0qqP8OJNVABGIg0aSp33Jxh1D86LwDwaRe+EtwF1fv8YKD2AEiBl4UObC68QMT56MekQ==", + "peer": true, "dependencies": { - "loose-envify": "^1.0.0" + "vega-util": "^1.15.1" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "node_modules/vega-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-3.0.0.tgz", + "integrity": "sha512-Uar26RDxDQEpIdWBIFKnOr6/B30RU8/2qBtoiux1C3goZIWBRkXNlCR5kMDkll8Mg60deD6ynflsXXNwyGS69w==", + "peer": true, "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" + "d3-force": "^1.1.0", + "vega-dataflow": "^4.0.0", + "vega-util": "^1.7.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "node_modules/vega-format": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-1.1.1.tgz", + "integrity": "sha512-Rll7YgpYbsgaAa54AmtEWrxaJqgOh5fXlvM2wewO4trb9vwM53KBv4Q/uBWCLK3LLGeBXIF6gjDt2LFuJAUtkQ==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "d3-array": "^3.2.2", + "d3-format": "^3.1.0", + "d3-time-format": "^4.1.0", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-format/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, + "node_modules/vega-format/node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-format/node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "d3-time": "1 - 3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=12" } }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, + "node_modules/vega-functions": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.13.2.tgz", + "integrity": "sha512-YE1Xl3Qi28kw3vdXVYgKFMo20ttd3+SdKth1jUNtBDGGdrOpvPxxFhZkVqX+7FhJ5/1UkDoAYs/cZY0nRKiYgA==", "dependencies": { - "function.prototype.name": "^1.1.5", + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-dataflow": "^5.7.5", + "vega-expression": "^5.1.0", + "vega-scale": "^7.3.0", + "vega-scenegraph": "^4.10.2", + "vega-selections": "^5.4.1", + "vega-statistics": "^1.8.1", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-functions/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/vega-functions/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-functions/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vega-functions/node_modules/vega-dataflow": { + "version": "5.7.5", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.5.tgz", + "integrity": "sha512-EdsIl6gouH67+8B0f22Owr2tKDiMPNNR8lEvJDcxmFw02nXd8juimclpLvjPQriqn6ta+3Dn5txqfD117H04YA==", + "dependencies": { + "vega-format": "^1.1.1", + "vega-loader": "^4.5.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-functions/node_modules/vega-expression": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.0.tgz", + "integrity": "sha512-u8Rzja/cn2PEUkhQN3zUj3REwNewTA92ExrcASNKUJPCciMkHJEjESwFYuI6DWMCq4hQElQ92iosOAtwzsSTqA==", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-functions/node_modules/vega-loader": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.1.tgz", + "integrity": "sha512-qy5x32SaT0YkEujQM2yKqvLGV9XWQ2aEDSugBFTdYzu/1u4bxdUSRDREOlrJ9Km3RWIOgFiCkobPmFxo47SKuA==", + "dependencies": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-functions/node_modules/vega-scale": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.3.0.tgz", + "integrity": "sha512-pMOAI2h+e1z7lsqKG+gMfR6NKN2sTcyjZbdJwntooW0uFHwjLGjMSY7kSd3nSEquF0HQ8qF7zR6gs1eRwlGimw==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-functions/node_modules/vega-scenegraph": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.10.2.tgz", + "integrity": "sha512-R8m6voDZO5+etwNMcXf45afVM3XAtokMqxuDyddRl9l1YqSJfS+3u8hpolJ50c2q6ZN20BQiJwKT1o0bB7vKkA==", + "dependencies": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^1.2.7", + "vega-loader": "^4.5.1", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-3.1.1.tgz", + "integrity": "sha512-EltBQmid6DZ7d4iArgTnsGRsx4ZaHrwvaegq6iIwWp7GHtJ8i+8bzPFfHo1pBuRVmHG4ZA2NH+cNaW2IIgWcPg==", + "peer": true, + "dependencies": { + "d3-array": "^2.0.2", + "d3-contour": "^1.3.2", + "d3-geo": "^1.11.3", + "vega-dataflow": "^4.1.0", + "vega-projection": "^1.2.0", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-hierarchy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-3.1.0.tgz", + "integrity": "sha512-zPxOsQbswVDMfn9JdDG0ihZA4qhQL5WJxBsSRFsMeuyDTFuE6biBInpm/g0QDGmHMF2EOY4AwD2WRyF+jAyTqw==", + "peer": true, + "dependencies": { + "d3-collection": "^1.0.7", + "d3-hierarchy": "^1.1.8", + "vega-dataflow": "^4.0.4", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-interpreter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-1.0.5.tgz", + "integrity": "sha512-po6oTOmeQqr1tzTCdD15tYxAQLeUnOVirAysgVEemzl+vfmvcEP7jQmlc51jz0jMA+WsbmE6oJywisQPu/H0Bg==" + }, + "node_modules/vega-label": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-1.2.1.tgz", + "integrity": "sha512-n/ackJ5lc0Xs9PInCaGumYn2awomPjJ87EMVT47xNgk2bHmJoZV1Ve/1PUM6Eh/KauY211wPMrNp/9Im+7Ripg==", + "dependencies": { + "vega-canvas": "^1.2.6", + "vega-dataflow": "^5.7.3", + "vega-scenegraph": "^4.9.2", + "vega-util": "^1.15.2" + } + }, + "node_modules/vega-label/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/vega-label/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-label/node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-label/node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-label/node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-label/node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-label/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-label/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-label/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vega-label/node_modules/vega-dataflow": { + "version": "5.7.5", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.5.tgz", + "integrity": "sha512-EdsIl6gouH67+8B0f22Owr2tKDiMPNNR8lEvJDcxmFw02nXd8juimclpLvjPQriqn6ta+3Dn5txqfD117H04YA==", + "dependencies": { + "vega-format": "^1.1.1", + "vega-loader": "^4.5.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-label/node_modules/vega-loader": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.1.tgz", + "integrity": "sha512-qy5x32SaT0YkEujQM2yKqvLGV9XWQ2aEDSugBFTdYzu/1u4bxdUSRDREOlrJ9Km3RWIOgFiCkobPmFxo47SKuA==", + "dependencies": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-label/node_modules/vega-scale": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.3.0.tgz", + "integrity": "sha512-pMOAI2h+e1z7lsqKG+gMfR6NKN2sTcyjZbdJwntooW0uFHwjLGjMSY7kSd3nSEquF0HQ8qF7zR6gs1eRwlGimw==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-label/node_modules/vega-scenegraph": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.10.2.tgz", + "integrity": "sha512-R8m6voDZO5+etwNMcXf45afVM3XAtokMqxuDyddRl9l1YqSJfS+3u8hpolJ50c2q6ZN20BQiJwKT1o0bB7vKkA==", + "dependencies": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^1.2.7", + "vega-loader": "^4.5.1", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-lib": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/vega-lib/-/vega-lib-4.4.0.tgz", + "integrity": "sha512-bfOsO5wks+ctnJ94fIPWH/B0qocdFs4WZ8teIgjF7m5XE+EVln+1nq9Z+sV7wdw7vftzGg0GAx9UH/kJxyopKg==", + "peer": true, + "dependencies": { + "vega-crossfilter": "^3.0.1", + "vega-dataflow": "^4.1.0", + "vega-encode": "^3.2.2", + "vega-event-selector": "^2.0.0", + "vega-expression": "^2.4.0", + "vega-force": "^3.0.0", + "vega-geo": "^3.1.1", + "vega-hierarchy": "^3.1.0", + "vega-loader": "^3.1.0", + "vega-parser": "^3.9.0", + "vega-projection": "^1.2.0", + "vega-runtime": "^3.2.0", + "vega-scale": "^2.5.1", + "vega-scenegraph": "^3.2.3", + "vega-statistics": "^1.2.3", + "vega-transforms": "^2.3.1", + "vega-typings": "*", + "vega-util": "^1.7.0", + "vega-view": "^3.4.1", + "vega-view-transforms": "^2.0.3", + "vega-voronoi": "^3.0.0", + "vega-wordcloud": "^3.0.0" + } + }, + "node_modules/vega-lite": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.16.1.tgz", + "integrity": "sha512-3iXmzdAVZCGHrvdh6hIM8OY55auXA1EIDzFLaYdq27e99Dr+WXTEa00ilqQUPdrpS0sE1ZqK4Ikhgg5x8SOtLw==", + "dependencies": { + "json-stringify-pretty-compact": "~3.0.0", + "tslib": "~2.6.2", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.0", + "vega-util": "~1.17.2", + "yargs": "~17.7.2" + }, + "bin": { + "vl2pdf": "bin/vl2pdf", + "vl2png": "bin/vl2png", + "vl2svg": "bin/vl2svg", + "vl2vg": "bin/vl2vg" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vega": "^5.24.0" + } + }, + "node_modules/vega-lite/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-lite/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==" + }, + "node_modules/vega-lite/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/vega-lite/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/vega-lite/node_modules/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vega-lite/node_modules/vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==" + }, + "node_modules/vega-lite/node_modules/vega-expression": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.0.tgz", + "integrity": "sha512-u8Rzja/cn2PEUkhQN3zUj3REwNewTA92ExrcASNKUJPCciMkHJEjESwFYuI6DWMCq4hQElQ92iosOAtwzsSTqA==", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-lite/node_modules/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==", + "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/vega-lite/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/vega-lite/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-lite/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-3.1.0.tgz", + "integrity": "sha512-FD9KJdPxBOa+fTnjC2dfY5+kB05hXyVOfjIkssmgyyhELJPp2FwclcF4mVy7Ay1E8fUHY3GgbwSE5jL8k4pYUg==", + "peer": true, + "dependencies": { + "d3-dsv": "^1.0.10", + "d3-time-format": "^2.1.3", + "node-fetch": "^2.3.0", + "topojson-client": "^3.0.0", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-parser": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-3.9.0.tgz", + "integrity": "sha512-/fdPt5wcZgbPi0zwzJsBgi/k2GO3s53j7kJUYFGff75+wLJ2n/XtLCU295Wo7+cGCfkCZs0FfYKWa8AJrQZiag==", + "peer": true, + "dependencies": { + "d3-array": "^2.0.2", + "d3-color": "^1.2.3", + "d3-format": "^1.3.2", + "d3-geo": "^1.11.3", + "d3-time-format": "^2.1.3", + "vega-dataflow": "^4.1.0", + "vega-event-selector": "^2.0.0", + "vega-expression": "^2.4.0", + "vega-scale": "^2.5.1", + "vega-scenegraph": "^3.2.3", + "vega-statistics": "^1.2.3", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-projection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.6.0.tgz", + "integrity": "sha512-LGUaO/kpOEYuTlul+x+lBzyuL9qmMwP1yShdUWYLW+zXoeyGbs5OZW+NbPPwLYqJr5lpXDr/vGztFuA/6g2xvQ==", + "dependencies": { + "d3-geo": "^3.1.0", + "d3-geo-projection": "^4.0.0", + "vega-scale": "^7.3.0" + } + }, + "node_modules/vega-projection/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-projection/node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-projection/node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-projection/node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-projection/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-projection/node_modules/vega-scale": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.3.0.tgz", + "integrity": "sha512-pMOAI2h+e1z7lsqKG+gMfR6NKN2sTcyjZbdJwntooW0uFHwjLGjMSY7kSd3nSEquF0HQ8qF7zR6gs1eRwlGimw==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-regression": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.2.0.tgz", + "integrity": "sha512-6TZoPlhV/280VbxACjRKqlE0Nv48z5g4CSNf1FmGGTWS1rQtElPTranSoVW4d7ET5eVQ6f9QLxNAiALptvEq+g==", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.3", + "vega-statistics": "^1.9.0", + "vega-util": "^1.15.2" + } + }, + "node_modules/vega-regression/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/vega-regression/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-regression/node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-regression/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vega-regression/node_modules/vega-dataflow": { + "version": "5.7.5", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.5.tgz", + "integrity": "sha512-EdsIl6gouH67+8B0f22Owr2tKDiMPNNR8lEvJDcxmFw02nXd8juimclpLvjPQriqn6ta+3Dn5txqfD117H04YA==", + "dependencies": { + "vega-format": "^1.1.1", + "vega-loader": "^4.5.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-regression/node_modules/vega-loader": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.1.tgz", + "integrity": "sha512-qy5x32SaT0YkEujQM2yKqvLGV9XWQ2aEDSugBFTdYzu/1u4bxdUSRDREOlrJ9Km3RWIOgFiCkobPmFxo47SKuA==", + "dependencies": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-runtime": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-3.2.0.tgz", + "integrity": "sha512-aoWqH+U5tiByj3cIGZsTDPMTb10tUN2nm4zWa3Z7lOUilbw/+gEaOuy1qvr4VrVhUShsnytudED4OpQNUkKy3Q==", + "peer": true, + "dependencies": { + "vega-dataflow": "^4.1.0", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-scale": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-2.5.1.tgz", + "integrity": "sha512-EOpUDOjTAD7DhXglyOquXTzXFXjnNvrGyMDCOsfRL/XUTsbjYYNkdl0Q30c9fVN1I+H65lMz52xwN16yxwMuTw==", + "peer": true, + "dependencies": { + "d3-array": "^2.0.2", + "d3-interpolate": "^1.3.2", + "d3-scale": "^2.1.2", + "d3-scale-chromatic": "^1.3.3", + "d3-time": "^1.0.10", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-scenegraph": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-3.2.3.tgz", + "integrity": "sha512-L4mZ6LpEKvW5Q0c8gyqozGuoY5miJI4DiRipiAG0BQ6rB67tK+8qlaTfslX4tNBz88mu+CyVO9ZjNW/M4nBI3w==", + "peer": true, + "dependencies": { + "d3-path": "^1.0.7", + "d3-shape": "^1.2.2", + "vega-canvas": "^1.1.0", + "vega-loader": "^3.0.1", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-schema-url-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz", + "integrity": "sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==" + }, + "node_modules/vega-selections": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.4.1.tgz", + "integrity": "sha512-EtYc4DvA+wXqBg9tq+kDomSoVUPCmQfS7hUxy2qskXEed79YTimt3Hcl1e1fW226I4AVDBEqTTKebmKMzbSgAA==", + "dependencies": { + "d3-array": "3.2.2", + "vega-expression": "^5.0.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-selections/node_modules/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-selections/node_modules/vega-expression": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.0.tgz", + "integrity": "sha512-u8Rzja/cn2PEUkhQN3zUj3REwNewTA92ExrcASNKUJPCciMkHJEjESwFYuI6DWMCq4hQElQ92iosOAtwzsSTqA==", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-statistics": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz", + "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", + "dependencies": { + "d3-array": "^3.2.2" + } + }, + "node_modules/vega-statistics/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-themes": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.14.0.tgz", + "integrity": "sha512-9dLmsUER7gJrDp8SEYKxBFmXmpyzLlToKIjxq3HCvYjz8cnNrRGyAhvIlKWOB3ZnGvfYV+vnv3ZRElSNL31nkA==", + "peerDependencies": { + "vega": "*", + "vega-lite": "*" + } + }, + "node_modules/vega-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-2.1.1.tgz", + "integrity": "sha512-z1qbgyX0Af2kQSGFbApwBbX2meenGvsoX8Nga8uyWN8VIbiySo/xqizz1KrP6NbB6R+x5egKmkjdnyNThPeEWA==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-time": "^3.1.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-time/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-time/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-tooltip": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.13.0.tgz", + "integrity": "sha512-NbeHzpxwKZ+yk+CION3wRH66rx9XGx5v6M82LT6qSIAnUrH8eh+sFtjK6pO7ErXGF5AieAhg8Hfb/NvC8uNMuA==", + "dependencies": { + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-transforms": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-2.3.1.tgz", + "integrity": "sha512-jvDz33ohZiP6cN74quEvesHr0sbSMMQ69ZZqgL6cRDHBqfiuHPhZofBKWDXE1nEWDmJqTEyvg0gsnA8vpHzpjQ==", + "peer": true, + "dependencies": { + "d3-array": "^2.0.2", + "vega-dataflow": "^4.1.0", + "vega-statistics": "^1.2.3", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-typings": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.24.2.tgz", + "integrity": "sha512-fW02GElYoqweCCaPqH6iH44UZnzXiX9kbm1qyecjU3k5s0vtufLI7Yuz/a/uL37mEAqTMQplBBAlk0T9e2e1Dw==", + "dependencies": { + "@types/geojson": "7946.0.4", + "vega-event-selector": "^3.0.1", + "vega-expression": "^5.0.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-typings/node_modules/@types/geojson": { + "version": "7946.0.4", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.4.tgz", + "integrity": "sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==" + }, + "node_modules/vega-typings/node_modules/vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==" + }, + "node_modules/vega-typings/node_modules/vega-expression": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.0.tgz", + "integrity": "sha512-u8Rzja/cn2PEUkhQN3zUj3REwNewTA92ExrcASNKUJPCciMkHJEjESwFYuI6DWMCq4hQElQ92iosOAtwzsSTqA==", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-util": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.2.tgz", + "integrity": "sha512-omNmGiZBdjm/jnHjZlywyYqafscDdHaELHx1q96n5UOz/FlO9JO99P4B3jZg391EFG8dqhWjQilSf2JH6F1mIw==" + }, + "node_modules/vega-view": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-3.4.1.tgz", + "integrity": "sha512-hT9Bj9qRCGz+4umid8tFuADyUF7xOHTQmeu18XtRgEkNOtTALlDYLmCSpcGkP1N6eeZm3aRWBtkUz/XE7/6d+Q==", + "peer": true, + "dependencies": { + "d3-array": "^2.0.2", + "d3-timer": "^1.0.9", + "vega-dataflow": "^4.1.0", + "vega-parser": "^3.9.0", + "vega-runtime": "^3.2.0", + "vega-scenegraph": "^3.2.3", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-view-transforms": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-2.0.3.tgz", + "integrity": "sha512-m42sP2G72KIIEhbno5P3wYXuGe4C5fj0ztfg1TrSEmGsIHOqoehRvte/1e9q/dV+1rB3TqfcWXgQVEDHCFLEvQ==", + "peer": true, + "dependencies": { + "vega-dataflow": "^4.0.4", + "vega-scenegraph": "^3.2.3", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-voronoi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-3.0.0.tgz", + "integrity": "sha512-ZkQw4UprxqiS3IjrdLOoQq1oEeH0REqWonf7Wz5zt2pKDHyMPlFX89EueoDYOKnfQjk9/7IiptBDK1ruAbDNiQ==", + "peer": true, + "dependencies": { + "d3-voronoi": "^1.1.2", + "vega-dataflow": "^4.0.0", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega-wordcloud": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-3.0.0.tgz", + "integrity": "sha512-/2F09L2tNTQ8aqK/ZLjd7m+fYwJR8/waE8YWuexLZob4+4BEByzqFfRMATE39ZpdTHOreCEQ5uUKyvv0qA6O0A==", + "peer": true, + "dependencies": { + "vega-canvas": "^1.0.1", + "vega-dataflow": "^4.0.0", + "vega-scale": "^2.1.1", + "vega-statistics": "^1.2.1", + "vega-util": "^1.7.0" + } + }, + "node_modules/vega/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/vega/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vega/node_modules/vega-crossfilter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.1.1.tgz", + "integrity": "sha512-yesvlMcwRwxrtAd9IYjuxWJJuAMI0sl7JvAFfYtuDkkGDtqfLXUcCzHIATqW6igVIE7tWwGxnbfvQLhLNgK44Q==", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-dataflow": { + "version": "5.7.5", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.5.tgz", + "integrity": "sha512-EdsIl6gouH67+8B0f22Owr2tKDiMPNNR8lEvJDcxmFw02nXd8juimclpLvjPQriqn6ta+3Dn5txqfD117H04YA==", + "dependencies": { + "vega-format": "^1.1.1", + "vega-loader": "^4.5.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-encode": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.9.2.tgz", + "integrity": "sha512-c3J0LYkgYeXQxwnYkEzL15cCFBYPRaYUon8O2SZ6O4PhH4dfFTXBzSyT8+gh8AhBd572l2yGDfxpEYA6pOqdjg==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "vega-dataflow": "^5.7.5", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==" + }, + "node_modules/vega/node_modules/vega-expression": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.0.tgz", + "integrity": "sha512-u8Rzja/cn2PEUkhQN3zUj3REwNewTA92ExrcASNKUJPCciMkHJEjESwFYuI6DWMCq4hQElQ92iosOAtwzsSTqA==", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-force": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.2.0.tgz", + "integrity": "sha512-aE2TlP264HXM1r3fl58AvZdKUWBNOGkIvn4EWyqeJdgO2vz46zSU7x7TzPG4ZLuo44cDRU5Ng3I1eQk23Asz6A==", + "dependencies": { + "d3-force": "^3.0.0", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-geo": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.4.1.tgz", + "integrity": "sha512-s4WeZAL5M3ZUV27/eqSD3v0FyJz3PlP31XNSLFy4AJXHxHUeXT3qLiDHoVQnW5Om+uBCPDtTT1ROx1smGIf2aA==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.5", + "vega-projection": "^1.6.0", + "vega-statistics": "^1.8.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-hierarchy": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.1.1.tgz", + "integrity": "sha512-h5mbrDtPKHBBQ9TYbvEb/bCqmGTlUX97+4CENkyH21tJs7naza319B15KRK0NWOHuhbGhFmF8T0696tg+2c8XQ==", + "dependencies": { + "d3-hierarchy": "^3.1.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-loader": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.1.tgz", + "integrity": "sha512-qy5x32SaT0YkEujQM2yKqvLGV9XWQ2aEDSugBFTdYzu/1u4bxdUSRDREOlrJ9Km3RWIOgFiCkobPmFxo47SKuA==", + "dependencies": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-parser": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.2.0.tgz", + "integrity": "sha512-as+QnX8Qxe9q51L1C2sVBd+YYYctP848+zEvkBT2jlI2g30aZ6Uv7sKsq7QTL6DUbhXQKR0XQtzlanckSFdaOQ==", + "dependencies": { + "vega-dataflow": "^5.7.5", + "vega-event-selector": "^3.0.1", + "vega-functions": "^5.13.1", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-runtime": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-6.1.4.tgz", + "integrity": "sha512-0dDYXyFLQcxPQ2OQU0WuBVYLRZnm+/CwVu6i6N4idS7R9VXIX5581EkCh3pZ20pQ/+oaA7oJ0pR9rJgJ6rukRQ==", + "dependencies": { + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-scale": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.3.0.tgz", + "integrity": "sha512-pMOAI2h+e1z7lsqKG+gMfR6NKN2sTcyjZbdJwntooW0uFHwjLGjMSY7kSd3nSEquF0HQ8qF7zR6gs1eRwlGimw==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-scenegraph": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.10.2.tgz", + "integrity": "sha512-R8m6voDZO5+etwNMcXf45afVM3XAtokMqxuDyddRl9l1YqSJfS+3u8hpolJ50c2q6ZN20BQiJwKT1o0bB7vKkA==", + "dependencies": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^1.2.7", + "vega-loader": "^4.5.1", + "vega-scale": "^7.3.0", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-transforms": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.10.2.tgz", + "integrity": "sha512-sJELfEuYQ238PRG+GOqQch8D69RYnJevYSGLsRGQD2LxNz3j+GlUX6Pid+gUEH5HJy22Q5L0vsTl2ZNhIr4teQ==", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.5", + "vega-statistics": "^1.8.1", + "vega-time": "^2.1.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-view": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.11.1.tgz", + "integrity": "sha512-RoWxuoEMI7xVQJhPqNeLEHCezudsf3QkVMhH5tCovBqwBADQGqq9iWyax3ZzdyX1+P3eBgm7cnLvpqtN2hU8kA==", + "dependencies": { + "d3-array": "^3.2.2", + "d3-timer": "^3.0.1", + "vega-dataflow": "^5.7.5", + "vega-format": "^1.1.1", + "vega-functions": "^5.13.1", + "vega-runtime": "^6.1.4", + "vega-scenegraph": "^4.10.2", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-view-transforms": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.5.9.tgz", + "integrity": "sha512-NxEq4ZD4QwWGRrl2yDLnBRXM9FgCI+vvYb3ZC2+nVDtkUxOlEIKZsMMw31op5GZpfClWLbjCT3mVvzO2xaTF+g==", + "dependencies": { + "vega-dataflow": "^5.7.5", + "vega-scenegraph": "^4.10.2", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-voronoi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.2.1.tgz", + "integrity": "sha512-zzi+fxU/SBad4irdLLsG3yhZgXWZezraGYVQfZFWe8kl7W/EHUk+Eqk/eetn4bDeJ6ltQskX+UXH3OP5Vh0Q0Q==", + "dependencies": { + "d3-delaunay": "^6.0.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega/node_modules/vega-wordcloud": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.4.tgz", + "integrity": "sha512-oeZLlnjiusLAU5vhk0IIdT5QEiJE0x6cYoGNq1th+EbwgQp153t4r026fcib9oq15glHFOzf81a8hHXHSJm1Jw==", + "dependencies": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.5", + "vega-scale": "^7.3.0", + "vega-statistics": "^1.8.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vizzuality-components": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vizzuality-components/-/vizzuality-components-3.0.3.tgz", + "integrity": "sha512-0Ee1p9nnX8MpH4GXpbkMba7RUZ7bs1C+B7yvipUf2a1WiyhmjHzEipBjphdRmirA6+ShFxIyR5017F0zwYm2WA==", + "dependencies": { + "array-move": "^2.1.0", + "axios": "^0.19.0", + "classnames": "^2.2.6", + "layer-manager": "^1.10.0", + "lodash": "^4.17.10", + "moment": "^2.22.2", + "prop-types": "^15.6.2", + "rc-slider": "^8.6.3", + "rc-tooltip": "3.7.0", + "react-sortable-hoc": "^1.9.1", + "wri-json-api-serializer": "^1.0.1" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + } + }, + "node_modules/vizzuality-components/node_modules/axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "1.5.10" + } + }, + "node_modules/vizzuality-components/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/vizzuality-components/node_modules/follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dependencies": { + "debug": "=3.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vizzuality-components/node_modules/kdbush": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-2.0.1.tgz", + "integrity": "sha512-9KqSdmWCkBIisFIGclT0FRagKhI7IVbMyUjsxCFG0Ly1Dg6whlxJ7b9lrq8ifk3X/fGeJzok1R75LQfZTfA5zQ==" + }, + "node_modules/vizzuality-components/node_modules/layer-manager": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/layer-manager/-/layer-manager-1.16.0.tgz", + "integrity": "sha512-W3aduKBzOzZau1G31WEqcN60/tMb0XNJz35nMgPMoa0Vf1PCXUsi0WFo2hU0LMajnZ1tOIyV5wxYpuKdqVktaw==", + "dependencies": { + "axios": "^0.18.0", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "supercluster": "^4.1.1", + "wri-json-api-serializer": "^1.0.1" + }, + "peerDependencies": { + "react": "^16.3.2" + } + }, + "node_modules/vizzuality-components/node_modules/layer-manager/node_modules/axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "node_modules/vizzuality-components/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/vizzuality-components/node_modules/react-sortable-hoc": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-1.11.0.tgz", + "integrity": "sha512-v1CDCvdfoR3zLGNp6qsBa4J1BWMEVH25+UKxF/RvQRh+mrB+emqtVHMgZ+WreUiKJoEaiwYoScaueIKhMVBHUg==", + "dependencies": { + "@babel/runtime": "^7.2.0", + "invariant": "^2.2.4", + "prop-types": "^15.5.7" + }, + "peerDependencies": { + "prop-types": "^15.5.7", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/vizzuality-components/node_modules/supercluster": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-4.1.1.tgz", + "integrity": "sha512-sF0FfUOPFp96DKzwWFLeQOEqqKu2PpcesxAFeFsknA/q7g7igVVn/p3NI2XHEghNSyDAqunKNKqAbqNO8+7NDQ==", + "dependencies": { + "kdbush": "^2.0.1" + } + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "peer": true + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/wgs84": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz", + "integrity": "sha512-ANHlY4Rb5kHw40D0NJ6moaVfOCMrp9Gpd1R/AIQYg2ko4/jzcJ+TVXYYF6kXJqQwITvEZP4yEthjM7U6rYlljQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", "has-tostringtag": "^1.0.0", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", @@ -7617,6 +10461,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/wri-json-api-serializer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wri-json-api-serializer/-/wri-json-api-serializer-1.0.1.tgz", + "integrity": "sha512-yhu69MyIeKtKKztIzxwWQ87OLWsZ+oz8/vtMs2etPu2GZr2ZrT2S6YDiI4CjAtS9gs3iwQqygnbw6WdGXWmpPw==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -7665,6 +10514,33 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zustand": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.4.tgz", + "integrity": "sha512-5UTUIAiHMNf5+mFp7/AnzJXS7+XxktULFN0+D1sCiZWyX7ZG+AQpqs2qpYrynRij4QvoDdCD+U+bmg/cG3Ucxw==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } } } } diff --git a/deployment/frontend/package.json b/deployment/frontend/package.json index 8c457de7c..18cbd7831 100644 --- a/deployment/frontend/package.json +++ b/deployment/frontend/package.json @@ -11,6 +11,7 @@ "dependencies": { "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", + "@mapbox/mapbox-gl-draw": "^1.4.3", "@mapbox/mapbox-gl-geocoder": "^5.0.1", "@portaljs/ckan": "^0.1.0", "@radix-ui/react-tooltip": "^1.0.7", @@ -18,6 +19,7 @@ "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.6", "@tanstack/react-query": "^4.32.6", + "@tanstack/react-table": "^8.10.7", "@tiptap/extension-bold": "^2.1.12", "@tiptap/extension-code": "^2.1.12", "@tiptap/extension-document": "^2.1.12", @@ -33,13 +35,18 @@ "@trpc/next": "^10.37.1", "@trpc/react-query": "^10.37.1", "@trpc/server": "^10.37.1", + "@vizzuality/layer-manager-plugin-mapboxgl": "^2.0.3", + "@vizzuality/layer-manager-provider-carto": "^2.0.3", + "@vizzuality/layer-manager-utils": "^1.1.4", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "js-deep-equals": "^2.1.1", "ky": "^1.0.1", "mapbox-gl": "^2.15.0", "next": "^13.5.4", "next-auth": "^4.23.0", "next-seo": "^6.1.0", + "old-vizzuality-components": "npm:vizzuality-components@1.3.0", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.47.0", @@ -47,14 +54,24 @@ "react-sortablejs": "^6.1.4", "sortablejs": "^1.15.0", "react-modal": "^3.16.1", + "react-query": "^3.39.3", + "react-vega": "^7.6.0", + "sass": "^1.69.5", "superjson": "^1.13.1", "swiper": "^10.3.1", "tailwind-merge": "^1.14.0", "ts-pattern": "^5.0.5", - "zod": "^3.22.4" + "use-debounce": "^9.0.4", + "vega": "^5.25.0", + "vega-lite": "^5.16.1", + "vizzuality-components": "^3.0.3", + "zod": "^3.22.4", + "zustand": "^4.4.4" }, "devDependencies": { "@types/eslint": "^8.44.2", + "@types/lodash": "^4.14.200", + "@types/mapbox__mapbox-gl-draw": "^1.4.5", "@types/mapbox__mapbox-gl-geocoder": "^4.7.6", "@types/node": "^18.16.0", "@types/react": "^18.2.20", diff --git a/deployment/frontend/src/components/_shared/Modal.tsx b/deployment/frontend/src/components/_shared/Modal.tsx index 160f7ea2c..36948a786 100644 --- a/deployment/frontend/src/components/_shared/Modal.tsx +++ b/deployment/frontend/src/components/_shared/Modal.tsx @@ -31,7 +31,7 @@ export default function Modal({ open, setOpen, children, className = "" }: { ope leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > -
+
+ + )} + + {isDrawing && } + + {showLegends && } + + )} + +
+ ) +} diff --git a/deployment/frontend/src/components/_shared/map/Tooltip.tsx b/deployment/frontend/src/components/_shared/map/Tooltip.tsx new file mode 100644 index 000000000..e0af53c20 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/Tooltip.tsx @@ -0,0 +1,124 @@ +import { + forwardRef, + useCallback, + useEffect, + useImperativeHandle, + useMemo, + useState, +} from "react"; +import { Map, MapLayerMouseEvent } from "mapbox-gl"; +import { + LngLat, + MapGeoJSONFeature, +} from "react-map-gl/dist/esm/types"; +import { Popup } from "react-map-gl"; +import { useLayersFromRW } from "@/utils/queryHooks"; + +export interface TooltipRef { + onClickLayer: (e: MapLayerMouseEvent) => void | undefined; + close: () => void; +} + +export default forwardRef(function Tooltip({}, ref) { + const { data: layers } = useLayersFromRW(); + const [coordinates, setCoordinates] = useState< + { longitude: number; latitude: number } | undefined + >(); + const [layersInfo, setLayersInfo] = useState(); + useEffect(() => { + close(); + }, [layers?.length]); + + const onClickLayer = useCallback( + ({ + features, + lngLat, + }: { + features?: MapGeoJSONFeature[]; + lngLat: LngLat; + }) => { + setCoordinates({ longitude: lngLat.lng, latitude: lngLat.lat }); + const layersInfo = []; + for (let layer of layers) { + const feature = features?.find( + // @ts-ignore + (f) => (f?.source || f.layer?.source) === layer.id + ); + const { interactionConfig } = layer; + + const layerInfo = { + id: layer.id, + name: layer.name, + }; + + if (feature && interactionConfig.output) { + // TODO: output is supposed to be an array + // @ts-ignore + layerInfo.properties = interactionConfig.output.map((c: any) => { + return { + config: c, + // TODO: c.column is supposed to be a string + // @ts-ignore + value: feature.properties[c.column], + }; + }); + } + + layersInfo.push(layerInfo); + } + setLayersInfo(layersInfo); + }, + [layers] + ); + + const close = () => { + setCoordinates(undefined); + setLayersInfo(undefined); + }; + + useImperativeHandle( + ref, + () => { + return { + onClickLayer, + close, + }; + }, + [layers] + ); + + return !!coordinates ? ( + close()} + maxWidth={"250px"} + > + {layersInfo.map((info: any, i: number) => { + return ( +
+

{info.name}

+
+ {info.properties?.map((prop: any, j: number) => { + return ( +

+ + {prop.config.property || prop.config.column}: + {" "} + {/* TODO: format value according to prop.config.format */} + {prop.value} +

+ ); + }) || ( +

No info found for this coordinate

+ )} +
+
+ ); + })} +
+ ) : ( + <> + ); +}); diff --git a/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx b/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx new file mode 100644 index 000000000..5fc512f6b --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx @@ -0,0 +1,60 @@ +import React, { + PureComponent, Children, cloneElement, ReactNode, +} from 'react'; +import Manager from '@vizzuality/layer-manager'; +import type { Map } from 'mapbox-gl'; +import type { Plugin, PluginConstructor, ProviderMaker } from '@vizzuality/layer-manager'; + +export type LayerManagerProps = { + map: Map + plugin: typeof PluginConstructor + providers?: Record + children?: React.ReactNode +}; + +type ChildProps = { + zIndex?: number +}; + +class LayerManagerComponent extends PureComponent { + public layerManager; + + constructor(props: LayerManagerProps) { + super(props); + const { map, plugin: PluginMaker, providers } = props; + + if (providers) Manager.providers = providers; + + const pluginInstance = new PluginMaker(map) as Plugin; + this.layerManager = new Manager(pluginInstance); + } + + componentWillUnmount(): void { + this.layerManager.unmount(); + } + + render(): ReactNode { + const { children } = this.props; + + if (children && Children.count(children)) { + return Children.map( + children, + (child, i) => { + if (React.isValidElement(child)) { + const { zIndex } = child.props as ChildProps; + return cloneElement(child, { + //@ts-ignore + layerManager: this.layerManager, + zIndex: zIndex || 1000 - i, + }); + } + return null; + }, + ); + } + + return null; + } +} + +export default LayerManagerComponent; diff --git a/deployment/frontend/src/components/_shared/map/controls/BaseMapSelector.tsx b/deployment/frontend/src/components/_shared/map/controls/BaseMapSelector.tsx new file mode 100644 index 000000000..3cf36f9d5 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/BaseMapSelector.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import { type Basemap } from '@/interfaces/state.interface' +import { useBasemap } from '@/utils/storeHooks' + +const BasemapSelector = () => { + const basemaps = ['light', 'dark', 'satellite', 'terrain', 'aqueduct'] + const { selectedBasemap, setBasemap } = useBasemap() + + const handleBasemapChange = ( + event: React.ChangeEvent + ) => { + setBasemap(event.target.value as Basemap) + } + + return ( +
+ +
+ {basemaps.map((basemap) => ( + + ))} +
+
+ ) +} + +export default BasemapSelector diff --git a/deployment/frontend/src/components/_shared/map/controls/Boundaries.tsx b/deployment/frontend/src/components/_shared/map/controls/Boundaries.tsx new file mode 100644 index 000000000..e2c927f69 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Boundaries.tsx @@ -0,0 +1,74 @@ +import React, { type MutableRefObject, useCallback, useEffect } from "react"; +import { type MapRef } from "react-map-gl"; +import {type Map as MapType} from "mapbox-gl"; +import type mapboxgl from "mapbox-gl"; +import { useBoundaries } from "@/utils/storeHooks"; + +const Boundaries = ({ + mapRef, +}: { + mapRef: MutableRefObject; +}) => { + const { showBoundaries, setShowBoundaries } = useBoundaries(); + + const handleBoundariesToggle = () => { + setShowBoundaries(!showBoundaries); + }; + + const handleBoundaries = useCallback( + (boundaries: boolean) => { + const map = mapRef.current as unknown as MapType; + const LABELS_GROUP = ["boundaries"]; + const { layers, metadata } = map.getStyle(); + + const boundariesGroups = Object.keys(metadata["mapbox:groups"]).filter( + (k) => { + const { name } = metadata["mapbox:groups"][k]; + + const labelsGroup = LABELS_GROUP.map((rgr) => + name.toLowerCase().includes(rgr) + ); + + return labelsGroup.some((bool) => bool); + } + ); + + const boundariesLayers = layers.filter((l: mapboxgl.Layer) => { + const { metadata: layerMetadata } = l; + if (!layerMetadata) return false; + + const gr = layerMetadata["mapbox:group"]; + return boundariesGroups.includes(gr); + }); + + boundariesLayers.forEach((l) => { + map.setLayoutProperty( + l.id, + "visibility", + boundaries ? "visible" : "none" + ); + }); + }, + [mapRef] + ); + + useEffect(() => { + handleBoundaries(showBoundaries); + }, [showBoundaries, handleBoundaries]); + + return ( +
+ +
+ ); +}; + +export default Boundaries; + diff --git a/deployment/frontend/src/components/_shared/map/controls/Controls.tsx b/deployment/frontend/src/components/_shared/map/controls/Controls.tsx new file mode 100644 index 000000000..3c949582b --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Controls.tsx @@ -0,0 +1,32 @@ +import type { MapRef } from 'react-map-gl' +import Zoom from './Zoom' +import type { MutableRefObject } from 'react' +import Search from './Search' +import Settings from './Settings' +import Draw from './Draw' +import { Download } from './Download' +import Export from './Export' + +export default function Controls({ + mapRef, + mapContainerRef, +}: { + mapRef: MutableRefObject + mapContainerRef: MutableRefObject +}) { + return ( +
+ + + + { + console.log(feature) + }} + /> + + +
+ ) +} diff --git a/deployment/frontend/src/components/_shared/map/controls/Download.tsx b/deployment/frontend/src/components/_shared/map/controls/Download.tsx new file mode 100644 index 000000000..efdce8001 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Download.tsx @@ -0,0 +1,42 @@ +import { useLayersFromRW } from "@/utils/queryHooks"; +import { + AnyLayer, + RasterLayer, + FillLayer, + LineLayer, + SymbolLayer, + CircleLayer, +} from "mapbox-gl"; +import { useMap } from "react-map-gl"; +import IconButton from "./IconButton"; +import {DownloadIcon} from "../../icons/DownloadIcon"; + +export function Download() { + const { current: map } = useMap(); + const { data: activeLayers } = useLayersFromRW(); + if (!map) return null; + function getFeatures() { + const layerIds = activeLayers.map((layer) => layer.id); + const layers = map + ?.getStyle() + .layers.filter(isDataLayer) + .filter((layer) => layerIds.includes(layer.source as string)) + .map((layer) => layer.id); + const features = map + ?.queryRenderedFeatures(undefined, { layers: layers ? layers : [] }) + .map((feature) => feature.properties); + alert(JSON.stringify(features)); + } + return getFeatures()}>; +} + +function isDataLayer( + layer: AnyLayer +): layer is FillLayer | LineLayer | RasterLayer | SymbolLayer | CircleLayer { + return ( + (layer as CircleLayer | FillLayer | LineLayer | RasterLayer | SymbolLayer) + .source !== undefined + ); +} + + diff --git a/deployment/frontend/src/components/_shared/map/controls/Draw.tsx b/deployment/frontend/src/components/_shared/map/controls/Draw.tsx new file mode 100644 index 000000000..2acf6c293 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Draw.tsx @@ -0,0 +1,134 @@ +import MapboxDraw, { type DrawFeature } from "@mapbox/mapbox-gl-draw"; +import { Layer, Source } from "react-map-gl"; + +import type { MapRef } from "react-map-gl"; +import { + type MutableRefObject, + useCallback, + useEffect, + useRef, + useState, +} from "react"; +import { type LineLayer } from "mapbox-gl"; +import { useIsDrawing } from "@/utils/storeHooks"; +import IconButton from "./IconButton"; + +export interface DrawProps { + mapRef: MutableRefObject; + onDraw?: (feature: DrawFeature) => void; +} + +export default function Draw({ + mapRef, + onDraw = () => null, +}: DrawProps): JSX.Element | null { + const { isDrawing, setIsDrawing } = useIsDrawing(); + const [features, setFeatures] = useState(); + const drawControlRef = useRef(); + + useEffect(() => { + /* + * HACK: This weird logic prevents a bug on the + * first render + * + */ + if (isDrawing === undefined) { + setIsDrawing(true); + return; + } + + if (!isDrawing) { + startDrawing(); + } else { + stopDrawing(); + } + + return () => { + removeDrawControl(); + }; + }, [isDrawing]); + + const drawControlOpts = { + displayControlsDefault: false, + defaultMode: "draw_polygon", + }; + + const onDrawCreate = useCallback((e: any) => { + const feature = e.features[0]; + setFeatures(feature); + drawControlRef.current?.deleteAll(); + onDraw(feature); + }, []); + + const addDrawControl = () => { + if (mapRef.current) { + if (drawControlRef.current) { + removeDrawControl(); + } + + drawControlRef.current = new MapboxDraw(drawControlOpts); + mapRef.current.addControl(drawControlRef.current); + mapRef.current.on("draw.create", onDrawCreate); + } + }; + + const removeDrawControl = () => { + if (mapRef.current && drawControlRef.current) { + mapRef.current.off("draw.create", onDrawCreate); + mapRef.current.removeControl(drawControlRef.current); + drawControlRef.current = undefined; + } + }; + + const startDrawing = () => { + addDrawControl(); + }; + + const stopDrawing = () => { + removeDrawControl(); + setFeatures(undefined); + }; + + const toggleDrawing = () => { + setIsDrawing(!isDrawing); + }; + + const layerStyle: LineLayer = { + id: "drawn-polygon-layer", + type: "line", + paint: { + "line-color": "#ff0000", + "line-width": 5, + }, + }; + + return ( + <> + toggleDrawing()} + > + + + {features && ( + + + + )} + + ); +} + +function DrawIcon() { + return + + + + + + + + + +} diff --git a/deployment/frontend/src/components/_shared/map/controls/Export.tsx b/deployment/frontend/src/components/_shared/map/controls/Export.tsx new file mode 100644 index 000000000..57020a7c2 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Export.tsx @@ -0,0 +1,11 @@ +import IconButton from "./IconButton" + +export default function Export() { + return +} + +function ExportIcon() { + return + + +} diff --git a/deployment/frontend/src/components/_shared/map/controls/IconButton.tsx b/deployment/frontend/src/components/_shared/map/controls/IconButton.tsx new file mode 100644 index 000000000..7df17321a --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/IconButton.tsx @@ -0,0 +1,8 @@ +interface IconButtonProps extends React.ButtonHTMLAttributes { + children: React.ReactNode +} + +export default function IconButton({ children, ...props }: IconButtonProps) { + + return +} diff --git a/deployment/frontend/src/components/_shared/map/controls/LabelSelector.tsx b/deployment/frontend/src/components/_shared/map/controls/LabelSelector.tsx new file mode 100644 index 000000000..97783e11d --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/LabelSelector.tsx @@ -0,0 +1,34 @@ +import React from 'react' +import { Labels } from '@/interfaces/state.interface' +import { useLabels } from '@/utils/storeHooks' + +const LabelSelector = () => { + const labels = ['light', 'dark', 'none'] + const { selectedLabels, setLabels } = useLabels() + + const handleLabelsChange = (event: React.ChangeEvent) => { + setLabels(event.target.value as Labels) + } + + return ( +
+ Labels:   +
+ {labels.map((label) => ( + + ))} +
+
+ ) +} + +export default LabelSelector diff --git a/deployment/frontend/src/components/_shared/map/controls/Legends.tsx b/deployment/frontend/src/components/_shared/map/controls/Legends.tsx new file mode 100644 index 000000000..106ba9b67 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Legends.tsx @@ -0,0 +1,175 @@ +import { useLayerGroupsFromRW } from "@/utils/queryHooks"; +import { useActiveLayerGroups, useLayerStates } from "@/utils/storeHooks"; +import { type APILayerSpec } from "@/interfaces/layer.interface"; +import { + Legend, + LegendListItem, + LegendItemToolbar, + LegendItemButtonLayers, + LegendItemButtonOpacity, + LegendItemButtonVisibility, + LegendItemTypes, + LegendItemTimeStep, + Icons, + // @ts-ignore +} from "vizzuality-components"; + // @ts-ignore +import { LegendItemTimeline } from "old-vizzuality-components"; +import { type ActiveLayerGroup } from "@/interfaces/state.interface"; + +export function Legends() { + const { data: layerGroups } = useLayerGroupsFromRW(); + const { activeLayerGroups, replaceLayersGroups } = useActiveLayerGroups(); + const { currentLayers, updateLayerState } = useLayerStates(); + + function reorderLayerGroups(newOrder: string[]) { + const isActiveLayerGroup = ( + item: ActiveLayerGroup | undefined + ): item is ActiveLayerGroup => { + return !!item; + }; + const newLayerGroups = newOrder + .map((id) => { + return activeLayerGroups.find((lg) => lg.datasetId === id); + }) + .filter(isActiveLayerGroup); + replaceLayersGroups(newLayerGroups); + } + + if (!layerGroups) return Loading...; + return ( +
+ + reorderLayerGroups(datasetIds)} + > + {layerGroups.map((lg: any, i: number) => { + return ( + { + const layerState = currentLayers.get(l.id); + return { + ...l, + ...layerState, + }; + }), + }} + toolbar={ + + + + + + } + onChangeInfo={() => console.log("Info")} + onChangeOpacity={(layer: any, newOpacity: number) => { + updateLayerState(layer.id, "active", true); + updateLayerState(layer.id, "opacity", newOpacity); + }} + onChangeVisibility={(layer: any) => { + const layerState = currentLayers.get(layer.id); + updateLayerState(layer.id, "active", true); + updateLayerState( + layer.id, + "visibility", + typeof layerState?.visibility === "undefined" + ? false + : !layerState?.visibility + ); + }} + onChangeLayer={(layer: APILayerSpec) => { + lg.layers.forEach((_layer: APILayerSpec) => { + updateLayerState(_layer.id, "active", false); + }); + updateLayerState(layer.id, "active", true); + }} + onRemoveLayer={(layer: APILayerSpec) => console.log(layer)} + > + + console.log("Change")} + customClass="rw-legend-timeline" + dots={true} + /> + {lg.layers.length > 1 && + !lg.layers.find( + (l: APILayerSpec & { timelineParams: any }) => + !!l.timelineParams + ) && ( + { + lg.layers + .filter( + (_layer: APILayerSpec) => _layer.id !== layer.id + ) + .forEach((_layer: APILayerSpec) => { + updateLayerState(_layer.id, "active", false); + }); + updateLayerState(layer.id, "active", true); + }} + customClass="rw-legend-timeline" + {...LEGEND_TIMELINE_PROPERTIES} + /> + )} + + ); + })} + +
+ ); +} + +export const LEGEND_TIMELINE_PROPERTIES = { + trackStyle: [{ backgroundColor: "#caccd0" }, { backgroundColor: "#caccd0" }], + railStyle: { + backgroundColor: "#caccd0", + height: 2, + }, + handleStyle: [ + { + backgroundColor: "#c32d7b", + width: 21, + height: 21, + borderWidth: 3, + borderColor: "#fff", + transform: "translate(calc(-50% + 6px), calc(-50% + 12px))", + top: 0, + }, + { + backgroundColor: "#c32d7b", + width: 21, + height: 21, + borderWidth: 3, + borderColor: "#fff", + transform: "translate(calc(-50% + 6px), calc(-50% + 12px))", + top: 0, + }, + ], + dotStyle: { + width: 16, + height: 16, + borderColor: "#caccd0", + transform: "translate(calc(-50% + 4px), 50%)", + bottom: "50%", + borderWidth: 2, + }, + activeDotStyle: { + width: 16, + height: 16, + borderColor: "#caccd0", + transform: "translate(calc(-50% + 4px), 50%)", + bottom: "50%", + }, + markStyle: { + width: "auto", + margin: 0, + fontFamily: "'Lato', 'Helvetica Neue', Helvetica, Arial, sans", + color: "#393f44", + }, +}; diff --git a/deployment/frontend/src/components/_shared/map/controls/Search.tsx b/deployment/frontend/src/components/_shared/map/controls/Search.tsx new file mode 100644 index 000000000..76bd38c76 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Search.tsx @@ -0,0 +1,132 @@ +import React, { + useState, + useRef, + useCallback, + MutableRefObject, + useEffect, +} from 'react' +// import Geosuggest, { Suggest } from 'react-geosuggest'; +import { fitBounds } from '@math.gl/web-mercator' +import { useDebouncedCallback } from 'use-debounce' +import { useMapState, useBounds } from '@/utils/storeHooks' +import isEmpty from 'lodash/isEmpty' +import IconButton from './IconButton' +import { SearchIcon } from '../../icons/SearchIcon' + +export default function Search({ + mapContainerRef, +}: { + mapContainerRef: MutableRefObject +}) { + const [showSearchInput, setShowSearchInput] = useState(false) + // const geosuggest = useRef(null) + const { setViewState, viewState } = useMapState() + const { bounds, setBounds } = useBounds() + + const debouncedOnMapViewportChange = useDebouncedCallback((v) => { + setViewState(v) + }, 250) + + const handleSearch = useCallback( + (locationParams: any) => { + setBounds({ + ...locationParams, + options: { zoom: 2 }, + }) + }, + [setBounds] + ) + + const handleFitBounds = useCallback(() => { + const bbox = bounds.bbox as number[] + const options = bounds.options + const mapContainer = mapContainerRef.current as HTMLDivElement + if (mapContainer.offsetWidth <= 0 || mapContainer.offsetHeight <= 0) { + throw new Error("mapContainerRef doesn't have any dimensions") + } + + const { longitude, latitude, zoom } = fitBounds({ + width: mapContainer.offsetWidth, + height: mapContainer.offsetHeight, + bounds: [ + //@ts-ignore + [bbox[0], bbox[1]], + //@ts-ignore + [bbox[2], bbox[3]], + ], + ...options, + }) + + const newViewport = { + longitude, + latitude, + zoom, + } + + const viewport = { ...viewState, ...newViewport } + setViewState(viewport) + // debouncedOnMapViewportChange(newViewport); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [bounds, debouncedOnMapViewportChange, mapContainerRef]) + + const onSuggestSelect = (e: any) => { + if (e) { + const { gmaps, location } = e + const viewport = gmaps?.geometry && gmaps.geometry.viewport + + if (viewport) { + const { south, west, north, east } = viewport.toJSON() + handleSearch({ bbox: [east, south, west, north] }) + } + + if (!viewport && location) { + handleSearch({ ...location, zoom: 7 }) + } + + handleSearchInput(false) + } + } + + const onKeyDown = (e: { keyCode: number }) => { + if (e.keyCode === 27) handleSearchInput(false) + } + + const handleSearchInput = (show: boolean) => { + if (show) { + // geosuggest.current?.focus(); + setShowSearchInput(true) + } else { + // geosuggest.current?.clear(); + setShowSearchInput(false) + } + } + + useEffect(() => { + if ( + !isEmpty(bounds) && + !!bounds.bbox && + bounds.bbox.every((b) => typeof b === 'number') + ) { + handleFitBounds() + } + }, [bounds, handleFitBounds]) + + return ( +
+ {showSearchInput && ( + /* */
+ )} + handleSearchInput(!showSearchInput)} + > + + +
+ ) +} diff --git a/deployment/frontend/src/components/_shared/map/controls/Settings.tsx b/deployment/frontend/src/components/_shared/map/controls/Settings.tsx new file mode 100644 index 000000000..3d21e4a41 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Settings.tsx @@ -0,0 +1,38 @@ +import { type MutableRefObject, useState } from 'react' +import Modal from '../../Modal' +import IconButton from './IconButton' +import BasemapSelector from './BaseMapSelector' +import LabelSelector from './LabelSelector' +import { type MapRef } from 'react-map-gl' +import Boundaries from './Boundaries' +import {SettingsIcon} from '../../icons/SettingsIcon' + +export default function Settings({ + mapRef, +}: { + mapRef: MutableRefObject +}) { + const [open, setOpen] = useState(false) + return ( + setOpen(true)}> + + +

+ Map settings +

+
+
+ +
+
+ +
+
+ +
+
+
+
+ ) +} + diff --git a/deployment/frontend/src/components/_shared/map/controls/Zoom.tsx b/deployment/frontend/src/components/_shared/map/controls/Zoom.tsx new file mode 100644 index 000000000..fb72cc6b9 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Zoom.tsx @@ -0,0 +1,27 @@ +import { MutableRefObject } from "react"; +import IconButton from "./IconButton"; +import { MapRef } from "react-map-gl"; + +export default function Zoom({ + mapRef, +}: { + mapRef: MutableRefObject; +}) { + + return <> + mapRef?.current?.zoomIn({ duration: 500 })}> + mapRef?.current?.zoomOut({ duration: 500 })}> + +} + +function PlusIcon() { + return + + +} + +function MinusIcon() { + return + + +} diff --git a/deployment/frontend/src/components/dashboard/approval/ApprovalRow.tsx b/deployment/frontend/src/components/dashboard/approval/ApprovalRow.tsx index cc3e736c3..50f1701f1 100644 --- a/deployment/frontend/src/components/dashboard/approval/ApprovalRow.tsx +++ b/deployment/frontend/src/components/dashboard/approval/ApprovalRow.tsx @@ -45,7 +45,7 @@ export default function ApprovalRow({ approvalInfo, className }: { approvalInfo: ]} linkButton={{ label: "Review", - link: "#", + link: "/datasets/x?approval=true", }} /> diff --git a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx index 2cd2ee0c1..eba3456c3 100644 --- a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx +++ b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx @@ -1,44 +1,108 @@ -import classNames from "@/utils/classnames"; -import { Disclosure } from "@headlessui/react"; -import { ArrowRightIcon } from "@heroicons/react/20/solid"; +import classNames from '@/utils/classnames' +import { Disclosure } from '@headlessui/react' +import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/20/solid' +import { useState } from 'react' import { useRouter } from "next/router"; export default function DatasetPageLayout({ - children, + lhs, + rhs, }: { - children: React.ReactNode; + lhs: React.ReactNode + rhs: React.ReactNode }) { - const { query } = useRouter(); - const isApprovalRequest = query?.approval === "true"; - return ( -
- - {({ open }) => ( - <> - -
+ + {({ open }) => ( + <> + { + setLhsOpen(!open) + }} + className={`absolute left-[calc(100%-3rem)] lg:left-[calc(50%-3rem)] top-[23vh] sm:top-[26vh] lg:top-[30vh] z-20 hidden lg:block ${ + rhsOpen && open + ? '' + : !rhsOpen && open + ? '!hidden' + : '' + }`} + > +
+ +
+
+ + {lhs} + + + )} +
+ + + {({ open }) => ( + <> + { + setRhsOpen(!open) + }} + className={`absolute right-[calc(100%-3rem)] lg:right-[calc(50%-3rem)] top-[23vh] sm:top-[26vh] lg:top-[30vh] z-20 hidden lg:block ${ + lhsOpen && open + ? '' + : !lhsOpen && open + ? '!hidden' + : '' + }`} + > +
+ +
+
+ +
+ {rhs} +
+
+ )} - > - -
-
- - {children} - - - )} -
-
- ); + +
+ ) } diff --git a/deployment/frontend/src/components/datasets/add-layers/AddLayers.tsx b/deployment/frontend/src/components/datasets/add-layers/AddLayers.tsx new file mode 100644 index 000000000..e50d788c5 --- /dev/null +++ b/deployment/frontend/src/components/datasets/add-layers/AddLayers.tsx @@ -0,0 +1,40 @@ +import classNames from '@/utils/classnames' +import { Tab } from '@headlessui/react' +import { Fragment } from 'react' +import SearchPanel from './SearchPanel' +import FiltersPanel from './FiltersPanel' + +export default function AddLayers() { + const addLayerTabs = [{ name: 'Search' }, { name: 'Filters' }] + + return ( + + + {addLayerTabs.map((tab) => ( + + {({ selected }: { selected: boolean }) => ( + + )} + + ))} + + + + + + + + + + + ) +} diff --git a/deployment/frontend/src/components/datasets/add-layers/FiltersPanel.tsx b/deployment/frontend/src/components/datasets/add-layers/FiltersPanel.tsx new file mode 100644 index 000000000..fb0713cca --- /dev/null +++ b/deployment/frontend/src/components/datasets/add-layers/FiltersPanel.tsx @@ -0,0 +1,141 @@ +import Facet from '@/components/search/Facet' +import FiltersSelected from '@/components/search/FiltersSelected' +import LocationSearch from '@/components/search/LocationSearch' + +export default function FiltersPanel() { + return ( +
+ +
+ +
+
+ ) +} diff --git a/deployment/frontend/src/components/datasets/add-layers/SearchPanel.tsx b/deployment/frontend/src/components/datasets/add-layers/SearchPanel.tsx new file mode 100644 index 000000000..080add99e --- /dev/null +++ b/deployment/frontend/src/components/datasets/add-layers/SearchPanel.tsx @@ -0,0 +1,41 @@ +import { MagnifyingGlassIcon } from '@heroicons/react/20/solid' +import DatasetCard from '../sections/RelatedDatasets' +import Select from '@/components/_shared/Select' + +export default function SearchPanel() { + return ( +
+
+ + +
+
+
+ + {6} Datasets + +
+
+ Show +
+ - -
-
- - 3 Data Files - -
-
- Show All Layers -
-
- Hide All -
-
-
-
- {datafilesMock.map((datafile) => ( - - ))} -
- - ); + return ( + <> +
+ + +
+
+ + 3 Data Files + +
+
+ Show All Layers +
+
+ Hide All +
+
+
+
+ {datafilesMock.map((datafile) => ( + + ))} +
+ + ) } -const colors: Record = { - TIFF: "bg-wri-light-green", - CSV: "bg-wri-light-yellow", - GeoJSON: "bg-wri-light-blue", -}; +export const colors: Record = { + TIFF: 'bg-wri-light-green', + CSV: 'bg-wri-light-yellow', + GeoJSON: 'bg-wri-light-blue', +} interface Datafile { - format: string; - name: string; - showing: boolean; - canShow: boolean; + format: string + name: string + showing: boolean + canShow: boolean } function DatafileCard({ datafile }: { datafile: Datafile }) { - return ( - - {({ open }) => ( -
-
-
- - {datafile.format} - - -

- {datafile.name} -

-
-
-
- {datafile.canShow && ( - <> - {datafile.showing ? ( - - ) : ( - - )} - - )} - - - -
-
- - -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam - porta sem malesuada magna mollis euismod. Aenean lacinia - bibendum nulla sed consectetur. Nullam quis risus eget urna - mollis ornare vel eu leo. -

-
-
- -

- 2 Feb 2023 -

+ return ( + + {({ open }) => ( +
+
+
+ + + {datafile.format} + + + +

+ {datafile.name} +

+
+
+
+ {datafile.canShow && ( + <> + {datafile.showing ? ( + + ) : ( + + )} + + )} + + + +
+
+ + +

+ Lorem ipsum dolor sit amet, consectetur + adipiscing elit. Etiam porta sem malesuada magna + mollis euismod. Aenean lacinia bibendum nulla + sed consectetur. Nullam quis risus eget urna + mollis ornare vel eu leo. +

+
+
+ +

+ 2 Feb 2023 +

+
+
+ +

+ 2020 - 2023 +

+
+
+ +

+ Sub-Regional +

+
+
+
+ + + +
+
+
-
- -

- 2020 - 2023 -

-
-
- -

- Sub-Regional -

-
-
-
- - - -
- - -
- )} - - ); + )} + + ) } diff --git a/deployment/frontend/src/components/datasets/sections/RelatedDatasets.tsx b/deployment/frontend/src/components/datasets/sections/RelatedDatasets.tsx index a6097ec6a..9efdc9cad 100644 --- a/deployment/frontend/src/components/datasets/sections/RelatedDatasets.tsx +++ b/deployment/frontend/src/components/datasets/sections/RelatedDatasets.tsx @@ -1,82 +1,256 @@ -import { Button } from "@/components/_shared/Button"; +import { Button } from '@/components/_shared/Button' +import Modal from '@/components/_shared/Modal' +import classNames from '@/utils/classnames' import { - ChartBarIcon, - ExclamationTriangleIcon, - GlobeAltIcon, - TableCellsIcon, -} from "@heroicons/react/20/solid"; + ChartBarIcon, + ExclamationTriangleIcon, + GlobeAltIcon, + MagnifyingGlassIcon, + TableCellsIcon, +} from '@heroicons/react/20/solid' import { - ArrowPathIcon, - ClockIcon, - MapPinIcon, -} from "@heroicons/react/24/outline"; + ArrowPathIcon, + ClockIcon, + MapPinIcon, +} from '@heroicons/react/24/outline' +import { useState } from 'react' +import { colors } from './DataFiles' +import Map from '@/components/_shared/map/Map' export function RelatedDatasets() { - return ( -
- {[0, 1, 2, 3, 4, 5].map((dataset) => ( - - ))} -
- ); + return ( +
+ {[0, 1, 2, 3, 4, 5].map((dataset) => ( + + ))} +
+ ) } export default function DatasetCard() { - return ( -
-

- LAND AND CARBON LAB -

-

- Title of the dataset goes here lorem ipsum. -

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem - malesuada magna mollis euismod. Aenean lacinia bibendum nulla sed - consectetur. -

-
-
- -

- 2 Feb 2023 -

-
-
- -

- 2020 - 2023 -

-
-
- -

- Sub-Regional -

-
-
-
-
+

+ LAND AND CARBON LAB +

+

+ Title of the dataset goes here lorem ipsum. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam + porta sem malesuada magna mollis euismod. Aenean lacinia + bibendum nulla sed consectetur. +

+
+
+ +

+ 2 Feb 2023 +

+
+
+ +

+ 2020 - 2023 +

+
+
+ +

+ Sub-Regional +

+
+
+
+
-
- -
-
- -
-
- -
-
-
- + > +
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + +
+
+

{''}

+

+ Select one or more data files to be added. +

+
+
+ + +
+
+
+ + {dataFiles.length} Data Files,{' '} + {selectedDataFileNames.length} Data Files + Selected + +
+ + +
+
+
+ {dataFiles.map((df, i) => { + return ( + + ) + })} +
+ +
+
+
+
+ +
+
+
+
-
- -
- ); + ) +} + +function CheckIcon() { + return ( + + + + + ) } diff --git a/deployment/frontend/src/components/datasets/visualizations/ChartView.tsx b/deployment/frontend/src/components/datasets/visualizations/ChartView.tsx new file mode 100644 index 000000000..fc1a8ad9a --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/ChartView.tsx @@ -0,0 +1,57 @@ +import { DownloadIcon } from '@/components/_shared/icons/DownloadIcon' +import { ExportIcon } from '@/components/_shared/icons/ExportIcon' +import { SettingsIcon } from '@/components/_shared/icons/SettingsIcon' +import IconButton from '@/components/_shared/map/controls/IconButton' +import { VegaLite } from 'react-vega' + +export default function ChartView() { + return ( +
+
+ + + + + + + + + +
+
+ +
+
+ ) +} diff --git a/deployment/frontend/src/components/datasets/visualizations/MapView.tsx b/deployment/frontend/src/components/datasets/visualizations/MapView.tsx new file mode 100644 index 000000000..9b7585ed3 --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/MapView.tsx @@ -0,0 +1,22 @@ +import Map from '@/components/_shared/map/Map' +import { useLayersFromRW } from '@/utils/queryHooks' +import { useActiveLayerGroups } from '@/utils/storeHooks' +import { Dispatch, SetStateAction, useEffect } from 'react' + +export default function MapView({ + setIsAddLayers, +}: { + setIsAddLayers: Dispatch> +}) { + const { data: activeLayers } = useLayersFromRW() + const { addLayerGroup } = useActiveLayerGroups() + + useEffect(() => { + addLayerGroup({ + layers: ['74306f01-3baa-4256-9cdc-694080cf6b13'], + datasetId: '', + }) + }, []) + + return setIsAddLayers(prev => !prev)} /> +} diff --git a/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx b/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx new file mode 100644 index 000000000..328a32877 --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx @@ -0,0 +1,224 @@ +import { + createColumnHelper, + FilterFn, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + useReactTable, +} from '@tanstack/react-table' + +import { + ArrowDownIcon, + ArrowUpIcon, + ChevronDoubleLeftIcon, + ChevronDoubleRightIcon, + ChevronLeftIcon, + ChevronRightIcon, +} from '@heroicons/react/24/solid' + +import React, { useEffect, useMemo, useState } from 'react' +import IconButton from '@/components/_shared/map/controls/IconButton' +import { SettingsIcon } from '@/components/_shared/icons/SettingsIcon' +import { DownloadIcon } from '@/components/_shared/icons/DownloadIcon' +import { SearchIcon } from '@/components/_shared/icons/SearchIcon' +import { AdvancedFilteringIcon } from '@/components/_shared/icons/AdvancedFilteringIcon' +import { ColFilterIcon } from '@/components/_shared/icons/ColFilterIcon' + +type TableProps = { + data?: Array<{ [key: string]: number | string }> + cols?: Array<{ [key: string]: string }> + csv?: string + url?: string + fullWidth?: boolean +} + +export default ({ + data: ogData = [], + cols: ogCols = [], + csv = '', + url = '', + fullWidth = false, +}: TableProps) => { + const [isLoading, setIsLoading] = useState(false) + + ogCols = [ + { key: 'id', name: 'ID' }, + { key: 'name', name: 'Name' }, + { key: 'title', name: 'Title' }, + { key: 'value', name: 'Value' }, + { key: 'value2', name: 'Value 2' }, + { key: 'value3', name: 'Value 3' }, + { key: 'value4', name: 'Value 4' }, + ] + + ogData = [...new Array(50).keys()].map((i) => ({ + id: i, + name: `row-${i}`, + title: `Row ${i}`, + value: `Value ${i}`, + value2: `Value ${i}`, + value3: `Value ${i}`, + value4: `Another value - ${i}`, + })) + + const [data, setData] = React.useState(ogData) + const [cols, setCols] = React.useState(ogCols) + + const tableCols = useMemo(() => { + const columnHelper = createColumnHelper() + return cols.map((c) => + columnHelper.accessor(c.key, { + header: () => c.name, + cell: (info) => info.getValue(), + }) + ) + }, [data, cols]) + + const [globalFilter, setGlobalFilter] = useState('') + + const table = useReactTable({ + data, + columns: tableCols, + getCoreRowModel: getCoreRowModel(), + state: { + globalFilter, + }, + globalFilterFn: globalFilterFn, + onGlobalFilterChange: setGlobalFilter, + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + }) + + const pageIndex = table.getState().pagination.pageIndex + const pageSize = table.getState().pagination.pageSize + + return isLoading ? ( +
+ Loading... +
+ ) : ( +
+
+ + + + + {ogCols.length} columns, {ogData.length} rows + +
+ + {pageIndex * pageSize + 1} -{' '} + {(pageIndex + 1) * pageSize} of{' '} + {table.getFilteredRowModel().rows.length} + + + +
+
+
+ + + + + + + + + + + + +
+
+ + + {table.getHeaderGroups().map((hg) => ( + + {hg.headers.map((h) => ( + + ))} + + ))} + + + {table.getRowModel().rows.map((r) => ( + + {r.getVisibleCells().map((c) => ( + + ))} + + ))} + +
+
+ {flexRender( + h.column.columnDef.header, + h.getContext() + )} + +
+
+
+ {' '} + {flexRender( + c.column.columnDef.cell, + c.getContext() + )} +
+
+
+
+ ) +} + +const globalFilterFn: FilterFn = (row, columnId, filterValue: string) => { + const search = filterValue.toLowerCase() + + let value = row.getValue(columnId) as string + if (typeof value === 'number') value = String(value) + + return value?.toLowerCase().includes(search) +} diff --git a/deployment/frontend/src/components/datasets/visualizations/VisualizationTabs.tsx b/deployment/frontend/src/components/datasets/visualizations/VisualizationTabs.tsx new file mode 100644 index 000000000..4b0aa6fb4 --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/VisualizationTabs.tsx @@ -0,0 +1,27 @@ + +import classNames from "@/utils/classnames"; +import { Tab } from "@headlessui/react"; +import { Fragment } from "react"; + +export function VisualizationTabs({ tabs }: { tabs: { name: string }[] }) { + return ( + <> + {tabs.map((tab, i) => ( + + {({ selected }: { selected: boolean }) => ( + + )} + + ))} + + ); +} diff --git a/deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx b/deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx new file mode 100644 index 000000000..44b1f39c9 --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx @@ -0,0 +1,39 @@ +import { Tab } from '@headlessui/react' +import { VisualizationTabs } from './VisualizationTabs' +import MapView from './MapView' +import TabularView from './TabularView' +import ChartView from './ChartView' +import { Dispatch, SetStateAction } from 'react' + +export default function Visualizations({ + setIsAddLayers: setisAddLayers, +}: { + setIsAddLayers: Dispatch> +}) { + const tabs = [ + { name: 'Map View' }, + { name: 'Tabular View' }, + { name: 'Chart View' }, + ] + + return ( +
+ + + + + + + + + + + + + + + + +
+ ) +} diff --git a/deployment/frontend/src/interfaces/layer.interface.tsx b/deployment/frontend/src/interfaces/layer.interface.tsx new file mode 100644 index 000000000..d3ad88e50 --- /dev/null +++ b/deployment/frontend/src/interfaces/layer.interface.tsx @@ -0,0 +1,56 @@ + +import type { Source, LayerType } from "@vizzuality/layer-manager"; + +export interface DeckProps { + type: "deck"; + params?: Record; + data: string; + subtype: string; +} + +export interface layerConfigBodySpec { + attribution?: string; +} + +export interface Render { + layers?: Record[]; +} + +export interface layerConfigSpec { + type: LayerType; + render?: any; + source: Partial; + [key: string]: + | Record + | string + | boolean + | number; + attribution?: any; + body?: any; + deck?: any; +} + +export interface APILayerSpec { + id: string; + name: string; + dataset: string; + slug: string; + description?: string; + application: string[]; + type?: string; + iso: string[]; + provider: string; + userId: string; + default: boolean; + protected: boolean; + published: boolean; + env: string; + thumbnailUrl: string; + layerConfig: layerConfigSpec; + legendConfig: Record; + applicationConfig: Record; + interactionConfig: Record; + staticImageConfig: Record; + createdAt: string; + updatedAt: string; +} diff --git a/deployment/frontend/src/interfaces/state.interface.tsx b/deployment/frontend/src/interfaces/state.interface.tsx new file mode 100644 index 000000000..be18b5020 --- /dev/null +++ b/deployment/frontend/src/interfaces/state.interface.tsx @@ -0,0 +1,49 @@ +import { ViewState } from "react-map-gl"; + +export interface State { + viewState: ViewState; + basemap: Basemap; + labels: Labels; + boundaries: boolean; + activeLayerGroups: ActiveLayerGroup[]; + bounds: Bounds; + isDrawing: boolean | undefined; + layersParsed: Array<[string, LayerState]>; +} + +export interface ActiveLayerGroup { + datasetId: string; + layers: string[]; +} + +export type Basemap = + | "dark" + | "light" + | "satellite" + | "terrain" + | "aqueduct" + | "none"; + +export interface DatasetState { + id: string; + layers: LayerState[]; +} + +export interface Layers { + layers: Map; +} + +export interface LayerState { + visibility?: boolean; + active?: boolean; + zIndex?: number; + opacity?: number; +} + +export type Labels = "dark" | "light" | "none"; + +export interface Bounds { + bbox: number[] | null; + options?: Record; + viewportOptions?: Partial; +} diff --git a/deployment/frontend/src/pages/_app.tsx b/deployment/frontend/src/pages/_app.tsx index 4ebecb026..63bd15ed8 100644 --- a/deployment/frontend/src/pages/_app.tsx +++ b/deployment/frontend/src/pages/_app.tsx @@ -1,51 +1,85 @@ -import { type Session } from "next-auth"; -import { SessionProvider } from "next-auth/react"; -import { type AppType } from "next/app"; -import "mapbox-gl/dist/mapbox-gl.css"; -import "@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css"; -import localFont from "next/font/local"; +import { type Session } from 'next-auth' +import { SessionProvider } from 'next-auth/react' +import { type AppType } from 'next/app' +import { Hydrate, QueryClient, QueryClientProvider } from 'react-query' +import { useState } from 'react' +import { Provider, useCreateStore } from '@/utils/store' +import { type LayerState } from '@/interfaces/state.interface' +import 'mapbox-gl/dist/mapbox-gl.css' +import '@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css' +import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css' +import localFont from 'next/font/local' -import { api } from "@/utils/api"; +import { api } from '@/utils/api' -import "@/styles/globals.css"; -import "@/styles/rte.css"; +import '@/styles/globals.scss' +import '@/styles/rte.css' const acumin = localFont({ - src: [ - { - path: "./fonts/acumin-pro-semi-condensed.otf", - weight: "400", - style: "normal", - }, - { - path: "./fonts/acumin-pro-semi-condensed-light.otf", - weight: "300", - style: "light", - }, - { - path: "./fonts/acumin-pro-semi-condensed-smbd.otf", - weight: "600", - style: "semibold", - }, - { - path: "./fonts/acumin-pro-semi-condensed-bold.otf", - weight: "700", - style: "bold", - }, - ], - variable: "--font-acumin", -}); + src: [ + { + path: './fonts/acumin-pro-semi-condensed.otf', + weight: '400', + style: 'normal', + }, + { + path: './fonts/acumin-pro-semi-condensed-light.otf', + weight: '300', + style: 'light', + }, + { + path: './fonts/acumin-pro-semi-condensed-smbd.otf', + weight: '600', + style: 'semibold', + }, + { + path: './fonts/acumin-pro-semi-condensed-bold.otf', + weight: '700', + style: 'bold', + }, + ], + variable: '--font-acumin', +}) const MyApp: AppType<{ session: Session | null }> = ({ - Component, - pageProps: { session, ...pageProps }, + Component, + pageProps: { session, ...pageProps }, }) => { - return ( - -
- -
-
- ); -}; + const newLayersState = new Map() + if ( + //@ts-ignore + pageProps.initialZustandState && + //@ts-ignore + pageProps.initialZustandState.layersParsed + ) { + //@ts-ignore + pageProps.initialZustandState.layersParsed?.forEach( + (layer: [string, LayerState]) => { + newLayersState.set(layer[0], layer[1]) + } + ) + } + const createStore = useCreateStore({ + //@ts-ignore + ...pageProps.initialZustandState, + layers: newLayersState, + }) + const [queryClient] = useState(() => new QueryClient()) + return ( + + + + +
+ +
+
+
+
+
+ ) +} -export default api.withTRPC(MyApp); +export default api.withTRPC(MyApp) diff --git a/deployment/frontend/src/pages/datasets/[datasetName].tsx b/deployment/frontend/src/pages/datasets/[datasetName].tsx index 0e9fc9e63..e0c5fe50e 100644 --- a/deployment/frontend/src/pages/datasets/[datasetName].tsx +++ b/deployment/frontend/src/pages/datasets/[datasetName].tsx @@ -1,79 +1,99 @@ -import { Breadcrumbs } from "@/components/_shared/Breadcrumbs"; -import Header from "@/components/_shared/Header"; -import { DatasetHeader } from "@/components/datasets/DatasetHeader"; -import DatasetPageLayout from "@/components/datasets/DatasetPageLayout"; -import { DatasetTabs } from "@/components/datasets/DatasetTabs"; -import { API } from "@/components/datasets/sections/API"; -import { About } from "@/components/datasets/sections/About"; -import { Contact } from "@/components/datasets/sections/Contact"; -import { DataFiles } from "@/components/datasets/sections/DataFiles"; -import { Members } from "@/components/datasets/sections/Members"; -import { Methodology } from "@/components/datasets/sections/Methodology"; -import { RelatedDatasets } from "@/components/datasets/sections/RelatedDatasets"; +import { Breadcrumbs } from '@/components/_shared/Breadcrumbs' +import Header from '@/components/_shared/Header' +import { DatasetHeader } from '@/components/datasets/DatasetHeader' +import DatasetPageLayout from '@/components/datasets/DatasetPageLayout' +import { DatasetTabs } from '@/components/datasets/DatasetTabs' +import { API } from '@/components/datasets/sections/API' +import { About } from '@/components/datasets/sections/About' +import { Contact } from '@/components/datasets/sections/Contact' +import { DataFiles } from '@/components/datasets/sections/DataFiles' +import { Members } from '@/components/datasets/sections/Members' +import { Methodology } from '@/components/datasets/sections/Methodology' +import { RelatedDatasets } from '@/components/datasets/sections/RelatedDatasets' +import { Tab } from '@headlessui/react' +import Visualizations from '@/components/datasets/visualizations/Visualizations' +import { useState } from 'react' +import AddLayers from '@/components/datasets/add-layers/AddLayers' import Issues from "@/components/datasets/sections/Issues"; -import { Tab } from "@headlessui/react"; import ApprovalRequestCard from "@/components/datasets/ApprovalRequestCard"; import { useRouter } from "next/router"; + const links = [ - { label: "Explore Data", url: "/search", current: false }, - { label: "Name of dataset", url: "/datasets/dataset_test", current: true }, -]; + { label: 'Explore Data', url: '/search', current: false }, + { label: 'Name of dataset', url: '/datasets/dataset_test', current: true }, +] export default function DatasetPage() { - const { query } = useRouter(); - const isApprovalRequest = query?.approval === "true"; - const tabs = [ - { name: "Data files" }, - { name: "About" }, - { name: "Methodology" }, - { name: "Related Datasets" }, - { name: "Contact" }, - { name: "API" }, - { name: "Members" }, - { name: "Issues", count: 1 } - ]; - return ( - <> -
- - {isApprovalRequest && ()} - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - ); + const { query } = useRouter(); + const isApprovalRequest = query?.approval === "true"; + + const [isAddLayers, setIsAddLayers] = useState(false) + + const tabs = [ + { name: 'Data files' }, + { name: 'About' }, + { name: 'Methodology' }, + { name: 'Related Datasets' }, + { name: 'Contact' }, + { name: 'API' }, + { name: 'Members' }, + { name: "Issues", count: 1 } + ] + + return ( + <> +
+ + {isApprovalRequest && ()} + + ) : ( + <> + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + ) + } + rhs={} + /> + + ) } diff --git a/deployment/frontend/src/styles/globals.css b/deployment/frontend/src/styles/globals.css deleted file mode 100644 index fb786c102..000000000 --- a/deployment/frontend/src/styles/globals.css +++ /dev/null @@ -1,35 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -body, html { - letter-spacing: 0px; - accent-color: #32864B; -} - -.mapboxgl-ctrl-bottom-left, .mapboxgl-ctrl-attrib{ - display: none; -} - -.mapboxgl-ctrl-bottom-right { - width: 100%; -} - -.mapboxgl-ctrl-geocoder.mapboxgl-ctrl { - width: 100%; - max-width: 95%; - margin: 10px auto; - float: none; -} - -.dataset-tabs .swiper-slide { - width: fit-content !important; -} - -.default-home-container { - max-width: 90vw; -} - -.auto-carousel .swiper-slide { - width: fit-content !important; -} diff --git a/deployment/frontend/src/styles/globals.scss b/deployment/frontend/src/styles/globals.scss new file mode 100644 index 000000000..f4f296b96 --- /dev/null +++ b/deployment/frontend/src/styles/globals.scss @@ -0,0 +1,163 @@ +@use "sass:math"; +@tailwind base; +@tailwind components; +@tailwind utilities; +@import "~vizzuality-components/dist/bundle"; + +body, html { + letter-spacing: 0px; + accent-color: #32864B; +} + +.mapboxgl-ctrl-bottom-left, .mapboxgl-ctrl-attrib{ + display: none; +} + +.mapboxgl-ctrl-bottom-right { + width: 100%; +} + +.mapboxgl-ctrl-geocoder.mapboxgl-ctrl { + width: 100%; + max-width: 95%; + margin: 10px auto; + float: none; +} + +.dataset-tabs .swiper-slide { + width: fit-content !important; +} + +.default-home-container { + max-width: 90vw; +} + +.auto-carousel .swiper-slide { + width: fit-content !important; +} + + +$space: 5px; +$black: #000; +$white: #ffffff; +$charcoal-grey: #393f44; +$porcelain: #F4F6F7; +$light-grey: #cAccd0; +$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000); +$animation-time: .16s; +$font-size-normal: 14px; +$dark-pink: #c32d7b; + +.rw-legend-timeline { + margin: 4 0; + + .rc-slider { + .rc-slider-mark { + min-width: 100%; + margin-left: 0; + display: flex; + justify-content: space-between; + + .rc-slider-mark-text { + display: none; + + &:last-child, + &:first-child { + display: block; + } + } + } + } +} + +.c-legend-map { + position: absolute; + bottom: 35px; + right: 30px; + width: 80%; // Limit the width for mobile devices + max-width: 400px; + background: white; + z-index: 9; + border-radius: 4px; + + .legend-title { + display: flex; + justify-content: space-between; + align-items: center; + margin: 0; + padding: 10px 15px; + text-transform: uppercase; + font-size: 11px; + } + + .toggle-legend { + position: absolute; + right: 0px; + width: 40px; + height: 32px; + top: -28px; + border: 0; + border-radius: 2px 2px 0 0; + background-color: rgba(white, 0.2); + cursor: pointer; + + &:focus { + outline: none; + } + + svg { + margin-top: 4px; + fill: white; + } + } + + .open-legend { + display: flex; + flex-flow: column; + max-height: 300px; + height: 0; + overflow: hidden; + opacity: 0; + // Without an auto height, the legend looks a bit 💩 + // but we can't animate the height if max-height is + // used + // I've prefered to remove the animation than having + // a legend too tall - Clément + + &.-active { + height: auto; + opacity: 1; + overflow: auto; + } + + >.legend-list { + margin: 0; + padding: 0; + width: 100%; + overflow: auto; + } + } + + .close-legend { + display: none; + + &.-active { + display: inherit; + } + + .toggle-legend { + position: relative; + top: auto; + padding: 0; + width: auto; + height: auto; + padding: 0; + background-color: white; + + svg { + margin-top: 0; + fill: red; + } + } + } +} diff --git a/deployment/frontend/src/utils/providers/geeProvider.tsx b/deployment/frontend/src/utils/providers/geeProvider.tsx new file mode 100644 index 000000000..a4ba90463 --- /dev/null +++ b/deployment/frontend/src/utils/providers/geeProvider.tsx @@ -0,0 +1,40 @@ +import type { + LayerModel, + LayerSpec, + Source, + ProviderMaker, +} from "@vizzuality/layer-manager"; +import omit from "lodash/omit"; + +export class GeeProvider implements ProviderMaker { + public name = "gee"; + + private getTilerUrl = (layer: LayerSpec): string | Error => { + if (!layer) throw new Error("layer required to generate tiler URL"); + return `https://api.resourcewatch.org/v1/layer/${layer.id}/tile/gee/{z}/{x}/{y}`; + }; + + public handleData = ( + layerModel: LayerModel, + layer: LayerSpec, + resolve?: (layerSpec: LayerSpec) => void, + reject?: (err: Error) => void + ): void => { + try { + const result = { + ...layer, + source: { + ...omit(layer.source, "provider"), + tiles: [this.getTilerUrl(layer)!], + } as Source, + }; + if (resolve) { + resolve(result); + } + } catch (error: any) { + if (reject) { + reject(new Error(error.message)); + } + } + }; +} diff --git a/deployment/frontend/src/utils/providers/tileProvider.tsx b/deployment/frontend/src/utils/providers/tileProvider.tsx new file mode 100644 index 000000000..6a2d013c3 --- /dev/null +++ b/deployment/frontend/src/utils/providers/tileProvider.tsx @@ -0,0 +1,40 @@ +import type { + LayerModel, + LayerSpec, + Source, + ProviderMaker, +} from "@vizzuality/layer-manager"; +import omit from "lodash/omit"; + +export class TileProvider implements ProviderMaker { + public name = "tilelayer"; + + private getTilerUrl = (layer: LayerSpec): string | Error => { + //@ts-ignore + return layer.source.tiles[0]; + }; + + public handleData = ( + layerModel: LayerModel, + layer: LayerSpec, + resolve?: (layerSpec: LayerSpec) => void, + reject?: (err: Error) => void + ): void => { + try { + const result = { + ...layer, + source: { + ...omit(layer.source, "provider"), + tiles: [this.getTilerUrl(layer)!], + } as Source, + }; + if (resolve) { + resolve(result); + } + } catch (error: any) { + if (reject) { + reject(new Error(error.message)); + } + } + }; +} diff --git a/deployment/frontend/src/utils/queryHooks.ts b/deployment/frontend/src/utils/queryHooks.ts new file mode 100644 index 000000000..1234e95a8 --- /dev/null +++ b/deployment/frontend/src/utils/queryHooks.ts @@ -0,0 +1,129 @@ +import { CKAN } from "@portaljs/ckan"; +import { useQuery } from "react-query"; +import flatten from "lodash/flatten"; +import compact from "lodash/compact"; +import isEmpty from "lodash/isEmpty"; +import { APILayerSpec } from "@/interfaces/layer.interface"; +import { useActiveLayerGroups, useLayerStates } from "./storeHooks"; +import { ActiveLayerGroup, LayerState } from "@/interfaces/state.interface"; + +export async function packageSearch() { + const ckan = new CKAN("https://ckan.x.demo.datopian.com"); + return await ckan.packageSearch({ + query: "", + offset: 0, + limit: 30, + groups: [], + orgs: [], + tags: [], + }); +} + +export const useDatasetsQuery = () => { + return useQuery({ + queryKey: ["datasets"], + queryFn: packageSearch, + }); +}; + +export async function getLayersFromRW( + queryKey: any, + currentLayers: Map +) { + const [, activeLayerGroups] = queryKey; + if (activeLayerGroups.length === 0) return []; + let countdown = 10; + return await Promise.all( + activeLayerGroups.map( + async (layerGroup: ActiveLayerGroup, index: number) => { + const { datasetId, layers } = layerGroup; + if (layers.length === 0) return []; + const layersData = await Promise.all( + layers.map(async (layer: string) => { + const response = await fetch( + `https://api.resourcewatch.org/v1/layer/${layer}` + ); + const layerData = await response.json(); + const { id, attributes } = layerData.data; + const currentLayer = currentLayers.get(id); + return { + id: id, + ...attributes, + layerConfig: { + ...attributes.layerConfig, + zIndex: countdown - index, + visibility: layers.length > 1 ? attributes.default : true, + ...currentLayer, + }, + active: layers.length > 1 ? attributes.default : true, + }; + }) + ); + return { + dataset: datasetId, + layers: layersData, + }; + } + ) + ); +} + +export const useLayerGroupsFromRW = () => { + const { activeLayerGroups } = useActiveLayerGroups(); + const { currentLayers } = useLayerStates(); + return useQuery({ + queryKey: ["layers", activeLayerGroups], + queryFn: ({ queryKey }) => getLayersFromRW(queryKey, currentLayers), + }); +}; + +export const useLayersFromRW = () => { + const result = useLayerGroupsFromRW(); + if (result.data) { + const data: APILayerSpec[] = result.data.reduce( + (acc: any, layerGroup: any) => { + return [...acc, ...layerGroup.layers]; + }, + [] + ); + return { ...result, data }; + } + return { ...result, data: [] }; +}; + +/** + * + * @param {object[]} activeLayers Array of layers that mean to be interactive + * @returns {string[]} Array of Mapbox layers ids that mean to be interactive + */ +export function getInteractiveLayers(activeLayers: any): string[] | null { + return flatten( + compact( + activeLayers.map((_activeLayer: any) => { + const { id, layerConfig } = _activeLayer; + if (isEmpty(layerConfig)) return null; + + // * keeps backward compatibility for now + const vectorLayers = + layerConfig.render?.layers || layerConfig.body?.vectorLayers; + + if (vectorLayers) { + return vectorLayers.map((l: any, i: number) => { + const { id: vectorLayerId, type: vectorLayerType } = l; + return vectorLayerId || `${id}-${vectorLayerType}-${i}`; + }); + } + return null; + }) + ) + ); +} + +export const useInteractiveLayers = () => { + const result = useLayersFromRW(); + if (result.data) { + const data = getInteractiveLayers(result.data); + return { ...result, data }; + } + return { ...result, data: [] }; +}; diff --git a/deployment/frontend/src/utils/store.ts b/deployment/frontend/src/utils/store.ts new file mode 100644 index 000000000..6843c51ca --- /dev/null +++ b/deployment/frontend/src/utils/store.ts @@ -0,0 +1,163 @@ +import { + ActiveLayerGroup, + Basemap, + Labels, + LayerState, + Layers, + State, + Bounds, +} from "@/interfaces/state.interface"; +import { useLayoutEffect } from "react"; +import { ViewState } from "react-map-gl"; +import { UseBoundStore, create} from "zustand"; +import createContext from "zustand/context"; +import { combine } from "zustand/middleware"; + +let store: any; + +type InitialState = ReturnType; +type UseStoreState = typeof initializeStore extends ( + ...args: never +) => UseBoundStore + ? T + : never; + +const getDefaultInitialState = () => { + const initialState: State & Layers = { + activeLayerGroups: [], + basemap: "dark", + labels: "light", + boundaries: false, + layersParsed: [], + layers: new Map(), + viewState: { + latitude: 0, + longitude: 0, + zoom: 3, + bearing: 0, + pitch: 0, + padding: { + top: 0, + bottom: 0, + left: 0, + right: 0, + }, + }, + bounds: { + bbox: null, + options: {}, + }, + isDrawing: undefined, + }; + return initialState; +}; + +const zustandContext = createContext(); +export const Provider = zustandContext.Provider; +export const useStore = zustandContext.useStore; + +export const initializeStore = (preloadedState = {}) => { + return create( + combine({ ...getDefaultInitialState(), ...preloadedState }, (set, get) => ({ + setViewState: (newViewState: ViewState) => { + set({ + viewState: newViewState, + }); + }, + setBaseMap: (newBasemap: Basemap) => { + set({ + basemap: newBasemap, + }); + }, + setBounds: (newBounds: Bounds) => { + set({ + bounds: newBounds, + }); + }, + setLabels: (newLabels: Labels) => { + set({ + labels: newLabels, + }); + }, + setBoundaries: (newBoundaries: boolean) => { + set({ + boundaries: newBoundaries, + }); + }, + setIsDrawing: (newIsDrawing: boolean) => { + set({ + isDrawing: newIsDrawing, + }); + }, + replaceLayerGroups: (layerGroups: ActiveLayerGroup[]) => { + set({ + activeLayerGroups: layerGroups, + }); + }, + addLayerGroup: (layerGroup: ActiveLayerGroup) => { + const activeLayerGroups = get().activeLayerGroups; + set({ + activeLayerGroups: [layerGroup, ...activeLayerGroups], + }); + }, + removeLayerGroup: (layerGroup: ActiveLayerGroup) => { + const activeLayerGroups = get().activeLayerGroups; + set({ + activeLayerGroups: activeLayerGroups.filter( + (d) => JSON.stringify(d) !== JSON.stringify(layerGroup) + ), + }); + }, + updateLayerState: ( + layerId: string, + keyName: string, + newValue: number | boolean + ) => { + const currentLayers = get().layers; + if (!currentLayers.has(layerId)) currentLayers.set(layerId, {}); + const currentLayer = currentLayers.get(layerId); + currentLayers.set(layerId, { + ...currentLayer, + [keyName]: newValue, + } as LayerState); + set({ + layers: currentLayers, + }); + }, + })) + ); +}; + +export const useCreateStore = (serverInitialState: InitialState) => { + // For SSR & SSG, always use a new store. + if (typeof window === "undefined") { + return () => initializeStore(serverInitialState); + } + + const isReusingStore = Boolean(store); + // For CSR, always re-use same store. + store = store ?? initializeStore(serverInitialState); + // And if initialState changes, then merge states in the next render cycle. + // + // eslint complaining "React Hooks must be called in the exact same order in every component render" + // is ignorable as this code runs in same order in a given environment + // eslint-disable-next-line react-hooks/rules-of-hooks + useLayoutEffect(() => { + // serverInitialState is undefined for CSR pages. It is up to you if you want to reset + // states on CSR page navigation or not. I have chosen not to, but if you choose to, + // then add `serverInitialState = getDefaultInitialState()` here. + if (serverInitialState && isReusingStore) { + store.setState( + { + // re-use functions from existing store + ...store.getState(), + // but reset all other properties. + ...serverInitialState, + }, + true // replace states, rather than shallow merging + ); + } + }); + + return () => store; +}; diff --git a/deployment/frontend/src/utils/storeHooks.ts b/deployment/frontend/src/utils/storeHooks.ts new file mode 100644 index 000000000..ee4c6cf5b --- /dev/null +++ b/deployment/frontend/src/utils/storeHooks.ts @@ -0,0 +1,101 @@ +import { shallow } from "zustand/shallow"; +import { useStore } from "./store"; + +export const useMapState = () => { + const { viewState, setViewState } = useStore( + (store) => ({ + viewState: store.viewState, + setViewState: store.setViewState, + }), + shallow + ); + + return { viewState, setViewState }; +}; + +export const useBasemap = () => { + const { selectedBasemap, setBasemap } = useStore( + (store) => ({ + selectedBasemap: store.basemap, + setBasemap: store.setBaseMap, + }), + shallow + ); + + return { selectedBasemap, setBasemap }; +}; + +export const useIsDrawing = () => { + const { isDrawing, setIsDrawing } = useStore( + (store) => ({ + isDrawing: store.isDrawing, + setIsDrawing: store.setIsDrawing, + }), + shallow + ); + + return { isDrawing, setIsDrawing }; +}; + +export const useLabels = () => { + const { selectedLabels, setLabels } = useStore( + (store) => ({ + selectedLabels: store.labels, + setLabels: store.setLabels, + }), + shallow + ); + + return { selectedLabels, setLabels }; +}; + +export const useBoundaries = () => { + const { showBoundaries, setShowBoundaries } = useStore( + (store) => ({ + showBoundaries: store.boundaries, + setShowBoundaries: store.setBoundaries, + }), + shallow + ); + + return { showBoundaries, setShowBoundaries }; +}; + +export const useActiveLayerGroups = () => { + const { + activeLayerGroups, + replaceLayersGroups, + addLayerGroup, + removeLayerGroup, + } = useStore((store) => ({ + activeLayerGroups: store.activeLayerGroups, + replaceLayersGroups: store.replaceLayerGroups, + addLayerGroup: store.addLayerGroup, + removeLayerGroup: store.removeLayerGroup, + })); + + return { + activeLayerGroups, + replaceLayersGroups, + addLayerGroup, + removeLayerGroup, + }; +}; + +export const useLayerStates = () => { + const { currentLayers, updateLayerState } = useStore((store) => ({ + currentLayers: store.layers, + updateLayerState: store.updateLayerState, + })); + + return { currentLayers, updateLayerState }; +}; + +export const useBounds = () => { + const { bounds, setBounds } = useStore((store) => ({ + bounds: store.bounds, + setBounds: store.setBounds, + })); + + return { bounds, setBounds }; +}; diff --git a/deployment/frontend/tailwind.config.ts b/deployment/frontend/tailwind.config.ts index 870eac1a6..96f88e1a5 100644 --- a/deployment/frontend/tailwind.config.ts +++ b/deployment/frontend/tailwind.config.ts @@ -21,8 +21,10 @@ export default { "wri-gray": "#eae8e4", "wri-dark-green": "#2B7340", "wri-light-green": "#BAE1BD", + "wri-dark-blue": "#3654A5", "wri-light-blue": "#B5D6E8", "wri-light-yellow": "#FBE8BE", + "wri-light-gray": "#4C4C4C", "wri-dark-gray": "#666666", "wri-row-gray": "#F9F9F9", "wri-slate": "#EFF5F7" @@ -40,6 +42,13 @@ export default { }, plugins: [ require('@tailwindcss/container-queries'), + require("tailwindcss/plugin")(function ({ + addVariant, + }: { + addVariant: any; + }) { + addVariant("not-last", "&:not(:last-child)"); + }), require('@tailwindcss/forms'), ], } satisfies Config;