From 8ee212eac4545f0c370d319256453d23518f1890 Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 20:05:45 +0100 Subject: [PATCH 01/21] chore: fix broken lockfile after merge conflict --- frontend/pnpm-lock.yaml | 904 ++++++++++++++++++---------------------- 1 file changed, 398 insertions(+), 506 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 6073792..57cb2fc 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -19,13 +19,13 @@ importers: version: 5.3.0 '@icons-pack/react-simple-icons': specifier: ^13.15.1 - version: 13.15.1(react@19.3.0) + version: 13.15.1(react@19.3.1) '@react-router/node': specifier: ^8.5.0 - version: 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) + version: 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) '@react-router/serve': specifier: ^8.5.0 - version: 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) + version: 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) '@tailwindcss/vite': specifier: ^4.3.3 version: 4.3.3(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) @@ -34,7 +34,7 @@ importers: version: 1.33.5(react-dom@19.3.1(react@19.3.1))(react@19.3.1) better-auth: specifier: ^1.7.12 - version: 1.7.12(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))) + version: 1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -49,7 +49,7 @@ importers: version: 5.2.2 lucide-react: specifier: ^1.61.0 - version: 1.61.0(@types/react@19.3.0)(react@19.3.1) + version: 1.63.0(@types/react@19.3.0)(react@19.3.1) react: specifier: ^19.3.1 version: 19.3.1 @@ -58,13 +58,13 @@ importers: version: 19.3.1(react@19.3.1) react-router: specifier: ^8.5.0 - version: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + version: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) rxjs: specifier: ^7.8.2 version: 7.8.2 shadcn: specifier: ^4.22.1 - version: 4.22.1 + version: 4.23.0 tailwindcss: specifier: ^4.3.3 version: 4.3.3 @@ -89,10 +89,10 @@ importers: version: 7.4.6(@types/node@24.19.2)(graphql@17.0.2)(typescript@6.0.3) '@graphql-codegen/typescript-operations': specifier: ^6.1.10 - version: 6.1.10(graphql@17.0.2) + version: 6.2.0(graphql@17.0.2) '@react-router/dev': specifier: ^8.5.0 - version: 8.5.0(@react-router/serve@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + version: 8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) '@rolldown/plugin-babel': specifier: ^0.2.4 version: 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) @@ -149,7 +149,7 @@ importers: version: 6.0.3 typescript-eslint: specifier: ^8.72.0 - version: 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + version: 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) vite: specifier: ^8.3.5 version: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) @@ -186,8 +186,8 @@ packages: peerDependencies: graphql: '*' - '@asamuzakjp/css-color@7.1.7': - resolution: {integrity: sha512-Q7ioeear07HwixdIitIn9KS1LZi97CEDFCSjPNm9v+y8KNbsu9q4Lrd4zUQW4faED+E7qxvfeVnbNRW46wFKuw==} + '@asamuzakjp/css-color@7.1.9': + resolution: {integrity: sha512-vZ6JQVq8Ivgz6b/IBlAf90wZviXdluY13cQOPO+nJHbmXwGrPl2GcpqUY7a55/8ZVdfONXpCFMpRijOBCHNlcQ==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} '@asamuzakjp/dom-selector@10.0.5': @@ -357,11 +357,11 @@ packages: '@types/react': optional: true - '@better-auth/core@1.7.12': - resolution: {integrity: sha512-SUStBGHJ13KnSO6+7U/1DSlfuOtln4jtOrFZqzQtxZVHZIrAoMjwHNGitlF+s7hvKbuC3Z14xjnqfLLqIqGfxw==} + '@better-auth/core@1.7.14': + resolution: {integrity: sha512-ByhdrGVwp/el+hoTYKSVOHIH23/lQj9TQ1txdGcWOg22tnfr3hJ6ukzySooeYj/R36XsQgBhkJqIp8mKsNeErA==} peerDependencies: '@better-auth/utils': ^0.4.2 || ^0.5.0 - '@better-fetch/fetch': 1.3.2 + '@better-fetch/fetch': 1.3.3 '@opentelemetry/api': ^1.9.0 better-call: 1.4.4 jose: ^6.1.0 @@ -371,46 +371,46 @@ packages: '@opentelemetry/api': optional: true - '@better-auth/drizzle-adapter@1.7.12': - resolution: {integrity: sha512-Qzoyuf05aK01Pc0k3EXv8Xj3XCT2m2dCWc5HoB7x+xX6N3Pm2eQsca+UIArsJcbuNEWWP3L51oIebnBoHJ5DTw==} + '@better-auth/drizzle-adapter@1.7.14': + resolution: {integrity: sha512-5RC8Ec5Ur15FWsS4As9/VrlRbB3+9EfShxIpA5A1FcD6IgPxFvzQNkAm2+FYx9LUSqx47NPf9hBTG2GUCMP9Ig==} peerDependencies: - '@better-auth/core': ^1.7.12 + '@better-auth/core': ^1.7.14 '@better-auth/utils': ^0.4.2 || ^0.5.0 drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 peerDependenciesMeta: drizzle-orm: optional: true - '@better-auth/kysely-adapter@1.7.12': - resolution: {integrity: sha512-1PaFXktLv4n3DmrGbPaCj5SsvcT40NnWw7NLua5/J1+8/A051N5ZzqOwJifXEIQX5k6NdwvmymwDQxKytduEAQ==} + '@better-auth/kysely-adapter@1.7.14': + resolution: {integrity: sha512-4wkqj8a8JVpWDYLlgzfbk7eOaWCFkL6HHQd6CLamFKaC8vNsXew1x4v5dE5O6dGr8j4g5qMISS+BAvOuIvBevg==} peerDependencies: - '@better-auth/core': ^1.7.12 + '@better-auth/core': ^1.7.14 '@better-auth/utils': ^0.4.2 || ^0.5.0 kysely: ^0.28.17 || ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@better-auth/memory-adapter@1.7.12': - resolution: {integrity: sha512-glaDwXzDptnddHqRuu7fj47FAssUcOzLNgdlTGJoEPrspkX69x2vnXwgAzNuApjZI21WLtPH/rQ6CN+DQGybPA==} + '@better-auth/memory-adapter@1.7.14': + resolution: {integrity: sha512-Ojv9BcmFyHuTHha9ZM/NUW1ut9J84wLngta+07Es0Ejn8kekqP5aHBpZd5Z8AvADs5iJUOWvQGFmGlPWAKJgBg==} peerDependencies: - '@better-auth/core': ^1.7.12 + '@better-auth/core': ^1.7.14 '@better-auth/utils': ^0.4.2 || ^0.5.0 - '@better-auth/mongo-adapter@1.7.12': - resolution: {integrity: sha512-HKV4sgYSw/Gdt9AuHlESMkiKL72SWdGweDy1Wsyxoh06BpG7aNu4aSJ7marNpMdKZteyRbxWWqQkA9ediA8qFw==} + '@better-auth/mongo-adapter@1.7.14': + resolution: {integrity: sha512-6IA0RSPZFMdRwwnLZ9oWnDIiD0y0o0azTHUfa01BNU2AFJgMDkeiASUV3bKcJBskzQoyQrff74eFYTsTSeeVUQ==} peerDependencies: - '@better-auth/core': ^1.7.12 + '@better-auth/core': ^1.7.14 '@better-auth/utils': ^0.4.2 || ^0.5.0 mongodb: ^6.0.0 || ^7.0.0 peerDependenciesMeta: mongodb: optional: true - '@better-auth/prisma-adapter@1.7.12': - resolution: {integrity: sha512-FZRX6ORbwhDmeYE1Tl0IPtUn8v3BlVFgbJxDnm/DCNHxuFRf+0t4HfddUgYeYehHFR8aSDsdYX44fEFWM9877w==} + '@better-auth/prisma-adapter@1.7.14': + resolution: {integrity: sha512-mF6t5xqeZNWzUe0ErmrSdzQmtslJscmu9X8Mp5QmROlpnnAzvSc70RILu8lHms8CePt7N34+KRH1QvYjGFrVGQ==} peerDependencies: - '@better-auth/core': ^1.7.12 + '@better-auth/core': ^1.7.14 '@better-auth/utils': ^0.4.2 || ^0.5.0 '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -420,18 +420,18 @@ packages: prisma: optional: true - '@better-auth/telemetry@1.7.12': - resolution: {integrity: sha512-DaDkKNnI99vKGGbWq9KJg2uYeaOjsK9nIBw9T2m2KG/RkxpvQRjYkZ00++up2bZQkR5pB1nukGbplza3UJG/Xg==} + '@better-auth/telemetry@1.7.14': + resolution: {integrity: sha512-PtKFzsH7gje/WJuUPDjckOoNFazsq8NMt3AdiXIPzHl7tZULcNGTKAX8K7+yn0rG6cO/4mtMgpOjhtilElOnmg==} peerDependencies: - '@better-auth/core': ^1.7.12 + '@better-auth/core': ^1.7.14 '@better-auth/utils': ^0.4.2 || ^0.5.0 - '@better-fetch/fetch': 1.3.2 + '@better-fetch/fetch': 1.3.3 - '@better-auth/utils@0.5.0': - resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==} + '@better-auth/utils@0.5.1': + resolution: {integrity: sha512-WETqw5vQ52uQ/xwWR4E8rTgT6fDEr/wnS+otDNkBCa/69281FCF32OKDdQUcahMCnjsvqXBNiEvAQHFB0EVRRg==} - '@better-fetch/fetch@1.3.2': - resolution: {integrity: sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow==} + '@better-fetch/fetch@1.3.3': + resolution: {integrity: sha512-U6SlDt/GUWtK2JAxS/NhdoYTEim+EL1G5byz2TUj83KjLZBUpYzb5SmX0aXaCnbGkAjFKnV/o/0+cyXMbEcqqg==} '@bramus/specificity@2.4.3': resolution: {integrity: sha512-0GEz8qJWokkUVYQYRukmkSHIFNoBH8QTreeHrAFbvz1XFYc3Y+puhMs8PQ5x8GNugiC2l5jvDBXKLbBIByeSBw==} @@ -694,8 +694,8 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-codegen/typescript-operations@6.1.10': - resolution: {integrity: sha512-hTnwAwQI+/lV0mAlWV0Jg7jBo2XCC++8+njr0meDHQbeAJSH6Pew1ZIcmLVvQUsQNSQwNoR4SKftHbDvq6KoNA==} + '@graphql-codegen/typescript-operations@6.2.0': + resolution: {integrity: sha512-TOMrl34UbfrHJ67WkoWoY5V6bHxCZrvwTtUfuaaos6ZIAOK9d2fIJnouwjPgMRU8JzACYWV3XG+qqOsoDaB25g==} engines: {node: '>=16'} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -710,8 +710,8 @@ packages: peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-codegen/visitor-plugin-common@7.4.0': - resolution: {integrity: sha512-dI5U37AVNsnctN8qIHhXM8G8zygx8JCwId6QiH6KOfyCeIYLDBkqPElfuD/2lIDzWAGoMkS2FNoTcfqNcsSvRA==} + '@graphql-codegen/visitor-plugin-common@7.5.0': + resolution: {integrity: sha512-/7h13H2PnjWMKVD0wYvxh9MWmG9HX6vHCoUL3Hyf2dOUI9soU/uTvBK6gJUs58RILKu4V36QxY/tIaeGOuRRRw==} engines: {node: '>=16'} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -738,8 +738,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/delegate@12.3.0': - resolution: {integrity: sha512-b7jor8s1M5QkmfwkClyJRQKJ30I+mLNvmV35/QVGQkNUctOkqk17bps3TCS/dC1iVBIAUUO5NUppTJ6/GAcmyA==} + '@graphql-tools/delegate@12.3.1': + resolution: {integrity: sha512-j3B7LjXpEhcT45zLoNmkJ/cJxbjdlWBiorkJH4TJiPDFvyeHtcqw5WZKDJ+P09Xg26D8Ewv+1GyvJpzy8a3q3A==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -858,8 +858,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/wrap@11.2.2': - resolution: {integrity: sha512-FZ1S0fir0C9ohEC3yN3ywDmoXw9gwGrOiqMybERTjwIqLnHzTxi8AHJvenNGLPLDTMlL5t3nZ8X6E09skXIqyw==} + '@graphql-tools/wrap@11.2.3': + resolution: {integrity: sha512-QHhXloj6z7Z0WmPR8MYlc4/fR1DmKPeqNH7FuNchG9/D3aDjViO1gZtPuXRR5zX4Oz/fmocDfXqeO/HiMv9myA==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -869,12 +869,6 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@hono/node-server@2.1.5': - resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} - engines: {node: '>=20'} - peerDependencies: - hono: ^4 || ^5.0.0-0 - '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -900,12 +894,12 @@ packages: peerDependencies: react: ^16.13 || ^17 || ^18 || ^19 - '@inquirer/ansi@2.0.9': - resolution: {integrity: sha512-0Ywt3S8tqM6TWUcsRlBFQ1x+X3/o8kktX0ZiKAnByYb9GFDknnOhse1PVtfiD2BXPI8ar+BWx9PV9R0lQIcygw==} + '@inquirer/ansi@2.0.10': + resolution: {integrity: sha512-dwrc+1aqVZpHNkNDswXGtn1typ+Pxpo5FHZRyBw1le7onEJUkPUkYOY1FIFC1LvFMYUqqLuWBwElhAmencL7MQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/checkbox@5.2.7': - resolution: {integrity: sha512-/+QmGE/9bvE/EobaZDnzYe+T+QWoJrnmxwBQNtoi2OVSUR9d1znYsNyEoUrOZvFSxDYttrhzRIpXpaLkN+iIsg==} + '@inquirer/checkbox@5.2.8': + resolution: {integrity: sha512-NY/S1EalQhlonqhwwsarrcnkH7s9ByQuvjWYdk1jB2Gb9EPQJjKkhCTWjM3yQ0UpHaLm1XbIL89b+32G8rhO5w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -913,8 +907,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.3.4': - resolution: {integrity: sha512-ZwnaZZDa1zxsyVrN32s447ydMnKcw7e8WWNT+R+Qsu0zAn8Rs6yi9d1B80Kob1Ul2cfUi7t8JD2t4/K7uEZpqA==} + '@inquirer/confirm@6.3.5': + resolution: {integrity: sha512-BJ59BOyURiZiAxdr9AuRu38/k+rV+DcTIM2fUF/c/BXrab6H8zMZTTOl3LgkSJH96Xob2vOJxDiBkHiz32Xx2w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -922,8 +916,8 @@ packages: '@types/node': optional: true - '@inquirer/core@12.0.5': - resolution: {integrity: sha512-c0ZSnO9oVk/IlEGoZK3u8b3IZQeu9I6jUkXJSQnQEVRXsjKvtAq3AGqFL2LgfJhlzMZne08pZHWRWasIcI3Rew==} + '@inquirer/core@12.0.6': + resolution: {integrity: sha512-5yxn2LsJ8Tu4ei2a+yNkmFRhM/cb+JMEsEs/AW6CCOnBnpMy4IjYiPMFyHtYq8weOmlTyqqCx40y0DsD7OsEPw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -931,8 +925,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.3.5': - resolution: {integrity: sha512-6lU3/pPx5z3lHWejFW061MV4qZooBQYv/+EeGhNOPiP/i+hrYsHfxxBnnDGsAfg8YdLUd69YckoeOjtr3QuAUg==} + '@inquirer/editor@5.3.6': + resolution: {integrity: sha512-Z5SOeRC5VNkINfKN4rY8BSaYKb3GYi8iSEqZZRqogsE2GhBBToQ0Xw25SbI+4bcatLzU009mZ5d9EuJNiJuUCg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -940,8 +934,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.1.7': - resolution: {integrity: sha512-eiJ31YFCaB6fLoJCqLIn8S6eqUyME6vwr8KcP5h8cxmA+bV9RRVPO+kywoxb7G63HduDXV6sN/SM7o2R+ahEcQ==} + '@inquirer/expand@5.1.8': + resolution: {integrity: sha512-dMEnTkpLqzM/sbILwL7QJgx9iX5hoEM8+bh6shgwd9mYJamdOnth7y2mMaFd08Glj9AXEFKllWcGYyBqnJsHrA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -949,8 +943,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@3.0.6': - resolution: {integrity: sha512-rWmw6WG8JZ7LMn/srXEylYGhL6EXXJeROE7/4x4GREh6NgzqJBDbIgpNGsYoLPfobeb4VZtEYzPGnT5EFNYhiQ==} + '@inquirer/external-editor@3.0.7': + resolution: {integrity: sha512-enNqTJpojgISCG+a5acjnfJ02hcRTFUBVm8uXiCY40PRPZtSzFnNLskOTU+kDUUEODYma90syxuea1rRtUFh0Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -958,12 +952,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@2.0.9': - resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==} + '@inquirer/figures@2.0.10': + resolution: {integrity: sha512-51elrUJV3jZpvD0ygz8+U10Kc6+Lzqln+/tYmnbhy6jo5oXpE6hMCcv+OTBC0enwJXsb3JIuT3VtEinRNCSK2A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/input@5.1.8': - resolution: {integrity: sha512-psOSTgkL8y/OtgJJYbqJ0oISr2QBE0U1Ro/qQdA/EKjeJiwiUTQgQmq8o4ESNzVOWthIeh3YLD7BCUR9dKnR5g==} + '@inquirer/input@5.1.9': + resolution: {integrity: sha512-2Vd5T7lTxfgJMpAd3aOu6bQpbUnCU7tBgvTQIZkP/7juJzmRmTM2t5XfOCuirFduWLTSJI/WZp32Cq1E01TVeg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -971,8 +965,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.2.5': - resolution: {integrity: sha512-lEy7LWsdF5qHx5QjHZqabUqM9P7i5uTMCt8GRzqxmwXXKbapKJDA+ucVflVVPAyj4snD5DTAD4L+sct85XOlOQ==} + '@inquirer/number@4.2.6': + resolution: {integrity: sha512-22LnGGCDm1M/pKXxxF8n6ppr/1IztdsxqeqeBRUMTTNnJTkjIBiAkewiDM4u/gjtazj/FvZS+nk9AbO/vEcBFQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -980,8 +974,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.2.4': - resolution: {integrity: sha512-T7ir3fflSSVCYEVqNyMBq+pIMsilQRtbZcD5gxn6Ewsin5TJWBxrGBdXveWtmeXVAeoInfhS+BhBUZaL4sFSDg==} + '@inquirer/password@5.2.5': + resolution: {integrity: sha512-0v0wLQA4uhWbybmdH6oPl7ooxCiymNylkvi2gCSc+mA5ZQB6QoJLVhoHq12T82lhozpp9fpMJnJkC1nJrU/A+A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -989,8 +983,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.7.4': - resolution: {integrity: sha512-SAJt+QhY5rOJAIgZBw9TrHWfgrp6wsb9cqRCyqax+Hl6EiFfRXmD9EsIWkST8yq/dQ8H46Is2Sr/JG7Ls/LQ+Q==} + '@inquirer/prompts@8.7.5': + resolution: {integrity: sha512-l/IWwC+QhOyXgxkZloOh+n5quGzc1m5ZawyzBmoizCZaxbJeLRdS3pStoqg/JVInJRXaG5aHMhjK6H6oYiBC9A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -998,8 +992,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.3.7': - resolution: {integrity: sha512-XveEe8v3BHj9ec00n+9i8FHjWhXjS6+jCTizYvXCqKUKtgkrq9xid8S5j3mYGW96qfxG3mwNoud3m3v8GDk9Pw==} + '@inquirer/rawlist@5.3.8': + resolution: {integrity: sha512-h+6Y4pPvYvuRbksn1kIBdD9tCYD+E468W5sIcVfLmoLP5IasnY0r33N+r+46ej/P8b2PCREjyKR+MnnfPGdTzg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1007,8 +1001,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.3.5': - resolution: {integrity: sha512-kIUecMugEN2YTvTmff+uYz0nAE0f9RFNDVZknfrh264vAQM9P8tnsXiUp7z8XbGuNIBEtFMJhvc9QquawpC46A==} + '@inquirer/search@4.3.6': + resolution: {integrity: sha512-JZj9ttkIvuaFQIc2oxsyqC1ad05WL02ku6W/INVKTCzNaVq1KkhP3AfTRC0m7OWlKZyw+EWwPBFZfYiG9jF6Yw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1016,8 +1010,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.2.7': - resolution: {integrity: sha512-pRDWO4dTqSAvFQdO8yclKMtXNDm9K9HmvWB5UZmT3clw2OlOBNXveHzhyFmO/0d0yJMqlPcNITus1Jtpm6t8VQ==} + '@inquirer/select@5.2.8': + resolution: {integrity: sha512-BklkkAAOpjdCfuQw5fVGcDuhKxA7T1iBpn6b2JUvDDdkIsO3Ftlg+WnWUCVpkUBFagL2o036OFW+xL4lC9wIPw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1025,8 +1019,8 @@ packages: '@types/node': optional: true - '@inquirer/type@4.2.0': - resolution: {integrity: sha512-2rnHX8RPo4glJYqnFc/v3nQeIhDcjyRRyaT7MGcfL/8xv/8K03SXYoA2tX06WVSKywWOE/ncbG3dtuzLjR5TCQ==} + '@inquirer/type@4.2.1': + resolution: {integrity: sha512-lDkPsnv5M5CcYB2T1qTc3dobNTPkVr4DU3Ic2Q6SW8/qVRHgvzdRdmVZ6YqG9Ag1aJTeMsLU0s0WPRh3CZWDQQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1059,15 +1053,13 @@ packages: '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@modelcontextprotocol/sdk@1.32.2': - resolution: {integrity: sha512-SWsVtH/0vULSQStoZ6xxH2K09Li8fXYTMC64ZeogCdpZ3XSi1eCPOByV1OpuJxuI3OcmHhosDWYyii07tpPsLw==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true + '@modelcontextprotocol/core@2.4.0': + resolution: {integrity: sha512-z8QBKqdfXLPzkLQuG4xp8hrVEMm1PZ1IgxMN2sMbJiFiAKOWXnAzogXn2W4aqIBlP1ea6U5yiqVquvUNM1Cj6Q==} + engines: {node: '>=20'} + + '@modelcontextprotocol/server@2.4.0': + resolution: {integrity: sha512-rgR9yxSaAJ+bcsi/XroT/S2AfPiIWloXAnrdfYSCms9ivVju0ishu/wW0J21Ho6+ZOR1r7RyeRbjiRuF87ix5Q==} + engines: {node: '>=20'} '@noble/ciphers@2.4.0': resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==} @@ -1092,14 +1084,14 @@ packages: '@oxc-project/types@0.155.0': resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} - '@react-router/dev@8.5.0': - resolution: {integrity: sha512-SXmL0ym9Wp8Hi0LdXLG6yPaN8V1rUW4PuavvBS9eqpr0hM3PFjiCUT44pRzCj4G9lKEQBeNcj4beOtpN7IxuCg==} + '@react-router/dev@8.5.1': + resolution: {integrity: sha512-1NQ/lP8m7Kd9G4cGKPoEMZe0qcWOnRkf8QxpAcnX/3V5wJp+/mDvM9QUqwUxI+RywytNNGtc4uuDFhwt0xMLbg==} engines: {node: '>=22.22.0'} hasBin: true peerDependencies: - '@react-router/serve': ^8.5.0 + '@react-router/serve': ^8.5.1 '@vitejs/plugin-rsc': ~0.5.26 - react-router: ^8.5.0 + react-router: ^8.5.1 react-server-dom-webpack: ^19.2.7 typescript: ^5.1.0 || ^6.0.0 || ^7.0.0 vite: ^7.0.0 || ^8.0.0 @@ -1116,33 +1108,33 @@ packages: wrangler: optional: true - '@react-router/express@8.5.0': - resolution: {integrity: sha512-uJDrp6XrW9MQSgbw6EKNXekSz0CS2dcnqWFTA4NZaL7CsPTwe7tXVR7auMxCEiTVg5+4wd0PWsPtX+J4VEqWDg==} + '@react-router/express@8.5.1': + resolution: {integrity: sha512-pWx/cvrOztywTanlaUI/i0T3EbK+OGxdOL0HASHlc1QSLsadx39bNqKuMJFacZscBtZh8NgR1glAcrkIpUL06Q==} engines: {node: '>=22.22.0'} peerDependencies: express: ^4.22.2 || ^5 - react-router: 8.5.0 + react-router: 8.5.1 typescript: ^5.1.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - '@react-router/node@8.5.0': - resolution: {integrity: sha512-9a3a37TW5GAo/J336Uk1tca/X1OxjpseETz/zCHcojtL7oRlFrlFoDt6wSdCtFRCiwlLyHcWY+qwZ+xnb05kSg==} + '@react-router/node@8.5.1': + resolution: {integrity: sha512-hEr3YFQaSoQL8T85+DqNOpdDLfuD2mKEeGdQAEvfix2bQdCtcpatE0uzB3zYidIUex0iEJG/eOZdAjLrzlJrjA==} engines: {node: '>=22.22.0'} peerDependencies: - react-router: 8.5.0 + react-router: 8.5.1 typescript: ^5.1.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - '@react-router/serve@8.5.0': - resolution: {integrity: sha512-3cIUPAtmlAXjvmD6kmYw8/q9YQvVNHzSLJVJRfAX29hp/t+yvhbqnmRAPDyFHDMTUha+wgvKb6GA/3cqJa+LHA==} + '@react-router/serve@8.5.1': + resolution: {integrity: sha512-frPpfYqIA4f9ynW+tBxUox0BD+yaJJttu1SLPkTOyE5o6/h8Y9ueD4+4dtoCaxmlnF4rKWbcXptRPcwX+KEEZw==} engines: {node: '>=22.22.0'} hasBin: true peerDependencies: - react-router: 8.5.0 + react-router: 8.5.1 '@remix-run/node-fetch-server@0.14.2': resolution: {integrity: sha512-1cpM/f5i1ka/9CUMBwZXZp7Bn92x8VQjzg+F4eEe88DlVdNHkAKrf/vvbZoYgdkfy2bWHtGC6LQGLmojEqOF4Q==} @@ -1272,8 +1264,8 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shadcn/registry@0.2.0': - resolution: {integrity: sha512-m3TeqU/+av2kgOLfESHkWzsmhuQuY4NXZd5Y1Rd4lzy4IX3JJ5+k2mYfkq6OT8oMuk2W4GQPAkO7+CC7KlpSbw==} + '@shadcn/registry@0.2.1': + resolution: {integrity: sha512-wMvZ3DGdnhCwtpeFbwKybSGfCcP52bZX77jMKgZvupmirgyA5KRLlkeQXkI2RGHIaD8TX2iWe2wcIEjjqzg2FQ==} engines: {node: '>=20.18.1'} '@sindresorhus/merge-streams@4.0.0': @@ -1492,63 +1484,63 @@ packages: '@types/ws@8.18.2': resolution: {integrity: sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==} - '@typescript-eslint/eslint-plugin@8.72.0': - resolution: {integrity: sha512-aysKgysPX9XOv/dk95UkvUDe++Q3n3dJPG9CEWT3RUccxfkPJ+Qn6nhKPDhZXU6Ofo9kgwGWwKyQCnZIXTgngg==} + '@typescript-eslint/eslint-plugin@8.72.1': + resolution: {integrity: sha512-5CokTWXpmbylfFabsbvHC0CAw3XLaGnoa+nFJX5FR592h/LoZsENUE6p/rg5xvkKrFEXz6pYmgI29AgXc2N3BQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.72.0 + '@typescript-eslint/parser': ^8.72.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.72.0': - resolution: {integrity: sha512-0O+x3ynciD6zuXb1CKSu165haQV6ey53DKhHHUnujP7U+XlltJG+/keT0Xhd1HXCze+IHf7Tvt39ovyepX/LNw==} + '@typescript-eslint/parser@8.72.1': + resolution: {integrity: sha512-ZGwZP4OCfyA0AQTpEAMWz+rtX01DRhQWW5hB0ucKDEIX5U7jdmPSaMx94rQfaPAQzIYz2BimOgKOJtjfpRFQ9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.72.0': - resolution: {integrity: sha512-bzHngBbmIgzj6TsTjVUCntGx6FFLgE7mPjpO0PzHycOaZHXqS43XnrkFIHRS16LLr/xO6FHSXG3GJFo/F4bSBQ==} + '@typescript-eslint/project-service@8.72.1': + resolution: {integrity: sha512-fAuVMkwdO/huI8nyo/WKnNKf6Gag93S56Rh3Ts5mGcavwSdaN8tRg1gCeIGX8PF+nzp1BjGfO4gHhGzW1J6jTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.72.0': - resolution: {integrity: sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA==} + '@typescript-eslint/scope-manager@8.72.1': + resolution: {integrity: sha512-lC/t6eMCZZQAAKZEYGL6RDVSuFehpdmMT6h+nJIjIa6oylN/PwDgDVtEIbB7O9xFfZYtZAYLoLlDNWKJhtF+uQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.72.0': - resolution: {integrity: sha512-0vbxCf7xLVPSjcOdm6eQbgViH8EDJ8xnl1laLT9yoqSz2YmcSfSg5Vdl0JUvZf6rcuJ0ZivJIuMD4edTg8obaA==} + '@typescript-eslint/tsconfig-utils@8.72.1': + resolution: {integrity: sha512-e4D5R5vpeAEPBxT2BAzsFQL3sbwyeeeo5+aczgNSRK1V734jE7pTqaGFU+fXapWEQwnZbpFaTn32+Z8DwS6OTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.72.0': - resolution: {integrity: sha512-gEXxmmbSTSOVTC37IYYvremOM31v+UN2W772bJxmVYPhAOPSUxtacyb7wkm1EhkYKU6KzFJsdU44DCV4to0LWw==} + '@typescript-eslint/type-utils@8.72.1': + resolution: {integrity: sha512-iY2wlmyrXJmx4yxUGP3aYCFF3cA/6ShddOKmLU2dx7LnEykbAM8WThlxZEfd1NddqceF6eJmZUayxx9oKIYNlg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.72.0': - resolution: {integrity: sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==} + '@typescript-eslint/types@8.72.1': + resolution: {integrity: sha512-LmE5IhQet1BWOWEXqBrVtBPsMAOQ6Nzk35d+WLh3mk4EUF33sqlfxjio1MdYeSvKSG5skactKKuixBIKXhL4Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.72.0': - resolution: {integrity: sha512-gwLfFgWcw15tN2KXDCJvxEOQjPn+P3j/n3eSqkZ5sX4VpW9Cosodr+tWwBZRvJT3TcKx6HnPRGZMCNAiP1Xhug==} + '@typescript-eslint/typescript-estree@8.72.1': + resolution: {integrity: sha512-DAlUoUV93hIvrtIQLwCbmZQYVZwOMhiHJrOVUUIWicFZaIYjTRqlY3I/NZevfkLmSqkNHRu2qYDcq9lrn16oOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.72.0': - resolution: {integrity: sha512-0up3oArJZBYnzOaEXKo8DmI43QvMZyPoFEt9LWzRJcyl/RcJjfKKPebknN1VbTgXBf3M/KggUh5uUMdURLnseg==} + '@typescript-eslint/utils@8.72.1': + resolution: {integrity: sha512-5v5liypurJBFHCBNqh/RjsymAD+VWcE0djuGY/BUqp5fC3Qn+luWDEksjuTtWjPn6i5zQlUtkZCRG/CYG0yCkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.72.0': - resolution: {integrity: sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==} + '@typescript-eslint/visitor-keys@8.72.1': + resolution: {integrity: sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-react@6.1.2': @@ -1601,16 +1593,16 @@ packages: resolution: {integrity: sha512-BDMdYFcerLQkwA2RTldxOqRCs6ZQD1S7UgP3pUdGUkcbgTrP/V5ko77ZkCww9DHmC4lpoYuwigGfQYj285gMvA==} engines: {node: '>=18.0.0'} - '@whatwg-node/node-fetch@0.9.2': - resolution: {integrity: sha512-KPUMuyu2u0i92mchLcvPJBHnsOd1osahvAvagHGEod4GTkFTyoXZwlbagFTWm/k4ixjEiGi7cbCLPYm0uFb2Wg==} + '@whatwg-node/node-fetch@0.9.3': + resolution: {integrity: sha512-Ekx4MfF76yzQTphPf1Qr8N2hbxlTaI/hZ4TSmRGWqmEjQrRlkrtiIT107mS0gds4SisAtAXaU8jXhffipowlGw==} engines: {node: '>=22.15.0'} '@whatwg-node/promise-helpers@1.3.2': resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} engines: {node: '>=16.0.0'} - '@whatwg-node/promise-helpers@2.0.0': - resolution: {integrity: sha512-/i9CS0Z96o+cPwaYoAyVxAThDiUX1wV3tDmNWPJbn+vtdR+JftuCDg1NGCXBrzIYVDGkJ8uT6ctwmrBOUzOpKQ==} + '@whatwg-node/promise-helpers@2.0.1': + resolution: {integrity: sha512-ziVgm01A9irPLVBaUFei64qp771BrDXldbv5pY6kgFgNtA+7zq8ux6nj/6w8bELGH/+Ttnc76ox04HIjU8nqvg==} engines: {node: '>=22.15.0'} '@wry/caches@1.0.1': @@ -1646,9 +1638,6 @@ packages: ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} @@ -1719,8 +1708,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.11.32: - resolution: {integrity: sha512-UvuxFU9P3hM29LrQdwu0cD6w6/+SFr+UlB9s/knI7+O2rK9xFxKUwSDWxGdbbqQ9/V7BJ5s0NI5nQAE4uJp3gQ==} + baseline-browser-mapping@2.11.34: + resolution: {integrity: sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==} engines: {node: '>=6.0.0'} hasBin: true @@ -1728,8 +1717,8 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - better-auth@1.7.12: - resolution: {integrity: sha512-f1fEG0QdTslzbmFA+vOGFFW/XXCWkG4kBxLeH9n1vp1otTH9+ZzV6EJ6797GStWeiYYgS5Vnt9xqE12KwSyAAw==} + better-auth@1.7.14: + resolution: {integrity: sha512-QxDCI0pOCCHDYmruisKhKyrvOJ6Icv9xg0RA6ZUysfKFXENYwhNNpwUlkE/NmViH2nDMgkKcymmLr55pnpR9vw==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -1810,8 +1799,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.29.4: - resolution: {integrity: sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA==} + browserslist@4.29.5: + resolution: {integrity: sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1939,10 +1928,6 @@ packages: resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} engines: {node: '>=18'} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - content-type@2.1.0: resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} engines: {node: '>=18'} @@ -1961,10 +1946,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -2132,8 +2113,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.464: - resolution: {integrity: sha512-nRa65aFge40viPAKxMKULIY8tcXKwKboJWNn4RoKwyWXJ6SP7BnrDGKUTzc64818jIciH0PK7LSF8QzZes19GA==} + electron-to-chromium@1.5.467: + resolution: {integrity: sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2319,14 +2300,6 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - eventsource-parser@3.1.1: - resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2343,18 +2316,12 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} - express-rate-limit@8.7.1: - resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - express@5.3.0: resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} engines: {node: '>= 18'} - exsolve@1.1.3: - resolution: {integrity: sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==} + exsolve@1.2.0: + resolution: {integrity: sha512-h1pQPR9XoeSMdntRNCjyTznaume4UpfXrULBnlkZ2CUM/G5eSa+pBByGldO5uR8dxbPC+OuJXsPPNf+JZ81ADg==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2562,10 +2529,6 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hono@4.13.13: - resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} - engines: {node: '>=16.9.0'} - hookified@1.15.1: resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} @@ -2596,8 +2559,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.13: - resolution: {integrity: sha512-2E8Q6rh+1RRSq/YdaGsNfXsEZy9FVqv6BSSrkmZJP7BnaoPnRfKL+YaofPvP+5rzdk144qSm6i4+hvPgUcbV4Q==} + ignore@7.0.14: + resolution: {integrity: sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==} engines: {node: '>= 4'} immutable@5.1.9: @@ -2625,8 +2588,8 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ip-address@10.7.4: - resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + ip-address@10.7.5: + resolution: {integrity: sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -2798,9 +2761,6 @@ packages: json-schema-typed@7.0.3: resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -3024,8 +2984,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@1.61.0: - resolution: {integrity: sha512-v2SQPPPNjnr+BlhL9Spuzmo5yR+hLkftfuE4E3jaxdNPgSH0hJKPcLJBP7yAta87jQNPsSERS59PJjCJ/CorBA==} + lucide-react@1.63.0: + resolution: {integrity: sha512-GkBfQG+FUJ41x6y3/lNXiOziVU0Rcqqq0TCzhHS8avsFXHZmOdmfBqsVTvHSaVmbI+wbdGkxHRmhYWhD3N4/yA==} peerDependencies: '@types/react': '*' react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3040,8 +3000,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@1.4.3: - resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} + magic-string@1.4.5: + resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==} map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} @@ -3172,10 +3132,6 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3321,10 +3277,6 @@ packages: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - pkg-types@2.4.0: resolution: {integrity: sha512-07Fys7iVx0X6TcviMOgogM1Lk33ZyqOezMnU79S+kffWqwolG/5W9V8EgQSeYCIfFTYVgssRbnH630Oa2+soBA==} @@ -3336,8 +3288,8 @@ packages: resolution: {integrity: sha512-wWBro/7hJ40ye6TPiXkUQoXKCw23xSsjriUvqd7Uls9Sso3oLiON1flc18cCdnjgCRXw4fBVqUJJeOdDTh3P3g==} engines: {node: '>=4'} - postcss@8.5.31: - resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==} + postcss@8.5.32: + resolution: {integrity: sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==} engines: {node: ^10 || ^12 || >=14} powershell-utils@0.2.1: @@ -3377,8 +3329,8 @@ packages: resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} engines: {node: '>=20'} - qs@6.16.1: - resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + qs@6.17.0: + resolution: {integrity: sha512-5LK5BZ2XDHMvcUJaf0CQ5HL3aVgKbpklvByC7qLSxYkfE8COEEbJg5xCHWCTqzqi0Gs4Jn5Mv5v3R38W6edscA==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -3404,8 +3356,8 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react-router@8.5.0: - resolution: {integrity: sha512-9nEd/deifcTJIIcUaNIyQGkyXD0D6QVB9XD2O5GgHpP3xu3U5RXm87YQ8++Wn8JQWgMBM/5+PjWPM/7n7O7WHA==} + react-router@8.5.1: + resolution: {integrity: sha512-5u1eQ46QjuXjNfEnLwzrnou1Bm5dquO3xjVYkkMYCudtkicD2AQHtx+fvXzPATtPJx8TW6DR1x1TDRqsfHyZBw==} engines: {node: '>=22.22.0'} peerDependencies: '@types/react': '>=19.2.0' @@ -3532,8 +3484,8 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shadcn@4.22.1: - resolution: {integrity: sha512-LbB4Lro+b0qSVki/tgL5edtKylEnXe1ppxMJC12d7NHPgaT+eSgJGMQULwP72V7X9tbiUq7xfx3VDAfB7jdGoA==} + shadcn@4.23.0: + resolution: {integrity: sha512-lKgq7QPFgkV/6EOrMCwvEn7ZAw/YnM/grhxzJmK4cZdw3E4F3Ut2EmWvrn2E+vzJp1y/76mxU185OSkXo9Ff+Q==} engines: {node: '>=20.18.1'} hasBin: true @@ -3669,8 +3621,8 @@ packages: resolution: {integrity: sha512-tTw2sPVgJb/ZO+Uz5Cs1haWg7aL0cw+DvD8mXos+ws5YaelM3IBZ50M717T1+RD5Qq0TdeZ/EI/wVMnAdJA0Eg==} engines: {node: '>=22.12.0'} - systeminformation@5.33.16: - resolution: {integrity: sha512-R+Lh69IJXfJj6bfyH1In5cIR9FTr4hBS39YvlZHZjsK1p9cuELPq7hplZZIb56ZESMMb+DzdKqqE6Iomi01Mvg==} + systeminformation@5.33.18: + resolution: {integrity: sha512-SF8DBQx3ypa8zDqZlezpHQ6M2g7TrqSEWpAtC4OsHCdLmi7J2WdxaSbA8/DJyEn2l/CHPrW0VFenoqoDccrw6g==} engines: {node: '>=10.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -3704,8 +3656,8 @@ packages: title-case@3.0.3: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} - tldts-core@7.4.19: - resolution: {integrity: sha512-goNXV6Ho9TIOfpJZanTd6CKG5DyYgYAL+k+22T0SLh8l6+KHIfBUPFuePuSZv05UttIaaLmI9tb7TmGIdK5AkQ==} + tldts-core@7.4.20: + resolution: {integrity: sha512-C630TWXZCZmLq0F2bW4QqwnaaxCQ/svpAqvJwnC4JvgEM5ohhBnGsEzTLSOXcN+xjz+kEaHS5uoWIw2klnqd0A==} tldts@7.4.19: resolution: {integrity: sha512-48dH6aSpQnpbzDUc4vIQZ1VjB8tkK+e8c1yx05/SZK+rkssgjEOlxDd/yU8/a4vGYQ9vRgJr9dwMq9TJ0b3X2Q==} @@ -3765,8 +3717,8 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} - typescript-eslint@8.72.0: - resolution: {integrity: sha512-r26Fkc8As+mZvqp7SLsMmNFyYUup/6CjK7/eHBHmhOw6GH6n6YFxHVFrG0jN1c5CMpDzelLPxvgeCOzx7BjN+A==} + typescript-eslint@8.72.1: + resolution: {integrity: sha512-3Li9FfPmQp45nxEtFD1ZCrYFI3cYK5kpyNtmm1H7lMagm8u9sy6PTjy3ytwQZs7KNukOyKFHAZ6z6GjYFeaeXw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4033,11 +3985,6 @@ packages: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 - zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -4074,7 +4021,7 @@ snapshots: immutable: 5.1.9 invariant: 2.2.4 - '@asamuzakjp/css-color@7.1.7': + '@asamuzakjp/css-color@7.1.9': dependencies: '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) '@csstools/css-color-parser': 4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) @@ -4133,7 +4080,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.29.4 + browserslist: 4.29.5 lru-cache: 5.1.1 semver: 6.3.1 @@ -4302,10 +4249,10 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - '@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)': + '@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)': dependencies: - '@better-auth/utils': 0.5.0 - '@better-fetch/fetch': 1.3.2 + '@better-auth/utils': 0.5.1 + '@better-fetch/fetch': 1.3.3 '@standard-schema/spec': 1.1.0 better-call: 1.4.4(zod@4.6.7) jose: 6.2.13 @@ -4313,44 +4260,44 @@ snapshots: nanostores: 1.5.5 zod: 4.6.7 - '@better-auth/drizzle-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)': + '@better-auth/drizzle-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/utils': 0.5.0 + '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.1 - '@better-auth/kysely-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(kysely@0.29.7)': + '@better-auth/kysely-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7)': dependencies: - '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/utils': 0.5.0 + '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.1 optionalDependencies: kysely: 0.29.7 - '@better-auth/memory-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)': + '@better-auth/memory-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/utils': 0.5.0 + '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.1 - '@better-auth/mongo-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)': + '@better-auth/mongo-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/utils': 0.5.0 + '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.1 - '@better-auth/prisma-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)': + '@better-auth/prisma-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/utils': 0.5.0 + '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.1 - '@better-auth/telemetry@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)': + '@better-auth/telemetry@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)': dependencies: - '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/utils': 0.5.0 - '@better-fetch/fetch': 1.3.2 + '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.1 + '@better-fetch/fetch': 1.3.3 - '@better-auth/utils@0.5.0': + '@better-auth/utils@0.5.1': dependencies: '@noble/hashes': 2.4.0 - '@better-fetch/fetch@1.3.2': {} + '@better-fetch/fetch@1.3.3': {} '@bramus/specificity@2.4.3': dependencies: @@ -4406,7 +4353,7 @@ snapshots: object-treeify: 1.1.33 open: 8.4.2 picomatch: 4.0.7 - systeminformation: 5.33.16 + systeminformation: 5.33.18 undici: 7.30.1 which: 4.0.0 yocto-spinner: 1.2.2 @@ -4439,9 +4386,9 @@ snapshots: '@eslint-react/ast@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: eslint: 10.13.0(jiti@2.7.0) @@ -4454,8 +4401,8 @@ snapshots: '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: @@ -4480,8 +4427,8 @@ snapshots: '@eslint-react/eslint@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: eslint: 10.13.0(jiti@2.7.0) @@ -4493,8 +4440,8 @@ snapshots: '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: @@ -4505,7 +4452,7 @@ snapshots: '@eslint-react/shared@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 zod: 4.6.7 @@ -4518,9 +4465,9 @@ snapshots: dependencies: '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.72.0 - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: @@ -4604,7 +4551,7 @@ snapshots: '@graphql-tools/merge': 9.2.8(graphql@17.0.2) '@graphql-tools/url-loader': 9.1.14(@types/node@24.19.2)(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) - '@inquirer/prompts': 8.7.4(@types/node@24.19.2) + '@inquirer/prompts': 8.7.5(@types/node@24.19.2) '@whatwg-node/fetch': 0.10.13 chalk: 5.6.2 cosmiconfig: 9.0.2(typescript@6.0.3) @@ -4644,8 +4591,8 @@ snapshots: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) '@graphql-codegen/typed-document-node': 7.2.0(graphql@17.0.2) '@graphql-codegen/typescript': 6.1.2(graphql@17.0.2) - '@graphql-codegen/typescript-operations': 6.1.10(graphql@17.0.2) - '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2) + '@graphql-codegen/typescript-operations': 6.2.0(graphql@17.0.2) + '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2) '@graphql-tools/documents': 1.0.2(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2) @@ -4663,7 +4610,7 @@ snapshots: '@graphql-codegen/gql-tag-operations@6.1.1(graphql@17.0.2)': dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) - '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2) + '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) auto-bind: 5.0.1 graphql: 17.0.2 @@ -4688,17 +4635,17 @@ snapshots: '@graphql-codegen/typed-document-node@7.2.0(graphql@17.0.2)': dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) - '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2) + '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2) auto-bind: 5.0.1 change-case-all: 2.1.0 graphql: 17.0.2 tslib: 2.8.1 - '@graphql-codegen/typescript-operations@6.1.10(graphql@17.0.2)': + '@graphql-codegen/typescript-operations@6.2.0(graphql@17.0.2)': dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) '@graphql-codegen/schema-ast': 6.1.1(graphql@17.0.2) - '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2) + '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2) auto-bind: 5.0.1 graphql: 17.0.2 tslib: 2.8.1 @@ -4707,12 +4654,12 @@ snapshots: dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) '@graphql-codegen/schema-ast': 6.1.1(graphql@17.0.2) - '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2) + '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2) auto-bind: 5.0.1 graphql: 17.0.2 tslib: 2.8.1 - '@graphql-codegen/visitor-plugin-common@7.4.0(graphql@17.0.2)': + '@graphql-codegen/visitor-plugin-common@7.5.0(graphql@17.0.2)': dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) '@graphql-tools/optimize': 2.0.1(graphql@17.0.2) @@ -4756,7 +4703,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-tools/delegate@12.3.0(graphql@17.0.2)': + '@graphql-tools/delegate@12.3.1(graphql@17.0.2)': dependencies: '@graphql-tools/batch-execute': 10.3.0(graphql@17.0.2) '@graphql-tools/executor': 2.1.0(graphql@17.0.2) @@ -4827,7 +4774,7 @@ snapshots: '@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2) '@repeaterjs/repeater': 3.1.0 '@whatwg-node/disposablestack': 0.1.0 - '@whatwg-node/promise-helpers': 2.0.0 + '@whatwg-node/promise-helpers': 2.0.1 graphql: 17.0.2 tslib: 2.8.1 @@ -4849,7 +4796,7 @@ snapshots: '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@whatwg-node/fetch': 0.12.1 - '@whatwg-node/promise-helpers': 2.0.0 + '@whatwg-node/promise-helpers': 2.0.1 graphql: 17.0.2 sync-fetch: 0.7.1 tslib: 2.8.1 @@ -4932,10 +4879,10 @@ snapshots: '@graphql-tools/executor-http': 3.5.0(@types/node@24.19.2)(graphql@17.0.2) '@graphql-tools/executor-legacy-ws': 1.1.39(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) - '@graphql-tools/wrap': 11.2.2(graphql@17.0.2) + '@graphql-tools/wrap': 11.2.3(graphql@17.0.2) '@types/ws': 8.18.2 '@whatwg-node/fetch': 0.12.1 - '@whatwg-node/promise-helpers': 2.0.0 + '@whatwg-node/promise-helpers': 2.0.1 graphql: 17.0.2 isomorphic-ws: 5.0.0(ws@8.22.0) sync-fetch: 0.7.1 @@ -4951,14 +4898,14 @@ snapshots: '@graphql-tools/utils@12.1.0(graphql@17.0.2)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2) - '@whatwg-node/promise-helpers': 2.0.0 + '@whatwg-node/promise-helpers': 2.0.1 cross-inspect: 1.0.1 graphql: 17.0.2 tslib: 2.8.1 - '@graphql-tools/wrap@11.2.2(graphql@17.0.2)': + '@graphql-tools/wrap@11.2.3(graphql@17.0.2)': dependencies: - '@graphql-tools/delegate': 12.3.0(graphql@17.0.2) + '@graphql-tools/delegate': 12.3.1(graphql@17.0.2) '@graphql-tools/schema': 10.1.5(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@whatwg-node/promise-helpers': 1.3.2 @@ -4969,10 +4916,6 @@ snapshots: dependencies: graphql: 17.0.2 - '@hono/node-server@2.1.5(hono@4.13.13)': - dependencies: - hono: 4.13.13 - '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -4989,33 +4932,33 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@icons-pack/react-simple-icons@13.15.1(react@19.3.0)': + '@icons-pack/react-simple-icons@13.15.1(react@19.3.1)': dependencies: - react: 19.3.0 + react: 19.3.1 - '@inquirer/ansi@2.0.9': {} + '@inquirer/ansi@2.0.10': {} - '@inquirer/checkbox@5.2.7(@types/node@24.19.2)': + '@inquirer/checkbox@5.2.8(@types/node@24.19.2)': dependencies: - '@inquirer/ansi': 2.0.9 - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/ansi': 2.0.10 + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/confirm@6.3.4(@types/node@24.19.2)': + '@inquirer/confirm@6.3.5(@types/node@24.19.2)': dependencies: - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/core@12.0.5(@types/node@24.19.2)': + '@inquirer/core@12.0.6(@types/node@24.19.2)': dependencies: - '@inquirer/ansi': 2.0.9 - '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/ansi': 2.0.10 + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@24.19.2) cli-width: 4.1.0 fast-wrap-ansi: 0.2.2 mute-stream: 3.0.0 @@ -5023,92 +4966,92 @@ snapshots: optionalDependencies: '@types/node': 24.19.2 - '@inquirer/editor@5.3.5(@types/node@24.19.2)': + '@inquirer/editor@5.3.6(@types/node@24.19.2)': dependencies: - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/external-editor': 3.0.6(@types/node@24.19.2) - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/external-editor': 3.0.7(@types/node@24.19.2) + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/expand@5.1.7(@types/node@24.19.2)': + '@inquirer/expand@5.1.8(@types/node@24.19.2)': dependencies: - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/external-editor@3.0.6(@types/node@24.19.2)': + '@inquirer/external-editor@3.0.7(@types/node@24.19.2)': dependencies: chardet: 2.2.0 iconv-lite: 0.7.3 optionalDependencies: '@types/node': 24.19.2 - '@inquirer/figures@2.0.9': {} + '@inquirer/figures@2.0.10': {} - '@inquirer/input@5.1.8(@types/node@24.19.2)': + '@inquirer/input@5.1.9(@types/node@24.19.2)': dependencies: - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/number@4.2.5(@types/node@24.19.2)': + '@inquirer/number@4.2.6(@types/node@24.19.2)': dependencies: - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/password@5.2.4(@types/node@24.19.2)': + '@inquirer/password@5.2.5(@types/node@24.19.2)': dependencies: - '@inquirer/ansi': 2.0.9 - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/ansi': 2.0.10 + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/prompts@8.7.4(@types/node@24.19.2)': - dependencies: - '@inquirer/checkbox': 5.2.7(@types/node@24.19.2) - '@inquirer/confirm': 6.3.4(@types/node@24.19.2) - '@inquirer/editor': 5.3.5(@types/node@24.19.2) - '@inquirer/expand': 5.1.7(@types/node@24.19.2) - '@inquirer/input': 5.1.8(@types/node@24.19.2) - '@inquirer/number': 4.2.5(@types/node@24.19.2) - '@inquirer/password': 5.2.4(@types/node@24.19.2) - '@inquirer/rawlist': 5.3.7(@types/node@24.19.2) - '@inquirer/search': 4.3.5(@types/node@24.19.2) - '@inquirer/select': 5.2.7(@types/node@24.19.2) + '@inquirer/prompts@8.7.5(@types/node@24.19.2)': + dependencies: + '@inquirer/checkbox': 5.2.8(@types/node@24.19.2) + '@inquirer/confirm': 6.3.5(@types/node@24.19.2) + '@inquirer/editor': 5.3.6(@types/node@24.19.2) + '@inquirer/expand': 5.1.8(@types/node@24.19.2) + '@inquirer/input': 5.1.9(@types/node@24.19.2) + '@inquirer/number': 4.2.6(@types/node@24.19.2) + '@inquirer/password': 5.2.5(@types/node@24.19.2) + '@inquirer/rawlist': 5.3.8(@types/node@24.19.2) + '@inquirer/search': 4.3.6(@types/node@24.19.2) + '@inquirer/select': 5.2.8(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/rawlist@5.3.7(@types/node@24.19.2)': + '@inquirer/rawlist@5.3.8(@types/node@24.19.2)': dependencies: - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/search@4.3.5(@types/node@24.19.2)': + '@inquirer/search@4.3.6(@types/node@24.19.2)': dependencies: - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/select@5.2.7(@types/node@24.19.2)': + '@inquirer/select@5.2.8(@types/node@24.19.2)': dependencies: - '@inquirer/ansi': 2.0.9 - '@inquirer/core': 12.0.5(@types/node@24.19.2) - '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.2.0(@types/node@24.19.2) + '@inquirer/ansi': 2.0.10 + '@inquirer/core': 12.0.6(@types/node@24.19.2) + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@24.19.2) optionalDependencies: '@types/node': 24.19.2 - '@inquirer/type@4.2.0(@types/node@24.19.2)': + '@inquirer/type@4.2.1(@types/node@24.19.2)': optionalDependencies: '@types/node': 24.19.2 @@ -5139,27 +5082,14 @@ snapshots: '@keyv/serialize@1.1.1': {} - '@modelcontextprotocol/sdk@1.32.2(zod@4.6.7)': + '@modelcontextprotocol/core@2.4.0': dependencies: - '@hono/node-server': 2.1.5(hono@4.13.13) - ajv: 8.20.0 - ajv-formats: 3.0.1 - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.1.1 - express: 5.3.0 - express-rate-limit: 8.7.1(express@5.3.0) - hono: 4.13.13 - jose: 6.2.13 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 zod: 4.6.7 - zod-to-json-schema: 3.25.2(zod@4.6.7) - transitivePeerDependencies: - - supports-color + + '@modelcontextprotocol/server@2.4.0': + dependencies: + '@modelcontextprotocol/core': 2.4.0 + zod: 4.6.7 '@noble/ciphers@2.4.0': {} @@ -5179,14 +5109,14 @@ snapshots: '@oxc-project/types@0.155.0': {} - '@react-router/dev@8.5.0(@react-router/serve@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': + '@react-router/dev@8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7 '@babel/generator': 7.29.8 '@babel/parser': 7.29.11 '@babel/traverse': 7.29.10 '@babel/types': 7.29.11 - '@react-router/node': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) + '@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) '@remix-run/node-fetch-server': 0.14.2 babel-dead-code-elimination: 1.0.12 chokidar: 5.0.0 @@ -5201,42 +5131,42 @@ snapshots: picocolors: 1.1.1 pkg-types: 2.4.0 react-refresh: 0.18.0 - react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) semver: 7.8.5 tinyglobby: 0.2.17 valibot: 1.5.0(typescript@6.0.3) vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) optionalDependencies: - '@react-router/serve': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) + '@react-router/serve': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - babel-plugin-macros - supports-color - '@react-router/express@8.5.0(express@5.3.0)(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)': + '@react-router/express@8.5.1(express@5.3.0)(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)': dependencies: - '@react-router/node': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) + '@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) express: 5.3.0 - react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) optionalDependencies: typescript: 6.0.3 - '@react-router/node@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)': + '@react-router/node@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)': dependencies: '@remix-run/node-fetch-server': 0.14.2 - react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) optionalDependencies: typescript: 6.0.3 - '@react-router/serve@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)': + '@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)': dependencies: - '@react-router/express': 8.5.0(express@5.3.0)(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) - '@react-router/node': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) + '@react-router/express': 8.5.1(express@5.3.0)(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) + '@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) '@remix-run/node-fetch-server': 0.14.2 compression: 1.8.2 express: 5.3.0 morgan: 1.12.1 - react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) source-map-support: 0.5.21 transitivePeerDependencies: - supports-color @@ -5306,7 +5236,7 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@shadcn/registry@0.2.0': + '@shadcn/registry@0.2.1': dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.11 @@ -5322,7 +5252,7 @@ snapshots: fuzzysort: 3.1.0 kleur: 4.1.5 ora: 8.2.0 - postcss: 8.5.31 + postcss: 8.5.32 prompts: 2.4.2 recast: 0.23.21 socks: 2.8.10 @@ -5530,57 +5460,57 @@ snapshots: dependencies: '@types/node': 24.19.2 - '@typescript-eslint/eslint-plugin@8.72.0(@typescript-eslint/parser@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.72.0 - '@typescript-eslint/type-utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.72.0 + '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/type-utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.72.1 eslint: 10.13.0(jiti@2.7.0) - ignore: 7.0.13 + ignore: 7.0.14 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.72.0 - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.72.0 + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.72.1 debug: 4.4.3 eslint: 10.13.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.72.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.72.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.72.0(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 + '@typescript-eslint/tsconfig-utils': 8.72.1(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.72.0': + '@typescript-eslint/scope-manager@8.72.1': dependencies: - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/visitor-keys': 8.72.0 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/visitor-keys': 8.72.1 - '@typescript-eslint/tsconfig-utils@8.72.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.72.1(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 eslint: 10.13.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) @@ -5588,14 +5518,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.72.0': {} + '@typescript-eslint/types@8.72.1': {} - '@typescript-eslint/typescript-estree@8.72.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.72.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.72.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.72.0(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/visitor-keys': 8.72.0 + '@typescript-eslint/project-service': 8.72.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.72.1(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/visitor-keys': 8.72.1 debug: 4.4.3 minimatch: 10.2.6 semver: 7.8.5 @@ -5605,20 +5535,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.72.0 - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) eslint: 10.13.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.72.0': + '@typescript-eslint/visitor-keys@8.72.1': dependencies: - '@typescript-eslint/types': 8.72.0 + '@typescript-eslint/types': 8.72.1 eslint-visitor-keys: 5.0.1 '@vitejs/plugin-react@6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': @@ -5634,7 +5564,7 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.5 estree-walker: 3.0.3 - magic-string: 1.4.3 + magic-string: 1.4.5 optionalDependencies: vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) @@ -5647,7 +5577,7 @@ snapshots: '@whatwg-node/disposablestack@0.1.0': dependencies: - '@whatwg-node/promise-helpers': 2.0.0 + '@whatwg-node/promise-helpers': 2.0.1 tslib: 2.8.1 '@whatwg-node/fetch@0.10.13': @@ -5657,7 +5587,7 @@ snapshots: '@whatwg-node/fetch@0.12.1': dependencies: - '@whatwg-node/node-fetch': 0.9.2 + '@whatwg-node/node-fetch': 0.9.3 urlpattern-polyfill: 10.1.0 '@whatwg-node/node-fetch@0.8.6': @@ -5667,18 +5597,18 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - '@whatwg-node/node-fetch@0.9.2': + '@whatwg-node/node-fetch@0.9.3': dependencies: '@fastify/busboy': 3.2.4 '@whatwg-node/disposablestack': 0.1.0 - '@whatwg-node/promise-helpers': 2.0.0 + '@whatwg-node/promise-helpers': 2.0.1 tslib: 2.8.1 '@whatwg-node/promise-helpers@1.3.2': dependencies: tslib: 2.8.1 - '@whatwg-node/promise-helpers@2.0.0': + '@whatwg-node/promise-helpers@2.0.1': dependencies: tslib: 2.8.1 @@ -5713,10 +5643,6 @@ snapshots: dependencies: ajv: 8.20.0 - ajv-formats@3.0.1: - dependencies: - ajv: 8.20.0 - ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 @@ -5780,23 +5706,23 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.11.32: {} + baseline-browser-mapping@2.11.34: {} basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 - better-auth@1.7.12(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))): - dependencies: - '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/drizzle-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0) - '@better-auth/kysely-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(kysely@0.29.7) - '@better-auth/memory-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0) - '@better-auth/mongo-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0) - '@better-auth/prisma-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0) - '@better-auth/telemetry': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2) - '@better-auth/utils': 0.5.0 - '@better-fetch/fetch': 1.3.2 + better-auth@1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))): + dependencies: + '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/drizzle-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/kysely-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7) + '@better-auth/memory-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/mongo-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/prisma-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/telemetry': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3) + '@better-auth/utils': 0.5.1 + '@better-fetch/fetch': 1.3.3 '@noble/ciphers': 2.4.0 '@noble/hashes': 2.4.0 better-call: 1.4.4(zod@4.6.7) @@ -5814,8 +5740,8 @@ snapshots: better-call@1.4.4(zod@4.6.7): dependencies: - '@better-auth/utils': 0.5.0 - '@better-fetch/fetch': 1.3.2 + '@better-auth/utils': 0.5.1 + '@better-fetch/fetch': 1.3.3 rou3: 0.9.2 set-cookie-parser: 3.2.1 optionalDependencies: @@ -5833,7 +5759,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.3 on-finished: 2.4.2 - qs: 6.16.1 + qs: 6.17.0 raw-body: 3.0.2 type-is: 2.1.0 transitivePeerDependencies: @@ -5847,13 +5773,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.29.4: + browserslist@4.29.5: dependencies: - baseline-browser-mapping: 2.11.32 + baseline-browser-mapping: 2.11.34 caniuse-lite: 1.0.30001819 - electron-to-chromium: 1.5.464 + electron-to-chromium: 1.5.467 node-releases: 2.0.60 - update-browserslist-db: 1.3.4(browserslist@4.29.4) + update-browserslist-db: 1.3.4(browserslist@4.29.5) buffer-from@1.1.2: {} @@ -5977,8 +5903,6 @@ snapshots: content-disposition@2.0.1: {} - content-type@1.0.5: {} - content-type@2.1.0: {} convert-source-map@2.0.0: {} @@ -5989,11 +5913,6 @@ snapshots: cookie@0.7.2: {} - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cosmiconfig@8.3.6(typescript@6.0.3): dependencies: import-fresh: 3.3.1 @@ -6115,7 +6034,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.464: {} + electron-to-chromium@1.5.467: {} emoji-regex@10.6.0: {} @@ -6164,8 +6083,8 @@ snapshots: '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 ts-pattern: 5.9.2 typescript: 6.0.3 @@ -6192,8 +6111,8 @@ snapshots: '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: eslint: 10.13.0(jiti@2.7.0) @@ -6207,8 +6126,8 @@ snapshots: '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: @@ -6227,8 +6146,8 @@ snapshots: '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: eslint: 10.13.0(jiti@2.7.0) @@ -6242,8 +6161,8 @@ snapshots: '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: @@ -6259,10 +6178,10 @@ snapshots: '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.72.0 - '@typescript-eslint/types': 8.72.0 - '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 string-ts: 2.3.1 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -6349,12 +6268,6 @@ snapshots: eventemitter3@5.0.4: {} - eventsource-parser@3.1.1: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.1.1 - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -6386,14 +6299,6 @@ snapshots: expect-type@1.4.0: {} - express-rate-limit@8.7.1(express@5.3.0): - dependencies: - debug: 4.4.3 - express: 5.3.0 - ip-address: 10.7.4 - transitivePeerDependencies: - - supports-color - express@5.3.0: dependencies: accepts: 2.0.0 @@ -6416,7 +6321,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.8 - qs: 6.16.1 + qs: 6.17.0 range-parser: 1.3.0 router: 2.2.0 send: 1.2.1 @@ -6427,7 +6332,7 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.1.3: {} + exsolve@1.2.0: {} fast-deep-equal@3.1.3: {} @@ -6636,8 +6541,6 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hono@4.13.13: {} - hookified@1.15.1: {} hookified@2.2.0: {} @@ -6666,7 +6569,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.13: {} + ignore@7.0.14: {} immutable@5.1.9: {} @@ -6687,7 +6590,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - ip-address@10.7.4: {} + ip-address@10.7.5: {} ipaddr.js@1.9.1: {} @@ -6786,7 +6689,7 @@ snapshots: jsdom@30.1.3(@noble/hashes@2.4.0): dependencies: - '@asamuzakjp/css-color': 7.1.7 + '@asamuzakjp/css-color': 7.1.9 '@asamuzakjp/dom-selector': 10.0.5 '@bramus/specificity': 2.4.3 '@csstools/css-syntax-patches-for-csstree': 1.1.15(css-tree@3.2.1) @@ -6819,8 +6722,6 @@ snapshots: json-schema-typed@7.0.3: {} - json-schema-typed@8.0.2: {} - json-stable-stringify-without-jsonify@1.0.1: {} json-to-pretty-yaml@1.2.2: @@ -6998,7 +6899,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@1.61.0(@types/react@19.3.0)(react@19.3.1): + lucide-react@1.63.0(@types/react@19.3.0)(react@19.3.1): dependencies: react: 19.3.1 optionalDependencies: @@ -7010,7 +6911,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 - magic-string@1.4.3: + magic-string@1.4.5: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -7108,8 +7009,6 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - object-assign@4.1.1: {} - object-inspect@1.13.4: {} object-treeify@1.1.33: {} @@ -7250,12 +7149,10 @@ snapshots: picomatch@4.0.7: {} - pkce-challenge@5.0.1: {} - pkg-types@2.4.0: dependencies: confbox: 0.3.1 - exsolve: 1.1.3 + exsolve: 1.2.0 pathe: 2.0.3 pkg-up@3.1.0: @@ -7267,7 +7164,7 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.31: + postcss@8.5.32: dependencies: nanoid: 3.3.20 picocolors: 1.1.1 @@ -7305,7 +7202,7 @@ snapshots: dependencies: hookified: 2.2.0 - qs@6.16.1: + qs@6.17.0: dependencies: es-define-property: 1.0.1 side-channel: 1.1.1 @@ -7330,7 +7227,7 @@ snapshots: react-refresh@0.18.0: {} - react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): + react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1): dependencies: '@remix-run/route-pattern': 0.22.1 cookie-es: 3.1.1 @@ -7468,17 +7365,17 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@4.22.1: + shadcn@4.23.0: dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.11 '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@dotenvx/dotenvx': 1.75.1 - '@modelcontextprotocol/sdk': 1.32.2(zod@4.6.7) - '@shadcn/registry': 0.2.0 + '@modelcontextprotocol/server': 2.4.0 + '@shadcn/registry': 0.2.1 '@types/validate-npm-package-name': 4.0.2 - browserslist: 4.29.4 + browserslist: 4.29.5 cn: 0.2.6 commander: 14.0.3 dedent: 1.7.2 @@ -7491,7 +7388,7 @@ snapshots: kleur: 4.1.5 open: 11.0.4 ora: 8.2.0 - postcss: 8.5.31 + postcss: 8.5.32 postcss-selector-parser: 7.1.7 prompts: 2.4.2 recast: 0.23.21 @@ -7503,7 +7400,6 @@ snapshots: validate-npm-package-name: 7.0.2 zod: 4.6.7 transitivePeerDependencies: - - '@cfworker/json-schema' - babel-plugin-macros - supports-color @@ -7565,7 +7461,7 @@ snapshots: socks@2.8.10: dependencies: - ip-address: 10.7.4 + ip-address: 10.7.5 smart-buffer: 4.2.0 source-map-js@1.2.2: {} @@ -7632,7 +7528,7 @@ snapshots: timeout-signal: 2.0.0 whatwg-mimetype: 5.0.0 - systeminformation@5.33.16: {} + systeminformation@5.33.18: {} tailwindcss@4.3.3: {} @@ -7655,11 +7551,11 @@ snapshots: dependencies: tslib: 2.8.1 - tldts-core@7.4.19: {} + tldts-core@7.4.20: {} tldts@7.4.19: dependencies: - tldts-core: 7.4.19 + tldts-core: 7.4.20 to-regex-range@5.0.1: dependencies: @@ -7710,12 +7606,12 @@ snapshots: media-typer: 1.1.1 mime-types: 3.0.2 - typescript-eslint@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.72.0(@typescript-eslint/parser@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) eslint: 10.13.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: @@ -7741,9 +7637,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.3.4(browserslist@4.29.4): + update-browserslist-db@1.3.4(browserslist@4.29.5): dependencies: - browserslist: 4.29.4 + browserslist: 4.29.5 escalade: 3.2.0 picocolors: 1.1.1 @@ -7771,7 +7667,7 @@ snapshots: dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 - postcss: 8.5.31 + postcss: 8.5.32 rolldown: 1.2.15 tinyglobby: 0.2.17 optionalDependencies: @@ -7787,7 +7683,7 @@ snapshots: chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 1.4.3 + magic-string: 1.4.5 obug: 3.0.0 picomatch: 4.0.7 std-env: 4.3.0 @@ -7881,10 +7777,6 @@ snapshots: yoctocolors@2.2.0: {} - zod-to-json-schema@3.25.2(zod@4.6.7): - dependencies: - zod: 4.6.7 - zod-validation-error@4.0.2(zod@4.6.7): dependencies: zod: 4.6.7 From 2d875d083fcf6f2a99d698106f395b274174da8d Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:10:18 +0100 Subject: [PATCH 02/21] chore: update lockfile again --- frontend/pnpm-lock.yaml | 1324 ++++++++++++++++++--------------------- 1 file changed, 599 insertions(+), 725 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 57cb2fc..0623071 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@apollo/client': specifier: ^4.3.5 - version: 4.3.5(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.0))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2) + version: 4.3.6(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.1))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2) '@base-ui/react': specifier: ^1.9.0 version: 1.9.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) @@ -28,13 +28,13 @@ importers: version: 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) '@tailwindcss/vite': specifier: ^4.3.3 - version: 4.3.3(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + version: 4.3.4(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) '@tanstack/react-form': specifier: ^1.33.5 version: 1.33.5(react-dom@19.3.1(react@19.3.1))(react@19.3.1) better-auth: specifier: ^1.7.12 - version: 1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))) + version: 1.7.15(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -49,7 +49,7 @@ importers: version: 5.2.2 lucide-react: specifier: ^1.61.0 - version: 1.63.0(@types/react@19.3.0)(react@19.3.1) + version: 1.67.0(@types/react@19.3.0)(react@19.3.1) react: specifier: ^19.3.1 version: 19.3.1 @@ -67,7 +67,7 @@ importers: version: 4.23.0 tailwindcss: specifier: ^4.3.3 - version: 4.3.3 + version: 4.3.4 tw-animate-css: specifier: ^1.4.0 version: 1.4.0 @@ -80,10 +80,10 @@ importers: version: 7.29.7 '@eslint-react/eslint-plugin': specifier: ^5.28.8 - version: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + version: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.13.0(jiti@2.7.0)) + version: 10.0.1(eslint@10.14.0(jiti@2.7.0)) '@graphql-codegen/cli': specifier: ^7.4.6 version: 7.4.6(@types/node@24.19.2)(graphql@17.0.2)(typescript@6.0.3) @@ -95,13 +95,13 @@ importers: version: 8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) '@rolldown/plugin-babel': specifier: ^0.2.4 - version: 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + version: 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) '@testing-library/dom': specifier: ^10.4.2 version: 10.4.2 '@testing-library/jest-dom': specifier: ^7.0.1 - version: 7.0.1(@testing-library/dom@10.4.2)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))) + version: 7.0.1(@testing-library/dom@10.4.2)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))) '@testing-library/react': specifier: ^16.3.3 version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) @@ -122,22 +122,22 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.1.2 - version: 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + version: 6.2.1(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 eslint: specifier: ^10.13.0 - version: 10.13.0(jiti@2.7.0) + version: 10.14.0(jiti@2.7.0) eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@10.13.0(jiti@2.7.0)) + version: 7.1.1(eslint@10.14.0(jiti@2.7.0)) eslint-plugin-react-refresh: specifier: ^0.5.7 - version: 0.5.7(eslint@10.13.0(jiti@2.7.0)) + version: 0.5.7(eslint@10.14.0(jiti@2.7.0)) globals: specifier: ^17.13.0 - version: 17.13.0 + version: 17.14.0 jsdom: specifier: ^30.1.3 version: 30.1.3(@noble/hashes@2.4.0) @@ -149,21 +149,21 @@ importers: version: 6.0.3 typescript-eslint: specifier: ^8.72.0 - version: 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + version: 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) vite: specifier: ^8.3.5 version: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) vitest: specifier: ^5.0.5 - version: 5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + version: 5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) packages: '@adobe/css-tools@4.5.0': resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} - '@apollo/client@4.3.5': - resolution: {integrity: sha512-phA1B82EisAHIjT6irj9Lm4I5516pASExgACUl8pzcnq5eGmNjBhImDgjSRHRt18u1Hrqw0uP71jKJtEjV/Fag==} + '@apollo/client@4.3.6': + resolution: {integrity: sha512-hGpMGPur4S5KJlWakVIKo5ly7Sp0dx+2yOiVz+gIG8S+D+deZO/Xi9mhSsdMTiGF2q1rAg5nymnQUJsctEAkKg==} peerDependencies: graphql: ^16.0.0 || ^17.0.0 graphql-ws: ^5.5.5 || ^6.0.3 @@ -206,8 +206,8 @@ packages: resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.8': - resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + '@babel/generator@7.29.12': + resolution: {integrity: sha512-2W76mhjrpQFO1lK5e8IvGYB2D0YZ7S2R1Z2BjO2ZUYuW+amcpK/z60U6ZZmzskwoa7sJ6XohP/Wg8H5KxXI/IA==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.29.7': @@ -218,8 +218,8 @@ packages: resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.29.7': - resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + '@babel/helper-create-class-features-plugin@7.29.12': + resolution: {integrity: sha512-ACxGoWMV866q/QlZHeCOaQZAR5QclKsIvkAmlDemqjm6+6Bynijs1mH068BzH2N2e+wSuDmBWY87fqKfvhi1Lw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -276,8 +276,8 @@ packages: resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.11': - resolution: {integrity: sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==} + '@babel/parser@7.29.12': + resolution: {integrity: sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==} engines: {node: '>=6.0.0'} hasBin: true @@ -315,15 +315,15 @@ packages: resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} engines: {node: '>=6.9.0'} - '@babel/runtime@8.0.8': - resolution: {integrity: sha512-dEu8nGlRqjsJsvviUUoSMfcRHpwomCiRlXsc2mPfJ79+ffTpDm+JtfUtTMzUrqCApHQnCsVPD3gT1ZT8RgBRCQ==} + '@babel/runtime@8.1.0': + resolution: {integrity: sha512-MQye/pU7gzXerMzlhScFNH1u4Je6rR8cqJWSgAfD+rIwbbtwG8tVDegoI7sWfcXkfVRW09G7vk2vjxGIuKFfwg==} '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.10': - resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==} + '@babel/traverse@7.29.12': + resolution: {integrity: sha512-MscXe/NAZcOkYEsRajHZFt3ynsb22PUi6CTrp5U7+RYycR9By84mn9mFN54YgfITiqK4hFx3Ju3tZSyzfpS5ew==} engines: {node: '>=6.9.0'} '@babel/types@7.29.11': @@ -357,8 +357,8 @@ packages: '@types/react': optional: true - '@better-auth/core@1.7.14': - resolution: {integrity: sha512-ByhdrGVwp/el+hoTYKSVOHIH23/lQj9TQ1txdGcWOg22tnfr3hJ6ukzySooeYj/R36XsQgBhkJqIp8mKsNeErA==} + '@better-auth/core@1.7.15': + resolution: {integrity: sha512-BetlCGMINY5GiQocDF9X2wD+9yWrSrAecQbcZUCDqXd2pAolPr15ZrFqYyjEXX6YKUdPPWotUmo8naE4NSyEVQ==} peerDependencies: '@better-auth/utils': ^0.4.2 || ^0.5.0 '@better-fetch/fetch': 1.3.3 @@ -371,46 +371,46 @@ packages: '@opentelemetry/api': optional: true - '@better-auth/drizzle-adapter@1.7.14': - resolution: {integrity: sha512-5RC8Ec5Ur15FWsS4As9/VrlRbB3+9EfShxIpA5A1FcD6IgPxFvzQNkAm2+FYx9LUSqx47NPf9hBTG2GUCMP9Ig==} + '@better-auth/drizzle-adapter@1.7.15': + resolution: {integrity: sha512-HtFz2WovzJGfmIobhqaHNdTUA5EuXtCp8YdyMxS8at70usce/LMlh4CVc9hPAXl49XuJaDi8vp5Z9Cgk9dQCUA==} peerDependencies: - '@better-auth/core': ^1.7.14 + '@better-auth/core': ^1.7.15 '@better-auth/utils': ^0.4.2 || ^0.5.0 drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 peerDependenciesMeta: drizzle-orm: optional: true - '@better-auth/kysely-adapter@1.7.14': - resolution: {integrity: sha512-4wkqj8a8JVpWDYLlgzfbk7eOaWCFkL6HHQd6CLamFKaC8vNsXew1x4v5dE5O6dGr8j4g5qMISS+BAvOuIvBevg==} + '@better-auth/kysely-adapter@1.7.15': + resolution: {integrity: sha512-1anYpzH3A0i6W2J9EvqMAlCCVQ3NfLUKZGquJ4LfZzS8rC7iHSntpagqEvZeerZrAydtke2rMl91SSiNtKyVcQ==} peerDependencies: - '@better-auth/core': ^1.7.14 + '@better-auth/core': ^1.7.15 '@better-auth/utils': ^0.4.2 || ^0.5.0 kysely: ^0.28.17 || ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@better-auth/memory-adapter@1.7.14': - resolution: {integrity: sha512-Ojv9BcmFyHuTHha9ZM/NUW1ut9J84wLngta+07Es0Ejn8kekqP5aHBpZd5Z8AvADs5iJUOWvQGFmGlPWAKJgBg==} + '@better-auth/memory-adapter@1.7.15': + resolution: {integrity: sha512-lsSgxCCn94QanigQrhdXOcQ2thb3ix8zOBQZySet6Tp1dK3pb+GmQ1ZQtamYgj5itvq99fEmLr4Em24XE2BTcA==} peerDependencies: - '@better-auth/core': ^1.7.14 + '@better-auth/core': ^1.7.15 '@better-auth/utils': ^0.4.2 || ^0.5.0 - '@better-auth/mongo-adapter@1.7.14': - resolution: {integrity: sha512-6IA0RSPZFMdRwwnLZ9oWnDIiD0y0o0azTHUfa01BNU2AFJgMDkeiASUV3bKcJBskzQoyQrff74eFYTsTSeeVUQ==} + '@better-auth/mongo-adapter@1.7.15': + resolution: {integrity: sha512-Pku7yZcIuvGqsGy2cLws+7en8dLPyGmP9v0BHHtxEqtsFyc+DtLvv1AzHzNKQz5v52KlbUQ5Uflx5+Le0A1ALA==} peerDependencies: - '@better-auth/core': ^1.7.14 + '@better-auth/core': ^1.7.15 '@better-auth/utils': ^0.4.2 || ^0.5.0 mongodb: ^6.0.0 || ^7.0.0 peerDependenciesMeta: mongodb: optional: true - '@better-auth/prisma-adapter@1.7.14': - resolution: {integrity: sha512-mF6t5xqeZNWzUe0ErmrSdzQmtslJscmu9X8Mp5QmROlpnnAzvSc70RILu8lHms8CePt7N34+KRH1QvYjGFrVGQ==} + '@better-auth/prisma-adapter@1.7.15': + resolution: {integrity: sha512-YMMA2HnEPFcUNw/mJWxBxoAdRV2B1ZQ8rRsBJwwTQsC6sfZVYr9f/5zslizf6J7eRpOpgqpiwumSRhdeLf1EOg==} peerDependencies: - '@better-auth/core': ^1.7.14 + '@better-auth/core': ^1.7.15 '@better-auth/utils': ^0.4.2 || ^0.5.0 '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -420,10 +420,10 @@ packages: prisma: optional: true - '@better-auth/telemetry@1.7.14': - resolution: {integrity: sha512-PtKFzsH7gje/WJuUPDjckOoNFazsq8NMt3AdiXIPzHl7tZULcNGTKAX8K7+yn0rG6cO/4mtMgpOjhtilElOnmg==} + '@better-auth/telemetry@1.7.15': + resolution: {integrity: sha512-qZq491FZNLRCFmBo97DK+wOKfKPcSMeP87BoqH1nWZc0FZi2fbS4vqmwgn9OdQU7LRjHs/757o64iao1vrvkKA==} peerDependencies: - '@better-auth/core': ^1.7.14 + '@better-auth/core': ^1.7.15 '@better-auth/utils': ^0.4.2 || ^0.5.0 '@better-fetch/fetch': 1.3.3 @@ -454,8 +454,8 @@ packages: '@csstools/css-parser-algorithms': ^4.0.2 '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-color-parser@4.2.6': - resolution: {integrity: sha512-iiPQ3iRWwnJkeEn6RIu6SJPr7hYrLz6XZ9s/QZl+2/LI5KQVjpl2fdmDSZKuD4xP6GMmMPgHFFXg6k1Wkz0Trg==} + '@csstools/css-color-parser@4.2.7': + resolution: {integrity: sha512-zgm9yjQz5iJB4VL8RyVwd71TWB8Q89FSxt/NzXoWqPSkEBOVtn9L6vAPtSc9hpKfB0Awo/AL2VKFHjYetBLFHQ==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.2 @@ -467,8 +467,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-syntax-patches-for-csstree@1.1.15': - resolution: {integrity: sha512-J0u7HkVl2nzSlhsiTOp4AmwcUQ3D+mGEEKfBy/7To5/y7F2OHwyLrXfrhR0SMgr4p5Lo+eaMVSeai24zUcBIxA==} + '@csstools/css-syntax-patches-for-csstree@1.1.16': + resolution: {integrity: sha512-LsDbJPP/B8cPasUJyTA5S99F7C4G93ngW8hUluXz8CFeOaaRnBPtBiIlvgcPYU0HmHNz8CXg+1vwFrIB4F6Dgw==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: @@ -726,8 +726,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/batch-execute@10.3.0': - resolution: {integrity: sha512-mj46zB15w4ZvtX4dNAOOmdq+90hKGj4zNzSWlQu23sQWEzPTA2GGO5NcGIFgd+oThsf4yqg4cK2rhH9o7LoM6Q==} + '@graphql-tools/batch-execute@10.3.1': + resolution: {integrity: sha512-DlJlKeTl1VGRZjkFkS2ADpS5G6ayTVQjDp/exmhs+1FP1iEkrM4t2WKQE1Hg6Tt0h5yi4zwWjYMNT/WFmuI1IQ==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -738,8 +738,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/delegate@12.3.1': - resolution: {integrity: sha512-j3B7LjXpEhcT45zLoNmkJ/cJxbjdlWBiorkJH4TJiPDFvyeHtcqw5WZKDJ+P09Xg26D8Ewv+1GyvJpzy8a3q3A==} + '@graphql-tools/delegate@12.3.2': + resolution: {integrity: sha512-dBpoIZYwdkPct+fvdy3CWUEcgYJkRy8dYyHJTJpg+Jqmq+XYrYKDpM69/ktlao2zJw8VWL2sdv7nGb0bVw/Jgg==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -762,8 +762,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor-http@3.5.0': - resolution: {integrity: sha512-CsiYRCUFLjkewTDoIefCeBk9+9Kw+QjjEXq+YHFi+IabaEmGvnhhdC4yqnX0wnDTNCz2+V4NyMYP9i0PbcrrGA==} + '@graphql-tools/executor-http@3.6.0': + resolution: {integrity: sha512-Z09GYFYH6Up7UGJys8XrZXgAvZKSrF/op3vhGAbdBntVOc02PahOP/RgW9fqzXBHzWcmmSpXqlxCTVCObgOvLA==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -858,8 +858,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/wrap@11.2.3': - resolution: {integrity: sha512-QHhXloj6z7Z0WmPR8MYlc4/fR1DmKPeqNH7FuNchG9/D3aDjViO1gZtPuXRR5zX4Oz/fmocDfXqeO/HiMv9myA==} + '@graphql-tools/wrap@11.2.4': + resolution: {integrity: sha512-B0miEWDoH/FwEB+wGwFfsFWcBtL66ag0O+WbcV2P2ztYQvG3tgtwn9efRZ6Fu2MjvvaboMoqWL1ftuCWsYh/rA==} engines: {node: '>=20.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -1081,8 +1081,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.155.0': - resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} + '@oxc-project/types@0.156.0': + resolution: {integrity: sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==} '@react-router/dev@8.5.1': resolution: {integrity: sha512-1NQ/lP8m7Kd9G4cGKPoEMZe0qcWOnRkf8QxpAcnX/3V5wJp+/mDvM9QUqwUxI+RywytNNGtc4uuDFhwt0xMLbg==} @@ -1145,98 +1145,98 @@ packages: '@repeaterjs/repeater@3.1.0': resolution: {integrity: sha512-TaoVksZRSx2KWYYpyLQtMQXXeS98VsgZImzW65xmiVgbYhXLk+aEsmzPLirqVuE4/XuUapH2iMtxUzaBNDzdSQ==} - '@rolldown/binding-android-arm-eabi@1.2.15': - resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==} + '@rolldown/binding-android-arm-eabi@1.2.16': + resolution: {integrity: sha512-ia3DwAs0OsMGS7+IConptSiyk9pEXkOx/AbJ2n/lAGxH3QkWQus1t8d7gnAT38FCU2sQu8lUbeR6AiZFv4JxaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.15': - resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==} + '@rolldown/binding-android-arm64@1.2.16': + resolution: {integrity: sha512-kx5wBiMB6E7TEvpl2B9gjLU004BkvEm2Dr941BFjx/SontPwSzNuQUIoVKxHHoSjpFIfHMmcguyLOtyn0hObRg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.15': - resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==} + '@rolldown/binding-darwin-arm64@1.2.16': + resolution: {integrity: sha512-qslZrXnKJU4cUpjoAmtAo/KQM9e2IRMlmpig6Zpwj+8KWxW8v+nkAf9216Bsek9lOC1jvg2yCjygCFo2f83msQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.15': - resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==} + '@rolldown/binding-darwin-x64@1.2.16': + resolution: {integrity: sha512-FdF+y48ND13eAyM2mQn+85kvAqNlvRWROy2rhgA463X/0Gv4vGtazZtfaF1mRBLscYvtOlh4QnLjOWiFzX69OQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.15': - resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==} + '@rolldown/binding-freebsd-x64@1.2.16': + resolution: {integrity: sha512-ddjqFM5e95AgLbUPtKIS7V1KTVlA0RUgCVr5mn+/IEhsdy3pr+Vuj/HZ7nlMN2FyxIwUktOH1LEPIQXO1v9y1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.15': - resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.16': + resolution: {integrity: sha512-tHdKWbFkFBI687iim3LIyIvyL7j66VvQYkDPss5Stn/qyE2tWkR1YD0dXmXPFKKqT/o5ZEJVsaRsWS2meQwGOA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.15': - resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==} + '@rolldown/binding-linux-arm64-gnu@1.2.16': + resolution: {integrity: sha512-FJiLGAblPBMlBEdbOqw6kW6QcXDWAf/oJu7gYs9ZJZwmg+K+/zjFLxPTIY9izJUzxzc24FHvmseyA0IvJSl17w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.15': - resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==} + '@rolldown/binding-linux-arm64-musl@1.2.16': + resolution: {integrity: sha512-hrJpblMsrQ58U9veWpbXzkhV5zStunds6HWLprqq1qauvgBr1E6P+24kLj6lSLI9vjRn/RYpjprhkHQPKGWpNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.15': - resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==} + '@rolldown/binding-linux-ppc64-gnu@1.2.16': + resolution: {integrity: sha512-qJd/dC6j6CwLG9/s/RP2nb1RZ0GIgj7Ioj7x/SYa3RzjVrlzrmH0fhIOpfvqQDeIsdP0loi+kHaMhJzY1PBIaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.15': - resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==} + '@rolldown/binding-linux-s390x-gnu@1.2.16': + resolution: {integrity: sha512-Vx7Xg5uUJuNcujJjI70OICaH0EYj80BtOLZTSN7uOYg8QOLlyKnaG0IW7Fn/J0IpJsaKzmDKMhOQv1JBM9m9vg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.15': - resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==} + '@rolldown/binding-linux-x64-gnu@1.2.16': + resolution: {integrity: sha512-TNKhgE3uJTsTzatUSSYt0Kgo+Oa2uSlSjz4r1aEIea7HX6ULBym4fAlYUhG1i6pjNf2njfCUAfKwr6C3E9Xg1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.15': - resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==} + '@rolldown/binding-linux-x64-musl@1.2.16': + resolution: {integrity: sha512-7chXdpjXZ8qG0+mIxECN3cT9kvhZ3/oZhMX6Pp876P7CDrIy8nJswva6Mq357JR7eYXfuskwZxMeV1SzoZdHrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.15': - resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==} + '@rolldown/binding-openharmony-arm64@1.2.16': + resolution: {integrity: sha512-Kwjt+7uNTJK5/MDkGWGVO2KQPnj8yAV75dMpfwyHZrJSXWHrniOB0aUEWlVYf3H1hOqFLIStLdM5QXq6bnKmOQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.15': - resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==} + '@rolldown/binding-win32-arm64-msvc@1.2.16': + resolution: {integrity: sha512-/LH6WfjDRXXJz/p5xl4TmU+jpcnwcxbKEQBW/GZE0JHfN0lGIyTtsUEGaQ/q/GikkGJ2yLKe6pwm7AnEWO8pdw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.15': - resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==} + '@rolldown/binding-win32-x64-msvc@1.2.16': + resolution: {integrity: sha512-1lv1KvX0Z871zfk7vw+dnXMMnHNyDwMzWG8Kv3HxDXMOhzCX4SHc7HK319fInP0i+0p9D8brkfzL7pJOaGl+tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1275,71 +1275,70 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tailwindcss/node@4.3.3': - resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} + '@tailwindcss/node@4.3.4': + resolution: {integrity: sha512-b7QK/QG04v3j04NbpG82XLCedRyulnkuwUDwRa9oK/ypnJIzMapz2Wg+0TltVczjUzDaJJHIa1+jj9aMUOFMTQ==} - '@tailwindcss/oxide-android-arm64@4.3.3': - resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + '@tailwindcss/oxide-android-arm64@4.3.4': + resolution: {integrity: sha512-qkjxt+EFocOi3mtsUS3ndlj6yj4SHubwBdvBynLnS8T4mvSzX0Enn0CpypJKmBEtczUAXOHVZKA2zTGzSNU2Sg==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.3.3': - resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + '@tailwindcss/oxide-darwin-arm64@4.3.4': + resolution: {integrity: sha512-i/awUA/7mJQAbA3AzCW8aQtUh5goMieUdF1zOoclLaJUCxDvsXQ8VJqpQZY3dfcHS6PJjd3tw25nNneD/mEviQ==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.3.3': - resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + '@tailwindcss/oxide-darwin-x64@4.3.4': + resolution: {integrity: sha512-q56V9U6AnoYz/yj/alkDLhSQ9AZoXQSEl93f7WETa0+32CudbqM57BXdYXfMYPKudueXKaA+MG6L/0KRseF7Jg==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.3.3': - resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + '@tailwindcss/oxide-freebsd-x64@4.3.4': + resolution: {integrity: sha512-r0W7A+Z9HTHh7bwihJl45E/zZKLjxD50/jToVF/E/RZHSl8+EWO+4yKKJpPMcUooT9hdoip3Zx1uWnbMg4N79g==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': - resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.4': + resolution: {integrity: sha512-3aih/sRxzeYfi2Bkh+bGYNf2YU9Llamb2mpA7BNF1obYzdgEeWDAMQzK6BSwzLhs/eTdOaSur92qrGfchagUtQ==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': - resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.4': + resolution: {integrity: sha512-ktJSrPGQou4OqL88rDEx5CkeM9BjzrwZvYo8u7B7VL1zkBa2XBm351o4MQrek95qikb2M++26Y7w7vbH6Mgl8g==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.3.3': - resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.4': + resolution: {integrity: sha512-rt3hjUxT7utAtcB+df6wHyaXDyxhE7Zd1x7L/nvB5Jb2qBb8dZwFUoWqeRja1BaF5OlSqkKSjBmVXj9OsevmCQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.3.3': - resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.4': + resolution: {integrity: sha512-XE3jO2yOOWjttpeGvpwf3/b274NMi3QapQSAI/EzsgrmYNan1Tw8dXT9JQkN7K0OgvuqiC8mcCyNvGzEkpVJPQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.3.3': - resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + '@tailwindcss/oxide-linux-x64-musl@4.3.4': + resolution: {integrity: sha512-PaAZ2FjJaZk9SQLYtKIfQWiFm/xtl7pX2MKPgCzn0mS/VU54yu+vP457AJdB2XFLxU3gO2abLCt8N7Lg4EbKNg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.3.3': - resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] + '@tailwindcss/oxide-wasm32-wasi@4.3.4': + resolution: {integrity: sha512-bjO9WmoM687p8AoCIyw1DUqzpAs4JICLvNmIPxIWDmhw8IOsdubtWQLShyJmISnDKtRy1BBApHVOUl6sNFQQJA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} bundledDependencies: - '@napi-rs/wasm-runtime' - '@emnapi/core' @@ -1348,24 +1347,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': - resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.4': + resolution: {integrity: sha512-jCrwCvWVtt7ruMXp6dFPd5KBNU8o1tWtEdZbTL/w/hvD3lUYZA0E2mmfvTzW4QLHIx5wGQU9HeY7997R1QTrEg==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.3.3': - resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.4': + resolution: {integrity: sha512-cge1wcedn1FrRSXL22lF5sNDYr8c9+VImk7zFYLPs12jkDmchSrZNfzWqOKub+5Hb/aYRdDEqERGGDKONBlOzQ==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.3.3': - resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + '@tailwindcss/oxide@4.3.4': + resolution: {integrity: sha512-riqsRw2sLF7B1sNCCkTl3KYXEqvhTiABzZ/4oxxHfZ3c3Td60bCBfOrUuUGOiHagd3E7V+zG46c+XBDWZGFBcg==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.3.3': - resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} + '@tailwindcss/vite@4.3.4': + resolution: {integrity: sha512-wGukGWb8SVuN7+FJvSS7M5eSJWDIWwVSvUvj1q41eTIhGPsS2DAgFWjA7YURJNwjHSgty59Hz8iMUiyO+YMHBQ==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 @@ -1461,8 +1460,8 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/estree@1.0.10': + resolution: {integrity: sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1543,13 +1542,13 @@ packages: resolution: {integrity: sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-react@6.1.2': - resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==} + '@vitejs/plugin-react@6.2.1': + resolution: {integrity: sha512-9KyWCij3r0+qLG3Q62vBmv0VyevmYibAtxaCIVK9o0k6CXgaajZRIe8tpfchQcdZArJ5b/7OrIz4W3b2uxVRDA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 || ^0.3.0 babel-plugin-react-compiler: ^1.0.0 - oxc-transform-react: ^0.152.0 + oxc-transform-react: '>=0.152.0 <0.157.0' vite: ^8.0.0 peerDependenciesMeta: '@rolldown/plugin-babel': @@ -1559,8 +1558,8 @@ packages: oxc-transform-react: optional: true - '@vitest/mocker@5.0.5': - resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} + '@vitest/mocker@5.1.0': + resolution: {integrity: sha512-5umB9/jlWcqVS6fsrFmv5Gdnpu6wAUio/lEOwAmvB7v+lFo/IW2B9FhAD0p19GCULTgMzLCdUmuCDCnAzWgppQ==} peerDependencies: msw: ^2.4.9 || ^3.0.0 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1570,8 +1569,8 @@ packages: vite: optional: true - '@vitest/spy@5.0.5': - resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} + '@vitest/spy@5.1.0': + resolution: {integrity: sha512-2DPO5OMHWKrBngC+fCmTQqemNF0gidRhp3lxbBmRhW+M1XJrfgPpqNqWVevXtn2f2ufD5ZaR1B6B641aAlcX5A==} '@whatwg-node/disposablestack@0.0.6': resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} @@ -1656,8 +1655,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.4.0: - resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} + ansi-regex@6.5.0: + resolution: {integrity: sha512-zhvbbbdt1kbw7EJ9OQoxmQcuaNR9P5kTj7e/YdmOSU10aHWbycofJxA6jKfoEy3vlLdctOF9ZHaxLtmSm998wQ==} engines: {node: '>=12'} ansi-styles@5.2.0: @@ -1708,8 +1707,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.11.34: - resolution: {integrity: sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==} + baseline-browser-mapping@2.11.35: + resolution: {integrity: sha512-GNk8KX52CHqeNKGk8+7tZnQab/2k1t/BgrUHPKNdijzpEhF1saPQZHVKb6m5loSAxB39gyrTYw34Qf9CQ3u1qQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -1717,8 +1716,8 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - better-auth@1.7.14: - resolution: {integrity: sha512-QxDCI0pOCCHDYmruisKhKyrvOJ6Icv9xg0RA6ZUysfKFXENYwhNNpwUlkE/NmViH2nDMgkKcymmLr55pnpR9vw==} + better-auth@1.7.15: + resolution: {integrity: sha512-x2HmrQZy9yTG3H9iJ9pvaVGmLbI++ynOcJ3SGqFZnhEDscQSpG+1P9Xv41ceje2vw7dVE5+BbImDGneyhtW2Vg==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -1830,8 +1829,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001819: - resolution: {integrity: sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==} + caniuse-lite@1.0.30001820: + resolution: {integrity: sha512-gfWD6MxqVCqAOwmODfZf7DchWvlrA+SRdNX7ceLfg3xRqe5ssjjpF7EgslC/0tiLiNTajdaNN/q8c/5u/7Gz8w==} chai@6.3.0: resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} @@ -1841,8 +1840,8 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case-all@2.1.0: - resolution: {integrity: sha512-v6b0WWWkZUMHVuYk82l+WROgkUm4qEN2w5hKRNWtEOYwWqUGoi8C6xH0l1RLF1EoWqDFK6MFclmN3od6ws3/uw==} + change-case-all@2.2.0: + resolution: {integrity: sha512-/BSm9RoX2fl1bcfZI5dHLOGPqsH0Yf5igEPs76SUGZs52EryPcNrSyJUCNcYNrH5VTThnHDmDs0vjPasNeBOLg==} change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -1921,8 +1920,8 @@ packages: resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} engines: {node: '>=12'} - confbox@0.3.1: - resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} + confbox@0.3.2: + resolution: {integrity: sha512-ZUAKhKlkCOrIGKc8cj7zek9s9z1mveHif/25nUshI2BzCRzF7KH7KHa+Lnh2ubq+e1tIlaFuP763mzW4qVoehg==} content-disposition@2.0.1: resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} @@ -2113,26 +2112,26 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.467: - resolution: {integrity: sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==} + electron-to-chromium@1.5.474: + resolution: {integrity: sha512-t1DE2RM6wtco58TQ47NcKw0CXw4fT3gWQvj49kkNBzMrUX3m9Sq/SoKcjEfwa9vvQ6sKYlqi/g05vG2tKLWH4w==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + encodeurl@2.0.1: + resolution: {integrity: sha512-Ev/hIyePLZtpL98x562lvPtenrUfGr0lfaf44HFZ+hDEwso7ccV9QAZrEVLg0hxNAzygaAFxy2dYaAKKM0G06A==} engines: {node: '>= 0.8'} - enhanced-resolve@5.26.0: - resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} + enhanced-resolve@5.26.1: + resolution: {integrity: sha512-PPnnSJq3azKOIewXR/uppBV/6h98dprBJ/WaQ9Qgj10xX1lJLNfg+XShpbsrSqcDSy2yYYyhfXM1wWhftqgyzw==} engines: {node: '>=10.13.0'} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - entities@8.1.0: - resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} + entities@9.0.0: + resolution: {integrity: sha512-oJFNDJg3kTPwAD1cNn2+WmUq4wFoo09npc3Ydf1D7ED4smRiWrsKnaLxykrTWgyGEcusc87P5dxlAleol9kpkg==} engines: {node: '>=20.19.0'} env-paths@2.2.1: @@ -2255,8 +2254,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.13.0: - resolution: {integrity: sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==} + eslint@10.14.0: + resolution: {integrity: sha512-T0pNsxkb9IKmtQjhpK3d7nWOpFv+YHuMbTJnSVMoQblF0onvXfErrtp4V1jHtsQPan7dKaGVD0q1WCXnzMF31A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -2460,8 +2459,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@17.13.0: - resolution: {integrity: sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==} + globals@17.14.0: + resolution: {integrity: sha512-UtdkTVyAJePQv0J2M9Xe4L0ruNSDV314XiIJsADI2Zf40bcdAonE/D/OhAU8AT99oij9mhLByb+NvA3QWZYgCg==} engines: {node: '>=18'} globby@11.1.0: @@ -2588,8 +2587,8 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ip-address@10.7.5: - resolution: {integrity: sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==} + ip-address@10.7.6: + resolution: {integrity: sha512-00LYkM6byILa9eQIx6qoaXCM40xTLd56AZ4vyaPW3YTyb49VZYPo5xsiAq4tuQ54GH4R7gVdYScJ1B7B77PuTg==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -2725,8 +2724,8 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - jose@6.2.13: - resolution: {integrity: sha512-7TIg10ZE1x82YediN+lcrPNvGMKge9yFHQD+Qho/b8y2adfugU3AsvvHfxV0fzyFllT6l9xCjf4RWY9g/Z9PJQ==} + jose@6.2.15: + resolution: {integrity: sha512-qdF6ewcZARtef63fJ9AKKZPgxw+t7USH6HLXYcD4CrdmSvDp79rpJSPFEKc90QBeGS63u1KQtN2MZQHC0yDIzA==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2787,81 +2786,44 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - kysely@0.29.7: - resolution: {integrity: sha512-fmIq+7kv4WbFm2tcfznRzikqB4cuNpgZ40PSU2fAJ2/OO5XhojqnTPrmgrCjYSRJVwBln03XcRXJGnw9H099IQ==} + kysely@0.29.8: + resolution: {integrity: sha512-ixHU1H4R+LeC5Y0nAhYgiGRFpFRHm2DXKEmJSs/vbes9sKXyssyzxzE/NYiOJX5fY0BL28biCre3GqlCqUwyXQ==} engines: {node: '>=22.0.0'} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - lightningcss-darwin-arm64@1.33.0: resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - lightningcss-darwin-x64@1.33.0: resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - lightningcss-freebsd-x64@1.33.0: resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - lightningcss-linux-arm-gnueabihf@1.33.0: resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - lightningcss-linux-arm64-gnu@1.33.0: resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} @@ -2869,13 +2831,6 @@ packages: os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} @@ -2883,13 +2838,6 @@ packages: os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} @@ -2897,13 +2845,6 @@ packages: os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} @@ -2911,34 +2852,18 @@ packages: os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - lightningcss-win32-arm64-msvc@1.33.0: resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - lightningcss-win32-x64-msvc@1.33.0: resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - lightningcss@1.33.0: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} @@ -2984,8 +2909,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@1.63.0: - resolution: {integrity: sha512-GkBfQG+FUJ41x6y3/lNXiOziVU0Rcqqq0TCzhHS8avsFXHZmOdmfBqsVTvHSaVmbI+wbdGkxHRmhYWhD3N4/yA==} + lucide-react@1.67.0: + resolution: {integrity: sha512-z7kd21YNm/Gw3E7mTnq5dTuvV+yc+OEwA//oDENSG1SbZ/NVgKdjxALJFNdGoC0Ji7HaJR2Dha9ev7VUPxy9CQ==} peerDependencies: '@types/react': '*' react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2997,9 +2922,6 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@1.4.5: resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==} @@ -3116,8 +3038,8 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-releases@2.0.60: - resolution: {integrity: sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==} + node-releases@2.0.63: + resolution: {integrity: sha512-6li2QanLsAXpIH2R6j77MzRyvOyrvdTqlKtO4CgBdHGNvN99ZZfyxszHc5o5+IZBWD5u6Hzwg83JoGXmqZNG9Q==} engines: {node: '>=18'} normalize-path@2.1.1: @@ -3222,8 +3144,8 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parse5@8.0.1: - resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + parse5@8.1.0: + resolution: {integrity: sha512-sq3qBFpee5jeocbFbO48VHlGr8sT7mbXS0vxlKN6sottBtJzrOG3998sr0llSZcQAGgfpdmEYAIZE0P9z0dE8w==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -3329,8 +3251,8 @@ packages: resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} engines: {node: '>=20'} - qs@6.17.0: - resolution: {integrity: sha512-5LK5BZ2XDHMvcUJaf0CQ5HL3aVgKbpklvByC7qLSxYkfE8COEEbJg5xCHWCTqzqi0Gs4Jn5Mv5v3R38W6edscA==} + qs@6.17.1: + resolution: {integrity: sha512-jd3COkaKVgGUW+ZHyEHCG9bH7RoaaiWuMgzsIBjUMVjLAaWGWpoUAVwljVvBHxRu/2qEHnadLGZrkutYUBPQJA==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -3423,8 +3345,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.2.15: - resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==} + rolldown@1.2.16: + resolution: {integrity: sha512-bWvlMpFKiTfDKfnK7FC2MPgPeWCf/Kpwsq49ApdW+FQaBZb6O6dZ4MAPbPUjp7hYQrw/RobqCzn64BRrQecGHw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3461,12 +3383,12 @@ packages: scheduler@0.28.0: resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + semver@6.3.2: + resolution: {integrity: sha512-GYrCADwpu6yV5OAvchkQ27Z5wwMxWAEMg5NNWjyHh/5DboFFqbdbvYNIvZouQpxXyeMPoTOh0vdPYKlf0ZswdQ==} hasBin: true - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + semver@7.8.6: + resolution: {integrity: sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==} engines: {node: '>=10'} hasBin: true @@ -3478,8 +3400,8 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - set-cookie-parser@3.2.1: - resolution: {integrity: sha512-Npd1Pt+4zb3BrSZDPd2qFwRpS6b1EUEasRrO8xS0zMJi0fApXXK5YuzP0minyJnxwnFHoVoJwA55q0A0cu63gQ==} + set-cookie-parser@3.2.2: + resolution: {integrity: sha512-df017qMeYuXo4emL09nlyMpi2i2MtEIKS/6jtXH3vmjFgIRsOi852/5RmhJ4EkvN3ZF8jXadM/EkTPXgc8yPIw==} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -3575,8 +3497,8 @@ packages: string-env-interpolation@1.0.1: resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} - string-ts@2.3.1: - resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==} + string-ts@2.4.0: + resolution: {integrity: sha512-JOrTlmqL2wGvXZI+4RLzSAAqvhQL3rXOmSCLoacd9MC5hIj20xoa7CfYBEApBDncf+hhvbGi6atCy7LyweWRKQ==} string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} @@ -3621,14 +3543,14 @@ packages: resolution: {integrity: sha512-tTw2sPVgJb/ZO+Uz5Cs1haWg7aL0cw+DvD8mXos+ws5YaelM3IBZ50M717T1+RD5Qq0TdeZ/EI/wVMnAdJA0Eg==} engines: {node: '>=22.12.0'} - systeminformation@5.33.18: - resolution: {integrity: sha512-SF8DBQx3ypa8zDqZlezpHQ6M2g7TrqSEWpAtC4OsHCdLmi7J2WdxaSbA8/DJyEn2l/CHPrW0VFenoqoDccrw6g==} + systeminformation@5.33.19: + resolution: {integrity: sha512-Zm7wGeCG7PqfvzegMJIzrxICopWqYCeLATVmvxOOci1isLcNVKgY4Fr0hhYQzvc7cgtK3377jQVChTFAnznOiA==} engines: {node: '>=10.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - tailwindcss@4.3.3: - resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} + tailwindcss@4.3.4: + resolution: {integrity: sha512-PCJZTFFdG+sL3gvnP1Do9o6GbkvH2q0p04xSs3f7cSvmAeK+sttG+/7ncK1fdRwKFfC7n+wDDJaOMBSefkI9ow==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} @@ -3641,8 +3563,8 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@6.2.2: - resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} + tinybench@6.2.3: + resolution: {integrity: sha512-Al01C2JIBnO2CXCAPbpAl6sUiOZHeThGtHYNTa51JRw9PyWOCdr+9Ong05R4qg/Sk3+H645E8ov1h2c58ityNw==} engines: {node: '>=20.0.0'} tinyexec@1.3.1: @@ -3702,6 +3624,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tslib@2.9.1: + resolution: {integrity: sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==} + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} @@ -3839,20 +3764,20 @@ packages: yaml: optional: true - vitest@5.0.5: - resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} + vitest@5.1.0: + resolution: {integrity: sha512-MzmNFnrwa8v8lF1bLxw3UJ4EREwVOVb75VqJZmUDRjJ6EluK/x9th7qTbaeDk41WxE1GxWqmTXcdsfobfH5sOA==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.5 - '@vitest/browser-preview': 5.0.5 + '@vitest/browser-playwright': 5.1.0 + '@vitest/browser-preview': 5.1.0 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.5 - '@vitest/coverage-v8': 5.0.5 - '@vitest/ui': 5.0.5 + '@vitest/coverage-istanbul': 5.1.0 + '@vitest/coverage-v8': 5.1.0 + '@vitest/ui': 5.1.0 happy-dom: '*' jsdom: '*' vite: ^6.4.0 || ^7.0.0 || ^8.0.0 @@ -3930,8 +3855,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.22.0: - resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} + ws@8.22.1: + resolution: {integrity: sha512-oyL6OPYme/CmiFvNuGzeoxCJ4nOrZE2O1FwM9MWM1AsGri6nLXB2pg+lNA8aLeXMSav0J6eIVS1j6vUPzUtK9g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3998,7 +3923,7 @@ snapshots: '@adobe/css-tools@4.5.0': {} - '@apollo/client@4.3.5(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.0))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2)': + '@apollo/client@4.3.6(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.1))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2) '@wry/caches': 1.0.1 @@ -4008,15 +3933,15 @@ snapshots: graphql-tag: 2.12.7(graphql@17.0.2) optimism: 0.18.1 rxjs: 7.8.2 - tslib: 2.8.1 + tslib: 2.9.1 optionalDependencies: - graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.0) + graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.1) react: 19.3.1 react-dom: 19.3.1(react@19.3.1) '@ardatan/relay-compiler@13.0.2(graphql@17.0.2)': dependencies: - '@babel/runtime': 8.0.8 + '@babel/runtime': 8.1.0 graphql: 17.0.2 immutable: 5.1.9 invariant: 2.2.4 @@ -4024,7 +3949,7 @@ snapshots: '@asamuzakjp/css-color@7.1.9': dependencies: '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) - '@csstools/css-color-parser': 4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-color-parser': 4.2.7(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) '@csstools/css-tokenizer': 4.0.2 lru-cache: 11.5.3 @@ -4047,26 +3972,26 @@ snapshots: '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 + '@babel/generator': 7.29.12 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.10 - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.12 '@babel/types': 7.29.11 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.1 + semver: 6.3.2 transitivePeerDependencies: - supports-color - '@babel/generator@7.29.8': + '@babel/generator@7.29.12': dependencies: - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/types': 7.29.11 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -4082,9 +4007,9 @@ snapshots: '@babel/helper-validator-option': 7.29.7 browserslist: 4.29.5 lru-cache: 5.1.1 - semver: 6.3.1 + semver: 6.3.2 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-class-features-plugin@7.29.12(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.29.7 @@ -4092,8 +4017,8 @@ snapshots: '@babel/helper-optimise-call-expression': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.10 - semver: 6.3.1 + '@babel/traverse': 7.29.12 + semver: 6.3.2 transitivePeerDependencies: - supports-color @@ -4101,14 +4026,14 @@ snapshots: '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.12 '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.12 '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color @@ -4118,7 +4043,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.12 transitivePeerDependencies: - supports-color @@ -4133,13 +4058,13 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-member-expression-to-functions': 7.29.7 '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.12 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.12 '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color @@ -4155,7 +4080,7 @@ snapshots: '@babel/template': 7.29.7 '@babel/types': 7.29.11 - '@babel/parser@7.29.11': + '@babel/parser@7.29.12': dependencies: '@babel/types': 7.29.11 @@ -4181,7 +4106,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.12(@babel/core@7.29.7) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) @@ -4201,20 +4126,20 @@ snapshots: '@babel/runtime@7.29.10': {} - '@babel/runtime@8.0.8': {} + '@babel/runtime@8.1.0': {} '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/types': 7.29.11 - '@babel/traverse@7.29.10': + '@babel/traverse@7.29.12': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 + '@babel/generator': 7.29.12 '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/template': 7.29.7 '@babel/types': 7.29.11 debug: 4.4.3 @@ -4228,7 +4153,7 @@ snapshots: '@base-ui/react@1.9.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': dependencies: - '@babel/runtime': 8.0.8 + '@babel/runtime': 8.1.0 '@base-ui/utils': 0.5.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@floating-ui/react-dom': 2.1.9(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@floating-ui/utils': 0.2.12 @@ -4240,7 +4165,7 @@ snapshots: '@base-ui/utils@0.5.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': dependencies: - '@babel/runtime': 8.0.8 + '@babel/runtime': 8.1.0 '@floating-ui/utils': 0.2.12 react: 19.3.1 react-dom: 19.3.1(react@19.3.1) @@ -4249,47 +4174,47 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - '@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)': + '@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)': dependencies: '@better-auth/utils': 0.5.1 '@better-fetch/fetch': 1.3.3 '@standard-schema/spec': 1.1.0 better-call: 1.4.4(zod@4.6.7) - jose: 6.2.13 - kysely: 0.29.7 + jose: 6.2.15 + kysely: 0.29.8 nanostores: 1.5.5 zod: 4.6.7 - '@better-auth/drizzle-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': + '@better-auth/drizzle-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5) '@better-auth/utils': 0.5.1 - '@better-auth/kysely-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7)': + '@better-auth/kysely-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.8)': dependencies: - '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5) '@better-auth/utils': 0.5.1 optionalDependencies: - kysely: 0.29.7 + kysely: 0.29.8 - '@better-auth/memory-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': + '@better-auth/memory-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5) '@better-auth/utils': 0.5.1 - '@better-auth/mongo-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': + '@better-auth/mongo-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5) '@better-auth/utils': 0.5.1 - '@better-auth/prisma-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': + '@better-auth/prisma-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)': dependencies: - '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5) '@better-auth/utils': 0.5.1 - '@better-auth/telemetry@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)': + '@better-auth/telemetry@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)': dependencies: - '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5) '@better-auth/utils': 0.5.1 '@better-fetch/fetch': 1.3.3 @@ -4322,7 +4247,7 @@ snapshots: '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-color-parser@4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': + '@csstools/css-color-parser@4.2.7(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: '@csstools/color-helpers': 6.1.2 '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) @@ -4333,7 +4258,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-syntax-patches-for-csstree@1.1.15(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.16(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -4353,7 +4278,7 @@ snapshots: object-treeify: 1.1.33 open: 8.4.2 picomatch: 4.0.7 - systeminformation: 5.33.18 + systeminformation: 5.33.19 undici: 7.30.1 which: 4.0.0 yocto-spinner: 1.2.2 @@ -4365,113 +4290,113 @@ snapshots: '@envelop/instrumentation': 1.0.1 '@envelop/types': 5.2.2 '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + tslib: 2.9.1 '@envelop/instrumentation@1.0.1': dependencies: '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + tslib: 2.9.1 '@envelop/types@5.2.2': dependencies: '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + tslib: 2.9.1 - '@eslint-community/eslint-utils@4.10.1(eslint@10.13.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.14.0(jiti@2.7.0))': dependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/ast@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.72.1 '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/core@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/core@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/eslint-plugin@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/eslint-plugin@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-dom: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-jsx: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-naming-convention: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-rsc: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-web-api: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-x: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-dom: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-jsx: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-naming-convention: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-rsc: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-web-api: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-x: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/eslint@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/eslint@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/jsx@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/jsx@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/shared@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/shared@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 zod: 4.6.7 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/var@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/var@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.72.1 '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color @@ -4491,9 +4416,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.13.0(jiti@2.7.0))': + '@eslint/js@10.0.1(eslint@10.14.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -4531,11 +4456,11 @@ snapshots: dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/cli@7.4.6(@types/node@24.19.2)(graphql@17.0.2)(typescript@6.0.3)': dependencies: - '@babel/generator': 7.29.8 + '@babel/generator': 7.29.12 '@babel/template': 7.29.7 '@babel/types': 7.29.11 '@graphql-codegen/client-preset': 6.2.3(graphql@17.0.2) @@ -4568,7 +4493,7 @@ snapshots: shell-quote: 1.12.0 string-env-interpolation: 1.0.1 ts-log: 3.0.3 - tslib: 2.8.1 + tslib: 2.9.1 yaml: 2.9.1 yargs: 18.2.0 transitivePeerDependencies: @@ -4597,7 +4522,7 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/core@6.2.2(graphql@17.0.2)': dependencies: @@ -4605,7 +4530,7 @@ snapshots: '@graphql-tools/schema': 10.1.5(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/gql-tag-operations@6.1.1(graphql@17.0.2)': dependencies: @@ -4614,32 +4539,32 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) auto-bind: 5.0.1 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/plugin-helpers@7.4.2(graphql@17.0.2)': dependencies: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) - change-case-all: 2.1.0 + change-case-all: 2.2.0 common-tags: 1.8.2 graphql: 17.0.2 import-from: 4.0.0 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/schema-ast@6.1.1(graphql@17.0.2)': dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/typed-document-node@7.2.0(graphql@17.0.2)': dependencies: '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2) '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2) auto-bind: 5.0.1 - change-case-all: 2.1.0 + change-case-all: 2.2.0 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/typescript-operations@6.2.0(graphql@17.0.2)': dependencies: @@ -4648,7 +4573,7 @@ snapshots: '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2) auto-bind: 5.0.1 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-codegen/typescript@6.1.2(graphql@17.0.2)': dependencies: @@ -4666,12 +4591,12 @@ snapshots: '@graphql-tools/relay-operation-optimizer': 7.1.14(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) auto-bind: 5.0.1 - change-case-all: 2.1.0 + change-case-all: 2.2.0 dependency-graph: 1.0.0 graphql: 17.0.2 graphql-tag: 2.12.7(graphql@17.0.2) parse-filepath: 1.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-hive/signal@2.1.0': {} @@ -4681,16 +4606,16 @@ snapshots: '@whatwg-node/fetch': 0.12.1 graphql: 17.0.2 sync-fetch: 0.7.1 - tslib: 2.8.1 + tslib: 2.9.1 - '@graphql-tools/batch-execute@10.3.0(graphql@17.0.2)': + '@graphql-tools/batch-execute@10.3.1(graphql@17.0.2)': dependencies: '@graphql-hive/signal': 2.1.0 '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/code-file-loader@8.1.43(graphql@17.0.2)': dependencies: @@ -4698,26 +4623,26 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) globby: 11.1.0 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 unixify: 1.0.0 transitivePeerDependencies: - supports-color - '@graphql-tools/delegate@12.3.1(graphql@17.0.2)': + '@graphql-tools/delegate@12.3.2(graphql@17.0.2)': dependencies: - '@graphql-tools/batch-execute': 10.3.0(graphql@17.0.2) + '@graphql-tools/batch-execute': 10.3.1(graphql@17.0.2) '@graphql-tools/executor': 2.1.0(graphql@17.0.2) '@graphql-tools/schema': 10.1.5(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/documents@1.0.2(graphql@17.0.2)': dependencies: graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/executor-common@1.1.0(graphql@17.0.2)': dependencies: @@ -4731,17 +4656,17 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@whatwg-node/disposablestack': 0.0.6 graphql: 17.0.2 - graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.0) - isows: 1.0.7(ws@8.22.0) - tslib: 2.8.1 - ws: 8.22.0 + graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.1) + isows: 1.0.7(ws@8.22.1) + tslib: 2.9.1 + ws: 8.22.1 transitivePeerDependencies: - '@fastify/websocket' - bufferutil - crossws - utf-8-validate - '@graphql-tools/executor-http@3.5.0(@types/node@24.19.2)(graphql@17.0.2)': + '@graphql-tools/executor-http@3.6.0(@types/node@24.19.2)(graphql@17.0.2)': dependencies: '@graphql-hive/signal': 2.1.0 '@graphql-tools/executor-common': 1.1.0(graphql@17.0.2) @@ -4752,7 +4677,7 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 graphql: 17.0.2 meros: 1.3.2(@types/node@24.19.2) - tslib: 2.8.1 + tslib: 2.9.1 transitivePeerDependencies: - '@types/node' @@ -4761,9 +4686,9 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@types/ws': 8.18.2 graphql: 17.0.2 - isomorphic-ws: 5.0.0(ws@8.22.0) - tslib: 2.8.1 - ws: 8.22.0 + isomorphic-ws: 5.0.0(ws@8.22.1) + tslib: 2.9.1 + ws: 8.22.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -4776,7 +4701,7 @@ snapshots: '@whatwg-node/disposablestack': 0.1.0 '@whatwg-node/promise-helpers': 2.0.1 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/git-loader@8.0.46(graphql@17.0.2)': dependencies: @@ -4785,21 +4710,21 @@ snapshots: graphql: 17.0.2 is-glob: 4.0.3 micromatch: 4.0.8 - tslib: 2.8.1 + tslib: 2.9.1 unixify: 1.0.0 transitivePeerDependencies: - supports-color '@graphql-tools/github-loader@9.1.13(@types/node@24.19.2)(graphql@17.0.2)': dependencies: - '@graphql-tools/executor-http': 3.5.0(@types/node@24.19.2)(graphql@17.0.2) + '@graphql-tools/executor-http': 3.6.0(@types/node@24.19.2)(graphql@17.0.2) '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@whatwg-node/fetch': 0.12.1 '@whatwg-node/promise-helpers': 2.0.1 graphql: 17.0.2 sync-fetch: 0.7.1 - tslib: 2.8.1 + tslib: 2.9.1 transitivePeerDependencies: - '@types/node' - supports-color @@ -4810,18 +4735,18 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) globby: 11.1.0 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 unixify: 1.0.0 '@graphql-tools/graphql-tag-pluck@8.3.41(graphql@17.0.2)': dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.11 - '@babel/traverse': 7.29.10 + '@babel/parser': 7.29.12 + '@babel/traverse': 7.29.12 '@babel/types': 7.29.11 '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 transitivePeerDependencies: - supports-color @@ -4830,14 +4755,14 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 resolve-from: 5.0.0 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/json-file-loader@8.0.38(graphql@17.0.2)': dependencies: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) globby: 11.1.0 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 unixify: 1.0.0 '@graphql-tools/load@8.1.21(graphql@17.0.2)': @@ -4846,48 +4771,48 @@ snapshots: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 p-limit: 3.1.0 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/merge@9.2.8(graphql@17.0.2)': dependencies: '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/optimize@2.0.1(graphql@17.0.2)': dependencies: graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/relay-operation-optimizer@7.1.14(graphql@17.0.2)': dependencies: '@ardatan/relay-compiler': 13.0.2(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/schema@10.1.5(graphql@17.0.2)': dependencies: '@graphql-tools/merge': 9.2.8(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-tools/url-loader@9.1.14(@types/node@24.19.2)(graphql@17.0.2)': dependencies: '@graphql-tools/executor-graphql-ws': 3.2.0(graphql@17.0.2) - '@graphql-tools/executor-http': 3.5.0(@types/node@24.19.2)(graphql@17.0.2) + '@graphql-tools/executor-http': 3.6.0(@types/node@24.19.2)(graphql@17.0.2) '@graphql-tools/executor-legacy-ws': 1.1.39(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) - '@graphql-tools/wrap': 11.2.3(graphql@17.0.2) + '@graphql-tools/wrap': 11.2.4(graphql@17.0.2) '@types/ws': 8.18.2 '@whatwg-node/fetch': 0.12.1 '@whatwg-node/promise-helpers': 2.0.1 graphql: 17.0.2 - isomorphic-ws: 5.0.0(ws@8.22.0) + isomorphic-ws: 5.0.0(ws@8.22.1) sync-fetch: 0.7.1 - tslib: 2.8.1 - ws: 8.22.0 + tslib: 2.9.1 + ws: 8.22.1 transitivePeerDependencies: - '@fastify/websocket' - '@types/node' @@ -4901,16 +4826,16 @@ snapshots: '@whatwg-node/promise-helpers': 2.0.1 cross-inspect: 1.0.1 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 - '@graphql-tools/wrap@11.2.3(graphql@17.0.2)': + '@graphql-tools/wrap@11.2.4(graphql@17.0.2)': dependencies: - '@graphql-tools/delegate': 12.3.1(graphql@17.0.2) + '@graphql-tools/delegate': 12.3.2(graphql@17.0.2) '@graphql-tools/schema': 10.1.5(graphql@17.0.2) '@graphql-tools/utils': 12.1.0(graphql@17.0.2) '@whatwg-node/promise-helpers': 1.3.2 graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 '@graphql-typed-document-node/core@3.2.0(graphql@17.0.2)': dependencies: @@ -5107,14 +5032,14 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.3 - '@oxc-project/types@0.155.0': {} + '@oxc-project/types@0.156.0': {} '@react-router/dev@8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/parser': 7.29.11 - '@babel/traverse': 7.29.10 + '@babel/generator': 7.29.12 + '@babel/parser': 7.29.12 + '@babel/traverse': 7.29.12 '@babel/types': 7.29.11 '@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3) '@remix-run/node-fetch-server': 0.14.2 @@ -5132,7 +5057,7 @@ snapshots: pkg-types: 2.4.0 react-refresh: 0.18.0 react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - semver: 7.8.5 + semver: 7.8.6 tinyglobby: 0.2.17 valibot: 1.5.0(typescript@6.0.3) vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) @@ -5178,58 +5103,58 @@ snapshots: '@repeaterjs/repeater@3.1.0': {} - '@rolldown/binding-android-arm-eabi@1.2.15': + '@rolldown/binding-android-arm-eabi@1.2.16': optional: true - '@rolldown/binding-android-arm64@1.2.15': + '@rolldown/binding-android-arm64@1.2.16': optional: true - '@rolldown/binding-darwin-arm64@1.2.15': + '@rolldown/binding-darwin-arm64@1.2.16': optional: true - '@rolldown/binding-darwin-x64@1.2.15': + '@rolldown/binding-darwin-x64@1.2.16': optional: true - '@rolldown/binding-freebsd-x64@1.2.15': + '@rolldown/binding-freebsd-x64@1.2.16': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + '@rolldown/binding-linux-arm-gnueabihf@1.2.16': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.15': + '@rolldown/binding-linux-arm64-gnu@1.2.16': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.15': + '@rolldown/binding-linux-arm64-musl@1.2.16': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.15': + '@rolldown/binding-linux-ppc64-gnu@1.2.16': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.15': + '@rolldown/binding-linux-s390x-gnu@1.2.16': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.15': + '@rolldown/binding-linux-x64-gnu@1.2.16': optional: true - '@rolldown/binding-linux-x64-musl@1.2.15': + '@rolldown/binding-linux-x64-musl@1.2.16': optional: true - '@rolldown/binding-openharmony-arm64@1.2.15': + '@rolldown/binding-openharmony-arm64@1.2.16': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.15': + '@rolldown/binding-win32-arm64-msvc@1.2.16': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.15': + '@rolldown/binding-win32-x64-msvc@1.2.16': optional: true - '@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': + '@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7 picomatch: 4.0.7 - rolldown: 1.2.15 + rolldown: 1.2.16 optionalDependencies: - '@babel/runtime': 8.0.8 + '@babel/runtime': 8.1.0 vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) '@rolldown/pluginutils@1.0.1': {} @@ -5239,7 +5164,7 @@ snapshots: '@shadcn/registry@0.2.1': dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@dotenvx/dotenvx': 1.75.1 @@ -5268,72 +5193,72 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@tailwindcss/node@4.3.3': + '@tailwindcss/node@4.3.4': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.26.0 + enhanced-resolve: 5.26.1 jiti: 2.7.0 - lightningcss: 1.32.0 - magic-string: 0.30.21 + lightningcss: 1.33.0 + magic-string: 1.4.5 source-map-js: 1.2.2 - tailwindcss: 4.3.3 + tailwindcss: 4.3.4 - '@tailwindcss/oxide-android-arm64@4.3.3': + '@tailwindcss/oxide-android-arm64@4.3.4': optional: true - '@tailwindcss/oxide-darwin-arm64@4.3.3': + '@tailwindcss/oxide-darwin-arm64@4.3.4': optional: true - '@tailwindcss/oxide-darwin-x64@4.3.3': + '@tailwindcss/oxide-darwin-x64@4.3.4': optional: true - '@tailwindcss/oxide-freebsd-x64@4.3.3': + '@tailwindcss/oxide-freebsd-x64@4.3.4': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.4': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.4': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + '@tailwindcss/oxide-linux-arm64-musl@4.3.4': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + '@tailwindcss/oxide-linux-x64-gnu@4.3.4': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.3.3': + '@tailwindcss/oxide-linux-x64-musl@4.3.4': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.3.3': + '@tailwindcss/oxide-wasm32-wasi@4.3.4': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.4': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + '@tailwindcss/oxide-win32-x64-msvc@4.3.4': optional: true - '@tailwindcss/oxide@4.3.3': + '@tailwindcss/oxide@4.3.4': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.3 - '@tailwindcss/oxide-darwin-arm64': 4.3.3 - '@tailwindcss/oxide-darwin-x64': 4.3.3 - '@tailwindcss/oxide-freebsd-x64': 4.3.3 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 - '@tailwindcss/oxide-linux-x64-musl': 4.3.3 - '@tailwindcss/oxide-wasm32-wasi': 4.3.3 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - - '@tailwindcss/vite@4.3.3(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': - dependencies: - '@tailwindcss/node': 4.3.3 - '@tailwindcss/oxide': 4.3.3 - tailwindcss: 4.3.3 + '@tailwindcss/oxide-android-arm64': 4.3.4 + '@tailwindcss/oxide-darwin-arm64': 4.3.4 + '@tailwindcss/oxide-darwin-x64': 4.3.4 + '@tailwindcss/oxide-freebsd-x64': 4.3.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.4 + '@tailwindcss/oxide-linux-x64-musl': 4.3.4 + '@tailwindcss/oxide-wasm32-wasi': 4.3.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.4 + + '@tailwindcss/vite@4.3.4(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': + dependencies: + '@tailwindcss/node': 4.3.4 + '@tailwindcss/oxide': 4.3.4 + tailwindcss: 4.3.4 vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) '@tanstack/devtools-event-client@0.4.4': {} @@ -5374,7 +5299,7 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.2)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))': + '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.2)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))': dependencies: '@adobe/css-tools': 4.5.0 '@testing-library/dom': 10.4.2 @@ -5384,7 +5309,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 optionalDependencies: - vitest: 5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + vitest: 5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) '@testing-library/react@16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': dependencies: @@ -5410,7 +5335,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/types': 7.29.11 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -5422,7 +5347,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/types': 7.29.11 '@types/babel__traverse@7.28.0': @@ -5438,7 +5363,7 @@ snapshots: '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.9': {} + '@types/estree@1.0.10': {} '@types/json-schema@7.0.15': {} @@ -5460,15 +5385,15 @@ snapshots: dependencies: '@types/node': 24.19.2 - '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.72.1 - '@typescript-eslint/type-utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.72.1 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) ignore: 7.0.14 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -5476,14 +5401,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.72.1 '@typescript-eslint/types': 8.72.1 '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.72.1 debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5506,13 +5431,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.72.1 '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -5528,20 +5453,20 @@ snapshots: '@typescript-eslint/visitor-keys': 8.72.1 debug: 4.4.3 minimatch: 10.2.6 - semver: 7.8.5 + semver: 7.8.6 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.72.1 '@typescript-eslint/types': 8.72.1 '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5551,34 +5476,34 @@ snapshots: '@typescript-eslint/types': 8.72.1 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': + '@vitejs/plugin-react@6.2.1(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) optionalDependencies: - '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) babel-plugin-react-compiler: 1.0.0 - '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': + '@vitest/mocker@5.1.0(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.5 + '@vitest/spy': 5.1.0 estree-walker: 3.0.3 magic-string: 1.4.5 optionalDependencies: vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) - '@vitest/spy@5.0.5': {} + '@vitest/spy@5.1.0': {} '@whatwg-node/disposablestack@0.0.6': dependencies: '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + tslib: 2.9.1 '@whatwg-node/disposablestack@0.1.0': dependencies: '@whatwg-node/promise-helpers': 2.0.1 - tslib: 2.8.1 + tslib: 2.9.1 '@whatwg-node/fetch@0.10.13': dependencies: @@ -5595,38 +5520,38 @@ snapshots: '@fastify/busboy': 3.2.4 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + tslib: 2.9.1 '@whatwg-node/node-fetch@0.9.3': dependencies: '@fastify/busboy': 3.2.4 '@whatwg-node/disposablestack': 0.1.0 '@whatwg-node/promise-helpers': 2.0.1 - tslib: 2.8.1 + tslib: 2.9.1 '@whatwg-node/promise-helpers@1.3.2': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 '@whatwg-node/promise-helpers@2.0.1': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 '@wry/caches@1.0.1': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 '@wry/context@0.7.4': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 '@wry/equality@0.5.7': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 '@wry/trie@0.5.0': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 accepts@2.0.0: dependencies: @@ -5665,7 +5590,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.4.0: {} + ansi-regex@6.5.0: {} ansi-styles@5.2.0: {} @@ -5685,7 +5610,7 @@ snapshots: ast-types@0.16.3: dependencies: - tslib: 2.8.1 + tslib: 2.9.1 atomically@1.7.0: {} @@ -5694,8 +5619,8 @@ snapshots: babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.11 - '@babel/traverse': 7.29.10 + '@babel/parser': 7.29.12 + '@babel/traverse': 7.29.12 '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color @@ -5706,35 +5631,35 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.11.34: {} + baseline-browser-mapping@2.11.35: {} basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 - better-auth@1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))): + better-auth@1.7.15(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))): dependencies: - '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) - '@better-auth/drizzle-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) - '@better-auth/kysely-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7) - '@better-auth/memory-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) - '@better-auth/mongo-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) - '@better-auth/prisma-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1) - '@better-auth/telemetry': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3) + '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5) + '@better-auth/drizzle-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/kysely-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.8) + '@better-auth/memory-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/mongo-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/prisma-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1) + '@better-auth/telemetry': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3) '@better-auth/utils': 0.5.1 '@better-fetch/fetch': 1.3.3 '@noble/ciphers': 2.4.0 '@noble/hashes': 2.4.0 better-call: 1.4.4(zod@4.6.7) defu: 6.1.7 - jose: 6.2.13 - kysely: 0.29.7 + jose: 6.2.15 + kysely: 0.29.8 nanostores: 1.5.5 zod: 4.6.7 optionalDependencies: react: 19.3.1 react-dom: 19.3.1(react@19.3.1) - vitest: 5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + vitest: 5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) transitivePeerDependencies: - '@opentelemetry/api' @@ -5743,7 +5668,7 @@ snapshots: '@better-auth/utils': 0.5.1 '@better-fetch/fetch': 1.3.3 rou3: 0.9.2 - set-cookie-parser: 3.2.1 + set-cookie-parser: 3.2.2 optionalDependencies: zod: 4.6.7 @@ -5759,7 +5684,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.3 on-finished: 2.4.2 - qs: 6.17.0 + qs: 6.17.1 raw-body: 3.0.2 type-is: 2.1.0 transitivePeerDependencies: @@ -5775,10 +5700,10 @@ snapshots: browserslist@4.29.5: dependencies: - baseline-browser-mapping: 2.11.34 - caniuse-lite: 1.0.30001819 - electron-to-chromium: 1.5.467 - node-releases: 2.0.60 + baseline-browser-mapping: 2.11.35 + caniuse-lite: 1.0.30001820 + electron-to-chromium: 1.5.474 + node-releases: 2.0.63 update-browserslist-db: 1.3.4(browserslist@4.29.5) buffer-from@1.1.2: {} @@ -5809,13 +5734,13 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001819: {} + caniuse-lite@1.0.30001820: {} chai@6.3.0: {} chalk@5.6.2: {} - change-case-all@2.1.0: + change-case-all@2.2.0: dependencies: change-case: 5.4.4 sponge-case: 2.0.3 @@ -5897,9 +5822,9 @@ snapshots: json-schema-typed: 7.0.3 onetime: 5.1.2 pkg-up: 3.1.0 - semver: 7.8.5 + semver: 7.8.6 - confbox@0.3.1: {} + confbox@0.3.2: {} content-disposition@2.0.1: {} @@ -5933,7 +5858,7 @@ snapshots: cross-inspect@1.0.1: dependencies: - tslib: 2.8.1 + tslib: 2.9.1 cross-spawn@7.0.6: dependencies: @@ -6034,13 +5959,13 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.467: {} + electron-to-chromium@1.5.474: {} emoji-regex@10.6.0: {} - encodeurl@2.0.0: {} + encodeurl@2.0.1: {} - enhanced-resolve@5.26.0: + enhanced-resolve@5.26.1: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -6050,7 +5975,7 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@8.1.0: {} + entities@9.0.0: {} env-paths@2.2.1: {} @@ -6076,126 +6001,126 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-dom@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-dom@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.1.1(eslint@10.13.0(jiti@2.7.0)): + eslint-plugin-react-hooks@7.1.1(eslint@10.14.0(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.11 - eslint: 10.13.0(jiti@2.7.0) + '@babel/parser': 7.29.12 + eslint: 10.14.0(jiti@2.7.0) hermes-parser: 0.25.1 zod: 4.6.7 zod-validation-error: 4.0.2(zod@4.6.7) transitivePeerDependencies: - supports-color - eslint-plugin-react-jsx@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-jsx@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-naming-convention@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.5.7(eslint@10.13.0(jiti@2.7.0)): + eslint-plugin-react-refresh@0.5.7(eslint@10.14.0(jiti@2.7.0)): dependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) - eslint-plugin-react-rsc@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-rsc@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-web-api@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/types': 8.72.1 - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-x@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-x@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.72.1 '@typescript-eslint/types': 8.72.1 '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 - string-ts: 2.3.1 + string-ts: 2.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) ts-pattern: 5.9.2 typescript: 6.0.3 optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) transitivePeerDependencies: - supports-color eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 + '@types/estree': 1.0.10 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -6203,9 +6128,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.13.0(jiti@2.7.0): + eslint@10.14.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.7.0 @@ -6214,7 +6139,7 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 + '@types/estree': 1.0.10 ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 @@ -6260,7 +6185,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.10 esutils@2.0.3: {} @@ -6309,7 +6234,7 @@ snapshots: cookie-signature: 1.2.2 debug: 4.4.3 depd: 2.0.0 - encodeurl: 2.0.0 + encodeurl: 2.0.1 escape-html: 1.0.3 etag: 1.8.1 finalhandler: 2.1.1 @@ -6321,7 +6246,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.8 - qs: 6.17.0 + qs: 6.17.1 range-parser: 1.3.0 router: 2.2.0 send: 1.2.1 @@ -6388,7 +6313,7 @@ snapshots: finalhandler@2.1.1: dependencies: debug: 4.4.3 - encodeurl: 2.0.0 + encodeurl: 2.0.1 escape-html: 1.0.3 on-finished: 2.4.2 parseurl: 1.3.3 @@ -6475,7 +6400,7 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@17.13.0: {} + globals@17.14.0: {} globby@11.1.0: dependencies: @@ -6503,7 +6428,7 @@ snapshots: jiti: 2.7.0 minimatch: 10.2.6 string-env-interpolation: 1.0.1 - tslib: 2.8.1 + tslib: 2.9.1 transitivePeerDependencies: - '@fastify/websocket' - '@types/node' @@ -6515,13 +6440,13 @@ snapshots: graphql-tag@2.12.7(graphql@17.0.2): dependencies: graphql: 17.0.2 - tslib: 2.8.1 + tslib: 2.9.1 - graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.0): + graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.1): dependencies: graphql: 17.0.2 optionalDependencies: - ws: 8.22.0 + ws: 8.22.1 graphql@17.0.2: {} @@ -6590,7 +6515,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - ip-address@10.7.5: {} + ip-address@10.7.6: {} ipaddr.js@1.9.1: {} @@ -6669,17 +6594,17 @@ snapshots: isexe@3.1.5: {} - isomorphic-ws@5.0.0(ws@8.22.0): + isomorphic-ws@5.0.0(ws@8.22.1): dependencies: - ws: 8.22.0 + ws: 8.22.1 - isows@1.0.7(ws@8.22.0): + isows@1.0.7(ws@8.22.1): dependencies: - ws: 8.22.0 + ws: 8.22.1 jiti@2.7.0: {} - jose@6.2.13: {} + jose@6.2.15: {} js-tokens@4.0.0: {} @@ -6692,7 +6617,7 @@ snapshots: '@asamuzakjp/css-color': 7.1.9 '@asamuzakjp/dom-selector': 10.0.5 '@bramus/specificity': 2.4.3 - '@csstools/css-syntax-patches-for-csstree': 1.1.15(css-tree@3.2.1) + '@csstools/css-syntax-patches-for-csstree': 1.1.16(css-tree@3.2.1) '@exodus/bytes': 1.16.0(@noble/hashes@2.4.0) css-tree: 3.2.1 data-urls: 8.0.0(@noble/hashes@2.4.0) @@ -6700,7 +6625,7 @@ snapshots: html-encoding-sniffer: 7.0.0(@noble/hashes@2.4.0) is-potential-custom-element-name: 1.0.1 lru-cache: 11.5.3 - parse5: 8.0.1 + parse5: 8.1.0 saxes: 6.0.0 tough-cookie: 6.0.2 undici: 8.12.3 @@ -6745,95 +6670,46 @@ snapshots: kleur@4.1.5: {} - kysely@0.29.7: {} + kysely@0.29.8: {} levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.32.0: - optional: true - lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: - optional: true - lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: - optional: true - lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: - optional: true - lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: - optional: true - lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: - optional: true - lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: - optional: true - lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: - optional: true - lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 @@ -6899,7 +6775,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@1.63.0(@types/react@19.3.0)(react@19.3.1): + lucide-react@1.67.0(@types/react@19.3.0)(react@19.3.1): dependencies: react: 19.3.1 optionalDependencies: @@ -6907,10 +6783,6 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - magic-string@1.4.5: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -6994,7 +6866,7 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-releases@2.0.60: {} + node-releases@2.0.63: {} normalize-path@2.1.1: dependencies: @@ -7053,7 +6925,7 @@ snapshots: '@wry/caches': 1.0.1 '@wry/context': 0.7.4 '@wry/trie': 0.5.0 - tslib: 2.8.1 + tslib: 2.9.1 optionator@0.9.4: dependencies: @@ -7115,9 +6987,9 @@ snapshots: parse-ms@4.0.0: {} - parse5@8.0.1: + parse5@8.1.0: dependencies: - entities: 8.1.0 + entities: 9.0.0 parseurl@1.3.3: {} @@ -7151,7 +7023,7 @@ snapshots: pkg-types@2.4.0: dependencies: - confbox: 0.3.1 + confbox: 0.3.2 exsolve: 1.2.0 pathe: 2.0.3 @@ -7202,7 +7074,7 @@ snapshots: dependencies: hookified: 2.2.0 - qs@6.17.0: + qs@6.17.1: dependencies: es-define-property: 1.0.1 side-channel: 1.1.1 @@ -7247,7 +7119,7 @@ snapshots: esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.8.1 + tslib: 2.9.1 redent@3.0.0: dependencies: @@ -7277,26 +7149,26 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.2.15: + rolldown@1.2.16: dependencies: - '@oxc-project/types': 0.155.0 + '@oxc-project/types': 0.156.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.15 - '@rolldown/binding-android-arm64': 1.2.15 - '@rolldown/binding-darwin-arm64': 1.2.15 - '@rolldown/binding-darwin-x64': 1.2.15 - '@rolldown/binding-freebsd-x64': 1.2.15 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.15 - '@rolldown/binding-linux-arm64-gnu': 1.2.15 - '@rolldown/binding-linux-arm64-musl': 1.2.15 - '@rolldown/binding-linux-ppc64-gnu': 1.2.15 - '@rolldown/binding-linux-s390x-gnu': 1.2.15 - '@rolldown/binding-linux-x64-gnu': 1.2.15 - '@rolldown/binding-linux-x64-musl': 1.2.15 - '@rolldown/binding-openharmony-arm64': 1.2.15 - '@rolldown/binding-win32-arm64-msvc': 1.2.15 - '@rolldown/binding-win32-x64-msvc': 1.2.15 + '@rolldown/binding-android-arm-eabi': 1.2.16 + '@rolldown/binding-android-arm64': 1.2.16 + '@rolldown/binding-darwin-arm64': 1.2.16 + '@rolldown/binding-darwin-x64': 1.2.16 + '@rolldown/binding-freebsd-x64': 1.2.16 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.16 + '@rolldown/binding-linux-arm64-gnu': 1.2.16 + '@rolldown/binding-linux-arm64-musl': 1.2.16 + '@rolldown/binding-linux-ppc64-gnu': 1.2.16 + '@rolldown/binding-linux-s390x-gnu': 1.2.16 + '@rolldown/binding-linux-x64-gnu': 1.2.16 + '@rolldown/binding-linux-x64-musl': 1.2.16 + '@rolldown/binding-openharmony-arm64': 1.2.16 + '@rolldown/binding-win32-arm64-msvc': 1.2.16 + '@rolldown/binding-win32-x64-msvc': 1.2.16 rou3@0.9.2: {} @@ -7318,7 +7190,7 @@ snapshots: rxjs@7.8.2: dependencies: - tslib: 2.8.1 + tslib: 2.9.1 safe-buffer@5.1.2: {} @@ -7332,14 +7204,14 @@ snapshots: scheduler@0.28.0: {} - semver@6.3.1: {} + semver@6.3.2: {} - semver@7.8.5: {} + semver@7.8.6: {} send@1.2.1: dependencies: debug: 4.4.3 - encodeurl: 2.0.0 + encodeurl: 2.0.1 escape-html: 1.0.3 etag: 1.8.1 fresh: 2.0.0 @@ -7354,21 +7226,21 @@ snapshots: serve-static@2.2.1: dependencies: - encodeurl: 2.0.0 + encodeurl: 2.0.1 escape-html: 1.0.3 parseurl: 1.3.3 send: 1.2.1 transitivePeerDependencies: - supports-color - set-cookie-parser@3.2.1: {} + set-cookie-parser@3.2.2: {} setprototypeof@1.2.0: {} shadcn@4.23.0: dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.11 + '@babel/parser': 7.29.12 '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@dotenvx/dotenvx': 1.75.1 @@ -7461,7 +7333,7 @@ snapshots: socks@2.8.10: dependencies: - ip-address: 10.7.5 + ip-address: 10.7.6 smart-buffer: 4.2.0 source-map-js@1.2.2: {} @@ -7483,7 +7355,7 @@ snapshots: string-env-interpolation@1.0.1: {} - string-ts@2.3.1: {} + string-ts@2.4.0: {} string-width@7.2.0: dependencies: @@ -7508,7 +7380,7 @@ snapshots: strip-ansi@7.2.0: dependencies: - ansi-regex: 6.4.0 + ansi-regex: 6.5.0 strip-bom@3.0.0: {} @@ -7528,9 +7400,9 @@ snapshots: timeout-signal: 2.0.0 whatwg-mimetype: 5.0.0 - systeminformation@5.33.18: {} + systeminformation@5.33.19: {} - tailwindcss@4.3.3: {} + tailwindcss@4.3.4: {} tapable@2.3.3: {} @@ -7538,7 +7410,7 @@ snapshots: tiny-invariant@1.3.3: {} - tinybench@6.2.2: {} + tinybench@6.2.3: {} tinyexec@1.3.1: {} @@ -7549,7 +7421,7 @@ snapshots: title-case@3.0.3: dependencies: - tslib: 2.8.1 + tslib: 2.9.1 tldts-core@7.4.20: {} @@ -7592,6 +7464,8 @@ snapshots: tslib@2.8.1: {} + tslib@2.9.1: {} + tw-animate-css@1.4.0: {} type-check@0.4.0: @@ -7606,13 +7480,13 @@ snapshots: media-typer: 1.1.1 mime-types: 3.0.2 - typescript-eslint@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.13.0(jiti@2.7.0) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.14.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -7668,7 +7542,7 @@ snapshots: lightningcss: 1.33.0 picomatch: 4.0.7 postcss: 8.5.32 - rolldown: 1.2.15 + rolldown: 1.2.16 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.19.2 @@ -7676,10 +7550,10 @@ snapshots: jiti: 2.7.0 yaml: 2.9.1 - vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)): + vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) + '@vitest/mocker': 5.1.0(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -7687,7 +7561,7 @@ snapshots: obug: 3.0.0 picomatch: 4.0.7 std-env: 4.3.0 - tinybench: 6.2.2 + tinybench: 6.2.3 tinyexec: 1.3.1 tinyglobby: 0.2.17 vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) @@ -7741,7 +7615,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.22.0: {} + ws@8.22.1: {} wsl-utils@1.0.1: dependencies: From 18d4e21b750e27084ec01aeab9c2236c03cde27c Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:12:25 +0100 Subject: [PATCH 03/21] feat: add homepage with hero and top rated books --- frontend/app/components/Header/Header.tsx | 3 + .../BookFilters/BookFilters.test.tsx | 2 +- .../BookFilters/BookFilters.tsx | 2 +- .../PagesFilter/PagesFilter.tsx | 0 .../SearchBar/SearchBar.test.tsx | 2 +- .../{home => books}/SearchBar/SearchBar.tsx | 2 +- .../{home => books}/SortSelect/SortSelect.tsx | 0 .../home/HeroSection/HeroSection.tsx | 127 ++++++++++++++++ .../home/TopRatedSection/TopRatedSection.tsx | 69 +++++++++ frontend/app/hooks/useInView.ts | 34 +++++ frontend/app/index.css | 7 + frontend/app/routes.ts | 1 + frontend/app/routes/book/selectedBook.tsx | 15 +- frontend/app/routes/books.test.tsx | 142 ++++++++++++++++++ frontend/app/routes/books.tsx | 84 +++++++++++ frontend/app/routes/home.test.tsx | 135 ++++------------- frontend/app/routes/home.tsx | 82 ++-------- frontend/app/routes/profile.tsx | 2 +- frontend/app/test/setup.ts | 11 +- 19 files changed, 534 insertions(+), 186 deletions(-) rename frontend/app/components/{home => books}/BookFilters/BookFilters.test.tsx (98%) rename frontend/app/components/{home => books}/BookFilters/BookFilters.tsx (98%) rename frontend/app/components/{home => books}/PagesFilter/PagesFilter.tsx (100%) rename frontend/app/components/{home => books}/SearchBar/SearchBar.test.tsx (96%) rename frontend/app/components/{home => books}/SearchBar/SearchBar.tsx (98%) rename frontend/app/components/{home => books}/SortSelect/SortSelect.tsx (100%) create mode 100644 frontend/app/components/home/HeroSection/HeroSection.tsx create mode 100644 frontend/app/components/home/TopRatedSection/TopRatedSection.tsx create mode 100644 frontend/app/hooks/useInView.ts create mode 100644 frontend/app/routes/books.test.tsx create mode 100644 frontend/app/routes/books.tsx diff --git a/frontend/app/components/Header/Header.tsx b/frontend/app/components/Header/Header.tsx index cf74299..1826663 100644 --- a/frontend/app/components/Header/Header.tsx +++ b/frontend/app/components/Header/Header.tsx @@ -18,6 +18,9 @@ function Header() { Home + + Books + {!isPending && session && ( ({ useBookFilters: () => ({ diff --git a/frontend/app/components/home/BookFilters/BookFilters.tsx b/frontend/app/components/books/BookFilters/BookFilters.tsx similarity index 98% rename from frontend/app/components/home/BookFilters/BookFilters.tsx rename to frontend/app/components/books/BookFilters/BookFilters.tsx index 3941da9..ac20cf0 100644 --- a/frontend/app/components/home/BookFilters/BookFilters.tsx +++ b/frontend/app/components/books/BookFilters/BookFilters.tsx @@ -15,7 +15,7 @@ import { ComboboxValue, useComboboxAnchor, } from "~/components/ui/Combobox"; -import { PagesFilter } from "~/components/home/PagesFilter/PagesFilter"; +import { PagesFilter } from "~/components/books/PagesFilter/PagesFilter"; function BookFilters() { const [, setSearchParams] = useSearchParams(); diff --git a/frontend/app/components/home/PagesFilter/PagesFilter.tsx b/frontend/app/components/books/PagesFilter/PagesFilter.tsx similarity index 100% rename from frontend/app/components/home/PagesFilter/PagesFilter.tsx rename to frontend/app/components/books/PagesFilter/PagesFilter.tsx diff --git a/frontend/app/components/home/SearchBar/SearchBar.test.tsx b/frontend/app/components/books/SearchBar/SearchBar.test.tsx similarity index 96% rename from frontend/app/components/home/SearchBar/SearchBar.test.tsx rename to frontend/app/components/books/SearchBar/SearchBar.test.tsx index 5bea8f6..75e0eeb 100644 --- a/frontend/app/components/home/SearchBar/SearchBar.test.tsx +++ b/frontend/app/components/books/SearchBar/SearchBar.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; import { render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { SearchBar } from "~/components/home/SearchBar/SearchBar"; +import { SearchBar } from "~/components/books/SearchBar/SearchBar"; import { createRoutesStub, useSearchParams } from "react-router"; // Shows the current "q" param so tests can assert what SearchBar wrote to the URL. diff --git a/frontend/app/components/home/SearchBar/SearchBar.tsx b/frontend/app/components/books/SearchBar/SearchBar.tsx similarity index 98% rename from frontend/app/components/home/SearchBar/SearchBar.tsx rename to frontend/app/components/books/SearchBar/SearchBar.tsx index 75e9cf3..155f76f 100644 --- a/frontend/app/components/home/SearchBar/SearchBar.tsx +++ b/frontend/app/components/books/SearchBar/SearchBar.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from "react"; import { FilterIcon } from "lucide-react"; import { SearchIcon } from "lucide-react"; -import { BookFilters } from "~/components/home/BookFilters/BookFilters"; +import { BookFilters } from "~/components/books/BookFilters/BookFilters"; import { InputGroup, InputGroupAddon, diff --git a/frontend/app/components/home/SortSelect/SortSelect.tsx b/frontend/app/components/books/SortSelect/SortSelect.tsx similarity index 100% rename from frontend/app/components/home/SortSelect/SortSelect.tsx rename to frontend/app/components/books/SortSelect/SortSelect.tsx diff --git a/frontend/app/components/home/HeroSection/HeroSection.tsx b/frontend/app/components/home/HeroSection/HeroSection.tsx new file mode 100644 index 0000000..fa6854e --- /dev/null +++ b/frontend/app/components/home/HeroSection/HeroSection.tsx @@ -0,0 +1,127 @@ +import { Link, useNavigate } from "react-router"; +import { SearchIcon } from "lucide-react"; +import { authClient } from "~/api/auth"; +import { buttonVariants } from "~/components/ui/Button"; +import { + InputGroup, + InputGroupAddon, + InputGroupInput, +} from "~/components/ui/InputGroup"; +import type { SearchBook } from "~/hooks/useSearchBooks"; +import { cn } from "~/lib/utils"; +import { useAppForm } from "~/hooks/useAppForm"; + +const COVER_STYLES = [ + "top-10 left-0 -rotate-8 motion-safe:delay-500", + "top-0 left-1/2 z-10 -translate-x-1/2", + "top-10 right-0 rotate-8 motion-safe:delay-1000", +]; + +function HeroSection({ books }: { books: SearchBook[] }) { + const { data: session, isPending } = authClient.useSession(); + const bookCovers = books.filter((book) => book.coverImgUrl).slice(0, 3); + const navigate = useNavigate(); + + const form = useAppForm({ + defaultValues: { + query: "", + }, + onSubmit: async ({ value }) => { + const query = value.query.trim(); + await navigate({ + pathname: "/books", + search: query ? new URLSearchParams({ q: query }).toString() : "", + }); + }, + }); + + return ( +
+
+

+ Discover books{" "} + worth reading +

+

+ Search thousands of titles, filter by genre, language and length, and + save the books you love. +

+ +
{ + e.preventDefault(); + void form.handleSubmit(); + }} + > + + + + + + + {(field) => ( + field.handleChange(e.target.value)} + /> + )} + + + Search + + + +
+ + +
+ + {bookCovers.length > 0 && ( + + )} +
+ ); +} + +export { HeroSection }; diff --git a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx new file mode 100644 index 0000000..6f4efbc --- /dev/null +++ b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx @@ -0,0 +1,69 @@ +import { Link } from "react-router"; +import { ArrowRightIcon } from "lucide-react"; +import { BookCard } from "~/components/BookCard/BookCard"; +import { Skeleton } from "~/components/ui/Skeleton"; +import { useInView } from "~/hooks/useInView"; +import type { SearchBook } from "~/hooks/useSearchBooks"; +import { cn } from "~/lib/utils"; + +function TopRatedSection({ + books, + loading, +}: { + books?: SearchBook[]; + loading: boolean; +}) { + const { ref, inView } = useInView(); + const hasBooks = books && books.length > 0; + + return ( +
+
+
+

+ Top rated +

+

+ The highest rated books in our library. +

+
+ + See all + +
+ + {loading || hasBooks ? ( +
    + {hasBooks + ? books.map((book) => ( +
  • + +
  • + )) + : Array.from({ length: 4 }, (_, index) => ( +
  • + +
  • + ))} +
+ ) : ( +

Could not load the top rated books right now.

+ )} +
+ ); +} + +export { TopRatedSection }; diff --git a/frontend/app/hooks/useInView.ts b/frontend/app/hooks/useInView.ts new file mode 100644 index 0000000..a8bd24c --- /dev/null +++ b/frontend/app/hooks/useInView.ts @@ -0,0 +1,34 @@ +import { useEffect, useRef, useState } from "react"; + +/** + * A hook that returns a ref and a boolean indicating if the element is in view. + * Becomes true once and stays that way. + */ +function useInView() { + const ref = useRef(null); + const [inView, setInView] = useState(false); + + useEffect(() => { + const element = ref.current; + if (!element) { + return; + } + + const observer = new IntersectionObserver( + (entries) => { + if (entries.some((entry) => entry.isIntersecting)) { + setInView(true); + observer.disconnect(); + } + }, + { threshold: 0.15 }, + ); + observer.observe(element); + + return () => observer.disconnect(); + }, []); + + return { ref, inView }; +} + +export { useInView }; diff --git a/frontend/app/index.css b/frontend/app/index.css index 78add90..1d8a695 100644 --- a/frontend/app/index.css +++ b/frontend/app/index.css @@ -78,6 +78,13 @@ --radius-3xl: calc(var(--radius) * 2.2); --radius-4xl: calc(var(--radius) * 2.6); --text-md: 0.9375rem; + --animate-float: float 6s ease-in-out infinite; + + @keyframes float { + 50% { + transform: translateY(-0.75rem); + } + } } :root { diff --git a/frontend/app/routes.ts b/frontend/app/routes.ts index 8ee3d52..3288133 100644 --- a/frontend/app/routes.ts +++ b/frontend/app/routes.ts @@ -2,6 +2,7 @@ import { index, route, type RouteConfig } from "@react-router/dev/routes"; export default [ index("routes/home.tsx"), + route("books", "routes/books.tsx"), route("book/:bookId", "routes/book/selectedBook.tsx"), route("signup", "routes/signup.tsx"), route("login", "routes/login.tsx"), diff --git a/frontend/app/routes/book/selectedBook.tsx b/frontend/app/routes/book/selectedBook.tsx index 63583d5..73fd250 100644 --- a/frontend/app/routes/book/selectedBook.tsx +++ b/frontend/app/routes/book/selectedBook.tsx @@ -79,13 +79,7 @@ export default function SelectedBookPage({ params }: Route.ComponentProps) { {origin === "favorites" ? ( diff --git a/frontend/app/routes/books.test.tsx b/frontend/app/routes/books.test.tsx new file mode 100644 index 0000000..83093a7 --- /dev/null +++ b/frontend/app/routes/books.test.tsx @@ -0,0 +1,142 @@ +import { describe, expect, it, vi } from "vitest"; +import { screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import BooksPage from "~/routes/books"; +import SelectedBookPage from "~/routes/book/selectedBook"; +import { SEARCH_BOOKS } from "~/hooks/useSearchBooks"; +import { apiBook } from "~/test/fixtures/books"; +import { bookMock, searchBooksMock } from "~/test/mocks"; +import { renderRoutes } from "~/test/renderRoutes"; +import { loggedOut } from "~/test/session"; + +// FavoriteButton on each book card reads the session. Logged out, it sends +// no GraphQL requests. +vi.mock("~/api/auth", () => ({ + authClient: { useSession: vi.fn(() => loggedOut) }, +})); + +// Every book card is a link to the book's details page. +const findBookLinks = () => + screen.findAllByRole("link", { name: /View details for/ }); + +const routes = [ + { path: "/books", Component: BooksPage }, + { path: "/book/:bookId", Component: SelectedBookPage }, +]; + +describe("BooksPage", () => { + it("shows the books and the number of results from the API", async () => { + renderRoutes(routes, { + initialEntries: ["/books"], + mocks: [searchBooksMock()], + }); + + expect(await findBookLinks()).toHaveLength(3); + expect(screen.getByText("Good Omens")).toBeInTheDocument(); + expect( + screen.getByText("Terry Pratchett, Neil Gaiman"), + ).toBeInTheDocument(); + expect(screen.getByText("3 results")).toBeInTheDocument(); + }); + + // Searching, filtering and sorting happen in the backend on the whole + // result set, so the page has to pass all of it on to the API. The mock + // only answers a request with exactly these variables. + it("sends the search, filters, sort and page from the URL to the API", async () => { + renderRoutes(routes, { + initialEntries: [ + "/books?q=blade&genres=Fantasy&genres=Romance&language=English" + + "&bookFormat=Paperback&minPages=100&maxPages=500" + + "&sort=rating_desc&page=2", + ], + mocks: [ + searchBooksMock( + { + title: "blade", + genres: ["Fantasy", "Romance"], + language: "English", + bookFormat: "Paperback", + minPages: 100, + maxPages: 500, + sortBy: "RATING", + sortDirection: "DESC", + limit: 12, + offset: 12, + }, + undefined, + 15, + ), + ], + }); + + expect(await screen.findByText("15 results")).toBeInTheDocument(); + expect(screen.getByRole("link", { current: "page" })).toHaveTextContent( + "2", + ); + }); + + it("tells the user when no books match the search", async () => { + renderRoutes(routes, { + initialEntries: ["/books?q=zzzz"], + mocks: [searchBooksMock({ title: "zzzz", limit: 12, offset: 0 }, [])], + }); + + expect( + await screen.findByText("No books found for this search"), + ).toBeInTheDocument(); + expect(screen.getByText("0 results")).toBeInTheDocument(); + }); + + it("shows an error message when the API request fails", async () => { + renderRoutes(routes, { + initialEntries: ["/books"], + mocks: [ + { + request: { + query: SEARCH_BOOKS, + variables: { title: "", limit: 12, offset: 0 }, + }, + error: new Error("Network error"), + }, + ], + }); + + expect( + await screen.findByText( + "Sorry, there was an error loading the books. Please try again later.", + ), + ).toBeInTheDocument(); + }); + + it("opens a book's details and goes back to the same search", async () => { + const user = userEvent.setup(); + const variables = { title: "blade", limit: 12, offset: 0 }; + renderRoutes(routes, { + initialEntries: ["/books?q=blade"], + // Each request is mocked once: the search results are reused from + // Apollo's cache on the details page and when going back. + mocks: [searchBooksMock(variables), bookMock(1, apiBook)], + }); + + await user.click( + await screen.findByRole("link", { + name: "View details for The Blade Itself", + }), + ); + + expect(await screen.findByText(/Logen Ninefingers/)).toBeInTheDocument(); + expect( + screen.queryByRole("link", { name: /View details for/ }), + ).not.toBeInTheDocument(); + + await user.click( + // Rendered as a link, but exposed with role="button" by the Button component. + screen.getByRole("button", { name: "Go back to search results" }), + ); + + expect(await findBookLinks()).toHaveLength(3); + expect( + screen.getByRole("searchbox", { name: "Search for books" }), + ).toHaveValue("blade"); + }); +}); diff --git a/frontend/app/routes/books.tsx b/frontend/app/routes/books.tsx new file mode 100644 index 0000000..80732f3 --- /dev/null +++ b/frontend/app/routes/books.tsx @@ -0,0 +1,84 @@ +import { BookPagination } from "~/components/BookPagination/BookPagination"; +import { useSearchBooks } from "~/hooks/useSearchBooks"; +import { SearchBar } from "~/components/books/SearchBar/SearchBar"; +import { BookCard } from "~/components/BookCard/BookCard"; +import { SortSelect } from "~/components/books/SortSelect/SortSelect"; +import { useBookSearchParams } from "~/hooks/useBookSearchParams"; +import { BOOK_PAGE_LIMIT } from "~/lib/constants"; + +export function meta() { + return [ + { title: "Browse books | Readr" }, + { name: "description", content: "Search and filter books on Readr" }, + ]; +} + +export default function BooksPage() { + const { query, page, filters, sort } = useBookSearchParams(); + + const { books, totalCount, loading, error } = useSearchBooks({ + filters, + title: query, + limit: BOOK_PAGE_LIMIT, + offset: (page - 1) * BOOK_PAGE_LIMIT, + sort, + }); + + if (loading) { + return ( +
+ +

+ Loading books... +

+
+ ); + } + + if (error) { + return ( +
+ +

+ Sorry, there was an error loading the books. Please try again later. +

+
+ ); + } + + if (!books || books.length === 0) { + return ( +
+ +

+ No books found for this search +

+
+ ); + } + + return ( +
+ + + +
    + {books.map((book) => ( +
  • + +
  • + ))} +
+ +
+ ); +} diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx index b6a96ad..fe111f2 100644 --- a/frontend/app/routes/home.test.tsx +++ b/frontend/app/routes/home.test.tsx @@ -2,137 +2,68 @@ import { describe, expect, it, vi } from "vitest"; import { screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import HomePage from "~/routes/home"; -import SelectedBookPage from "~/routes/book/selectedBook"; -import { SEARCH_BOOKS } from "~/hooks/useSearchBooks"; -import { apiBook } from "~/test/fixtures/books"; -import { bookMock, searchBooksMock } from "~/test/mocks"; +import BooksPage from "~/routes/books"; +import { searchBooksMock } from "~/test/mocks"; import { renderRoutes } from "~/test/renderRoutes"; import { loggedOut } from "~/test/session"; -// FavoriteButton on each book card reads the session. Logged out, it sends -// no GraphQL requests. vi.mock("~/api/auth", () => ({ authClient: { useSession: vi.fn(() => loggedOut) }, })); -// Every book card is a link to the book's details page. -const findBookLinks = () => - screen.findAllByRole("link", { name: /View details for/ }); - const routes = [ { path: "/", Component: HomePage }, - { path: "/book/:bookId", Component: SelectedBookPage }, + { path: "/books", Component: BooksPage }, ]; +const topRatedMock = searchBooksMock({ + title: "", + sortBy: "RATING", + sortDirection: "DESC", + limit: 8, + offset: 0, +}); + describe("HomePage", () => { - it("shows the books and the number of results from the API", async () => { - renderRoutes(routes, { mocks: [searchBooksMock()] }); + it("shows the top rated books from the API", async () => { + renderRoutes(routes, { mocks: [topRatedMock] }); - expect(await findBookLinks()).toHaveLength(3); - expect(screen.getByText("Good Omens")).toBeInTheDocument(); expect( - screen.getByText("Terry Pratchett, Neil Gaiman"), + await screen.findAllByRole("link", { name: /View details for/ }), + ).toHaveLength(3); + expect( + screen.getByRole("link", { name: "Create an account" }), ).toBeInTheDocument(); - expect(screen.getByText("3 results")).toBeInTheDocument(); }); - // Searching, filtering and sorting happen in the backend on the whole - // result set, so the page has to pass all of it on to the API. The mock - // only answers a request with exactly these variables. - it("sends the search, filters, sort and page from the URL to the API", async () => { + it("searches for books on the books page", async () => { + const user = userEvent.setup(); renderRoutes(routes, { - initialEntries: [ - "/?q=blade&genres=Fantasy&genres=Romance&language=English" + - "&bookFormat=Paperback&minPages=100&maxPages=500" + - "&sort=rating_desc&page=2", - ], mocks: [ - searchBooksMock( - { - title: "blade", - genres: ["Fantasy", "Romance"], - language: "English", - bookFormat: "Paperback", - minPages: 100, - maxPages: 500, - sortBy: "RATING", - sortDirection: "DESC", - limit: 12, - offset: 12, - }, - undefined, - 15, - ), + topRatedMock, + searchBooksMock({ title: "blade", limit: 12, offset: 0 }), ], }); - expect(await screen.findByText("15 results")).toBeInTheDocument(); - expect(screen.getByRole("link", { current: "page" })).toHaveTextContent( - "2", + await user.type( + screen.getByRole("searchbox", { name: "Search for books" }), + "blade", ); - }); + await user.click(screen.getByRole("button", { name: "Search" })); - it("tells the user when no books match the search", async () => { - renderRoutes(routes, { - initialEntries: ["/?q=zzzz"], - mocks: [searchBooksMock({ title: "zzzz", limit: 12, offset: 0 }, [])], - }); - - expect( - await screen.findByText("No books found for this search"), - ).toBeInTheDocument(); - expect(screen.getByText("0 results")).toBeInTheDocument(); + expect(await screen.findByText("3 results")).toBeInTheDocument(); }); - it("shows an error message when the API request fails", async () => { - renderRoutes(routes, { - mocks: [ - { - request: { - query: SEARCH_BOOKS, - variables: { title: "", limit: 12, offset: 0 }, - }, - error: new Error("Network error"), - }, - ], - }); - - expect( - await screen.findByText( - "Sorry, there was an error loading the books. Please try again later.", - ), - ).toBeInTheDocument(); - }); - - it("opens a book's details and goes back to the same search", async () => { + it("shows all books when searching with only whitespace", async () => { const user = userEvent.setup(); - const variables = { title: "blade", limit: 12, offset: 0 }; - renderRoutes(routes, { - initialEntries: ["/?q=blade"], - // Each request is mocked once: the search results are reused from - // Apollo's cache on the details page and when going back. - mocks: [searchBooksMock(variables), bookMock(1, apiBook)], - }); + renderRoutes(routes, { mocks: [topRatedMock, searchBooksMock()] }); - await user.click( - await screen.findByRole("link", { - name: "View details for The Blade Itself", - }), - ); - - expect(await screen.findByText(/Logen Ninefingers/)).toBeInTheDocument(); - expect( - screen.queryByRole("link", { name: /View details for/ }), - ).not.toBeInTheDocument(); - - await user.click( - // Rendered as a link, but exposed with role="button" by the Button component. - screen.getByRole("button", { name: "Go back to search results" }), + await user.type( + screen.getByRole("searchbox", { name: "Search for books" }), + " ", ); + await user.click(screen.getByRole("button", { name: "Search" })); - expect(await findBookLinks()).toHaveLength(3); - expect( - screen.getByRole("searchbox", { name: "Search for books" }), - ).toHaveValue("blade"); + expect(await screen.findByText("3 results")).toBeInTheDocument(); }); }); diff --git a/frontend/app/routes/home.tsx b/frontend/app/routes/home.tsx index 1f7b29f..d802f7b 100644 --- a/frontend/app/routes/home.tsx +++ b/frontend/app/routes/home.tsx @@ -1,10 +1,8 @@ -import { BookPagination } from "~/components/BookPagination/BookPagination"; +import { HeroSection } from "~/components/home/HeroSection/HeroSection"; +import { TopRatedSection } from "~/components/home/TopRatedSection/TopRatedSection"; import { useSearchBooks } from "~/hooks/useSearchBooks"; -import { SearchBar } from "~/components/home/SearchBar/SearchBar"; -import { BookCard } from "~/components/BookCard/BookCard"; -import { SortSelect } from "~/components/home/SortSelect/SortSelect"; -import { useBookSearchParams } from "~/hooks/useBookSearchParams"; -import { BOOK_PAGE_LIMIT } from "~/lib/constants"; + +const TOP_RATED_LIMIT = 8; export function meta() { return [ @@ -14,71 +12,19 @@ export function meta() { } export default function HomePage() { - const { query, page, filters, sort } = useBookSearchParams(); - - const { books, totalCount, loading, error } = useSearchBooks({ - filters, - title: query, - limit: BOOK_PAGE_LIMIT, - offset: (page - 1) * BOOK_PAGE_LIMIT, - sort, + // Shared by the hero covers and the top rated list, so only one request is sent. + const { books, loading } = useSearchBooks({ + filters: {}, + title: "", + limit: TOP_RATED_LIMIT, + offset: 0, + sort: "rating_desc", }); - if (loading) { - return ( -
- -

- Loading books... -

-
- ); - } - - if (error) { - return ( -
- -

- Sorry, there was an error loading the books. Please try again later. -

-
- ); - } - - if (!books || books.length === 0) { - return ( -
- -

- No books found for this search -

-
- ); - } - return ( -
- - - -
    - {books.map((book) => ( -
  • - -
  • - ))} -
- +
+ +
); } diff --git a/frontend/app/routes/profile.tsx b/frontend/app/routes/profile.tsx index fd66c6c..a0962ce 100644 --- a/frontend/app/routes/profile.tsx +++ b/frontend/app/routes/profile.tsx @@ -155,7 +155,7 @@ export default function ProfilePage() { ) : books.length === 0 ? (

You have no favorite books yet.{" "} - + Browse books

diff --git a/frontend/app/test/setup.ts b/frontend/app/test/setup.ts index 66f2d6f..b2ed409 100644 --- a/frontend/app/test/setup.ts +++ b/frontend/app/test/setup.ts @@ -2,9 +2,18 @@ // Adds matchers like toBeInTheDocument() and toHaveAttribute() to expect(). import "@testing-library/jest-dom/vitest"; -import { afterEach } from "vitest"; +import { afterEach, vi } from "vitest"; import { cleanup } from "@testing-library/react"; +// jsdom has no IntersectionObserver +class IntersectionObserverStub { + observe = vi.fn(); + unobserve = vi.fn(); + disconnect = vi.fn(); + takeRecords = vi.fn(() => []); +} +vi.stubGlobal("IntersectionObserver", IntersectionObserverStub); + afterEach(() => { // Unmount everything rendered by the previous test. cleanup(); From 6708fe444fd3523e1d750f88d848aa2d16dfb585 Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:26:19 +0100 Subject: [PATCH 04/21] feat: add stats, genres and "how it works" to homepage --- .../home/GenresSection/GenresSection.tsx | 62 +++++++++++++++++++ .../HowItWorksSection/HowItWorksSection.tsx | 58 +++++++++++++++++ .../home/RevealSection/RevealSection.tsx | 23 +++++++ .../home/StatsSection/StatsSection.tsx | 52 ++++++++++++++++ .../home/TopRatedSection/TopRatedSection.tsx | 14 ++--- frontend/app/hooks/useBookFilters.ts | 2 +- frontend/app/hooks/useCountUp.test.ts | 61 ++++++++++++++++++ frontend/app/hooks/useCountUp.ts | 39 ++++++++++++ frontend/app/routes/home.test.tsx | 42 +++++++++++-- frontend/app/routes/home.tsx | 8 ++- frontend/app/test/mocks.ts | 14 ++++- 11 files changed, 358 insertions(+), 17 deletions(-) create mode 100644 frontend/app/components/home/GenresSection/GenresSection.tsx create mode 100644 frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx create mode 100644 frontend/app/components/home/RevealSection/RevealSection.tsx create mode 100644 frontend/app/components/home/StatsSection/StatsSection.tsx create mode 100644 frontend/app/hooks/useCountUp.test.ts create mode 100644 frontend/app/hooks/useCountUp.ts diff --git a/frontend/app/components/home/GenresSection/GenresSection.tsx b/frontend/app/components/home/GenresSection/GenresSection.tsx new file mode 100644 index 0000000..0821bb6 --- /dev/null +++ b/frontend/app/components/home/GenresSection/GenresSection.tsx @@ -0,0 +1,62 @@ +import { Link } from "react-router"; +import { RevealSection } from "~/components/home/RevealSection/RevealSection"; +import { buttonVariants } from "~/components/ui/Button"; +import { Skeleton } from "~/components/ui/Skeleton"; +import { useBookFilters } from "~/hooks/useBookFilters"; +import { cn } from "~/lib/utils"; + +const GENRE_LIMIT = 12; + +function GenresSection() { + // The API sorts genres by how many books they have, so these are also the most popular + const { genres, loading, error } = useBookFilters(); + + return ( + +
+

+ Popular genres +

+

+ Jump straight into what you feel like reading. +

+
+ + {loading ? ( +
    + {Array.from({ length: GENRE_LIMIT }, (_, index) => ( +
  • + +
  • + ))} +
+ ) : error || genres.length === 0 ? ( +

Could not load the genres right now.

+ ) : ( +
    + {genres.slice(0, GENRE_LIMIT).map((genre) => ( +
  • + + {genre} + +
  • + ))} +
+ )} +
+ ); +} + +export { GenresSection }; diff --git a/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx new file mode 100644 index 0000000..b7ad944 --- /dev/null +++ b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx @@ -0,0 +1,58 @@ +import { HeartIcon, SearchIcon, SparklesIcon } from "lucide-react"; +import { RevealSection } from "~/components/home/RevealSection/RevealSection"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/Card"; + +const STEPS = [ + { + icon: SearchIcon, + title: "Search and filter", + description: + "Find books by title, then narrow them down by genre, language, format and length.", + }, + { + icon: HeartIcon, + title: "Save your favorites", + description: + "Create an account to keep a list of the books you love, ready whenever you are.", + }, + { + icon: SparklesIcon, + title: "Know your taste", + description: "Your profile shows the genres you come back to the most.", + }, +]; + +function HowItWorksSection() { + return ( + +

