1
0
Fork 0
mirror of https://github.com/Findus23/vienna-cycling-quality.git synced 2024-09-09 04:13:48 +02:00

cherry-pick all upstream commits until now

This commit is contained in:
Lukas Winkler 2024-04-03 22:55:32 +02:00
parent 099eee7bee
commit cfec34ae1e
Signed by: lukas
GPG key ID: 54DE4D798D244853
17 changed files with 500 additions and 304 deletions

373
package-lock.json generated
View file

@ -10,7 +10,7 @@
"dependencies": {
"@headlessui/react": "^1.7.18",
"@nanostores/react": "^0.7.2",
"@nanostores/router": "^0.13.0",
"@nanostores/router": "^0.14.1",
"@turf/turf": "^7.0.0-alpha.114",
"maplibre-gl": "^4.1.1",
"matomo-lite-tracker": "github:Findus23/MatomoLiteTracker",
@ -86,27 +86,27 @@
}
},
"node_modules/@babel/compat-data": {
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz",
"integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==",
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz",
"integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.24.3",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz",
"integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz",
"integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.24.2",
"@babel/generator": "^7.24.1",
"@babel/generator": "^7.24.4",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helpers": "^7.24.1",
"@babel/parser": "^7.24.1",
"@babel/helpers": "^7.24.4",
"@babel/parser": "^7.24.4",
"@babel/template": "^7.24.0",
"@babel/traverse": "^7.24.1",
"@babel/types": "^7.24.0",
@ -134,9 +134,9 @@
}
},
"node_modules/@babel/generator": {
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz",
"integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==",
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz",
"integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.24.0",
@ -299,9 +299,9 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz",
"integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==",
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz",
"integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==",
"dev": true,
"dependencies": {
"@babel/template": "^7.24.0",
@ -328,9 +328,9 @@
}
},
"node_modules/@babel/parser": {
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz",
"integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",
"integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@ -370,9 +370,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz",
"integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==",
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz",
"integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@ -956,9 +956,9 @@
}
},
"node_modules/@humanwhocodes/object-schema": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
"integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"dev": true
},
"node_modules/@isaacs/cliui": {
@ -1141,9 +1141,9 @@
}
},
"node_modules/@nanostores/router": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@nanostores/router/-/router-0.13.0.tgz",
"integrity": "sha512-oMFlgPLM2iswDbDDxwQ2loA1GRFrkEPMwKPRN+D7Ixihu/gWWwMX4na0EAYogHgpl2+nU5AqplwftiikNZ/4GA==",
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/@nanostores/router/-/router-0.14.1.tgz",
"integrity": "sha512-bmKngXQxF8d9RmvZe3iBKax/bVXb+PbkKKMR+34FeXWqwQbvGwzOxJyiCWNB0lHmBw/l9D3cRAAHEXrL0TEoFg==",
"funding": [
{
"type": "github",
@ -1154,7 +1154,7 @@
"node": "^18.0.0 || >=20.0.0"
},
"peerDependencies": {
"nanostores": "^0.9.0"
"nanostores": "^0.9.0 || ^0.10.0"
}
},
"node_modules/@nodelib/fs.scandir": {
@ -1203,9 +1203,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
"integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz",
"integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==",
"cpu": [
"arm"
],
@ -1216,9 +1216,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
"integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz",
"integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==",
"cpu": [
"arm64"
],
@ -1229,9 +1229,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
"integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz",
"integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==",
"cpu": [
"arm64"
],
@ -1242,9 +1242,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
"integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz",
"integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==",
"cpu": [
"x64"
],
@ -1255,9 +1255,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
"integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz",
"integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==",
"cpu": [
"arm"
],
@ -1268,9 +1268,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
"integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz",
"integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==",
"cpu": [
"arm64"
],
@ -1281,9 +1281,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
"integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz",
"integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==",
"cpu": [
"arm64"
],
@ -1293,10 +1293,23 @@
"linux"
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz",
"integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==",
"cpu": [
"ppc64le"
],
"dev": true,
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
"integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz",
"integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==",
"cpu": [
"riscv64"
],
@ -1306,10 +1319,23 @@
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz",
"integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==",
"cpu": [
"s390x"
],
"dev": true,
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
"integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.0.tgz",
"integrity": "sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==",
"cpu": [
"x64"
],
@ -1320,9 +1346,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
"integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.0.tgz",
"integrity": "sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==",
"cpu": [
"x64"
],
@ -1333,9 +1359,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
"integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz",
"integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==",
"cpu": [
"arm64"
],
@ -1346,9 +1372,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
"integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz",
"integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==",
"cpu": [
"ia32"
],
@ -1359,9 +1385,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
"integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz",
"integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==",
"cpu": [
"x64"
],
@ -1384,9 +1410,9 @@
}
},
"node_modules/@tailwindcss/typography": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
"integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==",
"version": "0.5.12",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.12.tgz",
"integrity": "sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==",
"dev": true,
"dependencies": {
"lodash.castarray": "^4.4.0",
@ -3260,9 +3286,9 @@
"dev": true
},
"node_modules/@types/leaflet": {
"version": "1.9.8",
"resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.8.tgz",
"integrity": "sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg==",
"version": "1.9.9",
"resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.9.tgz",
"integrity": "sha512-o0qD9ReJzWpGNIAY0O32NkpfM6rhV4sxnwVkz7x7Ah4Zy9sP+2T9Q3byccL5la1ZX416k+qiyvt8ksBavPPY7A==",
"dependencies": {
"@types/geojson": "*"
}
@ -3302,31 +3328,24 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.2.69",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.69.tgz",
"integrity": "sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==",
"version": "18.2.74",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.74.tgz",
"integrity": "sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
"node_modules/@types/react-dom": {
"version": "18.2.22",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz",
"integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==",
"version": "18.2.23",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz",
"integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==",
"dev": true,
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/scheduler": {
"version": "0.16.8",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
"integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
"dev": true
},
"node_modules/@types/semver": {
"version": "7.5.8",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
@ -3342,16 +3361,16 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz",
"integrity": "sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz",
"integrity": "sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.5.1",
"@typescript-eslint/scope-manager": "7.3.1",
"@typescript-eslint/type-utils": "7.3.1",
"@typescript-eslint/utils": "7.3.1",
"@typescript-eslint/visitor-keys": "7.3.1",
"@typescript-eslint/scope-manager": "7.5.0",
"@typescript-eslint/type-utils": "7.5.0",
"@typescript-eslint/utils": "7.5.0",
"@typescript-eslint/visitor-keys": "7.5.0",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.4",
@ -3377,15 +3396,15 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.3.1.tgz",
"integrity": "sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.5.0.tgz",
"integrity": "sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==",
"dev": true,
"dependencies": {
"@typescript-eslint/scope-manager": "7.3.1",
"@typescript-eslint/types": "7.3.1",
"@typescript-eslint/typescript-estree": "7.3.1",
"@typescript-eslint/visitor-keys": "7.3.1",
"@typescript-eslint/scope-manager": "7.5.0",
"@typescript-eslint/types": "7.5.0",
"@typescript-eslint/typescript-estree": "7.5.0",
"@typescript-eslint/visitor-keys": "7.5.0",
"debug": "^4.3.4"
},
"engines": {
@ -3405,13 +3424,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz",
"integrity": "sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz",
"integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "7.3.1",
"@typescript-eslint/visitor-keys": "7.3.1"
"@typescript-eslint/types": "7.5.0",
"@typescript-eslint/visitor-keys": "7.5.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@ -3422,13 +3441,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz",
"integrity": "sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz",
"integrity": "sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==",
"dev": true,
"dependencies": {
"@typescript-eslint/typescript-estree": "7.3.1",
"@typescript-eslint/utils": "7.3.1",
"@typescript-eslint/typescript-estree": "7.5.0",
"@typescript-eslint/utils": "7.5.0",
"debug": "^4.3.4",
"ts-api-utils": "^1.0.1"
},
@ -3449,9 +3468,9 @@
}
},
"node_modules/@typescript-eslint/types": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz",
"integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz",
"integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==",
"dev": true,
"engines": {
"node": "^18.18.0 || >=20.0.0"
@ -3462,13 +3481,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz",
"integrity": "sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz",
"integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "7.3.1",
"@typescript-eslint/visitor-keys": "7.3.1",
"@typescript-eslint/types": "7.5.0",
"@typescript-eslint/visitor-keys": "7.5.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@ -3490,17 +3509,17 @@
}
},
"node_modules/@typescript-eslint/utils": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.3.1.tgz",
"integrity": "sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz",
"integrity": "sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0",
"@typescript-eslint/scope-manager": "7.3.1",
"@typescript-eslint/types": "7.3.1",
"@typescript-eslint/typescript-estree": "7.3.1",
"@typescript-eslint/scope-manager": "7.5.0",
"@typescript-eslint/types": "7.5.0",
"@typescript-eslint/typescript-estree": "7.5.0",
"semver": "^7.5.4"
},
"engines": {
@ -3515,12 +3534,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz",
"integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz",
"integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "7.3.1",
"@typescript-eslint/types": "7.5.0",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@ -3861,9 +3880,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001600",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz",
"integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==",
"version": "1.0.30001605",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz",
"integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==",
"dev": true,
"funding": [
{
@ -4166,9 +4185,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
"version": "1.4.715",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz",
"integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==",
"version": "1.4.724",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz",
"integrity": "sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA==",
"dev": true
},
"node_modules/emoji-regex": {
@ -5632,9 +5651,9 @@
}
},
"node_modules/maplibre-gl": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.1.1.tgz",
"integrity": "sha512-DmHru9FTHCOngNHzIx9W2+MlUziYPfPxd2qjyeWwczBYNx2SDpmH394MkuCvSgnfUm5Zvs4NaYCqMu44jUga1Q==",
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.1.2.tgz",
"integrity": "sha512-98T+3BesL4w/N39q/rgs9q6HzHLG6pgbS9UaTqg6fMISfzy2WGKokjK205ENFDDmEljj54/LTfdXgqg2XfYU4A==",
"dependencies": {
"@mapbox/geojson-rewind": "^0.5.2",
"@mapbox/jsonlint-lines-primitives": "^2.0.2",
@ -5789,9 +5808,9 @@
}
},
"node_modules/nanostores": {
"version": "0.9.5",
"resolved": "https://registry.npmjs.org/nanostores/-/nanostores-0.9.5.tgz",
"integrity": "sha512-Z+p+g8E7yzaWwOe5gEUB2Ox0rCEeXWYIZWmYvw/ajNYX8DlXdMvMDj8DWfM/subqPAcsf8l8Td4iAwO1DeIIRQ==",
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/nanostores/-/nanostores-0.10.2.tgz",
"integrity": "sha512-Z/nqsDGQvjYTXZcVge06IS8OAJ8Lzb1jLUSAbDDomDBtlSXh88M4toUKW3iKwN+BfblEXhft0KlwJ+bgGi/Ysw==",
"funding": [
{
"type": "github",
@ -5800,7 +5819,7 @@
],
"peer": true,
"engines": {
"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
"node": "^18.0.0 || >=20.0.0"
}
},
"node_modules/natural-compare": {
@ -6001,12 +6020,12 @@
"dev": true
},
"node_modules/path-scurry": {
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
"integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
"integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
"dev": true,
"dependencies": {
"lru-cache": "^9.1.1 || ^10.0.0",
"lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
@ -6532,9 +6551,9 @@
"integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg=="
},
"node_modules/rollup": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz",
"integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==",
"version": "4.14.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz",
"integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
@ -6547,19 +6566,21 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.13.0",
"@rollup/rollup-android-arm64": "4.13.0",
"@rollup/rollup-darwin-arm64": "4.13.0",
"@rollup/rollup-darwin-x64": "4.13.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
"@rollup/rollup-linux-arm64-gnu": "4.13.0",
"@rollup/rollup-linux-arm64-musl": "4.13.0",
"@rollup/rollup-linux-riscv64-gnu": "4.13.0",
"@rollup/rollup-linux-x64-gnu": "4.13.0",
"@rollup/rollup-linux-x64-musl": "4.13.0",
"@rollup/rollup-win32-arm64-msvc": "4.13.0",
"@rollup/rollup-win32-ia32-msvc": "4.13.0",
"@rollup/rollup-win32-x64-msvc": "4.13.0",
"@rollup/rollup-android-arm-eabi": "4.14.0",
"@rollup/rollup-android-arm64": "4.14.0",
"@rollup/rollup-darwin-arm64": "4.14.0",
"@rollup/rollup-darwin-x64": "4.14.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.14.0",
"@rollup/rollup-linux-arm64-gnu": "4.14.0",
"@rollup/rollup-linux-arm64-musl": "4.14.0",
"@rollup/rollup-linux-powerpc64le-gnu": "4.14.0",
"@rollup/rollup-linux-riscv64-gnu": "4.14.0",
"@rollup/rollup-linux-s390x-gnu": "4.14.0",
"@rollup/rollup-linux-x64-gnu": "4.14.0",
"@rollup/rollup-linux-x64-musl": "4.14.0",
"@rollup/rollup-win32-arm64-msvc": "4.14.0",
"@rollup/rollup-win32-ia32-msvc": "4.14.0",
"@rollup/rollup-win32-x64-msvc": "4.14.0",
"fsevents": "~2.3.2"
}
},
@ -6956,16 +6977,16 @@
}
},
"node_modules/sucrase/node_modules/glob": {
"version": "10.3.10",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
"integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
"version": "10.3.12",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
"integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
"dev": true,
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^2.3.5",
"jackspeak": "^2.3.6",
"minimatch": "^9.0.1",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
"path-scurry": "^1.10.1"
"minipass": "^7.0.4",
"path-scurry": "^1.10.2"
},
"bin": {
"glob": "dist/esm/bin.mjs"
@ -7030,9 +7051,9 @@
}
},
"node_modules/tailwindcss": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz",
"integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==",
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
"integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
"dev": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
@ -7043,7 +7064,7 @@
"fast-glob": "^3.3.0",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.19.1",
"jiti": "^1.21.0",
"lilconfig": "^2.1.0",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
@ -7299,13 +7320,13 @@
"dev": true
},
"node_modules/vite": {
"version": "5.2.6",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz",
"integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==",
"version": "5.2.8",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz",
"integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==",
"dev": true,
"dependencies": {
"esbuild": "^0.20.1",
"postcss": "^8.4.36",
"postcss": "^8.4.38",
"rollup": "^4.13.0"
},
"bin": {

View file

@ -12,7 +12,7 @@
"dependencies": {
"@headlessui/react": "^1.7.18",
"@nanostores/react": "^0.7.2",
"@nanostores/router": "^0.13.0",
"@nanostores/router": "^0.14.1",
"@turf/turf": "^7.0.0-alpha.114",
"maplibre-gl": "^4.1.1",
"matomo-lite-tracker": "github:Findus23/MatomoLiteTracker",

View file

@ -1,4 +1,4 @@
import { createSearchParams } from '@nanostores/router'
import { createSearchParams } from '../store/createSearchParams'
import { atom } from 'nanostores'
import type { MapGeoJSONFeature } from 'react-map-gl/maplibre'

View file

@ -10,10 +10,9 @@ import { Overlay } from './Overlay'
import { interactiveLayerIdsByGroup, legendByGroups } from './layers/layers'
import {
filterParamsKey,
filterParamsObject,
filterParamsStringify,
validAnzeigeValues,
type SearchParamsCqiMap,
type CqiMapSearchparams,
} from './storeCqi'
import {MapInfo} from "./MapInfo.tsx";
@ -24,7 +23,7 @@ type Props = {
}
export const CqiMap = ({ maxBounds, minZoom, maxZoom }: Props) => {
const params = useStore($searchParams) as SearchParamsCqiMap
const params = useStore($searchParams) as CqiMapSearchparams
// Guard against invalid "anzeige" param values
if (!validAnzeigeValues.includes(params.mode)) {

View file

@ -4,10 +4,10 @@ import type { FilterSpecification } from 'maplibre-gl'
import { Layer, Source } from 'react-map-gl/maplibre'
import { wrapFilterWithAll } from '../BaseMap/utils/wrapFilterWithAll'
import { layerByGroups, layersSelected, legendByGroups } from './layers/layers'
import { filterParamsObject, type SearchParamsCqiMap } from './storeCqi'
import { filterParamsObject, type CqiMapSearchparams } from './storeCqi'
import {default as dataTiles} from "../assets/data.pmtiles";
export const MapSourceCqi = () => {
const params = useStore($searchParams) as SearchParamsCqiMap
const params = useStore($searchParams) as CqiMapSearchparams
const mapData = useStore($clickedMapData)
const mapDataIds = mapData?.map((feature) => feature.properties?.id) ?? []
@ -17,7 +17,9 @@ export const MapSourceCqi = () => {
// console.log(map.current?.getStyle())
const pmtilesUrl = "pmtiles://" + dataTiles
const focusFilter: ['match', ['get', string], (string | number)[], boolean, boolean][] = []
const userFilterGroups: {
[group: string]: ['in', string, ...(string | number)[]][]
} = {}
const filters = filterParamsObject(params.filters)
const flatLayerGroups = Object.values(legendByGroups)
.map((groups) => groups)
@ -29,10 +31,14 @@ export const MapSourceCqi = () => {
.find((g) => g.key === groupKey)
?.legends?.find((l) => l.key === legendKey)?.filterConfig
if (filterConfig) {
focusFilter.push(['match', ['get', filterConfig.key], filterConfig.values, true, false])
userFilterGroups[groupKey!] = [
...(userFilterGroups[groupKey!] || []),
['in', filterConfig.key, ...filterConfig.values],
]
}
})
}
const userFilterExpression = Object.values(userFilterGroups).map((filters) => ['any', ...filters])
return (
<Source
@ -54,7 +60,7 @@ export const MapSourceCqi = () => {
layout={layer.layout}
filter={
wrapFilterWithAll([
wrapFilterWithAll(focusFilter),
...userFilterExpression,
...(layer.filter ? layer.filter : []),
['in', 'id', ...mapDataIds],
]) as FilterSpecification
@ -78,7 +84,7 @@ export const MapSourceCqi = () => {
layout={{ visibility: visible ? 'visible' : 'none' }}
filter={
wrapFilterWithAll([
wrapFilterWithAll(focusFilter),
...userFilterExpression,
...(layer.filter ? layer.filter : []),
]) as FilterSpecification
}

View file

@ -1,11 +1,11 @@
import { OverlayLayerSelection } from './OverlayLayerSelection'
import { OverlayLegendAndFocus } from './OverlayLegendAndFocus'
import { OverlayLegendAndFilter } from './OverlayLegendAndFilter.tsx'
export const Overlay = () => {
return (
<nav className="absolute left-6 top-6 flex flex-col rounded-md bg-white shadow">
<OverlayLayerSelection />
<OverlayLegendAndFocus />
<OverlayLegendAndFilter />
</nav>
)
}

View file

@ -3,19 +3,22 @@ import { RadioGroup } from '@headlessui/react'
import { useStore } from '@nanostores/react'
import { useEffect, useState } from 'react'
import { twJoin } from 'tailwind-merge'
import { layerSelection } from './layers/layers'
import { type SearchParamsCqiMap } from './storeCqi'
import { layerSelection, legendByGroups } from './layers/layers'
import { type CqiMapSearchparams } from './storeCqi'
import { defaultFilterByGroup, paramsWithDefaultFilters } from './utils/filterUtils'
export const OverlayLayerSelection = () => {
const params = useStore($searchParams)
const params = useStore($searchParams) as CqiMapSearchparams
// TODO: I really don't get why we need this but something prevents the rerendering of the buttons so the active state is wrong. Did not find any AstroJS Docs on this. And we are doing what we are supposed to do with nanostores.
const [localSelected, setLocalSelected] = useState<SearchParamsCqiMap['mode']>('cqi')
const [localSelected, setLocalSelected] = useState<CqiMapSearchparams['mode']>('cqi')
const setSelected = (value: string) => {
delete params.filter
const setSelected = (value: CqiMapSearchparams['mode']) => {
params.mode = value
$searchParams.open(params)
setLocalSelected(value as SearchParamsCqiMap['mode'])
const curentLegendGroup = legendByGroups[params?.mode ?? 'cqi']
const defaultFilters = defaultFilterByGroup(curentLegendGroup)
const newParams = paramsWithDefaultFilters(defaultFilters, params)
$searchParams.open(newParams)
setLocalSelected(value)
}
// Initialize URL with filter=none
@ -23,7 +26,7 @@ export const OverlayLayerSelection = () => {
setSelected(params.mode || 'cqi')
}, [])
const handleChange = (value: SearchParamsCqiMap['mode']) => {
const handleChange = (value: CqiMapSearchparams['mode']) => {
setSelected(value)
}

View file

@ -2,22 +2,23 @@ import { $searchParams } from '../BaseMap/store'
import { Disclosure } from '@headlessui/react'
import { useStore } from '@nanostores/react'
import { twJoin } from 'tailwind-merge'
import { legendByGroups, type Legend } from './layers/layers'
import { legendByGroups } from './layers/layers'
import {
filterParamsKey,
filterParamsObject,
filterParamsStringify,
type SearchParamsCqiMap,
type CqiMapSearchparams,
} from './storeCqi'
import { defaultFilterByGroup, paramsWithDefaultFilters } from './utils/filterUtils'
export const OverlayLegendAndFocus = () => {
const params = useStore($searchParams) as SearchParamsCqiMap
export const OverlayLegendAndFilter = () => {
const params = useStore($searchParams) as CqiMapSearchparams
const curentLegendGroup = legendByGroups[params?.mode ?? 'cqi']
// const map = useMap()
// console.log(map.current?.getStyle())
const smallScreen = typeof window !== 'undefined' && window.innerWidth < 1024
const legendDefaultClosedOnSmallScreen = typeof window !== 'undefined' && window.innerWidth < 1024
const filters = filterParamsObject(params.filters)
@ -25,45 +26,63 @@ export const OverlayLegendAndFocus = () => {
const active = filters?.includes(key)
if (active) {
// remove
console.log('Remove filter1', key, filters)
const newFilterString = filterParamsStringify(filters?.filter((f) => f !== key))
if (!newFilterString) {
delete params.filters
}
const newParams = newFilterString ? { ...params, ...{ filters: newFilterString } } : params
$searchParams.open(newParams)
console.log('Remove filter2', newParams)
} else {
// add
const filterString = filterParamsStringify([params?.filters, key])
const newParams = filterString ? { ...params, ...{ filters: filterString } } : params
$searchParams.open(newParams)
console.log('Add filter', newParams)
}
}
// State if no filter is active except the default filter.
// State if no filter is active except the default filter.
const defaultFilters = defaultFilterByGroup(curentLegendGroup)
const currentNonDefaultFilter = filters?.filter((f) => !defaultFilters.includes(f))
const noUserFilter = currentNonDefaultFilter ? currentNonDefaultFilter?.length === 0 : true
const resetFilter = () => {
const newParams = paramsWithDefaultFilters(defaultFilters, params)
$searchParams.open(newParams)
}
return (
<Disclosure defaultOpen={!smallScreen}>
<Disclosure defaultOpen={!legendDefaultClosedOnSmallScreen}>
{({ open }) => (
<>
<Disclosure.Button
className={twJoin(
'gap-1 px-2 py-2 text-sm hover:font-medium',
smallScreen ? 'flex' : 'hidden',
)}
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className={twJoin('h-5 w-5 transition-transform', open ? 'rotate-90 transform' : '')}
>
<path strokeLinecap="round" strokeLinejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
</svg>
Legende
</Disclosure.Button>
<div className="flex items-center justify-between">
<Disclosure.Button className="flex grow gap-1 px-2 py-2 text-sm hover:font-medium">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className={twJoin(
'h-5 w-5 transition-transform',
open ? 'rotate-90 transform' : '',
)}
>
<path strokeLinecap="round" strokeLinejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
</svg>
Legende
</Disclosure.Button>
{!noUserFilter && (
<>
<button
onClick={resetFilter}
className="mr-1 underline decoration-yellow-500 underline-offset-2 hover:decoration-2"
>
Filter löschen
</button>
</>
)}
</div>
<Disclosure.Panel>
{curentLegendGroup.map((legendGroup) => {
return (
@ -74,7 +93,6 @@ export const OverlayLegendAndFocus = () => {
<ul
className={twJoin(
'group/legend px-2 pb-4 text-sm font-normal leading-4 text-gray-900',
open && smallScreen ? '' : 'pt-4',
)}
>
{legendGroup.legends.map((legend) => {

View file

@ -3,7 +3,7 @@ import { useStore } from '@nanostores/react'
import { twJoin } from 'tailwind-merge'
import { legendCqi } from '../layers/layersCqi'
import { legendLts } from '../layers/layersLts'
import type { SearchParamsCqiMap } from '../storeCqi'
import type { CqiMapSearchparams } from '../storeCqi'
import { MapInspectorValueAsList } from './MapInspectorValueAsList'
type Props = {
@ -11,7 +11,7 @@ type Props = {
}
export const MapInspectorPrimaryInformation = ({ properties }: Props) => {
const params = useStore($searchParams) as SearchParamsCqiMap
const params = useStore($searchParams) as CqiMapSearchparams
if (!properties) {
return null

View file

@ -1,5 +1,5 @@
import { cleanupMapboxLayerJson } from '../../BaseMap/utils/cleanupMapboxLayerJson'
import type { SearchParamsCqiMap } from '../storeCqi'
import type { CqiMapSearchparams } from '../storeCqi'
import { layersCqi, legendCqi } from './layersCqi'
import { layersIncompletness, legendIncompletness } from './layersIncompletness'
import { layersLts, legendLts } from './layersLts'
@ -50,7 +50,7 @@ export const layersSelected = [
]
export const layerSelection: {
key: SearchParamsCqiMap['mode']
key: CqiMapSearchparams['mode']
name: string
description: null | string
}[] = [
@ -59,14 +59,13 @@ export const layerSelection: {
{ key: 'incompleteness', name: 'Datenlücken', description: null },
]
export const layerByGroups: Record<SearchParamsCqiMap['mode'], Record<string, any>[]> = {
export const layerByGroups: Record<CqiMapSearchparams['mode'], Record<string, any>[]> = {
cqi: layersCqi,
lts: layersLts,
incompleteness: layersIncompletness,
}
export type FilterConfig = {
groupKey: LegendGroup['key']
key: string
values: (string | number)[]
}
@ -86,7 +85,7 @@ export type Legend = {
defaultOn?: true
}
export const legendByGroups: Record<SearchParamsCqiMap['anzeige'], LegendGroup[]> = {
export const legendByGroups: Record<CqiMapSearchparams['mode'], LegendGroup[]> = {
cqi: legendCqi,
lts: legendLts,
incompleteness: legendIncompletness,

View file

@ -360,74 +360,74 @@ export const layersCqi = [
export const legendCqi: LegendGroup[] = [
{
title: 'Hauptkategorie',
key: 'main',
key: 'cqi',
primary: true,
legends: [
{
key: 'index_0',
key: 'l0',
color: '#7a0403',
label: '0-9 (am schlechtesten)',
filterConfig: { groupKey: 'main', key: 'index_10', values: [0] },
filterConfig: { key: 'index_10', values: [0] },
},
{
key: 'index_1',
key: 'l1',
color: '#ab1b04',
label: '10-19',
filterConfig: { groupKey: 'main', key: 'index_10', values: [1] },
filterConfig: { key: 'index_10', values: [1] },
},
{
key: 'index_2',
key: 'l2',
color: '#d54a12',
label: '20-29',
filterConfig: { groupKey: 'main', key: 'index_10', values: [2] },
filterConfig: { key: 'index_10', values: [2] },
},
{
key: 'index_3',
key: 'l3',
color: '#f5a038',
label: '30-39',
filterConfig: { groupKey: 'main', key: 'index_10', values: [3] },
filterConfig: { key: 'index_10', values: [3] },
},
{
key: 'index_4',
key: 'l4',
color: '#f3cf33',
label: '40-49',
filterConfig: { groupKey: 'main', key: 'index_10', values: [4] },
filterConfig: { key: 'index_10', values: [4] },
},
{
key: 'index_5',
key: 'l5',
color: '#e6f122',
label: '50-59',
filterConfig: { groupKey: 'main', key: 'index_10', values: [5] },
filterConfig: { key: 'index_10', values: [5] },
},
{
key: 'index_6',
key: 'l6',
color: '#a7c878',
label: '60-69',
filterConfig: { groupKey: 'main', key: 'index_10', values: [6] },
filterConfig: { key: 'index_10', values: [6] },
},
{
key: 'index_7',
key: 'l7',
color: '#679fce',
label: '70-79',
filterConfig: { groupKey: 'main', key: 'index_10', values: [7] },
filterConfig: { key: 'index_10', values: [7] },
},
{
key: 'index_8',
key: 'l8',
color: '#4473e1',
label: '80-89',
filterConfig: { groupKey: 'main', key: 'index_10', values: [8] },
filterConfig: { key: 'index_10', values: [8] },
},
{
key: 'index_9',
key: 'l9',
color: '#436dda',
label: '90-99',
filterConfig: { groupKey: 'main', key: 'index_10', values: [9] },
filterConfig: { key: 'index_10', values: [9] },
},
{
key: 'index_10',
key: 'l10',
color: '#4143a7',
label: '100 (am besten)',
filterConfig: { groupKey: 'main', key: 'index_10', values: [10] },
filterConfig: { key: 'index_10', values: [10] },
},
],
},
@ -440,7 +440,7 @@ export const legendCqi: LegendGroup[] = [
key: 'yes',
color: 'gray',
label: 'Nur nutzbare anzeigen',
filterConfig: { groupKey: 'usable', key: 'filter_usable', values: [1] },
filterConfig: { key: 'filter_usable', values: [1] },
defaultOn: true,
},
],

View file

@ -190,68 +190,68 @@ export const layersIncompletness = [
export const legendIncompletness: LegendGroup[] = [
{
title: 'Hauptkategorie',
key: 'main',
key: 'missing',
primary: true,
legends: [
{
key: 'incompleteness_0',
key: 'm0',
color: '#fafafa',
label: 'Vollständige Daten',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [0] },
filterConfig: { key: 'data_incompleteness', values: [0] },
},
{
key: 'incompleteness_10',
key: 'm10',
color: '#dfdfdf',
label: 'Wenige Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [10] },
filterConfig: { key: 'data_incompleteness', values: [10] },
},
{
key: 'incompleteness_20',
key: 'm20',
color: '#c4c4c4',
label: 'Wenige Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [20] },
filterConfig: { key: 'data_incompleteness', values: [20] },
},
{
key: 'incompleteness_30',
key: 'm30',
color: '#a8a8a8',
label: 'Einige Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [30] },
filterConfig: { key: 'data_incompleteness', values: [30] },
},
{
key: 'incompleteness_40',
key: 'm40',
color: '#8d8d8d',
label: 'Einige Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [40] },
filterConfig: { key: 'data_incompleteness', values: [40] },
},
{
key: 'incompleteness_50',
key: 'm50',
color: '#727272',
label: 'Viele Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [50] },
filterConfig: { key: 'data_incompleteness', values: [50] },
},
{
key: 'incompleteness_60',
key: 'm60',
color: '#575757',
label: 'Viele Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [60] },
filterConfig: { key: 'data_incompleteness', values: [60] },
},
{
key: 'incompleteness_70',
key: 'm70',
color: '#3b3b3b',
label: 'Sehr viele Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [70] },
filterConfig: { key: 'data_incompleteness', values: [70] },
},
{
key: 'incompleteness_80',
key: 'm80',
color: '#202020',
label: 'Sehr viele Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [80] },
filterConfig: { key: 'data_incompleteness', values: [80] },
},
{
key: 'incompleteness_90',
key: 'm90',
color: '#000000',
label: 'Fast alle Daten fehlen',
filterConfig: { groupKey: 'main', key: 'data_incompleteness', values: [90] },
filterConfig: { key: 'data_incompleteness', values: [90] },
},
],
},