diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
index 74fa192..7b7e6ef 100644
--- a/node_modules/.package-lock.json
+++ b/node_modules/.package-lock.json
@@ -1107,7 +1107,6 @@
"resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
"integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
"license": "MIT",
- "peer": true,
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
@@ -1752,8 +1751,7 @@
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/lodash.includes": {
"version": "4.3.0",
diff --git a/package-lock.json b/package-lock.json
index f77b8ac..f3cfc65 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,6 @@
"dependencies": {
"axios": "^1.6.2",
"bcryptjs": "^2.4.3",
- "cloudinary": "^1.41.0",
"cors": "^2.8.5",
"dotenv": "^16.3.1",
"express": "^4.18.2",
@@ -18,24 +17,32 @@
"express-rate-limit": "^7.1.5",
"express-validator": "^7.0.1",
"helmet": "^7.2.0",
+ "i18next": "^23.7.6",
"joi": "^17.9.2",
"jsonwebtoken": "^9.0.2",
+ "moment-timezone": "^0.5.43",
"mongoose": "^7.8.8",
"multer": "^1.4.4",
"node-cron": "^3.0.3",
+ "node-fetch": "^3.3.2",
"nodemailer": "^6.10.1",
- "pdfkit": "^0.17.2",
- "sharp": "^0.32.6",
+ "simple-statistics": "^7.8.3",
"socket.io": "^4.8.3",
- "tesseract.js": "^4.1.4",
- "twilio": "^4.19.0",
- "web-push": "^3.6.7",
"xss": "^1.0.14"
},
"devDependencies": {
"nodemon": "^3.0.1"
}
},
+ "node_modules/@babel/runtime": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -52,9 +59,9 @@
}
},
"node_modules/@mongodb-js/saslprep": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.4.tgz",
- "integrity": "sha512-p7X/ytJDIdwUfFL/CLOhKgdfJe1Fa8uw9seJYvdOmnP9JBWGWHW69HkOixXS6Wy9yvGf1MbhcS6lVmrhy4jm2g==",
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.5.tgz",
+ "integrity": "sha512-k64Lbyb7ycCSXHSLzxVdb2xsKGPMvYZfCICXvDsI8Z65CeWQzTEKS4YmGbnqw+U9RBvLPTsB6UCmwkgsDTGWIw==",
"license": "MIT",
"optional": true,
"dependencies": {
@@ -88,15 +95,6 @@
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
"license": "MIT"
},
- "node_modules/@swc/helpers": {
- "version": "0.5.18",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz",
- "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.8.0"
- }
- },
"node_modules/@types/cors": {
"version": "2.8.19",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
@@ -107,9 +105,9 @@
}
},
"node_modules/@types/node": {
- "version": "25.0.9",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz",
- "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==",
+ "version": "25.0.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz",
+ "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.16.0"
@@ -144,41 +142,6 @@
"node": ">= 0.6"
}
},
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/agent-base/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/agent-base/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -205,18 +168,6 @@
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"license": "MIT"
},
- "node_modules/asn1.js": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
- "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
- "license": "MIT",
- "dependencies": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- }
- },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -234,20 +185,6 @@
"proxy-from-env": "^1.1.0"
}
},
- "node_modules/b4a": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
- "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "react-native-b4a": "*"
- },
- "peerDependenciesMeta": {
- "react-native-b4a": {
- "optional": true
- }
- }
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -255,117 +192,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/bare-events": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
- "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "bare-abort-controller": "*"
- },
- "peerDependenciesMeta": {
- "bare-abort-controller": {
- "optional": true
- }
- }
- },
- "node_modules/bare-fs": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz",
- "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "bare-events": "^2.5.4",
- "bare-path": "^3.0.0",
- "bare-stream": "^2.6.4",
- "bare-url": "^2.2.2",
- "fast-fifo": "^1.3.2"
- },
- "engines": {
- "bare": ">=1.16.0"
- },
- "peerDependencies": {
- "bare-buffer": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- }
- }
- },
- "node_modules/bare-os": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
- "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
- "license": "Apache-2.0",
- "optional": true,
- "engines": {
- "bare": ">=1.14.0"
- }
- },
- "node_modules/bare-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
- "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "bare-os": "^3.0.1"
- }
- },
- "node_modules/bare-stream": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
- "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "streamx": "^2.21.0"
- },
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-events": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
- "bare-events": {
- "optional": true
- }
- }
- },
- "node_modules/bare-url": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz",
- "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "bare-path": "^3.0.0"
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "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/base64id": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
@@ -394,52 +220,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "license": "MIT",
- "dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "node_modules/bl/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/bl/node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/bmp-js": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
- "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
- "license": "MIT"
- },
- "node_modules/bn.js": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
- "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
- "license": "MIT"
- },
"node_modules/body-parser": {
"version": "1.20.4",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
@@ -488,15 +268,6 @@
"node": ">=8"
}
},
- "node_modules/brotli": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
- "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.1.2"
- }
- },
"node_modules/bson": {
"version": "5.5.1",
"resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz",
@@ -506,30 +277,6 @@
"node": ">=14.20.1"
}
},
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "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",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
@@ -617,86 +364,6 @@
"fsevents": "~2.3.2"
}
},
- "node_modules/chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "license": "ISC"
- },
- "node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/cloudinary": {
- "version": "1.41.3",
- "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.41.3.tgz",
- "integrity": "sha512-4o84y+E7dbif3lMns+p3UW6w6hLHEifbX/7zBJvaih1E9QNMZITENQ14GPYJC4JmhygYXsuuBb9bRA3xWEoOfg==",
- "license": "MIT",
- "dependencies": {
- "cloudinary-core": "^2.13.0",
- "core-js": "^3.30.1",
- "lodash": "^4.17.21",
- "q": "^1.5.1"
- },
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/cloudinary-core": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.14.0.tgz",
- "integrity": "sha512-L+kjoYgU+5wyiPkSnmeCbmtT6DwSyYUN/WoI/fEb6Xsx2gtB3iuf/50W0SvcQkeKzllfH5Knh8I4ST924DkkRw==",
- "license": "MIT",
- "peerDependencies": {
- "lodash": ">=4.0"
- }
- },
- "node_modules/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
- "engines": {
- "node": ">=12.5.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "license": "MIT"
- },
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -809,17 +476,6 @@
"integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
"license": "MIT"
},
- "node_modules/core-js": {
- "version": "3.47.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz",
- "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==",
- "hasInstallScript": true,
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -827,9 +483,9 @@
"license": "MIT"
},
"node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
"license": "MIT",
"dependencies": {
"object-assign": "^4",
@@ -837,25 +493,26 @@
},
"engines": {
"node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/crypto-js": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
- "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
- "license": "MIT"
- },
"node_modules/cssfilter": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
"integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==",
"license": "MIT"
},
- "node_modules/dayjs": {
- "version": "1.11.19",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
- "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
- "license": "MIT"
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
},
"node_modules/debug": {
"version": "2.6.9",
@@ -866,30 +523,6 @@
"ms": "2.0.0"
}
},
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "license": "MIT",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -918,21 +551,6 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dfa": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
- "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==",
- "license": "MIT"
- },
"node_modules/dicer": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
@@ -995,15 +613,6 @@
"node": ">= 0.8"
}
},
- "node_modules/end-of-stream": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
- "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
- "license": "MIT",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
"node_modules/engine.io": {
"version": "6.6.5",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz",
@@ -1116,30 +725,11 @@
"node": ">= 0.6"
}
},
- "node_modules/events-universal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
- "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-events": "^2.7.0"
- }
- },
- "node_modules/expand-template": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
- "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
- "license": "(MIT OR WTFPL)",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/express": {
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
"integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
"license": "MIT",
- "peer": true,
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
@@ -1218,17 +808,28 @@
"node": ">= 8.0.0"
}
},
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "license": "MIT"
- },
- "node_modules/fast-fifo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
- "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "license": "MIT"
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
},
"node_modules/fill-range": {
"version": "7.1.1",
@@ -1281,23 +882,6 @@
}
}
},
- "node_modules/fontkit": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz",
- "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==",
- "license": "MIT",
- "dependencies": {
- "@swc/helpers": "^0.5.12",
- "brotli": "^1.3.2",
- "clone": "^2.1.2",
- "dfa": "^1.2.0",
- "fast-deep-equal": "^3.1.3",
- "restructure": "^3.0.0",
- "tiny-inflate": "^1.0.3",
- "unicode-properties": "^1.4.0",
- "unicode-trie": "^2.0.0"
- }
- },
"node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
@@ -1314,6 +898,18 @@
"node": ">= 6"
}
},
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -1332,12 +928,6 @@
"node": ">= 0.6"
}
},
- "node_modules/fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "license": "MIT"
- },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1399,12 +989,6 @@
"node": ">= 0.4"
}
},
- "node_modules/github-from-package": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
- "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
- "license": "MIT"
- },
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -1488,15 +1072,6 @@
"node": ">=16.0.0"
}
},
- "node_modules/http_ece": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http_ece/-/http_ece-1.2.0.tgz",
- "integrity": "sha512-JrF8SSLVmcvc5NducxgyOrKXe3EsyHMgBFgSaIUGmArKe+rwr0uphRkRXvwiom3I+fpIfoItveHrfudL8/rxuA==",
- "license": "MIT",
- "engines": {
- "node": ">=16"
- }
- },
"node_modules/http-errors": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
@@ -1517,42 +1092,29 @@
"url": "https://opencollective.com/express"
}
},
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "node_modules/i18next": {
+ "version": "23.16.8",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz",
+ "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
+ "@babel/runtime": "^7.23.2"
}
},
- "node_modules/https-proxy-agent/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/https-proxy-agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -1565,32 +1127,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/idb-keyval": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz",
- "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==",
- "license": "Apache-2.0"
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "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": "BSD-3-Clause"
- },
"node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
@@ -1604,12 +1140,6 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "license": "ISC"
- },
"node_modules/ip-address": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
@@ -1628,12 +1158,6 @@
"node": ">= 0.10"
}
},
- "node_modules/is-arrayish": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
- "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
- "license": "MIT"
- },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -1647,12 +1171,6 @@
"node": ">=8"
}
},
- "node_modules/is-electron": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz",
- "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==",
- "license": "MIT"
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -1686,12 +1204,6 @@
"node": ">=0.12.0"
}
},
- "node_modules/is-url": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
- "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
- "license": "MIT"
- },
"node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
@@ -1711,13 +1223,6 @@
"@sideway/pinpoint": "^2.0.0"
}
},
- "node_modules/jpeg-exif": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
- "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "license": "MIT"
- },
"node_modules/jsonwebtoken": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
@@ -1776,31 +1281,11 @@
"node": ">=12.0.0"
}
},
- "node_modules/linebreak": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
- "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
- "license": "MIT",
- "dependencies": {
- "base64-js": "0.0.8",
- "unicode-trie": "^2.0.0"
- }
- },
- "node_modules/linebreak/node_modules/base64-js": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
- "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "license": "MIT",
- "peer": true
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "license": "MIT"
},
"node_modules/lodash.includes": {
"version": "4.3.0",
@@ -1920,24 +1405,6 @@
"node": ">= 0.6"
}
},
- "node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "license": "ISC"
- },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -1972,11 +1439,26 @@
"mkdirp": "bin/cmd.js"
}
},
- "node_modules/mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
- "license": "MIT"
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.48",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",
+ "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
},
"node_modules/mongodb": {
"version": "5.9.2",
@@ -2127,12 +1609,6 @@
"node": ">= 0.10.0"
}
},
- "node_modules/napi-build-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
- "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
- "license": "MIT"
- },
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -2142,24 +1618,6 @@
"node": ">= 0.6"
}
},
- "node_modules/node-abi": {
- "version": "3.86.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.86.0.tgz",
- "integrity": "sha512-sn9Et4N3ynsetj3spsZR729DVlGH6iBG4RiDMV7HEp3guyOW6W3S0unGpLDxT50mXortGUMax/ykUNQXdqc/Xg==",
- "license": "MIT",
- "dependencies": {
- "semver": "^7.3.5"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-addon-api": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
- "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
- "license": "MIT"
- },
"node_modules/node-cron": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz",
@@ -2169,49 +1627,45 @@
"uuid": "8.3.2"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.5.0"
}
},
"node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
"license": "MIT",
"dependencies": {
- "whatwg-url": "^5.0.0"
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
},
"engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-fetch/node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "license": "MIT"
- },
- "node_modules/node-fetch/node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "license": "BSD-2-Clause"
- },
- "node_modules/node-fetch/node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "license": "MIT",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
}
},
"node_modules/nodemailer": {
@@ -2320,30 +1774,6 @@
"node": ">= 0.8"
}
},
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/opencollective-postinstall": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
- "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
- "license": "MIT",
- "bin": {
- "opencollective-postinstall": "index.js"
- }
- },
- "node_modules/pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
- "license": "MIT"
- },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -2359,19 +1789,6 @@
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"license": "MIT"
},
- "node_modules/pdfkit": {
- "version": "0.17.2",
- "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.17.2.tgz",
- "integrity": "sha512-UnwF5fXy08f0dnp4jchFYAROKMNTaPqb/xgR8GtCzIcqoTnbOqtp3bwKvO4688oHI6vzEEs8Q6vqqEnC5IUELw==",
- "license": "MIT",
- "dependencies": {
- "crypto-js": "^4.2.0",
- "fontkit": "^2.0.4",
- "jpeg-exif": "^1.1.4",
- "linebreak": "^1.1.0",
- "png-js": "^1.0.0"
- }
- },
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
@@ -2385,88 +1802,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/png-js": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
- "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
- },
- "node_modules/prebuild-install": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
- "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
- "license": "MIT",
- "dependencies": {
- "detect-libc": "^2.0.0",
- "expand-template": "^2.0.3",
- "github-from-package": "0.0.0",
- "minimist": "^1.2.3",
- "mkdirp-classic": "^0.5.3",
- "napi-build-utils": "^2.0.0",
- "node-abi": "^3.3.0",
- "pump": "^3.0.0",
- "rc": "^1.2.7",
- "simple-get": "^4.0.0",
- "tar-fs": "^2.0.0",
- "tunnel-agent": "^0.6.0"
- },
- "bin": {
- "prebuild-install": "bin.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/prebuild-install/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/prebuild-install/node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/prebuild-install/node_modules/tar-fs": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
- "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
- "license": "MIT",
- "dependencies": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^2.1.4"
- }
- },
- "node_modules/prebuild-install/node_modules/tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
- "license": "MIT",
- "dependencies": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -2499,16 +1834,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/pump": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
- "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
- "license": "MIT",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -2518,17 +1843,6 @@
"node": ">=6"
}
},
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
- "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
- "license": "MIT",
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
"node_modules/qs": {
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
@@ -2544,12 +1858,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "license": "MIT"
- },
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -2574,21 +1882,6 @@
"node": ">= 0.8"
}
},
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
"node_modules/readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
@@ -2614,24 +1907,6 @@
"node": ">=8.10.0"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
- "license": "MIT"
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "license": "MIT"
- },
- "node_modules/restructure": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz",
- "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==",
- "license": "MIT"
- },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -2658,13 +1933,6 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
- "node_modules/scmp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz",
- "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==",
- "deprecated": "Just use Node.js's crypto.timingSafeEqual()",
- "license": "BSD-3-Clause"
- },
"node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
@@ -2728,29 +1996,6 @@
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"license": "ISC"
},
- "node_modules/sharp": {
- "version": "0.32.6",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
- "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "color": "^4.2.3",
- "detect-libc": "^2.0.2",
- "node-addon-api": "^6.1.0",
- "prebuild-install": "^7.1.1",
- "semver": "^7.5.4",
- "simple-get": "^4.0.1",
- "tar-fs": "^3.0.4",
- "tunnel-agent": "^0.6.0"
- },
- "engines": {
- "node": ">=14.15.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
@@ -2829,58 +2074,13 @@
"integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==",
"license": "MIT"
},
- "node_modules/simple-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
- "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/simple-get": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
- "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
- "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",
- "dependencies": {
- "decompress-response": "^6.0.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- }
- },
- "node_modules/simple-swizzle": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
- "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.3.1"
+ "node_modules/simple-statistics": {
+ "version": "7.8.8",
+ "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.8.tgz",
+ "integrity": "sha512-CUtP0+uZbcbsFpqEyvNDYjJCl+612fNgjT8GaVuvMG7tBuJg8gXGpsP5M7X658zy0IcepWOZ6nPBu1Qb9ezA1w==",
+ "license": "ISC",
+ "engines": {
+ "node": "*"
}
},
"node_modules/simple-update-notifier": {
@@ -3057,32 +2257,12 @@
"node": ">=0.8.0"
}
},
- "node_modules/streamx": {
- "version": "2.23.0",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
- "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
- "license": "MIT",
- "dependencies": {
- "events-universal": "^1.0.0",
- "fast-fifo": "^1.3.2",
- "text-decoder": "^1.1.0"
- }
- },
"node_modules/string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
"license": "MIT"
},
- "node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -3096,71 +2276,6 @@
"node": ">=4"
}
},
- "node_modules/tar-fs": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz",
- "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==",
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0",
- "tar-stream": "^3.1.5"
- },
- "optionalDependencies": {
- "bare-fs": "^4.0.1",
- "bare-path": "^3.0.0"
- }
- },
- "node_modules/tar-stream": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
- "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
- "license": "MIT",
- "dependencies": {
- "b4a": "^1.6.4",
- "fast-fifo": "^1.2.0",
- "streamx": "^2.15.0"
- }
- },
- "node_modules/tesseract.js": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/tesseract.js/-/tesseract.js-4.1.4.tgz",
- "integrity": "sha512-iLjJjLWVNV4PApofEsd54Y1MbjhzpPxEzF8EjYmC2CLN4hrUqO5aTNTSbGA7/QjycKtAWHhn2YmDR+6GFwi2Zg==",
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "bmp-js": "^0.1.0",
- "idb-keyval": "^6.2.0",
- "is-electron": "^2.2.2",
- "is-url": "^1.2.4",
- "node-fetch": "^2.6.9",
- "opencollective-postinstall": "^2.0.3",
- "regenerator-runtime": "^0.13.3",
- "tesseract.js-core": "^4.0.4",
- "wasm-feature-detect": "^1.2.11",
- "zlibjs": "^0.3.1"
- }
- },
- "node_modules/tesseract.js-core": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-4.0.4.tgz",
- "integrity": "sha512-MJ+vtktjAaT0681uPl6TDUPhbRbpD/S9emko5rtorgHRZpQo7R3BG7h+3pVHgn1KjfNf1bvnx4B7KxEK8YKqpg==",
- "license": "Apache License 2.0"
- },
- "node_modules/text-decoder": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
- "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
- "license": "Apache-2.0",
- "dependencies": {
- "b4a": "^1.6.4"
- }
- },
- "node_modules/tiny-inflate": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
- "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
- "license": "MIT"
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -3205,43 +2320,6 @@
"node": ">=12"
}
},
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/twilio": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.23.0.tgz",
- "integrity": "sha512-LdNBQfOe0dY2oJH2sAsrxazpgfFQo5yXGxe96QA8UWB5uu+433PrUbkv8gQ5RmrRCqUTPQ0aOrIyAdBr1aB03Q==",
- "license": "MIT",
- "dependencies": {
- "axios": "^1.6.0",
- "dayjs": "^1.11.9",
- "https-proxy-agent": "^5.0.0",
- "jsonwebtoken": "^9.0.0",
- "qs": "^6.9.4",
- "scmp": "^2.1.0",
- "url-parse": "^1.5.9",
- "xmlbuilder": "^13.0.2"
- },
- "engines": {
- "node": ">=14.0"
- }
- },
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -3274,26 +2352,6 @@
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"license": "MIT"
},
- "node_modules/unicode-properties": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
- "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.0",
- "unicode-trie": "^2.0.0"
- }
- },
- "node_modules/unicode-trie": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
- "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
- "license": "MIT",
- "dependencies": {
- "pako": "^0.2.5",
- "tiny-inflate": "^1.0.0"
- }
- },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -3303,16 +2361,6 @@
"node": ">= 0.8"
}
},
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "license": "MIT",
- "dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -3355,76 +2403,15 @@
"node": ">= 0.8"
}
},
- "node_modules/wasm-feature-detect": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz",
- "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==",
- "license": "Apache-2.0"
- },
- "node_modules/web-push": {
- "version": "3.6.7",
- "resolved": "https://registry.npmjs.org/web-push/-/web-push-3.6.7.tgz",
- "integrity": "sha512-OpiIUe8cuGjrj3mMBFWY+e4MMIkW3SVT+7vEIjvD9kejGUypv8GPDf84JdPWskK8zMRIJ6xYGm+Kxr8YkPyA0A==",
- "license": "MPL-2.0",
- "dependencies": {
- "asn1.js": "^5.3.0",
- "http_ece": "1.2.0",
- "https-proxy-agent": "^7.0.0",
- "jws": "^4.0.0",
- "minimist": "^1.2.5"
- },
- "bin": {
- "web-push": "src/cli.js"
- },
- "engines": {
- "node": ">= 16"
- }
- },
- "node_modules/web-push/node_modules/agent-base": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
- "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/web-push/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/web-push/node_modules/https-proxy-agent": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
- "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
"license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
- },
"engines": {
- "node": ">= 14"
+ "node": ">= 8"
}
},
- "node_modules/web-push/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
"node_modules/webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -3447,12 +2434,6 @@
"node": ">=12"
}
},
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "license": "ISC"
- },
"node_modules/ws": {
"version": "8.18.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
@@ -3474,15 +2455,6 @@
}
}
},
- "node_modules/xmlbuilder": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz",
- "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0"
- }
- },
"node_modules/xss": {
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz",
@@ -3507,15 +2479,6 @@
"engines": {
"node": ">=0.4"
}
- },
- "node_modules/zlibjs": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/zlibjs/-/zlibjs-0.3.1.tgz",
- "integrity": "sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==",
- "license": "MIT",
- "engines": {
- "node": "*"
- }
}
}
}
diff --git a/public/expensetracker.css b/public/expensetracker.css
index ea9d9c9..4102f54 100644
--- a/public/expensetracker.css
+++ b/public/expensetracker.css
@@ -51,15 +51,34 @@ body {
html {
scroll-behavior: smooth;
+ scroll-padding-top: 100px;
}
body {
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ font-family:
+ "Inter",
+ -apple-system,
+ BlinkMacSystemFont,
+ "Segoe UI",
+ Roboto,
+ sans-serif;
background: var(--bg-primary);
background-image:
- radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.3) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(255, 107, 157, 0.3) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(100, 255, 218, 0.2) 0%, transparent 50%);
+ radial-gradient(
+ circle at 20% 80%,
+ rgba(120, 119, 198, 0.3) 0%,
+ transparent 50%
+ ),
+ radial-gradient(
+ circle at 80% 20%,
+ rgba(255, 107, 157, 0.3) 0%,
+ transparent 50%
+ ),
+ radial-gradient(
+ circle at 40% 40%,
+ rgba(100, 255, 218, 0.2) 0%,
+ transparent 50%
+ );
min-height: 100vh;
color: var(--text-primary);
line-height: 1.6;
@@ -93,10 +112,16 @@ body {
.nav-logo {
display: flex;
align-items: center;
- gap: 0.5rem;
+ gap: 0.75rem;
font-size: 1.5rem;
font-weight: 700;
- color: var(--accent-primary);
+ color: var(--text-primary);
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.nav-logo:hover {
+ transform: scale(1.05);
}
.nav-logo i {
@@ -105,12 +130,22 @@ body {
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
+ animation: pulse 2s ease-in-out infinite;
+}
+
+.nav-logo span {
+ background: var(--primary-gradient);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
}
.nav-menu {
display: flex;
gap: 2rem;
list-style: none;
+ margin-right: 15px;
+ margin-left: 15px;
}
.nav-link {
@@ -130,3112 +165,6249 @@ body {
}
.user-profile {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+/* Workspace Selector */
+.workspace-selector {
+ position: relative;
+ margin-right: 1rem;
+}
+
+.workspace-current {
display: flex;
align-items: center;
gap: 0.75rem;
+ padding: 0.5rem 1rem;
+ background: rgba(100, 255, 218, 0.1);
+ border: 1px solid rgba(100, 255, 218, 0.3);
+ border-radius: 8px;
+ color: var(--accent-primary);
+ cursor: pointer;
+ transition: all 0.3s ease;
+ min-width: 180px;
}
-.profile-img {
- width: 40px;
- height: 40px;
- border-radius: 50%;
- border: 2px solid var(--accent-primary);
+.workspace-current:hover {
+ background: rgba(100, 255, 218, 0.2);
+ transform: translateY(-2px);
}
-.username {
- font-weight: 500;
- color: var(--text-primary);
+.workspace-avatar {
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: var(--bg-primary);
+ font-weight: bold;
+ font-size: 1.2rem;
}
-.nav-toggle {
- display: none;
+.workspace-info {
+ flex: 1;
+ display: flex;
flex-direction: column;
- cursor: pointer;
}
-.bar {
- width: 25px;
- height: 3px;
- background: var(--accent-primary);
- margin: 3px 0;
- transition: 0.3s;
- border-radius: 5px;
+.workspace-label {
+ font-size: 0.75rem;
+ opacity: 0.8;
}
-/* Main Content */
-.main-content {
- padding-top: 100px;
- min-height: 100vh;
+.workspace-name {
+ font-weight: 500;
+ font-size: 0.9rem;
}
-.hero-section {
- text-align: center;
- padding: 3rem 2rem;
- max-width: 800px;
- margin: 0 auto;
+.dropdown-arrow {
+ transition: transform 0.3s ease;
}
-.hero-title {
- font-size: 3.5rem;
- font-weight: 700;
- background: var(--primary-gradient);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- margin-bottom: 1rem;
- animation: fadeInUp 1s ease-out;
+.workspace-dropdown {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ background: var(--bg-secondary);
+ border: 1px solid var(--border-color);
+ border-radius: 8px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
+ z-index: 1000;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(-10px);
+ transition: all 0.3s ease;
+ margin-top: 0.5rem;
}
-.hero-subtitle {
- font-size: 1.2rem;
- color: var(--text-secondary);
- margin-bottom: 2rem;
- animation: fadeInUp 1s ease-out 0.2s both;
+.workspace-dropdown.active {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
}
-.container {
- width: 100%;
- max-width: 1100px;
- margin: 0 auto;
+.workspace-item {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 0.75rem 1rem;
+ cursor: pointer;
+ transition: background 0.2s ease;
+ border-bottom: 1px solid var(--border-color);
}
-/* Balance Card */
-.balance-card {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(20px);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- padding: 2rem;
- text-align: center;
- box-shadow: var(--shadow-glass);
- transition: transform 0.3s ease, box-shadow 0.3s ease;
- animation: fadeInUp 1s ease-out 0.4s both;
- width: 100%;
- max-width: 32rem;
- margin: 0 auto;
+.workspace-item:hover,
+.workspace-item.active {
+ background: rgba(100, 255, 218, 0.1);
}
-.balance-card:hover {
- transform: translateY(-5px);
- box-shadow: var(--shadow-hover);
+.workspace-item:last-child {
+ border-bottom: none;
}
-.balance-header {
+.workspace-avatar-sm {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
display: flex;
align-items: center;
justify-content: center;
- gap: 0.5rem;
- margin-bottom: 1rem;
+ color: var(--bg-primary);
+ font-weight: bold;
+ font-size: 0.8rem;
}
-.balance-header i {
- color: var(--accent-primary);
- font-size: 1.5rem;
+.owner-badge {
+ margin-left: auto;
+ background: var(--accent-primary);
+ color: var(--bg-primary);
+ padding: 0.2rem 0.5rem;
+ border-radius: 12px;
+ font-size: 0.7rem;
+ font-weight: 500;
}
-.balance-header h4 {
- color: var(--text-secondary);
+.workspace-divider {
+ padding: 0.5rem 1rem;
+ background: var(--bg-tertiary);
+ border-bottom: 1px solid var(--border-color);
+ font-size: 0.8rem;
font-weight: 500;
+ color: var(--text-secondary);
text-transform: uppercase;
- letter-spacing: 1px;
- font-size: 0.9rem;
+ letter-spacing: 0.5px;
}
-.balance-amount {
- font-size: 3rem;
- font-weight: 700;
- color: var(--text-primary);
- margin: 1rem 0;
- text-shadow: 0 0 20px rgba(100, 255, 218, 0.3);
+.workspace-footer {
+ padding: 0.5rem;
+ border-top: 1px solid var(--border-color);
}
-.balance-trend {
+.add-workspace-btn {
+ width: 100%;
+ padding: 0.75rem 1rem;
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
+ color: var(--bg-primary);
+ border: none;
+ border-radius: 6px;
+ cursor: pointer;
+ font-weight: 500;
+ transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
}
-.trend-indicator {
- font-size: 1.5rem;
- font-weight: bold;
+.add-workspace-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(100, 255, 218, 0.3);
}
-.trend-indicator.positive {
- color: var(--success);
+.currency-btn {
+ padding: 0.5rem 1rem;
+ background: rgba(100, 255, 218, 0.1);
+ border: 1px solid rgba(100, 255, 218, 0.3);
+ border-radius: 8px;
+ color: var(--accent-primary);
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-weight: 500;
}
-.trend-text {
- color: var(--text-secondary);
- font-size: 0.9rem;
+.currency-btn:hover {
+ background: rgba(100, 255, 218, 0.2);
+ transform: translateY(-2px);
}
-/* Dashboard Grid (Mobile First) */
-.dashboard-grid {
- display: grid;
- grid-template-columns: 1fr;
- gap: 1.5rem;
- width: 100%;
- margin-bottom: 2rem;
+.currency-btn i {
+ font-size: 1rem;
}
-/* Desktop View */
-@media (min-width: 768px) {
- .dashboard-grid {
- grid-template-columns: repeat(3, 1fr);
- }
+.profile-img {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ border: 2px solid var(--accent-primary);
}
-.income-card,
-.expense-card {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(20px);
- border-radius: 15px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- padding: 1.5rem;
- display: flex;
- align-items: center;
- gap: 1rem;
- box-shadow: var(--shadow-glass);
- transition: all 0.3s ease;
- width: 100%;
- max-width: 24rem;
- margin: 0 auto;
+.username {
+ font-weight: 500;
+ color: var(--text-primary);
}
-.income-card:hover,
-.expense-card:hover {
- transform: translateY(-3px);
- box-shadow: var(--shadow-hover);
+.nav-toggle {
+ display: none;
+ flex-direction: column;
+ cursor: pointer;
}
-.card-icon {
- width: 60px;
- height: 60px;
- border-radius: 15px;
+.bar {
+ width: 25px;
+ height: 3px;
+ background: var(--accent-primary);
+ margin: 3px 0;
+ transition: 0.3s;
+ border-radius: 5px;
+}
+
+/* Main Content */
+.main-content {
+ padding-top: 100px;
+ min-height: 100vh;
+}
+
+/* Full Hero Section */
+.hero-section-full {
+ min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
- font-size: 1.5rem;
- color: white;
+ text-align: center;
+ position: relative;
+ padding: 8rem 2rem 4rem;
+ overflow: hidden;
}
-.income-icon {
- background: var(--success-gradient);
+.hero-background-animation {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ pointer-events: none;
+ z-index: 0;
}
-.expense-icon {
- background: var(--warning-gradient);
+.floating-shape {
+ position: absolute;
+ border-radius: 50%;
+ filter: blur(60px);
+ opacity: 0.3;
+ animation: float 20s ease-in-out infinite;
+}
+
+.shape-1 {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ top: 10%;
+ left: 10%;
+ animation-delay: 0s;
+}
+
+.shape-2 {
+ width: 400px;
+ height: 400px;
+ background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
+ top: 60%;
+ right: 10%;
+ animation-delay: 7s;
+}
+
+.shape-3 {
+ width: 250px;
+ height: 250px;
+ background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
+ bottom: 20%;
+ left: 50%;
+ animation-delay: 14s;
}
-.card-content h4 {
- color: var(--text-secondary);
- font-size: 0.9rem;
- font-weight: 500;
- text-transform: uppercase;
- letter-spacing: 1px;
- margin-bottom: 0.5rem;
-}
+@keyframes float {
+ 0%,
+ 100% {
+ transform: translate(0, 0) scale(1);
+ }
-.money-plus {
- color: var(--success);
- font-size: 1.5rem;
- font-weight: 600;
-}
+ 25% {
+ transform: translate(30px, -30px) scale(1.1);
+ }
-.money-minus {
- color: var(--error);
- font-size: 1.5rem;
- font-weight: 600;
-}
+ 50% {
+ transform: translate(-20px, 20px) scale(0.9);
+ }
-/* History Section */
-.history-section {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(20px);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- padding: 2rem;
- box-shadow: var(--shadow-glass);
- animation: fadeInUp 1s ease-out 0.8s both;
+ 75% {
+ transform: translate(20px, 30px) scale(1.05);
+ }
}
-.section-header {
- display: flex;
- flex-direction: column;
- margin-bottom: 1.5rem;
- gap: 1rem;
+.hero-content-wrapper {
+ max-width: 900px;
+ margin: 0 auto;
+ position: relative;
+ z-index: 1;
}
-.section-header h3 {
- color: var(--text-primary);
- font-size: 1.3rem;
- font-weight: 600;
- display: flex;
+.hero-badge {
+ display: inline-flex;
align-items: center;
gap: 0.5rem;
- border-bottom: none;
- padding-bottom: 0;
- margin: 0;
-}
-
-.section-header h3 i {
+ padding: 0.5rem 1.5rem;
+ background: rgba(100, 255, 218, 0.1);
+ border: 1px solid rgba(100, 255, 218, 0.3);
+ border-radius: 50px;
color: var(--accent-primary);
+ font-size: 0.85rem;
+ font-weight: 500;
+ margin-bottom: 1.5rem;
+ animation: fadeInUp 0.8s ease-out;
}
-.filter-controls {
- display: flex;
- flex-direction: column;
- gap: 1rem;
-}
-
-.search-container {
- position: relative;
- max-width: 300px;
-}
-
-.search-input {
- width: 100%;
- padding: 0.75rem 1rem 0.75rem 2.5rem;
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 25px;
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(10px);
- color: var(--text-primary);
- font-size: 0.9rem;
- transition: all 0.3s ease;
-}
-
-.search-input:focus {
- outline: none;
- border-color: var(--accent-primary);
- box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+.hero-badge i {
+ color: #ffd700;
}
-.search-input::placeholder {
- color: var(--text-secondary);
+.hero-title {
+ font-size: 3.5rem;
+ font-weight: 800;
+ background: var(--primary-gradient);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ margin-bottom: 1.5rem;
+ line-height: 1.2;
+ animation: fadeInUp 1s ease-out 0.1s both;
}
-.search-icon {
- position: absolute;
- left: 0.75rem;
- top: 50%;
- transform: translateY(-50%);
+.hero-subtitle {
+ font-size: 1.1rem;
color: var(--text-secondary);
- font-size: 0.9rem;
+ margin-bottom: 2.5rem;
+ line-height: 1.8;
+ animation: fadeInUp 1s ease-out 0.2s both;
}
-.filter-buttons {
+.hero-cta {
display: flex;
- gap: 0.5rem;
+ gap: 1rem;
+ justify-content: center;
align-items: center;
flex-wrap: wrap;
+ margin-bottom: 2.5rem;
+ animation: fadeInUp 1s ease-out 0.3s both;
}
-.advanced-filters {
+.cta-primary {
+ padding: 1rem 2.5rem;
+ background: var(--primary-gradient);
+ color: white;
+ border: none;
+ border-radius: 50px;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
display: flex;
- gap: 1rem;
align-items: center;
- flex-wrap: wrap;
- padding: 1rem;
- background: rgba(255, 255, 255, 0.03);
- border-radius: 15px;
- border: 1px solid rgba(255, 255, 255, 0.1);
+ gap: 0.75rem;
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
}
-.category-select,
-.date-input,
-.amount-input {
- padding: 0.5rem 1rem;
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 8px;
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(10px);
+.cta-primary:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 12px 35px rgba(102, 126, 234, 0.5);
+}
+
+.cta-secondary {
+ padding: 1rem 2.5rem;
+ background: rgba(255, 255, 255, 0.1);
color: var(--text-primary);
- font-size: 0.9rem;
+ border: 2px solid rgba(255, 255, 255, 0.2);
+ border-radius: 50px;
+ font-size: 1rem;
+ font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
- min-width: 120px;
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ backdrop-filter: blur(10px);
}
-.category-select:focus,
-.date-input:focus,
-.amount-input:focus {
- outline: none;
+.cta-secondary:hover {
+ background: rgba(255, 255, 255, 0.15);
border-color: var(--accent-primary);
- background: rgba(100, 255, 218, 0.1);
+ transform: translateY(-3px);
}
-.category-select option {
- background: var(--bg-secondary);
- color: var(--text-primary);
+.hero-features {
+ display: flex;
+ gap: 1.5rem;
+ justify-content: center;
+ flex-wrap: wrap;
+ animation: fadeInUp 1s ease-out 0.4s both;
}
-.date-filters,
-.amount-filters {
+.feature-pill {
display: flex;
- gap: 0.5rem;
align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1.5rem;
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 50px;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ font-weight: 500;
+ transition: all 0.3s ease;
}
-.date-input,
-.amount-input {
- cursor: text;
+.feature-pill:hover {
+ background: rgba(100, 255, 218, 0.1);
+ border-color: var(--accent-primary);
+ color: var(--accent-primary);
+ transform: translateY(-2px);
}
-.amount-input::placeholder,
-.date-input::placeholder {
- color: var(--text-secondary);
+.feature-pill i {
+ color: var(--accent-primary);
+ font-size: 1.1rem;
}
-.clear-filters-btn {
- padding: 0.5rem 1rem;
- background: rgba(255, 87, 34, 0.2);
- color: var(--error);
- border: 1px solid rgba(255, 87, 34, 0.3);
- border-radius: 8px;
- cursor: pointer;
- transition: all 0.3s ease;
- font-size: 0.9rem;
+.scroll-indicator {
display: flex;
+ flex-direction: column;
align-items: center;
gap: 0.5rem;
+ margin-top: 3rem;
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ animation: bounce 2s ease-in-out infinite;
}
-.clear-filters-btn:hover {
- background: rgba(255, 87, 34, 0.3);
- border-color: var(--error);
+.scroll-indicator i {
+ font-size: 1.5rem;
+ color: var(--accent-primary);
}
-.filter-btn {
- padding: 0.5rem 1rem;
- border: 1px solid rgba(255, 255, 255, 0.2);
- background: transparent;
- color: var(--text-secondary);
- border-radius: 25px;
- cursor: pointer;
- transition: all 0.3s ease;
- font-size: 0.9rem;
- font-weight: 500;
-}
+@keyframes bounce {
+ 0%,
+ 20%,
+ 50%,
+ 80%,
+ 100% {
+ transform: translateY(0);
+ }
-.filter-btn:hover,
-.filter-btn.active {
- background: var(--accent-primary);
- color: var(--bg-primary);
- border-color: var(--accent-primary);
-}
+ 40% {
+ transform: translateY(-10px);
+ }
-.list {
- list-style: none;
- padding: 0;
- max-height: 400px;
- overflow-y: auto;
- scrollbar-width: thin;
- scrollbar-color: var(--accent-primary) transparent;
+ 60% {
+ transform: translateY(-5px);
+ }
}
-.list::-webkit-scrollbar {
- width: 8px;
+.container {
+ width: 100%;
+ max-width: 1100px;
+ margin: 0 auto;
+ padding: 0 2rem;
}
-.list::-webkit-scrollbar-track {
- background: rgba(255, 255, 255, 0.1);
- border-radius: 4px;
+/* Features Showcase Section */
+.features-showcase {
+ padding: 6rem 0;
+ background: rgba(255, 255, 255, 0.02);
}
-.list::-webkit-scrollbar-thumb {
- background: var(--accent-primary);
- border-radius: 4px;
+.section-header-center {
+ text-align: center;
+ margin-bottom: 4rem;
}
-.list li {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(10px);
- border-radius: 12px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- padding: 1rem;
- margin-bottom: 0.5rem;
- display: flex;
- justify-content: space-between;
- align-items: center;
- position: relative;
- transition: all 0.3s ease;
- animation: slideInLeft 0.3s ease-out;
- max-width: 100%;
- word-break: break-word;
+.section-title {
+ font-size: 2.5rem;
+ font-weight: 700;
+ background: var(--primary-gradient);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ margin-bottom: 1rem;
}
-.list li:hover {
- transform: translateX(5px);
- background: rgba(255, 255, 255, 0.1);
+.section-subtitle {
+ font-size: 1.1rem;
+ color: var(--text-secondary);
+ max-width: 600px;
+ margin: 0 auto;
}
-.list li.plus {
- border-left: 4px solid var(--success);
+.features-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 2rem;
}
-.list li.minus {
- border-left: 4px solid var(--error);
+.feature-card {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 2.5rem;
+ text-align: center;
+ transition: all 0.4s ease;
+ position: relative;
+ overflow: hidden;
}
-.delete-btn {
+.feature-card::before {
+ content: "";
position: absolute;
- left: -40px;
- top: 50%;
- transform: translateY(-50%);
- background: var(--error);
- color: white;
- border: none;
- width: 30px;
- height: 30px;
- border-radius: 50%;
- cursor: pointer;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: var(--primary-gradient);
opacity: 0;
- transition: all 0.3s ease;
- font-size: 0.9rem;
- display: flex;
- align-items: center;
- justify-content: center;
+ transition: opacity 0.4s ease;
+ z-index: 0;
}
-.list li:hover .delete-btn {
- opacity: 1;
+.feature-card:hover::before {
+ opacity: 0.1;
}
-.delete-btn:hover {
- background: #d32f2f;
- transform: translateY(-50%) scale(1.1);
+.feature-card:hover {
+ transform: translateY(-10px);
+ box-shadow: 0 15px 40px rgba(102, 126, 234, 0.3);
+ border-color: rgba(100, 255, 218, 0.3);
}
-/* Data Management Section */
-.data-management-section {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(20px);
+.feature-icon {
+ width: 80px;
+ height: 80px;
+ margin: 0 auto 1.5rem;
+ background: var(--primary-gradient);
border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- padding: 2rem;
- box-shadow: var(--shadow-glass);
- animation: fadeInUp 1s ease-out 0.9s both;
-}
-
-.data-management-section h3 {
- color: var(--text-primary);
- font-size: 1.3rem;
- font-weight: 600;
display: flex;
align-items: center;
- gap: 0.5rem;
- margin-bottom: 1.5rem;
+ justify-content: center;
+ font-size: 2rem;
+ color: white;
+ position: relative;
+ z-index: 1;
+ transition: transform 0.4s ease;
}
-.data-management-section h3 i {
- color: var(--accent-primary);
+.feature-card:hover .feature-icon {
+ transform: scale(1.1) rotate(5deg);
}
-.data-actions {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 2rem;
+.feature-card h3 {
+ font-size: 1.3rem;
+ color: var(--text-primary);
+ margin-bottom: 1rem;
+ position: relative;
+ z-index: 1;
}
-.export-section,
-.import-section {
- display: flex;
- flex-direction: column;
- gap: 1rem;
+.feature-card p {
+ color: var(--text-secondary);
+ line-height: 1.6;
+ position: relative;
+ z-index: 1;
}
-.export-section h4,
-.import-section h4 {
- color: var(--text-secondary);
- font-size: 1rem;
- font-weight: 500;
- margin-bottom: 0.5rem;
+/* How It Works Section */
+.how-it-works {
+ padding: 6rem 0;
}
-.export-buttons {
- display: flex;
- gap: 1rem;
+.steps-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 3rem;
}
-.export-btn {
- padding: 0.75rem 1.5rem;
- background: var(--success-gradient);
- color: white;
- border: none;
- border-radius: 10px;
- font-size: 0.9rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- gap: 0.5rem;
+.step-card {
+ text-align: center;
+ position: relative;
+ padding: 2rem;
}
-.export-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3);
+.step-number {
+ position: absolute;
+ top: -20px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 50px;
+ height: 50px;
+ background: var(--primary-gradient);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: white;
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
+ z-index: 2;
}
-.import-controls {
+.step-icon {
+ width: 100px;
+ height: 100px;
+ margin: 2rem auto 1.5rem;
+ background: rgba(255, 255, 255, 0.05);
+ border: 2px solid rgba(100, 255, 218, 0.3);
+ border-radius: 50%;
display: flex;
- gap: 1rem;
align-items: center;
+ justify-content: center;
+ font-size: 2.5rem;
+ color: var(--accent-primary);
+ transition: all 0.4s ease;
}
-.file-input {
- display: none;
+.step-card:hover .step-icon {
+ transform: scale(1.1);
+ background: rgba(100, 255, 218, 0.1);
+ border-color: var(--accent-primary);
}
-.file-label {
- padding: 0.75rem 1.5rem;
- background: rgba(255, 255, 255, 0.1);
+.step-card h3 {
+ font-size: 1.3rem;
color: var(--text-primary);
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 10px;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- font-size: 0.9rem;
- font-weight: 500;
+ margin-bottom: 1rem;
}
-.file-label:hover {
- background: rgba(255, 255, 255, 0.15);
- border-color: var(--accent-primary);
+.step-card p {
+ color: var(--text-secondary);
+ line-height: 1.6;
}
-.import-btn {
- padding: 0.75rem 1.5rem;
- background: var(--primary-gradient);
- color: white;
- border: none;
- border-radius: 10px;
- font-size: 0.9rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.3s ease;
+/* Quick Stats Section */
+.quick-stats {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 1.5rem;
+ margin-bottom: 2rem;
+ animation: fadeInUp 1s ease-out 0.5s both;
+}
+
+.stat-card {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 15px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 1.5rem;
display: flex;
align-items: center;
- gap: 0.5rem;
+ gap: 1.25rem;
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
}
-.import-btn:disabled {
- background: rgba(255, 255, 255, 0.1);
- color: var(--text-secondary);
- cursor: not-allowed;
+.stat-card::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: var(--primary-gradient);
+ opacity: 0;
+ transition: opacity 0.3s ease;
}
-.import-btn:not(:disabled):hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
+.stat-card:hover {
+ transform: translateY(-5px);
+ box-shadow: var(--shadow-hover);
+ background: rgba(255, 255, 255, 0.08);
}
-.import-options {
- margin-top: 1rem;
+.stat-card:hover::before {
+ opacity: 1;
}
-.checkbox-label {
+.stat-icon {
+ width: 60px;
+ height: 60px;
+ border-radius: 12px;
display: flex;
align-items: center;
- gap: 0.75rem;
- color: var(--text-secondary);
- font-size: 0.9rem;
- cursor: pointer;
+ justify-content: center;
+ font-size: 1.5rem;
+ color: white;
+ flex-shrink: 0;
}
-.checkbox-label input[type="checkbox"] {
- width: 18px;
- height: 18px;
- accent-color: var(--accent-primary);
+.stat-content {
+ flex: 1;
}
-/* Form Section */
-.form-section {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(20px);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- padding: 2rem;
- box-shadow: var(--shadow-glass);
- animation: fadeInUp 1s ease-out 1s both;
+.stat-label {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 0.25rem;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ font-weight: 500;
}
-.form-section h3 {
+.stat-value {
+ font-size: 1.75rem;
+ font-weight: 700;
color: var(--text-primary);
- font-size: 1.3rem;
- font-weight: 600;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- margin-bottom: 1.5rem;
- border-bottom: none;
- padding-bottom: 0;
-}
-
-.form-section h3 i {
- color: var(--accent-primary);
+ margin: 0;
}
-.transaction-form {
- display: flex;
- flex-direction: column;
- gap: 1.5rem;
+.stat-value.income {
+ color: var(--success);
}
-.form-row {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 1rem;
+.stat-value.expense {
+ color: var(--error);
}
-.form-control {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
+/* Balance Card */
+.balance-card {
+ background: linear-gradient(
+ 135deg,
+ rgba(102, 126, 234, 0.1) 0%,
+ rgba(118, 75, 162, 0.1) 100%
+ );
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(100, 255, 218, 0.2);
+ padding: 2.5rem;
+ text-align: center;
+ box-shadow: 0 8px 32px 0 rgba(102, 126, 234, 0.2);
+ transition:
+ transform 0.3s ease,
+ box-shadow 0.3s ease;
+ animation: fadeInUp 1s ease-out 0.6s both;
+ width: 100%;
+ max-width: 32rem;
+ margin: 0 auto 2rem;
+ position: relative;
+ overflow: hidden;
}
-.form-control label {
- color: var(--text-secondary);
- font-weight: 500;
- font-size: 0.9rem;
- text-transform: uppercase;
- letter-spacing: 1px;
-}
+.balance-card::before {
+ content: "";
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: radial-gradient(
+ circle,
+ rgba(100, 255, 218, 0.1) 0%,
+ transparent 70%
+ );
+ animation: rotate 20s linear infinite;
+ pointer-events: none;
+}
+
+@keyframes rotate {
+ 0% {
+ transform: rotate(0deg);
+ }
-.form-control input {
- padding: 1rem;
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 10px;
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(10px);
- color: var(--text-primary);
- font-size: 1rem;
- transition: all 0.3s ease;
+ 100% {
+ transform: rotate(360deg);
+ }
}
-.form-control input:focus {
- outline: none;
- border-color: var(--accent-primary);
- box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+.balance-card:hover {
+ transform: translateY(-5px);
+ box-shadow: var(--shadow-hover);
}
-.form-control input::placeholder {
- color: var(--text-secondary);
+.balance-header {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ margin-bottom: 1rem;
}
-.form-control select {
- padding: 1rem;
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 10px;
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(10px);
- color: var(--text-primary);
- font-size: 1rem;
- transition: all 0.3s ease;
- cursor: pointer;
+.balance-header i {
+ color: var(--accent-primary);
+ font-size: 1.5rem;
}
-.form-control select:focus {
- outline: none;
- border-color: var(--accent-primary);
- box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+.balance-header h4 {
+ color: var(--text-secondary);
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ font-size: 0.9rem;
}
-.form-control select option {
- background: var(--bg-secondary);
+.balance-amount {
+ font-size: 3rem;
+ font-weight: 700;
color: var(--text-primary);
- padding: 0.5rem;
-}
-
-.form-control small {
- color: var(--text-secondary);
- font-size: 0.8rem;
- font-style: italic;
+ margin: 1rem 0;
+ text-shadow: 0 0 20px rgba(100, 255, 218, 0.3);
}
-.btn-submit {
- padding: 1rem 2rem;
- background: var(--primary-gradient);
- color: white;
- border: none;
- border-radius: 10px;
- font-size: 1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
+.balance-trend {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
- text-transform: uppercase;
- letter-spacing: 1px;
}
-.btn-submit:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
+.trend-indicator {
+ font-size: 1.5rem;
+ font-weight: bold;
}
-.btn-submit:active {
- transform: translateY(0);
+.trend-indicator.positive {
+ color: var(--success);
}
-/* Footer */
-.footer {
- background: rgba(15, 15, 35, 0.9);
- backdrop-filter: blur(20px);
- border-top: 1px solid rgba(255, 255, 255, 0.1);
- padding: 3rem 0 1rem;
- margin-top: 4rem;
+.trend-text {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
}
-.footer-container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 0 2rem;
+/* Dashboard Grid (Mobile First) */
+.inc-exp-container {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- gap: 2rem;
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 1.5rem;
+ width: 100%;
+ margin-bottom: 2rem;
}
-.footer-section {
+.income-card,
+.expense-card {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 15px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 1.5rem;
display: flex;
- flex-direction: column;
+ align-items: center;
gap: 1rem;
+ box-shadow: var(--shadow-glass);
+ transition: all 0.3s ease;
+ width: 100%;
+ max-width: 24rem;
+ margin: 0 auto;
}
-.footer-logo {
+.income-card:hover,
+.expense-card:hover {
+ transform: translateY(-3px);
+ box-shadow: var(--shadow-hover);
+}
+
+.card-icon {
+ width: 60px;
+ height: 60px;
+ border-radius: 15px;
display: flex;
align-items: center;
- gap: 0.5rem;
+ justify-content: center;
font-size: 1.5rem;
- font-weight: 700;
- color: var(--accent-primary);
- margin-bottom: 0.5rem;
+ color: white;
}
-.footer-logo i {
- font-size: 2rem;
- background: var(--primary-gradient);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
+.income-icon {
+ background: var(--success-gradient);
}
-.footer-section p {
- color: var(--text-secondary);
- line-height: 1.6;
+.expense-icon {
+ background: var(--warning-gradient);
}
-.footer-section h4 {
- color: var(--text-primary);
- font-weight: 600;
+.card-content h4 {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 1px;
margin-bottom: 0.5rem;
}
-.footer-links {
- list-style: none;
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
+.money-plus {
+ color: var(--success);
+ font-size: 1.5rem;
+ font-weight: 600;
}
-.footer-links a {
- color: var(--text-secondary);
- text-decoration: none;
- transition: color 0.3s ease;
+.money-minus {
+ color: var(--error);
+ font-size: 1.5rem;
+ font-weight: 600;
}
-.footer-links a:hover {
- color: var(--accent-primary);
+/* History Section */
+.history-section {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 2rem;
+ box-shadow: var(--shadow-glass);
+ animation: fadeInUp 1s ease-out 0.8s both;
}
-.social-links {
+.section-header {
display: flex;
+ flex-direction: column;
+ margin-bottom: 1.5rem;
gap: 1rem;
}
-.social-link {
+.section-header h3 {
+ color: var(--text-primary);
+ font-size: 1.3rem;
+ font-weight: 600;
display: flex;
align-items: center;
- justify-content: center;
- width: 40px;
- height: 40px;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 50%;
- color: var(--text-secondary);
- text-decoration: none;
- transition: all 0.3s ease;
+ gap: 0.5rem;
+ border-bottom: none;
+ padding-bottom: 0;
+ margin: 0;
}
-.social-link:hover {
+.section-header h3 i {
+ color: var(--accent-primary);
+}
+
+.filter-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.search-container {
+ position: relative;
+ max-width: 300px;
+}
+
+.search-input {
+ width: 100%;
+ padding: 0.75rem 1rem 0.75rem 2.5rem;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 25px;
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(10px);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ transition: all 0.3s ease;
+}
+
+.search-input:focus {
+ outline: none;
+ border-color: var(--accent-primary);
+ box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+}
+
+.search-input::placeholder {
+ color: var(--text-secondary);
+}
+
+.search-icon {
+ position: absolute;
+ left: 0.75rem;
+ top: 50%;
+ transform: translateY(-50%);
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+.filter-buttons {
+ display: flex;
+ gap: 0.5rem;
+ align-items: center;
+ flex-wrap: wrap;
+}
+
+.advanced-filters {
+ display: flex;
+ gap: 1rem;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 1rem;
+ background: rgba(255, 255, 255, 0.03);
+ border-radius: 15px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.category-select,
+.date-input,
+.amount-input {
+ padding: 0.5rem 1rem;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 8px;
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(10px);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ min-width: 120px;
+}
+
+.category-select:focus,
+.date-input:focus,
+.amount-input:focus {
+ outline: none;
+ border-color: var(--accent-primary);
+ background: rgba(100, 255, 218, 0.1);
+}
+
+.category-select option {
+ background: var(--bg-secondary);
+ color: var(--text-primary);
+}
+
+.date-filters,
+.amount-filters {
+ display: flex;
+ gap: 0.5rem;
+ align-items: center;
+}
+
+.date-input,
+.amount-input {
+ cursor: text;
+}
+
+.amount-input::placeholder,
+.date-input::placeholder {
+ color: var(--text-secondary);
+}
+
+.clear-filters-btn {
+ padding: 0.5rem 1rem;
+ background: rgba(255, 87, 34, 0.2);
+ color: var(--error);
+ border: 1px solid rgba(255, 87, 34, 0.3);
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 0.9rem;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.clear-filters-btn:hover {
+ background: rgba(255, 87, 34, 0.3);
+ border-color: var(--error);
+}
+
+.filter-btn {
+ padding: 0.5rem 1rem;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ background: transparent;
+ color: var(--text-secondary);
+ border-radius: 25px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+.filter-btn:hover,
+.filter-btn.active {
background: var(--accent-primary);
color: var(--bg-primary);
- transform: translateY(-2px);
+ border-color: var(--accent-primary);
+}
+
+.list {
+ list-style: none;
+ padding: 0;
+ max-height: 400px;
+ overflow-y: auto;
+ scrollbar-width: thin;
+ scrollbar-color: var(--accent-primary) transparent;
+}
+
+.list::-webkit-scrollbar {
+ width: 8px;
+}
+
+.list::-webkit-scrollbar-track {
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 4px;
+}
+
+.list::-webkit-scrollbar-thumb {
+ background: var(--accent-primary);
+ border-radius: 4px;
+}
+
+.list li {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(10px);
+ border-radius: 12px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 1rem;
+ margin-bottom: 0.5rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ position: relative;
+ transition: all 0.3s ease;
+ animation: slideInLeft 0.3s ease-out;
+ max-width: 100%;
+ word-break: break-word;
+}
+
+.list li:hover {
+ transform: translateX(5px);
+ background: rgba(255, 255, 255, 0.1);
+}
+
+.list li.plus {
+ border-left: 4px solid var(--success);
+}
+
+.list li.minus {
+ border-left: 4px solid var(--error);
+}
+
+.delete-btn {
+ position: absolute;
+ left: -40px;
+ top: 50%;
+ transform: translateY(-50%);
+ background: var(--error);
+ color: white;
+ border: none;
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ cursor: pointer;
+ opacity: 0;
+ transition: all 0.3s ease;
+ font-size: 0.9rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.list li:hover .delete-btn {
+ opacity: 1;
+}
+
+.delete-btn:hover {
+ background: #d32f2f;
+ transform: translateY(-50%) scale(1.1);
+}
+
+/* Data Management Section */
+.data-management-section {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 2rem;
+ box-shadow: var(--shadow-glass);
+ animation: fadeInUp 1s ease-out 0.9s both;
+}
+
+.data-management-section h3 {
+ color: var(--text-primary);
+ font-size: 1.3rem;
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.data-management-section h3 i {
+ color: var(--accent-primary);
+}
+
+.data-actions {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 2rem;
+}
+
+.export-section,
+.import-section {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.export-section h4,
+.import-section h4 {
+ color: var(--text-secondary);
+ font-size: 1rem;
+ font-weight: 500;
+ margin-bottom: 0.5rem;
+}
+
+.export-buttons {
+ display: flex;
+ gap: 1rem;
+}
+
+.export-btn {
+ padding: 0.75rem 1.5rem;
+ background: var(--success-gradient);
+ color: white;
+ border: none;
+ border-radius: 10px;
+ font-size: 0.9rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.export-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3);
+}
+
+.import-controls {
+ display: flex;
+ gap: 1rem;
+ align-items: center;
+}
+
+.file-input {
+ display: none;
+}
+
+.file-label {
+ padding: 0.75rem 1.5rem;
+ background: rgba(255, 255, 255, 0.1);
+ color: var(--text-primary);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 10px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+.file-label:hover {
+ background: rgba(255, 255, 255, 0.15);
+ border-color: var(--accent-primary);
+}
+
+.import-btn {
+ padding: 0.75rem 1.5rem;
+ background: var(--primary-gradient);
+ color: white;
+ border: none;
+ border-radius: 10px;
+ font-size: 0.9rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.import-btn:disabled {
+ background: rgba(255, 255, 255, 0.1);
+ color: var(--text-secondary);
+ cursor: not-allowed;
+}
+
+.import-btn:not(:disabled):hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
+}
+
+.import-options {
+ margin-top: 1rem;
+}
+
+.checkbox-label {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ cursor: pointer;
+}
+
+.checkbox-label input[type="checkbox"] {
+ width: 18px;
+ height: 18px;
+ accent-color: var(--accent-primary);
+}
+
+/* Form Section */
+.form-section {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 2rem;
+ box-shadow: var(--shadow-glass);
+ animation: fadeInUp 1s ease-out 1s both;
+}
+
+.form-section h3 {
+ color: var(--text-primary);
+ font-size: 1.3rem;
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 1.5rem;
+ border-bottom: none;
+ padding-bottom: 0;
+}
+
+.form-section h3 i {
+ color: var(--accent-primary);
+}
+
+.transaction-form {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+.form-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 1rem;
+}
+
+.form-control {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.form-control label {
+ color: var(--text-secondary);
+ font-weight: 500;
+ font-size: 0.9rem;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+.form-control input {
+ padding: 1rem;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 10px;
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(10px);
+ color: var(--text-primary);
+ font-size: 1rem;
+ transition: all 0.3s ease;
+}
+
+.form-control input:focus {
+ outline: none;
+ border-color: var(--accent-primary);
+ box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+}
+
+.form-control input::placeholder {
+ color: var(--text-secondary);
+}
+
+.form-control select {
+ padding: 1rem;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 10px;
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(10px);
+ color: var(--text-primary);
+ font-size: 1rem;
+ transition: all 0.3s ease;
+ cursor: pointer;
+}
+
+.form-control select:focus {
+ outline: none;
+ border-color: var(--accent-primary);
+ box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+}
+
+.form-control select option {
+ background: var(--bg-secondary);
+ color: var(--text-primary);
+ padding: 0.5rem;
+}
+
+.form-control small {
+ color: var(--text-secondary);
+ font-size: 0.8rem;
+ font-style: italic;
+}
+
+.btn-submit {
+ padding: 1rem 2rem;
+ background: var(--primary-gradient);
+ color: white;
+ border: none;
+ border-radius: 10px;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+.btn-submit:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
+}
+
+.btn-submit:active {
+ transform: translateY(0);
+}
+
+/* Footer */
+.footer {
+ background: rgba(15, 15, 35, 0.9);
+ backdrop-filter: blur(20px);
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 3rem 0 1rem;
+ margin-top: 4rem;
+}
+
+.footer-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 2rem;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 2rem;
+}
+
+.footer-section {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.footer-logo {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--accent-primary);
+ margin-bottom: 0.5rem;
+}
+
+.footer-logo i {
+ font-size: 2rem;
+ background: var(--primary-gradient);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.footer-section p {
+ color: var(--text-secondary);
+ line-height: 1.6;
+}
+
+.footer-section h4 {
+ color: var(--text-primary);
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+}
+
+.footer-links {
+ list-style: none;
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.footer-links a {
+ color: var(--text-secondary);
+ text-decoration: none;
+ transition: color 0.3s ease;
+}
+
+.footer-links a:hover {
+ color: var(--accent-primary);
+}
+
+.social-links {
+ display: flex;
+ gap: 1rem;
+}
+
+.social-link {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 50%;
+ color: var(--text-secondary);
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+.social-link:hover {
+ background: var(--accent-primary);
+ color: var(--bg-primary);
+ transform: translateY(-2px);
+}
+
+.footer-bottom {
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+ margin-top: 2rem;
+ padding-top: 1rem;
+}
+
+.footer-bottom .footer-container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+ grid-template-columns: 1fr;
+}
+
+.footer-bottom p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+.footer-stats {
+ display: flex;
+ gap: 1rem;
+ flex-wrap: wrap;
+}
+
+.footer-stats span {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ background: rgba(255, 255, 255, 0.05);
+ padding: 0.25rem 0.75rem;
+ border-radius: 15px;
+}
+
+/* Animations */
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes slideInLeft {
+ from {
+ opacity: 0;
+ transform: translateX(-20px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+@keyframes pulse {
+ 0%,
+ 100% {
+ transform: scale(1);
+ }
+
+ 50% {
+ transform: scale(1.05);
+ }
+}
+
+/* Transaction Display Improvements */
+.transaction-content {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ flex: 1;
+}
+
+.transaction-main {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.transaction-text {
+ font-weight: 500;
+ color: var(--text-primary);
+}
+
+.transaction-amount {
+ font-weight: 600;
+ font-size: 1.1rem;
+}
+
+.transaction-date {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ opacity: 0.7;
+}
+
+.transaction-category {
+ font-size: 0.8rem;
+ color: var(--accent-primary);
+ background: rgba(100, 255, 218, 0.1);
+ padding: 0.2rem 0.6rem;
+ border-radius: 15px;
+ margin-top: 0.25rem;
+ display: inline-block;
+}
+
+/* Balance Card States */
+.balance-card.positive .balance-amount {
+ color: var(--success);
+ text-shadow: 0 0 20px rgba(0, 230, 118, 0.3);
+}
+
+.balance-card.negative .balance-amount {
+ color: var(--error);
+ text-shadow: 0 0 20px rgba(255, 87, 34, 0.3);
+}
+
+.balance-card.neutral .balance-amount {
+ color: var(--text-secondary);
+ text-shadow: none;
+}
+
+/* Mobile Navigation */
+@media (max-width: 768px) {
+ .nav-menu {
+ position: fixed;
+ top: 80px;
+ left: -100%;
+ width: 100%;
+ height: calc(100vh - 80px);
+ background: rgba(15, 15, 35, 0.95);
+ backdrop-filter: blur(20px);
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: center;
+ padding: 2rem 0;
+ transition: left 0.3s ease;
+ }
+
+ .nav-menu.active {
+ left: 0;
+ display: flex;
+ }
+
+ .nav-link {
+ font-size: 1.2rem;
+ padding: 1rem 2rem;
+ width: 80%;
+ text-align: center;
+ margin: 0.5rem 0;
+ }
+
+ .nav-toggle {
+ display: flex;
+ }
+
+ .nav-toggle.active .bar:nth-child(2) {
+ opacity: 0;
+ }
+
+ .nav-toggle.active .bar:nth-child(1) {
+ transform: translateY(8px) rotate(45deg);
+ }
+
+ .nav-toggle.active .bar:nth-child(3) {
+ transform: translateY(-8px) rotate(-45deg);
+ }
+
+ .user-profile {
+ display: none;
+ }
+}
+
+/* Responsive Design */
+@media (max-width: 768px) {
+ .hero-section-full {
+ min-height: 90vh;
+ padding: 6rem 1.5rem 3rem;
+ }
+
+ .hero-title {
+ font-size: 2.2rem;
+ }
+
+ .hero-subtitle {
+ font-size: 1rem;
+ }
+
+ .hero-cta {
+ flex-direction: column;
+ width: 100%;
+ }
+
+ .cta-primary,
+ .cta-secondary {
+ width: 100%;
+ justify-content: center;
+ padding: 1rem 2rem;
+ }
+
+ .hero-features {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .feature-pill {
+ justify-content: center;
+ }
+
+ .scroll-indicator {
+ margin-top: 2rem;
+ }
+
+ .section-title {
+ font-size: 1.8rem;
+ }
+
+ .section-subtitle {
+ font-size: 1rem;
+ }
+
+ .features-showcase,
+ .how-it-works {
+ padding: 4rem 0;
+ }
+
+ .features-grid {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ }
+
+ .steps-grid {
+ grid-template-columns: 1fr;
+ gap: 2rem;
+ }
+
+ .quick-stats {
+ grid-template-columns: 1fr;
+ }
+
+ .container {
+ padding: 0 1rem;
+ }
+
+ .inc-exp-container {
+ grid-template-columns: 1fr;
+ }
+
+ .form-row {
+ grid-template-columns: 1fr;
+ }
+
+ .section-header {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .footer-bottom .footer-container {
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .footer-stats {
+ justify-content: center;
+ }
+}
+
+@media (max-width: 480px) {
+ .hero-title {
+ font-size: 2rem;
+ }
+
+ .balance-amount {
+ font-size: 2rem;
+ }
+
+ .income-card,
+ .expense-card {
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .card-icon {
+ width: 50px;
+ height: 50px;
+ }
+
+ .advanced-filters {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .date-filters,
+ .amount-filters {
+ justify-content: stretch;
+ }
+
+ .date-input,
+ .amount-input,
+ .category-select {
+ flex: 1;
+ }
+
+ .data-actions {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* PWA Install Prompt */
+.install-prompt {
+ position: fixed;
+ bottom: 20px;
+ left: 20px;
+ right: 20px;
+ z-index: 10000;
+ animation: slideInUp 0.3s ease-out;
+}
+
+.install-prompt-content {
+ background: rgba(15, 15, 35, 0.95);
+ backdrop-filter: blur(20px);
+ border-radius: 15px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ padding: 1.5rem;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
+}
+
+.install-prompt-header {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+
+.install-prompt-header i {
+ color: var(--accent-primary);
+ font-size: 1.5rem;
+}
+
+.install-prompt-header h3 {
+ color: var(--text-primary);
+ font-size: 1.1rem;
+ font-weight: 600;
+ margin: 0;
+}
+
+.install-prompt p {
+ color: var(--text-secondary);
+ margin-bottom: 1rem;
+ font-size: 0.9rem;
+}
+
+.install-prompt-actions {
+ display: flex;
+ gap: 1rem;
+}
+
+.install-btn {
+ padding: 0.75rem 1.5rem;
+ background: var(--primary-gradient);
+ color: white;
+ border: none;
+ border-radius: 8px;
+ font-size: 0.9rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ flex: 1;
+ justify-content: center;
+}
+
+.install-btn:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
+}
+
+.dismiss-btn {
+ padding: 0.75rem 1.5rem;
+ background: transparent;
+ color: var(--text-secondary);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 8px;
+ font-size: 0.9rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ justify-content: center;
+}
+
+.dismiss-btn:hover {
+ background: rgba(255, 255, 255, 0.1);
+ color: var(--text-primary);
+}
+
+/* Offline Indicator */
+.offline-indicator {
+ position: fixed;
+ top: 80px;
+ left: 50%;
+ transform: translateX(-50%);
+ background: rgba(255, 152, 0, 0.9);
+ color: white;
+ padding: 0.75rem 1.5rem;
+ border-radius: 25px;
+ font-size: 0.9rem;
+ font-weight: 500;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ z-index: 9999;
+ backdrop-filter: blur(10px);
+ box-shadow: 0 4px 20px rgba(255, 152, 0, 0.3);
+ animation: slideInDown 0.3s ease-out;
+}
+
+/* Update Notification */
+.update-notification {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ z-index: 10000;
+ animation: slideInRight 0.3s ease-out;
+}
+
+.update-content {
+ background: rgba(76, 175, 80, 0.9);
+ color: white;
+ padding: 1rem 1.5rem;
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ backdrop-filter: blur(10px);
+ box-shadow: 0 4px 20px rgba(76, 175, 80, 0.3);
+}
+
+.update-btn {
+ background: white;
+ color: #4caf50;
+ border: none;
+ padding: 0.5rem 1rem;
+ border-radius: 5px;
+ font-size: 0.9rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.update-btn:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
+}
+
+/* Touch and gesture improvements */
+@media (hover: none) and (pointer: coarse) {
+ /* Touch device specific styles */
+ .filter-btn,
+ .export-btn,
+ .import-btn,
+ .btn-submit {
+ min-height: 44px;
+ padding: 0.75rem 1.5rem;
+ }
+
+ .delete-btn {
+ min-width: 44px;
+ min-height: 44px;
+ }
+
+ .nav-link {
+ padding: 1rem 1.5rem;
+ }
+
+ /* Larger tap targets for mobile */
+ .category-select,
+ .date-input,
+ .amount-input,
+ .search-input {
+ min-height: 48px;
+ font-size: 16px;
+ /* Prevents zoom on iOS */
+ }
+
+ .form-control input,
+ .form-control select {
+ min-height: 48px;
+ font-size: 16px;
+ }
+}
+
+/* Animations */
+@keyframes slideInUp {
+ from {
+ transform: translateY(100%);
+ opacity: 0;
+ }
+
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+
+@keyframes slideInDown {
+ from {
+ transform: translateX(-50%) translateY(-100%);
+ opacity: 0;
+ }
+
+ to {
+ transform: translateX(-50%) translateY(0);
+ opacity: 1;
+ }
+}
+
+@keyframes slideInRight {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+/* Safe area insets for devices with notches */
+@supports (padding: max(0px)) {
+ .header {
+ padding-left: max(0px, env(safe-area-inset-left));
+ padding-right: max(0px, env(safe-area-inset-right));
+ }
+
+ .main-content {
+ padding-left: max(2rem, env(safe-area-inset-left) + 2rem);
+ padding-right: max(2rem, env(safe-area-inset-right) + 2rem);
+ padding-bottom: max(2rem, env(safe-area-inset-bottom) + 2rem);
+ }
+
+ .install-prompt {
+ bottom: max(20px, env(safe-area-inset-bottom) + 20px);
+ left: max(20px, env(safe-area-inset-left) + 20px);
+ right: max(20px, env(safe-area-inset-right) + 20px);
+ }
+}
+
+.empty-state {
+ list-style: none;
+ display: flex;
+ justify-content: center;
+}
+
+.empty-state-content {
+ text-align: center;
+ padding: 2.5rem 1.5rem;
+ border: 1px dashed rgba(100, 255, 218, 0.4);
+ border-radius: 12px;
+ background: rgba(100, 255, 218, 0.05);
+}
+
+/* ULTRA SMALL DEVICES (320px)*/
+@media (max-width: 360px) {
+ /* Global */
+ html,
+ body {
+ overflow-x: hidden;
+ }
+
+ body {
+ font-size: 14px;
+ }
+
+ .container {
+ padding: 0.75rem;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ /* Navbar */
+ .nav-logo span {
+ font-size: 0.9rem;
+ }
+
+ .nav-toggle .bar {
+ width: 22px;
+ height: 2.5px;
+ }
+
+ /* Hero */
+ .hero-title {
+ font-size: 1.4rem;
+ line-height: 1.3;
+ }
+
+ .hero-subtitle {
+ font-size: 0.85rem;
+ }
+
+ /* Balance */
+ .balance-card {
+ padding: 1rem;
+ }
+
+ .balance-amount {
+ font-size: 1.5rem;
+ }
+
+ /* Income / Expense cards */
+ .income-card,
+ .expense-card {
+ padding: 0.75rem;
+ }
+
+ /* Filters */
+ .search-input,
+ .category-select,
+ .date-input,
+ .amount-input,
+ .filter-btn,
+ .clear-filters-btn {
+ width: 100%;
+ min-width: 0;
+ font-size: 0.85rem;
+ }
+
+ .filter-buttons {
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ }
+
+ /* Transaction list */
+ .list li {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.25rem;
+ }
+
+ /* Form */
+ .transaction-form {
+ padding: 1rem;
+ }
+
+ .transaction-form input,
+ .transaction-form select,
+ .btn-submit {
+ font-size: 0.9rem;
+ }
+
+ /* Footer */
+ .footer-section h4 {
+ font-size: 1rem;
+ }
+
+ .footer-links a {
+ font-size: 0.85rem;
+ }
+
+ .nav-container {
+ padding: 0 0.75rem;
+ }
+
+ .nav-logo span {
+ font-size: 0.85rem;
+ }
+}
+
+input,
+select,
+button {
+ max-width: 100%;
+ min-width: 0;
+}
+
+/*
+ ANALYTICS DASHBOARD STYLES
+ */
+
+.analytics-dashboard {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 2rem;
+ box-shadow: var(--shadow-glass);
+ margin-bottom: 2rem;
+ animation: fadeInUp 1s ease-out 0.7s both;
+}
+
+.analytics-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2rem;
+}
+
+.analytics-header h3 {
+ margin: 0;
+ font-size: 1.3rem;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.analytics-header h3 i {
+ color: var(--accent-primary);
+}
+
+.refresh-analytics-btn {
+ padding: 0.5rem 1rem;
+ background: rgba(255, 255, 255, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ color: var(--text-secondary);
+ border-radius: 10px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.refresh-analytics-btn:hover {
+ background: var(--accent-primary);
+ color: var(--bg-primary);
+ border-color: var(--accent-primary);
+}
+
+.analytics-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 1.5rem;
+}
+
+.analytics-widget {
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 15px;
+ padding: 1.5rem;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ transition: all 0.3s ease;
+}
+
+.analytics-widget:hover {
+ transform: translateY(-3px);
+ background: rgba(255, 255, 255, 0.08);
+}
+
+.widget-loading {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 2rem;
+ color: var(--text-secondary);
+ gap: 0.5rem;
+}
+
+.widget-loading i {
+ font-size: 1.5rem;
+ color: var(--accent-primary);
+}
+
+.no-data {
+ text-align: center;
+ padding: 2rem;
+ color: var(--text-secondary);
+}
+
+/* Velocity Widget */
+.velocity-widget {
+ grid-column: span 2;
+}
+
+.velocity-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+}
+
+.velocity-header h4 {
+ margin: 0;
+ font-size: 1rem;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.velocity-header h4 i {
+ color: var(--accent-primary);
+}
+
+.velocity-date {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.velocity-stats {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1rem;
+ margin-bottom: 1rem;
+}
+
+.velocity-stat {
+ text-align: center;
+ padding: 1rem;
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 10px;
+}
+
+.velocity-stat .stat-value {
+ display: block;
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--text-primary);
+}
+
+.velocity-stat .stat-label {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ text-transform: uppercase;
+}
+
+.velocity-stat.projected .stat-value {
+ color: var(--warning);
+}
+
+.velocity-progress {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+.progress-bar {
+ flex: 1;
+ height: 8px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.progress-fill {
+ height: 100%;
+ background: var(--primary-gradient);
+ border-radius: 4px;
+ transition: width 0.5s ease;
+}
+
+.progress-text {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ white-space: nowrap;
+}
+
+/* Category Chart Widget */
+.category-chart-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+}
+
+.category-chart-header h4 {
+ margin: 0;
+ font-size: 1rem;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.category-chart-header h4 i {
+ color: var(--accent-primary);
+}
+
+.total-amount {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.category-bars {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.category-bar-item {
+ display: grid;
+ grid-template-columns: 120px 1fr 100px;
+ align-items: center;
+ gap: 1rem;
+}
+
+.category-info {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.category-icon {
+ font-size: 1.1rem;
+}
+
+.category-name {
+ font-size: 0.9rem;
+ color: var(--text-primary);
+}
+
+.category-bar-wrapper {
+ height: 20px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 10px;
+ overflow: hidden;
+}
+
+.category-bar {
+ height: 100%;
+ border-radius: 10px;
+ transition: width 0.5s ease;
+}
+
+.category-stats {
+ text-align: right;
+}
+
+.category-amount {
+ display: block;
+ font-weight: 600;
+ color: var(--text-primary);
+ font-size: 0.9rem;
+}
+
+.category-percent {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+/* Trends Chart Widget */
+.trends-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+}
+
+.trends-header h4 {
+ margin: 0;
+ font-size: 1rem;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.trends-header h4 i {
+ color: var(--accent-primary);
+}
+
+.trends-legend {
+ display: flex;
+ gap: 1rem;
+}
+
+.legend-item {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+
+.legend-dot {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+}
+
+.legend-item.income .legend-dot {
+ background: var(--success);
+}
+
+.legend-item.expense .legend-dot {
+ background: var(--error);
+}
+
+.trends-chart-container {
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-between;
+ height: 150px;
+ padding: 0.5rem 0;
+ gap: 0.5rem;
+}
+
+.trend-bar-group {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.trend-bars {
+ display: flex;
+ align-items: flex-end;
+ gap: 4px;
+ height: 120px;
+}
+
+.trend-bar {
+ width: 20px;
+ border-radius: 5px 5px 0 0;
+ transition: all 0.3s ease;
+ cursor: pointer;
+ min-height: 4px;
+}
+
+.trend-bar.income {
+ background: var(--success);
+}
+
+.trend-bar.expense {
+ background: var(--error);
+}
+
+.trend-bar:hover {
+ opacity: 0.8;
+ transform: scaleY(1.02);
+}
+
+.trend-label {
+ font-size: 0.7rem;
+ color: var(--text-secondary);
+ text-align: center;
+}
+
+.trends-summary {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1rem;
+ margin-top: 1rem;
+ padding-top: 1rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.summary-item {
+ text-align: center;
+}
+
+.summary-label {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 0.25rem;
+}
+
+.summary-value {
+ font-weight: 600;
+ font-size: 0.9rem;
+}
+
+.summary-value.expense {
+ color: var(--error);
+}
+
+.summary-value.positive {
+ color: var(--success);
+}
+
+.summary-value.negative {
+ color: var(--error);
+}
+
+/* Predictions Widget */
+.predictions-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+}
+
+.predictions-header h4 {
+ margin: 0;
+ font-size: 1rem;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.predictions-header h4 i {
+ color: var(--accent-primary);
+}
+
+.confidence-badge {
+ font-size: 0.75rem;
+ padding: 0.25rem 0.75rem;
+ background: rgba(100, 255, 218, 0.2);
+ color: var(--accent-primary);
+ border-radius: 20px;
+}
+
+.prediction-main {
+ text-align: center;
+ padding: 1.5rem;
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 15px;
+ margin-bottom: 1rem;
+}
+
+.prediction-label {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.prediction-value {
+ display: block;
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--text-primary);
+ margin-bottom: 0.5rem;
+}
+
+.prediction-trend {
+ font-size: 0.9rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+}
+
+.prediction-trend.positive {
+ color: var(--success);
+}
+
+.prediction-trend.negative {
+ color: var(--error);
+}
+
+.prediction-details {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 0.5rem;
+}
+
+.detail-item {
+ text-align: center;
+ padding: 0.5rem;
+}
+
+.detail-label {
+ display: block;
+ font-size: 0.7rem;
+ color: var(--text-secondary);
+ margin-bottom: 0.25rem;
+}
+
+.detail-value {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+/* Insights Widget */
+.insights-widget {
+ grid-column: span 2;
+}
+
+.insights-header {
+ margin-bottom: 1rem;
+}
+
+.insights-header h4 {
+ margin: 0;
+ font-size: 1rem;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.insights-header h4 i {
+ color: #ffc107;
+}
+
+.insights-list {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 1rem;
+}
+
+.insight-card {
+ display: flex;
+ gap: 1rem;
+ padding: 1rem;
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 12px;
+ border-left: 4px solid var(--accent-primary);
+}
+
+.insight-card.success {
+ border-left-color: var(--success);
+}
+
+.insight-card.warning {
+ border-left-color: var(--warning);
+}
+
+.insight-card.danger {
+ border-left-color: var(--error);
+}
+
+.insight-icon {
+ width: 40px;
+ height: 40px;
+ border-radius: 10px;
+ background: rgba(100, 255, 218, 0.2);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.insight-card.success .insight-icon {
+ background: rgba(0, 230, 118, 0.2);
+ color: var(--success);
+}
+
+.insight-card.warning .insight-icon {
+ background: rgba(255, 193, 7, 0.2);
+ color: var(--warning);
+}
+
+.insight-card.danger .insight-icon {
+ background: rgba(255, 87, 34, 0.2);
+ color: var(--error);
+}
+
+.insight-icon i {
+ color: var(--accent-primary);
+}
+
+.insight-content h5 {
+ margin: 0 0 0.5rem 0;
+ font-size: 0.9rem;
+ color: var(--text-primary);
+}
+
+.insight-content p {
+ margin: 0;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.4;
+}
+
+.insight-suggestion {
+ display: block;
+ margin-top: 0.5rem;
+ font-size: 0.8rem;
+ color: var(--accent-primary);
+ font-style: italic;
+}
+
+/* Responsive Analytics */
+@media (max-width: 768px) {
+ .analytics-dashboard {
+ padding: 1.5rem;
+ }
+
+ .analytics-header {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 1rem;
+ }
+
+ .refresh-analytics-btn {
+ width: 100%;
+ justify-content: center;
+ }
+
+ .analytics-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .velocity-widget,
+ .insights-widget {
+ grid-column: span 1;
+ }
+
+ .velocity-stats {
+ grid-template-columns: 1fr;
+ }
+
+ .category-bar-item {
+ grid-template-columns: 1fr;
+ gap: 0.5rem;
+ }
+
+ .category-stats {
+ text-align: left;
+ display: flex;
+ gap: 1rem;
+ }
+
+ .trends-chart-container {
+ height: 120px;
+ }
+
+ .trend-bar {
+ width: 15px;
+ }
+
+ .trends-summary {
+ grid-template-columns: 1fr;
+ gap: 0.5rem;
+ }
+
+ .prediction-details {
+ grid-template-columns: 1fr;
+ }
+
+ .insights-list {
+ grid-template-columns: 1fr;
+ }
+}
+
+/*
+ CURRENCY SUPPORT STYLES
+
+ */
+
+/* Currency Button in Navbar */
+.currency-btn {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.5rem 1rem;
+ background: rgba(100, 255, 218, 0.1);
+ border: 1px solid rgba(100, 255, 218, 0.3);
+ border-radius: 8px;
+ color: var(--accent-primary);
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ margin-right: 1rem;
+}
+
+.currency-btn:hover {
+ background: rgba(100, 255, 218, 0.2);
+ border-color: var(--accent-primary);
+ transform: translateY(-2px);
+}
+
+.currency-btn i {
+ font-size: 1rem;
+}
+
+/* Currency Modal */
+.modal {
+ display: none;
+ position: fixed;
+ z-index: 2000;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.8);
+ backdrop-filter: blur(10px);
+ align-items: center;
+ justify-content: center;
+}
+
+.modal-content {
+ background: var(--bg-secondary);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 16px;
+ max-width: 500px;
+ width: 90%;
+ max-height: 90vh;
+ overflow-y: auto;
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
+ animation: modalSlideIn 0.3s ease;
+}
+
+@keyframes modalSlideIn {
+ from {
+ opacity: 0;
+ transform: translateY(-30px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.modal-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1.5rem;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.modal-header h3 {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ color: var(--accent-primary);
+ font-size: 1.25rem;
+}
+
+.close-modal {
+ font-size: 2rem;
+ color: var(--text-secondary);
+ cursor: pointer;
+ transition: color 0.3s ease;
+ line-height: 1;
+}
+
+.close-modal:hover {
+ color: var(--error);
+}
+
+.modal-body {
+ padding: 1.5rem;
+}
+
+.modal-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 1rem;
+ padding: 1.5rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+/* Currency Select Styling */
+.currency-select {
+ width: 100%;
+ padding: 0.75rem;
+ background: var(--bg-tertiary);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 8px;
+ color: var(--text-primary);
+ font-size: 1rem;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.currency-select:focus {
+ outline: none;
+ border-color: var(--accent-primary);
+ box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+}
+
+.currency-select option {
+ background: var(--bg-secondary);
+ color: var(--text-primary);
+ padding: 0.5rem;
+}
+
+/* Exchange Rate Info Display */
+.exchange-rate-info {
+ background: var(--bg-tertiary);
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 0.5rem;
+}
+
+.rate-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+ margin-bottom: 1rem;
+}
+
+.rate-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0.5rem;
+ background: rgba(100, 255, 218, 0.05);
+ border-radius: 6px;
+ border-left: 3px solid var(--accent-primary);
+}
+
+.rate-currency {
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.rate-value {
+ font-family: "Courier New", monospace;
+ color: var(--accent-primary);
+ font-weight: 600;
+}
+
+.exchange-rate-info small {
+ display: block;
+ color: var(--text-secondary);
+ font-size: 0.875rem;
+ margin-top: 0.5rem;
+}
+
+/* Modal Buttons */
+.btn-cancel {
+ padding: 0.75rem 1.5rem;
+ background: transparent;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 8px;
+ color: var(--text-secondary);
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.btn-cancel:hover {
+ background: rgba(255, 255, 255, 0.05);
+ border-color: rgba(255, 255, 255, 0.3);
+ color: var(--text-primary);
+}
+
+/* Currency Badge in Transaction List */
+.transaction-currency {
+ display: inline-block;
+ padding: 0.25rem 0.5rem;
+ background: rgba(100, 255, 218, 0.1);
+ border-radius: 4px;
+ font-size: 0.75rem;
+ color: var(--accent-primary);
+ font-weight: 600;
+ margin-left: 0.5rem;
+}
+
+/*
+ AI CATEGORIZATION STYLES
+ */
+
+/* Description input wrapper */
+.description-input-wrapper {
+ position: relative;
+ width: 100%;
+}
+
+/* Category suggestions dropdown */
+.category-suggestions {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ background: var(--bg-secondary);
+ border: 1px solid var(--accent-primary);
+ border-radius: 8px;
+ margin-top: 0.5rem;
+ box-shadow: var(--shadow-glass);
+ z-index: 1000;
+ max-height: 300px;
+ overflow-y: auto;
+ opacity: 0;
+ transform: translateY(-10px);
+ transition: all 0.3s ease;
+}
+
+.category-suggestions.visible {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.category-suggestions.hidden {
+ display: none;
+}
+
+/* Suggestion header */
+.suggestions-header {
+ padding: 0.75rem 1rem;
+ border-bottom: 1px solid rgba(100, 255, 218, 0.2);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.suggestions-header i {
+ color: var(--accent-primary);
+ animation: pulse 2s infinite;
+}
+
+.suggestions-header span {
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+ font-weight: 600;
+}
+
+@keyframes pulse {
+ 0%,
+ 100% {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0.5;
+ }
+}
+
+/* Suggestion item */
+.suggestion-item {
+ padding: 0.875rem 1rem;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ transition: all 0.2s ease;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+}
+
+.suggestion-item:last-child {
+ border-bottom: none;
+}
+
+.suggestion-item:hover {
+ background: rgba(100, 255, 218, 0.1);
+ transform: translateX(5px);
+}
+
+.suggestion-item.primary {
+ background: linear-gradient(
+ 135deg,
+ rgba(100, 255, 218, 0.15),
+ rgba(100, 255, 218, 0.05)
+ );
+}
+
+.suggestion-content {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ flex: 1;
+}
+
+.suggestion-category {
+ font-weight: 600;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.suggestion-category-icon {
+ font-size: 1.2rem;
+}
+
+.suggestion-reason {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+}
+
+.suggestion-reason i {
+ font-size: 0.7rem;
+ color: var(--accent-primary);
+}
+
+/* Confidence badge */
+.confidence-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.25rem;
+ padding: 0.25rem 0.5rem;
+ border-radius: 12px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ background: linear-gradient(
+ 135deg,
+ rgba(100, 255, 218, 0.2),
+ rgba(100, 255, 218, 0.1)
+ );
+ color: var(--accent-primary);
+ margin-left: 0.5rem;
+}
+
+.confidence-badge.hidden {
+ display: none;
+}
+
+.confidence-badge i {
+ font-size: 0.7rem;
+}
+
+/* Confidence bar in suggestion */
+.suggestion-confidence {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 0.25rem;
+ min-width: 60px;
+}
+
+.confidence-value {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: var(--accent-primary);
+}
+
+.confidence-bar {
+ width: 50px;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+.confidence-fill {
+ height: 100%;
+ background: linear-gradient(90deg, var(--accent-primary), var(--success));
+ transition: width 0.3s ease;
+}
+
+/* Confidence levels - different colors */
+.confidence-high .confidence-fill {
+ background: linear-gradient(90deg, #00e676, #00c853);
+}
+
+.confidence-medium .confidence-fill {
+ background: linear-gradient(90deg, #ffc107, #ff9800);
+}
+
+.confidence-low .confidence-fill {
+ background: linear-gradient(90deg, #ff5722, #f44336);
+}
+
+/* Loading state */
+.suggestions-loading {
+ padding: 1rem;
+ text-align: center;
+ color: var(--text-secondary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+}
+
+.suggestions-loading i {
+ animation: spin 1s linear infinite;
+}
+
+/* ULTRA SMALL DEVICES (320px)*/
+@media (max-width: 360px) {
+ /* Global */
+ html,
+ body {
+ overflow-x: hidden;
+ }
+
+ body {
+ font-size: 14px;
+ }
+
+ .container {
+ padding: 0.75rem;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ /* Navbar */
+ .nav-logo span {
+ font-size: 0.9rem;
+ }
+
+ .nav-toggle .bar {
+ width: 22px;
+ height: 2.5px;
+ }
+
+ /* Hero */
+ .hero-title {
+ font-size: 1.4rem;
+ line-height: 1.3;
+ }
+
+ .hero-subtitle {
+ font-size: 0.85rem;
+ }
+
+ /* Balance */
+ .balance-card {
+ padding: 1rem;
+ }
+
+ .balance-amount {
+ font-size: 1.5rem;
+ }
+
+ /* Income / Expense cards */
+ .income-card,
+ .expense-card {
+ padding: 0.75rem;
+ }
+
+ /* Filters */
+ .search-input,
+ .category-select,
+ .date-input,
+ .amount-input,
+ .filter-btn,
+ .clear-filters-btn {
+ width: 100%;
+ min-width: 0;
+ font-size: 0.85rem;
+ }
+
+ .filter-buttons {
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ }
+
+ /* Transaction list */
+ .list li {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.25rem;
+ }
+
+ /* Form */
+ .transaction-form {
+ padding: 1rem;
+ }
+
+ .transaction-form input,
+ .transaction-form select,
+ .btn-submit {
+ font-size: 0.9rem;
+ }
+
+ /* Footer */
+ .footer-section h4 {
+ font-size: 1rem;
+ }
+
+ .footer-links a {
+ font-size: 0.85rem;
+ }
+
+ .nav-container {
+ padding: 0 0.75rem;
+ }
+
+ .nav-logo span {
+ font-size: 0.85rem;
+ }
+}
+
+input,
+select,
+button {
+ max-width: 100%;
+ min-width: 0;
+}
+
+/*
+ EXPORT MODAL STYLES
+ */
+
+.export-btn.pdf-btn {
+ background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%);
+}
+
+.export-btn.pdf-btn:hover {
+ box-shadow: 0 8px 25px rgba(255, 107, 107, 0.3);
+}
+
+.export-btn.advanced-btn {
+ background: var(--primary-gradient);
+}
+
+.export-btn.advanced-btn:hover {
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
+}
+
+/* Export Modal */
+.export-modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.8);
+ backdrop-filter: blur(10px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2000;
+ opacity: 0;
+ visibility: hidden;
+ transition: all 0.3s ease;
+}
+
+.export-modal.active {
+ opacity: 1;
+ visibility: visible;
+}
+
+.export-modal-content {
+ background: var(--bg-secondary);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ width: 90%;
+ max-width: 650px;
+ max-height: 90vh;
+ overflow-y: auto;
+ transform: translateY(-20px);
+ transition: all 0.3s ease;
+}
+
+.export-modal.active .export-modal-content {
+ transform: translateY(0);
+}
+
+.export-modal-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1.5rem 2rem;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.export-modal-header h3 {
+ margin: 0;
+ font-size: 1.3rem;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.export-modal-header h3 i {
+ color: var(--accent-primary);
+}
+
+.export-modal-body {
+ padding: 2rem;
}
-.footer-bottom {
- border-top: 1px solid rgba(255, 255, 255, 0.1);
- margin-top: 2rem;
- padding-top: 1rem;
+.export-format-section,
+.export-filters-section,
+.export-preview-section {
+ margin-bottom: 2rem;
}
-.footer-bottom .footer-container {
- display: flex;
- justify-content: space-between;
- align-items: center;
- flex-wrap: wrap;
+.export-format-section h4,
+.export-filters-section h4,
+.export-preview-section h4 {
+ font-size: 1rem;
+ color: var(--text-primary);
+ margin-bottom: 1rem;
+ font-weight: 600;
+}
+
+/* Format Options */
+.format-options {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
gap: 1rem;
- grid-template-columns: 1fr;
}
-.footer-bottom p {
- color: var(--text-secondary);
- font-size: 0.9rem;
+.format-option {
+ cursor: pointer;
}
-.footer-stats {
- display: flex;
- gap: 1rem;
- flex-wrap: wrap;
+.format-option input {
+ display: none;
}
-.footer-stats span {
- font-size: 0.8rem;
- color: var(--text-secondary);
+.format-card {
background: rgba(255, 255, 255, 0.05);
- padding: 0.25rem 0.75rem;
+ border: 2px solid rgba(255, 255, 255, 0.1);
border-radius: 15px;
+ padding: 1.5rem;
+ text-align: center;
+ transition: all 0.3s ease;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.5rem;
}
-/* Animations */
-@keyframes fadeInUp {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
+.format-option input:checked + .format-card {
+ border-color: var(--accent-primary);
+ background: rgba(100, 255, 218, 0.1);
+}
- to {
- opacity: 1;
- transform: translateY(0);
- }
+.format-card i {
+ font-size: 2.5rem;
+ color: var(--accent-primary);
+ margin-bottom: 0.5rem;
}
-@keyframes slideInLeft {
- from {
- opacity: 0;
- transform: translateX(-20px);
- }
+.format-card .format-name {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--text-primary);
+}
- to {
- opacity: 1;
- transform: translateX(0);
- }
+.format-card .format-desc {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
}
-@keyframes pulse {
+.format-card:hover {
+ background: rgba(255, 255, 255, 0.08);
+ transform: translateY(-2px);
+}
- 0%,
- 100% {
- transform: scale(1);
- }
+/* Filter Grid */
+.filter-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 1rem;
+}
- 50% {
- transform: scale(1.05);
- }
+/* Export Preview */
+.export-preview {
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 15px;
+ padding: 1.5rem;
+ border: 1px solid rgba(255, 255, 255, 0.1);
}
-/* Transaction Display Improvements */
-.transaction-content {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
- flex: 1;
+.export-preview-stats {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+ gap: 1rem;
}
-.transaction-main {
- display: flex;
- justify-content: space-between;
- align-items: center;
+.preview-stat {
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 10px;
+ padding: 1rem;
+ text-align: center;
}
-.transaction-text {
- font-weight: 500;
- color: var(--text-primary);
+.preview-stat .stat-label {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
}
-.transaction-amount {
- font-weight: 600;
+.preview-stat .stat-value {
+ display: block;
font-size: 1.1rem;
+ font-weight: 700;
+ color: var(--text-primary);
}
-.transaction-date {
- font-size: 0.8rem;
- color: var(--text-secondary);
- opacity: 0.7;
+.preview-stat.income .stat-value {
+ color: var(--success);
}
-.transaction-category {
- font-size: 0.8rem;
- color: var(--accent-primary);
- background: rgba(100, 255, 218, 0.1);
- padding: 0.2rem 0.6rem;
- border-radius: 15px;
- margin-top: 0.25rem;
- display: inline-block;
+.preview-stat.expense .stat-value {
+ color: var(--error);
}
-/* Balance Card States */
-.balance-card.positive .balance-amount {
+.preview-stat.positive .stat-value {
color: var(--success);
- text-shadow: 0 0 20px rgba(0, 230, 118, 0.3);
}
-.balance-card.negative .balance-amount {
+.preview-stat.negative .stat-value {
color: var(--error);
- text-shadow: 0 0 20px rgba(255, 87, 34, 0.3);
}
-.balance-card.neutral .balance-amount {
+.export-preview-loading,
+.export-preview-error,
+.export-preview-empty {
+ text-align: center;
+ padding: 2rem;
color: var(--text-secondary);
- text-shadow: none;
}
-/* Mobile Navigation */
-@media (max-width: 768px) {
- .nav-menu {
- position: fixed;
- top: 80px;
- left: -100%;
- width: 100%;
- height: calc(100vh - 80px);
- background: rgba(15, 15, 35, 0.95);
- backdrop-filter: blur(20px);
- flex-direction: column;
- justify-content: flex-start;
- align-items: center;
- padding: 2rem 0;
- transition: left 0.3s ease;
- }
+.export-preview-empty i {
+ font-size: 2rem;
+ margin-bottom: 0.5rem;
+ opacity: 0.5;
+}
- .nav-menu.active {
- left: 0;
- display: flex;
- }
+.export-preview-error {
+ color: var(--error);
+}
- .nav-link {
- font-size: 1.2rem;
- padding: 1rem 2rem;
- width: 80%;
- text-align: center;
- margin: 0.5rem 0;
- }
+/* Export Modal Footer */
+.export-modal-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 1rem;
+ padding: 1.5rem 2rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+}
- .nav-toggle {
- display: flex;
- }
+/* Export Notification */
+.export-notification {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ padding: 1rem 1.5rem;
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ z-index: 3000;
+ transform: translateX(120%);
+ transition: transform 0.3s ease;
+ font-weight: 500;
+}
- .nav-toggle.active .bar:nth-child(2) {
- opacity: 0;
- }
+.export-notification.show {
+ transform: translateX(0);
+}
- .nav-toggle.active .bar:nth-child(1) {
- transform: translateY(8px) rotate(45deg);
- }
+.export-notification.success {
+ background: linear-gradient(
+ 135deg,
+ rgba(0, 230, 118, 0.9) 0%,
+ rgba(0, 200, 83, 0.9) 100%
+ );
+ color: white;
+}
- .nav-toggle.active .bar:nth-child(3) {
- transform: translateY(-8px) rotate(-45deg);
- }
+.export-notification.error {
+ background: linear-gradient(
+ 135deg,
+ rgba(255, 87, 34, 0.9) 0%,
+ rgba(244, 67, 54, 0.9) 100%
+ );
+ color: white;
+}
- .user-profile {
- display: none;
- }
+.export-notification.info {
+ background: linear-gradient(
+ 135deg,
+ rgba(102, 126, 234, 0.9) 0%,
+ rgba(118, 75, 162, 0.9) 100%
+ );
+ color: white;
}
-/* Responsive Design */
+/* Responsive Export Modal */
@media (max-width: 768px) {
- .hero-title {
- font-size: 2.5rem;
+ .export-modal-content {
+ width: 95%;
+ max-height: 85vh;
}
- .container {
- padding: 0 1rem;
+ .export-modal-body {
+ padding: 1.5rem;
}
- .inc-exp-container {
+ .format-options {
grid-template-columns: 1fr;
}
- .form-row {
+ .filter-grid {
grid-template-columns: 1fr;
}
- .section-header {
+ .export-preview-stats {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .export-modal-footer {
flex-direction: column;
- align-items: stretch;
}
- .footer-bottom .footer-container {
+ .export-modal-footer button {
+ width: 100%;
+ }
+}
+
+@media (max-width: 480px) {
+ .export-preview-stats {
+ grid-template-columns: 1fr;
+ }
+
+ .export-buttons {
flex-direction: column;
- text-align: center;
+ gap: 0.5rem;
}
- .footer-stats {
+ .export-btn {
+ width: 100%;
justify-content: center;
}
}
-@media (max-width: 480px) {
- .hero-title {
- font-size: 2rem;
+/* Responsive Design for Currency Features */
+@media (max-width: 768px) {
+ .currency-btn {
+ padding: 0.4rem 0.75rem;
+ font-size: 0.875rem;
+ margin-right: 0.5rem;
}
- .balance-amount {
- font-size: 2rem;
+ .currency-btn span {
+ display: none;
}
- .income-card,
- .expense-card {
- flex-direction: column;
- text-align: center;
+ .modal-content {
+ width: 95%;
+ margin: 1rem;
}
- .card-icon {
- width: 50px;
- height: 50px;
+ .modal-header,
+ .modal-body,
+ .modal-footer {
+ padding: 1rem;
}
- .advanced-filters {
- flex-direction: column;
- align-items: stretch;
+ .rate-list {
+ gap: 0.5rem;
}
- .date-filters,
- .amount-filters {
- justify-content: stretch;
+ /* AI Categorization responsive */
+ .category-suggestions {
+ max-height: 250px;
}
- .date-input,
- .amount-input,
- .category-select {
- flex: 1;
+ .suggestion-item {
+ padding: 0.75rem;
}
- .data-actions {
- grid-template-columns: 1fr;
+ .suggestion-confidence {
+ min-width: 50px;
+ }
+
+ .confidence-bar {
+ width: 40px;
}
}
-/* PWA Install Prompt */
-.install-prompt {
- position: fixed;
- bottom: 20px;
- left: 20px;
- right: 20px;
- z-index: 10000;
- animation: slideInUp 0.3s ease-out;
+/*
+ WIDTH PRESERVATION FIX
+ (Keeps original layout)
+*/
+
+/* Ensure container width stays exactly the same */
+.container,
+.nav-container,
+.footer-container {
+ max-width: 1200px;
+ /* same as before */
+ margin-left: auto;
+ margin-right: auto;
}
-.install-prompt-content {
- background: rgba(15, 15, 35, 0.95);
- backdrop-filter: blur(20px);
- border-radius: 15px;
- border: 1px solid rgba(255, 255, 255, 0.2);
- padding: 1.5rem;
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
+/* Cards should NOT stretch wider */
+.balance-card,
+.history-section,
+.form-section,
+.data-management-section,
+.income-card,
+.expense-card {
+ width: 100%;
+ max-width: 100%;
}
-.install-prompt-header {
- display: flex;
- align-items: center;
- gap: 0.75rem;
- margin-bottom: 0.75rem;
+/* Grid spacing only – no width change */
+.container {
+ row-gap: 3.5rem;
}
-.install-prompt-header i {
- color: var(--accent-primary);
- font-size: 1.5rem;
+/* Income / Expense grid keeps original width */
+.inc-exp-container {
+ grid-template-columns: 1fr 1fr;
+ /* unchanged */
+ gap: 2.5rem;
}
-.install-prompt-header h3 {
- color: var(--text-primary);
- font-size: 1.1rem;
- font-weight: 600;
- margin: 0;
+/* Prevent accidental full-screen stretch */
+.main-content {
+ width: 100%;
+ overflow-x: hidden;
}
-.install-prompt p {
- color: var(--text-secondary);
- margin-bottom: 1rem;
- font-size: 0.9rem;
+/* Mobile stays stacked like before */
+@media (max-width: 768px) {
+ .inc-exp-container {
+ grid-template-columns: 1fr;
+ }
}
-.install-prompt-actions {
- display: flex;
- gap: 1rem;
+/*
+ REDUCED CARD SPACING
+ (Width & style preserved)
+ */
+
+/* Main container – smaller vertical gap */
+.main-content .container {
+ row-gap: 1.6rem !important;
}
-.install-btn {
- padding: 0.75rem 1.5rem;
- background: var(--primary-gradient);
- color: white;
- border: none;
- border-radius: 8px;
- font-size: 0.9rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- flex: 1;
- justify-content: center;
+/* Cards – subtle spacing only */
+.balance-card,
+.history-section,
+.form-section,
+.data-management-section {
+ margin-top: 0.6rem !important;
+ margin-bottom: 0.6rem !important;
}
-.install-btn:hover {
- transform: translateY(-1px);
- box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
+/* Income & Expense cards */
+.inc-exp-container {
+ gap: 1.2rem !important;
}
-.dismiss-btn {
- padding: 0.75rem 1.5rem;
- background: transparent;
- color: var(--text-secondary);
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 8px;
- font-size: 0.9rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- justify-content: center;
+/* Transaction list items */
+.list li {
+ margin-bottom: 0.6rem !important;
}
-.dismiss-btn:hover {
- background: rgba(255, 255, 255, 0.1);
- color: var(--text-primary);
+/* Footer spacing */
+.footer-container {
+ row-gap: 1.5rem !important;
}
-/* Offline Indicator */
-.offline-indicator {
- position: fixed;
- top: 80px;
- left: 50%;
- transform: translateX(-50%);
- background: rgba(255, 152, 0, 0.9);
- color: white;
- padding: 0.75rem 1.5rem;
- border-radius: 25px;
- font-size: 0.9rem;
- font-weight: 500;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- z-index: 9999;
- backdrop-filter: blur(10px);
- box-shadow: 0 4px 20px rgba(255, 152, 0, 0.3);
- animation: slideInDown 0.3s ease-out;
+/* Mobile refinement */
+@media (max-width: 768px) {
+ .main-content .container {
+ row-gap: 1.3rem !important;
+ }
}
+/*
+ Piggy Bank – PIN Card
+ */
-/* Update Notification */
-.update-notification {
- position: fixed;
- top: 20px;
- right: 20px;
- z-index: 10000;
- animation: slideInRight 0.3s ease-out;
+.piggy-bank-card {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 18px;
+ border: 1px solid rgba(100, 255, 218, 0.25);
+ padding: 1.6rem;
+ transition: all 0.35s ease;
}
-.update-content {
- background: rgba(76, 175, 80, 0.9);
- color: white;
- padding: 1rem 1.5rem;
- border-radius: 10px;
+.piggy-bank-card:hover {
+ transform: translateY(-4px);
+ box-shadow: 0 0 28px rgba(100, 255, 218, 0.35);
+}
+
+.piggy-bank-icon {
+ width: 60px;
+ height: 60px;
+ border-radius: 15px;
+ background: linear-gradient(135deg, #64ffda, #4facfe);
display: flex;
align-items: center;
- gap: 1rem;
- backdrop-filter: blur(10px);
- box-shadow: 0 4px 20px rgba(76, 175, 80, 0.3);
+ justify-content: center;
+ font-size: 1.8rem;
+ color: #0f0f23;
+ margin-bottom: 1rem;
}
-.update-btn {
- background: white;
- color: #4CAF50;
- border: none;
- padding: 0.5rem 1rem;
- border-radius: 5px;
- font-size: 0.9rem;
+.piggy-bank-title {
+ font-size: 1.1rem;
font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
}
-.update-btn:hover {
- transform: translateY(-1px);
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
+.piggy-bank-desc {
+ font-size: 0.85rem;
+ color: #b4b4b4;
+ margin-bottom: 0.75rem;
}
-/* Touch and gesture improvements */
-@media (hover: none) and (pointer: coarse) {
+.piggy-actions {
+ display: flex;
+ gap: 0.5rem;
+}
- /* Touch device specific styles */
- .filter-btn,
- .export-btn,
- .import-btn,
- .btn-submit {
- min-height: 44px;
- padding: 0.75rem 1.5rem;
- }
+.piggy-btn {
+ flex: 1;
+ padding: 0.5rem;
+ border-radius: 10px;
+ border: none;
+ cursor: pointer;
+ background: rgba(100, 255, 218, 0.15);
+ color: #64ffda;
+}
- .delete-btn {
- min-width: 44px;
- min-height: 44px;
- }
+.piggy-btn:hover {
+ background: rgba(100, 255, 218, 0.3);
+}
- .nav-link {
- padding: 1rem 1.5rem;
- }
+/* Piggy Modal */
+.piggy-modal {
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.55);
+ display: none;
+ align-items: center;
+ justify-content: center;
+ z-index: 999;
+}
- /* Larger tap targets for mobile */
- .category-select,
- .date-input,
- .amount-input,
- .search-input {
- min-height: 48px;
- font-size: 16px;
- /* Prevents zoom on iOS */
- }
+.piggy-modal.active {
+ display: flex;
+}
- .form-control input,
- .form-control select {
- min-height: 48px;
- font-size: 16px;
- }
+.piggy-modal-box {
+ background: #0f172a;
+ padding: 1.5rem;
+ border-radius: 16px;
+ width: 320px;
+ animation: pop 0.3s ease;
}
-/* Animations */
-@keyframes slideInUp {
+@keyframes pop {
from {
- transform: translateY(100%);
+ transform: scale(0.8);
opacity: 0;
}
-
to {
- transform: translateY(0);
+ transform: scale(1);
opacity: 1;
}
}
-@keyframes slideInDown {
- from {
- transform: translateX(-50%) translateY(-100%);
- opacity: 0;
- }
+.piggy-modal-box h3 {
+ margin-bottom: 1rem;
+}
- to {
- transform: translateX(-50%) translateY(0);
- opacity: 1;
- }
+.piggy-modal-box input {
+ width: 100%;
+ padding: 0.6rem;
+ border-radius: 8px;
+ border: none;
+ outline: none;
+ margin-bottom: 1rem;
}
-@keyframes slideInRight {
+.piggy-modal-actions {
+ display: flex;
+ gap: 0.5rem;
+ justify-content: flex-end;
+}
+
+/*
+ RECURRING EXPENSES MODAL
+ */
+
+/* Recurring Modal Overlay */
+.recurring-modal {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(15, 15, 35, 0.85);
+ backdrop-filter: blur(8px);
+ z-index: 2000;
+ align-items: center;
+ justify-content: center;
+ animation: fadeIn 0.3s ease;
+}
+
+.recurring-modal.active {
+ display: flex;
+}
+
+/* Modal Content Container */
+.recurring-modal-content {
+ background: linear-gradient(
+ 135deg,
+ rgba(26, 26, 46, 0.98) 0%,
+ rgba(22, 33, 62, 0.98) 100%
+ );
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(100, 255, 218, 0.2);
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
+ width: 90%;
+ max-width: 700px;
+ max-height: 90vh;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ animation: slideUp 0.4s ease;
+}
+
+@keyframes slideUp {
from {
- transform: translateX(100%);
opacity: 0;
+ transform: translateY(50px);
}
to {
- transform: translateX(0);
opacity: 1;
+ transform: translateY(0);
}
}
-/* Safe area insets for devices with notches */
-@supports (padding: max(0px)) {
- .header {
- padding-left: max(0px, env(safe-area-inset-left));
- padding-right: max(0px, env(safe-area-inset-right));
- }
+/* Modal Header */
+.recurring-modal-header {
+ padding: 1.75rem 2rem;
+ background: rgba(255, 255, 255, 0.03);
+ border-bottom: 1px solid rgba(100, 255, 218, 0.15);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
- .main-content {
- padding-left: max(2rem, env(safe-area-inset-left) + 2rem);
- padding-right: max(2rem, env(safe-area-inset-right) + 2rem);
- padding-bottom: max(2rem, env(safe-area-inset-bottom) + 2rem);
- }
+.recurring-modal-header h3 {
+ margin: 0;
+ font-size: 1.4rem;
+ font-weight: 600;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
- .install-prompt {
- bottom: max(20px, env(safe-area-inset-bottom) + 20px);
- left: max(20px, env(safe-area-inset-left) + 20px);
- right: max(20px, env(safe-area-inset-right) + 20px);
- }
+.recurring-modal-header h3::before {
+ content: "🔄";
+ font-size: 1.5rem;
}
- | |
-1468
-
-.empty-state {
- list-style: none;
+/* Modal Close Button */
+.modal-close-btn {
+ width: 36px;
+ height: 36px;
+ border-radius: 8px;
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ color: var(--text-secondary);
+ cursor: pointer;
+ transition: all 0.3s ease;
display: flex;
+ align-items: center;
justify-content: center;
+ font-size: 1.1rem;
}
-
-.empty-state-content {
- text-align: center;
- padding: 2.5rem 1.5rem;
- border: 1px dashed rgba(100, 255, 218, 0.4);
- border-radius: 12px;
- background: rgba(100, 255, 218, 0.05);
+.modal-close-btn:hover {
+ background: rgba(255, 87, 34, 0.2);
+ color: var(--error);
+ border-color: rgba(255, 87, 34, 0.3);
+ transform: rotate(90deg);
}
-/* ULTRA SMALL DEVICES (320px)*/
-@media (max-width: 360px) {
-
- /* Global */
- html,
- body {
- overflow-x: hidden;
- }
+/* Recurring Form */
+.recurring-form {
+ padding: 2rem;
+ overflow-y: auto;
+ max-height: calc(90vh - 160px);
+}
- body {
- font-size: 14px;
- }
+.recurring-form::-webkit-scrollbar {
+ width: 8px;
+}
- .container {
- padding: 0.75rem;
- margin-left: auto;
- margin-right: auto;
- }
+.recurring-form::-webkit-scrollbar-track {
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 10px;
+}
- /* Navbar */
- .nav-logo span {
- font-size: 0.9rem;
- }
+.recurring-form::-webkit-scrollbar-thumb {
+ background: var(--accent-primary);
+ border-radius: 10px;
+}
- .nav-toggle .bar {
- width: 22px;
- height: 2.5px;
- }
+.recurring-form .form-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 1.25rem;
+ margin-bottom: 1.25rem;
+}
- /* Hero */
- .hero-title {
- font-size: 1.4rem;
- line-height: 1.3;
- }
+.recurring-form .form-control {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
- .hero-subtitle {
- font-size: 0.85rem;
- }
+.recurring-form .form-control label {
+ color: var(--text-secondary);
+ font-weight: 500;
+ font-size: 0.85rem;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
- /* Balance */
- .balance-card {
- padding: 1rem;
- }
+.recurring-form .form-control input,
+.recurring-form .form-control select,
+.recurring-form .form-control textarea {
+ padding: 0.875rem 1rem;
+ border: 1px solid rgba(100, 255, 218, 0.2);
+ border-radius: 10px;
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(10px);
+ color: var(--text-primary);
+ font-size: 0.95rem;
+ transition: all 0.3s ease;
+ font-family: inherit;
+}
- .balance-amount {
- font-size: 1.5rem;
- }
+.recurring-form .form-control input:focus,
+.recurring-form .form-control select:focus,
+.recurring-form .form-control textarea:focus {
+ outline: none;
+ border-color: var(--accent-primary);
+ background: rgba(100, 255, 218, 0.08);
+ box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
+}
- /* Income / Expense cards */
- .income-card,
- .expense-card {
- padding: 0.75rem;
- }
+.recurring-form .form-control input::placeholder,
+.recurring-form .form-control textarea::placeholder {
+ color: var(--text-secondary);
+ opacity: 0.6;
+}
- /* Filters */
- .search-input,
- .category-select,
- .date-input,
- .amount-input,
- .filter-btn,
- .clear-filters-btn {
- width: 100%;
- min-width: 0;
- font-size: 0.85rem;
- }
+.recurring-form .form-control select option {
+ background: var(--bg-secondary);
+ color: var(--text-primary);
+ padding: 0.5rem;
+}
- .filter-buttons {
- flex-wrap: wrap;
- gap: 0.5rem;
- }
+.recurring-form .form-control textarea {
+ resize: vertical;
+ min-height: 80px;
+}
- /* Transaction list */
- .list li {
- flex-direction: column;
- align-items: flex-start;
- gap: 0.25rem;
- }
+/* Checkbox Control */
+.recurring-form .checkbox-control {
+ display: flex;
+ align-items: center;
+ padding-top: 1.5rem;
+}
- /* Form */
- .transaction-form {
- padding: 1rem;
- }
+.recurring-form .checkbox-control .checkbox-label {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ color: var(--text-secondary);
+ font-size: 0.95rem;
+ cursor: pointer;
+ user-select: none;
+}
- .transaction-form input,
- .transaction-form select,
- .btn-submit {
- font-size: 0.9rem;
- }
+.recurring-form .checkbox-control input[type="checkbox"] {
+ width: 20px;
+ height: 20px;
+ cursor: pointer;
+ accent-color: var(--accent-primary);
+ border-radius: 4px;
+}
- /* Footer */
- .footer-section h4 {
- font-size: 1rem;
- }
+.recurring-form .full-width {
+ grid-column: 1 / -1;
+}
- .footer-links a {
- font-size: 0.85rem;
- }
+/* Modal Actions */
+.modal-actions {
+ display: flex;
+ gap: 1rem;
+ padding-top: 1.5rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+ margin-top: 1rem;
+}
- .nav-container {
- padding: 0 0.75rem;
- }
+.btn-cancel {
+ flex: 1;
+ padding: 0.875rem 1.5rem;
+ background: rgba(255, 255, 255, 0.05);
+ color: var(--text-secondary);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 10px;
+ font-size: 0.95rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
- .nav-logo span {
- font-size: 0.85rem;
- }
+.btn-cancel:hover {
+ background: rgba(255, 255, 255, 0.1);
+ border-color: rgba(255, 255, 255, 0.3);
+ transform: translateY(-2px);
}
-input,
-select,
-button {
- max-width: 100%;
- min-width: 0;
+.btn-submit {
+ flex: 1;
+ padding: 0.875rem 1.5rem;
+ background: var(--primary-gradient);
+ color: white;
+ border: none;
+ border-radius: 10px;
+ font-size: 0.95rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
}
-/* ========================
- ANALYTICS DASHBOARD STYLES
- ======================== */
+.btn-submit:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
+}
-.analytics-dashboard {
+.btn-submit:active {
+ transform: translateY(0);
+}
+
+/* Recurring Section Styles */
+.recurring-section {
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(20px);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 2rem;
box-shadow: var(--shadow-glass);
- margin-bottom: 2rem;
- animation: fadeInUp 1s ease-out 0.7s both;
+ animation: fadeInUp 1s ease-out 1.2s both;
}
-.analytics-header {
+/* Section Header with Button */
+.recurring-section .section-header {
display: flex;
justify-content: space-between;
align-items: center;
- margin-bottom: 2rem;
+ margin-bottom: 1.5rem;
+ gap: 1rem;
+ flex-wrap: wrap;
}
-.analytics-header h3 {
- margin: 0;
- font-size: 1.3rem;
+.recurring-section .section-header h3 {
color: var(--text-primary);
+ font-size: 1.3rem;
+ font-weight: 600;
display: flex;
align-items: center;
- gap: 0.75rem;
+ gap: 0.5rem;
+ margin: 0;
+ padding: 0;
+ border: none;
}
-.analytics-header h3 i {
+.recurring-section .section-header h3 i {
color: var(--accent-primary);
+ font-size: 1.5rem;
}
-.refresh-analytics-btn {
- padding: 0.5rem 1rem;
- background: rgba(255, 255, 255, 0.1);
- border: 1px solid rgba(255, 255, 255, 0.2);
- color: var(--text-secondary);
+/* Add Recurring Button */
+.add-recurring-btn {
+ padding: 0.75rem 1.5rem;
+ background: var(--primary-gradient);
+ color: white;
+ border: none;
border-radius: 10px;
cursor: pointer;
+ font-size: 0.95rem;
+ font-weight: 600;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 0.5rem;
+ white-space: nowrap;
}
-.refresh-analytics-btn:hover {
- background: var(--accent-primary);
- color: var(--bg-primary);
- border-color: var(--accent-primary);
+.add-recurring-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
}
-.analytics-grid {
+.add-recurring-btn:active {
+ transform: translateY(0);
+}
+
+/* Recurring Statistics Container */
+.recurring-stats {
display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 1.5rem;
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 1rem;
+ margin-bottom: 2rem;
}
-.analytics-widget {
+/* Individual Stat Card */
+.recurring-stat-card {
background: rgba(255, 255, 255, 0.05);
- border-radius: 15px;
- padding: 1.5rem;
border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 15px;
+ padding: 1.25rem;
+ display: flex;
+ align-items: center;
+ gap: 1rem;
transition: all 0.3s ease;
}
-.analytics-widget:hover {
+.recurring-stat-card:hover {
transform: translateY(-3px);
- background: rgba(255, 255, 255, 0.08);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
+ border-color: rgba(100, 255, 218, 0.3);
}
-.widget-loading {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 2rem;
- color: var(--text-secondary);
- gap: 0.5rem;
+.recurring-stat-card.expense {
+ border-left: 3px solid var(--error);
}
-.widget-loading i {
- font-size: 1.5rem;
- color: var(--accent-primary);
+.recurring-stat-card.income {
+ border-left: 3px solid var(--success);
}
-.no-data {
- text-align: center;
- padding: 2rem;
- color: var(--text-secondary);
+.recurring-stat-card.positive {
+ border-left: 3px solid var(--success);
}
-/* Velocity Widget */
-.velocity-widget {
- grid-column: span 2;
+.recurring-stat-card.negative {
+ border-left: 3px solid var(--error);
}
-.velocity-header {
+.stat-icon {
+ font-size: 1.75rem;
+ color: var(--accent-primary);
display: flex;
- justify-content: space-between;
align-items: center;
- margin-bottom: 1rem;
+ justify-content: center;
+ width: 45px;
+ height: 45px;
+ background: rgba(100, 255, 218, 0.1);
+ border-radius: 10px;
+ flex-shrink: 0;
}
-.velocity-header h4 {
- margin: 0;
- font-size: 1rem;
- color: var(--text-primary);
+.recurring-stat-card.expense .stat-icon {
+ color: var(--error);
+ background: rgba(255, 87, 34, 0.1);
+}
+
+.recurring-stat-card.income .stat-icon {
+ color: var(--success);
+ background: rgba(0, 230, 118, 0.1);
+}
+
+.stat-content {
display: flex;
- align-items: center;
- gap: 0.5rem;
+ flex-direction: column;
+ gap: 0.25rem;
}
-.velocity-header h4 i {
- color: var(--accent-primary);
+.stat-value {
+ font-size: 1.2rem;
+ font-weight: 700;
+ color: var(--text-primary);
}
-.velocity-date {
- font-size: 0.85rem;
- color: var(--text-secondary);
+.recurring-stat-card.expense .stat-value {
+ color: var(--error);
}
-.velocity-stats {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 1rem;
- margin-bottom: 1rem;
+.recurring-stat-card.income .stat-value {
+ color: var(--success);
}
-.velocity-stat {
- text-align: center;
- padding: 1rem;
- background: rgba(255, 255, 255, 0.05);
- border-radius: 10px;
+.recurring-stat-card.positive .stat-value {
+ color: var(--success);
}
-.velocity-stat .stat-value {
- display: block;
- font-size: 1.5rem;
- font-weight: 700;
- color: var(--text-primary);
+.recurring-stat-card.negative .stat-value {
+ color: var(--error);
}
-.velocity-stat .stat-label {
- font-size: 0.75rem;
+.stat-label {
+ font-size: 0.8rem;
color: var(--text-secondary);
text-transform: uppercase;
+ letter-spacing: 0.5px;
+ font-weight: 500;
+}
+
+/* Recurring List Container */
+.recurring-list {
+ display: flex;
+ flex-direction: column;
+ gap: 1.25rem;
+}
+
+/* Empty State */
+.recurring-empty {
+ text-align: center;
+ padding: 3rem 2rem;
+ background: rgba(100, 255, 218, 0.05);
+ border: 2px dashed rgba(100, 255, 218, 0.3);
+ border-radius: 15px;
+ color: var(--text-secondary);
+}
+
+.recurring-empty i {
+ font-size: 3rem;
+ color: var(--accent-primary);
+ margin-bottom: 1rem;
+ opacity: 0.7;
}
-.velocity-stat.projected .stat-value {
- color: var(--warning);
+.recurring-empty p {
+ font-size: 1.1rem;
+ margin: 0.5rem 0;
+ color: var(--text-primary);
+ font-weight: 500;
}
-.velocity-progress {
+.recurring-empty small {
+ display: block;
+ margin-top: 0.5rem;
+ font-size: 0.9rem;
+ opacity: 0.8;
+}
+
+/* Individual Recurring Card */
+.recurring-card {
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 15px;
+ padding: 1.5rem;
+ transition: all 0.3s ease;
display: flex;
- align-items: center;
+ flex-direction: column;
gap: 1rem;
}
-.progress-bar {
- flex: 1;
- height: 8px;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 4px;
- overflow: hidden;
+.recurring-card:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
+ border-color: rgba(100, 255, 218, 0.3);
}
-.progress-fill {
- height: 100%;
- background: var(--primary-gradient);
- border-radius: 4px;
- transition: width 0.5s ease;
+.recurring-card.expense {
+ border-left: 3px solid var(--error);
}
-.progress-text {
- font-size: 0.85rem;
- color: var(--text-secondary);
- white-space: nowrap;
+.recurring-card.income {
+ border-left: 3px solid var(--success);
}
-/* Category Chart Widget */
-.category-chart-header {
+/* Card Header */
+.recurring-header {
display: flex;
justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
+ align-items: flex-start;
+ gap: 1rem;
}
-.category-chart-header h4 {
- margin: 0;
- font-size: 1rem;
- color: var(--text-primary);
+.recurring-icon {
+ font-size: 2rem;
+ width: 50px;
+ height: 50px;
display: flex;
align-items: center;
- gap: 0.5rem;
+ justify-content: center;
+ background: rgba(100, 255, 218, 0.1);
+ border-radius: 12px;
+ flex-shrink: 0;
}
-.category-chart-header h4 i {
- color: var(--accent-primary);
+.recurring-card.expense .recurring-icon {
+ background: rgba(255, 87, 34, 0.1);
+ color: var(--error);
}
-.total-amount {
- font-size: 0.85rem;
- color: var(--text-secondary);
+.recurring-card.income .recurring-icon {
+ background: rgba(0, 230, 118, 0.1);
+ color: var(--success);
}
-.category-bars {
- display: flex;
- flex-direction: column;
- gap: 0.75rem;
+/* Card Info */
+.recurring-info {
+ flex: 1;
+ min-width: 0;
}
-.category-bar-item {
- display: grid;
- grid-template-columns: 120px 1fr 100px;
- align-items: center;
- gap: 1rem;
+.recurring-info h4 {
+ margin: 0 0 0.25rem 0;
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--text-primary);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
-.category-info {
- display: flex;
- align-items: center;
- gap: 0.5rem;
+.recurring-category {
+ display: inline-block;
+ padding: 0.25rem 0.75rem;
+ background: rgba(100, 255, 218, 0.1);
+ border: 1px solid rgba(100, 255, 218, 0.3);
+ border-radius: 20px;
+ font-size: 0.75rem;
+ color: var(--accent-primary);
+ text-transform: uppercase;
+ font-weight: 600;
+ letter-spacing: 0.5px;
}
-.category-icon {
- font-size: 1.1rem;
+/* Card Amount */
+.recurring-amount {
+ font-size: 1.4rem;
+ font-weight: 700;
+ text-align: right;
+ white-space: nowrap;
}
-.category-name {
- font-size: 0.9rem;
- color: var(--text-primary);
+.recurring-card.expense .recurring-amount {
+ color: var(--error);
}
-.category-bar-wrapper {
- height: 20px;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 10px;
- overflow: hidden;
+.recurring-card.income .recurring-amount {
+ color: var(--success);
}
-.category-bar {
- height: 100%;
- border-radius: 10px;
- transition: width 0.5s ease;
+/* Card Details */
+.recurring-details {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+ gap: 0.75rem;
+ padding-top: 1rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
}
-.category-stats {
- text-align: right;
+.recurring-detail {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
}
-.category-amount {
- display: block;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.9rem;
+.recurring-detail-label {
+ font-size: 0.7rem;
+ color: var(--text-secondary);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ font-weight: 500;
}
-.category-percent {
- font-size: 0.75rem;
- color: var(--text-secondary);
+.recurring-detail-value {
+ font-size: 0.9rem;
+ color: var(--text-primary);
+ font-weight: 600;
}
-/* Trends Chart Widget */
-.trends-header {
+/* Card Actions */
+.recurring-actions {
display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
+ gap: 0.5rem;
+ padding-top: 1rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
}
-.trends-header h4 {
- margin: 0;
- font-size: 1rem;
+.recurring-actions button {
+ flex: 1;
+ padding: 0.65rem 1rem;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 8px;
+ background: rgba(255, 255, 255, 0.05);
color: var(--text-primary);
+ font-size: 0.85rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
display: flex;
align-items: center;
+ justify-content: center;
gap: 0.5rem;
}
-.trends-header h4 i {
- color: var(--accent-primary);
+.recurring-actions button:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
}
-.trends-legend {
- display: flex;
- gap: 1rem;
+.recurring-actions button.edit-btn {
+ border-color: rgba(102, 126, 234, 0.5);
+ background: rgba(102, 126, 234, 0.1);
+ color: var(--primary);
}
-.legend-item {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- font-size: 0.8rem;
- color: var(--text-secondary);
+.recurring-actions button.edit-btn:hover {
+ background: rgba(102, 126, 234, 0.2);
+ box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);
}
-.legend-dot {
- width: 10px;
- height: 10px;
- border-radius: 50%;
+.recurring-actions button.delete-btn {
+ border-color: rgba(255, 87, 34, 0.5);
+ background: rgba(255, 87, 34, 0.1);
+ color: var(--error);
}
-.legend-item.income .legend-dot {
- background: var(--success);
+.recurring-actions button.delete-btn:hover {
+ background: rgba(255, 87, 34, 0.2);
+ box-shadow: 0 5px 15px rgba(255, 87, 34, 0.3);
}
-.legend-item.expense .legend-dot {
- background: var(--error);
-}
+/* Responsive Recurring Modal */
+@media (max-width: 768px) {
+ .recurring-modal-content {
+ width: 95%;
+ max-height: 95vh;
+ }
-.trends-chart-container {
- display: flex;
- align-items: flex-end;
- justify-content: space-between;
- height: 150px;
- padding: 0.5rem 0;
- gap: 0.5rem;
+ .recurring-modal-header {
+ padding: 1.25rem 1.5rem;
+ }
+
+ .recurring-modal-header h3 {
+ font-size: 1.2rem;
+ }
+
+ .recurring-form {
+ padding: 1.5rem;
+ }
+
+ .recurring-form .form-row {
+ grid-template-columns: 1fr;
+ gap: 1rem;
+ margin-bottom: 1rem;
+ }
+
+ .modal-actions {
+ flex-direction: column;
+ }
+
+ .btn-cancel,
+ .btn-submit {
+ width: 100%;
+ }
+
+ /* Recurring Section Responsive */
+ .recurring-section {
+ padding: 1.5rem;
+ }
+
+ .recurring-section .section-header {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .add-recurring-btn {
+ width: 100%;
+ justify-content: center;
+ }
+
+ .recurring-stats {
+ grid-template-columns: 1fr;
+ gap: 0.75rem;
+ }
+
+ .recurring-card {
+ padding: 1.25rem;
+ }
+
+ .recurring-header {
+ flex-direction: column;
+ text-align: center;
+ margin-bottom: 1rem;
+ gap: 0.75rem;
+ }
+
+ .recurring-info {
+ order: 2;
+ }
+
+ .recurring-icon {
+ margin: 0 auto;
+ }
+
+ .recurring-amount {
+ text-align: center;
+ order: 1;
+ }
+
+ .recurring-details {
+ grid-template-columns: 1fr 1fr;
+ gap: 0.75rem;
+ }
+
+ .recurring-actions {
+ flex-direction: column;
+ }
+
+ .recurring-actions button {
+ width: 100%;
+ }
}
-.trend-bar-group {
- flex: 1;
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 0.5rem;
-}
+@media (max-width: 480px) {
+ .recurring-modal-content {
+ border-radius: 15px;
+ }
+
+ .recurring-modal-header {
+ padding: 1rem 1.25rem;
+ }
+
+ .recurring-form {
+ padding: 1.25rem;
+ }
+
+ .recurring-form .form-control input,
+ .recurring-form .form-control select,
+ .recurring-form .form-control textarea {
+ padding: 0.75rem 0.875rem;
+ font-size: 0.9rem;
+ }
+
+ /* Additional 480px Recurring Section Responsive */
+ .recurring-section {
+ padding: 1rem;
+ }
+
+ .recurring-section .section-header h3 {
+ font-size: 1.1rem;
+ }
+
+ .recurring-stats {
+ gap: 0.5rem;
+ }
+
+ .recurring-stat-card {
+ padding: 1rem;
+ gap: 0.75rem;
+ }
+
+ .stat-icon {
+ width: 40px;
+ height: 40px;
+ font-size: 1.5rem;
+ }
-.trend-bars {
- display: flex;
- align-items: flex-end;
- gap: 4px;
- height: 120px;
-}
+ .stat-value {
+ font-size: 1rem;
+ }
-.trend-bar {
- width: 20px;
- border-radius: 5px 5px 0 0;
- transition: all 0.3s ease;
- cursor: pointer;
- min-height: 4px;
-}
+ .stat-label {
+ font-size: 0.75rem;
+ }
-.trend-bar.income {
- background: var(--success);
-}
+ .recurring-card {
+ padding: 1rem;
+ }
-.trend-bar.expense {
- background: var(--error);
-}
+ .recurring-icon {
+ width: 45px;
+ height: 45px;
+ font-size: 1.75rem;
+ }
-.trend-bar:hover {
- opacity: 0.8;
- transform: scaleY(1.02);
-}
+ .recurring-info h4 {
+ font-size: 1rem;
+ }
-.trend-label {
- font-size: 0.7rem;
- color: var(--text-secondary);
- text-align: center;
-}
+ .recurring-amount {
+ font-size: 1.2rem;
+ }
-.trends-summary {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 1rem;
- margin-top: 1rem;
- padding-top: 1rem;
- border-top: 1px solid rgba(255, 255, 255, 0.1);
-}
+ .recurring-details {
+ grid-template-columns: 1fr;
+ gap: 0.5rem;
+ }
-.summary-item {
- text-align: center;
-}
+ .recurring-actions {
+ gap: 0.5rem;
+ }
-.summary-label {
- display: block;
- font-size: 0.75rem;
- color: var(--text-secondary);
- margin-bottom: 0.25rem;
+ .recurring-actions button {
+ padding: 0.5rem 0.75rem;
+ font-size: 0.8rem;
+ }
}
-.summary-value {
- font-weight: 600;
- font-size: 0.9rem;
+/* Finance Tips Layout Enhancements */
+.hero-section + .container {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
+ gap: 1.5rem;
+ align-items: stretch;
}
-.summary-value.expense {
- color: var(--error);
+.hero-section + .container .data-management-section {
+ grid-column: 1 / -1;
}
-.summary-value.positive {
- color: var(--success);
+.hero-section + .container .balance-card {
+ margin: 0;
}
-.summary-value.negative {
- color: var(--error);
+/* Budget Goals Dashboard */
+#budget-goals-dashboard {
+ max-width: 1200px;
+ margin: 6rem auto 3rem;
+ padding: 2.5rem;
+ background: rgba(255, 255, 255, 0.04);
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 24px;
+ box-shadow: var(--shadow-glass);
+ display: flex;
+ flex-direction: column;
+ gap: 1.75rem;
}
-/* Predictions Widget */
-.predictions-header {
+.dashboard-header {
display: flex;
justify-content: space-between;
align-items: center;
- margin-bottom: 1rem;
+ gap: 1rem;
+ flex-wrap: wrap;
}
-.predictions-header h4 {
+.dashboard-header h2 {
+ font-size: 2rem;
margin: 0;
- font-size: 1rem;
color: var(--text-primary);
+}
+
+.dashboard-actions {
display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+}
+
+.dashboard-actions button {
+ padding: 0.65rem 1.5rem;
+ border-radius: 999px;
+ border: none;
+ font-weight: 600;
+ letter-spacing: 0.5px;
+ cursor: pointer;
+ transition:
+ transform 0.25s ease,
+ box-shadow 0.25s ease;
+ display: inline-flex;
align-items: center;
gap: 0.5rem;
}
-.predictions-header h4 i {
- color: var(--accent-primary);
+.dashboard-actions button.btn-primary {
+ background: var(--primary-gradient);
+ color: white;
+ box-shadow: 0 10px 35px rgba(102, 126, 234, 0.35);
}
-.confidence-badge {
- font-size: 0.75rem;
- padding: 0.25rem 0.75rem;
- background: rgba(100, 255, 218, 0.2);
- color: var(--accent-primary);
- border-radius: 20px;
+.dashboard-actions button.btn-secondary {
+ background: rgba(255, 255, 255, 0.1);
+ color: var(--text-primary);
+ border: 1px solid rgba(255, 255, 255, 0.2);
}
-.prediction-main {
- text-align: center;
- padding: 1.5rem;
- background: rgba(255, 255, 255, 0.05);
- border-radius: 15px;
- margin-bottom: 1rem;
+.dashboard-summary {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
+ gap: 1rem;
}
-.prediction-label {
- display: block;
- font-size: 0.75rem;
- color: var(--text-secondary);
- text-transform: uppercase;
- margin-bottom: 0.5rem;
+.summary-card {
+ background: rgba(255, 255, 255, 0.04);
+ border-radius: 18px;
+ padding: 1.5rem;
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ box-shadow: var(--shadow-glass);
+ display: flex;
+ flex-direction: column;
+ gap: 0.85rem;
}
-.prediction-value {
- display: block;
- font-size: 2rem;
- font-weight: 700;
- color: var(--text-primary);
- margin-bottom: 0.5rem;
+.summary-card h3 {
+ font-size: 1.1rem;
+ font-weight: 600;
+ letter-spacing: 0.5px;
+ margin: 0;
}
-.prediction-trend {
- font-size: 0.9rem;
+.metric {
display: flex;
- align-items: center;
- justify-content: center;
+ justify-content: space-between;
gap: 0.5rem;
+ font-size: 0.95rem;
+ color: var(--text-secondary);
}
-.prediction-trend.positive {
- color: var(--success);
-}
-
-.prediction-trend.negative {
- color: var(--error);
+.metric .value {
+ font-size: 1.35rem;
+ font-weight: 700;
+ color: var(--text-primary);
}
-.prediction-details {
+.dashboard-content {
display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 0.5rem;
-}
-
-.detail-item {
- text-align: center;
- padding: 0.5rem;
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
+ gap: 1.5rem;
}
-.detail-label {
- display: block;
- font-size: 0.7rem;
- color: var(--text-secondary);
- margin-bottom: 0.25rem;
+.budgets-section,
+.goals-section,
+.alerts-section {
+ background: rgba(255, 255, 255, 0.03);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 1.75rem;
+ box-shadow: var(--shadow-glass);
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
}
-.detail-value {
- font-size: 0.85rem;
+.budgets-section h3,
+.goals-section h3,
+.alerts-section h3 {
+ margin: 0;
+ font-size: 1.2rem;
font-weight: 600;
color: var(--text-primary);
}
-/* Insights Widget */
-.insights-widget {
- grid-column: span 2;
+.items-list {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ max-height: 420px;
+ overflow-y: auto;
+ padding-right: 0.25rem;
}
-.insights-header {
- margin-bottom: 1rem;
+.budget-item,
+.goal-item {
+ background: rgba(255, 255, 255, 0.02);
+ border-radius: 16px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 1rem 1.25rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.65rem;
}
-.insights-header h4 {
- margin: 0;
- font-size: 1rem;
- color: var(--text-primary);
+.budget-header,
+.goal-header {
display: flex;
+ justify-content: space-between;
align-items: center;
gap: 0.5rem;
}
-.insights-header h4 i {
- color: #ffc107;
+.budget-header h4,
+.goal-header h4 {
+ margin: 0;
+ font-size: 1rem;
+ font-weight: 600;
+ color: var(--text-primary);
}
-.insights-list {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
- gap: 1rem;
+.budget-percentage,
+.goal-type {
+ font-size: 0.95rem;
+ font-weight: 600;
+ color: var(--accent-primary);
}
-.insight-card {
+.budget-progress,
+.goal-progress {
display: flex;
- gap: 1rem;
- padding: 1rem;
- background: rgba(255, 255, 255, 0.05);
- border-radius: 12px;
- border-left: 4px solid var(--accent-primary);
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.75rem;
}
-.insight-card.success {
- border-left-color: var(--success);
+.progress-bar {
+ flex: 1;
+ height: 0.35rem;
+ border-radius: 999px;
+ background: rgba(255, 255, 255, 0.12);
+ overflow: hidden;
}
-.insight-card.warning {
- border-left-color: var(--warning);
+.progress-fill {
+ height: 100%;
+ border-radius: inherit;
+ background: var(--primary-gradient);
+ box-shadow: 0 4px 12px rgba(118, 75, 162, 0.4);
}
-.insight-card.danger {
- border-left-color: var(--error);
+.progress-text {
+ font-size: 0.9rem;
+ font-weight: 600;
+ color: var(--text-secondary);
}
-.insight-icon {
- width: 40px;
- height: 40px;
- border-radius: 10px;
- background: rgba(100, 255, 218, 0.2);
+.goal-details,
+.budget-details {
display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
+ justify-content: space-between;
+ gap: 0.75rem;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ flex-wrap: wrap;
}
-.insight-card.success .insight-icon {
- background: rgba(0, 230, 118, 0.2);
- color: var(--success);
+.goal-details .days-left {
+ font-weight: 600;
+ color: var(--accent-primary);
}
-.insight-card.warning .insight-icon {
- background: rgba(255, 193, 7, 0.2);
- color: var(--warning);
+.alerts-list {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
}
-.insight-card.danger .insight-icon {
- background: rgba(255, 87, 34, 0.2);
- color: var(--error);
+.alert-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ border-radius: 14px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 1rem;
+ background: rgba(255, 255, 255, 0.02);
}
-.insight-icon i {
- color: var(--accent-primary);
+.alert-icon {
+ font-size: 1.5rem;
}
-.insight-content h5 {
- margin: 0 0 0.5rem 0;
- font-size: 0.9rem;
+.alert-content h4 {
+ margin: 0 0 0.25rem;
+ font-size: 1rem;
+ font-weight: 600;
color: var(--text-primary);
}
-.insight-content p {
+.alert-content p {
margin: 0;
- font-size: 0.85rem;
color: var(--text-secondary);
- line-height: 1.4;
+ font-size: 0.9rem;
}
-.insight-suggestion {
- display: block;
- margin-top: 0.5rem;
- font-size: 0.8rem;
+.alert-content span {
color: var(--accent-primary);
- font-style: italic;
+ font-weight: 600;
+ font-size: 0.9rem;
}
-/* Responsive Analytics */
-@media (max-width: 768px) {
- .analytics-dashboard {
- padding: 1.5rem;
- }
+#budget-modal .modal-content,
+#goal-modal .modal-content {
+ width: min(90vw, 520px);
+ padding: 1.5rem;
+}
- .analytics-header {
+.modal-actions {
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+@media (max-width: 768px) {
+ .nav-container {
flex-direction: column;
align-items: flex-start;
- gap: 1rem;
+ gap: 0.75rem;
+ padding: 0 1rem;
}
- .refresh-analytics-btn {
+ .nav-menu {
+ flex-wrap: wrap;
+ justify-content: flex-start;
width: 100%;
- justify-content: center;
+ gap: 0.75rem;
}
- .analytics-grid {
- grid-template-columns: 1fr;
+ .nav-link {
+ width: 100%;
+ text-align: left;
+ padding: 0.5rem 0.75rem;
+ border-radius: 10px;
}
- .velocity-widget,
- .insights-widget {
- grid-column: span 1;
+ .hero-section {
+ padding: 4rem 1.5rem 2rem;
+ text-align: left;
}
- .velocity-stats {
- grid-template-columns: 1fr;
+ .hero-title {
+ font-size: 2.4rem;
}
- .category-bar-item {
- grid-template-columns: 1fr;
- gap: 0.5rem;
+ .hero-cta {
+ flex-direction: column;
+ align-items: stretch;
}
- .category-stats {
- text-align: left;
- display: flex;
- gap: 1rem;
+ .hero-cta .cta-primary,
+ .hero-cta .cta-secondary {
+ width: 100%;
}
- .trends-chart-container {
- height: 120px;
+ .hero-section + .container {
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
- .trend-bar {
- width: 15px;
+ #budget-goals-dashboard {
+ margin: 4.5rem 1rem;
+ padding: 1.75rem;
}
- .trends-summary {
- grid-template-columns: 1fr;
- gap: 0.5rem;
+ .dashboard-actions button {
+ flex: 1;
+ justify-content: center;
}
- .prediction-details {
+ .dashboard-summary {
grid-template-columns: 1fr;
}
- .insights-list {
+ .dashboard-content {
grid-template-columns: 1fr;
}
+
+ .alerts-section {
+ order: 3;
+ }
+
+ .items-list {
+ max-height: 360px;
+ }
}
-/* ===============================
- CURRENCY SUPPORT STYLES
- =============================== */
+/*
+ FINANCIAL GOALS STYLES
+ */
-/* Currency Button in Navbar */
-.currency-btn {
+.goals-section {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 2rem;
+ box-shadow: var(--shadow-glass);
+ margin-bottom: 2rem;
+ animation: fadeInUp 1s ease-out 0.8s both;
+}
+
+.add-goal-btn {
+ padding: 0.6rem 1.2rem;
+ background: var(--primary-gradient);
+ color: white;
+ border: none;
+ border-radius: 10px;
+ font-size: 0.9rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 0.5rem;
- padding: 0.5rem 1rem;
- background: rgba(100, 255, 218, 0.1);
- border: 1px solid rgba(100, 255, 218, 0.3);
- border-radius: 8px;
- color: var(--accent-primary);
- font-weight: 600;
- cursor: pointer;
+}
+
+.add-goal-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
+}
+
+.goals-dashboard-container {
+ margin-top: 1.5rem;
+}
+
+.goals-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ gap: 1.5rem;
+}
+
+.goal-card {
+ background: rgba(255, 255, 255, 0.03);
+ border-radius: 15px;
+ padding: 1.5rem;
+ border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
- margin-right: 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1.25rem;
+ position: relative;
+ overflow: hidden;
}
-.currency-btn:hover {
- background: rgba(100, 255, 218, 0.2);
+.goal-card:hover {
+ transform: translateY(-5px);
+ background: rgba(255, 255, 255, 0.06);
border-color: var(--accent-primary);
- transform: translateY(-2px);
}
-.currency-btn i {
- font-size: 1rem;
+.goal-card.completed {
+ border-left: 4px solid var(--success);
}
-/* Currency Modal */
-.modal {
- display: none;
- position: fixed;
- z-index: 2000;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- background: rgba(0, 0, 0, 0.8);
- backdrop-filter: blur(10px);
+.goal-card.overdue {
+ border-left: 4px solid var(--error);
+}
+
+.goal-card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.goal-icon {
+ width: 45px;
+ height: 45px;
+ border-radius: 12px;
+ display: flex;
align-items: center;
justify-content: center;
+ font-size: 1.25rem;
}
-.modal-content {
- background: var(--bg-secondary);
- border: 1px solid rgba(255, 255, 255, 0.1);
- border-radius: 16px;
- max-width: 500px;
- width: 90%;
- max-height: 90vh;
- overflow-y: auto;
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
- animation: modalSlideIn 0.3s ease;
+.goal-badges {
+ display: flex;
+ gap: 0.5rem;
+ align-items: center;
}
-@keyframes modalSlideIn {
- from {
- opacity: 0;
- transform: translateY(-30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
+.goal-priority {
+ font-size: 0.7rem;
+ padding: 0.25rem 0.6rem;
+ border-radius: 20px;
+ text-transform: uppercase;
+ font-weight: 700;
+}
+
+.goal-priority.low {
+ background: rgba(76, 175, 80, 0.2);
+ color: #4caf50;
+}
+
+.goal-priority.medium {
+ background: rgba(255, 193, 7, 0.2);
+ color: #ffc107;
+}
+
+.goal-priority.high {
+ background: rgba(255, 87, 34, 0.2);
+ color: #ff5722;
+}
+
+.goal-priority.critical {
+ background: rgba(244, 67, 54, 0.2);
+ color: #f44336;
+}
+
+.auto-badge {
+ color: var(--accent-primary);
+ font-size: 0.8rem;
+ animation: pulse 2s infinite;
+}
+
+.goal-info h3 {
+ margin: 0;
+ font-size: 1.15rem;
+ color: var(--text-primary);
+}
+
+.goal-desc {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.4;
+ margin: 0.25rem 0 0 0;
+}
+
+.goal-progress-section {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.progress-labels {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.progress-percent {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--text-primary);
+}
+
+.progress-amount {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+
+.goal-progress-bar {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.goal-progress-fill {
+ height: 100%;
+ border-radius: 4px;
+ transition: width 0.8s cubic-bezier(0.17, 0.67, 0.83, 0.67);
+}
+
+.goal-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-top: auto;
+ padding-top: 1rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.05);
+}
+
+.goal-meta {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ display: flex;
+ gap: 1rem;
}
-.modal-header {
+.meta-item {
display: flex;
- justify-content: space-between;
align-items: center;
- padding: 1.5rem;
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+ gap: 0.4rem;
}
-.modal-header h3 {
+.goal-actions {
display: flex;
- align-items: center;
- gap: 0.5rem;
- color: var(--accent-primary);
- font-size: 1.25rem;
+ gap: 0.75rem;
}
-.close-modal {
- font-size: 2rem;
+.goal-btn {
+ width: 35px;
+ height: 35px;
+ border-radius: 8px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ background: rgba(255, 255, 255, 0.05);
color: var(--text-secondary);
cursor: pointer;
- transition: color 0.3s ease;
- line-height: 1;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
-.close-modal:hover {
- color: var(--error);
+.goal-btn:hover {
+ background: var(--accent-primary);
+ color: var(--bg-primary);
+ border-color: var(--accent-primary);
}
-.modal-body {
- padding: 1.5rem;
+.goal-btn.contribute:hover {
+ background: #4caf50;
+ border-color: #4caf50;
}
-.modal-footer {
- display: flex;
- justify-content: flex-end;
- gap: 1rem;
- padding: 1.5rem;
- border-top: 1px solid rgba(255, 255, 255, 0.1);
+@keyframes pulse {
+ 0% {
+ opacity: 0.6;
+ }
+
+ 50% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0.6;
+ }
}
-/* Currency Select Styling */
-.currency-select {
- width: 100%;
- padding: 0.75rem;
- background: var(--bg-tertiary);
+@media (max-width: 768px) {
+ .goals-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .goals-section {
+ padding: 1.5rem;
+ }
+}
+
+/*
+ WORKSPACE MANAGEMENT STYLES
+ */
+.workspace-selector {
+ position: relative;
+ display: inline-block;
+ margin-right: 1.5rem;
+}
+
+.workspace-current {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ background: rgba(255, 255, 255, 0.05);
+ padding: 0.5rem 1rem;
+ border-radius: 50px;
border: 1px solid rgba(255, 255, 255, 0.1);
- border-radius: 8px;
- color: var(--text-primary);
- font-size: 1rem;
cursor: pointer;
transition: all 0.3s ease;
+ min-width: 180px;
}
-.currency-select:focus {
- outline: none;
+.workspace-current:hover {
+ background: rgba(255, 255, 255, 0.1);
border-color: var(--accent-primary);
- box-shadow: 0 0 0 3px rgba(100, 255, 218, 0.1);
-}
-
-.currency-select option {
- background: var(--bg-secondary);
- color: var(--text-primary);
- padding: 0.5rem;
}
-/* Exchange Rate Info Display */
-.exchange-rate-info {
- background: var(--bg-tertiary);
- border-radius: 8px;
- padding: 1rem;
- margin-top: 0.5rem;
+.workspace-avatar {
+ width: 32px;
+ height: 32px;
+ background: var(--primary-gradient);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 700;
+ color: white;
+ font-size: 0.9rem;
}
-.rate-list {
+.workspace-info {
display: flex;
flex-direction: column;
- gap: 0.75rem;
- margin-bottom: 1rem;
}
-.rate-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 0.5rem;
- background: rgba(100, 255, 218, 0.05);
- border-radius: 6px;
- border-left: 3px solid var(--accent-primary);
+.workspace-label {
+ font-size: 0.65rem;
+ color: var(--text-secondary);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
}
-.rate-currency {
+.workspace-name {
+ font-size: 0.9rem;
font-weight: 600;
color: var(--text-primary);
+ max-width: 120px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
-.rate-value {
- font-family: 'Courier New', monospace;
- color: var(--accent-primary);
- font-weight: 600;
+.dropdown-arrow {
+ margin-left: auto;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
}
-.exchange-rate-info small {
+.workspace-dropdown {
+ position: absolute;
+ top: calc(100% + 10px);
+ right: 0;
+ width: 260px;
+ background: #1a1a36;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 12px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
+ padding: 0.5rem;
+ z-index: 1000;
+ display: none;
+ animation: slideInUp 0.2s ease-out;
+}
+
+.workspace-dropdown.active {
display: block;
+}
+
+.workspace-divider {
+ padding: 0.5rem 0.75rem;
+ font-size: 0.7rem;
color: var(--text-secondary);
- font-size: 0.875rem;
- margin-top: 0.5rem;
+ text-transform: uppercase;
+ letter-spacing: 1px;
}
-/* Modal Buttons */
-.btn-cancel {
- padding: 0.75rem 1.5rem;
- background: transparent;
- border: 1px solid rgba(255, 255, 255, 0.2);
+.workspace-item {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 0.75rem;
border-radius: 8px;
- color: var(--text-secondary);
- font-weight: 600;
cursor: pointer;
- transition: all 0.3s ease;
+ transition: all 0.2s ease;
+ margin-bottom: 2px;
}
-.btn-cancel:hover {
+.workspace-item:hover {
background: rgba(255, 255, 255, 0.05);
- border-color: rgba(255, 255, 255, 0.3);
- color: var(--text-primary);
}
-/* Currency Badge in Transaction List */
-.transaction-currency {
- display: inline-block;
- padding: 0.25rem 0.5rem;
+.workspace-item.active {
background: rgba(100, 255, 218, 0.1);
- border-radius: 4px;
+ border: 1px solid rgba(100, 255, 218, 0.2);
+}
+
+.workspace-avatar-sm {
+ width: 24px;
+ height: 24px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
font-size: 0.75rem;
- color: var(--accent-primary);
font-weight: 600;
- margin-left: 0.5rem;
}
-/* =========================
- AI CATEGORIZATION STYLES
- ========================= */
+.owner-badge {
+ margin-left: auto;
+ font-size: 0.65rem;
+ background: rgba(255, 193, 7, 0.2);
+ color: #ffc107;
+ padding: 2px 6px;
+ border-radius: 4px;
+}
-/* Description input wrapper */
-.description-input-wrapper {
- position: relative;
- width: 100%;
+.workspace-footer {
+ margin-top: 0.5rem;
+ padding-top: 0.5rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
}
-/* Category suggestions dropdown */
-.category-suggestions {
- position: absolute;
- top: 100%;
- left: 0;
- right: 0;
- background: var(--bg-secondary);
- border: 1px solid var(--accent-primary);
+.add-workspace-btn {
+ width: 100%;
+ background: transparent;
+ border: 1px dashed rgba(255, 255, 255, 0.2);
+ color: var(--text-secondary);
+ padding: 0.6rem;
border-radius: 8px;
- margin-top: 0.5rem;
- box-shadow: var(--shadow-glass);
- z-index: 1000;
- max-height: 300px;
- overflow-y: auto;
- opacity: 0;
- transform: translateY(-10px);
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ font-size: 0.85rem;
transition: all 0.3s ease;
}
-.category-suggestions.visible {
- opacity: 1;
- transform: translateY(0);
+.add-workspace-btn:hover {
+ background: rgba(255, 255, 255, 0.05);
+ border-color: var(--accent-primary);
+ color: var(--accent-primary);
}
-.category-suggestions.hidden {
- display: none;
+@media (max-width: 768px) {
+ .workspace-selector {
+ margin-right: 0;
+ margin-bottom: 1rem;
+ width: 100%;
+ }
+
+ .workspace-current {
+ width: 100%;
+ }
+
+ .workspace-dropdown {
+ width: 100%;
+ left: 0;
+ }
}
-/* Suggestion header */
-.suggestions-header {
- padding: 0.75rem 1rem;
- border-bottom: 1px solid rgba(100, 255, 218, 0.2);
+/*
+ ANALYTICS & FORECASTING
+ */
+.analytics-section {
+ margin-top: 4rem;
+ padding: 2rem 0;
+}
+
+.analytics-grid {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+}
+
+.analytics-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 2rem;
+}
+
+@media (max-width: 992px) {
+ .analytics-row {
+ grid-template-columns: 1fr;
+ }
+}
+
+.analytics-card {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 1.5rem;
+ min-height: 250px;
+ display: flex;
+ flex-direction: column;
+}
+
+.analytics-card h4 {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ margin-bottom: 1.5rem;
display: flex;
align-items: center;
- gap: 0.5rem;
+ gap: 0.75rem;
}
-.suggestions-header i {
+.analytics-card h4 i {
color: var(--accent-primary);
- animation: pulse 2s infinite;
-}
-
-.suggestions-header span {
- font-size: 0.875rem;
- color: var(--text-secondary);
- font-weight: 600;
}
-@keyframes pulse {
- 0%, 100% { opacity: 1; }
- 50% { opacity: 0.5; }
+/* Velocity & Forecast Widgets */
+.sts-main {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 1rem;
+ margin-bottom: 1.5rem;
}
-/* Suggestion item */
-.suggestion-item {
- padding: 0.875rem 1rem;
- cursor: pointer;
+.sts-daily,
+.sts-total {
display: flex;
- align-items: center;
- justify-content: space-between;
- transition: all 0.2s ease;
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+ flex-direction: column;
}
-.suggestion-item:last-child {
- border-bottom: none;
+.sts-label,
+.comm-label {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 0.25rem;
}
-.suggestion-item:hover {
- background: rgba(100, 255, 218, 0.1);
- transform: translateX(5px);
+.sts-value {
+ font-size: 1.8rem;
+ font-weight: 700;
+ color: var(--text-primary);
}
-.suggestion-item.primary {
- background: linear-gradient(135deg, rgba(100, 255, 218, 0.15), rgba(100, 255, 218, 0.05));
+.sts-daily .sts-value {
+ color: var(--accent-primary);
}
-.suggestion-content {
+.sts-commitments {
display: flex;
- flex-direction: column;
- gap: 0.25rem;
- flex: 1;
+ justify-content: space-between;
+ background: rgba(0, 0, 0, 0.2);
+ padding: 1rem;
+ border-radius: 12px;
}
-.suggestion-category {
- font-weight: 600;
- color: var(--text-primary);
+.commitment-item {
display: flex;
- align-items: center;
- gap: 0.5rem;
+ flex-direction: column;
}
-.suggestion-category-icon {
- font-size: 1.2rem;
+.comm-value {
+ font-weight: 600;
+ font-size: 1rem;
}
-.suggestion-reason {
+.forecast-days {
+ margin-left: auto;
font-size: 0.75rem;
color: var(--text-secondary);
- display: flex;
- align-items: center;
- gap: 0.25rem;
+ background: rgba(100, 255, 218, 0.1);
+ padding: 2px 8px;
+ border-radius: 50px;
+ border: 1px solid rgba(100, 255, 218, 0.2);
}
-.suggestion-reason i {
- font-size: 0.7rem;
- color: var(--accent-primary);
+/* Prediction Widget */
+.prediction-main {
+ text-align: center;
+ margin-bottom: 2rem;
}
-/* Confidence badge */
-.confidence-badge {
+.prediction-value {
+ display: block;
+ font-size: 2.5rem;
+ font-weight: 700;
+ margin: 0.5rem 0;
+}
+
+.prediction-trend {
display: inline-flex;
align-items: center;
- gap: 0.25rem;
- padding: 0.25rem 0.5rem;
- border-radius: 12px;
- font-size: 0.75rem;
- font-weight: 600;
- background: linear-gradient(135deg, rgba(100, 255, 218, 0.2), rgba(100, 255, 218, 0.1));
- color: var(--accent-primary);
- margin-left: 0.5rem;
+ gap: 0.4rem;
+ font-size: 0.9rem;
+ padding: 4px 12px;
+ border-radius: 50px;
}
-.confidence-badge.hidden {
- display: none;
+.prediction-trend.positive {
+ background: rgba(0, 230, 118, 0.1);
+ color: var(--success);
}
-.confidence-badge i {
- font-size: 0.7rem;
+.prediction-trend.negative {
+ background: rgba(255, 87, 34, 0.1);
+ color: var(--error);
}
-/* Confidence bar in suggestion */
-.suggestion-confidence {
+/* Insight Cards */
+.insights-list {
display: flex;
flex-direction: column;
- align-items: flex-end;
- gap: 0.25rem;
- min-width: 60px;
+ gap: 1rem;
}
-.confidence-value {
- font-size: 0.75rem;
- font-weight: 600;
- color: var(--accent-primary);
+.insight-card {
+ display: flex;
+ gap: 1rem;
+ padding: 1rem;
+ background: rgba(255, 255, 255, 0.03);
+ border-radius: 12px;
+ border-left: 4px solid var(--accent-primary);
}
-.confidence-bar {
- width: 50px;
- height: 4px;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 2px;
- overflow: hidden;
+.insight-card.warning {
+ border-left-color: var(--warning);
}
-.confidence-fill {
- height: 100%;
- background: linear-gradient(90deg, var(--accent-primary), var(--success));
- transition: width 0.3s ease;
+.insight-card.danger {
+ border-left-color: var(--error);
}
-/* Confidence levels - different colors */
-.confidence-high .confidence-fill {
- background: linear-gradient(90deg, #00e676, #00c853);
+.insight-card.success {
+ border-left-color: var(--success);
}
-.confidence-medium .confidence-fill {
- background: linear-gradient(90deg, #ffc107, #ff9800);
+.insight-icon {
+ font-size: 1.2rem;
+ padding-top: 0.2rem;
}
-.confidence-low .confidence-fill {
- background: linear-gradient(90deg, #ff5722, #f44336);
+.insight-content h5 {
+ margin-bottom: 0.25rem;
+ font-size: 1rem;
}
-/* Loading state */
-.suggestions-loading {
- padding: 1rem;
- text-align: center;
+.insight-content p {
+ font-size: 0.85rem;
color: var(--text-secondary);
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 0.5rem;
-}
-
-.suggestions-loading i {
- animation: spin 1s linear infinite;
+ margin-bottom: 0.5rem;
}
-/* ULTRA SMALL DEVICES (320px)*/
-@media (max-width: 360px) {
-
- /* Global */
- html,
- body {
- overflow-x: hidden;
- }
-
- body {
- font-size: 14px;
- }
-
- .container {
- padding: 0.75rem;
- margin-left: auto;
- margin-right: auto;
- }
-
- /* Navbar */
- .nav-logo span {
- font-size: 0.9rem;
- }
-
- .nav-toggle .bar {
- width: 22px;
- height: 2.5px;
- }
-
- /* Hero */
- .hero-title {
- font-size: 1.4rem;
- line-height: 1.3;
- }
-
- .hero-subtitle {
- font-size: 0.85rem;
- }
-
- /* Balance */
- .balance-card {
- padding: 1rem;
- }
-
- .balance-amount {
- font-size: 1.5rem;
- }
-
- /* Income / Expense cards */
- .income-card,
- .expense-card {
- padding: 0.75rem;
- }
-
- /* Filters */
- .search-input,
- .category-select,
- .date-input,
- .amount-input,
- .filter-btn,
- .clear-filters-btn {
- width: 100%;
- min-width: 0;
- font-size: 0.85rem;
- }
-
- .filter-buttons {
- flex-wrap: wrap;
- gap: 0.5rem;
- }
-
- /* Transaction list */
- .list li {
- flex-direction: column;
- align-items: flex-start;
- gap: 0.25rem;
- }
-
- /* Form */
- .transaction-form {
- padding: 1rem;
- }
-
- .transaction-form input,
- .transaction-form select,
- .btn-submit {
- font-size: 0.9rem;
- }
-
- /* Footer */
- .footer-section h4 {
- font-size: 1rem;
- }
-
- .footer-links a {
- font-size: 0.85rem;
- }
-
- .nav-container {
- padding: 0 0.75rem;
- }
-
- .nav-logo span {
- font-size: 0.85rem;
- }
+.insight-suggestion {
+ display: block;
+ font-size: 0.8rem;
+ color: var(--accent-primary);
+ font-style: italic;
}
-input,
-select,
-button {
- max-width: 100%;
- min-width: 0;
+/* Charts */
+.category-bars {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
}
-/* ========================
- EXPORT MODAL STYLES
- ======================== */
+.category-bar-item {
+ display: grid;
+ grid-template-columns: 100px 1fr 80px;
+ align-items: center;
+ gap: 1rem;
+}
-.export-btn.pdf-btn {
- background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%);
+.category-bar-wrapper {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 4px;
+ overflow: hidden;
}
-.export-btn.pdf-btn:hover {
- box-shadow: 0 8px 25px rgba(255, 107, 107, 0.3);
+.category-bar {
+ height: 100%;
+ border-radius: 4px;
}
-.export-btn.advanced-btn {
- background: var(--primary-gradient);
+.category-stats {
+ text-align: right;
+ font-size: 0.8rem;
}
-.export-btn.advanced-btn:hover {
- box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
+.category-percent {
+ color: var(--text-secondary);
+ display: block;
}
-/* Export Modal */
-.export-modal {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(0, 0, 0, 0.8);
- backdrop-filter: blur(10px);
+/* Loading State for Widgets */
+.widget-loading {
+ flex: 1;
display: flex;
+ flex-direction: column;
align-items: center;
justify-content: center;
- z-index: 2000;
- opacity: 0;
- visibility: hidden;
- transition: all 0.3s ease;
+ gap: 1rem;
+ color: var(--text-secondary);
}
-.export-modal.active {
- opacity: 1;
- visibility: visible;
+.widget-loading i {
+ font-size: 2rem;
+ color: var(--accent-primary);
}
-.export-modal-content {
+/* Settings Section Styles */
+.settings-section {
+ padding: 2rem 0;
background: var(--bg-secondary);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- width: 90%;
- max-width: 650px;
- max-height: 90vh;
- overflow-y: auto;
- transform: translateY(-20px);
- transition: all 0.3s ease;
}
-.export-modal.active .export-modal-content {
- transform: translateY(0);
+.settings-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 2rem;
}
-.export-modal-header {
+.settings-tabs {
display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 1.5rem 2rem;
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+ gap: 1rem;
+ margin-bottom: 2rem;
+ border-bottom: 1px solid var(--bg-glass);
+ padding-bottom: 1rem;
}
-.export-modal-header h3 {
- margin: 0;
- font-size: 1.3rem;
+.settings-tab {
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ padding: 0.75rem 1.5rem;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 1rem;
+ font-weight: 500;
+}
+
+.settings-tab:hover {
+ background: var(--bg-glass);
color: var(--text-primary);
- display: flex;
- align-items: center;
- gap: 0.75rem;
}
-.export-modal-header h3 i {
- color: var(--accent-primary);
+.settings-tab.active {
+ background: var(--primary-gradient);
+ color: white;
}
-.export-modal-body {
- padding: 2rem;
+.settings-content {
+ display: none;
}
-.export-format-section,
-.export-filters-section,
-.export-preview-section {
+.settings-content.active {
+ display: block;
+}
+
+.settings-card {
+ background: var(--bg-tertiary);
+ border-radius: 12px;
+ padding: 2rem;
margin-bottom: 2rem;
+ backdrop-filter: blur(10px);
+ border: 1px solid var(--bg-glass);
+ box-shadow: var(--shadow-card);
}
-.export-format-section h4,
-.export-filters-section h4,
-.export-preview-section h4 {
- font-size: 1rem;
+.settings-card h4 {
color: var(--text-primary);
- margin-bottom: 1rem;
- font-weight: 600;
+ margin-bottom: 1.5rem;
+ font-size: 1.25rem;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
}
-/* Format Options */
-.format-options {
+.settings-card h4 i {
+ color: var(--accent-primary);
+}
+
+/* Workspace Settings */
+.workspace-info {
display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 1rem;
+ grid-template-columns: 1fr 1fr;
+ gap: 2rem;
+ margin-bottom: 2rem;
}
-.format-option {
- cursor: pointer;
+.workspace-info label {
+ display: block;
+ color: var(--text-secondary);
+ margin-bottom: 0.5rem;
+ font-weight: 500;
}
-.format-option input {
- display: none;
+.workspace-info span,
+.workspace-info select {
+ color: var(--text-primary);
+ font-weight: 600;
}
-.format-card {
- background: rgba(255, 255, 255, 0.05);
- border: 2px solid rgba(255, 255, 255, 0.1);
- border-radius: 15px;
- padding: 1.5rem;
- text-align: center;
- transition: all 0.3s ease;
+.workspace-actions {
+ margin-top: 1rem;
+}
+
+.members-list {
+ margin-bottom: 1.5rem;
+}
+
+.member-item {
display: flex;
- flex-direction: column;
+ justify-content: space-between;
align-items: center;
- gap: 0.5rem;
+ padding: 1rem;
+ background: var(--bg-glass);
+ border-radius: 8px;
+ margin-bottom: 0.5rem;
}
-.format-option input:checked+.format-card {
- border-color: var(--accent-primary);
- background: rgba(100, 255, 218, 0.1);
+.member-info {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
}
-.format-card i {
- font-size: 2.5rem;
- color: var(--accent-primary);
- margin-bottom: 0.5rem;
+.member-avatar {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ background: var(--primary-gradient);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: white;
+ font-weight: bold;
}
-.format-card .format-name {
- font-size: 1.1rem;
- font-weight: 600;
+.member-details h5 {
color: var(--text-primary);
+ margin-bottom: 0.25rem;
}
-.format-card .format-desc {
- font-size: 0.85rem;
+.member-role {
color: var(--text-secondary);
+ font-size: 0.875rem;
}
-.format-card:hover {
- background: rgba(255, 255, 255, 0.08);
- transform: translateY(-2px);
+.member-actions {
+
+ display: flex;
+ gap: 0.5rem;
}
-/* Filter Grid */
-.filter-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 1rem;
+.piggy-btn.cancel {
+ background: rgba(255, 255, 255, 0.15);
+ color: #fff;
}
-/* Export Preview */
-.export-preview {
- background: rgba(255, 255, 255, 0.05);
- border-radius: 15px;
- padding: 1.5rem;
- border: 1px solid rgba(255, 255, 255, 0.1);
+.btn-role {
+ background: var(--bg-glass);
+ border: 1px solid var(--accent-primary);
+ color: var(--accent-primary);
+ padding: 0.25rem 0.75rem;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.875rem;
}
-.export-preview-stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
- gap: 1rem;
+.btn-role:hover {
+ background: var(--accent-primary);
+ color: white;
}
-.preview-stat {
- background: rgba(255, 255, 255, 0.05);
- border-radius: 10px;
- padding: 1rem;
- text-align: center;
+.btn-remove {
+ background: var(--error);
+ color: white;
+ border: none;
+ padding: 0.25rem 0.75rem;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.875rem;
}
-.preview-stat .stat-label {
- display: block;
- font-size: 0.75rem;
- color: var(--text-secondary);
- text-transform: uppercase;
- margin-bottom: 0.5rem;
+.btn-remove:hover {
+ opacity: 0.8;
}
-.preview-stat .stat-value {
- display: block;
- font-size: 1.1rem;
- font-weight: 700;
- color: var(--text-primary);
+/* Approvals Settings */
+.approval-config {
+ margin-bottom: 2rem;
+}
+
+.approval-config .form-control {
+ margin-bottom: 1rem;
+}
+
+.approval-config small {
+ color: var(--text-secondary);
+ font-size: 0.875rem;
}
-.preview-stat.income .stat-value {
- color: var(--success);
+.approvals-list {
+ max-height: 400px;
+ overflow-y: auto;
}
-.preview-stat.expense .stat-value {
- color: var(--error);
+.approval-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1rem;
+ background: var(--bg-glass);
+ border-radius: 8px;
+ margin-bottom: 0.5rem;
}
-.preview-stat.positive .stat-value {
- color: var(--success);
+.approval-info {
+ flex: 1;
}
-.preview-stat.negative .stat-value {
- color: var(--error);
+.approval-info h5 {
+ color: var(--text-primary);
+ margin-bottom: 0.25rem;
}
-.export-preview-loading,
-.export-preview-error,
-.export-preview-empty {
- text-align: center;
- padding: 2rem;
+.approval-details {
color: var(--text-secondary);
+ font-size: 0.875rem;
}
-.export-preview-empty i {
- font-size: 2rem;
- margin-bottom: 0.5rem;
- opacity: 0.5;
+.approval-status {
+ padding: 0.25rem 0.75rem;
+ border-radius: 20px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ text-transform: uppercase;
}
-.export-preview-error {
- color: var(--error);
+.status-pending {
+ background: var(--warning);
+ color: #333;
}
-/* Export Modal Footer */
-.export-modal-footer {
- display: flex;
- justify-content: flex-end;
- gap: 1rem;
- padding: 1.5rem 2rem;
- border-top: 1px solid rgba(255, 255, 255, 0.1);
+.status-approved {
+ background: var(--success);
+ color: white;
}
-/* Export Notification */
-.export-notification {
- position: fixed;
- top: 20px;
- right: 20px;
- padding: 1rem 1.5rem;
- border-radius: 10px;
- display: flex;
- align-items: center;
- gap: 0.75rem;
- z-index: 3000;
- transform: translateX(120%);
- transition: transform 0.3s ease;
- font-weight: 500;
+.status-rejected {
+ background: var(--error);
+ color: white;
}
-.export-notification.show {
- transform: translateX(0);
+.approval-actions {
+ display: flex;
+ gap: 0.5rem;
}
-.export-notification.success {
- background: linear-gradient(135deg, rgba(0, 230, 118, 0.9) 0%, rgba(0, 200, 83, 0.9) 100%);
+.btn-approve {
+ background: var(--success);
color: white;
+ border: none;
+ padding: 0.5rem 1rem;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.875rem;
}
-.export-notification.error {
- background: linear-gradient(135deg, rgba(255, 87, 34, 0.9) 0%, rgba(244, 67, 54, 0.9) 100%);
+.btn-reject {
+ background: var(--error);
color: white;
+ border: none;
+ padding: 0.5rem 1rem;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.875rem;
}
-.export-notification.info {
- background: linear-gradient(135deg, rgba(102, 126, 234, 0.9) 0%, rgba(118, 75, 162, 0.9) 100%);
- color: white;
+/* Profile Settings */
+.profile-form .form-control {
+ margin-bottom: 1rem;
}
-/* Responsive Export Modal */
-@media (max-width: 768px) {
- .export-modal-content {
- width: 95%;
- max-height: 85vh;
- }
+.profile-form input[readonly] {
+ background: var(--bg-glass);
+ cursor: not-allowed;
+}
- .export-modal-body {
- padding: 1.5rem;
+/* Responsive Design */
+@media (max-width: 768px) {
+ .settings-container {
+ padding: 0 1rem;
}
- .format-options {
+ .workspace-info {
grid-template-columns: 1fr;
+ gap: 1rem;
}
- .filter-grid {
- grid-template-columns: 1fr;
+ .settings-tabs {
+ flex-wrap: wrap;
}
- .export-preview-stats {
- grid-template-columns: repeat(2, 1fr);
+ .settings-tab {
+ flex: 1;
+ min-width: 120px;
}
- .export-modal-footer {
+ .member-item {
flex-direction: column;
+ align-items: flex-start;
+ gap: 1rem;
}
- .export-modal-footer button {
+ .member-actions {
width: 100%;
- }
-}
-
-@media (max-width: 480px) {
- .export-preview-stats {
- grid-template-columns: 1fr;
+ justify-content: flex-end;
}
- .export-buttons {
+ .approval-item {
flex-direction: column;
- gap: 0.5rem;
+ align-items: flex-start;
+ gap: 1rem;
}
- .export-btn {
+ .approval-actions {
width: 100%;
- justify-content: center;
- }
-}
-
-/* Responsive Design for Currency Features */
-@media (max-width: 768px) {
- .currency-btn {
- padding: 0.4rem 0.75rem;
- font-size: 0.875rem;
- margin-right: 0.5rem;
- }
-
- .currency-btn span {
- display: none;
- }
-
- .modal-content {
- width: 95%;
- margin: 1rem;
- }
-
- .modal-header,
- .modal-body,
- .modal-footer {
- padding: 1rem;
- }
-
- .rate-list {
- gap: 0.5rem;
- }
-
- /* AI Categorization responsive */
- .category-suggestions {
- max-height: 250px;
- }
-
- .suggestion-item {
- padding: 0.75rem;
- }
-
- .suggestion-confidence {
- min-width: 50px;
- }
-
- .confidence-bar {
- width: 40px;
+ justify-content: flex-end;
}
}
-/* =========================
- WIDTH PRESERVATION FIX
- (Keeps original layout)
-========================= */
-
-/* Ensure container width stays exactly the same */
-.container,
-.nav-container,
-.footer-container {
- max-width: 1200px; /* same as before */
- margin-left: auto;
- margin-right: auto;
-}
-
-/* Cards should NOT stretch wider */
-.balance-card,
-.history-section,
-.form-section,
-.data-management-section,
-.income-card,
-.expense-card {
- width: 100%;
- max-width: 100%;
-}
-
-/* Grid spacing only – no width change */
-.container {
- row-gap: 3.5rem;
-}
-/* Income / Expense grid keeps original width */
-.inc-exp-container {
- grid-template-columns: 1fr 1fr; /* unchanged */
- gap: 2.5rem;
+/* Approval Status Badges */
+.approval-badge {
+ padding: 0.25rem 0.5rem;
+ border-radius: 12px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ display: inline-block;
+ margin-left: 0.5rem;
}
-/* Prevent accidental full-screen stretch */
-.main-content {
- width: 100%;
- overflow-x: hidden;
+.transaction-meta {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
}
-/* Mobile stays stacked like before */
-@media (max-width: 768px) {
- .inc-exp-container {
- grid-template-columns: 1fr;
- }
+/* Notification Styles */
+.notification {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: var(--bg-tertiary);
+ color: var(--text-primary);
+ padding: 1rem 1.5rem;
+ border-radius: 8px;
+ box-shadow: var(--shadow-card);
+ border-left: 4px solid var(--accent-primary);
+ z-index: 10000;
+ transform: translateX(100%);
+ transition: transform 0.3s ease;
+ max-width: 400px;
}
-/* =========================
- REDUCED CARD SPACING
- (Width & style preserved)
-========================= */
-/* Main container – smaller vertical gap */
-.main-content .container {
- row-gap: 1.6rem !important;
+.notification.show {
+ transform: translateX(0);
}
-/* Cards – subtle spacing only */
-.balance-card,
-.history-section,
-.form-section,
-.data-management-section {
- margin-top: 0.6rem !important;
- margin-bottom: 0.6rem !important;
+.notification-success {
+ border-left-color: var(--success);
}
-/* Income & Expense cards */
-.inc-exp-container {
- gap: 1.2rem !important;
+.notification-error {
+ border-left-color: var(--error);
}
-/* Transaction list items */
-.list li {
- margin-bottom: 0.6rem !important;
+.notification-info {
+ border-left-color: var(--accent-primary);
}
-/* Footer spacing */
-.footer-container {
- row-gap: 1.5rem !important;
+.notification i {
+ margin-right: 0.5rem;
}
-/* Mobile refinement */
-@media (max-width: 768px) {
- .main-content .container {
- row-gap: 1.3rem !important;
- }
+.no-approvals {
+ text-align: center;
+ color: var(--text-secondary);
+ padding: 2rem;
+ font-style: italic;
}
diff --git a/public/index.html b/public/index.html
index 268fc42..00266cc 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,15 +1,13 @@
-
-
+
-
-
+
@@ -17,36 +15,30 @@
-
+
+ ExpenseFlow - Smart Money Management
+
-
+
-
-
- ExpenseFlow - Smart Money Management
-
+
+
+
-
+
+
+
+
+
+
+
@@ -152,6 +112,8 @@
Analytics
Goals
Settings
+ Monthly/Yearly Summary
+ Contributors
@@ -159,13 +121,21 @@
+
+
-

-
John Doe
+

+
John Doe
+
@@ -173,12 +143,154 @@
-
-
Smart Money Management
-
Take control of your finances with our intuitive expense tracker
+
+
+
+
+
+
+ Trusted by 10,000+ users worldwide
+
+
Smart Money Management Made Simple
+
Take control of your finances with our intelligent expense tracker. Track, analyze, and optimize your spending habits effortlessly.
+
+
+
+
+
+
AI-Powered
+
Secure & Private
+
Works Offline
+
Multi-Currency
+
+
+
+ Scroll to explore
+
+
+
+
+
+
+
+
+
+
AI Categorization
+
Automatically categorize your expenses with intelligent machine learning algorithms
+
+
+
+
Visual Analytics
+
Beautiful charts and insights to understand your spending patterns at a glance
+
+
+
+
Recurring Expenses
+
Track subscriptions and recurring bills automatically with smart reminders
+
+
+
+
Export & Reports
+
Generate detailed reports in CSV or PDF format for tax season
+
+
+
+
Budget Goals
+
Set financial goals and track your progress with intuitive dashboards
+
+
+
+
Secure & Private
+
Bank-level encryption keeps your financial data safe and private
+
+
+
+
+
+
+
+
+
+
+
+
1
+
+
Add Expenses
+
Quickly log your daily expenses with our simple form. AI suggests categories automatically.
+
+
+
2
+
+
Track & Analyze
+
Watch your spending patterns emerge through beautiful visualizations and insights.
+
+
+
3
+
+
Save More
+
Make informed decisions based on data and achieve your financial goals faster.
+
+
+
+
+
+
+
+
+
+
+
+
+
Total Balance
+
₹0.00
+
+
+
+
+
+
+
+
This Month Income
+
₹0.00
+
+
+
+
+
+
+
+
This Month Expenses
+
₹0.00
+
+
+
+
+
Income
-
- +₹0.00
-
+
+₹0.00
@@ -211,9 +321,7 @@
Income
Expense
-
- -₹0.00
-
+
-₹0.00
@@ -221,20 +329,20 @@ Expense
-
+
-
Data Management
+
Data Management
-
Export Data
+
Export Data
@@ -311,39 +417,35 @@
Import Data
-
-
-
-
-
Filter Options
+
Filter Options
@@ -376,20 +478,17 @@
Filter Options
-
-
-
Export Preview
+
Export Preview
-
@@ -397,12 +496,25 @@
Export Preview
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- All expenses will be converted to this currency for display
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Install ExpenseFlow for quick access and offline functionality!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Install ExpenseFlow for quick access and offline functionality!
-
-
-
-
-
-.7
-
-
-
-
- You're offline. Changes will be saved locally.
-
-
-
-
-
-
- A new version is available!
-
-
-
-
-
-