+ How Readr works +

+ +
    + {STEPS.map(({ icon: Icon, title, description }) => ( +
  1. + + + + + +

    {title}

    +
    +
    + +

    {description}

    +
    +
    +
  2. + ))} +
+
+ ); +} + +export { HowItWorksSection }; diff --git a/frontend/app/components/home/RevealSection/RevealSection.tsx b/frontend/app/components/home/RevealSection/RevealSection.tsx new file mode 100644 index 0000000..a55f4a0 --- /dev/null +++ b/frontend/app/components/home/RevealSection/RevealSection.tsx @@ -0,0 +1,23 @@ +import { useInView } from "~/hooks/useInView"; +import { cn } from "~/lib/utils"; + +function RevealSection({ + className, + ...props +}: React.ComponentProps<"section">) { + const { ref, inView } = useInView(); + + return ( +
+ ); +} + +export { RevealSection }; diff --git a/frontend/app/components/home/StatsSection/StatsSection.tsx b/frontend/app/components/home/StatsSection/StatsSection.tsx new file mode 100644 index 0000000..5bbd42f --- /dev/null +++ b/frontend/app/components/home/StatsSection/StatsSection.tsx @@ -0,0 +1,52 @@ +import { RevealSection } from "~/components/home/RevealSection/RevealSection"; +import { useBookFilters } from "~/hooks/useBookFilters"; +import { useCountUp } from "~/hooks/useCountUp"; +import { useInView } from "~/hooks/useInView"; + +interface StatProps { + label: string; + value: number; + start: boolean; +} + +function Stat({ label, value, start }: StatProps) { + const count = useCountUp(value, start); + + return ( +
+
{label}
+
+ {/* Screen readers get the final number instead of every step */} + + {value.toLocaleString("en")} +
+
+ ); +} + +interface StatsSectionProps { + bookCount: number; +} + +function StatsSection({ bookCount }: StatsSectionProps) { + const { genres, languages } = useBookFilters(); + const { ref, inView } = useInView(); + + return ( + +
+ + + +
+
+ ); +} + +export { StatsSection }; diff --git a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx index 6f4efbc..53910ca 100644 --- a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx +++ b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx @@ -1,10 +1,9 @@ import { Link } from "react-router"; import { ArrowRightIcon } from "lucide-react"; import { BookCard } from "~/components/BookCard/BookCard"; +import { RevealSection } from "~/components/home/RevealSection/RevealSection"; import { Skeleton } from "~/components/ui/Skeleton"; -import { useInView } from "~/hooks/useInView"; import type { SearchBook } from "~/hooks/useSearchBooks"; -import { cn } from "~/lib/utils"; function TopRatedSection({ books, @@ -13,17 +12,12 @@ function TopRatedSection({ books?: SearchBook[]; loading: boolean; }) { - const { ref, inView } = useInView(); const hasBooks = books && books.length > 0; return ( -
@@ -62,7 +56,7 @@ function TopRatedSection({ ) : (

Could not load the top rated books right now.

)} -
+ ); } diff --git a/frontend/app/hooks/useBookFilters.ts b/frontend/app/hooks/useBookFilters.ts index 142f3c1..a39d80b 100644 --- a/frontend/app/hooks/useBookFilters.ts +++ b/frontend/app/hooks/useBookFilters.ts @@ -27,4 +27,4 @@ function useBookFilters() { }; } -export { useBookFilters }; +export { BOOK_FILTERS, useBookFilters }; diff --git a/frontend/app/hooks/useCountUp.test.ts b/frontend/app/hooks/useCountUp.test.ts new file mode 100644 index 0000000..0fd2fc9 --- /dev/null +++ b/frontend/app/hooks/useCountUp.test.ts @@ -0,0 +1,61 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { act, renderHook } from "@testing-library/react"; +import { useCountUp } from "~/hooks/useCountUp"; + +function prefersReducedMotion(reduce: boolean) { + vi.stubGlobal( + "matchMedia", + vi.fn(() => ({ matches: reduce })), + ); +} + +describe("useCountUp", () => { + beforeEach(() => { + vi.useFakeTimers({ + toFake: ["requestAnimationFrame", "cancelAnimationFrame", "performance"], + }); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.unstubAllGlobals(); + }); + + it("stays at 0 until it is started", () => { + prefersReducedMotion(false); + const { result } = renderHook(() => useCountUp(500, false)); + + act(() => { + vi.advanceTimersByTime(2000); + }); + + expect(result.current).toBe(0); + }); + + it("counts up and ends exactly at the target", () => { + prefersReducedMotion(false); + const { result } = renderHook(() => useCountUp(500, true)); + + act(() => { + vi.advanceTimersByTime(500); + }); + expect(result.current).toBeGreaterThan(0); + expect(result.current).toBeLessThan(500); + + act(() => { + vi.advanceTimersByTime(1500); + }); + expect(result.current).toBe(500); + }); + + it("jumps straight to the target when the user prefers reduced motion", () => { + prefersReducedMotion(true); + const { result } = renderHook(() => useCountUp(500, true)); + + act(() => { + vi.advanceTimersByTime(20); + }); + + expect(result.current).toBe(500); + }); +}); diff --git a/frontend/app/hooks/useCountUp.ts b/frontend/app/hooks/useCountUp.ts new file mode 100644 index 0000000..ca4f614 --- /dev/null +++ b/frontend/app/hooks/useCountUp.ts @@ -0,0 +1,39 @@ +import { useEffect, useState } from "react"; + +const DURATION_MS = 1500; + +/** + * Counts from 0 up to target once start is true, slowing down towards the end. + * Shows the final value immediately if the user prefers reduced motion. + */ +function useCountUp(target: number, start: boolean) { + const [value, setValue] = useState(0); + + useEffect(() => { + if (!start) { + return; + } + + const duration = matchMedia("(prefers-reduced-motion: reduce)").matches + ? 0 + : DURATION_MS; + const startTime = performance.now(); + let frame: number; + + const tick = (now: number) => { + const progress = + duration === 0 ? 1 : Math.min((now - startTime) / duration, 1); + setValue(Math.round(target * (1 - (1 - progress) ** 3))); + if (progress < 1) { + frame = requestAnimationFrame(tick); + } + }; + frame = requestAnimationFrame(tick); + + return () => cancelAnimationFrame(frame); + }, [target, start]); + + return value; +} + +export { useCountUp }; diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx index fe111f2..cc7de79 100644 --- a/frontend/app/routes/home.test.tsx +++ b/frontend/app/routes/home.test.tsx @@ -1,9 +1,9 @@ import { describe, expect, it, vi } from "vitest"; -import { screen } from "@testing-library/react"; +import { screen, waitFor, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import HomePage from "~/routes/home"; import BooksPage from "~/routes/books"; -import { searchBooksMock } from "~/test/mocks"; +import { bookFiltersMock, searchBooksMock } from "~/test/mocks"; import { renderRoutes } from "~/test/renderRoutes"; import { loggedOut } from "~/test/session"; @@ -26,7 +26,7 @@ const topRatedMock = searchBooksMock({ describe("HomePage", () => { it("shows the top rated books from the API", async () => { - renderRoutes(routes, { mocks: [topRatedMock] }); + renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] }); expect( await screen.findAllByRole("link", { name: /View details for/ }), @@ -41,6 +41,7 @@ describe("HomePage", () => { renderRoutes(routes, { mocks: [ topRatedMock, + bookFiltersMock(), searchBooksMock({ title: "blade", limit: 12, offset: 0 }), ], }); @@ -56,7 +57,9 @@ describe("HomePage", () => { it("shows all books when searching with only whitespace", async () => { const user = userEvent.setup(); - renderRoutes(routes, { mocks: [topRatedMock, searchBooksMock()] }); + renderRoutes(routes, { + mocks: [topRatedMock, bookFiltersMock(), searchBooksMock()], + }); await user.type( screen.getByRole("searchbox", { name: "Search for books" }), @@ -66,4 +69,35 @@ describe("HomePage", () => { expect(await screen.findByText("3 results")).toBeInTheDocument(); }); + + it("shows how many books, genres and languages there are", async () => { + renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] }); + + const stats = screen.getByRole("region", { name: "Library statistics" }); + // The counts come from two queries, so wait for both: 3 books and 3 genres. + await waitFor(() => { + expect(within(stats).getAllByText("3")).toHaveLength(2); + }); + expect(within(stats).getByText("2")).toBeInTheDocument(); + }); + + it("opens the books page filtered by a popular genre", async () => { + const user = userEvent.setup(); + renderRoutes(routes, { + mocks: [ + topRatedMock, + bookFiltersMock(), + searchBooksMock({ + title: "", + genres: ["Fantasy"], + limit: 12, + offset: 0, + }), + ], + }); + + await user.click(await screen.findByRole("link", { name: "Fantasy" })); + + expect(await screen.findByText("3 results")).toBeInTheDocument(); + }); }); diff --git a/frontend/app/routes/home.tsx b/frontend/app/routes/home.tsx index d802f7b..3df8ec2 100644 --- a/frontend/app/routes/home.tsx +++ b/frontend/app/routes/home.tsx @@ -1,4 +1,7 @@ +import { GenresSection } from "~/components/home/GenresSection/GenresSection"; import { HeroSection } from "~/components/home/HeroSection/HeroSection"; +import { HowItWorksSection } from "~/components/home/HowItWorksSection/HowItWorksSection"; +import { StatsSection } from "~/components/home/StatsSection/StatsSection"; import { TopRatedSection } from "~/components/home/TopRatedSection/TopRatedSection"; import { useSearchBooks } from "~/hooks/useSearchBooks"; @@ -13,7 +16,7 @@ export function meta() { export default function HomePage() { // Shared by the hero covers and the top rated list, so only one request is sent. - const { books, loading } = useSearchBooks({ + const { books, totalCount, loading } = useSearchBooks({ filters: {}, title: "", limit: TOP_RATED_LIMIT, @@ -24,7 +27,10 @@ export default function HomePage() { return (
+ + +
); } diff --git a/frontend/app/test/mocks.ts b/frontend/app/test/mocks.ts index cce0752..84c580d 100644 --- a/frontend/app/test/mocks.ts +++ b/frontend/app/test/mocks.ts @@ -4,6 +4,7 @@ import type { SearchBooksQueryVariables, } from "~/api/types/graphql.generated"; import { BOOK } from "~/hooks/useBook"; +import { BOOK_FILTERS } from "~/hooks/useBookFilters"; import { SEARCH_BOOKS } from "~/hooks/useSearchBooks"; import { BOOK_PAGE_LIMIT } from "~/lib/constants"; import { apiSearchBooks } from "~/test/fixtures/books"; @@ -42,4 +43,15 @@ function bookMock( }; } -export { bookMock, defaultSearchVariables, searchBooksMock }; +// The genres, languages and formats used by the filters and the home page. +function bookFiltersMock( + genres = ["Fantasy", "Fiction", "Romance"], + languages = ["English", "Norwegian"], +): MockLink.MockedResponse { + return { + request: { query: BOOK_FILTERS }, + result: { data: { genres, languages, bookFormats: ["Paperback"] } }, + }; +} + +export { bookFiltersMock, bookMock, defaultSearchVariables, searchBooksMock }; From eab23bf9ccbb6257b2a4b34a0df9f876f98e1d33 Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:36:32 +0100 Subject: [PATCH 05/21] feat: add recommendations, surprise me button and sign-up banner --- .../home/ForYouSection/ForYouSection.tsx | 73 ++++++++++++++ .../home/HeroSection/HeroSection.tsx | 10 +- .../HowItWorksSection/HowItWorksSection.tsx | 2 +- .../home/SignUpBanner/SignUpBanner.tsx | 48 ++++++++++ .../SurpriseMeButton/SurpriseMeButton.tsx | 52 ++++++++++ frontend/app/routes/home.test.tsx | 94 ++++++++++++++++++- frontend/app/routes/home.tsx | 9 +- 7 files changed, 281 insertions(+), 7 deletions(-) create mode 100644 frontend/app/components/home/ForYouSection/ForYouSection.tsx create mode 100644 frontend/app/components/home/SignUpBanner/SignUpBanner.tsx create mode 100644 frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx diff --git a/frontend/app/components/home/ForYouSection/ForYouSection.tsx b/frontend/app/components/home/ForYouSection/ForYouSection.tsx new file mode 100644 index 0000000..fa1da69 --- /dev/null +++ b/frontend/app/components/home/ForYouSection/ForYouSection.tsx @@ -0,0 +1,73 @@ +import { Link } from "react-router"; +import { ArrowRightIcon } from "lucide-react"; +import { BookCard } from "~/components/BookCard/BookCard"; +import { RevealSection } from "~/components/home/RevealSection/RevealSection"; +import { useFavoriteBooks, useFavoriteStatus } from "~/hooks/useFavoriteBooks"; +import { useSearchBooks } from "~/hooks/useSearchBooks"; + +const RECOMMENDATION_LIMIT = 4; + +function ForYouSection() { + const { topGenres } = useFavoriteBooks({ page: 1 }); + const { isFavorite } = useFavoriteStatus({ enabled: true }); + const topGenre = topGenres.at(0); + + const { books } = useSearchBooks({ + filters: { genres: topGenre ? [topGenre] : undefined }, + title: "", + // Fetch extra, since books the user has already saved are left out. + limit: RECOMMENDATION_LIMIT * 3, + offset: 0, + sort: "rating_desc", + enabled: topGenre !== undefined, + }); + + const recommendations = (books ?? []) + .filter((book) => !isFavorite(book.id)) + .slice(0, RECOMMENDATION_LIMIT); + + // Users without favorites have no taste to base recommendations on yet. + if (!topGenre || recommendations.length === 0) { + return null; + } + + return ( + +
+
+

+ Because you like {topGenre} +

+

+ Highly rated books from your favorite genre. +

+
+ + More {topGenre} + +
+ +
    + {recommendations.map((book) => ( +
  • + +
  • + ))} +
+
+ ); +} + +export { ForYouSection }; diff --git a/frontend/app/components/home/HeroSection/HeroSection.tsx b/frontend/app/components/home/HeroSection/HeroSection.tsx index fa6854e..0cef814 100644 --- a/frontend/app/components/home/HeroSection/HeroSection.tsx +++ b/frontend/app/components/home/HeroSection/HeroSection.tsx @@ -1,6 +1,7 @@ import { Link, useNavigate } from "react-router"; import { SearchIcon } from "lucide-react"; import { authClient } from "~/api/auth"; +import { SurpriseMeButton } from "~/components/home/SurpriseMeButton/SurpriseMeButton"; import { buttonVariants } from "~/components/ui/Button"; import { InputGroup, @@ -17,7 +18,13 @@ const COVER_STYLES = [ "top-10 right-0 rotate-8 motion-safe:delay-1000", ]; -function HeroSection({ books }: { books: SearchBook[] }) { +function HeroSection({ + books, + bookCount, +}: { + books: SearchBook[]; + bookCount: number; +}) { const { data: session, isPending } = authClient.useSession(); const bookCovers = books.filter((book) => book.coverImgUrl).slice(0, 3); const navigate = useNavigate(); @@ -95,6 +102,7 @@ function HeroSection({ books }: { books: SearchBook[] }) { Create an account )} + diff --git a/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx index b7ad944..344ae8e 100644 --- a/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx +++ b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx @@ -13,7 +13,7 @@ const STEPS = [ icon: HeartIcon, title: "Save your favorites", description: - "Create an account to keep a list of the books you love, ready whenever you are.", + "Create an account to keep a list of the books you like, ready whenever you are.", }, { icon: SparklesIcon, diff --git a/frontend/app/components/home/SignUpBanner/SignUpBanner.tsx b/frontend/app/components/home/SignUpBanner/SignUpBanner.tsx new file mode 100644 index 0000000..4eb9d48 --- /dev/null +++ b/frontend/app/components/home/SignUpBanner/SignUpBanner.tsx @@ -0,0 +1,48 @@ +import { Link } from "react-router"; +import { RevealSection } from "~/components/home/RevealSection/RevealSection"; +import { buttonVariants } from "~/components/ui/Button"; +import { cn } from "~/lib/utils"; + +function SignUpBanner() { + return ( + +
+

+ Start your reading list +

+

+ Create a free account to save your favorite books and see which genres + you like the most. +

+ +
+
+ ); +} + +export { SignUpBanner }; diff --git a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx new file mode 100644 index 0000000..af1fca1 --- /dev/null +++ b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx @@ -0,0 +1,52 @@ +import { useLazyQuery } from "@apollo/client/react"; +import { useNavigate } from "react-router"; +import { ShuffleIcon } from "lucide-react"; +import { Button } from "~/components/ui/Button"; +import { Spinner } from "~/components/ui/Spinner"; +import { toast } from "~/components/ui/Toast"; +import { SEARCH_BOOKS } from "~/hooks/useSearchBooks"; + +interface SurpriseMeButtonProps { + bookCount: number; +} + +function SurpriseMeButton({ bookCount }: SurpriseMeButtonProps) { + const navigate = useNavigate(); + const [fetchBook, { loading }] = useLazyQuery(SEARCH_BOOKS); + + async function openRandomBook() { + try { + const { data } = await fetchBook({ + variables: { + title: "", + limit: 1, + offset: Math.floor(Math.random() * bookCount), + }, + }); + const book = data?.searchBooks.books.at(0); + if (!book) { + throw new Error("No book found"); + } + await navigate(`/book/${book.id}`); + } catch { + toast.add({ + description: "Could not find a random book. Please try again.", + type: "error", + }); + } + } + + return ( + + ); +} + +export { SurpriseMeButton }; diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx index cc7de79..2c53df2 100644 --- a/frontend/app/routes/home.test.tsx +++ b/frontend/app/routes/home.test.tsx @@ -1,19 +1,29 @@ import { describe, expect, it, vi } from "vitest"; +import { useParams } from "react-router"; import { screen, waitFor, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; +import { authClient } from "~/api/auth"; +import { FAVORITE_BOOK_IDS, FAVORITE_BOOKS } from "~/hooks/useFavoriteBooks"; import HomePage from "~/routes/home"; import BooksPage from "~/routes/books"; import { bookFiltersMock, searchBooksMock } from "~/test/mocks"; import { renderRoutes } from "~/test/renderRoutes"; -import { loggedOut } from "~/test/session"; +import { apiSearchBooks } from "~/test/fixtures/books"; +import { loggedIn, loggedOut } from "~/test/session"; vi.mock("~/api/auth", () => ({ authClient: { useSession: vi.fn(() => loggedOut) }, })); +function BookPageStub() { + const { bookId } = useParams(); + return

Book {bookId}

; +} + const routes = [ { path: "/", Component: HomePage }, { path: "/books", Component: BooksPage }, + { path: "/book/:bookId", Component: BookPageStub }, ]; const topRatedMock = searchBooksMock({ @@ -31,9 +41,6 @@ describe("HomePage", () => { expect( await screen.findAllByRole("link", { name: /View details for/ }), ).toHaveLength(3); - expect( - screen.getByRole("link", { name: "Create an account" }), - ).toBeInTheDocument(); }); it("searches for books on the books page", async () => { @@ -100,4 +107,83 @@ describe("HomePage", () => { expect(await screen.findByText("3 results")).toBeInTheDocument(); }); + + it("invites logged out users to create an account", async () => { + renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] }); + + expect( + await screen.findByRole("region", { name: "Start your reading list" }), + ).toBeInTheDocument(); + expect(screen.queryByText(/Because you like/)).not.toBeInTheDocument(); + }); + + it("recommends books from the user's favorite genre that they have not saved", async () => { + vi.mocked(authClient.useSession).mockReturnValue(loggedIn); + const [savedBook] = apiSearchBooks; + renderRoutes(routes, { + mocks: [ + topRatedMock, + bookFiltersMock(), + { + request: { query: FAVORITE_BOOKS, variables: { limit: 12, offset: 0 } }, + result: { + data: { + favoriteBooks: { + __typename: "BookSearchResult", + totalCount: 1, + books: [savedBook], + }, + favoriteGenres: ["Fantasy"], + }, + }, + }, + { + request: { query: FAVORITE_BOOK_IDS }, + result: { data: { favoriteBookIds: [savedBook.id] } }, + }, + searchBooksMock({ + title: "", + genres: ["Fantasy"], + sortBy: "RATING", + sortDirection: "DESC", + limit: 12, + offset: 0, + }), + ], + }); + + const forYou = await screen.findByRole("region", { + name: "Because you like Fantasy", + }); + expect( + within(forYou).getAllByRole("link", { name: /View details for/ }), + ).toHaveLength(2); + expect(within(forYou).queryByText(savedBook.title)).not.toBeInTheDocument(); + expect( + screen.queryByRole("region", { name: "Start your reading list" }), + ).not.toBeInTheDocument(); + }); + + it("opens a random book", async () => { + vi.spyOn(Math, "random").mockReturnValue(0.5); + const user = userEvent.setup(); + renderRoutes(routes, { + mocks: [ + topRatedMock, + bookFiltersMock(), + // 0.5 of 3 books is offset 1, the second book. + searchBooksMock({ title: "", limit: 1, offset: 1 }, [apiSearchBooks[1]]), + ], + }); + + const button = screen.getByRole("button", { name: "Surprise me" }); + await waitFor(() => { + expect(button).toBeEnabled(); + }); + await user.click(button); + + expect( + await screen.findByRole("heading", { name: "Book 2" }), + ).toBeInTheDocument(); + }); }); diff --git a/frontend/app/routes/home.tsx b/frontend/app/routes/home.tsx index 3df8ec2..c608b3b 100644 --- a/frontend/app/routes/home.tsx +++ b/frontend/app/routes/home.tsx @@ -1,6 +1,9 @@ +import { authClient } from "~/api/auth"; +import { ForYouSection } from "~/components/home/ForYouSection/ForYouSection"; import { GenresSection } from "~/components/home/GenresSection/GenresSection"; import { HeroSection } from "~/components/home/HeroSection/HeroSection"; import { HowItWorksSection } from "~/components/home/HowItWorksSection/HowItWorksSection"; +import { SignUpBanner } from "~/components/home/SignUpBanner/SignUpBanner"; import { StatsSection } from "~/components/home/StatsSection/StatsSection"; import { TopRatedSection } from "~/components/home/TopRatedSection/TopRatedSection"; import { useSearchBooks } from "~/hooks/useSearchBooks"; @@ -15,6 +18,8 @@ export function meta() { } export default function HomePage() { + const { data: session, isPending } = authClient.useSession(); + // Shared by the hero covers and the top rated list, so only one request is sent. const { books, totalCount, loading } = useSearchBooks({ filters: {}, @@ -26,11 +31,13 @@ export default function HomePage() { return (
- + + {session && } + {!isPending && !session && }
); } From e9b860f5989891339c75ba62d071f82b65c2c317 Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:42:26 +0100 Subject: [PATCH 06/21] feat: add tooltip to surprise me button --- .../SurpriseMeButton/SurpriseMeButton.tsx | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx index af1fca1..b2819e5 100644 --- a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx +++ b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx @@ -4,6 +4,11 @@ import { ShuffleIcon } from "lucide-react"; import { Button } from "~/components/ui/Button"; import { Spinner } from "~/components/ui/Spinner"; import { toast } from "~/components/ui/Toast"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "~/components/ui/Tooltip"; import { SEARCH_BOOKS } from "~/hooks/useSearchBooks"; interface SurpriseMeButtonProps { @@ -37,15 +42,22 @@ function SurpriseMeButton({ bookCount }: SurpriseMeButtonProps) { } return ( - + + void openRandomBook()} + /> + } + > + {loading ? + Open a random book from the library + ); } From 709afa77ccfedb12d49eab35603e3eca468727c2 Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:52:02 +0100 Subject: [PATCH 07/21] feat: add Tabs component from shadcn --- frontend/app/components/ui/Tabs.tsx | 79 +++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 frontend/app/components/ui/Tabs.tsx diff --git a/frontend/app/components/ui/Tabs.tsx b/frontend/app/components/ui/Tabs.tsx new file mode 100644 index 0000000..564e02b --- /dev/null +++ b/frontend/app/components/ui/Tabs.tsx @@ -0,0 +1,79 @@ +import { Tabs as TabsPrimitive } from "@base-ui/react/tabs"; +import { cva, type VariantProps } from "class-variance-authority"; +import { cn } from "cn"; + +function Tabs({ + className, + orientation = "horizontal", + ...props +}: TabsPrimitive.Root.Props) { + return ( + + ); +} + +const tabsListVariants = cva( + "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none", + { + variants: { + variant: { + default: "bg-muted", + line: "gap-1 bg-transparent", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function TabsList({ + className, + variant = "default", + ...props +}: TabsPrimitive.List.Props & VariantProps) { + return ( + + ); +} + +function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) { + return ( + + ); +} + +function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) { + return ( + + ); +} + +export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }; From cf0f2c935bcb44ce39bc595e4428622a105b78dc Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:54:38 +0100 Subject: [PATCH 08/21] feat: show top 3 genres in for you section on homepage --- .../home/ForYouSection/ForYouSection.tsx | 107 +++++++++--- frontend/app/hooks/useFavoriteBooks.ts | 4 +- frontend/app/routes/home.test.tsx | 155 ++++++++++++++---- 3 files changed, 214 insertions(+), 52 deletions(-) diff --git a/frontend/app/components/home/ForYouSection/ForYouSection.tsx b/frontend/app/components/home/ForYouSection/ForYouSection.tsx index fa1da69..3307235 100644 --- a/frontend/app/components/home/ForYouSection/ForYouSection.tsx +++ b/frontend/app/components/home/ForYouSection/ForYouSection.tsx @@ -1,36 +1,80 @@ +import { useState } from "react"; import { Link } from "react-router"; import { ArrowRightIcon } from "lucide-react"; import { BookCard } from "~/components/BookCard/BookCard"; import { RevealSection } from "~/components/home/RevealSection/RevealSection"; +import { Skeleton } from "~/components/ui/Skeleton"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/Tabs"; import { useFavoriteBooks, useFavoriteStatus } from "~/hooks/useFavoriteBooks"; import { useSearchBooks } from "~/hooks/useSearchBooks"; const RECOMMENDATION_LIMIT = 4; +const BOOK_GRID = + "grid grid-cols-4 gap-4 max-[1200px]:grid-cols-3 max-[1000px]:grid-cols-2 max-[600px]:grid-cols-1"; function ForYouSection() { - const { topGenres } = useFavoriteBooks({ page: 1 }); - const { isFavorite } = useFavoriteStatus({ enabled: true }); - const topGenre = topGenres.at(0); + const favorites = useFavoriteBooks({ page: 1 }); + const favoriteStatus = useFavoriteStatus({ enabled: true }); + const [selectedGenre, setSelectedGenre] = useState(); - const { books } = useSearchBooks({ - filters: { genres: topGenre ? [topGenre] : undefined }, + // Saving a book refetches the favorites. + // We keep the initial favorites so things do not change while the user is adding/removing favorites. + const [initialFavorites, setInitialFavorites] = useState<{ + topGenres: string[]; + bookIds: number[]; + }>(); + + if (!initialFavorites && !favorites.loading && !favoriteStatus.loading) { + setInitialFavorites({ + topGenres: favorites.topGenres, + bookIds: favoriteStatus.favoriteBookIds, + }); + } + + const topGenres = initialFavorites?.topGenres ?? []; + const genre = selectedGenre ?? topGenres.at(0); + + const { books, loading } = useSearchBooks({ + filters: { genres: genre ? [genre] : undefined }, title: "", // Fetch extra, since books the user has already saved are left out. limit: RECOMMENDATION_LIMIT * 3, offset: 0, sort: "rating_desc", - enabled: topGenre !== undefined, + enabled: genre !== undefined, }); - const recommendations = (books ?? []) - .filter((book) => !isFavorite(book.id)) - .slice(0, RECOMMENDATION_LIMIT); - // Users without favorites have no taste to base recommendations on yet. - if (!topGenre || recommendations.length === 0) { + if (!genre) { return null; } + const recommendations = (books ?? []) + .filter((book) => !initialFavorites?.bookIds.includes(Number(book.id))) + .slice(0, RECOMMENDATION_LIMIT); + + const recommendationList = loading ? ( +
    + {Array.from({ length: RECOMMENDATION_LIMIT }, (_, index) => ( +
  • + +
  • + ))} +
+ ) : recommendations.length > 0 ? ( +
    + {recommendations.map((book) => ( +
  • + +
  • + ))} +
+ ) : ( +

+ You have already saved the top {genre} books. Nice taste! +

+ ); + return (

- Because you like {topGenre} + Because you like {genre}

- Highly rated books from your favorite genre. + Highly rated books from your favorite genres.

- More {topGenre} + More {genre} -
    - {recommendations.map((book) => ( -
  • - -
  • - ))} -
+ {topGenres.length > 1 ? ( + { + if (typeof value === "string") { + setSelectedGenre(value); + } + }} + className="gap-6" + > + + {topGenres.map((topGenre) => ( + + {topGenre} + + ))} + + {topGenres.map((topGenre) => ( + + {recommendationList} + + ))} + + ) : ( + recommendationList + )}
); } diff --git a/frontend/app/hooks/useFavoriteBooks.ts b/frontend/app/hooks/useFavoriteBooks.ts index 7f10458..3d1c760 100644 --- a/frontend/app/hooks/useFavoriteBooks.ts +++ b/frontend/app/hooks/useFavoriteBooks.ts @@ -97,7 +97,7 @@ function useFavoriteBooks({ } function useFavoriteStatus({ enabled }: { enabled: boolean }) { - const { data } = useQuery(FAVORITE_BOOK_IDS, { skip: !enabled }); + const { data, loading } = useQuery(FAVORITE_BOOK_IDS, { skip: !enabled }); const favoriteBookIds = data?.favoriteBookIds ?? []; const options = { @@ -114,6 +114,8 @@ function useFavoriteStatus({ enabled }: { enabled: boolean }) { ); return { + favoriteBookIds, + loading, isFavorite: (bookId: string) => favoriteBookIds.includes(Number(bookId)), addFavoriteBook: (bookId: string) => addFavoriteBook({ variables: { bookId: Number(bookId) } }), diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx index 2c53df2..51bbcde 100644 --- a/frontend/app/routes/home.test.tsx +++ b/frontend/app/routes/home.test.tsx @@ -3,7 +3,11 @@ import { useParams } from "react-router"; import { screen, waitFor, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { authClient } from "~/api/auth"; -import { FAVORITE_BOOK_IDS, FAVORITE_BOOKS } from "~/hooks/useFavoriteBooks"; +import { + ADD_FAVORITE_BOOK, + FAVORITE_BOOK_IDS, + FAVORITE_BOOKS, +} from "~/hooks/useFavoriteBooks"; import HomePage from "~/routes/home"; import BooksPage from "~/routes/books"; import { bookFiltersMock, searchBooksMock } from "~/test/mocks"; @@ -26,6 +30,38 @@ const routes = [ { path: "/book/:bookId", Component: BookPageStub }, ]; +// The user's saved book and top genres, used for the recommendations. +const [savedBook] = apiSearchBooks; +const favoritesMocks = (favoriteGenres: string[], bookIds = [savedBook.id]) => [ + { + request: { query: FAVORITE_BOOKS, variables: { limit: 12, offset: 0 } }, + result: { + data: { + favoriteBooks: { + __typename: "BookSearchResult", + totalCount: 1, + books: [savedBook], + }, + favoriteGenres, + }, + }, + }, + { + request: { query: FAVORITE_BOOK_IDS }, + result: { data: { favoriteBookIds: bookIds } }, + }, +]; + +const recommendationsMock = (genre: string) => + searchBooksMock({ + title: "", + genres: [genre], + sortBy: "RATING", + sortDirection: "DESC", + limit: 12, + offset: 0, + }); + const topRatedMock = searchBooksMock({ title: "", sortBy: "RATING", @@ -119,36 +155,12 @@ describe("HomePage", () => { it("recommends books from the user's favorite genre that they have not saved", async () => { vi.mocked(authClient.useSession).mockReturnValue(loggedIn); - const [savedBook] = apiSearchBooks; renderRoutes(routes, { mocks: [ topRatedMock, bookFiltersMock(), - { - request: { query: FAVORITE_BOOKS, variables: { limit: 12, offset: 0 } }, - result: { - data: { - favoriteBooks: { - __typename: "BookSearchResult", - totalCount: 1, - books: [savedBook], - }, - favoriteGenres: ["Fantasy"], - }, - }, - }, - { - request: { query: FAVORITE_BOOK_IDS }, - result: { data: { favoriteBookIds: [savedBook.id] } }, - }, - searchBooksMock({ - title: "", - genres: ["Fantasy"], - sortBy: "RATING", - sortDirection: "DESC", - limit: 12, - offset: 0, - }), + ...favoritesMocks(["Fantasy"]), + recommendationsMock("Fantasy"), ], }); @@ -156,7 +168,7 @@ describe("HomePage", () => { name: "Because you like Fantasy", }); expect( - within(forYou).getAllByRole("link", { name: /View details for/ }), + await within(forYou).findAllByRole("link", { name: /View details for/ }), ).toHaveLength(2); expect(within(forYou).queryByText(savedBook.title)).not.toBeInTheDocument(); expect( @@ -172,7 +184,9 @@ describe("HomePage", () => { topRatedMock, bookFiltersMock(), // 0.5 of 3 books is offset 1, the second book. - searchBooksMock({ title: "", limit: 1, offset: 1 }, [apiSearchBooks[1]]), + searchBooksMock({ title: "", limit: 1, offset: 1 }, [ + apiSearchBooks[1], + ]), ], }); @@ -186,4 +200,87 @@ describe("HomePage", () => { await screen.findByRole("heading", { name: "Book 2" }), ).toBeInTheDocument(); }); + + it("switches the recommendations between the user's favorite genres", async () => { + vi.mocked(authClient.useSession).mockReturnValue(loggedIn); + const user = userEvent.setup(); + renderRoutes(routes, { + mocks: [ + topRatedMock, + bookFiltersMock(), + ...favoritesMocks(["Fantasy", "Romance"]), + recommendationsMock("Fantasy"), + recommendationsMock("Romance"), + ], + }); + + const romance = await screen.findByRole("tab", { name: "Romance" }); + expect(romance).toHaveAttribute("aria-selected", "false"); + await user.click(romance); + + expect( + await screen.findByRole("heading", { name: "Because you like Romance" }), + ).toBeInTheDocument(); + expect(romance).toHaveAttribute("aria-selected", "true"); + expect(screen.getByRole("link", { name: /More Romance/ })).toHaveAttribute( + "href", + "/books?genres=Romance&sort=rating_desc", + ); + }); + + it("explains the surprise me button in a tooltip", async () => { + const user = userEvent.setup(); + renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] }); + + const button = screen.getByRole("button", { name: "Surprise me" }); + // Disabled until the number of books has loaded. + await waitFor(() => { + expect(button).toBeEnabled(); + }); + await user.hover(button); + + expect( + await screen.findByText("Open a random book from the library"), + ).toBeInTheDocument(); + }); + + it("keeps the recommendations in place when the user saves one of them", async () => { + vi.mocked(authClient.useSession).mockReturnValue(loggedIn); + const user = userEvent.setup(); + renderRoutes(routes, { + mocks: [ + topRatedMock, + bookFiltersMock(), + ...favoritesMocks(["Fantasy"]), + recommendationsMock("Fantasy"), + { + request: { query: ADD_FAVORITE_BOOK, variables: { bookId: 2 } }, + result: { data: { addFavoriteBook: { __typename: "Book", id: 2 } } }, + }, + // After saving, the user's top genre changes as well. + ...favoritesMocks(["Romance"], [savedBook.id, 2]), + ], + }); + + const forYou = await screen.findByRole("region", { + name: "Because you like Fantasy", + }); + await user.click( + await within(forYou).findByRole("button", { + name: "Add Before They Are Hanged to favorites", + }), + ); + + expect( + await within(forYou).findByRole("button", { + name: "Remove Before They Are Hanged from favorites", + }), + ).toBeInTheDocument(); + expect( + screen.getByRole("heading", { name: "Because you like Fantasy" }), + ).toBeInTheDocument(); + expect( + within(forYou).getAllByRole("link", { name: /View details for/ }), + ).toHaveLength(2); + }); }); From d2ed0fa0dd19723ec3174d319abd625bea3b47a1 Mon Sep 17 00:00:00 2001 From: Martin Alexander Kaminski Date: Wed, 4 Nov 2026 21:54:48 +0100 Subject: [PATCH 09/21] chore: run Prettier on files --- .../SurpriseMeButton/SurpriseMeButton.tsx | 6 ++++- frontend/app/components/ui/Button.tsx | 3 ++- frontend/app/components/ui/Popover.tsx | 22 +++++++++---------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx index b2819e5..cd96320 100644 --- a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx +++ b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx @@ -53,7 +53,11 @@ function SurpriseMeButton({ bookCount }: SurpriseMeButtonProps) { /> } > - {loading ?