From d925605b42d039596863e33953e3e7c37902cce2 Mon Sep 17 00:00:00 2001 From: Abhinav Deval Date: Sun, 21 Jun 2026 14:42:25 +0530 Subject: [PATCH 1/2] perf(ui): enforce aspect-ratio utilities on image wrappers to eliminate CLS (Closes #661) Signed-off-by: Abhinav Deval --- src/app/admin/events/page.tsx | 2 +- src/app/contributors/page.tsx | 2 +- src/app/pathway/page.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/admin/events/page.tsx b/src/app/admin/events/page.tsx index f52dbcc0..91825a07 100644 --- a/src/app/admin/events/page.tsx +++ b/src/app/admin/events/page.tsx @@ -141,7 +141,7 @@ export default function AdminEventsPage() { key={event.id} className="bg-card border border-border rounded-xl overflow-hidden flex flex-col" > -
+
{event.image ? ( )}
-
+
{user.photoURL ? (
-
+
{entry.photoURL ? ( Date: Sun, 21 Jun 2026 15:46:30 +0530 Subject: [PATCH 2/2] style(format): run prettier on all source files --- package-lock.json | 55 +++++++-- src/app/opportunities/page.tsx | 12 +- .../features/OpportunityDashboard.tsx | 113 +++++++++++++----- .../features/SkillTreeVisualizer.tsx | 25 +++- src/components/profile/UserProfile.tsx | 76 +++++++----- 5 files changed, 198 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 59a23711..3536e7e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -159,6 +159,7 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -2152,6 +2153,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2175,6 +2177,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2519,6 +2522,7 @@ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.12.tgz", "integrity": "sha512-FT+HoNp1NdaZ/N26hCwV3WbxS1m6gTn3p2QRBQ3KH7YqyCQqJx0iT7126RgVk68/Rq+9DeL/zCFnHZ0C4u1nLQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@firebase/component": "0.7.3", "@firebase/logger": "0.5.1", @@ -2585,6 +2589,7 @@ "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.12.tgz", "integrity": "sha512-Pe513OBerK/CIBxz4/za9atd5MsZtd6DzHz4cmqkvkrcDWhQChAoHBpZ3McuZNuSP8YZiKwfX/J1frR07l15/w==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@firebase/app": "0.14.12", "@firebase/component": "0.7.3", @@ -2601,6 +2606,7 @@ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.5.tgz", "integrity": "sha512-YevqTjvo7Iujsa9Dwowmd6dSoElhzmD63ZSrq6bzjvQ6POjYgNjOFHLmNIgJs48eNO093NCERibuFnxbfOvU7A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@firebase/logger": "0.5.1" } @@ -3054,6 +3060,7 @@ "integrity": "sha512-LUdM4Wg7YM9Pq/49nGYySJA0CSQEKnGffFzWV8+6gXN7mGxn+FL1IqvFbuZUtAQcfZgHYDwCE1wwlK7rB7gl2g==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" }, @@ -4942,6 +4949,7 @@ "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright": "1.60.0" }, @@ -5526,6 +5534,7 @@ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.6.1.tgz", "integrity": "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", @@ -5860,7 +5869,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -5881,7 +5889,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -5895,7 +5902,6 @@ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -5905,8 +5911,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@testing-library/dom/node_modules/pretty-format": { "version": "27.5.1", @@ -5914,7 +5919,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -5929,8 +5933,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", @@ -6041,8 +6044,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -6050,6 +6052,7 @@ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -6316,6 +6319,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -6356,6 +6360,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -6366,6 +6371,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -6456,6 +6462,7 @@ "resolved": "https://registry.npmjs.org/@types/three/-/three-0.184.1.tgz", "integrity": "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA==", "license": "MIT", + "peer": true, "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", @@ -6566,6 +6573,7 @@ "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.49.0", "@typescript-eslint/types": "8.49.0", @@ -7302,6 +7310,7 @@ "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7992,6 +8001,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -8375,6 +8385,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -10464,6 +10475,7 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10649,6 +10661,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -15179,6 +15192,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -15238,6 +15252,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -16020,7 +16035,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -16094,6 +16108,7 @@ "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -17412,6 +17427,7 @@ "resolved": "https://registry.npmjs.org/next/-/next-16.2.7.tgz", "integrity": "sha512-eMJxgjRzBaj3olkP4cBamHDXL79A8FC6u1GcsO1D1Tsx8bw/LLXUJCaoajVxtnhD3A1IJqIT8IcRJjgBIPJq4w==", "license": "MIT", + "peer": true, "dependencies": { "@next/env": "16.2.7", "@swc/helpers": "0.5.15", @@ -18296,6 +18312,7 @@ "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -18585,6 +18602,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -18744,6 +18762,7 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19253,6 +19272,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -19262,6 +19282,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -19843,6 +19864,7 @@ "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -20091,6 +20113,7 @@ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21857,7 +21880,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/three-mesh-bvh": { "version": "0.8.3", @@ -21990,6 +22014,7 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -22173,6 +22198,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -22441,6 +22467,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23086,6 +23113,7 @@ "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", @@ -23547,6 +23575,7 @@ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -23815,6 +23844,7 @@ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -24226,6 +24256,7 @@ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/src/app/opportunities/page.tsx b/src/app/opportunities/page.tsx index 4a95a97c..40a072d0 100644 --- a/src/app/opportunities/page.tsx +++ b/src/app/opportunities/page.tsx @@ -3,7 +3,8 @@ import OpportunityDashboard from '@/components/features/OpportunityDashboard'; export const metadata = { title: 'Opportunities Hub | DevPath', - description: 'Explore career opportunities, developer internships, and hackathons with deadline countdowns and dynamic bookmarking.', + description: + 'Explore career opportunities, developer internships, and hackathons with deadline countdowns and dynamic bookmarking.', }; export default function OpportunitiesPage() { @@ -13,11 +14,14 @@ export default function OpportunitiesPage() { {/* Page Heading banner */}

- Career & Developer Opportunities + Career & Developer{' '} + + Opportunities +

- Apply to top-tier internship openings, hackathons, and fellowship cohorts. - Pin key dates and visualize live deadline countdowns below. + Apply to top-tier internship openings, hackathons, and fellowship + cohorts. Pin key dates and visualize live deadline countdowns below.

diff --git a/src/components/features/OpportunityDashboard.tsx b/src/components/features/OpportunityDashboard.tsx index 7cf09249..d05c364e 100644 --- a/src/components/features/OpportunityDashboard.tsx +++ b/src/components/features/OpportunityDashboard.tsx @@ -21,7 +21,8 @@ const MOCK_OPPORTUNITIES: BookmarkItem[] = [ { id: 'opp-1', title: 'Open Source Contributor', - description: 'GSoC is a global program focused on bringing student developers into open source software development.', + description: + 'GSoC is a global program focused on bringing student developers into open source software development.', type: 'opportunity', company: 'Google', deadline: '2026-06-25T23:59:59Z', @@ -31,7 +32,8 @@ const MOCK_OPPORTUNITIES: BookmarkItem[] = [ { id: 'opp-2', title: 'Software Engineering Intern', - description: "Join Meta's product teams to build technologies that help people connect, find communities, and grow businesses.", + description: + "Join Meta's product teams to build technologies that help people connect, find communities, and grow businesses.", type: 'opportunity', company: 'Meta', deadline: '2026-06-20T23:59:59Z', @@ -41,7 +43,8 @@ const MOCK_OPPORTUNITIES: BookmarkItem[] = [ { id: 'opp-3', title: 'Hackathon Participant', - description: 'Our annual 48-hour hackathon to build open-source projects for community welfare. Compete for cash prizes and mentorship.', + description: + 'Our annual 48-hour hackathon to build open-source projects for community welfare. Compete for cash prizes and mentorship.', type: 'opportunity', company: 'DevPath', deadline: '2026-06-18T18:00:00Z', @@ -51,7 +54,8 @@ const MOCK_OPPORTUNITIES: BookmarkItem[] = [ { id: 'opp-4', title: 'GitHub Octernship Fellow', - description: 'The GitHub Octernships program connects students with industry partners for paid internship opportunities.', + description: + 'The GitHub Octernships program connects students with industry partners for paid internship opportunities.', type: 'opportunity', company: 'GitHub', deadline: '2026-07-15T23:59:59Z', @@ -61,7 +65,8 @@ const MOCK_OPPORTUNITIES: BookmarkItem[] = [ { id: 'opp-5', title: 'Developer Participant', - description: 'Build next-generation payment integrations and financial tools using Stripe API.', + description: + 'Build next-generation payment integrations and financial tools using Stripe API.', type: 'opportunity', company: 'Stripe', deadline: '2026-06-01T23:59:59Z', @@ -93,16 +98,24 @@ const calculateDeadlineStatus = (deadlineStr: string): DeadlineStatus => { } else if (daysLeft <= 2) { return { text: 'Closing tomorrow', status: 'closing-tomorrow', daysLeft }; } else { - return { text: `${Math.ceil(daysLeft)} days left`, status: 'upcoming', daysLeft }; + return { + text: `${Math.ceil(daysLeft)} days left`, + status: 'upcoming', + daysLeft, + }; } }; export default function OpportunityDashboard() { const { bookmarks, toggleBookmark, isBookmarked } = useBookmarks(); - const [activeTab, setActiveTab] = useState<'explore' | 'bookmarked'>('explore'); + const [activeTab, setActiveTab] = useState<'explore' | 'bookmarked'>( + 'explore' + ); const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid'); const [searchQuery, setSearchQuery] = useState(''); - const [sortBy, setSortBy] = useState<'deadline' | 'recent' | 'alpha'>('deadline'); + const [sortBy, setSortBy] = useState<'deadline' | 'recent' | 'alpha'>( + 'deadline' + ); const [mounted, setMounted] = useState(false); useEffect(() => { @@ -182,7 +195,8 @@ export default function OpportunityDashboard() { Opportunity Hub

- Track applications, countdown deadlines, and save high-value career opportunities. + Track applications, countdown deadlines, and save high-value career + opportunities.

@@ -190,7 +204,10 @@ export default function OpportunityDashboard() {
{/* Search Bar */}
- + setSortBy(e.target.value as any)} className="bg-transparent text-xs text-slate-300 focus:outline-none cursor-pointer" > - - - + + +
@@ -241,7 +264,9 @@ export default function OpportunityDashboard() {
{/* Body Content */} -
+
{/* Header Row: Company and Title */}
@@ -366,7 +408,9 @@ export default function OpportunityDashboard() { {/* Action Footer (List layout alignment) */}
{/* Deadline & Countdown */} @@ -375,15 +419,20 @@ export default function OpportunityDashboard() {
- {new Date(opp.deadline).toLocaleDateString(undefined, { - month: 'short', - day: 'numeric', - year: 'numeric', - })} + {new Date(opp.deadline).toLocaleDateString( + undefined, + { + month: 'short', + day: 'numeric', + year: 'numeric', + } + )}
{mounted ? ( - + {status?.text} @@ -401,7 +450,9 @@ export default function OpportunityDashboard() { ? 'bg-red-500/10 hover:bg-red-500/20 text-red-400 border border-red-500/20' : 'bg-primary hover:bg-primary/95 text-white shadow-lg shadow-primary/10' }`} - title={saved ? 'Remove from bookmarks' : 'Add to bookmarks'} + title={ + saved ? 'Remove from bookmarks' : 'Add to bookmarks' + } > {saved ? ( <> diff --git a/src/components/features/SkillTreeVisualizer.tsx b/src/components/features/SkillTreeVisualizer.tsx index ab62ed36..81b1832c 100644 --- a/src/components/features/SkillTreeVisualizer.tsx +++ b/src/components/features/SkillTreeVisualizer.tsx @@ -153,14 +153,22 @@ export default function SkillTreeVisualizer({ useKeyboardShortcuts({ arrowright: () => { if (nodes.length === 0) return; - const currentIndex = selectedNode ? nodes.findIndex((n) => n.id === selectedNode.id) : -1; - const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % nodes.length; + const currentIndex = selectedNode + ? nodes.findIndex((n) => n.id === selectedNode.id) + : -1; + const nextIndex = + currentIndex === -1 ? 0 : (currentIndex + 1) % nodes.length; setSelectedNode(nodes[nextIndex]); }, arrowleft: () => { if (nodes.length === 0) return; - const currentIndex = selectedNode ? nodes.findIndex((n) => n.id === selectedNode.id) : -1; - const prevIndex = currentIndex === -1 ? nodes.length - 1 : (currentIndex - 1 + nodes.length) % nodes.length; + const currentIndex = selectedNode + ? nodes.findIndex((n) => n.id === selectedNode.id) + : -1; + const prevIndex = + currentIndex === -1 + ? nodes.length - 1 + : (currentIndex - 1 + nodes.length) % nodes.length; setSelectedNode(nodes[prevIndex]); }, }); @@ -171,11 +179,16 @@ export default function SkillTreeVisualizer({ setSelectedNode(null); }; window.addEventListener('close-all-overlays', handleCloseAll); - return () => window.removeEventListener('close-all-overlays', handleCloseAll); + return () => + window.removeEventListener('close-all-overlays', handleCloseAll); }, []); if (loading) { return ( -
+
diff --git a/src/components/profile/UserProfile.tsx b/src/components/profile/UserProfile.tsx index 68af6479..9c22c2b2 100644 --- a/src/components/profile/UserProfile.tsx +++ b/src/components/profile/UserProfile.tsx @@ -564,9 +564,7 @@ export default function UserProfile() { try { const createdAt = user.createdAt as any; const d = new Date( - createdAt.seconds - ? createdAt.seconds * 1000 - : createdAt + createdAt.seconds ? createdAt.seconds * 1000 : createdAt ); if (isNaN(d.getTime())) return 'Dec 2023'; return d.toLocaleDateString(undefined, { @@ -980,7 +978,11 @@ export default function UserProfile() {
{loadingProjects ? ( -
+
{Array.from({ length: 4 }).map((_, i) => (
{isLoadingFollowers ? ( -
- {Array.from({ length: 5 }).map((_, i) => ( -
-
-
-
-
-
-
-
- ))} -
-) : followersList.length === 0 ? ( +
+ {Array.from({ length: 5 }).map((_, i) => ( +
+
+
+
+
+
+
+
+ ))} +
+ ) : followersList.length === 0 ? (
No followers yet.
@@ -1182,19 +1191,26 @@ export default function UserProfile() {
{isLoadingFollowing ? ( -
- {Array.from({ length: 5 }).map((_, i) => ( -
-
-
-
-
-
-
-
- ))} -
-) : followingList.length === 0 ? ( +
+ {Array.from({ length: 5 }).map((_, i) => ( +
+
+
+
+
+
+
+
+ ))} +
+ ) : followingList.length === 0 ? (
Not following anyone yet.