diff --git a/package.json b/package.json index 1de6b69..19f4745 100644 --- a/package.json +++ b/package.json @@ -29,29 +29,29 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.510.0", - "next": "^15.3.2", + "next": "^15.3.3", "next-themes": "^0.4.6", "react": "^19.1.0", "react-dom": "^19.1.0", "react-hook-form": "^7.56.4", "sonner": "^2.0.3", - "zod": "^3.25.32" + "zod": "^3.25.42" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@tailwindcss/postcss": "^4.1.8", - "@types/node": "^20.17.51", + "@types/node": "^20.17.55", "@types/react": "^19.1.6", "@types/react-dom": "^19.1.5", "eslint": "^9.27.0", - "eslint-config-next": "^15.3.2", - "postcss": "^8.5.3", + "eslint-config-next": "^15.3.3", + "postcss": "^8.5.4", "prettier": "^3.5.3", "prettier-plugin-tailwindcss": "^0.6.11", "tailwind-merge": "^3.3.0", "tailwindcss": "^4.1.8", "tailwindcss-animate": "^1.0.7", - "tw-animate-css": "^1.3.0", + "tw-animate-css": "^1.3.2", "typescript": "^5.8.3", "typescript-eslint": "^8.33.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1df98a..f93f9ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,7 +37,7 @@ importers: version: 2.49.8 '@t3-oss/env-nextjs': specifier: ^0.12.0 - version: 0.12.0(typescript@5.8.3)(zod@3.25.32) + version: 0.12.0(typescript@5.8.3)(zod@3.25.42) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -48,8 +48,8 @@ importers: specifier: ^0.510.0 version: 0.510.0(react@19.1.0) next: - specifier: ^15.3.2 - version: 15.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.3.3 + version: 15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -66,8 +66,8 @@ importers: specifier: ^2.0.3 version: 2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) zod: - specifier: ^3.25.32 - version: 3.25.32 + specifier: ^3.25.42 + version: 3.25.42 devDependencies: '@eslint/eslintrc': specifier: ^3.3.1 @@ -76,8 +76,8 @@ importers: specifier: ^4.1.8 version: 4.1.8 '@types/node': - specifier: ^20.17.51 - version: 20.17.51 + specifier: ^20.17.55 + version: 20.17.55 '@types/react': specifier: ^19.1.6 version: 19.1.6 @@ -88,11 +88,11 @@ importers: specifier: ^9.27.0 version: 9.27.0(jiti@2.4.2) eslint-config-next: - specifier: ^15.3.2 - version: 15.3.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^15.3.3 + version: 15.3.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) postcss: - specifier: ^8.5.3 - version: 8.5.3 + specifier: ^8.5.4 + version: 8.5.4 prettier: specifier: ^3.5.3 version: 3.5.3 @@ -109,8 +109,8 @@ importers: specifier: ^1.0.7 version: 1.0.7(tailwindcss@4.1.8) tw-animate-css: - specifier: ^1.3.0 - version: 1.3.0 + specifier: ^1.3.2 + version: 1.3.2 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -356,56 +356,56 @@ packages: '@napi-rs/wasm-runtime@0.2.10': resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} - '@next/env@15.3.2': - resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==} + '@next/env@15.3.3': + resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} - '@next/eslint-plugin-next@15.3.2': - resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} + '@next/eslint-plugin-next@15.3.3': + resolution: {integrity: sha512-VKZJEiEdpKkfBmcokGjHu0vGDG+8CehGs90tBEy/IDoDDKGngeyIStt2MmE5FYNyU9BhgR7tybNWTAJY/30u+Q==} - '@next/swc-darwin-arm64@15.3.2': - resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==} + '@next/swc-darwin-arm64@15.3.3': + resolution: {integrity: sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.2': - resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==} + '@next/swc-darwin-x64@15.3.3': + resolution: {integrity: sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.2': - resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==} + '@next/swc-linux-arm64-gnu@15.3.3': + resolution: {integrity: sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.2': - resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==} + '@next/swc-linux-arm64-musl@15.3.3': + resolution: {integrity: sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.2': - resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==} + '@next/swc-linux-x64-gnu@15.3.3': + resolution: {integrity: sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.2': - resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==} + '@next/swc-linux-x64-musl@15.3.3': + resolution: {integrity: sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.2': - resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==} + '@next/swc-win32-arm64-msvc@15.3.3': + resolution: {integrity: sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.2': - resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==} + '@next/swc-win32-x64-msvc@15.3.3': + resolution: {integrity: sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -932,8 +932,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@20.17.51': - resolution: {integrity: sha512-hccptBl7C8lHiKxTBsY6vYYmqpmw1E/aGR/8fmueE+B390L3pdMOpNSRvFO4ZnXzW5+p2HBXV0yNABd2vdk22Q==} + '@types/node@20.17.55': + resolution: {integrity: sha512-ESpPDUEtW1a9nueMQtcTq/5iY/7osurPpBpFKH2VAyREKdzoFRRod6Oms0SSTfV7u52CcH7b6dFVnjfPD8fxWg==} '@types/phoenix@1.6.6': resolution: {integrity: sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==} @@ -1006,88 +1006,88 @@ packages: resolution: {integrity: sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@unrs/resolver-binding-darwin-arm64@1.7.5': - resolution: {integrity: sha512-efMrMFYcAY+Bg3TjHS9TIxyLW7DCkbmWyaePXA/FTuNNgzUgM9ffBoeA+4g90DjHMUuGyIcM4+96w1RoxNP3Tw==} + '@unrs/resolver-binding-darwin-arm64@1.7.8': + resolution: {integrity: sha512-rsRK8T7yxraNRDmpFLZCWqpea6OlXPNRRCjWMx24O1V86KFol7u2gj9zJCv6zB1oJjtnzWceuqdnCgOipFcJPA==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.7.5': - resolution: {integrity: sha512-K5Usy9LwmeLohtZGOC0IxhybYluGMrtBP/l73jVNKvuk240KmblE6lphSbydrocvEZEVfTfLmba8UeoSUfnh4A==} + '@unrs/resolver-binding-darwin-x64@1.7.8': + resolution: {integrity: sha512-16yEMWa+Olqkk8Kl6Bu0ltT5OgEedkSAsxcz1B3yEctrDYp3EMBu/5PPAGhWVGnwhtf3hNe3y15gfYBAjOv5tQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.7.5': - resolution: {integrity: sha512-4vur1vMwq/hOkruiR24shuatm56jZo098x8ETchIewX8RbSwyTqHjnnJZ1WTLX2Vkg9hgy4RQqFpLnrL6Xp/hQ==} + '@unrs/resolver-binding-freebsd-x64@1.7.8': + resolution: {integrity: sha512-ST4uqF6FmdZQgv+Q73FU1uHzppeT4mhX3IIEmHlLObrv5Ep50olWRz0iQ4PWovadjHMTAmpuJAGaAuCZYb7UAQ==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.5': - resolution: {integrity: sha512-/hD8IHDjlTUb1/ePHavsaHYRF8lMDh+14TXHmxC8cwqrBVoHIzGZV66z2VjBDpDUtmAutptOhfKBpRLv0O0ywA==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.8': + resolution: {integrity: sha512-Z/A/4Rm2VWku2g25C3tVb986fY6unx5jaaCFpx1pbAj0OKkyuJ5wcQLHvNbIcJ9qhiYwXfrkB7JNlxrAbg7YFg==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.5': - resolution: {integrity: sha512-UPrkyN5ziuT+uRATrwabvl8JZNMt1T/fN96bZVnK3E34lQLbku99biFEUHZgXh0knJzoSoAKWfyMyyrcv4Dqfg==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.8': + resolution: {integrity: sha512-HN0p7o38qKmDo3bZUiQa6gP7Qhf0sKgJZtRfSHi6JL2Gi4NaUVF0EO1sQ1RHbeQ4VvfjUGMh3QE5dxEh06BgQQ==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.7.5': - resolution: {integrity: sha512-btpXWiZystUjfNviOWjf7gwjak0h1dSrzjDGn4b8OkSIMw3Gp4yYtOMZRXxUtaaZRdnOQHqRh9+39PyK6LXQbQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.7.8': + resolution: {integrity: sha512-HsoVqDBt9G69AN0KWeDNJW+7i8KFlwxrbbnJffgTGpiZd6Jw+Q95sqkXp8y458KhKduKLmXfVZGnKBTNxAgPjw==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.7.5': - resolution: {integrity: sha512-fzTDlm/RWRgHomLSabeV+/iKkAld+kUQaBJ2h0OveaV6+ZmZqEbdG9WDCe8U3/dax49mlPwZIvEnMZujzTPWCg==} + '@unrs/resolver-binding-linux-arm64-musl@1.7.8': + resolution: {integrity: sha512-VfR2yTDUbUvn+e/Aw22CC9fQg9zdShHAfwWctNBdOk7w9CHWl2OtYlcMvjzMAns8QxoHQoqn3/CEnZ4Ts7hfrA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.5': - resolution: {integrity: sha512-i+9usBSko2DyFvB7iimhfDtIk9tWhg4sKh7kZC8JGfGMdhYWZ8a40VvgE/Xj8iDsX6ngVRsIsgsNCU9jPx86zw==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.8': + resolution: {integrity: sha512-xUauVQNz4uDgs4UJJiUAwMe3N0PA0wvtImh7V0IFu++UKZJhssXbKHBRR4ecUJpUHCX2bc4Wc8sGsB6P+7BANg==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.5': - resolution: {integrity: sha512-gpdNeCckfTMOWyZ+AjB0KpgHE2aCCoGtKDSocKwU9RkfWpeVvpcokey5l1A68WXCDE33sonekbe8Wm4+E0z7VQ==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.8': + resolution: {integrity: sha512-GqyIB+CuSHGhhc8ph5RrurtNetYJjb6SctSHafqmdGcRuGi6uyTMR8l18hMEhZFsXdFMc/MpInPLvmNV22xn+A==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.7.5': - resolution: {integrity: sha512-avni2nC47b0ZBCXL3lg6I3z9lyP1kKVYZXIyIsA/pcTra+Uuq0RgeWeEBc8IJ6DjGrpft7gWyyekrYK58VomGQ==} + '@unrs/resolver-binding-linux-riscv64-musl@1.7.8': + resolution: {integrity: sha512-eEU3rWIFRv60xaAbtsgwHNWRZGD7cqkpCvNtio/f1TjEE3HfKLzPNB24fA9X/8ZXQrGldE65b7UKK3PmO4eWIQ==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.7.5': - resolution: {integrity: sha512-GLv1+kVnVluyG8KRIl176jIoExlhgl3ASZz+VGyQpv5EwD5FqOtZHFzsRJA3xXNQlnHj3iMO4SA/HX4dc6iOvA==} + '@unrs/resolver-binding-linux-s390x-gnu@1.7.8': + resolution: {integrity: sha512-GVLI0f4I4TlLqEUoOFvTWedLsJEdvsD0+sxhdvQ5s+N+m2DSynTs8h9jxR0qQbKlpHWpc2Ortz3z48NHRT4l+w==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.7.5': - resolution: {integrity: sha512-frsoBmP2ww2axFqZvIexnDF5UuO0exCZjrchM7uvPbNzZCaU+B43r6Y3ywEFsXXH6MbZNpw10Ntuwb9N0orfcg==} + '@unrs/resolver-binding-linux-x64-gnu@1.7.8': + resolution: {integrity: sha512-GX1pZ/4ncUreB0Rlp1l7bhKAZ8ZmvDIgXdeb5V2iK0eRRF332+6gRfR/r5LK88xfbtOpsmRHU6mQ4N8ZnwvGEA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.7.5': - resolution: {integrity: sha512-kdI20RI0k+XcA+vuW6KB/EJbzUvRfo8PsKy2DFlX1fhTVsEXaf21nkU9C3NdTwlTkl9YvvLGNTKoJDH7yn7K8w==} + '@unrs/resolver-binding-linux-x64-musl@1.7.8': + resolution: {integrity: sha512-n1N84MnsvDupzVuYqJGj+2pb9s8BI1A5RgXHvtVFHedGZVBCFjDpQVRlmsFMt6xZiKwDPaqsM16O/1isCUGt7w==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.7.5': - resolution: {integrity: sha512-6F+PAhfsokXDtLihQzomvVK0rYzSP/qkgJg4+R4RaCmE3pwFspLeyUi1Wd11hwP4FQQn5/5Yw9jraUMQpMPWCg==} + '@unrs/resolver-binding-wasm32-wasi@1.7.8': + resolution: {integrity: sha512-x94WnaU5g+pCPDVedfnXzoG6lCOF2xFGebNwhtbJCWfceE94Zj8aysSxdxotlrZrxnz5D3ijtyFUYtpz04n39Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.7.5': - resolution: {integrity: sha512-rZ1SRHK95gOqy7hQBcG2sxKMoKFRFAl8f+cGYayA3RRNidkY86uNsXZiWDGgIuelYXSudvAd9RElDib/Lkx7pQ==} + '@unrs/resolver-binding-win32-arm64-msvc@1.7.8': + resolution: {integrity: sha512-vst2u8EJZ5L6jhJ6iLis3w9rg16aYqRxQuBAMYQRVrPMI43693hLP7DuqyOBRKgsQXy9/jgh204k0ViHkqQgdg==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.7.5': - resolution: {integrity: sha512-49JiW5JickDuC/VqSBlbZTqwX8sJBGBfodU/v4+vM8Eig63JOAK7bOtG8M8kxXRrkJIGhumba4cTf4QcWbMRcg==} + '@unrs/resolver-binding-win32-ia32-msvc@1.7.8': + resolution: {integrity: sha512-yb3LZOLMFqnA+/ShlE1E5bpYPGDsA590VHHJPB+efnyowT776GJXBoh82em6O9WmYBUq57YblGTcMYAFBm72HA==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.7.5': - resolution: {integrity: sha512-69JcsNlbafX/FsafXswKb5M+jPXC9IRcNVz5SqEKH9+PA5jmJ6+fFyjFX1pipBRADGn+EuPhCeDcQl+CAxP+2g==} + '@unrs/resolver-binding-win32-x64-msvc@1.7.8': + resolution: {integrity: sha512-hHKFx+opG5BA3/owMXon8ypwSotBGTdblG6oda/iOu9+OEYnk0cxD2uIcGyGT8jCK578kV+xMrNxqbn8Zjlpgw==} cpu: [x64] os: [win32] @@ -1203,8 +1203,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001718: - resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + caniuse-lite@1.0.30001720: + resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1317,8 +1317,8 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - es-abstract@1.23.10: - resolution: {integrity: sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -1353,8 +1353,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.3.2: - resolution: {integrity: sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==} + eslint-config-next@15.3.3: + resolution: {integrity: sha512-QJLv/Ouk2vZnxL4b67njJwTLjTf7uZRltI0LL4GERYR4qMF5z08+gxkfODAeaK7TiC6o+cER91bDaEnwrTWV6Q==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -1680,6 +1680,10 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -1916,8 +1920,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.2: - resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==} + next@15.3.3: + resolution: {integrity: sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -2019,8 +2023,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2256,6 +2260,10 @@ packages: stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -2354,8 +2362,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tw-animate-css@1.3.0: - resolution: {integrity: sha512-jrJ0XenzS9KVuDThJDvnhalbl4IYiMQ/XvpA0a2FL8KmlK+6CSMviO7ROY/I7z1NnUs5NnDhlM6fXmF40xPxzw==} + tw-animate-css@1.3.2: + resolution: {integrity: sha512-khGYcg4sHWFWcjpiWvy0KN0Bd6yVy6Ecc4r9ZP2u7FV+n4/Fp8MQscCWJkM0KMIRvrpGyKpIQnIbEd1hrewdeg==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -2396,8 +2404,8 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - unrs-resolver@1.7.5: - resolution: {integrity: sha512-DnuJxogme0dCRIdH+yIwpaNLWfff9DqcpfDh4J8qca17rOnu6e3AfNzB8mnUzjv7EgayXQkwnt1A2vT8BM9ZHA==} + unrs-resolver@1.7.8: + resolution: {integrity: sha512-2zsXwyOXmCX9nGz4vhtZRYhe30V78heAv+KDc21A/KMdovGHbZcixeD5JHEF0DrFXzdytwuzYclcPbvp8A3Jlw==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2478,8 +2486,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@3.25.32: - resolution: {integrity: sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==} + zod@3.25.42: + resolution: {integrity: sha512-PcALTLskaucbeHc41tU/xfjfhcz8z0GdhhDcSgrCTmSazUuqnYqiXO63M0QUBVwpBlsLsNVn5qHSC5Dw3KZvaQ==} snapshots: @@ -2694,34 +2702,34 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@next/env@15.3.2': {} + '@next/env@15.3.3': {} - '@next/eslint-plugin-next@15.3.2': + '@next/eslint-plugin-next@15.3.3': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.3.2': + '@next/swc-darwin-arm64@15.3.3': optional: true - '@next/swc-darwin-x64@15.3.2': + '@next/swc-darwin-x64@15.3.3': optional: true - '@next/swc-linux-arm64-gnu@15.3.2': + '@next/swc-linux-arm64-gnu@15.3.3': optional: true - '@next/swc-linux-arm64-musl@15.3.2': + '@next/swc-linux-arm64-musl@15.3.3': optional: true - '@next/swc-linux-x64-gnu@15.3.2': + '@next/swc-linux-x64-gnu@15.3.3': optional: true - '@next/swc-linux-x64-musl@15.3.2': + '@next/swc-linux-x64-musl@15.3.3': optional: true - '@next/swc-win32-arm64-msvc@15.3.2': + '@next/swc-win32-arm64-msvc@15.3.3': optional: true - '@next/swc-win32-x64-msvc@15.3.2': + '@next/swc-win32-x64-msvc@15.3.3': optional: true '@nodelib/fs.scandir@2.1.5': @@ -3097,17 +3105,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.32)': + '@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.42)': optionalDependencies: typescript: 5.8.3 - zod: 3.25.32 + zod: 3.25.42 - '@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.32)': + '@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.42)': dependencies: - '@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.32) + '@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.42) optionalDependencies: typescript: 5.8.3 - zod: 3.25.32 + zod: 3.25.42 '@tailwindcss/node@4.1.8': dependencies: @@ -3178,7 +3186,7 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.1.8 '@tailwindcss/oxide': 4.1.8 - postcss: 8.5.3 + postcss: 8.5.4 tailwindcss: 4.1.8 '@tybys/wasm-util@0.9.0': @@ -3192,7 +3200,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@20.17.51': + '@types/node@20.17.55': dependencies: undici-types: 6.19.8 @@ -3208,7 +3216,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.17.51 + '@types/node': 20.17.55 '@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: @@ -3302,57 +3310,57 @@ snapshots: '@typescript-eslint/types': 8.33.0 eslint-visitor-keys: 4.2.0 - '@unrs/resolver-binding-darwin-arm64@1.7.5': + '@unrs/resolver-binding-darwin-arm64@1.7.8': optional: true - '@unrs/resolver-binding-darwin-x64@1.7.5': + '@unrs/resolver-binding-darwin-x64@1.7.8': optional: true - '@unrs/resolver-binding-freebsd-x64@1.7.5': + '@unrs/resolver-binding-freebsd-x64@1.7.8': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.5': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.8': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.5': + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.8': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.7.5': + '@unrs/resolver-binding-linux-arm64-gnu@1.7.8': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.7.5': + '@unrs/resolver-binding-linux-arm64-musl@1.7.8': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.5': + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.8': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.5': + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.8': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.7.5': + '@unrs/resolver-binding-linux-riscv64-musl@1.7.8': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.7.5': + '@unrs/resolver-binding-linux-s390x-gnu@1.7.8': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.7.5': + '@unrs/resolver-binding-linux-x64-gnu@1.7.8': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.7.5': + '@unrs/resolver-binding-linux-x64-musl@1.7.8': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.7.5': + '@unrs/resolver-binding-wasm32-wasi@1.7.8': dependencies: '@napi-rs/wasm-runtime': 0.2.10 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.7.5': + '@unrs/resolver-binding-win32-arm64-msvc@1.7.8': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.7.5': + '@unrs/resolver-binding-win32-ia32-msvc@1.7.8': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.7.5': + '@unrs/resolver-binding-win32-x64-msvc@1.7.8': optional: true acorn-jsx@5.3.2(acorn@8.14.1): @@ -3389,7 +3397,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -3398,7 +3406,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -3408,7 +3416,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -3417,21 +3425,21 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -3440,7 +3448,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -3495,7 +3503,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001718: {} + caniuse-lite@1.0.30001720: {} chalk@4.1.2: dependencies: @@ -3605,7 +3613,7 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.2 - es-abstract@1.23.10: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -3634,7 +3642,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -3649,6 +3659,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -3668,7 +3679,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -3705,9 +3716,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.3.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3): + eslint-config-next@15.3.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@next/eslint-plugin-next': 15.3.2 + '@next/eslint-plugin-next': 15.3.3 '@rushstack/eslint-patch': 1.11.0 '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) @@ -3742,7 +3753,7 @@ snapshots: is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.14 - unrs-resolver: 1.7.5 + unrs-resolver: 1.7.8 optionalDependencies: eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)) transitivePeerDependencies: @@ -4125,6 +4136,8 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -4327,26 +4340,26 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next@15.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.3.2 + '@next/env': 15.3.3 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001718 + caniuse-lite: 1.0.30001720 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) styled-jsx: 5.1.6(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.2 - '@next/swc-darwin-x64': 15.3.2 - '@next/swc-linux-arm64-gnu': 15.3.2 - '@next/swc-linux-arm64-musl': 15.3.2 - '@next/swc-linux-x64-gnu': 15.3.2 - '@next/swc-linux-x64-musl': 15.3.2 - '@next/swc-win32-arm64-msvc': 15.3.2 - '@next/swc-win32-x64-msvc': 15.3.2 + '@next/swc-darwin-arm64': 15.3.3 + '@next/swc-darwin-x64': 15.3.3 + '@next/swc-linux-arm64-gnu': 15.3.3 + '@next/swc-linux-arm64-musl': 15.3.3 + '@next/swc-linux-x64-gnu': 15.3.3 + '@next/swc-linux-x64-musl': 15.3.3 + '@next/swc-win32-arm64-msvc': 15.3.3 + '@next/swc-win32-x64-msvc': 15.3.3 sharp: 0.34.2 transitivePeerDependencies: - '@babel/core' @@ -4378,14 +4391,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: @@ -4441,7 +4454,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.3: + postcss@8.5.4: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -4509,7 +4522,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -4671,20 +4684,25 @@ snapshots: stable-hash@0.0.5: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + streamsearch@1.1.0: {} string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -4698,7 +4716,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -4706,7 +4724,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.10 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -4781,7 +4799,7 @@ snapshots: tslib@2.8.1: {} - tw-animate-css@1.3.0: {} + tw-animate-css@1.3.2: {} type-check@0.4.0: dependencies: @@ -4841,27 +4859,27 @@ snapshots: undici-types@6.19.8: {} - unrs-resolver@1.7.5: + unrs-resolver@1.7.8: dependencies: napi-postinstall: 0.2.4 optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.7.5 - '@unrs/resolver-binding-darwin-x64': 1.7.5 - '@unrs/resolver-binding-freebsd-x64': 1.7.5 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.5 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.5 - '@unrs/resolver-binding-linux-arm64-gnu': 1.7.5 - '@unrs/resolver-binding-linux-arm64-musl': 1.7.5 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.5 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.5 - '@unrs/resolver-binding-linux-riscv64-musl': 1.7.5 - '@unrs/resolver-binding-linux-s390x-gnu': 1.7.5 - '@unrs/resolver-binding-linux-x64-gnu': 1.7.5 - '@unrs/resolver-binding-linux-x64-musl': 1.7.5 - '@unrs/resolver-binding-wasm32-wasi': 1.7.5 - '@unrs/resolver-binding-win32-arm64-msvc': 1.7.5 - '@unrs/resolver-binding-win32-ia32-msvc': 1.7.5 - '@unrs/resolver-binding-win32-x64-msvc': 1.7.5 + '@unrs/resolver-binding-darwin-arm64': 1.7.8 + '@unrs/resolver-binding-darwin-x64': 1.7.8 + '@unrs/resolver-binding-freebsd-x64': 1.7.8 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.8 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.8 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.8 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.8 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.8 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.8 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.8 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.8 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.8 + '@unrs/resolver-binding-linux-x64-musl': 1.7.8 + '@unrs/resolver-binding-wasm32-wasi': 1.7.8 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.8 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.8 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.8 uri-js@4.4.1: dependencies: @@ -4946,4 +4964,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@3.25.32: {} + zod@3.25.42: {} diff --git a/src/app/(auth-pages)/auth/callback/route.ts b/src/app/(auth-pages)/auth/callback/route.ts index 0e334d8..f0c360a 100644 --- a/src/app/(auth-pages)/auth/callback/route.ts +++ b/src/app/(auth-pages)/auth/callback/route.ts @@ -1,24 +1,77 @@ +'use server'; + +import 'server-only'; import { createServerClient } from '@/utils/supabase'; import { NextResponse } from 'next/server'; -export async function GET(request: Request) { - // The `/auth/callback` route is required for the server-side auth flow implemented - // by the SSR package. It exchanges an auth code for the user's session. - // https://supabase.com/docs/guides/auth/server-side/nextjs +export const GET = async (request: Request) => { const requestUrl = new URL(request.url); const code = requestUrl.searchParams.get('code'); + const token = requestUrl.searchParams.get('token'); + const type = requestUrl.searchParams.get('type'); const origin = requestUrl.origin; const redirectTo = requestUrl.searchParams.get('redirect_to')?.toString(); + const supabase = await createServerClient(); + + if (token && type) { + try { + if (type === 'signup') { + // Confirm email signup + const { error } = await supabase.auth.verifyOtp({ + token_hash: token, + type: 'signup', + }); + + if (error) { + console.error('Email confirmation error:', error); + return NextResponse.redirect(`${origin}/sign-in?error=Invalid or expired confirmation link`); + } + } else if (type === 'recovery') { + // Handle password recovery + const { error } = await supabase.auth.verifyOtp({ + token_hash: token, + type: 'recovery', + }); + + if (error) { + console.error('Password recovery error:', error); + return NextResponse.redirect(`${origin}/sign-in?error=Invalid or expired reset link`); + } else { + return NextResponse.redirect(`${origin}/reset-password`); + } + } else if (type === 'email_change') { + // Handle email change + const { error } = await supabase.auth.verifyOtp({ + token_hash: token, + type: 'email_change', + }); + + if (error) { + console.error('Email change error:', error); + return NextResponse.redirect(`${origin}/profile?error=Invalid or expired email change link`); + } + } + } catch (error) { + console.error('Verification error:', error); + return NextResponse.redirect(`${origin}/sign-in?error=Verification failed`); + } + } + + // Handle code-based flow (OAuth, etc.) if (code) { - const supabase = await createServerClient(); await supabase.auth.exchangeCodeForSession(code); } + // Handle redirect if (redirectTo) { - return NextResponse.redirect(`${origin}${redirectTo}`); + try { + new URL(redirectTo); + return NextResponse.redirect(redirectTo); + } catch { + return NextResponse.redirect(`${origin}${redirectTo}`); + } } - // URL to redirect to after sign up process completes return NextResponse.redirect(origin); } diff --git a/src/app/(auth-pages)/auth/callback/route.ts.bak b/src/app/(auth-pages)/auth/callback/route.ts.bak new file mode 100644 index 0000000..a3bade1 --- /dev/null +++ b/src/app/(auth-pages)/auth/callback/route.ts.bak @@ -0,0 +1,24 @@ +import { createServerClient } from '@/utils/supabase'; +import { NextResponse } from 'next/server'; + +export const GET = async (request: Request) => { + // The `/auth/callback` route is required for the server-side auth flow implemented + // by the SSR package. It exchanges an auth code for the user's session. + // https://supabase.com/docs/guides/auth/server-side/nextjs + const requestUrl = new URL(request.url); + const code = requestUrl.searchParams.get('code'); + const origin = requestUrl.origin; + const redirectTo = requestUrl.searchParams.get('redirect_to')?.toString(); + + if (code) { + const supabase = await createServerClient(); + await supabase.auth.exchangeCodeForSession(code); + } + + if (redirectTo) { + return NextResponse.redirect(`${origin}${redirectTo}`); + } + + // URL to redirect to after sign up process completes + return NextResponse.redirect(origin); +} diff --git a/src/app/(auth-pages)/sign-in/page.tsx b/src/app/(auth-pages)/sign-in/page.tsx index 87ac74b..44e5be2 100644 --- a/src/app/(auth-pages)/sign-in/page.tsx +++ b/src/app/(auth-pages)/sign-in/page.tsx @@ -3,7 +3,6 @@ import { getUser, signIn } from '@/lib/actions'; import { FormMessage, type Message, SubmitButton } from '@/components/default'; import { Input, Label } from '@/components/ui'; import { redirect } from 'next/navigation'; -import type { User } from '@/utils/supabase'; const Login = async (props: { searchParams: Promise }) => { const searchParams = await props.searchParams; diff --git a/src/components/context/auth.tsx b/src/components/context/auth.tsx index 5bb49f6..018a2a7 100644 --- a/src/components/context/auth.tsx +++ b/src/components/context/auth.tsx @@ -2,7 +2,7 @@ import React, { createContext, useContext, useState, useEffect, type ReactNode } from 'react'; import { getUser, getProfile, updateProfile as updateProfileAction, getSignedUrl } from '@/lib/actions'; -import type { User, Profile } from '@/utils/supabase'; +import { type User, type Profile, createClient } from '@/utils/supabase'; import { toast } from 'sonner'; type AuthContextType = { @@ -72,15 +72,32 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { }; useEffect(() => { + const supabase = createClient(); fetchUserData().catch((error) => { console.error('Error fetching user data:', error); }); + + const { + data: { subscription }, + } = supabase.auth.onAuthStateChange(async (event, session) => { + if (event === 'SIGNED_IN' || event === 'TOKEN_REFRESHED') { + await fetchUserData(); + } else if (event === 'SIGNED_OUT') { + setUser(null); + setProfile(null); + setAvatarUrl(null); + setIsLoading(false); + } + }); const intervalId = setInterval(() => { void fetchUserData(); - }, 30 * 60 * 1000); + }, 1 * 60 * 1000); - return () => clearInterval(intervalId); + return () => { + subscription.unsubscribe(); + clearInterval(intervalId); + }; }, []); const updateProfile = async (data: { diff --git a/src/lib/actions/auth.ts b/src/lib/actions/auth.ts index c071edd..4498bb7 100644 --- a/src/lib/actions/auth.ts +++ b/src/lib/actions/auth.ts @@ -3,17 +3,18 @@ import 'server-only'; import { encodedRedirect } from '@/utils/utils'; import { createServerClient } from '@/utils/supabase'; -import type { User } from '@supabase/supabase-js'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; +import type { User } from '@/utils/supabase'; import type { Result } from './index'; +import { revalidatePath } from 'next/cache'; export const signUp = async (formData: FormData) => { const name = formData.get('name') as string; const email = formData.get('email') as string; const password = formData.get('password') as string; const supabase = await createServerClient(); - //const origin = (await headers()).get('origin'); + const origin = (await headers()).get('origin'); if (!email || !password) { return encodedRedirect( @@ -23,36 +24,26 @@ export const signUp = async (formData: FormData) => { ); } - const { data, error } = await supabase.auth.signUp({ + const { error } = await supabase.auth.signUp({ email, password, - //options: { - //emailRedirectTo: `${origin}/auth/callback`, - //}, + options: { + emailRedirectTo: `${origin}/auth/callback`, + data: { + full_name: name, + email, + provider: 'email', + }, + }, }); - if (error) { - return redirect('/'); - //return encodedRedirect('error', '/sign-up', - //'Thanks for signing up! Please check your email for a verification link.'); + return encodedRedirect('error', '/sign-up', error.message); } else { - try { - if (!data.user) throw new Error('Could not sign up'); - const { error } = await supabase - .from('profiles') - .update({ - full_name: name, - provider: 'email', - }) - .eq('id', data.user.id); - if (error) throw new Error('Could not update profile'); - } catch (error) { - console.error('Error updating profile: ', error); - } finally { - return redirect('/'); - //return encodedRedirect('success', '/', - //'Thanks for signing up! Please check your email for a verification link.); - } + return encodedRedirect( + 'success', + '/sign-up', + 'Thanks for signing up! Please check your email for a verification link.', + ); } }; @@ -68,8 +59,9 @@ export const signIn = async (formData: FormData) => { if (error) { return encodedRedirect('error', '/sign-in', error.message); + } else { + return redirect('/'); } - return redirect('/'); }; export const forgotPassword = async (formData: FormData) => { @@ -147,10 +139,8 @@ export const resetPassword = async ( export const resetPasswordFromEmail = async (formData: FormData) => { - const password = formData.get('password') as string; const confirmPassword = formData.get('confirmPassword') as string; - if (!password || !confirmPassword) { encodedRedirect( 'error', @@ -158,7 +148,6 @@ export const resetPasswordFromEmail = async (formData: FormData) => { 'Password and confirm password are required', ); } - const supabase = await createServerClient(); if (password !== confirmPassword) { diff --git a/src/lib/hooks/resizeImage.ts b/src/lib/hooks/resizeImage.ts index 7debd9e..1a4df2f 100644 --- a/src/lib/hooks/resizeImage.ts +++ b/src/lib/hooks/resizeImage.ts @@ -45,7 +45,7 @@ export const resizeImage = async ({ (blob) => { if (!blob) return; const resizedFile = new File([blob], file.name, { - type: 'imgage/jpeg', + type: 'image/jpeg', lastModified: Date.now(), }); resolve(resizedFile); diff --git a/src/server/db/schema.sql b/src/server/db/schema.sql index b140b0b..21958bc 100644 --- a/src/server/db/schema.sql +++ b/src/server/db/schema.sql @@ -76,8 +76,24 @@ create policy "Anyone can upload an avatar." on storage.objects -- CREATE POLICY "Public statuses are viewable by everyone." ON statuses -- FOR SELECT USING (true); --- CREATE POLICY "Users can insert statuses for any user." ON statuses - -- FOR INSERT WITH CHECK (auth.role() = 'authenticated'); +-- -- RECREATE it using the recommended sub-select form +-- CREATE POLICY "Authenticated users can insert statuses for any user." + -- ON public.statuses + -- FOR INSERT + -- WITH CHECK ( + -- (SELECT auth.role()) = 'authenticated' + -- ); + +-- -- ADD an UPDATE policy so anyone signed-in can update *any* status +-- CREATE POLICY "Authenticated users can update statuses for any user." + -- ON public.statuses + -- FOR UPDATE + -- USING ( + -- (SELECT auth.role()) = 'authenticated' + -- ) + -- WITH CHECK ( + -- (SELECT auth.role()) = 'authenticated' + -- ); -- -- Function to add first status -- CREATE FUNCTION public.handle_first_status() diff --git a/src/utils/supabase/client.ts b/src/utils/supabase/client.ts index f2f99d7..a48c184 100644 --- a/src/utils/supabase/client.ts +++ b/src/utils/supabase/client.ts @@ -1,3 +1,5 @@ +'use client'; + import { createBrowserClient } from '@supabase/ssr'; import type { Database } from '@/utils/supabase/types'; diff --git a/src/utils/supabase/server.ts b/src/utils/supabase/server.ts index 7d3ce88..d493c0c 100644 --- a/src/utils/supabase/server.ts +++ b/src/utils/supabase/server.ts @@ -1,3 +1,6 @@ +'use server' + +import 'server-only'; import { createServerClient as CreateServerClient } from '@supabase/ssr'; import type { Database } from '@/utils/supabase/types'; import { cookies } from 'next/headers';