login #2

Merged
jose merged 5 commits from login into main 2026-03-23 19:05:57 +00:00
20 changed files with 1738 additions and 694 deletions
Showing only changes of commit 08d0a5a099 - Show all commits

View File

@@ -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=""
VITE_PASSWORD_USER="test"

View File

@@ -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",

230
pnpm-lock.yaml generated
View File

@@ -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: {}

View File

@@ -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"
})
}
})

View File

@@ -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,

View File

@@ -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 }) {
<HeadContent />
</head>
<body>
<ToastProvider />
{children}
<Devtools />
<Scripts />

View File

@@ -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")
}
},

View File

@@ -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 (
<div>
<Card className="h-[800px] p-0 overflow-hidden">
<Card className="h-200 p-0 overflow-hidden">
<MapComponent
center={[40.5874827, -1.7925343]}
zoom={10}

View File

@@ -1,9 +0,0 @@
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/_authed/dashboard')({
component: RouteComponent,
})
function RouteComponent() {
return <div>Hello "/_authed/dashboard"!</div>
}

View File

@@ -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() {
<div>
<Card.Content>
<Form onSubmit={handleFormSubmit} className="flex flex-col gap-4">
<Label isRequired className="ml-4 text-lg">
Correo
</Label>
<Input
placeholder="Introduce tu correo"
<Fieldset>
<Fieldset.Group>
<TextField
type="email"
name="email"
variant="secondary"
className="py-4 text-lg"
required
/>
isRequired
defaultValue={import.meta.env.VITE_LOGIN_USER}
>
<Label isRequired className="ml-4 text-lg">
Contraseña
Correo
</Label>
<Input
placeholder="Introduce tu contraseña"
<Input placeholder="Introduce tu correo" />
<FieldError />
</TextField>
<TextField
type="password"
name="password"
variant="secondary"
className="py-4 text-lg"
required
/>
isRequired
defaultValue={import.meta.env.VITE_PASSWORD_USER}
>
<Label isRequired className="ml-4 text-lg">
Contraseña
</Label>
<Input placeholder="Introduce tu contraseña" />
<FieldError />
</TextField>
</Fieldset.Group>
</Fieldset>
<div className="flex justify-end">
<Button
type="submit"

View File

@@ -12,6 +12,8 @@ import {
export const Route = createFileRoute("/")({ component: App })
function App() {
const navigate = Route.useNavigate()
const features = [
{
icon: <Zap className="w-12 h-12 text-cyan-400" />,
@@ -53,7 +55,17 @@ function App() {
return (
<div className="min-h-screen bg-linear-to-b from-slate-900 via-slate-800 to-slate-900">
<Button> Hola</Button>
<Button
onPress={() => {
navigate({
to: "/login",
viewTransition: true
})
}}
>
{" "}
Hola
</Button>
<section className="relative py-20 px-6 text-center overflow-hidden">
<div className="absolute inset-0 bg-linear-to-r from-cyan-500/10 via-blue-500/10 to-purple-500/10"></div>
<div className="relative max-w-5xl mx-auto">

View File

@@ -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
})