diff --git a/.gitignore b/.gitignore index 8b543f6b..de893d0f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,48 +1,46 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -node_modules -.pnp -.pnp.js -.pnpm-store -package-lock.json - -# testing -/coverage - -# next.js -/.next -/out - -# production -/build -/public/script.js -/geo -/dist -/generated -/src/generated -pm2.yml - -# misc -.DS_Store -.idea -.yarn -*.iml -*.log -.vscode -.tool-versions -.claude -nul - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env -.env.* -*.env.* - -*.dev.yml - +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules +.pnp +.pnp.js +.pnpm-store +package-lock.json + +# testing +/coverage + +# next.js +/.next +/out + +# production +/build +/public/script.js +/geo +/dist +/generated +/src/generated +pm2.yml + +# misc +.DS_Store +.idea +.yarn +*.iml +*.log +.vscode +.tool-versions + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +.env.* +*.env.* + +*.dev.yml + diff --git a/package.json b/package.json index d162be63..ac2ea36c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "type": "module", "scripts": { - "dev": "next dev -p 3002 --turbo", + "dev": "next dev -p 3001 --turbo", "build": "npm-run-all check-env build-db check-db build-tracker build-geo build-app", "start": "next start", "build-docker": "npm-run-all build-db build-tracker build-geo build-app", @@ -102,7 +102,7 @@ "kafkajs": "^2.1.0", "lucide-react": "^0.543.0", "maxmind": "^5.0.0", - "next": "^15.5.10", + "next": "^15.5.9", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", @@ -164,7 +164,7 @@ "stylelint-config-css-modules": "^4.5.1", "stylelint-config-prettier": "^9.0.3", "stylelint-config-recommended": "^14.0.0", - "tar": "^7.5.7", + "tar": "^7.5.4", "ts-jest": "^29.4.6", "ts-node": "^10.9.1", "tsup": "^8.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8e6ce43..81a7d935 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,8 +132,8 @@ importers: specifier: ^5.0.0 version: 5.0.1 next: - specifier: ^15.5.10 - version: 15.5.10(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.9 + version: 15.5.9(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) node-fetch: specifier: ^3.2.8 version: 3.3.2 @@ -313,8 +313,8 @@ importers: specifier: ^14.0.0 version: 14.0.1(stylelint@15.11.0(typescript@5.9.3)) tar: - specifier: ^7.5.7 - version: 7.5.7 + specifier: ^7.5.4 + version: 7.5.4 ts-jest: specifier: ^29.4.6 version: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) @@ -883,8 +883,11 @@ packages: peerDependencies: '@dicebear/core': ^9.0.0 - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -1281,38 +1284,75 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-darwin-x64@0.34.5': resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + cpu: [arm] + os: [linux] + '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + cpu: [ppc64] + os: [linux] + '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] @@ -1323,38 +1363,76 @@ packages: cpu: [riscv64] os: [linux] + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1367,47 +1445,94 @@ packages: cpu: [riscv64] os: [linux] + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-arm64@0.34.5': resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-ia32@0.34.5': resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@img/sharp-win32-x64@0.34.5': resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1566,11 +1691,11 @@ packages: resolution: {integrity: sha512-HXm94tteOuA0FYwhkxjYIPe0zta+Dsu0wz7LnhfqVlaYcRaOLjHtd2vgfmpz3np/fx9TQg3gCfqGkXt2a9i7Aw==} engines: {node: '>=18.0.0'} - '@next/env@15.5.10': - resolution: {integrity: sha512-plg+9A/KoZcTS26fe15LHg+QxReTazrIOoKKUC3Uz4leGGeNPgLHdevVraAAOX0snnUs3WkRx3eUQpj9mreG6A==} + '@next/env@15.5.9': + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} - '@next/env@16.1.5': - resolution: {integrity: sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g==} + '@next/env@16.0.10': + resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} '@next/swc-darwin-arm64@15.5.7': resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} @@ -1578,8 +1703,8 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.1.5': - resolution: {integrity: sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q==} + '@next/swc-darwin-arm64@16.0.10': + resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -1590,8 +1715,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@16.1.5': - resolution: {integrity: sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA==} + '@next/swc-darwin-x64@16.0.10': + resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -1602,8 +1727,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@16.1.5': - resolution: {integrity: sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==} + '@next/swc-linux-arm64-gnu@16.0.10': + resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1614,8 +1739,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.1.5': - resolution: {integrity: sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==} + '@next/swc-linux-arm64-musl@16.0.10': + resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1626,8 +1751,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@16.1.5': - resolution: {integrity: sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==} + '@next/swc-linux-x64-gnu@16.0.10': + resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1638,8 +1763,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.1.5': - resolution: {integrity: sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==} + '@next/swc-linux-x64-musl@16.0.10': + resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1650,8 +1775,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@16.1.5': - resolution: {integrity: sha512-LZli0anutkIllMtTAWZlDqdfvjWX/ch8AFK5WgkNTvaqwlouiD1oHM+WW8RXMiL0+vAkAJyAGEzPPjO+hnrSNQ==} + '@next/swc-win32-arm64-msvc@16.0.10': + resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -1662,8 +1787,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.5': - resolution: {integrity: sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng==} + '@next/swc-win32-x64-msvc@16.0.10': + resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2687,8 +2812,8 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} '@tanstack/query-core@5.90.11': resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==} @@ -3040,10 +3165,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.18: - resolution: {integrity: sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==} - hasBin: true - bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -3151,8 +3272,14 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001766: - resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} + caniuse-lite@1.0.30001735: + resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} + + caniuse-lite@1.0.30001741: + resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -3267,6 +3394,13 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -3638,6 +3772,10 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -4299,6 +4437,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -5099,8 +5240,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.5.10: - resolution: {integrity: sha512-r0X65PNwyDDyOrWNKpQoZvOatw7BcsTPRKdwEqtc9cj3wv7mbBIk9tKed4klRaFXJdX0rugpuMTHslDrAU1bBg==} + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -5120,8 +5261,8 @@ packages: sass: optional: true - next@16.1.5: - resolution: {integrity: sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w==} + next@16.0.10: + resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -6297,6 +6438,10 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6344,6 +6489,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -6614,8 +6762,8 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tar@7.5.7: - resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + tar@7.5.4: + resolution: {integrity: sha512-AN04xbWGrSTDmVwlI4/GTlIIwMFk/XEv7uL8aa57zuvRy6s4hdBed+lVq2fAZ89XDa7Us3ANXcE3Tvqvja1kTA==} engines: {node: '>=18'} terser@5.43.1: @@ -7604,7 +7752,12 @@ snapshots: dependencies: '@dicebear/core': 9.2.4 - '@emnapi/runtime@1.8.1': + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true @@ -7896,56 +8049,108 @@ snapshots: '@img/colour@1.0.0': optional: true + '@img/sharp-darwin-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.0 + optional: true + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true + '@img/sharp-darwin-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.0 + optional: true + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true + '@img/sharp-libvips-darwin-arm64@1.2.0': + optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.0': + optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.0': + optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true + '@img/sharp-libvips-linux-arm@1.2.0': + optional: true + '@img/sharp-libvips-linux-arm@1.2.4': optional: true + '@img/sharp-libvips-linux-ppc64@1.2.0': + optional: true + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true + '@img/sharp-libvips-linux-s390x@1.2.0': + optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.0': + optional: true + '@img/sharp-libvips-linux-x64@1.2.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true + '@img/sharp-linux-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.0 + optional: true + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true + '@img/sharp-linux-arm@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.0 + optional: true + '@img/sharp-linux-arm@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.2.4 optional: true + '@img/sharp-linux-ppc64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.0 + optional: true + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-ppc64': 1.2.4 @@ -7956,56 +8161,90 @@ snapshots: '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true + '@img/sharp-linux-s390x@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.0 + optional: true + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true + '@img/sharp-linux-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.0 + optional: true + '@img/sharp-linux-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.2.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + '@img/sharp-linuxmusl-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true + '@img/sharp-wasm32@0.34.3': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.8.1 + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-arm64@0.34.3': optional: true '@img/sharp-win32-arm64@0.34.5': optional: true + '@img/sharp-win32-ia32@0.34.3': + optional: true + '@img/sharp-win32-ia32@0.34.5': optional: true + '@img/sharp-win32-x64@0.34.3': + optional: true + '@img/sharp-win32-x64@0.34.5': optional: true '@internationalized/date@3.10.0': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 '@internationalized/message@3.1.8': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 intl-messageformat: 10.7.18 '@internationalized/number@3.6.5': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 '@internationalized/string@3.2.7': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 '@isaacs/balanced-match@4.0.1': {} @@ -8253,56 +8492,56 @@ snapshots: '@netlify/plugin-nextjs@5.15.1': {} - '@next/env@15.5.10': {} + '@next/env@15.5.9': {} - '@next/env@16.1.5': {} + '@next/env@16.0.10': {} '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-arm64@16.1.5': + '@next/swc-darwin-arm64@16.0.10': optional: true '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-darwin-x64@16.1.5': + '@next/swc-darwin-x64@16.0.10': optional: true '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@16.1.5': + '@next/swc-linux-arm64-gnu@16.0.10': optional: true '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-musl@16.1.5': + '@next/swc-linux-arm64-musl@16.0.10': optional: true '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-gnu@16.1.5': + '@next/swc-linux-x64-gnu@16.0.10': optional: true '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-linux-x64-musl@16.1.5': + '@next/swc-linux-x64-musl@16.0.10': optional: true '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@16.1.5': + '@next/swc-win32-arm64-msvc@16.0.10': optional: true '@next/swc-win32-x64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@16.1.5': + '@next/swc-win32-x64-msvc@16.0.10': optional: true '@nodelib/fs.scandir@2.1.5': @@ -8386,7 +8625,7 @@ snapshots: '@react-types/autocomplete': 3.0.0-alpha.35(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8397,7 +8636,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/breadcrumbs': 3.7.17(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8409,7 +8648,7 @@ snapshots: '@react-stately/toggle': 3.9.2(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8424,7 +8663,7 @@ snapshots: '@react-types/button': 3.14.1(react@19.2.3) '@react-types/calendar': 3.8.0(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8440,7 +8679,7 @@ snapshots: '@react-stately/toggle': 3.9.2(react@19.2.3) '@react-types/checkbox': 3.10.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8450,7 +8689,7 @@ snapshots: '@react-aria/ssr': 3.9.10(react@19.2.3) '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) @@ -8469,7 +8708,7 @@ snapshots: '@react-stately/form': 3.2.2(react@19.2.3) '@react-types/color': 3.1.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8490,7 +8729,7 @@ snapshots: '@react-types/button': 3.14.1(react@19.2.3) '@react-types/combobox': 3.13.9(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8513,7 +8752,7 @@ snapshots: '@react-types/datepicker': 3.13.2(react@19.2.3) '@react-types/dialog': 3.5.22(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8524,7 +8763,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/dialog': 3.5.22(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8534,7 +8773,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-stately/disclosure': 3.0.8(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8550,7 +8789,7 @@ snapshots: '@react-stately/dnd': 3.7.1(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8559,7 +8798,7 @@ snapshots: '@react-aria/interactions': 3.25.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8570,7 +8809,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-stately/form': 3.2.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8588,7 +8827,7 @@ snapshots: '@react-types/checkbox': 3.10.2(react@19.2.3) '@react-types/grid': 3.3.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8603,7 +8842,7 @@ snapshots: '@react-stately/list': 3.13.1(react@19.2.3) '@react-stately/tree': 3.9.3(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8616,7 +8855,7 @@ snapshots: '@react-aria/ssr': 3.9.10(react@19.2.3) '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8626,7 +8865,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-stately/flags': 3.1.2 '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8634,7 +8873,7 @@ snapshots: dependencies: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8642,7 +8881,7 @@ snapshots: dependencies: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) @@ -8653,7 +8892,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/link': 3.6.5(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8667,13 +8906,13 @@ snapshots: '@react-stately/list': 3.13.1(react@19.2.3) '@react-types/listbox': 3.7.4(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) '@react-aria/live-announcer@3.4.4': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 '@react-aria/menu@3.19.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: @@ -8690,7 +8929,7 @@ snapshots: '@react-types/button': 3.14.1(react@19.2.3) '@react-types/menu': 3.10.5(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8699,7 +8938,7 @@ snapshots: '@react-aria/progress': 3.4.27(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/meter': 3.4.13(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8715,7 +8954,7 @@ snapshots: '@react-types/button': 3.14.1(react@19.2.3) '@react-types/numberfield': 3.8.15(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8731,7 +8970,7 @@ snapshots: '@react-types/button': 3.14.1(react@19.2.3) '@react-types/overlays': 3.9.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8742,7 +8981,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/progress': 3.5.16(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8757,7 +8996,7 @@ snapshots: '@react-stately/radio': 3.11.2(react@19.2.3) '@react-types/radio': 3.9.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8770,7 +9009,7 @@ snapshots: '@react-types/button': 3.14.1(react@19.2.3) '@react-types/searchfield': 3.6.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8789,7 +9028,7 @@ snapshots: '@react-types/button': 3.14.1(react@19.2.3) '@react-types/select': 3.11.0(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8801,7 +9040,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-stately/selection': 3.20.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8809,7 +9048,7 @@ snapshots: dependencies: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8822,7 +9061,7 @@ snapshots: '@react-stately/slider': 3.7.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/slider': 3.8.2(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8833,13 +9072,13 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) '@react-aria/ssr@3.9.10(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-aria/switch@3.7.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -8848,7 +9087,7 @@ snapshots: '@react-stately/toggle': 3.9.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/switch': 3.5.15(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8868,7 +9107,7 @@ snapshots: '@react-types/grid': 3.3.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/table': 3.13.4(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8881,7 +9120,7 @@ snapshots: '@react-stately/tabs': 3.8.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/tabs': 3.3.19(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8896,7 +9135,7 @@ snapshots: '@react-stately/list': 3.13.1(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8910,7 +9149,7 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/textfield': 3.12.6(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8923,7 +9162,7 @@ snapshots: '@react-stately/toast': 3.1.2(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8934,7 +9173,7 @@ snapshots: '@react-stately/toggle': 3.9.2(react@19.2.3) '@react-types/checkbox': 3.10.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8944,7 +9183,7 @@ snapshots: '@react-aria/i18n': 3.12.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8955,7 +9194,7 @@ snapshots: '@react-stately/tooltip': 3.5.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/tooltip': 3.4.21(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8968,7 +9207,7 @@ snapshots: '@react-stately/tree': 3.9.3(react@19.2.3) '@react-types/button': 3.14.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8978,7 +9217,7 @@ snapshots: '@react-stately/flags': 3.1.2 '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8990,7 +9229,7 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-stately/virtualizer': 4.4.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8999,7 +9238,7 @@ snapshots: '@react-aria/interactions': 3.25.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9070,7 +9309,7 @@ snapshots: '@react-stately/autocomplete@3.0.0-beta.3(react@19.2.3)': dependencies: '@react-stately/utils': 3.10.8(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/calendar@3.9.0(react@19.2.3)': @@ -9079,7 +9318,7 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/calendar': 3.8.0(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/checkbox@3.7.2(react@19.2.3)': @@ -9088,13 +9327,13 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/checkbox': 3.10.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/collections@3.12.8(react@19.2.3)': dependencies: '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/color@3.9.2(react@19.2.3)': @@ -9107,7 +9346,7 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/color': 3.1.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/combobox@3.12.0(react@19.2.3)': @@ -9119,13 +9358,13 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/combobox': 3.13.9(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/data@3.14.1(react@19.2.3)': dependencies: '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/datepicker@3.15.2(react@19.2.3)': @@ -9137,31 +9376,31 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/datepicker': 3.13.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/disclosure@3.0.8(react@19.2.3)': dependencies: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/dnd@3.7.1(react@19.2.3)': dependencies: '@react-stately/selection': 3.20.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/flags@3.1.2': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 '@react-stately/form@3.2.2(react@19.2.3)': dependencies: '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/grid@3.11.6(react@19.2.3)': @@ -9170,7 +9409,7 @@ snapshots: '@react-stately/selection': 3.20.6(react@19.2.3) '@react-types/grid': 3.3.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/layout@4.5.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -9181,7 +9420,7 @@ snapshots: '@react-types/grid': 3.3.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/table': 3.13.4(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9191,7 +9430,7 @@ snapshots: '@react-stately/selection': 3.20.6(react@19.2.3) '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/menu@3.9.8(react@19.2.3)': @@ -9199,7 +9438,7 @@ snapshots: '@react-stately/overlays': 3.6.20(react@19.2.3) '@react-types/menu': 3.10.5(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/numberfield@3.10.2(react@19.2.3)': @@ -9208,14 +9447,14 @@ snapshots: '@react-stately/form': 3.2.2(react@19.2.3) '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/numberfield': 3.8.15(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/overlays@3.6.20(react@19.2.3)': dependencies: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/overlays': 3.9.2(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/radio@3.11.2(react@19.2.3)': @@ -9224,14 +9463,14 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/radio': 3.9.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/searchfield@3.5.16(react@19.2.3)': dependencies: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/searchfield': 3.6.6(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/select@3.8.0(react@19.2.3)': @@ -9242,7 +9481,7 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/select': 3.11.0(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/selection@3.20.6(react@19.2.3)': @@ -9250,7 +9489,7 @@ snapshots: '@react-stately/collections': 3.12.8(react@19.2.3) '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/slider@3.7.2(react@19.2.3)': @@ -9258,7 +9497,7 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/slider': 3.8.2(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/table@3.15.1(react@19.2.3)': @@ -9271,7 +9510,7 @@ snapshots: '@react-types/grid': 3.3.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/table': 3.13.4(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/tabs@3.8.6(react@19.2.3)': @@ -9279,12 +9518,12 @@ snapshots: '@react-stately/list': 3.13.1(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/tabs': 3.3.19(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/toast@3.1.2(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 use-sync-external-store: 1.6.0(react@19.2.3) @@ -9293,14 +9532,14 @@ snapshots: '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/checkbox': 3.10.2(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/tooltip@3.5.8(react@19.2.3)': dependencies: '@react-stately/overlays': 3.6.20(react@19.2.3) '@react-types/tooltip': 3.4.21(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/tree@3.9.3(react@19.2.3)': @@ -9309,18 +9548,18 @@ snapshots: '@react-stately/selection': 3.20.6(react@19.2.3) '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/utils@3.10.8(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 '@react-stately/virtualizer@4.4.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9752,7 +9991,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.18': + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 @@ -9904,7 +10143,7 @@ snapshots: glob: 13.0.0 highlight.js: 11.11.1 lucide-react: 0.555.0(react@19.2.3) - next: 16.1.5(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.0.10(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-aria-components: 1.13.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-dom: 19.2.3(react@19.2.3) @@ -10094,7 +10333,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.2 - caniuse-lite: 1.0.30001766 + caniuse-lite: 1.0.30001735 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -10190,8 +10429,6 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.18: {} - bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -10219,7 +10456,7 @@ snapshots: browserslist@4.25.2: dependencies: - caniuse-lite: 1.0.30001766 + caniuse-lite: 1.0.30001735 electron-to-chromium: 1.5.202 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) @@ -10306,11 +10543,15 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.25.2 - caniuse-lite: 1.0.30001766 + caniuse-lite: 1.0.30001741 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001766: {} + caniuse-lite@1.0.30001735: {} + + caniuse-lite@1.0.30001741: {} + + caniuse-lite@1.0.30001759: {} caseless@0.12.0: {} @@ -10410,6 +10651,18 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + colord@2.9.3: {} colorette@1.4.0: {} @@ -10832,6 +11085,9 @@ snapshots: detect-indent@6.1.0: {} + detect-libc@2.0.4: + optional: true + detect-libc@2.1.2: optional: true @@ -11644,6 +11900,9 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: + optional: true + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -12632,11 +12891,11 @@ snapshots: neo-async@2.6.2: {} - next@15.5.10(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.9(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 15.5.10 + '@next/env': 15.5.9 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001766 + caniuse-lite: 1.0.30001741 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -12651,30 +12910,29 @@ snapshots: '@next/swc-win32-arm64-msvc': 15.5.7 '@next/swc-win32-x64-msvc': 15.5.7 babel-plugin-react-compiler: 19.1.0-rc.2 - sharp: 0.34.5 + sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@16.1.5(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.0.10(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 16.1.5 + '@next/env': 16.0.10 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.9.18 - caniuse-lite: 1.0.30001766 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.3) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.5 - '@next/swc-darwin-x64': 16.1.5 - '@next/swc-linux-arm64-gnu': 16.1.5 - '@next/swc-linux-arm64-musl': 16.1.5 - '@next/swc-linux-x64-gnu': 16.1.5 - '@next/swc-linux-x64-musl': 16.1.5 - '@next/swc-win32-arm64-msvc': 16.1.5 - '@next/swc-win32-x64-msvc': 16.1.5 + '@next/swc-darwin-arm64': 16.0.10 + '@next/swc-darwin-x64': 16.0.10 + '@next/swc-linux-arm64-gnu': 16.0.10 + '@next/swc-linux-arm64-musl': 16.0.10 + '@next/swc-linux-x64-gnu': 16.0.10 + '@next/swc-linux-x64-musl': 16.0.10 + '@next/swc-win32-arm64-msvc': 16.0.10 + '@next/swc-win32-x64-msvc': 16.0.10 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.5 transitivePeerDependencies: @@ -13495,7 +13753,7 @@ snapshots: '@react-types/grid': 3.3.6(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) '@react-types/table': 3.13.4(react@19.2.3) - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.17 client-only: 0.0.1 react: 19.2.3 react-aria: 3.44.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -13955,6 +14213,36 @@ snapshots: setimmediate@1.0.5: {} + sharp@0.34.3: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 + optional: true + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -14033,6 +14321,11 @@ snapshots: signal-exit@4.1.0: {} + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + optional: true + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -14367,7 +14660,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tar@7.5.7: + tar@7.5.4: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 diff --git a/src/app/(main)/MobileNav.tsx b/src/app/(main)/MobileNav.tsx index a9d9e861..aaa25846 100644 --- a/src/app/(main)/MobileNav.tsx +++ b/src/app/(main)/MobileNav.tsx @@ -42,7 +42,7 @@ export function MobileNav() { {({ close }) => { return ( <> - + {links.map(link => { return ( diff --git a/src/app/(main)/pixels/PixelsTable.tsx b/src/app/(main)/pixels/PixelsTable.tsx index 018b40eb..57aff4db 100644 --- a/src/app/(main)/pixels/PixelsTable.tsx +++ b/src/app/(main)/pixels/PixelsTable.tsx @@ -14,6 +14,7 @@ export function PixelsTable({ showActions, ...props }: PixelsTableProps) { const { formatMessage, labels } = useMessages(); const { renderUrl } = useNavigation(); const { getSlugUrl } = useSlug('pixel'); + console.log(showActions); return ( diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx index d81519d7..e336a3db 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx @@ -1,6 +1,6 @@ import { Box, Column, Dialog, Grid, Icon, ProgressBar, Row, Text } from '@umami/react-zen'; import { LoadingPanel } from '@/components/common/LoadingPanel'; -import { useMessages, useNavigation, useResultQuery } from '@/components/hooks'; +import { useMessages, useResultQuery } from '@/components/hooks'; import { File, User } from '@/components/icons'; import { ReportEditButton } from '@/components/input/ReportEditButton'; import { ChangeLabel } from '@/components/metrics/ChangeLabel'; @@ -20,8 +20,6 @@ type FunnelResult = { export function Funnel({ id, name, type, parameters, websiteId }) { const { formatMessage, labels } = useMessages(); - const { pathname } = useNavigation(); - const isSharePage = pathname.includes('/share/'); const { data, error, isLoading } = useResultQuery(type, { websiteId, ...parameters, @@ -38,22 +36,21 @@ export function Funnel({ id, name, type, parameters, websiteId }) { - {!isSharePage && ( - - - {({ close }) => { - return ( - - - - ); - }} - - - )} + + + {({ close }) => { + return ( + + + + ); + }} + + {data?.map( ( diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx index a56917b7..57bce52f 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx @@ -4,7 +4,7 @@ import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteContro import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Panel } from '@/components/common/Panel'; import { SectionHeader } from '@/components/common/SectionHeader'; -import { useDateRange, useNavigation, useReportsQuery } from '@/components/hooks'; +import { useDateRange, useReportsQuery } from '@/components/hooks'; import { Funnel } from './Funnel'; import { FunnelAddButton } from './FunnelAddButton'; @@ -13,17 +13,13 @@ export function FunnelsPage({ websiteId }: { websiteId: string }) { const { dateRange: { startDate, endDate }, } = useDateRange(); - const { pathname } = useNavigation(); - const isSharePage = pathname.includes('/share/'); return ( - {!isSharePage && ( - - - - )} + + + {data && ( diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx index 1d0b96e5..b6c4a11d 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx @@ -1,6 +1,6 @@ import { Column, Dialog, Grid, Icon, ProgressBar, Row, Text } from '@umami/react-zen'; import { LoadingPanel } from '@/components/common/LoadingPanel'; -import { useMessages, useNavigation, useResultQuery } from '@/components/hooks'; +import { useMessages, useResultQuery } from '@/components/hooks'; import { File, User } from '@/components/icons'; import { ReportEditButton } from '@/components/input/ReportEditButton'; import { Lightning } from '@/components/svg'; @@ -25,8 +25,6 @@ export type GoalData = { num: number; total: number }; export function Goal({ id, name, type, parameters, websiteId, startDate, endDate }: GoalProps) { const { formatMessage, labels } = useMessages(); - const { pathname } = useNavigation(); - const isSharePage = pathname.includes('/share/'); const { data, error, isLoading, isFetching } = useResultQuery(type, { websiteId, startDate, @@ -47,23 +45,21 @@ export function Goal({ id, name, type, parameters, websiteId, startDate, endDate - {!isSharePage && ( - - - {({ close }) => { - return ( - - - - ); - }} - - - )} + + + {({ close }) => { + return ( + + + + ); + }} + + diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx index fe4550d6..ff7b49fb 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx @@ -4,7 +4,7 @@ import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteContro import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Panel } from '@/components/common/Panel'; import { SectionHeader } from '@/components/common/SectionHeader'; -import { useDateRange, useNavigation, useReportsQuery } from '@/components/hooks'; +import { useDateRange, useReportsQuery } from '@/components/hooks'; import { Goal } from './Goal'; import { GoalAddButton } from './GoalAddButton'; @@ -13,17 +13,13 @@ export function GoalsPage({ websiteId }: { websiteId: string }) { const { dateRange: { startDate, endDate }, } = useDateRange(); - const { pathname } = useNavigation(); - const isSharePage = pathname.includes('/share/'); return ( - {!isSharePage && ( - - - - )} + + + {data && ( diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index 1dee8022..e79576dd 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -6,13 +6,7 @@ import { useMessages, useNavigation, useWebsite } from '@/components/hooks'; import { Edit } from '@/components/icons'; import { ActiveUsers } from '@/components/metrics/ActiveUsers'; -export function WebsiteHeader({ - showActions, - allowLink = true, -}: { - showActions?: boolean; - allowLink?: boolean; -}) { +export function WebsiteHeader({ showActions }: { showActions?: boolean }) { const website = useWebsite(); const { renderUrl, pathname } = useNavigation(); const isSettings = pathname.endsWith('/settings'); @@ -27,7 +21,7 @@ export function WebsiteHeader({ } - titleHref={allowLink ? renderUrl(`/websites/${website.id}`, false) : undefined} + titleHref={renderUrl(`/websites/${website.id}`, false)} > diff --git a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx index 95628dd3..7260a7ea 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx @@ -9,10 +9,11 @@ import { WebsiteNav } from './WebsiteNav'; export function WebsiteLayout({ websiteId, children }: { websiteId: string; children: ReactNode }) { return ( - + @@ -113,6 +116,25 @@ export function WebsitePanels({ websiteId }: { websiteId: string }) { + {isSharePage && ( + + + {formatMessage(labels.events)} + + + + + + + + )} ); } diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareCreateForm.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareCreateForm.tsx new file mode 100644 index 00000000..a16f2dc5 --- /dev/null +++ b/src/app/(main)/websites/[websiteId]/settings/ShareCreateForm.tsx @@ -0,0 +1,81 @@ +import { + Button, + Checkbox, + Column, + Form, + FormField, + FormSubmitButton, + Row, + Text, +} from '@umami/react-zen'; +import { useState } from 'react'; +import { useApi, useMessages, useModified } from '@/components/hooks'; +import { SHARE_NAV_ITEMS } from './constants'; + +export interface ShareCreateFormProps { + websiteId: string; + onSave?: () => void; + onClose?: () => void; +} + +export function ShareCreateForm({ websiteId, onSave, onClose }: ShareCreateFormProps) { + const { formatMessage, labels } = useMessages(); + const { post } = useApi(); + const { touch } = useModified(); + const [isPending, setIsPending] = useState(false); + + // Build default values - only overview and events enabled by default + const defaultValues: Record = {}; + SHARE_NAV_ITEMS.forEach(section => { + section.items.forEach(item => { + defaultValues[item.id] = item.id === 'overview' || item.id === 'events'; + }); + }); + + const handleSubmit = async (data: any) => { + setIsPending(true); + try { + const parameters: Record = {}; + SHARE_NAV_ITEMS.forEach(section => { + section.items.forEach(item => { + parameters[item.id] = data[item.id] ?? false; + }); + }); + await post(`/websites/${websiteId}/shares`, { parameters }); + touch('shares'); + onSave?.(); + onClose?.(); + } finally { + setIsPending(false); + } + }; + + return ( +
+ + {SHARE_NAV_ITEMS.map(section => ( + + + {formatMessage((labels as any)[section.section])} + + + {section.items.map(item => ( + + {formatMessage((labels as any)[item.label])} + + ))} + + + ))} + + {onClose && ( + + )} + {formatMessage(labels.save)} + + +
+ ); +} diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx index 4b86247a..c5bd85a6 100644 --- a/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx @@ -5,7 +5,6 @@ import { Form, FormField, FormSubmitButton, - Grid, Label, Loading, Row, @@ -14,30 +13,25 @@ import { } from '@umami/react-zen'; import { useEffect, useState } from 'react'; import { useApi, useConfig, useMessages, useModified } from '@/components/hooks'; +import { useUpdateQuery } from '@/components/hooks/queries/useUpdateQuery'; import { SHARE_NAV_ITEMS } from './constants'; export function ShareEditForm({ shareId, - websiteId, onSave, onClose, }: { - shareId?: string; - websiteId?: string; + shareId: string; onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(`/share/id/${shareId}`); const { cloudMode } = useConfig(); - const { get, post } = useApi(); - const { touch } = useModified(); + const { get } = useApi(); const { modified } = useModified('shares'); const [share, setShare] = useState(null); - const [isLoading, setIsLoading] = useState(!!shareId); - const [isPending, setIsPending] = useState(false); - const [error, setError] = useState(null); - - const isEditing = !!shareId; + const [isLoading, setIsLoading] = useState(true); const getUrl = (slug: string) => { if (cloudMode) { @@ -47,8 +41,6 @@ export function ShareEditForm({ }; useEffect(() => { - if (!shareId) return; - const loadShare = async () => { setIsLoading(true); try { @@ -69,35 +61,27 @@ export function ShareEditForm({ }); }); - setIsPending(true); - setError(null); - - try { - if (isEditing) { - await post(`/share/id/${shareId}`, { name: data.name, slug: share.slug, parameters }); - } else { - await post(`/websites/${websiteId}/shares`, { name: data.name, parameters }); - } - touch('shares'); - onSave?.(); - onClose?.(); - } catch (e) { - setError(e); - } finally { - setIsPending(false); - } + await mutateAsync( + { slug: share.slug, parameters }, + { + onSuccess: async () => { + toast(formatMessage(messages.saved)); + touch('shares'); + onSave?.(); + onClose?.(); + }, + }, + ); }; if (isLoading) { return ; } - const url = isEditing ? getUrl(share?.slug || '') : null; + const url = getUrl(share?.slug || ''); // Build default values from share parameters - const defaultValues: Record = { - name: share?.name || '', - }; + const defaultValues: Record = {}; SHARE_NAV_ITEMS.forEach(section => { section.items.forEach(item => { const defaultSelected = item.id === 'overview' || item.id === 'events'; @@ -105,60 +89,34 @@ export function ShareEditForm({ }); }); - // Get all item ids for validation - const allItemIds = SHARE_NAV_ITEMS.flatMap(section => section.items.map(item => item.id)); - return (
- {({ watch }) => { - const values = watch(); - const hasSelection = allItemIds.some(id => values[id]); - - return ( - - {url && ( - - - - - )} - - - - - {SHARE_NAV_ITEMS.map(section => ( - - {formatMessage((labels as any)[section.section])} - - {section.items.map(item => ( - - {formatMessage((labels as any)[item.label])} - - ))} - - + + + + + + {SHARE_NAV_ITEMS.map(section => ( + + {formatMessage((labels as any)[section.section])} + + {section.items.map(item => ( + + {formatMessage((labels as any)[item.label])} + ))} - - - {onClose && ( - - )} - - {formatMessage(labels.save)} - - + - ); - }} + ))} + + {onClose && ( + + )} + {formatMessage(labels.save)} + +
); } diff --git a/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx b/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx index e997d247..05e8b357 100644 --- a/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx @@ -1,25 +1,24 @@ import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen'; import { DateDistance } from '@/components/common/DateDistance'; import { ExternalLink } from '@/components/common/ExternalLink'; -import { useConfig, useMessages, useMobile } from '@/components/hooks'; +import { useConfig, useMessages } from '@/components/hooks'; import { ShareDeleteButton } from './ShareDeleteButton'; import { ShareEditButton } from './ShareEditButton'; export function SharesTable(props: DataTableProps) { const { formatMessage, labels } = useMessages(); const { cloudMode } = useConfig(); - const { isMobile } = useMobile(); const getUrl = (slug: string) => { - return `${cloudMode ? process.env.cloudUrl : window?.location.origin}${process.env.basePath || ''}/share/${slug}`; + if (cloudMode) { + return `${process.env.cloudUrl}/share/${slug}`; + } + return `${window?.location.origin}${process.env.basePath || ''}/share/${slug}`; }; return ( - - {({ name }: any) => name} - - + {({ slug }: any) => { const url = getUrl(slug); return ( @@ -29,11 +28,9 @@ export function SharesTable(props: DataTableProps) { ); }} - {!isMobile && ( - - {(row: any) => } - - )} + + {(row: any) => } + {({ id, slug }: any) => { return ( diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx index 49721f1e..7453b402 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx @@ -2,7 +2,7 @@ import { Column, Heading, Row, Text } from '@umami/react-zen'; import { Plus } from 'lucide-react'; import { useMessages, useWebsiteSharesQuery } from '@/components/hooks'; import { DialogButton } from '@/components/input/DialogButton'; -import { ShareEditForm } from './ShareEditForm'; +import { ShareCreateForm } from './ShareCreateForm'; import { SharesTable } from './SharesTable'; export interface WebsiteShareFormProps { @@ -11,7 +11,7 @@ export interface WebsiteShareFormProps { export function WebsiteShareForm({ websiteId }: WebsiteShareFormProps) { const { formatMessage, labels, messages } = useMessages(); - const { data } = useWebsiteSharesQuery({ websiteId }); + const { data, isLoading } = useWebsiteSharesQuery({ websiteId }); const shares = data?.data || []; const hasShares = shares.length > 0; @@ -25,9 +25,9 @@ export function WebsiteShareForm({ websiteId }: WebsiteShareFormProps) { label={formatMessage(labels.add)} title={formatMessage(labels.share)} variant="primary" - width="600px" + width="400px" > - {({ close }) => } + {({ close }) => }
{hasShares ? ( diff --git a/src/app/api/share/[slug]/route.ts b/src/app/api/share/[slug]/route.ts index e7d5372f..ed3271ea 100644 --- a/src/app/api/share/[slug]/route.ts +++ b/src/app/api/share/[slug]/route.ts @@ -1,47 +1,7 @@ -import { ROLES } from '@/lib/constants'; import { secret } from '@/lib/crypto'; import { createToken } from '@/lib/jwt'; -import prisma from '@/lib/prisma'; -import redis from '@/lib/redis'; import { json, notFound } from '@/lib/response'; -import type { WhiteLabel } from '@/lib/types'; -import { getShareByCode, getWebsite } from '@/queries/prisma'; - -async function getAccountId(website: { userId?: string; teamId?: string }): Promise { - if (website.userId) { - return website.userId; - } - - if (website.teamId) { - const teamOwner = await prisma.client.teamUser.findFirst({ - where: { - teamId: website.teamId, - role: ROLES.teamOwner, - }, - select: { - userId: true, - }, - }); - - return teamOwner?.userId || null; - } - - return null; -} - -async function getWhiteLabel(accountId: string): Promise { - if (!redis.enabled) { - return null; - } - - const data = await redis.client.get(`white-label:${accountId}`); - - if (data) { - return data as WhiteLabel; - } - - return null; -} +import { getShareByCode } from '@/queries/prisma'; export async function GET(_request: Request, { params }: { params: Promise<{ slug: string }> }) { const { slug } = await params; @@ -52,25 +12,12 @@ export async function GET(_request: Request, { params }: { params: Promise<{ slu return notFound(); } - const website = await getWebsite(share.entityId); - - const data: Record = { + const data = { shareId: share.id, websiteId: share.entityId, parameters: share.parameters, }; + const token = createToken(data, secret()); - data.token = createToken(data, secret()); - - const accountId = await getAccountId(website); - - if (accountId) { - const whiteLabel = await getWhiteLabel(accountId); - - if (whiteLabel) { - data.whiteLabel = whiteLabel; - } - } - - return json(data); + return json({ ...data, token }); } diff --git a/src/app/api/share/id/[shareId]/route.ts b/src/app/api/share/id/[shareId]/route.ts index 80da17b8..da7dcf56 100644 --- a/src/app/api/share/id/[shareId]/route.ts +++ b/src/app/api/share/id/[shareId]/route.ts @@ -25,7 +25,6 @@ export async function GET(request: Request, { params }: { params: Promise<{ shar export async function POST(request: Request, { params }: { params: Promise<{ shareId: string }> }) { const schema = z.object({ - name: z.string().max(200), slug: z.string().max(100), parameters: anyObjectParam, }); @@ -37,7 +36,7 @@ export async function POST(request: Request, { params }: { params: Promise<{ sha } const { shareId } = await params; - const { name, slug, parameters } = body; + const { slug, parameters } = body; const share = await getShare(shareId); @@ -50,7 +49,6 @@ export async function POST(request: Request, { params }: { params: Promise<{ sha } const result = await updateShare(shareId, { - name, slug, parameters, } as any); diff --git a/src/app/api/websites/[websiteId]/shares/route.ts b/src/app/api/websites/[websiteId]/shares/route.ts index 65d53771..db079d49 100644 --- a/src/app/api/websites/[websiteId]/shares/route.ts +++ b/src/app/api/websites/[websiteId]/shares/route.ts @@ -44,7 +44,6 @@ export async function POST( { params }: { params: Promise<{ websiteId: string }> }, ) { const schema = z.object({ - name: z.string().max(200), parameters: anyObjectParam.optional(), }); @@ -55,8 +54,7 @@ export async function POST( } const { websiteId } = await params; - const { name, parameters } = body; - const shareParameters = parameters ?? {}; + const { parameters = {} } = body; if (!(await canUpdateWebsite(auth, websiteId))) { return unauthorized(); @@ -68,9 +66,8 @@ export async function POST( id: uuid(), entityId: websiteId, shareType: ENTITY_TYPE.website, - name, slug, - parameters: shareParameters, + parameters, }); return json(share); diff --git a/src/app/share/ShareProvider.tsx b/src/app/share/ShareProvider.tsx deleted file mode 100644 index b83d3794..00000000 --- a/src/app/share/ShareProvider.tsx +++ /dev/null @@ -1,77 +0,0 @@ -'use client'; -import { Loading } from '@umami/react-zen'; -import { usePathname, useRouter } from 'next/navigation'; -import { createContext, type ReactNode, useEffect } from 'react'; -import { useShareTokenQuery } from '@/components/hooks'; -import type { WhiteLabel } from '@/lib/types'; - -export interface ShareData { - shareId: string; - slug: string; - websiteId: string; - parameters: any; - token: string; - whiteLabel?: WhiteLabel; -} - -export const ShareContext = createContext(null); - -const ALL_SECTION_IDS = [ - 'overview', - 'events', - 'sessions', - 'realtime', - 'compare', - 'breakdown', - 'goals', - 'funnels', - 'journeys', - 'retention', - 'utm', - 'revenue', - 'attribution', -]; - -function getSharePath(pathname: string) { - const segments = pathname.split('/'); - const firstSegment = segments[3]; - - // If first segment looks like a domain name, skip it - if (firstSegment?.includes('.')) { - return segments[4]; - } - - return firstSegment; -} - -export function ShareProvider({ slug, children }: { slug: string; children: ReactNode }) { - const { share, isLoading, isFetching } = useShareTokenQuery(slug); - const router = useRouter(); - const pathname = usePathname(); - const path = getSharePath(pathname); - - const allowedSections = share?.parameters - ? ALL_SECTION_IDS.filter(id => share.parameters[id] !== false) - : []; - - const shouldRedirect = - allowedSections.length === 1 && - allowedSections[0] !== 'overview' && - (path === undefined || path === '' || path === 'overview'); - - useEffect(() => { - if (shouldRedirect) { - router.replace(`/share/${slug}/${allowedSections[0]}`); - } - }, [shouldRedirect, slug, allowedSections, router]); - - if (isFetching && isLoading) { - return ; - } - - if (!share || shouldRedirect) { - return null; - } - - return {children}; -} diff --git a/src/app/share/[...shareId]/Footer.tsx b/src/app/share/[...shareId]/Footer.tsx new file mode 100644 index 00000000..f2948628 --- /dev/null +++ b/src/app/share/[...shareId]/Footer.tsx @@ -0,0 +1,12 @@ +import { Row, Text } from '@umami/react-zen'; +import { CURRENT_VERSION, HOMEPAGE_URL } from '@/lib/constants'; + +export function Footer() { + return ( + + + umami {`v${CURRENT_VERSION}`} + + + ); +} diff --git a/src/app/share/[...shareId]/Header.tsx b/src/app/share/[...shareId]/Header.tsx new file mode 100644 index 00000000..d7b7dcb4 --- /dev/null +++ b/src/app/share/[...shareId]/Header.tsx @@ -0,0 +1,24 @@ +import { Icon, Row, Text, ThemeButton } from '@umami/react-zen'; +import { LanguageButton } from '@/components/input/LanguageButton'; +import { PreferencesButton } from '@/components/input/PreferencesButton'; +import { Logo } from '@/components/svg'; + +export function Header() { + return ( + + + + + + + umami + + + + + + + + + ); +} diff --git a/src/app/share/[slug]/[[...path]]/ShareNav.tsx b/src/app/share/[...shareId]/ShareNav.tsx similarity index 53% rename from src/app/share/[slug]/[[...path]]/ShareNav.tsx rename to src/app/share/[...shareId]/ShareNav.tsx index db927afe..b494046d 100644 --- a/src/app/share/[slug]/[[...path]]/ShareNav.tsx +++ b/src/app/share/[...shareId]/ShareNav.tsx @@ -1,30 +1,23 @@ -import { Button, Column, Icon, Row, Text, ThemeButton } from '@umami/react-zen'; +'use client'; +import { Column } from '@umami/react-zen'; import { SideMenu } from '@/components/common/SideMenu'; -import { useMessages, useNavigation, useShare } from '@/components/hooks'; -import { AlignEndHorizontal, Clock, Eye, PanelLeft, Sheet, Tag, User } from '@/components/icons'; -import { LanguageButton } from '@/components/input/LanguageButton'; -import { PreferencesButton } from '@/components/input/PreferencesButton'; -import { Funnel, Lightning, Logo, Magnet, Money, Network, Path, Target } from '@/components/svg'; +import { useMessages, useNavigation } from '@/components/hooks'; +import { AlignEndHorizontal, Clock, Eye, Sheet, Tag, User } from '@/components/icons'; +import { Funnel, Lightning, Magnet, Money, Network, Path, Target } from '@/components/svg'; export function ShareNav({ - collapsed, - onCollapse, + shareId, + parameters, onItemClick, }: { - collapsed?: boolean; - onCollapse?: (collapsed: boolean) => void; + shareId: string; + parameters: Record; onItemClick?: () => void; }) { - const share = useShare(); const { formatMessage, labels } = useMessages(); const { pathname } = useNavigation(); - const { slug, parameters, whiteLabel } = share; - const logoUrl = whiteLabel?.url || 'https://umami.is'; - const logoName = whiteLabel?.name || 'umami'; - const logoImage = whiteLabel?.image; - - const renderPath = (path: string) => `/share/${slug}${path}`; + const renderPath = (path: string) => `/share/${shareId}${path}`; const allItems = [ { @@ -137,70 +130,14 @@ export function ShareNav({ .flatMap(e => e.items) .find(({ path }) => path && pathname.endsWith(path.split('?')[0]))?.id; - const isMobile = !!onItemClick; - return ( - - - {!collapsed && ( - - - {logoImage ? ( - {logoName} - ) : ( - - - - )} - {logoName} - - - )} - {!onItemClick && ( - - )} - - {!collapsed && ( - - - - )} - - {collapsed ? ( - - - - - - ) : ( - - - - - - )} - + + ); } diff --git a/src/app/share/[slug]/[[...path]]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx similarity index 62% rename from src/app/share/[slug]/[[...path]]/SharePage.tsx rename to src/app/share/[...shareId]/SharePage.tsx index aab32c1f..3e1cedc0 100644 --- a/src/app/share/[slug]/[[...path]]/SharePage.tsx +++ b/src/app/share/[...shareId]/SharePage.tsx @@ -1,7 +1,6 @@ 'use client'; -import { Column, Grid, Row, useTheme } from '@umami/react-zen'; -import { usePathname } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { Column, Grid, useTheme } from '@umami/react-zen'; +import { useEffect } from 'react'; import { AttributionPage } from '@/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage'; import { BreakdownPage } from '@/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage'; import { FunnelsPage } from '@/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage'; @@ -18,8 +17,9 @@ import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader'; import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage'; import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; import { PageBody } from '@/components/common/PageBody'; -import { useShare } from '@/components/hooks'; -import { MobileMenuButton } from '@/components/input/MobileMenuButton'; +import { useShareTokenQuery } from '@/components/hooks'; +import { Footer } from './Footer'; +import { Header } from './Header'; import { ShareNav } from './ShareNav'; const PAGE_COMPONENTS: Record> = { @@ -39,25 +39,9 @@ const PAGE_COMPONENTS: Record attribution: AttributionPage, }; -function getSharePath(pathname: string) { - const segments = pathname.split('/'); - const firstSegment = segments[3]; - - // If first segment looks like a domain name, skip it - if (firstSegment?.includes('.')) { - return segments[4]; - } - - return firstSegment; -} - -export function SharePage() { - const [navCollapsed, setNavCollapsed] = useState(false); - const share = useShare(); +export function SharePage({ shareId, path = '' }: { shareId: string; path?: string }) { + const { shareToken, isLoading } = useShareTokenQuery(shareId); const { setTheme } = useTheme(); - const pathname = usePathname(); - const path = getSharePath(pathname); - const { websiteId, parameters = {} } = share; useEffect(() => { const url = new URL(window?.location?.href); @@ -68,6 +52,12 @@ export function SharePage() { } }, []); + if (isLoading || !shareToken) { + return null; + } + + const { websiteId, parameters = {} } = shareToken; + // Check if the requested path is allowed const pageKey = path || ''; const isAllowed = pageKey === '' || pageKey === 'overview' || parameters[pageKey] !== false; @@ -79,25 +69,29 @@ export function SharePage() { const PageComponent = PAGE_COMPONENTS[pageKey] || WebsitePage; return ( - - - - {({ close }) => { - return ; - }} - - - - - - - - + +
+ + + + + + - - - - - + + + + + + +