diff --git a/README.md b/README.md
index 2c8c399..d7739d4 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
-# Deerhack 2025 Website
+# DeerHack 2026 Website
## Please use Node Version 20.11.0
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index dfeb1c5..5e576ba 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -12,10 +12,12 @@
"@lottiefiles/dotlottie-react": "^0.18.3",
"@next/third-parties": "^14.1.0",
"@supabase/supabase-js": "^2.39.7",
+ "chart.js": "^4.5.1",
"gsap": "^3.14.2",
"lottie-react": "^2.4.1",
"next": "14.2.35",
"react": "^18",
+ "react-chartjs-2": "^5.3.1",
"react-dom": "^18",
"sharp": "^0.33.2"
},
@@ -53,13 +55,10 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz",
- "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"dev": true,
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
@@ -695,6 +694,11 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@kurkle/color": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz",
+ "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="
+ },
"node_modules/@lottiefiles/dotlottie-react": {
"version": "0.18.3",
"resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.18.3.tgz",
@@ -871,9 +875,9 @@
}
},
"node_modules/@next/third-parties": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/third-parties/-/third-parties-14.1.0.tgz",
- "integrity": "sha512-f55SdvQ1WWxi4mb5QqtYQh5wRzbm1XaeP7s39DPn4ks3re+n9VlFccbMxBRHqkE62zAyIKmvkUB2cByT/gugGA==",
+ "version": "14.2.35",
+ "resolved": "https://registry.npmjs.org/@next/third-parties/-/third-parties-14.2.35.tgz",
+ "integrity": "sha512-dG1J+4uYungW1snGViN7tAVyfO0iz0zoB+sqsLMUo8kwR0NED2muLTMbOChmrliHhzOFj6ZpHfkvhy5NJjFvSQ==",
"dependencies": {
"third-party-capital": "1.0.20"
},
@@ -1162,9 +1166,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
@@ -1230,9 +1234,9 @@
}
},
"node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
@@ -1547,12 +1551,12 @@
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@@ -1669,6 +1673,17 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/chart.js": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz",
+ "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==",
+ "dependencies": {
+ "@kurkle/color": "^0.3.0"
+ },
+ "engines": {
+ "pnpm": ">=8"
+ }
+ },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -1766,9 +1781,9 @@
"dev": true
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
@@ -2555,9 +2570,9 @@
}
},
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -2597,9 +2612,9 @@
}
},
"node_modules/flatted": {
- "version": "3.2.9",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
- "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true
},
"node_modules/for-each": {
@@ -2774,21 +2789,21 @@
}
},
"node_modules/glob/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/glob/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
"dev": true,
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^2.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -3420,9 +3435,9 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"dependencies": {
"argparse": "^2.0.1"
@@ -3599,12 +3614,12 @@
}
},
"node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"dependencies": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
@@ -3612,9 +3627,9 @@
}
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -3659,9 +3674,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [
{
"type": "github",
@@ -4041,9 +4056,9 @@
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
},
"node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"engines": {
"node": ">=8.6"
@@ -4276,6 +4291,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-chartjs-2": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz",
+ "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==",
+ "peerDependencies": {
+ "chart.js": "^4.1.1",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
@@ -4335,12 +4359,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
- "dev": true
- },
"node_modules/regexp.prototype.flags": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
@@ -5425,9 +5443,9 @@
"dev": true
},
"node_modules/ws": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
- "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
+ "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
"engines": {
"node": ">=10.0.0"
},
@@ -5450,12 +5468,18 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/yaml": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
- "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
"dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yocto-queue": {
diff --git a/frontend/package.json b/frontend/package.json
index f99847b..66e4c4c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -14,10 +14,12 @@
"@lottiefiles/dotlottie-react": "^0.18.3",
"@next/third-parties": "^14.1.0",
"@supabase/supabase-js": "^2.39.7",
+ "chart.js": "^4.5.1",
"gsap": "^3.14.2",
"lottie-react": "^2.4.1",
"next": "14.2.35",
"react": "^18",
+ "react-chartjs-2": "^5.3.1",
"react-dom": "^18",
"sharp": "^0.33.2"
},
diff --git a/frontend/src/app/(pages)/ExpectationsV2.tsx b/frontend/src/app/(pages)/ExpectationsV2.tsx
new file mode 100644
index 0000000..c1fecca
--- /dev/null
+++ b/frontend/src/app/(pages)/ExpectationsV2.tsx
@@ -0,0 +1,21 @@
+import { ReactElement } from "react";
+import { cabinetExtraBold } from "../utils/fonts";
+import ExpectationCards from "../sections/ExpectationsV2/ExpectationCards";
+import ExpectationsVine from "../assets/icons/ExpectationsVine";
+import Butterfly from "../assets/icons/Butterfly";
+
+export default function ExpectationPageV2(): ReactElement {
+ return (
+
+
+
+ What Else Can You Expect at DeerHack?
+
+
+
+
+
+ );
+}
diff --git a/frontend/src/app/MainPage.tsx b/frontend/src/app/MainPage.tsx
index 8ceffb3..dc035e7 100644
--- a/frontend/src/app/MainPage.tsx
+++ b/frontend/src/app/MainPage.tsx
@@ -14,6 +14,7 @@ import Judges from "@/app/(pages)/Judges";
import Mentors from "@/app/(pages)/Mentors";
import Navbar from "@/app/components/Navbar/Navbar";
import ExperiencePage from "./(pages)/DeerhackExperiencePage";
+import ExpectationPageV2 from "./(pages)/ExpectationsV2";
export default function Home() {
return (
@@ -24,7 +25,8 @@ export default function Home() {
-
+ {/* */}
+
diff --git a/frontend/src/app/assets/icons/Butterfly.svg b/frontend/src/app/assets/icons/Butterfly.svg
new file mode 100644
index 0000000..4ac788f
--- /dev/null
+++ b/frontend/src/app/assets/icons/Butterfly.svg
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/app/assets/icons/Butterfly.tsx b/frontend/src/app/assets/icons/Butterfly.tsx
new file mode 100644
index 0000000..1b47349
--- /dev/null
+++ b/frontend/src/app/assets/icons/Butterfly.tsx
@@ -0,0 +1,697 @@
+import React from "react";
+interface Props{
+ width?:number;
+ height?:number;
+ className?:string;
+}
+const Butterfly = ({width = 154, height = 188, className = ""} : Props) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Butterfly;
diff --git a/frontend/src/app/assets/icons/ExpectatioArrow.svg b/frontend/src/app/assets/icons/ExpectatioArrow.svg
new file mode 100644
index 0000000..f5741c1
--- /dev/null
+++ b/frontend/src/app/assets/icons/ExpectatioArrow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/frontend/src/app/assets/icons/ExpectationsArrow.tsx b/frontend/src/app/assets/icons/ExpectationsArrow.tsx
new file mode 100644
index 0000000..77dffa4
--- /dev/null
+++ b/frontend/src/app/assets/icons/ExpectationsArrow.tsx
@@ -0,0 +1,27 @@
+import React, { ReactElement } from "react";
+
+interface Props {
+ onClick: () => void;
+ className?: string;
+}
+
+const ExpectationsArrow = ({ onClick, className = "" }: Props): ReactElement => {
+ return (
+
+
+
+ );
+};
+
+export default ExpectationsArrow;
\ No newline at end of file
diff --git a/frontend/src/app/assets/icons/ExpectationsVine.svg b/frontend/src/app/assets/icons/ExpectationsVine.svg
new file mode 100644
index 0000000..269d9d4
--- /dev/null
+++ b/frontend/src/app/assets/icons/ExpectationsVine.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/app/assets/icons/ExpectationsVine.tsx b/frontend/src/app/assets/icons/ExpectationsVine.tsx
new file mode 100644
index 0000000..9177177
--- /dev/null
+++ b/frontend/src/app/assets/icons/ExpectationsVine.tsx
@@ -0,0 +1,43 @@
+export default function ExpectationsVine({
+ width = 215,
+ height = 334,
+ className = "",
+}: {
+ width?: number;
+ height?: number;
+ className?: string;
+}) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/frontend/src/app/assets/images/expectations/badminton.jpg b/frontend/src/app/assets/images/expectations/badminton.jpg
new file mode 100644
index 0000000..bed60f3
Binary files /dev/null and b/frontend/src/app/assets/images/expectations/badminton.jpg differ
diff --git a/frontend/src/app/assets/images/expectations/football.jpg b/frontend/src/app/assets/images/expectations/football.jpg
new file mode 100644
index 0000000..8fce904
Binary files /dev/null and b/frontend/src/app/assets/images/expectations/football.jpg differ
diff --git a/frontend/src/app/assets/images/expectations/workshop_1.jpg b/frontend/src/app/assets/images/expectations/workshop_1.jpg
new file mode 100644
index 0000000..3bd795f
Binary files /dev/null and b/frontend/src/app/assets/images/expectations/workshop_1.jpg differ
diff --git a/frontend/src/app/assets/images/expectations/workshop_2.jpg b/frontend/src/app/assets/images/expectations/workshop_2.jpg
new file mode 100644
index 0000000..5106ec2
Binary files /dev/null and b/frontend/src/app/assets/images/expectations/workshop_2.jpg differ
diff --git a/frontend/src/app/assets/images/genderEllipse.tsx b/frontend/src/app/assets/images/genderEllipse.tsx
index 7f5a523..b76de1f 100644
--- a/frontend/src/app/assets/images/genderEllipse.tsx
+++ b/frontend/src/app/assets/images/genderEllipse.tsx
@@ -1,26 +1,108 @@
-import { ReactElement } from "react";
+"use client"
+import { ReactElement, useEffect, useRef, useState } from "react";
+import { ChartOptions, Chart as ChartJS, ArcElement, Tooltip, Legend } from "chart.js";
+import { Doughnut } from "react-chartjs-2";
+
+ChartJS.register(ArcElement, Tooltip, Legend);
export default function GenderEllipseSVG({
height = 315,
width = 315,
- className= "",
+ className = "",
}: {
height?: number;
width?: number;
className?: string;
}): ReactElement {
+ const [visible, setVisible] = useState({ male: true, female: true });
+ const [hasAnimated, setHasAnimated] = useState(false);
+ const chartRef = useRef>(null);
+ const containerRef = useRef(null);
+
+ useEffect(() => {
+ const observer = new IntersectionObserver(
+ (entries) => {
+ if (entries[0].isIntersecting && !hasAnimated) {
+ setHasAnimated(true);
+ }
+ },
+ { threshold: 0.3 }
+ );
+
+ if (containerRef.current) observer.observe(containerRef.current);
+ return () => observer.disconnect();
+ }, [hasAnimated]);
+
+ const handleToggle = (gender: "male" | "female") => {
+ const chart = chartRef.current;
+ if (!chart) return;
+
+ if (gender === "male") {
+ chart.toggleDataVisibility(0);
+ setVisible((prev) => ({ ...prev, male: !prev.male }));
+ } else {
+ chart.toggleDataVisibility(1);
+ chart.toggleDataVisibility(2);
+ setVisible((prev) => ({ ...prev, female: !prev.female }));
+ }
+ chart.update();
+ };
+
+ const data = {
+ labels: ["Male", "Female", "+10%"],
+ datasets: [
+ {
+ data: [75, 15, 10],
+ backgroundColor: [
+ "rgba(117, 51, 204, 0.77)",
+ "rgba(157, 75, 173, 1)",
+ "rgba(235, 140, 253, 1)",
+ ],
+ hoverBackgroundColor: ["#3B267B", "#E08CF5", "rgba(157, 75, 173, 1)"],
+ borderWidth: 0,
+ },
+ ],
+ };
+
+ const options: ChartOptions<"doughnut"> = {
+ animation: {
+ duration: 2000,
+ },
+ rotation: 90,
+ maintainAspectRatio: false,
+ cutout: "60%",
+ plugins: {
+ legend: { display: false },
+ tooltip: {
+ enabled: true,
+ backgroundColor: "#110C24",
+ titleColor: "#fff",
+ bodyColor: "#fff",
+ borderColor: "#D977F2",
+ borderWidth: 1,
+ displayColors: false,
+ callbacks: {
+ title: (context) => {
+ const index = context[0].dataIndex;
+ if (index === 1 || index === 2) return "Female";
+ return "Male";
+ },
+ label: (context) => {
+ if (context.dataIndex === 1 || context.dataIndex === 2) {
+ return "25%";
+ }
+ return `75%`;
+ },
+ },
+},
+ },
+ };
+
return (
-
-
-
-
-
+
+ {hasAnimated && (
+
+ )}
+
);
-}
+}
\ No newline at end of file
diff --git a/frontend/src/app/components/About/AboutCard.tsx b/frontend/src/app/components/About/AboutCard.tsx
index 333479e..ee03d75 100644
--- a/frontend/src/app/components/About/AboutCard.tsx
+++ b/frontend/src/app/components/About/AboutCard.tsx
@@ -65,7 +65,7 @@ export default function AboutCard({
return (
-
+
{buttons.map(({ key, Icon }) => {
const isActive = activeTab === key;
@@ -78,6 +78,7 @@ export default function AboutCard({
rounded-r-[40px] rounded-l-[6px] about-section-button p-1 md:p-2
flex items-center justify-end shadow-lg
h-10 md:h-16
+ transition-all duration-300 ease-in-out
${isActive ? "w-[72px] md:w-[140px] brightness-125" : "w-12 md:w-16"}
`}
aria-label={`Show ${key} info`}
@@ -133,11 +134,11 @@ export default function AboutCard({
);
-}
+}
\ No newline at end of file
diff --git a/frontend/src/app/components/DeerhackStats/CardLarge.tsx b/frontend/src/app/components/DeerhackStats/CardLarge.tsx
index 797d311..a38c399 100644
--- a/frontend/src/app/components/DeerhackStats/CardLarge.tsx
+++ b/frontend/src/app/components/DeerhackStats/CardLarge.tsx
@@ -10,9 +10,9 @@ import IncreaseStatSVG from "@/app/assets/images/increaseStat";
export default function CardLarge(): ReactElement {
return (
-
+
-
+
{/* Header */}
@@ -25,8 +25,8 @@ export default function CardLarge(): ReactElement {
{/* Doughnut */}
diff --git a/frontend/src/app/components/DeerhackStats/CardMedium.tsx b/frontend/src/app/components/DeerhackStats/CardMedium.tsx
index 38a3a85..a1f89b1 100644
--- a/frontend/src/app/components/DeerhackStats/CardMedium.tsx
+++ b/frontend/src/app/components/DeerhackStats/CardMedium.tsx
@@ -5,7 +5,7 @@ import Leaf from "@/app/assets/icons/Leaf"
export default function CardMedium() {
return (
-
+
@@ -18,14 +18,13 @@ export default function CardMedium() {
Applicants
{/* DeskTop View */}
-
)
}
diff --git a/frontend/src/app/components/DeerhackStats/CardMini.tsx b/frontend/src/app/components/DeerhackStats/CardMini.tsx
index e318f0d..33c619f 100644
--- a/frontend/src/app/components/DeerhackStats/CardMini.tsx
+++ b/frontend/src/app/components/DeerhackStats/CardMini.tsx
@@ -8,21 +8,24 @@ export default function CardMini({
numbers,
customClass,
border,
+ className = "",
}: {
svg: ReactElement;
title: string;
numbers: number;
customClass?: string;
border?: boolean;
+ className?: string; // ← pass any height/sizing class from outside
}) {
return (
{svg}
diff --git a/frontend/src/app/components/DeerhackStats/page.tsx b/frontend/src/app/components/DeerhackStats/page.tsx
index 2672a2b..1c6ed18 100644
--- a/frontend/src/app/components/DeerhackStats/page.tsx
+++ b/frontend/src/app/components/DeerhackStats/page.tsx
@@ -9,10 +9,24 @@ export default function StatsSection() {
- } title="Hackers" numbers={215} customClass="bg-[#532B6A]"/>
- } title="Total Projects" border={true} numbers={33} />
+ }
+ title="Hackers"
+ numbers={215}
+ customClass="bg-[#532B6A]"
+ className="h-[200px]"
+ />
+ }
+ title="Total Projects"
+ border={true}
+ numbers={33}
+ className="h-[200px]"
+ />
+
+
+
-
);
-}
+}
\ No newline at end of file
diff --git a/frontend/src/app/components/ExpectationsV2/ExpectationCard.tsx b/frontend/src/app/components/ExpectationsV2/ExpectationCard.tsx
new file mode 100644
index 0000000..faef669
--- /dev/null
+++ b/frontend/src/app/components/ExpectationsV2/ExpectationCard.tsx
@@ -0,0 +1,38 @@
+"use client";
+import { ReactElement } from "react";
+import { cabinetBold } from "@/app/utils/fonts";
+
+export default function ExpectationCard({
+ svg,
+ title,
+ description,
+ isActive,
+}: {
+ svg?: ReactElement;
+ title?: string;
+ description?: string;
+ isActive?: boolean;
+}): ReactElement {
+ return (
+
+ );
+}
diff --git a/frontend/src/app/components/ExpectationsV2/ExpectationImage.tsx b/frontend/src/app/components/ExpectationsV2/ExpectationImage.tsx
new file mode 100644
index 0000000..676cbd0
--- /dev/null
+++ b/frontend/src/app/components/ExpectationsV2/ExpectationImage.tsx
@@ -0,0 +1,24 @@
+ import Image, { StaticImageData } from "next/image";
+ import { ReactElement } from "react";
+
+ export default function ExpectationImage({
+ imageSrc,
+ className,
+ }: {
+ imageSrc: StaticImageData;
+ className?:string;
+ }): ReactElement {
+ return (
+
+ );
+ }
diff --git a/frontend/src/app/global.d.ts b/frontend/src/app/global.d.ts
new file mode 100644
index 0000000..7f70183
--- /dev/null
+++ b/frontend/src/app/global.d.ts
@@ -0,0 +1 @@
+declare module "*.css";
\ No newline at end of file
diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx
index b815cb4..3188bd3 100644
--- a/frontend/src/app/layout.tsx
+++ b/frontend/src/app/layout.tsx
@@ -25,17 +25,17 @@ export const metadata = {
" why participate in hackathon",
],
openGraph: {
- title: "Deerhack 2026 - Fawning over Innovation",
+ title: "DeerHack 2026 - Fawning over Innovation",
description:
"DeerHack 2026 is the brainchild of a small team to unleash the potential of young innovators through a 36-hour hackathon in which developers, designers, students, entrepreneurs, educators, and mentors collaborate to create solutions that tackle real-world problems. When people from many backgrounds collaborate, they do more than merely do good; they become a force for global change",
url: "https://deerhack.deerwalk.edu.np",
- siteName: "Deerhack 2026 - Fawning Over Innovation",
+ siteName: "DeerHack 2026 - Fawning Over Innovation",
images: [
{
url: "/banner.webp",
width: 400,
height: 250,
- alt: "Deerhack 2026 Banner",
+ alt: "DeerHack 2026 Banner",
},
],
locale: "en_US",
@@ -43,7 +43,7 @@ export const metadata = {
},
twitter: {
card: "summary_large_image",
- title: "Deerhack 2026",
+ title: "DeerHack 2026",
description:
"DeerHack 2026 is the brainchild of a small team to unleash the potential of young innovators through a 36-hour hackathon in which developers, designers, students, entrepreneurs, educators, and mentors collaborate to create solutions that tackle real-world problems. When people from many backgrounds collaborate, they do more than merely do good; they become a force for global change",
images: ["/banner.webp"],
diff --git a/frontend/src/app/sections/AboutTheEvent/AboutTheEventCards.tsx b/frontend/src/app/sections/AboutTheEvent/AboutTheEventCards.tsx
index b0da563..c78c075 100644
--- a/frontend/src/app/sections/AboutTheEvent/AboutTheEventCards.tsx
+++ b/frontend/src/app/sections/AboutTheEvent/AboutTheEventCards.tsx
@@ -7,7 +7,7 @@ const AboutTheEventCards = () => {
const tabs = {
deerhack: {
svg:
,
- title: "Deerhack 2026",
+ title: "DeerHack 2026",
description:
"DeerHack 2026 is a 48-hour hackathon where developers, designers, students, entrepreneurs, educators, and mentors work together to build ideas that solve real-world complications. DeerHack provides an opportunity for individuals to sharpen their teamwork, communication, leadership skills, and networking in a risk-free and comfortable environment.",
},
diff --git a/frontend/src/app/sections/ExpectationsV2/ExpectationCards.tsx b/frontend/src/app/sections/ExpectationsV2/ExpectationCards.tsx
new file mode 100644
index 0000000..7897c12
--- /dev/null
+++ b/frontend/src/app/sections/ExpectationsV2/ExpectationCards.tsx
@@ -0,0 +1,181 @@
+"use client";
+import ExpectationCard from "@/app/components/ExpectationsV2/ExpectationCard";
+import { ReactElement, useState, useEffect, useRef } from "react";
+import ExpectationImage from "@/app/components/ExpectationsV2/ExpectationImage";
+import ExpectationsArrow from "@/app/assets/icons/ExpectationsArrow";
+import { originalCards } from "./data";
+
+export default function ExpectationCards(): ReactElement {
+ const cards = [...originalCards, ...originalCards, ...originalCards];
+
+ const [currentIndex, setCurrentIndex] = useState(originalCards.length);
+ const [isTransitioning, setIsTransitioning] = useState(false);
+
+ const [gap, setGap] = useState(98);
+ const [cardWidth, setCardWidth] = useState(380);
+
+ useEffect(() => {
+ const handleResize = () => {
+ const width = window.innerWidth;
+ if (width >= 1280) {
+ setGap(98);
+ setCardWidth(380);
+ } else if (width >= 768) {
+ setGap(50);
+ setCardWidth(320);
+ } else {
+ setGap(28);
+ setCardWidth(300);
+ }
+ };
+
+ handleResize();
+ window.addEventListener("resize", handleResize);
+ return () => window.removeEventListener("resize", handleResize);
+ }, []);
+
+ const nextSlide = () => {
+ if (isTransitioning) return;
+ setIsTransitioning(true);
+ setCurrentIndex((prev) => prev + 1);
+ };
+
+ const prevSlide = () => {
+ if (isTransitioning) return;
+ setIsTransitioning(true);
+ setCurrentIndex((prev) => prev - 1);
+ };
+
+ const handleTransitionEnd = () => {
+ setIsTransitioning(false);
+
+ if (currentIndex >= originalCards.length * 2) {
+ setCurrentIndex(currentIndex - originalCards.length);
+ } else if (currentIndex < originalCards.length) {
+ setCurrentIndex(currentIndex + originalCards.length);
+ }
+ };
+
+ const touchStartX = useRef
(null);
+ const touchEndX = useRef(null);
+ const minSwipeDistance = 50;
+
+ const onTouchStart = (e: React.TouchEvent) => {
+ touchEndX.current = null;
+ touchStartX.current = e.targetTouches[0].clientX;
+ };
+
+ const onTouchMove = (e: React.TouchEvent) => {
+ touchEndX.current = e.targetTouches[0].clientX;
+ };
+
+ const onTouchEnd = () => {
+ if (!touchStartX.current || !touchEndX.current) return;
+
+ const distance = touchStartX.current - touchEndX.current;
+ const isLeftSwipe = distance > minSwipeDistance;
+ const isRightSwipe = distance < -minSwipeDistance;
+
+ if (isLeftSwipe) {
+ nextSlide();
+ } else if (isRightSwipe) {
+ prevSlide();
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ {cards.map((card, index) => {
+ const isActive = index === currentIndex;
+
+ return (
+
+ );
+ })}
+
+
+
+ {originalCards.map((_, dotIndex) => {
+ const activeDotIndex = currentIndex % originalCards.length;
+ return (
+
+ );
+ })}
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/app/sections/ExpectationsV2/data.tsx b/frontend/src/app/sections/ExpectationsV2/data.tsx
new file mode 100644
index 0000000..e6a2739
--- /dev/null
+++ b/frontend/src/app/sections/ExpectationsV2/data.tsx
@@ -0,0 +1,32 @@
+import FunGamesSVG from "@/app/assets/images/funGames";
+import MusicSVG from "@/app/assets/images/music";
+import WorkshopSVG from "@/app/assets/images/workshop";
+
+import fun_games_image from "@/app/assets/images/fun_games.webp";
+import live_music_image from "@/app/assets/images/live_music_image.webp";
+import workshop_image from "@/app/assets/images/workshop_image.webp";
+
+// import fun_games_image from "@/app/assets/images/expectations/badminton.jpg";
+// import live_music_image from "@/app/assets/images/expectations/football.jpg";
+// import workshop_image from "@/app/assets/images/expectations/workshop_2.jpg";
+
+export const originalCards = [
+ {
+ svg: ,
+ title: "Fun Games",
+ img: fun_games_image,
+ desc: "Take a break from coding and immerse yourself in the soulful melodies and electrifying beats of live music performances, adding rhythm and energy to your DeerHack experience.",
+ },
+ {
+ svg: ,
+ title: "Live Music",
+ img: live_music_image,
+ desc: "Take a break from coding and immerse yourself in the soulful melodies and electrifying beats of live music performances, adding rhythm and energy to your DeerHack experience.",
+ },
+ {
+ svg: ,
+ title: "Workshops",
+ img: workshop_image,
+ desc: "Dive deep into cutting-edge technologies, sharpen your skills, and gain invaluable insights from industry experts through interactive workshops tailored to enhance your expertise.",
+ },
+];
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..8e76030
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "deerhack26",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}