From b337ede1618132dec8c4243bc881e6affe8acdd8 Mon Sep 17 00:00:00 2001 From: Demenech Date: Mon, 30 Oct 2023 10:56:59 -0300 Subject: [PATCH 01/10] feat(odp-139 ): initial map implementation --- deployment/frontend/.prettierrc | 6 + deployment/frontend/package-lock.json | 2563 ++++++++++++++++- deployment/frontend/package.json | 13 +- .../src/components/_shared/map/Basemap.tsx | 88 + .../src/components/_shared/map/Labels.tsx | 67 + .../src/components/_shared/map/Layer.tsx | 174 ++ .../components/_shared/map/LayerManager.tsx | 84 + .../src/components/_shared/map/Map.tsx | 58 + .../src/components/_shared/map/Tooltip.tsx | 125 + .../_shared/map/VizzLayerManager.tsx | 59 + .../_shared/map/controls/BaseMapSelector.tsx | 36 + .../_shared/map/controls/Boundaries.tsx | 74 + .../_shared/map/controls/Controls.tsx | 32 + .../_shared/map/controls/Download.tsx | 46 + .../components/_shared/map/controls/Draw.tsx | 134 + .../_shared/map/controls/Export.tsx | 11 + .../_shared/map/controls/IconButton.tsx | 8 + .../_shared/map/controls/LabelSelector.tsx | 34 + .../_shared/map/controls/Legends.tsx | 173 ++ .../_shared/map/controls/Search.tsx | 143 + .../_shared/map/controls/Settings.tsx | 56 + .../components/_shared/map/controls/Zoom.tsx | 27 + .../components/datasets/DatasetPageLayout.tsx | 75 +- .../datasets/visualizations/MapView.tsx | 16 + .../datasets/visualizations/TabularView.tsx | 5 + .../visualizations/VisualizationTabs.tsx | 27 + .../visualizations/Visualizations.tsx | 31 + .../src/interfaces/layer.interface.tsx | 56 + .../src/interfaces/state.interface.tsx | 49 + deployment/frontend/src/pages/_app.tsx | 113 +- .../src/pages/datasets/[datasetName].tsx | 139 +- deployment/frontend/src/styles/globals.css | 35 - deployment/frontend/src/styles/globals.scss | 163 ++ .../src/utils/providers/geeProvider.tsx | 40 + .../src/utils/providers/tileProvider.tsx | 40 + deployment/frontend/src/utils/queryHooks.ts | 129 + deployment/frontend/src/utils/store.ts | 163 ++ deployment/frontend/src/utils/storeHooks.ts | 101 + deployment/frontend/tailwind.config.ts | 10 +- 39 files changed, 4948 insertions(+), 255 deletions(-) create mode 100644 deployment/frontend/.prettierrc create mode 100644 deployment/frontend/src/components/_shared/map/Basemap.tsx create mode 100644 deployment/frontend/src/components/_shared/map/Labels.tsx create mode 100644 deployment/frontend/src/components/_shared/map/Layer.tsx create mode 100644 deployment/frontend/src/components/_shared/map/LayerManager.tsx create mode 100644 deployment/frontend/src/components/_shared/map/Map.tsx create mode 100644 deployment/frontend/src/components/_shared/map/Tooltip.tsx create mode 100644 deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/BaseMapSelector.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Boundaries.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Controls.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Download.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Draw.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Export.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/IconButton.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/LabelSelector.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Legends.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Search.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Settings.tsx create mode 100644 deployment/frontend/src/components/_shared/map/controls/Zoom.tsx create mode 100644 deployment/frontend/src/components/datasets/visualizations/MapView.tsx create mode 100644 deployment/frontend/src/components/datasets/visualizations/TabularView.tsx create mode 100644 deployment/frontend/src/components/datasets/visualizations/VisualizationTabs.tsx create mode 100644 deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx create mode 100644 deployment/frontend/src/interfaces/layer.interface.tsx create mode 100644 deployment/frontend/src/interfaces/state.interface.tsx delete mode 100644 deployment/frontend/src/styles/globals.css create mode 100644 deployment/frontend/src/styles/globals.scss create mode 100644 deployment/frontend/src/utils/providers/geeProvider.tsx create mode 100644 deployment/frontend/src/utils/providers/tileProvider.tsx create mode 100644 deployment/frontend/src/utils/queryHooks.ts create mode 100644 deployment/frontend/src/utils/store.ts create mode 100644 deployment/frontend/src/utils/storeHooks.ts 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/package-lock.json b/deployment/frontend/package-lock.json index b6bf91c9b..f9eaffed1 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", @@ -20,20 +21,30 @@ "@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", + "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-query": "^3.39.3", + "sass": "^1.69.5", "superjson": "^1.13.1", "swiper": "^10.3.1", "ts-pattern": "^5.0.5", - "zod": "^3.22.4" + "use-debounce": "^9.0.4", + "vizzuality-components": "^3.0.3", + "zod": "^3.22.4", + "zustand": "^4.4.4" }, "devDependencies": { "@types/eslint": "^8.44.2", @@ -245,6 +256,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", @@ -434,6 +479,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", @@ -443,6 +622,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", @@ -463,6 +686,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", @@ -574,6 +811,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", @@ -777,6 +1046,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", @@ -1366,14 +1660,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", @@ -1441,6 +1739,11 @@ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==" }, + "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", @@ -1673,6 +1976,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", @@ -1694,6 +2056,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", @@ -1811,6 +2181,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", @@ -2003,6 +2384,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", @@ -2012,6 +2401,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", @@ -2022,6 +2425,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", @@ -2050,6 +2461,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", @@ -2211,6 +2637,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", @@ -2294,11 +2725,70 @@ "url": "https://joebell.co.uk" } }, + "node_modules/classnames": { + "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", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "peer": true, + "dependencies": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -2318,6 +2808,15 @@ "node": ">=6" } }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2355,6 +2854,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", @@ -2382,6 +2894,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/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2396,6 +2915,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", @@ -2417,72 +2945,298 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "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==", + "peer": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "internmap": "^1.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.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==", + "peer": true + }, + "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/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "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-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "peer": true + }, + "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": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "engines": { - "node": ">=0.10.0" + "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==", + "peer": true + }, + "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==", + "peer": true, + "dependencies": { + "d3-array": "1" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "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==", + "peer": true, "dependencies": { - "mimic-response": "^3.1.0" + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" }, - "engines": { - "node": ">=10" + "bin": { + "geo2svg": "bin/geo2svg.js", + "geograticule": "bin/geograticule.js", + "geoproject": "bin/geoproject.js", + "geoquantize": "bin/geoquantize.js", + "geostitch": "bin/geostitch.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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==", + "peer": true, + "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==", + "peer": true + }, + "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==", + "peer": true + }, + "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==", + "peer": true + }, + "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==", + "peer": true, + "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", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decompress-response/node_modules/mimic-response": { @@ -2566,6 +3320,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", @@ -2600,6 +3359,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", @@ -3213,6 +3977,103 @@ "node": ">=0.8.x" } }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "peer": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "peer": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "peer": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -3227,8 +4088,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.1", @@ -3335,6 +4195,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", @@ -3399,19 +4278,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", @@ -3453,11 +4319,22 @@ "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", "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "peer": true + }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -3529,7 +4406,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", @@ -3663,6 +4539,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", @@ -3748,6 +4632,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", @@ -3784,6 +4676,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", @@ -3812,6 +4716,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", @@ -3873,6 +4782,29 @@ "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==", + "peer": true + }, + "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/invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -3946,6 +4878,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", @@ -4012,6 +4966,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "peer": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -4147,6 +5113,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -4246,8 +5221,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", @@ -4286,6 +5260,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", @@ -4404,6 +5391,18 @@ "language-subtag-registry": "~0.3.2" } }, + "node_modules/lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "peer": true, + "dependencies": { + "invert-kv": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4460,6 +5459,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", @@ -4496,6 +5500,18 @@ "node": ">=10" } }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "peer": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -4536,6 +5552,37 @@ "vt-pbf": "^3.1.3" } }, + "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/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "peer": true, + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -4592,6 +5639,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", @@ -4611,6 +5663,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -4659,12 +5720,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", @@ -4680,6 +5770,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", @@ -4785,6 +5883,32 @@ "react-dom": ">=16.0.0" } }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "peer": true + }, + "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==", + "peer": true, + "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", @@ -4833,6 +5957,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "peer": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -4963,6 +6117,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", @@ -4971,6 +6130,118 @@ "node": "^10.13.0 || >=12.0.0" } }, + "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": { + "follow-redirects": "1.5.10" + } + }, + "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": { + "ms": "2.0.0" + } + }, + "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": { + "debug": "=3.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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/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", @@ -5010,6 +6281,20 @@ "node": ">= 0.8.0" } }, + "node_modules/os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "peer": true, + "dependencies": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -5018,6 +6303,33 @@ "node": ">=8" } }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5136,6 +6448,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", @@ -5422,7 +6739,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -5487,6 +6803,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", @@ -5535,6 +6935,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "node_modules/react-map-gl": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-7.1.6.tgz", @@ -5558,6 +6963,31 @@ } } }, + "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-ssr-prepass": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", @@ -5566,6 +6996,18 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "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/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -5757,6 +7199,26 @@ "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==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "peer": true + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -5828,7 +7290,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" }, @@ -5898,6 +7359,28 @@ "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==", + "peer": true + }, + "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", @@ -5920,6 +7403,12 @@ "node": ">=10" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "peer": true + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -5948,6 +7437,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", @@ -5983,6 +7477,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "peer": true + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6102,6 +7602,41 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "peer": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "peer": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6188,6 +7723,15 @@ "node": ">=4" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -6463,6 +8007,40 @@ "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==", + "peer": true, + "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==", + "peer": true + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "peer": true + }, + "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", @@ -6654,6 +8232,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", @@ -6693,6 +8280,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", @@ -6723,6 +8321,580 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vega": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-4.4.0.tgz", + "integrity": "sha512-siNRf6F3Ihoku0T9LebtaguWd88SVcf8yWJmHQUO5ZcZKREjTYO0LmLHUOH1plSEQSqHBAQPtAjQ3xZYQKgSdQ==", + "peer": true, + "dependencies": { + "vega-lib": "4.4.0", + "vega-parser": "3.9.0", + "vega-typings": "*", + "yargs": "12" + }, + "bin": { + "vg2png": "bin/vg2png", + "vg2svg": "bin/vg2svg" + }, + "optionalDependencies": { + "canvas": "^1.6.13", + "canvas-prebuilt": "1.6.11" + } + }, + "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==", + "peer": true + }, + "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": { + "d3-array": "^2.0.2", + "vega-dataflow": "^4.1.0", + "vega-util": "^1.7.0" + } + }, + "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/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": { + "vega-util": "^1.15.1" + } + }, + "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": { + "d3-force": "^1.1.0", + "vega-dataflow": "^4.0.0", + "vega-util": "^1.7.0" + } + }, + "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-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-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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true, + "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-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-statistics": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz", + "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", + "peer": true, + "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==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true + }, + "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==", + "peer": true + }, + "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==", + "peer": true, + "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/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", @@ -6733,6 +8905,14 @@ "pbf": "^3.2.1" } }, + "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", @@ -6745,6 +8925,27 @@ "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==", + "peer": true + }, + "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==", + "peer": true, + "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", @@ -6817,6 +9018,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "peer": true + }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -6836,11 +9043,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "peer": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "peer": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "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", @@ -6849,6 +9095,12 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "peer": true + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -6862,6 +9114,26 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "peer": true, + "dependencies": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -6870,6 +9142,120 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -6889,6 +9275,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 512582a35..525af6801 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", @@ -21,20 +22,30 @@ "@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", + "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-query": "^3.39.3", + "sass": "^1.69.5", "superjson": "^1.13.1", "swiper": "^10.3.1", "ts-pattern": "^5.0.5", - "zod": "^3.22.4" + "use-debounce": "^9.0.4", + "vizzuality-components": "^3.0.3", + "zod": "^3.22.4", + "zustand": "^4.4.4" }, "devDependencies": { "@types/eslint": "^8.44.2", diff --git a/deployment/frontend/src/components/_shared/map/Basemap.tsx b/deployment/frontend/src/components/_shared/map/Basemap.tsx new file mode 100644 index 000000000..9f96a6401 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/Basemap.tsx @@ -0,0 +1,88 @@ +import {Basemap} from "@/interfaces/state.interface" +import {useBasemap} from "@/utils/storeHooks" +import {MutableRefObject, useCallback, useEffect} from "react" +import { type Map as MapType } from 'mapbox-gl' +import {MapRef} from "react-map-gl" + +export default function Basemap({mapRef}: {mapRef: MutableRefObject}) { + const { selectedBasemap } = useBasemap() + + const handleBasemap = useCallback( + (basemap: Basemap) => { + // This function takes a 'basemap' as input and handles the logic to change the basemap for the custom map style. + const map = mapRef.current as unknown as MapType + if (!map) return + // Destructuring assignment to get the 'map' object from 'mapRef' using useRef hook. + const BASEMAP_GROUPS = ['basemap'] // An array containing the group names of basemap layers. + const { layers, metadata } = (map as MapType).getStyle() // Extracting the layers and metadata from the current map style. + + // Extracting the basemap groups from the metadata. + const basemapGroups = Object.keys(metadata['mapbox:groups']).filter( + (k) => { + const { name } = metadata['mapbox:groups'][k] + + // Mapping over the BASEMAP_GROUPS array to check if 'name' contains any of the basemap group names. + const matchedGroups = BASEMAP_GROUPS.map((rgr) => + name.toLowerCase().includes(rgr) + ) + + // Checking if any of the 'matchedGroups' array elements are true (i.e., if any basemap group name was found). + return matchedGroups.some((bool) => bool) + } + ) + + // Mapping over the 'basemapGroups' array to get basemaps with additional metadata. + const basemapsWithMeta = basemapGroups.map((groupId) => ({ + ...metadata['mapbox:groups'][groupId], + id: groupId, + })) + + // Finding the basemap to display based on the input 'basemap'. + const basemapToDisplay = basemapsWithMeta.find((_basemap) => + _basemap.name.includes(basemap) + ) + + // Filtering layers based on whether they belong to any of the basemap groups. + const basemapLayers = layers.filter((l: mapboxgl.Layer) => { + const layerMetadata = l.metadata ? l.metadata : undefined + if (!layerMetadata) return false + + // Getting the 'mapbox:group' from layer metadata. + const gr = layerMetadata['mapbox:group'] + + // Checking if the 'gr' (group name) is present in 'basemapGroups'. + return basemapGroups.includes(gr) + }) + + // Looping through the 'basemapLayers' to set the visibility of each layer based on the selected 'basemap'. + basemapLayers.forEach((_layer: mapboxgl.Layer) => { + const match = + _layer.metadata['mapbox:group'] === basemapToDisplay.id + if (!match) { + // Setting the visibility of the layer to 'none' if it does not match the selected 'basemap'. + ;(map as MapType).setLayoutProperty( + _layer.id, + 'visibility', + 'none' + ) + } else { + // Setting the visibility of the layer to 'visible' if it matches the selected 'basemap'. + ;(map as MapType).setLayoutProperty( + _layer.id, + 'visibility', + 'visible' + ) + } + }) + }, + [mapRef] + ) + + useEffect(() => { + handleBasemap(selectedBasemap as Basemap) + }, [selectedBasemap, handleBasemap]) + + + + return null +} diff --git a/deployment/frontend/src/components/_shared/map/Labels.tsx b/deployment/frontend/src/components/_shared/map/Labels.tsx new file mode 100644 index 000000000..b52026ad8 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/Labels.tsx @@ -0,0 +1,67 @@ +import { Labels } from '@/interfaces/state.interface' +import { MutableRefObject, useCallback, useEffect } from 'react' +import { MapRef } from 'react-map-gl' +import mapboxgl, { Map as MapType } from 'mapbox-gl' +import { useLabels } from '@/utils/storeHooks' + +export default function Labels({ + mapRef, +}: { + mapRef: MutableRefObject +}) { + const { selectedLabels } = useLabels() + + const handleLabels = useCallback( + (labels: Labels) => { + const map = mapRef.current as unknown as MapType + const LABELS_GROUP = ['labels'] + const { layers, metadata } = (map as MapType).getStyle() + + const labelGroups = Object.keys(metadata['mapbox:groups']).filter( + (k) => { + const { name } = metadata['mapbox:groups'][k] + + const matchedGroups = LABELS_GROUP.filter((rgr) => + name.toLowerCase().includes(rgr) + ) + + return matchedGroups.some((bool) => bool) + } + ) + + const labelsWithMeta = labelGroups.map((_groupId) => ({ + ...metadata['mapbox:groups'][_groupId], + id: _groupId, + })) + const labelsToDisplay = + labelsWithMeta.find((_basemap) => + _basemap.name.includes(labels) + ) || {} + + const labelLayers = layers.filter((l: mapboxgl.Layer) => { + const { metadata: layerMetadata } = l + if (!layerMetadata) return false + + const gr = layerMetadata['mapbox:group'] + return labelGroups.includes(gr) + }) + + labelLayers.forEach((_layer: mapboxgl.Layer) => { + const match = + _layer.metadata['mapbox:group'] === labelsToDisplay.id + ;(map as MapType).setLayoutProperty( + _layer.id, + 'visibility', + match ? 'visible' : 'none' + ) + }) + }, + [mapRef] + ) + + useEffect(() => { + handleLabels(selectedLabels) + }, [selectedLabels, handleLabels]) + + return null +} diff --git a/deployment/frontend/src/components/_shared/map/Layer.tsx b/deployment/frontend/src/components/_shared/map/Layer.tsx new file mode 100644 index 000000000..2e25cb770 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/Layer.tsx @@ -0,0 +1,174 @@ +/* eslint-disable react/default-props-match-prop-types */ +import { PureComponent } from 'react'; +import isEqual from 'fast-deep-equal/es6'; +// @ts-ignore +import { compare } from 'js-deep-equals'; + +import { isEmpty, replace } from '@vizzuality/layer-manager-utils'; +import LayerManager, { LayerSpec } from '@vizzuality/layer-manager'; + +export type LayerProps = LayerSpec & { + layerManager: LayerManager +}; + +class Layer extends PureComponent { + // eslint-disable-next-line react/static-property-placement + static defaultProps = { + params: undefined, + sqlParams: undefined, + opacity: 1, + visibility: true, + zIndex: undefined, + source: {}, + render: {}, + deck: [], + onAfterAdd: () => null, + }; + + componentDidMount(): void { + this.add(); + } + + componentDidUpdate(prevProps: Partial): void { + const { + source: prevSource, + render: prevRender, + params: prevParams, + sqlParams: prevSqlParams, + opacity: prevOpacity, + visibility: prevVisibility, + zIndex: prevZIndex, + deck: prevDeck, + } = prevProps; + + const { + type, + source, + render, + params, + sqlParams, + opacity, + visibility, + zIndex, + deck, + } = this.props; + + // Check that source has changed + const prevSourceParsed = prevSource?.parse === false + ? prevSource + : JSON.parse(replace(JSON.stringify(prevSource), prevParams, prevSqlParams)); + + const sourceParsed = source.parse === false + ? source + : JSON.parse(replace(JSON.stringify(source), params, sqlParams)); + + // Check that render has changed + const prevRenderParsed = prevRender?.parse === false + ? prevRender + : JSON.parse(replace(JSON.stringify(prevRender), prevParams, prevSqlParams)); + + const renderParsed = render?.parse === false + ? render + : JSON.parse(replace(JSON.stringify(render), params, sqlParams)); + + // TODO: don't add and remove if provider is geojson + if (sourceParsed && !isEqual(sourceParsed, prevSourceParsed)) { + const { type: sourceType, data } = sourceParsed; + const t = sourceType || type; + + if (t === 'raster' || t === 'vector' || (t === 'geojson' && typeof data === 'string')) { + this.remove(); + this.add(); + + // prevent updating layer + return; + } + } + + if (renderParsed && !isEqual(renderParsed, prevRenderParsed)) { + const { layers = [] } = renderParsed; + const { layers: prevLayers = [] } = prevRenderParsed; + + if (layers.length !== prevLayers.length) { + this.remove(); + this.add(); + + // Prevent updating layer + return; + } + } + + const changedProps = { + ...(opacity !== prevOpacity && { + opacity, + }), + ...(visibility !== prevVisibility && { + visibility, + }), + ...(zIndex !== prevZIndex && { + zIndex, + }), + ...(!isEqual(sourceParsed, prevRenderParsed) && { + source: sourceParsed, + }), + ...(!isEqual(renderParsed, prevRenderParsed) && { + render: renderParsed, + }), + ...(!compare(deck, prevDeck) && { + deck, + }), + }; + + if (!isEmpty(changedProps)) { + this.update(changedProps); + } + } + + componentWillUnmount() { + this.remove(); + } + + add = () => { + const { layerManager, onAfterAdd, ...props } = this.props; + const { + source, render, params, sqlParams, + } = props; + + const sourceParsed = source.parse === false + ? source + : JSON.parse(replace(JSON.stringify(source), params, sqlParams)); + + const renderParsed = render?.parse === false + ? render + : JSON.parse(replace(JSON.stringify(render), params, sqlParams)); + + layerManager.add( + { + ...props, + source: sourceParsed, + render: renderParsed, + }, + {}, + onAfterAdd || Layer.defaultProps.onAfterAdd, + ); + }; + + update = (changedProps: Partial): void => { + const { layerManager, id } = this.props; + + layerManager.update(id, changedProps); + }; + + remove = (): void => { + const { layerManager, id, onAfterRemove } = this.props; + layerManager.remove(id, (layerModel) => { + if (onAfterRemove) onAfterRemove(layerModel); + }); + }; + + render() { + return null; + } +} + +export default Layer; diff --git a/deployment/frontend/src/components/_shared/map/LayerManager.tsx b/deployment/frontend/src/components/_shared/map/LayerManager.tsx new file mode 100644 index 000000000..4f3892dad --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/LayerManager.tsx @@ -0,0 +1,84 @@ +import VizzLayerManager from "./VizzLayerManager"; +import Layer from "./Layer"; +import PluginMapboxGl from "@vizzuality/layer-manager-plugin-mapboxgl"; +import { useMap } from "react-map-gl"; +import type { LayerSpec, ProviderMaker } from "@vizzuality/layer-manager"; +import pick from "lodash/pick"; +import CartoProvider from "@vizzuality/layer-manager-provider-carto"; +import { TileProvider } from "@/utils/providers/tileProvider"; +import { GeeProvider } from "@/utils/providers/geeProvider"; +import { APILayerSpec } from "@/interfaces/layer.interface"; +import { useLayerStates } from "@/utils/storeHooks"; +import { LayerState } from "@/interfaces/state.interface"; +import { useMemo } from "react"; + +export const parseLayers = ( + layers: APILayerSpec[], + layerStates: Map +): LayerSpec[] => { + return layers.map((layer): LayerSpec => { + const { id, layerConfig } = layer; + const layerState = layerStates.get(id); + let layerProps: any = pick(layerConfig, [ + "deck", + "images", + "interactivity", + "opacity", + "params", + "sqlParams", + "source", + "type", + "render", + "visibility", + "zIndex", + "params_config", + ]); + + if (layerState) { + layerProps = { + ...layerProps, + ...layerState, + visibility: layerState.active ? layerState.visibility : false, + }; + } + + return { + id, + ...layerProps, + }; + }); +}; + +const geeProvider = new GeeProvider(); +const cartoProvider = new CartoProvider(); +const tileProvider = new TileProvider(); +const providers: Record = { + [geeProvider.name]: geeProvider.handleData, + [cartoProvider.name]: cartoProvider.handleData, + [tileProvider.name]: tileProvider.handleData, +}; + +const LayerManager = ({ layers }: { layers: APILayerSpec[] }): JSX.Element => { + const { current: map } = useMap(); + const { currentLayers } = useLayerStates(); + const parsedLayers = useMemo( + () => parseLayers(layers, currentLayers), + [layers, currentLayers] + ); + return map ? ( + + {parsedLayers && + parsedLayers.map((_layer) => { + return ; + })} + + ) : ( + <> + ); +}; + +export default LayerManager; diff --git a/deployment/frontend/src/components/_shared/map/Map.tsx b/deployment/frontend/src/components/_shared/map/Map.tsx new file mode 100644 index 000000000..3031fc0f2 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/Map.tsx @@ -0,0 +1,58 @@ +import { useIsDrawing, useMapState } from '@/utils/storeHooks' +import { useRef, useState } from 'react' +import ReactMapGL, { type MapRef } from 'react-map-gl' +import LayerManager from './LayerManager' +import { useInteractiveLayers } from '@/utils/queryHooks' +import Tooltip, { type TooltipRef } from './Tooltip' +import { type APILayerSpec } from '@/interfaces/layer.interface' +import { Legends } from './controls/Legends' +import Controls from './controls/Controls' +import Basemap from './Basemap' +import Labels from './Labels' + +export default function Map({ layers }: { layers: APILayerSpec[] }) { + const { setViewState, viewState } = useMapState() + const mapRef = useRef(null) + const mapTooltipRef = useRef(null) + const mapContainerRef = useRef(null) + const [ready, setReady] = useState(false) + const { data: activeLayersIds } = useInteractiveLayers() + const { isDrawing } = useIsDrawing() + + return ( +
+ { + if (_map) + mapRef.current = _map.getMap() as unknown as MapRef + }} + {...viewState} + mapStyle="mapbox://styles/resourcewatch/cjzmw480d00z41cp2x81gm90h" + mapboxAccessToken="pk.eyJ1IjoicmVzb3VyY2V3YXRjaCIsImEiOiJjajFlcXZhNzcwMDBqMzNzMTQ0bDN6Y3U4In0.FRcIP_yusVaAy0mwAX1B8w" + style={{ height: 'calc(100vh - 63px)', minHeight: '800px' }} + interactiveLayerIds={activeLayersIds ? activeLayersIds : []} + onMove={(evt) => setViewState(evt.viewState)} + onClick={mapTooltipRef.current?.onClickLayer} + onLoad={() => { + setReady(true) + }} + > + {!!mapRef.current && layers && ready && ( + <> + + + + + + {isDrawing && } + + + + )} + +
+ ) +} 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..c29e57159 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/Tooltip.tsx @@ -0,0 +1,125 @@ +import { + forwardRef, + useCallback, + useEffect, + useImperativeHandle, + useMemo, + useState, +} from "react"; +import { Map } from "mapbox-gl"; +import { + LngLat, + MapGeoJSONFeature, + MapLayerMouseEvent, +} 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..1a09422da --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx @@ -0,0 +1,59 @@ +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, { + 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..5fa298172 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Download.tsx @@ -0,0 +1,46 @@ +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"; + +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 + ); +} + +function DownloadIcon() { + return + + +} + 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..f3eb7ad27 --- /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) => { + 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..175a7eeae --- /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..d3238f102 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Legends.tsx @@ -0,0 +1,173 @@ +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, +} from "vizzuality-components"; +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..beb652b34 --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Search.tsx @@ -0,0 +1,143 @@ +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"; + +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) => { + 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: [ + [bbox[0], bbox[1]], + [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: Suggest) => { + 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..83178e05b --- /dev/null +++ b/deployment/frontend/src/components/_shared/map/controls/Settings.tsx @@ -0,0 +1,56 @@ +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' + +export default function Settings({ + mapRef, +}: { + mapRef: MutableRefObject +}) { + const [open, setOpen] = useState(false) + return ( + setOpen(true)}> + + +

+ Map settings +

+
+
+ +
+
+ +
+
+ +
+
+
+
+ ) +} + +function SettingsIcon() { + return ( + + + + ) +} 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/datasets/DatasetPageLayout.tsx b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx index 6e79c33d9..b348399ed 100644 --- a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx +++ b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx @@ -1,41 +1,46 @@ -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 { ArrowRightIcon } from '@heroicons/react/20/solid' export default function DatasetPageLayout({ - children, + lhs, + rhs, }: { - children: React.ReactNode; + lhs: React.ReactNode + rhs: React.ReactNode }) { - return ( -
- - {({ open }) => ( - <> - -
+ + {({ open }) => ( + <> + +
+ +
+
+ + {lhs} + + )} - > - -
-
- - {children} - - - )} -
-
- ); + +
{rhs}
+ + ) } 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..bf3fdde65 --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/MapView.tsx @@ -0,0 +1,16 @@ +import Map from '@/components/_shared/map/Map' +import { useLayersFromRW } from '@/utils/queryHooks' +import { useActiveLayerGroups } from '@/utils/storeHooks' +import { useEffect } from 'react' + +export default function MapView() { + const { data: activeLayers } = useLayersFromRW() + const { addLayerGroup } = + useActiveLayerGroups() + + useEffect(() => { + addLayerGroup({ layers: ["74306f01-3baa-4256-9cdc-694080cf6b13"], datasetId: ""}) + }, []) + + return +} 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..174349737 --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx @@ -0,0 +1,5 @@ +export default function TabularView() { + + + return <> +} 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..f32de6e08 --- /dev/null +++ b/deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx @@ -0,0 +1,31 @@ +import { Tab } from '@headlessui/react' +import { VisualizationTabs } from './VisualizationTabs' +import MapView from './MapView' +import TabularView from './TabularView' + +export default function Visualizations() { + 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 9e295b31a..bad94351e 100644 --- a/deployment/frontend/src/pages/_app.tsx +++ b/deployment/frontend/src/pages/_app.tsx @@ -1,50 +1,77 @@ -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/globals.scss' 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 ( + pageProps.initialZustandState && + pageProps.initialZustandState.layersParsed + ) { + pageProps.initialZustandState.layersParsed?.forEach( + (layer: [string, LayerState]) => { + newLayersState.set(layer[0], layer[1]) + } + ) + } + const createStore = useCreateStore({ + ...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 f866bf4ad..b7d65f002 100644 --- a/deployment/frontend/src/pages/datasets/[datasetName].tsx +++ b/deployment/frontend/src/pages/datasets/[datasetName].tsx @@ -1,69 +1,78 @@ -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 { 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' 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 tabs = [ - { name: "Data files" }, - { name: "About" }, - { name: "Methodology" }, - { name: "Related Datasets" }, - { name: "Contact" }, - { name: "API" }, - { name: "Members" }, - ]; - return ( - <> -
- - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - ); + const tabs = [ + { name: 'Data files' }, + { name: 'About' }, + { name: 'Methodology' }, + { name: 'Related Datasets' }, + { name: 'Contact' }, + { name: 'API' }, + { name: 'Members' }, + ] + return ( + <> +
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + } + rhs={} + /> + + ) } diff --git a/deployment/frontend/src/styles/globals.css b/deployment/frontend/src/styles/globals.css deleted file mode 100644 index fb66ad305..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-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..9c09d7e5a --- /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-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 0c9449144..27a528adf 100644 --- a/deployment/frontend/tailwind.config.ts +++ b/deployment/frontend/tailwind.config.ts @@ -20,6 +20,7 @@ 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-dark-gray": "#666666" @@ -36,6 +37,13 @@ export default { }, }, plugins: [ - require('@tailwindcss/container-queries') + require('@tailwindcss/container-queries'), + require("tailwindcss/plugin")(function ({ + addVariant, + }: { + addVariant: any; + }) { + addVariant("not-last", "&:not(:last-child)"); + }), ], } satisfies Config; From 7a8f2984d826923e88e5541bc76f81b1eb77921f Mon Sep 17 00:00:00 2001 From: Demenech Date: Mon, 30 Oct 2023 20:38:18 -0300 Subject: [PATCH 02/10] feat(odp-139 ): chart view --- deployment/frontend/package-lock.json | 2315 ++++++++++------- deployment/frontend/package.json | 4 + .../frontend/src/components/_shared/Table.tsx | 2 + .../_shared/icons/AdvancedFilteringIcon.tsx | 19 + .../_shared/icons/ColFilterIcon.tsx | 33 + .../components/_shared/icons/DownloadIcon.tsx | 19 + .../components/_shared/icons/ExportIcon.tsx | 5 + .../components/_shared/icons/SearchIcon.tsx | 19 + .../components/_shared/icons/SettingsIcon.tsx | 19 + .../src/components/_shared/map/Labels.tsx | 2 + .../_shared/map/controls/Download.tsx | 6 +- .../_shared/map/controls/IconButton.tsx | 2 +- .../_shared/map/controls/Search.tsx | 243 +- .../_shared/map/controls/Settings.tsx | 20 +- .../components/datasets/DatasetPageLayout.tsx | 4 +- .../datasets/visualizations/ChartView.tsx | 57 + .../datasets/visualizations/TabularView.tsx | 223 +- .../visualizations/Visualizations.tsx | 5 +- 18 files changed, 1962 insertions(+), 1035 deletions(-) create mode 100644 deployment/frontend/src/components/_shared/icons/AdvancedFilteringIcon.tsx create mode 100644 deployment/frontend/src/components/_shared/icons/ColFilterIcon.tsx create mode 100644 deployment/frontend/src/components/_shared/icons/DownloadIcon.tsx create mode 100644 deployment/frontend/src/components/_shared/icons/ExportIcon.tsx create mode 100644 deployment/frontend/src/components/_shared/icons/SearchIcon.tsx create mode 100644 deployment/frontend/src/components/_shared/icons/SettingsIcon.tsx create mode 100644 deployment/frontend/src/components/datasets/visualizations/ChartView.tsx diff --git a/deployment/frontend/package-lock.json b/deployment/frontend/package-lock.json index f9eaffed1..2528cada9 100644 --- a/deployment/frontend/package-lock.json +++ b/deployment/frontend/package-lock.json @@ -17,6 +17,7 @@ "@t3-oss/env-nextjs": "^0.7.0", "@tailwindcss/container-queries": "^0.1.1", "@tanstack/react-query": "^4.32.6", + "@tanstack/react-table": "^8.10.7", "@trpc/client": "^10.37.1", "@trpc/next": "^10.37.1", "@trpc/react-query": "^10.37.1", @@ -37,11 +38,14 @@ "react-hook-form": "^7.47.0", "react-map-gl": "^7.1.6", "react-query": "^3.39.3", + "react-vega": "^7.6.0", "sass": "^1.69.5", "superjson": "^1.13.1", "swiper": "^10.3.1", "ts-pattern": "^5.0.5", "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" @@ -1582,6 +1586,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/@trpc/client": { "version": "10.40.0", "resolved": "https://registry.npmjs.org/@trpc/client/-/client-10.40.0.tgz", @@ -2084,7 +2119,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" } @@ -2093,7 +2127,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" }, @@ -2735,60 +2768,6 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, - "node_modules/cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "peer": true, - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "peer": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -2808,20 +2787,10 @@ "node": ">=6" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2832,8 +2801,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", @@ -2949,7 +2917,6 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "peer": true, "dependencies": { "internmap": "^1.0.0" } @@ -2963,8 +2930,7 @@ "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==", - "peer": true + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, "node_modules/d3-contour": { "version": "1.3.2", @@ -2981,11 +2947,21 @@ "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==", - "peer": true + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" }, "node_modules/d3-dsv": { "version": "1.2.0", @@ -3030,14 +3006,12 @@ "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==", - "peer": true + "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==", - "peer": true, "dependencies": { "d3-array": "1" } @@ -3046,7 +3020,6 @@ "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==", - "peer": true, "dependencies": { "commander": "7", "d3-array": "1 - 3", @@ -3067,7 +3040,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "peer": true, "engines": { "node": ">= 10" } @@ -3075,8 +3047,7 @@ "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==", - "peer": true + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" }, "node_modules/d3-hierarchy": { "version": "1.1.9", @@ -3102,8 +3073,7 @@ "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==", - "peer": true + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" }, "node_modules/d3-scale": { "version": "2.2.2", @@ -3147,14 +3117,12 @@ "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==", - "peer": true + "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==", - "peer": true, "dependencies": { "d3-time": "1" } @@ -3303,6 +3271,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", @@ -3529,7 +3505,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" } @@ -3977,103 +3952,6 @@ "node": ">=0.8.x" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "peer": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "peer": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "peer": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "peer": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -4116,6 +3994,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", @@ -4329,12 +4212,6 @@ "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" }, - "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "peer": true - }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -4785,8 +4662,7 @@ "node_modules/internmap": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "peer": true + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" }, "node_modules/invariant": { "version": "2.2.4", @@ -4796,15 +4672,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -4966,18 +4833,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "peer": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5113,15 +4968,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -5221,7 +5067,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", @@ -5391,18 +5238,6 @@ "language-subtag-registry": "~0.3.2" } }, - "node_modules/lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "peer": true, - "dependencies": { - "invert-kv": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5500,18 +5335,6 @@ "node": ">=10" } }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "peer": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -5569,20 +5392,6 @@ "@math.gl/core": "3.6.3" } }, - "node_modules/mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "peer": true, - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -5663,15 +5472,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -5883,17 +5683,10 @@ "react-dom": ">=16.0.0" } }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "peer": true - }, "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==", - "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5957,36 +5750,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "peer": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -6234,6 +5997,18 @@ "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", @@ -6281,20 +6056,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "peer": true, - "dependencies": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -6303,41 +6064,14 @@ "node": ">=8" } }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { "node": ">=10" }, @@ -6997,15 +6731,50 @@ } }, "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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-vega/-/react-vega-7.6.0.tgz", + "integrity": "sha512-2oMML4wH9qWLnZPRxJm06ozwrVN/K+nkjqdI5/ofWWsrBnnH4iB9rRKrsV8px0nlWgZrwfdCH4g5RUiyyJHWSA==", "dependencies": { - "prop-types": "^15.6.1" + "@types/react": "*", + "fast-deep-equal": "^3.1.1", + "prop-types": "^15.8.1", + "vega-embed": "^6.5.1" }, "peerDependencies": { - "react": ">=15.5.4 || ^16.0.0", - "vega-lib": "^4.2.0" + "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": { @@ -7208,17 +6977,10 @@ "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==", - "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "peer": true - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -7300,6 +7062,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/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7362,8 +7129,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "peer": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { "version": "1.69.5", @@ -7403,12 +7169,6 @@ "node": ">=10" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "peer": true - }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -7477,12 +7237,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "peer": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7602,41 +7356,6 @@ "node": ">=10.0.0" } }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "peer": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "peer": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -7706,7 +7425,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" }, @@ -7723,15 +7441,6 @@ "node": ">=4" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -8011,7 +7720,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "peer": true, "dependencies": { "commander": "2" }, @@ -8024,14 +7732,12 @@ "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==", - "peer": true + "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==", - "peer": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/traverse": { "version": "0.6.7", @@ -8322,30 +8028,43 @@ } }, "node_modules/vega": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vega/-/vega-4.4.0.tgz", - "integrity": "sha512-siNRf6F3Ihoku0T9LebtaguWd88SVcf8yWJmHQUO5ZcZKREjTYO0LmLHUOH1plSEQSqHBAQPtAjQ3xZYQKgSdQ==", - "peer": true, - "dependencies": { - "vega-lib": "4.4.0", - "vega-parser": "3.9.0", - "vega-typings": "*", - "yargs": "12" - }, - "bin": { - "vg2png": "bin/vg2png", - "vg2svg": "bin/vg2svg" - }, - "optionalDependencies": { - "canvas": "^1.6.13", - "canvas-prebuilt": "1.6.11" + "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==", - "peer": true + "integrity": "sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==" }, "node_modules/vega-crossfilter": { "version": "3.0.1", @@ -8408,111 +8127,78 @@ "vega-util": "^1.7.0" } }, - "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, + "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": { - "d3-collection": "^1.0.7", - "d3-hierarchy": "^1.1.8", - "vega-dataflow": "^4.0.4", - "vega-util": "^1.7.0" + "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-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, + "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": { - "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" + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" } }, - "node_modules/vega-loader": { + "node_modules/vega-format/node_modules/d3-format": { "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" + "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-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, + "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": { - "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" + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "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==", - "peer": 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": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", "d3-geo": "^3.1.0", - "d3-geo-projection": "^4.0.0", - "vega-scale": "^7.3.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-projection/node_modules/d3-array": { + "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==", - "peer": true, "dependencies": { "internmap": "1 - 2" }, @@ -8520,11 +8206,42 @@ "node": ">=12" } }, - "node_modules/vega-projection/node_modules/d3-geo": { + "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==", - "peer": true, "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -8532,11 +8249,10 @@ "node": ">=12" } }, - "node_modules/vega-projection/node_modules/d3-interpolate": { + "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==", - "peer": true, "dependencies": { "d3-color": "1 - 3" }, @@ -8544,11 +8260,18 @@ "node": ">=12" } }, - "node_modules/vega-projection/node_modules/d3-scale": { + "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==", - "peer": true, "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -8560,11 +8283,21 @@ "node": ">=12" } }, - "node_modules/vega-projection/node_modules/d3-time": { + "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==", - "peer": true, "dependencies": { "d3-array": "2 - 3" }, @@ -8572,219 +8305,1229 @@ "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==", - "peer": true, + "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": { - "d3-array": "^3.2.2", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "vega-time": "^2.1.1", + "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-runtime": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-3.2.0.tgz", - "integrity": "sha512-aoWqH+U5tiByj3cIGZsTDPMTb10tUN2nm4zWa3Z7lOUilbw/+gEaOuy1qvr4VrVhUShsnytudED4OpQNUkKy3Q==", + "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-scale": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-2.5.1.tgz", - "integrity": "sha512-EOpUDOjTAD7DhXglyOquXTzXFXjnNvrGyMDCOsfRL/XUTsbjYYNkdl0Q30c9fVN1I+H65lMz52xwN16yxwMuTw==", + "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-interpolate": "^1.3.2", - "d3-scale": "^2.1.2", - "d3-scale-chromatic": "^1.3.3", - "d3-time": "^1.0.10", + "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-scenegraph": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-3.2.3.tgz", - "integrity": "sha512-L4mZ6LpEKvW5Q0c8gyqozGuoY5miJI4DiRipiAG0BQ6rB67tK+8qlaTfslX4tNBz88mu+CyVO9ZjNW/M4nBI3w==", + "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": { - "d3-path": "^1.0.7", - "d3-shape": "^1.2.2", - "vega-canvas": "^1.1.0", - "vega-loader": "^3.0.1", + "vega-dataflow": "^4.0.4", + "vega-scenegraph": "^3.2.3", "vega-util": "^1.7.0" } }, - "node_modules/vega-statistics": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz", - "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", + "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": { - "d3-array": "^3.2.2" + "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-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==", - "peer": true, + "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": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" + "d3-force": "^3.0.0", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" } }, - "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==", - "peer": true, + "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-time": "^3.1.0", + "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-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==", - "peer": true, + "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": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" + "d3-hierarchy": "^3.1.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" } }, - "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==", - "peer": true, + "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-array": "2 - 3" - }, - "engines": { - "node": ">=12" + "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-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==", + "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-util": "^1.7.0" + "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-transforms": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-2.3.1.tgz", - "integrity": "sha512-jvDz33ohZiP6cN74quEvesHr0sbSMMQ69ZZqgL6cRDHBqfiuHPhZofBKWDXE1nEWDmJqTEyvg0gsnA8vpHzpjQ==", - "peer": true, + "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": { - "d3-array": "^2.0.2", - "vega-dataflow": "^4.1.0", - "vega-statistics": "^1.2.3", - "vega-util": "^1.7.0" + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" } }, - "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==", - "peer": true, + "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": { - "@types/geojson": "7946.0.4", - "vega-event-selector": "^3.0.1", - "vega-expression": "^5.0.1", + "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-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==", - "peer": true - }, - "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==", - "peer": true - }, - "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==", - "peer": true, + "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": { - "@types/estree": "^1.0.0", + "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-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/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-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, + "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": "^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" + "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-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, + "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": "^4.0.4", - "vega-scenegraph": "^3.2.3", - "vega-util": "^1.7.0" + "vega-dataflow": "^5.7.5", + "vega-scenegraph": "^4.10.2", + "vega-util": "^1.17.1" } }, - "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, + "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-voronoi": "^1.1.2", - "vega-dataflow": "^4.0.0", - "vega-util": "^1.7.0" + "d3-delaunay": "^6.0.2", + "vega-dataflow": "^5.7.5", + "vega-util": "^1.17.1" } }, - "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, + "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.0.1", - "vega-dataflow": "^4.0.0", - "vega-scale": "^2.1.1", - "vega-statistics": "^1.2.1", - "vega-util": "^1.7.0" + "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": { @@ -8928,8 +9671,7 @@ "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==", - "peer": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/wgs84": { "version": "0.0.0", @@ -8940,7 +9682,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -9018,12 +9759,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "peer": true - }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -9043,40 +9778,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "peer": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "peer": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9095,12 +9796,6 @@ "node": ">=0.4" } }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "peer": true - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -9114,26 +9809,6 @@ "node": ">= 14" } }, - "node_modules/yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "peer": true, - "dependencies": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -9142,120 +9817,6 @@ "node": ">=10" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "peer": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "peer": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/deployment/frontend/package.json b/deployment/frontend/package.json index 525af6801..0f0361e04 100644 --- a/deployment/frontend/package.json +++ b/deployment/frontend/package.json @@ -18,6 +18,7 @@ "@t3-oss/env-nextjs": "^0.7.0", "@tailwindcss/container-queries": "^0.1.1", "@tanstack/react-query": "^4.32.6", + "@tanstack/react-table": "^8.10.7", "@trpc/client": "^10.37.1", "@trpc/next": "^10.37.1", "@trpc/react-query": "^10.37.1", @@ -38,11 +39,14 @@ "react-hook-form": "^7.47.0", "react-map-gl": "^7.1.6", "react-query": "^3.39.3", + "react-vega": "^7.6.0", "sass": "^1.69.5", "superjson": "^1.13.1", "swiper": "^10.3.1", "ts-pattern": "^5.0.5", "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" diff --git a/deployment/frontend/src/components/_shared/Table.tsx b/deployment/frontend/src/components/_shared/Table.tsx index d880cf5bc..4bb791c4a 100644 --- a/deployment/frontend/src/components/_shared/Table.tsx +++ b/deployment/frontend/src/components/_shared/Table.tsx @@ -121,3 +121,5 @@ export { TableCell, TableCaption, }; + + diff --git a/deployment/frontend/src/components/_shared/icons/AdvancedFilteringIcon.tsx b/deployment/frontend/src/components/_shared/icons/AdvancedFilteringIcon.tsx new file mode 100644 index 000000000..d6e68ab3e --- /dev/null +++ b/deployment/frontend/src/components/_shared/icons/AdvancedFilteringIcon.tsx @@ -0,0 +1,19 @@ +export function AdvancedFilteringIcon() { + return ( + + + + ) +} diff --git a/deployment/frontend/src/components/_shared/icons/ColFilterIcon.tsx b/deployment/frontend/src/components/_shared/icons/ColFilterIcon.tsx new file mode 100644 index 000000000..f82945fd9 --- /dev/null +++ b/deployment/frontend/src/components/_shared/icons/ColFilterIcon.tsx @@ -0,0 +1,33 @@ +export function ColFilterIcon() { + return ( + + + + + + + + + + ) +} diff --git a/deployment/frontend/src/components/_shared/icons/DownloadIcon.tsx b/deployment/frontend/src/components/_shared/icons/DownloadIcon.tsx new file mode 100644 index 000000000..e5b5aec0c --- /dev/null +++ b/deployment/frontend/src/components/_shared/icons/DownloadIcon.tsx @@ -0,0 +1,19 @@ +export function DownloadIcon() { + return ( + + + + ) +} diff --git a/deployment/frontend/src/components/_shared/icons/ExportIcon.tsx b/deployment/frontend/src/components/_shared/icons/ExportIcon.tsx new file mode 100644 index 000000000..f9bd2d2ca --- /dev/null +++ b/deployment/frontend/src/components/_shared/icons/ExportIcon.tsx @@ -0,0 +1,5 @@ +export function ExportIcon() { + return + + +} diff --git a/deployment/frontend/src/components/_shared/icons/SearchIcon.tsx b/deployment/frontend/src/components/_shared/icons/SearchIcon.tsx new file mode 100644 index 000000000..839226f68 --- /dev/null +++ b/deployment/frontend/src/components/_shared/icons/SearchIcon.tsx @@ -0,0 +1,19 @@ +export function SearchIcon() { + return ( + + + + ) +} diff --git a/deployment/frontend/src/components/_shared/icons/SettingsIcon.tsx b/deployment/frontend/src/components/_shared/icons/SettingsIcon.tsx new file mode 100644 index 000000000..196e97d4e --- /dev/null +++ b/deployment/frontend/src/components/_shared/icons/SettingsIcon.tsx @@ -0,0 +1,19 @@ +export function SettingsIcon() { + return ( + + + + ) +} diff --git a/deployment/frontend/src/components/_shared/map/Labels.tsx b/deployment/frontend/src/components/_shared/map/Labels.tsx index b52026ad8..952b4ba50 100644 --- a/deployment/frontend/src/components/_shared/map/Labels.tsx +++ b/deployment/frontend/src/components/_shared/map/Labels.tsx @@ -65,3 +65,5 @@ export default function Labels({ return null } + + diff --git a/deployment/frontend/src/components/_shared/map/controls/Download.tsx b/deployment/frontend/src/components/_shared/map/controls/Download.tsx index 5fa298172..efdce8001 100644 --- a/deployment/frontend/src/components/_shared/map/controls/Download.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/Download.tsx @@ -9,6 +9,7 @@ import { } 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(); @@ -38,9 +39,4 @@ function isDataLayer( ); } -function DownloadIcon() { - return - - -} diff --git a/deployment/frontend/src/components/_shared/map/controls/IconButton.tsx b/deployment/frontend/src/components/_shared/map/controls/IconButton.tsx index 175a7eeae..7df17321a 100644 --- a/deployment/frontend/src/components/_shared/map/controls/IconButton.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/IconButton.tsx @@ -4,5 +4,5 @@ interface IconButtonProps extends React.ButtonHTMLAttributes export default function IconButton({ children, ...props }: IconButtonProps) { - return + return } diff --git a/deployment/frontend/src/components/_shared/map/controls/Search.tsx b/deployment/frontend/src/components/_shared/map/controls/Search.tsx index beb652b34..d28ee2d7c 100644 --- a/deployment/frontend/src/components/_shared/map/controls/Search.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/Search.tsx @@ -1,143 +1,130 @@ import React, { - useState, - useRef, - useCallback, - MutableRefObject, - useEffect, -} from "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 { 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, }: { - mapContainerRef: MutableRefObject; + 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) => { - 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 [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) => { + 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: [ + [bbox[0], bbox[1]], + [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: Suggest) => { + 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 { longitude, latitude, zoom } = fitBounds({ - width: mapContainer.offsetWidth, - height: mapContainer.offsetHeight, - bounds: [ - [bbox[0], bbox[1]], - [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: Suggest) => { - 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 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(); + + const handleSearchInput = (show: boolean) => { + if (show) { + // geosuggest.current?.focus(); + setShowSearchInput(true) + } else { + // geosuggest.current?.clear(); + setShowSearchInput(false) + } } - }, [bounds, handleFitBounds]); - return ( -
- {showSearchInput && ( - /* { + if ( + !isEmpty(bounds) && + !!bounds.bbox && + bounds.bbox.every((b) => typeof b === 'number') + ) { + handleFitBounds() + } + }, [bounds, handleFitBounds]) + + return ( +
+ {showSearchInput && ( + /* */
- )} - handleSearchInput(!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 index 83178e05b..d185f7a01 100644 --- a/deployment/frontend/src/components/_shared/map/controls/Settings.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/Settings.tsx @@ -5,6 +5,7 @@ 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, @@ -35,22 +36,3 @@ export default function Settings({ ) } -function SettingsIcon() { - return ( - - - - ) -} diff --git a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx index b348399ed..2f8a3ced0 100644 --- a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx +++ b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx @@ -10,7 +10,7 @@ export default function DatasetPageLayout({ rhs: React.ReactNode }) { return ( -
+
{({ open }) => ( <> @@ -40,7 +40,7 @@ export default function DatasetPageLayout({ )} -
{rhs}
+
{rhs}
) } 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/TabularView.tsx b/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx index 174349737..fe1534519 100644 --- a/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx +++ b/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx @@ -1,5 +1,224 @@ -export default function TabularView() { +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' - return <> +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/Visualizations.tsx b/deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx index f32de6e08..6ac4b8ac3 100644 --- a/deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx +++ b/deployment/frontend/src/components/datasets/visualizations/Visualizations.tsx @@ -2,6 +2,7 @@ import { Tab } from '@headlessui/react' import { VisualizationTabs } from './VisualizationTabs' import MapView from './MapView' import TabularView from './TabularView' +import ChartView from './ChartView' export default function Visualizations() { const tabs = [ @@ -23,7 +24,9 @@ export default function Visualizations() { - + + +
From 678ffcac5cb70fb29cd033c9ceac0a4dda4d1607 Mon Sep 17 00:00:00 2001 From: Demenech Date: Tue, 31 Oct 2023 16:00:35 -0300 Subject: [PATCH 03/10] feat(odp-149): implement add layers modals --- .../frontend/src/components/_shared/Modal.tsx | 2 +- .../src/components/_shared/map/Map.tsx | 56 ++- .../components/datasets/DatasetPageLayout.tsx | 65 +++- .../datasets/add-layers/AddLayers.tsx | 40 +++ .../datasets/add-layers/FiltersPanel.tsx | 141 ++++++++ .../datasets/add-layers/SearchPanel.tsx | 41 +++ .../datasets/sections/DataFiles.tsx | 325 +++++++++--------- .../datasets/sections/RelatedDatasets.tsx | 318 +++++++++++++---- .../datasets/visualizations/MapView.tsx | 18 +- .../datasets/visualizations/TabularView.tsx | 2 +- .../visualizations/Visualizations.tsx | 9 +- .../src/pages/datasets/[datasetName].tsx | 86 +++-- deployment/frontend/tailwind.config.ts | 3 +- 13 files changed, 813 insertions(+), 293 deletions(-) create mode 100644 deployment/frontend/src/components/datasets/add-layers/AddLayers.tsx create mode 100644 deployment/frontend/src/components/datasets/add-layers/FiltersPanel.tsx create mode 100644 deployment/frontend/src/components/datasets/add-layers/SearchPanel.tsx diff --git a/deployment/frontend/src/components/_shared/Modal.tsx b/deployment/frontend/src/components/_shared/Modal.tsx index 1893d1b1f..0ae304679 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/datasets/DatasetPageLayout.tsx b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx index 2f8a3ced0..f166635da 100644 --- a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx +++ b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx @@ -1,6 +1,7 @@ import classNames from '@/utils/classnames' import { Disclosure } from '@headlessui/react' -import { ArrowRightIcon } from '@heroicons/react/20/solid' +import { ArrowLeftIcon, ArrowRightIcon } from '@heroicons/react/20/solid' +import { useState } from 'react' export default function DatasetPageLayout({ lhs, @@ -9,12 +10,26 @@ export default function DatasetPageLayout({ lhs: React.ReactNode rhs: React.ReactNode }) { + const [lhsOpen, setLhsOpen] = useState(true) + const [rhsOpen, setRhsOpen] = useState(true) + return (
{({ 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} )} -
{rhs}
+ + + {({ 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} +
+
+ + )} +
) } 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/MapView.tsx b/deployment/frontend/src/components/datasets/visualizations/MapView.tsx index bf3fdde65..9b7585ed3 100644 --- a/deployment/frontend/src/components/datasets/visualizations/MapView.tsx +++ b/deployment/frontend/src/components/datasets/visualizations/MapView.tsx @@ -1,16 +1,22 @@ import Map from '@/components/_shared/map/Map' import { useLayersFromRW } from '@/utils/queryHooks' import { useActiveLayerGroups } from '@/utils/storeHooks' -import { useEffect } from 'react' +import { Dispatch, SetStateAction, useEffect } from 'react' -export default function MapView() { +export default function MapView({ + setIsAddLayers, +}: { + setIsAddLayers: Dispatch> +}) { const { data: activeLayers } = useLayersFromRW() - const { addLayerGroup } = - useActiveLayerGroups() + const { addLayerGroup } = useActiveLayerGroups() useEffect(() => { - addLayerGroup({ layers: ["74306f01-3baa-4256-9cdc-694080cf6b13"], datasetId: ""}) + addLayerGroup({ + layers: ['74306f01-3baa-4256-9cdc-694080cf6b13'], + datasetId: '', + }) }, []) - return + return setIsAddLayers(prev => !prev)} /> } diff --git a/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx b/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx index fe1534519..328a32877 100644 --- a/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx +++ b/deployment/frontend/src/components/datasets/visualizations/TabularView.tsx @@ -101,7 +101,7 @@ export default ({
) : (
-
+
> +}) { const tabs = [ { name: 'Map View' }, { name: 'Tabular View' }, @@ -19,7 +24,7 @@ export default function Visualizations() { - + diff --git a/deployment/frontend/src/pages/datasets/[datasetName].tsx b/deployment/frontend/src/pages/datasets/[datasetName].tsx index b7d65f002..ce3847337 100644 --- a/deployment/frontend/src/pages/datasets/[datasetName].tsx +++ b/deployment/frontend/src/pages/datasets/[datasetName].tsx @@ -12,12 +12,17 @@ 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' + const links = [ { label: 'Explore Data', url: '/search', current: false }, { label: 'Name of dataset', url: '/datasets/dataset_test', current: true }, ] export default function DatasetPage() { + const [isAddLayers, setIsAddLayers] = useState(false) + const tabs = [ { name: 'Data files' }, { name: 'About' }, @@ -27,51 +32,56 @@ export default function DatasetPage() { { name: 'API' }, { name: 'Members' }, ] + return ( <>
- - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - + isAddLayers ? ( + + ) : ( + <> + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + ) } - rhs={} + rhs={} /> ) diff --git a/deployment/frontend/tailwind.config.ts b/deployment/frontend/tailwind.config.ts index 27a528adf..f06bf621a 100644 --- a/deployment/frontend/tailwind.config.ts +++ b/deployment/frontend/tailwind.config.ts @@ -23,7 +23,8 @@ export default { "wri-dark-blue": "#3654A5", "wri-light-blue": "#B5D6E8", "wri-light-yellow": "#FBE8BE", - "wri-dark-gray": "#666666" + "wri-light-gray": "#4C4C4C", + "wri-dark-gray": "#666666", }, screens: { "4xl": "2048px", From 7b5e7dfca8e779ee7a5bc7af7d55ad1af61dbf87 Mon Sep 17 00:00:00 2001 From: Demenech Date: Tue, 31 Oct 2023 16:06:31 -0300 Subject: [PATCH 04/10] Regenerate package-lock.json --- deployment/frontend/package-lock.json | 217 +++++---------------- deployment/frontend/src/styles/globals.css | 35 ---- 2 files changed, 45 insertions(+), 207 deletions(-) delete mode 100644 deployment/frontend/src/styles/globals.css diff --git a/deployment/frontend/package-lock.json b/deployment/frontend/package-lock.json index 605a10791..08c59ba6e 100644 --- a/deployment/frontend/package-lock.json +++ b/deployment/frontend/package-lock.json @@ -18,9 +18,7 @@ "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.6", "@tanstack/react-query": "^4.32.6", -<<<<<<< HEAD "@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,7 +30,6 @@ "@tiptap/extension-text": "^2.1.12", "@tiptap/extension-underline": "^2.1.12", "@tiptap/react": "^2.1.12", ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e "@trpc/client": "^10.37.1", "@trpc/next": "^10.37.1", "@trpc/react-query": "^10.37.1", @@ -41,11 +38,8 @@ "@vizzuality/layer-manager-provider-carto": "^2.0.3", "@vizzuality/layer-manager-utils": "^1.1.4", "class-variance-authority": "^0.7.0", -<<<<<<< HEAD - "js-deep-equals": "^2.1.1", -======= "clsx": "^2.0.0", ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e + "js-deep-equals": "^2.1.1", "ky": "^1.0.1", "mapbox-gl": "^2.15.0", "next": "^13.5.4", @@ -56,13 +50,10 @@ "react-dom": "18.2.0", "react-hook-form": "^7.47.0", "react-map-gl": "^7.1.6", -<<<<<<< HEAD + "react-modal": "^3.16.1", "react-query": "^3.39.3", "react-vega": "^7.6.0", "sass": "^1.69.5", -======= - "react-modal": "^3.16.1", ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e "superjson": "^1.13.1", "swiper": "^10.3.1", "tailwind-merge": "^1.14.0", @@ -886,66 +877,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", @@ -976,51 +907,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", @@ -1688,7 +1574,6 @@ } } }, -<<<<<<< HEAD "node_modules/@tanstack/react-table": { "version": "8.10.7", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.7.tgz", @@ -1718,7 +1603,8 @@ "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", @@ -1936,7 +1822,6 @@ "@tiptap/pm": "^2.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e } }, "node_modules/@trpc/client": { @@ -2096,12 +1981,6 @@ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==" }, -<<<<<<< HEAD - "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/object.omit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/object.omit/-/object.omit-3.0.2.tgz", @@ -2113,7 +1992,11 @@ "resolved": "https://registry.npmjs.org/@types/object.pick/-/object.pick-1.3.3.tgz", "integrity": "sha512-qZqHmdGEALeSATMB1djT1S5szv6Wtpb7DKpHrt2XG4iyKlV7C2Xk8GmDXr1KXakOqUfX6ohw7ceruYt4NVmB1Q==", "peer": true ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e + }, + "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", @@ -3224,20 +3107,18 @@ "url": "https://github.com/sponsors/mesqueeb" } }, -<<<<<<< HEAD "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", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "peer": true ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -5787,7 +5668,22 @@ "vt-pbf": "^3.1.3" } }, -<<<<<<< HEAD + "node_modules/markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "peer": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "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", @@ -5804,29 +5700,12 @@ "dependencies": { "@math.gl/core": "3.6.3" } -======= - "node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", - "peer": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "peer": true ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e }, "node_modules/meow": { "version": "9.0.0", @@ -7378,7 +7257,24 @@ } } }, -<<<<<<< HEAD + "node_modules/react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "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", @@ -7402,24 +7298,6 @@ "react-native": { "optional": true } -======= - "node_modules/react-modal": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", - "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", - "dependencies": { - "exenv": "^1.2.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.0", - "warning": "^4.0.3" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", - "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e } }, "node_modules/react-ssr-prepass": { @@ -7762,18 +7640,16 @@ "url": "https://github.com/sponsors/isaacs" } }, -<<<<<<< HEAD "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", "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", "peer": true ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e }, "node_modules/run-parallel": { "version": "1.2.0", @@ -10388,15 +10264,12 @@ "pbf": "^3.2.1" } }, -<<<<<<< HEAD -======= "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 }, ->>>>>>> 81e54a09a3d9935c2251c1bc31c261652c25496e "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", 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; -} From 3d1c836dde0c9c3fb6c7624a7b44624c43fc0750 Mon Sep 17 00:00:00 2001 From: Demenech Date: Tue, 31 Oct 2023 21:11:20 -0300 Subject: [PATCH 05/10] build: force install deps --- deployment/frontend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From e3cd1cbb8a55b19ac9259ad946dc18cfc632ef8f Mon Sep 17 00:00:00 2001 From: Demenech Date: Tue, 31 Oct 2023 21:51:31 -0300 Subject: [PATCH 06/10] feat(odp-149): fix build --- deployment/frontend/package-lock.json | 18 ++++++++++++++++++ deployment/frontend/package.json | 6 ++++-- .../src/components/_shared/map/Layer.tsx | 2 +- .../components/_shared/map/LayerManager.tsx | 2 +- .../src/components/_shared/map/Tooltip.tsx | 5 ++--- .../_shared/map/VizzLayerManager.tsx | 1 + .../components/_shared/map/controls/Draw.tsx | 2 +- .../_shared/map/controls/Legends.tsx | 2 ++ .../components/_shared/map/controls/Search.tsx | 6 ++++-- .../_shared/map/controls/Settings.tsx | 4 ++-- deployment/frontend/src/pages/_app.tsx | 11 +++++++++-- 11 files changed, 45 insertions(+), 14 deletions(-) diff --git a/deployment/frontend/package-lock.json b/deployment/frontend/package-lock.json index 08c59ba6e..2a3ad2806 100644 --- a/deployment/frontend/package-lock.json +++ b/deployment/frontend/package-lock.json @@ -67,6 +67,8 @@ }, "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", @@ -1948,6 +1950,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", diff --git a/deployment/frontend/package.json b/deployment/frontend/package.json index c97c3ad82..c607fca4c 100644 --- a/deployment/frontend/package.json +++ b/deployment/frontend/package.json @@ -39,8 +39,8 @@ "@vizzuality/layer-manager-provider-carto": "^2.0.3", "@vizzuality/layer-manager-utils": "^1.1.4", "class-variance-authority": "^0.7.0", - "js-deep-equals": "^2.1.1", "clsx": "^2.0.0", + "js-deep-equals": "^2.1.1", "ky": "^1.0.1", "mapbox-gl": "^2.15.0", "next": "^13.5.4", @@ -51,10 +51,10 @@ "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-vega": "^7.6.0", "sass": "^1.69.5", - "react-modal": "^3.16.1", "superjson": "^1.13.1", "swiper": "^10.3.1", "tailwind-merge": "^1.14.0", @@ -68,6 +68,8 @@ }, "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/map/Layer.tsx b/deployment/frontend/src/components/_shared/map/Layer.tsx index 2e25cb770..8d6cab578 100644 --- a/deployment/frontend/src/components/_shared/map/Layer.tsx +++ b/deployment/frontend/src/components/_shared/map/Layer.tsx @@ -161,7 +161,7 @@ class Layer extends PureComponent { remove = (): void => { const { layerManager, id, onAfterRemove } = this.props; - layerManager.remove(id, (layerModel) => { + layerManager.remove(id, (layerModel: any) => { if (onAfterRemove) onAfterRemove(layerModel); }); }; diff --git a/deployment/frontend/src/components/_shared/map/LayerManager.tsx b/deployment/frontend/src/components/_shared/map/LayerManager.tsx index 4f3892dad..4ac736ac6 100644 --- a/deployment/frontend/src/components/_shared/map/LayerManager.tsx +++ b/deployment/frontend/src/components/_shared/map/LayerManager.tsx @@ -72,7 +72,7 @@ const LayerManager = ({ layers }: { layers: APILayerSpec[] }): JSX.Element => { providers={providers} > {parsedLayers && - parsedLayers.map((_layer) => { + parsedLayers.map((_layer: any) => { return ; })} diff --git a/deployment/frontend/src/components/_shared/map/Tooltip.tsx b/deployment/frontend/src/components/_shared/map/Tooltip.tsx index c29e57159..e0af53c20 100644 --- a/deployment/frontend/src/components/_shared/map/Tooltip.tsx +++ b/deployment/frontend/src/components/_shared/map/Tooltip.tsx @@ -6,17 +6,16 @@ import { useMemo, useState, } from "react"; -import { Map } from "mapbox-gl"; +import { Map, MapLayerMouseEvent } from "mapbox-gl"; import { LngLat, MapGeoJSONFeature, - MapLayerMouseEvent, } 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; + onClickLayer: (e: MapLayerMouseEvent) => void | undefined; close: () => void; } diff --git a/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx b/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx index 1a09422da..5fc512f6b 100644 --- a/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx +++ b/deployment/frontend/src/components/_shared/map/VizzLayerManager.tsx @@ -43,6 +43,7 @@ class LayerManagerComponent extends PureComponent { if (React.isValidElement(child)) { const { zIndex } = child.props as ChildProps; return cloneElement(child, { + //@ts-ignore layerManager: this.layerManager, zIndex: zIndex || 1000 - i, }); diff --git a/deployment/frontend/src/components/_shared/map/controls/Draw.tsx b/deployment/frontend/src/components/_shared/map/controls/Draw.tsx index f3eb7ad27..2acf6c293 100644 --- a/deployment/frontend/src/components/_shared/map/controls/Draw.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/Draw.tsx @@ -53,7 +53,7 @@ export default function Draw({ defaultMode: "draw_polygon", }; - const onDrawCreate = useCallback((e) => { + const onDrawCreate = useCallback((e: any) => { const feature = e.features[0]; setFeatures(feature); drawControlRef.current?.deleteAll(); diff --git a/deployment/frontend/src/components/_shared/map/controls/Legends.tsx b/deployment/frontend/src/components/_shared/map/controls/Legends.tsx index d3238f102..106ba9b67 100644 --- a/deployment/frontend/src/components/_shared/map/controls/Legends.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/Legends.tsx @@ -11,7 +11,9 @@ import { LegendItemTypes, LegendItemTimeStep, Icons, + // @ts-ignore } from "vizzuality-components"; + // @ts-ignore import { LegendItemTimeline } from "old-vizzuality-components"; import { type ActiveLayerGroup } from "@/interfaces/state.interface"; diff --git a/deployment/frontend/src/components/_shared/map/controls/Search.tsx b/deployment/frontend/src/components/_shared/map/controls/Search.tsx index d28ee2d7c..76bd38c76 100644 --- a/deployment/frontend/src/components/_shared/map/controls/Search.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/Search.tsx @@ -28,7 +28,7 @@ export default function Search({ }, 250) const handleSearch = useCallback( - (locationParams) => { + (locationParams: any) => { setBounds({ ...locationParams, options: { zoom: 2 }, @@ -49,7 +49,9 @@ export default function Search({ width: mapContainer.offsetWidth, height: mapContainer.offsetHeight, bounds: [ + //@ts-ignore [bbox[0], bbox[1]], + //@ts-ignore [bbox[2], bbox[3]], ], ...options, @@ -68,7 +70,7 @@ export default function Search({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [bounds, debouncedOnMapViewportChange, mapContainerRef]) - const onSuggestSelect = (e: Suggest) => { + const onSuggestSelect = (e: any) => { if (e) { const { gmaps, location } = e const viewport = gmaps?.geometry && gmaps.geometry.viewport diff --git a/deployment/frontend/src/components/_shared/map/controls/Settings.tsx b/deployment/frontend/src/components/_shared/map/controls/Settings.tsx index d185f7a01..3d21e4a41 100644 --- a/deployment/frontend/src/components/_shared/map/controls/Settings.tsx +++ b/deployment/frontend/src/components/_shared/map/controls/Settings.tsx @@ -22,10 +22,10 @@ export default function Settings({
- +
- +
diff --git a/deployment/frontend/src/pages/_app.tsx b/deployment/frontend/src/pages/_app.tsx index 2066c04a2..63bd15ed8 100644 --- a/deployment/frontend/src/pages/_app.tsx +++ b/deployment/frontend/src/pages/_app.tsx @@ -13,7 +13,7 @@ import localFont from 'next/font/local' import { api } from '@/utils/api' import '@/styles/globals.scss' -import "@/styles/rte.css"; +import '@/styles/rte.css' const acumin = localFont({ src: [ @@ -46,9 +46,12 @@ const MyApp: AppType<{ session: Session | null }> = ({ }) => { 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]) @@ -56,13 +59,17 @@ const MyApp: AppType<{ session: Session | null }> = ({ ) } const createStore = useCreateStore({ + //@ts-ignore ...pageProps.initialZustandState, layers: newLayersState, }) const [queryClient] = useState(() => new QueryClient()) return ( - +
From 8d118e56c2cf2ae8206cca9a31cf77dbad9e24c3 Mon Sep 17 00:00:00 2001 From: Demenech Date: Thu, 2 Nov 2023 08:22:16 -0300 Subject: [PATCH 07/10] fix(odp-149): broken behavior after merge --- .../frontend/src/components/datasets/DatasetPageLayout.tsx | 6 ++++-- deployment/frontend/src/pages/datasets/[datasetName].tsx | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx index 66715fa79..8415c53bb 100644 --- a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx +++ b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx @@ -16,6 +16,8 @@ export default function DatasetPageLayout({ const [lhsOpen, setLhsOpen] = useState(true) const [rhsOpen, setRhsOpen] = useState(true) + console.log(lhsOpen, rhsOpen) + return (
@@ -29,7 +31,7 @@ export default function DatasetPageLayout({ rhsOpen && open ? '' : !rhsOpen && open - ? 'hidden' + ? '!hidden' : '' }`} > @@ -70,7 +72,7 @@ export default function DatasetPageLayout({ lhsOpen && open ? '' : !lhsOpen && open - ? 'hidden' + ? '!hidden' : '' }`} > diff --git a/deployment/frontend/src/pages/datasets/[datasetName].tsx b/deployment/frontend/src/pages/datasets/[datasetName].tsx index f5cb63f2b..0dbc9ad36 100644 --- a/deployment/frontend/src/pages/datasets/[datasetName].tsx +++ b/deployment/frontend/src/pages/datasets/[datasetName].tsx @@ -15,7 +15,6 @@ 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"; From 27a16fcdcf2af91de02a059a86066d4096f93232 Mon Sep 17 00:00:00 2001 From: Demenech Date: Thu, 2 Nov 2023 08:36:06 -0300 Subject: [PATCH 08/10] fix(odp-149): styling issue on the homepage --- deployment/frontend/src/styles/globals.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/frontend/src/styles/globals.scss b/deployment/frontend/src/styles/globals.scss index 9c09d7e5a..f4f296b96 100644 --- a/deployment/frontend/src/styles/globals.scss +++ b/deployment/frontend/src/styles/globals.scss @@ -28,7 +28,7 @@ body, html { width: fit-content !important; } -.default-container { +.default-home-container { max-width: 90vw; } From b776858d64adc119b38bf663110214662c130512 Mon Sep 17 00:00:00 2001 From: Demenech Date: Thu, 2 Nov 2023 09:50:03 -0300 Subject: [PATCH 09/10] fix(odp-149): update collapse button icon on dataset page --- .../frontend/src/components/datasets/DatasetPageLayout.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx index 8415c53bb..eba3456c3 100644 --- a/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx +++ b/deployment/frontend/src/components/datasets/DatasetPageLayout.tsx @@ -1,6 +1,6 @@ import classNames from '@/utils/classnames' import { Disclosure } from '@headlessui/react' -import { ArrowLeftIcon, ArrowRightIcon } from '@heroicons/react/20/solid' +import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/20/solid' import { useState } from 'react' import { useRouter } from "next/router"; @@ -43,7 +43,7 @@ export default function DatasetPageLayout({ : '-translate-x-[calc(100vw-3rem)] lg:-translate-x-[calc(50vw-3rem)]' )} > - - Date: Thu, 2 Nov 2023 14:18:11 +0100 Subject: [PATCH 10/10] add aproval modal --- .../frontend/src/components/dashboard/approval/ApprovalRow.tsx | 2 +- deployment/frontend/src/pages/datasets/[datasetName].tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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/pages/datasets/[datasetName].tsx b/deployment/frontend/src/pages/datasets/[datasetName].tsx index 0dbc9ad36..e0c5fe50e 100644 --- a/deployment/frontend/src/pages/datasets/[datasetName].tsx +++ b/deployment/frontend/src/pages/datasets/[datasetName].tsx @@ -44,6 +44,7 @@ export default function DatasetPage() { <>
+ {isApprovalRequest && ()}