From bf935a4378e1e4a3701d90092e6db787ec9b555c Mon Sep 17 00:00:00 2001 From: Justin K Date: Wed, 3 Dec 2025 10:54:10 +0100 Subject: [PATCH 01/89] feat: initialize Vue 3 project with Vite and packages --- ui/.gitignore | 24 + ui/.vscode/extensions.json | 3 + ui/index.html | 13 + ui/package.json | 26 + ui/pnpm-lock.yaml | 1289 ++++++++++++++++++++++++++++++ ui/public/vite.svg | 1 + ui/src/App.vue | 30 + ui/src/assets/vue.svg | 1 + ui/src/components/HelloWorld.vue | 41 + ui/src/main.ts | 5 + ui/src/style.css | 79 ++ ui/tsconfig.app.json | 16 + ui/tsconfig.json | 7 + ui/tsconfig.node.json | 26 + ui/vite.config.ts | 7 + 15 files changed, 1568 insertions(+) create mode 100644 ui/.vscode/extensions.json create mode 100644 ui/index.html create mode 100644 ui/package.json create mode 100644 ui/pnpm-lock.yaml create mode 100644 ui/public/vite.svg create mode 100644 ui/src/App.vue create mode 100644 ui/src/assets/vue.svg create mode 100644 ui/src/components/HelloWorld.vue create mode 100644 ui/src/main.ts create mode 100644 ui/src/style.css create mode 100644 ui/tsconfig.app.json create mode 100644 ui/tsconfig.json create mode 100644 ui/tsconfig.node.json create mode 100644 ui/vite.config.ts diff --git a/ui/.gitignore b/ui/.gitignore index e69de29..a547bf3 100644 --- a/ui/.gitignore +++ b/ui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/ui/.vscode/extensions.json b/ui/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/ui/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000..cebf0df --- /dev/null +++ b/ui/index.html @@ -0,0 +1,13 @@ + + + + + + + geo2-vue + + +
+ + + diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..97343d8 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,26 @@ +{ + "name": "geo2-vue", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@vueuse/core": "^14.1.0", + "maplibre-gl": "^5.13.0", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-router": "^4.6.3" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vue-tsc": "^3.1.4" + } +} diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml new file mode 100644 index 0000000..386db9f --- /dev/null +++ b/ui/pnpm-lock.yaml @@ -0,0 +1,1289 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@vueuse/core': + specifier: ^14.1.0 + version: 14.1.0(vue@3.5.25(typescript@5.9.3)) + maplibre-gl: + specifier: ^5.13.0 + version: 5.13.0 + pinia: + specifier: ^3.0.4 + version: 3.0.4(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) + vue: + specifier: ^3.5.24 + version: 3.5.25(typescript@5.9.3) + vue-router: + specifier: ^4.6.3 + version: 4.6.3(vue@3.5.25(typescript@5.9.3)) + devDependencies: + '@types/node': + specifier: ^24.10.1 + version: 24.10.1 + '@vitejs/plugin-vue': + specifier: ^6.0.1 + version: 6.0.2(vite@7.2.6(@types/node@24.10.1))(vue@3.5.25(typescript@5.9.3)) + '@vue/tsconfig': + specifier: ^0.8.1 + version: 0.8.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) + typescript: + specifier: ~5.9.3 + version: 5.9.3 + vite: + specifier: ^7.2.4 + version: 7.2.6(@types/node@24.10.1) + vue-tsc: + specifier: ^3.1.4 + version: 3.1.5(typescript@5.9.3) + +packages: + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@mapbox/geojson-rewind@0.5.2': + resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} + hasBin: true + + '@mapbox/jsonlint-lines-primitives@2.0.2': + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + + '@mapbox/point-geometry@1.1.0': + resolution: {integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==} + + '@mapbox/tiny-sdf@2.0.7': + resolution: {integrity: sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==} + + '@mapbox/unitbezier@0.0.1': + resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} + + '@mapbox/vector-tile@2.0.4': + resolution: {integrity: sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==} + + '@mapbox/whoots-js@3.1.0': + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + + '@maplibre/maplibre-gl-style-spec@24.3.1': + resolution: {integrity: sha512-TUM5JD40H2mgtVXl5IwWz03BuQabw8oZQLJTmPpJA0YTYF+B+oZppy5lNMO6bMvHzB+/5mxqW9VLG3wFdeqtOw==} + hasBin: true + + '@maplibre/mlt@1.1.2': + resolution: {integrity: sha512-SQKdJ909VGROkA6ovJgtHNs9YXV4YXUPS+VaZ50I2Mt951SLlUm2Cv34x5Xwc1HiFlsd3h2Yrs5cn7xzqBmENw==} + + '@maplibre/vt-pbf@4.1.0': + resolution: {integrity: sha512-9LjFAoWtxdGRns8RK9vG3Fcw/fb3eHMxvAn2jffwn3jnVO1k49VOv6+FEza70rK7WzF8GnBiKa0K39RyfevKUw==} + + '@rolldown/pluginutils@1.0.0-beta.50': + resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} + + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/geojson-vt@3.2.5': + resolution: {integrity: sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + + '@types/supercluster@7.1.3': + resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@vitejs/plugin-vue@6.0.2': + resolution: {integrity: sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + + '@volar/typescript@2.4.23': + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + + '@vue/compiler-core@3.5.25': + resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} + + '@vue/compiler-dom@3.5.25': + resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} + + '@vue/compiler-sfc@3.5.25': + resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} + + '@vue/compiler-ssr@3.5.25': + resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/language-core@3.1.5': + resolution: {integrity: sha512-FMcqyzWN+sYBeqRMWPGT2QY0mUasZMVIuHvmb5NT3eeqPrbHBYtCP8JWEUCDCgM+Zr62uuWY/qoeBrPrzfa78w==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.25': + resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} + + '@vue/runtime-core@3.5.25': + resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} + + '@vue/runtime-dom@3.5.25': + resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} + + '@vue/server-renderer@3.5.25': + resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} + peerDependencies: + vue: 3.5.25 + + '@vue/shared@3.5.25': + resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} + + '@vue/tsconfig@0.8.1': + resolution: {integrity: sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==} + peerDependencies: + typescript: 5.x + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true + + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} + + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 + + alien-signals@3.1.1: + resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + earcut@3.0.2: + resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + geojson-vt@4.0.2: + resolution: {integrity: sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + json-stringify-pretty-compact@4.0.0: + resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} + + kdbush@4.0.2: + resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + maplibre-gl@5.13.0: + resolution: {integrity: sha512-UsIVP34rZdM4TjrjhwBAhbC3HT7AzFx9p/draiAPlLr8/THozZF6WmJnZ9ck4q94uO55z7P7zoGCh+AZVoagsQ==} + engines: {node: '>=16.14.0', npm: '>=8.1.0'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + pbf@4.0.1: + resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} + hasBin: true + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + potpack@2.1.0: + resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} + + protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + + quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + supercluster@8.0.1: + resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyqueue@3.0.0: + resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + vite@7.2.6: + resolution: {integrity: sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-router@4.6.3: + resolution: {integrity: sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@3.1.5: + resolution: {integrity: sha512-L/G9IUjOWhBU0yun89rv8fKqmKC+T0HfhrFjlIml71WpfBv9eb4E9Bev8FMbyueBIU9vxQqbd+oOsVcDa5amGw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.25: + resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@mapbox/geojson-rewind@0.5.2': + dependencies: + get-stream: 6.0.1 + minimist: 1.2.8 + + '@mapbox/jsonlint-lines-primitives@2.0.2': {} + + '@mapbox/point-geometry@1.1.0': {} + + '@mapbox/tiny-sdf@2.0.7': {} + + '@mapbox/unitbezier@0.0.1': {} + + '@mapbox/vector-tile@2.0.4': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 + pbf: 4.0.1 + + '@mapbox/whoots-js@3.1.0': {} + + '@maplibre/maplibre-gl-style-spec@24.3.1': + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/unitbezier': 0.0.1 + json-stringify-pretty-compact: 4.0.0 + minimist: 1.2.8 + quickselect: 3.0.0 + rw: 1.3.3 + tinyqueue: 3.0.0 + + '@maplibre/mlt@1.1.2': + dependencies: + '@mapbox/point-geometry': 1.1.0 + + '@maplibre/vt-pbf@4.1.0': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@mapbox/vector-tile': 2.0.4 + '@types/geojson-vt': 3.2.5 + '@types/supercluster': 7.1.3 + geojson-vt: 4.0.2 + pbf: 4.0.1 + supercluster: 8.0.1 + + '@rolldown/pluginutils@1.0.0-beta.50': {} + + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@types/estree@1.0.8': {} + + '@types/geojson-vt@3.2.5': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/geojson@7946.0.16': {} + + '@types/node@24.10.1': + dependencies: + undici-types: 7.16.0 + + '@types/supercluster@7.1.3': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/web-bluetooth@0.0.21': {} + + '@vitejs/plugin-vue@6.0.2(vite@7.2.6(@types/node@24.10.1))(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.50 + vite: 7.2.6(@types/node@24.10.1) + vue: 3.5.25(typescript@5.9.3) + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 + + '@volar/source-map@2.4.23': {} + + '@volar/typescript@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.25 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.25': + dependencies: + '@vue/compiler-core': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/compiler-sfc@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.25 + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.25': + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@3.1.5(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.25 + '@vue/shared': 3.5.25 + alien-signals: 3.1.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + optionalDependencies: + typescript: 5.9.3 + + '@vue/reactivity@3.5.25': + dependencies: + '@vue/shared': 3.5.25 + + '@vue/runtime-core@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/runtime-dom@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/runtime-core': 3.5.25 + '@vue/shared': 3.5.25 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + vue: 3.5.25(typescript@5.9.3) + + '@vue/shared@3.5.25': {} + + '@vue/tsconfig@0.8.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3))': + optionalDependencies: + typescript: 5.9.3 + vue: 3.5.25(typescript@5.9.3) + + '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.1.0 + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + + '@vueuse/metadata@14.1.0': {} + + '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + vue: 3.5.25(typescript@5.9.3) + + alien-signals@3.1.1: {} + + birpc@2.9.0: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + csstype@3.2.3: {} + + earcut@3.0.2: {} + + entities@4.5.0: {} + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fsevents@2.3.3: + optional: true + + geojson-vt@4.0.2: {} + + get-stream@6.0.1: {} + + gl-matrix@3.4.4: {} + + hookable@5.5.3: {} + + is-what@5.5.0: {} + + json-stringify-pretty-compact@4.0.0: {} + + kdbush@4.0.2: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + maplibre-gl@5.13.0: + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/point-geometry': 1.1.0 + '@mapbox/tiny-sdf': 2.0.7 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 2.0.4 + '@mapbox/whoots-js': 3.1.0 + '@maplibre/maplibre-gl-style-spec': 24.3.1 + '@maplibre/mlt': 1.1.2 + '@maplibre/vt-pbf': 4.1.0 + '@types/geojson': 7946.0.16 + '@types/geojson-vt': 3.2.5 + '@types/supercluster': 7.1.3 + earcut: 3.0.2 + geojson-vt: 4.0.2 + gl-matrix: 3.4.4 + kdbush: 4.0.2 + murmurhash-js: 1.0.0 + pbf: 4.0.1 + potpack: 2.1.0 + quickselect: 3.0.0 + supercluster: 8.0.1 + tinyqueue: 3.0.0 + + minimist@1.2.8: {} + + mitt@3.0.1: {} + + muggle-string@0.4.1: {} + + murmurhash-js@1.0.0: {} + + nanoid@3.3.11: {} + + path-browserify@1.0.1: {} + + pbf@4.0.1: + dependencies: + resolve-protobuf-schema: 2.1.0 + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pinia@3.0.4(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 7.7.9 + vue: 3.5.25(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + potpack@2.1.0: {} + + protocol-buffers-schema@3.6.0: {} + + quickselect@3.0.0: {} + + resolve-protobuf-schema@2.1.0: + dependencies: + protocol-buffers-schema: 3.6.0 + + rfdc@1.4.1: {} + + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 + fsevents: 2.3.3 + + rw@1.3.3: {} + + source-map-js@1.2.1: {} + + speakingurl@14.0.1: {} + + supercluster@8.0.1: + dependencies: + kdbush: 4.0.2 + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyqueue@3.0.0: {} + + typescript@5.9.3: {} + + undici-types@7.16.0: {} + + vite@7.2.6(@types/node@24.10.1): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.1 + fsevents: 2.3.3 + + vscode-uri@3.1.0: {} + + vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.25(typescript@5.9.3) + + vue-tsc@3.1.5(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.23 + '@vue/language-core': 3.1.5(typescript@5.9.3) + typescript: 5.9.3 + + vue@3.5.25(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-sfc': 3.5.25 + '@vue/runtime-dom': 3.5.25 + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) + '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.9.3 diff --git a/ui/public/vite.svg b/ui/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/ui/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/App.vue b/ui/src/App.vue new file mode 100644 index 0000000..58b0f21 --- /dev/null +++ b/ui/src/App.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/ui/src/assets/vue.svg b/ui/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/ui/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/components/HelloWorld.vue b/ui/src/components/HelloWorld.vue new file mode 100644 index 0000000..b58e52b --- /dev/null +++ b/ui/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/ui/src/main.ts b/ui/src/main.ts new file mode 100644 index 0000000..2425c0f --- /dev/null +++ b/ui/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/ui/src/style.css b/ui/src/style.css new file mode 100644 index 0000000..f691315 --- /dev/null +++ b/ui/src/style.css @@ -0,0 +1,79 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/ui/tsconfig.app.json b/ui/tsconfig.app.json new file mode 100644 index 0000000..8d16e42 --- /dev/null +++ b/ui/tsconfig.app.json @@ -0,0 +1,16 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "types": ["vite/client"], + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/ui/tsconfig.node.json b/ui/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/ui/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/ui/vite.config.ts b/ui/vite.config.ts new file mode 100644 index 0000000..bbcf80c --- /dev/null +++ b/ui/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], +}) From 014f771a543bda5bda064708fc81cd844e54cebb Mon Sep 17 00:00:00 2001 From: Justin K Date: Wed, 3 Dec 2025 11:13:20 +0100 Subject: [PATCH 02/89] feat: Added project folder structure --- ui/src/assets/styles/base/.gitkeep | 0 ui/src/assets/styles/components/.gitkeep | 0 ui/src/composables/.gitkeep | 0 ui/src/services/.gitkeep | 0 ui/src/stores/.gitkeep | 0 ui/src/types/.gitkeep | 0 ui/src/views/.gitkeep | 0 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ui/src/assets/styles/base/.gitkeep create mode 100644 ui/src/assets/styles/components/.gitkeep create mode 100644 ui/src/composables/.gitkeep create mode 100644 ui/src/services/.gitkeep create mode 100644 ui/src/stores/.gitkeep create mode 100644 ui/src/types/.gitkeep create mode 100644 ui/src/views/.gitkeep diff --git a/ui/src/assets/styles/base/.gitkeep b/ui/src/assets/styles/base/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/assets/styles/components/.gitkeep b/ui/src/assets/styles/components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/composables/.gitkeep b/ui/src/composables/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/services/.gitkeep b/ui/src/services/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/stores/.gitkeep b/ui/src/stores/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/types/.gitkeep b/ui/src/types/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/views/.gitkeep b/ui/src/views/.gitkeep new file mode 100644 index 0000000..e69de29 From e5277d33153bd06268d5bd0d7922eaf5e869a47b Mon Sep 17 00:00:00 2001 From: Justin K Date: Wed, 3 Dec 2025 15:47:55 +0100 Subject: [PATCH 03/89] feat, styling: css vars, base, reset --- ui/src/App.vue | 14 ---- ui/src/assets/Atlas Logo.png | Bin 0 -> 61492 bytes ui/src/assets/styles/base/base.css | 73 +++++++++++++++++ ui/src/assets/styles/base/reset.css | 60 ++++++++++++++ ui/src/assets/styles/base/vars.css | 122 ++++++++++++++++++++++++++++ ui/src/assets/styles/main.css | 8 ++ ui/src/main.ts | 2 +- ui/src/style.css | 79 ------------------ 8 files changed, 264 insertions(+), 94 deletions(-) create mode 100644 ui/src/assets/Atlas Logo.png create mode 100644 ui/src/assets/styles/base/base.css create mode 100644 ui/src/assets/styles/base/reset.css create mode 100644 ui/src/assets/styles/base/vars.css create mode 100644 ui/src/assets/styles/main.css delete mode 100644 ui/src/style.css diff --git a/ui/src/App.vue b/ui/src/App.vue index 58b0f21..194fb6d 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -14,17 +14,3 @@ import HelloWorld from './components/HelloWorld.vue' - diff --git a/ui/src/assets/Atlas Logo.png b/ui/src/assets/Atlas Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e6dc889cf823b49f80ccc07310a18d6947a871 GIT binary patch literal 61492 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 Date: Wed, 3 Dec 2025 16:35:13 +0100 Subject: [PATCH 04/89] feat: Add README, project structure, and styling guide documentation --- ui/README.md | 57 ++++++ ui/docs/STRUCTURE.md | 92 ++++++++++ ui/docs/STYLING.md | 423 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 572 insertions(+) create mode 100644 ui/docs/STRUCTURE.md create mode 100644 ui/docs/STYLING.md diff --git a/ui/README.md b/ui/README.md index e69de29..dbd76a4 100644 --- a/ui/README.md +++ b/ui/README.md @@ -0,0 +1,57 @@ +# STAC-Atlas UI + +Vue 3 + TypeScript frontend for the STAC-Atlas project. + +## Quick Start + +```bash +# Go to the ui directory if needed* +cd ui + +# Install dependencies +pnpm install + +# Start development server +pnpm dev + +# Build for production +pnpm build + +# Preview production build +pnpm preview +``` + +## Tech Stack + +- **Vue 3** - Progressive JavaScript framework +- **TypeScript** - Type-safe JavaScript +- **Vite** - Fast build tool and dev server +- **Pinia** - State management +- **Vue Router** - Client-side routing +- **MapLibre GL** - Interactive maps +- **VueUse** - Vue composition utilities + +## Project Structure + +``` +src/ +├── assets/ # Static assets (images, styles) +│ └── styles/ # Global CSS architecture +├── components/ # Reusable UI components +├── composables/ # Shared composition functions +├── services/ # API and STAC service calls +├── stores/ # Pinia state stores +├── types/ # TypeScript type definitions +├── views/ # Page-level components +├── App.vue # Root component +└── main.ts # Application entry point +``` + +## Documentation + +- [Folder Structure Guide](./docs/STRUCTURE.md) - Detailed breakdown of project organization +- [Styling Guide](./docs/STYLING.md) - CSS architecture and component styling patterns + +## Development + +The dev server runs at `http://localhost:5173/` with hot module replacement enabled. diff --git a/ui/docs/STRUCTURE.md b/ui/docs/STRUCTURE.md new file mode 100644 index 0000000..9c76446 --- /dev/null +++ b/ui/docs/STRUCTURE.md @@ -0,0 +1,92 @@ +# Project Structure + +## Overview + +The UI follows a modular architecture with clear separation of concerns. + +## Folders + +### `src/assets/` +Static assets like images, fonts, and global styles. + +**styles/** - Structured CSS architecture: +- `base/reset.css` - CSS reset +- `base/vars.css` - CSS custom properties +- `base/base.css` - Global styles +- `main.css` - Main entry point + +### `src/components/` +Reusable UI components used across multiple views. + +**Examples:** +- `Button.vue` +- `SearchBar.vue` +- `MapViewer.vue` + +**Convention:** PascalCase naming, single component per file. + +### `src/composables/` +Shared composition functions (Vue Composition API logic). + +**Examples:** +- `useMap.ts` - Map interaction logic +- `useFetch.ts` - Data fetching utilities +- `useDebounce.ts` - Debounce helper + +**Convention:** Prefix with `use`, export as default. + +### `src/services/` +External API calls and business logic. + +**Examples:** +- `stacApi.ts` - STAC catalog API +- `geocoding.ts` - Geocoding service +- `api.ts` - Base API configuration + +**Convention:** Pure functions, no component logic. + +### `src/stores/` +Pinia state management stores. + +**Examples:** +- `catalogStore.ts` - STAC catalog state +- `mapStore.ts` - Map state and settings +- `userStore.ts` - User preferences + +**Convention:** One store per domain, use `defineStore`. + +### `src/types/` +TypeScript type definitions and interfaces. + +**Examples:** +- `stac.ts` - STAC specification types +- `map.ts` - Map-related types +- `api.ts` - API response types + +**Convention:** Group by domain, export interfaces. + +### `src/views/` +Page-level components (one per route). + +**Examples:** +- `Home.vue` +- `CatalogView.vue` +- `MapView.vue` + +**Convention:** PascalCase with `View` suffix for clarity. + +## Import Aliases + +```typescript +// Configured in vite.config.ts +import Component from '@/components/Component.vue' +import { useStore } from '@/stores/store' +import type { STACItem } from '@/types/stac' +``` + +## File Naming + +- **Components/Views:** PascalCase (`SearchBar.vue`) +- **Services/Composables:** camelCase (`stacApi.ts`, `useMap.ts`) +- **Types:** camelCase (`stac.ts`) +- **Stores:** camelCase with `Store` suffix (`catalogStore.ts`) diff --git a/ui/docs/STYLING.md b/ui/docs/STYLING.md new file mode 100644 index 0000000..173facb --- /dev/null +++ b/ui/docs/STYLING.md @@ -0,0 +1,423 @@ +# Styling Guide + +## CSS Architecture + +The project uses a structured CSS system with custom properties for consistency. + +### File Structure + +``` +src/assets/styles/ +├── base/ +│ ├── reset.css # CSS reset +│ ├── vars.css # CSS custom properties +│ └── base.css # Global styles +├── components/ # Component-specific styles +└── main.css # Main entry (imports all) +``` + +## CSS Custom Properties + +All design tokens are defined in `base/vars.css`: + +### Colors + +```css +/* Light mode */ +--bg /* Background */ +--fg /* Foreground/text */ +--primary /* Primary brand color */ +--primary-fg /* Primary text color */ +--secondary /* Secondary color */ +--muted /* Muted background */ +--muted-fg /* Muted text */ +--border /* Border color */ +--destructive /* Error/danger color */ + +/* Semantic aliases */ +--color-text /* Main text */ +--color-text-muted /* Secondary text */ +--color-success /* Success state */ +--color-warning /* Warning state */ +--color-info /* Info state */ +``` + +**Dark mode:** Add `.dark` class to `` or ``. + +### Spacing + +```css +--spacing-xs /* 0.25rem */ +--spacing-sm /* 0.5rem */ +--spacing-md /* 1rem */ +--spacing-lg /* 1.5rem */ +--spacing-xl /* 2rem */ +--spacing-2xl /* 3rem */ +--spacing-3xl /* 4rem */ +``` + +### Typography + +```css +--font-size-xs /* 0.75rem */ +--font-size-base /* 1rem */ +--font-size-2xl /* 1.5rem */ +/* ... more sizes */ + +--font-weight-normal /* 400 */ +--font-weight-semibold /* 600 */ +--font-weight-bold /* 700 */ +``` + +### Border Radius + +```css +--radius /* Base: 0.625rem */ +--radius-sm /* Small */ +--radius-lg /* Large */ +--radius-full /* Pill shape */ +``` + +### Other + +- **Shadows:** `--shadow-sm`, `--shadow-md`, `--shadow-lg` +- **Transitions:** `--transition-fast`, `--transition-base`, `--transition-slow` +- **Z-index:** `--z-index-modal`, `--z-index-dropdown`, etc. + +## Component Styling + +Each component gets its own dedicated CSS file in `src/assets/styles/components/`. + +### Naming Convention + +Component: `src/components/SearchBar.vue` +Stylesheet: `src/assets/styles/components/search-bar.css` + +Use kebab-case for CSS filenames matching the component name. + +### Setup Steps + +1. **Create the component CSS file:** + +```css +/* src/assets/styles/components/button.css */ +.btn { + padding: var(--spacing-sm) var(--spacing-lg); + background: var(--primary); + color: var(--primary-fg); + border-radius: var(--radius); + font-weight: var(--font-weight-semibold); + transition: background-color var(--transition-fast); + cursor: pointer; +} + +.btn:hover { + opacity: 0.9; +} + +.btn-primary { + background: var(--primary); + color: var(--primary-fg); +} + +.btn-secondary { + background: var(--secondary); + color: var(--secondary-fg); +} + +.btn-destructive { + background: var(--destructive); + color: var(--destructive-fg); +} +``` + +2. **Import in `main.css`:** + +```css +/* src/assets/styles/main.css */ +@import './base/reset.css'; +@import './base/vars.css'; +@import './base/base.css'; + +/* Component styles */ +@import './components/button.css'; +@import './components/search-bar.css'; +@import './components/card.css'; +``` + +3. **Use classes in component:** + +```vue + + + + +``` + +**No ` diff --git a/ui/src/composables/.gitkeep b/ui/src/composables/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/main.ts b/ui/src/main.ts new file mode 100644 index 0000000..51fefd7 --- /dev/null +++ b/ui/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './assets/styles/main.css' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/ui/src/services/.gitkeep b/ui/src/services/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/stores/.gitkeep b/ui/src/stores/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/types/.gitkeep b/ui/src/types/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/views/.gitkeep b/ui/src/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/tsconfig.app.json b/ui/tsconfig.app.json new file mode 100644 index 0000000..8d16e42 --- /dev/null +++ b/ui/tsconfig.app.json @@ -0,0 +1,16 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "types": ["vite/client"], + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/ui/tsconfig.node.json b/ui/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/ui/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/ui/vite.config.ts b/ui/vite.config.ts new file mode 100644 index 0000000..bbcf80c --- /dev/null +++ b/ui/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], +}) From 63fc8b16f932415e14b48080d9829e70115f395c Mon Sep 17 00:00:00 2001 From: Justin K Date: Sat, 6 Dec 2025 21:52:23 +0100 Subject: [PATCH 06/89] feat: lucide icons --- ui/package.json | 1 + ui/pnpm-lock.yaml | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/ui/package.json b/ui/package.json index 97343d8..fc39a6b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@vueuse/core": "^14.1.0", + "lucide-vue-next": "^0.556.0", "maplibre-gl": "^5.13.0", "pinia": "^3.0.4", "vue": "^3.5.24", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 386db9f..d4e1973 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@vueuse/core': specifier: ^14.1.0 version: 14.1.0(vue@3.5.25(typescript@5.9.3)) + lucide-vue-next: + specifier: ^0.556.0 + version: 0.556.0(vue@3.5.25(typescript@5.9.3)) maplibre-gl: specifier: ^5.13.0 version: 5.13.0 @@ -540,6 +543,11 @@ packages: kdbush@4.0.2: resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} + lucide-vue-next@0.556.0: + resolution: {integrity: sha512-JvdCM2smkWrMDhkfD/FpZiWekkbWD6MZLstIFx/FOVZgULrnMr5hegCB9LlTdgllEFnQYQs8hhHC1WYcAV9HTA==} + peerDependencies: + vue: '>=3.0.1' + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -1123,6 +1131,10 @@ snapshots: kdbush@4.0.2: {} + lucide-vue-next@0.556.0(vue@3.5.25(typescript@5.9.3)): + dependencies: + vue: 3.5.25(typescript@5.9.3) + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 From a33389173ad00efc603e5ca4e2b408c9cb1ec63b Mon Sep 17 00:00:00 2001 From: Justin K Date: Sat, 6 Dec 2025 21:53:04 +0100 Subject: [PATCH 07/89] feat: removed the default HelloWorld component --- ui/src/components/HelloWorld.vue | 41 -------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 ui/src/components/HelloWorld.vue diff --git a/ui/src/components/HelloWorld.vue b/ui/src/components/HelloWorld.vue deleted file mode 100644 index b58e52b..0000000 --- a/ui/src/components/HelloWorld.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - From a67316ac718c3e5ebf3b8896bc1f35c15c720a21 Mon Sep 17 00:00:00 2001 From: Justin K Date: Sat, 6 Dec 2025 22:31:12 +0100 Subject: [PATCH 08/89] feat: filter, navbar, search result component and search section --- ui/src/App.vue | 34 +++-- ui/src/assets/styles/base/base.css | 5 - ui/src/assets/styles/base/vars.css | 26 ++-- .../assets/styles/components/app-layout.css | 23 +++ .../styles/components/custom-select.css | 118 +++++++++++++++ .../styles/components/filter-section.css | 139 ++++++++++++++++++ ui/src/assets/styles/components/navbar.css | 77 ++++++++++ .../styles/components/search-results.css | 21 +++ .../styles/components/search-section.css | 59 ++++++++ ui/src/assets/styles/main.css | 8 +- ui/src/components/CustomSelect.vue | 91 ++++++++++++ ui/src/components/FilterSection.vue | 115 +++++++++++++++ ui/src/components/Navbar.vue | 65 ++++++++ ui/src/components/SearchResults.vue | 13 ++ ui/src/components/SearchSection.vue | 32 ++++ ui/tsconfig.app.json | 5 + ui/vite.config.ts | 6 + 17 files changed, 811 insertions(+), 26 deletions(-) create mode 100644 ui/src/assets/styles/components/app-layout.css create mode 100644 ui/src/assets/styles/components/custom-select.css create mode 100644 ui/src/assets/styles/components/filter-section.css create mode 100644 ui/src/assets/styles/components/navbar.css create mode 100644 ui/src/assets/styles/components/search-results.css create mode 100644 ui/src/assets/styles/components/search-section.css create mode 100644 ui/src/components/CustomSelect.vue create mode 100644 ui/src/components/FilterSection.vue create mode 100644 ui/src/components/Navbar.vue create mode 100644 ui/src/components/SearchResults.vue create mode 100644 ui/src/components/SearchSection.vue diff --git a/ui/src/App.vue b/ui/src/App.vue index 194fb6d..7e4eb9d 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -1,16 +1,32 @@ diff --git a/ui/src/assets/styles/base/base.css b/ui/src/assets/styles/base/base.css index c0de9eb..30383f4 100644 --- a/ui/src/assets/styles/base/base.css +++ b/ui/src/assets/styles/base/base.css @@ -47,11 +47,6 @@ button { transition: background-color var(--transition-fast), color var(--transition-fast); } -button:hover { - background-color: var(--secondary); - color: var(--text-hover); -} - /* Utilities */ .container { width: 100%; diff --git a/ui/src/assets/styles/base/vars.css b/ui/src/assets/styles/base/vars.css index 3ad01fc..3e9d9c9 100644 --- a/ui/src/assets/styles/base/vars.css +++ b/ui/src/assets/styles/base/vars.css @@ -14,12 +14,13 @@ --muted-fg: oklch(0.556 0 0); --destructive: oklch(0.577 0.245 27.325); --destructive-fg: oklch(0.577 0.245 27.325); - --border: oklch(0.729 0 0); - --input: oklch(0.922 0 0); + --border: oklch(0.829 0 0); + --input: oklch(1 0 0); --ring: oklch(0.708 0 0); /* Semantic Color Aliases */ --text: oklch(0.145 0 0); + --text-white: oklch(0.985 0 0); --text-muted: oklch(0.6 0 0); --text-hover: oklch(1 0 0); --color-success: oklch(0.6 0.15 145); @@ -79,6 +80,7 @@ /* Shadows */ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow: 0 2px 2px 0px rgba(0, 0, 0, 0.075); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); @@ -96,6 +98,10 @@ --z-index-modal: 1050; --z-index-popover: 1060; --z-index-tooltip: 1070; + + /* Other */ + --navbar-height: 58px; + --search-section-height: 110px; } /* Dark Mode */ @@ -106,17 +112,15 @@ --card-fg: oklch(0.985 0 0); --popover: oklch(0.145 0 0); --popover-fg: oklch(0.985 0 0); - --primary: oklch(0.985 0 0); - --primary-fg: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-fg: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-fg: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-fg: oklch(0.985 0 0); --destructive: oklch(0.396 0.141 25.723); --destructive-fg: oklch(0.637 0.237 25.331); --border: oklch(0.269 0 0); - --input: oklch(0.269 0 0); + --input: oklch(0.25 0 0); --ring: oklch(0.439 0 0); + + /* Semantic Color Aliases */ + --text: oklch(1 0 0); + --text-white: oklch(0.985 0 0); + --text-muted: oklch(0.6 0 0); + --text-hover: oklch(0.145 0 0); } diff --git a/ui/src/assets/styles/components/app-layout.css b/ui/src/assets/styles/components/app-layout.css new file mode 100644 index 0000000..c868b4c --- /dev/null +++ b/ui/src/assets/styles/components/app-layout.css @@ -0,0 +1,23 @@ +.app-layout { + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.main-content { + display: flex; + flex: 1; +} + +.content-area { + flex: 1; + display: flex; + flex-direction: column; + overflow-y: auto; +} + +@media (max-width: 768px) { + .main-content { + flex-direction: column; + } +} diff --git a/ui/src/assets/styles/components/custom-select.css b/ui/src/assets/styles/components/custom-select.css new file mode 100644 index 0000000..590daf1 --- /dev/null +++ b/ui/src/assets/styles/components/custom-select.css @@ -0,0 +1,118 @@ +.custom-select { + position: relative; + width: 100%; +} + +.select-trigger { + width: 100%; + padding: var(--spacing-xs) var(--spacing-sm); + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + color: var(--fg); + font-size: var(--font-size-sm); + cursor: pointer; + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--spacing-sm); + transition: border-color var(--transition-fast), box-shadow var(--transition-fast); + text-align: left; + box-shadow: var(--shadow); +} + +.select-trigger:hover { + border-color: var(--primary); + box-shadow: var(--shadow-sm); +} + +.custom-select.is-open .select-trigger { + background-color: var(--primary); + border-color: var(--primary); +} + +.select-value { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 0 var(--spacing-sm); +} + +.select-icon { + flex-shrink: 0; + color: var(--fg); + transition: transform var(--transition-fast); +} + +.custom-select.is-open .select-icon { + transform: rotate(180deg); +} + +.select-dropdown { + position: absolute; + top: calc(100% + 4px); + left: 0; + right: 0; + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); + max-height: 240px; + overflow-y: auto; + z-index: var(--z-index-dropdown); + animation: slideDown 150ms ease-out; +} + +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.select-option { + padding: var(--spacing-sm) var(--spacing-md); + cursor: pointer; + color: var(--text); + font-size: var(--font-size-sm); + transition: background-color var(--transition-fast); +} + +.select-option:hover { + background: var(--hover); +} + +.select-option.is-selected { + background: var(--primary); + color: var(--text); + font-weight: var(--font-weight-semibold); +} + +.select-option.is-selected:hover { + background: var(--primary); + opacity: 0.9; +} + +/* Scrollbar styling */ +.select-dropdown::-webkit-scrollbar { + width: 8px; +} + +.select-dropdown::-webkit-scrollbar-track { + background: var(--bg); + border-radius: var(--radius); +} + +.select-dropdown::-webkit-scrollbar-thumb { + background: var(--border); + border-radius: var(--radius); +} + +.select-dropdown::-webkit-scrollbar-thumb:hover { + background: var(--muted-fg); +} diff --git a/ui/src/assets/styles/components/filter-section.css b/ui/src/assets/styles/components/filter-section.css new file mode 100644 index 0000000..6dbda38 --- /dev/null +++ b/ui/src/assets/styles/components/filter-section.css @@ -0,0 +1,139 @@ +.filter-section { + width: 280px; + background: var(--bg); + border-right: 1px solid var(--border); + padding: 0 var(--spacing-md); + overflow-x: hidden; + overflow-y: auto; + height: calc(100vh - var(--navbar-height)); +} + +.section-divider { + height: 1px; + background: var(--border); + margin: var(--spacing-sm) calc(-1 * var(--spacing-md)); +} + +.filter-group { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + padding: var(--spacing-sm) 0; +} + +.filter-title { + font-size: var(--font-size-base); + font-weight: var(--font-weight-semibold); + color: var(--fg); + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + + +.filter-icon { + color: var(--primary); +} + +.filter-action-btn { + width: 100%; + padding: var(--spacing-xs) var(--spacing-sm); + color: var(--text); + border: 1px solid var(--border); + border-radius: var(--radius); + font-size: var(--font-size-sm); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + gap: var(--spacing-xs); + transition: background-color var(--transition-fast); +} + +.filter-action-btn:hover { + color: var(--text-white); + background: var(--secondary); +} + +.filter-action-btn .icon { + color: var(--fg); +} + +.filter-action-btn:hover .icon { + color: var(--text-white); +} + +.filter-label { + display: block; + font-size: var(--font-size-sm); + font-weight: var(--font-weight-medium); + color: var(--fg); + margin-bottom: var(--spacing-xs); +} + +.filter-input { + width: 100%; + padding: var(--spacing-xs) var(--spacing-sm); + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + color: var(--fg); + font-size: var(--font-size-sm); + transition: border-color var(--transition-fast), box-shadow var(--transition-fast); + box-shadow: var(--shadow); +} + +.filter-input:hover { + border-color: var(--primary); + box-shadow: var(--shadow-sm); +} + +.filter-input:focus { + outline: none; + border-color: var(--primary); +} + +.filter-input::placeholder { + color: var(--muted-fg); +} + +.filter-actions { + display: flex; + gap: var(--spacing-sm); + padding-top: var(--spacing-sm); +} + +.btn-apply, +.btn-reset { + flex: 1; + padding: var(--spacing-sm) var(--spacing-md); + border-radius: var(--radius); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + cursor: pointer; + transition: opacity var(--transition-fast), box-shadow var(--transition-fast); + box-shadow: var(--shadow); +} + +.btn-apply { + background: var(--primary); + color: var(--text-white); + border: none; +} + +.btn-apply:hover { + background-color: var(--secondary); + box-shadow: var(--shadow-sm); + +} + +.btn-reset { + background: transparent; + color: var(--text); + border: 1px solid var(--border); +} + +.btn-reset:hover { + background: var(--hover); + box-shadow: var(--shadow-sm); +} diff --git a/ui/src/assets/styles/components/navbar.css b/ui/src/assets/styles/components/navbar.css new file mode 100644 index 0000000..4f43d15 --- /dev/null +++ b/ui/src/assets/styles/components/navbar.css @@ -0,0 +1,77 @@ +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg); + border-bottom: 1px solid var(--border); + position: sticky; + top: 0; + z-index: var(--z-index-sticky); +} + +.navbar-brand { + display: flex; + align-items: center; + gap: var(--spacing-md); +} + +.navbar-logo { + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; +} + +.logo-icon { + width: 100%; + height: 100%; + object-fit: contain; +} + +.navbar-title h1 { + font-size: var(--font-size-xl); + font-weight: var(--font-weight-bold); + color: var(--text); + margin: 0; + line-height: 1.2; +} + +.navbar-subtitle { + font-size: var(--font-size-sm); + color: var(--muted-fg); + margin: 0; + line-height: 1.2; +} + +.navbar-actions { + display: flex; + gap: var(--spacing-sm); + align-items: center; +} + +.navbar-btn { + padding: var(--spacing-xs) var(--spacing-md); + background: transparent; + border: 1px solid var(--border); + border-radius: var(--radius); + color: var(--text); + font-size: var(--font-size-base); + cursor: pointer; + transition: background-color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast); + display: flex; + align-items: center; + gap: var(--spacing-xs); + min-height: 35px; + box-shadow: var(--shadow); +} + +.navbar-btn:hover { + border-color: var(--primary); + box-shadow: var(--shadow-sm); +} + +.navbar-btn:active { + transform: scale(0.98); +} diff --git a/ui/src/assets/styles/components/search-results.css b/ui/src/assets/styles/components/search-results.css new file mode 100644 index 0000000..5e212bb --- /dev/null +++ b/ui/src/assets/styles/components/search-results.css @@ -0,0 +1,21 @@ +.search-results { + padding: var(--spacing-xl); + background: var(--bg); + min-height: calc(100vh - var(--search-section-height) - var(--navbar-height)); +} + +.results-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: var(--spacing-lg); +} + +@media (max-width: 768px) { + .search-results { + padding: var(--spacing-md); + } + + .results-grid { + grid-template-columns: 1fr; + } +} diff --git a/ui/src/assets/styles/components/search-section.css b/ui/src/assets/styles/components/search-section.css new file mode 100644 index 0000000..e116c30 --- /dev/null +++ b/ui/src/assets/styles/components/search-section.css @@ -0,0 +1,59 @@ +.search-section { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg); + border-bottom: 1px solid var(--border); +} + +.search-title { + font-size: var(--font-size-xl); + font-weight: var(--font-weight-bold); + color: var(--fg); +} + +.search-count { + font-size: var(--font-size-xs); + color: var(--muted-fg); + margin: 0; +} + +.search-bar { + display: flex; + align-items: center; + gap: var(--spacing-sm); + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: var(--spacing-sm) var(--spacing-md); + transition: border-color var(--transition-fast), box-shadow var(--transition-fast); + box-shadow: var(--shadow); +} + +.search-bar:hover, +.search-bar:focus-within { + border-color: var(--primary); + box-shadow: var(--shadow-sm); +} + +.search-icon { + color: var(--muted-fg); +} + +.search-input { + flex: 1; + border: none; + background: transparent; + color: var(--fg); + font-size: var(--font-size-base); + padding: 0; +} + +.search-input:focus { + outline: none; +} + +.search-input::placeholder { + color: var(--muted-fg); +} diff --git a/ui/src/assets/styles/main.css b/ui/src/assets/styles/main.css index 70d720e..1638d6c 100644 --- a/ui/src/assets/styles/main.css +++ b/ui/src/assets/styles/main.css @@ -5,4 +5,10 @@ @import './base/vars.css'; @import './base/base.css'; -/* Component styles will be imported here */ +/* Component styles */ +@import './components/app-layout.css'; +@import './components/navbar.css'; +@import './components/filter-section.css'; +@import './components/custom-select.css'; +@import './components/search-section.css'; +@import './components/search-results.css'; diff --git a/ui/src/components/CustomSelect.vue b/ui/src/components/CustomSelect.vue new file mode 100644 index 0000000..c19fff9 --- /dev/null +++ b/ui/src/components/CustomSelect.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/ui/src/components/FilterSection.vue b/ui/src/components/FilterSection.vue new file mode 100644 index 0000000..790c94b --- /dev/null +++ b/ui/src/components/FilterSection.vue @@ -0,0 +1,115 @@ + + + \ No newline at end of file diff --git a/ui/src/components/Navbar.vue b/ui/src/components/Navbar.vue new file mode 100644 index 0000000..291842b --- /dev/null +++ b/ui/src/components/Navbar.vue @@ -0,0 +1,65 @@ + + + diff --git a/ui/src/components/SearchResults.vue b/ui/src/components/SearchResults.vue new file mode 100644 index 0000000..697429e --- /dev/null +++ b/ui/src/components/SearchResults.vue @@ -0,0 +1,13 @@ + + + diff --git a/ui/src/components/SearchSection.vue b/ui/src/components/SearchSection.vue new file mode 100644 index 0000000..29bdc72 --- /dev/null +++ b/ui/src/components/SearchSection.vue @@ -0,0 +1,32 @@ + + + diff --git a/ui/tsconfig.app.json b/ui/tsconfig.app.json index 8d16e42..9458c85 100644 --- a/ui/tsconfig.app.json +++ b/ui/tsconfig.app.json @@ -4,6 +4,11 @@ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "types": ["vite/client"], + /* Path Mapping */ + "paths": { + "@/*": ["./src/*"] + }, + /* Linting */ "strict": true, "noUnusedLocals": true, diff --git a/ui/vite.config.ts b/ui/vite.config.ts index bbcf80c..59e16fd 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -1,7 +1,13 @@ +import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vite.dev/config/ export default defineConfig({ plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } }) From 738c4e66d4d1f9d22ee4b39e0fcc6bd3a4c259f5 Mon Sep 17 00:00:00 2001 From: Justin K Date: Sun, 7 Dec 2025 11:25:35 +0100 Subject: [PATCH 09/89] feat: box-shadow for the section divider style: cleaned up some artifacts from the logo --- ui/src/assets/Atlas Logo.png | Bin 61492 -> 18688 bytes .../styles/components/filter-section.css | 1 + 2 files changed, 1 insertion(+) diff --git a/ui/src/assets/Atlas Logo.png b/ui/src/assets/Atlas Logo.png index e9e6dc889cf823b49f80ccc07310a18d6947a871..8a7f34f549768461d8e02d11883a03a883958ed9 100644 GIT binary patch literal 18688 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 Date: Sun, 7 Dec 2025 11:36:04 +0100 Subject: [PATCH 10/89] feat: changed title and package name to STAC Atlas --- ui/index.html | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/index.html b/ui/index.html index cebf0df..c277b4a 100644 --- a/ui/index.html +++ b/ui/index.html @@ -4,7 +4,7 @@ - geo2-vue + STAC Atlas
diff --git a/ui/package.json b/ui/package.json index fc39a6b..b032431 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,5 +1,5 @@ { - "name": "geo2-vue", + "name": "stac-atlas", "private": true, "version": "0.0.0", "type": "module", From a2186d83ac8526895f3072e3909c5e333b63fdc9 Mon Sep 17 00:00:00 2001 From: Justin K Date: Sun, 7 Dec 2025 11:38:26 +0100 Subject: [PATCH 11/89] chore: removed vite.svg --- ui/public/vite.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 ui/public/vite.svg diff --git a/ui/public/vite.svg b/ui/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/ui/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From c645903ac915772aeeea2dfc7d2dfa5b7b252343 Mon Sep 17 00:00:00 2001 From: Justin K Date: Sun, 7 Dec 2025 11:41:39 +0100 Subject: [PATCH 12/89] chore: removed vue.svg --- ui/src/assets/vue.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 ui/src/assets/vue.svg diff --git a/ui/src/assets/vue.svg b/ui/src/assets/vue.svg deleted file mode 100644 index 770e9d3..0000000 --- a/ui/src/assets/vue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 3af15c9e477a3b2469fe3144acbef34ebdaece2b Mon Sep 17 00:00:00 2001 From: Simon Benjamin Imfeld Date: Sun, 14 Dec 2025 23:29:44 +0100 Subject: [PATCH 13/89] feat: Implement InfoCard, ItemCard and SearchResultCard components (#194) Cards for the display of the Search Result and also for the collection/ catalog page --- ui/package-lock.json | 1942 +++++++++++++++++ ui/src/App.vue | 3 +- ui/src/assets/styles/components/info-card.css | 42 + ui/src/assets/styles/components/item-card.css | 54 + .../styles/components/search-result-card.css | 126 ++ ui/src/components/InfoCard.vue | 26 + ui/src/components/ItemCard.vue | 31 + ui/src/components/SearchResultCard.vue | 60 + 8 files changed, 2282 insertions(+), 2 deletions(-) create mode 100644 ui/package-lock.json create mode 100644 ui/src/assets/styles/components/info-card.css create mode 100644 ui/src/assets/styles/components/item-card.css create mode 100644 ui/src/assets/styles/components/search-result-card.css create mode 100644 ui/src/components/InfoCard.vue create mode 100644 ui/src/components/ItemCard.vue create mode 100644 ui/src/components/SearchResultCard.vue diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 0000000..30e35d3 --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,1942 @@ +{ + "name": "stac-atlas", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "stac-atlas", + "version": "0.0.0", + "dependencies": { + "@vueuse/core": "^14.1.0", + "lucide-vue-next": "^0.556.0", + "maplibre-gl": "^5.13.0", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-router": "^4.6.3" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vue-tsc": "^3.1.4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "license": "ISC", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", + "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz", + "integrity": "sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^4.0.1" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.4.0.tgz", + "integrity": "sha512-VVuNV2Yf0+yQoth4qbdIPE0qKS6nIG5Atki9BVHZ7R7+0lZyxqxwrh0XVNA5YkuKuytFg/1i3VMyJQnp2EtOqw==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^3.0.0", + "rw": "^1.3.3", + "tinyqueue": "^3.0.0" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@maplibre/mlt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.1.2.tgz", + "integrity": "sha512-SQKdJ909VGROkA6ovJgtHNs9YXV4YXUPS+VaZ50I2Mt951SLlUm2Cv34x5Xwc1HiFlsd3h2Yrs5cn7xzqBmENw==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0" + } + }, + "node_modules/@maplibre/vt-pbf": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.1.0.tgz", + "integrity": "sha512-9LjFAoWtxdGRns8RK9vG3Fcw/fb3eHMxvAn2jffwn3jnVO1k49VOv6+FEza70rK7WzF8GnBiKa0K39RyfevKUw==", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0", + "@mapbox/vector-tile": "^2.0.4", + "@types/geojson-vt": "3.2.5", + "@types/supercluster": "^7.1.3", + "geojson-vt": "^4.0.2", + "pbf": "^4.0.1", + "supercluster": "^8.0.1" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.50.tgz", + "integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/geojson-vt": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.3.tgz", + "integrity": "sha512-gqkrWUsS8hcm0r44yn7/xZeV1ERva/nLgrLxFRUGb7aoNMIJfZJ3AC261zDQuOAKC7MiXai1WCpYc48jAHoShQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.2.tgz", + "integrity": "sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.50" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.26.tgz", + "integrity": "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.26" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.26.tgz", + "integrity": "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.26.tgz", + "integrity": "sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.26", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", + "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", + "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", + "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.25", + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", + "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.1.8.tgz", + "integrity": "sha512-PfwAW7BLopqaJbneChNL6cUOTL3GL+0l8paYP5shhgY5toBNidWnMXWM+qDwL7MC9+zDtzCF2enT8r6VPu64iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.26", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz", + "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz", + "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", + "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/runtime-core": "3.5.25", + "@vue/shared": "3.5.25", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz", + "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "vue": "3.5.25" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", + "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.8.1.tgz", + "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.1.0.tgz", + "integrity": "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.1.0", + "@vueuse/shared": "14.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.1.0.tgz", + "integrity": "sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.1.0.tgz", + "integrity": "sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/alien-signals": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.1.tgz", + "integrity": "sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/earcut": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", + "license": "ISC" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", + "license": "MIT" + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "node_modules/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", + "license": "ISC" + }, + "node_modules/lucide-vue-next": { + "version": "0.556.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.556.0.tgz", + "integrity": "sha512-JvdCM2smkWrMDhkfD/FpZiWekkbWD6MZLstIFx/FOVZgULrnMr5hegCB9LlTdgllEFnQYQs8hhHC1WYcAV9HTA==", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/maplibre-gl": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.14.0.tgz", + "integrity": "sha512-O2ok6N/bQ9NA9nJ22r/PRQQYkUe9JwfDMjBPkQ+8OwsVH4TpA5skIAM2wc0k+rni5lVbAVONVyBvgi1rF2vEPA==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^1.1.0", + "@mapbox/tiny-sdf": "^2.0.7", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^2.0.4", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^24.3.1", + "@maplibre/mlt": "^1.1.2", + "@maplibre/vt-pbf": "^4.1.0", + "@types/geojson": "^7946.0.16", + "@types/geojson-vt": "3.2.5", + "@types/supercluster": "^7.1.3", + "earcut": "^3.0.2", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.4", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^4.0.1", + "potpack": "^2.1.0", + "quickselect": "^3.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0" + }, + "engines": { + "node": ">=16.14.0", + "npm": ">=8.1.0" + }, + "funding": { + "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pbf": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", + "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", + "license": "BSD-3-Clause", + "dependencies": { + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/potpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", + "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", + "license": "ISC" + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "license": "MIT" + }, + "node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.0.2" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", + "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", + "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-sfc": "3.5.25", + "@vue/runtime-dom": "3.5.25", + "@vue/server-renderer": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.1.8.tgz", + "integrity": "sha512-deKgwx6exIHeZwF601P1ktZKNF0bepaSN4jBU3AsbldPx9gylUc1JDxYppl82yxgkAgaz0Y0LCLOi+cXe9HMYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.26", + "@vue/language-core": "3.1.8" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/ui/src/App.vue b/ui/src/App.vue index 7e4eb9d..2a81f18 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -28,5 +28,4 @@ const Collections = ref([]) - - + \ No newline at end of file diff --git a/ui/src/assets/styles/components/info-card.css b/ui/src/assets/styles/components/info-card.css new file mode 100644 index 0000000..7507fc4 --- /dev/null +++ b/ui/src/assets/styles/components/info-card.css @@ -0,0 +1,42 @@ +/* info-card.css */ + +.info-card { + display: flex; + align-items: center; + gap: var(--spacing-md); + padding: var(--spacing-xs) var(--spacing-sm); + background-color: var(--bg); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.info-card__icon-wrapper { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + background-color: var(--hover); + border-radius: 50%; + color: var(--muted-fg); + font-size: var(--font-size-lg); +} + +.info-card__content { + display: flex; + flex-direction: column; +} + +.info-card__label { + font-size: var(--font-size-sm); + color: var(--muted-fg); + text-transform: uppercase; + letter-spacing: 0.05em; + font-weight: var(--font-weight-semibold); +} + +.info-card__value { + font-size: var(--font-size-base); + font-weight: var(--font-weight-bold); + color: var(--text); +} diff --git a/ui/src/assets/styles/components/item-card.css b/ui/src/assets/styles/components/item-card.css new file mode 100644 index 0000000..da0a8ba --- /dev/null +++ b/ui/src/assets/styles/components/item-card.css @@ -0,0 +1,54 @@ +/* item-card.css */ + +.item-card { + display: flex; + gap: var(--spacing-md); + padding: var(--spacing-md); + background-color: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + cursor: pointer; + transition: background-color var(--transition-fast); + box-shadow: var(--shadow); +} + + +.item-card:hover { + background-color: var(--muted); + +} + +.item-card__thumbnail { + width: 95px; + height: 65px; + border-radius: var(--radius); + object-fit: cover; + background-color: var(--muted); +} + +.item-card__content { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; +} + +.item-card__id { + font-weight: var(--font-weight-semibold); + color: var(--primary); + font-size: var(--font-size-base); + margin-bottom: var(--spacing-xs); + + + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.item-card__meta { + display: flex; + flex-direction: column; + font-size: var(--font-size-sm); + color: var(--muted-fg); +} + diff --git a/ui/src/assets/styles/components/search-result-card.css b/ui/src/assets/styles/components/search-result-card.css new file mode 100644 index 0000000..f0aa347 --- /dev/null +++ b/ui/src/assets/styles/components/search-result-card.css @@ -0,0 +1,126 @@ +/* search-result-card.css */ + +.search-result-card { + display: flex; + flex-direction: column; + justify-content: space-between; + background-color: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: var(--spacing-lg); + transition: box-shadow var(--transition-fast); + + max-width: 400px; +} + +.search-result-card:hover { + box-shadow: var(--shadow-md); +} + + +.card-header__top { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: var(--spacing-xs); +} + +.card-title { + margin: 0; + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + color: var(--text); +} + +.license-badge { + background-color: var(--primary); + color: var(--text-white); + font-size: var(--font-size-xs); + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-sm); + font-weight: var(--font-weight-medium); + white-space: nowrap; +} + +.provider-info { + font-size: var(--font-size-sm); + color: var(--muted-fg); + margin-bottom: var(--spacing-md); +} + + +.description { + font-size: var(--font-size-base); + color: var(--text); + margin-bottom: var(--spacing-md); + line-height: var(--line-height-normal); + + + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +/* Tags */ +.tags-list { + display: flex; + flex-wrap: wrap; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-lg); +} + +.tag { + background-color: var(--muted-bg); + color: var(--text); + font-size: var(--font-size-xs); + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-sm); + font-weight: var(--font-weight-medium); + border : 1px solid var(--border); +} + +/* Footer & Buttons */ +.card-footer { + display: flex; + gap: var(--spacing-sm); +} + +.btn { + padding: var(--spacing-xs) var(--spacing-md); + border-radius: var(--radius-sm); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-medium); + cursor: pointer; + border: none; + display: flex; + align-items: center; + gap: var(--spacing-xs); + transition: background-color var(--transition-fast), border-color var(--transition-fast); +} + +.btn-primary { + background-color: var(--primary); + color: var(--text-white); + flex: 1; +} + +.btn-primary:hover { + opacity: 0.9; + background-color: var(--secondary); +} + +.btn-secondary { + background-color: transparent; + color: var(--text); + border: 1px solid var(--border); +} + +.btn-secondary:hover { + background-color: var(--secondary); + color: var(--text-white); +} + +.btn-secondary { + flex-direction: row-reverse; +} \ No newline at end of file diff --git a/ui/src/components/InfoCard.vue b/ui/src/components/InfoCard.vue new file mode 100644 index 0000000..64b916e --- /dev/null +++ b/ui/src/components/InfoCard.vue @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/ui/src/components/ItemCard.vue b/ui/src/components/ItemCard.vue new file mode 100644 index 0000000..26610fa --- /dev/null +++ b/ui/src/components/ItemCard.vue @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file diff --git a/ui/src/components/SearchResultCard.vue b/ui/src/components/SearchResultCard.vue new file mode 100644 index 0000000..d12011b --- /dev/null +++ b/ui/src/components/SearchResultCard.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file From 7106925308a09a48322217b6277ca5add092d974 Mon Sep 17 00:00:00 2001 From: Justin K Date: Mon, 15 Dec 2025 11:13:22 +0100 Subject: [PATCH 14/89] chore: removed Helloworld --- ui/src/components/HelloWorld.vue | 41 -------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 ui/src/components/HelloWorld.vue diff --git a/ui/src/components/HelloWorld.vue b/ui/src/components/HelloWorld.vue deleted file mode 100644 index b58e52b..0000000 --- a/ui/src/components/HelloWorld.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - From 8861735da2a9f07e2facdfc82844e552567cb0e8 Mon Sep 17 00:00:00 2001 From: Justin K Date: Mon, 15 Dec 2025 14:09:19 +0100 Subject: [PATCH 15/89] feat: collection page, mockup data for visual feedback chore: styling corrected, adjusted based on the mockup --- ui/src/App.vue | 20 +- ui/src/assets/styles/base/base.css | 2 +- ui/src/assets/styles/base/vars.css | 8 +- .../styles/components/collection-detail.css | 255 +++++++++++++++ ui/src/assets/styles/components/info-card.css | 17 +- ui/src/assets/styles/components/item-card.css | 6 +- ui/src/assets/styles/components/navbar.css | 1 + .../styles/components/search-result-card.css | 21 +- .../styles/components/search-results.css | 4 +- .../styles/components/search-section.css | 2 +- ui/src/components/InfoCard.vue | 16 +- ui/src/components/SearchResultCard.vue | 9 +- ui/src/components/SearchResults.vue | 22 +- ui/src/main.ts | 5 +- ui/src/router/index.ts | 22 ++ ui/src/views/CollectionDetail.vue | 298 ++++++++++++++++++ ui/src/views/Home.vue | 95 ++++++ 17 files changed, 744 insertions(+), 59 deletions(-) create mode 100644 ui/src/assets/styles/components/collection-detail.css create mode 100644 ui/src/router/index.ts create mode 100644 ui/src/views/CollectionDetail.vue create mode 100644 ui/src/views/Home.vue diff --git a/ui/src/App.vue b/ui/src/App.vue index 2a81f18..84bc4dd 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -1,14 +1,5 @@ \ No newline at end of file diff --git a/ui/src/assets/styles/base/base.css b/ui/src/assets/styles/base/base.css index 30383f4..7679f47 100644 --- a/ui/src/assets/styles/base/base.css +++ b/ui/src/assets/styles/base/base.css @@ -27,7 +27,7 @@ h5 { font-size: var(--font-size-lg); } h6 { font-size: var(--font-size-base); } p { - margin-bottom: var(--spacing-md); + margin-bottom: var(--spacing-sm); } a { diff --git a/ui/src/assets/styles/base/vars.css b/ui/src/assets/styles/base/vars.css index 3e9d9c9..7b0d3e3 100644 --- a/ui/src/assets/styles/base/vars.css +++ b/ui/src/assets/styles/base/vars.css @@ -101,20 +101,20 @@ /* Other */ --navbar-height: 58px; - --search-section-height: 110px; + --search-section-height: 118px; } /* Dark Mode */ .dark { - --bg: oklch(0.145 0 0); + --bg: oklch(0.18 0 0); --fg: oklch(0.985 0 0); - --card: oklch(0.145 0 0); + --card: oklch(0.22 0 0); --card-fg: oklch(0.985 0 0); --popover: oklch(0.145 0 0); --popover-fg: oklch(0.985 0 0); --destructive: oklch(0.396 0.141 25.723); --destructive-fg: oklch(0.637 0.237 25.331); - --border: oklch(0.269 0 0); + --border: oklch(0.3 0 0); --input: oklch(0.25 0 0); --ring: oklch(0.439 0 0); diff --git a/ui/src/assets/styles/components/collection-detail.css b/ui/src/assets/styles/components/collection-detail.css new file mode 100644 index 0000000..9fc4b69 --- /dev/null +++ b/ui/src/assets/styles/components/collection-detail.css @@ -0,0 +1,255 @@ +.collection-detail { + max-width: 100%; + margin: 0; + background-color: var(--bg); +} + +.collection-detail__title { + font-size: var(--font-size-3xl); + font-weight: var(--font-weight-bold); + color: var(--text); +} + +.collection-detail__badges { + display: flex; + gap: var(--spacing-sm); + flex-wrap: wrap; +} + +.badge { + padding: 0.375rem 0.75rem; + border-radius: var(--radius-sm); + border: 1px solid var(--border); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); + text-transform: uppercase; + letter-spacing: 0.025em; +} + +.badge--primary { + background-color: var(--primary); + color: var(--text-white); + border: none; +} + +/* Main Layout */ +.collection-detail__main { + display: grid; + grid-template-columns: 2fr 1fr; + align-items: start; +} + +@media (max-width: 1024px) { + .collection-detail__main { + grid-template-columns: 1fr; + } +} + +/* Left Section - Overview + BBox + Metadata */ +.collection-detail__left-section { + display: flex; + flex-direction: column; + padding: var(--spacing-sm) var(--spacing-md); + gap: var(--spacing-md); + border-right: 1px solid var(--border); + height: calc(100vh - var(--navbar-height)); + max-height: calc(100vh - var(--navbar-height)); +} + +/* Top Row - Overview and BBox side by side */ +.collection-detail__top-row { + display: grid; + grid-template-columns: 1fr 450px; + gap: var(--spacing-md); + align-items: start; +} + +@media (max-width: 1200px) { + .collection-detail__top-row { + grid-template-columns: 1fr; + } +} + +/* Right Section - Items */ +.collection-detail__right-section { + display: flex; + flex-direction: column; + max-height: calc(100vh - var(--navbar-height)); +} + +@media (max-width: 1024px) { + .collection-detail__right-section { + border-left: none; + border-top: 1px solid var(--border); + } +} + +/* Info Section */ +.section-title { + font-size: var(--font-size-lg); + font-style: uppercase; + font-weight: var(--font-weight-semibold); + color: var(--text); +} + +/* Items title */ +.items-section .section-title { + padding: var(--spacing-md); + border-bottom: 1px solid var(--border); +} + +/* Overview Section */ +.overview-section { + background-color: transparent; +} + +.overview-section__description h3 { + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + letter-spacing: 0.05em; +} + +.overview-section__description p { + color: var(--muted-fg); + line-height: var(--line-height-relaxed); + font-size: var(--font-size-sm); +} + +.overview-section__info-cards { + display: flex; + flex-direction: column; + gap: var(--spacing-md); +} + +@media (max-width: 768px) { + .overview-section__info-cards { + grid-template-columns: 1fr; + } +} + +/* Metadata Section */ +.metadata-section { + background-color: transparent; +} + +.metadata-section__grid { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +.metadata-item { + display: flex; + justify-content: space-between; + padding: var(--spacing-sm) 0; + border-bottom: 1px solid var(--border); +} + +.metadata-item:last-child { + border-bottom: none; +} + +.metadata-item__label { + color: var(--text); + font-weight: var(--font-weight-normal); + font-size: var(--font-size-sm); +} + +.metadata-item__value { + color: var(--text); + font-weight: var(--font-weight-normal); + text-align: right; + font-size: var(--font-size-sm); +} + +/* Bounding Box Section */ +.bbox-section { + background-color: var(--card); + border: 1px solid var(--border); + border-radius: var(--radius); + overflow: hidden; + box-shadow: var(--shadow); + height: fit-content; +} + +.bbox-section__map { + width: 100%; + height: 200px; + background-color: #e0f2fe; + background-image: + linear-gradient(rgba(59, 130, 246, 0.1) 1px, transparent 1px), + linear-gradient(90deg, rgba(59, 130, 246, 0.1) 1px, transparent 1px); + background-size: 20px 20px; + position: relative; +} + +.bbox-section__map::after { + content: '🗺️'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 3rem; + opacity: 0.3; +} + +.bbox-section__coordinates { + display: flex; + flex-direction: row; + justify-content: space-between; + padding: var(--spacing-sm) var(--spacing-md); + border-bottom: 1px solid var(--border); + background-color: var(--card); +} + +.coordinate-system { + display: flex; + align-items: center; + gap: var(--spacing-sm); + color: var(--muted-fg); + font-size: var(--font-size-sm); +} + +.coordinate-values { + display: flex; + gap: var(--spacing-md); + font-size: var(--font-size-sm); + color: var(--text); + flex-wrap: wrap; +} + +.coordinate-values span { + white-space: nowrap; +} + +.bbox-section__actions { + padding: var(--spacing-sm) var(--spacing-md); + display: flex; + gap: var(--spacing-md); + background-color: var(--card); +} + +.btn { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + border-radius: var(--radius-sm); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-medium); + cursor: pointer; + transition: all var(--transition-fast); +} +/* Items Section */ +.items-section { + background-color: transparent; +} + +.items-section__list { + display: flex; + flex-direction: column; + padding: var(--spacing-md); + gap: var(--spacing-md); +} diff --git a/ui/src/assets/styles/components/info-card.css b/ui/src/assets/styles/components/info-card.css index 7507fc4..00183e8 100644 --- a/ui/src/assets/styles/components/info-card.css +++ b/ui/src/assets/styles/components/info-card.css @@ -4,8 +4,9 @@ display: flex; align-items: center; gap: var(--spacing-md); - padding: var(--spacing-xs) var(--spacing-sm); - background-color: var(--bg); + padding: var(--spacing-xs) var(--spacing-md); + background-color: var(--card); + border: 1px solid var(--border); border-radius: var(--radius); box-shadow: var(--shadow); } @@ -14,11 +15,7 @@ display: flex; align-items: center; justify-content: center; - width: 40px; - height: 40px; - background-color: var(--hover); - border-radius: 50%; - color: var(--muted-fg); + color: var(--primary); font-size: var(--font-size-lg); } @@ -30,13 +27,11 @@ .info-card__label { font-size: var(--font-size-sm); color: var(--muted-fg); - text-transform: uppercase; - letter-spacing: 0.05em; font-weight: var(--font-weight-semibold); } .info-card__value { - font-size: var(--font-size-base); - font-weight: var(--font-weight-bold); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-medium); color: var(--text); } diff --git a/ui/src/assets/styles/components/item-card.css b/ui/src/assets/styles/components/item-card.css index da0a8ba..f02f441 100644 --- a/ui/src/assets/styles/components/item-card.css +++ b/ui/src/assets/styles/components/item-card.css @@ -4,7 +4,7 @@ display: flex; gap: var(--spacing-md); padding: var(--spacing-md); - background-color: var(--bg); + background-color: var(--card); border: 1px solid var(--border); border-radius: var(--radius); cursor: pointer; @@ -15,7 +15,6 @@ .item-card:hover { background-color: var(--muted); - } .item-card__thumbnail { @@ -37,9 +36,6 @@ font-weight: var(--font-weight-semibold); color: var(--primary); font-size: var(--font-size-base); - margin-bottom: var(--spacing-xs); - - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; diff --git a/ui/src/assets/styles/components/navbar.css b/ui/src/assets/styles/components/navbar.css index 4f43d15..1f6c9a2 100644 --- a/ui/src/assets/styles/components/navbar.css +++ b/ui/src/assets/styles/components/navbar.css @@ -8,6 +8,7 @@ position: sticky; top: 0; z-index: var(--z-index-sticky); + height: var(--navbar-height); } .navbar-brand { diff --git a/ui/src/assets/styles/components/search-result-card.css b/ui/src/assets/styles/components/search-result-card.css index f0aa347..a0fd660 100644 --- a/ui/src/assets/styles/components/search-result-card.css +++ b/ui/src/assets/styles/components/search-result-card.css @@ -7,10 +7,10 @@ background-color: var(--bg); border: 1px solid var(--border); border-radius: var(--radius); - padding: var(--spacing-lg); + padding: var(--spacing-md); transition: box-shadow var(--transition-fast); - - max-width: 400px; + max-width: 400px; + gap: var(--spacing-sm); } .search-result-card:hover { @@ -22,7 +22,7 @@ display: flex; justify-content: space-between; align-items: flex-start; - margin-bottom: var(--spacing-xs); + /* margin-bottom: var(--spacing-xs); */ } .card-title { @@ -45,21 +45,20 @@ .provider-info { font-size: var(--font-size-sm); color: var(--muted-fg); - margin-bottom: var(--spacing-md); + margin-bottom: var(--spacing-sm); } .description { font-size: var(--font-size-base); color: var(--text); - margin-bottom: var(--spacing-md); + margin-bottom: 0; line-height: var(--line-height-normal); - - display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; + margin-bottom: var(--spacing-md); } /* Tags */ @@ -67,14 +66,14 @@ display: flex; flex-wrap: wrap; gap: var(--spacing-sm); - margin-bottom: var(--spacing-lg); + /* margin-bottom: var(--spacing-lg); */ } .tag { background-color: var(--muted-bg); color: var(--text); font-size: var(--font-size-xs); - padding: var(--spacing-xs) var(--spacing-sm); + padding: 0 var(--spacing-sm); border-radius: var(--radius-sm); font-weight: var(--font-weight-medium); border : 1px solid var(--border); @@ -95,6 +94,7 @@ border: none; display: flex; align-items: center; + justify-content: center; gap: var(--spacing-xs); transition: background-color var(--transition-fast), border-color var(--transition-fast); } @@ -114,6 +114,7 @@ background-color: transparent; color: var(--text); border: 1px solid var(--border); + flex: 1; } .btn-secondary:hover { diff --git a/ui/src/assets/styles/components/search-results.css b/ui/src/assets/styles/components/search-results.css index 5e212bb..496f06f 100644 --- a/ui/src/assets/styles/components/search-results.css +++ b/ui/src/assets/styles/components/search-results.css @@ -1,5 +1,5 @@ .search-results { - padding: var(--spacing-xl); + padding: var(--spacing-md); background: var(--bg); min-height: calc(100vh - var(--search-section-height) - var(--navbar-height)); } @@ -7,7 +7,7 @@ .results-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); - gap: var(--spacing-lg); + gap: var(--spacing-md); } @media (max-width: 768px) { diff --git a/ui/src/assets/styles/components/search-section.css b/ui/src/assets/styles/components/search-section.css index e116c30..7da6b82 100644 --- a/ui/src/assets/styles/components/search-section.css +++ b/ui/src/assets/styles/components/search-section.css @@ -2,7 +2,7 @@ display: flex; flex-direction: column; gap: var(--spacing-sm); - padding: var(--spacing-sm) var(--spacing-md); + padding: var(--spacing-sm) var(--spacing-md) var(--spacing-md); background: var(--bg); border-bottom: 1px solid var(--border); } diff --git a/ui/src/components/InfoCard.vue b/ui/src/components/InfoCard.vue index 64b916e..2c75aac 100644 --- a/ui/src/components/InfoCard.vue +++ b/ui/src/components/InfoCard.vue @@ -1,7 +1,7 @@ diff --git a/ui/src/views/Home.vue b/ui/src/views/Home.vue new file mode 100644 index 0000000..b5e7a34 --- /dev/null +++ b/ui/src/views/Home.vue @@ -0,0 +1,95 @@ + + + + + From 268e3d206be2ea20fac39a3edd2ff7025e4e4aa6 Mon Sep 17 00:00:00 2001 From: Justin K Date: Mon, 15 Dec 2025 14:11:05 +0100 Subject: [PATCH 16/89] style: removed old css names --- ui/src/views/CollectionDetail.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/views/CollectionDetail.vue b/ui/src/views/CollectionDetail.vue index 68b7c72..f36d890 100644 --- a/ui/src/views/CollectionDetail.vue +++ b/ui/src/views/CollectionDetail.vue @@ -10,8 +10,8 @@

{{ collectionTitle }}

{{ provider }} - {{ platform }} - {{ license }} + {{ platform }} + {{ license }}
From 330d5d08a3b48d436f1c1f194f6294f0faa31656 Mon Sep 17 00:00:00 2001 From: Justin K Date: Mon, 15 Dec 2025 14:11:46 +0100 Subject: [PATCH 17/89] chore: removed the mockup data --- ui/src/views/CollectionDetail.vue | 188 ++---------------------------- ui/src/views/Home.vue | 59 +--------- 2 files changed, 14 insertions(+), 233 deletions(-) diff --git a/ui/src/views/CollectionDetail.vue b/ui/src/views/CollectionDetail.vue index f36d890..ee2af36 100644 --- a/ui/src/views/CollectionDetail.vue +++ b/ui/src/views/CollectionDetail.vue @@ -110,186 +110,22 @@ const route = useRoute() const collectionId = computed(() => route.params.id as string) const mapContainer = ref(null) -// Mock data for different collections -const mockCollections: Record = { - '1': { - title: 'Sentinel-2 Level-2A', - provider: 'ESA', - platform: 'Sentinel-2', - license: 'Open Data', - description: 'Sentinel-2 carries an optical instrument payload that samples 13 spectral bands: four bands at 10m, six bands at 20m and three bands at 60m spatial resolution.', - bbox: { west: '-18', south: '35', east: '30', north: '70' }, - infoCards: [ - { icon: 'file', label: 'Data Format', value: 'GeoTIFF, COG' }, - { icon: 'ruler', label: 'Resolution', value: '10m - 60m' }, - { icon: 'calendar', label: 'Temporal Range', value: '2015 - Present' } - ], - metadata: [ - { label: 'Collection ID', value: '1' }, - { label: 'Provider', value: 'ESA' }, - { label: 'Platform', value: 'Sentinel-2' }, - { label: 'License', value: 'Open Data' }, - { label: 'Update Frequency', value: 'Daily' }, - { label: 'Bands', value: '13 spectral bands' } - ], - items: [ - { id: 'S2A_2024_001', date: '2024-01-15', coverage: '95%', thumbnail: 'https://via.placeholder.com/150/4169E1/FFFFFF?text=S2A_001' }, - { id: 'S2A_2024_002', date: '2024-01-20', coverage: '92%', thumbnail: 'https://via.placeholder.com/150/4169E1/FFFFFF?text=S2A_002' }, - { id: 'S2A_2024_003', date: '2024-01-25', coverage: '98%', thumbnail: 'https://via.placeholder.com/150/4169E1/FFFFFF?text=S2A_003' }, - { id: 'S2A_2024_004', date: '2024-02-01', coverage: '87%', thumbnail: 'https://via.placeholder.com/150/4169E1/FFFFFF?text=S2A_004' }, - { id: 'S2A_2024_005', date: '2024-02-05', coverage: '94%', thumbnail: 'https://via.placeholder.com/150/4169E1/FFFFFF?text=S2A_005' } - ] - }, - '2': { - title: 'Landsat 8 Collection 2', - provider: 'USGS', - platform: 'Landsat-8', - license: 'Open Data', - description: 'Landsat 8 orbits the Earth in a sun-synchronous, near-polar orbit, at an altitude of 705 km, with 11 bands in the visible, near-infrared, short wave infrared, and thermal infrared portions of the spectrum.', - bbox: { west: '-180', south: '-90', east: '180', north: '90' }, - infoCards: [ - { icon: 'file', label: 'Data Format', value: 'GeoTIFF' }, - { icon: 'ruler', label: 'Resolution', value: '15m - 100m' }, - { icon: 'calendar', label: 'Temporal Range', value: '2013 - Present' } - ], - metadata: [ - { label: 'Collection ID', value: '2' }, - { label: 'Provider', value: 'USGS' }, - { label: 'Platform', value: 'Landsat-8' }, - { label: 'License', value: 'Open Data' }, - { label: 'Update Frequency', value: '16 days' }, - { label: 'Bands', value: '11 bands' } - ], - items: [ - { id: 'LC08_2024_001', date: '2024-01-10', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/228B22/FFFFFF?text=LC08_001' }, - { id: 'LC08_2024_002', date: '2024-01-26', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/228B22/FFFFFF?text=LC08_002' }, - { id: 'LC08_2024_003', date: '2024-02-11', coverage: '95%', thumbnail: 'https://via.placeholder.com/150/228B22/FFFFFF?text=LC08_003' } - ] - }, - '3': { - title: 'MODIS Terra Daily', - provider: 'NASA', - platform: 'Terra', - license: 'Open Data', - description: 'The Moderate Resolution Imaging Spectroradiometer (MODIS) is a key instrument aboard the Terra satellite. It captures data in 36 spectral bands ranging in wavelength from 0.4 µm to 14.4 µm.', - bbox: { west: '-180', south: '-90', east: '180', north: '90' }, - infoCards: [ - { icon: 'file', label: 'Data Format', value: 'HDF-EOS' }, - { icon: 'ruler', label: 'Resolution', value: '250m - 1km' }, - { icon: 'calendar', label: 'Temporal Range', value: '2000 - Present' } - ], - metadata: [ - { label: 'Collection ID', value: '3' }, - { label: 'Provider', value: 'NASA' }, - { label: 'Platform', value: 'Terra' }, - { label: 'License', value: 'Open Data' }, - { label: 'Update Frequency', value: 'Daily' }, - { label: 'Bands', value: '36 spectral bands' } - ], - items: [ - { id: 'MOD09_2024_001', date: '2024-01-01', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/FF6347/FFFFFF?text=MOD_001' }, - { id: 'MOD09_2024_002', date: '2024-01-02', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/FF6347/FFFFFF?text=MOD_002' }, - { id: 'MOD09_2024_003', date: '2024-01-03', coverage: '98%', thumbnail: 'https://via.placeholder.com/150/FF6347/FFFFFF?text=MOD_003' }, - { id: 'MOD09_2024_004', date: '2024-01-04', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/FF6347/FFFFFF?text=MOD_004' } - ] - }, - '4': { - title: 'Sentinel-1 GRD', - provider: 'ESA', - platform: 'Sentinel-1', - license: 'Open Data', - description: 'Sentinel-1 is a C-band synthetic aperture radar (SAR) mission providing all-weather, day-and-night imagery for land and ocean services.', - bbox: { west: '-180', south: '-90', east: '180', north: '90' }, - infoCards: [ - { icon: 'file', label: 'Data Format', value: 'GeoTIFF, NetCDF' }, - { icon: 'ruler', label: 'Resolution', value: '10m' }, - { icon: 'calendar', label: 'Temporal Range', value: '2014 - Present' } - ], - metadata: [ - { label: 'Collection ID', value: '4' }, - { label: 'Provider', value: 'ESA' }, - { label: 'Platform', value: 'Sentinel-1' }, - { label: 'License', value: 'Open Data' }, - { label: 'Update Frequency', value: '6 days' }, - { label: 'Bands', value: 'C-band SAR' } - ], - items: [ - { id: 'S1A_GRD_001', date: '2024-01-08', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/8B4513/FFFFFF?text=S1A_001' }, - { id: 'S1A_GRD_002', date: '2024-01-14', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/8B4513/FFFFFF?text=S1A_002' }, - { id: 'S1A_GRD_003', date: '2024-01-20', coverage: '98%', thumbnail: 'https://via.placeholder.com/150/8B4513/FFFFFF?text=S1A_003' } - ] - }, - '5': { - title: 'NAIP Imagery', - provider: 'USDA', - platform: 'Aircraft', - license: 'Public Domain', - description: 'The National Agriculture Imagery Program (NAIP) acquires aerial imagery during the agricultural growing seasons in the continental U.S. at 1-meter ground sample distance.', - bbox: { west: '-125', south: '24', east: '-66', north: '49' }, - infoCards: [ - { icon: 'file', label: 'Data Format', value: 'GeoTIFF' }, - { icon: 'ruler', label: 'Resolution', value: '1m' }, - { icon: 'calendar', label: 'Temporal Range', value: '2003 - Present' } - ], - metadata: [ - { label: 'Collection ID', value: '5' }, - { label: 'Provider', value: 'USDA' }, - { label: 'Platform', value: 'Aircraft' }, - { label: 'License', value: 'Public Domain' }, - { label: 'Update Frequency', value: '2-3 years' }, - { label: 'Bands', value: 'RGB, NIR' } - ], - items: [ - { id: 'NAIP_2023_CA', date: '2023-06-15', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/FFD700/000000?text=NAIP_CA' }, - { id: 'NAIP_2023_TX', date: '2023-07-20', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/FFD700/000000?text=NAIP_TX' } - ] - }, - '6': { - title: 'Planet SkySat', - provider: 'Planet Labs', - platform: 'SkySat', - license: 'Commercial', - description: 'SkySat is a constellation of sub-meter resolution Earth observation satellites providing high-resolution optical imagery and video.', - bbox: { west: '-122', south: '37', east: '-121', north: '38' }, - infoCards: [ - { icon: 'file', label: 'Data Format', value: 'GeoTIFF' }, - { icon: 'ruler', label: 'Resolution', value: '0.5m - 1m' }, - { icon: 'calendar', label: 'Temporal Range', value: '2013 - Present' } - ], - metadata: [ - { label: 'Collection ID', value: '6' }, - { label: 'Provider', value: 'Planet Labs' }, - { label: 'Platform', value: 'SkySat' }, - { label: 'License', value: 'Commercial' }, - { label: 'Update Frequency', value: 'Daily' }, - { label: 'Bands', value: '4 bands (RGB + NIR)' } - ], - items: [ - { id: 'SKY_2024_001', date: '2024-01-05', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/9370DB/FFFFFF?text=SKY_001' }, - { id: 'SKY_2024_002', date: '2024-01-06', coverage: '100%', thumbnail: 'https://via.placeholder.com/150/9370DB/FFFFFF?text=SKY_002' }, - { id: 'SKY_2024_003', date: '2024-01-07', coverage: '95%', thumbnail: 'https://via.placeholder.com/150/9370DB/FFFFFF?text=SKY_003' } - ] - } -} - -// Get collection data based on ID -const collectionData = computed(() => mockCollections[collectionId.value] || mockCollections['1']) - -const collectionTitle = computed(() => collectionData.value.title) -const provider = computed(() => collectionData.value.provider) -const platform = computed(() => collectionData.value.platform) -const license = computed(() => collectionData.value.license) -const description = computed(() => collectionData.value.description) +// Data would typically be fetched from an API based on collectionId +const collectionTitle = ref('') +const provider = ref('') +const platform = ref('') +const license = ref('') +const description = ref('') const coordinateSystem = ref('EPSG:4326') -const bbox = computed(() => collectionData.value.bbox) -const infoCards = computed(() => collectionData.value.infoCards) -const metadata = computed(() => collectionData.value.metadata) -const items = computed(() => collectionData.value.items) +const bbox = ref({ west: '0', south: '0', east: '0', north: '0' }) +const infoCards = ref>([]) +const metadata = ref>([]) +const items = ref>([]) onMounted(() => { - // Initialize map here + // Fetch collection data here based on collectionId.value console.log('Collection ID:', collectionId.value) - // You can add MapLibre GL initialization here + // Example: fetchCollectionData(collectionId.value) }) diff --git a/ui/src/views/Home.vue b/ui/src/views/Home.vue index b5e7a34..1913b80 100644 --- a/ui/src/views/Home.vue +++ b/ui/src/views/Home.vue @@ -6,63 +6,8 @@ import SearchResults from '@/components/SearchResults.vue' const searchQuery = ref('') -// Mock collections data -const Collections = ref([ - { - id: '1', - title: 'Sentinel-2 Level-2A', - tags: 'Optical, Sentinel, ESA', - provider: 'ESA', - platform: 'Sentinel-2', - description: 'Sentinel-2 carries an optical instrument payload that samples 13 spectral bands: four bands at 10m, six bands at 20m and three bands at 60m spatial resolution.', - license: 'Open Data' - }, - { - id: '2', - title: 'Landsat 8 Collection 2', - tags: 'Optical, Landsat, USGS', - provider: 'USGS', - platform: 'Landsat-8', - description: 'Landsat 8 orbits the Earth in a sun-synchronous, near-polar orbit, at an altitude of 705 km, with 11 bands in the visible, near-infrared, short wave infrared, and thermal infrared portions of the spectrum.', - license: 'Open Data' - }, - { - id: '3', - title: 'MODIS Terra Daily', - tags: 'Optical, MODIS, NASA', - provider: 'NASA', - platform: 'Terra', - description: 'The Moderate Resolution Imaging Spectroradiometer (MODIS) is a key instrument aboard the Terra satellite. It captures data in 36 spectral bands ranging in wavelength from 0.4 µm to 14.4 µm.', - license: 'Open Data' - }, - { - id: '4', - title: 'Sentinel-1 GRD', - tags: 'SAR, Sentinel, ESA', - provider: 'ESA', - platform: 'Sentinel-1', - description: 'Sentinel-1 is a C-band synthetic aperture radar (SAR) mission providing all-weather, day-and-night imagery for land and ocean services.', - license: 'Open Data' - }, - { - id: '5', - title: 'NAIP Imagery', - tags: 'Aerial, NAIP, USDA', - provider: 'USDA', - platform: 'Aircraft', - description: 'The National Agriculture Imagery Program (NAIP) acquires aerial imagery during the agricultural growing seasons in the continental U.S. at 1-meter ground sample distance.', - license: 'Public Domain' - }, - { - id: '6', - title: 'Planet SkySat', - tags: 'Optical, High-Resolution, Planet', - provider: 'Planet Labs', - platform: 'SkySat', - description: 'SkySat is a constellation of sub-meter resolution Earth observation satellites providing high-resolution optical imagery and video.', - license: 'Commercial' - } -]) +// Collections would typically be fetched from an API +const Collections = ref([])