diff --git a/client/package-lock.json b/client/package-lock.json index 2e73659..794430d 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -16,14 +16,12 @@ "leaflet": "^1.9.4", "lucide-react": "^0.539.0", "next-themes": "^0.4.6", - "plotly.js": "^3.3.1", "react": "^19.1.0", "react-dom": "^19.1.0", "react-grid-layout": "^1.5.2", "react-hook-form": "^7.62.0", "react-icons": "^5.5.0", "react-leaflet": "^5.0.0", - "react-plotly.js": "^2.6.0", "react-resizable": "^3.0.5", "tailwindcss": "^4.1.11", "uuid": "^11.1.0" @@ -270,24 +268,6 @@ "react-dom": ">=18" } }, - "node_modules/@choojs/findup": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", - "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", - "license": "MIT", - "dependencies": { - "commander": "^2.15.1" - }, - "bin": { - "findup": "bin/findup.js" - } - }, - "node_modules/@choojs/findup/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==", - "license": "MIT" - }, "node_modules/@cush/relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@cush/relative/-/relative-1.0.0.tgz", @@ -346,7 +326,6 @@ "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -934,12 +913,12 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", + "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", "dev": true, "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { @@ -947,9 +926,9 @@ } }, "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.15" @@ -1045,7 +1024,6 @@ "version": "3.8.2", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.2.tgz", "integrity": "sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==", - "peer": true, "dependencies": { "@swc/helpers": "^0.5.0" } @@ -1117,110 +1095,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "license": "ISC", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==", - "license": "ISC" - }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", - "license": "BSD-3-Clause", - "peerDependencies": { - "mapbox-gl": ">=0.32.1 <2.0.0" - } - }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", - "license": "ISC" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", - "license": "ISC", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", - "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", - "license": "ISC", - "dependencies": { - "@mapbox/jsonlint-lines-primitives": "~2.0.2", - "@mapbox/unitbezier": "^0.0.1", - "json-stringify-pretty-compact": "^4.0.0", - "minimist": "^1.2.8", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "tinyqueue": "^3.0.0" - }, - "bin": { - "gl-style-format": "dist/gl-style-format.mjs", - "gl-style-migrate": "dist/gl-style-migrate.mjs", - "gl-style-validate": "dist/gl-style-validate.mjs" - } - }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "license": "BSD-2-Clause" - }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "license": "ISC" - }, "node_modules/@pandacss/is-valid-prop": { "version": "0.54.0", "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-0.54.0.tgz", @@ -1236,92 +1110,6 @@ "node": ">=14" } }, - "node_modules/@plotly/d3": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.2.tgz", - "integrity": "sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA==", - "license": "BSD-3-Clause" - }, - "node_modules/@plotly/d3-sankey": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", - "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1", - "d3-collection": "1", - "d3-shape": "^1.2.0" - } - }, - "node_modules/@plotly/d3-sankey-circular": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", - "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", - "license": "MIT", - "dependencies": { - "d3-array": "^1.2.1", - "d3-collection": "^1.0.4", - "d3-shape": "^1.2.0", - "elementary-circuits-directed-graph": "^1.0.4" - } - }, - "node_modules/@plotly/mapbox-gl": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", - "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", - "license": "SEE LICENSE IN LICENSE.txt", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/@plotly/point-cluster": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", - "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "binary-search-bounds": "^2.0.4", - "clamp": "^1.0.1", - "defined": "^1.0.0", - "dtype": "^2.0.0", - "flatten-vertex-data": "^1.0.2", - "is-obj": "^1.0.1", - "math-log2": "^1.0.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0" - } - }, - "node_modules/@plotly/regl": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", - "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==", - "license": "MIT" - }, "node_modules/@react-leaflet/core": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", @@ -2047,97 +1835,11 @@ "vite": "^5.2.0 || ^6 || ^7" } }, - "node_modules/@turf/area": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.3.1.tgz", - "integrity": "sha512-9nSiwt4zB5QDMcSoTxF28WpK1f741MNKcpUJDiHVRX08CZ4qfGWGV9ZIPQ8TVEn5RE4LyYkFuQ47Z9pdEUZE9Q==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.3.1.tgz", - "integrity": "sha512-/IyMKoS7P9B0ch5PIlQ6gMfoE8gRr48+cSbzlyexvEjuDuaAV1VURjH1jAthS0ipFG8RrFxFJKnp7TLL1Skong==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/centroid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.3.1.tgz", - "integrity": "sha512-hRnsDdVBH4pX9mAjYympb2q5W8TCMUMNEjcRrAF7HTCyjIuRmjJf8vUtlzf7TTn9RXbsvPc1vtm3kLw20Jm8DQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-zkL34JVhi5XhsuMEO0MUTIIFEJ8yiW1InMu4hu/oRqamlY4mMoZql0viEmH6Dafh/p+zOl8OYvMJ3Vm3rFshgg==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/meta": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.3.1.tgz", - "integrity": "sha512-NWsfOE5RVtWpLQNkfOF/RrYvLRPwwruxhZUV0UFIzHqfiRJ50aO9Y6uLY4bwCUe2TumLJQSR4yaoA72Rmr2mnQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/geojson-vt": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", - "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2150,40 +1852,16 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/mapbox__point-geometry": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", - "license": "MIT" - }, - "node_modules/@types/mapbox__vector-tile": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", - "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/mapbox__point-geometry": "*", - "@types/pbf": "*" - } - }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, - "node_modules/@types/pbf": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", - "license": "MIT" - }, "node_modules/@types/react": { "version": "19.1.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "dev": true, - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -2197,15 +1875,6 @@ "@types/react": "^19.0.0" } }, - "node_modules/@types/supercluster": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", - "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.10.2", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.10.2.tgz", @@ -2986,18 +2655,11 @@ "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.18.2.tgz", "integrity": "sha512-tGrG2Qnm5qf95VJEBHunrEDHO0OJZGU81FoZU2VNC+YkRmD4C1phcvyxVLklDFT569rNxIHmFn/6gr9D7HmPrQ==" }, - "node_modules/abs-svg-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", - "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", - "license": "MIT" - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3069,42 +2731,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/array-bounds": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", - "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==", - "license": "MIT" - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-normalize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", - "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.0" - } - }, - "node_modules/array-range": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", - "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==", - "license": "MIT" - }, - "node_modules/array-rearrange": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", - "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==", - "license": "MIT" - }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -3125,43 +2751,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/binary-search-bounds": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", - "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", - "license": "MIT" - }, - "node_modules/bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==", - "license": "MIT" - }, - "node_modules/bitmap-sdf": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz", - "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==", - "license": "MIT" - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -3172,12 +2761,6 @@ "concat-map": "0.0.1" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3186,15 +2769,6 @@ "node": ">=6" } }, - "node_modules/canvas-fit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", - "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==", - "license": "MIT", - "dependencies": { - "element-size": "^1.1.1" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3219,12 +2793,6 @@ "node": ">=18" } }, - "node_modules/clamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", - "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==", - "license": "MIT" - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -3234,24 +2802,6 @@ "node": ">=6" } }, - "node_modules/color-alpha": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", - "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", - "license": "MIT", - "dependencies": { - "color-parse": "^1.3.8" - } - }, - "node_modules/color-alpha/node_modules/color-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", - "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3264,74 +2814,11 @@ "node": ">=7.0.0" } }, - "node_modules/color-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", - "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", - "license": "MIT", - "dependencies": { - "clamp": "^1.0.1" - } - }, "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==" - }, - "node_modules/color-normalize": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", - "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", - "license": "MIT", - "dependencies": { - "clamp": "^1.0.1", - "color-rgba": "^2.1.1", - "dtype": "^2.0.0" - } - }, - "node_modules/color-normalize/node_modules/color-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", - "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/color-normalize/node_modules/color-rgba": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz", - "integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==", - "license": "MIT", - "dependencies": { - "color-parse": "^1.4.2", - "color-space": "^2.0.0" - } - }, - "node_modules/color-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz", - "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/color-rgba": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", - "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", - "license": "MIT", - "dependencies": { - "color-parse": "^2.0.0", - "color-space": "^2.0.0" - } - }, - "node_modules/color-space": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.3.2.tgz", - "integrity": "sha512-BcKnbOEsOarCwyoLstcoEztwT0IJxqqQkNwDuA3a65sICvvHL2yoeV13psoDFh5IuiOMnIOKdQDwB4Mk3BypiA==", - "license": "Unlicense" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/commander": { "version": "4.1.1", @@ -3348,32 +2835,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -3397,12 +2863,6 @@ "node": ">= 6" } }, - "node_modules/country-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", - "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==", - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3417,222 +2877,11 @@ "node": ">= 8" } }, - "node_modules/css-font": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", - "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", - "license": "MIT", - "dependencies": { - "css-font-size-keywords": "^1.0.0", - "css-font-stretch-keywords": "^1.0.1", - "css-font-style-keywords": "^1.0.1", - "css-font-weight-keywords": "^1.0.0", - "css-global-keywords": "^1.0.1", - "css-system-font-keywords": "^1.0.0", - "pick-by-alias": "^1.2.0", - "string-split-by": "^1.0.0", - "unquote": "^1.1.0" - } - }, - "node_modules/css-font-size-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", - "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==", - "license": "MIT" - }, - "node_modules/css-font-stretch-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", - "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==", - "license": "MIT" - }, - "node_modules/css-font-style-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", - "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==", - "license": "MIT" - }, - "node_modules/css-font-weight-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", - "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==", - "license": "MIT" - }, - "node_modules/css-global-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", - "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==", - "license": "MIT" - }, - "node_modules/css-system-font-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", - "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==", - "license": "MIT" - }, - "node_modules/csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", - "license": "MIT" - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "ISC", - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/d3-geo-projection": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", - "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", - "license": "BSD-3-Clause", - "dependencies": { - "commander": "2", - "d3-array": "1", - "d3-geo": "^1.12.0", - "resolve": "^1.1.10" - }, - "bin": { - "geo2svg": "bin/geo2svg", - "geograticule": "bin/geograticule", - "geoproject": "bin/geoproject", - "geoquantize": "bin/geoquantize", - "geostitch": "bin/geostitch" - } - }, - "node_modules/d3-geo-projection/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==", - "license": "MIT" - }, - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "BSD-3-Clause", - "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==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "BSD-3-Clause", - "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==", - "license": "BSD-3-Clause" - }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -3655,21 +2904,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/detect-kerning": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", - "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==", - "license": "MIT" - }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -3678,85 +2912,18 @@ "node": ">=8" } }, - "node_modules/draw-svg-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", - "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", - "license": "MIT", - "dependencies": { - "abs-svg-path": "~0.1.1", - "normalize-svg-path": "~0.1.0" - } - }, - "node_modules/dtype": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", - "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/dup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", - "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==", - "license": "MIT" - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", - "license": "ISC" - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==", - "license": "MIT" - }, - "node_modules/elementary-circuits-directed-graph": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", - "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", - "license": "MIT", - "dependencies": { - "strongly-connected-components": "^1.0.1" - } - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.18.2", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", @@ -3777,58 +2944,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "node_modules/esbuild": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", @@ -3879,43 +2994,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { "version": "9.30.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", "dev": true, - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -4020,21 +3103,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -4052,19 +3120,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -4093,6 +3148,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -4101,63 +3157,11 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4170,15 +3174,6 @@ "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", "license": "MIT" }, - "node_modules/fast-isnumeric": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", - "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", - "license": "MIT", - "dependencies": { - "is-string-blank": "^1.0.1" - } - }, "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", @@ -4261,33 +3256,6 @@ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, - "node_modules/flatten-vertex-data": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", - "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", - "license": "MIT", - "dependencies": { - "dtype": "^2.0.0" - } - }, - "node_modules/font-atlas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", - "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", - "license": "MIT", - "dependencies": { - "css-font": "^1.0.0" - } - }, - "node_modules/font-measure": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", - "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", - "license": "MIT", - "dependencies": { - "css-font": "^1.2.0" - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -4330,16 +3298,6 @@ } } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -4361,86 +3319,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "license": "ISC" - }, - "node_modules/get-canvas-context": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", - "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==", - "license": "MIT" - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gl-mat4": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", - "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==", - "license": "Zlib" - }, - "node_modules/gl-matrix": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", - "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", - "license": "MIT" - }, - "node_modules/gl-text": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.4.0.tgz", - "integrity": "sha512-o47+XBqLCj1efmuNyCHt7/UEJmB9l66ql7pnobD6p+sgmBUdzfMZXIF0zD2+KRfpd99DJN+QXdvTFAGCKCVSmQ==", - "license": "MIT", - "dependencies": { - "bit-twiddle": "^1.0.2", - "color-normalize": "^1.5.0", - "css-font": "^1.2.0", - "detect-kerning": "^2.1.2", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "font-atlas": "^2.1.0", - "font-measure": "^1.2.2", - "gl-util": "^3.1.2", - "is-plain-obj": "^1.1.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "parse-unit": "^1.0.1", - "pick-by-alias": "^1.2.0", - "regl": "^2.0.0", - "to-px": "^1.0.1", - "typedarray-pool": "^1.1.0" - } - }, - "node_modules/gl-util": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", - "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", - "license": "MIT", - "dependencies": { - "is-browser": "^2.0.1", - "is-firefox": "^1.0.3", - "is-plain-obj": "^1.1.0", - "number-is-integer": "^1.0.1", - "object-assign": "^4.1.0", - "pick-by-alias": "^1.2.0", - "weak-map": "^1.0.5" - } - }, "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -4499,44 +3381,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/global-prefix": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", - "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", - "license": "MIT", - "dependencies": { - "ini": "^4.1.3", - "kind-of": "^6.0.3", - "which": "^4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, "node_modules/globals": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", @@ -4555,218 +3399,11 @@ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true }, - "node_modules/glsl-inject-defines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", - "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", - "license": "MIT", - "dependencies": { - "glsl-token-inject-block": "^1.0.0", - "glsl-token-string": "^1.0.1", - "glsl-tokenizer": "^2.0.2" - } - }, - "node_modules/glsl-resolve": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", - "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", - "license": "MIT", - "dependencies": { - "resolve": "^0.6.1", - "xtend": "^2.1.2" - } - }, - "node_modules/glsl-resolve/node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", - "license": "MIT" - }, - "node_modules/glsl-resolve/node_modules/xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/glsl-token-assignments": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", - "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==", - "license": "MIT" - }, - "node_modules/glsl-token-defines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", - "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", - "license": "MIT", - "dependencies": { - "glsl-tokenizer": "^2.0.0" - } - }, - "node_modules/glsl-token-depth": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", - "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==", - "license": "MIT" - }, - "node_modules/glsl-token-descope": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", - "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", - "license": "MIT", - "dependencies": { - "glsl-token-assignments": "^2.0.0", - "glsl-token-depth": "^1.1.0", - "glsl-token-properties": "^1.0.0", - "glsl-token-scope": "^1.1.0" - } - }, - "node_modules/glsl-token-inject-block": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", - "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==", - "license": "MIT" - }, - "node_modules/glsl-token-properties": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", - "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==", - "license": "MIT" - }, - "node_modules/glsl-token-scope": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", - "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==", - "license": "MIT" - }, - "node_modules/glsl-token-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", - "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==", - "license": "MIT" - }, - "node_modules/glsl-token-whitespace-trim": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", - "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==", - "license": "MIT" - }, - "node_modules/glsl-tokenizer": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", - "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", - "license": "MIT", - "dependencies": { - "through2": "^0.6.3" - } - }, - "node_modules/glsl-tokenizer/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/glsl-tokenizer/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/glsl-tokenizer/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/glsl-tokenizer/node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/glslify": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", - "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", - "license": "MIT", - "dependencies": { - "bl": "^2.2.1", - "concat-stream": "^1.5.2", - "duplexify": "^3.4.5", - "falafel": "^2.1.0", - "from2": "^2.3.0", - "glsl-resolve": "0.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glslify-bundle": "^5.0.0", - "glslify-deps": "^1.2.5", - "minimist": "^1.2.5", - "resolve": "^1.1.5", - "stack-trace": "0.0.9", - "static-eval": "^2.0.5", - "through2": "^2.0.1", - "xtend": "^4.0.0" - }, - "bin": { - "glslify": "bin.js" - } - }, - "node_modules/glslify-bundle": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", - "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", - "license": "MIT", - "dependencies": { - "glsl-inject-defines": "^1.0.1", - "glsl-token-defines": "^1.0.0", - "glsl-token-depth": "^1.1.1", - "glsl-token-descope": "^1.0.2", - "glsl-token-scope": "^1.1.1", - "glsl-token-string": "^1.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glsl-tokenizer": "^2.0.2", - "murmurhash-js": "^1.0.0", - "shallow-copy": "0.0.1" - } - }, - "node_modules/glslify-deps": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", - "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", - "license": "ISC", - "dependencies": { - "@choojs/findup": "^0.2.0", - "events": "^3.2.0", - "glsl-resolve": "0.0.1", - "glsl-tokenizer": "^2.0.0", - "graceful-fs": "^4.1.2", - "inherits": "^2.0.1", - "map-limit": "0.0.1", - "resolve": "^1.0.0" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/grid-index": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", - "license": "ISC" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4776,24 +3413,6 @@ "node": ">=8" } }, - "node_modules/has-hover": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", - "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==", - "license": "MIT", - "dependencies": { - "is-browser": "^2.0.1" - } - }, - "node_modules/has-passive-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", - "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", - "license": "MIT", - "dependencies": { - "is-browser": "^2.0.1" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -4813,38 +3432,6 @@ "react-is": "^16.7.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==", - "license": "MIT", - "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", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4878,32 +3465,11 @@ "node": ">=0.8.19" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, - "node_modules/is-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", - "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==", - "license": "MIT" - }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -4927,27 +3493,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-firefox": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", - "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "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", @@ -4969,57 +3514,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-iexplorer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", - "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-mobile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", - "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==", - "license": "MIT" - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string-blank": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", - "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==", - "license": "MIT" - }, - "node_modules/is-svg-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", - "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==", - "license": "MIT" - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5055,9 +3549,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -5100,12 +3594,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-pretty-compact": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", - "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", - "license": "MIT" - }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -5118,12 +3606,6 @@ "json5": "lib/cli.js" } }, - "node_modules/kdbush": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", - "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", - "license": "ISC" - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5133,21 +3615,11 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/leaflet": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/levn": { "version": "0.4.1", @@ -5402,7 +3874,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", @@ -5439,159 +3912,6 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/map-limit": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", - "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", - "license": "MIT", - "dependencies": { - "once": "~1.3.0" - } - }, - "node_modules/map-limit/node_modules/once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/mapbox-gl": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", - "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", - "license": "SEE LICENSE IN LICENSE.txt", - "peer": true, - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/maplibre-gl": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", - "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.6", - "@mapbox/unitbezier": "^0.0.1", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.3.1", - "@types/geojson": "^7946.0.14", - "@types/geojson-vt": "3.2.5", - "@types/mapbox__point-geometry": "^0.1.4", - "@types/mapbox__vector-tile": "^1.3.4", - "@types/pbf": "^3.0.5", - "@types/supercluster": "^7.1.3", - "earcut": "^3.0.0", - "geojson-vt": "^4.0.2", - "gl-matrix": "^3.4.3", - "global-prefix": "^4.0.0", - "kdbush": "^4.0.2", - "murmurhash-js": "^1.0.0", - "pbf": "^3.3.0", - "potpack": "^2.0.0", - "quickselect": "^3.0.0", - "supercluster": "^8.0.1", - "tinyqueue": "^3.0.0", - "vt-pbf": "^3.1.3" - }, - "engines": { - "node": ">=16.14.0", - "npm": ">=8.1.0" - }, - "funding": { - "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" - } - }, - "node_modules/maplibre-gl/node_modules/@mapbox/tiny-sdf": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", - "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", - "license": "BSD-2-Clause" - }, - "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "license": "BSD-2-Clause" - }, - "node_modules/maplibre-gl/node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/geojson-vt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/potpack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", - "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/quickselect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/supercluster": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", - "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", - "license": "ISC", - "dependencies": { - "kdbush": "^4.0.2" - } - }, - "node_modules/maplibre-gl/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "license": "ISC" - }, - "node_modules/math-log2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", - "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5608,6 +3928,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5658,49 +3979,11 @@ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.19.0.tgz", "integrity": "sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==" }, - "node_modules/mouse-change": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", - "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", - "license": "MIT", - "dependencies": { - "mouse-event": "^1.0.0" - } - }, - "node_modules/mouse-event": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", - "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==", - "license": "MIT" - }, - "node_modules/mouse-event-offset": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", - "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==", - "license": "MIT" - }, - "node_modules/mouse-wheel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", - "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", - "license": "MIT", - "dependencies": { - "right-now": "^1.0.0", - "signum": "^1.0.0", - "to-px": "^1.0.1" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", - "license": "MIT" - }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -5729,44 +4012,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/next-themes": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", @@ -5776,30 +4027,6 @@ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, - "node_modules/normalize-svg-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", - "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==", - "license": "MIT" - }, - "node_modules/number-is-integer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", - "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==", - "license": "MIT", - "dependencies": { - "is-finite": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5808,15 +4035,6 @@ "node": ">=0.10.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5881,12 +4099,6 @@ "node": ">=6" } }, - "node_modules/parenthesis": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", - "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==", - "license": "MIT" - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -5904,27 +4116,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-rect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", - "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", - "license": "MIT", - "dependencies": { - "pick-by-alias": "^1.2.0" - } - }, - "node_modules/parse-svg-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", - "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", - "license": "MIT" - }, - "node_modules/parse-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==", - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5972,36 +4163,11 @@ "node": ">=8" } }, - "node_modules/pbf": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", - "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, "node_modules/perfect-freehand": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.2.tgz", "integrity": "sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ==" }, - "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==", - "license": "MIT" - }, - "node_modules/pick-by-alias": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", - "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==", - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6011,7 +4177,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "peer": true, "engines": { "node": ">=12" }, @@ -6028,80 +4193,6 @@ "node": ">= 6" } }, - "node_modules/plotly.js": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-3.3.1.tgz", - "integrity": "sha512-SrGSZ02HvCWQIYsbQX4sgjgGo7k4T+Oz8a+RQwE5Caz+yu1vputBM1UThmiOPY51B5HzO9ajym8Rl4pmLj+i9Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "@plotly/d3": "3.8.2", - "@plotly/d3-sankey": "0.7.2", - "@plotly/d3-sankey-circular": "0.33.1", - "@plotly/mapbox-gl": "1.13.4", - "@plotly/regl": "^2.1.2", - "@turf/area": "^7.1.0", - "@turf/bbox": "^7.1.0", - "@turf/centroid": "^7.1.0", - "base64-arraybuffer": "^1.0.2", - "canvas-fit": "^1.5.0", - "color-alpha": "1.0.4", - "color-normalize": "1.5.0", - "color-parse": "2.0.0", - "color-rgba": "3.0.0", - "country-regex": "^1.1.0", - "d3-force": "^1.2.1", - "d3-format": "^1.4.5", - "d3-geo": "^1.12.1", - "d3-geo-projection": "^2.9.0", - "d3-hierarchy": "^1.1.9", - "d3-interpolate": "^3.0.1", - "d3-time": "^1.1.0", - "d3-time-format": "^2.2.3", - "fast-isnumeric": "^1.1.4", - "gl-mat4": "^1.2.0", - "gl-text": "^1.4.0", - "has-hover": "^1.0.1", - "has-passive-events": "^1.0.0", - "is-mobile": "^4.0.0", - "maplibre-gl": "^4.7.1", - "mouse-change": "^1.4.0", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.2.0", - "native-promise-only": "^0.8.1", - "parse-svg-path": "^0.1.2", - "point-in-polygon": "^1.1.0", - "polybooljs": "^1.2.2", - "probe-image-size": "^7.2.3", - "regl-error2d": "^2.0.12", - "regl-line2d": "^3.1.3", - "regl-scatter2d": "^3.3.1", - "regl-splom": "^1.0.14", - "strongly-connected-components": "^1.0.1", - "superscript-text": "^1.0.0", - "svg-path-sdf": "^1.1.3", - "tinycolor2": "^1.4.2", - "to-px": "1.0.1", - "topojson-client": "^3.1.0", - "webgl-context": "^2.2.0", - "world-calendars": "^1.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/point-in-polygon": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", - "license": "MIT" - }, - "node_modules/polybooljs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.2.tgz", - "integrity": "sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==", - "license": "MIT" - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -6129,12 +4220,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "license": "ISC" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6144,23 +4229,6 @@ "node": ">= 0.8.0" } }, - "node_modules/probe-image-size": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", - "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", - "license": "MIT", - "dependencies": { - "lodash.merge": "^4.6.2", - "needle": "^2.5.2", - "stream-parser": "~0.3.1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6172,12 +4240,6 @@ "react-is": "^16.13.1" } }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", - "license": "MIT" - }, "node_modules/proxy-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", @@ -6200,26 +4262,10 @@ "node": ">=6" } }, - "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", - "license": "ISC" - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", - "dependencies": { - "performance-now": "^2.1.0" - } - }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6228,7 +4274,6 @@ "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -6312,19 +4357,6 @@ "react-dom": "^19.0.0" } }, - "node_modules/react-plotly.js": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", - "integrity": "sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "plotly.js": ">1.34.0", - "react": ">0.13.0" - } - }, "node_modules/react-resizable": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz", @@ -6338,33 +4370,6 @@ "react": ">= 16.3" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/recrawl-sync": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recrawl-sync/-/recrawl-sync-2.2.3.tgz", @@ -6384,104 +4389,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/regl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.1.tgz", - "integrity": "sha512-+IOGrxl3FZ8ZM9ixCWQZzFRiRn7Rzn9bu3iFHwg/yz4tlOUQgbO4PHLgG+1ZT60zcIV8tief6Qrmyl8qcoJP0g==", - "license": "MIT" - }, - "node_modules/regl-error2d": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", - "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "color-normalize": "^1.5.0", - "flatten-vertex-data": "^1.0.2", - "object-assign": "^4.1.1", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0", - "update-diff": "^1.1.0" - } - }, - "node_modules/regl-line2d": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.3.tgz", - "integrity": "sha512-fkgzW+tTn4QUQLpFKsUIE0sgWdCmXAM3ctXcCgoGBZTSX5FE2A0M7aynz7nrZT5baaftLrk9te54B+MEq4QcSA==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "array-find-index": "^1.0.2", - "array-normalize": "^1.1.4", - "color-normalize": "^1.5.0", - "earcut": "^2.1.5", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0" - } - }, - "node_modules/regl-scatter2d": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz", - "integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==", - "license": "MIT", - "dependencies": { - "@plotly/point-cluster": "^3.1.9", - "array-range": "^1.0.1", - "array-rearrange": "^2.2.2", - "clamp": "^1.0.1", - "color-id": "^1.1.0", - "color-normalize": "^1.5.0", - "color-rgba": "^2.1.1", - "flatten-vertex-data": "^1.0.2", - "glslify": "^7.0.0", - "is-iexplorer": "^1.0.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0", - "update-diff": "^1.1.0" - } - }, - "node_modules/regl-scatter2d/node_modules/color-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", - "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/regl-scatter2d/node_modules/color-rgba": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz", - "integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==", - "license": "MIT", - "dependencies": { - "color-parse": "^1.4.2", - "color-space": "^2.0.0" - } - }, - "node_modules/regl-splom": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", - "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "array-range": "^1.0.1", - "color-alpha": "^1.0.4", - "flatten-vertex-data": "^1.0.2", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "raf": "^3.4.1", - "regl-scatter2d": "^3.2.3" - } - }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -6515,21 +4422,6 @@ "node": ">=4" } }, - "node_modules/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "license": "MIT", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "node_modules/right-now": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", - "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==", - "license": "MIT" - }, "node_modules/rollup": { "version": "4.44.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", @@ -6568,55 +4460,11 @@ "fsevents": "~2.3.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", - "license": "BlueOak-1.0.0" - }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6650,12 +4498,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", - "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==", - "license": "MIT" - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6681,77 +4523,6 @@ "node": ">=0.10.0" } }, - "node_modules/stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", - "engines": { - "node": "*" - } - }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "node_modules/stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", - "license": "MIT", - "dependencies": { - "debug": "2" - } - }, - "node_modules/stream-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/stream-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/string-split-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", - "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", - "license": "MIT", - "dependencies": { - "parenthesis": "^3.1.5" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -6869,12 +4640,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strongly-connected-components": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", - "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==", - "license": "MIT" - }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -6902,27 +4667,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", - "license": "ISC", - "dependencies": { - "kdbush": "^3.0.0" - } - }, - "node_modules/supercluster/node_modules/kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", - "license": "ISC" - }, - "node_modules/superscript-text": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", - "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==", - "license": "MIT" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6946,46 +4690,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-arc-to-cubic-bezier": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", - "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", - "license": "ISC" - }, - "node_modules/svg-path-bounds": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", - "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", - "license": "MIT", - "dependencies": { - "abs-svg-path": "^0.1.1", - "is-svg-path": "^1.0.1", - "normalize-svg-path": "^1.0.0", - "parse-svg-path": "^0.1.2" - } - }, - "node_modules/svg-path-bounds/node_modules/normalize-svg-path": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", - "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", - "license": "MIT", - "dependencies": { - "svg-arc-to-cubic-bezier": "^3.0.0" - } - }, - "node_modules/svg-path-sdf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", - "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", - "license": "MIT", - "dependencies": { - "bitmap-sdf": "^1.0.0", - "draw-svg-path": "^1.0.0", - "is-svg-path": "^1.0.1", - "parse-svg-path": "^0.1.2", - "svg-path-bounds": "^1.0.1" - } - }, "node_modules/tailwindcss": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", @@ -7036,22 +4740,6 @@ "node": ">=0.8" } }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "license": "MIT" - }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -7067,47 +4755,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", - "license": "ISC" - }, - "node_modules/to-float32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", - "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==", - "license": "MIT" - }, - "node_modules/to-px": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", - "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==", - "license": "MIT", - "dependencies": { - "parse-unit": "^1.0.1" - } - }, - "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==", - "license": "ISC", - "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==", - "license": "MIT" - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -7131,12 +4778,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7149,34 +4790,6 @@ "node": ">= 0.8.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typedarray-pool": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", - "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", - "license": "MIT", - "dependencies": { - "bit-twiddle": "^1.0.0", - "dup": "^1.0.0" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "license": "MIT" - }, - "node_modules/update-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", - "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==", - "license": "MIT" - }, "node_modules/uqr": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", @@ -7191,12 +4804,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", @@ -7211,10 +4818,9 @@ } }, "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", - "peer": true, + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -7299,32 +4905,6 @@ "vite": ">2.0.0-0" } }, - "node_modules/vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "license": "MIT", - "dependencies": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" - } - }, - "node_modules/weak-map": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", - "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==", - "license": "Apache-2.0" - }, - "node_modules/webgl-context": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", - "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==", - "license": "MIT", - "dependencies": { - "get-canvas-context": "^1.0.1" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7349,15 +4929,6 @@ "node": ">=0.10.0" } }, - "node_modules/world-calendars": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.4.tgz", - "integrity": "sha512-VGRnLJS+xJmGDPodgJRnGIDwGu0s+Cr9V2HB3EzlDZ5n0qb8h5SJtGUEkjrphZYAglEiXZ6kiXdmk0H/h/uu/w==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0" - } - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -7446,21 +5017,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", @@ -7469,6 +5025,19 @@ "node": ">=18" } }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/client/package.json b/client/package.json index 024c603..5185486 100644 --- a/client/package.json +++ b/client/package.json @@ -18,14 +18,12 @@ "leaflet": "^1.9.4", "lucide-react": "^0.539.0", "next-themes": "^0.4.6", - "plotly.js": "^3.3.1", "react": "^19.1.0", "react-dom": "^19.1.0", "react-grid-layout": "^1.5.2", "react-hook-form": "^7.62.0", "react-icons": "^5.5.0", "react-leaflet": "^5.0.0", - "react-plotly.js": "^2.6.0", "react-resizable": "^3.0.5", "tailwindcss": "^4.1.11", "uuid": "^11.1.0" diff --git a/client/public/images/NVIS_Logo_Black.png b/client/public/images/NVIS_Logo_Black.png deleted file mode 100644 index c420ba7..0000000 Binary files a/client/public/images/NVIS_Logo_Black.png and /dev/null differ diff --git a/client/public/images/NVIS_Logo_transparent.png b/client/public/images/NVIS_Logo_transparent.png deleted file mode 100644 index 6cf1345..0000000 Binary files a/client/public/images/NVIS_Logo_transparent.png and /dev/null differ diff --git a/client/src/components/Canvas/CanvasComponents/AlertLevelWidget.jsx b/client/src/components/Canvas/CanvasComponents/AlertLevelWidget.jsx index 728e785..4f7fd2c 100644 --- a/client/src/components/Canvas/CanvasComponents/AlertLevelWidget.jsx +++ b/client/src/components/Canvas/CanvasComponents/AlertLevelWidget.jsx @@ -1,14 +1,11 @@ import Widget from "./Widget"; -import { Stack, Box, Field, Input, Button, ButtonGroup, Text, Flex } from "@chakra-ui/react"; +import { Stack, Box, Field, Input, Button, Text, Flex } from "@chakra-ui/react"; import { useForm } from "react-hook-form"; import { useState } from "react"; import { LuAsterisk } from "react-icons/lu"; -import { CancelButton } from "./CancelButton.jsx"; - export default function AlertLevel({id, isEditable, isDelete, DeleteWidget}) { const { register, handleSubmit, reset, formState: {errors} } = useForm(); - const onSubmit = (data) => { console.log("data: ", data); if (data.volcanoname === '') { @@ -17,10 +14,6 @@ export default function AlertLevel({id, isEditable, isDelete, DeleteWidget}) { setIsSubmit(true); reset(); } - const onCancel = () => { - reset(); - setIsSubmit(false); - } const [isSubmit, setIsSubmit] = useState(false); // Prop Forwarding @@ -39,7 +32,7 @@ export default function AlertLevel({id, isEditable, isDelete, DeleteWidget}) { pr={3} display="flex" flexDir="column" - gap={12} + gap="10" > @@ -63,12 +56,7 @@ export default function AlertLevel({id, isEditable, isDelete, DeleteWidget}) { - - - - - - + ):( // DISPLAYING ALERT LEVEL DATA diff --git a/client/src/components/Canvas/CanvasComponents/CancelButton.jsx b/client/src/components/Canvas/CanvasComponents/CancelButton.jsx index 93ff729..28b68a7 100644 --- a/client/src/components/Canvas/CanvasComponents/CancelButton.jsx +++ b/client/src/components/Canvas/CanvasComponents/CancelButton.jsx @@ -2,6 +2,6 @@ import { Button } from "@chakra-ui/react"; export function CancelButton ({onCancel}) { return ( - + ) } \ No newline at end of file diff --git a/client/src/components/Canvas/CanvasComponents/DialogPopup.jsx b/client/src/components/Canvas/CanvasComponents/DialogPopup.jsx index abad4e2..9957dc9 100644 --- a/client/src/components/Canvas/CanvasComponents/DialogPopup.jsx +++ b/client/src/components/Canvas/CanvasComponents/DialogPopup.jsx @@ -1,7 +1,7 @@ import { Dialog, Portal, CloseButton, Button } from "@chakra-ui/react"; export default function DialogPopup({dialog}) { - //console.log("3. dialog popup") + console.log("3. dialog popup") return( diff --git a/client/src/components/Canvas/CanvasComponents/FirstWidgetButton.jsx b/client/src/components/Canvas/CanvasComponents/FirstWidgetButton.jsx index 0dfa2fc..83c7c9e 100644 --- a/client/src/components/Canvas/CanvasComponents/FirstWidgetButton.jsx +++ b/client/src/components/Canvas/CanvasComponents/FirstWidgetButton.jsx @@ -1,7 +1,7 @@ import { Box, Menu, Portal } from '@chakra-ui/react' import WidgetMenu from './WidgetMenu'; -export default function FirstWidgetButton({ view, appendWidget }) { +export default function FirstWidgetButton({ appendWidget }) { const triggerItem = (<> ); const positioning = { placement: "bottom-middle" }; - const WidgetMenuProps = { view, appendWidget, triggerItem, positioning }; + const WidgetMenuProps = { appendWidget, triggerItem, positioning }; return ( ); diff --git a/client/src/components/Canvas/CanvasComponents/GasFilter.jsx b/client/src/components/Canvas/CanvasComponents/GasFilter.jsx deleted file mode 100644 index 1001673..0000000 --- a/client/src/components/Canvas/CanvasComponents/GasFilter.jsx +++ /dev/null @@ -1,232 +0,0 @@ -import { useEffect, useMemo, useState } from "react"; -import { - Box, Button, Checkbox, CheckboxGroup, Field, HStack, - Input, Spinner, Stack, Text } -from "@chakra-ui/react"; - -// DEBUG -console.log({ - Field, - Checkbox, - CheckboxGroup, -}); - -async function fetchJson(url, { signal } = {}) { - const res = await fetch(url, { signal }); - if (!res.ok) { - const body = await res.text().catch(() => ""); - throw new Error(`HTTP ${res.status}: ${body || res.statusText}`); - } - return res.json(); -} - -function buildGasQuery(filters) { - const params = new URLSearchParams(); - - // Multi-select fields ~ Add more once working - for (const v of filters.volcanoname ?? []) params.append("volcanoname", v); - for (const c of filters.compoundname ?? []) params.append("compoundname", c); - for (const s of filters.sitename ?? []) params.append("sitename", s); - - if (filters.date_from) params.set("date_from", filters.date_from); - if (filters.date_to) params.set("date_to", filters.date_to); - - return params.toString(); -} - -/** - * Filters a list of values using a case-insensitive substring search. - * - * If `searchText` is empty, null, or undefined, the original list is returned. - * The function is defensive against null/undefined inputs and will never throw. - * - * @param {Array | null | undefined} list - * The list of items to filter. Items are converted to strings before - * comparison. If null or undefined, an empty array is returned. - * - * @param {string | null | undefined} searchText - * The text to search for within each list item. Leading/trailing whitespace - * is ignored and matching is case-insensitive. - */ -function filterList(list, searchText) { - const q = (searchText ?? "").trim().toLowerCase(); - if (!q) return list ?? []; - - return (list ?? []).filter((x) => String(x).toLowerCase().includes(q)); -} - -export default function GasFilter({ apiBase, onChange }) { - const [options, setOptions] = useState(null); - const [err, setErr] = useState(null); - const [loading, setLoading] = useState(true); - - // filter state - const [filters, setFilters] = useState({ - volcanoname: [], - compoundname: [], - sitename: [], - date_from: "", - date_to: "", - }); - - // local search inputs - const [volcanoSearch, setVolcanoSearch] = useState(""); - const [compoundSearch, setCompoundSearch] = useState(""); - - useEffect(() => { - const ac = new AbortController(); - setLoading(true); - setErr(null); - - // TODO - Add options end point to populate dropdowns - fetchJson(`${apiBase}/options`, { signal: ac.signal }) - .then(setOptions) - .catch((e) => e.name !== "AbortError" && setErr(e)) - .finally(() => setLoading(false)); - - return () => ac.abort(); - }, [apiBase]); - - // Emit query string whenever filters change - useEffect(() => { - const qs = buildGasQuery(filters); - onChange?.(qs, filters); - }, [filters, onChange]); - - const volcanoList = useMemo( - () => filterList(options?.volcanoname, volcanoSearch), - [options, volcanoSearch] - ); - - const compoundList = useMemo( - () => filterList(options?.compoundname, compoundSearch), - [options, compoundSearch] - ); - - if (loading) { - return ( - - - Loading Filters - - ); - } - - if (err) { - return ( - - Couldn't load filter options - - {String(err.message ?? err)} - - - ); - } - - return ( - - - Gas Filters - - - - - {/*Volcano multi-select*/} - - Volcano - setVolcanoSearch(e.target.value)} - mb={2} - /> - - setFilters((f) => ({ ...f, volcanoname: vals })) - } - > - - {volcanoList.map((v) => ( - - {v} - - ))} - - - - - {/* Compound multi-select */} - - Compound - setCompoundSearch(e.target.value)} - mb={2} - /> - - setFilters((f) => ({...f, compoundname: vals})) - } - > - - {compoundList.map((c) => ( - - {c} - - ))} - - - - - {/* Date Range */} - - - From - - setFilters((f) => ({...f, date_from: e.target.value })) - } - /> - - - To - - setFilters((f) => ({...f, date_to: e.target.value })) - } - /> - - - - - ); -} \ No newline at end of file diff --git a/client/src/components/Canvas/CanvasComponents/GasWidget.jsx b/client/src/components/Canvas/CanvasComponents/GasWidget.jsx deleted file mode 100644 index e1ed1f7..0000000 --- a/client/src/components/Canvas/CanvasComponents/GasWidget.jsx +++ /dev/null @@ -1,264 +0,0 @@ -/** - * Gas Measurements Widget - * - * Renders a Plotly time-series chart of gas measurement values returned from the API. - * Fetches rows from the backend, normalizes them into plottable points, groups points by compound, - * and displays one trace per compound. - */ -import { useEffect, useMemo, useState } from "react"; -import Plot from "react-plotly.js"; -import { Box, Center, Spinner, Text } from "@chakra-ui/react"; -import Widget from "./Widget"; -// import GasFilter from "./GasFilter"; - -const API_BASE = "http://localhost:8000"; // Possibly import.meta.env.VITE_API_BASE_URL - -/** - * Fetches JSON from a URL and throws a helpful error if the response is not OK. - * - * @param {string} url URL to request - * @param {object} [options] Optional options object - * @param {AbortSignal} [options.signal] Abort signal used to cancel the request - * @returns {Promise} Parsed JSON response body - * @throws {Error} If the HTTP response is not OK (non-2xx) - */ -async function fetchJson(url, { signal } = {}) { - const res = await fetch(url, { signal }); - if (!res.ok) { - const body = await res.text().catch(() => ""); - throw new Error(`HTTP ${res.status}: ${body || res.statusText}`); - } - return res.json(); -} - -/** - * Safely converts an input value into a finite number; otherwise returns null. - * Useful for filtering out non-numeric measurement values before plotting. - * - * @param {any} value Input value to check/convert - * @param {any} [rawvalue] Optional original/raw value (currently unused) - * @returns {number|null} Finite numeric value, or null if invalid - */ -function toNumberOrNull(value, rawvalue) { - if (typeof value === "number" && Number.isFinite(value)) - return value; - else - return null; -} - -/** - * Groups an array of items into a Map based on the provided key function. - * - * @template T - * @param {T[]} arr Array of items to group - * @param {(item: T) => any} keyFn Function that returns the grouping key for an item - * @returns {Map} Map from key -> array of items for that key - */ -function groupBy(arr, keyFn) { - const m = new Map(); - for (const item of arr) { - const k = keyFn(item); - if (!m.has(k)) m.set(k, []); - m.get(k).push(item); - } - return m; -} - -/** - * Normalizes raw API rows into Plotly-friendly point objects. - * Filters out rows missing a valid numeric value or sample date, and sorts by date ascending. - * - * @param {Array} rows Raw rows returned by the API - * @returns {Array} Normalized points with x/y and helpful metadata for hover tooltips - */ -function normalizeRowsToPoints(rows) { - const points = []; - for (const r of rows ?? []) { - const y = toNumberOrNull(r.value); - if (y === null) continue; - if (!r.sampledate) continue; - - points.push({ - x: r.sampledate, - y, - compound: r.compoundname ?? "unknown", - volcanoname: r.volcanoname ?? "", - sitename: r.sitename ?? "", - meta: r, - }); - } - points.sort((a, b) => (a.x < b.x ? -1 : a.x > b.x ? 1 : 0)); - return points; -} - -/** - * GasWidget React component. - * - * Fetches gas measurement rows from the backend and renders a multi-trace Plotly time series. - * Each trace represents a different compound (e.g., SO2, CO2), drawn as lines+markers. - * - * @param {object} props Component props - * @param {string} props.id Widget instance id (used by the Widget wrapper) - * @param {boolean} props.isEditable Whether the dashboard is in edit mode - * @param {boolean} props.isDelete Whether the dashboard is in delete mode - * @param {(id: string) => void} props.DeleteWidget Callback to delete this widget - * @returns {JSX.Element} Rendered widget UI - */ -export default function GasWidget({ id, config, isEditable, isDelete, DeleteWidget }) { - const [rows, setRows] = useState([]); - const [error, setError] = useState(null); - const [isLoading, setIsLoading] = useState(true); - - const volcano = config?.volcano_name ?? null; - const site = config?.site_name ?? null; - const compounds = Array.isArray(config?.compound_name) ? config.compound_name: []; - const start_date = config?.start_date ?? null; - const end_date = config?.end_date ?? null; - - const compoundsKey = useMemo(() => compounds.slice().sort().join("|"), [compounds]); - - const endpoint = useMemo(() => { - const params = new URLSearchParams(); - params.set("include_measurements", "true"); - params.set("include_personnel", "false"); - - // Supported /search filters - if (volcano) params.set("volcano_name", volcano); - if (site) params.set("site_name", site); - for (const c of compounds) params.append("compound_name", c); - if (start_date) params.set("start_date", start_date); - if (end_date) params.set("end_date", end_date); - - return `${API_BASE}/search/?${params.toString()}`; - }, [volcano, site, compoundsKey, start_date, end_date]); - - // DEBUG - useEffect(() => { - console.log("[GasWidget] endpoint:", endpoint) - }, [endpoint]); - - useEffect(() => { - console.log("[GasWidget] volcano_name:", volcano); - }, [volcano]); - - /** - * Fetch rows on mount (and when the endpoint changes). - * Uses AbortController to cancel in-flight requests on unmount or dependency change. - */ - useEffect(() => { - const ac = new AbortController(); - setIsLoading(true); - setError(null); - - fetchJson(endpoint, { signal: ac.signal }) - .then(setRows) - .catch((e) => e.name !== "AbortError" && setError(e)) - .finally(() => setIsLoading(false)); - - return () => ac.abort(); - }, [endpoint]); - - /** - * Normalized point data derived from raw rows. - * Memoized to avoid recomputation unless rows change. - */ - const points = useMemo(() => normalizeRowsToPoints(rows), [rows]); - - /** - * Plotly trace data (one trace per compound). - * Groups points by compound name and creates a scatter trace with lines+markers. - */ - const plotData = useMemo(() => { - const byCompound = groupBy(points, (p) => p.compound); - const traces = []; - - for (const [compound, pts] of byCompound.entries()) { - traces.push({ - x: pts.map((p) => p.x), - y: pts.map((p) => p.y), - name: compound, - type: "scatter", - mode: "lines+markers", - text: pts.map((p) => `${p.volcanoname} - ${p.sitename}`), - hovertemplate: - "Date: %{x}
Value: %{y}
%{text}" + compound + "", - }); - } - - traces.sort((a, b) => a.name.localeCompare(b.name)); - return traces; - }, [points]); - - /** - * Plotly layout configuration for axis, margins, and legend placement. - * Memoized once since it is static. - */ - const layout = useMemo( - () => ({ - // title: { text: "Gas Measurements" }, // This is redundant - autosize: true, - margin: { l: 55, r: 20, t: 20, b: 30 }, - xaxis: { title: "Sample Date", type: "date" }, - yaxis: { title: "Value" }, - legend: { - orientation: "h", - x: 0, - y: -0.25, // push legend below plot area - xanchor: "left", - yanchor: "top", - font: { size: 10 }, - itemwidth: 80, // helps wrap/pack items tighter - }, - }), - [] - ); - - return ( - - - {/* setQueryString(qs)} - /> */} - - {isLoading && ( -
- -
- )} - - {!isLoading && error && ( -
- Couldn't load data - - {String(error.message ?? error)} - -
- )} - - {!isLoading && !error && points.length === 0 && ( -
- No numeric values found -
- )} - - {!isLoading && !error && points.length > 0 && ( - - - - )} -
-
- ); -} \ No newline at end of file diff --git a/client/src/components/Canvas/CanvasComponents/MapButtonControls.jsx b/client/src/components/Canvas/CanvasComponents/MapButtonControls.jsx index 0446a58..5bcab69 100644 --- a/client/src/components/Canvas/CanvasComponents/MapButtonControls.jsx +++ b/client/src/components/Canvas/CanvasComponents/MapButtonControls.jsx @@ -38,7 +38,7 @@ export default function MapButtonControls({settingsBtn, position = "topright"}) return () => { control.remove(); }; - }, [map, position]); + }, [map, position, settingsBtn ]); return container ? createPortal( settingsBtn, diff --git a/client/src/components/Canvas/CanvasComponents/MapFilter.jsx b/client/src/components/Canvas/CanvasComponents/MapFilter.jsx deleted file mode 100644 index 6aacb46..0000000 --- a/client/src/components/Canvas/CanvasComponents/MapFilter.jsx +++ /dev/null @@ -1,130 +0,0 @@ -import { Box, Checkbox, CheckboxGroup, Separator , chakra, CloseButton, Text, IconButton, Accordion, RadioGroup, } from "@chakra-ui/react"; -import { useState } from "react"; -import { CiFilter } from "react-icons/ci"; - -function GenerateFilters ({config, selected, setFilterValue, toggleInArray}){ - return ( - - {config.map((f) => { - if (f.type === "checkbox") { - const current = Array.isArray(selected?.[f.id]) ? selected[f.id] : []; - - return ( - - - - - {f.label} - {current.length ? ` (${current.length})` : ""} - - - - - - {f.options.map((opt) => { - const checked = current.includes(opt.value); - - return ( - toggleInArray(f.id, opt.value)} - > - - - {opt.label} - - ); - })} - - - - ); - } - if (f.type === "radio") { - const current = selected?.[f.id] ?? ""; - - return ( - - - - - {f.label} - {current ? ` (${current})` : ""} - - - - - - setFilterValue(f.id, details.value)} - > - - {f.options.map((opt) => ( - - - - {opt.label} - - ))} - - - - - - ); - } - - return null; - })} - - ); - -} - -function Header(props) { - const { setOpen } = props; - return ( - - Filters - setOpen(false)}/> - - ); -} - - -export default function MapFilter({config, selected, setFilterValue, toggleInArray}) { - const [open, setOpen] = useState(false); - - return open ? ( - -
- - - - ) : ( - setOpen(true)} - > - - - ); - -} \ No newline at end of file diff --git a/client/src/components/Canvas/CanvasComponents/MapLegend.jsx b/client/src/components/Canvas/CanvasComponents/MapLegend.jsx deleted file mode 100644 index 321d1df..0000000 --- a/client/src/components/Canvas/CanvasComponents/MapLegend.jsx +++ /dev/null @@ -1,49 +0,0 @@ - -import {Menu, MenuTrigger, MenuContent, MenuPositioner, Portal, chakra, Text, CloseButton, Box, Separator} from "@chakra-ui/react"; -import { IconButton } from "@chakra-ui/react"; -import {useState} from "react"; -import { IoIosInformationCircleOutline } from "react-icons/io"; - - -function Header(props) { - const { setOpen } = props; - return ( - - Legend - setOpen(false)}/> - - ); -} - - -export default function MapLegend({legend}) { - const [open, setOpen] = useState(false); - - return open ? ( - -
- {legend} - - - - ) : ( - setOpen(true)} - > - - - ); - -} \ No newline at end of file diff --git a/client/src/components/Canvas/CanvasComponents/MapSettingsButton.jsx b/client/src/components/Canvas/CanvasComponents/MapSettingsButton.jsx index ef0d6fa..0011f88 100644 --- a/client/src/components/Canvas/CanvasComponents/MapSettingsButton.jsx +++ b/client/src/components/Canvas/CanvasComponents/MapSettingsButton.jsx @@ -1,4 +1,4 @@ -import { Box, Checkbox, Separator , CloseButton, Text, Field, chakra, IconButton, Icon, Input, Fieldset, Flex } from "@chakra-ui/react"; +import { Box, Checkbox, Separator , CloseButton, Text, chakra, Field, IconButton, Icon, Input, Fieldset, Flex } from "@chakra-ui/react"; import { useState } from "react"; import { FiSettings } from "react-icons/fi"; import { IoIosArrowDown } from "react-icons/io"; diff --git a/client/src/components/Canvas/CanvasComponents/PlaceholderWidget.jsx b/client/src/components/Canvas/CanvasComponents/PlaceholderWidget.jsx deleted file mode 100644 index 99d985e..0000000 --- a/client/src/components/Canvas/CanvasComponents/PlaceholderWidget.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import Widget from "src/components/Canvas/CanvasComponents/Widget.jsx"; -import { Box, Text } from "@chakra-ui/react"; - -export default function PlaceholderWidget({ - title = "Widget", - id, - isEditable, - isDelete, - DeleteWidget -}) { return ( - - - - {title} widget coming soon - - - - ); -} diff --git a/client/src/components/Canvas/CanvasComponents/SettingsButton.jsx b/client/src/components/Canvas/CanvasComponents/SettingsButton.jsx index 236fabf..dca8273 100644 --- a/client/src/components/Canvas/CanvasComponents/SettingsButton.jsx +++ b/client/src/components/Canvas/CanvasComponents/SettingsButton.jsx @@ -3,16 +3,9 @@ import { IoIosArrowBack } from "react-icons/io"; import { FiSettings } from "react-icons/fi"; import WidgetMenu from "./WidgetMenu"; -export function SettingsButton({ view, onEditWidgets, appendWidget}) { - const triggerItem = ( - <> - - Add Widget - - ); - - const WidgetMenuProps = { view, appendWidget, triggerItem } - +export function SettingsButton({ onEditWidgets, appendWidget}) { + const triggerItem = (<> Add Widget ); + const WidgetMenuProps = { appendWidget, triggerItem } return ( @@ -20,12 +13,11 @@ export function SettingsButton({ view, onEditWidgets, appendWidget}) { - - + Edit Widgets diff --git a/client/src/components/Canvas/CanvasComponents/WidgetInspector.jsx b/client/src/components/Canvas/CanvasComponents/WidgetInspector.jsx deleted file mode 100644 index 9d61c48..0000000 --- a/client/src/components/Canvas/CanvasComponents/WidgetInspector.jsx +++ /dev/null @@ -1,529 +0,0 @@ -import { - Box, - CloseButton, - Text, - Input, - Button, - Stack, - HStack, - Select, - RadioGroup, - Checkbox, - CheckboxGroup, - Code, - Field, - Fieldset, - createListCollection, -} from "@chakra-ui/react"; -import { useEffect, useMemo, useState } from "react"; -import { WIDGET_INSPECTOR_REGISTRY } from "@/constants/widgetInspectorRegistry"; - -const API_BASE = "http://localhost:8000"; - -async function fetchJson(url, { signal } = {}) { - const res = await fetch(url, { signal }); - if (!res.ok) { - const body = await res.text().catch(() => ""); - throw new Error(`HTTP ${res.status}: ${body || res.statusText}`); - } - return res.json(); -} - -function getByPath(obj, path) { - if (!obj || !path) return undefined; - return path.split(".").reduce((acc, k) => (acc == null ? acc : acc[k]), obj); -} - -function buildQueryString(draft) { - const params = new URLSearchParams(); - for (const [key, value] of Object.entries(draft)) { - if (value == null) continue; - // array (checkbox group) - if (Array.isArray(value)) { - if (value.length === 0) continue; - value.forEach(v => params.append(key, v)); - continue; - } - // scalar - if (value === "") continue; - params.append(key, value); - } - return params.toString(); -} - -export default function WidgetInspector({ - open, - onClose, - target, - widgetArray, - updateWidgetConfig -}) { - if (!open || !target) return null; - - const { id, widgetKey } = target; - const widget = widgetArray.find(w => w.i === id); - const def = WIDGET_INSPECTOR_REGISTRY[widgetKey]; - - if (!widget || !def) return null; - - // current saved config - const cfg = widget.config ?? {}; - - // local draft config (only applied on Submit) - const initialDraft = useMemo(() => { - const base = def?.defaultConfig ?? {}; - return {...base, ...cfg,}; - }, [def, cfg]); - - const [draft, setDraft] = useState(initialDraft); - - // reset draft when switching widgets or repoening - useEffect(() => setDraft(initialDraft), [initialDraft]); - - // source payloads (e.g. { options: { volcanoname:[], ... } }) - // const [options, setOptions] = useState({ - // volcanoname: [], - // compoundname: [], - // sitename: [], - // date_min: null, - // date_max: null, - // }); - - const [sources, setSources] = useState({}); - const [optError, setOptError] = useState(null); - const [optLoading, setOptLoading] = useState(false); - - useEffect(() => { - if (!open) return; - const ac = new AbortController(); - - const srcDefs = def.optionSources ?? {}; - const entries = Object.entries(srcDefs); - - if (entries.length === 0) { - setSources({}); - setOptLoading(false); - setOptError(null); - return; - } - - setOptLoading(true); - setOptError(null); - - Promise.all( - entries.map(async ([name, src]) => { - const url = - typeof src.url === "function" - ? src.url({ draft }) - : src.url; - - // DEBUG - console.log("Fetching options source:", name, `${API_BASE}${url}`) - - const data = await fetchJson(`${API_BASE}${url}`, { signal: ac.signal }); - return [name, data]; - }) - ) - .then((pairs) => setSources(Object.fromEntries(pairs))) - .catch((e) => e.name !== "AbortError" && setOptError(e)) - .finally(() => setOptLoading(false)); - - return () => ac.abort(); - }, [open, def, draft?.volcano_name]); - - // DEBUG - useEffect(() => { - if (open) console.log("sources", sources); - }, [open, sources]); - - const patchDraft = (partial) => setDraft((d) => ({ ...d, ...partial })); - - const validationError = useMemo(() => { - for (const f of def.fields ?? []) { - if (typeof f.validate === "function") { - const msg = f.validate(draft, sources); - if (msg) return msg; - } - } - return null; - }, [def, draft, sources]); - - const onSubmit = () => { - if (validationError) return; - - const keys = def.submitKeys ?? Object.keys(def.defaultConfig ?? {}); - const patch = {}; - - for (const k of keys) patch[k] = draft[k] ?? null; - - // DEBUG - console.log("submit keys:", keys); - console.log("draft:", draft); - console.log("patch:", patch); - - // Build and log query string for debugging - const queryString = buildQueryString(patch); - console.log("Query string:", `?${queryString}`); - // Full URL - console.log("Full URL:", `${API_BASE}/search?${queryString}`); - - updateWidgetConfig(id, patch); - onClose(); - }; - - const onReset = () => { - setDraft(def?.defaultConfig ?? {}); - }; - - // --- Field renderers i.e. Radio, Checkbox, Select, Search --- - - // 'Select' Field Handler - const renderField = (field) => { - if (field.type === "select") { - const srcObj = sources[field.optionsFrom?.source]; - const raw = getByPath(srcObj, field.optionsFrom?.path) ?? []; - - // DEV WARNING - if (process.env.NODE_ENV !== "production" && raw != null && !Array.isArray(raw)) { - console.warn( - `[WidgetInspector] optionsFrom path "${field.optionsFrom.path}" did not resolve to an array`, - { - widget: widgetKey, - field: field.key, - source: field.optionsFrom.source, - path: field.optionsFrom.path, - resolvedValue: raw, - } - ); - } - - const items = [ - { label: field.placeholder ?? "(all)", value: "" }, - ...raw.map((v) => ({ label: String(v), value: String(v) })), - ]; - - const collection = createListCollection({ items }); - - const current = draft[field.key] ?? ""; - const value = current ? [current] : []; // empty means (all) - - return ( - - {field.label} - { - const next = e.value?.[0] ?? ""; // "" is "(all)" - const clears = field.clearOnChange ?? []; - const partial = { [field.key]: next || null }; - for (const c of clears) partial[c] = null; - - patchDraft(partial); - }} - disabled = { optLoading || items.length <= 1 } // only "(all)" exists - - // size="sm" - // placeholder={optLoading ? "Loading…" : field.placeholder ?? "(all)"} - // value={draft[field.key] ?? ""} - // isDisabled={optLoading || opts.length === 0} - // onChange={(e) => { - // const v = e.target.value || null; - - // // handle clears on change - // const clears = field.clearOnChange ?? []; - // const partial = { [field.key]: v }; - // for (const c of clears) partial[c] = null; - - // patchDraft(partial); - // }} - > - - - - - - {items.map((it) => ( - - {it.label} - - - ))} - - {/* {opts.map((x) => ( - - ))} */} - - - ); - } - - // 'Radio Button' Field Handler - if (field.type === "radio") { - const srcObj = sources[field.optionsFrom?.source]; - const raw = getByPath(srcObj, field.optionsFrom?.path); - - if (process.env.NODE_ENV !== "production" && raw != null && !Array.isArray(raw)) { - console.warn( - `[WidgetInspector] optionsFrom path "${field.optionsFrom.path}" did not resolve to an array`, - { - widget: widgetKey, - field: field.key, - source: field.optionsFrom.source, - path: field.optionsFrom.path, - resolvedValue: raw, - } - ); - } - - const options = Array.isArray(raw) ? raw : []; - const isMulti = field.mode === "multiple"; - const value = isMulti - ? Array.isArray(draft[field.key]) ? draft[field.key] : [] - : draft[field.key] ?? ""; - - return ( - - {field.label} - - { - if (isMulti) { - patchDraft({ [field.key]: e.value }); - } else { - patchDraft({ [field.key]: e.value[0] ?? null }); - } - }} - > - - {options.map((opt) => ( - - - - {opt} - - ))} - - - - ); - } - - // 'Checkbox' Field Handler - if (field.type === "checkbox") { - const srcObj = sources[field.optionsFrom?.source]; - const raw = getByPath(srcObj, field.optionsFrom?.path); - - if (process.env.NODE_ENV !== "production" && raw != null && !Array.isArray(raw)) { - console.warn( - `[WidgetInspector] optionsFrom path "${field.optionsFrom.path}" did not resolve to an array`, - { - widget: widgetKey, - field: field.key, - source: field.optionsFrom.source, - path: field.optionsFrom.path, - resolvedValue: raw, - } - ); - } - - // const options = Array.isArray(raw) ? raw.map(String) : []; - - // items: [{ label, value }] - const items = (Array.isArray(raw) ? raw : []).map((x) => ({ - label: String(x), - value: String(x), - })); - - // const selected = Array.isArray(draft[field.key]) ? draft[field.key] : []; - const value = Array.isArray(draft[field.key]) ? draft[field.key].map(String) : []; - - // Can be used to validate fields ~ optional - const invalid = typeof field.validate === "function" ? !!field.validate(draft, sources) : false; - - return ( - - {field.label} - - { - console.log("group next:", next) - patchDraft({ [field.key]: next }) - }} - > - - {items.map((item) => ( - - - - - - {item.label} - - ))} - - - - - {value.length} selected - - - - {invalid && field.errorText && ( - {field.errorText} - )} - - ); - } - // Date Range Handler - if (field.type === "dateRange") { - const srcObj = sources[field.minFrom?.source]; - const min = getByPath(srcObj, field.minFrom?.path) ?? undefined; - const max = getByPath(srcObj, field.maxFrom?.path) ?? undefined; - - const startKey = field.startKey; - const endKey = field.endKey; - - return ( - - {field.label} - - - patchDraft({ [startKey]: e.target.value || null })} - /> - - to - - patchDraft({ [endKey]: e.target.value || null })} - /> - - - {!!validationError && ( - - {validationError} - - )} - - - {(field.presets ?? []).map((p) => { - const variant = p.variant ?? "outline"; - return ( - - ); - })} - - - ); - } - - // fallback (future types) - return null; - }; - - return ( - - - {def.title ?? widgetKey} - - - - {/* Options loading/error */} - - {optLoading && Loading options…} - {!optLoading && optError && ( - Options failed: {String(optError.message ?? optError)} - )} - - - {/* Debug */} - {/* - - Saved config - - {JSON.stringify(cfg ?? {}, null, 2)} - - Draft (pending) - - {JSON.stringify(draft ?? {}, null, 2)} - */} - - {/* Fields */} - - {(def.fields ?? []).map(renderField)} - - {/* Actions */} - - - - - - - ); -} diff --git a/client/src/components/Canvas/CanvasComponents/WidgetMenu.jsx b/client/src/components/Canvas/CanvasComponents/WidgetMenu.jsx index 0128464..0bf3f66 100644 --- a/client/src/components/Canvas/CanvasComponents/WidgetMenu.jsx +++ b/client/src/components/Canvas/CanvasComponents/WidgetMenu.jsx @@ -1,25 +1,23 @@ import { Menu, Portal } from "@chakra-ui/react"; -import { getWidgetsForView } from "@/constants/widgetRegistry"; -// import AlertLevel from "./AlertLevelWidget"; +import AlertLevel from "./AlertLevelWidget"; -export default function WidgetMenu({view, appendWidget, triggerItem, positioning}) { - const entries = getWidgetsForView(view); - +export default function WidgetMenu({appendWidget, triggerItem, positioning}) { return ( {triggerItem} - {entries.map((w) => ( - appendWidget(w.key)} + appendWidget(AlertLevel, 4, 7, 4, 7, 8, 14)} // width and height are passed through here for each widget > - {w.label} + Alert Level - ))} + CO2 + IVANS + Plume Heights + Alert Level Changes diff --git a/client/src/components/Canvas/views/Admin.jsx b/client/src/components/Canvas/views/Admin.jsx index 445151a..8deb1d3 100644 --- a/client/src/components/Canvas/views/Admin.jsx +++ b/client/src/components/Canvas/views/Admin.jsx @@ -1,6 +1,5 @@ import { Flex, Tabs, HStack } from '@chakra-ui/react'; import { MEDataEntry } from './AdminTabs/MEDataEntry'; -import { NVEWS } from './AdminTabs/NVEWS' import { ProjectCollector } from './AdminTabs/ProjectCollector'; import { NASApplication } from './AdminTabs/NASApplication'; import { IVANS } from './AdminTabs/IVANS' @@ -31,7 +30,7 @@ export default function Admin({ view, onChangeView, onEditWidgets, appendWidget as="header" position="sticky" top="0" - zIndex={2000} // zIndex: 1100 + zIndex="dropdown" // zIndex: 1100 bg="base200" pl={5} pr={2} @@ -43,28 +42,25 @@ export default function Admin({ view, onChangeView, onEditWidgets, appendWidget > {/* HEADER */} - {/* + - */} + {/* CANVAS */} - - - - - - - - - - - - - - + + + + + + + + + + + ); } \ No newline at end of file diff --git a/client/src/components/Canvas/views/AdminTabs/MEDataEntry.jsx b/client/src/components/Canvas/views/AdminTabs/MEDataEntry.jsx index 08bb518..f3ee9ba 100644 --- a/client/src/components/Canvas/views/AdminTabs/MEDataEntry.jsx +++ b/client/src/components/Canvas/views/AdminTabs/MEDataEntry.jsx @@ -15,7 +15,7 @@ const yearItems = Array.from( ); const years = createListCollection({ - items: yearItems.reverse(), +items: yearItems.reverse(), }); const quarters = createListCollection({ @@ -200,7 +200,7 @@ export function MEDataEntry() { - + Number of people benefitting from VDAP activities, disaggregate by sex diff --git a/client/src/components/Canvas/views/AdminTabs/NVEWS.jsx b/client/src/components/Canvas/views/AdminTabs/NVEWS.jsx deleted file mode 100644 index 10cba7b..0000000 --- a/client/src/components/Canvas/views/AdminTabs/NVEWS.jsx +++ /dev/null @@ -1,236 +0,0 @@ -import React from "react"; -import { Box, Text, Accordion, Table, Separator, Center,Button,Link} from "@chakra-ui/react"; -import { useEffect, useState, useMemo } from "react"; -import Map from "../NVEWSMap.jsx"; -import {mapFilterConfig} from "@/utils/map-utils/map-configs/nvewsMapFilterConfig.js"; -import { pctStyles } from "@/utils/pctStyles.js"; - -const SECTIONS = [ - { - id: "volcano", - title: "Volcano", - fields:[ - {label: "VNUM", key: "vnum"}, - {label: "State", key: "volcano_subgroup"}, - {label: "Threat Level", key: "nvews_threat_text"}, - {label: "Observatory", key: "volcano_group"}, - {label: "Network Completion %",key: "network_pct_complete"}, - {label: "Network Area (km2)", key: "network_area_km2"}, - {label: "Polygon dimensions (km x km or km if radius)", key: "r_or_p_dimensions_km"}, - ] - - }, - { - id: "seismic", - title: "Seismic", - fields:[ - {label: "Stations", key: "seismic_station_total"}, - {label: "Target", key: "seismic_target"}, - {label: "% Complete", key: "seismic_pct_complete"}, - ] - }, - { - id: "gnss", - title: "GNSS", - fields:[ - {label: "Stations", key: "gnss_station_total"}, - {label: "Target", key: "gnss_target"}, - {label: "% Complete", key: "gnss_pct_complete"}, - ] - }, - { - id: "cameras", - title: "Cameras", - fields:[ - {label: "Stations", key: "camera_station_total"}, - {label: "Target", key: "camera_target"}, - {label: "% Complete", key: "camera_pct_complete"}, - ] - }, - { - id: "infrasound", - title: "Infrasound", - fields:[ - {label: "Stations", key: "infrasound_station_total"}, - {label: "Target", key: "infrasound_target"}, - {label: "% Complete", key: "infrasound_pct_complete"}, - ] - }, - { - id: "tilt", - title: "Tilt", - fields:[ - {label: "Stations", key: "tiltmeter_station_total"}, - {label: "Target", key: "tiltmeter_target"}, - {label: "% Complete", key: "tiltmeter_pct_complete"}, - ] - }, - { - id: "real-time gas", - title: "Real-Time Gas", - fields:[ - {label: "Stations", key: "gas_station_total"}, - {label: "Target", key: "gas_target"}, - {label: "% Complete", key: "gas_pct_complete"}, - ] - }, - -]; - -const COLUMNS = SECTIONS.flatMap(section => - section.fields.map(field => ({ - id: `${section.id}.${field.key}`, - sectionTitle: section.title, - label: field.label, - key: field.key, - isPercent: field.label.includes('%') - })) -); - - -async function fetchData(){ - const res = await fetch("https://dev-vhptools.usgs.gov/vmidapi-free/reports/nvewsCompletionStatus"); - if(!res.ok) throw new Error(res.statusText); - return res.json(); -} - -export function NVEWS() { - - const origin = [45.61142478054226, -122.49630033167544]; - const zoom = 3; - const type = ["https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",'© OpenStreetMap contributors']; - - - const [data, setData] = useState(null); - const [error, setError] = useState(null); - const [loading, setLoading] = useState(true); - const [selectedFilters, setSelectedFilters] = useState(() => { - const initial = {}; - for (const f of mapFilterConfig) initial[f.id] = f.defaultValue; - return initial; - }); - const [selectedVolcano, setSelectedVolcano] = useState(null); - - - function handleTableClick(v){ - setSelectedVolcano([v.latitude, v.longitude]); - } - - function setFilterValue(id, value) { - setSelectedFilters(prev => ({ ...prev, [id]: value })); - } - - function toggleInArray(id, value) { - setSelectedFilters(prev => { - const arr = Array.isArray(prev[id]) ? prev[id] : []; - const next = arr.includes(value) ? arr.filter(x => x !== value) : [...arr, value]; - return { ...prev, [id]: next }; - }); - } - - function applyDataFilters(rows, config, selected) { - return rows.filter(row => { - return config.every(f => { - if (f.target?.kind !== "data") return true; - - const sel = selected[f.id]; - if (sel == null) return true; - if (Array.isArray(sel) && sel.length === 0) return true; - - const value = row[f.target.field]; - - switch (f.target.op) { - case "in": - return Array.isArray(sel) ? sel.includes(value) : true; - case "eq": - return value === sel; - default: - return true; - } - }); - }); - } - - - useEffect(() => { - fetchData() - .then(setData) - .catch(err => setError(err.message)) - .finally(() => setLoading(false)); - },[]); - - - if (error) return
{error}
; - if (loading) return

Loading...

; - console.log("raw",data) - - const filteredData = applyDataFilters(data ?? [], mapFilterConfig, selectedFilters); - console.log("filtered",filteredData); - - - - return( - - - - - {/**/} -
- - NVEWS Completion Status - - - View Full Report - - -
- - - - - - Name - {SECTIONS.map(s => ( - - {s.title} - - ))} - - - - {COLUMNS.map(c => ( - {c.label} - ))} - - - - - {filteredData.map(v => ( - - handleTableClick(v)}> - {v.volcano_name} - - {COLUMNS.map(c => { - const value = v?.[c.key]; - const pct = Number(String(value).replace("%","")); - return ( - handleTableClick(v)} - cursor="pointer" _hover={{textDecoration: "underline"}}> - {value ?? "-"} - - ); - })} - - ))} - - - - - -
- - ) - -} \ No newline at end of file diff --git a/client/src/components/Canvas/views/GlobalMap.jsx b/client/src/components/Canvas/views/GlobalMap.jsx index 7c6e066..7b0f7af 100644 --- a/client/src/components/Canvas/views/GlobalMap.jsx +++ b/client/src/components/Canvas/views/GlobalMap.jsx @@ -3,23 +3,21 @@ import { MapContainer, TileLayer, Marker, Popup } from "react-leaflet"; import MapButtonControls from "../CanvasComponents/MapButtonControls"; import MapSettingsButton from "../CanvasComponents/MapSettingsButton"; -export default function GlobalMap({markers = []}) { - const origin = [45.61142478054226, -122.49630033167544]; // [latitude, longitude] +export default function GlobalMap() { + const position = [45.61142478054226, -122.49630033167544]; // [latitude, longitude] return ( - + } position="topright" /> - {markers.map(m => ( - - - {m.label} - - - ))} + + + CVO — Home of the volcanoligists + + ); } \ No newline at end of file diff --git a/client/src/components/Canvas/views/Home.jsx b/client/src/components/Canvas/views/Home.jsx index c3944f1..a04309f 100644 --- a/client/src/components/Canvas/views/Home.jsx +++ b/client/src/components/Canvas/views/Home.jsx @@ -1,12 +1,10 @@ -import { useState } from "react"; -import { HStack, Flex, Tabs, Box } from "@chakra-ui/react"; +import { HStack, Flex, Tabs } from "@chakra-ui/react"; import MyDashboard from "./HomeTabs/MyDashboard"; import { SearchBar } from "../CanvasComponents/SearchBar"; import { SettingsButton } from "../CanvasComponents/SettingsButton"; import { DailyActivity } from "./HomeTabs/DailyActivity"; import { Gas } from "./HomeTabs/Gas"; import { Seismic } from "./HomeTabs/Seismic"; -import { Deformation } from "./HomeTabs/Deformation"; import { RemoteSensing } from "./HomeTabs/RemoteSensing"; import { CancelButton } from "../CanvasComponents/CancelButton"; import { SaveButton } from "../CanvasComponents/SaveButton"; @@ -14,103 +12,44 @@ import DeleteAllButton from "../CanvasComponents/DeleteAllButton"; import { v4 as uuid } from 'uuid'; import { CanvasHeaderTabs } from '../CanvasComponents/CanvasHeaderTabs'; import { DASHBOARD_TABS } from "@/constants/viewKeys"; -import { WIDGET_REGISTRY } from "@/constants/widgetRegistry"; -import { WIDGET_INSPECTOR_REGISTRY } from "@/constants/widgetInspectorRegistry"; -import WidgetInspector from "../CanvasComponents/WidgetInspector"; export default function Home(props) { // deconstructing props - const { view, layout, setLayout, onLayoutChange, onChangeView, onCancel, isDelete, setIsDelete, - beginEditIfNeeded, isEditable, setIsEditable, widgetArray, setWidgetArray } = props; + const { view, layout, setLayout, setOriginalLayout, onLayoutChange, onChangeView, onCancel, setOriginalWidgets, + isDelete, setIsDelete, beginEditIfNeeded, isEditable, setIsEditable, widgetArray, setWidgetArray } = props; - const [inspectorOpen, setInspectorOpen] = useState(false); - const [inspectorTarget, setInspectorTarget] = useState(null); - - const openInspector = ({ id, widgetKey }) => { - setInspectorTarget({ id, widgetKey, view }); - setInspectorOpen(true); - }; - - function appendWidget(widgetKey, overrides = {}) { + function appendWidget(name, w, h, minw, minh, maxw, maxh) { beginEditIfNeeded(); // Save state before anything else - // Place canvas in edit mode upon adding a new widget - setIsEditable(true); - setIsDelete(true); - - const def = WIDGET_REGISTRY[widgetKey]; - if(!def) { - console.warn("appendWidget: unknown widgetKey:", widgetKey); - return; - }; - - // Widget Inspector Configuration Settings - const inspectorDef = WIDGET_INSPECTOR_REGISTRY[widgetKey]; - const defaultConfig = inspectorDef?.defaultConfig ?? {}; - + const newID = uuid(); // could be replaced with something else like guid const COLS = 16; + const W = w ?? 3; + const H = h ?? 3; - if (widgetKey === "gas_measurements") { - setInspectorTarget({ view, id: newID, widgetKey }); - setInspectorOpen(true); - } - - const { - w = def.defaults.w, - h = def.defaults.h, - minW = def.defaults.minW, - minH = def.defaults.minH, - maxW = def.defaults.maxW, - maxH = def.defaults.maxH, - } = overrides; - - // DEBUG - console.log("after add:", { widgetKey, layoutLen: layout.length, widgetLen: widgetArray.length }); - - // IMPORTANT: use functional updates so you don't rely on stale widgetArray/layout - setWidgetArray(prev => [ - ...prev, - { - i: newID, - widgetKey, - // config: JSON.parse(JSON.stringify(defaultConfig)), // Can use this if Safari complains - config: structuredClone(defaultConfig) - }, + setWidgetArray([ // updating widget array containing info on the types of widgets + ...widgetArray, + {i: newID, widget: name } ]); - + // onAddWidget(newID, w, h, minw, minh, maxw, maxh); // updating array containing info on layout of widgets + setLayout(prev => [ ...prev, { i: newID, - x: (prev.length * w) % COLS, + x: (prev.length * W) % COLS, y: 0, - w, - h, - minW, - minH, - maxW, - maxH, + w: w, + h: h, + minW: minw, + minH: minh, + maxW: maxw, + maxH: maxh, static: false, resizeHandles: ['se'] }, ]); } - function updateWidgetConfig(id, patchOrFn) { - setWidgetArray(prev => - prev.map(w => { - if (w.i !== id) return w; - - const nextConfig = - typeof patchOrFn === "function" - ? patchOrFn(w.config ?? {}) - : {...(w.config ?? {}), ...(patchOrFn ?? {}) }; - - return { ...w, config: nextConfig }; - }) - ); - } - const onSave = () => { console.log("saving widgets..."); // Set all widgets back to static: true @@ -122,6 +61,8 @@ export default function Home(props) { ); setIsEditable(false); setIsDelete(false); + setOriginalLayout([]); // Clear backup layout + setOriginalWidgets([]); } const onEditWidgets = () => { @@ -156,11 +97,8 @@ export default function Home(props) { } // Prop Forwarding - const MyDashboardProps = { view, layout, onLayoutChange, isEditable, - beginEditIfNeeded, isDelete, DeleteWidget, widgetArray, appendWidget, - openInspector - }; - const settingsButtonProps = { view, onEditWidgets, appendWidget }; + const MyDashboardProps = { layout, onLayoutChange, isEditable, beginEditIfNeeded, isDelete, DeleteWidget, widgetArray, appendWidget }; + const settingsButtonProps = { onEditWidgets, appendWidget }; return ( /* HEADER */ @@ -212,26 +150,11 @@ export default function Home(props) { {/* CANVAS */} - - - - - - {inspectorOpen && inspectorTarget && ( - setInspectorOpen(false)} - target={inspectorTarget} - widgetArray={widgetArray} - updateWidgetConfig={updateWidgetConfig} - /> - )} - - - - + + + @@ -241,9 +164,6 @@ export default function Home(props) { - - - ); } \ No newline at end of file diff --git a/client/src/components/Canvas/views/HomeTabs/Deformation.jsx b/client/src/components/Canvas/views/HomeTabs/Deformation.jsx deleted file mode 100644 index 17a0c8f..0000000 --- a/client/src/components/Canvas/views/HomeTabs/Deformation.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Box, Text } from "@chakra-ui/react"; - -export function Deformation() { - return( - - - Deformation dashboard coming soon. - - - ); -} \ No newline at end of file diff --git a/client/src/components/Canvas/views/HomeTabs/MyDashboard.jsx b/client/src/components/Canvas/views/HomeTabs/MyDashboard.jsx index 4b31270..91364e2 100644 --- a/client/src/components/Canvas/views/HomeTabs/MyDashboard.jsx +++ b/client/src/components/Canvas/views/HomeTabs/MyDashboard.jsx @@ -2,13 +2,9 @@ import GridLayout, { WidthProvider } from 'react-grid-layout'; import { useSlotRecipe, chakra, Flex } from '@chakra-ui/react'; import CustomResizeHandle from '../../CanvasComponents/CustomResizeHandle'; import FirstWidgetButton from '../../CanvasComponents/FirstWidgetButton'; -import PlaceholderWidget from '../../CanvasComponents/PlaceholderWidget'; -import { WIDGET_REGISTRY, WIDGET_COMPONENTS } from '@/constants/widgetRegistry'; -export default function MyDashboard({view, layout, onLayoutChange, - isEditable, isDelete, DeleteWidget, widgetArray, appendWidget, openInspector -}) { - //console.log("rendering MyDashboard"); +export default function MyDashboard({layout, onLayoutChange, isEditable, isDelete, DeleteWidget, widgetArray, appendWidget}) { + console.log("rendering MyDashboard"); const recipe = useSlotRecipe({ key: "widget" }); const styles = recipe(); // using root recipe for widget below const ResponsiveGridLayout = WidthProvider(GridLayout); // canvas width now adjusts to window size @@ -16,8 +12,8 @@ export default function MyDashboard({view, layout, onLayoutChange, const handleDragStop = () => { document.body.style.userSelect = ""; }; // allow text highlighting all other times let merged = []; - //console.log("widgetArray: ", widgetArray); - //console.log("layout: ", layout); + console.log("widgetArray: ", widgetArray); + console.log("layout: ", layout); if (widgetArray.length && layout.length) { const widgetMap = new Map(widgetArray.map(item => [item.i, item])); @@ -40,7 +36,7 @@ export default function MyDashboard({view, layout, onLayoutChange, bg="gray.150" borderRadius="md" > - + ); } @@ -63,36 +59,11 @@ export default function MyDashboard({view, layout, onLayoutChange, position="relative" resizeHandle={} > - {merged.map((item) => { - const def = WIDGET_REGISTRY[item.widgetKey]; - - const isReal = def?.kind === "real"; - - const Widget = isReal - ? WIDGET_COMPONENTS[item.widgetKey] - : PlaceholderWidget; - - const title = - def?.PlaceholderTitle ?? - def?.label ?? - item.widgetKey ?? - "Widget"; - + { merged.map((item) => { + const Widget = item.widget; return ( - openInspector({ id: item.i, widgetKey: item.widgetKey }) - : undefined - } - /> + ); }) diff --git a/client/src/components/Canvas/views/NVEWSLegend.jsx b/client/src/components/Canvas/views/NVEWSLegend.jsx deleted file mode 100644 index bcca5aa..0000000 --- a/client/src/components/Canvas/views/NVEWSLegend.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import {Box, Text, Flex, Image} from '@chakra-ui/react' -import volcanoDefault from "@/utils/map-utils/icons/green-triangle.svg"; -import redVolcano from "@/utils/map-utils/icons/red-triangle.svg"; -import yellowVolcano from "@/utils/map-utils/icons/yellow-triangle.svg"; -import seismicDefault from "@/utils/map-utils/icons/triangle-black.svg"; -import cameraDefault from "@/utils/map-utils/icons/camera.svg"; -import gpsDefault from "@/utils/map-utils/icons/gps-solid.svg"; -import soundIcon from "@/utils/map-utils/icons/sound-black.svg"; -import tiltIcon from "@/utils/map-utils/icons/line-segment.svg"; -import cloudIcon from "@/utils/map-utils/icons/cloud.svg"; - - -export const NVEWSLegend = ( - - - red volcano - 0–70% Complete - - - - yellow volcano - 70–100% Complete - - - - green volcano - 100% Complete - - - - green volcano - Seismometer - - - - green volcano - Camera - - - - green volcano - GPS - - - - green volcano - Infrasound - - - - green volcano - Tiltmeter - - - - green volcano - Gas - - -); \ No newline at end of file diff --git a/client/src/components/Canvas/views/NVEWSMap.jsx b/client/src/components/Canvas/views/NVEWSMap.jsx deleted file mode 100644 index 4c152de..0000000 --- a/client/src/components/Canvas/views/NVEWSMap.jsx +++ /dev/null @@ -1,168 +0,0 @@ -import React, {useState} from "react"; -import { MapContainer, TileLayer, Marker, Popup, Circle, CircleMarker, Rectangle, Polygon,Polyline} from "react-leaflet"; -import { Box, Text } from "@chakra-ui/react"; -import MapButtonControls from "@/components/Canvas/CanvasComponents/MapButtonControls.jsx"; -import MapFilter from "../CanvasComponents/MapFilter.jsx"; -import MapLegend from "../CanvasComponents/MapLegend.jsx"; -import { NVEWSLegend } from "../views/NVEWSLegend.jsx"; -import {MapClickLogger} from "@/utils/map-utils/functions/mapHelpers.js"; -import {ZoomWatcher} from "@/utils/map-utils/functions/mapHelpers.js"; -import {FlyTo} from "@/utils/map-utils/functions/mapHelpers.js"; -import {createIcon} from "@/utils/map-utils/functions/markerHelpers.js"; -import {handleMarkerClick} from "@/utils/map-utils/functions/markerHelpers.js"; -import {computePolyPositions} from "@/utils/map-utils/functions/markerHelpers.js"; -import {shiftPos} from "@/utils/map-utils/functions/markerHelpers.js"; -import volcanoDefault from "@/utils/map-utils/icons/green-triangle.svg"; -import redVolcano from "@/utils/map-utils/icons/red-triangle.svg"; -import yellowVolcano from "@/utils/map-utils/icons/yellow-triangle.svg"; -import seismicDefault from "@/utils/map-utils/icons/triangle-black.svg"; -import cameraDefault from "@/utils/map-utils/icons/camera.svg"; -import gpsDefault from "@/utils/map-utils/icons/gps-solid.svg"; -import soundIcon from "@/utils/map-utils/icons/sound-black.svg"; -import tiltIcon from "@/utils/map-utils/icons/line-segment.svg"; -import cloudIcon from "@/utils/map-utils/icons/cloud.svg"; - - -export default function NVEWSMap ({type=[], origin=[], markers=[], mapFilters=[], zoom, selectedFilters, setFilterValue, - toggleInArray, selectedMarker, overlays = {}}) { - - const [target, setTarget] = useState(null); - const [zoomLevel, setZoomLevel] = useState(zoom); - - const link= type[0] - const attr = type[1] - const pos = [origin[0],origin[1]] - const enabledOverlays = selectedFilters?.overlay ?? []; - - - return ( - - - - - } - position="topright" /> - } - position="bottomright" /> - {enabledOverlays.map(id => ( - - {overlays[id] ?? null} - - ))} - - - - - {markers.map(marker => { - - let bounds = null; - let stationTypes = ["seismic_stations", "camera_stations", "gas_stations", "gnss_stations", "tiltmeter_stations", - "infrasound_stations"]; - let stationMarkers = []; - let volcanoIcon = null; - - const val = Number(String(marker.network_pct_complete).replace("%","")); - - if(val < 70){ - volcanoIcon = createIcon(redVolcano); - } - else if(val > 100){ - volcanoIcon = createIcon(yellowVolcano); - } - else{ - volcanoIcon = createIcon(volcanoDefault); - } - - if(zoomLevel >= 7 && marker.include_reason === "Within Radius"){ - bounds = ; - } - else if (zoomLevel >= 7 && marker.include_reason === "Within Polygon"){ - bounds = ; - } - - // const rawSelected = selectedFilters?.stations ?? []; - // - // const enabledStations = - // rawSelected.length === 0 || rawSelected.length === stationTypes.length - // ? stationTypes - // : rawSelected; - - const enabledStations = selectedFilters?.stations ?? []; - - if(zoomLevel >= 9){ - for(const station of stationTypes){ - if(marker[station].length > 0 && enabledStations.includes(station)){ - for(let i =0 ; i< marker[station].length; i++){ - stationMarkers.push(marker[station][i]); - } - } - } - } - - - return( - - handleMarkerClick(marker,setTarget) - }}> - - - {marker.volcano_name} - Network Completion: {marker.network_pct_complete} - Seismic Count: {marker.seismic_station_total} Target: {marker.seismic_target} - GNSS Count: {marker.gnss_station_total} Target: {marker.gnss_target} - Camera Count: {marker.camera_station_total} Target: {marker.camera_target} - InfraSound Count: {marker.infrasound_station_total} Target: {marker.infrasound_target} - Tilt Meter Count: {marker.tiltmeter_station_total} Target: {marker.tiltmeter_target} - Real-Time Gas Count: {marker.gas_station_total} Target: {marker.gas_target} - - - - {bounds} - {stationMarkers.map(subMarker => { - let iconType = null; - if(subMarker.category === "Seismometer"){ - iconType = createIcon(seismicDefault); - } - else if(subMarker.category === "Camera"){ - iconType = createIcon(cameraDefault); - } - else if(subMarker.category === "GPS"){ - iconType = createIcon(gpsDefault); - } - else if(subMarker.category === "Infrasound"){ - iconType = createIcon(soundIcon); - } - else if(subMarker.category === "Tiltmeter"){ - iconType = createIcon(tiltIcon); - } - else if(subMarker.category === "Gas"){ - iconType = createIcon(cloudIcon); - } - // TODO: Add other icons as needed - return ( - - - - {subMarker.station} - Type: {subMarker.category} - Sensor Total: {subMarker.sensor_total} - - - - ) - })} - - ) - })} - - ); -} \ No newline at end of file diff --git a/client/src/components/Dashboard.jsx b/client/src/components/Dashboard.jsx index f3824fb..3f0dc4f 100644 --- a/client/src/components/Dashboard.jsx +++ b/client/src/components/Dashboard.jsx @@ -8,127 +8,62 @@ import DialogPopup from './Canvas/CanvasComponents/DialogPopup.jsx'; export default function Dashboard() { const recipe = useRecipe({ key: "dashboard" }); const styles = recipe(); - const dialog = useDialog(); + const [darkMode, setDarkMode] = useState(false); - + const [isEditable, setIsEditable] = useState(false); // editable=true means static=false (vice versa) + const [isDelete, setIsDelete] = useState(false); + const [originalLayout, setOriginalLayout] = useState([]); + const [originalWidgets, setOriginalWidgets] = useState([]); const [view, setView] = useState("mydashboard"); + const [layout, setLayout] = useState([]); + const [widgetArray, setWidgetArray] = useState([]); + const dialog = useDialog(); - const emptyDash = () => ({ - layout: [], - widgetArray: [], - originalLayout: [], - originalWidgets: [], - isEditable: false, - isDelete: false, - }) - - // Add views as needed to initialize widget canvas views - const CANVAS_VIEWS = new Set([ "mydashboard", "gas" ]); - - // Widget dashboard state - const [dashboards, setDashboards] = useState(() => ({ - mydashboard: emptyDash(), - gas: emptyDash(), - })); - - const isCanvasView = CANVAS_VIEWS.has(view); - const dash = dashboards[view] ?? emptyDash(); - - const updateDash = (key, updater) => { - setDashboards(prev => ({ - ...prev, - [key]: updater(prev[key] ?? emptyDash()), - })); - }; - - // Widget setter functions - const setLayout = (fnOrValue) => { - if (!isCanvasView) return; - updateDash(view, s => ({ - ...s, - layout: typeof fnOrValue === "function" ? fnOrValue( s.layout ) : fnOrValue, - })); - }; - - const setWidgetArray = (fnOrValue) => { - if (!isCanvasView) return; - updateDash(view, s => ({ - ...s, - widgetArray: typeof fnOrValue === "function" ? fnOrValue(s.widgetArray) : fnOrValue, - })); - }; - - const setIsEditable = (value) => { - if (!isCanvasView) return; - updateDash(view, s => ({ ...s, isEditable: value })); - }; - - const setIsDelete = (value) => { - if (!isCanvasView) return; - updateDash(view, s => ({ ...s, isDelete: value })); - }; - const beginEditIfNeeded = () => { - if (!isCanvasView) return; - updateDash(view, s => { - if(s.isEditable) return s; // already editing - return { - ...s, - originalLayout: s.layout, - originalWidgets: s.widgetArray, - }; - }); + if ( !isEditable ) { + setOriginalLayout(layout); + setOriginalWidgets(widgetArray); + } }; const onCancel = () => { - if (!isCanvasView) return; - - updateDash(view, s => ({ - ...s, - layout: (s.originalLayout?.length ? s.originalLayout : s.layout).map(it => ({ - ...it, - static: true, - })), - widgetArray: s.originalWidgets ?? s.widgetArray, - isEditable: false, - isDelete: false, - originalLayout: [], - originalWidgets: [], - })); - }; - - const onLayoutChange = (newLayout) => { - setLayout(newLayout); - }; - - const handleViewChange = (nextView) => { - // prevent nav only when current view is a widget canvas AND you're editing - if (CANVAS_VIEWS.has(view) && dash.isEditable) { + console.log("canceling changes..."); + console.log(originalWidgets); + if (originalLayout.length) { + setLayout(originalLayout.map(item => ({ + ...item, + static: true + }))); + }; + setWidgetArray(originalWidgets); + setIsEditable(false); + setIsDelete(false); + setOriginalLayout([]); + setOriginalWidgets([]); + } + + // Prevent navigation while in Edit mode without saving or cancelling + const handleViewChange = (nextView) => { + console.log("1. handling view change") + if (view === "mydashboard" && isEditable) { + console.log("2. currently editing"); dialog.setOpen(true); return; + + // const confirmed = window.confirm( + // "You have unsaved changes. Discard them and continue?" + // ); + // if (!confirmed) return; + // onCancel(); } setView(nextView); }; + + const onLayoutChange = (newLayout) => setLayout(newLayout); // Prop Forwarding - const canvasProps = { - view, - onChangeView: handleViewChange, - - // active canvas props - layout: dash.layout, - widgetArray: dash.widgetArray, - isEditable: dash.isEditable, - isDelete: dash.isDelete, - - // handler functions - setLayout, - setWidgetArray, - setIsEditable, - setIsDelete, - beginEditIfNeeded, - onCancel, - onLayoutChange, + const canvasProps = { view, layout, setLayout, setOriginalLayout, onLayoutChange, onChangeView: handleViewChange, + onCancel, isEditable, setIsEditable, isDelete, setIsDelete, widgetArray, setWidgetArray, originalWidgets, setOriginalWidgets, beginEditIfNeeded }; const sidebarProps = { view, onChangeView: handleViewChange, darkMode, setDarkMode }; const headerProps = { onChangeView: handleViewChange }; diff --git a/client/src/components/Header/Header.jsx b/client/src/components/Header/Header.jsx index ff8cfb4..a89eed9 100644 --- a/client/src/components/Header/Header.jsx +++ b/client/src/components/Header/Header.jsx @@ -1,35 +1,20 @@ -import { chakra, useRecipe, Box, Button, Stack, Text, Flex, Image } from "@chakra-ui/react" -import { useColorMode } from "@/components/ui/color-mode"; +import { chakra, useRecipe, Box, Button, Stack, Text, Flex } from "@chakra-ui/react" import UserAvatarMenu from "./UserAvatarMenu.jsx"; //TODO: Dynamically populate per each user const user = { - name: "Dan Hansen", - email: "dshansen@contractor.usgs.gov", + name: "venessa kuchenik", + email: "vkuchenik@contractor.usgs.gov", // avatar: "src\\assets\\user_profile.svg" } export default function Header({ onChangeView }) { const recipe = useRecipe({ key: "header" }); const styles = recipe(); - const { colorMode } = useColorMode(); - - const logoSource = - colorMode === "dark" - ? "/images/NVIS_Logo_Black.png" - : "/images/NVIS_Logo_transparent.png" return ( - + {user.name} diff --git a/client/src/components/Sidebar/Sidebar.jsx b/client/src/components/Sidebar/Sidebar.jsx index 0c1b39a..4829f91 100644 --- a/client/src/components/Sidebar/Sidebar.jsx +++ b/client/src/components/Sidebar/Sidebar.jsx @@ -43,7 +43,7 @@ export default function Sidebar({ view, onChangeView, darkMode, setDarkMode }) { // Track currrent view from both Sidebar and Canvas when 'view' changes useEffect(() => { - //console.log("Current view = ", view); + console.log("Current view = ", view); const newIndex = buttons.findIndex((btn) => { if (btn.view === "mydashboard") { return DASHBOARD_VIEWS.includes(view); diff --git a/client/src/components/ui/color-mode.jsx b/client/src/components/ui/color-mode.jsx index 01c5d97..b2d1cd6 100644 --- a/client/src/components/ui/color-mode.jsx +++ b/client/src/components/ui/color-mode.jsx @@ -2,7 +2,6 @@ import { ClientOnly, IconButton, Skeleton, Span } from '@chakra-ui/react' import { ThemeProvider, useTheme } from 'next-themes' -import { useEffect } from "react" import * as React from 'react' import { LuMoon, LuSun } from 'react-icons/lu' @@ -19,12 +18,6 @@ export function useColorMode() { const toggleColorMode = () => { setTheme(resolvedTheme === 'dark' ? 'light' : 'dark') } - - // Debug log - useEffect(() => { - //console.log(`Color mode changed to: ${colorMode}`); - }, [colorMode]); - return { colorMode: colorMode, setColorMode: setTheme, diff --git a/client/src/constants/viewKeys.js b/client/src/constants/viewKeys.js index 600c4f8..b511ae5 100644 --- a/client/src/constants/viewKeys.js +++ b/client/src/constants/viewKeys.js @@ -1,21 +1,12 @@ // Main views called from Home tab -> Canvas navigation header -// 'isCanvas' is used to detirmine which views contain widgets and their state -// Add seismic, remote, and deformation once ready to add additional widgets export const DASHBOARD_TABS = [ - { value: "mydashboard", label: "My Dashboard", isCanvas: true }, - { value: "gas", label: "Gas", isCanvas: true }, - { value: "seismic", label: "Seismic", isCanvas: false }, - { value: "remote", label: "Remote Sensing", isCanvas: false }, - { value: "deformation", label: "Deformation", isCanvas: false }, - { value: "daily", label: "Daily Activity", isCanvas: false }, + { value: "mydashboard", label: "My Dashboard" }, + { value: "gas", label: "Gas" }, + { value: "seismic", label: "Seismic" }, + { value: "remote", label: "Remote Sensing" }, + { value: "daily", label: "Daily Activity" }, ] -// Used to check if widget state needs to be initialized per view -// Set has O(1) lookup, trying it becuase it seems fast -export const DASHBOARD_CANVAS_VIEWS = new Set( - DASHBOARD_TABS.filter(t => t.isCanvas).map(t => t.value) -); - // Volcano views called from Volcano tab -> Canvas navigation header export const VOLCANO_TABS = [ { value: "volcanohome", label: "Volcano Home" }, @@ -28,7 +19,6 @@ export const VOLCANO_TABS = [ // Admin views called from Admin tab -> Canvas navigation header export const ADMIN_TABS = [ { value: "medataentry", label: "M&E Data Entry" }, - { value: "nvews", label: "NVEWS" }, { value: "projectcollector", label: "Project Collector" }, { value: "nasapplication", label: "NAS Application" }, { value: "ivans", label: "IVANS" }, @@ -51,7 +41,6 @@ export const VIEW_LABELS = { global: "Global Map", regional: "Regional Map", volcano: "Volcano", - deformation: "Deformation", // Volcano navigation tabs volcanohome: "Volcano Home", diff --git a/client/src/constants/widgetInspectorRegistry.js b/client/src/constants/widgetInspectorRegistry.js deleted file mode 100644 index 752c067..0000000 --- a/client/src/constants/widgetInspectorRegistry.js +++ /dev/null @@ -1,97 +0,0 @@ -export const WIDGET_INSPECTOR_REGISTRY = { - "gas_measurements": { - title: "Gas Measurements Settings", - defaultConfig: { - volcano_name: null, - site_name: null, - compound_name: [], - start_date: null, - end_date: null, - include_measurements: true, - include_personnel: false, // optional - }, - - // Option sources for this widget's fields (from /options endpoint) - optionSources: { - options: { - url: "/options", // relative to API_BASE - cacheKey: "options", // used by generic loader - }, - sites: { - url: ({ draft }) => { - const v = draft?.volcano_name; - return v - ? `/options/sites?volcano_name=${encodeURIComponent(v)}` - : "/options/sites"; - }, - cacheKey: ({ draft }) => `sites:${draft?.volcano_name ?? "all"}`, - dependsOn: ["volcano_name"] - }, - }, - - // How to render + bind each config key - fields: [ - { - key: "volcano_name", - label: "Volcano", - type: "select", - placeholder: "(all)", - optionsFrom: { source: "options", path: "volcano_name" }, - clearOnChange: ["site_name"], // when volcano changes, clear site - }, - { - key: "site_name", - label: "Site", - type: "select", - placeholder: "(all)", - optionsFrom: { source: "sites", path: "site_name" }, - }, - // Single Select Option - // { - // key: "compound", - // label: "Compound", - // type: "select", - // placeholder: "(all)", - // optionsFrom: { source: "options", path: "compound_name" }, - // }, - { - // Multiple Select Option - key: "compound_name", - label: "Compounds", - type: "checkbox", - placeholder: "(all)", - optionsFrom: { source: "options", path: "compound_name" }, - }, - { - key: "date_interval", - label: "Date Interval", - type: "dateRange", - startKey: "start_date", - endKey: "end_date", - minFrom: { source: "options", path: "date_min" }, - maxFrom: { source: "options", path: "date_max" }, - presets: [ - { label: "Use full range", startFrom: "date_min", endFrom: "date_max" }, - { label: "Clear", start: null, end: null, variant: "ghost" }, - ], - validate: (draft) => { - const s = draft.start_date; - const e = draft.end_date; - if (s && e && s > e) return "Start date must be on or before end date."; - return null; - }, - }, - ], - - // Optional: control exactly what gets submitted (prevents "junk" keys) - submitKeys: [ - "volcano_name", - "site_name", - "compound_name", - "start_date", - "end_date", - "include_measurements", - "include_personnel", - ], - }, -}; diff --git a/client/src/constants/widgetRegistry.js b/client/src/constants/widgetRegistry.js deleted file mode 100644 index 106ef30..0000000 --- a/client/src/constants/widgetRegistry.js +++ /dev/null @@ -1,106 +0,0 @@ -// This file is intended to track default widget states as a baseline for any created widgets -import AlertLevel from "src/components/Canvas/CanvasComponents/AlertLevelWidget.jsx" -import GasWidget from "src/components/Canvas/CanvasComponents/GasWidget"; - -// Example widgets, returns actual baseline widget -export const WIDGET_REGISTRY = { - // ***************** My Dashboard Widgets ***************** - alert_level: { - key: "alert_level", - label: "Alert Level", - kind: "real", - defaults: { w: 4, h: 7, minW: 4, minH: 7, maxW: 8, maxH: 14 }, - category: "generic", - }, - - ivans: { - key: "ivans", - label: "IVANS", - kind: "placeholder", - placeholderTitle: "IVANS", - defaults: {w: 4, h: 7, minW: 4, minH: 5, maxW: 8, maxH: 12 }, - category: "generic", - }, - - plume_heights: { - key: "plume_heights", - label: "Plume Heights", - kind: "placeholder", - placeholderTitle: "Plume Heights", - defaults: {w: 4, h: 7, minW: 4, minH: 5, maxW: 8, maxH: 12 }, - category: "generic", - }, - - alert_level_changes: { - key: "alert_level_changes", - label: "Alert Level Changes", - kind: "placeholder", - placeholderTitle: "Alert Level Changes", - defaults: {w: 4, h: 7, minW: 4, minH: 5, maxW: 8, maxH: 12 }, - category: "generic", - }, - - // ***************** Gas Widgets ***************** - gas_measurements: { - key: "gas_measurements", - label: "Gas Measurements", - kind: "real", - defaults: {w: 4, h: 6, minW: 4, minH: 5, maxW: 8, maxH: 12 }, - category: "gas", - // ~ defaultConfig is being moved to widgetInspectorRegistry - // defaultConfig: { - // // for later filters - // rangeDays: 30, - // compound: null, - // volcano: null, - // site: null, - // }, - }, - - gas_so2: { - key: "gas_so2", - label: "SO₂", - kind: "placeholder", - placeholderTitle: "SO2", - defaults: {w: 4, h: 7, minW: 4, minH: 5, maxW: 8, maxH: 12 }, - category: "gas", - }, - - // Add Additional Widgets to the Registry as they are generated - // Gas Widgets - // Seismic Widgets - // Remote Sensing Widgets - // Deformation Widgets -}; - -// Used to define components without adding .jsx to a .js registry file -export const WIDGET_COMPONENTS = { - alert_level: AlertLevel, - gas_measurements: GasWidget, // clicking CO2 renders the temp gas widget -}; - -// Which widgets show up in "Add Widget" for each view -// Make sure these match the keys inside the WIDGET_REGISTRY -export const VIEW_WIDGET_KEYS = { - mydashboard: [ - "alert_level", - "gas_measurements", - "ivans", - "plume_heights", - "alert_level_changes" - ], - - gas: [ - "gas_measurements", - "gas_so2", - ], - - seismic: ["alert_level"], -}; - -export const getWidgetsForView = (view) => { - const keys = VIEW_WIDGET_KEYS[view] ?? []; - return keys - .map((k) => WIDGET_REGISTRY[k]) - .filter(Boolean); -}; \ No newline at end of file diff --git a/client/src/theme.js b/client/src/theme.js index 88eeba1..33e4ff4 100644 --- a/client/src/theme.js +++ b/client/src/theme.js @@ -72,7 +72,7 @@ const widgetRecipe = defineSlotRecipe({ borderColor: "{base300}", textAlign: "center", height: "100%", - //position: "fixed" + position: "fixed" }, header: { flexShrink: "0", @@ -138,21 +138,18 @@ const config = defineConfig({ filter: "invert(100%) hue-rotate(180deg) brightness(95%) contrast(90%)", } }, - '.leaflet-control-zoom-in, .leaflet-control-zoom-out, .leaflet-control-attribution, .leaflet-container': { + '.leaflet-control-zoom-in .leaflet-control-zoom-out .leaflet-control-attribution .leaflet-container': { _dark: { filter: "invert(100%) hue-rotate(180deg) brightness(95%) contrast(90%)", } }, '.leaflet-control-attribution': { - maxWidth: "100%", _dark: { filter: "invert(100%) hue-rotate(180deg) brightness(95%) contrast(90%)", } }, '.leaflet-container': { fontFamily: "georgia, system-ui, sans-serif !important", - width: "100%", - height: "100%", _dark: { filter: "invert(100%) hue-rotate(180deg) brightness(95%) contrast(90%)", } diff --git a/client/src/utils/map-utils/functions/mapHelpers.js b/client/src/utils/map-utils/functions/mapHelpers.js deleted file mode 100644 index b6579d3..0000000 --- a/client/src/utils/map-utils/functions/mapHelpers.js +++ /dev/null @@ -1,57 +0,0 @@ -import {useMap, useMapEvents} from "react-leaflet"; -import {useEffect} from "react"; - -/** - * Helper component for console logging where on a map the user clicked for debugging purposes. - * - * This component renders nothing and is intended to be mounted inside a - */ -export function MapClickLogger() { - - const map = useMap(); - useMapEvents({ - click(e) { - console.log("lat:", e.latlng.lat, "lng:", e.latlng.lng); - }, - }); - - return null; -} - -/** - * Helper component that detects when a zoom change as completed and sets the callback to the updated zoom level - * - * This component renders nothing and is intended to be mounted inside a - * - * @param onZoom Callback set to the current zoom level on zoomend - */ -export function ZoomWatcher({onZoom}){ - const map = useMap(); - useMapEvents({ - zoomend(e){ - onZoom(map.getZoom()); - - } - }) - return null; -} - -/** - * Helper component that take triggers a flyTo animation when a position is present - * - * This component returns nothing and is intended to be mounted inside a - * - * @param position Array of two integers representing the desired coordinates to flyTo - * @param zoom Integer representing the desired zoom level to display - - */ -export function FlyTo({ position, zoom }) { - const map = useMap(); - - useEffect(() => { - if (!position) return; - map.flyTo(position, zoom, { animate: true }); - }, [position, zoom, map]); - - return null; -} \ No newline at end of file diff --git a/client/src/utils/map-utils/functions/markerHelpers.js b/client/src/utils/map-utils/functions/markerHelpers.js deleted file mode 100644 index 815bbfa..0000000 --- a/client/src/utils/map-utils/functions/markerHelpers.js +++ /dev/null @@ -1,63 +0,0 @@ -import L from "leaflet"; - - -/** - * Takes an image URL and optional size, anchor, popup params and returns a Leaflet Icon. - * - * @param path Image URL - * @param size Array of 2 integers representing the size of the icon - * @param anchor Array of 2 integers representing the point of the icon which corresponds to the icon location - * @param popup Array of 2 integers representing the position of the popup relative to the icon acnhor - * @returns A Leaflet Icon - */ -export function createIcon(path, - {size=[24,24], anchor=[12,24], popup=[0,-20]} = {}){ - return L.icon({ - iconUrl: path, - iconSize: size, - iconAnchor: anchor, - popupAnchor: popup - - }); - -} - - -/** - * Updates a state setter with the latitude and longitude of a marker. - * - * @param marker Marker Object with lat and lon fields - * @param setter React Hook to be set with Marker position values - */ -export function handleMarkerClick(marker,setter){ - setter([marker.latitude,marker.longitude]); -} - -/** - * Returns an array of positions representing points from which to draw Leaflet polygons or polylines. - * - * @param marker Object with polygon field - * @returns Array of positions that can be passed to Leaflet polygons/polylines - */ -export function computePolyPositions(marker) { - const positions = []; - for (const pos of marker.polygon) { - positions.push([pos[1], pos[0]]); - } - //console.log(positions); - return positions; -} - - -/** - * Returns a latitude integer shifted by 360 degrees. - * - * @param lon Integer representing a latitude value - * @returns An integer representing the latitude value shifted by 360 degrees - */ -export function shiftPos(lon){ - if( lon > 0){ - return lon - 360; - } - return lon; -} \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/black-triangle.svg b/client/src/utils/map-utils/icons/black-triangle.svg deleted file mode 100644 index 7dec057..0000000 --- a/client/src/utils/map-utils/icons/black-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/src/utils/map-utils/icons/camera.svg b/client/src/utils/map-utils/icons/camera.svg deleted file mode 100644 index 3f17e34..0000000 --- a/client/src/utils/map-utils/icons/camera.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/cloud.svg b/client/src/utils/map-utils/icons/cloud.svg deleted file mode 100644 index 617046d..0000000 --- a/client/src/utils/map-utils/icons/cloud.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/gps-solid.svg b/client/src/utils/map-utils/icons/gps-solid.svg deleted file mode 100644 index d07caac..0000000 --- a/client/src/utils/map-utils/icons/gps-solid.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/green-triangle.svg b/client/src/utils/map-utils/icons/green-triangle.svg deleted file mode 100644 index 3c0726b..0000000 --- a/client/src/utils/map-utils/icons/green-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/src/utils/map-utils/icons/line-segment.svg b/client/src/utils/map-utils/icons/line-segment.svg deleted file mode 100644 index 6560c33..0000000 --- a/client/src/utils/map-utils/icons/line-segment.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/red-triangle.svg b/client/src/utils/map-utils/icons/red-triangle.svg deleted file mode 100644 index 8da16aa..0000000 --- a/client/src/utils/map-utils/icons/red-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/src/utils/map-utils/icons/sound-black.svg b/client/src/utils/map-utils/icons/sound-black.svg deleted file mode 100644 index fce266b..0000000 --- a/client/src/utils/map-utils/icons/sound-black.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/triangle-black.svg b/client/src/utils/map-utils/icons/triangle-black.svg deleted file mode 100644 index 900d83a..0000000 --- a/client/src/utils/map-utils/icons/triangle-black.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/volcano-smoke.svg b/client/src/utils/map-utils/icons/volcano-smoke.svg deleted file mode 100644 index d0c5118..0000000 --- a/client/src/utils/map-utils/icons/volcano-smoke.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/volcano-solid.svg b/client/src/utils/map-utils/icons/volcano-solid.svg deleted file mode 100644 index da34fcc..0000000 --- a/client/src/utils/map-utils/icons/volcano-solid.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/client/src/utils/map-utils/icons/yellow-triangle.svg b/client/src/utils/map-utils/icons/yellow-triangle.svg deleted file mode 100644 index 48603ed..0000000 --- a/client/src/utils/map-utils/icons/yellow-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/src/utils/map-utils/map-configs/nvewsMapFilterConfig.js b/client/src/utils/map-utils/map-configs/nvewsMapFilterConfig.js deleted file mode 100644 index 585f8f1..0000000 --- a/client/src/utils/map-utils/map-configs/nvewsMapFilterConfig.js +++ /dev/null @@ -1,44 +0,0 @@ - - -export const mapFilterConfig = [ - { - id: "observatory", - label: "Observatory", - type: "checkbox", - options: [ - { label: "CVO", value: "CVO" }, - { label: "HVO", value: "HVO" }, - { label: "AVO", value: "AVO" }, - { label: "YVO", value: "YVO" }, - ], - target: { kind: "data", field: "volcano_group", op: "in" }, - defaultValue: [], - }, - { - id:"stations", - label: "Stations", - type: "checkbox", - options: [ - { label: "Seismic", value: "seismic_stations"}, - { label: "GNSS", value: "gnss_stations"}, - { label: "Cameras", value: "camera_stations"}, - { label: "Infrasound", value: "infrasound_stations"}, - { label: "Tilt", value: "tiltmeter_stations"}, - { label: "Real-Time Gas", value: "gas_stations"}, - ], - target: { kind: "stationType"}, - defaultValue: [], - - }, - // { - // id: "overlay", - // label: "Overlay", - // type: "checkbox", - // options: [ - // { label: "Overlay 1", value: "overlay1" }, - // { label: "Overlay 2", value: "overlay2" }, - // ], - // target: { kind: "mapOverlay" }, - // defaultValue: [], - // }, -]; \ No newline at end of file diff --git a/client/src/utils/pctStyles.js b/client/src/utils/pctStyles.js deleted file mode 100644 index 0a8bbe5..0000000 --- a/client/src/utils/pctStyles.js +++ /dev/null @@ -1,7 +0,0 @@ -export function pctStyles(val, high, mid) { - if (val == null || Number.isNaN(val)) return {}; - if (val < mid) return { bg: "red.100", color: "red.800", fontWeight: "semibold" }; - if (val < high) return { bg: "yellow.100", color: "yellow.800" }; - if (val > high) return { bg: "blue.100", color: "blue.800" }; - return { bg: "green.100", color: "green.800" }; -} \ No newline at end of file