diff --git a/README.md b/README.md
index 7b54da5..df60910 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,7 @@ npm run dev
```
## Build for production
+
```bash
npm run build
```
diff --git a/index.html b/index.html
index c1a046d..75a8de5 100644
--- a/index.html
+++ b/index.html
@@ -1,17 +1,86 @@
+
+
+
+
-
-
-
- Listenbourg Map
+
+
+
+ ListenMap
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
index 32648e9..ba2f80d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,905 +1,2057 @@
{
- "name": "listenbourgmap",
- "version": "0.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "listenbourgmap",
- "version": "0.0.0",
- "devDependencies": {
- "typescript": "^4.6.4",
- "vite": "^3.2.0"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
- "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
- "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
- "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
- "dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/android-arm": "0.15.12",
- "@esbuild/linux-loong64": "0.15.12",
- "esbuild-android-64": "0.15.12",
- "esbuild-android-arm64": "0.15.12",
- "esbuild-darwin-64": "0.15.12",
- "esbuild-darwin-arm64": "0.15.12",
- "esbuild-freebsd-64": "0.15.12",
- "esbuild-freebsd-arm64": "0.15.12",
- "esbuild-linux-32": "0.15.12",
- "esbuild-linux-64": "0.15.12",
- "esbuild-linux-arm": "0.15.12",
- "esbuild-linux-arm64": "0.15.12",
- "esbuild-linux-mips64le": "0.15.12",
- "esbuild-linux-ppc64le": "0.15.12",
- "esbuild-linux-riscv64": "0.15.12",
- "esbuild-linux-s390x": "0.15.12",
- "esbuild-netbsd-64": "0.15.12",
- "esbuild-openbsd-64": "0.15.12",
- "esbuild-sunos-64": "0.15.12",
- "esbuild-windows-32": "0.15.12",
- "esbuild-windows-64": "0.15.12",
- "esbuild-windows-arm64": "0.15.12"
- }
- },
- "node_modules/esbuild-android-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
- "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-android-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
- "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-darwin-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
- "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-darwin-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
- "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-freebsd-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
- "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-freebsd-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
- "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-32": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
- "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
- "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
- "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
- "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-mips64le": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
- "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-ppc64le": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
- "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-riscv64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
- "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-s390x": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
- "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-netbsd-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
- "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-openbsd-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
- "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-sunos-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
- "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-32": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
- "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
- "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
- "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
- "dev": true,
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "node_modules/postcss": {
- "version": "8.4.18",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
- "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/rollup": {
- "version": "2.79.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
- "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
- "dev": true,
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typescript": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
- "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/vite": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.2.tgz",
- "integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==",
- "dev": true,
- "dependencies": {
- "esbuild": "^0.15.9",
- "postcss": "^8.4.18",
- "resolve": "^1.22.1",
- "rollup": "^2.79.1"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- },
- "peerDependencies": {
- "less": "*",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "less": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- }
- },
- "dependencies": {
- "@esbuild/android-arm": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
- "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-loong64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
- "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
- "dev": true,
- "optional": true
- },
- "esbuild": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
- "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
- "dev": true,
- "requires": {
- "@esbuild/android-arm": "0.15.12",
- "@esbuild/linux-loong64": "0.15.12",
- "esbuild-android-64": "0.15.12",
- "esbuild-android-arm64": "0.15.12",
- "esbuild-darwin-64": "0.15.12",
- "esbuild-darwin-arm64": "0.15.12",
- "esbuild-freebsd-64": "0.15.12",
- "esbuild-freebsd-arm64": "0.15.12",
- "esbuild-linux-32": "0.15.12",
- "esbuild-linux-64": "0.15.12",
- "esbuild-linux-arm": "0.15.12",
- "esbuild-linux-arm64": "0.15.12",
- "esbuild-linux-mips64le": "0.15.12",
- "esbuild-linux-ppc64le": "0.15.12",
- "esbuild-linux-riscv64": "0.15.12",
- "esbuild-linux-s390x": "0.15.12",
- "esbuild-netbsd-64": "0.15.12",
- "esbuild-openbsd-64": "0.15.12",
- "esbuild-sunos-64": "0.15.12",
- "esbuild-windows-32": "0.15.12",
- "esbuild-windows-64": "0.15.12",
- "esbuild-windows-arm64": "0.15.12"
- }
- },
- "esbuild-android-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
- "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
- "dev": true,
- "optional": true
- },
- "esbuild-android-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
- "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
- "dev": true,
- "optional": true
- },
- "esbuild-darwin-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
- "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
- "dev": true,
- "optional": true
- },
- "esbuild-darwin-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
- "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
- "dev": true,
- "optional": true
- },
- "esbuild-freebsd-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
- "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
- "dev": true,
- "optional": true
- },
- "esbuild-freebsd-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
- "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-32": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
- "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
- "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-arm": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
- "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
- "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-mips64le": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
- "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-ppc64le": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
- "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-riscv64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
- "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-s390x": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
- "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
- "dev": true,
- "optional": true
- },
- "esbuild-netbsd-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
- "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
- "dev": true,
- "optional": true
- },
- "esbuild-openbsd-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
- "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
- "dev": true,
- "optional": true
- },
- "esbuild-sunos-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
- "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-32": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
- "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
- "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-arm64": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
- "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
- "dev": true,
- "optional": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "postcss": {
- "version": "8.4.18",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
- "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
- "dev": true,
- "requires": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- }
- },
- "resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "rollup": {
- "version": "2.79.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
- "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
- "dev": true,
- "requires": {
- "fsevents": "~2.3.2"
- }
- },
- "source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
- },
- "typescript": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
- "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
- "dev": true
- },
- "vite": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.2.tgz",
- "integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==",
- "dev": true,
- "requires": {
- "esbuild": "^0.15.9",
- "fsevents": "~2.3.2",
- "postcss": "^8.4.18",
- "resolve": "^1.22.1",
- "rollup": "^2.79.1"
- }
- }
- }
+ "name": "listenbourgmap",
+ "version": "0.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "listenbourgmap",
+ "version": "0.0.0",
+ "dependencies": {
+ "@rollup/plugin-babel": "^6.0.2"
+ },
+ "devDependencies": {
+ "typescript": "^4.6.4",
+ "vite": "^3.2.0"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "peer": true,
+ "dependencies": {
+ "@babel/highlight": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
+ "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
+ "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
+ "peer": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.19.6",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-module-transforms": "^7.19.6",
+ "@babel/helpers": "^7.19.4",
+ "@babel/parser": "^7.19.6",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.1.tgz",
+ "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.20.0",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+ "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.20.0",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
+ "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.19.4",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
+ "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.19.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
+ "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.1",
+ "@babel/types": "^7.20.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.1.tgz",
+ "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==",
+ "peer": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.18.10",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
+ "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.18.10",
+ "@babel/types": "^7.18.10"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
+ "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.1",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.20.1",
+ "@babel/types": "^7.20.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz",
+ "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
+ "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
+ "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "peer": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@rollup/plugin-babel": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.2.tgz",
+ "integrity": "sha512-Vnt8XIWYwCf3MD7qhBWYlP9pjSZvcE++nlPXhQYw6YNehl5742AzFbrV6h4BHb20VAOVUlIksVLymQCTwVCGDg==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.18.6",
+ "@rollup/pluginutils": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ },
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+ "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001429",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz",
+ "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "peer": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "peer": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "peer": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
+ "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.15.12",
+ "@esbuild/linux-loong64": "0.15.12",
+ "esbuild-android-64": "0.15.12",
+ "esbuild-android-arm64": "0.15.12",
+ "esbuild-darwin-64": "0.15.12",
+ "esbuild-darwin-arm64": "0.15.12",
+ "esbuild-freebsd-64": "0.15.12",
+ "esbuild-freebsd-arm64": "0.15.12",
+ "esbuild-linux-32": "0.15.12",
+ "esbuild-linux-64": "0.15.12",
+ "esbuild-linux-arm": "0.15.12",
+ "esbuild-linux-arm64": "0.15.12",
+ "esbuild-linux-mips64le": "0.15.12",
+ "esbuild-linux-ppc64le": "0.15.12",
+ "esbuild-linux-riscv64": "0.15.12",
+ "esbuild-linux-s390x": "0.15.12",
+ "esbuild-netbsd-64": "0.15.12",
+ "esbuild-openbsd-64": "0.15.12",
+ "esbuild-sunos-64": "0.15.12",
+ "esbuild-windows-32": "0.15.12",
+ "esbuild-windows-64": "0.15.12",
+ "esbuild-windows-arm64": "0.15.12"
+ }
+ },
+ "node_modules/esbuild-android-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
+ "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-android-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
+ "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
+ "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
+ "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
+ "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
+ "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-32": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
+ "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
+ "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
+ "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
+ "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-mips64le": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
+ "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-ppc64le": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
+ "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-riscv64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
+ "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-s390x": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
+ "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-netbsd-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
+ "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-openbsd-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
+ "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-sunos-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
+ "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-32": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
+ "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
+ "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
+ "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "peer": true
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "peer": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "peer": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "peer": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "peer": true
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
+ "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.79.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "devOptional": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
+ "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.2.tgz",
+ "integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.15.9",
+ "postcss": "^8.4.18",
+ "resolve": "^1.22.1",
+ "rollup": "^2.79.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "less": "*",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "peer": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "peer": true,
+ "requires": {
+ "@babel/highlight": "^7.18.6"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
+ "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+ "peer": true
+ },
+ "@babel/core": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
+ "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
+ "peer": true,
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.19.6",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-module-transforms": "^7.19.6",
+ "@babel/helpers": "^7.19.4",
+ "@babel/parser": "^7.19.6",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.1.tgz",
+ "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==",
+ "peer": true,
+ "requires": {
+ "@babel/types": "^7.20.0",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "peer": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+ "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+ "peer": true,
+ "requires": {
+ "@babel/compat-data": "^7.20.0",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "peer": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "peer": true,
+ "requires": {
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "peer": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
+ "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
+ "peer": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.19.4",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
+ "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
+ "peer": true,
+ "requires": {
+ "@babel/types": "^7.19.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "peer": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "peer": true
+ },
+ "@babel/helpers": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
+ "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+ "peer": true,
+ "requires": {
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.1",
+ "@babel/types": "^7.20.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "peer": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.1.tgz",
+ "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==",
+ "peer": true
+ },
+ "@babel/template": {
+ "version": "7.18.10",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
+ "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+ "peer": true,
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.18.10",
+ "@babel/types": "^7.18.10"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
+ "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+ "peer": true,
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.1",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.20.1",
+ "@babel/types": "^7.20.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz",
+ "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==",
+ "requires": {
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@esbuild/android-arm": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
+ "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-loong64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
+ "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
+ "dev": true,
+ "optional": true
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "peer": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "peer": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "peer": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "peer": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "peer": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "@rollup/plugin-babel": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.2.tgz",
+ "integrity": "sha512-Vnt8XIWYwCf3MD7qhBWYlP9pjSZvcE++nlPXhQYw6YNehl5742AzFbrV6h4BHb20VAOVUlIksVLymQCTwVCGDg==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.18.6",
+ "@rollup/pluginutils": "^5.0.1"
+ }
+ },
+ "@rollup/pluginutils": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+ "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
+ "requires": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "@types/estree": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "peer": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "peer": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001429",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz",
+ "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==",
+ "peer": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "peer": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "peer": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "peer": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "peer": true
+ },
+ "esbuild": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
+ "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
+ "dev": true,
+ "requires": {
+ "@esbuild/android-arm": "0.15.12",
+ "@esbuild/linux-loong64": "0.15.12",
+ "esbuild-android-64": "0.15.12",
+ "esbuild-android-arm64": "0.15.12",
+ "esbuild-darwin-64": "0.15.12",
+ "esbuild-darwin-arm64": "0.15.12",
+ "esbuild-freebsd-64": "0.15.12",
+ "esbuild-freebsd-arm64": "0.15.12",
+ "esbuild-linux-32": "0.15.12",
+ "esbuild-linux-64": "0.15.12",
+ "esbuild-linux-arm": "0.15.12",
+ "esbuild-linux-arm64": "0.15.12",
+ "esbuild-linux-mips64le": "0.15.12",
+ "esbuild-linux-ppc64le": "0.15.12",
+ "esbuild-linux-riscv64": "0.15.12",
+ "esbuild-linux-s390x": "0.15.12",
+ "esbuild-netbsd-64": "0.15.12",
+ "esbuild-openbsd-64": "0.15.12",
+ "esbuild-sunos-64": "0.15.12",
+ "esbuild-windows-32": "0.15.12",
+ "esbuild-windows-64": "0.15.12",
+ "esbuild-windows-arm64": "0.15.12"
+ }
+ },
+ "esbuild-android-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
+ "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-android-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
+ "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
+ "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
+ "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
+ "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
+ "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-32": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
+ "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
+ "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
+ "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
+ "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-mips64le": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
+ "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-ppc64le": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
+ "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-riscv64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
+ "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-s390x": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
+ "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-netbsd-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
+ "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-openbsd-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
+ "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-sunos-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
+ "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-32": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
+ "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
+ "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-arm64": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
+ "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
+ "dev": true,
+ "optional": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "peer": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "peer": true
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "peer": true
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "peer": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "peer": true
+ },
+ "is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "peer": true
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "peer": true
+ },
+ "json5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "peer": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "peer": true
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "peer": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+ },
+ "postcss": {
+ "version": "8.4.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
+ "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "rollup": {
+ "version": "2.79.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "devOptional": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "peer": true
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "peer": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
+ },
+ "typescript": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
+ "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+ "dev": true
+ },
+ "update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "peer": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "vite": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.2.tgz",
+ "integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.15.9",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.18",
+ "resolve": "^1.22.1",
+ "rollup": "^2.79.1"
+ }
+ }
+ }
}
diff --git a/package.json b/package.json
index 607fc4f..641a6e6 100644
--- a/package.json
+++ b/package.json
@@ -1,15 +1,19 @@
{
- "name": "listenbourgmap",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "tsc && vite build",
- "preview": "vite preview"
- },
- "devDependencies": {
- "typescript": "^4.6.4",
- "vite": "^3.2.0"
- }
-}
\ No newline at end of file
+ "name": "listenbourgmap",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite --host",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "devDependencies": {
+ "@types/node": "^18.11.9",
+ "typescript": "^4.6.4",
+ "vite": "^3.2.0"
+ },
+ "dependencies": {
+ "@rollup/plugin-babel": "^6.0.2"
+ }
+}
diff --git a/public/assets/logo.svg b/public/assets/logo.svg
new file mode 100644
index 0000000..eb7fcf6
--- /dev/null
+++ b/public/assets/logo.svg
@@ -0,0 +1,18 @@
+
diff --git a/public/assets/logo_dark.svg b/public/assets/logo_dark.svg
new file mode 100644
index 0000000..f7b86eb
--- /dev/null
+++ b/public/assets/logo_dark.svg
@@ -0,0 +1,18 @@
+
diff --git a/public/css/design-system.css b/public/css/design-system.css
new file mode 100644
index 0000000..76c0dd4
--- /dev/null
+++ b/public/css/design-system.css
@@ -0,0 +1,153 @@
+html,
+body {
+ scroll-behavior: smooth;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ font-family: var(--font-listen);
+ color: var(--clr-text);
+ flex-direction: column;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+a {
+ color: var(--clr-blue);
+}
+a:hover {
+ color: var(--clr-blue-alt);
+}
+
+button {
+ padding: 7px 12px;
+ --clr-btn: var(--clr-red);
+ --border-width: 2px;
+ background-color: var(--clr-btn);
+ outline: var(--border-width) solid var(--clr-btn);
+ outline-offset: -1px; /*to avoid white space due to the radius*/
+ border: none;
+ margin: var(--border-width);
+ color: #fff;
+ font-weight: 500;
+ border-radius: var(--border-radius);
+ font-family: var(--font-listen);
+ font-size: 18px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+button.outline-only {
+ color: var(--clr-text);
+ background-color: transparent;
+}
+button.disabled {
+ cursor: not-allowed;
+ opacity: 50%;
+ pointer-events: none;
+}
+button:hover {
+ --clr-btn: var(--clr-red-alt);
+ cursor: pointer;
+}
+button span {
+ margin-right: 10px;
+ margin-top: -3px;
+ color: inherit;
+}
+
+form,
+.form {
+ margin-bottom: 20px;
+}
+form label,
+.form label {
+ font-weight: 600;
+ font-size: 14px;
+ color: var(--clr-text-alt);
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ border-radius: var(--border-radius);
+}
+form select,
+.form select {
+ width: 100%;
+ height: 40px;
+ cursor: pointer;
+ background: none;
+ background: var(--clr-bg-alt);
+ border-radius: var(--border-radius);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+form .selector,
+.form .selector {
+ position: relative;
+}
+form .selector:after,
+.form .selector:after {
+ content: ">";
+ position: absolute;
+ right: 2em;
+ margin: auto 0;
+ top: 25%;
+ color: var(--clr-text-alt);
+ transform: rotate(90deg) scaleY(1.5);
+ transition: all 0.2s ease-out;
+}
+form .selector:focus-within:after,
+.form .selector:focus-within:after {
+ transform: rotate(-90deg) scaleY(1.5);
+ transition: all 0.2s ease-out;
+}
+form .buttons,
+.form .buttons {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+}
+form button,
+.form button {
+ width: 100%;
+ margin-top: 10px;
+ font-size: 16px;
+}
+form input, form select,
+.form input,
+.form select {
+ display: block;
+ margin: 3px 0 15px 0;
+ padding: 8px 14px;
+ border-radius: var(--border-radius);
+ background: var(--clr-bg-alt);
+ color: var(--clr-text-alt);
+ font-weight: 500;
+ font-size: 18px;
+ width: 100%;
+ border: none;
+ color-scheme: var(--input-scheme);
+}
+form input:focus, form select:focus,
+.form input:focus,
+.form select:focus {
+ outline: 2px solid var(--clr-blue);
+}
+
+hr {
+ width: 100%;
+ border: solid 1px var(--clr-border);
+ margin: 1rem 0;
+}
+
+footer {
+ display: block;
+ color: var(--clr-text-alt);
+ font-weight: 500;
+ margin-top: auto;
+ padding-top: 20px;
+ font-size: smaller;
+}
\ No newline at end of file
diff --git a/public/css/design-system.scss b/public/css/design-system.scss
new file mode 100644
index 0000000..7895c5e
--- /dev/null
+++ b/public/css/design-system.scss
@@ -0,0 +1,149 @@
+html,
+body {
+ scroll-behavior: smooth;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ font-family: var(--font-listen);
+ color: var(--clr-text);
+ flex-direction: column;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+a {
+ color: var(--clr-blue);
+ &:hover {
+ color: var(--clr-blue-alt);
+ }
+}
+
+button {
+ padding: 7px 12px;
+ --clr-btn: var(--clr-red);
+ --border-width: 2px;
+ background-color: var(--clr-btn);
+ outline: var(--border-width) solid var(--clr-btn);
+ outline-offset: -1px; /*to avoid white space due to the radius*/
+ border: none;
+ margin: var(--border-width);
+ color: #fff;
+ font-weight: 500;
+
+ border-radius: var(--border-radius);
+ font-family: var(--font-listen);
+ font-size: 18px;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ &.outline-only {
+ color: var(--clr-text);
+ background-color: transparent;
+ }
+
+ &.disabled {
+ cursor: not-allowed;
+ opacity: 50%;
+ pointer-events: none;
+ }
+
+ &:hover {
+ --clr-btn: var(--clr-red-alt);
+ cursor: pointer;
+ }
+ & span {
+ margin-right: 10px;
+ margin-top: -3px;
+ color: inherit;
+ }
+}
+
+form,
+.form {
+ margin-bottom: 20px;
+ label {
+ font-weight: 600;
+ font-size: 14px;
+
+ color: var(--clr-text-alt);
+ text-transform: uppercase;
+ letter-spacing: 1px;
+
+ border-radius: var(--border-radius);
+ }
+ select {
+ width: 100%;
+ height: 40px;
+ cursor: pointer;
+ background: none;
+ background: var(--clr-bg-alt);
+ border-radius: var(--border-radius);
+ appearance: none;
+ }
+ .selector {
+ position: relative;
+ &:after {
+ content: ">";
+ position: absolute;
+ right: 2em;
+ margin: auto 0;
+ top: calc(100% / 4);
+ color: var(--clr-text-alt);
+ transform: rotate(90deg) scaleY(1.5);
+ transition: all 0.2s ease-out;
+ }
+ &:focus-within:after {
+ transform: rotate(-90deg) scaleY(1.5);
+ transition: all 0.2s ease-out;
+ }
+ }
+ .buttons {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ }
+ button {
+ width: 100%;
+ margin-top: 10px;
+ font-size: 16px;
+ }
+ & input,
+ & select {
+ display: block;
+ margin: 3px 0 15px 0;
+ padding: 8px 14px;
+ border-radius: var(--border-radius);
+ background: var(--clr-bg-alt);
+ color: var(--clr-text-alt);
+ font-weight: 500;
+ font-size: 18px;
+ width: 100%;
+ border: none;
+ color-scheme: var(--input-scheme);
+
+ &:focus {
+ outline: 2px solid var(--clr-blue);
+ }
+ }
+}
+
+hr {
+ width: 100%;
+ border: solid 1px var(--clr-border);
+ margin: 1rem 0;
+}
+
+footer {
+ display: block;
+ color: var(--clr-text-alt);
+ font-weight: 500;
+ margin-top: auto;
+ padding-top: 20px;
+ font-size: smaller;
+}
diff --git a/public/css/layout-outil-1.css b/public/css/layout-outil-1.css
new file mode 100644
index 0000000..249e427
--- /dev/null
+++ b/public/css/layout-outil-1.css
@@ -0,0 +1,165 @@
+html,
+body {
+ height: 100%;
+}
+
+body {
+ background-color: var(--clr-bg-alt);
+}
+body > * {
+ padding: 24px 16px;
+}
+
+* {
+ transition: all 0.2s ease-in-out;
+}
+
+.header {
+ background-color: var(--clr-bg);
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid var(--clr-border);
+ letter-spacing: -0.045em;
+}
+.header .header-logo {
+ flex: 1 1 auto;
+ background-image: var(--logo);
+ background-repeat: no-repeat;
+ background-size: contain;
+ width: auto;
+ height: 32px;
+}
+.header nav {
+ flex: 0 1 auto;
+ display: flex;
+ gap: 10px;
+ align-items: center;
+}
+.header nav .nav-btn {
+ font-size: 17px;
+ text-decoration: none;
+}
+.header nav .nav-btn.current {
+ text-decoration: underline;
+}
+.header nav .nav-btn.important {
+ color: var(--clr-red);
+}
+.header nav .nav-btn.important:hover {
+ color: var(--clr-red-alt);
+}
+
+.main {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+.main .card {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ padding: 0px;
+ background: var(--clr-bg);
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);
+ border-radius: var(--border-radius);
+ font-family: "HK Grotesk";
+ font-size: 17px;
+}
+.main .card .card-header {
+ width: 100%;
+ display: flex;
+ padding: 0px 20px;
+ gap: 20px;
+ border-bottom: 1px solid var(--clr-border);
+ align-items: center;
+ justify-content: space-between;
+ font-weight: 700;
+ position: relative;
+}
+.main .card .card-header .card-title {
+ gap: 20px;
+ padding: 10px 0;
+ align-items: center;
+}
+.main .card .card-header .card-tabs {
+ gap: 20px;
+ display: flex;
+}
+.main .card .card-header .card-tabs .card-tab {
+ padding: 10px 0;
+}
+.main .card .card-header .card-tabs .card-tab.active {
+ padding-bottom: 8px;
+ border-bottom: 2px solid var(--clr-red);
+}
+.main .card .loading.visible {
+ height: 2px;
+ position: absolute;
+ bottom: 0;
+ overflow: hidden;
+ left: 0;
+ right: 0;
+ transition: opacity 0.2s;
+}
+.main .card .loading.visible > div {
+ background-color: var(--clr-red);
+ width: 20%;
+ height: 100%;
+ -webkit-animation: loading 0.8s infinite;
+ animation: loading 0.8s infinite;
+}
+.main .card .card-content {
+ width: 100%;
+ padding: 20px;
+ gap: 10px;
+ display: flex;
+ flex-direction: column;
+ border-radius: 0 0 var(--border-radius) var(--border-radius);
+}
+.main .row {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+.main .part-title {
+ padding-top: 30px;
+ color: var(--clr-text-alt);
+ font-weight: bold;
+}
+
+@media screen and (min-width: 768px) {
+ .main .row {
+ flex-direction: row;
+ }
+ body > * {
+ padding: 24px 64px;
+ }
+}
+.footer {
+ color: var(--clr-text-alt);
+ margin-top: auto;
+}
+
+@-webkit-keyframes loading {
+ 0% {
+ width: 20%;
+ transform: translateX(-100%);
+ }
+ 100% {
+ width: 100%;
+ transform: translateX(100%);
+ }
+}
+
+@keyframes loading {
+ 0% {
+ width: 20%;
+ transform: translateX(-100%);
+ }
+ 100% {
+ width: 100%;
+ transform: translateX(100%);
+ }
+}
\ No newline at end of file
diff --git a/public/css/layout-outil-1.scss b/public/css/layout-outil-1.scss
new file mode 100644
index 0000000..f9134c6
--- /dev/null
+++ b/public/css/layout-outil-1.scss
@@ -0,0 +1,157 @@
+html,
+body {
+ height: 100%;
+}
+
+body {
+ background-color: var(--clr-bg-alt);
+ & > * {
+ padding: 24px 16px;
+ }
+}
+
+* {
+ transition: all 0.2s ease-in-out;
+}
+
+.header {
+ background-color: var(--clr-bg);
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid var(--clr-border);
+ letter-spacing: -0.045em;
+ .header-logo {
+ flex: 1 1 auto;
+ background-image: var(--logo);
+ background-repeat: no-repeat;
+ background-size: contain;
+
+ width: auto;
+ height: 32px;
+ }
+ nav {
+ flex: 0 1 auto;
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ .nav-btn {
+ font-size: 17px;
+ text-decoration: none;
+ &.current {
+ text-decoration: underline;
+ }
+ &.important {
+ color: var(--clr-red);
+ &:hover {
+ color: var(--clr-red-alt);
+ }
+ }
+ }
+ }
+}
+
+.main {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+
+ .card {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ padding: 0px;
+ background: var(--clr-bg);
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);
+ border-radius: var(--border-radius);
+ font-family: "HK Grotesk";
+ font-size: 17px;
+ .card-header {
+ width: 100%;
+ display: flex;
+ padding: 0px 20px;
+ gap: 20px;
+ border-bottom: 1px solid var(--clr-border);
+ align-items: center;
+ justify-content: space-between;
+ font-weight: 700;
+ position: relative;
+ .card-title {
+ gap: 20px;
+ padding: 10px 0;
+ align-items: center;
+ }
+ .card-tabs {
+ gap: 20px;
+ display: flex;
+ .card-tab {
+ padding: 10px 0;
+ &.active {
+ padding-bottom: 8px;
+ border-bottom: 2px solid var(--clr-red);
+ }
+ }
+ }
+ }
+ .loading.visible {
+ height: 2px;
+ position: absolute;
+ bottom: 0;
+ overflow: hidden;
+ left: 0;
+ right: 0;
+ transition: opacity 0.2s;
+
+ & > div {
+ background-color: var(--clr-red);
+ width: 20%;
+ height: 100%;
+ animation: loading 0.8s infinite;
+ }
+ }
+ .card-content {
+ width: 100%;
+ padding: 20px;
+ gap: 10px;
+ display: flex;
+ flex-direction: column;
+ border-radius: 0 0 var(--border-radius) var(--border-radius);
+ }
+ }
+
+ .row {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .part-title {
+ padding-top: 30px;
+ color: var(--clr-text-alt);
+ font-weight: bold;
+ }
+}
+@media screen and (min-width: 768px) {
+ .main .row {
+ flex-direction: row;
+ }
+ body > * {
+ padding: 24px 64px;
+ }
+}
+.footer {
+ color: var(--clr-text-alt);
+ margin-top: auto;
+}
+
+@keyframes loading {
+ 0% {
+ width: 20%;
+ transform: translateX(-100%);
+ }
+ 100% {
+ width: 100%;
+ transform: translateX(100%);
+ }
+}
diff --git a/public/css/listenmap.css b/public/css/listenmap.css
new file mode 100644
index 0000000..464748a
--- /dev/null
+++ b/public/css/listenmap.css
@@ -0,0 +1,50 @@
+:root {
+ --logo: url("../assets/logo.svg");
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --logo: url("../assets/logo_dark.svg");
+ }
+}
+#tooltip {
+ display: none;
+ position: absolute;
+ background-color: var(--clr-bg-alt);
+ padding: 8px;
+ color: var(--clr-text);
+ border-radius: var(--border-radius);
+ border: 1px solid var(--clr-border);
+ transition-duration: 0s;
+}
+
+main {
+ padding: 0;
+ gap: 0 !important;
+ border-bottom: 1px solid var(--clr-border);
+}
+
+.header .header-logo {
+ height: 64px;
+}
+
+body {
+ position: relative;
+ display: block;
+}
+body > *:not(main) {
+ padding: 8px 16px;
+}
+body > main {
+ position: relative;
+ padding: 0px;
+}
+
+@media screen and (min-width: 768px) {
+ body > *:not(main) {
+ padding: 8px 64px;
+ }
+ body > main {
+ padding: 0px;
+ }
+}
\ No newline at end of file
diff --git a/public/css/listenmap.scss b/public/css/listenmap.scss
new file mode 100644
index 0000000..e03a582
--- /dev/null
+++ b/public/css/listenmap.scss
@@ -0,0 +1,49 @@
+:root {
+ --logo: url("../assets/logo.svg");
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --logo: url("../assets/logo_dark.svg");
+ }
+}
+
+#tooltip {
+ display: none;
+ position: absolute;
+ background-color: var(--clr-bg-alt);
+ padding: 8px;
+ color: var(--clr-text);
+ border-radius: var(--border-radius);
+ border: 1px solid var(--clr-border);
+ transition-duration: 0s;
+}
+main {
+ padding: 0;
+ gap: 0 !important;
+ border-bottom: 1px solid var(--clr-border);
+}
+
+.header .header-logo {
+ height: 64px;
+}
+
+body {
+ position: relative;
+ display: block;
+ & > *:not(main) {
+ padding: 8px 16px;
+ }
+ & > main {
+ position: relative;
+ padding: 0px;
+ }
+}
+@media screen and (min-width: 768px) {
+ body > *:not(main) {
+ padding: 8px 64px;
+ }
+ body > main {
+ padding: 0px;
+ }
+}
diff --git a/public/css/theme.css b/public/css/theme.css
new file mode 100644
index 0000000..fddf8c6
--- /dev/null
+++ b/public/css/theme.css
@@ -0,0 +1,28 @@
+@import url("https://fonts.cdnfonts.com/css/hk-groteks");
+:root {
+ --font-listen: "HK Grotesk", sans-serif;
+ --clr-bg: #ffffff;
+ --clr-bg-alt: #e3e3e3;
+ --clr-border: #b5b5b5;
+ --clr-text: #212121;
+ --clr-text-alt: #999999;
+ --clr-red: #db0000;
+ --clr-red-alt: #fe2a2a;
+ --clr-blue: #0066ff;
+ --clr-blue-alt: #3785fb;
+ --clr-green: #12ca86;
+ --clr-orange: #ec6a13;
+ --border-radius: 8px;
+ --input-scheme: light;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --clr-bg: hsl(255, 7%, 11%);
+ --clr-bg-alt: hsl(255, 5%, 16%);
+ --clr-border: hsl(240, 3%, 23%);
+ --clr-text: hsl(0, 0%, 100%);
+ --clr-text-alt: hsl(150, 1%, 56%);
+ --input-scheme: dark;
+ }
+}
\ No newline at end of file
diff --git a/public/css/theme.scss b/public/css/theme.scss
new file mode 100644
index 0000000..e8eb07d
--- /dev/null
+++ b/public/css/theme.scss
@@ -0,0 +1,38 @@
+@import url("https://fonts.cdnfonts.com/css/hk-groteks");
+
+:root {
+ --font-listen: "HK Grotesk", sans-serif;
+
+ --clr-bg: #ffffff;
+ --clr-bg-alt: #e3e3e3;
+ --clr-border: #b5b5b5;
+
+ --clr-text: #212121;
+ --clr-text-alt: #999999;
+
+ --clr-red: #db0000;
+ --clr-red-alt: #fe2a2a;
+
+ --clr-blue: #0066ff;
+ --clr-blue-alt: #3785fb;
+
+ --clr-green: #12ca86;
+
+ --clr-orange: #ec6a13;
+
+ --border-radius: 8px;
+ --input-scheme: light;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --clr-bg: hsl(255, 7%, 11%);
+ --clr-bg-alt: hsl(255, 5%, 16%);
+ --clr-border: hsl(240, 3%, 23%);
+
+ --clr-text: hsl(0, 0%, 100%);
+ --clr-text-alt: hsl(150, 1%, 56%);
+
+ --input-scheme: dark;
+ }
+}
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 0000000..c2b3ac1
Binary files /dev/null and b/public/favicon.png differ
diff --git a/public/listenbourg.ico b/public/listenbourg.ico
deleted file mode 100644
index 386d12c..0000000
Binary files a/public/listenbourg.ico and /dev/null differ
diff --git a/src/assets/map_monochrome.svg b/src/assets/map_monochrome.svg
new file mode 100644
index 0000000..1272fca
--- /dev/null
+++ b/src/assets/map_monochrome.svg
@@ -0,0 +1,498 @@
+
+
\ No newline at end of file
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..ff03b6b
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,105 @@
+import svgPanZoom from "./svg-pan-zoom/svg-pan-zoom";
+import Tooltip from "./tooltip";
+
+window.addEventListener("load", async () => {
+ const SVG_OBJECT = document.querySelector(
+ "#listenmap-svg"
+ ) as HTMLObjectElement;
+ const resizeHeight = () =>
+ (SVG_OBJECT.style.height =
+ document.body.clientHeight -
+ (document.querySelector("header")?.scrollHeight || 0) -
+ 1 -
+ (document.querySelector("footer")?.scrollHeight || 0) -
+ 1 +
+ "px");
+
+ await sleep(150);
+
+ const SVG_ELEM = SVG_OBJECT.contentDocument!.documentElement as unknown as SVGSVGElement;
+
+ SVG_ELEM.querySelectorAll("g.depart").forEach((group) => {
+ const textEl = document.createElementNS(
+ 'http://www.w3.org/2000/svg',
+ 'text'
+ );
+ const path = group.querySelector("path") as SVGPathElement;
+ const pathRect = path.getBBox();
+ textEl.setAttribute('x', (pathRect.x + pathRect.width / 2).toString());
+ textEl.setAttribute('y', (pathRect.y + pathRect.height / 2).toString());
+ textEl.setAttribute('dominant-baseline', 'middle');
+ textEl.setAttribute('text-anchor', 'middle');
+ textEl.classList.add("depart-text");
+ textEl.style.userSelect = 'none';
+ textEl.style.webkitUserSelect = 'none';
+ textEl.style.pointerEvents = 'none';
+ const departName = group.getAttribute("data-depart-name")!;
+ const regionName = group.parentElement!.getAttribute("data-region-name")!;
+ textEl.innerHTML = `${departName} (${regionName})`;;
+ group.appendChild(textEl);
+ })
+
+
+
+SVG_ELEM.querySelectorAll("g.city").forEach((group) => {
+ const textEl = document.createElementNS(
+ 'http://www.w3.org/2000/svg',
+ 'text'
+ );
+ const path = group.querySelector("circle") as SVGCircleElement;
+ const pathRect = path.getBBox();
+ textEl.setAttribute('x', (pathRect.x + pathRect.width / 2).toString());
+ textEl.setAttribute('y', (pathRect.y + pathRect.height / 2).toString());
+ textEl.setAttribute('dominant-baseline', 'middle');
+ textEl.setAttribute('text-anchor', 'middle');
+ textEl.style.userSelect = 'none';
+ textEl.style.webkitUserSelect = 'none';
+ textEl.style.pointerEvents = 'none';
+ textEl.innerHTML = group.attributes.getNamedItem("data-city-name")!.value;
+ textEl.classList.add("city-text");
+ group.appendChild(textEl);
+})
+
+
+ await sleep(50);
+ const { setTooltip, hideTooltip } = Tooltip(
+ SVG_OBJECT,
+ document.querySelector("#tooltip") as HTMLDivElement
+ );
+ const map = svgPanZoom(SVG_OBJECT, {
+ zoomEnabled: true,
+ controlIconsEnabled: false,
+ preventMouseEventsDefault: false,
+ fit: 1,
+ center: 1,
+ zoomScaleSensitivity: 0.3,
+ minZoom: 0.75,
+ maxZoom: 6,
+ });
+ resizeHeight();
+ SVG_ELEM.addEventListener("mousemove", (e: any) => {
+ const region = (e.path as SVGElement[]).find((el) =>
+ el?.classList?.contains("region")
+ );
+ const regionName = region?.getAttribute("data-region-name") || "";
+ const depart = (e.path as SVGElement[]).find((el) =>
+ el?.classList?.contains("depart")
+ );
+ const departName = depart?.getAttribute("data-depart-name") || "";
+ region
+ ? setTooltip(e, `${depart?.id} ${departName} (${regionName})`)
+ : hideTooltip();
+ });
+ resizeHeight();
+ map.resize();
+ map.fit();
+ map.center();
+ window.addEventListener("resize", () => {
+ resizeHeight();
+ map.resize();
+ map.fit();
+ map.center();
+ });
+});
+
+const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
diff --git a/src/main.ts b/src/main.ts
deleted file mode 100644
index 7f885fe..0000000
--- a/src/main.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import './style.css'
-
-document.querySelector('#app')!.innerHTML = `
-
- Work In Progress
-
-`
diff --git a/src/style.css b/src/style.css
deleted file mode 100644
index bf0cf15..0000000
--- a/src/style.css
+++ /dev/null
@@ -1,17 +0,0 @@
-html, body, #app {
- width: 100vw;
- height: 100vh;
- padding: 0;
- margin: 0;
-}
-
-#app {
- display: flex;
- justify-content: center;
- align-items: center;
- font-family: 'Source Serif 4', serif;
-}
-
-.wip {
- font-size: 2em;
-}
diff --git a/src/svg-pan-zoom/control-icons.js b/src/svg-pan-zoom/control-icons.js
new file mode 100644
index 0000000..a41df0b
--- /dev/null
+++ b/src/svg-pan-zoom/control-icons.js
@@ -0,0 +1,184 @@
+import { svgNS } from "./svg-utilities";
+
+export function enable(instance) {
+ // Select (and create if necessary) defs
+ var defs = instance.svg.querySelector("defs");
+ if (!defs) {
+ defs = document.createElementNS(svgNS, "defs");
+ instance.svg.appendChild(defs);
+ }
+
+ // Check for style element, and create it if it doesn't exist
+ var styleEl = defs.querySelector("style#svg-pan-zoom-controls-styles");
+ if (!styleEl) {
+ var style = document.createElementNS(svgNS, "style");
+ style.setAttribute("id", "svg-pan-zoom-controls-styles");
+ style.setAttribute("type", "text/css");
+ style.textContent =
+ ".svg-pan-zoom-control { cursor: pointer; fill: black; fill-opacity: 0.333; } .svg-pan-zoom-control:hover { fill-opacity: 0.8; } .svg-pan-zoom-control-background { fill: white; fill-opacity: 0.5; } .svg-pan-zoom-control-background { fill-opacity: 0.8; }";
+ defs.appendChild(style);
+ }
+
+ // Zoom Group
+ var zoomGroup = document.createElementNS(svgNS, "g");
+ zoomGroup.setAttribute("id", "svg-pan-zoom-controls");
+ zoomGroup.setAttribute(
+ "transform",
+ "translate(" +
+ (instance.width - 70) +
+ " " +
+ (instance.height - 76) +
+ ") scale(0.75)"
+ );
+ zoomGroup.setAttribute("class", "svg-pan-zoom-control");
+
+ // Control elements
+ zoomGroup.appendChild(_createZoomIn(instance));
+ zoomGroup.appendChild(_createZoomReset(instance));
+ zoomGroup.appendChild(_createZoomOut(instance));
+
+ // Finally append created element
+ instance.svg.appendChild(zoomGroup);
+
+ // Cache control instance
+ instance.controlIcons = zoomGroup;
+}
+export function _createZoomIn(instance) {
+ var zoomIn = document.createElementNS(svgNS, "g");
+ zoomIn.setAttribute("id", "svg-pan-zoom-zoom-in");
+ zoomIn.setAttribute("transform", "translate(30.5 5) scale(0.015)");
+ zoomIn.setAttribute("class", "svg-pan-zoom-control");
+ zoomIn.addEventListener(
+ "click",
+ function () {
+ instance.getPublicInstance().zoomIn();
+ },
+ false
+ );
+ zoomIn.addEventListener(
+ "touchstart",
+ function () {
+ instance.getPublicInstance().zoomIn();
+ },
+ false
+ );
+
+ var zoomInBackground = document.createElementNS(svgNS, "rect"); // TODO change these background space fillers to rounded rectangles so they look prettier
+ zoomInBackground.setAttribute("x", "0");
+ zoomInBackground.setAttribute("y", "0");
+ zoomInBackground.setAttribute("width", "1500"); // larger than expected because the whole group is transformed to scale down
+ zoomInBackground.setAttribute("height", "1400");
+ zoomInBackground.setAttribute("class", "svg-pan-zoom-control-background");
+ zoomIn.appendChild(zoomInBackground);
+
+ var zoomInShape = document.createElementNS(svgNS, "path");
+ zoomInShape.setAttribute(
+ "d",
+ "M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"
+ );
+ zoomInShape.setAttribute("class", "svg-pan-zoom-control-element");
+ zoomIn.appendChild(zoomInShape);
+
+ return zoomIn;
+}
+export function _createZoomReset(instance) {
+ // reset
+ var resetPanZoomControl = document.createElementNS(svgNS, "g");
+ resetPanZoomControl.setAttribute("id", "svg-pan-zoom-reset-pan-zoom");
+ resetPanZoomControl.setAttribute("transform", "translate(5 35) scale(0.4)");
+ resetPanZoomControl.setAttribute("class", "svg-pan-zoom-control");
+ resetPanZoomControl.addEventListener(
+ "click",
+ function () {
+ instance.getPublicInstance().reset();
+ },
+ false
+ );
+ resetPanZoomControl.addEventListener(
+ "touchstart",
+ function () {
+ instance.getPublicInstance().reset();
+ },
+ false
+ );
+
+ var resetPanZoomControlBackground = document.createElementNS(svgNS, "rect"); // TODO change these background space fillers to rounded rectangles so they look prettier
+ resetPanZoomControlBackground.setAttribute("x", "2");
+ resetPanZoomControlBackground.setAttribute("y", "2");
+ resetPanZoomControlBackground.setAttribute("width", "182"); // larger than expected because the whole group is transformed to scale down
+ resetPanZoomControlBackground.setAttribute("height", "58");
+ resetPanZoomControlBackground.setAttribute(
+ "class",
+ "svg-pan-zoom-control-background"
+ );
+ resetPanZoomControl.appendChild(resetPanZoomControlBackground);
+
+ var resetPanZoomControlShape1 = document.createElementNS(svgNS, "path");
+ resetPanZoomControlShape1.setAttribute(
+ "d",
+ "M33.051,20.632c-0.742-0.406-1.854-0.609-3.338-0.609h-7.969v9.281h7.769c1.543,0,2.701-0.188,3.473-0.562c1.365-0.656,2.048-1.953,2.048-3.891C35.032,22.757,34.372,21.351,33.051,20.632z"
+ );
+ resetPanZoomControlShape1.setAttribute(
+ "class",
+ "svg-pan-zoom-control-element"
+ );
+ resetPanZoomControl.appendChild(resetPanZoomControlShape1);
+
+ var resetPanZoomControlShape2 = document.createElementNS(svgNS, "path");
+ resetPanZoomControlShape2.setAttribute(
+ "d",
+ "M170.231,0.5H15.847C7.102,0.5,0.5,5.708,0.5,11.84v38.861C0.5,56.833,7.102,61.5,15.847,61.5h154.384c8.745,0,15.269-4.667,15.269-10.798V11.84C185.5,5.708,178.976,0.5,170.231,0.5z M42.837,48.569h-7.969c-0.219-0.766-0.375-1.383-0.469-1.852c-0.188-0.969-0.289-1.961-0.305-2.977l-0.047-3.211c-0.03-2.203-0.41-3.672-1.142-4.406c-0.732-0.734-2.103-1.102-4.113-1.102h-7.05v13.547h-7.055V14.022h16.524c2.361,0.047,4.178,0.344,5.45,0.891c1.272,0.547,2.351,1.352,3.234,2.414c0.731,0.875,1.31,1.844,1.737,2.906s0.64,2.273,0.64,3.633c0,1.641-0.414,3.254-1.242,4.84s-2.195,2.707-4.102,3.363c1.594,0.641,2.723,1.551,3.387,2.73s0.996,2.98,0.996,5.402v2.32c0,1.578,0.063,2.648,0.19,3.211c0.19,0.891,0.635,1.547,1.333,1.969V48.569z M75.579,48.569h-26.18V14.022h25.336v6.117H56.454v7.336h16.781v6H56.454v8.883h19.125V48.569z M104.497,46.331c-2.44,2.086-5.887,3.129-10.34,3.129c-4.548,0-8.125-1.027-10.731-3.082s-3.909-4.879-3.909-8.473h6.891c0.224,1.578,0.662,2.758,1.316,3.539c1.196,1.422,3.246,2.133,6.15,2.133c1.739,0,3.151-0.188,4.236-0.562c2.058-0.719,3.087-2.055,3.087-4.008c0-1.141-0.504-2.023-1.512-2.648c-1.008-0.609-2.607-1.148-4.796-1.617l-3.74-0.82c-3.676-0.812-6.201-1.695-7.576-2.648c-2.328-1.594-3.492-4.086-3.492-7.477c0-3.094,1.139-5.664,3.417-7.711s5.623-3.07,10.036-3.07c3.685,0,6.829,0.965,9.431,2.895c2.602,1.93,3.966,4.73,4.093,8.402h-6.938c-0.128-2.078-1.057-3.555-2.787-4.43c-1.154-0.578-2.587-0.867-4.301-0.867c-1.907,0-3.428,0.375-4.565,1.125c-1.138,0.75-1.706,1.797-1.706,3.141c0,1.234,0.561,2.156,1.682,2.766c0.721,0.406,2.25,0.883,4.589,1.43l6.063,1.43c2.657,0.625,4.648,1.461,5.975,2.508c2.059,1.625,3.089,3.977,3.089,7.055C108.157,41.624,106.937,44.245,104.497,46.331z M139.61,48.569h-26.18V14.022h25.336v6.117h-18.281v7.336h16.781v6h-16.781v8.883h19.125V48.569z M170.337,20.14h-10.336v28.43h-7.266V20.14h-10.383v-6.117h27.984V20.14z"
+ );
+ resetPanZoomControlShape2.setAttribute(
+ "class",
+ "svg-pan-zoom-control-element"
+ );
+ resetPanZoomControl.appendChild(resetPanZoomControlShape2);
+
+ return resetPanZoomControl;
+}
+export function _createZoomOut(instance) {
+ // zoom out
+ var zoomOut = document.createElementNS(svgNS, "g");
+ zoomOut.setAttribute("id", "svg-pan-zoom-zoom-out");
+ zoomOut.setAttribute("transform", "translate(30.5 70) scale(0.015)");
+ zoomOut.setAttribute("class", "svg-pan-zoom-control");
+ zoomOut.addEventListener(
+ "click",
+ function () {
+ instance.getPublicInstance().zoomOut();
+ },
+ false
+ );
+ zoomOut.addEventListener(
+ "touchstart",
+ function () {
+ instance.getPublicInstance().zoomOut();
+ },
+ false
+ );
+
+ var zoomOutBackground = document.createElementNS(svgNS, "rect"); // TODO change these background space fillers to rounded rectangles so they look prettier
+ zoomOutBackground.setAttribute("x", "0");
+ zoomOutBackground.setAttribute("y", "0");
+ zoomOutBackground.setAttribute("width", "1500"); // larger than expected because the whole group is transformed to scale down
+ zoomOutBackground.setAttribute("height", "1400");
+ zoomOutBackground.setAttribute("class", "svg-pan-zoom-control-background");
+ zoomOut.appendChild(zoomOutBackground);
+
+ var zoomOutShape = document.createElementNS(svgNS, "path");
+ zoomOutShape.setAttribute(
+ "d",
+ "M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z"
+ );
+ zoomOutShape.setAttribute("class", "svg-pan-zoom-control-element");
+ zoomOut.appendChild(zoomOutShape);
+
+ return zoomOut;
+}
+export function disable(instance) {
+ if (instance.controlIcons) {
+ instance.controlIcons.parentNode.removeChild(instance.controlIcons);
+ instance.controlIcons = null;
+ }
+}
diff --git a/src/svg-pan-zoom/shadow-viewport.js b/src/svg-pan-zoom/shadow-viewport.js
new file mode 100644
index 0000000..48f5980
--- /dev/null
+++ b/src/svg-pan-zoom/shadow-viewport.js
@@ -0,0 +1,372 @@
+import { setCTM } from "./svg-utilities";
+import {
+ proxy,
+ createRequestAnimationFrame,
+ extend,
+ isObject,
+ isNumber,
+} from "./utilities";
+
+var ShadowViewport = function (viewport, options) {
+ this.init(viewport, options);
+};
+
+/**
+ * Initialization
+ *
+ * @param {SVGElement} viewport
+ * @param {Object} options
+ */
+ShadowViewport.prototype.init = function (viewport, options) {
+ // DOM Elements
+ this.viewport = viewport;
+ this.options = options;
+
+ // State cache
+ this.originalState = { zoom: 1, x: 0, y: 0 };
+ this.activeState = { zoom: 1, x: 0, y: 0 };
+
+ this.updateCTMCached = proxy(this.updateCTM, this);
+
+ // Create a custom requestAnimationFrame taking in account refreshRate
+ this.requestAnimationFrame = createRequestAnimationFrame(
+ this.options.refreshRate
+ );
+
+ // ViewBox
+ this.viewBox = { x: 0, y: 0, width: 0, height: 0 };
+ this.cacheViewBox();
+
+ // Process CTM
+ var newCTM = this.processCTM();
+
+ // Update viewport CTM and cache zoom and pan
+ this.setCTM(newCTM);
+
+ // Update CTM in this frame
+ this.updateCTM();
+};
+
+/**
+ * Cache initial viewBox value
+ * If no viewBox is defined, then use viewport size/position instead for viewBox values
+ */
+ShadowViewport.prototype.cacheViewBox = function () {
+ var svgViewBox = this.options.svg.getAttribute("viewBox");
+
+ if (svgViewBox) {
+ var viewBoxValues = svgViewBox
+ .split(/[\s\,]/)
+ .filter(function (v) {
+ return v;
+ })
+ .map(parseFloat);
+
+ // Cache viewbox x and y offset
+ this.viewBox.x = viewBoxValues[0];
+ this.viewBox.y = viewBoxValues[1];
+ this.viewBox.width = viewBoxValues[2];
+ this.viewBox.height = viewBoxValues[3];
+
+ var zoom = Math.min(
+ this.options.width / this.viewBox.width,
+ this.options.height / this.viewBox.height
+ );
+
+ // Update active state
+ this.activeState.zoom = zoom;
+ this.activeState.x = (this.options.width - this.viewBox.width * zoom) / 2;
+ this.activeState.y = (this.options.height - this.viewBox.height * zoom) / 2;
+
+ // Force updating CTM
+ this.updateCTMOnNextFrame();
+
+ this.options.svg.removeAttribute("viewBox");
+ } else {
+ this.simpleViewBoxCache();
+ }
+};
+
+/**
+ * Recalculate viewport sizes and update viewBox cache
+ */
+ShadowViewport.prototype.simpleViewBoxCache = function () {
+ var bBox = this.viewport.getBBox();
+
+ this.viewBox.x = bBox.x;
+ this.viewBox.y = bBox.y;
+ this.viewBox.width = bBox.width;
+ this.viewBox.height = bBox.height;
+};
+
+/**
+ * Returns a viewbox object. Safe to alter
+ *
+ * @return {Object} viewbox object
+ */
+ShadowViewport.prototype.getViewBox = function () {
+ return extend({}, this.viewBox);
+};
+
+/**
+ * Get initial zoom and pan values. Save them into originalState
+ * Parses viewBox attribute to alter initial sizes
+ *
+ * @return {CTM} CTM object based on options
+ */
+ShadowViewport.prototype.processCTM = function () {
+ var newCTM = this.getCTM();
+
+ if (this.options.fit || this.options.contain) {
+ var newScale;
+ if (this.options.fit) {
+ newScale = Math.min(
+ this.options.width / this.viewBox.width,
+ this.options.height / this.viewBox.height
+ );
+ } else {
+ newScale = Math.max(
+ this.options.width / this.viewBox.width,
+ this.options.height / this.viewBox.height
+ );
+ }
+
+ newCTM.a = newScale; //x-scale
+ newCTM.d = newScale; //y-scale
+ newCTM.e = -this.viewBox.x * newScale; //x-transform
+ newCTM.f = -this.viewBox.y * newScale; //y-transform
+ }
+
+ if (this.options.center) {
+ var offsetX =
+ (this.options.width -
+ (this.viewBox.width + this.viewBox.x * 2) * newCTM.a) *
+ 0.5,
+ offsetY =
+ (this.options.height -
+ (this.viewBox.height + this.viewBox.y * 2) * newCTM.a) *
+ 0.5;
+
+ newCTM.e = offsetX;
+ newCTM.f = offsetY;
+ }
+
+ // Cache initial values. Based on activeState and fix+center opitons
+ this.originalState.zoom = newCTM.a;
+ this.originalState.x = newCTM.e;
+ this.originalState.y = newCTM.f;
+
+ return newCTM;
+};
+
+/**
+ * Return originalState object. Safe to alter
+ *
+ * @return {Object}
+ */
+ShadowViewport.prototype.getOriginalState = function () {
+ return extend({}, this.originalState);
+};
+
+/**
+ * Return actualState object. Safe to alter
+ *
+ * @return {Object}
+ */
+ShadowViewport.prototype.getState = function () {
+ return extend({}, this.activeState);
+};
+
+/**
+ * Get zoom scale
+ *
+ * @return {Float} zoom scale
+ */
+ShadowViewport.prototype.getZoom = function () {
+ return this.activeState.zoom;
+};
+
+/**
+ * Get zoom scale for pubilc usage
+ *
+ * @return {Float} zoom scale
+ */
+ShadowViewport.prototype.getRelativeZoom = function () {
+ return this.activeState.zoom / this.originalState.zoom;
+};
+
+/**
+ * Compute zoom scale for pubilc usage
+ *
+ * @return {Float} zoom scale
+ */
+ShadowViewport.prototype.computeRelativeZoom = function (scale) {
+ return scale / this.originalState.zoom;
+};
+
+/**
+ * Get pan
+ *
+ * @return {Object}
+ */
+ShadowViewport.prototype.getPan = function () {
+ return { x: this.activeState.x, y: this.activeState.y };
+};
+
+/**
+ * Return cached viewport CTM value that can be safely modified
+ *
+ * @return {SVGMatrix}
+ */
+ShadowViewport.prototype.getCTM = function () {
+ var safeCTM = this.options.svg.createSVGMatrix();
+
+ // Copy values manually as in FF they are not itterable
+ safeCTM.a = this.activeState.zoom;
+ safeCTM.b = 0;
+ safeCTM.c = 0;
+ safeCTM.d = this.activeState.zoom;
+ safeCTM.e = this.activeState.x;
+ safeCTM.f = this.activeState.y;
+
+ return safeCTM;
+};
+
+/**
+ * Set a new CTM
+ *
+ * @param {SVGMatrix} newCTM
+ */
+ShadowViewport.prototype.setCTM = function (newCTM) {
+ var willZoom = this.isZoomDifferent(newCTM),
+ willPan = this.isPanDifferent(newCTM);
+
+ if (willZoom || willPan) {
+ // Before zoom
+ if (willZoom) {
+ // If returns false then cancel zooming
+ if (
+ this.options.beforeZoom(
+ this.getRelativeZoom(),
+ this.computeRelativeZoom(newCTM.a)
+ ) === false
+ ) {
+ newCTM.a = newCTM.d = this.activeState.zoom;
+ willZoom = false;
+ } else {
+ this.updateCache(newCTM);
+ this.options.onZoom(this.getRelativeZoom());
+ }
+ }
+
+ // Before pan
+ if (willPan) {
+ var preventPan = this.options.beforePan(this.getPan(), {
+ x: newCTM.e,
+ y: newCTM.f,
+ }),
+ // If prevent pan is an object
+ preventPanX = false,
+ preventPanY = false;
+
+ // If prevent pan is Boolean false
+ if (preventPan === false) {
+ // Set x and y same as before
+ newCTM.e = this.getPan().x;
+ newCTM.f = this.getPan().y;
+
+ preventPanX = preventPanY = true;
+ } else if (isObject(preventPan)) {
+ // Check for X axes attribute
+ if (preventPan.x === false) {
+ // Prevent panning on x axes
+ newCTM.e = this.getPan().x;
+ preventPanX = true;
+ } else if (isNumber(preventPan.x)) {
+ // Set a custom pan value
+ newCTM.e = preventPan.x;
+ }
+
+ // Check for Y axes attribute
+ if (preventPan.y === false) {
+ // Prevent panning on x axes
+ newCTM.f = this.getPan().y;
+ preventPanY = true;
+ } else if (isNumber(preventPan.y)) {
+ // Set a custom pan value
+ newCTM.f = preventPan.y;
+ }
+ }
+
+ // Update willPan flag
+ // Check if newCTM is still different
+ if ((preventPanX && preventPanY) || !this.isPanDifferent(newCTM)) {
+ willPan = false;
+ } else {
+ this.updateCache(newCTM);
+ this.options.onPan(this.getPan());
+ }
+ }
+
+ // Check again if should zoom or pan
+ if (willZoom || willPan) {
+ this.updateCTMOnNextFrame();
+ }
+ }
+};
+
+ShadowViewport.prototype.isZoomDifferent = function (newCTM) {
+ return this.activeState.zoom !== newCTM.a;
+};
+
+ShadowViewport.prototype.isPanDifferent = function (newCTM) {
+ return this.activeState.x !== newCTM.e || this.activeState.y !== newCTM.f;
+};
+
+/**
+ * Update cached CTM and active state
+ *
+ * @param {SVGMatrix} newCTM
+ */
+ShadowViewport.prototype.updateCache = function (newCTM) {
+ this.activeState.zoom = newCTM.a;
+ this.activeState.x = newCTM.e;
+ this.activeState.y = newCTM.f;
+};
+
+ShadowViewport.prototype.pendingUpdate = false;
+
+/**
+ * Place a request to update CTM on next Frame
+ */
+ShadowViewport.prototype.updateCTMOnNextFrame = function () {
+ if (!this.pendingUpdate) {
+ // Lock
+ this.pendingUpdate = true;
+
+ // Throttle next update
+ this.requestAnimationFrame.call(window, this.updateCTMCached);
+ }
+};
+
+/**
+ * Update viewport CTM with cached CTM
+ */
+ShadowViewport.prototype.updateCTM = function () {
+ var ctm = this.getCTM();
+
+ // Updates SVG element
+ setCTM(this.viewport, ctm, this.defs);
+
+ // Free the lock
+ this.pendingUpdate = false;
+
+ // Notify about the update
+ if (this.options.onUpdatedCTM) {
+ this.options.onUpdatedCTM(ctm);
+ }
+};
+
+export default function (viewport, options) {
+ return new ShadowViewport(viewport, options);
+}
diff --git a/src/svg-pan-zoom/svg-pan-zoom.js b/src/svg-pan-zoom/svg-pan-zoom.js
new file mode 100644
index 0000000..d0890ee
--- /dev/null
+++ b/src/svg-pan-zoom/svg-pan-zoom.js
@@ -0,0 +1,989 @@
+import { on, off } from "./uniwheel";
+import { enable, disable } from "./control-icons";
+import {
+ extend,
+ getType,
+ mouseAndTouchNormalize,
+ isDblClick,
+ proxy,
+ getSvg,
+} from "./utilities";
+import {
+ setupSvgAttributes,
+ getBoundingClientRectNormalized,
+ getOrCreateViewport,
+ getEventPoint,
+ getSvgCenterPoint,
+ createSVGPoint,
+} from "./svg-utilities";
+import ShadowViewport from "./shadow-viewport";
+
+var SvgPanZoom = function (svg, options) {
+ this.init(svg, options);
+};
+
+var optionsDefaults = {
+ viewportSelector: ".svg-pan-zoom_viewport", // Viewport selector. Can be querySelector string or SVGElement
+ panEnabled: true, // enable or disable panning (default enabled)
+ controlIconsEnabled: false, // insert icons to give user an option in addition to mouse events to control pan/zoom (default disabled)
+ zoomEnabled: true, // enable or disable zooming (default enabled)
+ dblClickZoomEnabled: true, // enable or disable zooming by double clicking (default enabled)
+ mouseWheelZoomEnabled: true, // enable or disable zooming by mouse wheel (default enabled)
+ preventMouseEventsDefault: true, // enable or disable preventDefault for mouse events
+ zoomScaleSensitivity: 0.1, // Zoom sensitivity
+ minZoom: 0.5, // Minimum Zoom level
+ maxZoom: 10, // Maximum Zoom level
+ fit: true, // enable or disable viewport fit in SVG (default true)
+ contain: false, // enable or disable viewport contain the svg (default false)
+ center: true, // enable or disable viewport centering in SVG (default true)
+ refreshRate: "auto", // Maximum number of frames per second (altering SVG's viewport)
+ beforeZoom: null,
+ onZoom: null,
+ beforePan: null,
+ onPan: null,
+ customEventsHandler: null,
+ eventsListenerElement: null,
+ onUpdatedCTM: null,
+};
+
+var passiveListenerOption = { passive: true };
+
+SvgPanZoom.prototype.init = function (svg, options) {
+ var that = this;
+
+ this.svg = svg;
+ this.defs = svg.querySelector("defs");
+
+ // Add default attributes to SVG
+ setupSvgAttributes(this.svg);
+
+ // Set options
+ this.options = extend(extend({}, optionsDefaults), options);
+
+ // Set default state
+ this.state = "none";
+
+ // Get dimensions
+ var boundingClientRectNormalized = getBoundingClientRectNormalized(svg);
+ this.width = boundingClientRectNormalized.width;
+ this.height = boundingClientRectNormalized.height;
+
+ // Init shadow viewport
+ this.viewport = ShadowViewport(
+ getOrCreateViewport(this.svg, this.options.viewportSelector),
+ {
+ svg: this.svg,
+ width: this.width,
+ height: this.height,
+ fit: this.options.fit,
+ contain: this.options.contain,
+ center: this.options.center,
+ refreshRate: this.options.refreshRate,
+ // Put callbacks into functions as they can change through time
+ beforeZoom: function (oldScale, newScale) {
+ if (that.viewport && that.options.beforeZoom) {
+ return that.options.beforeZoom(oldScale, newScale);
+ }
+ },
+ onZoom: function (scale) {
+ if (that.viewport && that.options.onZoom) {
+ return that.options.onZoom(scale);
+ }
+ },
+ beforePan: function (oldPoint, newPoint) {
+ if (that.viewport && that.options.beforePan) {
+ return that.options.beforePan(oldPoint, newPoint);
+ }
+ },
+ onPan: function (point) {
+ if (that.viewport && that.options.onPan) {
+ return that.options.onPan(point);
+ }
+ },
+ onUpdatedCTM: function (ctm) {
+ if (that.viewport && that.options.onUpdatedCTM) {
+ return that.options.onUpdatedCTM(ctm);
+ }
+ },
+ }
+ );
+
+ // Wrap callbacks into public API context
+ var publicInstance = this.getPublicInstance();
+ publicInstance.setBeforeZoom(this.options.beforeZoom);
+ publicInstance.setOnZoom(this.options.onZoom);
+ publicInstance.setBeforePan(this.options.beforePan);
+ publicInstance.setOnPan(this.options.onPan);
+ publicInstance.setOnUpdatedCTM(this.options.onUpdatedCTM);
+
+ if (this.options.controlIconsEnabled) {
+ enable(this);
+ }
+
+ // Init events handlers
+ this.lastMouseWheelEventTime = Date.now();
+ this.setupHandlers();
+};
+
+/**
+ * Register event handlers
+ */
+SvgPanZoom.prototype.setupHandlers = function () {
+ var that = this,
+ prevEvt = null; // use for touchstart event to detect double tap
+
+ this.eventListeners = {
+ // Mouse down group
+ mousedown: function (evt) {
+ var result = that.handleMouseDown(evt, prevEvt);
+ prevEvt = evt;
+ return result;
+ },
+ touchstart: function (evt) {
+ var result = that.handleMouseDown(evt, prevEvt);
+ prevEvt = evt;
+ return result;
+ },
+
+ // Mouse up group
+ mouseup: function (evt) {
+ return that.handleMouseUp(evt);
+ },
+ touchend: function (evt) {
+ return that.handleMouseUp(evt);
+ },
+
+ // Mouse move group
+ mousemove: function (evt) {
+ return that.handleMouseMove(evt);
+ },
+ touchmove: function (evt) {
+ return that.handleMouseMove(evt);
+ },
+
+ // Mouse leave group
+ mouseleave: function (evt) {
+ return that.handleMouseUp(evt);
+ },
+ touchleave: function (evt) {
+ return that.handleMouseUp(evt);
+ },
+ touchcancel: function (evt) {
+ return that.handleMouseUp(evt);
+ },
+ };
+
+ // Init custom events handler if available
+ // eslint-disable-next-line eqeqeq
+ if (this.options.customEventsHandler != null) {
+ this.options.customEventsHandler.init({
+ svgElement: this.svg,
+ eventsListenerElement: this.options.eventsListenerElement,
+ instance: this.getPublicInstance(),
+ });
+
+ // Custom event handler may halt builtin listeners
+ var haltEventListeners =
+ this.options.customEventsHandler.haltEventListeners;
+ if (haltEventListeners && haltEventListeners.length) {
+ for (var i = haltEventListeners.length - 1; i >= 0; i--) {
+ if (this.eventListeners.hasOwnProperty(haltEventListeners[i])) {
+ delete this.eventListeners[haltEventListeners[i]];
+ }
+ }
+ }
+ }
+
+ // Bind eventListeners
+ for (var event in this.eventListeners) {
+ // Attach event to eventsListenerElement or SVG if not available
+ (this.options.eventsListenerElement || this.svg).addEventListener(
+ event,
+ this.eventListeners[event],
+ !this.options.preventMouseEventsDefault ? passiveListenerOption : false
+ );
+ }
+
+ // Zoom using mouse wheel
+ if (this.options.mouseWheelZoomEnabled) {
+ this.options.mouseWheelZoomEnabled = false; // set to false as enable will set it back to true
+ this.enableMouseWheelZoom();
+ }
+};
+
+/**
+ * Enable ability to zoom using mouse wheel
+ */
+SvgPanZoom.prototype.enableMouseWheelZoom = function () {
+ if (!this.options.mouseWheelZoomEnabled) {
+ var that = this;
+
+ // Mouse wheel listener
+ this.wheelListener = function (evt) {
+ return that.handleMouseWheel(evt);
+ };
+
+ // Bind wheelListener
+ var isPassiveListener = !this.options.preventMouseEventsDefault;
+ on(
+ this.options.eventsListenerElement || this.svg,
+ this.wheelListener,
+ isPassiveListener
+ );
+
+ this.options.mouseWheelZoomEnabled = true;
+ }
+};
+
+/**
+ * Disable ability to zoom using mouse wheel
+ */
+SvgPanZoom.prototype.disableMouseWheelZoom = function () {
+ if (this.options.mouseWheelZoomEnabled) {
+ var isPassiveListener = !this.options.preventMouseEventsDefault;
+ off(
+ this.options.eventsListenerElement || this.svg,
+ this.wheelListener,
+ isPassiveListener
+ );
+ this.options.mouseWheelZoomEnabled = false;
+ }
+};
+
+/**
+ * Handle mouse wheel event
+ *
+ * @param {Event} evt
+ */
+SvgPanZoom.prototype.handleMouseWheel = function (evt) {
+ if (!this.options.zoomEnabled || this.state !== "none") {
+ return;
+ }
+
+ if (this.options.preventMouseEventsDefault) {
+ if (evt.preventDefault) {
+ evt.preventDefault();
+ } else {
+ evt.returnValue = false;
+ }
+ }
+
+ // Default delta in case that deltaY is not available
+ var delta = evt.deltaY || 1,
+ timeDelta = Date.now() - this.lastMouseWheelEventTime,
+ divider = 3 + Math.max(0, 30 - timeDelta);
+
+ // Update cache
+ this.lastMouseWheelEventTime = Date.now();
+
+ // Make empirical adjustments for browsers that give deltaY in pixels (deltaMode=0)
+ if ("deltaMode" in evt && evt.deltaMode === 0 && evt.wheelDelta) {
+ delta = evt.deltaY === 0 ? 0 : Math.abs(evt.wheelDelta) / evt.deltaY;
+ }
+
+ delta =
+ -0.3 < delta && delta < 0.3
+ ? delta
+ : ((delta > 0 ? 1 : -1) * Math.log(Math.abs(delta) + 10)) / divider;
+
+ var inversedScreenCTM = this.svg.getScreenCTM().inverse(),
+ relativeMousePoint = getEventPoint(evt, this.svg).matrixTransform(
+ inversedScreenCTM
+ ),
+ zoom = Math.pow(1 + this.options.zoomScaleSensitivity, -1 * delta); // multiplying by neg. 1 so as to make zoom in/out behavior match Google maps behavior
+
+ this.zoomAtPoint(zoom, relativeMousePoint);
+};
+
+/**
+ * Zoom in at a SVG point
+ *
+ * @param {SVGPoint} point
+ * @param {Float} zoomScale Number representing how much to zoom
+ * @param {Boolean} zoomAbsolute Default false. If true, zoomScale is treated as an absolute value.
+ * Otherwise, zoomScale is treated as a multiplied (e.g. 1.10 would zoom in 10%)
+ */
+SvgPanZoom.prototype.zoomAtPoint = function (zoomScale, point, zoomAbsolute) {
+ var originalState = this.viewport.getOriginalState();
+
+ if (!zoomAbsolute) {
+ // Fit zoomScale in set bounds
+ if (
+ this.getZoom() * zoomScale <
+ this.options.minZoom * originalState.zoom
+ ) {
+ zoomScale = (this.options.minZoom * originalState.zoom) / this.getZoom();
+ } else if (
+ this.getZoom() * zoomScale >
+ this.options.maxZoom * originalState.zoom
+ ) {
+ zoomScale = (this.options.maxZoom * originalState.zoom) / this.getZoom();
+ }
+ } else {
+ // Fit zoomScale in set bounds
+ zoomScale = Math.max(
+ this.options.minZoom * originalState.zoom,
+ Math.min(this.options.maxZoom * originalState.zoom, zoomScale)
+ );
+ // Find relative scale to achieve desired scale
+ zoomScale = zoomScale / this.getZoom();
+ }
+
+ var oldCTM = this.viewport.getCTM(),
+ relativePoint = point.matrixTransform(oldCTM.inverse()),
+ modifier = this.svg
+ .createSVGMatrix()
+ .translate(relativePoint.x, relativePoint.y)
+ .scale(zoomScale)
+ .translate(-relativePoint.x, -relativePoint.y),
+ newCTM = oldCTM.multiply(modifier);
+
+ if (newCTM.a !== oldCTM.a) {
+ const TEXT_ZOOM = 1.25
+ const tempZoom = this.getZoom()
+ this.svg.style.setProperty("--map-zoom",tempZoom)
+ this.svg.style.setProperty("--map-font-zoom", ((20/(tempZoom)))+"px")
+ if((tempZoom < TEXT_ZOOM) && !this.svg.classList.contains("txt-hide")) {
+ this.svg.classList.add("txt-hide");
+ document.querySelector("#tooltip").style.opacity="1"
+ }else if((tempZoom > TEXT_ZOOM) && this.svg.classList.contains("txt-hide")) {
+ this.svg.classList.remove("txt-hide");
+ document.querySelector("#tooltip").style.opacity="0"
+ }
+ this.viewport.setCTM(newCTM);
+ }
+};
+
+/**
+ * Zoom at center point
+ *
+ * @param {Float} scale
+ * @param {Boolean} absolute Marks zoom scale as relative or absolute
+ */
+SvgPanZoom.prototype.zoom = function (scale, absolute) {
+ this.zoomAtPoint(
+ scale,
+ getSvgCenterPoint(this.svg, this.width, this.height),
+ absolute
+ );
+};
+
+/**
+ * Zoom used by public instance
+ *
+ * @param {Float} scale
+ * @param {Boolean} absolute Marks zoom scale as relative or absolute
+ */
+SvgPanZoom.prototype.publicZoom = function (scale, absolute) {
+ if (absolute) {
+ scale = this.computeFromRelativeZoom(scale);
+ }
+
+ this.zoom(scale, absolute);
+};
+
+/**
+ * Zoom at point used by public instance
+ *
+ * @param {Float} scale
+ * @param {SVGPoint|Object} point An object that has x and y attributes
+ * @param {Boolean} absolute Marks zoom scale as relative or absolute
+ */
+SvgPanZoom.prototype.publicZoomAtPoint = function (scale, point, absolute) {
+ if (absolute) {
+ // Transform zoom into a relative value
+ scale = this.computeFromRelativeZoom(scale);
+ }
+
+ // If not a SVGPoint but has x and y then create a SVGPoint
+ if (getType(point) !== "SVGPoint") {
+ if ("x" in point && "y" in point) {
+ point = createSVGPoint(this.svg, point.x, point.y);
+ } else {
+ throw new Error("Given point is invalid");
+ }
+ }
+
+ this.zoomAtPoint(scale, point, absolute);
+};
+
+/**
+ * Get zoom scale
+ *
+ * @return {Float} zoom scale
+ */
+SvgPanZoom.prototype.getZoom = function () {
+ return this.viewport.getZoom();
+};
+
+/**
+ * Get zoom scale for public usage
+ *
+ * @return {Float} zoom scale
+ */
+SvgPanZoom.prototype.getRelativeZoom = function () {
+ return this.viewport.getRelativeZoom();
+};
+
+/**
+ * Compute actual zoom from public zoom
+ *
+ * @param {Float} zoom
+ * @return {Float} zoom scale
+ */
+SvgPanZoom.prototype.computeFromRelativeZoom = function (zoom) {
+ return zoom * this.viewport.getOriginalState().zoom;
+};
+
+/**
+ * Set zoom to initial state
+ */
+SvgPanZoom.prototype.resetZoom = function () {
+ var originalState = this.viewport.getOriginalState();
+
+ this.zoom(originalState.zoom, true);
+};
+
+/**
+ * Set pan to initial state
+ */
+SvgPanZoom.prototype.resetPan = function () {
+ this.pan(this.viewport.getOriginalState());
+};
+
+/**
+ * Set pan and zoom to initial state
+ */
+SvgPanZoom.prototype.reset = function () {
+ this.resetZoom();
+ this.resetPan();
+};
+
+/**
+ * Handle double click event
+ * See handleMouseDown() for alternate detection method
+ *
+ * @param {Event} evt
+ */
+SvgPanZoom.prototype.handleDblClick = function (evt) {
+ if (this.options.preventMouseEventsDefault) {
+ if (evt.preventDefault) {
+ evt.preventDefault();
+ } else {
+ evt.returnValue = false;
+ }
+ }
+
+ // Check if target was a control button
+ if (this.options.controlIconsEnabled) {
+ var targetClass = evt.target.getAttribute("class") || "";
+ if (targetClass.indexOf("svg-pan-zoom-control") > -1) {
+ return false;
+ }
+ }
+
+ var zoomFactor;
+
+ if (evt.shiftKey) {
+ zoomFactor = 1 / ((1 + this.options.zoomScaleSensitivity) * 2); // zoom out when shift key pressed
+ } else {
+ zoomFactor = (1 + this.options.zoomScaleSensitivity) * 2;
+ }
+
+ var point = getEventPoint(evt, this.svg).matrixTransform(
+ this.svg.getScreenCTM().inverse()
+ );
+ this.zoomAtPoint(zoomFactor, point);
+};
+
+/**
+ * Handle click event
+ *
+ * @param {Event} evt
+ */
+SvgPanZoom.prototype.handleMouseDown = function (evt, prevEvt) {
+ this.svg.style.cursor = "grabbing";
+ if (this.options.preventMouseEventsDefault) {
+ if (evt.preventDefault) {
+ evt.preventDefault();
+ } else {
+ evt.returnValue = false;
+ }
+ }
+
+ mouseAndTouchNormalize(evt, this.svg);
+
+ // Double click detection; more consistent than ondblclick
+ if (this.options.dblClickZoomEnabled && isDblClick(evt, prevEvt)) {
+ this.handleDblClick(evt);
+ } else {
+ // Pan mode
+ this.state = "pan";
+ this.firstEventCTM = this.viewport.getCTM();
+ this.stateOrigin = getEventPoint(evt, this.svg).matrixTransform(
+ this.firstEventCTM.inverse()
+ );
+ }
+};
+
+/**
+ * Handle mouse move event
+ *
+ * @param {Event} evt
+ */
+SvgPanZoom.prototype.handleMouseMove = function (evt) {
+ if (this.options.preventMouseEventsDefault) {
+ if (evt.preventDefault) {
+ evt.preventDefault();
+ } else {
+ evt.returnValue = false;
+ }
+ }
+
+ if (this.state === "pan" && this.options.panEnabled) {
+ // Pan mode
+ var point = getEventPoint(evt, this.svg).matrixTransform(
+ this.firstEventCTM.inverse()
+ ),
+ viewportCTM = this.firstEventCTM.translate(
+ point.x - this.stateOrigin.x,
+ point.y - this.stateOrigin.y
+ );
+
+ this.viewport.setCTM(viewportCTM);
+ }
+};
+
+/**
+ * Handle mouse button release event
+ *
+ * @param {Event} evt
+ */
+SvgPanZoom.prototype.handleMouseUp = function (evt) {
+ this.svg.style.cursor = "grab";
+ if (this.options.preventMouseEventsDefault) {
+ if (evt.preventDefault) {
+ evt.preventDefault();
+ } else {
+ evt.returnValue = false;
+ }
+ }
+
+ if (this.state === "pan") {
+ // Quit pan mode
+ this.state = "none";
+ }
+};
+
+/**
+ * Adjust viewport size (only) so it will fit in SVG
+ * Does not center image
+ */
+SvgPanZoom.prototype.fit = function () {
+ var viewBox = this.viewport.getViewBox(),
+ newScale = Math.min(
+ this.width / viewBox.width,
+ this.height / viewBox.height
+ );
+
+ this.zoom(newScale, true);
+};
+
+/**
+ * Adjust viewport size (only) so it will contain the SVG
+ * Does not center image
+ */
+SvgPanZoom.prototype.contain = function () {
+ var viewBox = this.viewport.getViewBox(),
+ newScale = Math.max(
+ this.width / viewBox.width,
+ this.height / viewBox.height
+ );
+
+ this.zoom(newScale, true);
+};
+
+/**
+ * Adjust viewport pan (only) so it will be centered in SVG
+ * Does not zoom/fit/contain image
+ */
+SvgPanZoom.prototype.center = function () {
+ var viewBox = this.viewport.getViewBox(),
+ offsetX =
+ (this.width - (viewBox.width + viewBox.x * 2) * this.getZoom()) * 0.5,
+ offsetY =
+ (this.height - (viewBox.height + viewBox.y * 2) * this.getZoom()) * 0.5;
+
+ this.getPublicInstance().pan({ x: offsetX, y: offsetY });
+};
+
+/**
+ * Update content cached BorderBox
+ * Use when viewport contents change
+ */
+SvgPanZoom.prototype.updateBBox = function () {
+ this.viewport.simpleViewBoxCache();
+};
+
+/**
+ * Pan to a rendered position
+ *
+ * @param {Object} point {x: 0, y: 0}
+ */
+SvgPanZoom.prototype.pan = function (point) {
+ var viewportCTM = this.viewport.getCTM();
+ viewportCTM.e = point.x;
+ viewportCTM.f = point.y;
+ this.viewport.setCTM(viewportCTM);
+};
+
+/**
+ * Relatively pan the graph by a specified rendered position vector
+ *
+ * @param {Object} point {x: 0, y: 0}
+ */
+SvgPanZoom.prototype.panBy = function (point) {
+ var viewportCTM = this.viewport.getCTM();
+ viewportCTM.e += point.x;
+ viewportCTM.f += point.y;
+ this.viewport.setCTM(viewportCTM);
+};
+
+/**
+ * Get pan vector
+ *
+ * @return {Object} {x: 0, y: 0}
+ */
+SvgPanZoom.prototype.getPan = function () {
+ var state = this.viewport.getState();
+
+ return { x: state.x, y: state.y };
+};
+
+/**
+ * Recalculates cached svg dimensions and controls position
+ */
+SvgPanZoom.prototype.resize = function () {
+ // Get dimensions
+ var boundingClientRectNormalized = getBoundingClientRectNormalized(this.svg);
+ this.width = boundingClientRectNormalized.width;
+ this.height = boundingClientRectNormalized.height;
+
+ // Recalculate original state
+ var viewport = this.viewport;
+ viewport.options.width = this.width;
+ viewport.options.height = this.height;
+ viewport.processCTM();
+
+ // Reposition control icons by re-enabling them
+ if (this.options.controlIconsEnabled) {
+ this.getPublicInstance().disableControlIcons();
+ this.getPublicInstance().enableControlIcons();
+ }
+};
+
+/**
+ * Unbind mouse events, free callbacks and destroy public instance
+ */
+SvgPanZoom.prototype.destroy = function () {
+ var that = this;
+
+ // Free callbacks
+ this.beforeZoom = null;
+ this.onZoom = null;
+ this.beforePan = null;
+ this.onPan = null;
+ this.onUpdatedCTM = null;
+
+ // Destroy custom event handlers
+ // eslint-disable-next-line eqeqeq
+ if (this.options.customEventsHandler != null) {
+ this.options.customEventsHandler.destroy({
+ svgElement: this.svg,
+ eventsListenerElement: this.options.eventsListenerElement,
+ instance: this.getPublicInstance(),
+ });
+ }
+
+ // Unbind eventListeners
+ for (var event in this.eventListeners) {
+ (this.options.eventsListenerElement || this.svg).removeEventListener(
+ event,
+ this.eventListeners[event],
+ !this.options.preventMouseEventsDefault ? passiveListenerOption : false
+ );
+ }
+
+ // Unbind wheelListener
+ this.disableMouseWheelZoom();
+
+ // Remove control icons
+ this.getPublicInstance().disableControlIcons();
+
+ // Reset zoom and pan
+ this.reset();
+
+ // Remove instance from instancesStore
+ instancesStore = instancesStore.filter(function (instance) {
+ return instance.svg !== that.svg;
+ });
+
+ // Delete options and its contents
+ delete this.options;
+
+ // Delete viewport to make public shadow viewport functions uncallable
+ delete this.viewport;
+
+ // Destroy public instance and rewrite getPublicInstance
+ delete this.publicInstance;
+ delete this.pi;
+ this.getPublicInstance = function () {
+ return null;
+ };
+};
+
+/**
+ * Returns a public instance object
+ *
+ * @return {Object} Public instance object
+ */
+SvgPanZoom.prototype.getPublicInstance = function () {
+ var that = this;
+
+ // Create cache
+ if (!this.publicInstance) {
+ this.publicInstance = this.pi = {
+ // Pan
+ enablePan: function () {
+ that.options.panEnabled = true;
+ return that.pi;
+ },
+ disablePan: function () {
+ that.options.panEnabled = false;
+ return that.pi;
+ },
+ isPanEnabled: function () {
+ return !!that.options.panEnabled;
+ },
+ pan: function (point) {
+ that.pan(point);
+ return that.pi;
+ },
+ panBy: function (point) {
+ that.panBy(point);
+ return that.pi;
+ },
+ getPan: function () {
+ return that.getPan();
+ },
+ // Pan event
+ setBeforePan: function (fn) {
+ that.options.beforePan =
+ fn === null ? null : proxy(fn, that.publicInstance);
+ return that.pi;
+ },
+ setOnPan: function (fn) {
+ that.options.onPan =
+ fn === null ? null : proxy(fn, that.publicInstance);
+ return that.pi;
+ },
+ // Zoom and Control Icons
+ enableZoom: function () {
+ that.options.zoomEnabled = true;
+ return that.pi;
+ },
+ disableZoom: function () {
+ that.options.zoomEnabled = false;
+ return that.pi;
+ },
+ isZoomEnabled: function () {
+ return !!that.options.zoomEnabled;
+ },
+ enableControlIcons: function () {
+ if (!that.options.controlIconsEnabled) {
+ that.options.controlIconsEnabled = true;
+ enable(that);
+ }
+ return that.pi;
+ },
+ disableControlIcons: function () {
+ if (that.options.controlIconsEnabled) {
+ that.options.controlIconsEnabled = false;
+ disable(that);
+ }
+ return that.pi;
+ },
+ isControlIconsEnabled: function () {
+ return !!that.options.controlIconsEnabled;
+ },
+ // Double click zoom
+ enableDblClickZoom: function () {
+ that.options.dblClickZoomEnabled = true;
+ return that.pi;
+ },
+ disableDblClickZoom: function () {
+ that.options.dblClickZoomEnabled = false;
+ return that.pi;
+ },
+ isDblClickZoomEnabled: function () {
+ return !!that.options.dblClickZoomEnabled;
+ },
+ // Mouse wheel zoom
+ enableMouseWheelZoom: function () {
+ that.enableMouseWheelZoom();
+ return that.pi;
+ },
+ disableMouseWheelZoom: function () {
+ that.disableMouseWheelZoom();
+ return that.pi;
+ },
+ isMouseWheelZoomEnabled: function () {
+ return !!that.options.mouseWheelZoomEnabled;
+ },
+ // Zoom scale and bounds
+ setZoomScaleSensitivity: function (scale) {
+ that.options.zoomScaleSensitivity = scale;
+ return that.pi;
+ },
+ setMinZoom: function (zoom) {
+ that.options.minZoom = zoom;
+ return that.pi;
+ },
+ setMaxZoom: function (zoom) {
+ that.options.maxZoom = zoom;
+ return that.pi;
+ },
+ // Zoom event
+ setBeforeZoom: function (fn) {
+ that.options.beforeZoom =
+ fn === null ? null : proxy(fn, that.publicInstance);
+ return that.pi;
+ },
+ setOnZoom: function (fn) {
+ that.options.onZoom =
+ fn === null ? null : proxy(fn, that.publicInstance);
+ return that.pi;
+ },
+ // Zooming
+ zoom: function (scale) {
+ that.publicZoom(scale, true);
+ return that.pi;
+ },
+ zoomBy: function (scale) {
+ that.publicZoom(scale, false);
+ return that.pi;
+ },
+ zoomAtPoint: function (scale, point) {
+ that.publicZoomAtPoint(scale, point, true);
+ return that.pi;
+ },
+ zoomAtPointBy: function (scale, point) {
+ that.publicZoomAtPoint(scale, point, false);
+ return that.pi;
+ },
+ zoomIn: function () {
+ this.zoomBy(1 + that.options.zoomScaleSensitivity);
+ return that.pi;
+ },
+ zoomOut: function () {
+ this.zoomBy(1 / (1 + that.options.zoomScaleSensitivity));
+ return that.pi;
+ },
+ getZoom: function () {
+ return that.getRelativeZoom();
+ },
+ // CTM update
+ setOnUpdatedCTM: function (fn) {
+ that.options.onUpdatedCTM =
+ fn === null ? null : proxy(fn, that.publicInstance);
+ return that.pi;
+ },
+ // Reset
+ resetZoom: function () {
+ that.resetZoom();
+ return that.pi;
+ },
+ resetPan: function () {
+ that.resetPan();
+ return that.pi;
+ },
+ reset: function () {
+ that.reset();
+ return that.pi;
+ },
+ // Fit, Contain and Center
+ fit: function () {
+ that.fit();
+ return that.pi;
+ },
+ contain: function () {
+ that.contain();
+ return that.pi;
+ },
+ center: function () {
+ that.center();
+ return that.pi;
+ },
+ // Size and Resize
+ updateBBox: function () {
+ that.updateBBox();
+ return that.pi;
+ },
+ resize: function () {
+ that.resize();
+ return that.pi;
+ },
+ getSizes: function () {
+ return {
+ width: that.width,
+ height: that.height,
+ realZoom: that.getZoom(),
+ viewBox: that.viewport.getViewBox(),
+ };
+ },
+ // Destroy
+ destroy: function () {
+ that.destroy();
+ return that.pi;
+ },
+ };
+ }
+
+ return this.publicInstance;
+};
+
+/**
+ * Stores pairs of instances of SvgPanZoom and SVG
+ * Each pair is represented by an object {svg: SVGSVGElement, instance: SvgPanZoom}
+ *
+ * @type {Array}
+ */
+var instancesStore = [];
+
+var svgPanZoom = function (elementOrSelector, options) {
+ var svg = getSvg(elementOrSelector);
+
+ if (svg === null) {
+ return null;
+ } else {
+ // Look for existent instance
+ for (var i = instancesStore.length - 1; i >= 0; i--) {
+ if (instancesStore[i].svg === svg) {
+ return instancesStore[i].instance.getPublicInstance();
+ }
+ }
+
+ // If instance not found - create one
+ instancesStore.push({
+ svg: svg,
+ instance: new SvgPanZoom(svg, options),
+ });
+
+ // Return just pushed instance
+ return instancesStore[
+ instancesStore.length - 1
+ ].instance.getPublicInstance();
+ }
+};
+
+export default svgPanZoom;
diff --git a/src/svg-pan-zoom/svg-utilities.js b/src/svg-pan-zoom/svg-utilities.js
new file mode 100644
index 0000000..585e5fc
--- /dev/null
+++ b/src/svg-pan-zoom/svg-utilities.js
@@ -0,0 +1,170 @@
+import { isElement, throttle, mouseAndTouchNormalize } from "./utilities";
+var _browser = "unknown";
+
+// http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opersa-browser
+if (/*@cc_on!@*/ false || !!document.documentMode) {
+ // internet explorer
+ _browser = "ie";
+}
+
+export const svgNS = "http://www.w3.org/2000/svg";
+export const xmlNS = "http://www.w3.org/XML/1998/namespace";
+export const xmlnsNS = "http://www.w3.org/2000/xmlns/";
+export const xlinkNS = "http://www.w3.org/1999/xlink";
+export const evNS = "http://www.w3.org/2001/xml-events";
+export function getBoundingClientRectNormalized(svg) {
+ if (svg.clientWidth && svg.clientHeight) {
+ return { width: svg.clientWidth, height: svg.clientHeight };
+ } else if (!!svg.getBoundingClientRect()) {
+ return svg.getBoundingClientRect();
+ } else {
+ throw new Error("Cannot get BoundingClientRect for SVG.");
+ }
+}
+export function getOrCreateViewport(svg, selector) {
+ var viewport = null;
+
+ if (isElement(selector)) {
+ viewport = selector;
+ } else {
+ viewport = svg.querySelector(selector);
+ }
+
+ // Check if there is just one main group in SVG
+ if (!viewport) {
+ var childNodes = Array.prototype.slice
+ .call(svg.childNodes || svg.children)
+ .filter(function (el) {
+ return el.nodeName !== "defs" && el.nodeName !== "#text";
+ });
+
+ // Node name should be SVGGElement and should have no transform attribute
+ // Groups with transform are not used as viewport because it involves parsing of all transform possibilities
+ if (
+ childNodes.length === 1 &&
+ childNodes[0].nodeName === "g" &&
+ childNodes[0].getAttribute("transform") === null
+ ) {
+ viewport = childNodes[0];
+ }
+ }
+
+ // If no favorable group element exists then create one
+ if (!viewport) {
+ var viewportId = "viewport-" + new Date().toISOString().replace(/\D/g, "");
+ viewport = document.createElementNS(svgNS, "g");
+ viewport.setAttribute("id", viewportId);
+
+ // Internet Explorer (all versions?) can't use childNodes, but other browsers prefer (require?) using childNodes
+ var svgChildren = svg.childNodes || svg.children;
+ if (!!svgChildren && svgChildren.length > 0) {
+ for (var i = svgChildren.length; i > 0; i--) {
+ // Move everything into viewport except defs
+ if (svgChildren[svgChildren.length - i].nodeName !== "defs") {
+ viewport.appendChild(svgChildren[svgChildren.length - i]);
+ }
+ }
+ }
+ svg.appendChild(viewport);
+ }
+
+ // Parse class names
+ var classNames = [];
+ if (viewport.getAttribute("class")) {
+ classNames = viewport.getAttribute("class").split(" ");
+ }
+
+ // Set class (if not set already)
+ if (!~classNames.indexOf("svg-pan-zoom_viewport")) {
+ classNames.push("svg-pan-zoom_viewport");
+ viewport.setAttribute("class", classNames.join(" "));
+ }
+
+ return viewport;
+}
+export function setupSvgAttributes(svg) {
+ // Setting default attributes
+ svg.setAttribute("xmlns", svgNS);
+ svg.setAttributeNS(xmlnsNS, "xmlns:xlink", xlinkNS);
+ svg.setAttributeNS(xmlnsNS, "xmlns:ev", evNS);
+
+ // Needed for Internet Explorer, otherwise the viewport overflows
+ if (svg.parentNode !== null) {
+ var style = svg.getAttribute("style") || "";
+ if (style.toLowerCase().indexOf("overflow") === -1) {
+ svg.setAttribute("style", "overflow: hidden; " + style);
+ }
+ }
+}
+export const internetExplorerRedisplayInterval = 300;
+export const refreshDefsGlobal = throttle(
+ function () {
+ var allDefs = document.querySelectorAll("defs");
+ var allDefsCount = allDefs.length;
+ for (var i = 0; i < allDefsCount; i++) {
+ var thisDefs = allDefs[i];
+ thisDefs.parentNode.insertBefore(thisDefs, thisDefs);
+ }
+ },
+ this ? internetExplorerRedisplayInterval : null
+);
+export function setCTM(element, matrix, defs) {
+ var that = this,
+ s =
+ "matrix(" +
+ matrix.a +
+ "," +
+ matrix.b +
+ "," +
+ matrix.c +
+ "," +
+ matrix.d +
+ "," +
+ matrix.e +
+ "," +
+ matrix.f +
+ ")";
+
+ element.setAttributeNS(null, "transform", s);
+ if ("transform" in element.style) {
+ element.style.transform = s;
+ } else if ("-ms-transform" in element.style) {
+ element.style["-ms-transform"] = s;
+ } else if ("-webkit-transform" in element.style) {
+ element.style["-webkit-transform"] = s;
+ }
+
+ // IE has a bug that makes markers disappear on zoom (when the matrix "a" and/or "d" elements change)
+ // see http://stackoverflow.com/questions/17654578/svg-marker-does-not-work-in-ie9-10
+ // and http://srndolha.wordpress.com/2013/11/25/svg-line-markers-may-disappear-in-internet-explorer-11/
+ if (_browser === "ie" && !!defs) {
+ // this refresh is intended for redisplaying the SVG during zooming
+ defs.parentNode.insertBefore(defs, defs);
+ // this refresh is intended for redisplaying the other SVGs on a page when panning a given SVG
+ // it is also needed for the given SVG itself, on zoomEnd, if the SVG contains any markers that
+ // are located under any other element(s).
+ window.setTimeout(function () {
+ that.refreshDefsGlobal();
+ }, that.internetExplorerRedisplayInterval);
+ }
+}
+export function getEventPoint(evt, svg) {
+ var point = svg.createSVGPoint();
+
+ mouseAndTouchNormalize(evt, svg);
+
+ point.x = evt.clientX;
+ point.y = evt.clientY;
+
+ return point;
+}
+export function getSvgCenterPoint(svg, width, height) {
+ return createSVGPoint(svg, width / 2, height / 2);
+}
+export function createSVGPoint(svg, x, y) {
+ var point = svg.createSVGPoint();
+ point.x = x;
+ point.y = y;
+
+ return point;
+}
diff --git a/src/svg-pan-zoom/uniwheel.js b/src/svg-pan-zoom/uniwheel.js
new file mode 100644
index 0000000..fb34e46
--- /dev/null
+++ b/src/svg-pan-zoom/uniwheel.js
@@ -0,0 +1,149 @@
+// uniwheel 0.1.2 (customized)
+// A unified cross browser mouse wheel event handler
+// https://github.com/teemualap/uniwheel
+
+//Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
+
+var prefix = "",
+ _addEventListener,
+ _removeEventListener,
+ support,
+ fns = [];
+var passiveOption = { passive: true };
+
+// detect event model
+if (window.addEventListener) {
+ _addEventListener = "addEventListener";
+ _removeEventListener = "removeEventListener";
+} else {
+ _addEventListener = "attachEvent";
+ _removeEventListener = "detachEvent";
+ prefix = "on";
+}
+
+// detect available wheel event
+support =
+ "onwheel" in document.createElement("div")
+ ? "wheel" // Modern browsers support "wheel"
+ : document.onmousewheel !== undefined
+ ? "mousewheel" // Webkit and IE support at least "mousewheel"
+ : "DOMMouseScroll"; // let's assume that remaining browsers are older Firefox
+
+function createCallback(element, callback) {
+ var fn = function (originalEvent) {
+ !originalEvent && (originalEvent = window.event);
+
+ // create a normalized event object
+ var event = {
+ // keep a ref to the original event object
+ originalEvent: originalEvent,
+ target: originalEvent.target || originalEvent.srcElement,
+ type: "wheel",
+ deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1,
+ deltaX: 0,
+ delatZ: 0,
+ preventDefault: function () {
+ originalEvent.preventDefault
+ ? originalEvent.preventDefault()
+ : (originalEvent.returnValue = false);
+ },
+ };
+
+ // calculate deltaY (and deltaX) according to the event
+ if (support == "mousewheel") {
+ event.deltaY = (-1 / 40) * originalEvent.wheelDelta;
+ // Webkit also support wheelDeltaX
+ originalEvent.wheelDeltaX &&
+ (event.deltaX = (-1 / 40) * originalEvent.wheelDeltaX);
+ } else {
+ event.deltaY = originalEvent.detail;
+ }
+
+ // it's time to fire the callback
+ return callback(event);
+ };
+
+ fns.push({
+ element: element,
+ fn: fn,
+ });
+
+ return fn;
+}
+
+function getCallback(element) {
+ for (var i = 0; i < fns.length; i++) {
+ if (fns[i].element === element) {
+ return fns[i].fn;
+ }
+ }
+ return function () {};
+}
+
+function removeCallback(element) {
+ for (var i = 0; i < fns.length; i++) {
+ if (fns[i].element === element) {
+ return fns.splice(i, 1);
+ }
+ }
+}
+
+function _addWheelListener(elem, eventName, callback, isPassiveListener) {
+ var cb;
+
+ if (support === "wheel") {
+ cb = callback;
+ } else {
+ cb = createCallback(elem, callback);
+ }
+
+ elem[_addEventListener](
+ prefix + eventName,
+ cb,
+ isPassiveListener ? passiveOption : false
+ );
+}
+
+function _removeWheelListener(elem, eventName, callback, isPassiveListener) {
+ var cb;
+
+ if (support === "wheel") {
+ cb = callback;
+ } else {
+ cb = getCallback(elem);
+ }
+
+ elem[_removeEventListener](
+ prefix + eventName,
+ cb,
+ isPassiveListener ? passiveOption : false
+ );
+
+ removeCallback(elem);
+}
+
+function addWheelListener(elem, callback, isPassiveListener) {
+ _addWheelListener(elem, support, callback, isPassiveListener);
+
+ // handle MozMousePixelScroll in older Firefox
+ if (support == "DOMMouseScroll") {
+ _addWheelListener(elem, "MozMousePixelScroll", callback, isPassiveListener);
+ }
+}
+
+function removeWheelListener(elem, callback, isPassiveListener) {
+ _removeWheelListener(elem, support, callback, isPassiveListener);
+
+ // handle MozMousePixelScroll in older Firefox
+ if (support == "DOMMouseScroll") {
+ _removeWheelListener(
+ elem,
+ "MozMousePixelScroll",
+ callback,
+ isPassiveListener
+ );
+ }
+}
+
+export const on = addWheelListener;
+export const off = removeWheelListener;
diff --git a/src/svg-pan-zoom/utilities.js b/src/svg-pan-zoom/utilities.js
new file mode 100644
index 0000000..4785805
--- /dev/null
+++ b/src/svg-pan-zoom/utilities.js
@@ -0,0 +1,207 @@
+export function extend(target, source) {
+ target = target || {};
+ for (var prop in source) {
+ // Go recursively
+ if (isObject(source[prop])) {
+ target[prop] = extend(target[prop], source[prop]);
+ } else {
+ target[prop] = source[prop];
+ }
+ }
+ return target;
+}
+export function isElement(o) {
+ return (
+ o instanceof HTMLElement ||
+ o instanceof SVGElement ||
+ o instanceof SVGSVGElement || //DOM2
+ (o &&
+ typeof o === "object" &&
+ o !== null &&
+ o.nodeType === 1 &&
+ typeof o.nodeName === "string")
+ );
+}
+export function isObject(o) {
+ return Object.prototype.toString.call(o) === "[object Object]";
+}
+export function isNumber(n) {
+ return !isNaN(parseFloat(n)) && isFinite(n);
+}
+export function getSvg(elementOrSelector) {
+ var element, svg;
+
+ if (!isElement(elementOrSelector)) {
+ // If selector provided
+ if (
+ typeof elementOrSelector === "string" ||
+ elementOrSelector instanceof String
+ ) {
+ // Try to find the element
+ element = document.querySelector(elementOrSelector);
+
+ if (!element) {
+ throw new Error(
+ "Provided selector did not find any elements. Selector: " +
+ elementOrSelector
+ );
+ return null;
+ }
+ } else {
+ throw new Error("Provided selector is not an HTML object nor String");
+ return null;
+ }
+ } else {
+ element = elementOrSelector;
+ }
+
+ if (element.tagName.toLowerCase() === "svg") {
+ svg = element;
+ } else {
+ if (element.tagName.toLowerCase() === "object") {
+ svg = element.contentDocument.documentElement;
+ } else {
+ if (element.tagName.toLowerCase() === "embed") {
+ svg = element.getSVGDocument().documentElement;
+ } else {
+ if (element.tagName.toLowerCase() === "img") {
+ throw new Error(
+ 'Cannot script an SVG in an "img" element. Please use an "object" element or an in-line SVG.'
+ );
+ } else {
+ throw new Error("Cannot get SVG.");
+ }
+ return null;
+ }
+ }
+ }
+
+ return svg;
+}
+export function proxy(fn, context) {
+ return function () {
+ return fn.apply(context, arguments);
+ };
+}
+export function getType(o) {
+ return Object.prototype.toString
+ .apply(o)
+ .replace(/^\[object\s/, "")
+ .replace(/\]$/, "");
+}
+export function mouseAndTouchNormalize(evt, svg) {
+ // If no clientX then fallback
+ if (evt.clientX === void 0 || evt.clientX === null) {
+ // Fallback
+ evt.clientX = 0;
+ evt.clientY = 0;
+
+ // If it is a touch event
+ if (evt.touches !== void 0 && evt.touches.length) {
+ if (evt.touches[0].clientX !== void 0) {
+ evt.clientX = evt.touches[0].clientX;
+ evt.clientY = evt.touches[0].clientY;
+ } else if (evt.touches[0].pageX !== void 0) {
+ var rect = svg.getBoundingClientRect();
+
+ evt.clientX = evt.touches[0].pageX - rect.left;
+ evt.clientY = evt.touches[0].pageY - rect.top;
+ }
+ // If it is a custom event
+ } else if (evt.originalEvent !== void 0) {
+ if (evt.originalEvent.clientX !== void 0) {
+ evt.clientX = evt.originalEvent.clientX;
+ evt.clientY = evt.originalEvent.clientY;
+ }
+ }
+ }
+}
+export function isDblClick(evt, prevEvt) {
+ // Double click detected by browser
+ if (evt.detail === 2) {
+ return true;
+ }
+
+ // Try to compare events
+ else if (prevEvt !== void 0 && prevEvt !== null) {
+ var timeStampDiff = evt.timeStamp - prevEvt.timeStamp, // should be lower than 250 ms
+ touchesDistance = Math.sqrt(
+ Math.pow(evt.clientX - prevEvt.clientX, 2) +
+ Math.pow(evt.clientY - prevEvt.clientY, 2)
+ );
+
+ return timeStampDiff < 250 && touchesDistance < 10;
+ }
+
+ // Nothing found
+ return false;
+}
+export const now =
+ Date.now ||
+ function () {
+ return new Date().getTime();
+ };
+export function throttle(func, wait, options) {
+ var that = this;
+ var context, args, result;
+ var timeout = null;
+ var previous = 0;
+ if (!options) {
+ options = {};
+ }
+ var later = function () {
+ previous = options.leading === false ? 0 : that.now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) {
+ context = args = null;
+ }
+ };
+ return function () {
+ var now = that.now();
+ if (!previous && options.leading === false) {
+ previous = now;
+ }
+ var remaining = wait - (now - previous);
+ context = this; // eslint-disable-line consistent-this
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ if (!timeout) {
+ context = args = null;
+ }
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+}
+export function createRequestAnimationFrame(refreshRate) {
+ var timeout = null;
+
+ // Convert refreshRate to timeout
+ if (refreshRate !== "auto" && refreshRate < 60 && refreshRate > 1) {
+ timeout = Math.floor(1000 / refreshRate);
+ }
+
+ if (timeout === null) {
+ return window.requestAnimationFrame || requestTimeout(33);
+ } else {
+ return requestTimeout(timeout);
+ }
+}
+
+/**
+ * Create a callback that will execute after a given timeout
+ *
+ * @param {Function} timeout
+ * @return {Function}
+ */
+function requestTimeout(timeout) {
+ return function (callback) {
+ window.setTimeout(callback, timeout);
+ };
+}
diff --git a/src/tooltip.ts b/src/tooltip.ts
new file mode 100644
index 0000000..dc4ff58
--- /dev/null
+++ b/src/tooltip.ts
@@ -0,0 +1,25 @@
+export default function Tooltip(svg: HTMLObjectElement, element: HTMLElement) {
+ element.addEventListener("mouseover", () => (element.style.display = "none"));
+ function setTooltip(e: MouseEvent, content: string) {
+ element.innerHTML = content;
+ element.style.display = "block";
+
+ element.style.left = e.pageX + 10 + "px";
+
+ if (
+ element.getBoundingClientRect().right > svg.getBoundingClientRect().right
+ ) {
+ element.style.left = e.pageX - element.clientWidth + "px";
+ element.style.top = e.pageY - element.clientHeight - 10 + "px";
+ } else {
+ element.style.top = e.pageY - element.clientHeight / 2 + "px";
+ }
+ }
+
+ function hideTooltip() {
+ element.style.display = "none";
+ element.innerHTML = "";
+ }
+
+ return { setTooltip, hideTooltip };
+}
diff --git a/tsconfig.json b/tsconfig.json
index eac16d1..b65fb5e 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,19 +1,21 @@
{
- "compilerOptions": {
- "target": "ESNext",
- "useDefineForClassFields": true,
- "module": "ESNext",
- "lib": ["ESNext", "DOM"],
- "moduleResolution": "Node",
- "strict": true,
- "resolveJsonModule": true,
- "isolatedModules": true,
- "esModuleInterop": true,
- "noEmit": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "noImplicitReturns": true,
- "skipLibCheck": true
- },
- "include": ["src"]
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ESNext", "DOM"],
+ "moduleResolution": "Node",
+ "strict": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "noEmit": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noImplicitReturns": true,
+ "skipLibCheck": true,
+ "allowJs": true,
+ "checkJs": false
+ },
+ "include": ["src"]
}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..c1c5704
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,300 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/helper-module-imports@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
+ integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-string-parser@^7.19.4":
+ version "7.19.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
+ integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
+
+"@babel/helper-validator-identifier@^7.19.1":
+ version "7.19.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
+ integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
+
+"@babel/types@^7.18.6":
+ version "7.20.2"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842"
+ integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==
+ dependencies:
+ "@babel/helper-string-parser" "^7.19.4"
+ "@babel/helper-validator-identifier" "^7.19.1"
+ to-fast-properties "^2.0.0"
+
+"@esbuild/android-arm@0.15.13":
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.13.tgz#ce11237a13ee76d5eae3908e47ba4ddd380af86a"
+ integrity sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==
+
+"@esbuild/linux-loong64@0.15.13":
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz#64e8825bf0ce769dac94ee39d92ebe6272020dfc"
+ integrity sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==
+
+"@rollup/plugin-babel@^6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.2.tgz#92ad7a00cc0e4a6b59e1498cda9f907a9c0d2db3"
+ integrity sha512-Vnt8XIWYwCf3MD7qhBWYlP9pjSZvcE++nlPXhQYw6YNehl5742AzFbrV6h4BHb20VAOVUlIksVLymQCTwVCGDg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.18.6"
+ "@rollup/pluginutils" "^5.0.1"
+
+"@rollup/pluginutils@^5.0.1":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33"
+ integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==
+ dependencies:
+ "@types/estree" "^1.0.0"
+ estree-walker "^2.0.2"
+ picomatch "^2.3.1"
+
+"@types/estree@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
+ integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
+
+"@types/node@^18.11.9":
+ version "18.11.9"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4"
+ integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==
+
+esbuild-android-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz#5f25864055dbd62e250f360b38b4c382224063af"
+ integrity sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==
+
+esbuild-android-arm64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz#d8820f999314efbe8e0f050653a99ff2da632b0f"
+ integrity sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==
+
+esbuild-darwin-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz#99ae7fdaa43947b06cd9d1a1c3c2c9f245d81fd0"
+ integrity sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==
+
+esbuild-darwin-arm64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz#bafa1814354ad1a47adcad73de416130ef7f55e3"
+ integrity sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==
+
+esbuild-freebsd-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz#84ef85535c5cc38b627d1c5115623b088d1de161"
+ integrity sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==
+
+esbuild-freebsd-arm64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz#033f21de434ec8e0c478054b119af8056763c2d8"
+ integrity sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==
+
+esbuild-linux-32@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz#54290ea8035cba0faf1791ce9ae6693005512535"
+ integrity sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==
+
+esbuild-linux-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz#4264249281ea388ead948614b57fb1ddf7779a2c"
+ integrity sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==
+
+esbuild-linux-arm64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz#9323c333924f97a02bdd2ae8912b36298acb312d"
+ integrity sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==
+
+esbuild-linux-arm@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz#b407f47b3ae721fe4e00e19e9f19289bef87a111"
+ integrity sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==
+
+esbuild-linux-mips64le@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz#bdf905aae5c0bcaa8f83567fe4c4c1bdc1f14447"
+ integrity sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==
+
+esbuild-linux-ppc64le@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz#2911eae1c90ff58a3bd3259cb557235df25aa3b4"
+ integrity sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==
+
+esbuild-linux-riscv64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz#1837c660be12b1d20d2a29c7189ea703f93e9265"
+ integrity sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==
+
+esbuild-linux-s390x@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz#d52880ece229d1bd10b2d936b792914ffb07c7fc"
+ integrity sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==
+
+esbuild-netbsd-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz#de14da46f1d20352b43e15d97a80a8788275e6ed"
+ integrity sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==
+
+esbuild-openbsd-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz#45e8a5fd74d92ad8f732c43582369c7990f5a0ac"
+ integrity sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==
+
+esbuild-sunos-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz#f646ac3da7aac521ee0fdbc192750c87da697806"
+ integrity sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==
+
+esbuild-windows-32@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz#fb4fe77c7591418880b3c9b5900adc4c094f2401"
+ integrity sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==
+
+esbuild-windows-64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz#1fca8c654392c0c31bdaaed168becfea80e20660"
+ integrity sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==
+
+esbuild-windows-arm64@0.15.13:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz#4ffd01b6b2888603f1584a2fe96b1f6a6f2b3dd8"
+ integrity sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==
+
+esbuild@^0.15.9:
+ version "0.15.13"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.13.tgz#7293480038feb2bafa91d3f6a20edab3ba6c108a"
+ integrity sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.15.13"
+ "@esbuild/linux-loong64" "0.15.13"
+ esbuild-android-64 "0.15.13"
+ esbuild-android-arm64 "0.15.13"
+ esbuild-darwin-64 "0.15.13"
+ esbuild-darwin-arm64 "0.15.13"
+ esbuild-freebsd-64 "0.15.13"
+ esbuild-freebsd-arm64 "0.15.13"
+ esbuild-linux-32 "0.15.13"
+ esbuild-linux-64 "0.15.13"
+ esbuild-linux-arm "0.15.13"
+ esbuild-linux-arm64 "0.15.13"
+ esbuild-linux-mips64le "0.15.13"
+ esbuild-linux-ppc64le "0.15.13"
+ esbuild-linux-riscv64 "0.15.13"
+ esbuild-linux-s390x "0.15.13"
+ esbuild-netbsd-64 "0.15.13"
+ esbuild-openbsd-64 "0.15.13"
+ esbuild-sunos-64 "0.15.13"
+ esbuild-windows-32 "0.15.13"
+ esbuild-windows-64 "0.15.13"
+ esbuild-windows-arm64 "0.15.13"
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+is-core-module@^2.9.0:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
+ integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
+ dependencies:
+ has "^1.0.3"
+
+nanoid@^3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+postcss@^8.4.18:
+ version "8.4.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2"
+ integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==
+ dependencies:
+ nanoid "^3.3.4"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+resolve@^1.22.1:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^2.79.1:
+ version "2.79.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
+ integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+typescript@^4.6.4:
+ version "4.8.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6"
+ integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
+
+vite@^3.2.0:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.3.tgz#7a68d9ef73eff7ee6dc0718ad3507adfc86944a7"
+ integrity sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==
+ dependencies:
+ esbuild "^0.15.9"
+ postcss "^8.4.18"
+ resolve "^1.22.1"
+ rollup "^2.79.1"
+ optionalDependencies:
+ fsevents "~2.3.2"