From 8431abe9287bba4824cd39e99d57c3fce6607d22 Mon Sep 17 00:00:00 2001 From: ArshVermaGit Date: Sat, 30 May 2026 00:13:26 +0530 Subject: [PATCH 1/4] test: fix broken unit test suite and failing assertions --- package-lock.json | 514 ++++++++++++++++++++++- package.json | 5 +- test/components/DashboardHeader.test.tsx | 2 +- test/user-settings-api.test.ts | 3 + 4 files changed, 520 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7275b260e..700936626 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,6 +46,7 @@ "autoprefixer": "^10.4.19", "eslint": "^8", "eslint-config-next": "^14.2.35", + "jsdom": "^29.1.1", "postcss": "^8.4.38", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1", @@ -74,6 +75,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -1865,6 +1917,159 @@ "license": "MIT", "peer": true }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", + "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", @@ -2347,6 +2552,24 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -6313,6 +6536,16 @@ "node": ">=6.0.0" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -7005,6 +7238,20 @@ "utrie": "^1.0.2" } }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -7159,6 +7406,20 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -7237,6 +7498,13 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", @@ -7628,6 +7896,19 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -9226,6 +9507,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -9805,6 +10099,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -11542,6 +11843,57 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -12107,6 +12459,13 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -13279,6 +13638,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -13554,7 +13926,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -14523,6 +14894,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -15321,6 +15705,13 @@ "node": ">=12.0.0" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/synckit": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", @@ -15822,6 +16213,26 @@ "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.0.tgz", + "integrity": "sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.0" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.1.tgz", + "integrity": "sha512-sc2nGvGbixlJRHwTh/qQdPXTxJU1UDJboGPQm4d/01YUJ9r/u6aeIulQvEaxUlvKDN7hb1qCLjax+jhVAPLa/g==", + "dev": true, + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -15842,6 +16253,32 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -16149,6 +16586,16 @@ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "license": "MIT" }, + "node_modules/undici": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.26.0.tgz", + "integrity": "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -16632,6 +17079,19 @@ } } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -16657,6 +17117,16 @@ "node": ">=10.13.0" } }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, "node_modules/webpack": { "version": "5.107.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", @@ -16795,6 +17265,31 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17532,6 +18027,23 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 63aa1e56f..de9fa2af8 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@vercel/speed-insights": "^2.0.0", "clsx": "^2.1.1", "date-fns": "^3.6.0", + "dompurify": "^3.1.6", "html-to-image": "^1.11.13", "jspdf": "^4.2.1", "jspdf-autotable": "^5.0.7", @@ -34,8 +35,7 @@ "recharts": "^2.12.7", "rehype-sanitize": "^6.0.0", "server-only": "^0.0.1", - "sonner": "^2.0.7", - "dompurify": "^3.1.6" + "sonner": "^2.0.7" }, "devDependencies": { "@playwright/test": "1.60.0", @@ -50,6 +50,7 @@ "autoprefixer": "^10.4.19", "eslint": "^8", "eslint-config-next": "^14.2.35", + "jsdom": "^29.1.1", "postcss": "^8.4.38", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1", diff --git a/test/components/DashboardHeader.test.tsx b/test/components/DashboardHeader.test.tsx index 42a360ee0..98767b4cd 100644 --- a/test/components/DashboardHeader.test.tsx +++ b/test/components/DashboardHeader.test.tsx @@ -51,7 +51,7 @@ describe("DashboardHeader", () => { render(); expect( - screen.getByText(/Dashboard/i) + screen.getByRole("heading", { name: "Dashboard" }) ).toBeInTheDocument(); }); diff --git a/test/user-settings-api.test.ts b/test/user-settings-api.test.ts index 84fa39056..8c8c175d6 100644 --- a/test/user-settings-api.test.ts +++ b/test/user-settings-api.test.ts @@ -138,6 +138,7 @@ describe("User Settings API Endpoints", () => { expect(await res.json()).toEqual({ id: "user-uuid-123", github_login: "test-user", + bio: "", is_public: true, leaderboard_opt_in: true, weekly_digest_opt_in: false, @@ -222,6 +223,7 @@ describe("User Settings API Endpoints", () => { expect(await res.json()).toEqual({ id: "user-uuid-123", github_login: "test-user", + bio: "", is_public: true, leaderboard_opt_in: true, weekly_digest_opt_in: false, @@ -248,6 +250,7 @@ describe("User Settings API Endpoints", () => { expect(await res.json()).toEqual({ id: "user-uuid-123", github_login: "test-user", + bio: "", is_public: false, leaderboard_opt_in: true, weekly_digest_opt_in: false, From 5c5b4f5823425e4190252c43d4800e12f6edeb88 Mon Sep 17 00:00:00 2001 From: ArshVermaGit Date: Sat, 30 May 2026 02:28:04 +0530 Subject: [PATCH 2/4] feat(ui): add micro-animations & transitions for dynamic dashboard UX --- src/app/globals.css | 53 +++++++++++++++++++ src/components/AIMentorWidget.tsx | 6 +-- src/components/ActivityRingChart.tsx | 2 +- src/components/BadgeSection.tsx | 6 +-- src/components/CIAnalytics.tsx | 12 ++--- src/components/CodingActivityInsightsCard.tsx | 8 +-- src/components/CodingTimeWidget.tsx | 4 +- src/components/CommitSearchPanel.tsx | 4 +- src/components/CommitTimeChart.tsx | 4 +- src/components/CommunityMetrics.tsx | 10 ++-- src/components/ContributionGraph.tsx | 4 +- src/components/ContributionHeatmap.tsx | 4 +- src/components/CopyLinkButton.tsx | 2 +- src/components/DiscussionsWidget.tsx | 8 +-- src/components/ExportButton.tsx | 4 +- src/components/FriendComparison.tsx | 6 +-- src/components/GitHubAchievements.tsx | 4 +- src/components/GoalTracker.tsx | 16 +++--- src/components/InactiveRepositoriesCard.tsx | 12 ++--- src/components/IssueMetrics.tsx | 8 +-- src/components/LanguageBreakdown.tsx | 6 +-- src/components/LocalCodingTime.tsx | 22 ++++---- src/components/MiniPRTrendChart.tsx | 2 +- src/components/NotificationBell.tsx | 2 +- src/components/PRBreakdownChart.tsx | 10 ++-- src/components/PRMetrics.tsx | 16 +++--- src/components/PRReviewTrendChart.tsx | 2 +- src/components/PersonalRecords.tsx | 8 +-- src/components/PinnedRepos.tsx | 4 +- src/components/PinnedReposWidget.tsx | 10 ++-- src/components/PrivacySettings.tsx | 4 +- src/components/ProjectMetrics.tsx | 22 ++++---- src/components/RecentActivity.tsx | 12 ++--- src/components/RepoHealthPanel.tsx | 2 +- src/components/ShareProfileSection.tsx | 4 +- src/components/ShortcutsModal.tsx | 4 +- src/components/StreakTracker.tsx | 18 +++---- src/components/TodayFocusHero.tsx | 10 ++-- src/components/TopRepos.tsx | 8 +-- src/components/WeeklySummaryCard.tsx | 18 +++---- src/components/WidgetErrorBoundary.tsx | 2 +- .../repo-analytics/RepoAnalyticsExplorer.tsx | 2 +- src/components/repo-analytics/RepoCard.tsx | 2 +- .../repo-analytics/RepoCarousel.tsx | 2 +- tailwind.config.ts | 22 +++++++- 45 files changed, 232 insertions(+), 159 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index b1d91427e..e803568a2 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -155,6 +155,59 @@ body { animation: fadeUp 0.7s ease-out; } +/* ───────────────────────────────────────── + MICRO-ANIMATION UTILITIES + ───────────────────────────────────────── */ + +/* Staggered animation delays for child elements */ +.stagger-children > *:nth-child(1) { animation-delay: 0ms; } +.stagger-children > *:nth-child(2) { animation-delay: 50ms; } +.stagger-children > *:nth-child(3) { animation-delay: 100ms; } +.stagger-children > *:nth-child(4) { animation-delay: 150ms; } +.stagger-children > *:nth-child(5) { animation-delay: 200ms; } +.stagger-children > *:nth-child(6) { animation-delay: 250ms; } +.stagger-children > *:nth-child(7) { animation-delay: 300ms; } +.stagger-children > *:nth-child(8) { animation-delay: 350ms; } +.stagger-children > *:nth-child(9) { animation-delay: 400ms; } +.stagger-children > *:nth-child(10) { animation-delay: 450ms; } + +/* Shimmer skeleton loading effect */ +.skeleton-shimmer { + background: linear-gradient( + 90deg, + var(--card-muted) 0%, + color-mix(in srgb, var(--card-muted) 60%, var(--border) 40%) 50%, + var(--card-muted) 100% + ); + background-size: 200% 100%; + animation: shimmer 1.8s ease-in-out infinite; +} + +/* Interactive stat cell — hover lift + glow */ +.stat-cell { + transition: transform 200ms ease, box-shadow 200ms ease, background-color 200ms ease, border-color 200ms ease; +} +.stat-cell:hover { + transform: translateY(-2px); + box-shadow: 0 4px 16px -4px rgba(96, 165, 250, 0.15); +} + +/* Interactive list item — subtle left-border reveal + slide */ +.list-item-hover { + transition: transform 200ms ease, background-color 200ms ease, box-shadow 200ms ease, border-color 200ms ease; + border-left: 3px solid transparent; +} +.list-item-hover:hover { + transform: translateX(4px); + border-left-color: var(--accent); + box-shadow: 0 2px 8px -2px rgba(96, 165, 250, 0.1); +} + +/* Progress bar animated fill */ +.progress-fill { + transition: width 600ms cubic-bezier(0.4, 0, 0.2, 1); +} + /* ───────────────────────────────────────── DARK MODE GLOBAL TYPOGRAPHY ───────────────────────────────────────── */ diff --git a/src/components/AIMentorWidget.tsx b/src/components/AIMentorWidget.tsx index 28fe8b3cd..9e360a73b 100644 --- a/src/components/AIMentorWidget.tsx +++ b/src/components/AIMentorWidget.tsx @@ -39,7 +39,7 @@ function SkeletonCard() { role="status" aria-busy="true" aria-live="polite" - className="rounded-xl border border-[var(--border)] bg-[var(--card)] p-6 shadow-sm animate-pulse" + className="rounded-xl border border-[var(--border)] bg-[var(--card)] p-6 shadow-sm animate-pulse transition-all duration-300 hover:shadow-md hover:-translate-y-1" > Loading AI Mentor insights
@@ -107,7 +107,7 @@ export function AIMentorWidget() { if (error) { return ( -
+

{error}

); @@ -124,7 +124,7 @@ export function AIMentorWidget() { : ""; return ( -
+

diff --git a/src/components/ActivityRingChart.tsx b/src/components/ActivityRingChart.tsx index 2b5a125c2..e71355625 100644 --- a/src/components/ActivityRingChart.tsx +++ b/src/components/ActivityRingChart.tsx @@ -81,7 +81,7 @@ export default function ActivityRingChart() { } return ( -
+

Activity Ring diff --git a/src/components/BadgeSection.tsx b/src/components/BadgeSection.tsx index 392054aba..a328d043c 100644 --- a/src/components/BadgeSection.tsx +++ b/src/components/BadgeSection.tsx @@ -34,7 +34,7 @@ export default function BadgeSection({ username }: BadgeSectionProps) { const combinedMarkdown = `${streakMarkdown} ${commitsMarkdown}`; return ( -
+

📌 Get Your Badge

@@ -108,13 +108,13 @@ function CopyableCodeBlock({ code }: { code: string }) { }; return ( -
+
{code} diff --git a/src/components/CIAnalytics.tsx b/src/components/CIAnalytics.tsx index 6b9084010..80894dcf2 100644 --- a/src/components/CIAnalytics.tsx +++ b/src/components/CIAnalytics.tsx @@ -104,7 +104,7 @@ export default function CIAnalytics() { : "Refresh"; return ( -
+

@@ -119,7 +119,7 @@ export default function CIAnalytics() { onClick={fetchCIAnalytics} disabled={isRateLimited || loading} title={isRateLimited ? "GitHub API rate limit reached" : "Refresh CI data"} - className="inline-flex items-center gap-1.5 rounded-md border border-[var(--border)] px-3 py-1.5 text-xs font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--control)] disabled:cursor-not-allowed disabled:opacity-50" + className="inline-flex items-center gap-1.5 rounded-md border border-[var(--border)] px-3 py-1.5 text-xs font-medium text-[var(--muted-foreground)] transition-all hover:bg-[var(--control)] disabled:cursor-not-allowed disabled:opacity-50 hover:opacity-90 active:scale-95" > {loading ? ( @@ -140,7 +140,7 @@ export default function CIAnalytics() { @@ -165,11 +165,11 @@ export default function CIAnalytics() {

) : data ? (
-
+
{stats.map((stat) => (
{stat.value} @@ -181,7 +181,7 @@ export default function CIAnalytics() { ))}
-
+

Flakiest workflow

diff --git a/src/components/CodingActivityInsightsCard.tsx b/src/components/CodingActivityInsightsCard.tsx index d83cfdd62..c13f4eada 100644 --- a/src/components/CodingActivityInsightsCard.tsx +++ b/src/components/CodingActivityInsightsCard.tsx @@ -228,7 +228,7 @@ export default function CodingActivityInsightsCard() { : `${dataWindowLabel} · Commits by hour · Local timezone`; return ( -
+

@@ -251,7 +251,7 @@ export default function CodingActivityInsightsCard() { type="button" onClick={fetchInsights} disabled={loading} - className="flex items-center gap-2 rounded-md border border-[var(--border)] px-3 py-1.5 text-xs font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--control)] disabled:cursor-not-allowed disabled:opacity-50" + className="flex items-center gap-2 rounded-md border border-[var(--border)] px-3 py-1.5 text-xs font-medium text-[var(--muted-foreground)] transition-all hover:bg-[var(--control)] disabled:cursor-not-allowed disabled:opacity-50 hover:opacity-90 active:scale-95" > {loading ? ( <> @@ -272,13 +272,13 @@ export default function CodingActivityInsightsCard() { className="space-y-4" > Loading coding activity insights -
+
{[1, 2, 3].map((item) => ( diff --git a/src/components/CodingTimeWidget.tsx b/src/components/CodingTimeWidget.tsx index 1af551569..d74968045 100644 --- a/src/components/CodingTimeWidget.tsx +++ b/src/components/CodingTimeWidget.tsx @@ -50,7 +50,7 @@ export default function CodingTimeWidget() { if (loading) { return ( -
+
@@ -62,7 +62,7 @@ export default function CodingTimeWidget() { } return ( -
+

Wakatime Coding Activity (7 Days)

diff --git a/src/components/CommitSearchPanel.tsx b/src/components/CommitSearchPanel.tsx index 81fcbd298..d00ec4253 100644 --- a/src/components/CommitSearchPanel.tsx +++ b/src/components/CommitSearchPanel.tsx @@ -151,7 +151,7 @@ export default function CommitSearchPanel({ commits, loading }: CommitSearchPane onClick={handleToggle} aria-label={isOpen ? "Collapse commit list" : "Expand commit list"} aria-expanded={isOpen} - className="flex items-center gap-1 rounded-lg border border-[var(--border)] bg-[var(--control)] px-3 py-2 text-sm font-medium text-[var(--foreground)] hover:bg-[var(--control-hover)] transition-colors" + className="flex items-center gap-1 rounded-lg border border-[var(--border)] bg-[var(--control)] px-3 py-2 text-sm font-medium text-[var(--foreground)] hover:bg-[var(--control-hover)] transition-all hover:opacity-90 active:scale-95" > diff --git a/src/components/CommitTimeChart.tsx b/src/components/CommitTimeChart.tsx index 91ab081e6..c3a981e38 100644 --- a/src/components/CommitTimeChart.tsx +++ b/src/components/CommitTimeChart.tsx @@ -97,7 +97,7 @@ export default function CommitTimeChart() { }, [fetchContributions]); return ( -
+

Commits by Time of Day @@ -131,7 +131,7 @@ export default function CommitTimeChart() { diff --git a/src/components/CommunityMetrics.tsx b/src/components/CommunityMetrics.tsx index 6ac68834b..32f0e02f6 100644 --- a/src/components/CommunityMetrics.tsx +++ b/src/components/CommunityMetrics.tsx @@ -62,7 +62,7 @@ export default function CommunityMetrics() { metrics.commentsPosted === 0; return ( -
+

@@ -76,7 +76,7 @@ export default function CommunityMetrics() { type="button" onClick={fetchMetrics} disabled={loading} - className="inline-flex w-full items-center justify-center gap-1.5 rounded-md border border-[var(--border)] px-3 py-1.5 text-xs font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--control)] sm:w-auto disabled:cursor-not-allowed disabled:opacity-60" + className="inline-flex w-full items-center justify-center gap-1.5 rounded-md border border-[var(--border)] px-3 py-1.5 text-xs font-medium text-[var(--muted-foreground)] transition-all hover:bg-[var(--control)] sm:w-auto disabled:cursor-not-allowed disabled:opacity-60 hover:opacity-90 active:scale-95" > {loading ? ( @@ -98,7 +98,7 @@ export default function CommunityMetrics() { @@ -120,7 +120,7 @@ export default function CommunityMetrics() { {stats.map((stat) => (
{stat.value} @@ -133,7 +133,7 @@ export default function CommunityMetrics() {
{isEmpty && ( -
+
No discussion activity yet in this 30-day window.
)} diff --git a/src/components/ContributionGraph.tsx b/src/components/ContributionGraph.tsx index 5d60575e2..abce9bb5a 100644 --- a/src/components/ContributionGraph.tsx +++ b/src/components/ContributionGraph.tsx @@ -376,7 +376,7 @@ export default function ContributionGraph() { return (
@@ -490,7 +490,7 @@ export default function ContributionGraph() { )} diff --git a/src/components/ContributionHeatmap.tsx b/src/components/ContributionHeatmap.tsx index f177a9ec7..b40ce08cf 100644 --- a/src/components/ContributionHeatmap.tsx +++ b/src/components/ContributionHeatmap.tsx @@ -329,7 +329,7 @@ export default function ContributionHeatmap({ }; return ( -
+

Contribution Heatmap

@@ -409,7 +409,7 @@ export default function ContributionHeatmap({ )} diff --git a/src/components/CopyLinkButton.tsx b/src/components/CopyLinkButton.tsx index 1774aedee..b233894db 100644 --- a/src/components/CopyLinkButton.tsx +++ b/src/components/CopyLinkButton.tsx @@ -30,7 +30,7 @@ export default function CopyLinkButton({ url }: CopyLinkButtonProps) { type="button" onClick={handleCopy} aria-label="Copy profile link" - className="inline-flex items-center gap-1.5 px-3 py-1.5 bg-[var(--control)] border border-[var(--border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--accent)] rounded-lg text-sm font-medium transition-colors shadow-sm focus:outline-none focus:ring-2 focus:ring-[var(--accent)]/50 active:scale-[0.98]" + className="inline-flex items-center gap-1.5 px-3 py-1.5 bg-[var(--control)] border border-[var(--border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--accent)] rounded-lg text-sm font-medium transition-all shadow-sm focus:outline-none focus:ring-2 focus:ring-[var(--accent)]/50 active:scale-[0.98] hover:opacity-90 active:scale-95" > {copied ? ( <> diff --git a/src/components/DiscussionsWidget.tsx b/src/components/DiscussionsWidget.tsx index b017632b7..daf2905ed 100644 --- a/src/components/DiscussionsWidget.tsx +++ b/src/components/DiscussionsWidget.tsx @@ -53,7 +53,7 @@ export default function DiscussionsWidget() { : []; return ( -
+

Discussion Activity

@@ -63,7 +63,7 @@ export default function DiscussionsWidget() { {[1, 2, 3].map((i) => (
))}
@@ -79,11 +79,11 @@ export default function DiscussionsWidget() {
) : ( -
+
{stats.map((stat) => (
diff --git a/src/components/ExportButton.tsx b/src/components/ExportButton.tsx index 631c2212f..123743e63 100644 --- a/src/components/ExportButton.tsx +++ b/src/components/ExportButton.tsx @@ -661,7 +661,7 @@ export default function ExportButton() { type="button" onClick={exportCSV} disabled={isExportingCSV} - className="flex w-full items-center justify-center gap-2 rounded-lg border border-[var(--border)] bg-[var(--control)] px-4 py-2 text-sm font-medium text-[var(--card-foreground)] transition-colors hover:border-[var(--accent)] disabled:opacity-50 sm:w-auto sm:min-w-[140px]" + className="flex w-full items-center justify-center gap-2 rounded-lg border border-[var(--border)] bg-[var(--control)] px-4 py-2 text-sm font-medium text-[var(--card-foreground)] transition-all hover:border-[var(--accent)] disabled:opacity-50 sm:w-auto sm:min-w-[140px] hover:opacity-90 active:scale-95" > @@ -673,7 +673,7 @@ export default function ExportButton() { type="button" onClick={exportPDF} disabled={isExportingPDF} - className="flex min-w-0 flex-1 items-center justify-center gap-2 rounded-lg bg-[var(--accent)] px-4 py-2 text-sm font-medium text-[var(--accent-foreground)] transition-colors hover:opacity-90 disabled:opacity-50 sm:min-w-[140px] sm:flex-none" + className="flex min-w-0 flex-1 items-center justify-center gap-2 rounded-lg bg-[var(--accent)] px-4 py-2 text-sm font-medium text-[var(--accent-foreground)] transition-all hover:opacity-90 disabled:opacity-50 sm:min-w-[140px] sm:flex-none active:scale-95" suppressHydrationWarning > diff --git a/src/components/FriendComparison.tsx b/src/components/FriendComparison.tsx index a484ac9db..59d120a18 100644 --- a/src/components/FriendComparison.tsx +++ b/src/components/FriendComparison.tsx @@ -193,7 +193,7 @@ export default function FriendComparison() { }; return ( -
+

@@ -288,7 +288,7 @@ export default function FriendComparison() { @@ -384,7 +384,7 @@ export default function FriendComparison() { diff --git a/src/components/GitHubAchievements.tsx b/src/components/GitHubAchievements.tsx index 749f4580c..4cd4b6a25 100644 --- a/src/components/GitHubAchievements.tsx +++ b/src/components/GitHubAchievements.tsx @@ -12,7 +12,7 @@ export default function GitHubAchievements({ error = null, }: GitHubAchievementsProps) { return ( -
+

GitHub Achievements

@@ -29,7 +29,7 @@ export default function GitHubAchievements({ diff --git a/src/components/GoalTracker.tsx b/src/components/GoalTracker.tsx index 83920c352..ef761fdee 100644 --- a/src/components/GoalTracker.tsx +++ b/src/components/GoalTracker.tsx @@ -241,17 +241,17 @@ export default function GoalTracker() { if (loading) { return ( -
+
Loading weekly goals