diff --git a/package-lock.json b/package-lock.json index 239a222..645f647 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@hookform/resolvers": "^5.4.0", "@prisma/client": "^7.8.0", "clsx": "^2.1.1", + "firebase": "^12.13.0", "framer-motion": "^12.40.0", "lucide-react": "^1.16.0", "next": "15.5.18", @@ -255,6 +256,648 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@firebase/ai": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.12.0.tgz", + "integrity": "sha512-b+OL4vdyiSLZL/7dLd67V55CjKJvU9MpNmwnday7eA6GG2+J4iwUEsEHgw0/jKY3A41FfkF0SrnYFvtKbQZ65A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.4", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.22", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.22.tgz", + "integrity": "sha512-8BSaq/QRGU1+xyi8L2PTLTJU7MH9aMA72RQdIxrbhWFauOZY9OXo8f2YDN/972xA8d588tlnNVEQ2Mo69pT9Ow==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.28.tgz", + "integrity": "sha512-lIAlqUUbBu93FJMlQfslryQtBwwzdzvp23ePC6FNgymXk6Ook5v4Uvc0vdutvoIeqmyA3LfP0ZeRFK8+11kOOQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.22", + "@firebase/analytics-types": "0.8.4", + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.4.tgz", + "integrity": "sha512-zQ+XTgkwH6CY/eUSHJRP7e4LxM30RCxlCmob5sy2axs25GE3Ny0XdgpDscMTHHQIGqWkxPXad4w2Mw9sCgT8zQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app": { + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.12.tgz", + "integrity": "sha512-FT+HoNp1NdaZ/N26hCwV3WbxS1m6gTn3p2QRBQ3KH7YqyCQqJx0iT7126RgVk68/Rq+9DeL/zCFnHZ0C4u1nLQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.3.tgz", + "integrity": "sha512-aJ4DfubWfTO8/2vhEhIAizOoOmiycESTU32e+OUgbWcS/G3PA4Vxlr/9zaiN2wfUG2AptQ7DTvj00tyuFZP5Bg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.3.tgz", + "integrity": "sha512-L3AKIRTJxT9b7cDUH3OyV8gWTnmW3vYkwdzRsukWt4kbPBTct12xalnyvHDkm1lKkr+cQq/4uzBx1bOWsQ2ciw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check": "0.11.3", + "@firebase/app-check-types": "0.5.4", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.4.tgz", + "integrity": "sha512-zz3i6e13B8BfWiLy8MABtTh8aGIACgKbf9UVnyHcWs+yQzJXgQcl8A46b0zfaiJHdQ+niF0ouAfcpuf+3LMPQg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.4.tgz", + "integrity": "sha512-xV7JsIyzVr15aA7f3Pi0rB9gdBuVubs89FGA8VkRYA4g0l78poADgdfrScgf7NndSg9mm7cR7PJyY0+t22KaGw==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-compat": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.12.tgz", + "integrity": "sha512-Pe513OBerK/CIBxz4/za9atd5MsZtd6DzHz4cmqkvkrcDWhQChAoHBpZ3McuZNuSP8YZiKwfX/J1frR07l15/w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app": "0.14.12", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.5.tgz", + "integrity": "sha512-YevqTjvo7Iujsa9Dwowmd6dSoElhzmD63ZSrq6bzjvQ6POjYgNjOFHLmNIgJs48eNO093NCERibuFnxbfOvU7A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/logger": "0.5.1" + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.6.tgz", + "integrity": "sha512-KDJ/GAf/rt7galOpn3DRb2buFfGkZCsHTryKjXDG0eeRnok4+2B4nnkMOMdjRnPkElmcJv2Ao0vEA6kp5m98PQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth": "1.13.1", + "@firebase/auth-types": "0.13.1", + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-compat/node_modules/@firebase/auth": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.13.1.tgz", + "integrity": "sha512-/1nkKY/MicI+I9WWcx6R4NKs77AaW9NQ0IwsFdUBomWrW0/cXEmopfM2dtLm2oI1qG6z6vom3CXZDHJIJXoMuw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^2.2.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.5.tgz", + "integrity": "sha512-1Li/YuBDBAXcKv7BzY4U28gontUmAaw53sYiqbaVOMCFb2lFKK/c3CGMUWqtwe7+TXrl3poWnTCL5umYBg85Eg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth-types": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.1.tgz", + "integrity": "sha512-0c1Mnid0uMDfGJHeUS4zfvBa4/CedJXotGy/n/NZJnBjwiJawt0ZYU+wH2VAVLiRCEfG2ncCkAX3yd1/2nrB7g==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.3.tgz", + "integrity": "sha512-wFofIaa2879ogD/WvkjYXJxRmfnL0scen6ORgaC3na1FNOR9ASIUANQdhqQcmWu/h77/pVHY7ch5flewa5Bcew==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/data-connect": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.7.0.tgz", + "integrity": "sha512-ar9sNOJh5poQCSMSVlnVE8eo8+usTD1POWDCv65omkKUvnFMcdXaQ7J/e7WGKqJzcEMgiezSX/TZiKHZkItMbQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth-interop-types": "0.2.5", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/database": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.3.tgz", + "integrity": "sha512-XwWCa+E4TvNGpGwXrycLRNfdogADwFcvuhyow6wDWma9W54roaQIhe+4PM0KiLsIftBdSCGI7OKCXrdSRHbIhw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.4", + "@firebase/auth-interop-types": "0.2.5", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.4.tgz", + "integrity": "sha512-3pK35F1MAgmqFJQlf2nhQl44vtAXQO1uaCaQOEUI9kCRtLFqi7N+QRKR7lFZPg+xIZIyubgxQaxY69YgfZRZWg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/database": "1.1.3", + "@firebase/database-types": "1.0.20", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.20.tgz", + "integrity": "sha512-kegbOk/w8iU64pr0q6k2ItyNGjnQBMHFhwS7ohdWI4W+pc0/zhhdGXTdFj6X1oxItRjPoYOsSQmERgBkn/ihxw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-types": "0.9.5", + "@firebase/util": "1.15.1" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.14.1.tgz", + "integrity": "sha512-PouS0NJZ3NYOZE/tPDvXa8VUeJ10Ll//7jIdFvMYdhQkd/P3O7nlqhyoTmY0h8Xa9hxg+H0j6gxUytJcoZ9YOg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "@firebase/webchannel-wrapper": "1.0.6", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.9.tgz", + "integrity": "sha512-NPtBuFr79BbIQJXFWhW4xFC6rBksK8/ewqCTYbbAYfZBDDx0/iHTUj4WpKi5D4d0Pn2Md/3T/e5V9379G5N/Zg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/firestore": "4.14.1", + "@firebase/firestore-types": "3.0.4", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.4.tgz", + "integrity": "sha512-jGn+JSS4X9zZsrfu7Yw66v5YRdOLD1oyQh4USR0xWl4CUqV/DA6bNIXRPpxH/cUl3iVTNiP6MN7g+EL42A4qfA==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.4.tgz", + "integrity": "sha512-oB5rpm2Emxn2+IS1gRelAeT/5tSZMwM/KhqC5LnJsmTNnS1ZDhD7ZMZNgCI8vchTW6PbaXIwEnpUryGuIQsNbg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.4", + "@firebase/auth-interop-types": "0.2.5", + "@firebase/component": "0.7.3", + "@firebase/messaging-interop-types": "0.2.4", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.4.tgz", + "integrity": "sha512-Be+MwhseVf/eFAZwGrFJGok6S7cmsLrAPK8MgyM8LjM0MewTsx2n01WOOca9jio1UsCZOJ0aVyQobnINcdNuIQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/functions": "0.13.4", + "@firebase/functions-types": "0.6.4", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.4.tgz", + "integrity": "sha512-zV6kgqtduR4rUAdC/ilS7kmb93XD7bEZoJDlVBZqlOw2uGGGCNBQBuleww2rr0Ulr3L9o2TDjumEt68/l1f9DQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/installations": { + "version": "0.6.22", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.22.tgz", + "integrity": "sha512-ef6nn3GGQTdReCfotRMG77PJZu8CqEbiK5pEoBnM0gTu/Z9v0i/az2p3HABsa/1beQmmyh1OsOjf7P5+pgwdZw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.22.tgz", + "integrity": "sha512-C/zpAuTP5S9OgKSPvXRupw3hoY/JZSlA1wFjD/Sb7LIQE0FNbcMdO8Y4KXVEkjVzma/DDDDIAzxEXqKMAzc88w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/installations-types": "0.5.4", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.4.tgz", + "integrity": "sha512-U2eFapdHwjb43Vx9o+Pmj4dFfvcHEK1IirEFLqMtWrTHvmdrS3gBpBD1kmJk/9HjsOtoHZxJ2Paoe79e+L1ZPg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.1.tgz", + "integrity": "sha512-vZKLsqE1ABOy8OjQiE7cUTFn4gvaqlk88yp8N94Pk/sDpq61YqZGqmVFZTvOyflTwuYFcWirBdYGoJgbDaXKYQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.26", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.26.tgz", + "integrity": "sha512-lHVTO9uLofymHVWkYeUtMddIPcmJvSzVbHRB88W6XKfxbcKF+p3QrfqKhDxremSB4NQjUla1Gwn7d9umSMmt/w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/messaging-interop-types": "0.2.4", + "@firebase/util": "1.15.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.26.tgz", + "integrity": "sha512-fn0XvWOfK4tsDLSipwJUW9Cp6ahWA6z+iJHxZ0pHp9MzMSUNQx85yuxZAuI7gkGXfqs7+DqEDHyyS7jDGswrmQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/messaging": "0.12.26", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.4.tgz", + "integrity": "sha512-wrzITQq+xw5LtygX7O0fu43/k9ABQ4x5H9/sR5m1SbNnhIRI5xd3+raSNJaJkYC4BUhM9A4ZNSnyR2sjhxnb2Q==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/performance": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.12.tgz", + "integrity": "sha512-fe7nV8teUU3OBHlMUZ9Lw4gLhCW2k4m5Uc3pfWGV+fl8uwJQBGp9Q3lqsJ+HSrFu3Q2pJyLAgrClPGSKyDeYgQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0", + "web-vitals": "^4.2.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.25.tgz", + "integrity": "sha512-q6NjTXpIPoFuUmCmMN/maCdTgzT6aExs9xZo+PxfVLj6uLVGvpyAD6XWjmcrb7jChsFBYbq7E5dyNDF7Zhy9kA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/performance": "0.7.12", + "@firebase/performance-types": "0.2.4", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.4.tgz", + "integrity": "sha512-kJSEk7b0uhpcPRyL4SQ/GPujLqk52XNKcXlnsKDbWGAb9vugcLvOU3u6zfEdwd+d8hWJb5S5ZizV1JFFI0nkKg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/remote-config": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.3.tgz", + "integrity": "sha512-ggGKAaLy9YNOvpFoQZgm5p5SiFw3ZFtwti08dojnBQmQicpThTxvG5xZMSpCTYMj2o3gM/yK9CVd2w+kZub8YA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.24.tgz", + "integrity": "sha512-EWZTt6fJ7YmPHodQNsSxAIDZY2x8P5kRPvXAc5CmzzBm+NyPFhODbfDsNllDXDL8jlzp50bVWjDY+BXepZS9Mg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/remote-config": "0.8.3", + "@firebase/remote-config-types": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.1.tgz", + "integrity": "sha512-cX/1LT6KQwkXzck2eSzeKnuvXZCyr8qaPpDcikoJs7jmI+oBOXixpDLeDtWj1U6GNMkIoXrEDNoyT2Ypcyp5/A==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/storage": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.3.tgz", + "integrity": "sha512-YX4/YL6P6/fufSSeGnVhjWddcIXbFq2cWIhMKFTZo1E/Rtcl2mJj/BYUQTwJfcE1Tl8un1FOya4L05jcSLN/Eg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.3.tgz", + "integrity": "sha512-gruVqjtUGX8tEoeNbaWXZm0Zfcfcb7fvmDmBxV8yPAbWvExRnZYLO2+qw9idxNE7BvPXt5csyjSYHy//dAizxw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/storage": "0.14.3", + "@firebase/storage-types": "0.8.4", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.4.tgz", + "integrity": "sha512-BT7cwxJOx8SWwlQfrlC+bD/Sk3Cw+1odCi8UZNFNWTVZoPsBnA5W+mqtZzVnvsdJpXCFGSGQ7R7vOR6dtM/BRA==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.15.1.tgz", + "integrity": "sha512-LUdM4Wg7YM9Pq/49nGYySJA0CSQEKnGffFzWV8+6gXN7mGxn+FL1IqvFbuZUtAQcfZgHYDwCE1wwlK7rB7gl2g==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.6.tgz", + "integrity": "sha512-Vr/Mqu79dMwGRAyGbJ4uN4+BtXB3/mRTdzetD1daWNeG8QaWuzhhbG77GltO5c0yYmYls8i250iX73624GJd7Q==", + "license": "Apache-2.0" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.16", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.16.tgz", + "integrity": "sha512-wE4Ut/olIzfKqp631XrG+wbF0v1vWFN4YL9FyXC2LJiG33DsV7PLzURjrCvY/6je2ntdRkeLpPDluzSRGaVltQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@hono/node-server": { "version": "1.19.11", "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", @@ -1294,6 +1937,69 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", @@ -1882,7 +2588,6 @@ "version": "20.19.41", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2549,11 +3254,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3004,6 +3717,20 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -3017,7 +3744,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3030,7 +3756,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/concat-map": { @@ -3645,6 +4370,15 @@ "benchmarks" ] }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4179,6 +4913,18 @@ "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -4222,6 +4968,66 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/firebase": { + "version": "12.13.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.13.0.tgz", + "integrity": "sha512-iutR8ejvAqk6qUClnsPz3U3VIjTWp243AX4cD3iifak5t56to1J29xUIQgSDDzaAqKvhshZerzSahwMQj2TlvA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/ai": "2.12.0", + "@firebase/analytics": "0.10.22", + "@firebase/analytics-compat": "0.2.28", + "@firebase/app": "0.14.12", + "@firebase/app-check": "0.11.3", + "@firebase/app-check-compat": "0.4.3", + "@firebase/app-compat": "0.5.12", + "@firebase/app-types": "0.9.5", + "@firebase/auth": "1.13.1", + "@firebase/auth-compat": "0.6.6", + "@firebase/data-connect": "0.7.0", + "@firebase/database": "1.1.3", + "@firebase/database-compat": "2.1.4", + "@firebase/firestore": "4.14.1", + "@firebase/firestore-compat": "0.4.9", + "@firebase/functions": "0.13.4", + "@firebase/functions-compat": "0.4.4", + "@firebase/installations": "0.6.22", + "@firebase/installations-compat": "0.2.22", + "@firebase/messaging": "0.12.26", + "@firebase/messaging-compat": "0.2.26", + "@firebase/performance": "0.7.12", + "@firebase/performance-compat": "0.2.25", + "@firebase/remote-config": "0.8.3", + "@firebase/remote-config-compat": "0.2.24", + "@firebase/storage": "0.14.3", + "@firebase/storage-compat": "0.4.3", + "@firebase/util": "1.15.1" + } + }, + "node_modules/firebase/node_modules/@firebase/auth": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.13.1.tgz", + "integrity": "sha512-/1nkKY/MicI+I9WWcx6R4NKs77AaW9NQ0IwsFdUBomWrW0/cXEmopfM2dtLm2oI1qG6z6vom3CXZDHJIJXoMuw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^2.2.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -4364,6 +5170,15 @@ "node": ">= 0.4" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4632,6 +5447,12 @@ "node": ">=16.9.0" } }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, "node_modules/http-status-codes": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", @@ -4656,6 +5477,12 @@ "url": "https://opencollective.com/express" } }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4898,6 +5725,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -5569,6 +6405,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5580,7 +6422,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "devOptional": true, "license": "Apache-2.0" }, "node_modules/loose-envify": { @@ -6305,6 +7146,30 @@ "devOptional": true, "license": "ISC" }, + "node_modules/protobufjs": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.1.tgz", + "integrity": "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6543,6 +7408,15 @@ "url": "https://github.com/sponsors/remeda" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6668,6 +7542,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -6988,6 +7882,26 @@ "node": ">= 0.4" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -7101,6 +8015,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7431,7 +8357,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unrs-resolver": { @@ -7528,6 +8453,35 @@ "d3-timer": "^3.0.1" } }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "license": "Apache-2.0" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7643,6 +8597,59 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 9141665..2df2529 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@hookform/resolvers": "^5.4.0", "@prisma/client": "^7.8.0", "clsx": "^2.1.1", + "firebase": "^12.13.0", "framer-motion": "^12.40.0", "lucide-react": "^1.16.0", "next": "15.5.18", diff --git a/public/assests/Bedroom/517Z6vuaBKL._AC_UL480_FMwebp_QL65_.webp b/public/assests/Bedroom/517Z6vuaBKL._AC_UL480_FMwebp_QL65_.webp new file mode 100644 index 0000000..b3644fa Binary files /dev/null and b/public/assests/Bedroom/517Z6vuaBKL._AC_UL480_FMwebp_QL65_.webp differ diff --git a/public/assests/Bedroom/51MctYF8BiL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Bedroom/51MctYF8BiL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..1b49c73 Binary files /dev/null and b/public/assests/Bedroom/51MctYF8BiL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Bedroom/61KeTeFWWDL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Bedroom/61KeTeFWWDL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..d85052e Binary files /dev/null and b/public/assests/Bedroom/61KeTeFWWDL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Bedroom/61mJSikurML._AC_UL640_FMwebp_QL65_.webp b/public/assests/Bedroom/61mJSikurML._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..02c58f1 Binary files /dev/null and b/public/assests/Bedroom/61mJSikurML._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Bedroom/711KZ2KfEpL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Bedroom/711KZ2KfEpL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..16eb321 Binary files /dev/null and b/public/assests/Bedroom/711KZ2KfEpL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Bedroom/71Mly7EKFYL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Bedroom/71Mly7EKFYL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..f834c65 Binary files /dev/null and b/public/assests/Bedroom/71Mly7EKFYL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Bedroom/81eil1Y4QpL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Bedroom/81eil1Y4QpL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..f5c4ffb Binary files /dev/null and b/public/assests/Bedroom/81eil1Y4QpL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Dining & Bar Items/61Nkidjx-FL._AC_UL800_FMwebp_QL65_.webp b/public/assests/Dining & Bar Items/61Nkidjx-FL._AC_UL800_FMwebp_QL65_.webp new file mode 100644 index 0000000..a0112e1 Binary files /dev/null and b/public/assests/Dining & Bar Items/61Nkidjx-FL._AC_UL800_FMwebp_QL65_.webp differ diff --git a/public/assests/Dining & Bar Items/61a33JUOuPL._AC_UL800_FMwebp_QL65_.webp b/public/assests/Dining & Bar Items/61a33JUOuPL._AC_UL800_FMwebp_QL65_.webp new file mode 100644 index 0000000..f58149e Binary files /dev/null and b/public/assests/Dining & Bar Items/61a33JUOuPL._AC_UL800_FMwebp_QL65_.webp differ diff --git a/public/assests/Dining & Bar Items/71OEWl8tiWL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Dining & Bar Items/71OEWl8tiWL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..602e1a6 Binary files /dev/null and b/public/assests/Dining & Bar Items/71OEWl8tiWL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Dining & Bar Items/71UutWdQOJL._AC_UL480_FMwebp_QL65_.webp b/public/assests/Dining & Bar Items/71UutWdQOJL._AC_UL480_FMwebp_QL65_.webp new file mode 100644 index 0000000..da68112 Binary files /dev/null and b/public/assests/Dining & Bar Items/71UutWdQOJL._AC_UL480_FMwebp_QL65_.webp differ diff --git a/public/assests/Dining & Bar Items/81qvXiLuE5L._AC_UL480_FMwebp_QL65_.webp b/public/assests/Dining & Bar Items/81qvXiLuE5L._AC_UL480_FMwebp_QL65_.webp new file mode 100644 index 0000000..d60ed7c Binary files /dev/null and b/public/assests/Dining & Bar Items/81qvXiLuE5L._AC_UL480_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/51Wjei45NzL._AC_UL480_FMwebp_QL65_.webp b/public/assests/Lighting/51Wjei45NzL._AC_UL480_FMwebp_QL65_.webp new file mode 100644 index 0000000..0d6a1d1 Binary files /dev/null and b/public/assests/Lighting/51Wjei45NzL._AC_UL480_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/61FWtvIUEaL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Lighting/61FWtvIUEaL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..f860f6f Binary files /dev/null and b/public/assests/Lighting/61FWtvIUEaL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/61XdpiDG9zL._AC_UL320_.jpg b/public/assests/Lighting/61XdpiDG9zL._AC_UL320_.jpg new file mode 100644 index 0000000..7d8c55e Binary files /dev/null and b/public/assests/Lighting/61XdpiDG9zL._AC_UL320_.jpg differ diff --git a/public/assests/Lighting/61bFc+A+53L._AC_UL480_FMwebp_QL65_.webp b/public/assests/Lighting/61bFc+A+53L._AC_UL480_FMwebp_QL65_.webp new file mode 100644 index 0000000..d3217af Binary files /dev/null and b/public/assests/Lighting/61bFc+A+53L._AC_UL480_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/71DiogsqB3L._AC_UL800_FMwebp_QL65_.webp b/public/assests/Lighting/71DiogsqB3L._AC_UL800_FMwebp_QL65_.webp new file mode 100644 index 0000000..a74cf29 Binary files /dev/null and b/public/assests/Lighting/71DiogsqB3L._AC_UL800_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/71RXvbYMSpS._AC_UL640_FMwebp_QL65_.webp b/public/assests/Lighting/71RXvbYMSpS._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..0ef9de8 Binary files /dev/null and b/public/assests/Lighting/71RXvbYMSpS._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/71caZJGQnJL._AC_UL640_FMwebp_QL65_.webp b/public/assests/Lighting/71caZJGQnJL._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..8f9d366 Binary files /dev/null and b/public/assests/Lighting/71caZJGQnJL._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/71tNpFOCa5L._AC_UL640_FMwebp_QL65_.webp b/public/assests/Lighting/71tNpFOCa5L._AC_UL640_FMwebp_QL65_.webp new file mode 100644 index 0000000..5097ac4 Binary files /dev/null and b/public/assests/Lighting/71tNpFOCa5L._AC_UL640_FMwebp_QL65_.webp differ diff --git a/public/assests/Lighting/81fj+LUXbNL._AC_UL480_FMwebp_QL65_.webp b/public/assests/Lighting/81fj+LUXbNL._AC_UL480_FMwebp_QL65_.webp new file mode 100644 index 0000000..11b2073 Binary files /dev/null and b/public/assests/Lighting/81fj+LUXbNL._AC_UL480_FMwebp_QL65_.webp differ diff --git a/public/assests/Living Room/610biGbcawL._AC_UL165_SR165,165_.jpg b/public/assests/Living Room/610biGbcawL._AC_UL165_SR165,165_.jpg new file mode 100644 index 0000000..ec435ff Binary files /dev/null and b/public/assests/Living Room/610biGbcawL._AC_UL165_SR165,165_.jpg differ diff --git a/public/assests/Living Room/71ImIbUKkIL._SX522_.jpg b/public/assests/Living Room/71ImIbUKkIL._SX522_.jpg new file mode 100644 index 0000000..2c1343c Binary files /dev/null and b/public/assests/Living Room/71ImIbUKkIL._SX522_.jpg differ diff --git a/public/assests/Living Room/8139T8YbdkL._SX522_.jpg b/public/assests/Living Room/8139T8YbdkL._SX522_.jpg new file mode 100644 index 0000000..1005a34 Binary files /dev/null and b/public/assests/Living Room/8139T8YbdkL._SX522_.jpg differ diff --git a/public/assests/Living Room/813Kzy7rfqL._SX522_.jpg b/public/assests/Living Room/813Kzy7rfqL._SX522_.jpg new file mode 100644 index 0000000..743715f Binary files /dev/null and b/public/assests/Living Room/813Kzy7rfqL._SX522_.jpg differ diff --git a/public/assests/Living Room/815eXSPF+4L._SX522_.jpg b/public/assests/Living Room/815eXSPF+4L._SX522_.jpg new file mode 100644 index 0000000..84afb6a Binary files /dev/null and b/public/assests/Living Room/815eXSPF+4L._SX522_.jpg differ diff --git a/public/assests/Living Room/81iVpyo5dWL._SX425_.jpg b/public/assests/Living Room/81iVpyo5dWL._SX425_.jpg new file mode 100644 index 0000000..e08c023 Binary files /dev/null and b/public/assests/Living Room/81iVpyo5dWL._SX425_.jpg differ diff --git a/public/assests/Living Room/81qpvdKwOqL._AC_UF480,480_SR480,480_.jpg b/public/assests/Living Room/81qpvdKwOqL._AC_UF480,480_SR480,480_.jpg new file mode 100644 index 0000000..64f9bf0 Binary files /dev/null and b/public/assests/Living Room/81qpvdKwOqL._AC_UF480,480_SR480,480_.jpg differ diff --git a/public/assests/apothecary/41NVNN9-2kL._AC_UL165_SR165,165_.jpg b/public/assests/apothecary/41NVNN9-2kL._AC_UL165_SR165,165_.jpg new file mode 100644 index 0000000..aca09c1 Binary files /dev/null and b/public/assests/apothecary/41NVNN9-2kL._AC_UL165_SR165,165_.jpg differ diff --git a/public/assests/apothecary/41QVaQJJmhL._SY300_SX300_QL70_FMwebp_.webp b/public/assests/apothecary/41QVaQJJmhL._SY300_SX300_QL70_FMwebp_.webp new file mode 100644 index 0000000..0401ba8 Binary files /dev/null and b/public/assests/apothecary/41QVaQJJmhL._SY300_SX300_QL70_FMwebp_.webp differ diff --git a/public/assests/apothecary/51FVHjwvJTL._SX522_.jpg b/public/assests/apothecary/51FVHjwvJTL._SX522_.jpg new file mode 100644 index 0000000..d85235c Binary files /dev/null and b/public/assests/apothecary/51FVHjwvJTL._SX522_.jpg differ diff --git a/public/assests/apothecary/51wtkdDB2IL._SX425_.jpg b/public/assests/apothecary/51wtkdDB2IL._SX425_.jpg new file mode 100644 index 0000000..6dc6e58 Binary files /dev/null and b/public/assests/apothecary/51wtkdDB2IL._SX425_.jpg differ diff --git a/public/assests/apothecary/6155rdrl30L._AC_UL165_SR165,165_.jpg b/public/assests/apothecary/6155rdrl30L._AC_UL165_SR165,165_.jpg new file mode 100644 index 0000000..044fafc Binary files /dev/null and b/public/assests/apothecary/6155rdrl30L._AC_UL165_SR165,165_.jpg differ diff --git a/public/assests/apothecary/61ny25CJwFL._SX522_.jpg b/public/assests/apothecary/61ny25CJwFL._SX522_.jpg new file mode 100644 index 0000000..f732cfb Binary files /dev/null and b/public/assests/apothecary/61ny25CJwFL._SX522_.jpg differ diff --git a/public/assests/apothecary/71CuV+Vse2L._AC_UF480,480_SR480,480_.jpg b/public/assests/apothecary/71CuV+Vse2L._AC_UF480,480_SR480,480_.jpg new file mode 100644 index 0000000..f9a750c Binary files /dev/null and b/public/assests/apothecary/71CuV+Vse2L._AC_UF480,480_SR480,480_.jpg differ diff --git a/public/assests/kitchen Items/51DS8h5RqhL._SX466_.jpg b/public/assests/kitchen Items/51DS8h5RqhL._SX466_.jpg new file mode 100644 index 0000000..d5dac4a Binary files /dev/null and b/public/assests/kitchen Items/51DS8h5RqhL._SX466_.jpg differ diff --git a/public/assests/kitchen Items/51HJLohsGjL._AC_UL165_SR165,165_.jpg b/public/assests/kitchen Items/51HJLohsGjL._AC_UL165_SR165,165_.jpg new file mode 100644 index 0000000..aefe3be Binary files /dev/null and b/public/assests/kitchen Items/51HJLohsGjL._AC_UL165_SR165,165_.jpg differ diff --git a/public/assests/kitchen Items/61i-G4VG+CL._AC_UL165_SR165,165_.jpg b/public/assests/kitchen Items/61i-G4VG+CL._AC_UL165_SR165,165_.jpg new file mode 100644 index 0000000..cd9fabe Binary files /dev/null and b/public/assests/kitchen Items/61i-G4VG+CL._AC_UL165_SR165,165_.jpg differ diff --git a/public/assests/kitchen Items/71nMDPj0-IL._SX569_.jpg b/public/assests/kitchen Items/71nMDPj0-IL._SX569_.jpg new file mode 100644 index 0000000..802e099 Binary files /dev/null and b/public/assests/kitchen Items/71nMDPj0-IL._SX569_.jpg differ diff --git a/public/assests/kitchen Items/811Buo9VfOL._AC_UF480,480_SR480,480_.jpg b/public/assests/kitchen Items/811Buo9VfOL._AC_UF480,480_SR480,480_.jpg new file mode 100644 index 0000000..3bc4f49 Binary files /dev/null and b/public/assests/kitchen Items/811Buo9VfOL._AC_UF480,480_SR480,480_.jpg differ diff --git a/public/assests/kitchen Items/81XRG861m5L._AC_UL165_SR165,165_.jpg b/public/assests/kitchen Items/81XRG861m5L._AC_UL165_SR165,165_.jpg new file mode 100644 index 0000000..9624edb Binary files /dev/null and b/public/assests/kitchen Items/81XRG861m5L._AC_UL165_SR165,165_.jpg differ diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 3cd3bb2..6d99f3e 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -1,6 +1,9 @@ "use client"; import React, { useState, useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { useAuthStore } from "@/store/authStore"; +import { useOrderStore } from "@/store/orderStore"; import { Navbar } from "@/components/Navbar"; import { Footer } from "@/components/Footer"; import { PetalBadge } from "@/components/PetalBadge"; @@ -33,12 +36,36 @@ import { import { motion, AnimatePresence } from "framer-motion"; export default function AdminDashboardPage() { + const router = useRouter(); const { addToast } = useUIStore(); + const { user } = useAuthStore(); + + // Protect Route: Admin role required + useEffect(() => { + if (!user) { + addToast("Administrator session required.", "error"); + router.push("/login/admin"); + } else if (user.role !== "admin") { + addToast("Access denied. Customer account is unauthorized.", "error"); + router.push("/"); + } + }, [user, router]); const [activeTab, setActiveTab] = useState<"analytics" | "orders" | "products" | "coupons">("analytics"); + // Sync with notification query parameters + useEffect(() => { + if (typeof window !== "undefined") { + const params = new URLSearchParams(window.location.search); + const tabParam = params.get("tab"); + if (tabParam && ["analytics", "orders", "products", "coupons"].includes(tabParam)) { + setActiveTab(tabParam as any); + } + } + }, []); + // Dynamic lists from mock DB - const [orders, setOrders] = useState([]); + const { orders, setOrders } = useOrderStore(); const [products, setProducts] = useState([]); const [coupons, setCoupons] = useState([]); @@ -84,8 +111,7 @@ export default function AdminDashboardPage() { const handleUpdateStatus = async (orderId: string, newStatus: string) => { try { - const updated = await updateOrderStatus(orderId, newStatus); - setOrders((prev) => prev.map((o) => (o.id === orderId ? { ...o, status: updated.status } : o))); + await updateOrderStatus(orderId, newStatus); addToast(`Order #${orderId} marked as ${newStatus}.`, "success"); } catch (err) { addToast("Failed to update status.", "error"); @@ -168,7 +194,7 @@ export default function AdminDashboardPage() {
Total Revenue -

${totalRevenue.toFixed(2)}

+

Rs {totalRevenue.toFixed(2)}

@@ -190,7 +216,7 @@ export default function AdminDashboardPage() {
Average Order -

${aov.toFixed(2)}

+

Rs {aov.toFixed(2)}

@@ -380,7 +406,7 @@ export default function AdminDashboardPage() { Payment Sum

- ${ord.total.toFixed(2)} via {ord.paymentMethod} + Rs {ord.total.toFixed(2)} via {ord.paymentMethod}

@@ -481,7 +507,7 @@ export default function AdminDashboardPage() { {categoryLabel} - ${p.price} + Rs {p.price} 5 ? "text-petal-sage" : "text-petal-rose font-bold"}> {p.stock} units @@ -564,7 +590,7 @@ export default function AdminDashboardPage() { className="w-full bg-stone-50 border border-petal-border rounded-input px-3 py-2.5 text-xs text-petal-text-primary focus:outline-none" > - +
@@ -592,7 +618,7 @@ export default function AdminDashboardPage() { {c.code}
- {c.type === "PERCENT" ? `${c.value}% reduction` : `$${c.value} direct credit`} + {c.type === "PERCENT" ? `${c.value}% reduction` : `Rs ${c.value} direct credit`}
@@ -675,7 +701,7 @@ export default function AdminDashboardPage() {
{ + if (!user) { + addToast("Please log in as a customer to checkout items.", "error"); + router.push("/login"); + } else if (user.role === "admin") { + addToast("Administrators cannot checkout store items.", "error"); + router.push("/admin"); + } + }, [user, router]); const [currentStep, setCurrentStep] = useState(0); // 0 = Address, 1 = Payment, 2 = Review, 3 = Success const [placedOrderId, setPlacedOrderId] = useState(""); @@ -126,7 +139,7 @@ export default function CheckoutPage() { })); const newOrder = await createOrder({ - userId: "mock-user-1", + userId: user ? user.uid : "mock-user-1", items: dbItems, total: total, address: `${activeAddress.name}, ${activeAddress.street}, ${activeAddress.city}, ${activeAddress.postalCode}, ${activeAddress.country}`, @@ -134,6 +147,12 @@ export default function CheckoutPage() { paymentMethod: paymentMethod.toUpperCase(), }); + // Dispatch admin notification + addNotification( + newOrder.id, + `New order ${newOrder.id} placed by ${user?.name || "Customer"} (${user?.email || "anonymous"}) for Rs ${total.toFixed(2)}.` + ); + setPlacedOrderId(newOrder.id); addToast("Order placed successfully!", "success"); clearCart(); @@ -624,7 +643,7 @@ export default function CheckoutPage() {
- ${(item.price * item.quantity).toFixed(2)} + Rs {(item.price * item.quantity).toFixed(2)}
Qty: {item.quantity} @@ -762,23 +781,23 @@ export default function CheckoutPage() {
Subtotal ({items.reduce((sum, item) => sum + item.quantity, 0)} items) - ${subtotal.toFixed(2)} + Rs {subtotal.toFixed(2)}
{discount > 0 && (
Active Coupon Discount - −${discount.toFixed(2)} + −Rs {discount.toFixed(2)}
)}
Standard Shipping - {delivery === 0 ? "Free" : `$${delivery.toFixed(2)}`} + {delivery === 0 ? "Free" : `Rs ${delivery.toFixed(2)}`}
Total - ${total.toFixed(2)} + Rs {total.toFixed(2)}
diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index e3d742c..c4da2df 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -11,6 +11,8 @@ import { useUIStore } from "@/store/uiStore"; import { getOrders, getFeaturedProducts, MockOrder, MockProduct } from "@/lib/db"; import { User, ShoppingBag, Heart, MapPin, Wallet, ArrowRight, Plus, Trash2, ShieldCheck } from "lucide-react"; import { motion, AnimatePresence } from "framer-motion"; +import { useAuthStore } from "@/store/authStore"; +import { useOrderStore } from "@/store/orderStore"; function UserDashboardContent() { const router = useRouter(); @@ -18,13 +20,25 @@ function UserDashboardContent() { const { addToast } = useUIStore(); const { productIds, toggleWishlist } = useWishlistStore(); const { addItem } = useCartStore(); + const { user } = useAuthStore(); + + // Protect Route: Customer role required + useEffect(() => { + if (!user) { + addToast("Please log in to view your dashboard.", "error"); + router.push("/login"); + } else if (user.role === "admin") { + addToast("Administrators cannot access the customer dashboard.", "error"); + router.push("/admin"); + } + }, [user, router]); const activeTab = searchParams.get("tab") || "profile"; - // State - const [orders, setOrders] = useState([]); + // State (using reactive order store) + const { orders, setOrders } = useOrderStore(); const [wishlistItems, setWishlistItems] = useState([]); - const [walletBalance, setWalletBalance] = useState(150.0); + const [walletBalance, setWalletBalance] = useState(15000.0); const [addFundsAmount, setAddFundsAmount] = useState(""); const [userProfile, setUserProfile] = useState({ name: "Ankit K.", @@ -34,11 +48,22 @@ function UserDashboardContent() { joined: "May 2026", }); + // Sync profile state with logged-in user + useEffect(() => { + if (user) { + setUserProfile((prev) => ({ + ...prev, + name: user.name, + email: user.email, + })); + } + }, [user]); + // Fetch orders & wishlist items useEffect(() => { async function loadDashboardData() { - // Load orders - const ords = await getOrders("mock-user-1"); + // Load orders from database fallback + const ords = await getOrders(user?.uid || "mock-user-1"); setOrders(ords); // Load wishlist items @@ -58,7 +83,7 @@ function UserDashboardContent() { const amt = parseFloat(addFundsAmount); if (!isNaN(amt) && amt > 0) { setWalletBalance((prev) => prev + amt); - addFundsAmount && addToast(`Added $${amt.toFixed(2)} to your wallet.`, "success"); + addFundsAmount && addToast(`Added Rs ${amt.toFixed(2)} to your wallet.`, "success"); setAddFundsAmount(""); } }; @@ -106,7 +131,7 @@ function UserDashboardContent() { Wallet Balance
- ${walletBalance.toFixed(2)} + Rs {walletBalance.toFixed(2)}
@@ -222,52 +247,56 @@ function UserDashboardContent() {

- {orders.length > 0 ? ( -
- {orders.map((ord) => { - // Badge color maps - let badgeType: "rose" | "lavender" | "sky" | "sage" | "neutral" = "lavender"; - if (ord.status === "DELIVERED") badgeType = "sage"; - if (ord.status === "SHIPPED") badgeType = "sky"; - if (ord.status === "CANCELLED") badgeType = "rose"; + {/* Filter orders dynamically to display only this customer's orders */} + {(() => { + const myOrders = orders.filter((o) => o.userId === (user?.uid || "mock-user-1")); + return myOrders.length > 0 ? ( +
+ {myOrders.map((ord) => { + // Badge color maps + let badgeType: "rose" | "lavender" | "sky" | "sage" | "neutral" = "lavender"; + if (ord.status === "DELIVERED") badgeType = "sage"; + if (ord.status === "SHIPPED") badgeType = "sky"; + if (ord.status === "CANCELLED") badgeType = "rose"; - return ( -
-
-
- - Order #{ord.id} - - + return ( +
+
+
+ + Order #{ord.id} + + +
+

+ Destination: {ord.address}
+ Date: {new Date(ord.createdAt).toLocaleDateString()} +

-

- Destination: {ord.address}
- Date: {new Date(ord.createdAt).toLocaleDateString()} -

-
-
-
- Total paid: ${ord.total.toFixed(2)} +
+
+ Total paid: Rs {ord.total.toFixed(2)} +
+ + Paid via {ord.paymentMethod} +
- - Paid via {ord.paymentMethod} -
-
- ); - })} -
- ) : ( -
-

- You have not placed any orders yet. -

-
- )} + ); + })} +
+ ) : ( +
+

+ You have not placed any orders yet. +

+
+ ); + })()} )} @@ -316,7 +345,7 @@ function UserDashboardContent() {
- ${item.price.toFixed(2)} + Rs {item.price.toFixed(2)} +
+
+ + + + + {/* Back switch */} +
+ + Returning Customer?{" "} + + +
+ +
+
+ + +