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({

{description}

); -} +} \ 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 */} -
-

Total Applicants

-
- {/*

3840+

*/} - -
+
+

Total Applicants

+
+
+
) } 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 ( +
+
+
{svg}
+

+ {title} +

+
+ +
+

+ {description} +

+
+
+ ); +} 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 ( +
+
+ Some Fun Games Played at Deerhack 2023 +
+
+ ); + } 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": {} +}