diff --git a/.gitignore b/.gitignore index de893d0f..8b543f6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,46 +1,48 @@ -# 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 - +# 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 + diff --git a/package.json b/package.json index ac2ea36c..d162be63 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "type": "module", "scripts": { - "dev": "next dev -p 3001 --turbo", + "dev": "next dev -p 3002 --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.9", + "next": "^15.5.10", "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.4", + "tar": "^7.5.7", "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 81a7d935..a8e6ce43 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.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) + 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) 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.4 - version: 7.5.4 + specifier: ^7.5.7 + version: 7.5.7 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,11 +883,8 @@ packages: peerDependencies: '@dicebear/core': ^9.0.0 - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -1284,75 +1281,38 @@ 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] @@ -1363,76 +1323,38 @@ 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} @@ -1445,94 +1367,47 @@ 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} @@ -1691,11 +1566,11 @@ packages: resolution: {integrity: sha512-HXm94tteOuA0FYwhkxjYIPe0zta+Dsu0wz7LnhfqVlaYcRaOLjHtd2vgfmpz3np/fx9TQg3gCfqGkXt2a9i7Aw==} engines: {node: '>=18.0.0'} - '@next/env@15.5.9': - resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} + '@next/env@15.5.10': + resolution: {integrity: sha512-plg+9A/KoZcTS26fe15LHg+QxReTazrIOoKKUC3Uz4leGGeNPgLHdevVraAAOX0snnUs3WkRx3eUQpj9mreG6A==} - '@next/env@16.0.10': - resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} + '@next/env@16.1.5': + resolution: {integrity: sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g==} '@next/swc-darwin-arm64@15.5.7': resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} @@ -1703,8 +1578,8 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.0.10': - resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} + '@next/swc-darwin-arm64@16.1.5': + resolution: {integrity: sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -1715,8 +1590,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@16.0.10': - resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} + '@next/swc-darwin-x64@16.1.5': + resolution: {integrity: sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -1727,8 +1602,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@16.0.10': - resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} + '@next/swc-linux-arm64-gnu@16.1.5': + resolution: {integrity: sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1739,8 +1614,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.10': - resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} + '@next/swc-linux-arm64-musl@16.1.5': + resolution: {integrity: sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1751,8 +1626,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.10': - resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} + '@next/swc-linux-x64-gnu@16.1.5': + resolution: {integrity: sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1763,8 +1638,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.10': - resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} + '@next/swc-linux-x64-musl@16.1.5': + resolution: {integrity: sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1775,8 +1650,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@16.0.10': - resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} + '@next/swc-win32-arm64-msvc@16.1.5': + resolution: {integrity: sha512-LZli0anutkIllMtTAWZlDqdfvjWX/ch8AFK5WgkNTvaqwlouiD1oHM+WW8RXMiL0+vAkAJyAGEzPPjO+hnrSNQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -1787,8 +1662,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.10': - resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} + '@next/swc-win32-x64-msvc@16.1.5': + resolution: {integrity: sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2812,8 +2687,8 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} '@tanstack/query-core@5.90.11': resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==} @@ -3165,6 +3040,10 @@ 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==} @@ -3272,14 +3151,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - 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==} + caniuse-lite@1.0.30001766: + resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -3394,13 +3267,6 @@ 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==} @@ -3772,10 +3638,6 @@ 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'} @@ -4437,9 +4299,6 @@ 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'} @@ -5240,8 +5099,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.5.9: - resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} + next@15.5.10: + resolution: {integrity: sha512-r0X65PNwyDDyOrWNKpQoZvOatw7BcsTPRKdwEqtc9cj3wv7mbBIk9tKed4klRaFXJdX0rugpuMTHslDrAU1bBg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -5261,8 +5120,8 @@ packages: sass: optional: true - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + next@16.1.5: + resolution: {integrity: sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -6438,10 +6297,6 @@ 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} @@ -6489,9 +6344,6 @@ 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==} @@ -6762,8 +6614,8 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tar@7.5.4: - resolution: {integrity: sha512-AN04xbWGrSTDmVwlI4/GTlIIwMFk/XEv7uL8aa57zuvRy6s4hdBed+lVq2fAZ89XDa7Us3ANXcE3Tvqvja1kTA==} + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} engines: {node: '>=18'} terser@5.43.1: @@ -7752,12 +7604,7 @@ snapshots: dependencies: '@dicebear/core': 9.2.4 - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -8049,108 +7896,56 @@ 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 @@ -8161,90 +7956,56 @@ 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.7.1 - optional: true - - '@img/sharp-win32-arm64@0.34.3': + '@emnapi/runtime': 1.8.1 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.17 + '@swc/helpers': 0.5.18 '@internationalized/message@3.1.8': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 intl-messageformat: 10.7.18 '@internationalized/number@3.6.5': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 '@internationalized/string@3.2.7': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 '@isaacs/balanced-match@4.0.1': {} @@ -8492,56 +8253,56 @@ snapshots: '@netlify/plugin-nextjs@5.15.1': {} - '@next/env@15.5.9': {} + '@next/env@15.5.10': {} - '@next/env@16.0.10': {} + '@next/env@16.1.5': {} '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-arm64@16.0.10': + '@next/swc-darwin-arm64@16.1.5': optional: true '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-darwin-x64@16.0.10': + '@next/swc-darwin-x64@16.1.5': optional: true '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@16.0.10': + '@next/swc-linux-arm64-gnu@16.1.5': optional: true '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-musl@16.0.10': + '@next/swc-linux-arm64-musl@16.1.5': optional: true '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-gnu@16.0.10': + '@next/swc-linux-x64-gnu@16.1.5': optional: true '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-linux-x64-musl@16.0.10': + '@next/swc-linux-x64-musl@16.1.5': optional: true '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@16.0.10': + '@next/swc-win32-arm64-msvc@16.1.5': optional: true '@next/swc-win32-x64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@16.0.10': + '@next/swc-win32-x64-msvc@16.1.5': optional: true '@nodelib/fs.scandir@2.1.5': @@ -8625,7 +8386,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8636,7 +8397,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8648,7 +8409,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8663,7 +8424,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8679,7 +8440,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8689,7 +8450,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) @@ -8708,7 +8469,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8729,7 +8490,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8752,7 +8513,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8763,7 +8524,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8773,7 +8534,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8789,7 +8550,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8798,7 +8559,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.17 + '@swc/helpers': 0.5.18 clsx: 2.1.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8809,7 +8570,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8827,7 +8588,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8842,7 +8603,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8855,7 +8616,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8865,7 +8626,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8873,7 +8634,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8881,7 +8642,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) @@ -8892,7 +8653,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8906,13 +8667,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 '@react-aria/menu@3.19.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: @@ -8929,7 +8690,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8938,7 +8699,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8954,7 +8715,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8970,7 +8731,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8981,7 +8742,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -8996,7 +8757,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9009,7 +8770,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9028,7 +8789,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9040,7 +8801,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9048,7 +8809,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9061,7 +8822,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9072,13 +8833,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-aria/switch@3.7.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -9087,7 +8848,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9107,7 +8868,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9120,7 +8881,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9135,7 +8896,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9149,7 +8910,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9162,7 +8923,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9173,7 +8934,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9183,7 +8944,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9194,7 +8955,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9207,7 +8968,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9217,7 +8978,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.17 + '@swc/helpers': 0.5.18 clsx: 2.1.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9229,7 +8990,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9238,7 +8999,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9309,7 +9070,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/calendar@3.9.0(react@19.2.3)': @@ -9318,7 +9079,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/checkbox@3.7.2(react@19.2.3)': @@ -9327,13 +9088,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/color@3.9.2(react@19.2.3)': @@ -9346,7 +9107,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/combobox@3.12.0(react@19.2.3)': @@ -9358,13 +9119,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/datepicker@3.15.2(react@19.2.3)': @@ -9376,31 +9137,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/flags@3.1.2': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 '@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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/grid@3.11.6(react@19.2.3)': @@ -9409,7 +9170,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/layout@4.5.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -9420,7 +9181,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9430,7 +9191,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/menu@3.9.8(react@19.2.3)': @@ -9438,7 +9199,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/numberfield@3.10.2(react@19.2.3)': @@ -9447,14 +9208,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/radio@3.11.2(react@19.2.3)': @@ -9463,14 +9224,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/select@3.8.0(react@19.2.3)': @@ -9481,7 +9242,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/selection@3.20.6(react@19.2.3)': @@ -9489,7 +9250,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/slider@3.7.2(react@19.2.3)': @@ -9497,7 +9258,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/table@3.15.1(react@19.2.3)': @@ -9510,7 +9271,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/tabs@3.8.6(react@19.2.3)': @@ -9518,12 +9279,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/toast@3.1.2(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 react: 19.2.3 use-sync-external-store: 1.6.0(react@19.2.3) @@ -9532,14 +9293,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.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/tree@3.9.3(react@19.2.3)': @@ -9548,18 +9309,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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 '@react-stately/utils@3.10.8(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 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.17 + '@swc/helpers': 0.5.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -9991,7 +9752,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.17': + '@swc/helpers@0.5.18': dependencies: tslib: 2.8.1 @@ -10143,7 +9904,7 @@ snapshots: glob: 13.0.0 highlight.js: 11.11.1 lucide-react: 0.555.0(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) + 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) 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) @@ -10333,7 +10094,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.2 - caniuse-lite: 1.0.30001735 + caniuse-lite: 1.0.30001766 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -10429,6 +10190,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.9.18: {} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -10456,7 +10219,7 @@ snapshots: browserslist@4.25.2: dependencies: - caniuse-lite: 1.0.30001735 + caniuse-lite: 1.0.30001766 electron-to-chromium: 1.5.202 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) @@ -10543,15 +10306,11 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.25.2 - caniuse-lite: 1.0.30001741 + caniuse-lite: 1.0.30001766 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001735: {} - - caniuse-lite@1.0.30001741: {} - - caniuse-lite@1.0.30001759: {} + caniuse-lite@1.0.30001766: {} caseless@0.12.0: {} @@ -10651,18 +10410,6 @@ 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: {} @@ -11085,9 +10832,6 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.4: - optional: true - detect-libc@2.1.2: optional: true @@ -11900,9 +11644,6 @@ 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 @@ -12891,11 +12632,11 @@ snapshots: neo-async@2.6.2: {} - 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): + 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): dependencies: - '@next/env': 15.5.9 + '@next/env': 15.5.10 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001741 + caniuse-lite: 1.0.30001766 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -12910,29 +12651,30 @@ 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.3 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - 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): + 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): dependencies: - '@next/env': 16.0.10 + '@next/env': 16.1.5 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001759 + baseline-browser-mapping: 2.9.18 + caniuse-lite: 1.0.30001766 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.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 + '@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 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.5 transitivePeerDependencies: @@ -13753,7 +13495,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.17 + '@swc/helpers': 0.5.18 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) @@ -14213,36 +13955,6 @@ 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 @@ -14321,11 +14033,6 @@ 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: {} @@ -14660,7 +14367,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tar@7.5.4: + tar@7.5.7: 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 aaa25846..a9d9e861 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 57aff4db..018b40eb 100644 --- a/src/app/(main)/pixels/PixelsTable.tsx +++ b/src/app/(main)/pixels/PixelsTable.tsx @@ -14,7 +14,6 @@ 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 e336a3db..d81519d7 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, useResultQuery } from '@/components/hooks'; +import { useMessages, useNavigation, useResultQuery } from '@/components/hooks'; import { File, User } from '@/components/icons'; import { ReportEditButton } from '@/components/input/ReportEditButton'; import { ChangeLabel } from '@/components/metrics/ChangeLabel'; @@ -20,6 +20,8 @@ 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, @@ -36,21 +38,22 @@ export function Funnel({ id, name, type, parameters, websiteId }) { - - - {({ close }) => { - return ( - - - - ); - }} - - + {!isSharePage && ( + + + {({ 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 57bce52f..a56917b7 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, useReportsQuery } from '@/components/hooks'; +import { useDateRange, useNavigation, useReportsQuery } from '@/components/hooks'; import { Funnel } from './Funnel'; import { FunnelAddButton } from './FunnelAddButton'; @@ -13,13 +13,17 @@ 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 b6c4a11d..1d0b96e5 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, useResultQuery } from '@/components/hooks'; +import { useMessages, useNavigation, useResultQuery } from '@/components/hooks'; import { File, User } from '@/components/icons'; import { ReportEditButton } from '@/components/input/ReportEditButton'; import { Lightning } from '@/components/svg'; @@ -25,6 +25,8 @@ 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, @@ -45,21 +47,23 @@ export function Goal({ id, name, type, parameters, websiteId, startDate, endDate - - - {({ close }) => { - return ( - - - - ); - }} - - + {!isSharePage && ( + + + {({ 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 ff7b49fb..fe4550d6 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, useReportsQuery } from '@/components/hooks'; +import { useDateRange, useNavigation, useReportsQuery } from '@/components/hooks'; import { Goal } from './Goal'; import { GoalAddButton } from './GoalAddButton'; @@ -13,13 +13,17 @@ 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 e79576dd..1dee8022 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -6,7 +6,13 @@ import { useMessages, useNavigation, useWebsite } from '@/components/hooks'; import { Edit } from '@/components/icons'; import { ActiveUsers } from '@/components/metrics/ActiveUsers'; -export function WebsiteHeader({ showActions }: { showActions?: boolean }) { +export function WebsiteHeader({ + showActions, + allowLink = true, +}: { + showActions?: boolean; + allowLink?: boolean; +}) { const website = useWebsite(); const { renderUrl, pathname } = useNavigation(); const isSettings = pathname.endsWith('/settings'); @@ -21,7 +27,7 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { } - titleHref={renderUrl(`/websites/${website.id}`, false)} + titleHref={allowLink ? renderUrl(`/websites/${website.id}`, false) : undefined} > diff --git a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx index 7260a7ea..95628dd3 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx @@ -9,11 +9,10 @@ import { WebsiteNav } from './WebsiteNav'; export function WebsiteLayout({ websiteId, children }: { websiteId: string; children: ReactNode }) { return ( - + @@ -116,25 +113,6 @@ 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 deleted file mode 100644 index a16f2dc5..00000000 --- a/src/app/(main)/websites/[websiteId]/settings/ShareCreateForm.tsx +++ /dev/null @@ -1,81 +0,0 @@ -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 c5bd85a6..4b86247a 100644 --- a/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx @@ -5,6 +5,7 @@ import { Form, FormField, FormSubmitButton, + Grid, Label, Loading, Row, @@ -13,25 +14,30 @@ 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; + shareId?: string; + websiteId?: string; onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); - const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(`/share/id/${shareId}`); + const { formatMessage, labels, getErrorMessage } = useMessages(); const { cloudMode } = useConfig(); - const { get } = useApi(); + const { get, post } = useApi(); + const { touch } = useModified(); const { modified } = useModified('shares'); const [share, setShare] = useState(null); - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(!!shareId); + const [isPending, setIsPending] = useState(false); + const [error, setError] = useState(null); + + const isEditing = !!shareId; const getUrl = (slug: string) => { if (cloudMode) { @@ -41,6 +47,8 @@ export function ShareEditForm({ }; useEffect(() => { + if (!shareId) return; + const loadShare = async () => { setIsLoading(true); try { @@ -61,27 +69,35 @@ export function ShareEditForm({ }); }); - await mutateAsync( - { slug: share.slug, parameters }, - { - onSuccess: async () => { - toast(formatMessage(messages.saved)); - touch('shares'); - onSave?.(); - onClose?.(); - }, - }, - ); + 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); + } }; if (isLoading) { return ; } - const url = getUrl(share?.slug || ''); + const url = isEditing ? getUrl(share?.slug || '') : null; // Build default values from share parameters - const defaultValues: Record = {}; + const defaultValues: Record = { + name: share?.name || '', + }; SHARE_NAV_ITEMS.forEach(section => { section.items.forEach(item => { const defaultSelected = item.id === 'overview' || item.id === 'events'; @@ -89,34 +105,60 @@ export function ShareEditForm({ }); }); + // Get all item ids for validation + const allItemIds = SHARE_NAV_ITEMS.flatMap(section => section.items.map(item => item.id)); + return (
- - - - - - {SHARE_NAV_ITEMS.map(section => ( - - {formatMessage((labels as any)[section.section])} - - {section.items.map(item => ( - - {formatMessage((labels as any)[item.label])} - + {({ 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])} + + ))} + + ))} - + + + {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 05e8b357..e997d247 100644 --- a/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx @@ -1,24 +1,25 @@ 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 } from '@/components/hooks'; +import { useConfig, useMessages, useMobile } 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) => { - if (cloudMode) { - return `${process.env.cloudUrl}/share/${slug}`; - } - return `${window?.location.origin}${process.env.basePath || ''}/share/${slug}`; + return `${cloudMode ? process.env.cloudUrl : window?.location.origin}${process.env.basePath || ''}/share/${slug}`; }; return ( - + + {({ name }: any) => name} + + {({ slug }: any) => { const url = getUrl(slug); return ( @@ -28,9 +29,11 @@ export function SharesTable(props: DataTableProps) { ); }} - - {(row: any) => } - + {!isMobile && ( + + {(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 7453b402..49721f1e 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 { ShareCreateForm } from './ShareCreateForm'; +import { ShareEditForm } from './ShareEditForm'; 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, isLoading } = useWebsiteSharesQuery({ websiteId }); + const { data } = 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="400px" + width="600px" > - {({ close }) => } + {({ close }) => }
{hasShares ? ( diff --git a/src/app/api/share/[slug]/route.ts b/src/app/api/share/[slug]/route.ts index ed3271ea..e7d5372f 100644 --- a/src/app/api/share/[slug]/route.ts +++ b/src/app/api/share/[slug]/route.ts @@ -1,7 +1,47 @@ +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 { getShareByCode } from '@/queries/prisma'; +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; +} export async function GET(_request: Request, { params }: { params: Promise<{ slug: string }> }) { const { slug } = await params; @@ -12,12 +52,25 @@ export async function GET(_request: Request, { params }: { params: Promise<{ slu return notFound(); } - const data = { + const website = await getWebsite(share.entityId); + + const data: Record = { shareId: share.id, websiteId: share.entityId, parameters: share.parameters, }; - const token = createToken(data, secret()); - return json({ ...data, token }); + 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); } diff --git a/src/app/api/share/id/[shareId]/route.ts b/src/app/api/share/id/[shareId]/route.ts index da7dcf56..80da17b8 100644 --- a/src/app/api/share/id/[shareId]/route.ts +++ b/src/app/api/share/id/[shareId]/route.ts @@ -25,6 +25,7 @@ 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, }); @@ -36,7 +37,7 @@ export async function POST(request: Request, { params }: { params: Promise<{ sha } const { shareId } = await params; - const { slug, parameters } = body; + const { name, slug, parameters } = body; const share = await getShare(shareId); @@ -49,6 +50,7 @@ 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 db079d49..65d53771 100644 --- a/src/app/api/websites/[websiteId]/shares/route.ts +++ b/src/app/api/websites/[websiteId]/shares/route.ts @@ -44,6 +44,7 @@ export async function POST( { params }: { params: Promise<{ websiteId: string }> }, ) { const schema = z.object({ + name: z.string().max(200), parameters: anyObjectParam.optional(), }); @@ -54,7 +55,8 @@ export async function POST( } const { websiteId } = await params; - const { parameters = {} } = body; + const { name, parameters } = body; + const shareParameters = parameters ?? {}; if (!(await canUpdateWebsite(auth, websiteId))) { return unauthorized(); @@ -66,8 +68,9 @@ export async function POST( id: uuid(), entityId: websiteId, shareType: ENTITY_TYPE.website, + name, slug, - parameters, + parameters: shareParameters, }); return json(share); diff --git a/src/app/share/ShareProvider.tsx b/src/app/share/ShareProvider.tsx new file mode 100644 index 00000000..b83d3794 --- /dev/null +++ b/src/app/share/ShareProvider.tsx @@ -0,0 +1,77 @@ +'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 deleted file mode 100644 index f2948628..00000000 --- a/src/app/share/[...shareId]/Footer.tsx +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index d7b7dcb4..00000000 --- a/src/app/share/[...shareId]/Header.tsx +++ /dev/null @@ -1,24 +0,0 @@ -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/[...shareId]/page.tsx b/src/app/share/[...shareId]/page.tsx deleted file mode 100644 index 3a21f836..00000000 --- a/src/app/share/[...shareId]/page.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { SharePage } from './SharePage'; - -export default async function ({ params }: { params: Promise<{ shareId: string[] }> }) { - const { shareId } = await params; - const [slug, ...path] = shareId; - - return ; -} diff --git a/src/app/share/[...shareId]/ShareNav.tsx b/src/app/share/[slug]/[[...path]]/ShareNav.tsx similarity index 53% rename from src/app/share/[...shareId]/ShareNav.tsx rename to src/app/share/[slug]/[[...path]]/ShareNav.tsx index b494046d..db927afe 100644 --- a/src/app/share/[...shareId]/ShareNav.tsx +++ b/src/app/share/[slug]/[[...path]]/ShareNav.tsx @@ -1,23 +1,30 @@ -'use client'; -import { Column } from '@umami/react-zen'; +import { Button, Column, Icon, Row, Text, ThemeButton } from '@umami/react-zen'; import { SideMenu } from '@/components/common/SideMenu'; -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'; +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'; export function ShareNav({ - shareId, - parameters, + collapsed, + onCollapse, onItemClick, }: { - shareId: string; - parameters: Record; + collapsed?: boolean; + onCollapse?: (collapsed: boolean) => void; onItemClick?: () => void; }) { + const share = useShare(); const { formatMessage, labels } = useMessages(); const { pathname } = useNavigation(); + const { slug, parameters, whiteLabel } = share; - const renderPath = (path: string) => `/share/${shareId}${path}`; + const logoUrl = whiteLabel?.url || 'https://umami.is'; + const logoName = whiteLabel?.name || 'umami'; + const logoImage = whiteLabel?.image; + + const renderPath = (path: string) => `/share/${slug}${path}`; const allItems = [ { @@ -130,14 +137,70 @@ 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/[...shareId]/SharePage.tsx b/src/app/share/[slug]/[[...path]]/SharePage.tsx similarity index 62% rename from src/app/share/[...shareId]/SharePage.tsx rename to src/app/share/[slug]/[[...path]]/SharePage.tsx index 3e1cedc0..aab32c1f 100644 --- a/src/app/share/[...shareId]/SharePage.tsx +++ b/src/app/share/[slug]/[[...path]]/SharePage.tsx @@ -1,6 +1,7 @@ 'use client'; -import { Column, Grid, useTheme } from '@umami/react-zen'; -import { useEffect } from 'react'; +import { Column, Grid, Row, useTheme } from '@umami/react-zen'; +import { usePathname } from 'next/navigation'; +import { useEffect, useState } 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'; @@ -17,9 +18,8 @@ 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 { useShareTokenQuery } from '@/components/hooks'; -import { Footer } from './Footer'; -import { Header } from './Header'; +import { useShare } from '@/components/hooks'; +import { MobileMenuButton } from '@/components/input/MobileMenuButton'; import { ShareNav } from './ShareNav'; const PAGE_COMPONENTS: Record> = { @@ -39,9 +39,25 @@ const PAGE_COMPONENTS: Record attribution: AttributionPage, }; -export function SharePage({ shareId, path = '' }: { shareId: string; path?: string }) { - const { shareToken, isLoading } = useShareTokenQuery(shareId); +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(); const { setTheme } = useTheme(); + const pathname = usePathname(); + const path = getSharePath(pathname); + const { websiteId, parameters = {} } = share; useEffect(() => { const url = new URL(window?.location?.href); @@ -52,12 +68,6 @@ export function SharePage({ shareId, path = '' }: { shareId: string; path?: stri } }, []); - 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; @@ -69,29 +79,25 @@ export function SharePage({ shareId, path = '' }: { shareId: string; path?: stri const PageComponent = PAGE_COMPONENTS[pageKey] || WebsitePage; return ( - -
- - - - - - + + + + {({ close }) => { + return ; + }} + + + + + + + + - - - - - - -