diff --git a/.env.development b/.env.development index ee6b18a..6a2340c 100644 --- a/.env.development +++ b/.env.development @@ -6,4 +6,4 @@ APIKEY_MAPS="AIzaSyAwfOShBqkBcS46WqmlsIVWQJ8gpdOPk_4" SUPABASE_URL="https://qsssikzgwomudkwfmgad.supabase.co" SUPABASE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InFzc3Npa3pnd29tdWRrd2ZtZ2FkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQzMjY1NTQsImV4cCI6MjA2OTkwMjU1NH0.BTSscdTcPP1GVmMB-H5caLpWsfuAw1V6mXiqogF8TjU" VITE_LOGIN_USER="test@test.com" -VITE_PASSWORD_USER="" \ No newline at end of file +VITE_PASSWORD_USER="test" \ No newline at end of file diff --git a/package.json b/package.json index 0906021..3ef7ffe 100644 --- a/package.json +++ b/package.json @@ -31,15 +31,16 @@ "react": "^19.2.4", "react-dom": "^19.2.4", "tailwindcss": "^4.2.1", - "tw-animate-css": "^1.4.0" + "tw-animate-css": "^1.4.0", + "zod": "^4.3.6" }, "devDependencies": { "@biomejs/biome": "^2.4.6", "@inlang/paraglide-js": "^2.13.1", "@tanstack/devtools-vite": "^0.5.5", "@tanstack/react-devtools": "^0.9.13", - "@tanstack/react-router-devtools": "^1.166.7", "@tanstack/react-query-devtools": "^5.91.3", + "@tanstack/react-router-devtools": "^1.166.7", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", "@types/node": "^22.10.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 534be96..8a92bae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ importers: lucide-react: specifier: ^0.577.0 version: 0.577.0(react@19.2.4) + maplibre-gl: + specifier: ^5.19.0 + version: 5.20.1 nitro: specifier: ^3.0.1-alpha.2 version: 3.0.1-alpha.2(lru-cache@11.2.6)(rolldown@1.0.0-rc.5)(rollup@4.59.0)(vite@7.3.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) @@ -59,13 +62,13 @@ importers: tw-animate-css: specifier: ^1.4.0 version: 1.4.0 + zod: + specifier: ^4.3.6 + version: 4.3.6 devDependencies: '@biomejs/biome': specifier: ^2.4.6 version: 2.4.6 - '@inlang/cli': - specifier: ^3.0.0 - version: 3.1.6 '@inlang/paraglide-js': specifier: ^2.13.1 version: 2.14.0 @@ -531,11 +534,6 @@ packages: peerDependencies: tailwindcss: '>=4.0.0' - '@inlang/cli@3.1.6': - resolution: {integrity: sha512-fJG2E/DB4b31/Z8ie4rdfJaO9zK+aUcE90DNn1YoRxiaZ/nxk7cgYdh9Yd6tcZKQjHxH0V6fF6R+bGDxr/3Enw==} - engines: {node: '>=18.0.0'} - hasBin: true - '@inlang/paraglide-js@2.14.0': resolution: {integrity: sha512-6Tno8RvEhnALdgueWNQACiEm3YM6hAfbxnYB+JWML9p5s1O4t0DOqgU9YD8fwpixOnZbU6cJRkvt4v9acXDioA==} hasBin: true @@ -582,6 +580,42 @@ packages: '@lix-js/server-protocol-schema@0.1.1': resolution: {integrity: sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ==} + '@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/geojson-vt@5.0.4': + resolution: {integrity: sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==} + + '@maplibre/geojson-vt@6.0.2': + resolution: {integrity: sha512-OnXnV2m1yBULKOlUanNFTiOeXCktvWYY4yWoHVETlp6ShJGUhY3DNt9XzPByL24h4JcoJRccPBlMhH1o8cvmyQ==} + + '@maplibre/maplibre-gl-style-spec@24.7.0': + resolution: {integrity: sha512-Ed7rcKYU5iELfablg9Mj+TVCsXsPBgdMyXPRAxb2v7oWg9YJnpQdZ5msDs1LESu/mtXy3Z48Vdppv2t/x5kAhw==} + hasBin: true + + '@maplibre/mlt@1.1.7': + resolution: {integrity: sha512-HZSsXrgn2V6T3o0qklMwKERfKaAxjO8shmiFnVygCtXTg4SPKWVX+U99RkvxUfCsjYBEcT4ltor8lSlBSCca7Q==} + + '@maplibre/vt-pbf@4.3.0': + resolution: {integrity: sha512-jIvp8F5hQCcreqOOpEt42TJMUlsrEcpf/kI1T2v85YrQRV6PPXUcEXUg5karKtH6oh47XJZ4kHu56pUkOuqA7w==} + '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} @@ -2523,6 +2557,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/mysql@2.15.27': resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} @@ -2546,6 +2583,9 @@ packages: '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/supercluster@7.1.3': + resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} + '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} @@ -2854,6 +2894,9 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + earcut@3.0.2: + resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + electron-to-chromium@1.5.302: resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} @@ -2879,11 +2922,6 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - esbuild-wasm@0.19.12: - resolution: {integrity: sha512-Zmc4hk6FibJZBcTx5/8K/4jT3/oG1vkGTEeKJUQFCUQKimD6Q7+adp/bdVQyYJFolMKaXkQnVZdV4O5ZaTYmyQ==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} @@ -2940,6 +2978,9 @@ packages: get-tsconfig@4.13.6: resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3079,11 +3120,17 @@ packages: engines: {node: '>=6'} hasBin: true + json-stringify-pretty-compact@4.0.0: + resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + kdbush@4.0.2: + resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} + kysely@0.27.6: resolution: {integrity: sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==} engines: {node: '>=14.0.0'} @@ -3195,6 +3242,10 @@ packages: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} + maplibre-gl@5.20.1: + resolution: {integrity: sha512-57YIgfRct+rrk78ldoWRuLWRnXV/1vM2Rk0QYfEDQmsXdpgbACwvGoREIOZtyDIaq/GJK/ORYEriaAdVZuNfvw==} + engines: {node: '>=16.14.0', npm: '>=8.1.0'} + mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} @@ -3202,6 +3253,9 @@ packages: resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} engines: {node: 18 || 20 || >=22} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -3212,6 +3266,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + 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} @@ -3307,6 +3364,10 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} + pbf@4.0.1: + resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} + hasBin: true + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -3349,6 +3410,9 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} + potpack@2.1.0: + resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} + prettier@3.8.1: resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} @@ -3362,6 +3426,9 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -3369,6 +3436,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + react-aria-components@1.15.1: resolution: {integrity: sha512-irGhZ+vBvoY9xJHf/qzPLLwFZ8cBUrYwPERGhgjE62dy/RXMUiEW+1DeTHz0OvtjbvFbhNp/I7XM9IaBvmLALg==} peerDependencies: @@ -3421,6 +3491,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + rolldown@1.0.0-rc.5: resolution: {integrity: sha512-0AdalTs6hNTioaCYIkAa7+xsmHBfU5hCNclZnM/lp7lGGDuUOb6N4BVNtwiomybbencDjq/waKjTImqiGCs5sw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3437,6 +3510,9 @@ packages: rou3@0.8.1: resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3512,6 +3588,9 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + supercluster@8.0.1: + resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -3555,6 +3634,9 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinyqueue@3.0.0: + resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -3891,6 +3973,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + snapshots: '@acemir/cssom@0.9.31': {} @@ -4265,13 +4350,6 @@ snapshots: transitivePeerDependencies: - tailwind-merge - '@inlang/cli@3.1.6': - dependencies: - '@inlang/sdk': 2.7.0 - esbuild-wasm: 0.19.12 - transitivePeerDependencies: - - babel-plugin-macros - '@inlang/paraglide-js@2.14.0': dependencies: '@inlang/recommend-sherlock': 0.2.1 @@ -4348,6 +4426,52 @@ snapshots: '@lix-js/server-protocol-schema@0.1.1': {} + '@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/geojson-vt@5.0.4': {} + + '@maplibre/geojson-vt@6.0.2': + dependencies: + kdbush: 4.0.2 + + '@maplibre/maplibre-gl-style-spec@24.7.0': + 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.7': + dependencies: + '@mapbox/point-geometry': 1.1.0 + + '@maplibre/vt-pbf@4.3.0': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@mapbox/vector-tile': 2.0.4 + '@maplibre/geojson-vt': 5.0.4 + '@types/geojson': 7946.0.16 + '@types/supercluster': 7.1.3 + pbf: 4.0.1 + supercluster: 8.0.1 + '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.8.1 @@ -6706,6 +6830,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/geojson@7946.0.16': {} + '@types/mysql@2.15.27': dependencies: '@types/node': 22.19.11 @@ -6734,6 +6860,10 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/supercluster@7.1.3': + dependencies: + '@types/geojson': 7946.0.16 + '@types/tedious@4.0.14': dependencies: '@types/node': 22.19.11 @@ -7026,6 +7156,8 @@ snapshots: dotenv@16.6.1: {} + earcut@3.0.2: {} + electron-to-chromium@1.5.302: {} encoding-sniffer@0.2.1: @@ -7046,8 +7178,6 @@ snapshots: es-module-lexer@1.7.0: {} - esbuild-wasm@0.19.12: {} - esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -7113,6 +7243,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + gl-matrix@3.4.4: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -7265,8 +7397,12 @@ snapshots: jsesc@3.1.0: {} + json-stringify-pretty-compact@4.0.0: {} + json5@2.2.3: {} + kdbush@4.0.2: {} + kysely@0.27.6: {} launch-editor@2.13.0: @@ -7349,18 +7485,44 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + maplibre-gl@5.20.1: + dependencies: + '@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/geojson-vt': 6.0.2 + '@maplibre/maplibre-gl-style-spec': 24.7.0 + '@maplibre/mlt': 1.1.7 + '@maplibre/vt-pbf': 4.3.0 + '@types/geojson': 7946.0.16 + earcut: 3.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 + tinyqueue: 3.0.0 + mdn-data@2.12.2: {} minimatch@10.2.2: dependencies: brace-expansion: 5.0.3 + minimist@1.2.8: {} + minipass@7.1.3: {} module-details-from-path@1.0.4: {} ms@2.1.3: {} + murmurhash-js@1.0.0: {} + nanoid@3.3.11: {} nf3@0.3.10: {} @@ -7512,6 +7674,10 @@ snapshots: pathval@2.0.1: {} + pbf@4.0.1: + dependencies: + resolve-protobuf-schema: 2.1.0 + pg-int8@1.0.1: {} pg-protocol@1.11.0: {} @@ -7546,6 +7712,8 @@ snapshots: dependencies: xtend: 4.0.2 + potpack@2.1.0: {} + prettier@3.8.1: {} pretty-format@27.5.1: @@ -7556,10 +7724,14 @@ snapshots: progress@2.0.3: {} + protocol-buffers-schema@3.6.0: {} + proxy-from-env@1.1.0: {} punycode@2.3.1: {} + quickselect@3.0.0: {} + react-aria-components@1.15.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@internationalized/date': 3.11.0 @@ -7705,6 +7877,10 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve-protobuf-schema@2.1.0: + dependencies: + protocol-buffers-schema: 3.6.0 + rolldown@1.0.0-rc.5: dependencies: '@oxc-project/types': 0.114.0 @@ -7760,6 +7936,8 @@ snapshots: rou3@0.8.1: {} + rw@1.3.3: {} + safer-buffer@2.1.2: {} saxes@6.0.0: @@ -7811,6 +7989,10 @@ snapshots: dependencies: js-tokens: 9.0.1 + supercluster@8.0.1: + dependencies: + kdbush: 4.0.2 + symbol-tree@3.2.4: {} tailwind-merge@3.4.0: {} @@ -7840,6 +8022,8 @@ snapshots: tinypool@1.1.1: {} + tinyqueue@3.0.0: {} + tinyrainbow@2.0.0: {} tinyspy@4.0.4: {} @@ -8072,3 +8256,5 @@ snapshots: yocto-queue@0.1.0: {} zod@3.25.76: {} + + zod@4.3.6: {} diff --git a/src/lib/hooks/useLogin.tsx b/src/lib/hooks/useLogin.tsx index 07f8fbb..906202b 100644 --- a/src/lib/hooks/useLogin.tsx +++ b/src/lib/hooks/useLogin.tsx @@ -14,13 +14,14 @@ export const useLogin = () => { mutationKey: ["login"], mutationFn: async (data: TLoginForm) => { const response = await user.login({ data }) + if (response.error) { throw new Error(response.message) } }, onSuccess: () => { navigate({ - to: "/" + to: "/dashboard" }) } }) diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 30ab67e..4537c87 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -12,17 +12,13 @@ import { Route as rootRouteImport } from './routes/__root' import { Route as LogoutRouteImport } from './routes/logout' import { Route as LoginRouteImport } from './routes/login' import { Route as AccessRouteImport } from './routes/access' -import { Route as AuthedRouteImport } from './routes/_authed' +import { Route as AuthRouteImport } from './routes/_auth' import { Route as IndexRouteImport } from './routes/index' import { Route as DemoTanstackQueryRouteImport } from './routes/demo/tanstack-query' import { Route as DemoI18nRouteImport } from './routes/demo.i18n' -<<<<<<< HEAD import { Route as AccessRegisterRouteImport } from './routes/access.register' import { Route as AccessLoginRouteImport } from './routes/access.login' -import { Route as AuthedDashboardRouteImport } from './routes/_authed/dashboard' -======= -import { Route as AuthDashboardRouteImport } from './routes/auth/dashboard' ->>>>>>> main +import { Route as AuthDashboardRouteImport } from './routes/_auth/dashboard' import { Route as DemoSentryTestingRouteImport } from './routes/demo/sentry.testing' const LogoutRoute = LogoutRouteImport.update({ @@ -40,8 +36,8 @@ const AccessRoute = AccessRouteImport.update({ path: '/access', getParentRoute: () => rootRouteImport, } as any) -const AuthedRoute = AuthedRouteImport.update({ - id: '/_authed', +const AuthRoute = AuthRouteImport.update({ + id: '/_auth', getParentRoute: () => rootRouteImport, } as any) const IndexRoute = IndexRouteImport.update({ @@ -59,7 +55,6 @@ const DemoI18nRoute = DemoI18nRouteImport.update({ path: '/demo/i18n', getParentRoute: () => rootRouteImport, } as any) -<<<<<<< HEAD const AccessRegisterRoute = AccessRegisterRouteImport.update({ id: '/register', path: '/register', @@ -70,16 +65,10 @@ const AccessLoginRoute = AccessLoginRouteImport.update({ path: '/login', getParentRoute: () => AccessRoute, } as any) -const AuthedDashboardRoute = AuthedDashboardRouteImport.update({ +const AuthDashboardRoute = AuthDashboardRouteImport.update({ id: '/dashboard', path: '/dashboard', - getParentRoute: () => AuthedRoute, -======= -const AuthDashboardRoute = AuthDashboardRouteImport.update({ - id: '/auth/dashboard', - path: '/auth/dashboard', - getParentRoute: () => rootRouteImport, ->>>>>>> main + getParentRoute: () => AuthRoute, } as any) const DemoSentryTestingRoute = DemoSentryTestingRouteImport.update({ id: '/demo/sentry/testing', @@ -89,34 +78,24 @@ const DemoSentryTestingRoute = DemoSentryTestingRouteImport.update({ export interface FileRoutesByFullPath { '/': typeof IndexRoute -<<<<<<< HEAD '/access': typeof AccessRouteWithChildren '/login': typeof LoginRoute '/logout': typeof LogoutRoute - '/dashboard': typeof AuthedDashboardRoute + '/dashboard': typeof AuthDashboardRoute '/access/login': typeof AccessLoginRoute '/access/register': typeof AccessRegisterRoute -======= - '/login': typeof LoginRouteRoute - '/auth/dashboard': typeof AuthDashboardRoute ->>>>>>> main '/demo/i18n': typeof DemoI18nRoute '/demo/tanstack-query': typeof DemoTanstackQueryRoute '/demo/sentry/testing': typeof DemoSentryTestingRoute } export interface FileRoutesByTo { '/': typeof IndexRoute -<<<<<<< HEAD '/access': typeof AccessRouteWithChildren '/login': typeof LoginRoute '/logout': typeof LogoutRoute - '/dashboard': typeof AuthedDashboardRoute + '/dashboard': typeof AuthDashboardRoute '/access/login': typeof AccessLoginRoute '/access/register': typeof AccessRegisterRoute -======= - '/login': typeof LoginRouteRoute - '/auth/dashboard': typeof AuthDashboardRoute ->>>>>>> main '/demo/i18n': typeof DemoI18nRoute '/demo/tanstack-query': typeof DemoTanstackQueryRoute '/demo/sentry/testing': typeof DemoSentryTestingRoute @@ -124,18 +103,13 @@ export interface FileRoutesByTo { export interface FileRoutesById { __root__: typeof rootRouteImport '/': typeof IndexRoute -<<<<<<< HEAD - '/_authed': typeof AuthedRouteWithChildren + '/_auth': typeof AuthRouteWithChildren '/access': typeof AccessRouteWithChildren '/login': typeof LoginRoute '/logout': typeof LogoutRoute - '/_authed/dashboard': typeof AuthedDashboardRoute + '/_auth/dashboard': typeof AuthDashboardRoute '/access/login': typeof AccessLoginRoute '/access/register': typeof AccessRegisterRoute -======= - '/login': typeof LoginRouteRoute - '/auth/dashboard': typeof AuthDashboardRoute ->>>>>>> main '/demo/i18n': typeof DemoI18nRoute '/demo/tanstack-query': typeof DemoTanstackQueryRoute '/demo/sentry/testing': typeof DemoSentryTestingRoute @@ -146,14 +120,10 @@ export interface FileRouteTypes { | '/' | '/access' | '/login' -<<<<<<< HEAD | '/logout' | '/dashboard' | '/access/login' | '/access/register' -======= - | '/auth/dashboard' ->>>>>>> main | '/demo/i18n' | '/demo/tanstack-query' | '/demo/sentry/testing' @@ -162,31 +132,23 @@ export interface FileRouteTypes { | '/' | '/access' | '/login' -<<<<<<< HEAD | '/logout' | '/dashboard' | '/access/login' | '/access/register' -======= - | '/auth/dashboard' ->>>>>>> main | '/demo/i18n' | '/demo/tanstack-query' | '/demo/sentry/testing' id: | '__root__' | '/' - | '/_authed' + | '/_auth' | '/access' | '/login' -<<<<<<< HEAD | '/logout' - | '/_authed/dashboard' + | '/_auth/dashboard' | '/access/login' | '/access/register' -======= - | '/auth/dashboard' ->>>>>>> main | '/demo/i18n' | '/demo/tanstack-query' | '/demo/sentry/testing' @@ -194,15 +156,10 @@ export interface FileRouteTypes { } export interface RootRouteChildren { IndexRoute: typeof IndexRoute -<<<<<<< HEAD - AuthedRoute: typeof AuthedRouteWithChildren + AuthRoute: typeof AuthRouteWithChildren AccessRoute: typeof AccessRouteWithChildren LoginRoute: typeof LoginRoute LogoutRoute: typeof LogoutRoute -======= - LoginRouteRoute: typeof LoginRouteRoute - AuthDashboardRoute: typeof AuthDashboardRoute ->>>>>>> main DemoI18nRoute: typeof DemoI18nRoute DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute DemoSentryTestingRoute: typeof DemoSentryTestingRoute @@ -231,11 +188,11 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AccessRouteImport parentRoute: typeof rootRouteImport } - '/_authed': { - id: '/_authed' + '/_auth': { + id: '/_auth' path: '' fullPath: '/' - preLoaderRoute: typeof AuthedRouteImport + preLoaderRoute: typeof AuthRouteImport parentRoute: typeof rootRouteImport } '/': { @@ -259,7 +216,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DemoI18nRouteImport parentRoute: typeof rootRouteImport } -<<<<<<< HEAD '/access/register': { id: '/access/register' path: '/register' @@ -274,20 +230,12 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AccessLoginRouteImport parentRoute: typeof AccessRoute } - '/_authed/dashboard': { - id: '/_authed/dashboard' + '/_auth/dashboard': { + id: '/_auth/dashboard' path: '/dashboard' fullPath: '/dashboard' - preLoaderRoute: typeof AuthedDashboardRouteImport - parentRoute: typeof AuthedRoute -======= - '/auth/dashboard': { - id: '/auth/dashboard' - path: '/auth/dashboard' - fullPath: '/auth/dashboard' preLoaderRoute: typeof AuthDashboardRouteImport - parentRoute: typeof rootRouteImport ->>>>>>> main + parentRoute: typeof AuthRoute } '/demo/sentry/testing': { id: '/demo/sentry/testing' @@ -299,16 +247,15 @@ declare module '@tanstack/react-router' { } } -interface AuthedRouteChildren { - AuthedDashboardRoute: typeof AuthedDashboardRoute +interface AuthRouteChildren { + AuthDashboardRoute: typeof AuthDashboardRoute } -const AuthedRouteChildren: AuthedRouteChildren = { - AuthedDashboardRoute: AuthedDashboardRoute, +const AuthRouteChildren: AuthRouteChildren = { + AuthDashboardRoute: AuthDashboardRoute, } -const AuthedRouteWithChildren = - AuthedRoute._addFileChildren(AuthedRouteChildren) +const AuthRouteWithChildren = AuthRoute._addFileChildren(AuthRouteChildren) interface AccessRouteChildren { AccessLoginRoute: typeof AccessLoginRoute @@ -325,15 +272,10 @@ const AccessRouteWithChildren = const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, -<<<<<<< HEAD - AuthedRoute: AuthedRouteWithChildren, + AuthRoute: AuthRouteWithChildren, AccessRoute: AccessRouteWithChildren, LoginRoute: LoginRoute, LogoutRoute: LogoutRoute, -======= - LoginRouteRoute: LoginRouteRoute, - AuthDashboardRoute: AuthDashboardRoute, ->>>>>>> main DemoI18nRoute: DemoI18nRoute, DemoTanstackQueryRoute: DemoTanstackQueryRoute, DemoSentryTestingRoute: DemoSentryTestingRoute, diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index ec32f14..499577b 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -1,3 +1,4 @@ +import { ToastProvider } from "@heroui/react" import type { QueryClient } from "@tanstack/react-query" import { createRootRouteWithContext, @@ -55,6 +56,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { + {children} diff --git a/src/routes/_authed.tsx b/src/routes/_auth.tsx similarity index 88% rename from src/routes/_authed.tsx rename to src/routes/_auth.tsx index a442648..dc32c63 100644 --- a/src/routes/_authed.tsx +++ b/src/routes/_auth.tsx @@ -1,8 +1,8 @@ import { createFileRoute, Link, Outlet } from "@tanstack/react-router" -export const Route = createFileRoute("/_authed")({ +export const Route = createFileRoute("/_auth")({ beforeLoad: ({ context }) => { - if (context.error) { + if (context.user.error) { throw new Error("Not authenticated") } }, diff --git a/src/routes/auth/dashboard.tsx b/src/routes/_auth/dashboard.tsx similarity index 92% rename from src/routes/auth/dashboard.tsx rename to src/routes/_auth/dashboard.tsx index 94b074e..d082982 100644 --- a/src/routes/auth/dashboard.tsx +++ b/src/routes/_auth/dashboard.tsx @@ -5,13 +5,13 @@ import { useState } from "react" import { Map as MapComponent, MapMarker, - MapViewport, + type MapViewport, MarkerContent, MarkerPopup, MarkerTooltip } from "@/components/maps/map" -export const Route = createFileRoute("/auth/dashboard")({ +export const Route = createFileRoute("/_auth/dashboard")({ component: RouteComponent }) @@ -44,7 +44,7 @@ function RouteComponent() { }) return (
- + Hello "/_authed/dashboard"!
-} diff --git a/src/routes/access.login.tsx b/src/routes/access.login.tsx index cbe002b..6c00bf6 100644 --- a/src/routes/access.login.tsx +++ b/src/routes/access.login.tsx @@ -1,4 +1,14 @@ -import { Button, Card, Form, Input, Label, Spinner } from "@heroui/react" +import { + Button, + Card, + FieldError, + Fieldset, + Form, + Input, + Label, + Spinner, + TextField +} from "@heroui/react" import { createFileRoute } from "@tanstack/react-router" import { LogIn } from "lucide-react" import { useLogin } from "@/lib/hooks/useLogin" @@ -23,28 +33,38 @@ function RouteComponent() {
- - - - +
+ + + + + + + + + + + + +
+
diff --git a/src/routes/logout.tsx b/src/routes/logout.tsx index 0dd9ea6..e3c3363 100644 --- a/src/routes/logout.tsx +++ b/src/routes/logout.tsx @@ -1,5 +1,9 @@ import { createFileRoute } from "@tanstack/react-router" +import { user } from "@/lib/server/user" export const Route = createFileRoute("/logout")({ - beforeLoad: async ({ context }) => {} + beforeLoad: async () => { + await user.logout() + }, + preload: false })