From e46ba6ca4eff6d3c7f33926b8aa9b9f44dc4de4d Mon Sep 17 00:00:00 2001 From: Musa Hamza Turawa Date: Thu, 26 Mar 2026 01:25:45 +0100 Subject: [PATCH 1/3] Added snapshot repotation feature --- frontend/package-lock.json | 112 +++++------------- .../app/(authenticated)/dashboard/page.tsx | 9 +- frontend/src/component/ReputationSnapshot.tsx | 91 ++++++++++++++ 3 files changed, 125 insertions(+), 87 deletions(-) create mode 100644 frontend/src/component/ReputationSnapshot.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 46dbaac5..a0c537c9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -77,6 +77,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -364,7 +365,6 @@ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", @@ -379,7 +379,6 @@ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@eslint/core": "^0.17.0" }, @@ -392,7 +391,6 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -405,7 +403,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", @@ -429,7 +426,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -442,7 +438,6 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "license": "MIT", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -455,7 +450,6 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -465,7 +459,6 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -552,7 +545,6 @@ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18.0" } @@ -562,7 +554,6 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" @@ -576,7 +567,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=12.22" }, @@ -590,7 +580,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18" }, @@ -2268,15 +2257,13 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2299,6 +2286,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -2309,6 +2297,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -2393,6 +2382,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz", "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", @@ -2905,7 +2895,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", - "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -2915,7 +2904,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2932,7 +2920,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -2947,8 +2934,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", @@ -3238,6 +3224,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3328,7 +3315,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -3358,7 +3344,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3402,7 +3387,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3414,8 +3398,7 @@ "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", - "peer": true + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", @@ -3434,7 +3417,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3528,8 +3510,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", @@ -3811,7 +3792,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -3990,6 +3970,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -4135,7 +4116,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4152,7 +4132,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4165,7 +4144,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -4183,7 +4161,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -4196,7 +4173,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -4226,8 +4202,7 @@ "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", - "peer": true + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.1", @@ -4261,15 +4236,13 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fastq": { "version": "1.20.1", @@ -4292,7 +4265,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "license": "MIT", - "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -4317,7 +4289,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4334,7 +4305,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "license": "MIT", - "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -4347,8 +4317,7 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.5", @@ -4519,7 +4488,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -4591,7 +4559,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -4702,7 +4669,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -4712,7 +4678,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4729,7 +4694,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -5146,8 +5110,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/iterator.prototype": { "version": "1.1.5", @@ -5184,6 +5147,7 @@ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "devOptional": true, "license": "MIT", + "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -5199,7 +5163,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -5223,22 +5186,19 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", @@ -5272,7 +5232,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "license": "MIT", - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -5300,7 +5259,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5575,7 +5533,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -5590,8 +5547,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -5986,7 +5942,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "license": "MIT", - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -6021,7 +5976,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6037,7 +5991,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -6053,7 +6006,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -6066,7 +6018,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -6076,7 +6027,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -6148,7 +6098,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -6169,7 +6118,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -6199,6 +6147,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6208,6 +6157,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -6312,7 +6262,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -6535,7 +6484,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6548,7 +6496,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -6774,7 +6721,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -6810,7 +6756,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6880,7 +6825,8 @@ "version": "0.182.0", "resolved": "https://registry.npmjs.org/three/-/three-0.182.0.tgz", "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/tinyglobby": { "version": "0.2.15", @@ -6920,6 +6866,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -6996,7 +6943,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7083,6 +7029,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7208,7 +7155,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -7227,7 +7173,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -7328,7 +7273,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -7344,7 +7288,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -7357,6 +7300,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/frontend/src/app/(authenticated)/dashboard/page.tsx b/frontend/src/app/(authenticated)/dashboard/page.tsx index 9992f127..16095547 100644 --- a/frontend/src/app/(authenticated)/dashboard/page.tsx +++ b/frontend/src/app/(authenticated)/dashboard/page.tsx @@ -1,8 +1,11 @@ import CompetitionsJoined from "@/component/CompetitionsJoined"; +import ReputationSnapshot from "@/component/ReputationSnapshot"; export default function DashboardPage() { return (
+ +
{/* Dashboard content cards */}
@@ -10,13 +13,13 @@ export default function DashboardPage() {

12

Currently tracking

- +

Win Rate

73%

Last 30 days

- +

Leaderboard Rank

#47

@@ -26,7 +29,7 @@ export default function DashboardPage() { {/* Competitions Joined Section */} - +

Recent Activity

diff --git a/frontend/src/component/ReputationSnapshot.tsx b/frontend/src/component/ReputationSnapshot.tsx new file mode 100644 index 00000000..2866ca8c --- /dev/null +++ b/frontend/src/component/ReputationSnapshot.tsx @@ -0,0 +1,91 @@ +import React from "react"; +import { Trophy, Zap, TrendingUp } from "lucide-react"; +import { Progress } from "@/components/ui/progress"; // wait, usually if there's no progress component I can just build a div progress. + +export default function ReputationSnapshot() { + const score = 840; + const progressPercent = 84; + + return ( +
+

Reputation Snapshot

+ +
+ {/* Left Side: Avatar and Tier Pill */} +
+
+ A +
+
+ Gold Predictor +
+
+ + {/* Right Side: Metrics and Progress */} +
+
+
+

Reputation Score

+
{score}
+
+
+

Tier

+
+ + Gold +
+
+
+ +
+

100 to next tier

+ {/* Custom Progress Bar */} +
+
+
+
+ +
+ {/* Bottom Row Metrics */} +
+

Current Streak

+
+
+ + 5 +
+ correct in a row +
+
+
+

Correct Predictions

+
+
87
+ of 128 total +
+
+
+ + {/* Bottom Tags */} +
+
+ + Top 50 Global +
+
+ + Fast Mover +
+
+ + Data Driven +
+
+
+
+
+ ); +} From 7b661a71411167fc607d5d2df19a5a106da4f076 Mon Sep 17 00:00:00 2001 From: Musa Hamza Turawa Date: Thu, 26 Mar 2026 01:44:57 +0100 Subject: [PATCH 2/3] Added 4-card high-level metrics summary row below the dashboard header --- frontend/generic.png | Bin 0 -> 23792 bytes .../app/(authenticated)/dashboard/page.tsx | 8 +++++ frontend/src/component/MetricCard.tsx | 29 ++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 frontend/generic.png create mode 100644 frontend/src/component/MetricCard.tsx diff --git a/frontend/generic.png b/frontend/generic.png new file mode 100644 index 0000000000000000000000000000000000000000..6a0aa5a2fab55c37e3f9249220a4b7e06e05fd16 GIT binary patch literal 23792 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 KwSp^FPyYwn!#5xR literal 0 HcmV?d00001 diff --git a/frontend/src/app/(authenticated)/dashboard/page.tsx b/frontend/src/app/(authenticated)/dashboard/page.tsx index 16095547..13ef8a82 100644 --- a/frontend/src/app/(authenticated)/dashboard/page.tsx +++ b/frontend/src/app/(authenticated)/dashboard/page.tsx @@ -1,11 +1,19 @@ import CompetitionsJoined from "@/component/CompetitionsJoined"; import ReputationSnapshot from "@/component/ReputationSnapshot"; +import MetricCard from "@/component/MetricCard"; export default function DashboardPage() { return (
+
+ + + + +
+
{/* Dashboard content cards */}
diff --git a/frontend/src/component/MetricCard.tsx b/frontend/src/component/MetricCard.tsx new file mode 100644 index 00000000..123fba72 --- /dev/null +++ b/frontend/src/component/MetricCard.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import { TrendingUp, TrendingDown } from "lucide-react"; + +interface MetricCardProps { + title: string; + value: React.ReactNode; + trend?: "up" | "down"; +} + +export default function MetricCard({ title, value, trend }: MetricCardProps) { + const trendIcon = + trend === "up" ? ( + + ) : trend === "down" ? ( + + ) : null; + + return ( +
+

+ {title} +

+
+

{value}

+ {trendIcon} +
+
+ ); +} From 65ae15a0893b486d68e9e2a09a7def1dbb476340 Mon Sep 17 00:00:00 2001 From: Musa Hamza Turawa Date: Sat, 28 Mar 2026 22:53:47 +0100 Subject: [PATCH 3/3] Fix Vercel build error: Remove unused Progress import in ReputationSnapshot --- frontend/src/component/ReputationSnapshot.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/component/ReputationSnapshot.tsx b/frontend/src/component/ReputationSnapshot.tsx index 2866ca8c..e8c84762 100644 --- a/frontend/src/component/ReputationSnapshot.tsx +++ b/frontend/src/component/ReputationSnapshot.tsx @@ -1,6 +1,6 @@ import React from "react"; import { Trophy, Zap, TrendingUp } from "lucide-react"; -import { Progress } from "@/components/ui/progress"; // wait, usually if there's no progress component I can just build a div progress. + export default function ReputationSnapshot() { const score = 840;